diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..982e411032 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,210 @@ +.git +.github +.run +docs +test +typings +*Client.py + +.idea +.vscode + +*_Spoiler.txt +*.bmbp +*.apbp +*.apl2ac +*.apm3 +*.apmc +*.apz5 +*.aptloz +*.apemerald +*.pyc +*.pyd +*.sfc +*.z64 +*.n64 +*.nes +*.smc +*.sms +*.gb +*.gbc +*.gba +*.wixobj +*.lck +*.db3 +*multidata +*multisave +*.archipelago +*.apsave +*.BIN +*.puml + +setups +build +bundle/components.wxs +dist +/prof/ +README.html +.vs/ +EnemizerCLI/ +/Players/ +/SNI/ +/sni-*/ +/appimagetool* +/host.yaml +/options.yaml +/config.yaml +/logs/ +_persistent_storage.yaml +mystery_result_*.yaml +*-errors.txt +success.txt +output/ +Output Logs/ +/factorio/ +/Minecraft Forge Server/ +/WebHostLib/static/generated +/freeze_requirements.txt +/Archipelago.zip +/setup.ini +/installdelete.iss +/data/user.kv +/datapackage +/custom_worlds + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so +*.dll + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt +installer.log + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# vim editor +*.swp + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv* +env/ +venv/ +/venv*/ +ENV/ +env.bak/ +venv.bak/ +*.code-workspace +shell.nix + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# Cython intermediates +_speedups.c +_speedups.cpp +_speedups.html + +# minecraft server stuff +jdk*/ +minecraft*/ +minecraft_versions.json +!worlds/minecraft/ + +# pyenv +.python-version + +#undertale stuff +/Undertale/ + +# OS General Files +.DS_Store +.AppleDouble +.LSOverride +Thumbs.db +[Dd]esktop.ini diff --git a/.github/labeler.yml b/.github/labeler.yml index 2743104f41..d0aa61c8cf 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -21,7 +21,6 @@ - '!data/**' - '!.run/**' - '!.github/**' - - '!worlds_disabled/**' - '!worlds/**' - '!WebHost.py' - '!WebHostLib/**' diff --git a/.github/pyright-config.json b/.github/pyright-config.json index b6561afa46..64a46d80cc 100644 --- a/.github/pyright-config.json +++ b/.github/pyright-config.json @@ -29,7 +29,7 @@ "reportMissingImports": true, "reportMissingTypeStubs": true, - "pythonVersion": "3.10", + "pythonVersion": "3.11", "pythonPlatform": "Windows", "executionEnvironments": [ diff --git a/.github/workflows/analyze-modified-files.yml b/.github/workflows/analyze-modified-files.yml index 6788abd30a..862a050c51 100644 --- a/.github/workflows/analyze-modified-files.yml +++ b/.github/workflows/analyze-modified-files.yml @@ -53,7 +53,7 @@ jobs: - uses: actions/setup-python@v5 if: env.diff != '' with: - python-version: '3.10' + python-version: '3.11' - name: "Install dependencies" if: env.diff != '' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d6b80965f0..7151ff00c8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,12 @@ on: env: ENEMIZER_VERSION: 7.1 - APPIMAGETOOL_VERSION: 13 + # NOTE: since appimage/appimagetool and appimage/type2-runtime does not have tags anymore, + # we check the sha256 and require manual intervention if it was updated. + APPIMAGETOOL_VERSION: continuous + APPIMAGETOOL_X86_64_HASH: '29348a20b80827cd261c28e95172ff828b69d43d4e4e18e3fd069e2c8693c94e' + APPIMAGE_RUNTIME_VERSION: continuous + APPIMAGE_RUNTIME_X86_64_HASH: 'e70ffa9b69b211574d0917adc482dd66f25a0083427b5945783965d55b0b0a8b' permissions: # permissions required for attestation id-token: 'write' @@ -98,7 +103,7 @@ jobs: shell: bash run: | cd build/exe* - cp Players/Templates/Clique.yaml Players/ + cp Players/Templates/VVVVVV.yaml Players/ timeout 30 ./ArchipelagoGenerate - name: Store 7z uses: actions/upload-artifact@v4 @@ -134,10 +139,13 @@ jobs: - name: Install build-time dependencies run: | echo "PYTHON=python3.12" >> $GITHUB_ENV - wget -nv https://github.com/AppImage/AppImageKit/releases/download/$APPIMAGETOOL_VERSION/appimagetool-x86_64.AppImage + wget -nv https://github.com/AppImage/appimagetool/releases/download/$APPIMAGETOOL_VERSION/appimagetool-x86_64.AppImage + echo "$APPIMAGETOOL_X86_64_HASH appimagetool-x86_64.AppImage" | sha256sum -c + wget -nv https://github.com/AppImage/type2-runtime/releases/download/$APPIMAGE_RUNTIME_VERSION/runtime-x86_64 + echo "$APPIMAGE_RUNTIME_X86_64_HASH runtime-x86_64" | sha256sum -c chmod a+rx appimagetool-x86_64.AppImage ./appimagetool-x86_64.AppImage --appimage-extract - echo -e '#/bin/sh\n./squashfs-root/AppRun "$@"' > appimagetool + echo -e '#/bin/sh\n./squashfs-root/AppRun --runtime-file runtime-x86_64 "$@"' > appimagetool chmod a+rx appimagetool - name: Download run-time dependencies run: | @@ -189,7 +197,7 @@ jobs: shell: bash run: | cd build/exe* - cp Players/Templates/Clique.yaml Players/ + cp Players/Templates/VVVVVV.yaml Players/ timeout 30 ./ArchipelagoGenerate - name: Store AppImage uses: actions/upload-artifact@v4 diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000000..cf9ce08faf --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,154 @@ +name: Build and Publish Docker Images + +on: + push: + paths: + - "**" + - "!docs/**" + - "!deploy/**" + - "!setup.py" + - "!.gitignore" + - "!.github/workflows/**" + - ".github/workflows/docker.yml" + branches: + - "*" + tags: + - "v?[0-9]+.[0-9]+.[0-9]*" + workflow_dispatch: + +env: + REGISTRY: ghcr.io + +jobs: + prepare: + runs-on: ubuntu-latest + outputs: + image-name: ${{ steps.image.outputs.name }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + package-name: ${{ steps.package.outputs.name }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set lowercase image name + id: image + run: | + echo "name=${GITHUB_REPOSITORY,,}" >> $GITHUB_OUTPUT + + - name: Set package name + id: package + run: | + echo "name=$(basename ${GITHUB_REPOSITORY,,})" >> $GITHUB_OUTPUT + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ steps.image.outputs.name }} + tags: | + type=ref,event=branch,enable={{is_not_default_branch}} + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=raw,value=nightly,enable={{is_default_branch}} + + - name: Compute final tags + id: final-tags + run: | + readarray -t tags <<< "${{ steps.meta.outputs.tags }}" + + if [[ "${{ github.ref_type }}" == "tag" ]]; then + tag="${{ github.ref_name }}" + if [[ "$tag" =~ ^v?[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + full_latest="${{ env.REGISTRY }}/${{ steps.image.outputs.name }}:latest" + # Check if latest is already in tags to avoid duplicates + if ! printf '%s\n' "${tags[@]}" | grep -q "^$full_latest$"; then + tags+=("$full_latest") + fi + fi + fi + + # Set multiline output + echo "tags<> $GITHUB_OUTPUT + printf '%s\n' "${tags[@]}" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + build: + needs: prepare + runs-on: ${{ matrix.runner }} + permissions: + contents: read + packages: write + strategy: + matrix: + include: + - platform: amd64 + runner: ubuntu-latest + suffix: amd64 + cache-scope: amd64 + - platform: arm64 + runner: ubuntu-24.04-arm + suffix: arm64 + cache-scope: arm64 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Compute suffixed tags + id: tags + run: | + readarray -t tags <<< "${{ needs.prepare.outputs.tags }}" + suffixed=() + for t in "${tags[@]}"; do + suffixed+=("$t-${{ matrix.suffix }}") + done + echo "tags=$(IFS=','; echo "${suffixed[*]}")" >> $GITHUB_OUTPUT + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + platforms: linux/${{ matrix.platform }} + push: true + tags: ${{ steps.tags.outputs.tags }} + labels: ${{ needs.prepare.outputs.labels }} + cache-from: type=gha,scope=${{ matrix.cache-scope }} + cache-to: type=gha,mode=max,scope=${{ matrix.cache-scope }} + provenance: false + + manifest: + needs: [prepare, build] + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Create and push multi-arch manifest + run: | + readarray -t tag_array <<< "${{ needs.prepare.outputs.tags }}" + + for tag in "${tag_array[@]}"; do + docker manifest create "$tag" \ + "$tag-amd64" \ + "$tag-arm64" + + docker manifest push "$tag" + done diff --git a/.github/workflows/label-pull-requests.yml b/.github/workflows/label-pull-requests.yml index bc0f6999b6..1675c942bd 100644 --- a/.github/workflows/label-pull-requests.yml +++ b/.github/workflows/label-pull-requests.yml @@ -6,11 +6,12 @@ on: permissions: contents: read pull-requests: write +env: + GH_REPO: ${{ github.repository }} jobs: labeler: name: 'Apply content-based labels' - if: github.event.action == 'opened' || github.event.action == 'reopened' || github.event.action == 'synchronize' runs-on: ubuntu-latest steps: - uses: actions/labeler@v5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a500f9a23b..147f30942d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,11 +5,16 @@ name: Release on: push: tags: - - '*.*.*' + - 'v?[0-9]+.[0-9]+.[0-9]*' env: ENEMIZER_VERSION: 7.1 - APPIMAGETOOL_VERSION: 13 + # NOTE: since appimage/appimagetool and appimage/type2-runtime does not have tags anymore, + # we check the sha256 and require manual intervention if it was updated. + APPIMAGETOOL_VERSION: continuous + APPIMAGETOOL_X86_64_HASH: '29348a20b80827cd261c28e95172ff828b69d43d4e4e18e3fd069e2c8693c94e' + APPIMAGE_RUNTIME_VERSION: continuous + APPIMAGE_RUNTIME_X86_64_HASH: 'e70ffa9b69b211574d0917adc482dd66f25a0083427b5945783965d55b0b0a8b' permissions: # permissions required for attestation id-token: 'write' @@ -122,10 +127,13 @@ jobs: - name: Install build-time dependencies run: | echo "PYTHON=python3.12" >> $GITHUB_ENV - wget -nv https://github.com/AppImage/AppImageKit/releases/download/$APPIMAGETOOL_VERSION/appimagetool-x86_64.AppImage + wget -nv https://github.com/AppImage/appimagetool/releases/download/$APPIMAGETOOL_VERSION/appimagetool-x86_64.AppImage + echo "$APPIMAGETOOL_X86_64_HASH appimagetool-x86_64.AppImage" | sha256sum -c + wget -nv https://github.com/AppImage/type2-runtime/releases/download/$APPIMAGE_RUNTIME_VERSION/runtime-x86_64 + echo "$APPIMAGE_RUNTIME_X86_64_HASH runtime-x86_64" | sha256sum -c chmod a+rx appimagetool-x86_64.AppImage ./appimagetool-x86_64.AppImage --appimage-extract - echo -e '#/bin/sh\n./squashfs-root/AppRun "$@"' > appimagetool + echo -e '#/bin/sh\n./squashfs-root/AppRun --runtime-file runtime-x86_64 "$@"' > appimagetool chmod a+rx appimagetool - name: Download run-time dependencies run: | diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml index 88b5d12987..90a5d70b8e 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests.yml @@ -8,18 +8,24 @@ on: paths: - '**' - '!docs/**' + - '!deploy/**' - '!setup.py' + - '!Dockerfile' - '!*.iss' - '!.gitignore' + - '!.dockerignore' - '!.github/workflows/**' - '.github/workflows/unittests.yml' pull_request: paths: - '**' - '!docs/**' + - '!deploy/**' - '!setup.py' + - '!Dockerfile' - '!*.iss' - '!.gitignore' + - '!.dockerignore' - '!.github/workflows/**' - '.github/workflows/unittests.yml' @@ -33,15 +39,15 @@ jobs: matrix: os: [ubuntu-latest] python: - - {version: '3.10'} - - {version: '3.11'} + - {version: '3.11.2'} # Change to '3.11' around 2026-06-10 - {version: '3.12'} + - {version: '3.13'} include: - - python: {version: '3.10'} # old compat + - python: {version: '3.11'} # old compat os: windows-latest - - python: {version: '3.12'} # current + - python: {version: '3.13'} # current os: windows-latest - - python: {version: '3.12'} # current + - python: {version: '3.13'} # current os: macos-latest steps: @@ -69,7 +75,7 @@ jobs: os: - ubuntu-latest python: - - {version: '3.12'} # current + - {version: '3.13'} # current steps: - uses: actions/checkout@v4 diff --git a/.gitignore b/.gitignore index f50fc17e23..3bb4e68c99 100644 --- a/.gitignore +++ b/.gitignore @@ -56,7 +56,6 @@ success.txt output/ Output Logs/ /factorio/ -/Minecraft Forge Server/ /WebHostLib/static/generated /freeze_requirements.txt /Archipelago.zip @@ -184,12 +183,6 @@ _speedups.c _speedups.cpp _speedups.html -# minecraft server stuff -jdk*/ -minecraft*/ -minecraft_versions.json -!worlds/minecraft/ - # pyenv .python-version diff --git a/AHITClient.py b/AHITClient.py index 6ed7d7b49d..edcbbd842e 100644 --- a/AHITClient.py +++ b/AHITClient.py @@ -1,3 +1,4 @@ +import sys from worlds.ahit.Client import launch import Utils import ModuleUpdate @@ -5,4 +6,4 @@ ModuleUpdate.update() if __name__ == "__main__": Utils.init_logging("AHITClient", exception_logger="Client") - launch() + launch(*sys.argv[1:]) diff --git a/AdventureClient.py b/AdventureClient.py index 91567fc0a0..b89b8f0600 100644 --- a/AdventureClient.py +++ b/AdventureClient.py @@ -11,6 +11,7 @@ from typing import List import Utils +from settings import get_settings from NetUtils import ClientStatus from Utils import async_start from CommonClient import CommonContext, server_loop, gui_enabled, ClientCommandProcessor, logger, \ @@ -80,8 +81,8 @@ class AdventureContext(CommonContext): self.local_item_locations = {} self.dragon_speed_info = {} - options = Utils.get_settings() - self.display_msgs = options["adventure_options"]["display_msgs"] + options = get_settings().adventure_options + self.display_msgs = options.display_msgs async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: @@ -102,7 +103,7 @@ class AdventureContext(CommonContext): def on_package(self, cmd: str, args: dict): if cmd == 'Connected': self.locations_array = None - if Utils.get_settings()["adventure_options"].get("death_link", False): + if get_settings().adventure_options.as_dict().get("death_link", False): self.set_deathlink = True async_start(self.get_freeincarnates_used()) elif cmd == "RoomInfo": @@ -406,6 +407,7 @@ async def atari_sync_task(ctx: AdventureContext): except ConnectionRefusedError: logger.debug("Connection Refused, Trying Again") ctx.atari_status = CONNECTION_REFUSED_STATUS + await asyncio.sleep(1) continue except CancelledError: pass @@ -415,8 +417,9 @@ async def atari_sync_task(ctx: AdventureContext): async def run_game(romfile): - auto_start = Utils.get_settings()["adventure_options"].get("rom_start", True) - rom_args = Utils.get_settings()["adventure_options"].get("rom_args") + options = get_settings().adventure_options + auto_start = options.rom_start + rom_args = options.rom_args if auto_start is True: import webbrowser webbrowser.open(romfile) diff --git a/BaseClasses.py b/BaseClasses.py index f480cbbda3..855efc6009 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -5,12 +5,13 @@ import functools import logging import random import secrets +import warnings from argparse import Namespace -from collections import Counter, deque +from collections import Counter, deque, defaultdict from collections.abc import Collection, MutableSequence from enum import IntEnum, IntFlag from typing import (AbstractSet, Any, Callable, ClassVar, Dict, Iterable, Iterator, List, Literal, Mapping, NamedTuple, - Optional, Protocol, Set, Tuple, Union, TYPE_CHECKING) + Optional, Protocol, Set, Tuple, Union, TYPE_CHECKING, Literal, overload) import dataclasses from typing_extensions import NotRequired, TypedDict @@ -153,17 +154,11 @@ class MultiWorld(): self.algorithm = 'balanced' self.groups = {} self.regions = self.RegionManager(players) - self.shops = [] self.itempool = [] self.seed = None self.seed_name: str = "Unavailable" self.precollected_items = {player: [] for player in self.player_ids} self.required_locations = [] - self.light_world_light_cone = False - self.dark_world_light_cone = False - self.rupoor_cost = 10 - self.aga_randomness = True - self.save_and_quit_from_boss = True self.custom = False self.customitemarray = [] self.shuffle_ganon = True @@ -182,7 +177,7 @@ class MultiWorld(): set_player_attr('completion_condition', lambda state: True) self.worlds = {} self.per_slot_randoms = Utils.DeprecateDict("Using per_slot_randoms is now deprecated. Please use the " - "world's random object instead (usually self.random)") + "world's random object instead (usually self.random)", True) self.plando_options = PlandoOptions.none def get_all_ids(self) -> Tuple[int, ...]: @@ -227,17 +222,8 @@ class MultiWorld(): self.seed_name = name if name else str(self.seed) def set_options(self, args: Namespace) -> None: - # TODO - remove this section once all worlds use options dataclasses from worlds import AutoWorld - all_keys: Set[str] = {key for player in self.player_ids for key in - AutoWorld.AutoWorldRegister.world_types[self.game[player]].options_dataclass.type_hints} - for option_key in all_keys: - option = Utils.DeprecateDict(f"Getting options from multiworld is now deprecated. " - f"Please use `self.options.{option_key}` instead.", True) - option.update(getattr(args, option_key, {})) - setattr(self, option_key, option) - for player in self.player_ids: world_type = AutoWorld.AutoWorldRegister.world_types[self.game[player]] self.worlds[player] = world_type(self, player) @@ -275,6 +261,7 @@ class MultiWorld(): "local_items": set(item_link.get("local_items", [])), "non_local_items": set(item_link.get("non_local_items", [])), "link_replacement": replacement_prio.index(item_link["link_replacement"]), + "skip_if_solo": item_link.get("skip_if_solo", False), } for _name, item_link in item_links.items(): @@ -298,6 +285,8 @@ class MultiWorld(): for group_name, item_link in item_links.items(): game = item_link["game"] + if item_link["skip_if_solo"] and len(item_link["players"]) == 1: + continue group_id, group = self.add_group(group_name, game, set(item_link["players"])) group["item_pool"] = item_link["item_pool"] @@ -438,12 +427,27 @@ class MultiWorld(): def get_location(self, location_name: str, player: int) -> Location: return self.regions.location_cache[player][location_name] - def get_all_state(self, use_cache: bool, allow_partial_entrances: bool = False, - collect_pre_fill_items: bool = True) -> CollectionState: - cached = getattr(self, "_all_state", None) - if use_cache and cached: - return cached.copy() + def get_all_state(self, use_cache: bool | None = None, allow_partial_entrances: bool = False, + collect_pre_fill_items: bool = True, perform_sweep: bool = True) -> CollectionState: + """ + Creates a new CollectionState, and collects all precollected items, all items in the multiworld itempool, those + specified in each worlds' `get_pre_fill_items()`, and then sweeps the multiworld collecting any other items + it is able to reach, building as complete of a completed game state as possible. + :param use_cache: Deprecated and unused. + :param allow_partial_entrances: Whether the CollectionState should allow for disconnected entrances while + sweeping, such as before entrance randomization is complete. + :param collect_pre_fill_items: Whether the items in each worlds' `get_pre_fill_items()` should be added to this + state. + :param perform_sweep: Whether this state should perform a sweep for reachable locations, collecting any placed + items it can. + + :return: The completed CollectionState. + """ + if __debug__ and use_cache is not None: + # TODO swap to Utils.deprecate when we want this to crash on source and warn on frozen + warnings.warn("multiworld.get_all_state no longer caches all_state and this argument will be removed.", + DeprecationWarning) ret = CollectionState(self, allow_partial_entrances) for item in self.itempool: @@ -453,10 +457,9 @@ class MultiWorld(): subworld = self.worlds[player] for item in subworld.get_pre_fill_items(): subworld.collect(ret, item) - ret.sweep_for_advancements() + if perform_sweep: + ret.sweep_for_advancements() - if use_cache: - self._all_state = ret return ret def get_items(self) -> List[Item]: @@ -558,7 +561,9 @@ class MultiWorld(): else: return all((self.has_beaten_game(state, p) for p in range(1, self.players + 1))) - def can_beat_game(self, starting_state: Optional[CollectionState] = None) -> bool: + def can_beat_game(self, + starting_state: Optional[CollectionState] = None, + locations: Optional[Iterable[Location]] = None) -> bool: if starting_state: if self.has_beaten_game(starting_state): return True @@ -567,25 +572,10 @@ class MultiWorld(): state = CollectionState(self) if self.has_beaten_game(state): return True - prog_locations = {location for location in self.get_locations() if location.item - and location.item.advancement and location not in state.locations_checked} - - while prog_locations: - sphere: Set[Location] = set() - # build up spheres of collection radius. - # Everything in each sphere is independent from each other in dependencies and only depends on lower spheres - for location in prog_locations: - if location.can_reach(state): - sphere.add(location) - - if not sphere: - # ran out of places and did not finish yet, quit - return False - - for location in sphere: - state.collect(location.item, True, location) - prog_locations -= sphere + for _ in state.sweep_for_advancements(locations, + yield_each_sweep=True, + checked_locations=state.locations_checked): if self.has_beaten_game(state): return True @@ -701,6 +691,12 @@ class MultiWorld(): sphere.append(locations.pop(n)) if not sphere: + if __debug__: + from Fill import FillError + raise FillError( + f"Could not access required locations for accessibility check. Missing: {locations}", + multiworld=self, + ) # ran out of places and did not finish yet, quit logging.warning(f"Could not access required locations for accessibility check." f" Missing: {locations}") @@ -736,6 +732,7 @@ class CollectionState(): additional_copy_functions: List[Callable[[CollectionState, CollectionState], CollectionState]] = [] def __init__(self, parent: MultiWorld, allow_partial_entrances: bool = False): + assert parent.worlds, "CollectionState created without worlds initialized in parent" self.prog_items = {player: Counter() for player in parent.get_all_ids()} self.multiworld = parent self.reachable_regions = {player: set() for player in parent.get_all_ids()} @@ -863,20 +860,133 @@ class CollectionState(): "Please switch over to sweep_for_advancements.") return self.sweep_for_advancements(locations) - def sweep_for_advancements(self, locations: Optional[Iterable[Location]] = None) -> None: - if locations is None: - locations = self.multiworld.get_filled_locations() - reachable_advancements = True - # since the loop has a good chance to run more than once, only filter the advancements once - locations = {location for location in locations if location.advancement and location not in self.advancements} + def _sweep_for_advancements_impl(self, advancements_per_player: List[Tuple[int, List[Location]]], + yield_each_sweep: bool) -> Iterator[None]: + """ + The implementation for sweep_for_advancements is separated here because it returns a generator due to the use + of a yield statement. + """ + all_players = {player for player, _ in advancements_per_player} + players_to_check = all_players + # As an optimization, it is assumed that each player's world only logically depends on itself. However, worlds + # are allowed to logically depend on other worlds, so once there are no more players that should be checked + # under this assumption, an extra sweep iteration is performed that checks every player, to confirm that the + # sweep is finished. + checking_if_finished = False + while players_to_check: + next_advancements_per_player: List[Tuple[int, List[Location]]] = [] + next_players_to_check = set() - while reachable_advancements: - reachable_advancements = {location for location in locations if location.can_reach(self)} - locations -= reachable_advancements - for advancement in reachable_advancements: - self.advancements.add(advancement) - assert isinstance(advancement.item, Item), "tried to collect Event with no Item" - self.collect(advancement.item, True, advancement) + for player, locations in advancements_per_player: + if player not in players_to_check: + next_advancements_per_player.append((player, locations)) + continue + + # Accessibility of each location is checked first because a player's region accessibility cache becomes + # stale whenever one of their own items is collected into the state. + reachable_locations: List[Location] = [] + unreachable_locations: List[Location] = [] + for location in locations: + if location.can_reach(self): + # Locations containing items that do not belong to `player` could be collected immediately + # because they won't stale `player`'s region accessibility cache, but, for simplicity, all the + # items at reachable locations are collected in a single loop. + reachable_locations.append(location) + else: + unreachable_locations.append(location) + if unreachable_locations: + next_advancements_per_player.append((player, unreachable_locations)) + + # A previous player's locations processed in the current `while players_to_check` iteration could have + # collected items belonging to `player`, but now that all of `player`'s reachable locations have been + # found, it can be assumed that `player` will not gain any more reachable locations until another one of + # their items is collected. + # It would be clearer to not add players to `next_players_to_check` in the first place if they have yet + # to be processed in the current `while players_to_check` iteration, but checking if a player should be + # added to `next_players_to_check` would need to be run once for every item that is collected, so it is + # more performant to instead discard `player` from `next_players_to_check` once their locations have + # been processed. + next_players_to_check.discard(player) + + # Collect the items from the reachable locations. + for advancement in reachable_locations: + self.advancements.add(advancement) + item = advancement.item + assert isinstance(item, Item), "tried to collect advancement Location with no Item" + if self.collect(item, True, advancement): + # The player the item belongs to may be able to reach additional locations in the next sweep + # iteration. + next_players_to_check.add(item.player) + + if not next_players_to_check: + if not checking_if_finished: + # It is assumed that each player's world only logically depends on itself, which may not be the + # case, so confirm that the sweep is finished by doing an extra iteration that checks every player. + checking_if_finished = True + next_players_to_check = all_players + else: + checking_if_finished = False + + players_to_check = next_players_to_check + advancements_per_player = next_advancements_per_player + + if yield_each_sweep: + yield + + @overload + def sweep_for_advancements(self, locations: Optional[Iterable[Location]] = None, *, + yield_each_sweep: Literal[True], + checked_locations: Optional[Set[Location]] = None) -> Iterator[None]: ... + + @overload + def sweep_for_advancements(self, locations: Optional[Iterable[Location]] = None, + yield_each_sweep: Literal[False] = False, + checked_locations: Optional[Set[Location]] = None) -> None: ... + + def sweep_for_advancements(self, locations: Optional[Iterable[Location]] = None, yield_each_sweep: bool = False, + checked_locations: Optional[Set[Location]] = None) -> Optional[Iterator[None]]: + """ + Sweep through the locations that contain uncollected advancement items, collecting the items into the state + until there are no more reachable locations that contain uncollected advancement items. + + :param locations: The locations to sweep through, defaulting to all locations in the multiworld. + :param yield_each_sweep: When True, return a generator that yields at the end of each sweep iteration. + :param checked_locations: Optional override of locations to filter out from the locations argument, defaults to + self.advancements when None. + """ + if checked_locations is None: + checked_locations = self.advancements + + # Since the sweep loop usually performs many iterations, the locations are filtered in advance. + # A list of tuples is used, instead of a dictionary, because it is faster to iterate. + advancements_per_player: List[Tuple[int, List[Location]]] + if locations is None: + # `location.advancement` can only be True for filled locations, so unfilled locations are filtered out. + advancements_per_player = [] + for player, locations_dict in self.multiworld.regions.location_cache.items(): + filtered_locations = [location for location in locations_dict.values() + if location.advancement and location not in checked_locations] + if filtered_locations: + advancements_per_player.append((player, filtered_locations)) + else: + # Filter and separate the locations into a list for each player. + advancements_per_player_dict: Dict[int, List[Location]] = defaultdict(list) + for location in locations: + if location.advancement and location not in checked_locations: + advancements_per_player_dict[location.player].append(location) + # Convert to a list of tuples. + advancements_per_player = list(advancements_per_player_dict.items()) + del advancements_per_player_dict + + if yield_each_sweep: + # Return a generator that will yield at the end of each sweep iteration. + return self._sweep_for_advancements_impl(advancements_per_player, True) + else: + # Create the generator, but tell it not to yield anything, so it will run to completion in zero iterations + # once started, then start and exhaust the generator by attempting to iterate it. + for _ in self._sweep_for_advancements_impl(advancements_per_player, False): + assert False, "Generator yielded when it should have run to completion without yielding" + return None # item name related def has(self, item: str, player: int, count: int = 1) -> bool: @@ -1012,6 +1122,17 @@ class CollectionState(): return changed + def add_item(self, item: str, player: int, count: int = 1) -> None: + """ + Adds the item to state. + + :param item: The item to be added. + :param player: The player the item is for. + :param count: How many of the item to add. + """ + assert count > 0 + self.prog_items[player][item] += count + def remove(self, item: Item): changed = self.multiworld.worlds[item.player].remove(self, item) if changed: @@ -1020,6 +1141,33 @@ class CollectionState(): self.blocked_connections[item.player] = set() self.stale[item.player] = True + def remove_item(self, item: str, player: int, count: int = 1) -> None: + """ + Removes the item from state. + + :param item: The item to be removed. + :param player: The player the item is for. + :param count: How many of the item to remove. + """ + assert count > 0 + self.prog_items[player][item] -= count + if self.prog_items[player][item] < 1: + del (self.prog_items[player][item]) + + def set_item(self, item: str, player: int, count: int) -> None: + """ + Sets the item in state equal to the provided count. + + :param item: The item to modify. + :param player: The player the item is for. + :param count: How many of the item to now have. + """ + assert count >= 0 + if count == 0: + del (self.prog_items[player][item]) + else: + self.prog_items[player][item] = count + class EntranceType(IntEnum): ONE_WAY = 1 @@ -1106,13 +1254,13 @@ class Region: self.region_manager = region_manager def __getitem__(self, index: int) -> Location: - return self._list.__getitem__(index) + return self._list[index] def __setitem__(self, index: int, value: Location) -> None: raise NotImplementedError() def __len__(self) -> int: - return self._list.__len__() + return len(self._list) def __iter__(self): return iter(self._list) @@ -1126,8 +1274,8 @@ class Region: class LocationRegister(Register): def __delitem__(self, index: int) -> None: - location: Location = self._list.__getitem__(index) - self._list.__delitem__(index) + location: Location = self._list[index] + del self._list[index] del(self.region_manager.location_cache[location.player][location.name]) def insert(self, index: int, value: Location) -> None: @@ -1138,8 +1286,8 @@ class Region: class EntranceRegister(Register): def __delitem__(self, index: int) -> None: - entrance: Entrance = self._list.__getitem__(index) - self._list.__delitem__(index) + entrance: Entrance = self._list[index] + del self._list[index] del(self.region_manager.entrance_cache[entrance.player][entrance.name]) def insert(self, index: int, value: Entrance) -> None: @@ -1293,8 +1441,8 @@ class Region: Connects current region to regions in exit dictionary. Passed region names must exist first. :param exits: exits from the region. format is {"connecting_region": "exit_name"}. if a non dict is provided, - created entrances will be named "self.name -> connecting_region" - :param rules: rules for the exits from this region. format is {"connecting_region", rule} + created entrances will be named "self.name -> connecting_region" + :param rules: rules for the exits from this region. format is {"connecting_region": rule} """ if not isinstance(exits, Dict): exits = dict.fromkeys(exits) @@ -1386,31 +1534,47 @@ class Location: class ItemClassification(IntFlag): - filler = 0b0000 + filler = 0b00000 """ aka trash, as in filler items like ammo, currency etc """ - progression = 0b0001 + progression = 0b00001 """ Item that is logically relevant. Protects this item from being placed on excluded or unreachable locations. """ - useful = 0b0010 + useful = 0b00010 """ Item that is especially useful. Protects this item from being placed on excluded or unreachable locations. When combined with another flag like "progression", it means "an especially useful progression item". """ - trap = 0b0100 + trap = 0b00100 """ Item that is detrimental in some way. """ - skip_balancing = 0b1000 + skip_balancing = 0b01000 """ should technically never occur on its own Item that is logically relevant, but progression balancing should not touch. - Typically currency or other counted items. """ + + Possible reasons for why an item should not be pulled ahead by progression balancing: + 1. This item is quite insignificant, so pulling it earlier doesn't help (currency/etc.) + 2. It is important for the player experience that this item is evenly distributed in the seed (e.g. goal items) """ - progression_skip_balancing = 0b1001 # only progression gets balanced + deprioritized = 0b10000 + """ Should technically never occur on its own. + Will not be considered for priority locations, + unless Priority Locations Fill runs out of regular progression items before filling all priority locations. + + Should be used for items that would feel bad for the player to find on a priority location. + Usually, these are items that are plentiful or insignificant. """ + + progression_deprioritized_skip_balancing = 0b11001 + """ Since a common case of both skip_balancing and deprioritized is "insignificant progression", + these items often want both flags. """ + + progression_skip_balancing = 0b01001 # only progression gets balanced + progression_deprioritized = 0b10001 # only progression can be placed during priority fill def as_flag(self) -> int: """As Network API flag int.""" - return int(self & 0b0111) + return int(self & 0b00111) class Item: @@ -1454,6 +1618,10 @@ class Item: def trap(self) -> bool: return ItemClassification.trap in self.classification + @property + def deprioritized(self) -> bool: + return ItemClassification.deprioritized in self.classification + @property def filler(self) -> bool: return not (self.advancement or self.useful or self.trap) @@ -1563,21 +1731,19 @@ class Spoiler: # in the second phase, we cull each sphere such that the game is still beatable, # reducing each range of influence to the bare minimum required inside it - restore_later: Dict[Location, Item] = {} + required_locations = {location for sphere in collection_spheres for location in sphere} for num, sphere in reversed(tuple(enumerate(collection_spheres))): to_delete: Set[Location] = set() for location in sphere: - # we remove the item at location and check if game is still beatable + # we remove the location from required_locations to sweep from, and check if the game is still beatable logging.debug('Checking if %s (Player %d) is required to beat the game.', location.item.name, location.item.player) - old_item = location.item - location.item = None - if multiworld.can_beat_game(state_cache[num]): + required_locations.remove(location) + if multiworld.can_beat_game(state_cache[num], required_locations): to_delete.add(location) - restore_later[location] = old_item else: # still required, got to keep it around - location.item = old_item + required_locations.add(location) # cull entries in spheres for spoiler walkthrough at end sphere -= to_delete @@ -1594,7 +1760,7 @@ class Spoiler: logging.debug('Checking if %s (Player %d) is required to beat the game.', item.name, item.player) precollected_items.remove(item) multiworld.state.remove(item) - if not multiworld.can_beat_game(): + if not multiworld.can_beat_game(multiworld.state, required_locations): # Add the item back into `precollected_items` and collect it into `multiworld.state`. multiworld.push_precollected(item) else: @@ -1636,9 +1802,6 @@ class Spoiler: self.create_paths(state, collection_spheres) # repair the multiworld again - for location, item in restore_later.items(): - location.item = item - for item in removed_precollected: multiworld.push_precollected(item) @@ -1739,7 +1902,8 @@ class Spoiler: if self.unreachables: outfile.write('\n\nUnreachable Progression Items:\n\n') outfile.write( - '\n'.join(['%s: %s' % (unreachable.item, unreachable) for unreachable in self.unreachables])) + '\n'.join(['%s: %s' % (unreachable.item, unreachable) + for unreachable in sorted(self.unreachables)])) if self.paths: outfile.write('\n\nPaths:\n\n') @@ -1766,7 +1930,7 @@ class Tutorial(NamedTuple): description: str language: str file_name: str - link: str + link: str # unused authors: List[str] diff --git a/CommonClient.py b/CommonClient.py index 94c558bf8a..b1d9aeb156 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -21,7 +21,7 @@ import Utils if __name__ == "__main__": Utils.init_logging("TextClient", exception_logger="Client") -from MultiServer import CommandProcessor +from MultiServer import CommandProcessor, mark_raw from NetUtils import (Endpoint, decode, NetworkItem, encode, JSONtoTextParser, ClientStatus, Permission, NetworkSlot, RawJSONtoTextParser, add_json_text, add_json_location, add_json_item, JSONTypes, HintStatus, SlotType) from Utils import Version, stream_input, async_start @@ -107,7 +107,9 @@ class ClientCommandProcessor(CommandProcessor): return False count = 0 checked_count = 0 - for location, location_id in AutoWorldRegister.world_types[self.ctx.game].location_name_to_id.items(): + + lookup = self.ctx.location_names[self.ctx.game] + for location_id, location in lookup.items(): if filter_text and filter_text not in location: continue if location_id < 0: @@ -128,43 +130,87 @@ class ClientCommandProcessor(CommandProcessor): self.output("No missing location checks found.") return True - def _cmd_items(self): + def output_datapackage_part(self, name: typing.Literal["Item Names", "Location Names"]) -> bool: + """ + Helper to digest a specific section of this game's datapackage. + + :param name: Printed to the user as context for the part. + + :return: Whether the process was successful. + """ + if not self.ctx.game: + self.output(f"No game set, cannot determine {name}.") + return False + + lookup = self.ctx.item_names if name == "Item Names" else self.ctx.location_names + lookup = lookup[self.ctx.game] + self.output(f"{name} for {self.ctx.game}") + for name in lookup.values(): + self.output(name) + return True + + def _cmd_items(self) -> bool: """List all item names for the currently running game.""" - if not self.ctx.game: - self.output("No game set, cannot determine existing items.") - return False - self.output(f"Item Names for {self.ctx.game}") - for item_name in AutoWorldRegister.world_types[self.ctx.game].item_name_to_id: - self.output(item_name) + return self.output_datapackage_part("Item Names") - def _cmd_item_groups(self): - """List all item group names for the currently running game.""" - if not self.ctx.game: - self.output("No game set, cannot determine existing item groups.") - return False - self.output(f"Item Group Names for {self.ctx.game}") - for group_name in AutoWorldRegister.world_types[self.ctx.game].item_name_groups: - self.output(group_name) - - def _cmd_locations(self): + def _cmd_locations(self) -> bool: """List all location names for the currently running game.""" - if not self.ctx.game: - self.output("No game set, cannot determine existing locations.") - return False - self.output(f"Location Names for {self.ctx.game}") - for location_name in AutoWorldRegister.world_types[self.ctx.game].location_name_to_id: - self.output(location_name) + return self.output_datapackage_part("Location Names") - def _cmd_location_groups(self): - """List all location group names for the currently running game.""" - if not self.ctx.game: - self.output("No game set, cannot determine existing location groups.") - return False - self.output(f"Location Group Names for {self.ctx.game}") - for group_name in AutoWorldRegister.world_types[self.ctx.game].location_name_groups: - self.output(group_name) + def output_group_part(self, group_key: typing.Literal["item_name_groups", "location_name_groups"], + filter_key: str, + name: str) -> bool: + """ + Logs an item or location group from the player's game's datapackage. - def _cmd_ready(self): + :param group_key: Either Item or Location group to be processed. + :param filter_key: Which group key to filter to. If an empty string is passed will log all item/location groups. + :param name: Printed to the user as context for the part. + + :return: Whether the process was successful. + """ + if not self.ctx.game: + self.output(f"No game set, cannot determine existing {name} Groups.") + return False + lookup = Utils.persistent_load().get("groups_by_checksum", {}).get(self.ctx.checksums[self.ctx.game], {})\ + .get(self.ctx.game, {}).get(group_key, {}) + if lookup is None: + self.output("datapackage not yet loaded, try again") + return False + + if filter_key: + if filter_key not in lookup: + self.output(f"Unknown {name} Group {filter_key}") + return False + + self.output(f"{name}s for {name} Group \"{filter_key}\"") + for entry in lookup[filter_key]: + self.output(entry) + else: + self.output(f"{name} Groups for {self.ctx.game}") + for group in lookup: + self.output(group) + return True + + @mark_raw + def _cmd_item_groups(self, key: str = "") -> bool: + """ + List all item group names for the currently running game. + + :param key: Which item group to filter to. Will log all groups if empty. + """ + return self.output_group_part("item_name_groups", key, "Item") + + @mark_raw + def _cmd_location_groups(self, key: str = "") -> bool: + """ + List all location group names for the currently running game. + + :param key: Which item group to filter to. Will log all groups if empty. + """ + return self.output_group_part("location_name_groups", key, "Location") + + def _cmd_ready(self) -> bool: """Send ready status to server.""" self.ctx.ready = not self.ctx.ready if self.ctx.ready: @@ -174,6 +220,7 @@ class ClientCommandProcessor(CommandProcessor): state = ClientStatus.CLIENT_CONNECTED self.output("Unreadied.") async_start(self.ctx.send_msgs([{"cmd": "StatusUpdate", "status": state}]), name="send StatusUpdate") + return True def default(self, raw: str): """The default message parser to be used when parsing any messages that do not match a command""" @@ -201,6 +248,7 @@ class CommonContext: # noinspection PyTypeChecker def __getitem__(self, key: str) -> typing.Mapping[int, str]: + assert isinstance(key, str), f"ctx.{self.lookup_type}_names used with an id, use the lookup_in_ helpers instead" return self._game_store[key] def __len__(self) -> int: @@ -210,7 +258,7 @@ class CommonContext: return iter(self._game_store) def __repr__(self) -> str: - return self._game_store.__repr__() + return repr(self._game_store) def lookup_in_game(self, code: int, game_name: typing.Optional[str] = None) -> str: """Returns the name for an item/location id in the context of a specific game or own game if `game` is @@ -266,38 +314,71 @@ class CommonContext: last_death_link: float = time.time() # last send/received death link on AP layer # remaining type info - slot_info: typing.Dict[int, NetworkSlot] - server_address: typing.Optional[str] - password: typing.Optional[str] - hint_cost: typing.Optional[int] - hint_points: typing.Optional[int] - player_names: typing.Dict[int, str] + slot_info: dict[int, NetworkSlot] + """Slot Info from the server for the current connection""" + server_address: str | None + """Autoconnect address provided by the ctx constructor""" + password: str | None + """Password used for Connecting, expected by server_auth""" + hint_cost: int | None + """Current Hint Cost per Hint from the server""" + hint_points: int | None + """Current avaliable Hint Points from the server""" + player_names: dict[int, str] + """Current lookup of slot number to player display name from server (includes aliases)""" finished_game: bool + """ + Bool to signal that status should be updated to Goal after reconnecting + to be used to ensure that a StatusUpdate packet does not get lost when disconnected + """ ready: bool - team: typing.Optional[int] - slot: typing.Optional[int] - auth: typing.Optional[str] - seed_name: typing.Optional[str] + """Bool to keep track of state for the /ready command""" + team: int | None + """Team number of currently connected slot""" + slot: int | None + """Slot number of currently connected slot""" + auth: str | None + """Name used in Connect packet""" + seed_name: str | None + """Seed name that will be validated on opening a socket if present""" # locations - locations_checked: typing.Set[int] # local state - locations_scouted: typing.Set[int] - items_received: typing.List[NetworkItem] - missing_locations: typing.Set[int] # server state - checked_locations: typing.Set[int] # server state - server_locations: typing.Set[int] # all locations the server knows of, missing_location | checked_locations - locations_info: typing.Dict[int, NetworkItem] + locations_checked: set[int] + """ + Local container of location ids checked to signal that LocationChecks should be resent after reconnecting + to be used to ensure that a LocationChecks packet does not get lost when disconnected + """ + locations_scouted: set[int] + """ + Local container of location ids scouted to signal that LocationScouts should be resent after reconnecting + to be used to ensure that a LocationScouts packet does not get lost when disconnected + """ + items_received: list[NetworkItem] + """List of NetworkItems recieved from the server""" + missing_locations: set[int] + """Container of Locations that are unchecked per server state""" + checked_locations: set[int] + """Container of Locations that are checked per server state""" + server_locations: set[int] + """Container of Locations that exist per server state; a combination between missing and checked locations""" + locations_info: dict[int, NetworkItem] + """Dict of location id: NetworkItem info from LocationScouts request""" # data storage - stored_data: typing.Dict[str, typing.Any] - stored_data_notification_keys: typing.Set[str] + stored_data: dict[str, typing.Any] + """ + Data Storage values by key that were retrieved from the server + any keys subscribed to with SetNotify will be kept up to date + """ + stored_data_notification_keys: set[str] + """Current container of watched Data Storage keys, managed by ctx.set_notify""" # internals - # current message box through kvui _messagebox: typing.Optional["kvui.MessageBox"] = None - # message box reporting a loss of connection + """Current message box through kvui""" _messagebox_connection_loss: typing.Optional["kvui.MessageBox"] = None + """Message box reporting a loss of connection""" def __init__(self, server_address: typing.Optional[str] = None, password: typing.Optional[str] = None) -> None: # server state @@ -345,6 +426,8 @@ class CommonContext: self.jsontotextparser = JSONtoTextParser(self) self.rawjsontotextparser = RawJSONtoTextParser(self) + if self.game: + self.checksums[self.game] = network_data_package["games"][self.game]["checksum"] self.update_data_package(network_data_package) # execution @@ -604,6 +687,24 @@ class CommonContext: for game, game_data in data_package["games"].items(): Utils.store_data_package_for_checksum(game, game_data) + def consume_network_item_groups(self): + data = {"item_name_groups": self.stored_data[f"_read_item_name_groups_{self.game}"]} + current_cache = Utils.persistent_load().get("groups_by_checksum", {}).get(self.checksums[self.game], {}) + if self.game in current_cache: + current_cache[self.game].update(data) + else: + current_cache[self.game] = data + Utils.persistent_store("groups_by_checksum", self.checksums[self.game], current_cache) + + def consume_network_location_groups(self): + data = {"location_name_groups": self.stored_data[f"_read_location_name_groups_{self.game}"]} + current_cache = Utils.persistent_load().get("groups_by_checksum", {}).get(self.checksums[self.game], {}) + if self.game in current_cache: + current_cache[self.game].update(data) + else: + current_cache[self.game] = data + Utils.persistent_store("groups_by_checksum", self.checksums[self.game], current_cache) + # data storage def set_notify(self, *keys: str) -> None: @@ -904,6 +1005,12 @@ async def process_server_cmd(ctx: CommonContext, args: dict): ctx.hint_points = args.get("hint_points", 0) ctx.consume_players_package(args["players"]) ctx.stored_data_notification_keys.add(f"_read_hints_{ctx.team}_{ctx.slot}") + if ctx.game: + game = ctx.game + else: + game = ctx.slot_info[ctx.slot][1] + ctx.stored_data_notification_keys.add(f"_read_item_name_groups_{game}") + ctx.stored_data_notification_keys.add(f"_read_location_name_groups_{game}") msgs = [] if ctx.locations_checked: msgs.append({"cmd": "LocationChecks", @@ -984,11 +1091,19 @@ async def process_server_cmd(ctx: CommonContext, args: dict): ctx.stored_data.update(args["keys"]) if ctx.ui and f"_read_hints_{ctx.team}_{ctx.slot}" in args["keys"]: ctx.ui.update_hints() + if f"_read_item_name_groups_{ctx.game}" in args["keys"]: + ctx.consume_network_item_groups() + if f"_read_location_name_groups_{ctx.game}" in args["keys"]: + ctx.consume_network_location_groups() elif cmd == "SetReply": ctx.stored_data[args["key"]] = args["value"] if ctx.ui and f"_read_hints_{ctx.team}_{ctx.slot}" == args["key"]: ctx.ui.update_hints() + elif f"_read_item_name_groups_{ctx.game}" == args["key"]: + ctx.consume_network_item_groups() + elif f"_read_location_name_groups_{ctx.game}" == args["key"]: + ctx.consume_network_location_groups() elif args["key"].startswith("EnergyLink"): ctx.current_energy_link_value = args["value"] if ctx.ui: diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..363478988c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,100 @@ +# hadolint global ignore=SC1090,SC1091 + +# Source +FROM scratch AS release +WORKDIR /release +ADD https://github.com/Ijwu/Enemizer/releases/latest/download/ubuntu.16.04-x64.zip Enemizer.zip + +# Enemizer +FROM alpine:3.21 AS enemizer +ARG TARGETARCH +WORKDIR /release +COPY --from=release /release/Enemizer.zip . + +# No release for arm architecture. Skip. +RUN if [ "$TARGETARCH" = "amd64" ]; then \ + apk add unzip=6.0-r15 --no-cache && \ + unzip -u Enemizer.zip -d EnemizerCLI && \ + chmod -R 777 EnemizerCLI; \ + else touch EnemizerCLI; fi + +# Cython builder stage +FROM python:3.12 AS cython-builder + +WORKDIR /build + +# Copy and install requirements first (better caching) +COPY requirements.txt WebHostLib/requirements.txt + +RUN pip install --no-cache-dir -r \ + WebHostLib/requirements.txt \ + "setuptools>=75,<81" + +COPY _speedups.pyx . +COPY intset.h . + +RUN cythonize -b -i _speedups.pyx + +# Archipelago +FROM python:3.12-slim-bookworm AS archipelago +ARG TARGETARCH +ENV VIRTUAL_ENV=/opt/venv +ENV PYTHONUNBUFFERED=1 +WORKDIR /app + +# Install requirements +# hadolint ignore=DL3008 +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + git \ + gcc=4:12.2.0-3 \ + libc6-dev \ + libtk8.6=8.6.13-2 \ + g++=4:12.2.0-3 \ + curl && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Create and activate venv +RUN python -m venv $VIRTUAL_ENV; \ + . $VIRTUAL_ENV/bin/activate + +# Copy and install requirements first (better caching) +COPY WebHostLib/requirements.txt WebHostLib/requirements.txt + +RUN pip install --no-cache-dir -r \ + WebHostLib/requirements.txt \ + gunicorn==23.0.0 + +COPY . . + +COPY --from=cython-builder /build/*.so ./ + +# Run ModuleUpdate +RUN python ModuleUpdate.py -y + +# Purge unneeded packages +RUN apt-get purge -y \ + git \ + gcc \ + libc6-dev \ + g++ && \ + apt-get autoremove -y + +# Copy necessary components +COPY --from=enemizer /release/EnemizerCLI /tmp/EnemizerCLI + +# No release for arm architecture. Skip. +RUN if [ "$TARGETARCH" = "amd64" ]; then \ + cp -r /tmp/EnemizerCLI EnemizerCLI; \ + fi; \ + rm -rf /tmp/EnemizerCLI + +# Define health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD curl -f http://localhost:${PORT:-80} || exit 1 + +# Ensure no runtime ModuleUpdate. +ENV SKIP_REQUIREMENTS_UPDATE=true + +ENTRYPOINT [ "python", "WebHost.py" ] diff --git a/FF1Client.py b/FF1Client.py deleted file mode 100644 index 748a95b72c..0000000000 --- a/FF1Client.py +++ /dev/null @@ -1,267 +0,0 @@ -import asyncio -import copy -import json -import time -from asyncio import StreamReader, StreamWriter -from typing import List - - -import Utils -from Utils import async_start -from CommonClient import CommonContext, server_loop, gui_enabled, ClientCommandProcessor, logger, \ - get_base_parser - -SYSTEM_MESSAGE_ID = 0 - -CONNECTION_TIMING_OUT_STATUS = "Connection timing out. Please restart your emulator, then restart connector_ff1.lua" -CONNECTION_REFUSED_STATUS = "Connection Refused. Please start your emulator and make sure connector_ff1.lua is running" -CONNECTION_RESET_STATUS = "Connection was reset. Please restart your emulator, then restart connector_ff1.lua" -CONNECTION_TENTATIVE_STATUS = "Initial Connection Made" -CONNECTION_CONNECTED_STATUS = "Connected" -CONNECTION_INITIAL_STATUS = "Connection has not been initiated" - -DISPLAY_MSGS = True - - -class FF1CommandProcessor(ClientCommandProcessor): - def __init__(self, ctx: CommonContext): - super().__init__(ctx) - - def _cmd_nes(self): - """Check NES Connection State""" - if isinstance(self.ctx, FF1Context): - logger.info(f"NES Status: {self.ctx.nes_status}") - - def _cmd_toggle_msgs(self): - """Toggle displaying messages in EmuHawk""" - global DISPLAY_MSGS - DISPLAY_MSGS = not DISPLAY_MSGS - logger.info(f"Messages are now {'enabled' if DISPLAY_MSGS else 'disabled'}") - - -class FF1Context(CommonContext): - command_processor = FF1CommandProcessor - game = 'Final Fantasy' - items_handling = 0b111 # full remote - - def __init__(self, server_address, password): - super().__init__(server_address, password) - self.nes_streams: (StreamReader, StreamWriter) = None - self.nes_sync_task = None - self.messages = {} - self.locations_array = None - self.nes_status = CONNECTION_INITIAL_STATUS - self.awaiting_rom = False - self.display_msgs = True - - async def server_auth(self, password_requested: bool = False): - if password_requested and not self.password: - await super(FF1Context, self).server_auth(password_requested) - if not self.auth: - self.awaiting_rom = True - logger.info('Awaiting connection to NES to get Player information') - return - - await self.send_connect() - - def _set_message(self, msg: str, msg_id: int): - if DISPLAY_MSGS: - self.messages[time.time(), msg_id] = msg - - def on_package(self, cmd: str, args: dict): - if cmd == 'Connected': - async_start(parse_locations(self.locations_array, self, True)) - elif cmd == 'Print': - msg = args['text'] - if ': !' not in msg: - self._set_message(msg, SYSTEM_MESSAGE_ID) - - def on_print_json(self, args: dict): - if self.ui: - self.ui.print_json(copy.deepcopy(args["data"])) - else: - text = self.jsontotextparser(copy.deepcopy(args["data"])) - logger.info(text) - relevant = args.get("type", None) in {"Hint", "ItemSend"} - if relevant: - item = args["item"] - # goes to this world - if self.slot_concerns_self(args["receiving"]): - relevant = True - # found in this world - elif self.slot_concerns_self(item.player): - relevant = True - # not related - else: - relevant = False - if relevant: - item = args["item"] - msg = self.raw_text_parser(copy.deepcopy(args["data"])) - self._set_message(msg, item.item) - - def run_gui(self): - from kvui import GameManager - - class FF1Manager(GameManager): - logging_pairs = [ - ("Client", "Archipelago") - ] - base_title = "Archipelago Final Fantasy 1 Client" - - self.ui = FF1Manager(self) - self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") - - -def get_payload(ctx: FF1Context): - current_time = time.time() - return json.dumps( - { - "items": [item.item for item in ctx.items_received], - "messages": {f'{key[0]}:{key[1]}': value for key, value in ctx.messages.items() - if key[0] > current_time - 10} - } - ) - - -async def parse_locations(locations_array: List[int], ctx: FF1Context, force: bool): - if locations_array == ctx.locations_array and not force: - return - else: - # print("New values") - ctx.locations_array = locations_array - locations_checked = [] - if len(locations_array) > 0xFE and locations_array[0xFE] & 0x02 != 0 and not ctx.finished_game: - await ctx.send_msgs([ - {"cmd": "StatusUpdate", - "status": 30} - ]) - ctx.finished_game = True - for location in ctx.missing_locations: - # index will be - 0x100 or 0x200 - index = location - if location < 0x200: - # Location is a chest - index -= 0x100 - flag = 0x04 - else: - # Location is an NPC - index -= 0x200 - flag = 0x02 - - # print(f"Location: {ctx.location_names[location]}") - # print(f"Index: {str(hex(index))}") - # print(f"value: {locations_array[index] & flag != 0}") - if locations_array[index] & flag != 0: - locations_checked.append(location) - if locations_checked: - # print([ctx.location_names[location] for location in locations_checked]) - await ctx.send_msgs([ - {"cmd": "LocationChecks", - "locations": locations_checked} - ]) - - -async def nes_sync_task(ctx: FF1Context): - logger.info("Starting nes connector. Use /nes for status information") - while not ctx.exit_event.is_set(): - error_status = None - if ctx.nes_streams: - (reader, writer) = ctx.nes_streams - msg = get_payload(ctx).encode() - writer.write(msg) - writer.write(b'\n') - try: - await asyncio.wait_for(writer.drain(), timeout=1.5) - try: - # Data will return a dict with up to two fields: - # 1. A keepalive response of the Players Name (always) - # 2. An array representing the memory values of the locations area (if in game) - data = await asyncio.wait_for(reader.readline(), timeout=5) - data_decoded = json.loads(data.decode()) - # print(data_decoded) - if ctx.game is not None and 'locations' in data_decoded: - # Not just a keep alive ping, parse - async_start(parse_locations(data_decoded['locations'], ctx, False)) - if not ctx.auth: - ctx.auth = ''.join([chr(i) for i in data_decoded['playerName'] if i != 0]) - if ctx.auth == '': - logger.info("Invalid ROM detected. No player name built into the ROM. Please regenerate" - "the ROM using the same link but adding your slot name") - if ctx.awaiting_rom: - await ctx.server_auth(False) - except asyncio.TimeoutError: - logger.debug("Read Timed Out, Reconnecting") - error_status = CONNECTION_TIMING_OUT_STATUS - writer.close() - ctx.nes_streams = None - except ConnectionResetError as e: - logger.debug("Read failed due to Connection Lost, Reconnecting") - error_status = CONNECTION_RESET_STATUS - writer.close() - ctx.nes_streams = None - except TimeoutError: - logger.debug("Connection Timed Out, Reconnecting") - error_status = CONNECTION_TIMING_OUT_STATUS - writer.close() - ctx.nes_streams = None - except ConnectionResetError: - logger.debug("Connection Lost, Reconnecting") - error_status = CONNECTION_RESET_STATUS - writer.close() - ctx.nes_streams = None - if ctx.nes_status == CONNECTION_TENTATIVE_STATUS: - if not error_status: - logger.info("Successfully Connected to NES") - ctx.nes_status = CONNECTION_CONNECTED_STATUS - else: - ctx.nes_status = f"Was tentatively connected but error occured: {error_status}" - elif error_status: - ctx.nes_status = error_status - logger.info("Lost connection to nes and attempting to reconnect. Use /nes for status updates") - else: - try: - logger.debug("Attempting to connect to NES") - ctx.nes_streams = await asyncio.wait_for(asyncio.open_connection("localhost", 52980), timeout=10) - ctx.nes_status = CONNECTION_TENTATIVE_STATUS - except TimeoutError: - logger.debug("Connection Timed Out, Trying Again") - ctx.nes_status = CONNECTION_TIMING_OUT_STATUS - continue - except ConnectionRefusedError: - logger.debug("Connection Refused, Trying Again") - ctx.nes_status = CONNECTION_REFUSED_STATUS - continue - - -if __name__ == '__main__': - # Text Mode to use !hint and such with games that have no text entry - Utils.init_logging("FF1Client") - - options = Utils.get_options() - DISPLAY_MSGS = options["ffr_options"]["display_msgs"] - - async def main(args): - ctx = FF1Context(args.connect, args.password) - ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop") - if gui_enabled: - ctx.run_gui() - ctx.run_cli() - ctx.nes_sync_task = asyncio.create_task(nes_sync_task(ctx), name="NES Sync") - - await ctx.exit_event.wait() - ctx.server_address = None - - await ctx.shutdown() - - if ctx.nes_sync_task: - await ctx.nes_sync_task - - - import colorama - - parser = get_base_parser() - args = parser.parse_args() - colorama.just_fix_windows_console() - - asyncio.run(main(args)) - colorama.deinit() diff --git a/Fill.py b/Fill.py index ff59aa22cb..7a079fbc82 100644 --- a/Fill.py +++ b/Fill.py @@ -116,6 +116,13 @@ def fill_restrictive(multiworld: MultiWorld, base_state: CollectionState, locati else: # we filled all reachable spots. if swap: + # Keep a cache of previous safe swap states that might be usable to sweep from to produce the next + # swap state, instead of sweeping from `base_state` each time. + previous_safe_swap_state_cache: typing.Deque[CollectionState] = deque() + # Almost never are more than 2 states needed. The rare cases that do are usually highly restrictive + # single_player_placement=True pre-fills which can go through more than 10 states in some seeds. + max_swap_base_state_cache_length = 3 + # try swapping this item with previously placed items in a safe way then in an unsafe way swap_attempts = ((i, location, unsafe) for unsafe in (False, True) @@ -130,40 +137,50 @@ def fill_restrictive(multiworld: MultiWorld, base_state: CollectionState, locati location.item = None placed_item.location = None - swap_state = sweep_from_pool(base_state, [placed_item, *item_pool] if unsafe else item_pool, - multiworld.get_filled_locations(item.player) - if single_player_placement else None) + + for previous_safe_swap_state in previous_safe_swap_state_cache: + # If a state has already checked the location of the swap, then it cannot be used. + if location not in previous_safe_swap_state.advancements: + # Previous swap states will have collected all items in `item_pool`, so the new + # `swap_state` can skip having to collect them again. + # Previous swap states will also have already checked many locations, making the sweep + # faster. + swap_state = sweep_from_pool(previous_safe_swap_state, (placed_item,) if unsafe else (), + multiworld.get_filled_locations(item.player) + if single_player_placement else None) + break + else: + # No previous swap_state was usable as a base state to sweep from, so create a new one. + swap_state = sweep_from_pool(base_state, [placed_item, *item_pool] if unsafe else item_pool, + multiworld.get_filled_locations(item.player) + if single_player_placement else None) + # Unsafe states should not be added to the cache because they have collected `placed_item`. + if not unsafe: + if len(previous_safe_swap_state_cache) >= max_swap_base_state_cache_length: + # Remove the oldest cached state. + previous_safe_swap_state_cache.pop() + # Add the new state to the start of the cache. + previous_safe_swap_state_cache.appendleft(swap_state) # unsafe means swap_state assumes we can somehow collect placed_item before item_to_place # by continuing to swap, which is not guaranteed. This is unsafe because there is no mechanic # to clean that up later, so there is a chance generation fails. if (not single_player_placement or location.player == item_to_place.player) \ and location.can_fill(swap_state, item_to_place, perform_access_check): + # Add this item to the existing placement, and + # add the old item to the back of the queue + spot_to_fill = placements.pop(i) - # Verify placing this item won't reduce available locations, which would be a useless swap. - prev_state = swap_state.copy() - prev_loc_count = len( - multiworld.get_reachable_locations(prev_state)) + swap_count += 1 + swapped_items[placed_item.player, placed_item.name, unsafe] = swap_count - swap_state.collect(item_to_place, True) - new_loc_count = len( - multiworld.get_reachable_locations(swap_state)) + reachable_items[placed_item.player].appendleft( + placed_item) + item_pool.append(placed_item) - if new_loc_count >= prev_loc_count: - # Add this item to the existing placement, and - # add the old item to the back of the queue - spot_to_fill = placements.pop(i) + # cleanup at the end to hopefully get better errors + cleanup_required = True - swap_count += 1 - swapped_items[placed_item.player, placed_item.name, unsafe] = swap_count - - reachable_items[placed_item.player].appendleft( - placed_item) - item_pool.append(placed_item) - - # cleanup at the end to hopefully get better errors - cleanup_required = True - - break + break # Item can't be placed here, restore original item location.item = placed_item @@ -341,7 +358,12 @@ def fast_fill(multiworld: MultiWorld, return item_pool[placing:], fill_locations[placing:] -def accessibility_corrections(multiworld: MultiWorld, state: CollectionState, locations, pool=[]): +def accessibility_corrections(multiworld: MultiWorld, + state: CollectionState, + locations: list[Location], + pool: list[Item] | None = None) -> None: + if pool is None: + pool = [] maximum_exploration_state = sweep_from_pool(state, pool) minimal_players = {player for player in multiworld.player_ids if multiworld.worlds[player].options.accessibility == "minimal"} @@ -461,6 +483,12 @@ def distribute_early_items(multiworld: MultiWorld, def distribute_items_restrictive(multiworld: MultiWorld, panic_method: typing.Literal["swap", "raise", "start_inventory"] = "swap") -> None: + assert all(item.location is None for item in multiworld.itempool), ( + "At the start of distribute_items_restrictive, " + "there are items in the multiworld itempool that are already placed on locations:\n" + f"{[(item.location, item) for item in multiworld.itempool if item.location is not None]}" + ) + fill_locations = sorted(multiworld.get_unfilled_locations()) multiworld.random.shuffle(fill_locations) # get items to distribute @@ -503,18 +531,50 @@ def distribute_items_restrictive(multiworld: MultiWorld, single_player = multiworld.players == 1 and not multiworld.groups if prioritylocations: + regular_progression = [] + deprioritized_progression = [] + for item in progitempool: + if item.deprioritized: + deprioritized_progression.append(item) + else: + regular_progression.append(item) + # "priority fill" - maximum_exploration_state = sweep_from_pool(multiworld.state) - fill_restrictive(multiworld, maximum_exploration_state, prioritylocations, progitempool, + # try without deprioritized items in the mix at all. This means they need to be collected into state first. + priority_fill_state = sweep_from_pool(multiworld.state, deprioritized_progression) + fill_restrictive(multiworld, priority_fill_state, prioritylocations, regular_progression, single_player_placement=single_player, swap=False, on_place=mark_for_locking, name="Priority", one_item_per_player=True, allow_partial=True) - if prioritylocations: + if prioritylocations and regular_progression: # retry with one_item_per_player off because some priority fills can fail to fill with that optimization - maximum_exploration_state = sweep_from_pool(multiworld.state) - fill_restrictive(multiworld, maximum_exploration_state, prioritylocations, progitempool, - single_player_placement=single_player, swap=False, on_place=mark_for_locking, - name="Priority Retry", one_item_per_player=False) + # deprioritized items are still not in the mix, so they need to be collected into state first. + # allow_partial should only be set if there is deprioritized progression to fall back on. + priority_retry_state = sweep_from_pool(multiworld.state, deprioritized_progression) + fill_restrictive(multiworld, priority_retry_state, prioritylocations, regular_progression, + single_player_placement=single_player, swap=False, on_place=mark_for_locking, + name="Priority Retry", one_item_per_player=False, + allow_partial=bool(deprioritized_progression)) + + if prioritylocations and deprioritized_progression: + # There are no more regular progression items that can be placed on any priority locations. + # We'd still prefer to place deprioritized progression items on priority locations over filler items. + # Since we're leaving out the remaining regular progression now, we need to collect it into state first. + priority_retry_2_state = sweep_from_pool(multiworld.state, regular_progression) + fill_restrictive(multiworld, priority_retry_2_state, prioritylocations, deprioritized_progression, + single_player_placement=single_player, swap=False, on_place=mark_for_locking, + name="Priority Retry 2", one_item_per_player=True, allow_partial=True) + + if prioritylocations and deprioritized_progression: + # retry with deprioritized items AND without one_item_per_player optimisation + # Since we're leaving out the remaining regular progression now, we need to collect it into state first. + priority_retry_3_state = sweep_from_pool(multiworld.state, regular_progression) + fill_restrictive(multiworld, priority_retry_3_state, prioritylocations, deprioritized_progression, + single_player_placement=single_player, swap=False, on_place=mark_for_locking, + name="Priority Retry 3", one_item_per_player=False) + + # restore original order of progitempool + progitempool[:] = [item for item in progitempool if not item.location] accessibility_corrections(multiworld, multiworld.state, prioritylocations, progitempool) defaultlocations = prioritylocations + defaultlocations @@ -901,7 +961,7 @@ def parse_planned_blocks(multiworld: MultiWorld) -> dict[int, list[PlandoItemBlo worlds = set() for listed_world in target_world: if listed_world not in world_name_lookup: - failed(f"Cannot place item to {target_world}'s world as that world does not exist.", + failed(f"Cannot place item to {listed_world}'s world as that world does not exist.", block.force) continue worlds.add(world_name_lookup[listed_world]) @@ -934,9 +994,9 @@ def parse_planned_blocks(multiworld: MultiWorld) -> dict[int, list[PlandoItemBlo if isinstance(locations, str): locations = [locations] - locations_from_groups: list[str] = [] resolved_locations: list[Location] = [] for target_player in worlds: + locations_from_groups: list[str] = [] world_locations = multiworld.get_unfilled_locations(target_player) for group in multiworld.worlds[target_player].location_name_groups: if group in locations: @@ -948,13 +1008,16 @@ def parse_planned_blocks(multiworld: MultiWorld) -> dict[int, list[PlandoItemBlo count = block.count if not count: - count = len(new_block.items) + count = (min(len(new_block.items), len(new_block.resolved_locations)) + if new_block.resolved_locations else len(new_block.items)) if isinstance(count, int): count = {"min": count, "max": count} if "min" not in count: count["min"] = 0 if "max" not in count: - count["max"] = len(new_block.items) + count["max"] = (min(len(new_block.items), len(new_block.resolved_locations)) + if new_block.resolved_locations else len(new_block.items)) + new_block.count = count plando_blocks[player].append(new_block) diff --git a/Generate.py b/Generate.py index e72887c26c..8e81320385 100644 --- a/Generate.py +++ b/Generate.py @@ -10,8 +10,8 @@ import sys import urllib.parse import urllib.request from collections import Counter -from typing import Any, Dict, Tuple, Union from itertools import chain +from typing import Any import ModuleUpdate @@ -77,7 +77,7 @@ def get_seed_name(random_source) -> str: return f"{random_source.randint(0, pow(10, seeddigits) - 1)}".zfill(seeddigits) -def main(args=None) -> Tuple[argparse.Namespace, int]: +def main(args=None) -> tuple[argparse.Namespace, int]: # __name__ == "__main__" check so unittests that already imported worlds don't trip this. if __name__ == "__main__" and "worlds" in sys.modules: raise Exception("Worlds system should not be loaded before logging init.") @@ -95,7 +95,7 @@ def main(args=None) -> Tuple[argparse.Namespace, int]: logging.info("Race mode enabled. Using non-deterministic random source.") random.seed() # reset to time-based random source - weights_cache: Dict[str, Tuple[Any, ...]] = {} + weights_cache: dict[str, tuple[Any, ...]] = {} if args.weights_file_path and os.path.exists(args.weights_file_path): try: weights_cache[args.weights_file_path] = read_weights_yamls(args.weights_file_path) @@ -166,21 +166,12 @@ def main(args=None) -> Tuple[argparse.Namespace, int]: f"A mix is also permitted.") from worlds.AutoWorld import AutoWorldRegister - from worlds.alttp.EntranceRandomizer import parse_arguments - erargs = parse_arguments(['--multi', str(args.multi)]) - erargs.seed = seed - erargs.plando_options = args.plando - erargs.spoiler = args.spoiler - erargs.race = args.race - erargs.outputname = seed_name - erargs.outputpath = args.outputpath - erargs.skip_prog_balancing = args.skip_prog_balancing - erargs.skip_output = args.skip_output - erargs.spoiler_only = args.spoiler_only - erargs.name = {} - erargs.csv_output = args.csv_output + args.outputname = seed_name + args.sprite = dict.fromkeys(range(1, args.multi+1), None) + args.sprite_pool = dict.fromkeys(range(1, args.multi+1), None) + args.name = {} - settings_cache: Dict[str, Tuple[argparse.Namespace, ...]] = \ + settings_cache: dict[str, tuple[argparse.Namespace, ...]] = \ {fname: (tuple(roll_settings(yaml, args.plando) for yaml in yamls) if args.sameoptions else None) for fname, yamls in weights_cache.items()} @@ -205,30 +196,34 @@ def main(args=None) -> Tuple[argparse.Namespace, int]: for player in range(1, args.multi + 1): player_path_cache[player] = player_files.get(player, args.weights_file_path) name_counter = Counter() - erargs.player_options = {} + args.player_options = {} player = 1 while player <= args.multi: path = player_path_cache[player] if path: try: - settings: Tuple[argparse.Namespace, ...] = settings_cache[path] if settings_cache[path] else \ + settings: tuple[argparse.Namespace, ...] = settings_cache[path] if settings_cache[path] else \ tuple(roll_settings(yaml, args.plando) for yaml in weights_cache[path]) for settingsObject in settings: for k, v in vars(settingsObject).items(): if v is not None: try: - getattr(erargs, k)[player] = v + getattr(args, k)[player] = v except AttributeError: - setattr(erargs, k, {player: v}) + setattr(args, k, {player: v}) except Exception as e: raise Exception(f"Error setting {k} to {v} for player {player}") from e - if path == args.weights_file_path: # if name came from the weights file, just use base player name - erargs.name[player] = f"Player{player}" - elif player not in erargs.name: # if name was not specified, generate it from filename - erargs.name[player] = os.path.splitext(os.path.split(path)[-1])[0] - erargs.name[player] = handle_name(erargs.name[player], player, name_counter) + # name was not specified + if player not in args.name: + if path == args.weights_file_path: + # weights file, so we need to make the name unique + args.name[player] = f"Player{player}" + else: + # use the filename + args.name[player] = os.path.splitext(os.path.split(path)[-1])[0] + args.name[player] = handle_name(args.name[player], player, name_counter) player += 1 except Exception as e: @@ -236,13 +231,13 @@ def main(args=None) -> Tuple[argparse.Namespace, int]: else: raise RuntimeError(f'No weights specified for player {player}') - if len(set(name.lower() for name in erargs.name.values())) != len(erargs.name): - raise Exception(f"Names have to be unique. Names: {Counter(name.lower() for name in erargs.name.values())}") + if len(set(name.lower() for name in args.name.values())) != len(args.name): + raise Exception(f"Names have to be unique. Names: {Counter(name.lower() for name in args.name.values())}") - return erargs, seed + return args, seed -def read_weights_yamls(path) -> Tuple[Any, ...]: +def read_weights_yamls(path) -> tuple[Any, ...]: try: if urllib.parse.urlparse(path).scheme in ('https', 'file'): yaml = str(urllib.request.urlopen(path).read(), "utf-8-sig") @@ -378,7 +373,7 @@ def update_weights(weights: dict, new_weights: dict, update_type: str, name: str return weights -def roll_meta_option(option_key, game: str, category_dict: Dict) -> Any: +def roll_meta_option(option_key, game: str, category_dict: dict) -> Any: from worlds import AutoWorldRegister if not game: @@ -491,7 +486,22 @@ def roll_settings(weights: dict, plando_options: PlandoOptions = PlandoOptions.b if required_plando_options: raise Exception(f"Settings reports required plando module {str(required_plando_options)}, " f"which is not enabled.") - + games = requirements.get("game", {}) + for game, version in games.items(): + if game not in AutoWorldRegister.world_types: + continue + if not version: + raise Exception(f"Invalid version for game {game}: {version}.") + if isinstance(version, str): + version = {"min": version} + if "min" in version and tuplize_version(version["min"]) > AutoWorldRegister.world_types[game].world_version: + raise Exception(f"Settings reports required version of world \"{game}\" is at least {version['min']}, " + f"however world is of version " + f"{AutoWorldRegister.world_types[game].world_version.as_simple_string()}.") + if "max" in version and tuplize_version(version["max"]) < AutoWorldRegister.world_types[game].world_version: + raise Exception(f"Settings reports required version of world \"{game}\" is no later than {version['max']}, " + f"however world is of version " + f"{AutoWorldRegister.world_types[game].world_version.as_simple_string()}.") ret = argparse.Namespace() for option_key in Options.PerGameCommonOptions.type_hints: if option_key in weights and option_key not in Options.CommonOptions.type_hints: diff --git a/KH1Client.py b/KH1Client.py deleted file mode 100644 index 4c3ed50190..0000000000 --- a/KH1Client.py +++ /dev/null @@ -1,9 +0,0 @@ -if __name__ == '__main__': - import ModuleUpdate - ModuleUpdate.update() - - import Utils - Utils.init_logging("KH1Client", exception_logger="Client") - - from worlds.kh1.Client import launch - launch() diff --git a/KH2Client.py b/KH2Client.py deleted file mode 100644 index 69e4adf8bf..0000000000 --- a/KH2Client.py +++ /dev/null @@ -1,8 +0,0 @@ -import ModuleUpdate -import Utils -from worlds.kh2.Client import launch -ModuleUpdate.update() - -if __name__ == '__main__': - Utils.init_logging("KH2Client", exception_logger="Client") - launch() diff --git a/Launcher.py b/Launcher.py index 594286fac5..adc3cb96ef 100644 --- a/Launcher.py +++ b/Launcher.py @@ -11,14 +11,16 @@ Additional components can be added to worlds.LauncherComponents.components. import argparse import logging import multiprocessing +import os import shlex import subprocess import sys import urllib.parse import webbrowser +from collections.abc import Callable, Sequence from os.path import isfile from shutil import which -from typing import Callable, Optional, Sequence, Tuple, Union, Any +from typing import Any if __name__ == "__main__": import ModuleUpdate @@ -40,13 +42,17 @@ def open_host_yaml(): if is_linux: exe = which('sensible-editor') or which('gedit') or \ which('xdg-open') or which('gnome-open') or which('kde-open') - subprocess.Popen([exe, file]) elif is_macos: exe = which("open") - subprocess.Popen([exe, file]) else: webbrowser.open(file) + return + env = os.environ + if "LD_LIBRARY_PATH" in env: + env = env.copy() + del env["LD_LIBRARY_PATH"] # exe is a system binary, so reset LD_LIBRARY_PATH + subprocess.Popen([exe, file], env=env) def open_patch(): suffixes = [] @@ -91,7 +97,11 @@ def open_folder(folder_path): return if exe: - subprocess.Popen([exe, folder_path]) + env = os.environ + if "LD_LIBRARY_PATH" in env: + env = env.copy() + del env["LD_LIBRARY_PATH"] # exe is a system binary, so reset LD_LIBRARY_PATH + subprocess.Popen([exe, folder_path], env=env) else: logging.warning(f"No file browser available to open {folder_path}") @@ -103,66 +113,51 @@ def update_settings(): components.extend([ # Functions - Component("Open host.yaml", func=open_host_yaml), - Component("Open Patch", func=open_patch), - Component("Generate Template Options", func=generate_yamls), - Component("Archipelago Website", func=lambda: webbrowser.open("https://archipelago.gg/")), - Component("Discord Server", icon="discord", func=lambda: webbrowser.open("https://discord.gg/8Z65BR2")), + Component("Open host.yaml", func=open_host_yaml, + description="Open the host.yaml file to change settings for generation, games, and more."), + Component("Open Patch", func=open_patch, + description="Open a patch file, downloaded from the room page or provided by the host."), + Component("Generate Template Options", func=generate_yamls, + description="Generate template YAMLs for currently installed games."), + Component("Archipelago Website", func=lambda: webbrowser.open("https://archipelago.gg/"), + description="Open archipelago.gg in your browser."), + Component("Discord Server", icon="discord", func=lambda: webbrowser.open("https://discord.gg/8Z65BR2"), + description="Join the Discord server to play public multiworlds, report issues, or just chat!"), Component("Unrated/18+ Discord Server", icon="discord", - func=lambda: webbrowser.open("https://discord.gg/fqvNCCRsu4")), - Component("Browse Files", func=browse_files), + func=lambda: webbrowser.open("https://discord.gg/fqvNCCRsu4"), + description="Find unrated and 18+ games in the After Dark Discord server."), + Component("Browse Files", func=browse_files, + description="Open the Archipelago installation folder in your file browser."), ]) -def handle_uri(path: str, launch_args: Tuple[str, ...]) -> None: +def handle_uri(path: str) -> tuple[list[Component], Component]: url = urllib.parse.urlparse(path) queries = urllib.parse.parse_qs(url.query) - launch_args = (path, *launch_args) - client_component = [] + client_components = [] text_client_component = None - if "game" in queries: - game = queries["game"][0] - else: # TODO around 0.6.0 - this is for pre this change webhost uri's - game = "Archipelago" + game = queries["game"][0] for component in components: if component.supports_uri and component.game_name == game: - client_component.append(component) + client_components.append(component) elif component.display_name == "Text Client": text_client_component = component - - from kvui import MDButton, MDButtonText - from kivymd.uix.dialog import MDDialog, MDDialogHeadlineText, MDDialogContentContainer, MDDialogSupportingText - from kivymd.uix.divider import MDDivider - - if not client_component: - run_component(text_client_component, *launch_args) - return - else: - popup_text = MDDialogSupportingText(text="Select client to open and connect with.") - component_buttons = [MDDivider()] - for component in [text_client_component, *client_component]: - component_buttons.append(MDButton( - MDButtonText(text=component.display_name), - on_release=lambda *args, comp=component: run_component(comp, *launch_args), - style="text" - )) - component_buttons.append(MDDivider()) - - MDDialog( - # Headline - MDDialogHeadlineText(text="Connect to Multiworld"), - # Text - popup_text, - # Content - MDDialogContentContainer( - *component_buttons, - orientation="vertical" - ), - - ).open() + return client_components, text_client_component -def identify(path: Union[None, str]) -> Tuple[Union[None, str], Union[None, Component]]: +def build_uri_popup(component_list: list[Component], launch_args: tuple[str, ...]) -> None: + from kvui import ButtonsPrompt + component_options = { + component.display_name: component for component in component_list + } + popup = ButtonsPrompt("Connect to Multiworld", + "Select client to open and connect with.", + lambda component_name: run_component(component_options[component_name], *launch_args), + *component_options.keys()) + popup.open() + + +def identify(path: None | str) -> tuple[None | str, None | Component]: if path is None: return None, None for component in components: @@ -173,7 +168,7 @@ def identify(path: Union[None, str]) -> Tuple[Union[None, str], Union[None, Comp return None, None -def get_exe(component: Union[str, Component]) -> Optional[Sequence[str]]: +def get_exe(component: str | Component) -> Sequence[str] | None: if isinstance(component, str): name = component component = None @@ -201,7 +196,8 @@ def get_exe(component: Union[str, Component]) -> Optional[Sequence[str]]: def launch(exe, in_terminal=False): if in_terminal: if is_windows: - subprocess.Popen(['start', *exe], shell=True) + # intentionally using a window title with a space so it gets quoted and treated as a title + subprocess.Popen(["start", "Running Archipelago", *exe], shell=True) return elif is_linux: terminal = which('x-terminal-emulator') or which('gnome-terminal') or which('xterm') @@ -226,10 +222,10 @@ def create_shortcut(button: Any, component: Component) -> None: button.menu.dismiss() -refresh_components: Optional[Callable[[], None]] = None +refresh_components: Callable[[], None] | None = None -def run_gui(path: str, args: Any) -> None: +def run_gui(launch_components: list[Component], args: Any) -> None: from kvui import (ThemedApp, MDFloatLayout, MDGridLayout, ScrollBox) from kivy.properties import ObjectProperty from kivy.core.window import Window @@ -262,12 +258,12 @@ def run_gui(path: str, args: Any) -> None: cards: list[LauncherCard] current_filter: Sequence[str | Type] | None - def __init__(self, ctx=None, path=None, args=None): + def __init__(self, ctx=None, components=None, args=None): self.title = self.base_title + " " + Utils.__version__ self.ctx = ctx self.icon = r"data/icon.png" self.favorites = [] - self.launch_uri = path + self.launch_components = components self.launch_args = args self.cards = [] self.current_filter = (Type.CLIENT, Type.TOOL, Type.ADJUSTER, Type.MISC) @@ -389,9 +385,9 @@ def run_gui(path: str, args: Any) -> None: return self.top_screen def on_start(self): - if self.launch_uri: - handle_uri(self.launch_uri, self.launch_args) - self.launch_uri = None + if self.launch_components: + build_uri_popup(self.launch_components, self.launch_args) + self.launch_components = None self.launch_args = None @staticmethod @@ -409,7 +405,7 @@ def run_gui(path: str, args: Any) -> None: if file and component: run_component(component, file) else: - logging.warning(f"unable to identify component for {file}") + logging.warning(f"unable to identify component for {filename}") def _on_keyboard(self, window: Window, key: int, scancode: int, codepoint: str, modifier: list[str]): # Activate search as soon as we start typing, no matter if we are focused on the search box or not. @@ -432,7 +428,7 @@ def run_gui(path: str, args: Any) -> None: for filter in self.current_filter)) super().on_stop() - Launcher(path=path, args=args).run() + Launcher(components=launch_components, args=args).run() # avoiding Launcher reference leak # and don't try to do something with widgets after window closed @@ -451,7 +447,7 @@ def run_component(component: Component, *args): logging.warning(f"Component {component} does not appear to be executable.") -def main(args: Optional[Union[argparse.Namespace, dict]] = None): +def main(args: argparse.Namespace | dict | None = None): if isinstance(args, argparse.Namespace): args = {k: v for k, v in args._get_kwargs()} elif not args: @@ -459,7 +455,15 @@ def main(args: Optional[Union[argparse.Namespace, dict]] = None): path = args.get("Patch|Game|Component|url", None) if path is not None: - if not path.startswith("archipelago://"): + if path.startswith("archipelago://"): + args["args"] = (path, *args.get("args", ())) + # add the url arg to the passthrough args + components, text_client_component = handle_uri(path) + if not components: + args["component"] = text_client_component + else: + args['launch_components'] = [text_client_component, *components] + else: file, component = identify(path) if file: args['file'] = file @@ -475,12 +479,12 @@ def main(args: Optional[Union[argparse.Namespace, dict]] = None): elif "component" in args: run_component(args["component"], *args["args"]) elif not args["update_settings"]: - run_gui(path, args.get("args", ())) + run_gui(args.get("launch_components", None), args.get("args", ())) if __name__ == '__main__': init_logging('Launcher') - Utils.freeze_support() + multiprocessing.freeze_support() multiprocessing.set_start_method("spawn") # if launched process uses kivy, fork won't work parser = argparse.ArgumentParser( description='Archipelago Launcher', diff --git a/LinksAwakeningClient.py b/LinksAwakeningClient.py index 14aaa415f1..293e782f59 100644 --- a/LinksAwakeningClient.py +++ b/LinksAwakeningClient.py @@ -412,10 +412,10 @@ class LinksAwakeningClient(): status = (await self.gameboy.async_read_memory_safe(LAClientConstants.wLinkStatusBits))[0] item_id -= LABaseID - # The player name table only goes up to 100, so don't go past that + # The player name table only goes up to 101, so don't go past that # Even if it didn't, the remote player _index_ byte is just a byte, so 255 max - if from_player > 100: - from_player = 100 + if from_player > 101: + from_player = 101 next_index += 1 self.gameboy.write_memory(LAClientConstants.wLinkGiveItem, [ diff --git a/LttPAdjuster.py b/LttPAdjuster.py index 963557e8da..4816210ff5 100644 --- a/LttPAdjuster.py +++ b/LttPAdjuster.py @@ -32,6 +32,7 @@ GAME_ALTTP = "A Link to the Past" WINDOW_MIN_HEIGHT = 525 WINDOW_MIN_WIDTH = 425 + class AdjusterWorld(object): class AdjusterSubWorld(object): def __init__(self, random): @@ -40,7 +41,6 @@ class AdjusterWorld(object): def __init__(self, sprite_pool): import random self.sprite_pool = {1: sprite_pool} - self.per_slot_randoms = {1: random} self.worlds = {1: self.AdjusterSubWorld(random)} @@ -49,6 +49,7 @@ class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter): def _get_help_string(self, action): return textwrap.dedent(action.help) + # See argparse.BooleanOptionalAction class BooleanOptionalActionWithDisable(argparse.Action): def __init__(self, @@ -364,10 +365,10 @@ def run_sprite_update(): logging.info("Done updating sprites") -def update_sprites(task, on_finish=None): +def update_sprites(task, on_finish=None, repository_url: str = "https://alttpr.com/sprites"): resultmessage = "" successful = True - sprite_dir = user_path("data", "sprites", "alttpr") + sprite_dir = user_path("data", "sprites", "alttp", "remote") os.makedirs(sprite_dir, exist_ok=True) ctx = get_cert_none_ssl_context() @@ -377,11 +378,11 @@ def update_sprites(task, on_finish=None): on_finish(successful, resultmessage) try: - task.update_status("Downloading alttpr sprites list") - with urlopen('https://alttpr.com/sprites', context=ctx) as response: + task.update_status("Downloading remote sprites list") + with urlopen(repository_url, context=ctx) as response: sprites_arr = json.loads(response.read().decode("utf-8")) except Exception as e: - resultmessage = "Error getting list of alttpr sprites. Sprites not updated.\n\n%s: %s" % (type(e).__name__, e) + resultmessage = "Error getting list of remote sprites. Sprites not updated.\n\n%s: %s" % (type(e).__name__, e) successful = False task.queue_event(finished) return @@ -389,13 +390,13 @@ def update_sprites(task, on_finish=None): try: task.update_status("Determining needed sprites") current_sprites = [os.path.basename(file) for file in glob(sprite_dir + '/*')] - alttpr_sprites = [(sprite['file'], os.path.basename(urlparse(sprite['file']).path)) + remote_sprites = [(sprite['file'], os.path.basename(urlparse(sprite['file']).path)) for sprite in sprites_arr if sprite["author"] != "Nintendo"] - needed_sprites = [(sprite_url, filename) for (sprite_url, filename) in alttpr_sprites if + needed_sprites = [(sprite_url, filename) for (sprite_url, filename) in remote_sprites if filename not in current_sprites] - alttpr_filenames = [filename for (_, filename) in alttpr_sprites] - obsolete_sprites = [sprite for sprite in current_sprites if sprite not in alttpr_filenames] + remote_filenames = [filename for (_, filename) in remote_sprites] + obsolete_sprites = [sprite for sprite in current_sprites if sprite not in remote_filenames] except Exception as e: resultmessage = "Error Determining which sprites to update. Sprites not updated.\n\n%s: %s" % ( type(e).__name__, e) @@ -447,7 +448,7 @@ def update_sprites(task, on_finish=None): successful = False if successful: - resultmessage = "alttpr sprites updated successfully" + resultmessage = "Remote sprites updated successfully" task.queue_event(finished) @@ -868,7 +869,7 @@ class SpriteSelector(): def open_custom_sprite_dir(_evt): open_file(self.custom_sprite_dir) - alttpr_frametitle = Label(self.window, text='ALTTPR Sprites') + remote_frametitle = Label(self.window, text='Remote Sprites') custom_frametitle = Frame(self.window) title_text = Label(custom_frametitle, text="Custom Sprites") @@ -877,8 +878,8 @@ class SpriteSelector(): title_link.pack(side=LEFT) title_link.bind("", open_custom_sprite_dir) - self.icon_section(alttpr_frametitle, self.alttpr_sprite_dir, - 'ALTTPR sprites not found. Click "Update alttpr sprites" to download them.') + self.icon_section(remote_frametitle, self.remote_sprite_dir, + 'Remote sprites not found. Click "Update remote sprites" to download them.') self.icon_section(custom_frametitle, self.custom_sprite_dir, 'Put sprites in the custom sprites folder (see open link above) to have them appear here.') if not randomOnEvent: @@ -891,11 +892,18 @@ class SpriteSelector(): button = Button(frame, text="Browse for file...", command=self.browse_for_sprite) button.pack(side=RIGHT, padx=(5, 0)) - button = Button(frame, text="Update alttpr sprites", command=self.update_alttpr_sprites) + button = Button(frame, text="Update remote sprites", command=self.update_remote_sprites) button.pack(side=RIGHT, padx=(5, 0)) + + repository_label = Label(frame, text='Sprite Repository:') + self.repository_url = StringVar(frame, "https://alttpr.com/sprites") + repository_entry = Entry(frame, textvariable=self.repository_url) + repository_entry.pack(side=RIGHT, expand=True, fill=BOTH, pady=1) + repository_label.pack(side=RIGHT, expand=False, padx=(0, 5)) + button = Button(frame, text="Do not adjust sprite",command=self.use_default_sprite) - button.pack(side=LEFT,padx=(0,5)) + button.pack(side=LEFT, padx=(0, 5)) button = Button(frame, text="Default Link sprite", command=self.use_default_link_sprite) button.pack(side=LEFT, padx=(0, 5)) @@ -1055,7 +1063,7 @@ class SpriteSelector(): for i, button in enumerate(frame.buttons): button.grid(row=i // self.spritesPerRow, column=i % self.spritesPerRow) - def update_alttpr_sprites(self): + def update_remote_sprites(self): # need to wrap in try catch. We don't want errors getting the json or downloading the files to break us. self.window.destroy() self.parent.update() @@ -1068,7 +1076,8 @@ class SpriteSelector(): messagebox.showerror("Sprite Updater", resultmessage) SpriteSelector(self.parent, self.callback, self.adjuster) - BackgroundTaskProgress(self.parent, update_sprites, "Updating Sprites", on_finish) + BackgroundTaskProgress(self.parent, update_sprites, "Updating Sprites", + on_finish, self.repository_url.get()) def browse_for_sprite(self): sprite = filedialog.askopenfilename( @@ -1158,12 +1167,13 @@ class SpriteSelector(): os.makedirs(self.custom_sprite_dir) @property - def alttpr_sprite_dir(self): - return user_path("data", "sprites", "alttpr") + def remote_sprite_dir(self): + return user_path("data", "sprites", "alttp", "remote") @property def custom_sprite_dir(self): - return user_path("data", "sprites", "custom") + return user_path("data", "sprites", "alttp", "custom") + def get_image_for_sprite(sprite, gif_only: bool = False): if not sprite.valid: diff --git a/MMBN3Client.py b/MMBN3Client.py index 4945d49221..31c6b309b8 100644 --- a/MMBN3Client.py +++ b/MMBN3Client.py @@ -286,16 +286,14 @@ async def gba_sync_task(ctx: MMBN3Context): except ConnectionRefusedError: logger.debug("Connection Refused, Trying Again") ctx.gba_status = CONNECTION_REFUSED_STATUS + await asyncio.sleep(1) continue async def run_game(romfile): - options = Utils.get_options().get("mmbn3_options", None) - if options is None: - auto_start = True - else: - auto_start = options.get("rom_start", True) - if auto_start: + from worlds.mmbn3 import MMBN3World + auto_start = MMBN3World.settings.rom_start + if auto_start is True: import webbrowser webbrowser.open(romfile) elif os.path.isfile(auto_start): diff --git a/Main.py b/Main.py index 147fa382e2..d872a3c159 100644 --- a/Main.py +++ b/Main.py @@ -1,20 +1,21 @@ import collections +from collections.abc import Mapping import concurrent.futures import logging import os -import pickle import tempfile import time +from typing import Any import zipfile import zlib -from typing import Dict, List, Optional, Set, Tuple, Union import worlds -from BaseClasses import CollectionState, Item, Location, LocationProgressType, MultiWorld, Region +from BaseClasses import CollectionState, Item, Location, LocationProgressType, MultiWorld from Fill import FillError, balance_multiworld_progression, distribute_items_restrictive, flood_items, \ parse_planned_blocks, distribute_planned_blocks, resolve_early_locations_for_planned +from NetUtils import convert_to_base_types from Options import StartInventoryPool -from Utils import __version__, output_path, version_tuple, get_settings +from Utils import __version__, output_path, restricted_dumps, version_tuple from settings import get_settings from worlds import AutoWorld from worlds.generic.Rules import exclusion_rules, locality_rules @@ -22,7 +23,7 @@ from worlds.generic.Rules import exclusion_rules, locality_rules __all__ = ["main"] -def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = None): +def main(args, seed=None, baked_server_options: dict[str, object] | None = None): if not baked_server_options: baked_server_options = get_settings().server_options.as_dict() assert isinstance(baked_server_options, dict) @@ -36,7 +37,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No logger = logging.getLogger() multiworld.set_seed(seed, args.race, str(args.outputname) if args.outputname else None) - multiworld.plando_options = args.plando_options + multiworld.plando_options = args.plando multiworld.game = args.game.copy() multiworld.player_name = args.name.copy() multiworld.sprite = args.sprite.copy() @@ -58,7 +59,9 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No for name, cls in AutoWorld.AutoWorldRegister.world_types.items(): if not cls.hidden and len(cls.item_names) > 0: - logger.info(f" {name:{longest_name}}: Items: {len(cls.item_names):{item_count}} | " + logger.info(f" {name:{longest_name}}: " + f"v{cls.world_version.as_simple_string()} |" + f"Items: {len(cls.item_names):{item_count}} | " f"Locations: {len(cls.location_names):{location_count}}") del item_count, location_count @@ -93,6 +96,15 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No del local_early del early + # items can't be both local and non-local, prefer local + multiworld.worlds[player].options.non_local_items.value -= multiworld.worlds[player].options.local_items.value + multiworld.worlds[player].options.non_local_items.value -= set(multiworld.local_early_items[player]) + + # Clear non-applicable local and non-local items. + if multiworld.players == 1: + multiworld.worlds[1].options.non_local_items.value = set() + multiworld.worlds[1].options.local_items.value = set() + logger.info('Creating MultiWorld.') AutoWorld.call_all(multiworld, "create_regions") @@ -100,12 +112,6 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No AutoWorld.call_all(multiworld, "create_items") logger.info('Calculating Access Rules.') - - for player in multiworld.player_ids: - # items can't be both local and non-local, prefer local - multiworld.worlds[player].options.non_local_items.value -= multiworld.worlds[player].options.local_items.value - multiworld.worlds[player].options.non_local_items.value -= set(multiworld.local_early_items[player]) - AutoWorld.call_all(multiworld, "set_rules") for player in multiworld.player_ids: @@ -126,11 +132,9 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No multiworld.worlds[player].options.priority_locations.value -= world_excluded_locations # Set local and non-local item rules. + # This function is called so late because worlds might otherwise overwrite item_rules which are how locality works if multiworld.players > 1: locality_rules(multiworld) - else: - multiworld.worlds[1].options.non_local_items.value = set() - multiworld.worlds[1].options.local_items.value = set() multiworld.plando_item_blocks = parse_planned_blocks(multiworld) @@ -140,7 +144,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No # remove starting inventory from pool items. # Because some worlds don't actually create items during create_items this has to be as late as possible. fallback_inventory = StartInventoryPool({}) - depletion_pool: Dict[int, Dict[str, int]] = { + depletion_pool: dict[int, dict[str, int]] = { player: getattr(multiworld.worlds[player].options, "start_inventory_from_pool", fallback_inventory).value.copy() for player in multiworld.player_ids } @@ -149,7 +153,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No } if target_per_player: - new_itempool: List[Item] = [] + new_itempool: list[Item] = [] # Make new itempool with start_inventory_from_pool items removed for item in multiworld.itempool: @@ -174,7 +178,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No multiworld.link_items() - if any(multiworld.item_links.values()): + if any(world.options.item_links for world in multiworld.worlds.values()): multiworld._all_state = None logger.info("Running Item Plando.") @@ -233,17 +237,19 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No pool.submit(AutoWorld.call_single, multiworld, "generate_output", player, temp_dir)) # collect ER hint info - er_hint_data: Dict[int, Dict[int, str]] = {} + er_hint_data: dict[int, dict[int, str]] = {} AutoWorld.call_all(multiworld, 'extend_hint_information', er_hint_data) def write_multidata(): import NetUtils from NetUtils import HintStatus - slot_data = {} - client_versions = {} - games = {} - minimum_versions = {"server": AutoWorld.World.required_server_version, "clients": client_versions} - slot_info = {} + slot_data: dict[int, Mapping[str, Any]] = {} + client_versions: dict[int, tuple[int, int, int]] = {} + games: dict[int, str] = {} + minimum_versions: NetUtils.MinimumVersions = { + "server": AutoWorld.World.required_server_version, "clients": client_versions + } + slot_info: dict[int, NetUtils.NetworkSlot] = {} names = [[name for player, name in sorted(multiworld.player_name.items())]] for slot in multiworld.player_ids: player_world: AutoWorld.World = multiworld.worlds[slot] @@ -258,7 +264,9 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No group_members=sorted(group["players"])) precollected_items = {player: [item.code for item in world_precollected if type(item.code) == int] for player, world_precollected in multiworld.precollected_items.items()} - precollected_hints = {player: set() for player in range(1, multiworld.players + 1 + len(multiworld.groups))} + precollected_hints: dict[int, set[NetUtils.Hint]] = { + player: set() for player in range(1, multiworld.players + 1 + len(multiworld.groups)) + } for slot in multiworld.player_ids: slot_data[slot] = multiworld.worlds[slot].fill_slot_data() @@ -274,7 +282,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No for player in multiworld.groups[location.item.player]["players"]: precollected_hints[player].add(hint) - locations_data: Dict[int, Dict[int, Tuple[int, int, int]]] = {player: {} for player in multiworld.player_ids} + locations_data: dict[int, dict[int, tuple[int, int, int]]] = {player: {} for player in multiworld.player_ids} for location in multiworld.get_filled_locations(): if type(location.address) == int: assert location.item.code is not None, "item code None should be event, " \ @@ -303,19 +311,19 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No } data_package["Archipelago"] = worlds.network_data_package["games"]["Archipelago"] - checks_in_area: Dict[int, Dict[str, Union[int, List[int]]]] = {} + checks_in_area: dict[int, dict[str, int | list[int]]] = {} # get spheres -> filter address==None -> skip empty - spheres: List[Dict[int, Set[int]]] = [] + spheres: list[dict[int, set[int]]] = [] for sphere in multiworld.get_sendable_spheres(): - current_sphere: Dict[int, Set[int]] = collections.defaultdict(set) + current_sphere: dict[int, set[int]] = collections.defaultdict(set) for sphere_location in sphere: current_sphere[sphere_location.player].add(sphere_location.address) if current_sphere: spheres.append(dict(current_sphere)) - multidata = { + multidata: NetUtils.MultiData | bytes = { "slot_data": slot_data, "slot_info": slot_info, "connect_names": {name: (0, player) for player, name in multiworld.player_name.items()}, @@ -325,7 +333,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No "er_hint_data": er_hint_data, "precollected_items": precollected_items, "precollected_hints": precollected_hints, - "version": tuple(version_tuple), + "version": (version_tuple.major, version_tuple.minor, version_tuple.build), "tags": ["AP"], "minimum_versions": minimum_versions, "seed_name": multiworld.seed_name, @@ -333,9 +341,13 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No "datapackage": data_package, "race_mode": int(multiworld.is_race), } + # TODO: change to `"version": version_tuple` after getting better serialization AutoWorld.call_all(multiworld, "modify_multidata", multidata) - multidata = zlib.compress(pickle.dumps(multidata), 9) + for key in ("slot_data", "er_hint_data"): + multidata[key] = convert_to_base_types(multidata[key]) + + multidata = zlib.compress(restricted_dumps(multidata), 9) with open(os.path.join(temp_dir, f'{outfilebase}.archipelago'), 'wb') as f: f.write(bytes([3])) # version of format diff --git a/MinecraftClient.py b/MinecraftClient.py deleted file mode 100644 index 93385ec538..0000000000 --- a/MinecraftClient.py +++ /dev/null @@ -1,344 +0,0 @@ -import argparse -import json -import os -import sys -import re -import atexit -import shutil -from subprocess import Popen -from shutil import copyfile -from time import strftime -import logging - -import requests - -import Utils -from Utils import is_windows - -atexit.register(input, "Press enter to exit.") - -# 1 or more digits followed by m or g, then optional b -max_heap_re = re.compile(r"^\d+[mMgG][bB]?$") - - -def prompt_yes_no(prompt): - yes_inputs = {'yes', 'ye', 'y'} - no_inputs = {'no', 'n'} - while True: - choice = input(prompt + " [y/n] ").lower() - if choice in yes_inputs: - return True - elif choice in no_inputs: - return False - else: - print('Please respond with "y" or "n".') - - -def find_ap_randomizer_jar(forge_dir): - """Create mods folder if needed; find AP randomizer jar; return None if not found.""" - mods_dir = os.path.join(forge_dir, 'mods') - if os.path.isdir(mods_dir): - for entry in os.scandir(mods_dir): - if entry.name.startswith("aprandomizer") and entry.name.endswith(".jar"): - logging.info(f"Found AP randomizer mod: {entry.name}") - return entry.name - return None - else: - os.mkdir(mods_dir) - logging.info(f"Created mods folder in {forge_dir}") - return None - - -def replace_apmc_files(forge_dir, apmc_file): - """Create APData folder if needed; clean .apmc files from APData; copy given .apmc into directory.""" - if apmc_file is None: - return - apdata_dir = os.path.join(forge_dir, 'APData') - copy_apmc = True - if not os.path.isdir(apdata_dir): - os.mkdir(apdata_dir) - logging.info(f"Created APData folder in {forge_dir}") - for entry in os.scandir(apdata_dir): - if entry.name.endswith(".apmc") and entry.is_file(): - if not os.path.samefile(apmc_file, entry.path): - os.remove(entry.path) - logging.info(f"Removed {entry.name} in {apdata_dir}") - else: # apmc already in apdata - copy_apmc = False - if copy_apmc: - copyfile(apmc_file, os.path.join(apdata_dir, os.path.basename(apmc_file))) - logging.info(f"Copied {os.path.basename(apmc_file)} to {apdata_dir}") - - -def read_apmc_file(apmc_file): - from base64 import b64decode - - with open(apmc_file, 'r') as f: - return json.loads(b64decode(f.read())) - - -def update_mod(forge_dir, url: str): - """Check mod version, download new mod from GitHub releases page if needed. """ - ap_randomizer = find_ap_randomizer_jar(forge_dir) - os.path.basename(url) - if ap_randomizer is not None: - logging.info(f"Your current mod is {ap_randomizer}.") - else: - logging.info(f"You do not have the AP randomizer mod installed.") - - if ap_randomizer != os.path.basename(url): - logging.info(f"A new release of the Minecraft AP randomizer mod was found: " - f"{os.path.basename(url)}") - if prompt_yes_no("Would you like to update?"): - old_ap_mod = os.path.join(forge_dir, 'mods', ap_randomizer) if ap_randomizer is not None else None - new_ap_mod = os.path.join(forge_dir, 'mods', os.path.basename(url)) - logging.info("Downloading AP randomizer mod. This may take a moment...") - apmod_resp = requests.get(url) - if apmod_resp.status_code == 200: - with open(new_ap_mod, 'wb') as f: - f.write(apmod_resp.content) - logging.info(f"Wrote new mod file to {new_ap_mod}") - if old_ap_mod is not None: - os.remove(old_ap_mod) - logging.info(f"Removed old mod file from {old_ap_mod}") - else: - logging.error(f"Error retrieving the randomizer mod (status code {apmod_resp.status_code}).") - logging.error(f"Please report this issue on the Archipelago Discord server.") - sys.exit(1) - - -def check_eula(forge_dir): - """Check if the EULA is agreed to, and prompt the user to read and agree if necessary.""" - eula_path = os.path.join(forge_dir, "eula.txt") - if not os.path.isfile(eula_path): - # Create eula.txt - with open(eula_path, 'w') as f: - f.write("#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).\n") - f.write(f"#{strftime('%a %b %d %X %Z %Y')}\n") - f.write("eula=false\n") - with open(eula_path, 'r+') as f: - text = f.read() - if 'false' in text: - # Prompt user to agree to the EULA - logging.info("You need to agree to the Minecraft EULA in order to run the server.") - logging.info("The EULA can be found at https://account.mojang.com/documents/minecraft_eula") - if prompt_yes_no("Do you agree to the EULA?"): - f.seek(0) - f.write(text.replace('false', 'true')) - f.truncate() - logging.info(f"Set {eula_path} to true") - else: - sys.exit(0) - - -def find_jdk_dir(version: str) -> str: - """get the specified versions jdk directory""" - for entry in os.listdir(): - if os.path.isdir(entry) and entry.startswith(f"jdk{version}"): - return os.path.abspath(entry) - - -def find_jdk(version: str) -> str: - """get the java exe location""" - - if is_windows: - jdk = find_jdk_dir(version) - jdk_exe = os.path.join(jdk, "bin", "java.exe") - if os.path.isfile(jdk_exe): - return jdk_exe - else: - jdk_exe = shutil.which(options["minecraft_options"].get("java", "java")) - if not jdk_exe: - raise Exception("Could not find Java. Is Java installed on the system?") - return jdk_exe - - -def download_java(java: str): - """Download Corretto (Amazon JDK)""" - - jdk = find_jdk_dir(java) - if jdk is not None: - print(f"Removing old JDK...") - from shutil import rmtree - rmtree(jdk) - - print(f"Downloading Java...") - jdk_url = f"https://corretto.aws/downloads/latest/amazon-corretto-{java}-x64-windows-jdk.zip" - resp = requests.get(jdk_url) - if resp.status_code == 200: # OK - print(f"Extracting...") - import zipfile - from io import BytesIO - with zipfile.ZipFile(BytesIO(resp.content)) as zf: - zf.extractall() - else: - print(f"Error downloading Java (status code {resp.status_code}).") - print(f"If this was not expected, please report this issue on the Archipelago Discord server.") - if not prompt_yes_no("Continue anyways?"): - sys.exit(0) - - -def install_forge(directory: str, forge_version: str, java_version: str): - """download and install forge""" - - java_exe = find_jdk(java_version) - if java_exe is not None: - print(f"Downloading Forge {forge_version}...") - forge_url = f"https://maven.minecraftforge.net/net/minecraftforge/forge/{forge_version}/forge-{forge_version}-installer.jar" - resp = requests.get(forge_url) - if resp.status_code == 200: # OK - forge_install_jar = os.path.join(directory, "forge_install.jar") - if not os.path.exists(directory): - os.mkdir(directory) - with open(forge_install_jar, 'wb') as f: - f.write(resp.content) - print(f"Installing Forge...") - install_process = Popen([java_exe, "-jar", forge_install_jar, "--installServer", directory]) - install_process.wait() - os.remove(forge_install_jar) - - -def run_forge_server(forge_dir: str, java_version: str, heap_arg: str) -> Popen: - """Run the Forge server.""" - - java_exe = find_jdk(java_version) - if not os.path.isfile(java_exe): - java_exe = "java" # try to fall back on java in the PATH - - heap_arg = max_heap_re.match(heap_arg).group() - if heap_arg[-1] in ['b', 'B']: - heap_arg = heap_arg[:-1] - heap_arg = "-Xmx" + heap_arg - - os_args = "win_args.txt" if is_windows else "unix_args.txt" - args_file = os.path.join(forge_dir, "libraries", "net", "minecraftforge", "forge", forge_version, os_args) - forge_args = [] - with open(args_file) as argfile: - for line in argfile: - forge_args.extend(line.strip().split(" ")) - - args = [java_exe, heap_arg, *forge_args, "-nogui"] - logging.info(f"Running Forge server: {args}") - os.chdir(forge_dir) - return Popen(args) - - -def get_minecraft_versions(version, release_channel="release"): - version_file_endpoint = "https://raw.githubusercontent.com/KonoTyran/Minecraft_AP_Randomizer/master/versions/minecraft_versions.json" - resp = requests.get(version_file_endpoint) - local = False - if resp.status_code == 200: # OK - try: - data = resp.json() - except requests.exceptions.JSONDecodeError: - logging.warning(f"Unable to fetch version update file, using local version. (status code {resp.status_code}).") - local = True - else: - logging.warning(f"Unable to fetch version update file, using local version. (status code {resp.status_code}).") - local = True - - if local: - with open(Utils.user_path("minecraft_versions.json"), 'r') as f: - data = json.load(f) - else: - with open(Utils.user_path("minecraft_versions.json"), 'w') as f: - json.dump(data, f) - - try: - if version: - return next(filter(lambda entry: entry["version"] == version, data[release_channel])) - else: - return resp.json()[release_channel][0] - except (StopIteration, KeyError): - logging.error(f"No compatible mod version found for client version {version} on \"{release_channel}\" channel.") - if release_channel != "release": - logging.error("Consider switching \"release_channel\" to \"release\" in your Host.yaml file") - else: - logging.error("No suitable mod found on the \"release\" channel. Please Contact us on discord to report this error.") - sys.exit(0) - - -def is_correct_forge(forge_dir) -> bool: - if os.path.isdir(os.path.join(forge_dir, "libraries", "net", "minecraftforge", "forge", forge_version)): - return True - return False - - -if __name__ == '__main__': - Utils.init_logging("MinecraftClient") - parser = argparse.ArgumentParser() - parser.add_argument("apmc_file", default=None, nargs='?', help="Path to an Archipelago Minecraft data file (.apmc)") - parser.add_argument('--install', '-i', dest='install', default=False, action='store_true', - help="Download and install Java and the Forge server. Does not launch the client afterwards.") - parser.add_argument('--release_channel', '-r', dest="channel", type=str, action='store', - help="Specify release channel to use.") - parser.add_argument('--java', '-j', metavar='17', dest='java', type=str, default=False, action='store', - help="specify java version.") - parser.add_argument('--forge', '-f', metavar='1.18.2-40.1.0', dest='forge', type=str, default=False, action='store', - help="specify forge version. (Minecraft Version-Forge Version)") - parser.add_argument('--version', '-v', metavar='9', dest='data_version', type=int, action='store', - help="specify Mod data version to download.") - - args = parser.parse_args() - apmc_file = os.path.abspath(args.apmc_file) if args.apmc_file else None - - # Change to executable's working directory - os.chdir(os.path.abspath(os.path.dirname(sys.argv[0]))) - - options = Utils.get_options() - channel = args.channel or options["minecraft_options"]["release_channel"] - apmc_data = None - data_version = args.data_version or None - - if apmc_file is None and not args.install: - apmc_file = Utils.open_filename('Select APMC file', (('APMC File', ('.apmc',)),)) - - if apmc_file is not None and data_version is None: - apmc_data = read_apmc_file(apmc_file) - data_version = apmc_data.get('client_version', '') - - versions = get_minecraft_versions(data_version, channel) - - forge_dir = options["minecraft_options"]["forge_directory"] - max_heap = options["minecraft_options"]["max_heap_size"] - forge_version = args.forge or versions["forge"] - java_version = args.java or versions["java"] - mod_url = versions["url"] - java_dir = find_jdk_dir(java_version) - - if args.install: - if is_windows: - print("Installing Java") - download_java(java_version) - if not is_correct_forge(forge_dir): - print("Installing Minecraft Forge") - install_forge(forge_dir, forge_version, java_version) - else: - print("Correct Forge version already found, skipping install.") - sys.exit(0) - - if apmc_data is None: - raise FileNotFoundError(f"APMC file does not exist or is inaccessible at the given location ({apmc_file})") - - if is_windows: - if java_dir is None or not os.path.isdir(java_dir): - if prompt_yes_no("Did not find java directory. Download and install java now?"): - download_java(java_version) - java_dir = find_jdk_dir(java_version) - if java_dir is None or not os.path.isdir(java_dir): - raise NotADirectoryError(f"Path {java_dir} does not exist or could not be accessed.") - - if not is_correct_forge(forge_dir): - if prompt_yes_no(f"Did not find forge version {forge_version} download and install it now?"): - install_forge(forge_dir, forge_version, java_version) - if not os.path.isdir(forge_dir): - raise NotADirectoryError(f"Path {forge_dir} does not exist or could not be accessed.") - - if not max_heap_re.match(max_heap): - raise Exception(f"Max heap size {max_heap} in incorrect format. Use a number followed by M or G, e.g. 512M or 2G.") - - update_mod(forge_dir, mod_url) - replace_apmc_files(forge_dir, apmc_file) - check_eula(forge_dir) - server_process = run_forge_server(forge_dir, java_version, max_heap) - server_process.wait() diff --git a/ModuleUpdate.py b/ModuleUpdate.py index 04cf25ea55..db42f8e5ab 100644 --- a/ModuleUpdate.py +++ b/ModuleUpdate.py @@ -5,18 +5,22 @@ import multiprocessing import warnings -if sys.platform in ("win32", "darwin") and sys.version_info < (3, 10, 11): +if sys.platform in ("win32", "darwin") and sys.version_info < (3, 11, 9): # Official micro version updates. This should match the number in docs/running from source.md. - raise RuntimeError(f"Incompatible Python Version found: {sys.version_info}. Official 3.10.15+ is supported.") -elif sys.platform in ("win32", "darwin") and sys.version_info < (3, 10, 15): + raise RuntimeError(f"Incompatible Python Version found: {sys.version_info}. Official 3.11.9+ is supported.") +elif sys.platform in ("win32", "darwin") and sys.version_info < (3, 11, 13): # There are known security issues, but no easy way to install fixed versions on Windows for testing. warnings.warn(f"Python Version {sys.version_info} has security issues. Don't use in production.") -elif sys.version_info < (3, 10, 1): +elif sys.version_info < (3, 11, 0): # Other platforms may get security backports instead of micro updates, so the number is unreliable. - raise RuntimeError(f"Incompatible Python Version found: {sys.version_info}. 3.10.1+ is supported.") + raise RuntimeError(f"Incompatible Python Version found: {sys.version_info}. 3.11.0+ is supported.") # don't run update if environment is frozen/compiled or if not the parent process (skip in subprocess) -_skip_update = bool(getattr(sys, "frozen", False) or multiprocessing.parent_process()) +_skip_update = bool( + getattr(sys, "frozen", False) or + multiprocessing.parent_process() or + os.environ.get("SKIP_REQUIREMENTS_UPDATE", "").lower() in ("1", "true", "yes") +) update_ran = _skip_update @@ -70,11 +74,11 @@ def update_command(): def install_pkg_resources(yes=False): try: import pkg_resources # noqa: F401 - except ImportError: + except (AttributeError, ImportError): check_pip() if not yes: confirm("pkg_resources not found, press enter to install it") - subprocess.call([sys.executable, "-m", "pip", "install", "--upgrade", "setuptools"]) + subprocess.call([sys.executable, "-m", "pip", "install", "--upgrade", "setuptools>=75,<81"]) def update(yes: bool = False, force: bool = False) -> None: diff --git a/MultiServer.py b/MultiServer.py index 9bcf8f6f4c..23aab7b58b 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -43,7 +43,7 @@ import NetUtils import Utils from Utils import version_tuple, restricted_loads, Version, async_start, get_intended_text from NetUtils import Endpoint, ClientStatus, NetworkItem, decode, encode, NetworkPlayer, Permission, NetworkSlot, \ - SlotType, LocationStore, Hint, HintStatus + SlotType, LocationStore, MultiData, Hint, HintStatus from BaseClasses import ItemClassification @@ -445,7 +445,7 @@ class Context: raise Utils.VersionException("Incompatible multidata.") return restricted_loads(zlib.decompress(data[1:])) - def _load(self, decoded_obj: dict, game_data_packages: typing.Dict[str, typing.Any], + def _load(self, decoded_obj: MultiData, game_data_packages: typing.Dict[str, typing.Any], use_embedded_server_options: bool): self.read_data = {} @@ -458,8 +458,12 @@ class Context: self.generator_version = Version(*decoded_obj["version"]) clients_ver = decoded_obj["minimum_versions"].get("clients", {}) self.minimum_client_versions = {} + if self.generator_version < Version(0, 6, 2): + min_version = Version(0, 1, 6) + else: + min_version = min_client_version for player, version in clients_ver.items(): - self.minimum_client_versions[player] = max(Version(*version), min_client_version) + self.minimum_client_versions[player] = max(Version(*version), min_version) self.slot_info = decoded_obj["slot_info"] self.games = {slot: slot_info.game for slot, slot_info in self.slot_info.items()} @@ -542,6 +546,7 @@ class Context: def _save(self, exit_save: bool = False) -> bool: try: + # Does not use Utils.restricted_dumps because we'd rather make a save than not make one encoded_save = pickle.dumps(self.get_save()) with open(self.save_filename, "wb") as f: f.write(zlib.compress(encoded_save)) @@ -748,7 +753,7 @@ class Context: return self.player_names[team, slot] def notify_hints(self, team: int, hints: typing.List[Hint], only_new: bool = False, - recipients: typing.Sequence[int] = None): + persist_even_if_found: bool = False, recipients: typing.Sequence[int] = None): """Send and remember hints.""" if only_new: hints = [hint for hint in hints if hint not in self.hints[team, hint.finding_player]] @@ -763,8 +768,9 @@ class Context: if not hint.local and data not in concerns[hint.finding_player]: concerns[hint.finding_player].append(data) - # only remember hints that were not already found at the time of creation - if not hint.found: + # For !hint use cases, only hints that were not already found at the time of creation should be remembered + # For LocationScouts use-cases, all hints should be remembered + if not hint.found or persist_even_if_found: # since hints are bidirectional, finding player and receiving player, # we can check once if hint already exists if hint not in self.hints[team, hint.finding_player]: @@ -1129,8 +1135,13 @@ def register_location_checks(ctx: Context, team: int, slot: int, locations: typi ctx.save() -def collect_hints(ctx: Context, team: int, slot: int, item: typing.Union[int, str], auto_status: HintStatus) \ - -> typing.List[Hint]: +def collect_hints(ctx: Context, team: int, slot: int, item: typing.Union[int, str], + status: HintStatus | None = None) -> typing.List[Hint]: + """ + Collect a new hint for a given item id or name, with a given status. + If status is None (which is the default value), an automatic status will be determined from the item's quality. + """ + hints = [] slots: typing.Set[int] = {slot} for group_id, group in ctx.groups.items(): @@ -1146,25 +1157,38 @@ def collect_hints(ctx: Context, team: int, slot: int, item: typing.Union[int, st else: found = location_id in ctx.location_checks[team, finding_player] entrance = ctx.er_hint_data.get(finding_player, {}).get(location_id, "") - new_status = auto_status + if found: - new_status = HintStatus.HINT_FOUND - elif item_flags & ItemClassification.trap: - new_status = HintStatus.HINT_AVOID - hints.append(Hint(receiving_player, finding_player, location_id, item_id, found, entrance, - item_flags, new_status)) + status = HintStatus.HINT_FOUND + elif status is None: + if item_flags & ItemClassification.trap: + status = HintStatus.HINT_AVOID + else: + status = HintStatus.HINT_PRIORITY + + hints.append( + Hint(receiving_player, finding_player, location_id, item_id, found, entrance, item_flags, status) + ) return hints -def collect_hint_location_name(ctx: Context, team: int, slot: int, location: str, auto_status: HintStatus) \ - -> typing.List[Hint]: +def collect_hint_location_name(ctx: Context, team: int, slot: int, location: str, + status: HintStatus | None = HintStatus.HINT_UNSPECIFIED) -> typing.List[Hint]: + """ + Collect a new hint for a given location name, with a given status (defaults to "unspecified"). + If None is passed for the status, then an automatic status will be determined from the item's quality. + """ seeked_location: int = ctx.location_names_for_game(ctx.games[slot])[location] - return collect_hint_location_id(ctx, team, slot, seeked_location, auto_status) + return collect_hint_location_id(ctx, team, slot, seeked_location, status) -def collect_hint_location_id(ctx: Context, team: int, slot: int, seeked_location: int, auto_status: HintStatus) \ - -> typing.List[Hint]: +def collect_hint_location_id(ctx: Context, team: int, slot: int, seeked_location: int, + status: HintStatus | None = HintStatus.HINT_UNSPECIFIED) -> typing.List[Hint]: + """ + Collect a new hint for a given location id, with a given status (defaults to "unspecified"). + If None is passed for the status, then an automatic status will be determined from the item's quality. + """ prev_hint = ctx.get_hint(team, slot, seeked_location) if prev_hint: return [prev_hint] @@ -1174,13 +1198,16 @@ def collect_hint_location_id(ctx: Context, team: int, slot: int, seeked_location found = seeked_location in ctx.location_checks[team, slot] entrance = ctx.er_hint_data.get(slot, {}).get(seeked_location, "") - new_status = auto_status + if found: - new_status = HintStatus.HINT_FOUND - elif item_flags & ItemClassification.trap: - new_status = HintStatus.HINT_AVOID - return [Hint(receiving_player, slot, seeked_location, item_id, found, entrance, item_flags, - new_status)] + status = HintStatus.HINT_FOUND + elif status is None: + if item_flags & ItemClassification.trap: + status = HintStatus.HINT_AVOID + else: + status = HintStatus.HINT_PRIORITY + + return [Hint(receiving_player, slot, seeked_location, item_id, found, entrance, item_flags, status)] return [] @@ -1294,7 +1321,8 @@ class CommandProcessor(metaclass=CommandMeta): argname += "=" + parameter.default argtext += argname argtext += " " - s += f"{self.marker}{command} {argtext}\n {method.__doc__}\n" + doctext = '\n '.join(inspect.getdoc(method).split('\n')) + s += f"{self.marker}{command} {argtext}\n {doctext}\n" return s def _cmd_help(self): @@ -1323,19 +1351,6 @@ class CommandProcessor(metaclass=CommandMeta): class CommonCommandProcessor(CommandProcessor): ctx: Context - def _cmd_countdown(self, seconds: str = "10") -> bool: - """Start a countdown in seconds""" - try: - timer = int(seconds, 10) - except ValueError: - timer = 10 - else: - if timer > 60 * 60: - raise ValueError(f"{timer} is invalid. Maximum is 1 hour.") - - async_start(countdown(self.ctx, timer)) - return True - def _cmd_options(self): """List all current options. Warning: lists password.""" self.output("Current options:") @@ -1604,7 +1619,6 @@ class ClientMessageProcessor(CommonCommandProcessor): def get_hints(self, input_text: str, for_location: bool = False) -> bool: points_available = get_client_points(self.ctx, self.client) cost = self.ctx.get_hint_cost(self.client.slot) - auto_status = HintStatus.HINT_UNSPECIFIED if for_location else HintStatus.HINT_PRIORITY if not input_text: hints = {hint.re_check(self.ctx, self.client.team) for hint in self.ctx.hints[self.client.team, self.client.slot]} @@ -1630,9 +1644,9 @@ class ClientMessageProcessor(CommonCommandProcessor): self.output(f"Sorry, \"{hint_name}\" is marked as non-hintable.") hints = [] elif not for_location: - hints = collect_hints(self.ctx, self.client.team, self.client.slot, hint_id, auto_status) + hints = collect_hints(self.ctx, self.client.team, self.client.slot, hint_id) else: - hints = collect_hint_location_id(self.ctx, self.client.team, self.client.slot, hint_id, auto_status) + hints = collect_hint_location_id(self.ctx, self.client.team, self.client.slot, hint_id) else: game = self.ctx.games[self.client.slot] @@ -1652,16 +1666,18 @@ class ClientMessageProcessor(CommonCommandProcessor): hints = [] for item_name in self.ctx.item_name_groups[game][hint_name]: if item_name in self.ctx.item_names_for_game(game): # ensure item has an ID - hints.extend(collect_hints(self.ctx, self.client.team, self.client.slot, item_name, auto_status)) + hints.extend(collect_hints(self.ctx, self.client.team, self.client.slot, item_name)) elif not for_location and hint_name in self.ctx.item_names_for_game(game): # item name - hints = collect_hints(self.ctx, self.client.team, self.client.slot, hint_name, auto_status) + hints = collect_hints(self.ctx, self.client.team, self.client.slot, hint_name) elif hint_name in self.ctx.location_name_groups[game]: # location group name hints = [] for loc_name in self.ctx.location_name_groups[game][hint_name]: if loc_name in self.ctx.location_names_for_game(game): - hints.extend(collect_hint_location_name(self.ctx, self.client.team, self.client.slot, loc_name, auto_status)) + hints.extend( + collect_hint_location_name(self.ctx, self.client.team, self.client.slot, loc_name) + ) else: # location name - hints = collect_hint_location_name(self.ctx, self.client.team, self.client.slot, hint_name, auto_status) + hints = collect_hint_location_name(self.ctx, self.client.team, self.client.slot, hint_name) else: self.output(response) @@ -1939,13 +1955,64 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict): target_item, target_player, flags = ctx.locations[client.slot][location] if create_as_hint: - hints.extend(collect_hint_location_id(ctx, client.team, client.slot, location, - HintStatus.HINT_UNSPECIFIED)) + hints.extend(collect_hint_location_id(ctx, client.team, client.slot, location)) locs.append(NetworkItem(target_item, location, target_player, flags)) - ctx.notify_hints(client.team, hints, only_new=create_as_hint == 2) + ctx.notify_hints(client.team, hints, only_new=create_as_hint == 2, persist_even_if_found=True) if locs and create_as_hint: ctx.save() await ctx.send_msgs(client, [{'cmd': 'LocationInfo', 'locations': locs}]) + + elif cmd == 'CreateHints': + location_player = args.get("player", client.slot) + locations = args["locations"] + status = args.get("status", HintStatus.HINT_UNSPECIFIED) + + if not locations: + await ctx.send_msgs(client, [{"cmd": "InvalidPacket", "type": "arguments", + "text": "CreateHints: No locations specified.", "original_cmd": cmd}]) + return + + try: + status = HintStatus(status) + except ValueError as err: + await ctx.send_msgs(client, + [{"cmd": "InvalidPacket", "type": "arguments", + "text": f"Unknown Status: {err}", + "original_cmd": cmd}]) + return + + hints = [] + + for location in locations: + if location_player != client.slot and location not in ctx.locations[location_player]: + error_text = ( + "CreateHints: One or more of the locations do not exist for the specified off-world player. " + "Please refrain from hinting other slot's locations that you don't know contain your items." + ) + await ctx.send_msgs(client, [{"cmd": "InvalidPacket", "type": "arguments", + "text": error_text, "original_cmd": cmd}]) + return + + target_item, item_player, flags = ctx.locations[location_player][location] + + if client.slot not in ctx.slot_set(item_player): + if status != HintStatus.HINT_UNSPECIFIED: + error_text = 'CreateHints: Must use "unspecified"/None status for items from other players.' + await ctx.send_msgs(client, [{"cmd": "InvalidPacket", "type": "arguments", + "text": error_text, "original_cmd": cmd}]) + return + + if client.slot != location_player: + error_text = "CreateHints: Can only create hints for own items or own locations." + await ctx.send_msgs(client, [{"cmd": "InvalidPacket", "type": "arguments", + "text": error_text, "original_cmd": cmd}]) + return + + hints += collect_hint_location_id(ctx, client.team, location_player, location, status) + + # As of writing this code, only_new=True does not update status for existing hints + ctx.notify_hints(client.team, hints, only_new=True, persist_even_if_found=True) + ctx.save() elif cmd == 'UpdateHint': location = args["location"] @@ -2180,6 +2247,19 @@ class ServerCommandProcessor(CommonCommandProcessor): self.output(f"Could not find player {player_name} to collect") return False + def _cmd_countdown(self, seconds: str = "10") -> bool: + """Start a countdown in seconds""" + try: + timer = int(seconds, 10) + except ValueError: + timer = 10 + else: + if timer > 60 * 60: + raise ValueError(f"{timer} is invalid. Maximum is 1 hour.") + + async_start(countdown(self.ctx, timer)) + return True + @mark_raw def _cmd_release(self, player_name: str) -> bool: """Send out the remaining items from a player to their intended recipients.""" @@ -2301,9 +2381,9 @@ class ServerCommandProcessor(CommonCommandProcessor): hints = [] for item_name_from_group in self.ctx.item_name_groups[game][item]: if item_name_from_group in self.ctx.item_names_for_game(game): # ensure item has an ID - hints.extend(collect_hints(self.ctx, team, slot, item_name_from_group, HintStatus.HINT_PRIORITY)) + hints.extend(collect_hints(self.ctx, team, slot, item_name_from_group)) else: # item name or id - hints = collect_hints(self.ctx, team, slot, item, HintStatus.HINT_PRIORITY) + hints = collect_hints(self.ctx, team, slot, item) if hints: self.ctx.notify_hints(team, hints) @@ -2337,17 +2417,14 @@ class ServerCommandProcessor(CommonCommandProcessor): if usable: if isinstance(location, int): - hints = collect_hint_location_id(self.ctx, team, slot, location, - HintStatus.HINT_UNSPECIFIED) + hints = collect_hint_location_id(self.ctx, team, slot, location) elif game in self.ctx.location_name_groups and location in self.ctx.location_name_groups[game]: hints = [] for loc_name_from_group in self.ctx.location_name_groups[game][location]: if loc_name_from_group in self.ctx.location_names_for_game(game): - hints.extend(collect_hint_location_name(self.ctx, team, slot, loc_name_from_group, - HintStatus.HINT_UNSPECIFIED)) + hints.extend(collect_hint_location_name(self.ctx, team, slot, loc_name_from_group)) else: - hints = collect_hint_location_name(self.ctx, team, slot, location, - HintStatus.HINT_UNSPECIFIED) + hints = collect_hint_location_name(self.ctx, team, slot, location) if hints: self.ctx.notify_hints(team, hints) else: diff --git a/NetUtils.py b/NetUtils.py index f2ae2a63a0..45279183f6 100644 --- a/NetUtils.py +++ b/NetUtils.py @@ -1,5 +1,6 @@ from __future__ import annotations +from collections.abc import Mapping, Sequence import typing import enum import warnings @@ -83,7 +84,7 @@ class NetworkSlot(typing.NamedTuple): name: str game: str type: SlotType - group_members: typing.Union[typing.List[int], typing.Tuple] = () # only populated if type == group + group_members: Sequence[int] = () # only populated if type == group class NetworkItem(typing.NamedTuple): @@ -106,6 +107,27 @@ def _scan_for_TypedTuples(obj: typing.Any) -> typing.Any: return obj +_base_types = str | int | bool | float | None | tuple["_base_types", ...] | dict["_base_types", "base_types"] + + +def convert_to_base_types(obj: typing.Any) -> _base_types: + if isinstance(obj, (tuple, list, set, frozenset)): + return tuple(convert_to_base_types(o) for o in obj) + elif isinstance(obj, dict): + return {convert_to_base_types(key): convert_to_base_types(value) for key, value in obj.items()} + elif obj is None or type(obj) in (str, int, float, bool): + return obj + # unwrap simple types to their base, such as StrEnum + elif isinstance(obj, str): + return str(obj) + elif isinstance(obj, int): + return int(obj) + elif isinstance(obj, float): + return float(obj) + else: + raise Exception(f"Cannot handle {type(obj)}") + + _encode = JSONEncoder( ensure_ascii=False, check_circular=False, @@ -450,6 +472,42 @@ class _LocationStore(dict, typing.MutableMapping[int, typing.Dict[int, typing.Tu location_id not in checked]) +class MinimumVersions(typing.TypedDict): + server: tuple[int, int, int] + clients: dict[int, tuple[int, int, int]] + + +class GamesPackage(typing.TypedDict, total=False): + item_name_groups: dict[str, list[str]] + item_name_to_id: dict[str, int] + location_name_groups: dict[str, list[str]] + location_name_to_id: dict[str, int] + checksum: str + + +class DataPackage(typing.TypedDict): + games: dict[str, GamesPackage] + + +class MultiData(typing.TypedDict): + slot_data: dict[int, Mapping[str, typing.Any]] + slot_info: dict[int, NetworkSlot] + connect_names: dict[str, tuple[int, int]] + locations: dict[int, dict[int, tuple[int, int, int]]] + checks_in_area: dict[int, dict[str, int | list[int]]] + server_options: dict[str, object] + er_hint_data: dict[int, dict[int, str]] + precollected_items: dict[int, list[int]] + precollected_hints: dict[int, set[Hint]] + version: tuple[int, int, int] + tags: list[str] + minimum_versions: MinimumVersions + seed_name: str + spheres: list[dict[int, set[int]]] + datapackage: dict[str, GamesPackage] + race_mode: int + + if typing.TYPE_CHECKING: # type-check with pure python implementation until we have a typing stub LocationStore = _LocationStore else: diff --git a/OoTClient.py b/OoTClient.py index 6a87b9e722..2b0c7e4966 100644 --- a/OoTClient.py +++ b/OoTClient.py @@ -12,6 +12,7 @@ from CommonClient import CommonContext, server_loop, gui_enabled, \ import Utils from Utils import async_start from worlds import network_data_package +from worlds.oot import OOTWorld from worlds.oot.Rom import Rom, compress_rom_file from worlds.oot.N64Patch import apply_patch_file from worlds.oot.Utils import data_path @@ -276,11 +277,12 @@ async def n64_sync_task(ctx: OoTContext): except ConnectionRefusedError: logger.debug("Connection Refused, Trying Again") ctx.n64_status = CONNECTION_REFUSED_STATUS + await asyncio.sleep(1) continue async def run_game(romfile): - auto_start = Utils.get_options()["oot_options"].get("rom_start", True) + auto_start = OOTWorld.settings.rom_start if auto_start is True: import webbrowser webbrowser.open(romfile) @@ -295,7 +297,7 @@ async def patch_and_run_game(apz5_file): decomp_path = base_name + '-decomp.z64' comp_path = base_name + '.z64' # Load vanilla ROM, patch file, compress ROM - rom_file_name = Utils.get_options()["oot_options"]["rom_file"] + rom_file_name = OOTWorld.settings.rom_file rom = Rom(rom_file_name) sub_file = None diff --git a/Options.py b/Options.py index 86e58ca64a..282f757616 100644 --- a/Options.py +++ b/Options.py @@ -494,6 +494,30 @@ class Choice(NumericOption): else: raise TypeError(f"Can't compare {self.__class__.__name__} with {other.__class__.__name__}") + def __lt__(self, other: typing.Union[Choice, int, str]): + if isinstance(other, str): + assert other in self.options, f"compared against an unknown string. {self} < {other}" + other = self.options[other] + return super(Choice, self).__lt__(other) + + def __gt__(self, other: typing.Union[Choice, int, str]): + if isinstance(other, str): + assert other in self.options, f"compared against an unknown string. {self} > {other}" + other = self.options[other] + return super(Choice, self).__gt__(other) + + def __le__(self, other: typing.Union[Choice, int, str]): + if isinstance(other, str): + assert other in self.options, f"compared against an unknown string. {self} <= {other}" + other = self.options[other] + return super(Choice, self).__le__(other) + + def __ge__(self, other: typing.Union[Choice, int, str]): + if isinstance(other, str): + assert other in self.options, f"compared against an unknown string. {self} >= {other}" + other = self.options[other] + return super(Choice, self).__ge__(other) + __hash__ = Option.__hash__ # see https://docs.python.org/3/reference/datamodel.html#object.__hash__ @@ -865,13 +889,13 @@ class OptionDict(Option[typing.Dict[str, typing.Any]], VerifyKeys, typing.Mappin return ", ".join(f"{key}: {v}" for key, v in value.items()) def __getitem__(self, item: str) -> typing.Any: - return self.value.__getitem__(item) + return self.value[item] def __iter__(self) -> typing.Iterator[str]: - return self.value.__iter__() + return iter(self.value) def __len__(self) -> int: - return self.value.__len__() + return len(self.value) # __getitem__ fallback fails for Counters, so we define this explicitly def __contains__(self, item) -> bool: @@ -1067,10 +1091,10 @@ class PlandoTexts(Option[typing.List[PlandoText]], VerifyKeys): yield from self.value def __getitem__(self, index: typing.SupportsIndex) -> PlandoText: - return self.value.__getitem__(index) + return self.value[index] def __len__(self) -> int: - return self.value.__len__() + return len(self.value) class ConnectionsMeta(AssembleOptions): @@ -1094,7 +1118,7 @@ class PlandoConnection(typing.NamedTuple): entrance: str exit: str - direction: typing.Literal["entrance", "exit", "both"] # TODO: convert Direction to StrEnum once 3.8 is dropped + direction: typing.Literal["entrance", "exit", "both"] # TODO: convert Direction to StrEnum once 3.10 is dropped percentage: int = 100 @@ -1217,7 +1241,7 @@ class PlandoConnections(Option[typing.List[PlandoConnection]], metaclass=Connect connection.exit) for connection in value]) def __getitem__(self, index: typing.SupportsIndex) -> PlandoConnection: - return self.value.__getitem__(index) + return self.value[index] def __iter__(self) -> typing.Iterator[PlandoConnection]: yield from self.value @@ -1315,6 +1339,7 @@ class CommonOptions(metaclass=OptionsMetaProperty): will be returned as a sorted list. """ assert option_names, "options.as_dict() was used without any option names." + assert len(option_names) < len(self.__class__.type_hints), "Specify only options you need." option_results = {} for option_name in option_names: if option_name not in type(self).type_hints: @@ -1421,6 +1446,7 @@ class ItemLinks(OptionList): Optional("local_items"): [And(str, len)], Optional("non_local_items"): [And(str, len)], Optional("link_replacement"): Or(None, bool), + Optional("skip_if_solo"): Or(None, bool), } ]) @@ -1524,9 +1550,11 @@ class PlandoItems(Option[typing.List[PlandoItem]]): f"dictionary, not {type(items)}") locations = item.get("locations", []) if not locations: - locations = item.get("location", ["Everywhere"]) + locations = item.get("location", []) if locations: count = 1 + else: + locations = ["Everywhere"] if isinstance(locations, str): locations = [locations] if not isinstance(locations, list): @@ -1641,7 +1669,7 @@ class OptionGroup(typing.NamedTuple): item_and_loc_options = [LocalItems, NonLocalItems, StartInventory, StartInventoryPool, StartHints, - StartLocationHints, ExcludeLocations, PriorityLocations, ItemLinks] + StartLocationHints, ExcludeLocations, PriorityLocations, ItemLinks, PlandoItems] """ Options that are always populated in "Item & Location Options" Option Group. Cannot be moved to another group. If desired, a custom "Item & Location Options" Option Group can be defined, but only for adding additional options to @@ -1676,12 +1704,13 @@ def get_option_groups(world: typing.Type[World], visibility_level: Visibility = def generate_yaml_templates(target_folder: typing.Union[str, "pathlib.Path"], generate_hidden: bool = True) -> None: import os + from inspect import cleandoc import yaml from jinja2 import Template from worlds import AutoWorldRegister - from Utils import local_path, __version__ + from Utils import local_path, __version__, tuplize_version full_path: str @@ -1714,18 +1743,23 @@ def generate_yaml_templates(target_folder: typing.Union[str, "pathlib.Path"], ge # yaml dump may add end of document marker and newlines. return yaml.dump(scalar).replace("...\n", "").strip() + with open(local_path("data", "options.yaml")) as f: + file_data = f.read() + template = Template(file_data) + for game_name, world in AutoWorldRegister.world_types.items(): if not world.hidden or generate_hidden: option_groups = get_option_groups(world) - with open(local_path("data", "options.yaml")) as f: - file_data = f.read() - res = Template(file_data).render( - option_groups=option_groups, - __version__=__version__, game=game_name, yaml_dump=yaml_dump_scalar, - dictify_range=dictify_range, - ) - del file_data + res = template.render( + option_groups=option_groups, + __version__=__version__, + game=game_name, + world_version=world.world_version.as_simple_string(), + yaml_dump=yaml_dump_scalar, + dictify_range=dictify_range, + cleandoc=cleandoc, + ) with open(os.path.join(target_folder, get_file_safe_name(game_name) + ".yaml"), "w", encoding="utf-8-sig") as f: f.write(res) diff --git a/README.md b/README.md index c1e89bac7c..fa87190565 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ Currently, the following games are supported: * The Legend of Zelda: A Link to the Past * Factorio -* Minecraft * Subnautica * Risk of Rain 2 * The Legend of Zelda: Ocarina of Time @@ -15,14 +14,12 @@ Currently, the following games are supported: * Super Metroid * Secret of Evermore * Final Fantasy -* Rogue Legacy * VVVVVV * Raft * Super Mario 64 * Meritous * Super Metroid/Link to the Past combo randomizer (SMZ3) * ChecksFinder -* ArchipIDLE * Hollow Knight * The Witness * Sonic Adventure 2: Battle @@ -42,7 +39,6 @@ Currently, the following games are supported: * The Messenger * Kingdom Hearts 2 * The Legend of Zelda: Link's Awakening DX -* Clique * Adventure * DLC Quest * Noita @@ -80,6 +76,12 @@ Currently, the following games are supported: * Inscryption * Civilization VI * The Legend of Zelda: The Wind Waker +* Jak and Daxter: The Precursor Legacy +* Super Mario Land 2: 6 Golden Coins +* shapez +* Paint +* Celeste (Open World) +* Choo-Choo Charles For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/). Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled diff --git a/SNIClient.py b/SNIClient.py index 1156bf6040..d8bc05841f 100644 --- a/SNIClient.py +++ b/SNIClient.py @@ -18,6 +18,7 @@ from json import loads, dumps from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser import Utils +from settings import Settings from Utils import async_start from MultiServer import mark_raw if typing.TYPE_CHECKING: @@ -285,7 +286,7 @@ class SNESState(enum.IntEnum): def launch_sni() -> None: - sni_path = Utils.get_settings()["sni_options"]["sni_path"] + sni_path = Settings.sni_options.sni_path if not os.path.isdir(sni_path): sni_path = Utils.local_path(sni_path) @@ -668,8 +669,7 @@ async def game_watcher(ctx: SNIContext) -> None: async def run_game(romfile: str) -> None: - auto_start = typing.cast(typing.Union[bool, str], - Utils.get_settings()["sni_options"].get("snes_rom_start", True)) + auto_start = Settings.sni_options.snes_rom_start if auto_start is True: import webbrowser webbrowser.open(romfile) diff --git a/Starcraft2Client.py b/Starcraft2Client.py deleted file mode 100644 index fb219a6904..0000000000 --- a/Starcraft2Client.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import annotations - -import ModuleUpdate -ModuleUpdate.update() - -from worlds.sc2.Client import launch -import Utils - -if __name__ == "__main__": - Utils.init_logging("Starcraft2Client", exception_logger="Client") - launch() diff --git a/Utils.py b/Utils.py index f930335b24..a14e737c28 100644 --- a/Utils.py +++ b/Utils.py @@ -47,8 +47,9 @@ class Version(typing.NamedTuple): return ".".join(str(item) for item in self) -__version__ = "0.6.2" +__version__ = "0.6.4" version_tuple = tuplize_version(__version__) +version = Version(*version_tuple) is_linux = sys.platform.startswith("linux") is_macos = sys.platform == "darwin" @@ -166,6 +167,10 @@ def home_path(*path: str) -> str: os.symlink(home_path.cached_path, legacy_home_path) else: os.makedirs(home_path.cached_path, 0o700, exist_ok=True) + elif sys.platform == 'darwin': + import platformdirs + home_path.cached_path = platformdirs.user_data_dir("Archipelago", False) + os.makedirs(home_path.cached_path, 0o700, exist_ok=True) else: # not implemented home_path.cached_path = local_path() # this will generate the same exceptions we got previously @@ -177,7 +182,7 @@ def user_path(*path: str) -> str: """Returns either local_path or home_path based on write permissions.""" if hasattr(user_path, "cached_path"): pass - elif os.access(local_path(), os.W_OK): + elif os.access(local_path(), os.W_OK) and not (is_macos and is_frozen()): user_path.cached_path = local_path() else: user_path.cached_path = home_path() @@ -226,7 +231,12 @@ def open_file(filename: typing.Union[str, "pathlib.Path"]) -> None: from shutil import which open_command = which("open") if is_macos else (which("xdg-open") or which("gnome-open") or which("kde-open")) assert open_command, "Didn't find program for open_file! Please report this together with system details." - subprocess.call([open_command, filename]) + + env = os.environ + if "LD_LIBRARY_PATH" in env: + env = env.copy() + del env["LD_LIBRARY_PATH"] # exe is a system binary, so reset LD_LIBRARY_PATH + subprocess.call([open_command, filename], env=env) # from https://gist.github.com/pypt/94d747fe5180851196eb#gistcomment-4015118 with some changes @@ -313,11 +323,13 @@ def get_options() -> Settings: return get_settings() -def persistent_store(category: str, key: str, value: typing.Any): - path = user_path("_persistent_storage.yaml") +def persistent_store(category: str, key: str, value: typing.Any, force_store: bool = False): storage = persistent_load() + if not force_store and category in storage and key in storage[category] and storage[category][key] == value: + return # no changes necessary category_dict = storage.setdefault(category, {}) category_dict[key] = value + path = user_path("_persistent_storage.yaml") with open(path, "wt") as f: f.write(dump(storage, Dumper=Dumper)) @@ -404,13 +416,26 @@ def get_adjuster_settings(game_name: str) -> Namespace: @cache_argsless def get_unique_identifier(): - uuid = persistent_load().get("client", {}).get("uuid", None) + common_path = cache_path("common.json") + try: + with open(common_path) as f: + common_file = json.load(f) + uuid = common_file.get("uuid", None) + except FileNotFoundError: + common_file = {} + uuid = None + if uuid: return uuid - import uuid - uuid = uuid.getnode() - persistent_store("client", "uuid", uuid) + from uuid import uuid4 + uuid = str(uuid4()) + common_file["uuid"] = uuid + + cache_folder = os.path.dirname(common_path) + os.makedirs(cache_folder, exist_ok=True) + with open(common_path, "w") as f: + json.dump(common_file, f, separators=(",", ":")) return uuid @@ -433,6 +458,7 @@ class RestrictedUnpickler(pickle.Unpickler): if module == "builtins" and name in safe_builtins: return getattr(builtins, name) # used by OptionCounter + # necessary because the actual Options class instances are pickled when transfered to WebHost generation pool if module == "collections" and name == "Counter": return collections.Counter # used by MultiServer -> savegame/multidata @@ -463,6 +489,18 @@ def restricted_loads(s: bytes) -> Any: return RestrictedUnpickler(io.BytesIO(s)).load() +def restricted_dumps(obj: Any) -> bytes: + """Helper function analogous to pickle.dumps().""" + s = pickle.dumps(obj) + # Assert that the string can be successfully loaded by restricted_loads + try: + restricted_loads(s) + except pickle.UnpicklingError as e: + raise pickle.PicklingError(e) from e + + return s + + class ByValue: """ Mixin for enums to pickle value instead of name (restores pre-3.11 behavior). Use as left-most parent. @@ -540,6 +578,8 @@ def init_logging(name: str, loglevel: typing.Union[str, int] = logging.INFO, if add_timestamp: stream_handler.setFormatter(formatter) root_logger.addHandler(stream_handler) + if hasattr(sys.stdout, "reconfigure"): + sys.stdout.reconfigure(encoding="utf-8", errors="replace") # Relay unhandled exceptions to logger. if not getattr(sys.excepthook, "_wrapped", False): # skip if already modified @@ -706,25 +746,30 @@ def _mp_open_filename(res: "multiprocessing.Queue[typing.Optional[str]]", *args: res.put(open_filename(*args)) +def _run_for_stdout(*args: str): + env = os.environ + if "LD_LIBRARY_PATH" in env: + env = env.copy() + del env["LD_LIBRARY_PATH"] # exe is a system binary, so reset LD_LIBRARY_PATH + return subprocess.run(args, capture_output=True, text=True, env=env).stdout.split("\n", 1)[0] or None + + def open_filename(title: str, filetypes: typing.Iterable[typing.Tuple[str, typing.Iterable[str]]], suggest: str = "") \ -> typing.Optional[str]: logging.info(f"Opening file input dialog for {title}.") - def run(*args: str): - return subprocess.run(args, capture_output=True, text=True).stdout.split("\n", 1)[0] or None - if is_linux: # prefer native dialog from shutil import which kdialog = which("kdialog") if kdialog: k_filters = '|'.join((f'{text} (*{" *".join(ext)})' for (text, ext) in filetypes)) - return run(kdialog, f"--title={title}", "--getopenfilename", suggest or ".", k_filters) + return _run_for_stdout(kdialog, f"--title={title}", "--getopenfilename", suggest or ".", k_filters) zenity = which("zenity") if zenity: z_filters = (f'--file-filter={text} ({", ".join(ext)}) | *{" *".join(ext)}' for (text, ext) in filetypes) selection = (f"--filename={suggest}",) if suggest else () - return run(zenity, f"--title={title}", "--file-selection", *z_filters, *selection) + return _run_for_stdout(zenity, f"--title={title}", "--file-selection", *z_filters, *selection) # fall back to tk try: @@ -758,21 +803,18 @@ def _mp_open_directory(res: "multiprocessing.Queue[typing.Optional[str]]", *args def open_directory(title: str, suggest: str = "") -> typing.Optional[str]: - def run(*args: str): - return subprocess.run(args, capture_output=True, text=True).stdout.split("\n", 1)[0] or None - if is_linux: # prefer native dialog from shutil import which kdialog = which("kdialog") if kdialog: - return run(kdialog, f"--title={title}", "--getexistingdirectory", + return _run_for_stdout(kdialog, f"--title={title}", "--getexistingdirectory", os.path.abspath(suggest) if suggest else ".") zenity = which("zenity") if zenity: z_filters = ("--directory",) selection = (f"--filename={os.path.abspath(suggest)}/",) if suggest else () - return run(zenity, f"--title={title}", "--file-selection", *z_filters, *selection) + return _run_for_stdout(zenity, f"--title={title}", "--file-selection", *z_filters, *selection) # fall back to tk try: @@ -799,9 +841,6 @@ def open_directory(title: str, suggest: str = "") -> typing.Optional[str]: def messagebox(title: str, text: str, error: bool = False) -> None: - def run(*args: str): - return subprocess.run(args, capture_output=True, text=True).stdout.split("\n", 1)[0] or None - if is_kivy_running(): from kvui import MessageBox MessageBox(title, text, error).open() @@ -812,10 +851,10 @@ def messagebox(title: str, text: str, error: bool = False) -> None: from shutil import which kdialog = which("kdialog") if kdialog: - return run(kdialog, f"--title={title}", "--error" if error else "--msgbox", text) + return _run_for_stdout(kdialog, f"--title={title}", "--error" if error else "--msgbox", text) zenity = which("zenity") if zenity: - return run(zenity, f"--title={title}", f"--text={text}", "--error" if error else "--info") + return _run_for_stdout(zenity, f"--title={title}", f"--text={text}", "--error" if error else "--info") elif is_windows: import ctypes @@ -867,7 +906,7 @@ def async_start(co: Coroutine[None, None, typing.Any], name: Optional[str] = Non Use this to start a task when you don't keep a reference to it or immediately await it, to prevent early garbage collection. "fire-and-forget" """ - # https://docs.python.org/3.10/library/asyncio-task.html#asyncio.create_task + # https://docs.python.org/3.11/library/asyncio-task.html#asyncio.create_task # Python docs: # ``` # Important: Save a reference to the result of [asyncio.create_task], @@ -904,15 +943,15 @@ class DeprecateDict(dict): def _extend_freeze_support() -> None: - """Extend multiprocessing.freeze_support() to also work on Non-Windows for spawn.""" - # upstream issue: https://github.com/python/cpython/issues/76327 + """Extend multiprocessing.freeze_support() to also work on Non-Windows and without setting spawn method first.""" + # original upstream issue: https://github.com/python/cpython/issues/76327 # code based on https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py#L26 import multiprocessing import multiprocessing.spawn def _freeze_support() -> None: """Minimal freeze_support. Only apply this if frozen.""" - from subprocess import _args_from_interpreter_flags + from subprocess import _args_from_interpreter_flags # noqa # Prevent `spawn` from trying to read `__main__` in from the main script multiprocessing.process.ORIGINAL_DIR = None @@ -920,8 +959,7 @@ def _extend_freeze_support() -> None: # Handle the first process that MP will create if ( len(sys.argv) >= 2 and sys.argv[-2] == '-c' and sys.argv[-1].startswith(( - 'from multiprocessing.semaphore_tracker import main', # Py<3.8 - 'from multiprocessing.resource_tracker import main', # Py>=3.8 + 'from multiprocessing.resource_tracker import main', 'from multiprocessing.forkserver import main' )) and set(sys.argv[1:-2]) == set(_args_from_interpreter_flags()) ): @@ -940,17 +978,23 @@ def _extend_freeze_support() -> None: multiprocessing.spawn.spawn_main(**kwargs) sys.exit() - if not is_windows and is_frozen(): - multiprocessing.freeze_support = multiprocessing.spawn.freeze_support = _freeze_support + def _noop() -> None: + pass + + multiprocessing.freeze_support = multiprocessing.spawn.freeze_support = _freeze_support if is_frozen() else _noop def freeze_support() -> None: - """This behaves like multiprocessing.freeze_support but also works on Non-Windows.""" + """This now only calls multiprocessing.freeze_support since we are patching freeze_support on module load.""" import multiprocessing - _extend_freeze_support() + + deprecate("Use multiprocessing.freeze_support() instead") multiprocessing.freeze_support() +_extend_freeze_support() + + def visualize_regions(root_region: Region, file_name: str, *, show_entrance_names: bool = False, show_locations: bool = True, show_other_regions: bool = True, linetype_ortho: bool = True, regions_to_highlight: set[Region] | None = None) -> None: diff --git a/WebHost.py b/WebHost.py index 768eeb5122..fd8daeb371 100644 --- a/WebHost.py +++ b/WebHost.py @@ -54,16 +54,15 @@ def get_app() -> "Flask": return app -def create_ordered_tutorials_file() -> typing.List[typing.Dict[str, typing.Any]]: - import json +def copy_tutorials_files_to_static() -> None: import shutil import zipfile + from werkzeug.utils import secure_filename zfile: zipfile.ZipInfo from worlds.AutoWorld import AutoWorldRegister worlds = {} - data = [] for game, world in AutoWorldRegister.world_types.items(): if hasattr(world.web, 'tutorials') and (not world.hidden or game == 'Archipelago'): worlds[game] = world @@ -72,7 +71,7 @@ def create_ordered_tutorials_file() -> typing.List[typing.Dict[str, typing.Any]] shutil.rmtree(base_target_path, ignore_errors=True) for game, world in worlds.items(): # copy files from world's docs folder to the generated folder - target_path = os.path.join(base_target_path, get_file_safe_name(game)) + target_path = os.path.join(base_target_path, secure_filename(game)) os.makedirs(target_path, exist_ok=True) if world.zip_path: @@ -85,45 +84,14 @@ def create_ordered_tutorials_file() -> typing.List[typing.Dict[str, typing.Any]] for zfile in zf.infolist(): if not zfile.is_dir() and "/docs/" in zfile.filename: zfile.filename = os.path.basename(zfile.filename) - zf.extract(zfile, target_path) + with open(os.path.join(target_path, secure_filename(zfile.filename)), "wb") as f: + f.write(zf.read(zfile)) else: source_path = Utils.local_path(os.path.dirname(world.__file__), "docs") files = os.listdir(source_path) for file in files: - shutil.copyfile(Utils.local_path(source_path, file), Utils.local_path(target_path, file)) - - # build a json tutorial dict per game - game_data = {'gameTitle': game, 'tutorials': []} - for tutorial in world.web.tutorials: - # build dict for the json file - current_tutorial = { - 'name': tutorial.tutorial_name, - 'description': tutorial.description, - 'files': [{ - 'language': tutorial.language, - 'filename': game + '/' + tutorial.file_name, - 'link': f'{game}/{tutorial.link}', - 'authors': tutorial.authors - }] - } - - # check if the name of the current guide exists already - for guide in game_data['tutorials']: - if guide and tutorial.tutorial_name == guide['name']: - guide['files'].append(current_tutorial['files'][0]) - break - else: - game_data['tutorials'].append(current_tutorial) - - data.append(game_data) - with open(Utils.local_path("WebHostLib", "static", "generated", "tutorials.json"), 'w', encoding='utf-8-sig') as json_target: - generic_data = {} - for games in data: - if 'Archipelago' in games['gameTitle']: - generic_data = data.pop(data.index(games)) - sorted_data = [generic_data] + Utils.title_sorted(data, key=lambda entry: entry["gameTitle"]) - json.dump(sorted_data, json_target, indent=2, ensure_ascii=False) - return sorted_data + shutil.copyfile(Utils.local_path(source_path, file), + Utils.local_path(target_path, secure_filename(file))) if __name__ == "__main__": @@ -131,18 +99,18 @@ if __name__ == "__main__": multiprocessing.set_start_method('spawn') logging.basicConfig(format='[%(asctime)s] %(message)s', level=logging.INFO) - from WebHostLib.lttpsprites import update_sprites_lttp from WebHostLib.autolauncher import autohost, autogen, stop from WebHostLib.options import create as create_options_files try: + from WebHostLib.lttpsprites import update_sprites_lttp update_sprites_lttp() except Exception as e: logging.exception(e) logging.warning("Could not update LttP sprites.") app = get_app() create_options_files() - create_ordered_tutorials_file() + copy_tutorials_files_to_static() if app.config["SELFLAUNCH"]: autohost(app.config) if app.config["SELFGEN"]: diff --git a/WebHostLib/__init__.py b/WebHostLib/__init__.py index 9c713419c9..74086cb884 100644 --- a/WebHostLib/__init__.py +++ b/WebHostLib/__init__.py @@ -61,32 +61,43 @@ cache = Cache() Compress(app) +def to_python(value): + return uuid.UUID(bytes=base64.urlsafe_b64decode(value + '==')) + + +def to_url(value): + return base64.urlsafe_b64encode(value.bytes).rstrip(b'=').decode('ascii') + + class B64UUIDConverter(BaseConverter): def to_python(self, value): - return uuid.UUID(bytes=base64.urlsafe_b64decode(value + '==')) + return to_python(value) def to_url(self, value): - return base64.urlsafe_b64encode(value.bytes).rstrip(b'=').decode('ascii') + return to_url(value) # short UUID app.url_map.converters["suuid"] = B64UUIDConverter -app.jinja_env.filters['suuid'] = lambda value: base64.urlsafe_b64encode(value.bytes).rstrip(b'=').decode('ascii') +app.jinja_env.filters["suuid"] = to_url app.jinja_env.filters["title_sorted"] = title_sorted def register(): """Import submodules, triggering their registering on flask routing. Note: initializes worlds subsystem.""" + import importlib + + from werkzeug.utils import find_modules # has automatic patch integration - import worlds.AutoWorld import worlds.Files - app.jinja_env.filters['supports_apdeltapatch'] = lambda game_name: \ - game_name in worlds.Files.AutoPatchRegister.patch_types + app.jinja_env.filters['is_applayercontainer'] = worlds.Files.is_ap_player_container from WebHostLib.customserver import run_server_process - # to trigger app routing picking up on it - from . import tracker, upload, landing, check, generate, downloads, api, stats, misc, robots, options, session + for module in find_modules("WebHostLib", include_packages=True): + importlib.import_module(module) + + from . import api app.register_blueprint(api.api_endpoints) diff --git a/WebHostLib/api/__init__.py b/WebHostLib/api/__init__.py index d0b9d05c16..54eb5c1de1 100644 --- a/WebHostLib/api/__init__.py +++ b/WebHostLib/api/__init__.py @@ -11,5 +11,5 @@ api_endpoints = Blueprint('api', __name__, url_prefix="/api") def get_players(seed: Seed) -> List[Tuple[str, str]]: return [(slot.player_name, slot.game) for slot in seed.slots.order_by(Slot.player_id)] - -from . import datapackage, generate, room, user # trigger registration +# trigger endpoint registration +from . import datapackage, generate, room, tracker, user diff --git a/WebHostLib/api/generate.py b/WebHostLib/api/generate.py index 8d44906501..236c35b061 100644 --- a/WebHostLib/api/generate.py +++ b/WebHostLib/api/generate.py @@ -7,6 +7,7 @@ from flask import request, session, url_for from markupsafe import Markup from pony.orm import commit, select +from Utils import restricted_dumps from WebHostLib import app, cache from WebHostLib.check import get_yaml_data, roll_options from WebHostLib.generate import get_meta @@ -57,7 +58,7 @@ def generate_api(): "detail": results}, 400 else: gen = Generation( - options=pickle.dumps({name: vars(options) for name, options in gen_options.items()}), + options=restricted_dumps({name: vars(options) for name, options in gen_options.items()}), # convert to json compatible meta=json.dumps(meta), state=STATE_QUEUED, owner=session["_id"]) diff --git a/WebHostLib/api/room.py b/WebHostLib/api/room.py index 9337975695..78623bbe3e 100644 --- a/WebHostLib/api/room.py +++ b/WebHostLib/api/room.py @@ -3,6 +3,7 @@ from uuid import UUID from flask import abort, url_for +from WebHostLib import to_url import worlds.Files from . import api_endpoints, get_players from ..models import Room @@ -33,7 +34,7 @@ def room_info(room_id: UUID) -> Dict[str, Any]: downloads.append(slot_download) return { - "tracker": room.tracker, + "tracker": to_url(room.tracker), "players": get_players(room.seed), "last_port": room.last_port, "last_activity": room.last_activity, diff --git a/WebHostLib/api/tracker.py b/WebHostLib/api/tracker.py new file mode 100644 index 0000000000..36692af426 --- /dev/null +++ b/WebHostLib/api/tracker.py @@ -0,0 +1,241 @@ +from datetime import datetime, timezone +from typing import Any, TypedDict +from uuid import UUID + +from flask import abort + +from NetUtils import ClientStatus, Hint, NetworkItem, SlotType +from WebHostLib import cache +from WebHostLib.api import api_endpoints +from WebHostLib.models import Room +from WebHostLib.tracker import TrackerData + + +class PlayerAlias(TypedDict): + team: int + player: int + alias: str | None + + +class PlayerItemsReceived(TypedDict): + team: int + player: int + items: list[NetworkItem] + + +class PlayerChecksDone(TypedDict): + team: int + player: int + locations: list[int] + + +class TeamTotalChecks(TypedDict): + team: int + checks_done: int + + +class PlayerHints(TypedDict): + team: int + player: int + hints: list[Hint] + + +class PlayerTimer(TypedDict): + team: int + player: int + time: datetime | None + + +class PlayerStatus(TypedDict): + team: int + player: int + status: ClientStatus + + +class PlayerLocationsTotal(TypedDict): + team: int + player: int + total_locations: int + + +@api_endpoints.route("/tracker/") +@cache.memoize(timeout=60) +def tracker_data(tracker: UUID) -> dict[str, Any]: + """ + Outputs json data to /api/tracker/. + + :param tracker: UUID of current session tracker. + + :return: Tracking data for all players in the room. Typing and docstrings describe the format of each value. + """ + room: Room | None = Room.get(tracker=tracker) + if not room: + abort(404) + + tracker_data = TrackerData(room) + + all_players: dict[int, list[int]] = tracker_data.get_all_players() + + player_aliases: list[PlayerAlias] = [] + """Slot aliases of all players.""" + for team, players in all_players.items(): + for player in players: + player_aliases.append({"team": team, "player": player, "alias": tracker_data.get_player_alias(team, player)}) + + player_items_received: list[PlayerItemsReceived] = [] + """Items received by each player.""" + for team, players in all_players.items(): + for player in players: + player_items_received.append( + {"team": team, "player": player, "items": tracker_data.get_player_received_items(team, player)}) + + player_checks_done: list[PlayerChecksDone] = [] + """ID of all locations checked by each player.""" + for team, players in all_players.items(): + for player in players: + player_checks_done.append( + {"team": team, "player": player, "locations": sorted(tracker_data.get_player_checked_locations(team, player))}) + + total_checks_done: list[TeamTotalChecks] = [ + {"team": team, "checks_done": checks_done} + for team, checks_done in tracker_data.get_team_locations_checked_count().items() + ] + """Total number of locations checked for the entire multiworld per team.""" + + hints: list[PlayerHints] = [] + """Hints that all players have used or received.""" + for team, players in tracker_data.get_all_slots().items(): + for player in players: + player_hints = sorted(tracker_data.get_player_hints(team, player)) + hints.append({"team": team, "player": player, "hints": player_hints}) + slot_info = tracker_data.get_slot_info(player) + # this assumes groups are always after players + if slot_info.type != SlotType.group: + continue + for member in slot_info.group_members: + hints[member - 1]["hints"] += player_hints + + activity_timers: list[PlayerTimer] = [] + """Time of last activity per player. Returned as RFC 1123 format and null if no connection has been made.""" + for team, players in all_players.items(): + for player in players: + activity_timers.append({"team": team, "player": player, "time": None}) + + for (team, player), timestamp in tracker_data._multisave.get("client_activity_timers", []): + for entry in activity_timers: + if entry["team"] == team and entry["player"] == player: + entry["time"] = datetime.fromtimestamp(timestamp, timezone.utc) + break + + connection_timers: list[PlayerTimer] = [] + """Time of last connection per player. Returned as RFC 1123 format and null if no connection has been made.""" + for team, players in all_players.items(): + for player in players: + connection_timers.append({"team": team, "player": player, "time": None}) + + for (team, player), timestamp in tracker_data._multisave.get("client_connection_timers", []): + # find the matching entry + for entry in connection_timers: + if entry["team"] == team and entry["player"] == player: + entry["time"] = datetime.fromtimestamp(timestamp, timezone.utc) + break + + player_status: list[PlayerStatus] = [] + """The current client status for each player.""" + for team, players in all_players.items(): + for player in players: + player_status.append({"team": team, "player": player, "status": tracker_data.get_player_client_status(team, player)}) + + return { + "aliases": player_aliases, + "player_items_received": player_items_received, + "player_checks_done": player_checks_done, + "total_checks_done": total_checks_done, + "hints": hints, + "activity_timers": activity_timers, + "connection_timers": connection_timers, + "player_status": player_status, + } + + +class PlayerGroups(TypedDict): + slot: int + name: str + members: list[int] + + +class PlayerSlotData(TypedDict): + player: int + slot_data: dict[str, Any] + + +@api_endpoints.route("/static_tracker/") +@cache.memoize(timeout=300) +def static_tracker_data(tracker: UUID) -> dict[str, Any]: + """ + Outputs json data to /api/static_tracker/. + + :param tracker: UUID of current session tracker. + + :return: Static tracking data for all players in the room. Typing and docstrings describe the format of each value. + """ + room: Room | None = Room.get(tracker=tracker) + if not room: + abort(404) + tracker_data = TrackerData(room) + + all_players: dict[int, list[int]] = tracker_data.get_all_players() + + groups: list[PlayerGroups] = [] + """The Slot ID of groups and the IDs of the group's members.""" + for team, players in tracker_data.get_all_slots().items(): + for player in players: + slot_info = tracker_data.get_slot_info(player) + if slot_info.type != SlotType.group or not slot_info.group_members: + continue + groups.append( + { + "slot": player, + "name": slot_info.name, + "members": list(slot_info.group_members), + }) + break + + player_locations_total: list[PlayerLocationsTotal] = [] + for team, players in all_players.items(): + for player in players: + player_locations_total.append( + {"team": team, "player": player, "total_locations": len(tracker_data.get_player_locations(player))}) + + return { + "groups": groups, + "datapackage": tracker_data._multidata["datapackage"], + "player_locations_total": player_locations_total, + } + +# It should be exceedingly rare that slot data is needed, so it's separated out. +@api_endpoints.route("/slot_data_tracker/") +@cache.memoize(timeout=300) +def tracker_slot_data(tracker: UUID) -> list[PlayerSlotData]: + """ + Outputs json data to /api/slot_data_tracker/. + + :param tracker: UUID of current session tracker. + + :return: Slot data for all players in the room. Typing completely arbitrary per game. + """ + room: Room | None = Room.get(tracker=tracker) + if not room: + abort(404) + tracker_data = TrackerData(room) + + all_players: dict[int, list[int]] = tracker_data.get_all_players() + + slot_data: list[PlayerSlotData] = [] + """Slot data for each player.""" + for team, players in all_players.items(): + for player in players: + slot_data.append({"player": player, "slot_data": tracker_data.get_slot_data(player)}) + break + + return slot_data diff --git a/WebHostLib/api/user.py b/WebHostLib/api/user.py index 2524cc40a6..59c8e57283 100644 --- a/WebHostLib/api/user.py +++ b/WebHostLib/api/user.py @@ -1,6 +1,7 @@ from flask import session, jsonify from pony.orm import select +from WebHostLib import to_url from WebHostLib.models import Room, Seed from . import api_endpoints, get_players @@ -10,13 +11,13 @@ def get_rooms(): response = [] for room in select(room for room in Room if room.owner == session["_id"]): response.append({ - "room_id": room.id, - "seed_id": room.seed.id, + "room_id": to_url(room.id), + "seed_id": to_url(room.seed.id), "creation_time": room.creation_time, "last_activity": room.last_activity, "last_port": room.last_port, "timeout": room.timeout, - "tracker": room.tracker, + "tracker": to_url(room.tracker), }) return jsonify(response) @@ -26,7 +27,7 @@ def get_seeds(): response = [] for seed in select(seed for seed in Seed if seed.owner == session["_id"]): response.append({ - "seed_id": seed.id, + "seed_id": to_url(seed.id), "creation_time": seed.creation_time, "players": get_players(seed), }) diff --git a/WebHostLib/autolauncher.py b/WebHostLib/autolauncher.py index b330146277..719963e375 100644 --- a/WebHostLib/autolauncher.py +++ b/WebHostLib/autolauncher.py @@ -164,9 +164,6 @@ def autogen(config: dict): Thread(target=keep_running, name="AP_Autogen").start() -multiworlds: typing.Dict[type(Room.id), MultiworldInstance] = {} - - class MultiworldInstance(): def __init__(self, config: dict, id: int): self.room_ids = set() diff --git a/WebHostLib/check.py b/WebHostLib/check.py index 4e0cf1178f..b8e1fd8755 100644 --- a/WebHostLib/check.py +++ b/WebHostLib/check.py @@ -1,7 +1,7 @@ import os import zipfile import base64 -from typing import Union, Dict, Set, Tuple +from collections.abc import Set from flask import request, flash, redirect, url_for, render_template from markupsafe import Markup @@ -43,7 +43,7 @@ def mysterycheck(): return redirect(url_for("check"), 301) -def get_yaml_data(files) -> Union[Dict[str, str], str, Markup]: +def get_yaml_data(files) -> dict[str, str] | str | Markup: options = {} for uploaded_file in files: if banned_file(uploaded_file.filename): @@ -84,12 +84,12 @@ def get_yaml_data(files) -> Union[Dict[str, str], str, Markup]: return options -def roll_options(options: Dict[str, Union[dict, str]], +def roll_options(options: dict[str, dict | str], plando_options: Set[str] = frozenset({"bosses", "items", "connections", "texts"})) -> \ - Tuple[Dict[str, Union[str, bool]], Dict[str, dict]]: + tuple[dict[str, str | bool], dict[str, dict]]: plando_options = PlandoOptions.from_set(set(plando_options)) - results = {} - rolled_results = {} + results: dict[str, str | bool] = {} + rolled_results: dict[str, dict] = {} for filename, text in options.items(): try: if type(text) is dict: diff --git a/WebHostLib/customserver.py b/WebHostLib/customserver.py index 2ebb40d673..156c12523d 100644 --- a/WebHostLib/customserver.py +++ b/WebHostLib/customserver.py @@ -129,7 +129,7 @@ class WebHostContext(Context): else: row = GameDataPackage.get(checksum=game_data["checksum"]) if row: # None if rolled on >= 0.3.9 but uploaded to <= 0.3.8. multidata should be complete - game_data_packages[game] = Utils.restricted_loads(row.data) + game_data_packages[game] = restricted_loads(row.data) continue else: self.logger.warning(f"Did not find game_data_package for {game}: {game_data['checksum']}") @@ -159,6 +159,7 @@ class WebHostContext(Context): @db_session def _save(self, exit_save: bool = False) -> bool: room = Room.get(id=self.room_id) + # Does not use Utils.restricted_dumps because we'd rather make a save than not make one room.multisave = pickle.dumps(self.get_save()) # saving only occurs on activity, so we can "abuse" this information to mark this as last_activity if not exit_save: # we don't want to count a shutdown as activity, which would restart the server again diff --git a/WebHostLib/downloads.py b/WebHostLib/downloads.py index a09ca70171..388a6dc73c 100644 --- a/WebHostLib/downloads.py +++ b/WebHostLib/downloads.py @@ -61,12 +61,7 @@ def download_slot_file(room_id, player_id: int): else: import io - if slot_data.game == "Minecraft": - from worlds.minecraft import mc_update_output - fname = f"AP_{app.jinja_env.filters['suuid'](room_id)}_P{slot_data.player_id}_{slot_data.player_name}.apmc" - data = mc_update_output(slot_data.data, server=app.config['HOST_ADDRESS'], port=room.last_port) - return send_file(io.BytesIO(data), as_attachment=True, download_name=fname) - elif slot_data.game == "Factorio": + if slot_data.game == "Factorio": with zipfile.ZipFile(io.BytesIO(slot_data.data)) as zf: for name in zf.namelist(): if name.endswith("info.json"): diff --git a/WebHostLib/generate.py b/WebHostLib/generate.py index 34033a0854..6ca8c1c8a1 100644 --- a/WebHostLib/generate.py +++ b/WebHostLib/generate.py @@ -1,30 +1,29 @@ import concurrent.futures import json import os -import pickle import random import tempfile import zipfile from collections import Counter -from typing import Any, Dict, List, Optional, Union, Set +from pickle import PicklingError +from typing import Any from flask import flash, redirect, render_template, request, session, url_for from pony.orm import commit, db_session from BaseClasses import get_seed, seeddigits -from Generate import PlandoOptions, handle_name +from Generate import PlandoOptions, handle_name, mystery_argparse from Main import main as ERmain -from Utils import __version__ +from Utils import __version__, restricted_dumps from WebHostLib import app from settings import ServerOptions, GeneratorOptions -from worlds.alttp.EntranceRandomizer import parse_arguments from .check import get_yaml_data, roll_options from .models import Generation, STATE_ERROR, STATE_QUEUED, Seed, UUID from .upload import upload_zip_to_db -def get_meta(options_source: dict, race: bool = False) -> Dict[str, Union[List[str], Dict[str, Any]]]: - plando_options: Set[str] = set() +def get_meta(options_source: dict, race: bool = False) -> dict[str, list[str] | dict[str, Any]]: + plando_options: set[str] = set() for substr in ("bosses", "items", "connections", "texts"): if options_source.get(f"plando_{substr}", substr in GeneratorOptions.plando_options): plando_options.add(substr) @@ -73,7 +72,7 @@ def generate(race=False): return render_template("generate.html", race=race, version=__version__) -def start_generation(options: Dict[str, Union[dict, str]], meta: Dict[str, Any]): +def start_generation(options: dict[str, dict | str], meta: dict[str, Any]): results, gen_options = roll_options(options, set(meta["plando_options"])) if any(type(result) == str for result in results.values()): @@ -83,12 +82,18 @@ def start_generation(options: Dict[str, Union[dict, str]], meta: Dict[str, Any]) f"If you have a larger group, please generate it yourself and upload it.") return redirect(url_for(request.endpoint, **(request.view_args or {}))) elif len(gen_options) >= app.config["JOB_THRESHOLD"]: - gen = Generation( - options=pickle.dumps({name: vars(options) for name, options in gen_options.items()}), - # convert to json compatible - meta=json.dumps(meta), - state=STATE_QUEUED, - owner=session["_id"]) + try: + gen = Generation( + options=restricted_dumps({name: vars(options) for name, options in gen_options.items()}), + # convert to json compatible + meta=json.dumps(meta), + state=STATE_QUEUED, + owner=session["_id"]) + except PicklingError as e: + from .autolauncher import handle_generation_failure + handle_generation_failure(e) + return render_template("seedError.html", seed_error=("PicklingError: " + str(e))) + commit() return redirect(url_for("wait_seed", seed=gen.id)) @@ -104,9 +109,9 @@ def start_generation(options: Dict[str, Union[dict, str]], meta: Dict[str, Any]) return redirect(url_for("view_seed", seed=seed_id)) -def gen_game(gen_options: dict, meta: Optional[Dict[str, Any]] = None, owner=None, sid=None): - if not meta: - meta: Dict[str, Any] = {} +def gen_game(gen_options: dict, meta: dict[str, Any] | None = None, owner=None, sid=None): + if meta is None: + meta = {} meta.setdefault("server_options", {}).setdefault("hint_cost", 10) race = meta.setdefault("generator_options", {}).setdefault("race", False) @@ -123,36 +128,39 @@ def gen_game(gen_options: dict, meta: Optional[Dict[str, Any]] = None, owner=Non seedname = "W" + (f"{random.randint(0, pow(10, seeddigits) - 1)}".zfill(seeddigits)) - erargs = parse_arguments(['--multi', str(playercount)]) - erargs.seed = seed - erargs.name = {x: "" for x in range(1, playercount + 1)} # only so it can be overwritten in mystery - erargs.spoiler = meta["generator_options"].get("spoiler", 0) - erargs.race = race - erargs.outputname = seedname - erargs.outputpath = target.name - erargs.teams = 1 - erargs.plando_options = PlandoOptions.from_set(meta.setdefault("plando_options", - {"bosses", "items", "connections", "texts"})) - erargs.skip_prog_balancing = False - erargs.skip_output = False - erargs.spoiler_only = False - erargs.csv_output = False + args = mystery_argparse() + args.multi = playercount + args.seed = seed + args.name = {x: "" for x in range(1, playercount + 1)} # only so it can be overwritten in mystery + args.spoiler = meta["generator_options"].get("spoiler", 0) + args.race = race + args.outputname = seedname + args.outputpath = target.name + args.teams = 1 + args.plando_options = PlandoOptions.from_set(meta.setdefault("plando_options", + {"bosses", "items", "connections", "texts"})) + args.skip_prog_balancing = False + args.skip_output = False + args.spoiler_only = False + args.csv_output = False + args.sprite = dict.fromkeys(range(1, args.multi+1), None) + args.sprite_pool = dict.fromkeys(range(1, args.multi+1), None) name_counter = Counter() for player, (playerfile, settings) in enumerate(gen_options.items(), 1): for k, v in settings.items(): if v is not None: - if hasattr(erargs, k): - getattr(erargs, k)[player] = v + if hasattr(args, k): + getattr(args, k)[player] = v else: - setattr(erargs, k, {player: v}) + setattr(args, k, {player: v}) - if not erargs.name[player]: - erargs.name[player] = os.path.splitext(os.path.split(playerfile)[-1])[0] - erargs.name[player] = handle_name(erargs.name[player], player, name_counter) - if len(set(erargs.name.values())) != len(erargs.name): - raise Exception(f"Names have to be unique. Names: {Counter(erargs.name.values())}") - ERmain(erargs, seed, baked_server_options=meta["server_options"]) + if not args.name[player]: + args.name[player] = os.path.splitext(os.path.split(playerfile)[-1])[0] + args.name[player] = handle_name(args.name[player], player, name_counter) + if len(set(args.name.values())) != len(args.name): + raise Exception(f"Names have to be unique. Names: {Counter(args.name.values())}") + ERmain(args, seed, baked_server_options=meta["server_options"]) return upload_to_db(target.name, sid, owner, race) thread_pool = concurrent.futures.ThreadPoolExecutor(max_workers=1) diff --git a/WebHostLib/lttpsprites.py b/WebHostLib/lttpsprites.py index 1b8ee4cf48..3bf596db48 100644 --- a/WebHostLib/lttpsprites.py +++ b/WebHostLib/lttpsprites.py @@ -3,10 +3,10 @@ import threading import json from Utils import local_path, user_path -from worlds.alttp.Rom import Sprite def update_sprites_lttp(): + from worlds.alttp.Rom import Sprite from tkinter import Tk from LttPAdjuster import get_image_for_sprite from LttPAdjuster import BackgroundTaskProgress @@ -14,7 +14,7 @@ def update_sprites_lttp(): from LttPAdjuster import update_sprites # Target directories - input_dir = user_path("data", "sprites", "alttpr") + input_dir = user_path("data", "sprites", "alttp", "remote") output_dir = local_path("WebHostLib", "static", "generated") # TODO: move to user_path os.makedirs(os.path.join(output_dir, "sprites"), exist_ok=True) diff --git a/WebHostLib/misc.py b/WebHostLib/misc.py index 98731b65bd..b308826779 100644 --- a/WebHostLib/misc.py +++ b/WebHostLib/misc.py @@ -7,17 +7,69 @@ from flask import request, redirect, url_for, render_template, Response, session from pony.orm import count, commit, db_session from werkzeug.utils import secure_filename -from worlds.AutoWorld import AutoWorldRegister +from worlds.AutoWorld import AutoWorldRegister, World from . import app, cache from .models import Seed, Room, Command, UUID, uuid4 +from Utils import title_sorted -def get_world_theme(game_name: str): +def get_world_theme(game_name: str) -> str: if game_name in AutoWorldRegister.world_types: return AutoWorldRegister.world_types[game_name].web.theme return 'grass' +def get_visible_worlds() -> dict[str, type(World)]: + worlds = {} + for game, world in AutoWorldRegister.world_types.items(): + if not world.hidden: + worlds[game] = world + return worlds + + +def render_markdown(path: str) -> str: + import mistune + from collections import Counter + + markdown = mistune.create_markdown( + escape=False, + plugins=[ + "strikethrough", + "footnotes", + "table", + "speedup", + ], + ) + + heading_id_count: Counter[str] = Counter() + + def heading_id(text: str) -> str: + nonlocal heading_id_count + import re # there is no good way to do this without regex + + s = re.sub(r"[^\w\- ]", "", text.lower()).replace(" ", "-").strip("-") + n = heading_id_count[s] + heading_id_count[s] += 1 + if n > 0: + s += f"-{n}" + return s + + def id_hook(_: mistune.Markdown, state: mistune.BlockState) -> None: + for tok in state.tokens: + if tok["type"] == "heading" and tok["attrs"]["level"] < 4: + text = tok["text"] + assert isinstance(text, str) + unique_id = heading_id(text) + tok["attrs"]["id"] = unique_id + tok["text"] = f"{text}" # make header link to itself + + markdown.before_render_hooks.append(id_hook) + + with open(path, encoding="utf-8-sig") as f: + document = f.read() + return markdown(document) + + @app.errorhandler(404) @app.errorhandler(jinja2.exceptions.TemplateNotFound) def page_not_found(err): @@ -31,83 +83,103 @@ def start_playing(): return render_template(f"startPlaying.html") -# Game Info Pages @app.route('/games//info/') @cache.cached() def game_info(game, lang): + """Game Info Pages""" try: - world = AutoWorldRegister.world_types[game] - if lang not in world.web.game_info_languages: - raise KeyError("Sorry, this game's info page is not available in that language yet.") - except KeyError: + theme = get_world_theme(game) + secure_game_name = secure_filename(game) + lang = secure_filename(lang) + document = render_markdown(os.path.join( + app.static_folder, "generated", "docs", + secure_game_name, f"{lang}_{secure_game_name}.md" + )) + return render_template( + "markdown_document.html", + title=f"{game} Guide", + html_from_markdown=document, + theme=theme, + ) + except FileNotFoundError: return abort(404) - return render_template('gameInfo.html', game=game, lang=lang, theme=get_world_theme(game)) -# List of supported games @app.route('/games') @cache.cached() def games(): - worlds = {} - for game, world in AutoWorldRegister.world_types.items(): - if not world.hidden: - worlds[game] = world - return render_template("supportedGames.html", worlds=worlds) + """List of supported games""" + return render_template("supportedGames.html", worlds=get_visible_worlds()) + + +@app.route('/tutorial//') +@cache.cached() +def tutorial(game: str, file: str): + try: + theme = get_world_theme(game) + secure_game_name = secure_filename(game) + file = secure_filename(file) + document = render_markdown(os.path.join( + app.static_folder, "generated", "docs", + secure_game_name, file+".md" + )) + return render_template( + "markdown_document.html", + title=f"{game} Guide", + html_from_markdown=document, + theme=theme, + ) + except FileNotFoundError: + return abort(404) @app.route('/tutorial///') -@cache.cached() -def tutorial(game, file, lang): - try: - world = AutoWorldRegister.world_types[game] - if lang not in [tut.link.split("/")[1] for tut in world.web.tutorials]: - raise KeyError("Sorry, the tutorial is not available in that language yet.") - except KeyError: - return abort(404) - return render_template("tutorial.html", game=game, file=file, lang=lang, theme=get_world_theme(game)) +def tutorial_redirect(game: str, file: str, lang: str): + """ + Permanent redirect old tutorial URLs to new ones to keep search engines happy. + e.g. /tutorial/Archipelago/setup/en -> /tutorial/Archipelago/setup_en + """ + return redirect(url_for("tutorial", game=game, file=f"{file}_{lang}"), code=301) @app.route('/tutorial/') @cache.cached() def tutorial_landing(): - return render_template("tutorialLanding.html") + tutorials = {} + worlds = AutoWorldRegister.world_types + for world_name, world_type in worlds.items(): + current_world = tutorials[world_name] = {} + for tutorial in world_type.web.tutorials: + current_tutorial = current_world.setdefault(tutorial.tutorial_name, { + "description": tutorial.description, "files": {}}) + current_tutorial["files"][secure_filename(tutorial.file_name).rsplit(".", 1)[0]] = { + "authors": tutorial.authors, + "language": tutorial.language + } + tutorials = {world_name: tutorials for world_name, tutorials in title_sorted( + tutorials.items(), key=lambda element: "\x00" if element[0] == "Archipelago" else worlds[element[0]].game)} + return render_template("tutorialLanding.html", worlds=worlds, tutorials=tutorials) @app.route('/faq//') @cache.cached() def faq(lang: str): - import markdown - with open(os.path.join(app.static_folder, "assets", "faq", secure_filename(lang)+".md")) as f: - document = f.read() + document = render_markdown(os.path.join(app.static_folder, "assets", "faq", secure_filename(lang)+".md")) return render_template( "markdown_document.html", title="Frequently Asked Questions", - html_from_markdown=markdown.markdown( - document, - extensions=["toc", "mdx_breakless_lists"], - extension_configs={ - "toc": {"anchorlink": True} - } - ), + html_from_markdown=document, ) @app.route('/glossary//') @cache.cached() def glossary(lang: str): - import markdown - with open(os.path.join(app.static_folder, "assets", "glossary", secure_filename(lang)+".md")) as f: - document = f.read() + document = render_markdown(os.path.join(app.static_folder, "assets", "glossary", secure_filename(lang)+".md")) return render_template( "markdown_document.html", title="Glossary", - html_from_markdown=markdown.markdown( - document, - extensions=["toc", "mdx_breakless_lists"], - extension_configs={ - "toc": {"anchorlink": True} - } - ), + html_from_markdown=document, ) @@ -188,7 +260,10 @@ def host_room(room: UUID): # indicate that the page should reload to get the assigned port should_refresh = ((not room.last_port and now - room.creation_time < datetime.timedelta(seconds=3)) or room.last_activity < now - datetime.timedelta(seconds=room.timeout)) - with db_session: + + if now - room.last_activity > datetime.timedelta(minutes=1): + # we only set last_activity if needed, otherwise parallel access on /room will cause an internal server error + # due to "pony.orm.core.OptimisticCheckError: Object Room was updated outside of current transaction" room.last_activity = now # will trigger a spinup, if it's not already running browser_tokens = "Mozilla", "Chrome", "Safari" diff --git a/WebHostLib/options.py b/WebHostLib/options.py index 38489cee3c..3c63fa8c7f 100644 --- a/WebHostLib/options.py +++ b/WebHostLib/options.py @@ -155,7 +155,9 @@ def generate_weighted_yaml(game: str): options = {} for key, val in request.form.items(): - if "||" not in key: + if val == "_ensure-empty-list": + options[key] = {} + elif "||" not in key: if len(str(val)) == 0: continue @@ -212,8 +214,11 @@ def generate_yaml(game: str): if request.method == "POST": options = {} intent_generate = False + for key, val in request.form.items(multi=True): - if key in options: + if val == "_ensure-empty-list": + options[key] = [] + elif options.get(key): if not isinstance(options[key], list): options[key] = [options[key]] options[key].append(val) diff --git a/WebHostLib/requirements.txt b/WebHostLib/requirements.txt index a9cd33dd6d..f64ed085c9 100644 --- a/WebHostLib/requirements.txt +++ b/WebHostLib/requirements.txt @@ -1,12 +1,12 @@ -flask>=3.1.0 +flask>=3.1.1 werkzeug>=3.1.3 -pony>=0.7.19 +pony>=0.7.19; python_version <= '3.12' +pony @ git+https://github.com/black-sliver/pony@7feb1221953b7fa4a6735466bf21a8b4d35e33ba#0.7.19; python_version >= '3.13' waitress>=3.0.2 Flask-Caching>=2.3.0 Flask-Compress>=1.17 Flask-Limiter>=3.12 bokeh>=3.6.3 markupsafe>=3.0.2 -Markdown>=3.7 -mdx-breakless-lists>=1.0.1 setproctitle>=1.3.5 +mistune>=3.1.3 diff --git a/WebHostLib/static/assets/gameInfo.js b/WebHostLib/static/assets/gameInfo.js deleted file mode 100644 index 797c9f6448..0000000000 --- a/WebHostLib/static/assets/gameInfo.js +++ /dev/null @@ -1,45 +0,0 @@ -window.addEventListener('load', () => { - const gameInfo = document.getElementById('game-info'); - new Promise((resolve, reject) => { - const ajax = new XMLHttpRequest(); - ajax.onreadystatechange = () => { - if (ajax.readyState !== 4) { return; } - if (ajax.status === 404) { - reject("Sorry, this game's info page is not available in that language yet."); - return; - } - if (ajax.status !== 200) { - reject("Something went wrong while loading the info page."); - return; - } - resolve(ajax.responseText); - }; - ajax.open('GET', `${window.location.origin}/static/generated/docs/${gameInfo.getAttribute('data-game')}/` + - `${gameInfo.getAttribute('data-lang')}_${gameInfo.getAttribute('data-game')}.md`, true); - ajax.send(); - }).then((results) => { - // Populate page with HTML generated from markdown - showdown.setOption('tables', true); - showdown.setOption('strikethrough', true); - showdown.setOption('literalMidWordUnderscores', true); - gameInfo.innerHTML += (new showdown.Converter()).makeHtml(results); - - // Reset the id of all header divs to something nicer - for (const header of document.querySelectorAll('h1, h2, h3, h4, h5, h6')) { - const headerId = header.innerText.replace(/\s+/g, '-').toLowerCase(); - header.setAttribute('id', headerId); - header.addEventListener('click', () => { - window.location.hash = `#${headerId}`; - header.scrollIntoView(); - }); - } - - // Manually scroll the user to the appropriate header if anchor navigation is used - document.fonts.ready.finally(() => { - if (window.location.hash) { - const scrollTarget = document.getElementById(window.location.hash.substring(1)); - scrollTarget?.scrollIntoView(); - } - }); - }); -}); diff --git a/WebHostLib/static/assets/minecraftTracker.js b/WebHostLib/static/assets/minecraftTracker.js deleted file mode 100644 index a698214b8d..0000000000 --- a/WebHostLib/static/assets/minecraftTracker.js +++ /dev/null @@ -1,49 +0,0 @@ -window.addEventListener('load', () => { - // Reload tracker every 15 seconds - const url = window.location; - setInterval(() => { - const ajax = new XMLHttpRequest(); - ajax.onreadystatechange = () => { - if (ajax.readyState !== 4) { return; } - - // Create a fake DOM using the returned HTML - const domParser = new DOMParser(); - const fakeDOM = domParser.parseFromString(ajax.responseText, 'text/html'); - - // Update item tracker - document.getElementById('inventory-table').innerHTML = fakeDOM.getElementById('inventory-table').innerHTML; - // Update only counters in the location-table - let counters = document.getElementsByClassName('counter'); - const fakeCounters = fakeDOM.getElementsByClassName('counter'); - for (let i = 0; i < counters.length; i++) { - counters[i].innerHTML = fakeCounters[i].innerHTML; - } - }; - ajax.open('GET', url); - ajax.send(); - }, 15000) - - // Collapsible advancement sections - const categories = document.getElementsByClassName("location-category"); - for (let i = 0; i < categories.length; i++) { - let hide_id = categories[i].id.split('-')[0]; - if (hide_id == 'Total') { - continue; - } - categories[i].addEventListener('click', function() { - // Toggle the advancement list - document.getElementById(hide_id).classList.toggle("hide"); - // Change text of the header - const tab_header = document.getElementById(hide_id+'-header').children[0]; - const orig_text = tab_header.innerHTML; - let new_text; - if (orig_text.includes("▼")) { - new_text = orig_text.replace("▼", "▲"); - } - else { - new_text = orig_text.replace("▲", "▼"); - } - tab_header.innerHTML = new_text; - }); - } -}); diff --git a/WebHostLib/static/assets/sc2Tracker.js b/WebHostLib/static/assets/sc2Tracker.js index 30d4acd60b..19cff21c0f 100644 --- a/WebHostLib/static/assets/sc2Tracker.js +++ b/WebHostLib/static/assets/sc2Tracker.js @@ -1,49 +1,43 @@ +let updateSection = (sectionName, fakeDOM) => { + document.getElementById(sectionName).innerHTML = fakeDOM.getElementById(sectionName).innerHTML; +} + window.addEventListener('load', () => { - // Reload tracker every 15 seconds - const url = window.location; - setInterval(() => { - const ajax = new XMLHttpRequest(); - ajax.onreadystatechange = () => { - if (ajax.readyState !== 4) { return; } + // Reload tracker every 60 seconds (sync'd) + const url = window.location; + // Note: This synchronization code is adapted from code in trackerCommon.js + const targetSecond = parseInt(document.getElementById('player-tracker').getAttribute('data-second')) + 3; + console.log("Target second of refresh: " + targetSecond); - // Create a fake DOM using the returned HTML - const domParser = new DOMParser(); - const fakeDOM = domParser.parseFromString(ajax.responseText, 'text/html'); - - // Update item tracker - document.getElementById('inventory-table').innerHTML = fakeDOM.getElementById('inventory-table').innerHTML; - // Update only counters in the location-table - let counters = document.getElementsByClassName('counter'); - const fakeCounters = fakeDOM.getElementsByClassName('counter'); - for (let i = 0; i < counters.length; i++) { - counters[i].innerHTML = fakeCounters[i].innerHTML; - } + let getSleepTimeSeconds = () => { + // -40 % 60 is -40, which is absolutely wrong and should burn + var sleepSeconds = (((targetSecond - new Date().getSeconds()) % 60) + 60) % 60; + return sleepSeconds || 60; }; - ajax.open('GET', url); - ajax.send(); - }, 15000) - // Collapsible advancement sections - const categories = document.getElementsByClassName("location-category"); - for (let category of categories) { - let hide_id = category.id.split('_')[0]; - if (hide_id === 'Total') { - continue; - } - category.addEventListener('click', function() { - // Toggle the advancement list - document.getElementById(hide_id).classList.toggle("hide"); - // Change text of the header - const tab_header = document.getElementById(hide_id+'_header').children[0]; - const orig_text = tab_header.innerHTML; - let new_text; - if (orig_text.includes("▼")) { - new_text = orig_text.replace("▼", "▲"); - } - else { - new_text = orig_text.replace("▲", "▼"); - } - tab_header.innerHTML = new_text; - }); - } + let updateTracker = () => { + const ajax = new XMLHttpRequest(); + ajax.onreadystatechange = () => { + if (ajax.readyState !== 4) { return; } + + // Create a fake DOM using the returned HTML + const domParser = new DOMParser(); + const fakeDOM = domParser.parseFromString(ajax.responseText, 'text/html'); + + // Update dynamic sections + updateSection('player-info', fakeDOM); + updateSection('section-filler', fakeDOM); + updateSection('section-terran', fakeDOM); + updateSection('section-zerg', fakeDOM); + updateSection('section-protoss', fakeDOM); + updateSection('section-nova', fakeDOM); + updateSection('section-kerrigan', fakeDOM); + updateSection('section-keys', fakeDOM); + updateSection('section-locations', fakeDOM); + }; + ajax.open('GET', url); + ajax.send(); + updater = setTimeout(updateTracker, getSleepTimeSeconds() * 1000); + }; + window.updater = setTimeout(updateTracker, getSleepTimeSeconds() * 1000); }); diff --git a/WebHostLib/static/assets/tutorial.js b/WebHostLib/static/assets/tutorial.js deleted file mode 100644 index c9022719fb..0000000000 --- a/WebHostLib/static/assets/tutorial.js +++ /dev/null @@ -1,52 +0,0 @@ -window.addEventListener('load', () => { - const tutorialWrapper = document.getElementById('tutorial-wrapper'); - new Promise((resolve, reject) => { - const ajax = new XMLHttpRequest(); - ajax.onreadystatechange = () => { - if (ajax.readyState !== 4) { return; } - if (ajax.status === 404) { - reject("Sorry, the tutorial is not available in that language yet."); - return; - } - if (ajax.status !== 200) { - reject("Something went wrong while loading the tutorial."); - return; - } - resolve(ajax.responseText); - }; - ajax.open('GET', `${window.location.origin}/static/generated/docs/` + - `${tutorialWrapper.getAttribute('data-game')}/${tutorialWrapper.getAttribute('data-file')}_` + - `${tutorialWrapper.getAttribute('data-lang')}.md`, true); - ajax.send(); - }).then((results) => { - // Populate page with HTML generated from markdown - showdown.setOption('tables', true); - showdown.setOption('strikethrough', true); - showdown.setOption('literalMidWordUnderscores', true); - showdown.setOption('disableForced4SpacesIndentedSublists', true); - tutorialWrapper.innerHTML += (new showdown.Converter()).makeHtml(results); - - const title = document.querySelector('h1') - if (title) { - document.title = title.textContent; - } - - // Reset the id of all header divs to something nicer - for (const header of document.querySelectorAll('h1, h2, h3, h4, h5, h6')) { - const headerId = header.innerText.replace(/\s+/g, '-').toLowerCase(); - header.setAttribute('id', headerId); - header.addEventListener('click', () => { - window.location.hash = `#${headerId}`; - header.scrollIntoView(); - }); - } - - // Manually scroll the user to the appropriate header if anchor navigation is used - document.fonts.ready.finally(() => { - if (window.location.hash) { - const scrollTarget = document.getElementById(window.location.hash.substring(1)); - scrollTarget?.scrollIntoView(); - } - }); - }); -}); diff --git a/WebHostLib/static/assets/tutorialLanding.js b/WebHostLib/static/assets/tutorialLanding.js deleted file mode 100644 index b820cc3465..0000000000 --- a/WebHostLib/static/assets/tutorialLanding.js +++ /dev/null @@ -1,81 +0,0 @@ -const showError = () => { - const tutorial = document.getElementById('tutorial-landing'); - document.getElementById('page-title').innerText = 'This page is out of logic!'; - tutorial.removeChild(document.getElementById('loading')); - const userMessage = document.createElement('h3'); - const homepageLink = document.createElement('a'); - homepageLink.innerText = 'Click here'; - homepageLink.setAttribute('href', '/'); - userMessage.append(homepageLink); - userMessage.append(' to go back to safety!'); - tutorial.append(userMessage); -}; - -window.addEventListener('load', () => { - const ajax = new XMLHttpRequest(); - ajax.onreadystatechange = () => { - if (ajax.readyState !== 4) { return; } - const tutorialDiv = document.getElementById('tutorial-landing'); - if (ajax.status !== 200) { return showError(); } - - try { - const games = JSON.parse(ajax.responseText); - games.forEach((game) => { - const gameTitle = document.createElement('h2'); - gameTitle.innerText = game.gameTitle; - gameTitle.id = `${encodeURIComponent(game.gameTitle)}`; - tutorialDiv.appendChild(gameTitle); - - game.tutorials.forEach((tutorial) => { - const tutorialName = document.createElement('h3'); - tutorialName.innerText = tutorial.name; - tutorialDiv.appendChild(tutorialName); - - const tutorialDescription = document.createElement('p'); - tutorialDescription.innerText = tutorial.description; - tutorialDiv.appendChild(tutorialDescription); - - const intro = document.createElement('p'); - intro.innerText = 'This guide is available in the following languages:'; - tutorialDiv.appendChild(intro); - - const fileList = document.createElement('ul'); - tutorial.files.forEach((file) => { - const listItem = document.createElement('li'); - const anchor = document.createElement('a'); - anchor.innerText = file.language; - anchor.setAttribute('href', `${window.location.origin}/tutorial/${file.link}`); - listItem.appendChild(anchor); - - listItem.append(' by '); - for (let author of file.authors) { - listItem.append(author); - if (file.authors.indexOf(author) !== (file.authors.length -1)) { - listItem.append(', '); - } - } - - fileList.appendChild(listItem); - }); - tutorialDiv.appendChild(fileList); - }); - }); - - tutorialDiv.removeChild(document.getElementById('loading')); - } catch (error) { - showError(); - console.error(error); - } - - // Check if we are on an anchor when coming in, and scroll to it. - const hash = window.location.hash; - if (hash) { - const offset = 128; // To account for navbar banner at top of page. - window.scrollTo(0, 0); - const rect = document.getElementById(hash.slice(1)).getBoundingClientRect(); - window.scrollTo(rect.left, rect.top - offset); - } - }; - ajax.open('GET', `${window.location.origin}/static/generated/tutorials.json`, true); - ajax.send(); -}); diff --git a/WebHostLib/static/styles/markdown.css b/WebHostLib/static/styles/markdown.css index 5ead2c60f7..ac06dea59d 100644 --- a/WebHostLib/static/styles/markdown.css +++ b/WebHostLib/static/styles/markdown.css @@ -28,7 +28,6 @@ font-weight: normal; font-family: LondrinaSolid-Regular, sans-serif; text-transform: uppercase; - cursor: pointer; /* TODO: remove once we drop showdown.js */ width: 100%; text-shadow: 1px 1px 4px #000000; } @@ -37,7 +36,6 @@ font-size: 38px; font-weight: normal; font-family: LondrinaSolid-Light, sans-serif; - cursor: pointer; /* TODO: remove once we drop showdown.js */ width: 100%; margin-top: 20px; margin-bottom: 0.5rem; @@ -50,7 +48,6 @@ font-family: LexendDeca-Regular, sans-serif; text-transform: none; text-align: left; - cursor: pointer; /* TODO: remove once we drop showdown.js */ width: 100%; margin-bottom: 0.5rem; } @@ -59,7 +56,6 @@ font-family: LexendDeca-Regular, sans-serif; text-transform: none; font-size: 24px; - cursor: pointer; /* TODO: remove once we drop showdown.js */ margin-bottom: 24px; } @@ -67,14 +63,12 @@ font-family: LexendDeca-Regular, sans-serif; text-transform: none; font-size: 22px; - cursor: pointer; /* TODO: remove once we drop showdown.js */ } .markdown h6, .markdown details summary.h6{ font-family: LexendDeca-Regular, sans-serif; text-transform: none; font-size: 20px; - cursor: pointer; /* TODO: remove once we drop showdown.js */ } .markdown h4, .markdown h5, .markdown h6{ diff --git a/WebHostLib/static/styles/minecraftTracker.css b/WebHostLib/static/styles/minecraftTracker.css deleted file mode 100644 index 224cdcdc55..0000000000 --- a/WebHostLib/static/styles/minecraftTracker.css +++ /dev/null @@ -1,102 +0,0 @@ -#player-tracker-wrapper{ - margin: 0; -} - -#inventory-table{ - border-top: 2px solid #000000; - border-left: 2px solid #000000; - border-right: 2px solid #000000; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - padding: 3px 3px 10px; - width: 384px; - background-color: #42b149; -} - -#inventory-table td{ - width: 40px; - height: 40px; - text-align: center; - vertical-align: middle; -} - -#inventory-table img{ - height: 100%; - max-width: 40px; - max-height: 40px; - filter: grayscale(100%) contrast(75%) brightness(30%); -} - -#inventory-table img.acquired{ - filter: none; -} - -#inventory-table div.counted-item { - position: relative; -} - -#inventory-table div.item-count { - position: absolute; - color: white; - font-family: "Minecraftia", monospace; - font-weight: bold; - bottom: 0; - right: 0; -} - -#location-table{ - width: 384px; - border-left: 2px solid #000000; - border-right: 2px solid #000000; - border-bottom: 2px solid #000000; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - background-color: #42b149; - padding: 0 3px 3px; - font-family: "Minecraftia", monospace; - font-size: 14px; - cursor: default; -} - -#location-table th{ - vertical-align: middle; - text-align: left; - padding-right: 10px; -} - -#location-table td{ - padding-top: 2px; - padding-bottom: 2px; - line-height: 20px; -} - -#location-table td.counter { - text-align: right; - font-size: 14px; -} - -#location-table td.toggle-arrow { - text-align: right; -} - -#location-table tr#Total-header { - font-weight: bold; -} - -#location-table img{ - height: 100%; - max-width: 30px; - max-height: 30px; -} - -#location-table tbody.locations { - font-size: 12px; -} - -#location-table td.location-name { - padding-left: 16px; -} - -.hide { - display: none; -} diff --git a/WebHostLib/static/styles/sc2Tracker.css b/WebHostLib/static/styles/sc2Tracker.css index 29a719a110..3048213e43 100644 --- a/WebHostLib/static/styles/sc2Tracker.css +++ b/WebHostLib/static/styles/sc2Tracker.css @@ -1,160 +1,279 @@ -#player-tracker-wrapper{ - margin: 0; +*{ + margin: 0; + font-family: "JuraBook", monospace; +} +body{ + --icon-size: 36px; + --item-class-padding: 4px; +} +a{ + color: #1ae; } -#tracker-table td { - vertical-align: top; +/* Section colours */ +#player-info{ + background-color: #37a; +} +.player-tracker{ + max-width: 100%; +} +.tracker-section{ + background-color: grey; +} +#terran-items{ + background-color: #3a7; +} +#zerg-items{ + background-color: #d94; +} +#protoss-items{ + background-color: #37a; +} +#nova-items{ + background-color: #777; +} +#kerrigan-items{ + background-color: #a37; +} +#keys{ + background-color: #aa2; } -.inventory-table-area{ - border: 2px solid #000000; - border-radius: 4px; - padding: 3px 10px 3px 10px; +/* Sections */ +.section-body{ + display: flex; + flex-flow: row wrap; + justify-content: flex-start; + align-items: flex-start; + padding-bottom: 3px; +} +.section-body-2{ + display: flex; + flex-direction: column; +} +.tracker-section:has(input.collapse-section[type=checkbox]:checked) .section-body, +.tracker-section:has(input.collapse-section[type=checkbox]:checked) .section-body-2{ + display: none; +} +.section-title{ + position: relative; + border-bottom: 3px solid black; + /* Prevent text selection */ + user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} +input[type="checkbox"]{ + position: absolute; + cursor: pointer; + opacity: 0; + z-index: 1; + width: 100%; + height: 100%; +} +.section-title:hover h2{ + text-shadow: 0 0 4px #ddd; +} +.f { + display: flex; + overflow: hidden; } -.inventory-table-area:has(.inventory-table-terran) { - width: 690px; - background-color: #525494; +/* Acquire item filters */ +.tracker-section img{ + height: 100%; + width: var(--icon-size); + height: var(--icon-size); + background-color: black; +} +.unacquired, .lvl-0 .f{ + filter: grayscale(100%) contrast(80%) brightness(42%) blur(0.5px); +} +.spacer{ + width: var(--icon-size); + height: var(--icon-size); } -.inventory-table-area:has(.inventory-table-zerg) { - width: 360px; - background-color: #9d60d2; +/* Item groups */ +.item-class{ + display: flex; + flex-flow: column; + justify-content: center; + padding: var(--item-class-padding); +} +.item-class-header{ + display: flex; + flex-flow: row; +} +.item-class-upgrades{ + /* Note: {display: flex; flex-flow: column wrap} */ + /* just breaks on Firefox (width does not scale to content) */ + display: grid; + grid-template-rows: repeat(4, auto); + grid-auto-flow: column; } -.inventory-table-area:has(.inventory-table-protoss) { - width: 400px; - background-color: #d2b260; +/* Subsections */ +.section-toc{ + display: flex; + flex-direction: row; +} +.toc-box{ + position: relative; + padding-left: 15px; + padding-right: 15px; +} +.toc-box:hover{ + text-shadow: 0 0 7px white; +} +.ss-header{ + position: relative; + text-align: center; + writing-mode: sideways-lr; + user-select: none; + padding-top: 5px; + font-size: 115%; +} +.tracker-section:has(input.ss-1-toggle:checked) .ss-1{ + display: none; +} +.tracker-section:has(input.ss-2-toggle:checked) .ss-2{ + display: none; +} +.tracker-section:has(input.ss-3-toggle:checked) .ss-3{ + display: none; +} +.tracker-section:has(input.ss-4-toggle:checked) .ss-4{ + display: none; +} +.tracker-section:has(input.ss-5-toggle:checked) .ss-5{ + display: none; +} +.tracker-section:has(input.ss-6-toggle:checked) .ss-6{ + display: none; +} +.tracker-section:has(input.ss-7-toggle:checked) .ss-7{ + display: none; +} +.tracker-section:has(input.ss-1-toggle:hover) .ss-1{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-2-toggle:hover) .ss-2{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-3-toggle:hover) .ss-3{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-4-toggle:hover) .ss-4{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-5-toggle:hover) .ss-5{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-6-toggle:hover) .ss-6{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; +} +.tracker-section:has(input.ss-7-toggle:hover) .ss-7{ + background-color: #fff5; + box-shadow: 0 0 1px 1px white; } -#tracker-table .inventory-table td{ - width: 40px; - height: 40px; - text-align: center; - vertical-align: middle; +/* Progressive items */ +.progressive{ + max-height: var(--icon-size); + display: contents; } -.inventory-table td.title{ - padding-top: 10px; - height: 20px; - font-family: "JuraBook", monospace; - font-size: 16px; - font-weight: bold; +.lvl-0 > :nth-child(2), +.lvl-0 > :nth-child(3), +.lvl-0 > :nth-child(4), +.lvl-0 > :nth-child(5){ + display: none; +} +.lvl-1 > :nth-child(2), +.lvl-1 > :nth-child(3), +.lvl-1 > :nth-child(4), +.lvl-1 > :nth-child(5){ + display: none; +} +.lvl-2 > :nth-child(1), +.lvl-2 > :nth-child(3), +.lvl-2 > :nth-child(4), +.lvl-2 > :nth-child(5){ + display: none; +} +.lvl-3 > :nth-child(1), +.lvl-3 > :nth-child(2), +.lvl-3 > :nth-child(4), +.lvl-3 > :nth-child(5){ + display: none; +} +.lvl-4 > :nth-child(1), +.lvl-4 > :nth-child(2), +.lvl-4 > :nth-child(3), +.lvl-4 > :nth-child(5){ + display: none; +} +.lvl-5 > :nth-child(1), +.lvl-5 > :nth-child(2), +.lvl-5 > :nth-child(3), +.lvl-5 > :nth-child(4){ + display: none; } -.inventory-table img{ - height: 100%; - max-width: 40px; - max-height: 40px; - border: 1px solid #000000; - filter: grayscale(100%) contrast(75%) brightness(20%); - background-color: black; +/* Filler item counters */ +.item-counter{ + display: table; + text-align: center; + padding: var(--item-class-padding); +} +.item-count{ + display: table-cell; + vertical-align: middle; + padding-left: 3px; + padding-right: 15px; } -.inventory-table img.acquired{ - filter: none; - background-color: black; +/* Hidden items */ +.hidden-class:not(:has(img.acquired)){ + display: none; +} +.hidden-item:not(.acquired){ + display:none; } -.inventory-table .tint-terran img.acquired { - filter: sepia(100%) saturate(300%) brightness(130%) hue-rotate(120deg) +/* Keys */ +#keys ol, #keys ul{ + columns: 3; + -webkit-columns: 3; + -moz-columns: 3; +} +#keys li{ + padding-right: 15pt; } -.inventory-table .tint-protoss img.acquired { - filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(180deg) +/* Locations */ +#section-locations{ + padding-left: 5px; +} +@media only screen and (min-width: 120ch){ + #section-locations ul{ + columns: 2; + -webkit-columns: 2; + -moz-columns: 2; + } +} +#locations li.checked{ + list-style-type: "✔ "; } -.inventory-table .tint-level-1 img.acquired { - filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(60deg) -} - -.inventory-table .tint-level-2 img.acquired { - filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(60deg) hue-rotate(120deg) -} - -.inventory-table .tint-level-3 img.acquired { - filter: sepia(100%) saturate(1000%) brightness(110%) hue-rotate(60deg) hue-rotate(240deg) -} - -.inventory-table div.counted-item { - position: relative; -} - -.inventory-table div.item-count { - width: 160px; - text-align: left; - color: black; - font-family: "JuraBook", monospace; - font-weight: bold; -} - -#location-table{ - border: 2px solid #000000; - border-radius: 4px; - background-color: #87b678; - padding: 10px 3px 3px; - font-family: "JuraBook", monospace; - font-size: 16px; - font-weight: bold; - cursor: default; -} - -#location-table table{ - width: 100%; -} - -#location-table th{ - vertical-align: middle; - text-align: left; - padding-right: 10px; -} - -#location-table td{ - padding-top: 2px; - padding-bottom: 2px; - line-height: 20px; -} - -#location-table td.counter { - text-align: right; - font-size: 14px; -} - -#location-table td.toggle-arrow { - text-align: right; -} - -#location-table tr#Total-header { - font-weight: bold; -} - -#location-table img{ - height: 100%; - max-width: 30px; - max-height: 30px; -} - -#location-table tbody.locations { - font-size: 16px; -} - -#location-table td.location-name { - padding-left: 16px; -} - -#location-table td:has(.location-column) { - vertical-align: top; -} - -#location-table .location-column { - width: 100%; - height: 100%; -} - -#location-table .location-column .spacer { - min-height: 24px; -} - -.hide { - display: none; -} +/* Allowing scrolling down a little further */ +.bottom-padding{ + min-height: 33vh; +} \ No newline at end of file diff --git a/WebHostLib/static/styles/sc2TrackerAtlas.css b/WebHostLib/static/styles/sc2TrackerAtlas.css new file mode 100644 index 0000000000..7fc8746f6f --- /dev/null +++ b/WebHostLib/static/styles/sc2TrackerAtlas.css @@ -0,0 +1,3965 @@ +.abilityicon_spawnbanelings_square-png{ + clip-path: xywh(0 0.0% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.93694829760403%); +} + +.abilityicon_spawnbroodlings_square-png{ + clip-path: xywh(0 0.12610340479192939% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.810844892812106%); +} + +.biomassrecovery_coop-png{ + clip-path: xywh(0 0.25220680958385877% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.68474148802018%); +} + +.btn-ability-dehaka-airbonusdamage-png{ + clip-path: xywh(0 0.37831021437578816% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.558638083228246%); +} + +.btn-ability-hornerhan-fleethyperjump-png{ + clip-path: xywh(0 0.5044136191677175% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.43253467843632%); +} + +.btn-ability-hornerhan-raven-analyzetarget-png{ + clip-path: xywh(0 0.6305170239596469% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.306431273644385%); +} + +.btn-ability-hornerhan-reaper-flightmode-png{ + clip-path: xywh(0 0.7566204287515763% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.18032786885246%); +} + +.btn-ability-hornerhan-salvagebonus-png{ + clip-path: xywh(0 0.8827238335435057% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 49.05422446406053%); +} + +.btn-ability-hornerhan-viking-missileupgrade-png{ + clip-path: xywh(0 1.008827238335435% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.9281210592686%); +} + +.btn-ability-hornerhan-viking-piercingattacks-png{ + clip-path: xywh(0 1.1349306431273645% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.80201765447667%); +} + +.btn-ability-hornerhan-widowmine-attackrange-png{ + clip-path: xywh(0 1.2610340479192939% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.675914249684745%); +} + +.btn-ability-hornerhan-widowmine-deathblossom-png{ + clip-path: xywh(0 1.3871374527112232% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.54981084489281%); +} + +.btn-ability-hornerhan-wraith-attackspeed-png{ + clip-path: xywh(0 1.5132408575031526% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.423707440100884%); +} + +.btn-ability-kerrigan-abilityefficiency-png{ + clip-path: xywh(0 1.639344262295082% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.29760403530895%); +} + +.btn-ability-kerrigan-apocalypse-png{ + clip-path: xywh(0 1.7654476670870114% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.17150063051702%); +} + +.btn-ability-kerrigan-automatedextractors-png{ + clip-path: xywh(0 1.8915510718789408% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 48.0453972257251%); +} + +.btn-ability-kerrigan-broodlingnest-png{ + clip-path: xywh(0 2.01765447667087% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.91929382093316%); +} + +.btn-ability-kerrigan-droppods-png{ + clip-path: xywh(0 2.1437578814627996% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.793190416141236%); +} + +.btn-ability-kerrigan-fury-png{ + clip-path: xywh(0 2.269861286254729% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.66708701134931%); +} + +.btn-ability-kerrigan-heroicfortitude-png{ + clip-path: xywh(0 2.3959646910466583% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.540983606557376%); +} + +.btn-ability-kerrigan-improvedoverlords-png{ + clip-path: xywh(0 2.5220680958385877% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.41488020176545%); +} + +.btn-ability-kerrigan-kineticblast-png{ + clip-path: xywh(0 2.648171500630517% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.288776796973515%); +} + +.btn-ability-kerrigan-leapingstrike-png{ + clip-path: xywh(0 2.7742749054224465% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.16267339218159%); +} + +.btn-ability-kerrigan-malignantcreep-png{ + clip-path: xywh(0 2.900378310214376% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 47.03656998738966%); +} + +.btn-ability-kerrigan-psychicshift-png{ + clip-path: xywh(0 3.0264817150063053% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.91046658259773%); +} + +.btn-ability-kerrigan-revive-png{ + clip-path: xywh(0 3.1525851197982346% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.7843631778058%); +} + +.btn-ability-kerrigan-twindrones-png{ + clip-path: xywh(0 3.278688524590164% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.658259773013874%); +} + +.btn-ability-kerrigan-vespeneefficiency-png{ + clip-path: xywh(0 3.4047919293820934% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.53215636822194%); +} + +.btn-ability-kerrigan-wildmutation-png{ + clip-path: xywh(0 3.530895334174023% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.406052963430014%); +} + +.btn-ability-kerrigan-zerglingreconstitution-png{ + clip-path: xywh(0 3.656998738965952% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.27994955863808%); +} + +.btn-ability-mengsk-battlecruiser-decksights-png{ + clip-path: xywh(0 3.7831021437578816% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.15384615384615%); +} + +.btn-ability-mengsk-ghost-pyrokineticimmolation_orange-png{ + clip-path: xywh(0 3.909205548549811% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 46.02774274905423%); +} + +.btn-ability-mengsk-ghost-staticempblast-png{ + clip-path: xywh(0 4.03530895334174% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.90163934426229%); +} + +.btn-ability-mengsk-ghost-tacticalmissilestrike-png{ + clip-path: xywh(0 4.16141235813367% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.775535939470366%); +} + +.btn-ability-mengsk-medivac-doublehealbeam-png{ + clip-path: xywh(0 4.287515762925599% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.64943253467844%); +} + +.btn-ability-mengsk-medivac-igniteafterburners-png{ + clip-path: xywh(0 4.4136191677175285% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.523329129886505%); +} + +.btn-ability-mengsk-siegetank-flyingtankarmament-png{ + clip-path: xywh(0 4.539722572509458% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.39722572509458%); +} + +.btn-ability-mengsk-viking-speed-png{ + clip-path: xywh(0 4.665825977301387% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.27112232030265%); +} + +.btn-ability-nova-domination-png{ + clip-path: xywh(0 4.791929382093317% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.14501891551072%); +} + +.btn-ability-protoss-adept-spiritform-png{ + clip-path: xywh(0 4.918032786885246% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 45.01891551071879%); +} + +.btn-ability-protoss-astralwind-png{ + clip-path: xywh(0 5.044136191677175% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.89281210592686%); +} + +.btn-ability-protoss-barrier-upgraded-png{ + clip-path: xywh(0 5.170239596469105% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.76670870113493%); +} + +.btn-ability-protoss-blink-color-png{ + clip-path: xywh(0 5.296343001261034% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.640605296343004%); +} + +.btn-ability-protoss-blinkshieldrestore-png{ + clip-path: xywh(0 5.422446406052964% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.51450189155107%); +} + +.btn-ability-protoss-carrierrepairdrones-png{ + clip-path: xywh(0 5.548549810844893% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.388398486759144%); +} + +.btn-ability-protoss-chargedblast-png{ + clip-path: xywh(0 5.674653215636822% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.26229508196721%); +} + +.btn-ability-protoss-coronabeam-png{ + clip-path: xywh(0 5.800756620428752% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.13619167717528%); +} + +.btn-ability-protoss-disintegration-png{ + clip-path: xywh(0 5.926860025220681% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 44.010088272383356%); +} + +.btn-ability-protoss-disruptionblast-png{ + clip-path: xywh(0 6.0529634300126105% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.88398486759142%); +} + +.btn-ability-protoss-doubleshieldrecharge-png{ + clip-path: xywh(0 6.17906683480454% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.757881462799496%); +} + +.btn-ability-protoss-dragoonchassis-png{ + clip-path: xywh(0 6.305170239596469% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.63177805800757%); +} + +.btn-ability-protoss-dualgravitonbeam-png{ + clip-path: xywh(0 6.431273644388399% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.505674653215635%); +} + +.btn-ability-protoss-entomb-png{ + clip-path: xywh(0 6.557377049180328% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.37957124842371%); +} + +.btn-ability-protoss-feedback-color-png{ + clip-path: xywh(0 6.683480453972257% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.25346784363178%); +} + +.btn-ability-protoss-firebeam-png{ + clip-path: xywh(0 6.809583858764187% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.12736443883985%); +} + +.btn-ability-protoss-forcefield-color-png{ + clip-path: xywh(0 6.935687263556116% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 43.00126103404792%); +} + +.btn-ability-protoss-forceofwill-png{ + clip-path: xywh(0 7.061790668348046% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.87515762925599%); +} + +.btn-ability-protoss-gravitonbeam-color-png{ + clip-path: xywh(0 7.187894073139975% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.74905422446406%); +} + +.btn-ability-protoss-hallucination-color-png{ + clip-path: xywh(0 7.313997477931904% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.622950819672134%); +} + +.btn-ability-protoss-lightningdash-png{ + clip-path: xywh(0 7.440100882723834% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.4968474148802%); +} + +.btn-ability-protoss-massrecall-png{ + clip-path: xywh(0 7.566204287515763% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.37074401008827%); +} + +.btn-ability-protoss-mindblast-png{ + clip-path: xywh(0 7.6923076923076925% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.24464060529634%); +} + +.btn-ability-protoss-oracle-stasiscalibration-png{ + clip-path: xywh(0 7.818411097099622% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 42.11853720050441%); +} + +.btn-ability-protoss-oraclepulsarcannonon-png{ + clip-path: xywh(0 7.944514501891551% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.992433795712486%); +} + +.btn-ability-protoss-phantomdash-png{ + clip-path: xywh(0 8.07061790668348% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.86633039092055%); +} + +.btn-ability-protoss-prismaticrange-png{ + clip-path: xywh(0 8.19672131147541% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.740226986128626%); +} + +.btn-ability-protoss-purify-png{ + clip-path: xywh(0 8.32282471626734% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.6141235813367%); +} + +.btn-ability-protoss-recallondeath-png{ + clip-path: xywh(0 8.448928121059268% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.488020176544765%); +} + +.btn-ability-protoss-reclamation-png{ + clip-path: xywh(0 8.575031525851198% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.36191677175284%); +} + +.btn-ability-protoss-shadowdash-png{ + clip-path: xywh(0 8.701134930643127% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.23581336696091%); +} + +.btn-ability-protoss-shadowfury-png{ + clip-path: xywh(0 8.827238335435057% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 41.10970996216898%); +} + +.btn-ability-protoss-shieldrecharge-png{ + clip-path: xywh(0 8.953341740226985% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.98360655737705%); +} + +.btn-ability-protoss-stasistrap-png{ + clip-path: xywh(0 9.079445145018916% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.85750315258512%); +} + +.btn-ability-protoss-supplicant-sacrificeon-png{ + clip-path: xywh(0 9.205548549810844% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.73139974779319%); +} + +.btn-ability-protoss-veilofshadowsvorazun-png{ + clip-path: xywh(0 9.331651954602775% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.60529634300126%); +} + +.btn-ability-protoss-voidstasis-png{ + clip-path: xywh(0 9.457755359394703% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.47919293820933%); +} + +.btn-ability-protoss-vulcanblaster-png{ + clip-path: xywh(0 9.583858764186633% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.3530895334174%); +} + +.btn-ability-protoss-warprelocatelvl2-png{ + clip-path: xywh(0 9.709962168978562% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.22698612862547%); +} + +.btn-ability-protoss-whirlwind-png{ + clip-path: xywh(0 9.836065573770492% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 40.10088272383354%); +} + +.btn-ability-spearofadun-chronomancy-png{ + clip-path: xywh(0 9.96216897856242% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.974779319041616%); +} + +.btn-ability-spearofadun-chronosurge-png{ + clip-path: xywh(0 10.08827238335435% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.84867591424968%); +} + +.btn-ability-spearofadun-deploypylon-png{ + clip-path: xywh(0 10.21437578814628% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.722572509457756%); +} + +.btn-ability-spearofadun-guardianshell-png{ + clip-path: xywh(0 10.34047919293821% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.59646910466583%); +} + +.btn-ability-spearofadun-massrecall-png{ + clip-path: xywh(0 10.466582597730138% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.470365699873895%); +} + +.btn-ability-spearofadun-matrixoverload-png{ + clip-path: xywh(0 10.592686002522068% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.34426229508197%); +} + +.btn-ability-spearofadun-nexusovercharge-png{ + clip-path: xywh(0 10.718789407313997% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.21815889029004%); +} + +.btn-ability-spearofadun-orbitalassimilator-png{ + clip-path: xywh(0 10.844892812105927% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 39.09205548549811%); +} + +.btn-ability-spearofadun-orbitalstrike-png{ + clip-path: xywh(0 10.970996216897856% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.96595208070618%); +} + +.btn-ability-spearofadun-purifierbeam-png{ + clip-path: xywh(0 11.097099621689786% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.83984867591425%); +} + +.btn-ability-spearofadun-reconstructionbeam-png{ + clip-path: xywh(0 11.223203026481714% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.71374527112232%); +} + +.btn-ability-spearofadun-shieldovercharge-png{ + clip-path: xywh(0 11.349306431273645% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.58764186633039%); +} + +.btn-ability-spearofadun-solarbombardment-png{ + clip-path: xywh(0 11.475409836065573% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.46153846153846%); +} + +.btn-ability-spearofadun-solarlance-png{ + clip-path: xywh(0 11.601513240857503% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.33543505674653%); +} + +.btn-ability-spearofadun-temporalfield-png{ + clip-path: xywh(0 11.727616645649432% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.2093316519546%); +} + +.btn-ability-spearofadun-timestop-png{ + clip-path: xywh(0 11.853720050441362% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 38.08322824716267%); +} + +.btn-ability-spearofadun-warpharmonization-png{ + clip-path: xywh(0 11.97982345523329% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.957124842370746%); +} + +.btn-ability-spearofadun-warpinreinforcements-png{ + clip-path: xywh(0 12.105926860025221% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.83102143757881%); +} + +.btn-ability-stetmann-banelingmanashield-png{ + clip-path: xywh(0 12.23203026481715% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.704918032786885%); +} + +.btn-ability-stetmann-corruptormissilebarrage-png{ + clip-path: xywh(0 12.35813366960908% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.57881462799496%); +} + +.btn-ability-stukov-plaugedmunitions-png{ + clip-path: xywh(0 12.484237074401008% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.452711223203025%); +} + +.btn-ability-swarm-kerrigan-chainreaction-png{ + clip-path: xywh(0 12.610340479192939% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.3266078184111%); +} + +.btn-ability-swarm-kerrigan-crushinggrip-png{ + clip-path: xywh(0 12.736443883984867% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.20050441361917%); +} + +.btn-ability-terran-calldownextrasupplies-color-png{ + clip-path: xywh(0 12.862547288776797% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 37.07440100882724%); +} + +.btn-ability-terran-cloak-color-png{ + clip-path: xywh(0 12.988650693568726% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.94829760403531%); +} + +.btn-ability-terran-detectionconedebuff-png{ + clip-path: xywh(0 13.114754098360656% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.82219419924338%); +} + +.btn-ability-terran-electricfield-png{ + clip-path: xywh(0 13.240857503152585% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.69609079445145%); +} + +.btn-ability-terran-emergencythrusters-png{ + clip-path: xywh(0 13.366960907944515% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.56998738965952%); +} + +.btn-ability-terran-emp-color-png{ + clip-path: xywh(0 13.493064312736443% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.44388398486759%); +} + +.btn-ability-terran-goliath-jetpack-png{ + clip-path: xywh(0 13.619167717528374% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.31778058007566%); +} + +.btn-ability-terran-hercules-tacticaljump-png{ + clip-path: xywh(0 13.745271122320302% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.19167717528373%); +} + +.btn-ability-terran-ignorearmor-png{ + clip-path: xywh(0 13.871374527112232% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 36.0655737704918%); +} + +.btn-ability-terran-liftoff-png{ + clip-path: xywh(0 13.997477931904161% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.939470365699876%); +} + +.btn-ability-terran-nuclearstrike-color-png{ + clip-path: xywh(0 14.123581336696091% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.81336696090794%); +} + +.btn-ability-terran-psidisruption-png{ + clip-path: xywh(0 14.24968474148802% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.687263556116015%); +} + +.btn-ability-terran-punishergrenade-color-png{ + clip-path: xywh(0 14.37578814627995% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.56116015132409%); +} + +.btn-ability-terran-restorationscbw-png{ + clip-path: xywh(0 14.501891551071878% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.435056746532155%); +} + +.btn-ability-terran-scannersweep-color-png{ + clip-path: xywh(0 14.627994955863809% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.30895334174023%); +} + +.btn-ability-terran-shreddermissile-color-png{ + clip-path: xywh(0 14.754098360655737% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.1828499369483%); +} + +.btn-ability-terran-spidermine-png{ + clip-path: xywh(0 14.880201765447667% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 35.05674653215637%); +} + +.btn-ability-terran-stimpack-color-png{ + clip-path: xywh(0 15.006305170239596% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.93064312736444%); +} + +.btn-ability-terran-unloadall-png{ + clip-path: xywh(0 15.132408575031526% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.80453972257251%); +} + +.btn-ability-terran-warpjump-png{ + clip-path: xywh(0 15.258511979823455% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.67843631778058%); +} + +.btn-ability-terran-widowminehidden-png{ + clip-path: xywh(0 15.384615384615385% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.552332912988646%); +} + +.btn-ability-thor-330mm-png{ + clip-path: xywh(0 15.510718789407314% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.42622950819672%); +} + +.btn-ability-tychus-herc-heavyimpact-png{ + clip-path: xywh(0 15.636822194199244% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.30012610340479%); +} + +.btn-ability-tychus-medivac-png{ + clip-path: xywh(0 15.762925598991172% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.17402269861286%); +} + +.btn-ability-zeratul-avatarofform-psionicblast-png{ + clip-path: xywh(0 15.889029003783103% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 34.04791929382093%); +} + +.btn-ability-zeratul-chargedcrystal-psionicwinds-png{ + clip-path: xywh(0 16.01513240857503% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.921815889029006%); +} + +.btn-ability-zeratul-darkarchon-maelstrom-png{ + clip-path: xywh(0 16.14123581336696% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.79571248423707%); +} + +.btn-ability-zeratul-immortal-forcecannon-png{ + clip-path: xywh(0 16.26733921815889% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.669609079445145%); +} + +.btn-ability-zeratul-observer-sensorarray-png{ + clip-path: xywh(0 16.39344262295082% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.54350567465322%); +} + +.btn-ability-zeratul-topbar-serdathlegion-png{ + clip-path: xywh(0 16.51954602774275% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.417402269861284%); +} + +.btn-ability-zerg-abathur-corrosivebilelarge-png{ + clip-path: xywh(0 16.64564943253468% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.29129886506936%); +} + +.btn-ability-zerg-acidspores-png{ + clip-path: xywh(0 16.77175283732661% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.16519546027743%); +} + +.btn-ability-zerg-burrow-color-png{ + clip-path: xywh(0 16.897856242118536% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 33.0390920554855%); +} + +.btn-ability-zerg-causticspray-png{ + clip-path: xywh(0 17.023959646910466% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.91298865069357%); +} + +.btn-ability-zerg-corruption-color-png{ + clip-path: xywh(0 17.150063051702396% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.786885245901644%); +} + +.btn-ability-zerg-creepspread-png{ + clip-path: xywh(0 17.276166456494327% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.66078184110971%); +} + +.btn-ability-zerg-creepteleport-png{ + clip-path: xywh(0 17.402269861286253% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.534678436317776%); +} + +.btn-ability-zerg-darkswarm-png{ + clip-path: xywh(0 17.528373266078184% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.40857503152586%); +} + +.btn-ability-zerg-deeptunnel-png{ + clip-path: xywh(0 17.654476670870114% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.28247162673392%); +} + +.btn-ability-zerg-dehaka-essencecollector-png{ + clip-path: xywh(0 17.780580075662044% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.15636822194199%); +} + +.btn-ability-zerg-dehaka-guardian-explosivespores-png{ + clip-path: xywh(0 17.90668348045397% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 32.03026481715006%); +} + +.btn-ability-zerg-dehaka-guardian-primordialfury-png{ + clip-path: xywh(0 18.0327868852459% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.904161412358135%); +} + +.btn-ability-zerg-dehaka-impaler-tenderize-png{ + clip-path: xywh(0 18.15889029003783% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.778058007566205%); +} + +.btn-ability-zerg-dehaka-tyrannozor-barrageofspikes-png{ + clip-path: xywh(0 18.284993694829762% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.651954602774275%); +} + +.btn-ability-zerg-dehaka-tyrannozor-tyrantprotection-png{ + clip-path: xywh(0 18.41109709962169% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.525851197982345%); +} + +.btn-ability-zerg-dehaka-ultralisk-brutalcharge-png{ + clip-path: xywh(0 18.53720050441362% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.399747793190418%); +} + +.btn-ability-zerg-dehaka-ultralisk-healingadaptation-png{ + clip-path: xywh(0 18.66330390920555% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.273644388398488%); +} + +.btn-ability-zerg-dehaka-ultralisk-impalingstrike-png{ + clip-path: xywh(0 18.78940731399748% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.147540983606557%); +} + +.btn-ability-zerg-fireroach-increasefiredamage-png{ + clip-path: xywh(0 18.915510718789406% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 31.021437578814627%); +} + +.btn-ability-zerg-fungalgrowth-color-png{ + clip-path: xywh(0 19.041614123581336% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.8953341740227%); +} + +.btn-ability-zerg-genemutation-thornsaura-png{ + clip-path: xywh(0 19.167717528373267% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.76923076923077%); +} + +.btn-ability-zerg-generatecreep-color-png{ + clip-path: xywh(0 19.293820933165197% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.64312736443884%); +} + +.btn-ability-zerg-overlord-oversight-off-png{ + clip-path: xywh(0 19.419924337957124% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.51702395964691%); +} + +.btn-ability-zerg-parasiticbomb-png{ + clip-path: xywh(0 19.546027742749054% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.390920554854983%); +} + +.btn-ability-zerg-rapidregeneration-color-png{ + clip-path: xywh(0 19.672131147540984% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.264817150063053%); +} + +.btn-ability-zerg-stukov-ensnare-png{ + clip-path: xywh(0 19.798234552332914% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.138713745271122%); +} + +.btn-ability-zerg-stukov-ensnarecdr-png{ + clip-path: xywh(0 19.92433795712484% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 30.012610340479192%); +} + +.btn-ability-zerg-transfusion-color-png{ + clip-path: xywh(0 20.05044136191677% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.886506935687265%); +} + +.btn-abilty-terran-lockdownscbw-png{ + clip-path: xywh(0 20.1765447667087% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.760403530895335%); +} + +.btn-accelerated-warp-png{ + clip-path: xywh(0 20.302648171500632% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.634300126103405%); +} + +.btn-adaptive-medpacks-png{ + clip-path: xywh(0 20.42875157629256% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.508196721311474%); +} + +.btn-advanced-construction-png{ + clip-path: xywh(0 20.55485498108449% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.382093316519548%); +} + +.btn-advanced-defensive-matrix-png{ + clip-path: xywh(0 20.68095838587642% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.255989911727617%); +} + +.btn-advanced-photon-blasters-png{ + clip-path: xywh(0 20.80706179066835% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.129886506935687%); +} + +.btn-advanced-targeting-png{ + clip-path: xywh(0 20.933165195460276% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 29.003783102143757%); +} + +.btn-afterburners-valkyrie-png{ + clip-path: xywh(0 21.059268600252206% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.87767969735183%); +} + +.btn-all-terrain-treads-png{ + clip-path: xywh(0 21.185372005044137% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.7515762925599%); +} + +.btn-amonshardsarmor-png{ + clip-path: xywh(0 21.311475409836067% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.62547288776797%); +} + +.btn-anti-surface-countermeasures-png{ + clip-path: xywh(0 21.437578814627994% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.49936948297604%); +} + +.btn-apial-sensors-png{ + clip-path: xywh(0 21.563682219419924% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.373266078184113%); +} + +.btn-arc-inducers-png{ + clip-path: xywh(0 21.689785624211854% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.247162673392182%); +} + +.btn-argus-talisman-png{ + clip-path: xywh(0 21.815889029003785% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 28.121059268600252%); +} + +.btn-armor-metling-blasters-png{ + clip-path: xywh(0 21.94199243379571% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.994955863808322%); +} + +.btn-atx-batteries-png{ + clip-path: xywh(0 22.06809583858764% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.868852459016395%); +} + +.btn-automated-mitosis-lvl1-png{ + clip-path: xywh(0 22.194199243379572% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.742749054224465%); +} + +.btn-banshee-cross-spectrum-dampeners-png{ + clip-path: xywh(0 22.320302648171502% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.616645649432535%); +} + +.btn-behemoth-stellarskin-png{ + clip-path: xywh(0 22.44640605296343% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.490542244640604%); +} + +.btn-blood-amulet-png{ + clip-path: xywh(0 22.57250945775536% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.364438839848678%); +} + +.btn-building-protoss-photoncannon-png{ + clip-path: xywh(0 22.69861286254729% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.238335435056747%); +} + +.btn-building-protoss-shieldbattery-png{ + clip-path: xywh(0 22.82471626733922% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 27.112232030264817%); +} + +.btn-building-stukov-infestedbunker-png{ + clip-path: xywh(0 22.950819672131146% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.986128625472887%); +} + +.btn-building-stukov-infestedturret-png{ + clip-path: xywh(0 23.076923076923077% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.86002522068096%); +} + +.btn-building-terran-autoturret-png{ + clip-path: xywh(0 23.203026481715007% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.73392181588903%); +} + +.btn-building-terran-bunker-png{ + clip-path: xywh(0 23.329129886506937% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.6078184110971%); +} + +.btn-building-terran-bunkerneosteel-png{ + clip-path: xywh(0 23.455233291298864% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.48171500630517%); +} + +.btn-building-terran-hivemindemulator-png{ + clip-path: xywh(0 23.581336696090794% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.355611601513242%); +} + +.btn-building-terran-missileturret-png{ + clip-path: xywh(0 23.707440100882724% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.229508196721312%); +} + +.btn-building-terran-planetaryfortress-png{ + clip-path: xywh(0 23.833543505674655% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 26.103404791929382%); +} + +.btn-building-terran-refineryautomated-png{ + clip-path: xywh(0 23.95964691046658% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.97730138713745%); +} + +.btn-building-terran-sensordome-png{ + clip-path: xywh(0 24.08575031525851% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.851197982345525%); +} + +.btn-building-terran-sigmaprojector-png{ + clip-path: xywh(0 24.211853720050442% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.725094577553595%); +} + +.btn-building-terran-techreactor-png{ + clip-path: xywh(0 24.337957124842372% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.598991172761664%); +} + +.btn-building-zerg-hive-png{ + clip-path: xywh(0 24.4640605296343% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.472887767969734%); +} + +.btn-building-zerg-nydusworm-png{ + clip-path: xywh(0 24.59016393442623% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.346784363177807%); +} + +.btn-building-zerg-spinecrawler-png{ + clip-path: xywh(0 24.71626733921816% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.220680958385877%); +} + +.btn-building-zerg-sporecannon-png{ + clip-path: xywh(0 24.84237074401009% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 25.094577553593947%); +} + +.btn-building-zerg-sporecrawler-png{ + clip-path: xywh(0 24.968474148802017% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.968474148802017%); +} + +.btn-caladrius-structure-png{ + clip-path: xywh(0 25.094577553593947% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.84237074401009%); +} + +.btn-chronostatic-reinforcement-png{ + clip-path: xywh(0 25.220680958385877% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.71626733921816%); +} + +.btn-command-cancel-png{ + clip-path: xywh(0 25.346784363177807% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.59016393442623%); +} + +.btn-concentrated-antimatter-png{ + clip-path: xywh(0 25.472887767969734% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.4640605296343%); +} + +.btn-disintegrating-particles-png{ + clip-path: xywh(0 25.598991172761664% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.337957124842372%); +} + +.btn-disruptor-dispersion-png{ + clip-path: xywh(0 25.725094577553595% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.211853720050442%); +} + +.btn-endless-servitude-png{ + clip-path: xywh(0 25.851197982345525% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 24.08575031525851%); +} + +.btn-enhanced-servo-striders-png{ + clip-path: xywh(0 25.97730138713745% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.95964691046658%); +} + +.btn-enhanced-shield-generator-png{ + clip-path: xywh(0 26.103404791929382% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.833543505674655%); +} + +.btn-eye-of-wrath-png{ + clip-path: xywh(0 26.229508196721312% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.707440100882724%); +} + +.btn-fire-suppression-system-lvl2-png{ + clip-path: xywh(0 26.355611601513242% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.581336696090794%); +} + +.btn-fleshfused-targeting-optics-png{ + clip-path: xywh(0 26.48171500630517% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.455233291298864%); +} + +.btn-forged-chassis-png{ + clip-path: xywh(0 26.6078184110971% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.329129886506937%); +} + +.btn-gaping-maw-png{ + clip-path: xywh(0 26.73392181588903% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.203026481715007%); +} + +.btn-gravitic-thrusters-png{ + clip-path: xywh(0 26.86002522068096% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 23.076923076923077%); +} + +.btn-high-explosive-munition-png{ + clip-path: xywh(0 26.986128625472887% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.950819672131146%); +} + +.btn-high-voltage-capacitors-png{ + clip-path: xywh(0 27.112232030264817% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.82471626733922%); +} + +.btn-hostile-environment-adaptation-png{ + clip-path: xywh(0 27.238335435056747% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.69861286254729%); +} + +.btn-hull-of-past-glories-png{ + clip-path: xywh(0 27.364438839848678% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.57250945775536%); +} + +.btn-hunter-seeker-weapon-png{ + clip-path: xywh(0 27.490542244640604% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.44640605296343%); +} + +.btn-iconic-wavelength-flux-png{ + clip-path: xywh(0 27.616645649432535% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.320302648171502%); +} + +.btn-improved-osmosis-png{ + clip-path: xywh(0 27.742749054224465% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.194199243379572%); +} + +.btn-infested-liberator-ag-png{ + clip-path: xywh(0 27.868852459016395% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 22.06809583858764%); +} + +.btn-integrated-power-png{ + clip-path: xywh(0 27.994955863808322% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.94199243379571%); +} + +.btn-jerry-rigged-patchjob-png{ + clip-path: xywh(0 28.121059268600252% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.815889029003785%); +} + +.btn-juggernaut-plating-herc-png{ + clip-path: xywh(0 28.247162673392182% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.689785624211854%); +} + +.btn-juggernaut-plating-marauder-png{ + clip-path: xywh(0 28.373266078184113% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.563682219419924%); +} + +.btn-jump-png{ + clip-path: xywh(0 28.49936948297604% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.437578814627994%); +} + +.btn-kryhas-cloak-png{ + clip-path: xywh(0 28.62547288776797% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.311475409836067%); +} + +.btn-latticed-shielding-png{ + clip-path: xywh(0 28.7515762925599% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.185372005044137%); +} + +.btn-launch-vector-compensator-png{ + clip-path: xywh(0 28.87767969735183% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 21.059268600252206%); +} + +.btn-lesser-shadow-fury-png{ + clip-path: xywh(0 29.003783102143757% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.933165195460276%); +} + +.btn-magellan-computation-systems-png{ + clip-path: xywh(0 29.129886506935687% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.80706179066835%); +} + +.btn-mobility-protocols-png{ + clip-path: xywh(0 29.255989911727617% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.68095838587642%); +} + +.btn-modernized-servos-png{ + clip-path: xywh(0 29.382093316519548% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.55485498108449%); +} + +.btn-moirai-impulse-drive-png{ + clip-path: xywh(0 29.508196721311474% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.42875157629256%); +} + +.btn-monstrous-resilience-aberration-png{ + clip-path: xywh(0 29.634300126103405% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.302648171500632%); +} + +.btn-monstrous-resilience-corruptor-png{ + clip-path: xywh(0 29.760403530895335% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.1765447667087%); +} + +.btn-neutron-shields-png{ + clip-path: xywh(0 29.886506935687265% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 20.05044136191677%); +} + +.btn-null-shroud-png{ + clip-path: xywh(0 30.012610340479192% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.92433795712484%); +} + +.btn-obliterate-png{ + clip-path: xywh(0 30.138713745271122% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.798234552332914%); +} + +.btn-orbital-fortress-png{ + clip-path: xywh(0 30.264817150063053% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.672131147540984%); +} + +.btn-pacification-protocols-png{ + clip-path: xywh(0 30.390920554854983% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.546027742749054%); +} + +.btn-peer-contempt-png{ + clip-path: xywh(0 30.51702395964691% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.419924337957124%); +} + +.btn-permacloak-banshee-png{ + clip-path: xywh(0 30.64312736443884% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.293820933165197%); +} + +.btn-permacloak-ghost-png{ + clip-path: xywh(0 30.76923076923077% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.167717528373267%); +} + +.btn-permacloak-medivac-png{ + clip-path: xywh(0 30.8953341740227% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 19.041614123581336%); +} + +.btn-permacloak-reaper-png{ + clip-path: xywh(0 31.021437578814627% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.915510718789406%); +} + +.btn-permacloak-spectre-png{ + clip-path: xywh(0 31.147540983606557% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.78940731399748%); +} + +.btn-permacloak-wraith-png{ + clip-path: xywh(0 31.273644388398488% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.66330390920555%); +} + +.btn-phase-blaster-png{ + clip-path: xywh(0 31.399747793190418% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.53720050441362%); +} + +.btn-phase-cloak-png{ + clip-path: xywh(0 31.525851197982345% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.41109709962169%); +} + +.btn-prescient-spores-png{ + clip-path: xywh(0 31.651954602774275% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.284993694829762%); +} + +.btn-progression-hornerhan-6-mirabuildtime-png{ + clip-path: xywh(0 31.778058007566205% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.15889029003783%); +} + +.btn-progression-protoss-fenix-1-zealotsuit-png{ + clip-path: xywh(0 31.904161412358135% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 18.0327868852459%); +} + +.btn-progression-protoss-fenix-6-forgeresearch-png{ + clip-path: xywh(0 32.03026481715006% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.90668348045397%); +} + +.btn-progression-zerg-dehaka-15-genemutation-png{ + clip-path: xywh(0 32.156368221941996% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.780580075662044%); +} + +.btn-progression-zerg-dehaka-7-newdehakaabilities-png{ + clip-path: xywh(0 32.28247162673392% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.65447667087011%); +} + +.btn-propellant-sacs-png{ + clip-path: xywh(0 32.40857503152585% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.528373266078184%); +} + +.btn-rapid-metamorph-png{ + clip-path: xywh(0 32.53467843631778% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.402269861286257%); +} + +.btn-regenerativebiosteel-blue-png{ + clip-path: xywh(0 32.66078184110971% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.276166456494323%); +} + +.btn-regenerativebiosteel-green-png{ + clip-path: xywh(0 32.78688524590164% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.150063051702396%); +} + +.btn-reintigrated-framework-png{ + clip-path: xywh(0 32.91298865069357% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 17.02395964691047%); +} + +.btn-research-terran-commandcenterreactor-png{ + clip-path: xywh(0 33.0390920554855% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.897856242118536%); +} + +.btn-research-terran-microfiltering-png{ + clip-path: xywh(0 33.16519546027743% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.77175283732661%); +} + +.btn-research-terran-orbitaldepots-png{ + clip-path: xywh(0 33.29129886506936% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.645649432534675%); +} + +.btn-research-terran-orbitalstrikerally-png{ + clip-path: xywh(0 33.417402269861284% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.51954602774275%); +} + +.btn-research-terran-ultracapacitors-png{ + clip-path: xywh(0 33.54350567465322% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.393442622950822%); +} + +.btn-research-terran-vanadiumplating-png{ + clip-path: xywh(0 33.669609079445145% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.267339218158888%); +} + +.btn-research-zerg-cellularreactor-png{ + clip-path: xywh(0 33.79571248423707% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.14123581336696%); +} + +.btn-research-zerg-fortifiedbunker-png{ + clip-path: xywh(0 33.921815889029006% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 16.015132408575035%); +} + +.btn-research-zerg-regenerativebio-steel-png{ + clip-path: xywh(0 34.04791929382093% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.8890290037831%); +} + +.btn-rogue-forces-png{ + clip-path: xywh(0 34.17402269861286% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.762925598991174%); +} + +.btn-royalliberator-png{ + clip-path: xywh(0 34.30012610340479% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.63682219419924%); +} + +.btn-scatter-veil-png{ + clip-path: xywh(0 34.42622950819672% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.510718789407314%); +} + +.btn-scv-cliffjump-png{ + clip-path: xywh(0 34.55233291298865% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.384615384615387%); +} + +.btn-seismic-sonar-png{ + clip-path: xywh(0 34.67843631778058% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.258511979823453%); +} + +.btn-shadow-guard-training-png{ + clip-path: xywh(0 34.80453972257251% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.132408575031526%); +} + +.btn-shield-capacity-png{ + clip-path: xywh(0 34.93064312736444% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 15.0063051702396%); +} + +.btn-side-missiles-png{ + clip-path: xywh(0 35.05674653215637% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.880201765447666%); +} + +.btn-skyward-chronoanomaly-png{ + clip-path: xywh(0 35.182849936948294% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.754098360655739%); +} + +.btn-solarite-lens-png{ + clip-path: xywh(0 35.30895334174023% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.627994955863805%); +} + +.btn-solarite-payload-png{ + clip-path: xywh(0 35.435056746532155% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.501891551071878%); +} + +.btn-stabilized-electrodes-png{ + clip-path: xywh(0 35.56116015132409% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.375788146279952%); +} + +.btn-sustaining-disruption-png{ + clip-path: xywh(0 35.687263556116015% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.249684741488018%); +} + +.btn-techupgrade-kinetic-foam-png{ + clip-path: xywh(0 35.81336696090794% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 14.123581336696091%); +} + +.btn-techupgrade-terran-cloakdistortionfield-color-png{ + clip-path: xywh(0 35.939470365699876% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.997477931904164%); +} + +.btn-techupgrade-terran-combatshield-color-png{ + clip-path: xywh(0 36.0655737704918% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.87137452711223%); +} + +.btn-techupgrade-terran-hellstormbatteries-color-png{ + clip-path: xywh(0 36.19167717528373% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.745271122320304%); +} + +.btn-techupgrade-terran-immortalityprotocol-color-png{ + clip-path: xywh(0 36.31778058007566% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.61916771752837%); +} + +.btn-techupgrade-terran-impalerrounds-color-png{ + clip-path: xywh(0 36.44388398486759% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.493064312736443%); +} + +.btn-techupgrade-terran-missilepods-color-level1-png{ + clip-path: xywh(0 36.569987389659524% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.366960907944517%); +} + +.btn-techupgrade-terran-ocularimplants-png{ + clip-path: xywh(0 36.69609079445145% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.240857503152583%); +} + +.btn-techupgrade-terran-psioniclash-color-png{ + clip-path: xywh(0 36.82219419924338% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 13.114754098360656%); +} + +.btn-techupgrade-terran-rapiddeployment-color-png{ + clip-path: xywh(0 36.94829760403531% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.98865069356873%); +} + +.btn-techupgrade-terran-shapedblast-color-png{ + clip-path: xywh(0 37.07440100882724% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.862547288776796%); +} + +.btn-techupgrade-terran-shapedhull-colored-png{ + clip-path: xywh(0 37.200504413619164% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.736443883984869%); +} + +.btn-techupgrade-terran-titaniumhousing-color-png{ + clip-path: xywh(0 37.3266078184111% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.610340479192935%); +} + +.btn-techupgrade-terran-tomahawkpowercell-color-png{ + clip-path: xywh(0 37.452711223203025% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.484237074401008%); +} + +.btn-techupgrade-terran-u238rounds-color-png{ + clip-path: xywh(0 37.57881462799496% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.358133669609082%); +} + +.btn-tips-armory-png{ + clip-path: xywh(0 37.704918032786885% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.232030264817148%); +} + +.btn-tips-flamingbetty-png{ + clip-path: xywh(0 37.83102143757881% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 12.105926860025221%); +} + +.btn-tips-laserdrillantiair-png{ + clip-path: xywh(0 37.957124842370746% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.979823455233294%); +} + +.btn-tips-terran-energynova-png{ + clip-path: xywh(0 38.08322824716267% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.85372005044136%); +} + +.btn-twilight-chassis-png{ + clip-path: xywh(0 38.2093316519546% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.727616645649434%); +} + +.btn-ued-rocketry-technology-png{ + clip-path: xywh(0 38.33543505674653% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.6015132408575%); +} + +.btn-ultrasonic-pulse-color-png{ + clip-path: xywh(0 38.46153846153846% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.475409836065573%); +} + +.btn-unit-biomechanicaldrone-png{ + clip-path: xywh(0 38.587641866330394% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.349306431273646%); +} + +.btn-unit-collection-primal-roachupgrade-png{ + clip-path: xywh(0 38.71374527112232% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.223203026481713%); +} + +.btn-unit-collection-primal-tyrannozor-png{ + clip-path: xywh(0 38.83984867591425% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 11.097099621689786%); +} + +.btn-unit-collection-probe-remastered-png{ + clip-path: xywh(0 38.96595208070618% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.97099621689786%); +} + +.btn-unit-collection-purifier-carrier-png{ + clip-path: xywh(0 39.09205548549811% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.844892812105925%); +} + +.btn-unit-collection-purifier-disruptor-png{ + clip-path: xywh(0 39.218158890290034% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.718789407313999%); +} + +.btn-unit-collection-purifier-immortal-png{ + clip-path: xywh(0 39.34426229508197% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.592686002522065%); +} + +.btn-unit-collection-taldarim-carrier-png{ + clip-path: xywh(0 39.470365699873895% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.466582597730138%); +} + +.btn-unit-collection-taldarim-phoenix-png{ + clip-path: xywh(0 39.59646910466583% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.340479192938211%); +} + +.btn-unit-collection-vikingfighter-covertops-png{ + clip-path: xywh(0 39.722572509457756% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.214375788146278%); +} + +.btn-unit-collection-wraith-junker-png{ + clip-path: xywh(0 39.84867591424968% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 10.08827238335435%); +} + +.btn-unit-hunterling-png{ + clip-path: xywh(0 39.974779319041616% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.962168978562424%); +} + +.btn-unit-infested-infestedmedic-png{ + clip-path: xywh(0 40.10088272383354% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.83606557377049%); +} + +.btn-unit-protoss-adept-purifier-png{ + clip-path: xywh(0 40.22698612862547% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.709962168978564%); +} + +.btn-unit-protoss-alarak-taldarim-supplicant-png{ + clip-path: xywh(0 40.3530895334174% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.58385876418663%); +} + +.btn-unit-protoss-arbiter-png{ + clip-path: xywh(0 40.47919293820933% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.457755359394703%); +} + +.btn-unit-protoss-archon-upgraded-png{ + clip-path: xywh(0 40.605296343001264% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.331651954602776%); +} + +.btn-unit-protoss-archon-png{ + clip-path: xywh(0 40.73139974779319% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.205548549810842%); +} + +.btn-unit-protoss-carrier-png{ + clip-path: xywh(0 40.85750315258512% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 9.079445145018916%); +} + +.btn-unit-protoss-colossus-taldarim-png{ + clip-path: xywh(0 40.98360655737705% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.953341740226989%); +} + +.btn-unit-protoss-colossus-png{ + clip-path: xywh(0 41.10970996216898% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.827238335435055%); +} + +.btn-unit-protoss-corsair-png{ + clip-path: xywh(0 41.235813366960905% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.701134930643128%); +} + +.btn-unit-protoss-darktemplar-aiur-png{ + clip-path: xywh(0 41.36191677175284% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.575031525851195%); +} + +.btn-unit-protoss-darktemplar-taldarim-png{ + clip-path: xywh(0 41.488020176544765% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.448928121059268%); +} + +.btn-unit-protoss-darktemplar-png{ + clip-path: xywh(0 41.6141235813367% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.322824716267341%); +} + +.btn-unit-protoss-dragoon-void-png{ + clip-path: xywh(0 41.740226986128626% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.196721311475407%); +} + +.btn-unit-protoss-fenix-png{ + clip-path: xywh(0 41.86633039092055% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 8.07061790668348%); +} + +.btn-unit-protoss-hightemplar-nerazim-png{ + clip-path: xywh(0 41.992433795712486% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.944514501891554%); +} + +.btn-unit-protoss-hightemplar-taldarim-png{ + clip-path: xywh(0 42.11853720050441% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.81841109709962%); +} + +.btn-unit-protoss-hightemplar-png{ + clip-path: xywh(0 42.24464060529634% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.692307692307693%); +} + +.btn-unit-protoss-immortal-nerazim-png{ + clip-path: xywh(0 42.37074401008827% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.56620428751576%); +} + +.btn-unit-protoss-immortal-taldarim-png{ + clip-path: xywh(0 42.4968474148802% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.440100882723833%); +} + +.btn-unit-protoss-immortal-png{ + clip-path: xywh(0 42.622950819672134% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.313997477931906%); +} + +.btn-unit-protoss-khaydarinmonolith-png{ + clip-path: xywh(0 42.74905422446406% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.187894073139972%); +} + +.btn-unit-protoss-mothership-taldarim-png{ + clip-path: xywh(0 42.87515762925599% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 7.061790668348046%); +} + +.btn-unit-protoss-observer-png{ + clip-path: xywh(0 43.00126103404792% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.935687263556119%); +} + +.btn-unit-protoss-oracle-png{ + clip-path: xywh(0 43.12736443883985% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.809583858764185%); +} + +.btn-unit-protoss-phoenix-purifier-png{ + clip-path: xywh(0 43.253467843631775% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.683480453972258%); +} + +.btn-unit-protoss-phoenix-png{ + clip-path: xywh(0 43.37957124842371% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.5573770491803245%); +} + +.btn-unit-protoss-probe-warpin-png{ + clip-path: xywh(0 43.505674653215635% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.431273644388398%); +} + +.btn-unit-protoss-probe-png{ + clip-path: xywh(0 43.63177805800757% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.305170239596471%); +} + +.btn-unit-protoss-reaver-png{ + clip-path: xywh(0 43.757881462799496% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.179066834804537%); +} + +.btn-unit-protoss-scout-png{ + clip-path: xywh(0 43.88398486759142% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 6.0529634300126105%); +} + +.btn-unit-protoss-scoutnerazim-png{ + clip-path: xywh(0 44.010088272383356% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.926860025220684%); +} + +.btn-unit-protoss-scoutpurifier-png{ + clip-path: xywh(0 44.13619167717528% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.80075662042875%); +} + +.btn-unit-protoss-scouttaldarim-png{ + clip-path: xywh(0 44.26229508196721% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.674653215636823%); +} + +.btn-unit-protoss-sentry-purifier-png{ + clip-path: xywh(0 44.388398486759144% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.548549810844889%); +} + +.btn-unit-protoss-sentry-taldarim-png{ + clip-path: xywh(0 44.51450189155107% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.422446406052963%); +} + +.btn-unit-protoss-sentry-png{ + clip-path: xywh(0 44.640605296343004% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.296343001261036%); +} + +.btn-unit-protoss-stalker-purifier-png{ + clip-path: xywh(0 44.76670870113493% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.170239596469102%); +} + +.btn-unit-protoss-stalker-taldarim-collection-ds-png{ + clip-path: xywh(0 44.89281210592686% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 5.044136191677175%); +} + +.btn-unit-protoss-stalker-png{ + clip-path: xywh(0 45.01891551071879% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.918032786885249%); +} + +.btn-unit-protoss-tempest-purifier-png{ + clip-path: xywh(0 45.14501891551072% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.791929382093315%); +} + +.btn-unit-protoss-voidray-purifier-png{ + clip-path: xywh(0 45.271122320302645% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.665825977301388%); +} + +.btn-unit-protoss-voidray-taldarim-png{ + clip-path: xywh(0 45.39722572509458% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.539722572509454%); +} + +.btn-unit-protoss-warpprism-png{ + clip-path: xywh(0 45.523329129886505% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.413619167717528%); +} + +.btn-unit-protoss-warpray-png{ + clip-path: xywh(0 45.64943253467844% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.287515762925601%); +} + +.btn-unit-protoss-zealot-nerazim-png{ + clip-path: xywh(0 45.775535939470366% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.161412358133667%); +} + +.btn-unit-protoss-zealot-purifier-png{ + clip-path: xywh(0 45.90163934426229% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 4.03530895334174%); +} + +.btn-unit-protoss-zealot-png{ + clip-path: xywh(0 46.02774274905423% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.9092055485498136%); +} + +.btn-unit-terran-autoturretblackops-png{ + clip-path: xywh(0 46.15384615384615% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.78310214375788%); +} + +.btn-unit-terran-banshee-mengsk-png{ + clip-path: xywh(0 46.27994955863808% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.656998738965953%); +} + +.btn-unit-terran-banshee-png{ + clip-path: xywh(0 46.406052963430014% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.5308953341740192%); +} + +.btn-unit-terran-bansheemercenary-png{ + clip-path: xywh(0 46.53215636822194% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.4047919293820925%); +} + +.btn-unit-terran-battlecruiser-png{ + clip-path: xywh(0 46.658259773013874% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.278688524590166%); +} + +.btn-unit-terran-battlecruiserloki-png{ + clip-path: xywh(0 46.7843631778058% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.152585119798232%); +} + +.btn-unit-terran-battlecruisermengsk-png{ + clip-path: xywh(0 46.91046658259773% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 3.0264817150063053%); +} + +.btn-unit-terran-cobra-png{ + clip-path: xywh(0 47.03656998738966% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.9003783102143785%); +} + +.btn-unit-terran-cyclone-png{ + clip-path: xywh(0 47.16267339218159% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.7742749054224447%); +} + +.btn-unit-terran-deathhead-png{ + clip-path: xywh(0 47.288776796973515% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.648171500630518%); +} + +.btn-unit-terran-firebat-png{ + clip-path: xywh(0 47.41488020176545% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.522068095838584%); +} + +.btn-unit-terran-firebatmercenary-png{ + clip-path: xywh(0 47.540983606557376% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.3959646910466574%); +} + +.btn-unit-terran-ghost-png{ + clip-path: xywh(0 47.66708701134931% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.2698612862547307%); +} + +.btn-unit-terran-ghostmengsk-png{ + clip-path: xywh(0 47.793190416141236% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.143757881462797%); +} + +.btn-unit-terran-goliath-mengsk-png{ + clip-path: xywh(0 47.91929382093316% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 2.01765447667087%); +} + +.btn-unit-terran-goliath-png{ + clip-path: xywh(0 48.0453972257251% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.8915510718789434%); +} + +.btn-unit-terran-goliathmercenary-png{ + clip-path: xywh(0 48.17150063051702% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.7654476670870096%); +} + +.btn-unit-terran-hellion-png{ + clip-path: xywh(0 48.29760403530895% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.639344262295083%); +} + +.btn-unit-terran-hellionbattlemode-png{ + clip-path: xywh(0 48.423707440100884% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.513240857503149%); +} + +.btn-unit-terran-herc-png{ + clip-path: xywh(0 48.54981084489281% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.3871374527112224%); +} + +.btn-unit-terran-hercules-png{ + clip-path: xywh(0 48.675914249684745% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.2610340479192956%); +} + +.btn-unit-terran-liberator-png{ + clip-path: xywh(0 48.80201765447667% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.1349306431273618%); +} + +.btn-unit-terran-liberatorblackops-png{ + clip-path: xywh(0 48.9281210592686% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 1.008827238335435%); +} + +.btn-unit-terran-marauder-png{ + clip-path: xywh(0 49.05422446406053% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.8827238335435084%); +} + +.btn-unit-terran-maraudermengsk-png{ + clip-path: xywh(0 49.18032786885246% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.7566204287515745%); +} + +.btn-unit-terran-maraudermercenary-png{ + clip-path: xywh(0 49.306431273644385% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.6305170239596478%); +} + +.btn-unit-terran-marine-mengsk-png{ + clip-path: xywh(0 49.43253467843632% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.504413619167714%); +} + +.btn-unit-terran-marine-png{ + clip-path: xywh(0 49.558638083228246% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.37831021437578727%); +} + +.btn-unit-terran-marinemercenary-png{ + clip-path: xywh(0 49.68474148802018% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.25220680958386055%); +} + +.btn-unit-terran-medic-mengsk-png{ + clip-path: xywh(0 49.810844892812106% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.12610340479192672%); +} + +.btn-unit-terran-medic-png{ + clip-path: xywh(0 49.93694829760403% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, 0.0%); +} + +.btn-unit-terran-medicelite-png{ + clip-path: xywh(0 50.06305170239597% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.12610340479192672%); +} + +.btn-unit-terran-medivac-png{ + clip-path: xywh(0 50.189155107187894% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.25220680958386055%); +} + +.btn-unit-terran-merc-thor-png{ + clip-path: xywh(0 50.31525851197982% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.37831021437578727%); +} + +.btn-unit-terran-mule-png{ + clip-path: xywh(0 50.441361916771754% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.504413619167714%); +} + +.btn-unit-terran-perditionturret-png{ + clip-path: xywh(0 50.56746532156368% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.6305170239596478%); +} + +.btn-unit-terran-predator-png{ + clip-path: xywh(0 50.693568726355615% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.7566204287515745%); +} + +.btn-unit-terran-raven-png{ + clip-path: xywh(0 50.81967213114754% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -0.8827238335435084%); +} + +.btn-unit-terran-reaper-png{ + clip-path: xywh(0 50.94577553593947% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.008827238335435%); +} + +.btn-unit-terran-sciencevessel-png{ + clip-path: xywh(0 51.0718789407314% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.1349306431273618%); +} + +.btn-unit-terran-siegetank-png{ + clip-path: xywh(0 51.19798234552333% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.2610340479192956%); +} + +.btn-unit-terran-siegetankmengsk-png{ + clip-path: xywh(0 51.324085750315255% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.3871374527112224%); +} + +.btn-unit-terran-siegetankmercenary-tank-png{ + clip-path: xywh(0 51.45018915510719% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.513240857503149%); +} + +.btn-unit-terran-spectre-png{ + clip-path: xywh(0 51.576292559899116% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.639344262295083%); +} + +.btn-unit-terran-thor-png{ + clip-path: xywh(0 51.70239596469105% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.7654476670870096%); +} + +.btn-unit-terran-thormengsk-png{ + clip-path: xywh(0 51.82849936948298% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -1.8915510718789434%); +} + +.btn-unit-terran-thorsiegemode-png{ + clip-path: xywh(0 51.9546027742749% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.01765447667087%); +} + +.btn-unit-terran-troopermengsk-png{ + clip-path: xywh(0 52.08070617906684% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.143757881462797%); +} + +.btn-unit-terran-valkyriescbw-png{ + clip-path: xywh(0 52.206809583858764% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.2698612862547307%); +} + +.btn-unit-terran-vikingfighter-png{ + clip-path: xywh(0 52.33291298865069% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.3959646910466574%); +} + +.btn-unit-terran-vikingmengskfighter-png{ + clip-path: xywh(0 52.459016393442624% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.522068095838584%); +} + +.btn-unit-terran-vikingmercenary-fighter-png{ + clip-path: xywh(0 52.58511979823455% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.648171500630518%); +} + +.btn-unit-terran-vulture-png{ + clip-path: xywh(0 52.711223203026485% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.7742749054224447%); +} + +.btn-unit-terran-warhound-png{ + clip-path: xywh(0 52.83732660781841% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -2.9003783102143785%); +} + +.btn-unit-terran-widowmine-png{ + clip-path: xywh(0 52.96343001261034% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.0264817150063053%); +} + +.btn-unit-terran-wraith-mengsk-png{ + clip-path: xywh(0 53.08953341740227% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.152585119798232%); +} + +.btn-unit-terran-wraith-png{ + clip-path: xywh(0 53.2156368221942% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.278688524590166%); +} + +.btn-unit-voidray-aiur-png{ + clip-path: xywh(0 53.341740226986126% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.4047919293820925%); +} + +.btn-unit-zerg-aberration-png{ + clip-path: xywh(0 53.46784363177806% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.5308953341740192%); +} + +.btn-unit-zerg-baneling-hunter-png{ + clip-path: xywh(0 53.593947036569986% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.656998738965953%); +} + +.btn-unit-zerg-baneling-png{ + clip-path: xywh(0 53.72005044136192% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.78310214375788%); +} + +.btn-unit-zerg-broodlord-png{ + clip-path: xywh(0 53.84615384615385% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -3.9092055485498136%); +} + +.btn-unit-zerg-broodqueen-png{ + clip-path: xywh(0 53.97225725094577% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.03530895334174%); +} + +.btn-unit-zerg-bullfrog-png{ + clip-path: xywh(0 54.09836065573771% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.161412358133667%); +} + +.btn-unit-zerg-classicqueen-png{ + clip-path: xywh(0 54.224464060529634% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.287515762925601%); +} + +.btn-unit-zerg-corruptor-png{ + clip-path: xywh(0 54.35056746532156% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.413619167717528%); +} + +.btn-unit-zerg-defilerscbw-png{ + clip-path: xywh(0 54.476670870113495% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.539722572509454%); +} + +.btn-unit-zerg-devourerex3-png{ + clip-path: xywh(0 54.60277427490542% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.665825977301388%); +} + +.btn-unit-zerg-hydralisk-remastered-png{ + clip-path: xywh(0 54.728877679697355% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.791929382093315%); +} + +.btn-unit-zerg-hydralisk-png{ + clip-path: xywh(0 54.85498108448928% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -4.918032786885249%); +} + +.btn-unit-zerg-impaler-png{ + clip-path: xywh(0 54.98108448928121% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.044136191677175%); +} + +.btn-unit-zerg-infestedbanshee-png{ + clip-path: xywh(0 55.10718789407314% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.170239596469102%); +} + +.btn-unit-zerg-infesteddiamondback-png{ + clip-path: xywh(0 55.23329129886507% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.296343001261036%); +} + +.btn-unit-zerg-infestedliberator-png{ + clip-path: xywh(0 55.359394703656996% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.422446406052963%); +} + +.btn-unit-zerg-infestedmarine-png{ + clip-path: xywh(0 55.48549810844893% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.548549810844889%); +} + +.btn-unit-zerg-infestedsiegetank-png{ + clip-path: xywh(0 55.611601513240856% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.674653215636823%); +} + +.btn-unit-zerg-infestor-png{ + clip-path: xywh(0 55.73770491803279% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.80075662042875%); +} + +.btn-unit-zerg-kerriganascended-png{ + clip-path: xywh(0 55.86380832282472% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -5.926860025220684%); +} + +.btn-unit-zerg-kerriganghost-png{ + clip-path: xywh(0 55.989911727616644% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.0529634300126105%); +} + +.btn-unit-zerg-kerriganinfested-png{ + clip-path: xywh(0 56.11601513240858% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.179066834804537%); +} + +.btn-unit-zerg-larva-png{ + clip-path: xywh(0 56.242118537200504% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.305170239596471%); +} + +.btn-unit-zerg-leviathan-png{ + clip-path: xywh(0 56.36822194199243% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.431273644388398%); +} + +.btn-unit-zerg-lurker-png{ + clip-path: xywh(0 56.494325346784365% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.5573770491803245%); +} + +.btn-unit-zerg-mutalisk-png{ + clip-path: xywh(0 56.62042875157629% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.683480453972258%); +} + +.btn-unit-zerg-nydusdragon-png{ + clip-path: xywh(0 56.746532156368225% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.809583858764185%); +} + +.btn-unit-zerg-overlordscbw-png{ + clip-path: xywh(0 56.87263556116015% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -6.935687263556119%); +} + +.btn-unit-zerg-overseer-png{ + clip-path: xywh(0 56.99873896595208% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.061790668348046%); +} + +.btn-unit-zerg-primalguardian-png{ + clip-path: xywh(0 57.12484237074401% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.187894073139972%); +} + +.btn-unit-zerg-ravager-png{ + clip-path: xywh(0 57.25094577553594% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.313997477931906%); +} + +.btn-unit-zerg-roach-corpser-png{ + clip-path: xywh(0 57.377049180327866% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.440100882723833%); +} + +.btn-unit-zerg-roach-vile-png{ + clip-path: xywh(0 57.5031525851198% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.56620428751576%); +} + +.btn-unit-zerg-roach-png{ + clip-path: xywh(0 57.62925598991173% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.692307692307693%); +} + +.btn-unit-zerg-roach_collection-png{ + clip-path: xywh(0 57.75535939470366% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.81841109709962%); +} + +.btn-unit-zerg-scourge-png{ + clip-path: xywh(0 57.88146279949559% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -7.944514501891554%); +} + +.btn-unit-zerg-swarmhost-carrion-png{ + clip-path: xywh(0 58.007566204287514% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.07061790668348%); +} + +.btn-unit-zerg-swarmhost-creeper-png{ + clip-path: xywh(0 58.13366960907945% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.196721311475407%); +} + +.btn-unit-zerg-swarmhost-png{ + clip-path: xywh(0 58.259773013871374% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.322824716267341%); +} + +.btn-unit-zerg-ultralisk-noxious-png{ + clip-path: xywh(0 58.3858764186633% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.448928121059268%); +} + +.btn-unit-zerg-ultralisk-rcz-png{ + clip-path: xywh(0 58.511979823455235% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.575031525851195%); +} + +.btn-unit-zerg-ultralisk-remastered-png{ + clip-path: xywh(0 58.63808322824716% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.701134930643128%); +} + +.btn-unit-zerg-ultralisk-torrasque-png{ + clip-path: xywh(0 58.764186633039095% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.827238335435055%); +} + +.btn-unit-zerg-ultralisk-png{ + clip-path: xywh(0 58.89029003783102% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -8.953341740226989%); +} + +.btn-unit-zerg-viper-png{ + clip-path: xywh(0 59.01639344262295% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.079445145018916%); +} + +.btn-unit-zerg-zergling-raptor-png{ + clip-path: xywh(0 59.14249684741488% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.205548549810842%); +} + +.btn-unit-zerg-zergling-scr-png{ + clip-path: xywh(0 59.26860025220681% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.331651954602776%); +} + +.btn-unit-zerg-zergling-swarmling-png{ + clip-path: xywh(0 59.394703656998736% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.457755359394703%); +} + +.btn-unit-zerg-zergling-png{ + clip-path: xywh(0 59.52080706179067% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.58385876418663%); +} + +.btn-unshackled-psionic-storm-png{ + clip-path: xywh(0 59.6469104665826% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.709962168978564%); +} + +.btn-upgrade-afaidofthedark-png{ + clip-path: xywh(0 59.77301387137453% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.83606557377049%); +} + +.btn-upgrade-artanis-healingpsionicstorm-png{ + clip-path: xywh(0 59.89911727616646% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -9.962168978562424%); +} + +.btn-upgrade-artanis-scarabsplashradius-png{ + clip-path: xywh(0 60.025220680958384% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.08827238335435%); +} + +.btn-upgrade-artanis-singularitycharge-png{ + clip-path: xywh(0 60.15132408575032% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.214375788146278%); +} + +.btn-upgrade-custom-triple-scourge-png{ + clip-path: xywh(0 60.277427490542244% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.340479192938211%); +} + +.btn-upgrade-increasedupgraderesearchspeed-png{ + clip-path: xywh(0 60.40353089533417% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.466582597730138%); +} + +.btn-upgrade-karax-energyregen200-png{ + clip-path: xywh(0 60.529634300126105% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.592686002522065%); +} + +.btn-upgrade-karax-pylonwarpininstantly-png{ + clip-path: xywh(0 60.65573770491803% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.718789407313999%); +} + +.btn-upgrade-karax-turretattackspeed-png{ + clip-path: xywh(0 60.781841109709966% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.844892812105925%); +} + +.btn-upgrade-karax-turretrange-png{ + clip-path: xywh(0 60.90794451450189% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -10.97099621689786%); +} + +.btn-upgrade-kerrigan-assimilationaura-png{ + clip-path: xywh(0 61.03404791929382% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.097099621689786%); +} + +.btn-upgrade-kerrigan-broodlordspeed-png{ + clip-path: xywh(0 61.16015132408575% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.223203026481713%); +} + +.btn-upgrade-kerrigan-crushinggripwave-png{ + clip-path: xywh(0 61.28625472887768% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.349306431273646%); +} + +.btn-upgrade-kerrigan-seismicspines-png{ + clip-path: xywh(0 61.412358133669606% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.475409836065573%); +} + +.btn-upgrade-mengsk-engineeringbay-dominionarmorlevel2-png{ + clip-path: xywh(0 61.53846153846154% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.6015132408575%); +} + +.btn-upgrade-mengsk-engineeringbay-dominionweaponslevel0-png{ + clip-path: xywh(0 61.66456494325347% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.727616645649434%); +} + +.btn-upgrade-mengsk-engineeringbay-neosteelfortifiedarmor-png{ + clip-path: xywh(0 61.7906683480454% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.85372005044136%); +} + +.btn-upgrade-mengsk-engineeringbay-orbitaldrop-png{ + clip-path: xywh(0 61.91677175283733% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -11.979823455233294%); +} + +.btn-upgrade-mengsk-ghostacademy-guidedtacticalstrike-png{ + clip-path: xywh(0 62.042875157629254% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.105926860025221%); +} + +.btn-upgrade-mengsk-trooper-flamethrower-png{ + clip-path: xywh(0 62.16897856242119% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.232030264817148%); +} + +.btn-upgrade-mengsk-trooper-missilelauncher-png{ + clip-path: xywh(0 62.295081967213115% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.358133669609082%); +} + +.btn-upgrade-mengsk-trooper-plasmarifle-png{ + clip-path: xywh(0 62.42118537200504% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.484237074401008%); +} + +.btn-upgrade-nova-blink-png{ + clip-path: xywh(0 62.547288776796975% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.610340479192935%); +} + +.btn-upgrade-nova-btn-upgrade-nova-flashgrenade-png{ + clip-path: xywh(0 62.6733921815889% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.736443883984869%); +} + +.btn-upgrade-nova-btn-upgrade-nova-pulsegrenade-png{ + clip-path: xywh(0 62.799495586380836% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.862547288776796%); +} + +.btn-upgrade-nova-equipment-apolloinfantrysuit-png{ + clip-path: xywh(0 62.92559899117276% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -12.98865069356873%); +} + +.btn-upgrade-nova-equipment-blinksuit-png{ + clip-path: xywh(0 63.05170239596469% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.114754098360656%); +} + +.btn-upgrade-nova-equipment-canisterrifle-png{ + clip-path: xywh(0 63.17780580075662% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.240857503152583%); +} + +.btn-upgrade-nova-equipment-ghostvisor-png{ + clip-path: xywh(0 63.30390920554855% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.366960907944517%); +} + +.btn-upgrade-nova-equipment-gunblade_sword-png{ + clip-path: xywh(0 63.430012610340476% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.493064312736443%); +} + +.btn-upgrade-nova-equipment-monomolecularblade-png{ + clip-path: xywh(0 63.55611601513241% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.61916771752837%); +} + +.btn-upgrade-nova-equipment-plasmagun-png{ + clip-path: xywh(0 63.68221941992434% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.745271122320304%); +} + +.btn-upgrade-nova-equipment-rangefinderoculus-png{ + clip-path: xywh(0 63.80832282471627% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.87137452711223%); +} + +.btn-upgrade-nova-equipment-shotgun-png{ + clip-path: xywh(0 63.9344262295082% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -13.997477931904164%); +} + +.btn-upgrade-nova-equipment-stealthsuit-png{ + clip-path: xywh(0 64.06052963430012% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.123581336696091%); +} + +.btn-upgrade-nova-holographicdecoy-png{ + clip-path: xywh(0 64.18663303909206% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.249684741488025%); +} + +.btn-upgrade-nova-jetpack-png{ + clip-path: xywh(0 64.31273644388399% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.375788146279945%); +} + +.btn-upgrade-nova-tacticalstealthsuit-png{ + clip-path: xywh(0 64.43883984867591% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.501891551071878%); +} + +.btn-upgrade-protoss-adeptshieldupgrade-png{ + clip-path: xywh(0 64.56494325346785% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.627994955863812%); +} + +.btn-upgrade-protoss-airarmorlevel1-png{ + clip-path: xywh(0 64.69104665825978% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.754098360655732%); +} + +.btn-upgrade-protoss-airarmorlevel2-png{ + clip-path: xywh(0 64.8171500630517% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -14.880201765447666%); +} + +.btn-upgrade-protoss-airarmorlevel3-png{ + clip-path: xywh(0 64.94325346784363% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.0063051702396%); +} + +.btn-upgrade-protoss-airarmorlevel4-png{ + clip-path: xywh(0 65.06935687263557% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.13240857503152%); +} + +.btn-upgrade-protoss-airarmorlevel5-png{ + clip-path: xywh(0 65.19546027742749% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.258511979823453%); +} + +.btn-upgrade-protoss-airweaponslevel1-png{ + clip-path: xywh(0 65.32156368221942% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.384615384615387%); +} + +.btn-upgrade-protoss-airweaponslevel2-png{ + clip-path: xywh(0 65.44766708701135% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.51071878940732%); +} + +.btn-upgrade-protoss-airweaponslevel3-png{ + clip-path: xywh(0 65.57377049180327% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.63682219419924%); +} + +.btn-upgrade-protoss-airweaponslevel4-png{ + clip-path: xywh(0 65.69987389659521% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.762925598991174%); +} + +.btn-upgrade-protoss-airweaponslevel5-png{ + clip-path: xywh(0 65.82597730138714% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -15.889029003783108%); +} + +.btn-upgrade-protoss-alarak-ascendantspsiorbtravelsfurther-png{ + clip-path: xywh(0 65.95208070617906% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.015132408575028%); +} + +.btn-upgrade-protoss-alarak-ascendantspermanentlybetter-png{ + clip-path: xywh(0 66.078184110971% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.14123581336696%); +} + +.btn-upgrade-protoss-alarak-graviticdrive-png{ + clip-path: xywh(0 66.20428751576293% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.267339218158895%); +} + +.btn-upgrade-protoss-alarak-havoctargetlockbuffed-png{ + clip-path: xywh(0 66.33039092055486% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.393442622950815%); +} + +.btn-upgrade-protoss-alarak-melleeweapon-png{ + clip-path: xywh(0 66.45649432534678% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.51954602774275%); +} + +.btn-upgrade-protoss-alarak-permanentcloak-png{ + clip-path: xywh(0 66.58259773013872% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.645649432534682%); +} + +.btn-upgrade-protoss-alarak-rangeincrease-png{ + clip-path: xywh(0 66.70870113493065% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.771752837326602%); +} + +.btn-upgrade-protoss-alarak-rangeweapon-png{ + clip-path: xywh(0 66.83480453972257% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -16.897856242118536%); +} + +.btn-upgrade-protoss-alarak-supplicantarmor-png{ + clip-path: xywh(0 66.9609079445145% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.02395964691047%); +} + +.btn-upgrade-protoss-alarak-supplicantextrashields-png{ + clip-path: xywh(0 67.08701134930644% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.15006305170239%); +} + +.btn-upgrade-protoss-fenix-adept-recochetglaiveupgraded-png{ + clip-path: xywh(0 67.21311475409836% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.276166456494323%); +} + +.btn-upgrade-protoss-fenix-adeptchampionbounceattack-png{ + clip-path: xywh(0 67.33921815889029% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.402269861286257%); +} + +.btn-upgrade-protoss-fenix-carrier-solarbeam-png{ + clip-path: xywh(0 67.46532156368222% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.52837326607819%); +} + +.btn-upgrade-protoss-fenix-disruptorpermanentcloak-png{ + clip-path: xywh(0 67.59142496847414% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.65447667087011%); +} + +.btn-upgrade-protoss-fenix-dragoonsolariteflare-png{ + clip-path: xywh(0 67.71752837326608% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.780580075662044%); +} + +.btn-upgrade-protoss-fenix-scoutchampionrange-png{ + clip-path: xywh(0 67.84363177805801% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -17.906683480453978%); +} + +.btn-upgrade-protoss-fenix-stasisfield-png{ + clip-path: xywh(0 67.96973518284993% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.032786885245898%); +} + +.btn-upgrade-protoss-fenix-zealotsuit-armorplate-png{ + clip-path: xywh(0 68.09583858764186% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.15889029003783%); +} + +.btn-upgrade-protoss-fluxvanes-png{ + clip-path: xywh(0 68.2219419924338% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.284993694829765%); +} + +.btn-upgrade-protoss-graviticbooster-png{ + clip-path: xywh(0 68.34804539722572% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.411097099621685%); +} + +.btn-upgrade-protoss-graviticdrive-png{ + clip-path: xywh(0 68.47414880201765% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.53720050441362%); +} + +.btn-upgrade-protoss-gravitoncatapult-png{ + clip-path: xywh(0 68.60025220680959% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.663303909205553%); +} + +.btn-upgrade-protoss-groundarmorlevel1-png{ + clip-path: xywh(0 68.72635561160152% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.789407313997472%); +} + +.btn-upgrade-protoss-groundarmorlevel2-png{ + clip-path: xywh(0 68.85245901639344% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -18.915510718789406%); +} + +.btn-upgrade-protoss-groundarmorlevel3-png{ + clip-path: xywh(0 68.97856242118537% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.04161412358134%); +} + +.btn-upgrade-protoss-groundarmorlevel4-png{ + clip-path: xywh(0 69.1046658259773% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.16771752837326%); +} + +.btn-upgrade-protoss-groundarmorlevel5-png{ + clip-path: xywh(0 69.23076923076923% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.293820933165193%); +} + +.btn-upgrade-protoss-groundweaponslevel1-png{ + clip-path: xywh(0 69.35687263556116% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.419924337957127%); +} + +.btn-upgrade-protoss-groundweaponslevel2-png{ + clip-path: xywh(0 69.4829760403531% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.54602774274906%); +} + +.btn-upgrade-protoss-groundweaponslevel3-png{ + clip-path: xywh(0 69.60907944514501% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.67213114754098%); +} + +.btn-upgrade-protoss-groundweaponslevel4-png{ + clip-path: xywh(0 69.73518284993695% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.798234552332914%); +} + +.btn-upgrade-protoss-groundweaponslevel5-png{ + clip-path: xywh(0 69.86128625472888% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -19.92433795712485%); +} + +.btn-upgrade-protoss-increasedscarabcapacityscbw-png{ + clip-path: xywh(0 69.9873896595208% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.050441361916768%); +} + +.btn-upgrade-protoss-khaydarinamulet-png{ + clip-path: xywh(0 70.11349306431273% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.1765447667087%); +} + +.btn-upgrade-protoss-phoenixrange-png{ + clip-path: xywh(0 70.23959646910467% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.302648171500635%); +} + +.btn-upgrade-protoss-researchbosoniccore-png{ + clip-path: xywh(0 70.36569987389659% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.428751576292555%); +} + +.btn-upgrade-protoss-researchgravitysling-png{ + clip-path: xywh(0 70.49180327868852% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.55485498108449%); +} + +.btn-upgrade-protoss-resonatingglaives-png{ + clip-path: xywh(0 70.61790668348046% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.680958385876423%); +} + +.btn-upgrade-protoss-shieldslevel1-png{ + clip-path: xywh(0 70.74401008827239% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.807061790668342%); +} + +.btn-upgrade-protoss-shieldslevel2-png{ + clip-path: xywh(0 70.87011349306431% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -20.933165195460276%); +} + +.btn-upgrade-protoss-shieldslevel3-png{ + clip-path: xywh(0 70.99621689785624% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.05926860025221%); +} + +.btn-upgrade-protoss-shieldslevel4-png{ + clip-path: xywh(0 71.12232030264818% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.18537200504413%); +} + +.btn-upgrade-protoss-shieldslevel5-png{ + clip-path: xywh(0 71.2484237074401% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.311475409836063%); +} + +.btn-upgrade-protoss-stalkerpurifier-reconstruction-png{ + clip-path: xywh(0 71.37452711223203% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.437578814627997%); +} + +.btn-upgrade-protoss-tectonicdisruptors-png{ + clip-path: xywh(0 71.50063051702396% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.56368221941993%); +} + +.btn-upgrade-protoss-vanguard-aoeradiusincreased-png{ + clip-path: xywh(0 71.62673392181588% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.68978562421185%); +} + +.btn-upgrade-protoss-vanguard-increasedarmordamage-png{ + clip-path: xywh(0 71.75283732660782% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.815889029003785%); +} + +.btn-upgrade-protoss-wrathwalker-cantargetairunits-png{ + clip-path: xywh(0 71.87894073139975% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -21.94199243379572%); +} + +.btn-upgrade-protoss-wrathwalker-chargetimeimproved-png{ + clip-path: xywh(0 72.00504413619167% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.068095838587638%); +} + +.btn-upgrade-psi-indoctrinator-png{ + clip-path: xywh(0 72.1311475409836% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.194199243379572%); +} + +.btn-upgrade-raynor-cerberusmines-png{ + clip-path: xywh(0 72.25725094577554% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.320302648171506%); +} + +.btn-upgrade-raynor-improvedsiegemode-png{ + clip-path: xywh(0 72.38335435056746% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.446406052963425%); +} + +.btn-upgrade-raynor-incineratorgauntlets-png{ + clip-path: xywh(0 72.50945775535939% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.57250945775536%); +} + +.btn-upgrade-raynor-juggernautplating-png{ + clip-path: xywh(0 72.63556116015133% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.698612862547293%); +} + +.btn-upgrade-raynor-maelstromrounds-png{ + clip-path: xywh(0 72.76166456494326% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.824716267339213%); +} + +.btn-upgrade-raynor-phobosclassweaponssystem-png{ + clip-path: xywh(0 72.88776796973518% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -22.950819672131146%); +} + +.btn-upgrade-raynor-replenishablemagazine-png{ + clip-path: xywh(0 73.01387137452711% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.07692307692308%); +} + +.btn-upgrade-raynor-ripwavemissiles-png{ + clip-path: xywh(0 73.13997477931905% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.203026481715%); +} + +.btn-upgrade-raynor-shockwavemissilebattery-png{ + clip-path: xywh(0 73.26607818411097% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.329129886506934%); +} + +.btn-upgrade-raynor-stabilizermedpacks-png{ + clip-path: xywh(0 73.3921815889029% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.455233291298867%); +} + +.btn-upgrade-reducedupgraderesearchcost-png{ + clip-path: xywh(0 73.51828499369483% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.5813366960908%); +} + +.btn-upgrade-siegetank-spidermines-png{ + clip-path: xywh(0 73.64438839848675% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.70744010088272%); +} + +.btn-upgrade-stetmann-banelingmanashieldefficiency-png{ + clip-path: xywh(0 73.77049180327869% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.833543505674655%); +} + +.btn-upgrade-stetmann-mechachitinousplating-png{ + clip-path: xywh(0 73.89659520807062% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -23.95964691046659%); +} + +.btn-upgrade-stetmann-zerglinghardenedshield-png{ + clip-path: xywh(0 74.02269861286254% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.085750315258508%); +} + +.btn-upgrade-swann-aresclasstargetingsystem-png{ + clip-path: xywh(0 74.14880201765448% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.211853720050442%); +} + +.btn-upgrade-swann-defensivematrix-png{ + clip-path: xywh(0 74.27490542244641% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.337957124842376%); +} + +.btn-upgrade-swann-displacementfield-png{ + clip-path: xywh(0 74.40100882723833% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.464060529634295%); +} + +.btn-upgrade-swann-firesuppressionsystem-png{ + clip-path: xywh(0 74.52711223203026% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.59016393442623%); +} + +.btn-upgrade-swann-hellarmor-png{ + clip-path: xywh(0 74.6532156368222% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.716267339218163%); +} + +.btn-upgrade-swann-improvedburstlaser-png{ + clip-path: xywh(0 74.77931904161413% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.842370744010083%); +} + +.btn-upgrade-swann-improvednanorepair-png{ + clip-path: xywh(0 74.90542244640605% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -24.968474148802017%); +} + +.btn-upgrade-swann-improvedturretattackspeed-png{ + clip-path: xywh(0 75.03152585119798% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.09457755359395%); +} + +.btn-upgrade-swann-multilockweaponsystem-png{ + clip-path: xywh(0 75.15762925598992% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.22068095838587%); +} + +.btn-upgrade-swann-scvdoublerepair-png{ + clip-path: xywh(0 75.28373266078184% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.346784363177804%); +} + +.btn-upgrade-swann-targetingoptics-png{ + clip-path: xywh(0 75.40983606557377% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.472887767969738%); +} + +.btn-upgrade-swann-vehiclerangeincrease-png{ + clip-path: xywh(0 75.5359394703657% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.59899117276167%); +} + +.btn-upgrade-terran-advanceballistics-png{ + clip-path: xywh(0 75.66204287515762% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.72509457755359%); +} + +.btn-upgrade-terran-behemothreactor-png{ + clip-path: xywh(0 75.78814627994956% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.851197982345525%); +} + +.btn-upgrade-terran-buildingarmor-png{ + clip-path: xywh(0 75.91424968474149% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -25.97730138713746%); +} + +.btn-upgrade-terran-cyclonerangeupgrade-png{ + clip-path: xywh(0 76.04035308953341% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.10340479192938%); +} + +.btn-upgrade-terran-durablematerials-png{ + clip-path: xywh(0 76.16645649432535% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.229508196721312%); +} + +.btn-upgrade-terran-highcapacityfueltanks-png{ + clip-path: xywh(0 76.29255989911728% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.355611601513246%); +} + +.btn-upgrade-terran-hisecautotracking-png{ + clip-path: xywh(0 76.4186633039092% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.481715006305166%); +} + +.btn-upgrade-terran-hyperflightrotors-png{ + clip-path: xywh(0 76.54476670870113% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.6078184110971%); +} + +.btn-upgrade-terran-infantryarmorlevel1-png{ + clip-path: xywh(0 76.67087011349307% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.733921815889033%); +} + +.btn-upgrade-terran-infantryarmorlevel2-png{ + clip-path: xywh(0 76.796973518285% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.860025220680953%); +} + +.btn-upgrade-terran-infantryarmorlevel3-png{ + clip-path: xywh(0 76.92307692307692% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -26.986128625472887%); +} + +.btn-upgrade-terran-infantryarmorlevel4-png{ + clip-path: xywh(0 77.04918032786885% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.11223203026482%); +} + +.btn-upgrade-terran-infantryarmorlevel5-png{ + clip-path: xywh(0 77.17528373266079% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.23833543505674%); +} + +.btn-upgrade-terran-infantryweaponslevel1-png{ + clip-path: xywh(0 77.3013871374527% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.364438839848674%); +} + +.btn-upgrade-terran-infantryweaponslevel2-png{ + clip-path: xywh(0 77.42749054224464% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.490542244640608%); +} + +.btn-upgrade-terran-infantryweaponslevel3-png{ + clip-path: xywh(0 77.55359394703657% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.61664564943254%); +} + +.btn-upgrade-terran-infantryweaponslevel4-png{ + clip-path: xywh(0 77.6796973518285% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.74274905422446%); +} + +.btn-upgrade-terran-infantryweaponslevel5-png{ + clip-path: xywh(0 77.80580075662043% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.868852459016395%); +} + +.btn-upgrade-terran-infernalpreigniter-png{ + clip-path: xywh(0 77.93190416141236% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -27.99495586380833%); +} + +.btn-upgrade-terran-interferencematrix-png{ + clip-path: xywh(0 78.05800756620428% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.12105926860025%); +} + +.btn-upgrade-terran-internalizedtechmodule-png{ + clip-path: xywh(0 78.18411097099622% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.247162673392182%); +} + +.btn-upgrade-terran-jumpjets-png{ + clip-path: xywh(0 78.31021437578815% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.373266078184116%); +} + +.btn-upgrade-terran-kd8chargeex3-png{ + clip-path: xywh(0 78.43631778058007% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.499369482976036%); +} + +.btn-upgrade-terran-lazertargetingsystem-png{ + clip-path: xywh(0 78.562421185372% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.62547288776797%); +} + +.btn-upgrade-terran-magfieldaccelerator-png{ + clip-path: xywh(0 78.68852459016394% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.751576292559903%); +} + +.btn-upgrade-terran-magrailmunitions-png{ + clip-path: xywh(0 78.81462799495587% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -28.877679697351823%); +} + +.btn-upgrade-terran-medivacemergencythrusters-png{ + clip-path: xywh(0 78.94073139974779% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.003783102143757%); +} + +.btn-upgrade-terran-neosteelframe-png{ + clip-path: xywh(0 79.06683480453972% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.12988650693569%); +} + +.btn-upgrade-terran-nova-bansheemissilestrik-png{ + clip-path: xywh(0 79.19293820933166% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.25598991172761%); +} + +.btn-upgrade-terran-nova-hellfiremissiles-png{ + clip-path: xywh(0 79.31904161412358% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.382093316519544%); +} + +.btn-upgrade-terran-nova-personaldefensivematrix-png{ + clip-path: xywh(0 79.44514501891551% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.508196721311478%); +} + +.btn-upgrade-terran-nova-siegetankrange-png{ + clip-path: xywh(0 79.57124842370744% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.634300126103412%); +} + +.btn-upgrade-terran-nova-specialordance-png{ + clip-path: xywh(0 79.69735182849936% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.76040353089533%); +} + +.btn-upgrade-terran-nova-terrandefendermodestructureattack-png{ + clip-path: xywh(0 79.8234552332913% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -29.886506935687265%); +} + +.btn-upgrade-terran-optimizedlogistics-png{ + clip-path: xywh(0 79.94955863808323% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.0126103404792%); +} + +.btn-upgrade-terran-reapercombatdrugs-png{ + clip-path: xywh(0 80.07566204287515% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.13871374527112%); +} + +.btn-upgrade-terran-replenishablemagazinelvl2-png{ + clip-path: xywh(0 80.20176544766709% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.264817150063053%); +} + +.btn-upgrade-terran-researchdrillingclaws-png{ + clip-path: xywh(0 80.32786885245902% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.390920554854986%); +} + +.btn-upgrade-terran-shipplatinglevel1-png{ + clip-path: xywh(0 80.45397225725094% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.517023959646906%); +} + +.btn-upgrade-terran-shipplatinglevel2-png{ + clip-path: xywh(0 80.58007566204287% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.64312736443884%); +} + +.btn-upgrade-terran-shipplatinglevel3-png{ + clip-path: xywh(0 80.7061790668348% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.769230769230774%); +} + +.btn-upgrade-terran-shipplatinglevel4-png{ + clip-path: xywh(0 80.83228247162674% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -30.895334174022693%); +} + +.btn-upgrade-terran-shipplatinglevel5-png{ + clip-path: xywh(0 80.95838587641866% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.021437578814627%); +} + +.btn-upgrade-terran-shipweaponslevel1-png{ + clip-path: xywh(0 81.0844892812106% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.14754098360656%); +} + +.btn-upgrade-terran-shipweaponslevel2-png{ + clip-path: xywh(0 81.21059268600253% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.27364438839848%); +} + +.btn-upgrade-terran-shipweaponslevel3-png{ + clip-path: xywh(0 81.33669609079445% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.399747793190414%); +} + +.btn-upgrade-terran-shipweaponslevel4-png{ + clip-path: xywh(0 81.46279949558638% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.525851197982348%); +} + +.btn-upgrade-terran-shipweaponslevel5-png{ + clip-path: xywh(0 81.58890290037832% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.651954602774282%); +} + +.btn-upgrade-terran-superstimppack-png{ + clip-path: xywh(0 81.71500630517023% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.7780580075662%); +} + +.btn-upgrade-terran-transformationservos-png{ + clip-path: xywh(0 81.84110970996217% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -31.904161412358135%); +} + +.btn-upgrade-terran-trilithium-power-cell-png{ + clip-path: xywh(0 81.9672131147541% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.03026481715007%); +} + +.btn-upgrade-terran-tungsten-spikes-png{ + clip-path: xywh(0 82.09331651954602% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.15636822194199%); +} + +.btn-upgrade-terran-twin-linkedflamethrower-color-png{ + clip-path: xywh(0 82.21941992433796% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.28247162673392%); +} + +.btn-upgrade-terran-vehicleplatinglevel1-png{ + clip-path: xywh(0 82.34552332912989% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.40857503152586%); +} + +.btn-upgrade-terran-vehicleplatinglevel2-png{ + clip-path: xywh(0 82.47162673392181% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.534678436317776%); +} + +.btn-upgrade-terran-vehicleplatinglevel3-png{ + clip-path: xywh(0 82.59773013871374% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.66078184110971%); +} + +.btn-upgrade-terran-vehicleplatinglevel4-png{ + clip-path: xywh(0 82.72383354350568% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.786885245901644%); +} + +.btn-upgrade-terran-vehicleplatinglevel5-png{ + clip-path: xywh(0 82.84993694829761% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -32.91298865069356%); +} + +.btn-upgrade-terran-vehicleweaponslevel1-png{ + clip-path: xywh(0 82.97604035308953% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.0390920554855%); +} + +.btn-upgrade-terran-vehicleweaponslevel2-png{ + clip-path: xywh(0 83.10214375788146% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.16519546027743%); +} + +.btn-upgrade-terran-vehicleweaponslevel3-png{ + clip-path: xywh(0 83.2282471626734% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.29129886506935%); +} + +.btn-upgrade-terran-vehicleweaponslevel4-png{ + clip-path: xywh(0 83.35435056746532% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.417402269861284%); +} + +.btn-upgrade-terran-vehicleweaponslevel5-png{ + clip-path: xywh(0 83.48045397225725% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.54350567465322%); +} + +.btn-upgrade-vorazun-corsairpermanentlycloaked-png{ + clip-path: xywh(0 83.60655737704919% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.66960907944514%); +} + +.btn-upgrade-vorazun-oraclepermanentlycloaked-png{ + clip-path: xywh(0 83.7326607818411% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.79571248423707%); +} + +.btn-upgrade-zagara-aberrationarmorcover-png{ + clip-path: xywh(0 83.85876418663304% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -33.921815889029006%); +} + +.btn-upgrade-zagara-increasebilelauncherrange-png{ + clip-path: xywh(0 83.98486759142497% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.04791929382094%); +} + +.btn-upgrade-zagara-scourgesplashdamage-png{ + clip-path: xywh(0 84.11097099621689% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.17402269861286%); +} + +.btn-upgrade-zerg-abathur-abduct-png{ + clip-path: xywh(0 84.23707440100883% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.30012610340479%); +} + +.btn-upgrade-zerg-abathur-biomass-png{ + clip-path: xywh(0 84.36317780580076% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.42622950819673%); +} + +.btn-upgrade-zerg-abathur-biomechanicaltransfusion-png{ + clip-path: xywh(0 84.48928121059268% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.552332912988646%); +} + +.btn-upgrade-zerg-abathur-castrange-png{ + clip-path: xywh(0 84.61538461538461% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.67843631778058%); +} + +.btn-upgrade-zerg-abathur-devourer-corrosivespray-png{ + clip-path: xywh(0 84.74148802017655% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.804539722572514%); +} + +.btn-upgrade-zerg-abathur-improvedmend-png{ + clip-path: xywh(0 84.86759142496848% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -34.930643127364434%); +} + +.btn-upgrade-zerg-abathur-incubationchamber-png{ + clip-path: xywh(0 84.9936948297604% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.05674653215637%); +} + +.btn-upgrade-zerg-abathur-prolongeddispersion-png{ + clip-path: xywh(0 85.11979823455233% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.1828499369483%); +} + +.btn-upgrade-zerg-adaptivecarapace-png{ + clip-path: xywh(0 85.24590163934427% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.30895334174022%); +} + +.btn-upgrade-zerg-adaptivetalons-png{ + clip-path: xywh(0 85.37200504413619% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.435056746532155%); +} + +.btn-upgrade-zerg-adrenaloverload-png{ + clip-path: xywh(0 85.49810844892812% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.56116015132409%); +} + +.btn-upgrade-zerg-airattacks-level1-png{ + clip-path: xywh(0 85.62421185372006% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.68726355611601%); +} + +.btn-upgrade-zerg-airattacks-level2-png{ + clip-path: xywh(0 85.75031525851198% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.81336696090794%); +} + +.btn-upgrade-zerg-airattacks-level3-png{ + clip-path: xywh(0 85.87641866330391% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -35.939470365699876%); +} + +.btn-upgrade-zerg-airattacks-level4-png{ + clip-path: xywh(0 86.00252206809584% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.06557377049181%); +} + +.btn-upgrade-zerg-airattacks-level5-png{ + clip-path: xywh(0 86.12862547288776% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.19167717528373%); +} + +.btn-upgrade-zerg-anabolicsynthesis-png{ + clip-path: xywh(0 86.2547288776797% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.31778058007566%); +} + +.btn-upgrade-zerg-ancillaryarmor-png{ + clip-path: xywh(0 86.38083228247163% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.4438839848676%); +} + +.btn-upgrade-zerg-buildingarmor-png{ + clip-path: xywh(0 86.50693568726355% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.56998738965952%); +} + +.btn-upgrade-zerg-burrowcharge-png{ + clip-path: xywh(0 86.63303909205548% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.69609079445145%); +} + +.btn-upgrade-zerg-burrowmove-png{ + clip-path: xywh(0 86.75914249684742% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.822194199243384%); +} + +.btn-upgrade-zerg-celldivisionon-png{ + clip-path: xywh(0 86.88524590163935% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -36.948297604035304%); +} + +.btn-upgrade-zerg-centrifugalhooks-png{ + clip-path: xywh(0 87.01134930643127% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.07440100882724%); +} + +.btn-upgrade-zerg-chitinousplating-png{ + clip-path: xywh(0 87.1374527112232% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.20050441361917%); +} + +.btn-upgrade-zerg-concentrated-spew-png{ + clip-path: xywh(0 87.26355611601514% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.32660781841109%); +} + +.btn-upgrade-zerg-corrosiveacid-png{ + clip-path: xywh(0 87.38965952080706% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.452711223203025%); +} + +.btn-upgrade-zerg-dehaka-tenderize-png{ + clip-path: xywh(0 87.51576292559899% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.57881462799496%); +} + +.btn-upgrade-zerg-demolition-png{ + clip-path: xywh(0 87.64186633039093% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.70491803278688%); +} + +.btn-upgrade-zerg-enduringcorruption-png{ + clip-path: xywh(0 87.76796973518285% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.83102143757881%); +} + +.btn-upgrade-zerg-evolveincreasedlocustlifetime-png{ + clip-path: xywh(0 87.89407313997478% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -37.957124842370746%); +} + +.btn-upgrade-zerg-evolvemuscularaugments-png{ + clip-path: xywh(0 88.02017654476671% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.08322824716268%); +} + +.btn-upgrade-zerg-explosiveglaive-png{ + clip-path: xywh(0 88.14627994955863% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.2093316519546%); +} + +.btn-upgrade-zerg-flyercarapace-level1-png{ + clip-path: xywh(0 88.27238335435057% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.33543505674653%); +} + +.btn-upgrade-zerg-flyercarapace-level2-png{ + clip-path: xywh(0 88.3984867591425% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.46153846153847%); +} + +.btn-upgrade-zerg-flyercarapace-level3-png{ + clip-path: xywh(0 88.52459016393442% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.58764186633039%); +} + +.btn-upgrade-zerg-flyercarapace-level4-png{ + clip-path: xywh(0 88.65069356872635% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.71374527112232%); +} + +.btn-upgrade-zerg-flyercarapace-level5-png{ + clip-path: xywh(0 88.77679697351829% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.839848675914254%); +} + +.btn-upgrade-zerg-frenzy-png{ + clip-path: xywh(0 88.90290037831022% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -38.965952080706174%); +} + +.btn-upgrade-zerg-glialreconstitution-png{ + clip-path: xywh(0 89.02900378310214% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.09205548549811%); +} + +.btn-upgrade-zerg-groovedspines-png{ + clip-path: xywh(0 89.15510718789407% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.21815889029004%); +} + +.btn-upgrade-zerg-groundcarapace-level1-png{ + clip-path: xywh(0 89.28121059268601% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.34426229508196%); +} + +.btn-upgrade-zerg-groundcarapace-level2-png{ + clip-path: xywh(0 89.40731399747793% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.470365699873895%); +} + +.btn-upgrade-zerg-groundcarapace-level3-png{ + clip-path: xywh(0 89.53341740226986% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.59646910466583%); +} + +.btn-upgrade-zerg-groundcarapace-level4-png{ + clip-path: xywh(0 89.6595208070618% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.72257250945775%); +} + +.btn-upgrade-zerg-groundcarapace-level5-png{ + clip-path: xywh(0 89.78562421185372% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.84867591424968%); +} + +.btn-upgrade-zerg-hardenedcarapace-png{ + clip-path: xywh(0 89.91172761664565% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -39.974779319041616%); +} + +.btn-upgrade-zerg-hotsgroovedspines-png{ + clip-path: xywh(0 90.03783102143758% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.10088272383355%); +} + +.btn-upgrade-zerg-hotsmetabolicboost-png{ + clip-path: xywh(0 90.1639344262295% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.22698612862547%); +} + +.btn-upgrade-zerg-hotstunnelingclaws-png{ + clip-path: xywh(0 90.29003783102144% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.3530895334174%); +} + +.btn-upgrade-zerg-hydriaticacid-png{ + clip-path: xywh(0 90.41614123581337% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.47919293820934%); +} + +.btn-upgrade-zerg-meleeattacks-level1-png{ + clip-path: xywh(0 90.54224464060529% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.60529634300126%); +} + +.btn-upgrade-zerg-meleeattacks-level2-png{ + clip-path: xywh(0 90.66834804539722% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.73139974779319%); +} + +.btn-upgrade-zerg-meleeattacks-level3-png{ + clip-path: xywh(0 90.79445145018916% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.857503152585124%); +} + +.btn-upgrade-zerg-meleeattacks-level4-png{ + clip-path: xywh(0 90.92055485498109% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -40.983606557377044%); +} + +.btn-upgrade-zerg-meleeattacks-level5-png{ + clip-path: xywh(0 91.04665825977301% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.10970996216898%); +} + +.btn-upgrade-zerg-missileattacks-level1-png{ + clip-path: xywh(0 91.17276166456494% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.23581336696091%); +} + +.btn-upgrade-zerg-missileattacks-level2-png{ + clip-path: xywh(0 91.29886506935688% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.36191677175283%); +} + +.btn-upgrade-zerg-missileattacks-level3-png{ + clip-path: xywh(0 91.4249684741488% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.488020176544765%); +} + +.btn-upgrade-zerg-missileattacks-level4-png{ + clip-path: xywh(0 91.55107187894073% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.6141235813367%); +} + +.btn-upgrade-zerg-missileattacks-level5-png{ + clip-path: xywh(0 91.67717528373267% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.74022698612862%); +} + +.btn-upgrade-zerg-monarchblades-png{ + clip-path: xywh(0 91.80327868852459% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.86633039092055%); +} + +.btn-upgrade-zerg-organiccarapace-png{ + clip-path: xywh(0 91.92938209331652% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -41.992433795712486%); +} + +.btn-upgrade-zerg-pneumatizedcarapace-png{ + clip-path: xywh(0 92.05548549810845% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.11853720050442%); +} + +.btn-upgrade-zerg-pressurizedglands-png{ + clip-path: xywh(0 92.18158890290037% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.24464060529634%); +} + +.btn-upgrade-zerg-rapidincubation-png{ + clip-path: xywh(0 92.3076923076923% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.37074401008827%); +} + +.btn-upgrade-zerg-rapidregeneration-png{ + clip-path: xywh(0 92.43379571248424% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.49684741488021%); +} + +.btn-upgrade-zerg-regenerativebile-png{ + clip-path: xywh(0 92.55989911727616% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.62295081967213%); +} + +.btn-upgrade-zerg-rupture-png{ + clip-path: xywh(0 92.6860025220681% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.74905422446406%); +} + +.btn-upgrade-zerg-stukov-bansheeburrowregeneration-png{ + clip-path: xywh(0 92.81210592686003% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -42.875157629255995%); +} + +.btn-upgrade-zerg-stukov-bansheemorelife-png{ + clip-path: xywh(0 92.93820933165196% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.001261034047914%); +} + +.btn-upgrade-zerg-stukov-bunkerformliferegenupgraded-png{ + clip-path: xywh(0 93.06431273644388% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.12736443883985%); +} + +.btn-upgrade-zerg-stukov-bunkerresearchbundle_05-png{ + clip-path: xywh(0 93.19041614123581% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.25346784363178%); +} + +.btn-upgrade-zerg-stukov-bunkerupgradeii_14-png{ + clip-path: xywh(0 93.31651954602775% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.3795712484237%); +} + +.btn-upgrade-zerg-stukov-diamondbacksnailtrail-png{ + clip-path: xywh(0 93.44262295081967% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.505674653215635%); +} + +.btn-upgrade-zerg-stukov-infestedbunkermorelife-png{ + clip-path: xywh(0 93.5687263556116% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.63177805800757%); +} + +.btn-upgrade-zerg-stukov-infestedliberatoraoe-png{ + clip-path: xywh(0 93.69482976040354% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.75788146279949%); +} + +.btn-upgrade-zerg-stukov-infestedliberatorswarmcloud-png{ + clip-path: xywh(0 93.82093316519546% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -43.88398486759142%); +} + +.btn-upgrade-zerg-stukov-infestedmarinerangeupgrade-png{ + clip-path: xywh(0 93.94703656998739% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.010088272383356%); +} + +.btn-upgrade-zerg-stukov-infestedspawnbroodling-png{ + clip-path: xywh(0 94.07313997477932% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.13619167717529%); +} + +.btn-upgrade-zerg-stukov-queenenergyregen-png{ + clip-path: xywh(0 94.19924337957124% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.26229508196721%); +} + +.btn-upgrade-zerg-stukov-researchqueenfungalgrowth-png{ + clip-path: xywh(0 94.32534678436318% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.388398486759144%); +} + +.btn-upgrade-zerg-stukov-siegetankammoregen-png{ + clip-path: xywh(0 94.45145018915511% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.51450189155108%); +} + +.btn-upgrade-zerg-stukov-siegetankbonusdamage-png{ + clip-path: xywh(0 94.57755359394703% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.640605296343%); +} + +.btn-upgrade-zerg-swarmfrenzy-png{ + clip-path: xywh(0 94.70365699873896% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.76670870113493%); +} + +.btn-upgrade-zerg-tissueassimilation-png{ + clip-path: xywh(0 94.8297604035309% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -44.892812105926865%); +} + +.btn-upgrade-zerg-tunnelingjaws-png{ + clip-path: xywh(0 94.95586380832283% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.018915510718784%); +} + +.btn-upgrade-zerg-ventralsacs-png{ + clip-path: xywh(0 95.08196721311475% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.14501891551072%); +} + +.btn-upgrade-zerg-viciousglaive-png{ + clip-path: xywh(0 95.20807061790669% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.27112232030265%); +} + +.btn-upgrade-zergling-armorshredding-png{ + clip-path: xywh(0 95.33417402269862% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.39722572509457%); +} + +.btn-veil-of-the-judicator-png{ + clip-path: xywh(0 95.46027742749054% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.523329129886505%); +} + +.btn-warp-refraction-png{ + clip-path: xywh(0 95.58638083228247% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.64943253467844%); +} + +.evolution_coop-png{ + clip-path: xywh(0 95.7124842370744% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.77553593947036%); +} + +.icon-bargain-bin-prices-png{ + clip-path: xywh(0 95.83858764186633% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -45.90163934426229%); +} + +.icon-gas-terran-nobg-png{ + clip-path: xywh(0 95.96469104665826% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.02774274905423%); +} + +.icon-health-nobg-png{ + clip-path: xywh(0 96.0907944514502% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.15384615384616%); +} + +.icon-mineral-nobg-png{ + clip-path: xywh(0 96.21689785624211% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.27994955863808%); +} + +.icon-shields-png{ + clip-path: xywh(0 96.34300126103405% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.406052963430014%); +} + +.icon-supply-protoss_nobg-png{ + clip-path: xywh(0 96.46910466582598% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.53215636822195%); +} + +.icon-supply-terran_nobg-png{ + clip-path: xywh(0 96.5952080706179% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.65825977301387%); +} + +.icon-supply-zerg_nobg-png{ + clip-path: xywh(0 96.72131147540983% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.7843631778058%); +} + +.icon-time-protoss-png{ + clip-path: xywh(0 96.84741488020177% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -46.910466582597735%); +} + +.potentbile_coop-png{ + clip-path: xywh(0 96.9735182849937% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.036569987389655%); +} + +.predatorcharge-png{ + clip-path: xywh(0 97.09962168978562% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.16267339218159%); +} + +.predatorvespene-png{ + clip-path: xywh(0 97.22572509457756% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.28877679697352%); +} + +.talent-artanis-level03-warpgatecharges-png{ + clip-path: xywh(0 97.35182849936949% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.41488020176544%); +} + +.talent-artanis-level14-startingmaxsupply-png{ + clip-path: xywh(0 97.47793190416141% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.540983606557376%); +} + +.talent-raynor-level03-firebatmedicrange-png{ + clip-path: xywh(0 97.60403530895334% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.66708701134931%); +} + +.talent-raynor-level08-orbitaldroppods-png{ + clip-path: xywh(0 97.73013871374528% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.79319041614123%); +} + +.talent-raynor-level14-infantryattackspeed-png{ + clip-path: xywh(0 97.8562421185372% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -47.91929382093316%); +} + +.talent-swann-level12-immortalityprotocol-png{ + clip-path: xywh(0 97.98234552332913% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.0453972257251%); +} + +.talent-swann-level14-vehiclehealthincrease-png{ + clip-path: xywh(0 98.10844892812106% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.17150063051703%); +} + +.talent-tychus-level02-additionaloutlaw-png{ + clip-path: xywh(0 98.23455233291298% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.29760403530895%); +} + +.talent-tychus-level07-firstdiscount-png{ + clip-path: xywh(0 98.36065573770492% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.423707440100884%); +} + +.talent-vorazun-level01-shadowstalk-png{ + clip-path: xywh(0 98.48675914249685% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.54981084489282%); +} + +.talent-vorazun-level05-unlockdarkarchon-png{ + clip-path: xywh(0 98.61286254728877% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.67591424968474%); +} + +.talent-zagara-level12-unlockswarmling-png{ + clip-path: xywh(0 98.7389659520807% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.80201765447667%); +} + +.talent-zagara-level14-unlocksplitterling-png{ + clip-path: xywh(0 98.86506935687264% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -48.928121059268605%); +} + +.tip_terrazinefog-png{ + clip-path: xywh(0 98.99117276166457% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.054224464060525%); +} + +.ui_aicommand_build_open_aggressivepush-png{ + clip-path: xywh(0 99.11727616645649% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.18032786885246%); +} + +.ui_btn_generic_exclemation_red-png{ + clip-path: xywh(0 99.24337957124843% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.30643127364439%); +} + +.ui_glues_help_armyicon_protoss-png{ + clip-path: xywh(0 99.36948297604036% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.43253467843631%); +} + +.ui_glues_help_armyicon_terran-png{ + clip-path: xywh(0 99.49558638083228% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.558638083228246%); +} + +.ui_glues_help_armyicon_zerg-png{ + clip-path: xywh(0 99.62168978562421% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.68474148802018%); +} + +.ui_tipicon_evolution_hydralisk-waves-png{ + clip-path: xywh(0 99.74779319041615% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.8108448928121%); +} + +.vultureautolaunchers-png{ + clip-path: xywh(0 99.87389659520807% 100% 0.12610340479192939%); + transform: scale(1, 793) translate(0, -49.93694829760403%); +} + diff --git a/WebHostLib/stats.py b/WebHostLib/stats.py index 36545ac96f..2ce25c2cc7 100644 --- a/WebHostLib/stats.py +++ b/WebHostLib/stats.py @@ -1,4 +1,3 @@ -import typing from collections import Counter, defaultdict from colorsys import hsv_to_rgb from datetime import datetime, timedelta, date @@ -18,21 +17,23 @@ from .models import Room PLOT_WIDTH = 600 -def get_db_data(known_games: typing.Set[str]) -> typing.Tuple[typing.Counter[str], - typing.DefaultDict[datetime.date, typing.Dict[str, int]]]: - games_played = defaultdict(Counter) - total_games = Counter() +def get_db_data(known_games: set[str]) -> tuple[Counter[str], defaultdict[date, dict[str, int]]]: + games_played: defaultdict[date, dict[str, int]] = defaultdict(Counter) + total_games: Counter[str] = Counter() cutoff = date.today() - timedelta(days=30) room: Room for room in select(room for room in Room if room.creation_time >= cutoff): for slot in room.seed.slots: if slot.game in known_games: - total_games[slot.game] += 1 - games_played[room.creation_time.date()][slot.game] += 1 + current_game = slot.game + else: + current_game = "Other" + total_games[current_game] += 1 + games_played[room.creation_time.date()][current_game] += 1 return total_games, games_played -def get_color_palette(colors_needed: int) -> typing.List[RGB]: +def get_color_palette(colors_needed: int) -> list[RGB]: colors = [] # colors_needed +1 to prevent first and last color being too close to each other colors_needed += 1 @@ -47,8 +48,7 @@ def get_color_palette(colors_needed: int) -> typing.List[RGB]: return colors -def create_game_played_figure(all_games_data: typing.Dict[datetime.date, typing.Dict[str, int]], - game: str, color: RGB) -> figure: +def create_game_played_figure(all_games_data: dict[date, dict[str, int]], game: str, color: RGB) -> figure: occurences = [] days = [day for day, game_data in all_games_data.items() if game_data[game]] for day in days: @@ -84,7 +84,7 @@ def stats(): days = sorted(games_played) color_palette = get_color_palette(len(total_games)) - game_to_color: typing.Dict[str, RGB] = {game: color for game, color in zip(total_games, color_palette)} + game_to_color: dict[str, RGB] = {game: color for game, color in zip(total_games, color_palette)} for game in sorted(total_games): occurences = [] diff --git a/WebHostLib/templates/gameInfo.html b/WebHostLib/templates/gameInfo.html deleted file mode 100644 index 3b908004b1..0000000000 --- a/WebHostLib/templates/gameInfo.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends 'pageWrapper.html' %} - -{% block head %} - {{ game }} Info - - - -{% endblock %} - -{% block body %} - {% include 'header/'+theme+'Header.html' %} -
- -
-{% endblock %} diff --git a/WebHostLib/templates/genericTracker.html b/WebHostLib/templates/genericTracker.html index b92097ceea..2598aa1219 100644 --- a/WebHostLib/templates/genericTracker.html +++ b/WebHostLib/templates/genericTracker.html @@ -98,7 +98,7 @@ {% if hint.finding_player == player %} {{ player_names_with_alias[(team, hint.finding_player)] }} - {% elif get_slot_info(team, hint.finding_player).type == 2 %} + {% elif get_slot_info(hint.finding_player).type == 2 %} {{ player_names_with_alias[(team, hint.finding_player)] }} {% else %} @@ -109,7 +109,7 @@ {% if hint.receiving_player == player %} {{ player_names_with_alias[(team, hint.receiving_player)] }} - {% elif get_slot_info(team, hint.receiving_player).type == 2 %} + {% elif get_slot_info(hint.receiving_player).type == 2 %} {{ player_names_with_alias[(team, hint.receiving_player)] }} {% else %} diff --git a/WebHostLib/templates/hostGame.html b/WebHostLib/templates/hostGame.html index 3840635153..d7d0a96331 100644 --- a/WebHostLib/templates/hostGame.html +++ b/WebHostLib/templates/hostGame.html @@ -17,9 +17,7 @@ This page allows you to host a game which was not generated by the website. For example, if you have generated a game on your own computer, you may upload the zip file created by the generator to host the game here. This will also provide a tracker, and the ability for your players to download - their patch files if the game is core-verified. For Custom Games, you can find the patch files in - the output .zip file you are uploading here. You need to manually distribute those patch files to - your players. + their patch files.

In addition to the zip file created by the generator, you may upload a multidata file here as well.

diff --git a/WebHostLib/templates/macros.html b/WebHostLib/templates/macros.html index b95b8820a7..9a16bce1d3 100644 --- a/WebHostLib/templates/macros.html +++ b/WebHostLib/templates/macros.html @@ -26,30 +26,18 @@ {{ patch.game }} {% if patch.data %} - {% if patch.game == "Minecraft" %} - - Download APMC File... - {% elif patch.game == "Factorio" %} - - Download Factorio Mod... - {% elif patch.game == "Kingdom Hearts 2" %} - - Download Kingdom Hearts 2 Mod... - {% elif patch.game == "Ocarina of Time" %} - - Download APZ5 File... - {% elif patch.game == "VVVVVV" and room.seed.slots|length == 1 %} + {% if patch.game == "VVVVVV" and room.seed.slots|length == 1 %} Download APV6 File... {% elif patch.game == "Super Mario 64" and room.seed.slots|length == 1 %} Download APSM64EX File... - {% elif patch.game | supports_apdeltapatch %} + {% elif patch.game == "Factorio" %} + + Download Factorio Mod... + {% elif patch.game | is_applayercontainer(patch.data, patch.player_id) %} Download Patch File... - {% elif patch.game == "Final Fantasy Mystic Quest" %} - - Download APMQ File... {% else %} No file to download for this game. {% endif %} diff --git a/WebHostLib/templates/markdown_document.html b/WebHostLib/templates/markdown_document.html index 07b3c8354d..a56ea244c7 100644 --- a/WebHostLib/templates/markdown_document.html +++ b/WebHostLib/templates/markdown_document.html @@ -1,7 +1,8 @@ {% extends 'pageWrapper.html' %} {% block head %} - {% include 'header/grassHeader.html' %} + {% set theme_name = theme|default("grass", true) %} + {% include "header/"+theme_name+"Header.html" %} {{ title }} {% endblock %} diff --git a/WebHostLib/templates/multispheretracker.html b/WebHostLib/templates/multispheretracker.html index a866974983..56aa8704ed 100644 --- a/WebHostLib/templates/multispheretracker.html +++ b/WebHostLib/templates/multispheretracker.html @@ -45,15 +45,15 @@ {%- set current_sphere = loop.index %} {%- for player, sphere_location_ids in sphere.items() %} {%- set checked_locations = tracker_data.get_player_checked_locations(team, player) %} - {%- set finder_game = tracker_data.get_player_game(team, player) %} - {%- set player_location_data = tracker_data.get_player_locations(team, player) %} + {%- set finder_game = tracker_data.get_player_game(player) %} + {%- set player_location_data = tracker_data.get_player_locations(player) %} {%- for location_id in sphere_location_ids.intersection(checked_locations) %} {%- set item_id, receiver, item_flags = player_location_data[location_id] %} - {%- set receiver_game = tracker_data.get_player_game(team, receiver) %} + {%- set receiver_game = tracker_data.get_player_game(receiver) %} {{ current_sphere }} - {{ tracker_data.get_player_name(team, player) }} - {{ tracker_data.get_player_name(team, receiver) }} + {{ tracker_data.get_player_name(player) }} + {{ tracker_data.get_player_name(receiver) }} {{ tracker_data.item_id_to_name[receiver_game][item_id] }} {{ tracker_data.location_id_to_name[finder_game][location_id] }} {{ finder_game }} diff --git a/WebHostLib/templates/multitrackerHintTable.html b/WebHostLib/templates/multitrackerHintTable.html index fcc15fb37a..9d9d6249c1 100644 --- a/WebHostLib/templates/multitrackerHintTable.html +++ b/WebHostLib/templates/multitrackerHintTable.html @@ -22,14 +22,14 @@ -%} - {% if get_slot_info(team, hint.finding_player).type == 2 %} + {% if get_slot_info(hint.finding_player).type == 2 %} {{ player_names_with_alias[(team, hint.finding_player)] }} {% else %} {{ player_names_with_alias[(team, hint.finding_player)] }} {% endif %} - {% if get_slot_info(team, hint.receiving_player).type == 2 %} + {% if get_slot_info(hint.receiving_player).type == 2 %} {{ player_names_with_alias[(team, hint.receiving_player)] }} {% else %} {{ player_names_with_alias[(team, hint.receiving_player)] }} diff --git a/WebHostLib/templates/playerOptions/macros.html b/WebHostLib/templates/playerOptions/macros.html index bbb3c75d12..a4cc3aa5ac 100644 --- a/WebHostLib/templates/playerOptions/macros.html +++ b/WebHostLib/templates/playerOptions/macros.html @@ -134,6 +134,7 @@ {% macro OptionList(option_name, option) %} {{ OptionTitle(option_name, option) }} +
{% for key in (option.valid_keys if option.valid_keys is ordered else option.valid_keys|sort) %}
@@ -146,6 +147,7 @@ {% macro LocationSet(option_name, option) %} {{ OptionTitle(option_name, option) }} +
{% for group_name in world.location_name_groups.keys()|sort %} {% if group_name != "Everywhere" %} @@ -169,6 +171,7 @@ {% macro ItemSet(option_name, option) %} {{ OptionTitle(option_name, option) }} +
{% for group_name in world.item_name_groups.keys()|sort %} {% if group_name != "Everything" %} @@ -192,6 +195,7 @@ {% macro OptionSet(option_name, option) %} {{ OptionTitle(option_name, option) }} +
{% for key in (option.valid_keys if option.valid_keys is ordered else option.valid_keys|sort) %}
diff --git a/WebHostLib/templates/siteMap.html b/WebHostLib/templates/siteMap.html index b7db8227dc..4b764c341a 100644 --- a/WebHostLib/templates/siteMap.html +++ b/WebHostLib/templates/siteMap.html @@ -11,32 +11,32 @@

Site Map

Base Pages

Tutorials

Game Info Pages

diff --git a/WebHostLib/templates/tracker__Minecraft.html b/WebHostLib/templates/tracker__Minecraft.html deleted file mode 100644 index 248f2778bd..0000000000 --- a/WebHostLib/templates/tracker__Minecraft.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - {{ player_name }}'s Tracker - - - - - - - {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #} - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
{{ pearls_count }}
-
-
-
- -
{{ scrap_count }}
-
-
-
- -
{{ shard_count }}
-
-
- - {% for area in checks_done %} - - - - - - {% for location in location_info[area] %} - - - - - {% endfor %} - - {% endfor %} -
{{ area }} {{'▼' if area != 'Total'}}{{ checks_done[area] }} / {{ checks_in_area[area] }}
{{ location }}{{ '✔' if location_info[area][location] else '' }}
-
- - diff --git a/WebHostLib/templates/tracker__Starcraft2.html b/WebHostLib/templates/tracker__Starcraft2.html index d365d12633..932f21505d 100644 --- a/WebHostLib/templates/tracker__Starcraft2.html +++ b/WebHostLib/templates/tracker__Starcraft2.html @@ -1,1092 +1,2254 @@ +{# Most of this file is generated using code from the ap-sc2-tracker-proto repo. #} -{% macro sc2_icon(name) -%} - -{% endmacro -%} -{% macro sc2_progressive_icon(name, url, level) -%} - -{% endmacro -%} -{% macro sc2_progressive_icon_with_custom_name(item_name, url, title) -%} - -{% endmacro -%} -{%+ macro sc2_tint_level(level) %} - tint-level-{{ level }} -{%+ endmacro %} -{% macro sc2_render_area(area) %} - - {{ area }} {{'▼' if area != 'Total'}} - {{ checks_done[area] }} / {{ checks_in_area[area] }} - - - {% for location in location_info[area] %} - - {{ location }} - {{ '✔' if location_info[area][location] else '' }} - - {% endfor %} - -{% endmacro -%} -{% macro sc2_loop_areas(column_index, column_count) %} - {% for area in checks_in_area if checks_in_area[area] > 0 and area != 'Total' %} - {% if loop.index0 < (loop.length / column_count) * (column_index + 1) - and loop.index0 >= (loop.length / column_count) * (column_index) %} - {{ sc2_render_area(area) }} - {% endif %} - {% endfor %} -{% endmacro -%} - {{ player_name }}'s Tracker - - - + {{ player_name }}'s Tracker + + + + - - - {# TODO: Replace this with a proper wrapper for each tracker when developing TrackerAPI. #} -
- Switch To Generic Tracker + + +
+
+

{{ player_name }}'s Starcraft 2 Tracker{{' - Finished' if game_finished}}

- -
- - - - - - - - - - - - - - -
- - - - - - - - - - - - -
-

{{ player_name }}'s Starcraft 2 Tracker

- Starting Resources -
+{{ minerals_count }}
+{{ vespene_count }}
+{{ supply_count }}
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Terran -
- Weapon & Armor Upgrades -
{{ sc2_progressive_icon('Progressive Terran Infantry Weapon', terran_infantry_weapon_url, terran_infantry_weapon_level) }}{{ sc2_progressive_icon('Progressive Terran Infantry Armor', terran_infantry_armor_url, terran_infantry_armor_level) }}{{ sc2_progressive_icon('Progressive Terran Vehicle Weapon', terran_vehicle_weapon_url, terran_vehicle_weapon_level) }}{{ sc2_progressive_icon('Progressive Terran Vehicle Armor', terran_vehicle_armor_url, terran_vehicle_armor_level) }}{{ sc2_progressive_icon('Progressive Terran Ship Weapon', terran_ship_weapon_url, terran_ship_weapon_level) }}{{ sc2_progressive_icon('Progressive Terran Ship Armor', terran_ship_armor_url, terran_ship_armor_level) }}{{ sc2_icon('Ultra-Capacitors') }}{{ sc2_icon('Vanadium Plating') }}
- Base -
{{ sc2_icon('Bunker') }}{{ sc2_icon('Projectile Accelerator (Bunker)') }}{{ sc2_icon('Neosteel Bunker (Bunker)') }}{{ sc2_icon('Shrike Turret (Bunker)') }}{{ sc2_icon('Fortified Bunker (Bunker)') }}{{ sc2_icon('Missile Turret') }}{{ sc2_icon('Titanium Housing (Missile Turret)') }}{{ sc2_icon('Hellstorm Batteries (Missile Turret)') }}{{ sc2_icon('Tech Reactor') }}{{ sc2_icon('Orbital Depots') }}
{{ sc2_icon('Command Center Reactor') }}{{ sc2_progressive_icon_with_custom_name('Progressive Orbital Command', orbital_command_url, orbital_command_name) }}{{ sc2_icon('Planetary Fortress') }}{{ sc2_progressive_icon_with_custom_name('Progressive Augmented Thrusters (Planetary Fortress)', augmented_thrusters_planetary_fortress_url, augmented_thrusters_planetary_fortress_name) }}{{ sc2_icon('Advanced Targeting (Planetary Fortress)') }}{{ sc2_icon('Micro-Filtering') }}{{ sc2_icon('Automated Refinery') }}{{ sc2_icon('Advanced Construction (SCV)') }}{{ sc2_icon('Dual-Fusion Welders (SCV)') }}{{ sc2_icon('Hostile Environment Adaptation (SCV)') }}
{{ sc2_icon('Sensor Tower') }}{{ sc2_icon('Perdition Turret') }}{{ sc2_icon('Hive Mind Emulator') }}{{ sc2_icon('Psi Disrupter') }}
- Infantry - - Vehicles -
{{ sc2_icon('Marine') }}{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Marine)', stimpack_marine_url, stimpack_marine_name) }}{{ sc2_icon('Combat Shield (Marine)') }}{{ sc2_icon('Laser Targeting System (Marine)') }}{{ sc2_icon('Magrail Munitions (Marine)') }}{{ sc2_icon('Optimized Logistics (Marine)') }}{{ sc2_icon('Hellion') }}{{ sc2_icon('Twin-Linked Flamethrower (Hellion)') }}{{ sc2_icon('Thermite Filaments (Hellion)') }}{{ sc2_icon('Hellbat Aspect (Hellion)') }}{{ sc2_icon('Smart Servos (Hellion)') }}{{ sc2_icon('Optimized Logistics (Hellion)') }}{{ sc2_icon('Jump Jets (Hellion)') }}
{{ sc2_icon('Medic') }}{{ sc2_icon('Advanced Medic Facilities (Medic)') }}{{ sc2_icon('Stabilizer Medpacks (Medic)') }}{{ sc2_icon('Restoration (Medic)') }}{{ sc2_icon('Optical Flare (Medic)') }}{{ sc2_icon('Resource Efficiency (Medic)') }}{{ sc2_icon('Adaptive Medpacks (Medic)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Hellion)', stimpack_hellion_url, stimpack_hellion_name) }}{{ sc2_icon('Infernal Plating (Hellion)') }}
{{ sc2_icon('Nano Projector (Medic)') }}{{ sc2_icon('Vulture') }}{{ sc2_progressive_icon_with_custom_name('Progressive Replenishable Magazine (Vulture)', replenishable_magazine_vulture_url, replenishable_magazine_vulture_name) }}{{ sc2_icon('Ion Thrusters (Vulture)') }}{{ sc2_icon('Auto Launchers (Vulture)') }}{{ sc2_icon('Auto-Repair (Vulture)') }}
{{ sc2_icon('Firebat') }}{{ sc2_icon('Incinerator Gauntlets (Firebat)') }}{{ sc2_icon('Juggernaut Plating (Firebat)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Firebat)', stimpack_firebat_url, stimpack_firebat_name) }}{{ sc2_icon('Resource Efficiency (Firebat)') }}{{ sc2_icon('Infernal Pre-Igniter (Firebat)') }}{{ sc2_icon('Kinetic Foam (Firebat)') }}{{ sc2_icon('Cerberus Mine (Spider Mine)') }}{{ sc2_icon('High Explosive Munition (Spider Mine)') }}
{{ sc2_icon('Nano Projectors (Firebat)') }}{{ sc2_icon('Goliath') }}{{ sc2_icon('Multi-Lock Weapons System (Goliath)') }}{{ sc2_icon('Ares-Class Targeting System (Goliath)') }}{{ sc2_icon('Jump Jets (Goliath)') }}{{ sc2_icon('Shaped Hull (Goliath)') }}{{ sc2_icon('Optimized Logistics (Goliath)') }}{{ sc2_icon('Resource Efficiency (Goliath)') }}
{{ sc2_icon('Marauder') }}{{ sc2_icon('Concussive Shells (Marauder)') }}{{ sc2_icon('Kinetic Foam (Marauder)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Marauder)', stimpack_marauder_url, stimpack_marauder_name) }}{{ sc2_icon('Laser Targeting System (Marauder)') }}{{ sc2_icon('Magrail Munitions (Marauder)') }}{{ sc2_icon('Internal Tech Module (Marauder)') }}{{ sc2_icon('Internal Tech Module (Goliath)') }}
{{ sc2_icon('Juggernaut Plating (Marauder)') }}{{ sc2_icon('Diamondback') }}{{ sc2_progressive_icon_with_custom_name('Progressive Tri-Lithium Power Cell (Diamondback)', trilithium_power_cell_diamondback_url, trilithium_power_cell_diamondback_name) }}{{ sc2_icon('Shaped Hull (Diamondback)') }}{{ sc2_icon('Hyperfluxor (Diamondback)') }}{{ sc2_icon('Burst Capacitors (Diamondback)') }}{{ sc2_icon('Ion Thrusters (Diamondback)') }}{{ sc2_icon('Resource Efficiency (Diamondback)') }}
{{ sc2_icon('Reaper') }}{{ sc2_icon('U-238 Rounds (Reaper)') }}{{ sc2_icon('G-4 Clusterbomb (Reaper)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Stimpack (Reaper)', stimpack_reaper_url, stimpack_reaper_name) }}{{ sc2_icon('Laser Targeting System (Reaper)') }}{{ sc2_icon('Advanced Cloaking Field (Reaper)') }}{{ sc2_icon('Spider Mines (Reaper)') }}{{ sc2_icon('Siege Tank') }}{{ sc2_icon('Maelstrom Rounds (Siege Tank)') }}{{ sc2_icon('Shaped Blast (Siege Tank)') }}{{ sc2_icon('Jump Jets (Siege Tank)') }}{{ sc2_icon('Spider Mines (Siege Tank)') }}{{ sc2_icon('Smart Servos (Siege Tank)') }}{{ sc2_icon('Graduating Range (Siege Tank)') }}
{{ sc2_icon('Combat Drugs (Reaper)') }}{{ sc2_icon('Jet Pack Overdrive (Reaper)') }}{{ sc2_icon('Laser Targeting System (Siege Tank)') }}{{ sc2_icon('Advanced Siege Tech (Siege Tank)') }}{{ sc2_icon('Internal Tech Module (Siege Tank)') }}{{ sc2_icon('Shaped Hull (Siege Tank)') }}{{ sc2_icon('Resource Efficiency (Siege Tank)') }}
{{ sc2_icon('Ghost') }}{{ sc2_icon('Ocular Implants (Ghost)') }}{{ sc2_icon('Crius Suit (Ghost)') }}{{ sc2_icon('EMP Rounds (Ghost)') }}{{ sc2_icon('Lockdown (Ghost)') }}{{ sc2_icon('Resource Efficiency (Ghost)') }}{{ sc2_icon('Thor') }}{{ sc2_icon('330mm Barrage Cannon (Thor)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Immortality Protocol (Thor)', immortality_protocol_thor_url, immortality_protocol_thor_name) }}{{ sc2_progressive_icon_with_custom_name('Progressive High Impact Payload (Thor)', high_impact_payload_thor_url, high_impact_payload_thor_name) }}{{ sc2_icon('Button With a Skull on It (Thor)') }}{{ sc2_icon('Laser Targeting System (Thor)') }}{{ sc2_icon('Large Scale Field Construction (Thor)') }}
{{ sc2_icon('Spectre') }}{{ sc2_icon('Psionic Lash (Spectre)') }}{{ sc2_icon('Nyx-Class Cloaking Module (Spectre)') }}{{ sc2_icon('Impaler Rounds (Spectre)') }}{{ sc2_icon('Resource Efficiency (Spectre)') }}{{ sc2_icon('Predator') }}{{ sc2_icon('Resource Efficiency (Predator)') }}{{ sc2_icon('Cloak (Predator)') }}{{ sc2_icon('Charge (Predator)') }}{{ sc2_icon('Predator\'s Fury (Predator)') }}
{{ sc2_icon('HERC') }}{{ sc2_icon('Juggernaut Plating (HERC)') }}{{ sc2_icon('Kinetic Foam (HERC)') }}{{ sc2_icon('Resource Efficiency (HERC)') }}{{ sc2_icon('Widow Mine') }}{{ sc2_icon('Drilling Claws (Widow Mine)') }}{{ sc2_icon('Concealment (Widow Mine)') }}{{ sc2_icon('Black Market Launchers (Widow Mine)') }}{{ sc2_icon('Executioner Missiles (Widow Mine)') }}
{{ sc2_icon('Cyclone') }}{{ sc2_icon('Mag-Field Accelerators (Cyclone)') }}{{ sc2_icon('Mag-Field Launchers (Cyclone)') }}{{ sc2_icon('Targeting Optics (Cyclone)') }}{{ sc2_icon('Rapid Fire Launchers (Cyclone)') }}{{ sc2_icon('Resource Efficiency (Cyclone)') }}{{ sc2_icon('Internal Tech Module (Cyclone)') }}
{{ sc2_icon('Warhound') }}{{ sc2_icon('Resource Efficiency (Warhound)') }}{{ sc2_icon('Reinforced Plating (Warhound)') }}
- Starships -
{{ sc2_icon('Medivac') }}{{ sc2_icon('Rapid Deployment Tube (Medivac)') }}{{ sc2_icon('Advanced Healing AI (Medivac)') }}{{ sc2_icon('Expanded Hull (Medivac)') }}{{ sc2_icon('Afterburners (Medivac)') }}{{ sc2_icon('Scatter Veil (Medivac)') }}{{ sc2_icon('Advanced Cloaking Field (Medivac)') }}{{ sc2_icon('Raven') }}{{ sc2_icon('Bio Mechanical Repair Drone (Raven)') }}{{ sc2_icon('Spider Mines (Raven)') }}{{ sc2_icon('Railgun Turret (Raven)') }}{{ sc2_icon('Hunter-Seeker Weapon (Raven)') }}{{ sc2_icon('Interference Matrix (Raven)') }}{{ sc2_icon('Anti-Armor Missile (Raven)') }}
{{ sc2_icon('Wraith') }}{{ sc2_progressive_icon_with_custom_name('Progressive Tomahawk Power Cells (Wraith)', tomahawk_power_cells_wraith_url, tomahawk_power_cells_wraith_name) }}{{ sc2_icon('Displacement Field (Wraith)') }}{{ sc2_icon('Advanced Laser Technology (Wraith)') }}{{ sc2_icon('Trigger Override (Wraith)') }}{{ sc2_icon('Internal Tech Module (Wraith)') }}{{ sc2_icon('Resource Efficiency (Wraith)') }}{{ sc2_icon('Internal Tech Module (Raven)') }}{{ sc2_icon('Resource Efficiency (Raven)') }}{{ sc2_icon('Durable Materials (Raven)') }}
{{ sc2_icon('Viking') }}{{ sc2_icon('Ripwave Missiles (Viking)') }}{{ sc2_icon('Phobos-Class Weapons System (Viking)') }}{{ sc2_icon('Smart Servos (Viking)') }}{{ sc2_icon('Anti-Mechanical Munition (Viking)') }}{{ sc2_icon('Shredder Rounds (Viking)') }}{{ sc2_icon('W.I.L.D. Missiles (Viking)') }}{{ sc2_icon('Science Vessel') }}{{ sc2_icon('EMP Shockwave (Science Vessel)') }}{{ sc2_icon('Defensive Matrix (Science Vessel)') }}{{ sc2_icon('Improved Nano-Repair (Science Vessel)') }}{{ sc2_icon('Advanced AI Systems (Science Vessel)') }}
{{ sc2_icon('Banshee') }}{{ sc2_progressive_icon_with_custom_name('Progressive Cross-Spectrum Dampeners (Banshee)', crossspectrum_dampeners_banshee_url, crossspectrum_dampeners_banshee_name) }}{{ sc2_icon('Shockwave Missile Battery (Banshee)') }}{{ sc2_icon('Hyperflight Rotors (Banshee)') }}{{ sc2_icon('Laser Targeting System (Banshee)') }}{{ sc2_icon('Internal Tech Module (Banshee)') }}{{ sc2_icon('Shaped Hull (Banshee)') }}{{ sc2_icon('Hercules') }}{{ sc2_icon('Internal Fusion Module (Hercules)') }}{{ sc2_icon('Tactical Jump (Hercules)') }}
{{ sc2_icon('Advanced Targeting Optics (Banshee)') }}{{ sc2_icon('Distortion Blasters (Banshee)') }}{{ sc2_icon('Rocket Barrage (Banshee)') }}{{ sc2_icon('Liberator') }}{{ sc2_icon('Advanced Ballistics (Liberator)') }}{{ sc2_icon('Raid Artillery (Liberator)') }}{{ sc2_icon('Cloak (Liberator)') }}{{ sc2_icon('Laser Targeting System (Liberator)') }}{{ sc2_icon('Optimized Logistics (Liberator)') }}{{ sc2_icon('Smart Servos (Liberator)') }}
{{ sc2_icon('Battlecruiser') }}{{ sc2_progressive_icon('Progressive Missile Pods (Battlecruiser)', missile_pods_battlecruiser_url, missile_pods_battlecruiser_level) }}{{ sc2_progressive_icon_with_custom_name('Progressive Defensive Matrix (Battlecruiser)', defensive_matrix_battlecruiser_url, defensive_matrix_battlecruiser_name) }}{{ sc2_icon('Tactical Jump (Battlecruiser)') }}{{ sc2_icon('Cloak (Battlecruiser)') }}{{ sc2_icon('ATX Laser Battery (Battlecruiser)') }}{{ sc2_icon('Optimized Logistics (Battlecruiser)') }}{{ sc2_icon('Resource Efficiency (Liberator)') }}
{{ sc2_icon('Internal Tech Module (Battlecruiser)') }}{{ sc2_icon('Behemoth Plating (Battlecruiser)') }}{{ sc2_icon('Covert Ops Engines (Battlecruiser)') }}{{ sc2_icon('Valkyrie') }}{{ sc2_icon('Enhanced Cluster Launchers (Valkyrie)') }}{{ sc2_icon('Shaped Hull (Valkyrie)') }}{{ sc2_icon('Flechette Missiles (Valkyrie)') }}{{ sc2_icon('Afterburners (Valkyrie)') }}{{ sc2_icon('Launching Vector Compensator (Valkyrie)') }}{{ sc2_icon('Resource Efficiency (Valkyrie)') }}
- Mercenaries -
{{ sc2_icon('War Pigs') }}{{ sc2_icon('Devil Dogs') }}{{ sc2_icon('Hammer Securities') }}{{ sc2_icon('Spartan Company') }}{{ sc2_icon('Siege Breakers') }}{{ sc2_icon('Hel\'s Angels') }}{{ sc2_icon('Dusk Wings') }}{{ sc2_icon('Jackson\'s Revenge') }}{{ sc2_icon('Skibi\'s Angels') }}{{ sc2_icon('Death Heads') }}{{ sc2_icon('Winged Nightmares') }}{{ sc2_icon('Midnight Riders') }}{{ sc2_icon('Brynhilds') }}{{ sc2_icon('Jotun') }}
- General Upgrades -
{{ sc2_progressive_icon('Progressive Fire-Suppression System', firesuppression_system_url, firesuppression_system_level) }}{{ sc2_icon('Orbital Strike') }}{{ sc2_icon('Cellular Reactor') }}{{ sc2_progressive_icon('Progressive Regenerative Bio-Steel', regenerative_biosteel_url, regenerative_biosteel_level) }}{{ sc2_icon('Structure Armor') }}{{ sc2_icon('Hi-Sec Auto Tracking') }}{{ sc2_icon('Advanced Optics') }}{{ sc2_icon('Rogue Forces') }}
- Nova Equipment -
{{ sc2_icon('C20A Canister Rifle (Nova Weapon)') }}{{ sc2_icon('Hellfire Shotgun (Nova Weapon)') }}{{ sc2_icon('Plasma Rifle (Nova Weapon)') }}{{ sc2_icon('Monomolecular Blade (Nova Weapon)') }}{{ sc2_icon('Blazefire Gunblade (Nova Weapon)') }}{{ sc2_icon('Stim Infusion (Nova Gadget)') }}{{ sc2_icon('Pulse Grenades (Nova Gadget)') }}{{ sc2_icon('Flashbang Grenades (Nova Gadget)') }}{{ sc2_icon('Ionic Force Field (Nova Gadget)') }}{{ sc2_icon('Holo Decoy (Nova Gadget)') }}
{{ sc2_progressive_icon_with_custom_name('Progressive Stealth Suit Module (Nova Suit Module)', stealth_suit_module_nova_suit_module_url, stealth_suit_module_nova_suit_module_name) }}{{ sc2_icon('Energy Suit Module (Nova Suit Module)') }}{{ sc2_icon('Armored Suit Module (Nova Suit Module)') }}{{ sc2_icon('Jump Suit Module (Nova Suit Module)') }}{{ sc2_icon('Ghost Visor (Nova Equipment)') }}{{ sc2_icon('Rangefinder Oculus (Nova Equipment)') }}{{ sc2_icon('Domination (Nova Ability)') }}{{ sc2_icon('Blink (Nova Ability)') }}{{ sc2_icon('Tac Nuke Strike (Nova Ability)') }}
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Zerg -
- Weapon & Armor Upgrades -
{{ sc2_progressive_icon('Progressive Zerg Melee Attack', zerg_melee_attack_url, zerg_melee_attack_level) }}{{ sc2_progressive_icon('Progressive Zerg Missile Attack', zerg_missile_attack_url, zerg_missile_attack_level) }}{{ sc2_progressive_icon('Progressive Zerg Ground Carapace', zerg_ground_carapace_url, zerg_ground_carapace_level) }}{{ sc2_progressive_icon('Progressive Zerg Flyer Attack', zerg_flyer_attack_url, zerg_flyer_attack_level) }}{{ sc2_progressive_icon('Progressive Zerg Flyer Carapace', zerg_flyer_carapace_url, zerg_flyer_carapace_level) }}
- Base -
{{ sc2_icon('Automated Extractors (Kerrigan Tier 3)') }}{{ sc2_icon('Vespene Efficiency (Kerrigan Tier 5)') }}{{ sc2_icon('Twin Drones (Kerrigan Tier 5)') }}{{ sc2_icon('Improved Overlords (Kerrigan Tier 3)') }}{{ sc2_icon('Ventral Sacs (Overlord)') }}
{{ sc2_icon('Malignant Creep (Kerrigan Tier 5)') }}{{ sc2_icon('Spine Crawler') }}{{ sc2_icon('Spore Crawler') }}
- Units -
{{ sc2_icon('Zergling') }}{{ sc2_icon('Raptor Strain (Zergling)') }}{{ sc2_icon('Swarmling Strain (Zergling)') }}{{ sc2_icon('Hardened Carapace (Zergling)') }}{{ sc2_icon('Adrenal Overload (Zergling)') }}{{ sc2_icon('Metabolic Boost (Zergling)') }}{{ sc2_icon('Shredding Claws (Zergling)') }}{{ sc2_icon('Zergling Reconstitution (Kerrigan Tier 3)') }}
{{ sc2_icon('Baneling Aspect (Zergling)') }}{{ sc2_icon('Splitter Strain (Baneling)') }}{{ sc2_icon('Hunter Strain (Baneling)') }}{{ sc2_icon('Corrosive Acid (Baneling)') }}{{ sc2_icon('Rupture (Baneling)') }}{{ sc2_icon('Regenerative Acid (Baneling)') }}{{ sc2_icon('Centrifugal Hooks (Baneling)') }}
{{ sc2_icon('Tunneling Jaws (Baneling)') }}{{ sc2_icon('Rapid Metamorph (Baneling)') }}
{{ sc2_icon('Swarm Queen') }}{{ sc2_icon('Spawn Larvae (Swarm Queen)') }}{{ sc2_icon('Deep Tunnel (Swarm Queen)') }}{{ sc2_icon('Organic Carapace (Swarm Queen)') }}{{ sc2_icon('Bio-Mechanical Transfusion (Swarm Queen)') }}{{ sc2_icon('Resource Efficiency (Swarm Queen)') }}{{ sc2_icon('Incubator Chamber (Swarm Queen)') }}
{{ sc2_icon('Roach') }}{{ sc2_icon('Vile Strain (Roach)') }}{{ sc2_icon('Corpser Strain (Roach)') }}{{ sc2_icon('Hydriodic Bile (Roach)') }}{{ sc2_icon('Adaptive Plating (Roach)') }}{{ sc2_icon('Tunneling Claws (Roach)') }}{{ sc2_icon('Glial Reconstitution (Roach)') }}{{ sc2_icon('Organic Carapace (Roach)') }}
{{ sc2_icon('Ravager Aspect (Roach)') }}{{ sc2_icon('Potent Bile (Ravager)') }}{{ sc2_icon('Bloated Bile Ducts (Ravager)') }}{{ sc2_icon('Deep Tunnel (Ravager)') }}
{{ sc2_icon('Hydralisk') }}{{ sc2_icon('Frenzy (Hydralisk)') }}{{ sc2_icon('Ancillary Carapace (Hydralisk)') }}{{ sc2_icon('Grooved Spines (Hydralisk)') }}{{ sc2_icon('Muscular Augments (Hydralisk)') }}{{ sc2_icon('Resource Efficiency (Hydralisk)') }}
{{ sc2_icon('Impaler Aspect (Hydralisk)') }}{{ sc2_icon('Adaptive Talons (Impaler)') }}{{ sc2_icon('Secretion Glands (Impaler)') }}{{ sc2_icon('Hardened Tentacle Spines (Impaler)') }}
{{ sc2_icon('Lurker Aspect (Hydralisk)') }}{{ sc2_icon('Seismic Spines (Lurker)') }}{{ sc2_icon('Adapted Spines (Lurker)') }}
{{ sc2_icon('Aberration') }}
{{ sc2_icon('Swarm Host') }}{{ sc2_icon('Carrion Strain (Swarm Host)') }}{{ sc2_icon('Creeper Strain (Swarm Host)') }}{{ sc2_icon('Burrow (Swarm Host)') }}{{ sc2_icon('Rapid Incubation (Swarm Host)') }}{{ sc2_icon('Pressurized Glands (Swarm Host)') }}{{ sc2_icon('Locust Metabolic Boost (Swarm Host)') }}{{ sc2_icon('Enduring Locusts (Swarm Host)') }}
{{ sc2_icon('Organic Carapace (Swarm Host)') }}{{ sc2_icon('Resource Efficiency (Swarm Host)') }}
{{ sc2_icon('Infestor') }}{{ sc2_icon('Infested Terran (Infestor)') }}{{ sc2_icon('Microbial Shroud (Infestor)') }}
{{ sc2_icon('Defiler') }}
{{ sc2_icon('Ultralisk') }}{{ sc2_icon('Noxious Strain (Ultralisk)') }}{{ sc2_icon('Torrasque Strain (Ultralisk)') }}{{ sc2_icon('Burrow Charge (Ultralisk)') }}{{ sc2_icon('Tissue Assimilation (Ultralisk)') }}{{ sc2_icon('Monarch Blades (Ultralisk)') }}{{ sc2_icon('Anabolic Synthesis (Ultralisk)') }}{{ sc2_icon('Chitinous Plating (Ultralisk)') }}
{{ sc2_icon('Organic Carapace (Ultralisk)') }}{{ sc2_icon('Resource Efficiency (Ultralisk)') }}
{{ sc2_icon('Mutalisk') }}{{ sc2_icon('Rapid Regeneration (Mutalisk)') }}{{ sc2_icon('Sundering Glaive (Mutalisk)') }}{{ sc2_icon('Vicious Glaive (Mutalisk)') }}{{ sc2_icon('Severing Glaive (Mutalisk)') }}{{ sc2_icon('Aerodynamic Glaive Shape (Mutalisk)') }}
{{ sc2_icon('Corruptor') }}{{ sc2_icon('Corruption (Corruptor)') }}{{ sc2_icon('Caustic Spray (Corruptor)') }}
{{ sc2_icon('Brood Lord Aspect (Mutalisk/Corruptor)') }}{{ sc2_icon('Porous Cartilage (Brood Lord)') }}{{ sc2_icon('Evolved Carapace (Brood Lord)') }}{{ sc2_icon('Splitter Mitosis (Brood Lord)') }}{{ sc2_icon('Resource Efficiency (Brood Lord)') }}
{{ sc2_icon('Viper Aspect (Mutalisk/Corruptor)') }}{{ sc2_icon('Parasitic Bomb (Viper)') }}{{ sc2_icon('Paralytic Barbs (Viper)') }}{{ sc2_icon('Virulent Microbes (Viper)') }}
{{ sc2_icon('Guardian Aspect (Mutalisk/Corruptor)') }}{{ sc2_icon('Prolonged Dispersion (Guardian)') }}{{ sc2_icon('Primal Adaptation (Guardian)') }}{{ sc2_icon('Soronan Acid (Guardian)') }}
{{ sc2_icon('Devourer Aspect (Mutalisk/Corruptor)') }}{{ sc2_icon('Corrosive Spray (Devourer)') }}{{ sc2_icon('Gaping Maw (Devourer)') }}{{ sc2_icon('Improved Osmosis (Devourer)') }}{{ sc2_icon('Prescient Spores (Devourer)') }}
{{ sc2_icon('Brood Queen') }}{{ sc2_icon('Fungal Growth (Brood Queen)') }}{{ sc2_icon('Ensnare (Brood Queen)') }}{{ sc2_icon('Enhanced Mitochondria (Brood Queen)') }}
{{ sc2_icon('Scourge') }}{{ sc2_icon('Virulent Spores (Scourge)') }}{{ sc2_icon('Resource Efficiency (Scourge)') }}{{ sc2_icon('Swarm Scourge (Scourge)') }}
- Mercenaries -
{{ sc2_icon('Infested Medics') }}{{ sc2_icon('Infested Siege Tanks') }}{{ sc2_icon('Infested Banshees') }}
- Kerrigan -
Level: {{ kerrigan_level }}
{{ sc2_icon('Primal Form (Kerrigan)') }}
{{ sc2_icon('Kinetic Blast (Kerrigan Tier 1)') }}{{ sc2_icon('Heroic Fortitude (Kerrigan Tier 1)') }}{{ sc2_icon('Leaping Strike (Kerrigan Tier 1)') }}{{ sc2_icon('Crushing Grip (Kerrigan Tier 2)') }}{{ sc2_icon('Chain Reaction (Kerrigan Tier 2)') }}{{ sc2_icon('Psionic Shift (Kerrigan Tier 2)') }}
{{ sc2_icon('Wild Mutation (Kerrigan Tier 4)') }}{{ sc2_icon('Spawn Banelings (Kerrigan Tier 4)') }}{{ sc2_icon('Mend (Kerrigan Tier 4)') }}{{ sc2_icon('Infest Broodlings (Kerrigan Tier 6)') }}{{ sc2_icon('Fury (Kerrigan Tier 6)') }}{{ sc2_icon('Ability Efficiency (Kerrigan Tier 6)') }}
{{ sc2_icon('Apocalypse (Kerrigan Tier 7)') }}{{ sc2_icon('Spawn Leviathan (Kerrigan Tier 7)') }}{{ sc2_icon('Drop-Pods (Kerrigan Tier 7)') }}
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Protoss -
- Weapon & Armor Upgrades -
{{ sc2_progressive_icon('Progressive Protoss Ground Weapon', protoss_ground_weapon_url, protoss_ground_weapon_level) }}{{ sc2_progressive_icon('Progressive Protoss Ground Armor', protoss_ground_armor_url, protoss_ground_armor_level) }}{{ sc2_progressive_icon('Progressive Protoss Air Weapon', protoss_air_weapon_url, protoss_air_weapon_level) }}{{ sc2_progressive_icon('Progressive Protoss Air Armor', protoss_air_armor_url, protoss_air_armor_level) }}{{ sc2_progressive_icon('Progressive Protoss Shields', protoss_shields_url, protoss_shields_level) }}{{ sc2_icon('Quatro') }}
- Base -
{{ sc2_icon('Photon Cannon') }}{{ sc2_icon('Khaydarin Monolith') }}{{ sc2_icon('Shield Battery') }}{{ sc2_icon('Enhanced Targeting') }}{{ sc2_icon('Optimized Ordnance') }}{{ sc2_icon('Khalai Ingenuity') }}{{ sc2_icon('Orbital Assimilators') }}{{ sc2_icon('Amplified Assimilators') }}
{{ sc2_icon('Warp Harmonization') }}{{ sc2_icon('Superior Warp Gates') }}{{ sc2_icon('Nexus Overcharge') }}
- Gateway -
{{ sc2_icon('Zealot') }}{{ sc2_icon('Centurion') }}{{ sc2_icon('Sentinel') }}{{ sc2_icon('Leg Enhancements (Zealot/Sentinel/Centurion)') }}{{ sc2_icon('Shield Capacity (Zealot/Sentinel/Centurion)') }}
{{ sc2_icon('Supplicant') }}{{ sc2_icon('Blood Shield (Supplicant)') }}{{ sc2_icon('Soul Augmentation (Supplicant)') }}{{ sc2_icon('Shield Regeneration (Supplicant)') }}
{{ sc2_icon('Sentry') }}{{ sc2_icon('Force Field (Sentry)') }}{{ sc2_icon('Hallucination (Sentry)') }}
{{ sc2_icon('Energizer') }}{{ sc2_icon('Reclamation (Energizer)') }}{{ sc2_icon('Forged Chassis (Energizer)') }}{{ sc2_icon('Cloaking Module (Sentry/Energizer/Havoc)') }}{{ sc2_icon('Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)') }}
{{ sc2_icon('Havoc') }}{{ sc2_icon('Detect Weakness (Havoc)') }}{{ sc2_icon('Bloodshard Resonance (Havoc)') }}
{{ sc2_icon('Stalker') }}{{ sc2_icon('Instigator') }}{{ sc2_icon('Slayer') }}{{ sc2_icon('Disintegrating Particles (Stalker/Instigator/Slayer)') }}{{ sc2_icon('Particle Reflection (Stalker/Instigator/Slayer)') }}
{{ sc2_icon('Dragoon') }}{{ sc2_icon('High Impact Phase Disruptor (Dragoon)') }}{{ sc2_icon('Trillic Compression System (Dragoon)') }}{{ sc2_icon('Singularity Charge (Dragoon)') }}{{ sc2_icon('Enhanced Strider Servos (Dragoon)') }}
{{ sc2_icon('Adept') }}{{ sc2_icon('Shockwave (Adept)') }}{{ sc2_icon('Resonating Glaives (Adept)') }}{{ sc2_icon('Phase Bulwark (Adept)') }}
{{ sc2_icon('High Templar') }}{{ sc2_icon('Signifier') }}{{ sc2_icon('Unshackled Psionic Storm (High Templar/Signifier)') }}{{ sc2_icon('Hallucination (High Templar/Signifier)') }}{{ sc2_icon('Khaydarin Amulet (High Templar/Signifier)') }}{{ sc2_icon('High Archon (Archon)') }}
{{ sc2_icon('Ascendant') }}{{ sc2_icon('Power Overwhelming (Ascendant)') }}{{ sc2_icon('Chaotic Attunement (Ascendant)') }}{{ sc2_icon('Blood Amulet (Ascendant)') }}
{{ sc2_icon('Dark Archon') }}{{ sc2_icon('Feedback (Dark Archon)') }}{{ sc2_icon('Maelstrom (Dark Archon)') }}{{ sc2_icon('Argus Talisman (Dark Archon)') }}
{{ sc2_icon('Dark Templar') }}{{ sc2_icon('Dark Archon Meld (Dark Templar)') }}
{{ sc2_icon('Avenger') }}{{ sc2_icon('Blood Hunter') }}{{ sc2_icon('Shroud of Adun (Dark Templar/Avenger/Blood Hunter)') }}{{ sc2_icon('Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)') }}{{ sc2_icon('Blink (Dark Templar/Avenger/Blood Hunter)') }}{{ sc2_icon('Resource Efficiency (Dark Templar/Avenger/Blood Hunter)') }}
- Robotics Facility -
{{ sc2_icon('Warp Prism') }}{{ sc2_icon('Gravitic Drive (Warp Prism)') }}{{ sc2_icon('Phase Blaster (Warp Prism)') }}{{ sc2_icon('War Configuration (Warp Prism)') }}
{{ sc2_icon('Immortal') }}{{ sc2_icon('Annihilator') }}{{ sc2_icon('Singularity Charge (Immortal/Annihilator)') }}{{ sc2_icon('Advanced Targeting Mechanics (Immortal/Annihilator)') }}
{{ sc2_icon('Vanguard') }}{{ sc2_icon('Agony Launchers (Vanguard)') }}{{ sc2_icon('Matter Dispersion (Vanguard)') }}
{{ sc2_icon('Colossus') }}{{ sc2_icon('Pacification Protocol (Colossus)') }}
{{ sc2_icon('Wrathwalker') }}{{ sc2_icon('Rapid Power Cycling (Wrathwalker)') }}{{ sc2_icon('Eye of Wrath (Wrathwalker)') }}
{{ sc2_icon('Observer') }}{{ sc2_icon('Gravitic Boosters (Observer)') }}{{ sc2_icon('Sensor Array (Observer)') }}
{{ sc2_icon('Reaver') }}{{ sc2_icon('Scarab Damage (Reaver)') }}{{ sc2_icon('Solarite Payload (Reaver)') }}{{ sc2_icon('Reaver Capacity (Reaver)') }}{{ sc2_icon('Resource Efficiency (Reaver)') }}
{{ sc2_icon('Disruptor') }}
- Stargate -
{{ sc2_icon('Phoenix') }}{{ sc2_icon('Mirage') }}{{ sc2_icon('Ionic Wavelength Flux (Phoenix/Mirage)') }}{{ sc2_icon('Anion Pulse-Crystals (Phoenix/Mirage)') }}
{{ sc2_icon('Corsair') }}{{ sc2_icon('Stealth Drive (Corsair)') }}{{ sc2_icon('Argus Jewel (Corsair)') }}{{ sc2_icon('Sustaining Disruption (Corsair)') }}{{ sc2_icon('Neutron Shields (Corsair)') }}
{{ sc2_icon('Destroyer') }}{{ sc2_icon('Reforged Bloodshard Core (Destroyer)') }}
{{ sc2_icon('Void Ray') }}{{ sc2_icon('Flux Vanes (Void Ray/Destroyer)') }}
{{ sc2_icon('Carrier') }}{{ sc2_icon('Graviton Catapult (Carrier)') }}{{ sc2_icon('Hull of Past Glories (Carrier)') }}
{{ sc2_icon('Scout') }}{{ sc2_icon('Combat Sensor Array (Scout)') }}{{ sc2_icon('Apial Sensors (Scout)') }}{{ sc2_icon('Gravitic Thrusters (Scout)') }}{{ sc2_icon('Advanced Photon Blasters (Scout)') }}
{{ sc2_icon('Tempest') }}{{ sc2_icon('Tectonic Destabilizers (Tempest)') }}{{ sc2_icon('Quantic Reactor (Tempest)') }}{{ sc2_icon('Gravity Sling (Tempest)') }}
{{ sc2_icon('Mothership') }}
{{ sc2_icon('Arbiter') }}{{ sc2_icon('Chronostatic Reinforcement (Arbiter)') }}{{ sc2_icon('Khaydarin Core (Arbiter)') }}{{ sc2_icon('Spacetime Anchor (Arbiter)') }}{{ sc2_icon('Resource Efficiency (Arbiter)') }}{{ sc2_icon('Enhanced Cloak Field (Arbiter)') }}
{{ sc2_icon('Oracle') }}{{ sc2_icon('Stealth Drive (Oracle)') }}{{ sc2_icon('Stasis Calibration (Oracle)') }}{{ sc2_icon('Temporal Acceleration Beam (Oracle)') }}
- General Upgrades -
{{ sc2_icon('Matrix Overload') }}{{ sc2_icon('Guardian Shell') }}
- Spear of Adun -
{{ sc2_icon('Chrono Surge (Spear of Adun Calldown)') }}{{ sc2_progressive_icon_with_custom_name('Progressive Proxy Pylon (Spear of Adun Calldown)', proxy_pylon_spear_of_adun_calldown_url, proxy_pylon_spear_of_adun_calldown_name) }}{{ sc2_icon('Pylon Overcharge (Spear of Adun Calldown)') }}{{ sc2_icon('Mass Recall (Spear of Adun Calldown)') }}{{ sc2_icon('Shield Overcharge (Spear of Adun Calldown)') }}{{ sc2_icon('Deploy Fenix (Spear of Adun Calldown)') }}{{ sc2_icon('Reconstruction Beam (Spear of Adun Auto-Cast)') }}
{{ sc2_icon('Orbital Strike (Spear of Adun Calldown)') }}{{ sc2_icon('Temporal Field (Spear of Adun Calldown)') }}{{ sc2_icon('Solar Lance (Spear of Adun Calldown)') }}{{ sc2_icon('Purifier Beam (Spear of Adun Calldown)') }}{{ sc2_icon('Time Stop (Spear of Adun Calldown)') }}{{ sc2_icon('Solar Bombardment (Spear of Adun Calldown)') }}{{ sc2_icon('Overwatch (Spear of Adun Auto-Cast)') }}
-
- - - - - - -
- - {{ sc2_loop_areas(0, 3) }} -
-
- - {{ sc2_loop_areas(1, 3) }} -
-
- - {{ sc2_loop_areas(2, 3) }} - - {{ sc2_render_area('Total') }} -
 
-
-
+
+
+ +

Filler Items

+
+
+
+
+ +
+ +{{minerals_count}} +
+
+
+ +
+ +{{vespene_count}} +
+
+
+ +
+ +{{supply_count}} +
+
+
+ +
+ +{{max_supply_count}} +
+
+
+ +
+ -{{reduced_supply_count}} +
+
+
+ +
+ {{construction_speed_count}} +
+
+
+ +
+ {{shield_regen_count}} +
+
+
+ +
+ {{upgrade_speed_count}} +
+
+
+ +
+ {{research_cost_count}} +
+
- - +
+
+ +

Terran Items

+
+
+
+
+ + Barracks +
+
+ + Factory +
+
+ + Starport +
+
+ + Buildings +
+
+ + Mercenaries +
+
+ + Miscellaneous +
+
+
+
+ — Barracks — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Factory — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Starport — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Buildings — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Mercenaries — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Miscellaneous — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Zerg Items

+
+
+
+
+ + Ground +
+
+ + Flyers +
+
+ + Morphs +
+
+ + Infested +
+
+ + Buildings +
+
+ + Mercenaries +
+
+ + Miscellaneous +
+
+
+
+ — Ground — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Flyers — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Morphs — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Infested — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Buildings — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Mercenaries — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Miscellaneous — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Protoss Items

+
+
+
+
+ + Gateway +
+
+ + Robotics Facility +
+
+ + Stargate +
+
+ + Buildings +
+
+ + Miscellaneous +
+
+
+
+ — Gateway — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Robotics Facility — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Stargate — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Buildings — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ — Miscellaneous — +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Nova Items

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Kerrigan Items

+
+
+
+ + {{kerrigan_level}} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +

Keys

+
+
+
    + {% for key_name, key_amount in keys.items() %} +
  • {{key_name}}{{ ' (' + (key_amount | string) + ')' if key_amount > 1}}
  • + {% endfor %} +
+
+
+
+
+ +

Locations

+
+ {{checked_locations | length}} / {{locations | length}} = {{((checked_locations | length) / (locations | length) * 100) | round(3)}}% +
+
    + {% for mission_name, location_info in missions.items() %} +
  1. {{mission_name}}
      + {% for location_name, collected in location_info %} +
    • {{location_name}}
    • + {% endfor %} +
    +
  2. + {% endfor %} +
+
+
+
+
+ \ No newline at end of file diff --git a/WebHostLib/templates/tutorial.html b/WebHostLib/templates/tutorial.html deleted file mode 100644 index 4b6622c313..0000000000 --- a/WebHostLib/templates/tutorial.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends 'pageWrapper.html' %} - -{% block head %} - {% include 'header/'+theme+'Header.html' %} - Archipelago - - - -{% endblock %} - -{% block body %} -
- -
-{% endblock %} diff --git a/WebHostLib/templates/tutorialLanding.html b/WebHostLib/templates/tutorialLanding.html index 14db577e77..a96da883b6 100644 --- a/WebHostLib/templates/tutorialLanding.html +++ b/WebHostLib/templates/tutorialLanding.html @@ -3,14 +3,32 @@ {% block head %} {% include 'header/grassHeader.html' %} Archipelago Guides - - - + + {% endblock %} {% block body %} -
-

Archipelago Guides

-

Loading...

+
+

Archipelago Guides

+ {% for world_name, world_type in worlds.items() %} +

{{ world_type.game }}

+ {% for tutorial_name, tutorial_data in tutorials[world_name].items() %} +

{{ tutorial_name }}

+

{{ tutorial_data.description }}

+

This guide is available in the following languages:

+
    + {% for file_name, file_data in tutorial_data.files.items() %} +
  • + {{ file_data.language }} + by + {% for author in file_data.authors %} + {{ author }} + {% if not loop.last %}, {% endif %} + {% endfor %} +
  • + {% endfor %} +
+ {% endfor %} + {% endfor %}
-{% endblock %} +{% endblock %} diff --git a/WebHostLib/templates/weightedOptions/macros.html b/WebHostLib/templates/weightedOptions/macros.html index 89ba0a0e6e..1d485a24de 100644 --- a/WebHostLib/templates/weightedOptions/macros.html +++ b/WebHostLib/templates/weightedOptions/macros.html @@ -139,6 +139,7 @@ {% endmacro %} {% macro OptionList(option_name, option) %} +
{% for key in (option.valid_keys if option.valid_keys is ordered else option.valid_keys|sort) %}
@@ -158,6 +159,7 @@ {% endmacro %} {% macro LocationSet(option_name, option, world) %} +
{% for group_name in world.location_name_groups.keys()|sort %} {% if group_name != "Everywhere" %} @@ -180,6 +182,7 @@ {% endmacro %} {% macro ItemSet(option_name, option, world) %} +
{% for group_name in world.item_name_groups.keys()|sort %} {% if group_name != "Everything" %} @@ -202,6 +205,7 @@ {% endmacro %} {% macro OptionSet(option_name, option) %} +
{% for key in (option.valid_keys if option.valid_keys is ordered else option.valid_keys|sort) %}
diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py index 3748de97a4..ead679fd98 100644 --- a/WebHostLib/tracker.py +++ b/WebHostLib/tracker.py @@ -17,7 +17,6 @@ from .models import GameDataPackage, Room # Multisave is currently updated, at most, every minute. TRACKER_CACHE_TIMEOUT_IN_SECONDS = 60 -_multidata_cache = {} _multiworld_trackers: Dict[str, Callable] = {} _player_trackers: Dict[str, Callable] = {} @@ -85,27 +84,27 @@ class TrackerData: """Retrieves the seed name.""" return self._multidata["seed_name"] - def get_slot_data(self, team: int, player: int) -> Dict[str, Any]: + def get_slot_data(self, player: int) -> Dict[str, Any]: """Retrieves the slot data for a given player.""" return self._multidata["slot_data"][player] - def get_slot_info(self, team: int, player: int) -> NetworkSlot: + def get_slot_info(self, player: int) -> NetworkSlot: """Retrieves the NetworkSlot data for a given player.""" return self._multidata["slot_info"][player] - def get_player_name(self, team: int, player: int) -> str: + def get_player_name(self, player: int) -> str: """Retrieves the slot name for a given player.""" - return self.get_slot_info(team, player).name + return self.get_slot_info(player).name - def get_player_game(self, team: int, player: int) -> str: + def get_player_game(self, player: int) -> str: """Retrieves the game for a given player.""" - return self.get_slot_info(team, player).game + return self.get_slot_info(player).game - def get_player_locations(self, team: int, player: int) -> Dict[int, ItemMetadata]: + def get_player_locations(self, player: int) -> Dict[int, ItemMetadata]: """Retrieves all locations with their containing item's metadata for a given player.""" return self._multidata["locations"][player] - def get_player_starting_inventory(self, team: int, player: int) -> List[int]: + def get_player_starting_inventory(self, player: int) -> List[int]: """Retrieves a list of all item codes a given slot starts with.""" return self._multidata["precollected_items"][player] @@ -116,7 +115,7 @@ class TrackerData: @_cache_results def get_player_missing_locations(self, team: int, player: int) -> Set[int]: """Retrieves the set of all locations not marked complete by this player.""" - return set(self.get_player_locations(team, player)) - self.get_player_checked_locations(team, player) + return set(self.get_player_locations(player)) - self.get_player_checked_locations(team, player) def get_player_received_items(self, team: int, player: int) -> List[NetworkItem]: """Returns all items received to this player in order of received.""" @@ -126,7 +125,7 @@ class TrackerData: def get_player_inventory_counts(self, team: int, player: int) -> collections.Counter: """Retrieves a dictionary of all items received by their id and their received count.""" received_items = self.get_player_received_items(team, player) - starting_items = self.get_player_starting_inventory(team, player) + starting_items = self.get_player_starting_inventory(player) inventory = collections.Counter() for item in received_items: inventory[item.item] += 1 @@ -179,7 +178,7 @@ class TrackerData: def get_team_locations_total_count(self) -> Dict[int, int]: """Retrieves a dictionary of total player locations each team has.""" return { - team: sum(len(self.get_player_locations(team, player)) for player in players) + team: sum(len(self.get_player_locations(player)) for player in players) for team, players in self.get_all_players().items() } @@ -210,7 +209,7 @@ class TrackerData: return { 0: [ player for player, slot_info in self._multidata["slot_info"].items() - if self.get_slot_info(0, player).type == SlotType.player + if self.get_slot_info(player).type == SlotType.player ] } @@ -226,7 +225,7 @@ class TrackerData: def get_room_locations(self) -> Dict[TeamPlayer, Dict[int, ItemMetadata]]: """Retrieves a dictionary of all locations and their associated item metadata per player.""" return { - (team, player): self.get_player_locations(team, player) + (team, player): self.get_player_locations(player) for team, players in self.get_all_players().items() for player in players } @@ -234,7 +233,7 @@ class TrackerData: def get_room_games(self) -> Dict[TeamPlayer, str]: """Retrieves a dictionary of games for each player.""" return { - (team, player): self.get_player_game(team, player) + (team, player): self.get_player_game(player) for team, players in self.get_all_slots().items() for player in players } @@ -262,9 +261,9 @@ class TrackerData: for player in players: alias = self.get_player_alias(team, player) if alias: - long_player_names[team, player] = f"{alias} ({self.get_player_name(team, player)})" + long_player_names[team, player] = f"{alias} ({self.get_player_name(player)})" else: - long_player_names[team, player] = self.get_player_name(team, player) + long_player_names[team, player] = self.get_player_name(player) return long_player_names @@ -344,7 +343,7 @@ def get_timeout_and_player_tracker(room: Room, tracked_team: int, tracked_player tracker_data = TrackerData(room) # Load and render the game-specific player tracker, or fallback to generic tracker if none exists. - game_specific_tracker = _player_trackers.get(tracker_data.get_player_game(tracked_team, tracked_player), None) + game_specific_tracker = _player_trackers.get(tracker_data.get_player_game(tracked_player), None) if game_specific_tracker and not generic: tracker = game_specific_tracker(tracker_data, tracked_team, tracked_player) else: @@ -409,10 +408,10 @@ def get_enabled_multiworld_trackers(room: Room) -> Dict[str, Callable]: def render_generic_tracker(tracker_data: TrackerData, team: int, player: int) -> str: - game = tracker_data.get_player_game(team, player) + game = tracker_data.get_player_game(player) received_items_in_order = {} - starting_inventory = tracker_data.get_player_starting_inventory(team, player) + starting_inventory = tracker_data.get_player_starting_inventory(player) for index, item in enumerate(starting_inventory): received_items_in_order[item] = index for index, network_item in enumerate(tracker_data.get_player_received_items(team, player), @@ -428,7 +427,7 @@ def render_generic_tracker(tracker_data: TrackerData, team: int, player: int) -> player=player, player_name=tracker_data.get_room_long_player_names()[team, player], inventory=tracker_data.get_player_inventory_counts(team, player), - locations=tracker_data.get_player_locations(team, player), + locations=tracker_data.get_player_locations(player), checked_locations=tracker_data.get_player_checked_locations(team, player), received_items=received_items_in_order, saving_second=tracker_data.get_room_saving_second(), @@ -500,7 +499,7 @@ if "Factorio" in network_data_package["games"]: tracker_data.item_id_to_name["Factorio"][item_id]: count for item_id, count in tracker_data.get_player_inventory_counts(team, player).items() }) for team, players in tracker_data.get_all_players().items() for player in players - if tracker_data.get_player_game(team, player) == "Factorio" + if tracker_data.get_player_game(player) == "Factorio" } return render_template( @@ -589,7 +588,7 @@ if "A Link to the Past" in network_data_package["games"]: # Highlight 'bombs' if we received any bomb upgrades in bombless start. # In race mode, we'll just assume bombless start for simplicity. - if tracker_data.get_slot_data(team, player).get("bombless_start", True): + if tracker_data.get_slot_data(player).get("bombless_start", True): inventory["Bombs"] = sum(count for item, count in inventory.items() if item.startswith("Bomb Upgrade")) else: inventory["Bombs"] = 1 @@ -605,7 +604,7 @@ if "A Link to the Past" in network_data_package["games"]: for code, count in tracker_data.get_player_inventory_counts(team, player).items() }) for team, players in tracker_data.get_all_players().items() - for player in players if tracker_data.get_slot_info(team, player).game == "A Link to the Past" + for player in players if tracker_data.get_slot_info(player).game == "A Link to the Past" } # Translate non-progression items to progression items for tracker simplicity. @@ -624,7 +623,7 @@ if "A Link to the Past" in network_data_package["games"]: for region_name in known_regions } for team, players in tracker_data.get_all_players().items() - for player in players if tracker_data.get_slot_info(team, player).game == "A Link to the Past" + for player in players if tracker_data.get_slot_info(player).game == "A Link to the Past" } # Get a totals count. @@ -698,7 +697,7 @@ if "A Link to the Past" in network_data_package["games"]: team=team, player=player, inventory=inventory, - player_name=tracker_data.get_player_name(team, player), + player_name=tracker_data.get_player_name(player), regions=regions, known_regions=known_regions, ) @@ -706,127 +705,6 @@ if "A Link to the Past" in network_data_package["games"]: _multiworld_trackers["A Link to the Past"] = render_ALinkToThePast_multiworld_tracker _player_trackers["A Link to the Past"] = render_ALinkToThePast_tracker -if "Minecraft" in network_data_package["games"]: - def render_Minecraft_tracker(tracker_data: TrackerData, team: int, player: int) -> str: - icons = { - "Wooden Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/d/d2/Wooden_Pickaxe_JE3_BE3.png", - "Stone Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/c4/Stone_Pickaxe_JE2_BE2.png", - "Iron Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/d/d1/Iron_Pickaxe_JE3_BE2.png", - "Diamond Pickaxe": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/e/e7/Diamond_Pickaxe_JE3_BE3.png", - "Wooden Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/d/d5/Wooden_Sword_JE2_BE2.png", - "Stone Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/b/b1/Stone_Sword_JE2_BE2.png", - "Iron Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/8/8e/Iron_Sword_JE2_BE2.png", - "Diamond Sword": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/4/44/Diamond_Sword_JE3_BE3.png", - "Leather Tunic": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/b/b7/Leather_Tunic_JE4_BE2.png", - "Iron Chestplate": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/31/Iron_Chestplate_JE2_BE2.png", - "Diamond Chestplate": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/e/e0/Diamond_Chestplate_JE3_BE2.png", - "Iron Ingot": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/fc/Iron_Ingot_JE3_BE2.png", - "Block of Iron": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/7/7e/Block_of_Iron_JE4_BE3.png", - "Brewing Stand": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/b/b3/Brewing_Stand_%28empty%29_JE10.png", - "Ender Pearl": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/f6/Ender_Pearl_JE3_BE2.png", - "Bucket": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/fc/Bucket_JE2_BE2.png", - "Bow": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/a/ab/Bow_%28Pull_2%29_JE1_BE1.png", - "Shield": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/c6/Shield_JE2_BE1.png", - "Red Bed": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/6/6a/Red_Bed_%28N%29.png", - "Netherite Scrap": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/33/Netherite_Scrap_JE2_BE1.png", - "Flint and Steel": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/9/94/Flint_and_Steel_JE4_BE2.png", - "Enchanting Table": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/31/Enchanting_Table.gif", - "Fishing Rod": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/7/7f/Fishing_Rod_JE2_BE2.png", - "Campfire": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/9/91/Campfire_JE2_BE2.gif", - "Water Bottle": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/7/75/Water_Bottle_JE2_BE2.png", - "Spyglass": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/c/c1/Spyglass_JE2_BE1.png", - "Dragon Egg Shard": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/3/38/Dragon_Egg_JE4.png", - "Lead": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/1/1f/Lead_JE2_BE2.png", - "Saddle": "https://i.imgur.com/2QtDyR0.png", - "Channeling Book": "https://i.imgur.com/J3WsYZw.png", - "Silk Touch Book": "https://i.imgur.com/iqERxHQ.png", - "Piercing IV Book": "https://i.imgur.com/OzJptGz.png", - } - - minecraft_location_ids = { - "Story": [42073, 42023, 42027, 42039, 42002, 42009, 42010, 42070, - 42041, 42049, 42004, 42031, 42025, 42029, 42051, 42077], - "Nether": [42017, 42044, 42069, 42058, 42034, 42060, 42066, 42076, 42064, 42071, 42021, - 42062, 42008, 42061, 42033, 42011, 42006, 42019, 42000, 42040, 42001, 42015, 42104, 42014], - "The End": [42052, 42005, 42012, 42032, 42030, 42042, 42018, 42038, 42046], - "Adventure": [42047, 42050, 42096, 42097, 42098, 42059, 42055, 42072, 42003, 42109, 42035, 42016, 42020, - 42048, 42054, 42068, 42043, 42106, 42074, 42075, 42024, 42026, 42037, 42045, 42056, 42105, - 42099, 42103, 42110, 42100], - "Husbandry": [42065, 42067, 42078, 42022, 42113, 42107, 42007, 42079, 42013, 42028, 42036, 42108, 42111, - 42112, - 42057, 42063, 42053, 42102, 42101, 42092, 42093, 42094, 42095], - "Archipelago": [42080, 42081, 42082, 42083, 42084, 42085, 42086, 42087, 42088, 42089, 42090, 42091], - } - - display_data = {} - - # Determine display for progressive items - progressive_items = { - "Progressive Tools": 45013, - "Progressive Weapons": 45012, - "Progressive Armor": 45014, - "Progressive Resource Crafting": 45001 - } - progressive_names = { - "Progressive Tools": ["Wooden Pickaxe", "Stone Pickaxe", "Iron Pickaxe", "Diamond Pickaxe"], - "Progressive Weapons": ["Wooden Sword", "Stone Sword", "Iron Sword", "Diamond Sword"], - "Progressive Armor": ["Leather Tunic", "Iron Chestplate", "Diamond Chestplate"], - "Progressive Resource Crafting": ["Iron Ingot", "Iron Ingot", "Block of Iron"] - } - - inventory = tracker_data.get_player_inventory_counts(team, player) - for item_name, item_id in progressive_items.items(): - level = min(inventory[item_id], len(progressive_names[item_name]) - 1) - display_name = progressive_names[item_name][level] - base_name = item_name.split(maxsplit=1)[1].lower().replace(" ", "_") - display_data[base_name + "_url"] = icons[display_name] - - # Multi-items - multi_items = { - "3 Ender Pearls": 45029, - "8 Netherite Scrap": 45015, - "Dragon Egg Shard": 45043 - } - for item_name, item_id in multi_items.items(): - base_name = item_name.split()[-1].lower() - count = inventory[item_id] - if count >= 0: - display_data[base_name + "_count"] = count - - # Victory condition - game_state = tracker_data.get_player_client_status(team, player) - display_data["game_finished"] = game_state == 30 - - # Turn location IDs into advancement tab counts - checked_locations = tracker_data.get_player_checked_locations(team, player) - lookup_name = lambda id: tracker_data.location_id_to_name["Minecraft"][id] - location_info = {tab_name: {lookup_name(id): (id in checked_locations) for id in tab_locations} - for tab_name, tab_locations in minecraft_location_ids.items()} - checks_done = {tab_name: len([id for id in tab_locations if id in checked_locations]) - for tab_name, tab_locations in minecraft_location_ids.items()} - checks_done["Total"] = len(checked_locations) - checks_in_area = {tab_name: len(tab_locations) for tab_name, tab_locations in minecraft_location_ids.items()} - checks_in_area["Total"] = sum(checks_in_area.values()) - - lookup_any_item_id_to_name = tracker_data.item_id_to_name["Minecraft"] - return render_template( - "tracker__Minecraft.html", - inventory=inventory, - icons=icons, - acquired_items={lookup_any_item_id_to_name[id] for id, count in inventory.items() if count > 0}, - player=player, - team=team, - room=tracker_data.room, - player_name=tracker_data.get_player_name(team, player), - saving_second=tracker_data.get_room_saving_second(), - checks_done=checks_done, - checks_in_area=checks_in_area, - location_info=location_info, - **display_data, - ) - - _player_trackers["Minecraft"] = render_Minecraft_tracker - if "Ocarina of Time" in network_data_package["games"]: def render_OcarinaOfTime_tracker(tracker_data: TrackerData, team: int, player: int) -> str: icons = { @@ -966,7 +844,7 @@ if "Ocarina of Time" in network_data_package["games"]: return full_name[len(area):] return full_name - locations = tracker_data.get_player_locations(team, player) + locations = tracker_data.get_player_locations(player) checked_locations = tracker_data.get_player_checked_locations(team, player).intersection(set(locations)) location_info = {} checks_done = {} @@ -1028,7 +906,7 @@ if "Ocarina of Time" in network_data_package["games"]: player=player, team=team, room=tracker_data.room, - player_name=tracker_data.get_player_name(team, player), + player_name=tracker_data.get_player_name(player), icons=icons, acquired_items={lookup_any_item_id_to_name[id] for id, count in inventory.items() if count > 0}, checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, @@ -1075,57 +953,37 @@ if "Timespinner" in network_data_package["games"]: "Lab Glasses": "https://timespinnerwiki.com/mediawiki/images/4/4a/Lab_Glasses.png", "Eye Orb": "https://timespinnerwiki.com/mediawiki/images/a/a4/Eye_Orb.png", "Lab Coat": "https://timespinnerwiki.com/mediawiki/images/5/51/Lab_Coat.png", - "Demon": "https://timespinnerwiki.com/mediawiki/images/f/f8/Familiar_Demon.png", + "Demon": "https://timespinnerwiki.com/mediawiki/images/f/f8/Familiar_Demon.png", + "Cube of Bodie": "https://timespinnerwiki.com/mediawiki/images/1/14/Menu_Icon_Stats.png" } timespinner_location_ids = { - "Present": [ - 1337000, 1337001, 1337002, 1337003, 1337004, 1337005, 1337006, 1337007, 1337008, 1337009, - 1337010, 1337011, 1337012, 1337013, 1337014, 1337015, 1337016, 1337017, 1337018, 1337019, - 1337020, 1337021, 1337022, 1337023, 1337024, 1337025, 1337026, 1337027, 1337028, 1337029, - 1337030, 1337031, 1337032, 1337033, 1337034, 1337035, 1337036, 1337037, 1337038, 1337039, - 1337040, 1337041, 1337042, 1337043, 1337044, 1337045, 1337046, 1337047, 1337048, 1337049, - 1337050, 1337051, 1337052, 1337053, 1337054, 1337055, 1337056, 1337057, 1337058, 1337059, - 1337060, 1337061, 1337062, 1337063, 1337064, 1337065, 1337066, 1337067, 1337068, 1337069, - 1337070, 1337071, 1337072, 1337073, 1337074, 1337075, 1337076, 1337077, 1337078, 1337079, - 1337080, 1337081, 1337082, 1337083, 1337084, 1337085], - "Past": [ - 1337086, 1337087, 1337088, 1337089, - 1337090, 1337091, 1337092, 1337093, 1337094, 1337095, 1337096, 1337097, 1337098, 1337099, - 1337100, 1337101, 1337102, 1337103, 1337104, 1337105, 1337106, 1337107, 1337108, 1337109, - 1337110, 1337111, 1337112, 1337113, 1337114, 1337115, 1337116, 1337117, 1337118, 1337119, - 1337120, 1337121, 1337122, 1337123, 1337124, 1337125, 1337126, 1337127, 1337128, 1337129, - 1337130, 1337131, 1337132, 1337133, 1337134, 1337135, 1337136, 1337137, 1337138, 1337139, - 1337140, 1337141, 1337142, 1337143, 1337144, 1337145, 1337146, 1337147, 1337148, 1337149, - 1337150, 1337151, 1337152, 1337153, 1337154, 1337155, - 1337171, 1337172, 1337173, 1337174, 1337175], + "Present": list(range(1337000, 1337085)), + "Past": list(range(1337086, 1337175)), "Ancient Pyramid": [ 1337236, 1337246, 1337247, 1337248, 1337249] } - slot_data = tracker_data.get_slot_data(team, player) + slot_data = tracker_data.get_slot_data(player) if (slot_data["DownloadableItems"]): - timespinner_location_ids["Present"] += [ - 1337156, 1337157, 1337159, - 1337160, 1337161, 1337162, 1337163, 1337164, 1337165, 1337166, 1337167, 1337168, 1337169, - 1337170] + timespinner_location_ids["Present"] += [1337156, 1337157] + list(range(1337159, 1337170)) if (slot_data["Cantoran"]): timespinner_location_ids["Past"].append(1337176) if (slot_data["LoreChecks"]): - timespinner_location_ids["Present"] += [ - 1337177, 1337178, 1337179, - 1337180, 1337181, 1337182, 1337183, 1337184, 1337185, 1337186, 1337187] - timespinner_location_ids["Past"] += [ - 1337188, 1337189, - 1337190, 1337191, 1337192, 1337193, 1337194, 1337195, 1337196, 1337197, 1337198] + timespinner_location_ids["Present"] += list(range(1337177, 1337187)) + timespinner_location_ids["Past"] += list(range(1337188, 1337198)) if (slot_data["GyreArchives"]): - timespinner_location_ids["Ancient Pyramid"] += [ - 1337237, 1337238, 1337239, - 1337240, 1337241, 1337242, 1337243, 1337244, 1337245] + timespinner_location_ids["Ancient Pyramid"] += list(range(1337237, 1337245)) if (slot_data["PyramidStart"]): timespinner_location_ids["Ancient Pyramid"] += [ 1337233, 1337234, 1337235] + if (slot_data["PureTorcher"]): + timespinner_location_ids["Present"] += list(range(1337250, 1337352)) + list(range(1337422, 1337496)) + [1337506] + list(range(1337712, 1337779)) + [1337781, 1337782] + timespinner_location_ids["Past"] += list(range(1337497, 1337505)) + list(range(1337507, 1337711)) + [1337780] + timespinner_location_ids["Ancient Pyramid"] += list(range(1337369, 1337421)) + if (slot_data["GyreArchives"]): + timespinner_location_ids["Ancient Pyramid"] += list(range(1337353, 1337368)) display_data = {} @@ -1156,7 +1014,7 @@ if "Timespinner" in network_data_package["games"]: player=player, team=team, room=tracker_data.room, - player_name=tracker_data.get_player_name(team, player), + player_name=tracker_data.get_player_name(player), checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, @@ -1265,7 +1123,7 @@ if "Super Metroid" in network_data_package["games"]: player=player, team=team, room=tracker_data.room, - player_name=tracker_data.get_player_name(team, player), + player_name=tracker_data.get_player_name(player), checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, @@ -1315,7 +1173,7 @@ if "ChecksFinder" in network_data_package["games"]: display_data = {} inventory = tracker_data.get_player_inventory_counts(team, player) - locations = tracker_data.get_player_locations(team, player) + locations = tracker_data.get_player_locations(player) # Multi-items multi_items = { @@ -1357,7 +1215,7 @@ if "ChecksFinder" in network_data_package["games"]: player=player, team=team, room=tracker_data.room, - player_name=tracker_data.get_player_name(team, player), + player_name=tracker_data.get_player_name(player), checks_done=checks_done, checks_in_area=checks_in_area, location_info=location_info, @@ -1368,1114 +1226,225 @@ if "ChecksFinder" in network_data_package["games"]: if "Starcraft 2" in network_data_package["games"]: def render_Starcraft2_tracker(tracker_data: TrackerData, team: int, player: int) -> str: - SC2WOL_LOC_ID_OFFSET = 1000 - SC2HOTS_LOC_ID_OFFSET = 20000000 # Avoid clashes with The Legend of Zelda - SC2LOTV_LOC_ID_OFFSET = SC2HOTS_LOC_ID_OFFSET + 2000 - SC2NCO_LOC_ID_OFFSET = SC2LOTV_LOC_ID_OFFSET + 2500 - SC2WOL_ITEM_ID_OFFSET = 1000 - SC2HOTS_ITEM_ID_OFFSET = SC2WOL_ITEM_ID_OFFSET + 1000 - SC2LOTV_ITEM_ID_OFFSET = SC2HOTS_ITEM_ID_OFFSET + 1000 + SC2HOTS_ITEM_ID_OFFSET = 2000 + SC2LOTV_ITEM_ID_OFFSET = 2000 + SC2_KEY_ITEM_ID_OFFSET = 4000 + NCO_LOCATION_ID_LOW = 20004500 + NCO_LOCATION_ID_HIGH = NCO_LOCATION_ID_LOW + 1000 - slot_data = tracker_data.get_slot_data(team, player) - minerals_per_item = slot_data.get("minerals_per_item", 15) - vespene_per_item = slot_data.get("vespene_per_item", 15) - starting_supply_per_item = slot_data.get("starting_supply_per_item", 2) - - github_icon_base_url = "https://matthewmarinets.github.io/ap_sc2_icons/icons/" - organics_icon_base_url = "https://0rganics.org/archipelago/sc2wol/" - - icons = { - "Starting Minerals": github_icon_base_url + "blizzard/icon-mineral-nobg.png", - "Starting Vespene": github_icon_base_url + "blizzard/icon-gas-terran-nobg.png", - "Starting Supply": github_icon_base_url + "blizzard/icon-supply-terran_nobg.png", - - "Terran Infantry Weapons Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryweaponslevel1.png", - "Terran Infantry Weapons Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryweaponslevel2.png", - "Terran Infantry Weapons Level 3": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryweaponslevel3.png", - "Terran Infantry Armor Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryarmorlevel1.png", - "Terran Infantry Armor Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryarmorlevel2.png", - "Terran Infantry Armor Level 3": github_icon_base_url + "blizzard/btn-upgrade-terran-infantryarmorlevel3.png", - "Terran Vehicle Weapons Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleweaponslevel1.png", - "Terran Vehicle Weapons Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleweaponslevel2.png", - "Terran Vehicle Weapons Level 3": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleweaponslevel3.png", - "Terran Vehicle Armor Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleplatinglevel1.png", - "Terran Vehicle Armor Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleplatinglevel2.png", - "Terran Vehicle Armor Level 3": github_icon_base_url + "blizzard/btn-upgrade-terran-vehicleplatinglevel3.png", - "Terran Ship Weapons Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-shipweaponslevel1.png", - "Terran Ship Weapons Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-shipweaponslevel2.png", - "Terran Ship Weapons Level 3": github_icon_base_url + "blizzard/btn-upgrade-terran-shipweaponslevel3.png", - "Terran Ship Armor Level 1": github_icon_base_url + "blizzard/btn-upgrade-terran-shipplatinglevel1.png", - "Terran Ship Armor Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-shipplatinglevel2.png", - "Terran Ship Armor Level 3": github_icon_base_url + "blizzard/btn-upgrade-terran-shipplatinglevel3.png", - - "Bunker": "https://static.wikia.nocookie.net/starcraft/images/c/c5/Bunker_SC2_Icon1.jpg", - "Missile Turret": "https://static.wikia.nocookie.net/starcraft/images/5/5f/MissileTurret_SC2_Icon1.jpg", - "Sensor Tower": "https://static.wikia.nocookie.net/starcraft/images/d/d2/SensorTower_SC2_Icon1.jpg", - - "Projectile Accelerator (Bunker)": github_icon_base_url + "blizzard/btn-upgrade-zerg-stukov-bunkerresearchbundle_05.png", - "Neosteel Bunker (Bunker)": organics_icon_base_url + "NeosteelBunker.png", - "Titanium Housing (Missile Turret)": organics_icon_base_url + "TitaniumHousing.png", - "Hellstorm Batteries (Missile Turret)": github_icon_base_url + "blizzard/btn-ability-stetmann-corruptormissilebarrage.png", - "Advanced Construction (SCV)": github_icon_base_url + "blizzard/btn-ability-mengsk-trooper-advancedconstruction.png", - "Dual-Fusion Welders (SCV)": github_icon_base_url + "blizzard/btn-upgrade-swann-scvdoublerepair.png", - "Hostile Environment Adaptation (SCV)": github_icon_base_url + "blizzard/btn-upgrade-swann-hellarmor.png", - "Fire-Suppression System Level 1": organics_icon_base_url + "Fire-SuppressionSystem.png", - "Fire-Suppression System Level 2": github_icon_base_url + "blizzard/btn-upgrade-swann-firesuppressionsystem.png", - - "Orbital Command": organics_icon_base_url + "OrbitalCommandCampaign.png", - "Planetary Command Module": github_icon_base_url + "original/btn-orbital-fortress.png", - "Lift Off (Planetary Fortress)": github_icon_base_url + "blizzard/btn-ability-terran-liftoff.png", - "Armament Stabilizers (Planetary Fortress)": github_icon_base_url + "blizzard/btn-ability-mengsk-siegetank-flyingtankarmament.png", - "Advanced Targeting (Planetary Fortress)": github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png", - - "Marine": "https://static.wikia.nocookie.net/starcraft/images/4/47/Marine_SC2_Icon1.jpg", - "Medic": github_icon_base_url + "blizzard/btn-unit-terran-medic.png", - "Firebat": github_icon_base_url + "blizzard/btn-unit-terran-firebat.png", - "Marauder": "https://static.wikia.nocookie.net/starcraft/images/b/ba/Marauder_SC2_Icon1.jpg", - "Reaper": "https://static.wikia.nocookie.net/starcraft/images/7/7d/Reaper_SC2_Icon1.jpg", - "Ghost": "https://static.wikia.nocookie.net/starcraft/images/6/6e/Ghost_SC2_Icon1.jpg", - "Spectre": github_icon_base_url + "original/btn-unit-terran-spectre.png", - "HERC": github_icon_base_url + "blizzard/btn-unit-terran-herc.png", - - "Stimpack (Marine)": github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png", - "Super Stimpack (Marine)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Combat Shield (Marine)": github_icon_base_url + "blizzard/btn-techupgrade-terran-combatshield-color.png", - "Laser Targeting System (Marine)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Magrail Munitions (Marine)": github_icon_base_url + "blizzard/btn-upgrade-terran-magrailmunitions.png", - "Optimized Logistics (Marine)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Advanced Medic Facilities (Medic)": organics_icon_base_url + "AdvancedMedicFacilities.png", - "Stabilizer Medpacks (Medic)": github_icon_base_url + "blizzard/btn-upgrade-raynor-stabilizermedpacks.png", - "Restoration (Medic)": github_icon_base_url + "original/btn-ability-terran-restoration@scbw.png", - "Optical Flare (Medic)": github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-dragoonsolariteflare.png", - "Resource Efficiency (Medic)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Adaptive Medpacks (Medic)": github_icon_base_url + "blizzard/btn-ability-terran-heal-color.png", - "Nano Projector (Medic)": github_icon_base_url + "blizzard/talent-raynor-level03-firebatmedicrange.png", - "Incinerator Gauntlets (Firebat)": github_icon_base_url + "blizzard/btn-upgrade-raynor-incineratorgauntlets.png", - "Juggernaut Plating (Firebat)": github_icon_base_url + "blizzard/btn-upgrade-raynor-juggernautplating.png", - "Stimpack (Firebat)": github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png", - "Super Stimpack (Firebat)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Resource Efficiency (Firebat)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Infernal Pre-Igniter (Firebat)": github_icon_base_url + "blizzard/btn-upgrade-terran-infernalpreigniter.png", - "Kinetic Foam (Firebat)": organics_icon_base_url + "KineticFoam.png", - "Nano Projectors (Firebat)": github_icon_base_url + "blizzard/talent-raynor-level03-firebatmedicrange.png", - "Concussive Shells (Marauder)": github_icon_base_url + "blizzard/btn-ability-terran-punishergrenade-color.png", - "Kinetic Foam (Marauder)": organics_icon_base_url + "KineticFoam.png", - "Stimpack (Marauder)": github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png", - "Super Stimpack (Marauder)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Laser Targeting System (Marauder)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Magrail Munitions (Marauder)": github_icon_base_url + "blizzard/btn-upgrade-terran-magrailmunitions.png", - "Internal Tech Module (Marauder)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Juggernaut Plating (Marauder)": organics_icon_base_url + "JuggernautPlating.png", - "U-238 Rounds (Reaper)": organics_icon_base_url + "U-238Rounds.png", - "G-4 Clusterbomb (Reaper)": github_icon_base_url + "blizzard/btn-upgrade-terran-kd8chargeex3.png", - "Stimpack (Reaper)": github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png", - "Super Stimpack (Reaper)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Laser Targeting System (Reaper)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Advanced Cloaking Field (Reaper)": github_icon_base_url + "original/btn-permacloak-reaper.png", - "Spider Mines (Reaper)": github_icon_base_url + "original/btn-ability-terran-spidermine.png", - "Combat Drugs (Reaper)": github_icon_base_url + "blizzard/btn-upgrade-terran-reapercombatdrugs.png", - "Jet Pack Overdrive (Reaper)": github_icon_base_url + "blizzard/btn-ability-hornerhan-reaper-flightmode.png", - "Ocular Implants (Ghost)": organics_icon_base_url + "OcularImplants.png", - "Crius Suit (Ghost)": github_icon_base_url + "original/btn-permacloak-ghost.png", - "EMP Rounds (Ghost)": github_icon_base_url + "blizzard/btn-ability-terran-emp-color.png", - "Lockdown (Ghost)": github_icon_base_url + "original/btn-abilty-terran-lockdown@scbw.png", - "Resource Efficiency (Ghost)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Psionic Lash (Spectre)": organics_icon_base_url + "PsionicLash.png", - "Nyx-Class Cloaking Module (Spectre)": github_icon_base_url + "original/btn-permacloak-spectre.png", - "Impaler Rounds (Spectre)": github_icon_base_url + "blizzard/btn-techupgrade-terran-impalerrounds.png", - "Resource Efficiency (Spectre)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Juggernaut Plating (HERC)": organics_icon_base_url + "JuggernautPlating.png", - "Kinetic Foam (HERC)": organics_icon_base_url + "KineticFoam.png", - "Resource Efficiency (HERC)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - - "Hellion": "https://static.wikia.nocookie.net/starcraft/images/5/56/Hellion_SC2_Icon1.jpg", - "Vulture": github_icon_base_url + "blizzard/btn-unit-terran-vulture.png", - "Goliath": github_icon_base_url + "blizzard/btn-unit-terran-goliath.png", - "Diamondback": github_icon_base_url + "blizzard/btn-unit-terran-cobra.png", - "Siege Tank": "https://static.wikia.nocookie.net/starcraft/images/5/57/SiegeTank_SC2_Icon1.jpg", - "Thor": "https://static.wikia.nocookie.net/starcraft/images/e/ef/Thor_SC2_Icon1.jpg", - "Predator": github_icon_base_url + "original/btn-unit-terran-predator.png", - "Widow Mine": github_icon_base_url + "blizzard/btn-unit-terran-widowmine.png", - "Cyclone": github_icon_base_url + "blizzard/btn-unit-terran-cyclone.png", - "Warhound": github_icon_base_url + "blizzard/btn-unit-terran-warhound.png", - - "Twin-Linked Flamethrower (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-mengsk-trooper-flamethrower.png", - "Thermite Filaments (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-terran-infernalpreigniter.png", - "Hellbat Aspect (Hellion)": github_icon_base_url + "blizzard/btn-unit-terran-hellionbattlemode.png", - "Smart Servos (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Optimized Logistics (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Jump Jets (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-terran-jumpjets.png", - "Stimpack (Hellion)": github_icon_base_url + "blizzard/btn-ability-terran-stimpack-color.png", - "Super Stimpack (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Infernal Plating (Hellion)": github_icon_base_url + "blizzard/btn-upgrade-swann-hellarmor.png", - "Cerberus Mine (Spider Mine)": github_icon_base_url + "blizzard/btn-upgrade-raynor-cerberusmines.png", - "High Explosive Munition (Spider Mine)": github_icon_base_url + "original/btn-ability-terran-spidermine.png", - "Replenishable Magazine (Vulture)": github_icon_base_url + "blizzard/btn-upgrade-raynor-replenishablemagazine.png", - "Replenishable Magazine (Free) (Vulture)": github_icon_base_url + "blizzard/btn-upgrade-raynor-replenishablemagazine.png", - "Ion Thrusters (Vulture)": github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png", - "Auto Launchers (Vulture)": github_icon_base_url + "blizzard/btn-upgrade-terran-jotunboosters.png", - "Auto-Repair (Vulture)": github_icon_base_url + "blizzard/ui_tipicon_campaign_space01-repair.png", - "Multi-Lock Weapons System (Goliath)": github_icon_base_url + "blizzard/btn-upgrade-swann-multilockweaponsystem.png", - "Ares-Class Targeting System (Goliath)": github_icon_base_url + "blizzard/btn-upgrade-swann-aresclasstargetingsystem.png", - "Jump Jets (Goliath)": github_icon_base_url + "blizzard/btn-upgrade-terran-jumpjets.png", - "Optimized Logistics (Goliath)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Shaped Hull (Goliath)": organics_icon_base_url + "ShapedHull.png", - "Resource Efficiency (Goliath)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Internal Tech Module (Goliath)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Tri-Lithium Power Cell (Diamondback)": github_icon_base_url + "original/btn-upgrade-terran-trilithium-power-cell.png", - "Tungsten Spikes (Diamondback)": github_icon_base_url + "original/btn-upgrade-terran-tungsten-spikes.png", - "Shaped Hull (Diamondback)": organics_icon_base_url + "ShapedHull.png", - "Hyperfluxor (Diamondback)": github_icon_base_url + "blizzard/btn-upgrade-mengsk-engineeringbay-orbitaldrop.png", - "Burst Capacitors (Diamondback)": github_icon_base_url + "blizzard/btn-ability-terran-electricfield.png", - "Ion Thrusters (Diamondback)": github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png", - "Resource Efficiency (Diamondback)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Maelstrom Rounds (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-raynor-maelstromrounds.png", - "Shaped Blast (Siege Tank)": organics_icon_base_url + "ShapedBlast.png", - "Jump Jets (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-terran-jumpjets.png", - "Spider Mines (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-siegetank-spidermines.png", - "Smart Servos (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Graduating Range (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-siegetankrange.png", - "Laser Targeting System (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Advanced Siege Tech (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-raynor-improvedsiegemode.png", - "Internal Tech Module (Siege Tank)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Shaped Hull (Siege Tank)": organics_icon_base_url + "ShapedHull.png", - "Resource Efficiency (Siege Tank)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "330mm Barrage Cannon (Thor)": github_icon_base_url + "original/btn-ability-thor-330mm.png", - "Immortality Protocol (Thor)": github_icon_base_url + "blizzard/btn-techupgrade-terran-immortalityprotocol.png", - "Immortality Protocol (Free) (Thor)": github_icon_base_url + "blizzard/btn-techupgrade-terran-immortalityprotocol.png", - "High Impact Payload (Thor)": github_icon_base_url + "blizzard/btn-unit-terran-thorsiegemode.png", - "Smart Servos (Thor)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Button With a Skull on It (Thor)": github_icon_base_url + "blizzard/btn-ability-terran-nuclearstrike-color.png", - "Laser Targeting System (Thor)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Large Scale Field Construction (Thor)": github_icon_base_url + "blizzard/talent-swann-level12-immortalityprotocol.png", - "Resource Efficiency (Predator)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Cloak (Predator)": github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png", - "Charge (Predator)": github_icon_base_url + "blizzard/btn-ability-protoss-charge-color.png", - "Predator's Fury (Predator)": github_icon_base_url + "blizzard/btn-ability-protoss-shadowfury.png", - "Drilling Claws (Widow Mine)": github_icon_base_url + "blizzard/btn-upgrade-terran-researchdrillingclaws.png", - "Concealment (Widow Mine)": github_icon_base_url + "blizzard/btn-ability-terran-widowminehidden.png", - "Black Market Launchers (Widow Mine)": github_icon_base_url + "blizzard/btn-ability-hornerhan-widowmine-attackrange.png", - "Executioner Missiles (Widow Mine)": github_icon_base_url + "blizzard/btn-ability-hornerhan-widowmine-deathblossom.png", - "Mag-Field Accelerators (Cyclone)": github_icon_base_url + "blizzard/btn-upgrade-terran-magfieldaccelerator.png", - "Mag-Field Launchers (Cyclone)": github_icon_base_url + "blizzard/btn-upgrade-terran-cyclonerangeupgrade.png", - "Targeting Optics (Cyclone)": github_icon_base_url + "blizzard/btn-upgrade-swann-targetingoptics.png", - "Rapid Fire Launchers (Cyclone)": github_icon_base_url + "blizzard/btn-upgrade-raynor-ripwavemissiles.png", - "Resource Efficiency (Cyclone)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Internal Tech Module (Cyclone)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Resource Efficiency (Warhound)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Reinforced Plating (Warhound)": github_icon_base_url + "original/btn-research-zerg-fortifiedbunker.png", - - "Medivac": "https://static.wikia.nocookie.net/starcraft/images/d/db/Medivac_SC2_Icon1.jpg", - "Wraith": github_icon_base_url + "blizzard/btn-unit-terran-wraith.png", - "Viking": "https://static.wikia.nocookie.net/starcraft/images/2/2a/Viking_SC2_Icon1.jpg", - "Banshee": "https://static.wikia.nocookie.net/starcraft/images/3/32/Banshee_SC2_Icon1.jpg", - "Battlecruiser": "https://static.wikia.nocookie.net/starcraft/images/f/f5/Battlecruiser_SC2_Icon1.jpg", - "Raven": "https://static.wikia.nocookie.net/starcraft/images/1/19/SC2_Lab_Raven_Icon.png", - "Science Vessel": "https://static.wikia.nocookie.net/starcraft/images/c/c3/SC2_Lab_SciVes_Icon.png", - "Hercules": "https://static.wikia.nocookie.net/starcraft/images/4/40/SC2_Lab_Hercules_Icon.png", - "Liberator": github_icon_base_url + "blizzard/btn-unit-terran-liberator.png", - "Valkyrie": github_icon_base_url + "original/btn-unit-terran-valkyrie@scbw.png", - - "Rapid Deployment Tube (Medivac)": organics_icon_base_url + "RapidDeploymentTube.png", - "Advanced Healing AI (Medivac)": github_icon_base_url + "blizzard/btn-ability-mengsk-medivac-doublehealbeam.png", - "Expanded Hull (Medivac)": github_icon_base_url + "blizzard/btn-upgrade-mengsk-engineeringbay-neosteelfortifiedarmor.png", - "Afterburners (Medivac)": github_icon_base_url + "blizzard/btn-upgrade-terran-medivacemergencythrusters.png", - "Scatter Veil (Medivac)": github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png", - "Advanced Cloaking Field (Medivac)": github_icon_base_url + "original/btn-permacloak-medivac.png", - "Tomahawk Power Cells (Wraith)": organics_icon_base_url + "TomahawkPowerCells.png", - "Unregistered Cloaking Module (Wraith)": github_icon_base_url + "original/btn-permacloak-wraith.png", - "Trigger Override (Wraith)": github_icon_base_url + "blizzard/btn-ability-hornerhan-wraith-attackspeed.png", - "Internal Tech Module (Wraith)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Resource Efficiency (Wraith)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Displacement Field (Wraith)": github_icon_base_url + "blizzard/btn-upgrade-swann-displacementfield.png", - "Advanced Laser Technology (Wraith)": github_icon_base_url + "blizzard/btn-upgrade-swann-improvedburstlaser.png", - "Ripwave Missiles (Viking)": github_icon_base_url + "blizzard/btn-upgrade-raynor-ripwavemissiles.png", - "Phobos-Class Weapons System (Viking)": github_icon_base_url + "blizzard/btn-upgrade-raynor-phobosclassweaponssystem.png", - "Smart Servos (Viking)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Anti-Mechanical Munition (Viking)": github_icon_base_url + "blizzard/btn-ability-terran-ignorearmor.png", - "Shredder Rounds (Viking)": github_icon_base_url + "blizzard/btn-ability-hornerhan-viking-piercingattacks.png", - "W.I.L.D. Missiles (Viking)": github_icon_base_url + "blizzard/btn-ability-hornerhan-viking-missileupgrade.png", - "Cross-Spectrum Dampeners (Banshee)": github_icon_base_url + "original/btn-banshee-cross-spectrum-dampeners.png", - "Advanced Cross-Spectrum Dampeners (Banshee)": github_icon_base_url + "original/btn-permacloak-banshee.png", - "Shockwave Missile Battery (Banshee)": github_icon_base_url + "blizzard/btn-upgrade-raynor-shockwavemissilebattery.png", - "Hyperflight Rotors (Banshee)": github_icon_base_url + "blizzard/btn-upgrade-terran-hyperflightrotors.png", - "Laser Targeting System (Banshee)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Internal Tech Module (Banshee)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Shaped Hull (Banshee)": organics_icon_base_url + "ShapedHull.png", - "Advanced Targeting Optics (Banshee)": github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png", - "Distortion Blasters (Banshee)": github_icon_base_url + "blizzard/btn-techupgrade-terran-cloakdistortionfield.png", - "Rocket Barrage (Banshee)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-bansheemissilestrik.png", - "Missile Pods (Battlecruiser) Level 1": organics_icon_base_url + "MissilePods.png", - "Missile Pods (Battlecruiser) Level 2": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-bansheemissilestrik.png", - "Defensive Matrix (Battlecruiser)": github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png", - "Advanced Defensive Matrix (Battlecruiser)": github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png", - "Tactical Jump (Battlecruiser)": github_icon_base_url + "blizzard/btn-ability-terran-warpjump.png", - "Cloak (Battlecruiser)": github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png", - "ATX Laser Battery (Battlecruiser)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-specialordance.png", - "Optimized Logistics (Battlecruiser)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Internal Tech Module (Battlecruiser)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Behemoth Plating (Battlecruiser)": github_icon_base_url + "original/btn-research-zerg-fortifiedbunker.png", - "Covert Ops Engines (Battlecruiser)": github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png", - "Bio Mechanical Repair Drone (Raven)": github_icon_base_url + "blizzard/btn-unit-biomechanicaldrone.png", - "Spider Mines (Raven)": github_icon_base_url + "blizzard/btn-upgrade-siegetank-spidermines.png", - "Railgun Turret (Raven)": github_icon_base_url + "blizzard/btn-unit-terran-autoturretblackops.png", - "Hunter-Seeker Weapon (Raven)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-specialordance.png", - "Interference Matrix (Raven)": github_icon_base_url + "blizzard/btn-upgrade-terran-interferencematrix.png", - "Anti-Armor Missile (Raven)": github_icon_base_url + "blizzard/btn-ability-terran-shreddermissile-color.png", - "Internal Tech Module (Raven)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Resource Efficiency (Raven)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Durable Materials (Raven)": github_icon_base_url + "blizzard/btn-upgrade-terran-durablematerials.png", - "EMP Shockwave (Science Vessel)": github_icon_base_url + "blizzard/btn-ability-mengsk-ghost-staticempblast.png", - "Defensive Matrix (Science Vessel)": github_icon_base_url + "blizzard/btn-upgrade-swann-defensivematrix.png", - "Improved Nano-Repair (Science Vessel)": github_icon_base_url + "blizzard/btn-upgrade-swann-improvednanorepair.png", - "Advanced AI Systems (Science Vessel)": github_icon_base_url + "blizzard/btn-ability-mengsk-medivac-doublehealbeam.png", - "Internal Fusion Module (Hercules)": github_icon_base_url + "blizzard/btn-upgrade-terran-internalizedtechmodule.png", - "Tactical Jump (Hercules)": github_icon_base_url + "blizzard/btn-ability-terran-hercules-tacticaljump.png", - "Advanced Ballistics (Liberator)": github_icon_base_url + "blizzard/btn-upgrade-terran-advanceballistics.png", - "Raid Artillery (Liberator)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-terrandefendermodestructureattack.png", - "Cloak (Liberator)": github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png", - "Laser Targeting System (Liberator)": github_icon_base_url + "blizzard/btn-upgrade-terran-lazertargetingsystem.png", - "Optimized Logistics (Liberator)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Smart Servos (Liberator)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Resource Efficiency (Liberator)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Enhanced Cluster Launchers (Valkyrie)": github_icon_base_url + "blizzard/btn-ability-stetmann-corruptormissilebarrage.png", - "Shaped Hull (Valkyrie)": organics_icon_base_url + "ShapedHull.png", - "Flechette Missiles (Valkyrie)": github_icon_base_url + "blizzard/btn-ability-hornerhan-viking-missileupgrade.png", - "Afterburners (Valkyrie)": github_icon_base_url + "blizzard/btn-upgrade-terran-medivacemergencythrusters.png", - "Launching Vector Compensator (Valkyrie)": github_icon_base_url + "blizzard/btn-ability-terran-emergencythrusters.png", - "Resource Efficiency (Valkyrie)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - - "War Pigs": "https://static.wikia.nocookie.net/starcraft/images/e/ed/WarPigs_SC2_Icon1.jpg", - "Devil Dogs": "https://static.wikia.nocookie.net/starcraft/images/3/33/DevilDogs_SC2_Icon1.jpg", - "Hammer Securities": "https://static.wikia.nocookie.net/starcraft/images/3/3b/HammerSecurity_SC2_Icon1.jpg", - "Spartan Company": "https://static.wikia.nocookie.net/starcraft/images/b/be/SpartanCompany_SC2_Icon1.jpg", - "Siege Breakers": "https://static.wikia.nocookie.net/starcraft/images/3/31/SiegeBreakers_SC2_Icon1.jpg", - "Hel's Angels": "https://static.wikia.nocookie.net/starcraft/images/6/63/HelsAngels_SC2_Icon1.jpg", - "Dusk Wings": "https://static.wikia.nocookie.net/starcraft/images/5/52/DuskWings_SC2_Icon1.jpg", - "Jackson's Revenge": "https://static.wikia.nocookie.net/starcraft/images/9/95/JacksonsRevenge_SC2_Icon1.jpg", - "Skibi's Angels": github_icon_base_url + "blizzard/btn-unit-terran-medicelite.png", - "Death Heads": github_icon_base_url + "blizzard/btn-unit-terran-deathhead.png", - "Winged Nightmares": github_icon_base_url + "blizzard/btn-unit-collection-wraith-junker.png", - "Midnight Riders": github_icon_base_url + "blizzard/btn-unit-terran-liberatorblackops.png", - "Brynhilds": github_icon_base_url + "blizzard/btn-unit-collection-vikingfighter-covertops.png", - "Jotun": github_icon_base_url + "blizzard/btn-unit-terran-thormengsk.png", - - "Ultra-Capacitors": "https://static.wikia.nocookie.net/starcraft/images/2/23/SC2_Lab_Ultra_Capacitors_Icon.png", - "Vanadium Plating": "https://static.wikia.nocookie.net/starcraft/images/6/67/SC2_Lab_VanPlating_Icon.png", - "Orbital Depots": "https://static.wikia.nocookie.net/starcraft/images/0/01/SC2_Lab_Orbital_Depot_Icon.png", - "Micro-Filtering": "https://static.wikia.nocookie.net/starcraft/images/2/20/SC2_Lab_MicroFilter_Icon.png", - "Automated Refinery": "https://static.wikia.nocookie.net/starcraft/images/7/71/SC2_Lab_Auto_Refinery_Icon.png", - "Command Center Reactor": "https://static.wikia.nocookie.net/starcraft/images/e/ef/SC2_Lab_CC_Reactor_Icon.png", - "Tech Reactor": "https://static.wikia.nocookie.net/starcraft/images/c/c5/SC2_Lab_Tech_Reactor_Icon.png", - "Orbital Strike": "https://static.wikia.nocookie.net/starcraft/images/d/df/SC2_Lab_Orb_Strike_Icon.png", - - "Shrike Turret (Bunker)": "https://static.wikia.nocookie.net/starcraft/images/4/44/SC2_Lab_Shrike_Turret_Icon.png", - "Fortified Bunker (Bunker)": "https://static.wikia.nocookie.net/starcraft/images/4/4f/SC2_Lab_FortBunker_Icon.png", - "Planetary Fortress": "https://static.wikia.nocookie.net/starcraft/images/0/0b/SC2_Lab_PlanetFortress_Icon.png", - "Perdition Turret": "https://static.wikia.nocookie.net/starcraft/images/a/af/SC2_Lab_PerdTurret_Icon.png", - "Cellular Reactor": "https://static.wikia.nocookie.net/starcraft/images/d/d8/SC2_Lab_CellReactor_Icon.png", - "Regenerative Bio-Steel Level 1": github_icon_base_url + "original/btn-regenerativebiosteel-green.png", - "Regenerative Bio-Steel Level 2": github_icon_base_url + "original/btn-regenerativebiosteel-blue.png", - "Regenerative Bio-Steel Level 3": github_icon_base_url + "blizzard/btn-research-zerg-regenerativebio-steel.png", - "Hive Mind Emulator": "https://static.wikia.nocookie.net/starcraft/images/b/bc/SC2_Lab_Hive_Emulator_Icon.png", - "Psi Disrupter": "https://static.wikia.nocookie.net/starcraft/images/c/cf/SC2_Lab_Psi_Disruptor_Icon.png", - - "Structure Armor": github_icon_base_url + "blizzard/btn-upgrade-terran-buildingarmor.png", - "Hi-Sec Auto Tracking": github_icon_base_url + "blizzard/btn-upgrade-terran-hisecautotracking.png", - "Advanced Optics": github_icon_base_url + "blizzard/btn-upgrade-swann-vehiclerangeincrease.png", - "Rogue Forces": github_icon_base_url + "blizzard/btn-unit-terran-tosh.png", - - "Ghost Visor (Nova Equipment)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-ghostvisor.png", - "Rangefinder Oculus (Nova Equipment)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-rangefinderoculus.png", - "Domination (Nova Ability)": github_icon_base_url + "blizzard/btn-ability-nova-domination.png", - "Blink (Nova Ability)": github_icon_base_url + "blizzard/btn-upgrade-nova-blink.png", - "Stealth Suit Module (Nova Suit Module)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-stealthsuit.png", - "Cloak (Nova Suit Module)": github_icon_base_url + "blizzard/btn-ability-terran-cloak-color.png", - "Permanently Cloaked (Nova Suit Module)": github_icon_base_url + "blizzard/btn-upgrade-nova-tacticalstealthsuit.png", - "Energy Suit Module (Nova Suit Module)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-apolloinfantrysuit.png", - "Armored Suit Module (Nova Suit Module)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-blinksuit.png", - "Jump Suit Module (Nova Suit Module)": github_icon_base_url + "blizzard/btn-upgrade-nova-jetpack.png", - "C20A Canister Rifle (Nova Weapon)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-canisterrifle.png", - "Hellfire Shotgun (Nova Weapon)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-shotgun.png", - "Plasma Rifle (Nova Weapon)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-plasmagun.png", - "Monomolecular Blade (Nova Weapon)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-monomolecularblade.png", - "Blazefire Gunblade (Nova Weapon)": github_icon_base_url + "blizzard/btn-upgrade-nova-equipment-gunblade_sword.png", - "Stim Infusion (Nova Gadget)": github_icon_base_url + "blizzard/btn-upgrade-terran-superstimppack.png", - "Pulse Grenades (Nova Gadget)": github_icon_base_url + "blizzard/btn-upgrade-nova-btn-upgrade-nova-pulsegrenade.png", - "Flashbang Grenades (Nova Gadget)": github_icon_base_url + "blizzard/btn-upgrade-nova-btn-upgrade-nova-flashgrenade.png", - "Ionic Force Field (Nova Gadget)": github_icon_base_url + "blizzard/btn-upgrade-terran-nova-personaldefensivematrix.png", - "Holo Decoy (Nova Gadget)": github_icon_base_url + "blizzard/btn-upgrade-nova-holographicdecoy.png", - "Tac Nuke Strike (Nova Ability)": github_icon_base_url + "blizzard/btn-ability-terran-nuclearstrike-color.png", - - "Zerg Melee Attack Level 1": github_icon_base_url + "blizzard/btn-upgrade-zerg-meleeattacks-level1.png", - "Zerg Melee Attack Level 2": github_icon_base_url + "blizzard/btn-upgrade-zerg-meleeattacks-level2.png", - "Zerg Melee Attack Level 3": github_icon_base_url + "blizzard/btn-upgrade-zerg-meleeattacks-level3.png", - "Zerg Missile Attack Level 1": github_icon_base_url + "blizzard/btn-upgrade-zerg-missileattacks-level1.png", - "Zerg Missile Attack Level 2": github_icon_base_url + "blizzard/btn-upgrade-zerg-missileattacks-level2.png", - "Zerg Missile Attack Level 3": github_icon_base_url + "blizzard/btn-upgrade-zerg-missileattacks-level3.png", - "Zerg Ground Carapace Level 1": github_icon_base_url + "blizzard/btn-upgrade-zerg-groundcarapace-level1.png", - "Zerg Ground Carapace Level 2": github_icon_base_url + "blizzard/btn-upgrade-zerg-groundcarapace-level2.png", - "Zerg Ground Carapace Level 3": github_icon_base_url + "blizzard/btn-upgrade-zerg-groundcarapace-level3.png", - "Zerg Flyer Attack Level 1": github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level1.png", - "Zerg Flyer Attack Level 2": github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level2.png", - "Zerg Flyer Attack Level 3": github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level3.png", - "Zerg Flyer Carapace Level 1": github_icon_base_url + "blizzard/btn-upgrade-zerg-flyercarapace-level1.png", - "Zerg Flyer Carapace Level 2": github_icon_base_url + "blizzard/btn-upgrade-zerg-flyercarapace-level2.png", - "Zerg Flyer Carapace Level 3": github_icon_base_url + "blizzard/btn-upgrade-zerg-flyercarapace-level3.png", - - "Automated Extractors (Kerrigan Tier 3)": github_icon_base_url + "blizzard/btn-ability-kerrigan-automatedextractors.png", - "Vespene Efficiency (Kerrigan Tier 5)": github_icon_base_url + "blizzard/btn-ability-kerrigan-vespeneefficiency.png", - "Twin Drones (Kerrigan Tier 5)": github_icon_base_url + "blizzard/btn-ability-kerrigan-twindrones.png", - "Improved Overlords (Kerrigan Tier 3)": github_icon_base_url + "blizzard/btn-ability-kerrigan-improvedoverlords.png", - "Ventral Sacs (Overlord)": github_icon_base_url + "blizzard/btn-upgrade-zerg-ventralsacs.png", - "Malignant Creep (Kerrigan Tier 5)": github_icon_base_url + "blizzard/btn-ability-kerrigan-malignantcreep.png", - - "Spine Crawler": github_icon_base_url + "blizzard/btn-building-zerg-spinecrawler.png", - "Spore Crawler": github_icon_base_url + "blizzard/btn-building-zerg-sporecrawler.png", - - "Zergling": github_icon_base_url + "blizzard/btn-unit-zerg-zergling.png", - "Swarm Queen": github_icon_base_url + "blizzard/btn-unit-zerg-broodqueen.png", - "Roach": github_icon_base_url + "blizzard/btn-unit-zerg-roach.png", - "Hydralisk": github_icon_base_url + "blizzard/btn-unit-zerg-hydralisk.png", - "Aberration": github_icon_base_url + "blizzard/btn-unit-zerg-aberration.png", - "Mutalisk": github_icon_base_url + "blizzard/btn-unit-zerg-mutalisk.png", - "Corruptor": github_icon_base_url + "blizzard/btn-unit-zerg-corruptor.png", - "Swarm Host": github_icon_base_url + "blizzard/btn-unit-zerg-swarmhost.png", - "Infestor": github_icon_base_url + "blizzard/btn-unit-zerg-infestor.png", - "Defiler": github_icon_base_url + "original/btn-unit-zerg-defiler@scbw.png", - "Ultralisk": github_icon_base_url + "blizzard/btn-unit-zerg-ultralisk.png", - "Brood Queen": github_icon_base_url + "blizzard/btn-unit-zerg-classicqueen.png", - "Scourge": github_icon_base_url + "blizzard/btn-unit-zerg-scourge.png", - - "Baneling Aspect (Zergling)": github_icon_base_url + "blizzard/btn-unit-zerg-baneling.png", - "Ravager Aspect (Roach)": github_icon_base_url + "blizzard/btn-unit-zerg-ravager.png", - "Impaler Aspect (Hydralisk)": github_icon_base_url + "blizzard/btn-unit-zerg-impaler.png", - "Lurker Aspect (Hydralisk)": github_icon_base_url + "blizzard/btn-unit-zerg-lurker.png", - "Brood Lord Aspect (Mutalisk/Corruptor)": github_icon_base_url + "blizzard/btn-unit-zerg-broodlord.png", - "Viper Aspect (Mutalisk/Corruptor)": github_icon_base_url + "blizzard/btn-unit-zerg-viper.png", - "Guardian Aspect (Mutalisk/Corruptor)": github_icon_base_url + "blizzard/btn-unit-zerg-primalguardian.png", - "Devourer Aspect (Mutalisk/Corruptor)": github_icon_base_url + "blizzard/btn-unit-zerg-devourerex3.png", - - "Raptor Strain (Zergling)": github_icon_base_url + "blizzard/btn-unit-zerg-zergling-raptor.png", - "Swarmling Strain (Zergling)": github_icon_base_url + "blizzard/btn-unit-zerg-zergling-swarmling.png", - "Hardened Carapace (Zergling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-hardenedcarapace.png", - "Adrenal Overload (Zergling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-adrenaloverload.png", - "Metabolic Boost (Zergling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-hotsmetabolicboost.png", - "Shredding Claws (Zergling)": github_icon_base_url + "blizzard/btn-upgrade-zergling-armorshredding.png", - "Zergling Reconstitution (Kerrigan Tier 3)": github_icon_base_url + "blizzard/btn-ability-kerrigan-zerglingreconstitution.png", - "Splitter Strain (Baneling)": github_icon_base_url + "blizzard/talent-zagara-level14-unlocksplitterling.png", - "Hunter Strain (Baneling)": github_icon_base_url + "blizzard/btn-ability-zerg-cliffjump-baneling.png", - "Corrosive Acid (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-corrosiveacid.png", - "Rupture (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-rupture.png", - "Regenerative Acid (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-regenerativebile.png", - "Centrifugal Hooks (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-centrifugalhooks.png", - "Tunneling Jaws (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-zerg-tunnelingjaws.png", - "Rapid Metamorph (Baneling)": github_icon_base_url + "blizzard/btn-upgrade-terran-optimizedlogistics.png", - "Spawn Larvae (Swarm Queen)": github_icon_base_url + "blizzard/btn-unit-zerg-larva.png", - "Deep Tunnel (Swarm Queen)": github_icon_base_url + "blizzard/btn-ability-zerg-deeptunnel.png", - "Organic Carapace (Swarm Queen)": github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png", - "Bio-Mechanical Transfusion (Swarm Queen)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-biomechanicaltransfusion.png", - "Resource Efficiency (Swarm Queen)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Incubator Chamber (Swarm Queen)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-incubationchamber.png", - "Vile Strain (Roach)": github_icon_base_url + "blizzard/btn-unit-zerg-roach-vile.png", - "Corpser Strain (Roach)": github_icon_base_url + "blizzard/btn-unit-zerg-roach-corpser.png", - "Hydriodic Bile (Roach)": github_icon_base_url + "blizzard/btn-upgrade-zerg-hydriaticacid.png", - "Adaptive Plating (Roach)": github_icon_base_url + "blizzard/btn-upgrade-zerg-adaptivecarapace.png", - "Tunneling Claws (Roach)": github_icon_base_url + "blizzard/btn-upgrade-zerg-hotstunnelingclaws.png", - "Glial Reconstitution (Roach)": github_icon_base_url + "blizzard/btn-upgrade-zerg-glialreconstitution.png", - "Organic Carapace (Roach)": github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png", - "Potent Bile (Ravager)": github_icon_base_url + "blizzard/potentbile_coop.png", - "Bloated Bile Ducts (Ravager)": github_icon_base_url + "blizzard/btn-ability-zerg-abathur-corrosivebilelarge.png", - "Deep Tunnel (Ravager)": github_icon_base_url + "blizzard/btn-ability-zerg-deeptunnel.png", - "Frenzy (Hydralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-frenzy.png", - "Ancillary Carapace (Hydralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-ancillaryarmor.png", - "Grooved Spines (Hydralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-hotsgroovedspines.png", - "Muscular Augments (Hydralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-evolvemuscularaugments.png", - "Resource Efficiency (Hydralisk)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Adaptive Talons (Impaler)": github_icon_base_url + "blizzard/btn-upgrade-zerg-adaptivetalons.png", - "Secretion Glands (Impaler)": github_icon_base_url + "blizzard/btn-ability-zerg-creepspread.png", - "Hardened Tentacle Spines (Impaler)": github_icon_base_url + "blizzard/btn-ability-zerg-dehaka-impaler-tenderize.png", - "Seismic Spines (Lurker)": github_icon_base_url + "blizzard/btn-upgrade-kerrigan-seismicspines.png", - "Adapted Spines (Lurker)": github_icon_base_url + "blizzard/btn-upgrade-zerg-groovedspines.png", - "Vicious Glaive (Mutalisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-viciousglaive.png", - "Rapid Regeneration (Mutalisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-rapidregeneration.png", - "Sundering Glaive (Mutalisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-explosiveglaive.png", - "Severing Glaive (Mutalisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-explosiveglaive.png", - "Aerodynamic Glaive Shape (Mutalisk)": github_icon_base_url + "blizzard/btn-ability-dehaka-airbonusdamage.png", - "Corruption (Corruptor)": github_icon_base_url + "blizzard/btn-ability-zerg-causticspray.png", - "Caustic Spray (Corruptor)": github_icon_base_url + "blizzard/btn-ability-zerg-corruption-color.png", - "Porous Cartilage (Brood Lord)": github_icon_base_url + "blizzard/btn-upgrade-kerrigan-broodlordspeed.png", - "Evolved Carapace (Brood Lord)": github_icon_base_url + "blizzard/btn-upgrade-zerg-chitinousplating.png", - "Splitter Mitosis (Brood Lord)": github_icon_base_url + "blizzard/abilityicon_spawnbroodlings_square.png", - "Resource Efficiency (Brood Lord)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Parasitic Bomb (Viper)": github_icon_base_url + "blizzard/btn-ability-zerg-parasiticbomb.png", - "Paralytic Barbs (Viper)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-abduct.png", - "Virulent Microbes (Viper)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-castrange.png", - "Prolonged Dispersion (Guardian)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-prolongeddispersion.png", - "Primal Adaptation (Guardian)": github_icon_base_url + "blizzard/biomassrecovery_coop.png", - "Soronan Acid (Guardian)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-biomass.png", - "Corrosive Spray (Devourer)": github_icon_base_url + "blizzard/btn-upgrade-zerg-abathur-devourer-corrosivespray.png", - "Gaping Maw (Devourer)": github_icon_base_url + "blizzard/btn-ability-zerg-explode-color.png", - "Improved Osmosis (Devourer)": github_icon_base_url + "blizzard/btn-upgrade-zerg-pneumatizedcarapace.png", - "Prescient Spores (Devourer)": github_icon_base_url + "blizzard/btn-upgrade-zerg-airattacks-level2.png", - "Carrion Strain (Swarm Host)": github_icon_base_url + "blizzard/btn-unit-zerg-swarmhost-carrion.png", - "Creeper Strain (Swarm Host)": github_icon_base_url + "blizzard/btn-unit-zerg-swarmhost-creeper.png", - "Burrow (Swarm Host)": github_icon_base_url + "blizzard/btn-ability-zerg-burrow-color.png", - "Rapid Incubation (Swarm Host)": github_icon_base_url + "blizzard/btn-upgrade-zerg-rapidincubation.png", - "Pressurized Glands (Swarm Host)": github_icon_base_url + "blizzard/btn-upgrade-zerg-pressurizedglands.png", - "Locust Metabolic Boost (Swarm Host)": github_icon_base_url + "blizzard/btn-upgrade-zerg-glialreconstitution.png", - "Enduring Locusts (Swarm Host)": github_icon_base_url + "blizzard/btn-upgrade-zerg-evolveincreasedlocustlifetime.png", - "Organic Carapace (Swarm Host)": github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png", - "Resource Efficiency (Swarm Host)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Infested Terran (Infestor)": github_icon_base_url + "blizzard/btn-unit-zerg-infestedmarine.png", - "Microbial Shroud (Infestor)": github_icon_base_url + "blizzard/btn-ability-zerg-darkswarm.png", - "Noxious Strain (Ultralisk)": github_icon_base_url + "blizzard/btn-unit-zerg-ultralisk-noxious.png", - "Torrasque Strain (Ultralisk)": github_icon_base_url + "blizzard/btn-unit-zerg-ultralisk-torrasque.png", - "Burrow Charge (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-burrowcharge.png", - "Tissue Assimilation (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-tissueassimilation.png", - "Monarch Blades (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-monarchblades.png", - "Anabolic Synthesis (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-anabolicsynthesis.png", - "Chitinous Plating (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-chitinousplating.png", - "Organic Carapace (Ultralisk)": github_icon_base_url + "blizzard/btn-upgrade-zerg-organiccarapace.png", - "Resource Efficiency (Ultralisk)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Fungal Growth (Brood Queen)": github_icon_base_url + "blizzard/btn-upgrade-zerg-stukov-researchqueenfungalgrowth.png", - "Ensnare (Brood Queen)": github_icon_base_url + "blizzard/btn-ability-zerg-fungalgrowth-color.png", - "Enhanced Mitochondria (Brood Queen)": github_icon_base_url + "blizzard/btn-upgrade-zerg-stukov-queenenergyregen.png", - "Virulent Spores (Scourge)": github_icon_base_url + "blizzard/btn-upgrade-zagara-scourgesplashdamage.png", - "Resource Efficiency (Scourge)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Swarm Scourge (Scourge)": github_icon_base_url + "original/btn-upgrade-custom-triple-scourge.png", - - "Infested Medics": github_icon_base_url + "blizzard/btn-unit-terran-medicelite.png", - "Infested Siege Tanks": github_icon_base_url + "original/btn-unit-terran-siegetankmercenary-tank.png", - "Infested Banshees": github_icon_base_url + "original/btn-unit-terran-bansheemercenary.png", - - "Primal Form (Kerrigan)": github_icon_base_url + "blizzard/btn-unit-zerg-kerriganinfested.png", - "Kinetic Blast (Kerrigan Tier 1)": github_icon_base_url + "blizzard/btn-ability-kerrigan-kineticblast.png", - "Heroic Fortitude (Kerrigan Tier 1)": github_icon_base_url + "blizzard/btn-ability-kerrigan-heroicfortitude.png", - "Leaping Strike (Kerrigan Tier 1)": github_icon_base_url + "blizzard/btn-ability-kerrigan-leapingstrike.png", - "Crushing Grip (Kerrigan Tier 2)": github_icon_base_url + "blizzard/btn-ability-swarm-kerrigan-crushinggrip.png", - "Chain Reaction (Kerrigan Tier 2)": github_icon_base_url + "blizzard/btn-ability-swarm-kerrigan-chainreaction.png", - "Psionic Shift (Kerrigan Tier 2)": github_icon_base_url + "blizzard/btn-ability-kerrigan-psychicshift.png", - "Wild Mutation (Kerrigan Tier 4)": github_icon_base_url + "blizzard/btn-ability-kerrigan-wildmutation.png", - "Spawn Banelings (Kerrigan Tier 4)": github_icon_base_url + "blizzard/abilityicon_spawnbanelings_square.png", - "Mend (Kerrigan Tier 4)": github_icon_base_url + "blizzard/btn-ability-zerg-transfusion-color.png", - "Infest Broodlings (Kerrigan Tier 6)": github_icon_base_url + "blizzard/abilityicon_spawnbroodlings_square.png", - "Fury (Kerrigan Tier 6)": github_icon_base_url + "blizzard/btn-ability-kerrigan-fury.png", - "Ability Efficiency (Kerrigan Tier 6)": github_icon_base_url + "blizzard/btn-ability-kerrigan-abilityefficiency.png", - "Apocalypse (Kerrigan Tier 7)": github_icon_base_url + "blizzard/btn-ability-kerrigan-apocalypse.png", - "Spawn Leviathan (Kerrigan Tier 7)": github_icon_base_url + "blizzard/btn-unit-zerg-leviathan.png", - "Drop-Pods (Kerrigan Tier 7)": github_icon_base_url + "blizzard/btn-ability-kerrigan-droppods.png", - - "Protoss Ground Weapon Level 1": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundweaponslevel1.png", - "Protoss Ground Weapon Level 2": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundweaponslevel2.png", - "Protoss Ground Weapon Level 3": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundweaponslevel3.png", - "Protoss Ground Armor Level 1": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel1.png", - "Protoss Ground Armor Level 2": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel2.png", - "Protoss Ground Armor Level 3": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel3.png", - "Protoss Shields Level 1": github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel1.png", - "Protoss Shields Level 2": github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel2.png", - "Protoss Shields Level 3": github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel3.png", - "Protoss Air Weapon Level 1": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel1.png", - "Protoss Air Weapon Level 2": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel2.png", - "Protoss Air Weapon Level 3": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel3.png", - "Protoss Air Armor Level 1": github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel1.png", - "Protoss Air Armor Level 2": github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel2.png", - "Protoss Air Armor Level 3": github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel3.png", - - "Quatro": github_icon_base_url + "blizzard/btn-progression-protoss-fenix-6-forgeresearch.png", - - "Photon Cannon": github_icon_base_url + "blizzard/btn-building-protoss-photoncannon.png", - "Khaydarin Monolith": github_icon_base_url + "blizzard/btn-unit-protoss-khaydarinmonolith.png", - "Shield Battery": github_icon_base_url + "blizzard/btn-building-protoss-shieldbattery.png", - - "Enhanced Targeting": github_icon_base_url + "blizzard/btn-upgrade-karax-turretrange.png", - "Optimized Ordnance": github_icon_base_url + "blizzard/btn-upgrade-karax-turretattackspeed.png", - "Khalai Ingenuity": github_icon_base_url + "blizzard/btn-upgrade-karax-pylonwarpininstantly.png", - "Orbital Assimilators": github_icon_base_url + "blizzard/btn-ability-spearofadun-orbitalassimilator.png", - "Amplified Assimilators": github_icon_base_url + "original/btn-research-terran-microfiltering.png", - "Warp Harmonization": github_icon_base_url + "blizzard/btn-ability-spearofadun-warpharmonization.png", - "Superior Warp Gates": github_icon_base_url + "blizzard/talent-artanis-level03-warpgatecharges.png", - "Nexus Overcharge": github_icon_base_url + "blizzard/btn-ability-spearofadun-nexusovercharge.png", - - "Zealot": github_icon_base_url + "blizzard/btn-unit-protoss-zealot-aiur.png", - "Centurion": github_icon_base_url + "blizzard/btn-unit-protoss-zealot-nerazim.png", - "Sentinel": github_icon_base_url + "blizzard/btn-unit-protoss-zealot-purifier.png", - "Supplicant": github_icon_base_url + "blizzard/btn-unit-protoss-alarak-taldarim-supplicant.png", - "Sentry": github_icon_base_url + "blizzard/btn-unit-protoss-sentry.png", - "Energizer": github_icon_base_url + "blizzard/btn-unit-protoss-sentry-purifier.png", - "Havoc": github_icon_base_url + "blizzard/btn-unit-protoss-sentry-taldarim.png", - "Stalker": "https://static.wikia.nocookie.net/starcraft/images/0/0d/Icon_Protoss_Stalker.jpg", - "Instigator": github_icon_base_url + "blizzard/btn-unit-protoss-stalker-purifier.png", - "Slayer": github_icon_base_url + "blizzard/btn-unit-protoss-alarak-taldarim-stalker.png", - "Dragoon": github_icon_base_url + "blizzard/btn-unit-protoss-dragoon-void.png", - "Adept": github_icon_base_url + "blizzard/btn-unit-protoss-adept-purifier.png", - "High Templar": "https://static.wikia.nocookie.net/starcraft/images/a/a0/Icon_Protoss_High_Templar.jpg", - "Signifier": github_icon_base_url + "original/btn-unit-protoss-hightemplar-nerazim.png", - "Ascendant": github_icon_base_url + "blizzard/btn-unit-protoss-hightemplar-taldarim.png", - "Dark Archon": github_icon_base_url + "blizzard/talent-vorazun-level05-unlockdarkarchon.png", - "Dark Templar": "https://static.wikia.nocookie.net/starcraft/images/9/90/Icon_Protoss_Dark_Templar.jpg", - "Avenger": github_icon_base_url + "blizzard/btn-unit-protoss-darktemplar-aiur.png", - "Blood Hunter": github_icon_base_url + "blizzard/btn-unit-protoss-darktemplar-taldarim.png", - - "Leg Enhancements (Zealot/Sentinel/Centurion)": github_icon_base_url + "blizzard/btn-ability-protoss-charge-color.png", - "Shield Capacity (Zealot/Sentinel/Centurion)": github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel1.png", - "Blood Shield (Supplicant)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-supplicantarmor.png", - "Soul Augmentation (Supplicant)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-supplicantextrashields.png", - "Shield Regeneration (Supplicant)": github_icon_base_url + "blizzard/btn-ability-protoss-voidarmor.png", - "Force Field (Sentry)": github_icon_base_url + "blizzard/btn-ability-protoss-forcefield-color.png", - "Hallucination (Sentry)": github_icon_base_url + "blizzard/btn-ability-protoss-hallucination-color.png", - "Reclamation (Energizer)": github_icon_base_url + "blizzard/btn-ability-protoss-reclamation.png", - "Forged Chassis (Energizer)": github_icon_base_url + "blizzard/btn-upgrade-protoss-groundarmorlevel0.png", - "Detect Weakness (Havoc)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-havoctargetlockbuffed.png", - "Bloodshard Resonance (Havoc)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-rangeincrease.png", - "Cloaking Module (Sentry/Energizer/Havoc)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-permanentcloak.png", - "Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)": github_icon_base_url + "blizzard/btn-upgrade-karax-energyregen200.png", - "Disintegrating Particles (Stalker/Instigator/Slayer)": github_icon_base_url + "blizzard/btn-ability-protoss-phasedisruptor.png", - "Particle Reflection (Stalker/Instigator/Slayer)": github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-adeptchampionbounceattack.png", - "High Impact Phase Disruptor (Dragoon)": github_icon_base_url + "blizzard/btn-ability-protoss-phasedisruptor.png", - "Trillic Compression System (Dragoon)": github_icon_base_url + "blizzard/btn-ability-protoss-dragoonchassis.png", - "Singularity Charge (Dragoon)": github_icon_base_url + "blizzard/btn-upgrade-artanis-singularitycharge.png", - "Enhanced Strider Servos (Dragoon)": github_icon_base_url + "blizzard/btn-upgrade-terran-transformationservos.png", - "Shockwave (Adept)": github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-adept-recochetglaiveupgraded.png", - "Resonating Glaives (Adept)": github_icon_base_url + "blizzard/btn-upgrade-protoss-resonatingglaives.png", - "Phase Bulwark (Adept)": github_icon_base_url + "blizzard/btn-upgrade-protoss-adeptshieldupgrade.png", - "Unshackled Psionic Storm (High Templar/Signifier)": github_icon_base_url + "blizzard/btn-ability-protoss-psistorm.png", - "Hallucination (High Templar/Signifier)": github_icon_base_url + "blizzard/btn-ability-protoss-hallucination-color.png", - "Khaydarin Amulet (High Templar/Signifier)": github_icon_base_url + "blizzard/btn-upgrade-protoss-khaydarinamulet.png", - "High Archon (Archon)": github_icon_base_url + "blizzard/btn-upgrade-artanis-healingpsionicstorm.png", - "Power Overwhelming (Ascendant)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-ascendantspermanentlybetter.png", - "Chaotic Attunement (Ascendant)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-ascendant'spsiorbtravelsfurther.png", - "Blood Amulet (Ascendant)": github_icon_base_url + "blizzard/btn-upgrade-protoss-wrathwalker-chargetimeimproved.png", - "Feedback (Dark Archon)": github_icon_base_url + "blizzard/btn-ability-protoss-feedback-color.png", - "Maelstrom (Dark Archon)": github_icon_base_url + "blizzard/btn-ability-protoss-voidstasis.png", - "Argus Talisman (Dark Archon)": github_icon_base_url + "original/btn-upgrade-protoss-argustalisman@scbw.png", - "Dark Archon Meld (Dark Templar)": github_icon_base_url + "blizzard/talent-vorazun-level05-unlockdarkarchon.png", - "Shroud of Adun (Dark Templar/Avenger/Blood Hunter)": github_icon_base_url + "blizzard/talent-vorazun-level01-shadowstalk.png", - "Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)": github_icon_base_url + "blizzard/btn-ability-terran-heal-color.png", - "Blink (Dark Templar/Avenger/Blood Hunter)": github_icon_base_url + "blizzard/btn-ability-protoss-shadowdash.png", - "Resource Efficiency (Dark Templar/Avenger/Blood Hunter)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - - "Warp Prism": github_icon_base_url + "blizzard/btn-unit-protoss-warpprism.png", - "Immortal": "https://static.wikia.nocookie.net/starcraft/images/c/c1/Icon_Protoss_Immortal.jpg", - "Annihilator": github_icon_base_url + "blizzard/btn-unit-protoss-immortal-nerazim.png", - "Vanguard": github_icon_base_url + "blizzard/btn-unit-protoss-immortal-taldarim.png", - "Colossus": github_icon_base_url + "blizzard/btn-unit-protoss-colossus-purifier.png", - "Wrathwalker": github_icon_base_url + "blizzard/btn-unit-protoss-colossus-taldarim.png", - "Observer": github_icon_base_url + "blizzard/btn-unit-protoss-observer.png", - "Reaver": github_icon_base_url + "blizzard/btn-unit-protoss-reaver.png", - "Disruptor": github_icon_base_url + "blizzard/btn-unit-protoss-disruptor.png", - - "Gravitic Drive (Warp Prism)": github_icon_base_url + "blizzard/btn-upgrade-protoss-graviticdrive.png", - "Phase Blaster (Warp Prism)": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel0.png", - "War Configuration (Warp Prism)": github_icon_base_url + "blizzard/btn-upgrade-protoss-alarak-graviticdrive.png", - "Singularity Charge (Immortal/Annihilator)": github_icon_base_url + "blizzard/btn-upgrade-artanis-singularitycharge.png", - "Advanced Targeting Mechanics (Immortal/Annihilator)": github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png", - "Agony Launchers (Vanguard)": github_icon_base_url + "blizzard/btn-upgrade-protoss-vanguard-aoeradiusincreased.png", - "Matter Dispersion (Vanguard)": github_icon_base_url + "blizzard/btn-ability-terran-detectionconedebuff.png", - "Pacification Protocol (Colossus)": github_icon_base_url + "blizzard/btn-ability-protoss-chargedblast.png", - "Rapid Power Cycling (Wrathwalker)": github_icon_base_url + "blizzard/btn-upgrade-protoss-wrathwalker-chargetimeimproved.png", - "Eye of Wrath (Wrathwalker)": github_icon_base_url + "blizzard/btn-upgrade-protoss-extendedthermallance.png", - "Gravitic Boosters (Observer)": github_icon_base_url + "blizzard/btn-upgrade-protoss-graviticbooster.png", - "Sensor Array (Observer)": github_icon_base_url + "blizzard/btn-ability-zeratul-observer-sensorarray.png", - "Scarab Damage (Reaver)": github_icon_base_url + "blizzard/btn-ability-protoss-scarabshot.png", - "Solarite Payload (Reaver)": github_icon_base_url + "blizzard/btn-upgrade-artanis-scarabsplashradius.png", - "Reaver Capacity (Reaver)": github_icon_base_url + "original/btn-upgrade-protoss-increasedscarabcapacity@scbw.png", - "Resource Efficiency (Reaver)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - - "Phoenix": "https://static.wikia.nocookie.net/starcraft/images/b/b1/Icon_Protoss_Phoenix.jpg", - "Mirage": github_icon_base_url + "blizzard/btn-unit-protoss-phoenix-purifier.png", - "Corsair": github_icon_base_url + "blizzard/btn-unit-protoss-corsair.png", - "Destroyer": github_icon_base_url + "blizzard/btn-unit-protoss-voidray-taldarim.png", - "Void Ray": github_icon_base_url + "blizzard/btn-unit-protoss-voidray-nerazim.png", - "Carrier": "https://static.wikia.nocookie.net/starcraft/images/2/2c/Icon_Protoss_Carrier.jpg", - "Scout": github_icon_base_url + "original/btn-unit-protoss-scout.png", - "Tempest": github_icon_base_url + "blizzard/btn-unit-protoss-tempest-purifier.png", - "Mothership": github_icon_base_url + "blizzard/btn-unit-protoss-mothership-taldarim.png", - "Arbiter": github_icon_base_url + "blizzard/btn-unit-protoss-arbiter.png", - "Oracle": github_icon_base_url + "blizzard/btn-unit-protoss-oracle.png", - - "Ionic Wavelength Flux (Phoenix/Mirage)": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel0.png", - "Anion Pulse-Crystals (Phoenix/Mirage)": github_icon_base_url + "blizzard/btn-upgrade-protoss-phoenixrange.png", - "Stealth Drive (Corsair)": github_icon_base_url + "blizzard/btn-upgrade-vorazun-corsairpermanentlycloaked.png", - "Argus Jewel (Corsair)": github_icon_base_url + "blizzard/btn-ability-protoss-stasistrap.png", - "Sustaining Disruption (Corsair)": github_icon_base_url + "blizzard/btn-ability-protoss-disruptionweb.png", - "Neutron Shields (Corsair)": github_icon_base_url + "blizzard/btn-upgrade-protoss-shieldslevel1.png", - "Reforged Bloodshard Core (Destroyer)": github_icon_base_url + "blizzard/btn-amonshardsarmor.png", - "Flux Vanes (Void Ray/Destroyer)": github_icon_base_url + "blizzard/btn-upgrade-protoss-fluxvanes.png", - "Graviton Catapult (Carrier)": github_icon_base_url + "blizzard/btn-upgrade-protoss-gravitoncatapult.png", - "Hull of Past Glories (Carrier)": github_icon_base_url + "blizzard/btn-progression-protoss-fenix-14-colossusandcarrierchampionsresearch.png", - "Combat Sensor Array (Scout)": github_icon_base_url + "blizzard/btn-upgrade-protoss-fenix-scoutchampionrange.png", - "Apial Sensors (Scout)": github_icon_base_url + "blizzard/btn-upgrade-tychus-detection.png", - "Gravitic Thrusters (Scout)": github_icon_base_url + "blizzard/btn-upgrade-protoss-graviticbooster.png", - "Advanced Photon Blasters (Scout)": github_icon_base_url + "blizzard/btn-upgrade-protoss-airweaponslevel3.png", - "Tectonic Destabilizers (Tempest)": github_icon_base_url + "blizzard/btn-ability-protoss-disruptionblast.png", - "Quantic Reactor (Tempest)": github_icon_base_url + "blizzard/btn-upgrade-protoss-researchgravitysling.png", - "Gravity Sling (Tempest)": github_icon_base_url + "blizzard/btn-upgrade-protoss-tectonicdisruptors.png", - "Chronostatic Reinforcement (Arbiter)": github_icon_base_url + "blizzard/btn-upgrade-protoss-airarmorlevel2.png", - "Khaydarin Core (Arbiter)": github_icon_base_url + "blizzard/btn-upgrade-protoss-adeptshieldupgrade.png", - "Spacetime Anchor (Arbiter)": github_icon_base_url + "blizzard/btn-ability-protoss-stasisfield.png", - "Resource Efficiency (Arbiter)": github_icon_base_url + "blizzard/btn-ability-hornerhan-salvagebonus.png", - "Enhanced Cloak Field (Arbiter)": github_icon_base_url + "blizzard/btn-ability-stetmann-stetzonegenerator-speed.png", - "Stealth Drive (Oracle)": github_icon_base_url + "blizzard/btn-upgrade-vorazun-oraclepermanentlycloaked.png", - "Stasis Calibration (Oracle)": github_icon_base_url + "blizzard/btn-ability-protoss-oracle-stasiscalibration.png", - "Temporal Acceleration Beam (Oracle)": github_icon_base_url + "blizzard/btn-ability-protoss-oraclepulsarcannonon.png", - - "Matrix Overload": github_icon_base_url + "blizzard/btn-ability-spearofadun-matrixoverload.png", - "Guardian Shell": github_icon_base_url + "blizzard/btn-ability-spearofadun-guardianshell.png", - - "Chrono Surge (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-chronosurge.png", - "Proxy Pylon (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-deploypylon.png", - "Warp In Reinforcements (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-warpinreinforcements.png", - "Pylon Overcharge (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-protoss-purify.png", - "Orbital Strike (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-orbitalstrike.png", - "Temporal Field (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-temporalfield.png", - "Solar Lance (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-solarlance.png", - "Mass Recall (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-massrecall.png", - "Shield Overcharge (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-shieldovercharge.png", - "Deploy Fenix (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-unit-protoss-fenix.png", - "Purifier Beam (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-purifierbeam.png", - "Time Stop (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-timestop.png", - "Solar Bombardment (Spear of Adun Calldown)": github_icon_base_url + "blizzard/btn-ability-spearofadun-solarbombardment.png", - - "Reconstruction Beam (Spear of Adun Auto-Cast)": github_icon_base_url + "blizzard/btn-ability-spearofadun-reconstructionbeam.png", - "Overwatch (Spear of Adun Auto-Cast)": github_icon_base_url + "blizzard/btn-ability-zeratul-chargedcrystal-psionicwinds.png", - - "Nothing": "", - } - sc2wol_location_ids = { - "Liberation Day": range(SC2WOL_LOC_ID_OFFSET + 100, SC2WOL_LOC_ID_OFFSET + 200), - "The Outlaws": range(SC2WOL_LOC_ID_OFFSET + 200, SC2WOL_LOC_ID_OFFSET + 300), - "Zero Hour": range(SC2WOL_LOC_ID_OFFSET + 300, SC2WOL_LOC_ID_OFFSET + 400), - "Evacuation": range(SC2WOL_LOC_ID_OFFSET + 400, SC2WOL_LOC_ID_OFFSET + 500), - "Outbreak": range(SC2WOL_LOC_ID_OFFSET + 500, SC2WOL_LOC_ID_OFFSET + 600), - "Safe Haven": range(SC2WOL_LOC_ID_OFFSET + 600, SC2WOL_LOC_ID_OFFSET + 700), - "Haven's Fall": range(SC2WOL_LOC_ID_OFFSET + 700, SC2WOL_LOC_ID_OFFSET + 800), - "Smash and Grab": range(SC2WOL_LOC_ID_OFFSET + 800, SC2WOL_LOC_ID_OFFSET + 900), - "The Dig": range(SC2WOL_LOC_ID_OFFSET + 900, SC2WOL_LOC_ID_OFFSET + 1000), - "The Moebius Factor": range(SC2WOL_LOC_ID_OFFSET + 1000, SC2WOL_LOC_ID_OFFSET + 1100), - "Supernova": range(SC2WOL_LOC_ID_OFFSET + 1100, SC2WOL_LOC_ID_OFFSET + 1200), - "Maw of the Void": range(SC2WOL_LOC_ID_OFFSET + 1200, SC2WOL_LOC_ID_OFFSET + 1300), - "Devil's Playground": range(SC2WOL_LOC_ID_OFFSET + 1300, SC2WOL_LOC_ID_OFFSET + 1400), - "Welcome to the Jungle": range(SC2WOL_LOC_ID_OFFSET + 1400, SC2WOL_LOC_ID_OFFSET + 1500), - "Breakout": range(SC2WOL_LOC_ID_OFFSET + 1500, SC2WOL_LOC_ID_OFFSET + 1600), - "Ghost of a Chance": range(SC2WOL_LOC_ID_OFFSET + 1600, SC2WOL_LOC_ID_OFFSET + 1700), - "The Great Train Robbery": range(SC2WOL_LOC_ID_OFFSET + 1700, SC2WOL_LOC_ID_OFFSET + 1800), - "Cutthroat": range(SC2WOL_LOC_ID_OFFSET + 1800, SC2WOL_LOC_ID_OFFSET + 1900), - "Engine of Destruction": range(SC2WOL_LOC_ID_OFFSET + 1900, SC2WOL_LOC_ID_OFFSET + 2000), - "Media Blitz": range(SC2WOL_LOC_ID_OFFSET + 2000, SC2WOL_LOC_ID_OFFSET + 2100), - "Piercing the Shroud": range(SC2WOL_LOC_ID_OFFSET + 2100, SC2WOL_LOC_ID_OFFSET + 2200), - "Whispers of Doom": range(SC2WOL_LOC_ID_OFFSET + 2200, SC2WOL_LOC_ID_OFFSET + 2300), - "A Sinister Turn": range(SC2WOL_LOC_ID_OFFSET + 2300, SC2WOL_LOC_ID_OFFSET + 2400), - "Echoes of the Future": range(SC2WOL_LOC_ID_OFFSET + 2400, SC2WOL_LOC_ID_OFFSET + 2500), - "In Utter Darkness": range(SC2WOL_LOC_ID_OFFSET + 2500, SC2WOL_LOC_ID_OFFSET + 2600), - "Gates of Hell": range(SC2WOL_LOC_ID_OFFSET + 2600, SC2WOL_LOC_ID_OFFSET + 2700), - "Belly of the Beast": range(SC2WOL_LOC_ID_OFFSET + 2700, SC2WOL_LOC_ID_OFFSET + 2800), - "Shatter the Sky": range(SC2WOL_LOC_ID_OFFSET + 2800, SC2WOL_LOC_ID_OFFSET + 2900), - "All-In": range(SC2WOL_LOC_ID_OFFSET + 2900, SC2WOL_LOC_ID_OFFSET + 3000), - - "Lab Rat": range(SC2HOTS_LOC_ID_OFFSET + 100, SC2HOTS_LOC_ID_OFFSET + 200), - "Back in the Saddle": range(SC2HOTS_LOC_ID_OFFSET + 200, SC2HOTS_LOC_ID_OFFSET + 300), - "Rendezvous": range(SC2HOTS_LOC_ID_OFFSET + 300, SC2HOTS_LOC_ID_OFFSET + 400), - "Harvest of Screams": range(SC2HOTS_LOC_ID_OFFSET + 400, SC2HOTS_LOC_ID_OFFSET + 500), - "Shoot the Messenger": range(SC2HOTS_LOC_ID_OFFSET + 500, SC2HOTS_LOC_ID_OFFSET + 600), - "Enemy Within": range(SC2HOTS_LOC_ID_OFFSET + 600, SC2HOTS_LOC_ID_OFFSET + 700), - "Domination": range(SC2HOTS_LOC_ID_OFFSET + 700, SC2HOTS_LOC_ID_OFFSET + 800), - "Fire in the Sky": range(SC2HOTS_LOC_ID_OFFSET + 800, SC2HOTS_LOC_ID_OFFSET + 900), - "Old Soldiers": range(SC2HOTS_LOC_ID_OFFSET + 900, SC2HOTS_LOC_ID_OFFSET + 1000), - "Waking the Ancient": range(SC2HOTS_LOC_ID_OFFSET + 1000, SC2HOTS_LOC_ID_OFFSET + 1100), - "The Crucible": range(SC2HOTS_LOC_ID_OFFSET + 1100, SC2HOTS_LOC_ID_OFFSET + 1200), - "Supreme": range(SC2HOTS_LOC_ID_OFFSET + 1200, SC2HOTS_LOC_ID_OFFSET + 1300), - "Infested": range(SC2HOTS_LOC_ID_OFFSET + 1300, SC2HOTS_LOC_ID_OFFSET + 1400), - "Hand of Darkness": range(SC2HOTS_LOC_ID_OFFSET + 1400, SC2HOTS_LOC_ID_OFFSET + 1500), - "Phantoms of the Void": range(SC2HOTS_LOC_ID_OFFSET + 1500, SC2HOTS_LOC_ID_OFFSET + 1600), - "With Friends Like These": range(SC2HOTS_LOC_ID_OFFSET + 1600, SC2HOTS_LOC_ID_OFFSET + 1700), - "Conviction": range(SC2HOTS_LOC_ID_OFFSET + 1700, SC2HOTS_LOC_ID_OFFSET + 1800), - "Planetfall": range(SC2HOTS_LOC_ID_OFFSET + 1800, SC2HOTS_LOC_ID_OFFSET + 1900), - "Death From Above": range(SC2HOTS_LOC_ID_OFFSET + 1900, SC2HOTS_LOC_ID_OFFSET + 2000), - "The Reckoning": range(SC2HOTS_LOC_ID_OFFSET + 2000, SC2HOTS_LOC_ID_OFFSET + 2100), - - "Dark Whispers": range(SC2LOTV_LOC_ID_OFFSET + 100, SC2LOTV_LOC_ID_OFFSET + 200), - "Ghosts in the Fog": range(SC2LOTV_LOC_ID_OFFSET + 200, SC2LOTV_LOC_ID_OFFSET + 300), - "Evil Awoken": range(SC2LOTV_LOC_ID_OFFSET + 300, SC2LOTV_LOC_ID_OFFSET + 400), - - "For Aiur!": range(SC2LOTV_LOC_ID_OFFSET + 400, SC2LOTV_LOC_ID_OFFSET + 500), - "The Growing Shadow": range(SC2LOTV_LOC_ID_OFFSET + 500, SC2LOTV_LOC_ID_OFFSET + 600), - "The Spear of Adun": range(SC2LOTV_LOC_ID_OFFSET + 600, SC2LOTV_LOC_ID_OFFSET + 700), - "Sky Shield": range(SC2LOTV_LOC_ID_OFFSET + 700, SC2LOTV_LOC_ID_OFFSET + 800), - "Brothers in Arms": range(SC2LOTV_LOC_ID_OFFSET + 800, SC2LOTV_LOC_ID_OFFSET + 900), - "Amon's Reach": range(SC2LOTV_LOC_ID_OFFSET + 900, SC2LOTV_LOC_ID_OFFSET + 1000), - "Last Stand": range(SC2LOTV_LOC_ID_OFFSET + 1000, SC2LOTV_LOC_ID_OFFSET + 1100), - "Forbidden Weapon": range(SC2LOTV_LOC_ID_OFFSET + 1100, SC2LOTV_LOC_ID_OFFSET + 1200), - "Temple of Unification": range(SC2LOTV_LOC_ID_OFFSET + 1200, SC2LOTV_LOC_ID_OFFSET + 1300), - "The Infinite Cycle": range(SC2LOTV_LOC_ID_OFFSET + 1300, SC2LOTV_LOC_ID_OFFSET + 1400), - "Harbinger of Oblivion": range(SC2LOTV_LOC_ID_OFFSET + 1400, SC2LOTV_LOC_ID_OFFSET + 1500), - "Unsealing the Past": range(SC2LOTV_LOC_ID_OFFSET + 1500, SC2LOTV_LOC_ID_OFFSET + 1600), - "Purification": range(SC2LOTV_LOC_ID_OFFSET + 1600, SC2LOTV_LOC_ID_OFFSET + 1700), - "Steps of the Rite": range(SC2LOTV_LOC_ID_OFFSET + 1700, SC2LOTV_LOC_ID_OFFSET + 1800), - "Rak'Shir": range(SC2LOTV_LOC_ID_OFFSET + 1800, SC2LOTV_LOC_ID_OFFSET + 1900), - "Templar's Charge": range(SC2LOTV_LOC_ID_OFFSET + 1900, SC2LOTV_LOC_ID_OFFSET + 2000), - "Templar's Return": range(SC2LOTV_LOC_ID_OFFSET + 2000, SC2LOTV_LOC_ID_OFFSET + 2100), - "The Host": range(SC2LOTV_LOC_ID_OFFSET + 2100, SC2LOTV_LOC_ID_OFFSET + 2200), - "Salvation": range(SC2LOTV_LOC_ID_OFFSET + 2200, SC2LOTV_LOC_ID_OFFSET + 2300), - - "Into the Void": range(SC2LOTV_LOC_ID_OFFSET + 2300, SC2LOTV_LOC_ID_OFFSET + 2400), - "The Essence of Eternity": range(SC2LOTV_LOC_ID_OFFSET + 2400, SC2LOTV_LOC_ID_OFFSET + 2500), - "Amon's Fall": range(SC2LOTV_LOC_ID_OFFSET + 2500, SC2LOTV_LOC_ID_OFFSET + 2600), - - "The Escape": range(SC2NCO_LOC_ID_OFFSET + 100, SC2NCO_LOC_ID_OFFSET + 200), - "Sudden Strike": range(SC2NCO_LOC_ID_OFFSET + 200, SC2NCO_LOC_ID_OFFSET + 300), - "Enemy Intelligence": range(SC2NCO_LOC_ID_OFFSET + 300, SC2NCO_LOC_ID_OFFSET + 400), - "Trouble In Paradise": range(SC2NCO_LOC_ID_OFFSET + 400, SC2NCO_LOC_ID_OFFSET + 500), - "Night Terrors": range(SC2NCO_LOC_ID_OFFSET + 500, SC2NCO_LOC_ID_OFFSET + 600), - "Flashpoint": range(SC2NCO_LOC_ID_OFFSET + 600, SC2NCO_LOC_ID_OFFSET + 700), - "In the Enemy's Shadow": range(SC2NCO_LOC_ID_OFFSET + 700, SC2NCO_LOC_ID_OFFSET + 800), - "Dark Skies": range(SC2NCO_LOC_ID_OFFSET + 800, SC2NCO_LOC_ID_OFFSET + 900), - "End Game": range(SC2NCO_LOC_ID_OFFSET + 900, SC2NCO_LOC_ID_OFFSET + 1000), - } + STARTING_MINERALS_ITEM_ID = 1800 + STARTING_VESPENE_ITEM_ID = 1801 + STARTING_SUPPLY_ITEM_ID = 1802 + # NOTHING_ITEM_ID = 1803 + MAX_SUPPLY_ITEM_ID = 1804 + SHIELD_REGENERATION_ITEM_ID = 1805 + BUILDING_CONSTRUCTION_SPEED_ITEM_ID = 1806 + UPGRADE_RESEARCH_SPEED_ITEM_ID = 1807 + UPGRADE_RESEARCH_COST_ITEM_ID = 1808 + REDUCED_MAX_SUPPLY_ITEM_ID = 1850 + slot_data = tracker_data.get_slot_data(player) + inventory: collections.Counter[int] = tracker_data.get_player_inventory_counts(team, player) + item_id_to_name = tracker_data.item_id_to_name["Starcraft 2"] + location_id_to_name = tracker_data.location_id_to_name["Starcraft 2"] + # Filler item counters display_data = {} + display_data["minerals_count"] = slot_data.get("minerals_per_item", 15) * inventory.get(STARTING_MINERALS_ITEM_ID, 0) + display_data["vespene_count"] = slot_data.get("vespene_per_item", 15) * inventory.get(STARTING_VESPENE_ITEM_ID, 0) + display_data["supply_count"] = slot_data.get("starting_supply_per_item", 2) * inventory.get(STARTING_SUPPLY_ITEM_ID, 0) + display_data["max_supply_count"] = slot_data.get("maximum_supply_per_item", 1) * inventory.get(MAX_SUPPLY_ITEM_ID, 0) + display_data["reduced_supply_count"] = slot_data.get("maximum_supply_reduction_per_item", 1) * inventory.get(REDUCED_MAX_SUPPLY_ITEM_ID, 0) + display_data["construction_speed_count"] = inventory.get(BUILDING_CONSTRUCTION_SPEED_ITEM_ID, 0) + display_data["shield_regen_count"] = inventory.get(SHIELD_REGENERATION_ITEM_ID, 0) + display_data["upgrade_speed_count"] = inventory.get(UPGRADE_RESEARCH_SPEED_ITEM_ID, 0) + display_data["research_cost_count"] = inventory.get(UPGRADE_RESEARCH_COST_ITEM_ID, 0) - # Grouped Items - grouped_item_ids = { - "Progressive Terran Weapon Upgrade": 107 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Armor Upgrade": 108 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Infantry Upgrade": 109 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Vehicle Upgrade": 110 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Ship Upgrade": 111 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Weapon/Armor Upgrade": 112 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Zerg Weapon Upgrade": 105 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Armor Upgrade": 106 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Ground Upgrade": 107 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Flyer Upgrade": 108 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Weapon/Armor Upgrade": 109 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Protoss Weapon Upgrade": 105 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Armor Upgrade": 106 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Ground Upgrade": 107 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Air Upgrade": 108 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Weapon/Armor Upgrade": 109 + SC2LOTV_ITEM_ID_OFFSET, - } - grouped_item_replacements = { - "Progressive Terran Weapon Upgrade": ["Progressive Terran Infantry Weapon", - "Progressive Terran Vehicle Weapon", - "Progressive Terran Ship Weapon"], - "Progressive Terran Armor Upgrade": ["Progressive Terran Infantry Armor", - "Progressive Terran Vehicle Armor", - "Progressive Terran Ship Armor"], - "Progressive Terran Infantry Upgrade": ["Progressive Terran Infantry Weapon", - "Progressive Terran Infantry Armor"], - "Progressive Terran Vehicle Upgrade": ["Progressive Terran Vehicle Weapon", - "Progressive Terran Vehicle Armor"], - "Progressive Terran Ship Upgrade": ["Progressive Terran Ship Weapon", "Progressive Terran Ship Armor"], - "Progressive Zerg Weapon Upgrade": ["Progressive Zerg Melee Attack", "Progressive Zerg Missile Attack", - "Progressive Zerg Flyer Attack"], - "Progressive Zerg Armor Upgrade": ["Progressive Zerg Ground Carapace", - "Progressive Zerg Flyer Carapace"], - "Progressive Zerg Ground Upgrade": ["Progressive Zerg Melee Attack", "Progressive Zerg Missile Attack", - "Progressive Zerg Ground Carapace"], - "Progressive Zerg Flyer Upgrade": ["Progressive Zerg Flyer Attack", "Progressive Zerg Flyer Carapace"], - "Progressive Protoss Weapon Upgrade": ["Progressive Protoss Ground Weapon", - "Progressive Protoss Air Weapon"], - "Progressive Protoss Armor Upgrade": ["Progressive Protoss Ground Armor", "Progressive Protoss Shields", - "Progressive Protoss Air Armor"], - "Progressive Protoss Ground Upgrade": ["Progressive Protoss Ground Weapon", - "Progressive Protoss Ground Armor", - "Progressive Protoss Shields"], - "Progressive Protoss Air Upgrade": ["Progressive Protoss Air Weapon", "Progressive Protoss Air Armor", - "Progressive Protoss Shields"] - } - grouped_item_replacements["Progressive Terran Weapon/Armor Upgrade"] = \ - grouped_item_replacements["Progressive Terran Weapon Upgrade"] \ - + grouped_item_replacements["Progressive Terran Armor Upgrade"] - grouped_item_replacements["Progressive Zerg Weapon/Armor Upgrade"] = \ - grouped_item_replacements["Progressive Zerg Weapon Upgrade"] \ - + grouped_item_replacements["Progressive Zerg Armor Upgrade"] - grouped_item_replacements["Progressive Protoss Weapon/Armor Upgrade"] = \ - grouped_item_replacements["Progressive Protoss Weapon Upgrade"] \ - + grouped_item_replacements["Progressive Protoss Armor Upgrade"] - replacement_item_ids = { - "Progressive Terran Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Infantry Armor": 102 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Zerg Melee Attack": 100 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Missile Attack": 101 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Ground Carapace": 102 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Flyer Attack": 103 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Flyer Carapace": 104 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Protoss Ground Weapon": 100 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Ground Armor": 101 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Shields": 102 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Air Weapon": 103 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Air Armor": 104 + SC2LOTV_ITEM_ID_OFFSET, - } + # Locations + have_nco_locations = False + locations = tracker_data.get_player_locations(player) + checked_locations = tracker_data.get_player_checked_locations(team, player) + missions: dict[str, list[tuple[str, bool]]] = {} + for location_id in locations: + location_name = location_id_to_name.get(location_id, "") + if ":" not in location_name: + continue + mission_name = location_name.split(":", 1)[0] + missions.setdefault(mission_name, []).append((location_name, location_id in checked_locations)) + if location_id >= NCO_LOCATION_ID_LOW and location_id < NCO_LOCATION_ID_HIGH: + have_nco_locations = True + missions = {mission: missions[mission] for mission in sorted(missions)} - inventory: collections.Counter = tracker_data.get_player_inventory_counts(team, player) - for grouped_item_name, grouped_item_id in grouped_item_ids.items(): - count: int = inventory[grouped_item_id] - if count > 0: - for replacement_item in grouped_item_replacements[grouped_item_name]: - replacement_id: int = replacement_item_ids[replacement_item] - if replacement_id not in inventory or count > inventory[replacement_id]: - # If two groups provide the same individual item, maximum is used - # (this behavior is used for Protoss Shields) - inventory[replacement_id] = count - - # Determine display for progressive items - progressive_items = { - "Progressive Terran Infantry Weapon": 100 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Infantry Armor": 102 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Vehicle Weapon": 103 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Vehicle Armor": 104 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Ship Weapon": 105 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Terran Ship Armor": 106 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Fire-Suppression System": 206 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Orbital Command": 207 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stimpack (Marine)": 208 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stimpack (Firebat)": 226 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stimpack (Marauder)": 228 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stimpack (Reaper)": 250 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stimpack (Hellion)": 259 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Replenishable Magazine (Vulture)": 303 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Tri-Lithium Power Cell (Diamondback)": 306 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Tomahawk Power Cells (Wraith)": 312 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Cross-Spectrum Dampeners (Banshee)": 316 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Missile Pods (Battlecruiser)": 318 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Defensive Matrix (Battlecruiser)": 319 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Immortality Protocol (Thor)": 325 + SC2WOL_ITEM_ID_OFFSET, - "Progressive High Impact Payload (Thor)": 361 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Augmented Thrusters (Planetary Fortress)": 388 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Regenerative Bio-Steel": 617 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Stealth Suit Module (Nova Suit Module)": 904 + SC2WOL_ITEM_ID_OFFSET, - "Progressive Zerg Melee Attack": 100 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Missile Attack": 101 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Ground Carapace": 102 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Flyer Attack": 103 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Zerg Flyer Carapace": 104 + SC2HOTS_ITEM_ID_OFFSET, - "Progressive Protoss Ground Weapon": 100 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Ground Armor": 101 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Shields": 102 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Air Weapon": 103 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Protoss Air Armor": 104 + SC2LOTV_ITEM_ID_OFFSET, - "Progressive Proxy Pylon (Spear of Adun Calldown)": 701 + SC2LOTV_ITEM_ID_OFFSET, - } - # Format: L0, L1, L2, L3 - progressive_names = { - "Progressive Terran Infantry Weapon": ["Terran Infantry Weapons Level 1", - "Terran Infantry Weapons Level 1", - "Terran Infantry Weapons Level 2", - "Terran Infantry Weapons Level 3"], - "Progressive Terran Infantry Armor": ["Terran Infantry Armor Level 1", - "Terran Infantry Armor Level 1", - "Terran Infantry Armor Level 2", - "Terran Infantry Armor Level 3"], - "Progressive Terran Vehicle Weapon": ["Terran Vehicle Weapons Level 1", - "Terran Vehicle Weapons Level 1", - "Terran Vehicle Weapons Level 2", - "Terran Vehicle Weapons Level 3"], - "Progressive Terran Vehicle Armor": ["Terran Vehicle Armor Level 1", - "Terran Vehicle Armor Level 1", - "Terran Vehicle Armor Level 2", - "Terran Vehicle Armor Level 3"], - "Progressive Terran Ship Weapon": ["Terran Ship Weapons Level 1", - "Terran Ship Weapons Level 1", - "Terran Ship Weapons Level 2", - "Terran Ship Weapons Level 3"], - "Progressive Terran Ship Armor": ["Terran Ship Armor Level 1", - "Terran Ship Armor Level 1", - "Terran Ship Armor Level 2", - "Terran Ship Armor Level 3"], - "Progressive Fire-Suppression System": ["Fire-Suppression System Level 1", - "Fire-Suppression System Level 1", - "Fire-Suppression System Level 2"], - "Progressive Orbital Command": ["Orbital Command", "Orbital Command", - "Planetary Command Module"], - "Progressive Stimpack (Marine)": ["Stimpack (Marine)", "Stimpack (Marine)", - "Super Stimpack (Marine)"], - "Progressive Stimpack (Firebat)": ["Stimpack (Firebat)", "Stimpack (Firebat)", - "Super Stimpack (Firebat)"], - "Progressive Stimpack (Marauder)": ["Stimpack (Marauder)", "Stimpack (Marauder)", - "Super Stimpack (Marauder)"], - "Progressive Stimpack (Reaper)": ["Stimpack (Reaper)", "Stimpack (Reaper)", - "Super Stimpack (Reaper)"], - "Progressive Stimpack (Hellion)": ["Stimpack (Hellion)", "Stimpack (Hellion)", - "Super Stimpack (Hellion)"], - "Progressive Replenishable Magazine (Vulture)": ["Replenishable Magazine (Vulture)", - "Replenishable Magazine (Vulture)", - "Replenishable Magazine (Free) (Vulture)"], - "Progressive Tri-Lithium Power Cell (Diamondback)": ["Tri-Lithium Power Cell (Diamondback)", - "Tri-Lithium Power Cell (Diamondback)", - "Tungsten Spikes (Diamondback)"], - "Progressive Tomahawk Power Cells (Wraith)": ["Tomahawk Power Cells (Wraith)", - "Tomahawk Power Cells (Wraith)", - "Unregistered Cloaking Module (Wraith)"], - "Progressive Cross-Spectrum Dampeners (Banshee)": ["Cross-Spectrum Dampeners (Banshee)", - "Cross-Spectrum Dampeners (Banshee)", - "Advanced Cross-Spectrum Dampeners (Banshee)"], - "Progressive Missile Pods (Battlecruiser)": ["Missile Pods (Battlecruiser) Level 1", - "Missile Pods (Battlecruiser) Level 1", - "Missile Pods (Battlecruiser) Level 2"], - "Progressive Defensive Matrix (Battlecruiser)": ["Defensive Matrix (Battlecruiser)", - "Defensive Matrix (Battlecruiser)", - "Advanced Defensive Matrix (Battlecruiser)"], - "Progressive Immortality Protocol (Thor)": ["Immortality Protocol (Thor)", - "Immortality Protocol (Thor)", - "Immortality Protocol (Free) (Thor)"], - "Progressive High Impact Payload (Thor)": ["High Impact Payload (Thor)", - "High Impact Payload (Thor)", "Smart Servos (Thor)"], - "Progressive Augmented Thrusters (Planetary Fortress)": ["Lift Off (Planetary Fortress)", - "Lift Off (Planetary Fortress)", - "Armament Stabilizers (Planetary Fortress)"], - "Progressive Regenerative Bio-Steel": ["Regenerative Bio-Steel Level 1", - "Regenerative Bio-Steel Level 1", - "Regenerative Bio-Steel Level 2", - "Regenerative Bio-Steel Level 3"], - "Progressive Stealth Suit Module (Nova Suit Module)": ["Stealth Suit Module (Nova Suit Module)", - "Cloak (Nova Suit Module)", - "Permanently Cloaked (Nova Suit Module)"], - "Progressive Zerg Melee Attack": ["Zerg Melee Attack Level 1", - "Zerg Melee Attack Level 1", - "Zerg Melee Attack Level 2", - "Zerg Melee Attack Level 3"], - "Progressive Zerg Missile Attack": ["Zerg Missile Attack Level 1", - "Zerg Missile Attack Level 1", - "Zerg Missile Attack Level 2", - "Zerg Missile Attack Level 3"], - "Progressive Zerg Ground Carapace": ["Zerg Ground Carapace Level 1", - "Zerg Ground Carapace Level 1", - "Zerg Ground Carapace Level 2", - "Zerg Ground Carapace Level 3"], - "Progressive Zerg Flyer Attack": ["Zerg Flyer Attack Level 1", - "Zerg Flyer Attack Level 1", - "Zerg Flyer Attack Level 2", - "Zerg Flyer Attack Level 3"], - "Progressive Zerg Flyer Carapace": ["Zerg Flyer Carapace Level 1", - "Zerg Flyer Carapace Level 1", - "Zerg Flyer Carapace Level 2", - "Zerg Flyer Carapace Level 3"], - "Progressive Protoss Ground Weapon": ["Protoss Ground Weapon Level 1", - "Protoss Ground Weapon Level 1", - "Protoss Ground Weapon Level 2", - "Protoss Ground Weapon Level 3"], - "Progressive Protoss Ground Armor": ["Protoss Ground Armor Level 1", - "Protoss Ground Armor Level 1", - "Protoss Ground Armor Level 2", - "Protoss Ground Armor Level 3"], - "Progressive Protoss Shields": ["Protoss Shields Level 1", "Protoss Shields Level 1", - "Protoss Shields Level 2", "Protoss Shields Level 3"], - "Progressive Protoss Air Weapon": ["Protoss Air Weapon Level 1", - "Protoss Air Weapon Level 1", - "Protoss Air Weapon Level 2", - "Protoss Air Weapon Level 3"], - "Progressive Protoss Air Armor": ["Protoss Air Armor Level 1", - "Protoss Air Armor Level 1", - "Protoss Air Armor Level 2", - "Protoss Air Armor Level 3"], - "Progressive Proxy Pylon (Spear of Adun Calldown)": ["Proxy Pylon (Spear of Adun Calldown)", - "Proxy Pylon (Spear of Adun Calldown)", - "Warp In Reinforcements (Spear of Adun Calldown)"] - } - for item_name, item_id in progressive_items.items(): - level = min(inventory[item_id], len(progressive_names[item_name]) - 1) - display_name = progressive_names[item_name][level] - base_name = (item_name.split(maxsplit=1)[1].lower() - .replace(' ', '_') - .replace("-", "") - .replace("(", "") - .replace(")", "")) - display_data[base_name + "_level"] = level - display_data[base_name + "_url"] = icons[display_name] if display_name in icons else "FIXME" - display_data[base_name + "_name"] = display_name - - # Multi-items - multi_items = { - "Additional Starting Minerals": 800 + SC2WOL_ITEM_ID_OFFSET, - "Additional Starting Vespene": 801 + SC2WOL_ITEM_ID_OFFSET, - "Additional Starting Supply": 802 + SC2WOL_ITEM_ID_OFFSET - } - for item_name, item_id in multi_items.items(): - base_name = item_name.split()[-1].lower() - count = inventory[item_id] - if base_name == "supply": - count = count * starting_supply_per_item - elif base_name == "minerals": - count = count * minerals_per_item - elif base_name == "vespene": - count = count * vespene_per_item - display_data[base_name + "_count"] = count # Kerrigan level - level_items = { - "1 Kerrigan Level": 509 + SC2HOTS_ITEM_ID_OFFSET, - "2 Kerrigan Levels": 508 + SC2HOTS_ITEM_ID_OFFSET, - "3 Kerrigan Levels": 507 + SC2HOTS_ITEM_ID_OFFSET, - "4 Kerrigan Levels": 506 + SC2HOTS_ITEM_ID_OFFSET, - "5 Kerrigan Levels": 505 + SC2HOTS_ITEM_ID_OFFSET, - "6 Kerrigan Levels": 504 + SC2HOTS_ITEM_ID_OFFSET, - "7 Kerrigan Levels": 503 + SC2HOTS_ITEM_ID_OFFSET, - "8 Kerrigan Levels": 502 + SC2HOTS_ITEM_ID_OFFSET, - "9 Kerrigan Levels": 501 + SC2HOTS_ITEM_ID_OFFSET, - "10 Kerrigan Levels": 500 + SC2HOTS_ITEM_ID_OFFSET, - "14 Kerrigan Levels": 510 + SC2HOTS_ITEM_ID_OFFSET, - "35 Kerrigan Levels": 511 + SC2HOTS_ITEM_ID_OFFSET, - "70 Kerrigan Levels": 512 + SC2HOTS_ITEM_ID_OFFSET, - } - level_amounts = { - "1 Kerrigan Level": 1, - "2 Kerrigan Levels": 2, - "3 Kerrigan Levels": 3, - "4 Kerrigan Levels": 4, - "5 Kerrigan Levels": 5, - "6 Kerrigan Levels": 6, - "7 Kerrigan Levels": 7, - "8 Kerrigan Levels": 8, - "9 Kerrigan Levels": 9, - "10 Kerrigan Levels": 10, - "14 Kerrigan Levels": 14, - "35 Kerrigan Levels": 35, - "70 Kerrigan Levels": 70, - } + level_item_id_to_amount = ( + (509 + SC2HOTS_ITEM_ID_OFFSET, 1,), + (508 + SC2HOTS_ITEM_ID_OFFSET, 2,), + (507 + SC2HOTS_ITEM_ID_OFFSET, 3,), + (506 + SC2HOTS_ITEM_ID_OFFSET, 4,), + (505 + SC2HOTS_ITEM_ID_OFFSET, 5,), + (504 + SC2HOTS_ITEM_ID_OFFSET, 6,), + (503 + SC2HOTS_ITEM_ID_OFFSET, 7,), + (502 + SC2HOTS_ITEM_ID_OFFSET, 8,), + (501 + SC2HOTS_ITEM_ID_OFFSET, 9,), + (500 + SC2HOTS_ITEM_ID_OFFSET, 10,), + (510 + SC2HOTS_ITEM_ID_OFFSET, 14,), + (511 + SC2HOTS_ITEM_ID_OFFSET, 35,), + (512 + SC2HOTS_ITEM_ID_OFFSET, 70,), + ) kerrigan_level = 0 - for item_name, item_id in level_items.items(): - count = inventory[item_id] - amount = level_amounts[item_name] - kerrigan_level += count * amount + for item_id, levels_per_item in level_item_id_to_amount: + kerrigan_level += levels_per_item * inventory[item_id] display_data["kerrigan_level"] = kerrigan_level + # Hero presence + display_data["kerrigan_present"] = slot_data.get("kerrigan_presence", 0) == 0 + display_data["nova_present"] = have_nco_locations + + # Upgrades + TERRAN_INFANTRY_WEAPON_ID = 100 + SC2WOL_ITEM_ID_OFFSET + TERRAN_INFANTRY_ARMOR_ID = 102 + SC2WOL_ITEM_ID_OFFSET + TERRAN_VEHICLE_WEAPON_ID = 103 + SC2WOL_ITEM_ID_OFFSET + TERRAN_VEHICLE_ARMOR_ID = 104 + SC2WOL_ITEM_ID_OFFSET + TERRAN_SHIP_WEAPON_ID = 105 + SC2WOL_ITEM_ID_OFFSET + TERRAN_SHIP_ARMOR_ID = 106 + SC2WOL_ITEM_ID_OFFSET + ZERG_MELEE_ATTACK_ID = 100 + SC2HOTS_ITEM_ID_OFFSET + ZERG_MISSILE_ATTACK_ID = 101 + SC2HOTS_ITEM_ID_OFFSET + ZERG_GROUND_CARAPACE_ID = 102 + SC2HOTS_ITEM_ID_OFFSET + ZERG_FLYER_ATTACK_ID = 103 + SC2HOTS_ITEM_ID_OFFSET + ZERG_FLYER_CARAPACE_ID = 104 + SC2HOTS_ITEM_ID_OFFSET + PROTOSS_GROUND_WEAPON_ID = 100 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_GROUND_ARMOR_ID = 101 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_SHIELDS_ID = 102 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_AIR_WEAPON_ID = 103 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_AIR_ARMOR_ID = 104 + SC2LOTV_ITEM_ID_OFFSET + + # Bundles + TERRAN_WEAPON_UPGRADE_ID = 107 + SC2WOL_ITEM_ID_OFFSET + TERRAN_ARMOR_UPGRADE_ID = 108 + SC2WOL_ITEM_ID_OFFSET + TERRAN_INFANTRY_UPGRADE_ID = 109 + SC2WOL_ITEM_ID_OFFSET + TERRAN_VEHICLE_UPGRADE_ID = 110 + SC2WOL_ITEM_ID_OFFSET + TERRAN_SHIP_UPGRADE_ID = 111 + SC2WOL_ITEM_ID_OFFSET + TERRAN_WEAPON_ARMOR_UPGRADE_ID = 112 + SC2WOL_ITEM_ID_OFFSET + ZERG_WEAPON_UPGRADE_ID = 105 + SC2HOTS_ITEM_ID_OFFSET + ZERG_ARMOR_UPGRADE_ID = 106 + SC2HOTS_ITEM_ID_OFFSET + ZERG_GROUND_UPGRADE_ID = 107 + SC2HOTS_ITEM_ID_OFFSET + ZERG_FLYER_UPGRADE_ID = 108 + SC2HOTS_ITEM_ID_OFFSET + ZERG_WEAPON_ARMOR_UPGRADE_ID = 109 + SC2HOTS_ITEM_ID_OFFSET + PROTOSS_WEAPON_UPGRADE_ID = 105 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_ARMOR_UPGRADE_ID = 106 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_GROUND_UPGRADE_ID = 107 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_AIR_UPGRADE_ID = 108 + SC2LOTV_ITEM_ID_OFFSET + PROTOSS_WEAPON_ARMOR_UPGRADE_ID = 109 + SC2LOTV_ITEM_ID_OFFSET + grouped_item_replacements = { + TERRAN_WEAPON_UPGRADE_ID: [ + TERRAN_INFANTRY_WEAPON_ID, + TERRAN_VEHICLE_WEAPON_ID, + TERRAN_SHIP_WEAPON_ID, + ], + TERRAN_ARMOR_UPGRADE_ID: [ + TERRAN_INFANTRY_ARMOR_ID, + TERRAN_VEHICLE_ARMOR_ID, + TERRAN_SHIP_ARMOR_ID, + ], + TERRAN_INFANTRY_UPGRADE_ID: [ + TERRAN_INFANTRY_WEAPON_ID, + TERRAN_INFANTRY_ARMOR_ID, + ], + TERRAN_VEHICLE_UPGRADE_ID: [ + TERRAN_VEHICLE_WEAPON_ID, + TERRAN_VEHICLE_ARMOR_ID, + ], + TERRAN_SHIP_UPGRADE_ID: [ + TERRAN_SHIP_WEAPON_ID, + TERRAN_SHIP_ARMOR_ID + ], + ZERG_WEAPON_UPGRADE_ID: [ + ZERG_MELEE_ATTACK_ID, + ZERG_MISSILE_ATTACK_ID, + ZERG_FLYER_ATTACK_ID, + ], + ZERG_ARMOR_UPGRADE_ID: [ + ZERG_GROUND_CARAPACE_ID, + ZERG_FLYER_CARAPACE_ID, + ], + ZERG_GROUND_UPGRADE_ID: [ + ZERG_MELEE_ATTACK_ID, + ZERG_MISSILE_ATTACK_ID, + ZERG_GROUND_CARAPACE_ID, + ], + ZERG_FLYER_UPGRADE_ID: [ + ZERG_FLYER_ATTACK_ID, + ZERG_FLYER_CARAPACE_ID, + ], + PROTOSS_WEAPON_UPGRADE_ID: [ + PROTOSS_GROUND_WEAPON_ID, + PROTOSS_AIR_WEAPON_ID, + ], + PROTOSS_ARMOR_UPGRADE_ID: [ + PROTOSS_GROUND_ARMOR_ID, + PROTOSS_SHIELDS_ID, + PROTOSS_AIR_ARMOR_ID, + ], + PROTOSS_GROUND_UPGRADE_ID: [ + PROTOSS_GROUND_WEAPON_ID, + PROTOSS_GROUND_ARMOR_ID, + PROTOSS_SHIELDS_ID, + ], + PROTOSS_AIR_UPGRADE_ID: [ + PROTOSS_AIR_WEAPON_ID, + PROTOSS_AIR_ARMOR_ID, + PROTOSS_SHIELDS_ID, + ] + } + grouped_item_replacements[TERRAN_WEAPON_ARMOR_UPGRADE_ID] = ( + grouped_item_replacements[TERRAN_WEAPON_UPGRADE_ID] + + grouped_item_replacements[TERRAN_ARMOR_UPGRADE_ID] + ) + grouped_item_replacements[ZERG_WEAPON_ARMOR_UPGRADE_ID] = ( + grouped_item_replacements[ZERG_WEAPON_UPGRADE_ID] + + grouped_item_replacements[ZERG_ARMOR_UPGRADE_ID] + ) + grouped_item_replacements[PROTOSS_WEAPON_ARMOR_UPGRADE_ID] = ( + grouped_item_replacements[PROTOSS_WEAPON_UPGRADE_ID] + + grouped_item_replacements[PROTOSS_ARMOR_UPGRADE_ID] + ) + for bundle_id, upgrade_ids in grouped_item_replacements.items(): + bundle_amount = inventory[bundle_id] + for upgrade_id in upgrade_ids: + if bundle_amount > inventory[upgrade_id]: + # Only assign, don't add. + # This behaviour mimics protoss shields, where the output is + # the maximum bundle contribution, not the sum + inventory[upgrade_id] = bundle_amount + + # Victory condition game_state = tracker_data.get_player_client_status(team, player) - display_data["game_finished"] = game_state == 30 + display_data["game_finished"] = game_state == ClientStatus.CLIENT_GOAL - # Turn location IDs into mission objective counts - locations = tracker_data.get_player_locations(team, player) - checked_locations = tracker_data.get_player_checked_locations(team, player) - lookup_name = lambda id: tracker_data.location_id_to_name["Starcraft 2"][id] - location_info = {mission_name: {lookup_name(id): (id in checked_locations) for id in mission_locations if - id in set(locations)} for mission_name, mission_locations in - sc2wol_location_ids.items()} - checks_done = {mission_name: len( - [id for id in mission_locations if id in checked_locations and id in set(locations)]) for - mission_name, mission_locations in sc2wol_location_ids.items()} - checks_done['Total'] = len(checked_locations) - checks_in_area = {mission_name: len([id for id in mission_locations if id in set(locations)]) for - mission_name, mission_locations in sc2wol_location_ids.items()} - checks_in_area['Total'] = sum(checks_in_area.values()) + # Keys + keys: dict[str, int] = {} + for item_id, item_count in inventory.items(): + if item_id < SC2_KEY_ITEM_ID_OFFSET: + continue + keys[item_id_to_name[item_id]] = item_count - lookup_any_item_id_to_name = tracker_data.item_id_to_name["Starcraft 2"] return render_template( "tracker__Starcraft2.html", inventory=inventory, - icons=icons, - acquired_items={lookup_any_item_id_to_name[id] for id, count in inventory.items() if count > 0}, player=player, team=team, room=tracker_data.room, - player_name=tracker_data.get_player_name(team, player), - checks_done=checks_done, - checks_in_area=checks_in_area, - location_info=location_info, + player_name=tracker_data.get_player_name(player), + missions=missions, + locations=locations, + checked_locations=checked_locations, + location_id_to_name=location_id_to_name, + item_id_to_name=item_id_to_name, + keys=keys, + saving_second=tracker_data.get_room_saving_second(), **display_data, ) + _player_trackers["Starcraft 2"] = render_Starcraft2_tracker diff --git a/WebHostLib/upload.py b/WebHostLib/upload.py index 45b26b175e..48885e9cc6 100644 --- a/WebHostLib/upload.py +++ b/WebHostLib/upload.py @@ -1,4 +1,3 @@ -import base64 import json import pickle import typing @@ -14,9 +13,8 @@ from pony.orm.core import TransactionIntegrityError import schema import MultiServer -from NetUtils import SlotType +from NetUtils import GamesPackage, SlotType from Utils import VersionException, __version__ -from worlds import GamesPackage from worlds.Files import AutoPatchRegister from worlds.AutoWorld import data_package_checksum from . import app @@ -119,9 +117,9 @@ def upload_zip_to_db(zfile: zipfile.ZipFile, owner=None, meta={"race": False}, s # AP Container elif handler: data = zfile.open(file, "r").read() - patch = handler(BytesIO(data)) - patch.read() - files[patch.player] = data + with zipfile.ZipFile(BytesIO(data)) as container: + player = json.loads(container.open("archipelago.json").read())["player"] + files[player] = data # Spoiler elif file.filename.endswith(".txt"): @@ -135,11 +133,6 @@ def upload_zip_to_db(zfile: zipfile.ZipFile, owner=None, meta={"race": False}, s flash("Could not load multidata. File may be corrupted or incompatible.") multidata = None - # Minecraft - elif file.filename.endswith(".apmc"): - data = zfile.open(file, "r").read() - metadata = json.loads(base64.b64decode(data).decode("utf-8")) - files[metadata["player_id"]] = data # Factorio elif file.filename.endswith(".zip"): diff --git a/Zelda1Client.py b/Zelda1Client.py index 4473b3f3c7..6dd7a36165 100644 --- a/Zelda1Client.py +++ b/Zelda1Client.py @@ -20,6 +20,8 @@ from worlds.tloz.Items import item_game_ids from worlds.tloz.Locations import location_ids from worlds.tloz import Items, Locations, Rom +from settings import get_settings + SYSTEM_MESSAGE_ID = 0 CONNECTION_TIMING_OUT_STATUS = "Connection timing out. Please restart your emulator, then restart connector_tloz.lua" @@ -333,6 +335,7 @@ async def nes_sync_task(ctx: ZeldaContext): except ConnectionRefusedError: logger.debug("Connection Refused, Trying Again") ctx.nes_status = CONNECTION_REFUSED_STATUS + await asyncio.sleep(1) continue @@ -340,13 +343,12 @@ if __name__ == '__main__': # Text Mode to use !hint and such with games that have no text entry Utils.init_logging("ZeldaClient") - options = Utils.get_options() - DISPLAY_MSGS = options["tloz_options"]["display_msgs"] + DISPLAY_MSGS = get_settings()["tloz_options"]["display_msgs"] async def run_game(romfile: str) -> None: auto_start = typing.cast(typing.Union[bool, str], - Utils.get_options()["tloz_options"].get("rom_start", True)) + get_settings()["tloz_options"].get("rom_start", True)) if auto_start is True: import webbrowser webbrowser.open(romfile) diff --git a/data/client.kv b/data/client.kv index 562986cd17..08f4c8d718 100644 --- a/data/client.kv +++ b/data/client.kv @@ -24,9 +24,20 @@ : ripple_color: app.theme_cls.primaryColor ripple_duration_in_fast: 0.2 -: - ripple_color: app.theme_cls.primaryColor - ripple_duration_in_fast: 0.2 +: + on_release: app.screens.switch_screens(self) + + MDNavigationItemLabel: + text: root.text + theme_text_color: "Custom" + text_color_active: self.theme_cls.primaryColor + text_color_normal: 1, 1, 1, 1 + # indicator is on icon only for some reason + canvas.before: + Color: + rgba: self.theme_cls.secondaryContainerColor if root.active else self.theme_cls.transparentColor + Rectangle: + size: root.size : adaptive_height: True theme_font_size: "Custom" @@ -209,6 +220,8 @@ : theme_text_color: "Custom" text_color: 1, 1, 1, 1 +: + height: self.content.texture_size[1] + 80 : layout: layout bar_width: "12dp" diff --git a/data/lua/connector_bizhawk_generic.lua b/data/lua/connector_bizhawk_generic.lua index c2e8f91c0d..387ca2c6f3 100644 --- a/data/lua/connector_bizhawk_generic.lua +++ b/data/lua/connector_bizhawk_generic.lua @@ -365,18 +365,14 @@ request_handlers = { ["PREFERRED_CORES"] = function (req) local res = {} local preferred_cores = client.getconfig().PreferredCores + local systems_enumerator = preferred_cores.Keys:GetEnumerator() res["type"] = "PREFERRED_CORES_RESPONSE" res["value"] = {} - res["value"]["NES"] = preferred_cores.NES - res["value"]["SNES"] = preferred_cores.SNES - res["value"]["GB"] = preferred_cores.GB - res["value"]["GBC"] = preferred_cores.GBC - res["value"]["DGB"] = preferred_cores.DGB - res["value"]["SGB"] = preferred_cores.SGB - res["value"]["PCE"] = preferred_cores.PCE - res["value"]["PCECD"] = preferred_cores.PCECD - res["value"]["SGX"] = preferred_cores.SGX + + while systems_enumerator:MoveNext() do + res["value"][systems_enumerator.Current] = preferred_cores[systems_enumerator.Current] + end return res end, diff --git a/data/lua/connector_ff1.lua b/data/lua/connector_ff1.lua deleted file mode 100644 index afae5d3c81..0000000000 --- a/data/lua/connector_ff1.lua +++ /dev/null @@ -1,462 +0,0 @@ -local socket = require("socket") -local json = require('json') -local math = require('math') -require("common") - -local STATE_OK = "Ok" -local STATE_TENTATIVELY_CONNECTED = "Tentatively Connected" -local STATE_INITIAL_CONNECTION_MADE = "Initial Connection Made" -local STATE_UNINITIALIZED = "Uninitialized" - -local ITEM_INDEX = 0x03 -local WEAPON_INDEX = 0x07 -local ARMOR_INDEX = 0x0B - -local goldLookup = { - [0x16C] = 10, - [0x16D] = 20, - [0x16E] = 25, - [0x16F] = 30, - [0x170] = 55, - [0x171] = 70, - [0x172] = 85, - [0x173] = 110, - [0x174] = 135, - [0x175] = 155, - [0x176] = 160, - [0x177] = 180, - [0x178] = 240, - [0x179] = 255, - [0x17A] = 260, - [0x17B] = 295, - [0x17C] = 300, - [0x17D] = 315, - [0x17E] = 330, - [0x17F] = 350, - [0x180] = 385, - [0x181] = 400, - [0x182] = 450, - [0x183] = 500, - [0x184] = 530, - [0x185] = 575, - [0x186] = 620, - [0x187] = 680, - [0x188] = 750, - [0x189] = 795, - [0x18A] = 880, - [0x18B] = 1020, - [0x18C] = 1250, - [0x18D] = 1455, - [0x18E] = 1520, - [0x18F] = 1760, - [0x190] = 1975, - [0x191] = 2000, - [0x192] = 2750, - [0x193] = 3400, - [0x194] = 4150, - [0x195] = 5000, - [0x196] = 5450, - [0x197] = 6400, - [0x198] = 6720, - [0x199] = 7340, - [0x19A] = 7690, - [0x19B] = 7900, - [0x19C] = 8135, - [0x19D] = 9000, - [0x19E] = 9300, - [0x19F] = 9500, - [0x1A0] = 9900, - [0x1A1] = 10000, - [0x1A2] = 12350, - [0x1A3] = 13000, - [0x1A4] = 13450, - [0x1A5] = 14050, - [0x1A6] = 14720, - [0x1A7] = 15000, - [0x1A8] = 17490, - [0x1A9] = 18010, - [0x1AA] = 19990, - [0x1AB] = 20000, - [0x1AC] = 20010, - [0x1AD] = 26000, - [0x1AE] = 45000, - [0x1AF] = 65000 -} - -local extensionConsumableLookup = { - [432] = 0x3C, - [436] = 0x3C, - [440] = 0x3C, - [433] = 0x3D, - [437] = 0x3D, - [441] = 0x3D, - [434] = 0x3E, - [438] = 0x3E, - [442] = 0x3E, - [435] = 0x3F, - [439] = 0x3F, - [443] = 0x3F -} - -local noOverworldItemsLookup = { - [499] = 0x2B, - [500] = 0x12, -} - -local consumableStacks = nil -local prevstate = "" -local curstate = STATE_UNINITIALIZED -local ff1Socket = nil -local frame = 0 - -local isNesHawk = false - - ---Sets correct memory access functions based on whether NesHawk or QuickNES is loaded -local function defineMemoryFunctions() - local memDomain = {} - local domains = memory.getmemorydomainlist() - if domains[1] == "System Bus" then - --NesHawk - isNesHawk = true - memDomain["systembus"] = function() memory.usememorydomain("System Bus") end - memDomain["saveram"] = function() memory.usememorydomain("Battery RAM") end - memDomain["rom"] = function() memory.usememorydomain("PRG ROM") end - elseif domains[1] == "WRAM" then - --QuickNES - memDomain["systembus"] = function() memory.usememorydomain("System Bus") end - memDomain["saveram"] = function() memory.usememorydomain("WRAM") end - memDomain["rom"] = function() memory.usememorydomain("PRG ROM") end - end - return memDomain -end - -local memDomain = defineMemoryFunctions() - -local function StateOKForMainLoop() - memDomain.saveram() - local A = u8(0x102) -- Party Made - local B = u8(0x0FC) - local C = u8(0x0A3) - return A ~= 0x00 and not (A== 0xF2 and B == 0xF2 and C == 0xF2) -end - -function generateLocationChecked() - memDomain.saveram() - data = uRange(0x01FF, 0x101) - data[0] = nil - return data -end - -function setConsumableStacks() - memDomain.rom() - consumableStacks = {} - -- In order shards, tent, cabin, house, heal, pure, soft, ext1, ext2, ext3, ex4 - consumableStacks[0x35] = 1 - consumableStacks[0x36] = u8(0x47400) + 1 - consumableStacks[0x37] = u8(0x47401) + 1 - consumableStacks[0x38] = u8(0x47402) + 1 - consumableStacks[0x39] = u8(0x47403) + 1 - consumableStacks[0x3A] = u8(0x47404) + 1 - consumableStacks[0x3B] = u8(0x47405) + 1 - consumableStacks[0x3C] = u8(0x47406) + 1 - consumableStacks[0x3D] = u8(0x47407) + 1 - consumableStacks[0x3E] = u8(0x47408) + 1 - consumableStacks[0x3F] = u8(0x47409) + 1 -end - -function getEmptyWeaponSlots() - memDomain.saveram() - ret = {} - count = 1 - slot1 = uRange(0x118, 0x4) - slot2 = uRange(0x158, 0x4) - slot3 = uRange(0x198, 0x4) - slot4 = uRange(0x1D8, 0x4) - for i,v in pairs(slot1) do - if v == 0 then - ret[count] = 0x118 + i - count = count + 1 - end - end - for i,v in pairs(slot2) do - if v == 0 then - ret[count] = 0x158 + i - count = count + 1 - end - end - for i,v in pairs(slot3) do - if v == 0 then - ret[count] = 0x198 + i - count = count + 1 - end - end - for i,v in pairs(slot4) do - if v == 0 then - ret[count] = 0x1D8 + i - count = count + 1 - end - end - return ret -end - -function getEmptyArmorSlots() - memDomain.saveram() - ret = {} - count = 1 - slot1 = uRange(0x11C, 0x4) - slot2 = uRange(0x15C, 0x4) - slot3 = uRange(0x19C, 0x4) - slot4 = uRange(0x1DC, 0x4) - for i,v in pairs(slot1) do - if v == 0 then - ret[count] = 0x11C + i - count = count + 1 - end - end - for i,v in pairs(slot2) do - if v == 0 then - ret[count] = 0x15C + i - count = count + 1 - end - end - for i,v in pairs(slot3) do - if v == 0 then - ret[count] = 0x19C + i - count = count + 1 - end - end - for i,v in pairs(slot4) do - if v == 0 then - ret[count] = 0x1DC + i - count = count + 1 - end - end - return ret -end -local function slice (tbl, s, e) - local pos, new = 1, {} - for i = s + 1, e do - new[pos] = tbl[i] - pos = pos + 1 - end - return new -end -function processBlock(block) - local msgBlock = block['messages'] - if msgBlock ~= nil then - for i, v in pairs(msgBlock) do - if itemMessages[i] == nil then - local msg = {TTL=450, message=v, color=0xFFFF0000} - itemMessages[i] = msg - end - end - end - local itemsBlock = block["items"] - memDomain.saveram() - isInGame = u8(0x102) - if itemsBlock ~= nil and isInGame ~= 0x00 then - if consumableStacks == nil then - setConsumableStacks() - end - memDomain.saveram() --- print('ITEMBLOCK: ') --- print(itemsBlock) - itemIndex = u8(ITEM_INDEX) --- print('ITEMINDEX: '..itemIndex) - for i, v in pairs(slice(itemsBlock, itemIndex, #itemsBlock)) do - -- Minus the offset and add to the correct domain - local memoryLocation = v - if v >= 0x100 and v <= 0x114 then - -- This is a key item - memoryLocation = memoryLocation - 0x0E0 - wU8(memoryLocation, 0x01) - elseif v >= 0x1E0 and v <= 0x1F2 then - -- This is a movement item - -- Minus Offset (0x100) - movement offset (0xE0) - memoryLocation = memoryLocation - 0x1E0 - -- Canal is a flipped bit - if memoryLocation == 0x0C then - wU8(memoryLocation, 0x00) - else - wU8(memoryLocation, 0x01) - end - elseif v >= 0x1F3 and v <= 0x1F4 then - -- NoOverworld special items - memoryLocation = noOverworldItemsLookup[v] - wU8(memoryLocation, 0x01) - elseif v >= 0x16C and v <= 0x1AF then - -- This is a gold item - amountToAdd = goldLookup[v] - biggest = u8(0x01E) - medium = u8(0x01D) - smallest = u8(0x01C) - currentValue = 0x10000 * biggest + 0x100 * medium + smallest - newValue = currentValue + amountToAdd - newBiggest = math.floor(newValue / 0x10000) - newMedium = math.floor(math.fmod(newValue, 0x10000) / 0x100) - newSmallest = math.floor(math.fmod(newValue, 0x100)) - wU8(0x01E, newBiggest) - wU8(0x01D, newMedium) - wU8(0x01C, newSmallest) - elseif v >= 0x115 and v <= 0x11B then - -- This is a regular consumable OR a shard - -- Minus Offset (0x100) + item offset (0x20) - memoryLocation = memoryLocation - 0x0E0 - currentValue = u8(memoryLocation) - amountToAdd = consumableStacks[memoryLocation] - if currentValue < 99 then - wU8(memoryLocation, currentValue + amountToAdd) - end - elseif v >= 0x1B0 and v <= 0x1BB then - -- This is an extension consumable - memoryLocation = extensionConsumableLookup[v] - currentValue = u8(memoryLocation) - amountToAdd = consumableStacks[memoryLocation] - if currentValue < 99 then - value = currentValue + amountToAdd - if value > 99 then - value = 99 - end - wU8(memoryLocation, value) - end - end - end - if #itemsBlock > itemIndex then - wU8(ITEM_INDEX, #itemsBlock) - end - - memDomain.saveram() - weaponIndex = u8(WEAPON_INDEX) - emptyWeaponSlots = getEmptyWeaponSlots() - lastUsedWeaponIndex = weaponIndex --- print('WEAPON_INDEX: '.. weaponIndex) - memDomain.saveram() - for i, v in pairs(slice(itemsBlock, weaponIndex, #itemsBlock)) do - if v >= 0x11C and v <= 0x143 then - -- Minus the offset and add to the correct domain - local itemValue = v - 0x11B - if #emptyWeaponSlots > 0 then - slot = table.remove(emptyWeaponSlots, 1) - wU8(slot, itemValue) - lastUsedWeaponIndex = weaponIndex + i - else - break - end - end - end - if lastUsedWeaponIndex ~= weaponIndex then - wU8(WEAPON_INDEX, lastUsedWeaponIndex) - end - memDomain.saveram() - armorIndex = u8(ARMOR_INDEX) - emptyArmorSlots = getEmptyArmorSlots() - lastUsedArmorIndex = armorIndex --- print('ARMOR_INDEX: '.. armorIndex) - memDomain.saveram() - for i, v in pairs(slice(itemsBlock, armorIndex, #itemsBlock)) do - if v >= 0x144 and v <= 0x16B then - -- Minus the offset and add to the correct domain - local itemValue = v - 0x143 - if #emptyArmorSlots > 0 then - slot = table.remove(emptyArmorSlots, 1) - wU8(slot, itemValue) - lastUsedArmorIndex = armorIndex + i - else - break - end - end - end - if lastUsedArmorIndex ~= armorIndex then - wU8(ARMOR_INDEX, lastUsedArmorIndex) - end - end -end - -function receive() - l, e = ff1Socket:receive() - if e == 'closed' then - if curstate == STATE_OK then - print("Connection closed") - end - curstate = STATE_UNINITIALIZED - return - elseif e == 'timeout' then - print("timeout") - return - elseif e ~= nil then - print(e) - curstate = STATE_UNINITIALIZED - return - end - processBlock(json.decode(l)) - - -- Determine Message to send back - memDomain.rom() - local playerName = uRange(0x7BCBF, 0x41) - playerName[0] = nil - local retTable = {} - retTable["playerName"] = playerName - if StateOKForMainLoop() then - retTable["locations"] = generateLocationChecked() - end - msg = json.encode(retTable).."\n" - local ret, error = ff1Socket:send(msg) - if ret == nil then - print(error) - elseif curstate == STATE_INITIAL_CONNECTION_MADE then - curstate = STATE_TENTATIVELY_CONNECTED - elseif curstate == STATE_TENTATIVELY_CONNECTED then - print("Connected!") - itemMessages["(0,0)"] = {TTL=240, message="Connected", color="green"} - curstate = STATE_OK - end -end - -function main() - if not checkBizHawkVersion() then - return - end - server, error = socket.bind('localhost', 52980) - - while true do - gui.drawEllipse(248, 9, 6, 6, "Black", "Yellow") - frame = frame + 1 - drawMessages() - if not (curstate == prevstate) then - -- console.log("Current state: "..curstate) - prevstate = curstate - end - if (curstate == STATE_OK) or (curstate == STATE_INITIAL_CONNECTION_MADE) or (curstate == STATE_TENTATIVELY_CONNECTED) then - if (frame % 60 == 0) then - gui.drawEllipse(248, 9, 6, 6, "Black", "Blue") - receive() - else - gui.drawEllipse(248, 9, 6, 6, "Black", "Green") - end - elseif (curstate == STATE_UNINITIALIZED) then - gui.drawEllipse(248, 9, 6, 6, "Black", "White") - if (frame % 60 == 0) then - gui.drawEllipse(248, 9, 6, 6, "Black", "Yellow") - - drawText(5, 8, "Waiting for client", 0xFFFF0000) - drawText(5, 32, "Please start FF1Client.exe", 0xFFFF0000) - - -- Advance so the messages are drawn - emu.frameadvance() - server:settimeout(2) - print("Attempting to connect") - local client, timeout = server:accept() - if timeout == nil then - -- print('Initial Connection Made') - curstate = STATE_INITIAL_CONNECTION_MADE - ff1Socket = client - ff1Socket:settimeout(0) - end - end - end - emu.frameadvance() - end -end - -main() diff --git a/data/lua/connector_mmbn3.lua b/data/lua/connector_mmbn3.lua index fce38a4c11..c89f428fe5 100644 --- a/data/lua/connector_mmbn3.lua +++ b/data/lua/connector_mmbn3.lua @@ -477,7 +477,7 @@ function main() elseif (curstate == STATE_UNINITIALIZED) then -- If we're uninitialized, attempt to make the connection. if (frame % 120 == 0) then - server:settimeout(2) + server:settimeout(120) local client, timeout = server:accept() if timeout == nil then print('Initial Connection Made') diff --git a/data/mcicon.ico b/data/mcicon.ico deleted file mode 100644 index 3df0be06f8..0000000000 Binary files a/data/mcicon.ico and /dev/null differ diff --git a/data/options.yaml b/data/options.yaml index 09bfcdcec1..3278a3c5c1 100644 --- a/data/options.yaml +++ b/data/options.yaml @@ -33,6 +33,10 @@ description: {{ yaml_dump("Default %s Template" % game) }} game: {{ yaml_dump(game) }} requires: version: {{ __version__ }} # Version of Archipelago required for this yaml to work as expected. + {%- if world_version != "0.0.0" %} + game: + {{ yaml_dump(game) }}: {{ world_version }} # Version of the world required for this yaml to work as expected. + {%- endif %} {%- macro range_option(option) %} # You can define additional values between the minimum and maximum values. @@ -46,15 +50,16 @@ requires: {{ yaml_dump(game) }}: {%- for group_name, group_options in option_groups.items() %} - # {{ group_name }} + ##{% for _ in group_name %}#{% endfor %}## + # {{ group_name }} # + ##{% for _ in group_name %}#{% endfor %}## {%- for option_key, option in group_options.items() %} {{ option_key }}: {%- if option.__doc__ %} - # {{ option.__doc__ + # {{ cleandoc(option.__doc__) | trim - | replace('\n\n', '\n \n') - | replace('\n ', '\n# ') + | replace('\n', '\n# ') | indent(4, first=False) }} {%- endif -%} diff --git a/data/sprites/alttpr/.gitignore b/data/sprites/alttp/remote/.gitignore similarity index 100% rename from data/sprites/alttpr/.gitignore rename to data/sprites/alttp/remote/.gitignore diff --git a/data/sprites/custom/.gitignore b/data/sprites/custom/.gitignore deleted file mode 100644 index d6b7ef32c8..0000000000 --- a/data/sprites/custom/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/data/sprites/custom/link.apsprite b/data/sprites/custom/link.apsprite deleted file mode 100644 index ea0e85c106..0000000000 --- a/data/sprites/custom/link.apsprite +++ /dev/null @@ -1,7 +0,0 @@ -author: Nintendo -data: null -game: A Link to the Past -min_format_version: 1 -name: Link -format_version: 1 -sprite_version: 1 \ No newline at end of file diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml new file mode 100644 index 0000000000..1472667442 --- /dev/null +++ b/deploy/docker-compose.yml @@ -0,0 +1,61 @@ +services: + multiworld: + # Build only once. Web service uses the same image build + build: + context: .. + # Name image for use in web service + image: archipelago-base + # Use locally-built image + pull_policy: never + # Launch main process without website hosting (config override) + entrypoint: python WebHost.py --config_override selflaunch.yaml + volumes: + # Mount application volume + - app_volume:/app + + # Mount configs + - ./example_config.yaml:/app/config.yaml + - ./example_selflaunch.yaml:/app/selflaunch.yaml + + # Expose on host network for access to dynamically mapped ports + network_mode: host + + # No Healthcheck in place yet for multiworld + healthcheck: + test: ["NONE"] + web: + # Use image build by multiworld service + image: archipelago-base + # Use locally-built image + pull_policy: never + # Launch gunicorn targeting WebHost application + entrypoint: gunicorn -c gunicorn.conf.py + volumes: + # Mount application volume + - app_volume:/app + + # Mount configs + - ./example_config.yaml:/app/config.yaml + - ./example_gunicorn.conf.py:/app/gunicorn.conf.py + environment: + # Bind gunicorn on 8000 + - PORT=8000 + + nginx: + image: nginx:stable-alpine + volumes: + # Mount application volume + - app_volume:/app + + # Mount config + - ./example_nginx.conf:/etc/nginx/nginx.conf + ports: + # Nginx listening internally on port 80 -- mapped to 8080 on host + - 8080:80 + depends_on: + - web + +volumes: + # Share application directory amongst multiworld and web services + # (for access to log files and the like), and nginx (for static files) + app_volume: diff --git a/deploy/example_config.yaml b/deploy/example_config.yaml new file mode 100644 index 0000000000..d74f7f238f --- /dev/null +++ b/deploy/example_config.yaml @@ -0,0 +1,10 @@ +# Refer to ../docs/webhost configuration sample.yaml + +# We'll be hosting VIA gunicorn +SELFHOST: false +# We'll start a separate process for rooms and generators +SELFLAUNCH: false + +# Host Address. This is the address encoded into the patch that will be used for client auto-connect. +# Set as your local IP (192.168.x.x) to serve over LAN. +HOST_ADDRESS: localhost diff --git a/deploy/example_gunicorn.conf.py b/deploy/example_gunicorn.conf.py new file mode 100644 index 0000000000..49f153df67 --- /dev/null +++ b/deploy/example_gunicorn.conf.py @@ -0,0 +1,19 @@ +workers = 2 +threads = 2 +wsgi_app = "WebHost:get_app()" +accesslog = "-" +access_log_format = ( + '%({x-forwarded-for}i)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' +) +worker_class = "gthread" # "sync" | "gthread" +forwarded_allow_ips = "*" +loglevel = "info" + +""" +You can programatically set values. +For example, set number of workers to half of the cpu count: + +import multiprocessing + +workers = multiprocessing.cpu_count() / 2 +""" diff --git a/deploy/example_nginx.conf b/deploy/example_nginx.conf new file mode 100644 index 0000000000..b0c0e8e5a0 --- /dev/null +++ b/deploy/example_nginx.conf @@ -0,0 +1,64 @@ +worker_processes 1; + +user nobody nogroup; +# 'user nobody nobody;' for systems with 'nobody' as a group instead +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; # increase if you have lots of clients + accept_mutex off; # set to 'on' if nginx worker_processes > 1 + # 'use epoll;' to enable for Linux 2.6+ + # 'use kqueue;' to enable for FreeBSD, OSX + use epoll; +} + +http { + include mime.types; + # fallback in case we can't determine a type + default_type application/octet-stream; + access_log /var/log/nginx/access.log combined; + sendfile on; + + upstream app_server { + # fail_timeout=0 means we always retry an upstream even if it failed + # to return a good HTTP response + + # for UNIX domain socket setups + # server unix:/tmp/gunicorn.sock fail_timeout=0; + + # for a TCP configuration + server web:8000 fail_timeout=0; + } + + server { + # use 'listen 80 deferred;' for Linux + # use 'listen 80 accept_filter=httpready;' for FreeBSD + listen 80 deferred; + client_max_body_size 4G; + + # set the correct host(s) for your site + # server_name example.com www.example.com; + + keepalive_timeout 5; + + # path for static files + root /app/WebHostLib; + + location / { + # checks for static file, if not found proxy to app + try_files $uri @proxy_to_app; + } + + location @proxy_to_app { + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + # we don't want nginx trying to do something clever with + # redirects, we set the Host: header above already. + proxy_redirect off; + + proxy_pass http://app_server; + } + } +} diff --git a/deploy/example_selflaunch.yaml b/deploy/example_selflaunch.yaml new file mode 100644 index 0000000000..41149dc18a --- /dev/null +++ b/deploy/example_selflaunch.yaml @@ -0,0 +1,13 @@ +# Refer to ../docs/webhost configuration sample.yaml + +# We'll be hosting VIA gunicorn +SELFHOST: false +# Start room and generator processes +SELFLAUNCH: true +JOB_THRESHOLD: 0 + +# Maximum concurrent world gens +GENERATORS: 3 + +# Rooms will be spread across multiple processes +HOSTERS: 4 diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index dee8a6fd25..7b8e48af14 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -21,9 +21,6 @@ # Aquaria /worlds/aquaria/ @tioui -# ArchipIDLE -/worlds/archipidle/ @LegendaryLinux - # Blasphemous /worlds/blasphemous/ @TRPG0 @@ -42,15 +39,18 @@ # Celeste 64 /worlds/celeste64/ @PoryGone +# Celeste (Open World) +/worlds/celeste_open_world/ @PoryGone + # ChecksFinder /worlds/checksfinder/ @SunCatMC +# Choo-Choo Charles +/worlds/cccharles/ @Yaranorgoth + # Civilization VI /worlds/civ6/ @hesto2 -# Clique -/worlds/clique/ @ThePhar - # Dark Souls III /worlds/dark_souls_3/ @Marechal-L @nex3 @@ -72,6 +72,9 @@ # Faxanadu /worlds/faxanadu/ @Daivuk +# Final Fantasy (1) +/worlds/ff1/ @Rosalie-A + # Final Fantasy Mystic Quest /worlds/ffmq/ @Alchav @wildham0 @@ -87,6 +90,9 @@ # Inscryption /worlds/inscryption/ @DrBibop @Glowbuzz +# Jak and Daxter: The Precursor Legacy +/worlds/jakanddaxter/ @massimilianodelliubaldini + # Kirby's Dream Land 3 /worlds/kdl3/ @Silvris @@ -118,9 +124,6 @@ # The Messenger /worlds/messenger/ @alwaysintreble -# Minecraft -/worlds/minecraft/ @KonoTyran @espeon65536 - # Mega Man 2 /worlds/mm2/ @Silvris @@ -139,6 +142,9 @@ # Overcooked! 2 /worlds/overcooked2/ @toasterparty +# Paint +/worlds/paint/ @MarioManTAW + # Pokemon Emerald /worlds/pokemon_emerald/ @Zunawe @@ -148,15 +154,15 @@ # Raft /worlds/raft/ @SunnyBat -# Rogue Legacy -/worlds/rogue_legacy/ @ThePhar - # Risk of Rain 2 /worlds/ror2/ @kindasneaki # Saving Princess /worlds/saving_princess/ @LeonarthCG +# shapez +/worlds/shapez/ @BlastSlimey + # Shivers /worlds/shivers/ @GodlFire @korydondzila @@ -175,6 +181,9 @@ # Super Mario 64 /worlds/sm64ex/ @N00byKing +# Super Mario Land 2: 6 Golden Coins +/worlds/marioland2/ @Alchav + # Super Mario World /worlds/smw/ @PoryGone @@ -197,7 +206,7 @@ /worlds/timespinner/ @Jarno458 # The Legend of Zelda (1) -/worlds/tloz/ @Rosalie-A @t3hf1gm3nt +/worlds/tloz/ @Rosalie-A # TUNIC /worlds/tunic/ @silent-destroyer @ScipioWright @@ -232,24 +241,12 @@ ## Active Unmaintained Worlds # The following worlds in this repo are currently unmaintained, but currently still work in core. If any update breaks -# compatibility, these worlds may be moved to `worlds_disabled`. If you are interested in stepping up as maintainer for +# compatibility, these worlds may be deleted. If you are interested in stepping up as maintainer for # any of these worlds, please review `/docs/world maintainer.md` documentation. -# Final Fantasy (1) -# /worlds/ff1/ - # Ocarina of Time # /worlds/oot/ -## Disabled Unmaintained Worlds - -# The following worlds in this repo are currently unmaintained and disabled as they do not work in core. If you are -# interested in stepping up as maintainer for any of these worlds, please review `/docs/world maintainer.md` -# documentation. - -# Ori and the Blind Forest -# /worlds_disabled/oribf/ - ################### ## Documentation ## ################### diff --git a/docs/adding games.md b/docs/adding games.md index c3eb0d023e..762a908fc8 100644 --- a/docs/adding games.md +++ b/docs/adding games.md @@ -62,6 +62,24 @@ if possible. * If your client appears in the Archipelago Launcher, you may define an icon for it that differentiates it from other clients. The icon size is 48x48 pixels, but smaller or larger images will scale to that size. +### Launcher Integration + +If you have a python client or want to utilize the integration features of the Archipelago Launcher (ex. Slot links in +webhost) you can define a Component to be a part of the Launcher. `LauncherComponents.components` can be appended to +with additional Components in order to automatically add them to the Launcher. Most Components only need a +`display_name` and `func`, but `supports_uri` and `game_name` can be defined to support launching by webhost links, +`icon` and `description` can be used to customize display in the Launcher UI, and `file_identifier` can be used to +launch by file. + +Additionally, if you use `func` you have access to LauncherComponent.launch or launch_subprocess to run your +function as a subprocesses that can be utilized side by side other clients. +```py +def my_func(*args: str): + from .client import run_client + LauncherComponent.launch(run_client, name="My Client", args=args) +``` + + ## World The world is your game integration for the Archipelago generator, webhost, and multiworld server. It contains all the diff --git a/docs/apworld specification.md b/docs/apworld specification.md index ed2e8b1c8e..39282e1574 100644 --- a/docs/apworld specification.md +++ b/docs/apworld specification.md @@ -19,7 +19,21 @@ the world's folder in `worlds/`. I.e. `worlds/ror2.apworld` containing `ror2/__i ## Metadata -No metadata is specified yet. +Metadata about the apworld is defined in an `archipelago.json` file inside the zip archive. +The current format version has at minimum: +```json +{ + "version": 6, + "compatible_version": 5, + "game": "Game Name" +} +``` + +with the following optional version fields using the format `"1.0.0"` to represent major.minor.build: +* `minimum_ap_version` and `maximum_ap_version` - which if present will each be compared against the current + Archipelago version respectively to filter those files from being loaded +* `world_version` - an arbitrary version for that world in order to only load the newest valid world. + An apworld without a world_version is always treated as older than one with a version ## Extra Data diff --git a/docs/apworld_dev_faq.md b/docs/apworld_dev_faq.md index 50bee148c6..6e1c102c6a 100644 --- a/docs/apworld_dev_faq.md +++ b/docs/apworld_dev_faq.md @@ -122,3 +122,21 @@ Concrete examples of soft logic include: - Buying expensive shop items might logically require access to a place where you can quickly farm money, or logically require access to enough parts of the game that checking other locations should naturally generate enough money without grinding. Remember that all items referenced by logic (however hard or soft) must be `progression`. Since you typically don't want to turn a ton of `filler` items into `progression` just for this, it's common to e.g. write money logic using only the rare "$100" item, so the dozens of "$1" and "$10" items in your world can remain `filler`. + +--- + +### What if my game has "missable" or "one-time-only" locations or region connections? + +Archipelago logic assumes that once a region or location becomes reachable, it stays reachable forever, no matter what +the player does in-game. Slightly more formally: Receiving an AP item must never cause a region connection or location +to "go out of logic" (become unreachable when it was previously reachable), and receiving AP items is the only kind of +state change that AP logic acknowledges. No other actions or events can change reachability. + +So when the game itself does not follow this assumption, the options are: +- Modify the game to make that location/connection repeatable +- If there are both missable and repeatable ways to check the location/traverse the connection, then write logic for + only the repeatable ways +- Don't generate the missable location/connection at all + - For connections, any logical regions will still need to be reachable through other, *repeatable* connections + - For locations, this may require game changes to remove the vanilla item if it affects logic +- Decide that resetting the save file is part of the game's logic, and warn players about that diff --git a/docs/contributing.md b/docs/contributing.md index 96fc316be8..06d83bebbc 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -16,7 +16,7 @@ game contributions: * **Do not introduce unit test failures/regressions.** Archipelago supports multiple versions of Python. You may need to download older Python versions to fully test your changes. Currently, the oldest supported version - is [Python 3.10](https://www.python.org/downloads/release/python-31015/). + is [Python 3.11](https://www.python.org/downloads/release/python-31113/). It is recommended that automated github actions are turned on in your fork to have github run unit tests after pushing. You can turn them on here: diff --git a/docs/deploy using containers.md b/docs/deploy using containers.md new file mode 100644 index 0000000000..6db38d443f --- /dev/null +++ b/docs/deploy using containers.md @@ -0,0 +1,92 @@ +# Deploy Using Containers + +If you just want to play and there is a compiled version available on the [Archipelago releases page](https://github.com/ArchipelagoMW/Archipelago/releases), use that version. +To build the full Archipelago software stack, refer to [Running From Source](running%20from%20source.md). +Follow these steps to build and deploy a containerized instance of the web host software, optionally integrating [Gunicorn](https://gunicorn.org/) WSGI HTTP Server running behind the [nginx](https://nginx.org/) reverse proxy. + + +## Building the Container Image + +What you'll need: + * A container runtime engine such as: + * [Docker](https://www.docker.com/) (Version 23.0 or later) + * [Podman](https://podman.io/) (version 4.0 or later) + * For running with rootless podman, you need to ensure all ports used are usable rootless, by default ports less than 1024 are root only. See [the official tutorial](https://github.com/containers/podman/blob/main/docs/tutorials/rootless_tutorial.md) for details. + * The Docker Buildx plugin (for Docker), as the Dockerfile uses `$TARGETARCH` for architecture detection. Follow [Docker's guide](https://docs.docker.com/build/buildx/install/). Verify with `docker buildx version`. + +Starting from the root repository directory, the standalone Archipelago image can be built and run with the command: +`docker build -t archipelago .` +Or: +`podman build -t archipelago .` + +It is recommended to tag the image using `-t` to more easily identify the image and run it. + + +## Running the Container + +Running the container can be performed using: +`docker run --network host archipelago` +Or: +`podman run --network host archipelago` + +The Archipelago web host requires access to multiple ports in order to host game servers simultaneously. To simplify configuration for this purpose, specify `--network host`. + +Given the default configuration, the website will be accessible at the hostname/IP address (localhost if run locally) of the machine being deployed to, at port 80. It can be configured by creating a YAML file and mapping a volume to the container when running initially: +`docker run archipelago --network host -v /path/to/config.yaml:/app/config.yaml` +See `docs/webhost configuration sample.yaml` for example. + + +## Using Docker Compose + +An example [docker compose](../deploy/docker-compose.yml) file can be found in [deploy](../deploy), along with example configuration files used by the services it orchestrates. Using these files as-is will spin up two separate archipelago containers with special modifications to their runtime arguments, in addition to deploying an `nginx` reverse proxy container. + +To deploy in this manner, from the ["deploy"](../deploy) directory, run: +`docker compose up -d` + +### Services + +The `docker-compose.yaml` file defines three services: + * multiworld: + * Executes the main `WebHost` process, using the [example config](../deploy/example_config.yaml), and overriding with a secondary [selflaunch example config](../deploy/example_selflaunch.yaml). This is because we do not want to launch the website through this service. + * web: + * Executes `gunicorn` using its [example config](../deploy/example_gunicorn.conf.py), which will bind it to the `WebHost` application, in effect launching it. + * We mount the main [config](../deploy/example_config.yaml) without an override to specify that we are launching the website through this service. + * No ports are exposed through to the host. + * nginx: + * Serves as a reverse proxy with `web` as its upstream. + * Directs all HTTP traffic from port 80 to the upstream service. + * Exposed to the host on port 8080. This is where we can reach the website. + +### Configuration + +As these are examples, they can be copied and modified. For instance setting the value of `HOST_ADDRESS` in [example config](../deploy/example_config.yaml) to host machines local IP address, will expose the service to its local area network. + +The configuration files may be modified to handle for machine-specific optimizations, such as: + * Web pages responding too slowly + * Edit [the gunicorn config](../deploy/example_gunicorn.conf.py) to increase thread and/or worker count. + * Game generation stalls + * Increase the generator count in [selflaunch config](../deploy/example_selflaunch.yaml) + * Gameplay lags + * Increase the hoster count in [selflaunch config](../deploy/example_selflaunch.yaml) + +Changes made to `docker-compose.yaml` can be applied by running `docker compose up -d`, while those made to other files are applied by running `docker compose restart`. + + +## Windows + +It is possible to carry out these deployment steps on Windows under [Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/install). + + +## Optional: A Link to the Past Enemizer + +Only required to generate seeds that include A Link to the Past with certain options enabled. You will receive an +error if it is required. +Enemizer can be enabled on `x86_64` platform architecture, and is included in the image build process. Enemizer requires a version 1.0 Japanese "Zelda no Densetsu" `.sfc` rom file to be placed in the application directory: +`docker run archipelago -v "/path/to/zelda.sfc:/app/Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"`. +Enemizer is not currently available for `aarch64`. + + +## Optional: Git + +Building the image requires a local copy of the ArchipelagoMW source code. +Refer to [Running From Source](running%20from%20source.md#optional-git). diff --git a/docs/entrance randomization.md b/docs/entrance randomization.md index 0f9d764716..d9f278bf1e 100644 --- a/docs/entrance randomization.md +++ b/docs/entrance randomization.md @@ -352,14 +352,14 @@ direction_matching_group_lookup = { Terrain matching or dungeon shuffle: ```python -def randomize_within_same_group(group: int) -> List[int]: +def randomize_within_same_group(group: int) -> list[int]: return [group] identity_group_lookup = bake_target_group_lookup(world, randomize_within_same_group) ``` Directional + area shuffle: ```python -def get_target_groups(group: int) -> List[int]: +def get_target_groups(group: int) -> list[int]: # example group: LEFT | CAVE # example result: [RIGHT | CAVE, DOOR | CAVE] direction = group & Groups.DIRECTION_MASK diff --git a/docs/network diagram/network diagram.md b/docs/network diagram/network diagram.md index d660e8889e..2d0a1174f5 100644 --- a/docs/network diagram/network diagram.md +++ b/docs/network diagram/network diagram.md @@ -117,12 +117,6 @@ flowchart LR %% Java Based Games subgraph Java JM[Mod with Archipelago.MultiClient.Java] - subgraph Minecraft - MCS[Minecraft Forge Server] - JMC[Any Java Minecraft Clients] - MCS <-- TCP --> JMC - end - JM <-- Forge Mod Loader --> MCS end AS <-- WebSockets --> JM @@ -131,10 +125,8 @@ flowchart LR NM[Mod with Archipelago.MultiClient.Net] subgraph FNA/XNA TS[Timespinner] - RL[Rogue Legacy] end NM <-- TsRandomizer --> TS - NM <-- RogueLegacyRandomizer --> RL subgraph Unity ROR[Risk of Rain 2] SN[Subnautica] @@ -183,4 +175,4 @@ flowchart LR FMOD <--> FMAPI end CC <-- Integrated --> FC -``` \ No newline at end of file +``` diff --git a/docs/network protocol.md b/docs/network protocol.md index 6688c101ab..c3fc578a89 100644 --- a/docs/network protocol.md +++ b/docs/network protocol.md @@ -79,7 +79,7 @@ Sent to clients when they connect to an Archipelago server. | generator_version | [NetworkVersion](#NetworkVersion) | Object denoting the version of Archipelago which generated the multiworld. | | tags | list\[str\] | Denotes special features or capabilities that the sender is capable of. Example: `WebHost` | | password | bool | Denoted whether a password is required to join this room. | -| permissions | dict\[str, [Permission](#Permission)\[int\]\] | Mapping of permission name to [Permission](#Permission), keys are: "release", "collect" and "remaining". | +| permissions | dict\[str, [Permission](#Permission)\] | Mapping of permission name to [Permission](#Permission), keys are: "release", "collect" and "remaining". | | hint_cost | int | The percentage of total locations that need to be checked to receive a hint from the server. | | location_check_points | int | The amount of hint points you receive per item/location check completed. | | games | list\[str\] | List of games present in this multiworld. | @@ -231,11 +231,11 @@ Sent to clients after a client requested this message be sent to them, more info Sent to clients if the server caught a problem with a packet. This only occurs for errors that are explicitly checked for. #### Arguments -| Name | Type | Notes | -| ---- | ---- | ----- | -| type | str | The [PacketProblemType](#PacketProblemType) that was detected in the packet. | -| original_cmd | Optional[str] | The `cmd` argument of the faulty packet, will be `None` if the `cmd` failed to be parsed. | -| text | str | A descriptive message of the problem at hand. | +| Name | Type | Notes | +| ---- |-------------| ----- | +| type | str | The [PacketProblemType](#PacketProblemType) that was detected in the packet. | +| original_cmd | str \| None | The `cmd` argument of the faulty packet, will be `None` if the `cmd` failed to be parsed. | +| text | str | A descriptive message of the problem at hand. | ##### PacketProblemType `PacketProblemType` indicates the type of problem that was detected in the faulty packet, the known problem types are below but others may be added in the future. @@ -276,6 +276,7 @@ These packets are sent purely from client to server. They are not accepted by cl * [Sync](#Sync) * [LocationChecks](#LocationChecks) * [LocationScouts](#LocationScouts) +* [CreateHints](#CreateHints) * [UpdateHint](#UpdateHint) * [StatusUpdate](#StatusUpdate) * [Say](#Say) @@ -294,7 +295,7 @@ Sent by the client to initiate a connection to an Archipelago game session. | password | str | If the game session requires a password, it should be passed here. | | game | str | The name of the game the client is playing. Example: `A Link to the Past` | | name | str | The player name for this client. | -| uuid | str | Unique identifier for player client. | +| uuid | str | Unique identifier for player. Cached in the user cache \Archipelago\Cache\common.json | | version | [NetworkVersion](#NetworkVersion) | An object representing the Archipelago version this client supports. | | items_handling | int | Flags configuring which items should be sent by the server. Read below for individual flags. | | tags | list\[str\] | Denotes special features or capabilities that the sender is capable of. [Tags](#Tags) | @@ -339,7 +340,8 @@ Sent to the server to retrieve the items that are on a specified list of locatio Fully remote clients without a patch file may use this to "place" items onto their in-game locations, most commonly to display their names or item classifications before/upon pickup. LocationScouts can also be used to inform the server of locations the client has seen, but not checked. This creates a hint as if the player had run `!hint_location` on a location, but without deducting hint points. -This is useful in cases where an item appears in the game world, such as 'ledge items' in _A Link to the Past_. To do this, set the `create_as_hint` parameter to a non-zero value. +This is useful in cases where an item appears in the game world, such as 'ledge items' in _A Link to the Past_. To do this, set the `create_as_hint` parameter to a non-zero value. +Note that LocationScouts with a non-zero `create_as_hint` value will _always_ create a **persistent** hint (listed in the Hints tab of concerning players' TextClients), even if the location was already found. If this is not desired behavior, you need to prevent sending LocationScouts with `create_as_hint` for already found locations in your client-side code. #### Arguments | Name | Type | Notes | @@ -347,6 +349,21 @@ This is useful in cases where an item appears in the game world, such as 'ledge | locations | list\[int\] | The ids of the locations seen by the client. May contain any number of locations, even ones sent before; duplicates do not cause issues with the Archipelago server. | | create_as_hint | int | If non-zero, the scouted locations get created and broadcasted as a player-visible hint.
If 2 only new hints are broadcast, however this does not remove them from the LocationInfo reply. | +### CreateHints + +Sent to the server to create hints for a specified list of locations. +Hints that already exist will be silently skipped and their status will not be updated. + +When creating hints for another slot's locations, the packet will fail if any of those locations don't contain items for the requesting slot. +When creating hints for your own slot's locations, non-existing locations will silently be skipped. + +#### Arguments +| Name | Type | Notes | +| ---- | ---- | ----- | +| locations | list\[int\] | The ids of the locations to create hints for. | +| player | int | The ID of the player whose locations are being hinted for. Defaults to the requesting slot. | +| status | [HintStatus](#HintStatus) | If included, sets the status of the hint to this status. Defaults to `HINT_UNSPECIFIED`. Cannot set `HINT_FOUND`. | + ### UpdateHint Sent to the server to update the status of a Hint. The client must be the 'receiving_player' of the Hint, or the update fails. @@ -551,14 +568,14 @@ In JSON this may look like: Message nodes sent along with [PrintJSON](#PrintJSON) packet to be reconstructed into a legible message. The nodes are intended to be read in the order they are listed in the packet. ```python -from typing import TypedDict, Optional +from typing import TypedDict class JSONMessagePart(TypedDict): - type: Optional[str] - text: Optional[str] - color: Optional[str] # only available if type is a color - flags: Optional[int] # only available if type is an item_id or item_name - player: Optional[int] # only available if type is either item or location - hint_status: Optional[HintStatus] # only available if type is hint_status + type: str | None + text: str | None + color: str | None # only available if type is a color + flags: int | None # only available if type is an item_id or item_name + player: int | None # only available if type is either item or location + hint_status: HintStatus | None # only available if type is hint_status ``` `type` is used to denote the intent of the message part. This can be used to indicate special information which may be rendered differently depending on client. How these types are displayed in Archipelago's ALttP client is not the end-all be-all. Other clients may choose to interpret and display these messages differently. @@ -645,13 +662,14 @@ class SlotType(enum.IntFlag): An object representing static information about a slot. ```python -import typing +from collections.abc import Sequence +from typing import NamedTuple from NetUtils import SlotType -class NetworkSlot(typing.NamedTuple): +class NetworkSlot(NamedTuple): name: str game: str type: SlotType - group_members: typing.List[int] = [] # only populated if type == group + group_members: Sequence[int] = [] # only populated if type == group ``` ### Permission @@ -669,8 +687,8 @@ class Permission(enum.IntEnum): ### Hint An object representing a Hint. ```python -import typing -class Hint(typing.NamedTuple): +from typing import NamedTuple +class Hint(NamedTuple): receiving_player: int finding_player: int location: int diff --git a/docs/options api.md b/docs/options api.md index 037b9edb87..193d395342 100644 --- a/docs/options api.md +++ b/docs/options api.md @@ -333,7 +333,7 @@ within the world. ### TextChoice Like choice allows you to predetermine options and has all of the same comparison methods and handling. Also accepts any user defined string as a valid option, so will either need to be validated by adding a validation step to the option -class or within world, if necessary. Value for this class is `Union[str, int]` so if you need the value at a specified +class or within world, if necessary. Value for this class is `str | int` so if you need the value at a specified point, `self.options.my_option.current_key` will always return a string. ### PlandoBosses @@ -344,7 +344,7 @@ names, and `def can_place_boss`, which passes a boss and location, allowing you your game. When this function is called, `bosses`, `locations`, and the passed strings will all be lowercase. There is also a `duplicate_bosses` attribute allowing you to define if a boss can be placed multiple times in your world. False by default, and will reject duplicate boss names from the user. For an example of using this class, refer to -`worlds.alttp.options.py` +`worlds/alttp/Options.py` ### OptionDict This option returns a dictionary. Setting a default here is recommended as it will output the dictionary to the diff --git a/docs/running from source.md b/docs/running from source.md index 8e8b4f4b61..efe6e24361 100644 --- a/docs/running from source.md +++ b/docs/running from source.md @@ -7,10 +7,10 @@ use that version. These steps are for developers or platforms without compiled r ## General What you'll need: - * [Python 3.10.11 or newer](https://www.python.org/downloads/), not the Windows Store version + * [Python 3.11.9 or newer](https://www.python.org/downloads/), not the Windows Store version * On Windows, please consider only using the latest supported version in production environments since security updates for older versions are not easily available. - * Python 3.12.x is currently the newest supported version + * Python 3.13.x is currently the newest supported version * pip: included in downloads from python.org, separate in many Linux distributions * Matching C compiler * possibly optional, read operating system specific sections diff --git a/docs/settings api.md b/docs/settings api.md index bfc642d4b5..36520fe683 100644 --- a/docs/settings api.md +++ b/docs/settings api.md @@ -28,7 +28,7 @@ if it does not exist. ## Global Settings All non-world-specific settings are defined directly in settings.py. -Each value needs to have a default. If the default should be `None`, define it as `typing.Optional` and assign `None`. +Each value needs to have a default. If the default should be `None`, annotate it using `T | None = None`. To access a "global" config value, with correct typing, use one of ```python @@ -102,17 +102,16 @@ In worlds, this should only be used for the top level to avoid issues when upgra ### Bool -Since `bool` can not be subclassed, use the `settings.Bool` helper in a `typing.Union` to get a comment in host.yaml. +Since `bool` can not be subclassed, use the `settings.Bool` helper in a union to get a comment in host.yaml. ```python import settings -import typing class MySettings(settings.Group): class MyBool(settings.Bool): """Doc string""" - my_value: typing.Union[MyBool, bool] = True + my_value: MyBool | bool = True ``` ### UserFilePath @@ -134,15 +133,15 @@ Checks the file against [md5s](#md5s) by default. Resolves to an executable (varying file extension based on platform) -#### description: Optional\[str\] +#### description: str | None Human-readable name to use in file browser -#### copy_to: Optional\[str\] +#### copy_to: str | None Instead of storing the path, copy the file. -#### md5s: List[Union[str, bytes]] +#### md5s: list[str | bytes] Provide md5 hashes as hex digests or raw bytes for automatic validation. @@ -182,10 +181,3 @@ circular / partial imports. Instead, the code should fetch from settings on dema "Global" settings are populated immediately, while worlds settings are lazy loaded, so if really necessary, "global" settings could be used in global scope of worlds. - - -### APWorld Backwards Compatibility - -APWorlds that want to be compatible with both stable and dev versions, have two options: -1. use the old Utils.get_options() API until Archipelago 0.4.2 is out -2. add some sort of compatibility code to your world that mimics the new API diff --git a/docs/shared_cache.md b/docs/shared_cache.md new file mode 100644 index 0000000000..0dd323926a --- /dev/null +++ b/docs/shared_cache.md @@ -0,0 +1,18 @@ +# Shared Cache + +Archipelago maintains a shared folder of information that can be persisted for a machine and reused across Libraries. +It can be found at the User Cache Directory for appname `Archipelago` in the `Cache` subfolder +(ex. `%LOCALAPPDATA%/Archipelago/Cache`). + +## Common Cache + +The Common Cache `common.json` can be used to store any generic data that is expected to be shared across programs +for the same User. + +* `uuid`: A UUID identifier used to identify clients as from the same user/machine, to be sent in the Connect packet + +## Data Package Cache + +The `datapackage` folder in the shared cache folder is used to store datapackages by game and checksum to be reused +in order to save network traffic. The expected structure is `datapackage/Game Name/checksum_value.json` with the +contents of each json file being the no-whitespace datapackage contents. diff --git a/docs/style.md b/docs/style.md index 81853f4172..e38be9d649 100644 --- a/docs/style.md +++ b/docs/style.md @@ -15,8 +15,10 @@ * Prefer [format string literals](https://peps.python.org/pep-0498/) over string concatenation, use single quotes inside them: `f"Like {dct['key']}"` * Use type annotations where possible for function signatures and class members. -* Use type annotations where appropriate for local variables (e.g. `var: List[int] = []`, or when the - type is hard or impossible to deduce.) Clear annotations help developers look up and validate API calls. +* Use type annotations where appropriate for local variables (e.g. `var: list[int] = []`, or when the + type is hard or impossible to deduce). Clear annotations help developers look up and validate API calls. +* Prefer new style type annotations for new code (e.g. `var: dict[str, str | int]` over + `var: Dict[str, Union[str, int]]`). * If a line ends with an open bracket/brace/parentheses, the matching closing bracket should be at the beginning of a line at the same indentation as the beginning of the line with the open bracket. ```python @@ -29,6 +31,10 @@ * New classes, attributes, and methods in core code should have docstrings that follow [reST style](https://peps.python.org/pep-0287/). * Worlds that do not follow PEP8 should still have a consistent style across its files to make reading easier. +* [Match statements](https://docs.python.org/3/tutorial/controlflow.html#tut-match) + may be used instead of `if`-`elif` if they result in nicer code, or they actually use pattern matching. + Beware of the performance: they are not `goto`s, but `if`-`elif` under the hood, and you may have less control. When + in doubt, just don't use it. ## Markdown @@ -56,3 +62,9 @@ * Indent `case` inside `switch ` with 2 spaces. * Use single quotes. * Semicolons are required after every statement. + +## KV + +* Style should be defined in `.kv` as much as possible, only Python when unavailable. +* Should follow [our Python style](#python-code) where appropriate (quotation marks, indentation). +* When escaping a line break, add a space between code and backslash. diff --git a/docs/tests.md b/docs/tests.md index 13d62b0132..0740072d7e 100644 --- a/docs/tests.md +++ b/docs/tests.md @@ -11,8 +11,13 @@ found in the [general test directory](/test/general). ## Defining World Tests In order to run tests from your world, you will need to create a `test` package within your world package. This can be -done by creating a `test` directory with a file named `__init__.py` inside it inside your world. By convention, a base -for your world tests can be created in this file that you can then import into other modules. +done by creating a `test` directory inside your world with an (empty) `__init__.py` inside it. By convention, a base +for your world tests can be created in `bases.py` or any file that does not start with `test`, that you can then import +into other modules. All tests should be defined in files named `test_*.py` (all lower case) and be member functions +(named `test_*`) of classes (named `Test*` or `*Test`) that inherit from `unittest.TestCase` or a test base. + +Defining anything inside `test/__init__.py` is deprecated. Defining TestBase there was previously the norm; however, +it complicates test discovery because some worlds also put actual tests into `__init__.py`. ### WorldTestBase @@ -21,7 +26,7 @@ interactions in the world interact as expected, you will want to use the [WorldT comes with the basics for test setup as well as a few preloaded tests that most worlds might want to check on varying options combinations. -Example `/worlds//test/__init__.py`: +Example `/worlds//test/bases.py`: ```python from test.bases import WorldTestBase @@ -49,7 +54,7 @@ with `test_`. Example `/worlds//test/test_chest_access.py`: ```python -from . import MyGameTestBase +from .bases import MyGameTestBase class TestChestAccess(MyGameTestBase): @@ -77,10 +82,10 @@ overridden. For more information on what methods are available to your class, ch #### Alternatives to WorldTestBase -Unit tests can also be created using [TestBase](/test/bases.py#L16) or -[unittest.TestCase](https://docs.python.org/3/library/unittest.html#unittest.TestCase) depending on your use case. These -may be useful for generating a multiworld under very specific constraints without using the generic world setup, or for -testing portions of your code that can be tested without relying on a multiworld to be created first. +Unit tests can also be created using +[unittest.TestCase](https://docs.python.org/3/library/unittest.html#unittest.TestCase) directly. These may be useful +for generating a multiworld under very specific constraints without using the generic world setup, or for testing +portions of your code that can be tested without relying on a multiworld to be created first. #### Parametrization @@ -97,8 +102,7 @@ for multiple inputs) the base test. Some important things to consider when attem * Classes inheriting from `WorldTestBase`, including those created by the helpers in `test.param`, will run all base tests by default, make sure the produced tests actually do what you aim for and do not waste a lot of - extra CPU time. Consider using `TestBase` or `unittest.TestCase` directly - or setting `WorldTestBase.run_default_tests` to False. + extra CPU time. Consider using `unittest.TestCase` directly or setting `WorldTestBase.run_default_tests` to False. #### Performance Considerations diff --git a/docs/webhost api.md b/docs/webhost api.md new file mode 100644 index 0000000000..0482113484 --- /dev/null +++ b/docs/webhost api.md @@ -0,0 +1,557 @@ +# API Guide + +Archipelago has a rudimentary API that can be queried by endpoints. The API is a work-in-progress and should be improved over time. + +The following API requests are formatted as: `https:///api/` + +The returned data will be formated in a combination of JSON lists or dicts, with their keys or values being notated in `blocks` (if applicable) + +Current endpoints: +- Datapackage API + - [`/datapackage`](#datapackage) + - [`/datapackage/`](#datapackagestringchecksum) + - [`/datapackage_checksum`](#datapackagechecksum) +- Generation API + - [`/generate`](#generate) + - [`/status/`](#status) +- Room API + - [`/room_status/`](#roomstatus) +- Tracker API + - [`/tracker/`](#tracker) + - [`/static_tracker/`](#statictracker) + - [`/slot_data_tracker/`](#slotdatatracker) +- User API + - [`/get_rooms`](#getrooms) + - [`/get_seeds`](#getseeds) + + +## Datapackage Endpoints +These endpoints are used by applications to acquire a room's datapackage, and validate that they have the correct datapackage for use. Datapackages normally include, item IDs, location IDs, and name groupings, for a given room, and are essential for mapping IDs received from Archipelago to their correct items or locations. + +### `/datapackage` + +Fetches the current datapackage from the WebHost. +You'll receive a dict named `games` that contains a named dict of every game and its data currently supported by Archipelago. +Each game will have: +- A checksum `checksum` +- A dict of item groups `item_name_groups` +- Item name to AP ID dict `item_name_to_id` +- A dict of location groups `location_name_groups` +- Location name to AP ID dict `location_name_to_id` + +Example: +``` +{ + "games": { + ... + "Clique": { + "checksum": "0271f7a80b44ba72187f92815c2bc8669cb464c7", + "item_name_groups": { + "Everything": [ + "A Cool Filler Item (No Satisfaction Guaranteed)", + "Button Activation", + "Feeling of Satisfaction" + ] + }, + "item_name_to_id": { + "A Cool Filler Item (No Satisfaction Guaranteed)": 69696967, + "Button Activation": 69696968, + "Feeling of Satisfaction": 69696969 + }, + "location_name_groups": { + "Everywhere": [ + "The Big Red Button", + "The Item on the Desk" + ] + }, + "location_name_to_id": { + "The Big Red Button": 69696969, + "The Item on the Desk": 69696968 + } + }, + ... + } +} +``` + +### `/datapackage/` + +Fetches a single datapackage by checksum. +Returns a dict of the game's data with: +- A checksum `checksum` +- A dict of item groups `item_name_groups` +- Item name to AP ID dict `item_name_to_id` +- A dict of location groups `location_name_groups` +- Location name to AP ID dict `location_name_to_id` + +Its format will be identical to the whole-datapackage endpoint (`/datapackage`), except you'll only be returned the single game's data in a dict. + +### `/datapackage_checksum` + +Fetches the checksums of the current static datapackages on the WebHost. +You'll receive a dict with `game:checksum` key-value pairs for all the current officially supported games. +Example: +``` +{ +... +"Donkey Kong Country 3":"f90acedcd958213f483a6a4c238e2a3faf92165e", +"Factorio":"a699194a9589db3ebc0d821915864b422c782f44", +... +} +``` + + +## Generation Endpoint +These endpoints are used internally for the WebHost to generate games and validate their generation. They are also used by external applications to generate games automatically. + +### `/generate` + +Submits a game to the WebHost for generation. +**This endpoint only accepts a POST HTTP request.** + +There are two ways to submit data for generation: With a file and with JSON. + +#### With a file: +Have your ZIP of yaml(s) or a single yaml, and submit a POST request to the `/generate` endpoint. +If the options are valid, you'll be returned a successful generation response. (see [Generation Response](#generation-response)) + +Example using the python requests library: +``` +file = {'file': open('Games.zip', 'rb')} +req = requests.post("https://archipelago.gg/api/generate", files=file) +``` + +#### With JSON: +Compile your weights/yaml data into a dict. Then insert that into a dict with the key `"weights"`. +Finally, submit a POST request to the `/generate` endpoint. +If the weighted options are valid, you'll be returned a successful generation response (see [Generation Response](#generation-response)) + +Example using the python requests library: +``` +data = {"Test":{"game": "Factorio","name": "Test","Factorio": {}},} +weights={"weights": data} +req = requests.post("https://archipelago.gg/api/generate", json=weights) +``` + +#### Generation Response: +##### Successful Generation: +Upon successful generation, you'll be sent a JSON dict response detailing the generation: +- The UUID of the generation `detail` +- The SUUID of the generation `encoded` +- The response text `text` +- The page that will resolve to the seed/room generation page once generation has completed `url` +- The API status page of the generation `wait_api_url` (see [Status Endpoint](#status)) + +Example: +``` +{ + "detail": "19878f16-5a58-4b76-aab7-d6bf38be9463", + "encoded": "GYePFlpYS3aqt9a_OL6UYw", + "text": "Generation of seed 19878f16-5a58-4b76-aab7-d6bf38be9463 started successfully.", + "url": "http://archipelago.gg/wait/GYePFlpYS3aqt9a_OL6UYw", + "wait_api_url": "http://archipelago.gg/api/status/GYePFlpYS3aqt9a_OL6UYw" +} +``` + +##### Failed Generation: + +Upon failed generation, you'll be returned a single key-value pair. The key will always be `text` +The value will give you a hint as to what may have gone wrong. +- Options without tags, and a 400 status code +- Options in a string, and a 400 status code +- Invalid file/weight string, `No options found. Expected file attachment or json weights.` with a 400 status code +- Too many slots for the server to process, `Max size of multiworld exceeded` with a 409 status code + +If the generation detects a issue in generation, you'll be sent a dict with two key-value pairs (`text` and `detail`) and a 400 status code. The values will be: +- Summary of issue in `text` +- Detailed issue in `detail` + +In the event of an unhandled server exception, you'll be provided a dict with a single key `text`: +- Exception, `Uncought Exception: ` with a 500 status code + +### `/status/` + +Retrieves the status of the seed's generation. +This endpoint will return a dict with a single key-vlaue pair. The key will always be `text` +The value will tell you the status of the generation: +- Generation was completed: `Generation done` with a 201 status code +- Generation request was not found: `Generation not found` with a 404 status code +- Generation of the seed failed: `Generation failed` with a 500 status code +- Generation is in progress still: `Generation running` with a 202 status code + +## Room Endpoints +Endpoints to fetch information of the active WebHost room with the supplied room_ID. + +### `/room_status/` + +Will provide a dict of room data with the following keys: +- Tracker SUUID (`tracker`) +- A list of players (`players`) + - Each item containing a list with the Slot name and Game +- Last known hosted port (`last_port`) +- Last activity timestamp (`last_activity`) +- The room timeout counter (`timeout`) +- A list of downloads for files required for gameplay (`downloads`) + - Each item is a dict containings the download URL and slot (`slot`, `download`) + +Example: +``` +{ + "downloads": [ + { + "download": "/slot_file/kK5fmxd8TfisU5Yp_eg/1", + "slot": 1 + }, + { + "download": "/slot_file/kK5fmxd8TfisU5Yp_eg/2", + "slot": 2 + }, + { + "download": "/slot_file/kK5fmxd8TfisU5Yp_eg/3", + "slot": 3 + }, + { + "download": "/slot_file/kK5fmxd8TfisU5Yp_eg/4", + "slot": 4 + }, + { + "download": "/slot_file/kK5fmxd8TfisU5Yp_eg/5", + "slot": 5 + } + ], + "last_activity": "Fri, 18 Apr 2025 20:35:45 GMT", + "last_port": 52122, + "players": [ + [ + "Slot_Name_1", + "Ocarina of Time" + ], + [ + "Slot_Name_2", + "Ocarina of Time" + ], + [ + "Slot_Name_3", + "Ocarina of Time" + ], + [ + "Slot_Name_4", + "Ocarina of Time" + ], + [ + "Slot_Name_5", + "Ocarina of Time" + ] + ], + "timeout": 7200, + "tracker": "cf6989c0-4703-45d7-a317-2e5158431171" +} +``` + +## Tracker Endpoints +Endpoints to fetch information regarding players of an active WebHost room with the supplied tracker_ID. The tracker ID +can either be viewed while on a room tracker page, or from the [room's endpoint](#room-endpoints). + +### `/tracker/` + +Will provide a dict of tracker data with the following keys: + +- Each player's current alias (`aliases`) + - Will return the name if there is none +- A list of items each player has received as a NetworkItem (`player_items_received`) +- A list of checks done by each player as a list of the location id's (`player_checks_done`) +- The total number of checks done by all players (`total_checks_done`) +- Hints that players have used or received (`hints`) +- The time of last activity of each player in RFC 1123 format (`activity_timers`) +- The time of last active connection of each player in RFC 1123 format (`connection_timers`) +- The current client status of each player (`player_status`) + +Example: +```json +{ + "aliases": [ + { + "team": 0, + "player": 1, + "alias": "Incompetence" + }, + { + "team": 0, + "player": 2, + "alias": "Slot_Name_2" + } + ], + "player_items_received": [ + { + "team": 0, + "player": 1, + "items": [ + [1, 1, 1, 0], + [2, 2, 2, 1] + ] + }, + { + "team": 0, + "player": 2, + "items": [ + [1, 1, 1, 2], + [2, 2, 2, 0] + ] + } + ], + "player_checks_done": [ + { + "team": 0, + "player": 1, + "locations": [ + 1, + 2 + ] + }, + { + "team": 0, + "player": 2, + "locations": [ + 1, + 2 + ] + } + ], + "total_checks_done": [ + { + "team": 0, + "checks_done": 4 + } + ], + "hints": [ + { + "team": 0, + "player": 1, + "hints": [ + [1, 2, 4, 6, 0, "", 4, 0] + ] + }, + { + "team": 0, + "player": 2, + "hints": [] + } + ], + "activity_timers": [ + { + "team": 0, + "player": 1, + "time": "Fri, 18 Apr 2025 20:35:45 GMT" + }, + { + "team": 0, + "player": 2, + "time": "Fri, 18 Apr 2025 20:42:46 GMT" + } + ], + "connection_timers": [ + { + "team": 0, + "player": 1, + "time": "Fri, 18 Apr 2025 20:38:25 GMT" + }, + { + "team": 0, + "player": 2, + "time": "Fri, 18 Apr 2025 21:03:00 GMT" + } + ], + "player_status": [ + { + "team": 0, + "player": 1, + "status": 0 + }, + { + "team": 0, + "player": 2, + "status": 0 + } + ] +} +``` + +### `/static_tracker/` + +Will provide a dict of static tracker data with the following keys: + +- item_link groups and their players (`groups`) +- The datapackage hash for each game (`datapackage`) + - This hash can then be sent to the datapackage API to receive the appropriate datapackage as necessary +- The number of checks found vs. total checks available per player (`player_locations_total`) + - Same logic as the multitracker template: found = len(player_checks_done.locations) / total = player_locations_total.total_locations (all available checks). + +Example: +```json +{ + "groups": [ + { + "slot": 5, + "name": "testGroup", + "members": [ + 1, + 2 + ] + }, + { + "slot": 6, + "name": "myCoolLink", + "members": [ + 3, + 4 + ] + } + ], + "datapackage": { + "Archipelago": { + "checksum": "ac9141e9ad0318df2fa27da5f20c50a842afeecb", + }, + "The Messenger": { + "checksum": "6991cbcda7316b65bcb072667f3ee4c4cae71c0b", + } + }, + "player_locations_total": [ + { + "player": 1, + "team" : 0, + "total_locations": 10 + }, + { + "player": 2, + "team" : 0, + "total_locations": 20 + } + ], +} +``` + +### `/slot_data_tracker/` + +Will provide a list of each player's slot_data. + +Example: +```json +[ + { + "player": 1, + "slot_data": { + "example_option": 1, + "other_option": 3 + } + }, + { + "player": 2, + "slot_data": { + "example_option": 1, + "other_option": 2 + } + } +] +``` + +## User Endpoints +User endpoints can get room and seed details from the current session tokens (cookies) + +### `/get_rooms` + +Retreives a list of all rooms currently owned by the session token. +Each list item will contain a dict with the room's details: +- Room SUUID (`room_id`) +- Seed SUUID (`seed_id`) +- Creation timestamp (`creation_time`) +- Last activity timestamp (`last_activity`) +- Last known AP port (`last_port`) +- Room timeout counter in seconds (`timeout`) +- Room tracker SUUID (`tracker`) + +Example: +``` +[ + { + "creation_time": "Fri, 18 Apr 2025 19:46:53 GMT", + "last_activity": "Fri, 18 Apr 2025 21:16:02 GMT", + "last_port": 52122, + "room_id": "90ae5f9b-177c-4df8-ac53-9629fc3bff7a", + "seed_id": "efbd62c2-aaeb-4dda-88c3-f461c029cef6", + "timeout": 7200, + "tracker": "cf6989c0-4703-45d7-a317-2e5158431171" + }, + { + "creation_time": "Fri, 18 Apr 2025 20:36:42 GMT", + "last_activity": "Fri, 18 Apr 2025 20:36:46 GMT", + "last_port": 56884, + "room_id": "14465c05-d08e-4d28-96bd-916f994609d8", + "seed_id": "a528e34c-3b4f-42a9-9f8f-00a4fd40bacb", + "timeout": 7200, + "tracker": "4e624bd8-32b6-42e4-9178-aa407f72751c" + } +] +``` + +### `/get_seeds` + +Retreives a list of all seeds currently owned by the session token. +Each item in the list will contain a dict with the seed's details: +- Seed SUUID (`seed_id`) +- Creation timestamp (`creation_time`) +- A list of player slots (`players`) + - Each item in the list will contain a list of the slot name and game + +Example: +``` +[ + { + "creation_time": "Fri, 18 Apr 2025 19:46:52 GMT", + "players": [ + [ + "Slot_Name_1", + "Ocarina of Time" + ], + [ + "Slot_Name_2", + "Ocarina of Time" + ], + [ + "Slot_Name_3", + "Ocarina of Time" + ], + [ + "Slot_Name_4", + "Ocarina of Time" + ], + [ + "Slot_Name_5", + "Ocarina of Time" + ] + ], + "seed_id": "efbd62c2-aaeb-4dda-88c3-f461c029cef6" + }, + { + "creation_time": "Fri, 18 Apr 2025 20:36:39 GMT", + "players": [ + [ + "Slot_Name_1", + "Clique" + ], + [ + "Slot_Name_2", + "Clique" + ], + [ + "Slot_Name_3", + "Clique" + ], + [ + "Slot_Name_4", + "Archipelago" + ] + ], + "seed_id": "a528e34c-3b4f-42a9-9f8f-00a4fd40bacb" + } +] +``` \ No newline at end of file diff --git a/docs/world api.md b/docs/world api.md index 013b02cc20..db6da50cf4 100644 --- a/docs/world api.md +++ b/docs/world api.md @@ -76,8 +76,8 @@ webhost: * `game_info_languages` (optional) list of strings for defining the existing game info pages your game supports. The documents must be prefixed with the same string as defined here. Default already has 'en'. -* `options_presets` (optional) `Dict[str, Dict[str, Any]]` where the keys are the names of the presets and the values - are the options to be set for that preset. The options are defined as a `Dict[str, Any]` where the keys are the names +* `options_presets` (optional) `dict[str, dict[str, Any]]` where the keys are the names of the presets and the values + are the options to be set for that preset. The options are defined as a `dict[str, Any]` where the keys are the names of the options and the values are the values to be set for that option. These presets will be available for users to select from on the game's options page. @@ -257,31 +257,14 @@ another flag like "progression", it means "an especially useful progression item combined with `progression`; see below) * `progression_skip_balancing`: the combination of `progression` and `skip_balancing`, i.e., a progression item that will not be moved around by progression balancing; used, e.g., for currency or tokens, to not flood early spheres - -### Events - -An Event is a special combination of a Location and an Item, with both having an `id` of `None`. These can be used to -track certain logic interactions, with the Event Item being required for access in other locations or regions, but not -being "real". Since the item and location have no ID, they get dropped at the end of generation and so the server is -never made aware of them and these locations can never be checked, nor can the items be received during play. -They may also be used for making the spoiler log look nicer, i.e. by having a `"Victory"` Event Item, that -is required to finish the game. This makes it very clear when the player finishes, rather than only seeing their last -relevant Item. Events function just like any other Location, and can still have their own access rules, etc. -By convention, the Event "pair" of Location and Item typically have the same name, though this is not a requirement. -They must not exist in the `name_to_id` lookups, as they have no ID. - -The most common way to create an Event pair is to create and place the Item on the Location as soon as it's created: - -```python -from worlds.AutoWorld import World -from BaseClasses import ItemClassification -from .subclasses import MyGameLocation, MyGameItem - - -class MyGameWorld(World): - victory_loc = MyGameLocation(self.player, "Victory", None) - victory_loc.place_locked_item(MyGameItem("Victory", ItemClassification.progression, None, self.player)) -``` +* `deprioritized`: denotes that an item should not be placed on priority locations + (to be combined with `progression`; see below) +* `progression_deprioritized`: the combination of `progression` and `deprioritized`, i.e. a progression item that + should not be placed on priority locations, despite being progression; + like skip_balancing, this is commonly used for currency or tokens. +* `progression_deprioritized_skip_balancing`: the combination of `progression`, `deprioritized` and `skip_balancing`. + Since there is overlap between the kind of items that want `skip_balancing` and `deprioritized`, + this combined classification exists for convenience ### Regions @@ -291,7 +274,7 @@ like entrance randomization in logic. Regions have a list called `exits`, containing `Entrance` objects representing transitions to other regions. -There must be one special region (Called "Menu" by default, but configurable using [origin_region_name](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L298-L299)), +There must be one special region (Called "Menu" by default, but configurable using [origin_region_name](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/AutoWorld.py#L310-L311)), from which the logic unfolds. AP assumes that a player will always be able to return to this starting region by resetting the game ("Save and quit"). ### Entrances @@ -339,6 +322,63 @@ avoiding the need for indirect conditions at the expense of performance. An item rule is a function that returns `True` or `False` for a `Location` based on a single item. It can be used to reject the placement of an item there. +### Events (or "generation-only items/locations") + +An event item or location is one that only exists during multiworld generation; the server is never made aware of them. +Event locations can never be checked by the player, and event items cannot be received during play. + +Events are used to represent in-game actions (that aren't regular Archipelago locations) when either: + +* We want to show in the spoiler log when the player is expected to perform the in-game action. +* It's the cleanest way to represent how that in-game action impacts logic. + +Typical examples include completing the goal, defeating a boss, or flipping a switch that affects multiple areas. + +To be precise: the term "event" on its own refers to the special combination of an "event item" placed on an "event +location". Event items and locations are created the same way as normal items and locations, except that they have an +`id` of `None`, and an event item must be placed on an event location +(and vice versa). Finally, although events are often described as "fake" items and locations, it's important to +understand that they are perfectly real during generation. + +The most common way to create an event is to create the event item and the event location, then immediately call +`Location.place_locked_item()`: + +```python +victory_loc = MyGameLocation(self.player, "Defeat the Final Boss", None, final_boss_arena_region) +victory_loc.place_locked_item(MyGameItem("Victory", ItemClassification.progression, None, self.player)) +self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) +set_rule(victory_loc, lambda state: state.has("Boss Defeating Sword", self.player)) +``` + +Requiring an event to finish the game will make the spoiler log display an additional +`Defeat the Final Boss: Victory` line when the player is expected to finish, rather than only showing their last +relevant item. But events aren't just about the spoiler log; a more substantial example of using events to structure +your logic might be: + +```python +water_loc = MyGameLocation(self.player, "Water Level Switch", None, pump_station_region) +water_loc.place_locked_item(MyGameItem("Lowered Water Level", ItemClassification.progression, None, self.player)) +pump_station_region.locations.append(water_loc) +set_rule(water_loc, lambda state: state.has("Double Jump", self.player)) # the switch is really high up +... +basement_loc = MyGameLocation(self.player, "Flooded House - Basement Chest", None, flooded_house_region) +flooded_house_region.locations += [upstairs_loc, ground_floor_loc, basement_loc] +... +set_rule(basement_loc, lambda state: state.has("Lowered Water Level", self.player)) +``` + +This creates a "Lowered Water Level" event and a regular location whose access rule depends on that +event being reachable. If you made several more locations the same way, this would ensure all of those locations can +only become reachable when the event location is reachable (i.e. when the water level can be lowered), without +copy-pasting the event location's access rule and then repeatedly re-evaluating it. Also, the spoiler log will show +`Water Level Switch: Lowered Water Level` when the player is expected to do this. + +To be clear, this example could also be modeled with a second Region (perhaps "Un-Flooded House"). Or you could modify +the game so flipping that switch checks a regular AP location in addition to lowering the water level. +Events are never required, but it may be cleaner to use an event if e.g. flipping that switch affects the logic in +dozens of half-flooded areas that would all otherwise need additional Regions, and you don't want it to be a regular +location. It depends on the game. + ## Implementation ### Your World @@ -483,13 +523,14 @@ In addition, the following methods can be implemented and are called in this ord called per player before any items or locations are created. You can set properties on your world here. Already has access to player options and RNG. This is the earliest step where the world should start setting up for the current multiworld, as the multiworld itself is still setting up before this point. + You cannot modify `local_items`, or `non_local_items` after this step. * `create_regions(self)` called to place player's regions and their locations into the MultiWorld's regions list. If it's hard to separate, this can be done during `generate_early` or `create_items` as well. * `create_items(self)` called to place player's items into the MultiWorld's itempool. By the end of this step all regions, locations and - items have to be in the MultiWorld's regions and itempool. You cannot add or remove items, locations, or regions - after this step. Locations cannot be moved to different regions after this step. + items have to be in the MultiWorld's regions and itempool. You cannot add or remove items, locations, or regions after + this step. Locations cannot be moved to different regions after this step. This includes event items and locations. * `set_rules(self)` called to set access and item rules on locations and entrances. * `connect_entrances(self)` @@ -501,12 +542,12 @@ In addition, the following methods can be implemented and are called in this ord called to modify item placement before, during, and after the regular fill process; all finishing before `generate_output`. Any items that need to be placed during `pre_fill` should not exist in the itempool, and if there are any items that need to be filled this way, but need to be in state while you fill other items, they can be - returned from `get_prefill_items`. + returned from `get_pre_fill_items`. * `generate_output(self, output_directory: str)` creates the output files if there is output to be generated. When this is called, `self.multiworld.get_locations(self.player)` has all locations for the player, with attribute `item` pointing to the item. `location.item.player` can be used to see if it's a local item. -* `fill_slot_data(self)` and `modify_multidata(self, multidata: Dict[str, Any])` can be used to modify the data that +* `fill_slot_data(self)` and `modify_multidata(self, multidata: MultiData)` can be used to modify the data that will be used by the server to host the MultiWorld. All instance methods can, optionally, have a class method defined which will be called after all instance methods are @@ -579,17 +620,10 @@ def create_items(self) -> None: # If there are two of the same item, the item has to be twice in the pool. # Which items are added to the pool may depend on player options, e.g. custom win condition like triforce hunt. # Having an item in the start inventory won't remove it from the pool. - # If an item can't have duplicates it has to be excluded manually. - - # List of items to exclude, as a copy since it will be destroyed below - exclude = [item for item in self.multiworld.precollected_items[self.player]] + # If you want to do that, use start_inventory_from_pool for item in map(self.create_item, mygame_items): - if item in exclude: - exclude.remove(item) # this is destructive. create unique list above - self.multiworld.itempool.append(self.create_item("nothing")) - else: - self.multiworld.itempool.append(item) + self.multiworld.itempool.append(item) # itempool and number of locations should match up. # If this is not the case we want to fill the itempool with junk. @@ -719,7 +753,7 @@ from BaseClasses import CollectionState, MultiWorld from worlds.AutoWorld import LogicMixin class MyGameState(LogicMixin): - mygame_defeatable_enemies: Dict[int, Set[str]] # per player + mygame_defeatable_enemies: dict[int, set[str]] # per player def init_mixin(self, multiworld: MultiWorld) -> None: # Initialize per player with the corresponding "nothing" value, such as 0 or an empty set. @@ -848,11 +882,11 @@ item/location pairs is unnecessary since the AP server already retains and freel that request it. The most common usage of slot data is sending option results that the client needs to be aware of. ```python -def fill_slot_data(self) -> Dict[str, Any]: +def fill_slot_data(self) -> dict[str, Any]: # In order for our game client to handle the generated seed correctly we need to know what the user selected # for their difficulty and final boss HP. # A dictionary returned from this method gets set as the slot_data and will be sent to the client after connecting. - # The options dataclass has a method to return a `Dict[str, Any]` of each option name provided and the relevant + # The options dataclass has a method to return a `dict[str, Any]` of each option name provided and the relevant # option's value. return self.options.as_dict("difficulty", "final_boss_hp") ``` diff --git a/docs/world maintainer.md b/docs/world maintainer.md index 17aacdf8c2..6971a98227 100644 --- a/docs/world maintainer.md +++ b/docs/world maintainer.md @@ -65,5 +65,5 @@ date, voting members and final result in the commit message. ## Handling of Unmaintained Worlds -As long as worlds are known to work for the most part, they can stay included. Once a world becomes broken it shall be -moved from `worlds/` to `worlds_disabled/`. +As long as worlds are known to work for the most part, they can stay included. Once the world becomes broken, it shall +be deleted. diff --git a/entrance_rando.py b/entrance_rando.py index 5ed2cd7645..578059ae6f 100644 --- a/entrance_rando.py +++ b/entrance_rando.py @@ -52,13 +52,15 @@ class EntranceLookup: _coupled: bool _usable_exits: set[Entrance] - def __init__(self, rng: random.Random, coupled: bool, usable_exits: set[Entrance]): + def __init__(self, rng: random.Random, coupled: bool, usable_exits: set[Entrance], targets: Iterable[Entrance]): self.dead_ends = EntranceLookup.GroupLookup() self.others = EntranceLookup.GroupLookup() self._random = rng self._expands_graph_cache = {} self._coupled = coupled self._usable_exits = usable_exits + for target in targets: + self.add(target) def _can_expand_graph(self, entrance: Entrance) -> bool: """ @@ -72,13 +74,12 @@ class EntranceLookup: if entrance in self._expands_graph_cache: return self._expands_graph_cache[entrance] - visited = set() + seen = {entrance.connected_region} q: deque[Region] = deque() q.append(entrance.connected_region) while q: region = q.popleft() - visited.add(region) # check if the region itself is progression if region in region.multiworld.indirect_connections: @@ -101,7 +102,8 @@ class EntranceLookup: and exit_ in self._usable_exits): self._expands_graph_cache[entrance] = True return True - elif exit_.connected_region and exit_.connected_region not in visited: + elif exit_.connected_region and exit_.connected_region not in seen: + seen.add(exit_.connected_region) q.append(exit_.connected_region) self._expands_graph_cache[entrance] = False @@ -121,7 +123,14 @@ class EntranceLookup: dead_end: bool, preserve_group_order: bool ) -> Iterable[Entrance]: + """ + Gets available targets for the requested groups + :param groups: The groups to find targets for + :param dead_end: Whether to find dead ends. If false, finds non-dead-ends + :param preserve_group_order: Whether to preserve the group order in the returned iterable. If true, a sequence + like AAABBB is guaranteed. If false, groups can be interleaved, e.g. BAABAB. + """ lookup = self.dead_ends if dead_end else self.others if preserve_group_order: for group in groups: @@ -132,6 +141,27 @@ class EntranceLookup: self._random.shuffle(ret) return ret + def find_target(self, name: str, group: int | None = None, dead_end: bool | None = None) -> Entrance | None: + """ + Finds a specific target in the lookup, if it is present. + + :param name: The name of the target + :param group: The target's group. Providing this will make the lookup faster, but can be omitted if it is not + known ahead of time for some reason. + :param dead_end: Whether the target is a dead end. Providing this will make the lookup faster, but can be + omitted if this is not known ahead of time (much more likely) + """ + if dead_end is None: + return (found + if (found := self.find_target(name, group, True)) + else self.find_target(name, group, False)) + lookup = self.dead_ends if dead_end else self.others + targets_to_check = lookup if group is None else lookup[group] + for target in targets_to_check: + if target.name == name: + return target + return None + def __len__(self): return len(self.dead_ends) + len(self.others) @@ -146,15 +176,18 @@ class ERPlacementState: """The world which is having its entrances randomized""" collection_state: CollectionState """The CollectionState backing the entrance randomization logic""" + entrance_lookup: EntranceLookup + """A lookup table of all unconnected ER targets""" coupled: bool """Whether entrance randomization is operating in coupled mode""" - def __init__(self, world: World, coupled: bool): + def __init__(self, world: World, entrance_lookup: EntranceLookup, coupled: bool): self.placements = [] self.pairings = [] self.world = world self.coupled = coupled self.collection_state = world.multiworld.get_all_state(False, True) + self.entrance_lookup = entrance_lookup @property def placed_regions(self) -> set[Region]: @@ -182,6 +215,7 @@ class ERPlacementState: self.collection_state.stale[self.world.player] = True self.placements.append(source_exit) self.pairings.append((source_exit.name, target_entrance.name)) + self.entrance_lookup.remove(target_entrance) def test_speculative_connection(self, source_exit: Entrance, target_entrance: Entrance, usable_exits: set[Entrance]) -> bool: @@ -311,7 +345,7 @@ def randomize_entrances( preserve_group_order: bool = False, er_targets: list[Entrance] | None = None, exits: list[Entrance] | None = None, - on_connect: Callable[[ERPlacementState, list[Entrance]], None] | None = None + on_connect: Callable[[ERPlacementState, list[Entrance], list[Entrance]], bool | None] | None = None ) -> ERPlacementState: """ Randomizes Entrances for a single world in the multiworld. @@ -328,14 +362,18 @@ def randomize_entrances( :param exits: The list of exits (Entrance objects with no target region) to use for randomization. Remember to be deterministic! If not provided, automatically discovers all valid exits in your world. :param on_connect: A callback function which allows specifying side effects after a placement is completed - successfully and the underlying collection state has been updated. + successfully and the underlying collection state has been updated. The arguments are + 1. The ER state + 2. The exits placed in this placement pass + 3. The entrances they were connected to. + If you use on_connect to make additional placements, you are expected to return True to inform + GER that an additional sweep is needed. """ if not world.explicit_indirect_conditions: raise EntranceRandomizationError("Entrance randomization requires explicit indirect conditions in order " + "to correctly analyze whether dead end regions can be required in logic.") start_time = time.perf_counter() - er_state = ERPlacementState(world, coupled) # similar to fill, skip validity checks on entrances if the game is beatable on minimal accessibility perform_validity_check = True @@ -351,23 +389,25 @@ def randomize_entrances( # used when membership checks are needed on the exit list, e.g. speculative sweep exits_set = set(exits) - entrance_lookup = EntranceLookup(world.random, coupled, exits_set) - for entrance in er_targets: - entrance_lookup.add(entrance) + er_state = ERPlacementState( + world, + EntranceLookup(world.random, coupled, exits_set, er_targets), + coupled + ) # place the menu region and connected start region(s) er_state.collection_state.update_reachable_regions(world.player) def do_placement(source_exit: Entrance, target_entrance: Entrance) -> None: - placed_exits, removed_entrances = er_state.connect(source_exit, target_entrance) - # remove the placed targets from consideration - for entrance in removed_entrances: - entrance_lookup.remove(entrance) + placed_exits, paired_entrances = er_state.connect(source_exit, target_entrance) # propagate new connections er_state.collection_state.update_reachable_regions(world.player) er_state.collection_state.sweep_for_advancements() if on_connect: - on_connect(er_state, placed_exits) + change = on_connect(er_state, placed_exits, paired_entrances) + if change: + er_state.collection_state.update_reachable_regions(world.player) + er_state.collection_state.sweep_for_advancements() def needs_speculative_sweep(dead_end: bool, require_new_exits: bool, placeable_exits: list[Entrance]) -> bool: # speculative sweep is expensive. We currently only do it as a last resort, if we might cap off the graph @@ -388,12 +428,12 @@ def randomize_entrances( # check to see if we are proposing the last placement if not coupled: # in uncoupled, this check is easy as there will only be one target. - is_last_placement = len(entrance_lookup) == 1 + is_last_placement = len(er_state.entrance_lookup) == 1 else: # a bit harder, there may be 1 or 2 targets depending on if the exit to place is one way or two way. # if it is two way, we can safely assume that one of the targets is the logical pair of the exit. desired_target_count = 2 if placeable_exits[0].randomization_type == EntranceType.TWO_WAY else 1 - is_last_placement = len(entrance_lookup) == desired_target_count + is_last_placement = len(er_state.entrance_lookup) == desired_target_count # if it's not the last placement, we need a sweep return not is_last_placement @@ -402,7 +442,7 @@ def randomize_entrances( placeable_exits = er_state.find_placeable_exits(perform_validity_check, exits) for source_exit in placeable_exits: target_groups = target_group_lookup[source_exit.randomization_group] - for target_entrance in entrance_lookup.get_targets(target_groups, dead_end, preserve_group_order): + for target_entrance in er_state.entrance_lookup.get_targets(target_groups, dead_end, preserve_group_order): # when requiring new exits, ideally we would like to make it so that every placement increases # (or keeps the same number of) reachable exits. The goal is to continue to expand the search space # so that we do not crash. In the interest of performance and bias reduction, generally, just checking @@ -420,7 +460,7 @@ def randomize_entrances( else: # no source exits had any valid target so this stage is deadlocked. retries may be implemented if early # deadlocking is a frequent issue. - lookup = entrance_lookup.dead_ends if dead_end else entrance_lookup.others + lookup = er_state.entrance_lookup.dead_ends if dead_end else er_state.entrance_lookup.others # if we're in a stage where we're trying to get to new regions, we could also enter this # branch in a success state (when all regions of the preferred type have been placed, but there are still @@ -466,21 +506,21 @@ def randomize_entrances( f"All unplaced exits: {unplaced_exits}") # stage 1 - try to place all the non-dead-end entrances - while entrance_lookup.others: + while er_state.entrance_lookup.others: if not find_pairing(dead_end=False, require_new_exits=True): break # stage 2 - try to place all the dead-end entrances - while entrance_lookup.dead_ends: + while er_state.entrance_lookup.dead_ends: if not find_pairing(dead_end=True, require_new_exits=True): break # stage 3 - all the regions should be placed at this point. We now need to connect dangling edges # stage 3a - get the rest of the dead ends (e.g. second entrances into already-visited regions) # doing this before the non-dead-ends is important to ensure there are enough connections to # go around - while entrance_lookup.dead_ends: + while er_state.entrance_lookup.dead_ends: find_pairing(dead_end=True, require_new_exits=False) # stage 3b - tie all the other loose ends connecting visited regions to each other - while entrance_lookup.others: + while er_state.entrance_lookup.others: find_pairing(dead_end=False, require_new_exits=False) running_time = time.perf_counter() - start_time diff --git a/inno_setup.iss b/inno_setup.iss index adf9acc834..8611c849fb 100644 --- a/inno_setup.iss +++ b/inno_setup.iss @@ -53,10 +53,6 @@ Name: "full"; Description: "Full installation" Name: "minimal"; Description: "Minimal installation" Name: "custom"; Description: "Custom installation"; Flags: iscustom -[Components] -Name: "core"; Description: "Archipelago"; Types: full minimal custom; Flags: fixed -Name: "lttp_sprites"; Description: "Download ""A Link to the Past"" player sprites"; Types: full; - [Dirs] NAME: "{app}"; Flags: setntfscompression; Permissions: everyone-modify users-modify authusers-modify; @@ -76,7 +72,6 @@ Name: "{commondesktop}\{#MyAppName} Launcher"; Filename: "{app}\ArchipelagoLaunc [Run] Filename: "{tmp}\vc_redist.x64.exe"; Parameters: "/passive /norestart"; Check: IsVCRedist64BitNeeded; StatusMsg: "Installing VC++ redistributable..." -Filename: "{app}\ArchipelagoLttPAdjuster"; Parameters: "--update_sprites"; StatusMsg: "Updating Sprite Library..."; Components: lttp_sprites Filename: "{app}\ArchipelagoLauncher"; Parameters: "--update_settings"; StatusMsg: "Updating host.yaml..."; Flags: runasoriginaluser runhidden Filename: "{app}\ArchipelagoLauncher"; Description: "{cm:LaunchProgram,{#StringChange('Launcher', '&', '&&')}}"; Flags: nowait postinstall skipifsilent @@ -86,6 +81,7 @@ Type: dirifempty; Name: "{app}" [InstallDelete] Type: files; Name: "{app}\*.exe" Type: files; Name: "{app}\data\lua\connector_pkmn_rb.lua" +Type: files; Name: "{app}\data\lua\connector_ff1.lua" Type: filesandordirs; Name: "{app}\SNI\lua*" Type: filesandordirs; Name: "{app}\EnemizerCLI*" #include "installdelete.iss" @@ -137,11 +133,6 @@ Root: HKCR; Subkey: "{#MyAppName}kdl3patch"; ValueData: "Arc Root: HKCR; Subkey: "{#MyAppName}kdl3patch\DefaultIcon"; ValueData: "{app}\ArchipelagoSNIClient.exe,0"; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}kdl3patch\shell\open\command"; ValueData: """{app}\ArchipelagoSNIClient.exe"" ""%1"""; ValueType: string; ValueName: ""; -Root: HKCR; Subkey: ".apmc"; ValueData: "{#MyAppName}mcdata"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; -Root: HKCR; Subkey: "{#MyAppName}mcdata"; ValueData: "Archipelago Minecraft Data"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; -Root: HKCR; Subkey: "{#MyAppName}mcdata\DefaultIcon"; ValueData: "{app}\ArchipelagoMinecraftClient.exe,0"; ValueType: string; ValueName: ""; -Root: HKCR; Subkey: "{#MyAppName}mcdata\shell\open\command"; ValueData: """{app}\ArchipelagoMinecraftClient.exe"" ""%1"""; ValueType: string; ValueName: ""; - Root: HKCR; Subkey: ".apz5"; ValueData: "{#MyAppName}n64zpf"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}n64zpf"; ValueData: "Archipelago Ocarina of Time Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Root: HKCR; Subkey: "{#MyAppName}n64zpf\DefaultIcon"; ValueData: "{app}\ArchipelagoOoTClient.exe,0"; ValueType: string; ValueName: ""; diff --git a/kvui.py b/kvui.py index d0d965c30b..013cd33609 100644 --- a/kvui.py +++ b/kvui.py @@ -6,7 +6,6 @@ import re import io import pkgutil from collections import deque - assert "kivy" not in sys.modules, "kvui should be imported before kivy for frozen compatibility" if sys.platform == "win32": @@ -57,10 +56,14 @@ from kivy.animation import Animation from kivy.uix.popup import Popup from kivy.uix.image import AsyncImage from kivymd.app import MDApp +from kivymd.uix.dialog import MDDialog, MDDialogHeadlineText, MDDialogSupportingText, MDDialogButtonContainer from kivymd.uix.gridlayout import MDGridLayout from kivymd.uix.floatlayout import MDFloatLayout from kivymd.uix.boxlayout import MDBoxLayout -from kivymd.uix.tab.tab import MDTabsSecondary, MDTabsItem, MDTabsItemText, MDTabsCarousel +from kivymd.uix.navigationbar import MDNavigationBar, MDNavigationItem +from kivymd.uix.screen import MDScreen +from kivymd.uix.screenmanager import MDScreenManager + from kivymd.uix.menu import MDDropdownMenu from kivymd.uix.menu.menu import MDDropdownTextItem from kivymd.uix.dropdownitem import MDDropDownItem, MDDropDownItemText @@ -710,72 +713,92 @@ class CommandPromptTextInput(ResizableTextField): self.text = self._command_history[self._command_history_index] -class MessageBox(Popup): - class MessageBoxLabel(MDLabel): - def __init__(self, **kwargs): - super().__init__(**kwargs) - self._label.refresh() +class MessageBoxLabel(MDLabel): + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._label.refresh() + +class MessageBox(Popup): def __init__(self, title, text, error=False, **kwargs): - label = MessageBox.MessageBoxLabel(text=text) + label = MessageBoxLabel(text=text, padding=("6dp", "0dp")) separator_color = [217 / 255, 129 / 255, 122 / 255, 1.] if error else [47 / 255., 167 / 255., 212 / 255, 1.] super().__init__(title=title, content=label, size_hint=(0.5, None), width=max(100, int(label.width) + 40), separator_color=separator_color, **kwargs) - self.height += max(0, label.height - 18) -class ClientTabs(MDTabsSecondary): - carousel: MDTabsCarousel - lock_swiping = True +class MDNavigationItemBase(MDNavigationItem): + text = StringProperty(None) - def __init__(self, *args, **kwargs): - self.carousel = MDTabsCarousel(lock_swiping=True, anim_move_duration=0.2) - super().__init__(*args, MDDivider(size_hint_y=None, height=dp(1)), self.carousel, **kwargs) - self.size_hint_y = 1 - def _check_panel_height(self, *args): - self.ids.tab_scroll.height = dp(38) +class ButtonsPrompt(MDDialog): + def __init__(self, title: str, text: str, response: typing.Callable[[str], None], + *prompts: str, **kwargs) -> None: + """ + Customizable popup box that lets you create any number of buttons. The text of the pressed button is returned to + the callback. - def update_indicator( - self, x: float = 0.0, w: float = 0.0, instance: MDTabsItem = None - ) -> None: - def update_indicator(*args): - indicator_pos = (0, 0) - indicator_size = (0, 0) + :param title: The title of the popup. + :param text: The message prompt in the popup. + :param response: A callable that will get called when the user presses a button. The prompt will not close + itself so should be done here if you want to close it when certain buttons are pressed. + :param prompts: Any number of strings to be used for the buttons. + """ + layout = MDBoxLayout(orientation="vertical") + label = MessageBoxLabel(text=text) + layout.add_widget(label) - item_text_object = self._get_tab_item_text_icon_object() + def on_release(button: MDButton, *args) -> None: + response(button.text) - if item_text_object: - indicator_pos = ( - instance.x + dp(12), - self.indicator.pos[1] - if not self._tabs_carousel - else self._tabs_carousel.height, - ) - indicator_size = ( - instance.width - dp(24), - self.indicator_height, - ) + buttons = [MDDivider()] + for prompt in prompts: + button = MDButton( + MDButtonText(text=prompt, pos_hint={"center_x": 0.5, "center_y": 0.5}), + on_release=on_release, + style="text", + theme_width="Custom", + size_hint_x=1, + ) + button.text = prompt + buttons.extend([button, MDDivider()]) - Animation( - pos=indicator_pos, - size=indicator_size, - d=0 if not self.indicator_anim else self.indicator_duration, - t=self.indicator_transition, - ).start(self.indicator) + super().__init__( + MDDialogHeadlineText(text=title), + MDDialogSupportingText(text=text), + MDDialogButtonContainer(*buttons, orientation="vertical"), + **kwargs, + ) - if not instance: - self.indicator.pos = (x, self.indicator.pos[1]) - self.indicator.size = (w, self.indicator_height) + +class MDScreenManagerBase(MDScreenManager): + current_tab: MDNavigationItemBase + local_screen_names: list[str] + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.local_screen_names = [] + + def add_widget(self, widget: Widget, *args, **kwargs) -> None: + super().add_widget(widget, *args, **kwargs) + if "index" in kwargs: + self.local_screen_names.insert(kwargs["index"], widget.name) else: - Clock.schedule_once(update_indicator) + self.local_screen_names.append(widget.name) - def remove_tab(self, tab, content=None): - if content is None: - content = tab.content - self.ids.container.remove_widget(tab) - self.carousel.remove_widget(content) - self.on_size(self, self.size) + def switch_screens(self, new_tab: MDNavigationItemBase) -> None: + """ + Called whenever the user clicks a tab to switch to a different screen. + + :param new_tab: The new screen to switch to's tab. + """ + name = new_tab.text + if self.local_screen_names.index(name) > self.local_screen_names.index(self.current_screen.name): + self.transition.direction = "left" + else: + self.transition.direction = "right" + self.current = name + self.current_tab = new_tab class CommandButton(MDButton, MDTooltip): @@ -803,6 +826,9 @@ class GameManager(ThemedApp): main_area_container: MDGridLayout """ subclasses can add more columns beside the tabs """ + tabs: MDNavigationBar + screens: MDScreenManagerBase + def __init__(self, ctx: context_type): self.title = self.base_title self.ctx = ctx @@ -832,7 +858,7 @@ class GameManager(ThemedApp): @property def tab_count(self): if hasattr(self, "tabs"): - return max(1, len(self.tabs.tab_list)) + return max(1, len(self.tabs.children)) return 1 def on_start(self): @@ -872,30 +898,32 @@ class GameManager(ThemedApp): self.grid.add_widget(self.progressbar) # middle part - self.tabs = ClientTabs(pos_hint={"center_x": 0.5, "center_y": 0.5}) - self.tabs.add_widget(MDTabsItem(MDTabsItemText(text="All" if len(self.logging_pairs) > 1 else "Archipelago"))) - self.log_panels["All"] = self.tabs.default_tab_content = UILog(*(logging.getLogger(logger_name) - for logger_name, name in - self.logging_pairs)) - self.tabs.carousel.add_widget(self.tabs.default_tab_content) + self.screens = MDScreenManagerBase(pos_hint={"center_x": 0.5}) + self.tabs = MDNavigationBar(orientation="horizontal", size_hint_y=None, height=dp(40), set_bars_color=True) + # bind the method to the bar for back compatibility + self.tabs.remove_tab = self.remove_client_tab + self.screens.current_tab = self.add_client_tab( + "All" if len(self.logging_pairs) > 1 else "Archipelago", + UILog(*(logging.getLogger(logger_name) for logger_name, name in self.logging_pairs)), + ) + self.log_panels["All"] = self.screens.current_tab.content + self.screens.current_tab.active = True for logger_name, display_name in self.logging_pairs: bridge_logger = logging.getLogger(logger_name) self.log_panels[display_name] = UILog(bridge_logger) if len(self.logging_pairs) > 1: - panel = MDTabsItem(MDTabsItemText(text=display_name)) - panel.content = self.log_panels[display_name] - # show Archipelago tab if other logging is present - self.tabs.carousel.add_widget(panel.content) - self.tabs.add_widget(panel) + self.add_client_tab(display_name, self.log_panels[display_name]) - hint_panel = self.add_client_tab("Hints", HintLayout()) self.hint_log = HintLog(self.json_to_kivy_parser) + hint_panel = self.add_client_tab("Hints", HintLayout(self.hint_log)) self.log_panels["Hints"] = hint_panel.content - hint_panel.content.add_widget(self.hint_log) self.main_area_container = MDGridLayout(size_hint_y=1, rows=1) - self.main_area_container.add_widget(self.tabs) + tab_container = MDGridLayout(size_hint_y=1, cols=1) + tab_container.add_widget(self.tabs) + tab_container.add_widget(self.screens) + self.main_area_container.add_widget(tab_container) self.grid.add_widget(self.main_area_container) @@ -932,25 +960,61 @@ class GameManager(ThemedApp): return self.container - def add_client_tab(self, title: str, content: Widget, index: int = -1) -> Widget: - """Adds a new tab to the client window with a given title, and provides a given Widget as its content. - Returns the new tab widget, with the provided content being placed on the tab as content.""" - new_tab = MDTabsItem(MDTabsItemText(text=title)) + def add_client_tab(self, title: str, content: Widget, index: int = -1) -> MDNavigationItemBase: + """ + Adds a new tab to the client window with a given title, and provides a given Widget as its content. + Returns the new tab widget, with the provided content being placed on the tab as content. + + :param title: The title of the tab. + :param content: The Widget to be added as content for this tab's new MDScreen. Will also be added to the + returned tab as tab.content. + :param index: The index to insert the tab at. Defaults to -1, meaning the tab will be appended to the end. + + :return: The new tab. + """ + if self.tabs.children: + self.tabs.add_widget(MDDivider(orientation="vertical")) + new_tab = MDNavigationItemBase(text=title) new_tab.content = content - if -1 < index <= len(self.tabs.carousel.slides): - new_tab.bind(on_release=self.tabs.set_active_item) - new_tab._tabs = self.tabs - self.tabs.ids.container.add_widget(new_tab, index=index) - self.tabs.carousel.add_widget(new_tab.content, index=len(self.tabs.carousel.slides) - index) + new_screen = MDScreen(name=title) + new_screen.add_widget(content) + if -1 < index <= len(self.tabs.children): + remapped_index = len(self.tabs.children) - index + self.tabs.add_widget(new_tab, index=remapped_index) + self.screens.add_widget(new_screen, index=index) else: self.tabs.add_widget(new_tab) - self.tabs.carousel.add_widget(new_tab.content) + self.screens.add_widget(new_screen) return new_tab + def remove_client_tab(self, tab: MDNavigationItemBase) -> None: + """ + Called to remove a tab and its screen. + + :param tab: The tab to remove. + """ + tab_index = self.tabs.children.index(tab) + # if the tab is currently active we need to swap before removing it + if tab == self.screens.current_tab: + if not tab_index: + # account for the divider + swap_index = tab_index + 2 + else: + swap_index = tab_index - 2 + self.tabs.children[swap_index].on_release() + # self.screens.switch_screens(self.tabs.children[swap_index]) + # get the divider to the left if we can + if not tab_index: + divider_index = tab_index + 1 + else: + divider_index = tab_index - 1 + self.tabs.remove_widget(self.tabs.children[divider_index]) + self.tabs.remove_widget(tab) + self.screens.remove_widget(self.screens.get_screen(tab.text)) + def update_texts(self, dt): - for slide in self.tabs.carousel.slides: - if hasattr(slide, "fix_heights"): - slide.fix_heights() # TODO: remove this when Kivy fixes this upstream + if hasattr(self.screens.current_tab.content, "fix_heights"): + getattr(self.screens.current_tab.content, "fix_heights")() if self.ctx.server: self.title = self.base_title + " " + Utils.__version__ + \ f" | Connected to: {self.ctx.server_address} " \ diff --git a/pytest.ini b/pytest.ini index cd8fd8dfce..f050d58b70 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,5 +1,5 @@ [pytest] -python_files = test_*.py Test*.py # TODO: remove Test* once all worlds have been ported +python_files = test_*.py Test*.py **/test*/**/__init__.py # TODO: remove Test* once all worlds have been ported python_classes = Test python_functions = test testpaths = diff --git a/settings.py b/settings.py index 255c537fe0..48bc57f044 100644 --- a/settings.py +++ b/settings.py @@ -10,9 +10,10 @@ import sys import types import typing import warnings +from collections.abc import Iterator, Sequence from enum import IntEnum from threading import Lock -from typing import cast, Any, BinaryIO, ClassVar, Dict, Iterator, List, Optional, TextIO, Tuple, Union, TypeVar +from typing import cast, Any, BinaryIO, ClassVar, TextIO, TypeVar, Union __all__ = [ "get_settings", "fmt_doc", "no_gui", @@ -23,7 +24,7 @@ __all__ = [ no_gui = False skip_autosave = False -_world_settings_name_cache: Dict[str, str] = {} # TODO: cache on disk and update when worlds change +_world_settings_name_cache: dict[str, str] = {} # TODO: cache on disk and update when worlds change _world_settings_name_cache_updated = False _lock = Lock() @@ -53,7 +54,7 @@ def fmt_doc(cls: type, level: int) -> str: class Group: - _type_cache: ClassVar[Optional[Dict[str, Any]]] = None + _type_cache: ClassVar[dict[str, Any] | None] = None _dumping: bool = False _has_attr: bool = False _changed: bool = False @@ -106,7 +107,7 @@ class Group: self.__dict__.values())) @classmethod - def get_type_hints(cls) -> Dict[str, Any]: + def get_type_hints(cls) -> dict[str, Any]: """Returns resolved type hints for the class""" if cls._type_cache is None: if not cls.__annotations__ or not isinstance(next(iter(cls.__annotations__.values())), str): @@ -124,10 +125,10 @@ class Group: return self[key] return default - def items(self) -> List[Tuple[str, Any]]: + def items(self) -> list[tuple[str, Any]]: return [(key, getattr(self, key)) for key in self] - def update(self, dct: Dict[str, Any]) -> None: + def update(self, dct: dict[str, Any]) -> None: assert isinstance(dct, dict), f"{self.__class__.__name__}.update called with " \ f"{dct.__class__.__name__} instead of dict." @@ -196,7 +197,7 @@ class Group: warnings.warn(f"{self.__class__.__name__}.{k} " f"assigned from incompatible type {type(v).__name__}") - def as_dict(self, *args: str, downcast: bool = True) -> Dict[str, Any]: + def as_dict(self, *args: str, downcast: bool = True) -> dict[str, Any]: return { name: _to_builtin(cast(object, getattr(self, name))) if downcast else getattr(self, name) for name in self if not args or name in args @@ -211,7 +212,7 @@ class Group: f.write(f"{indent}{yaml_line}") @classmethod - def _dump_item(cls, name: Optional[str], attr: object, f: TextIO, level: int) -> None: + def _dump_item(cls, name: str | None, attr: object, f: TextIO, level: int) -> None: """Write a group, dict or sequence item to f, where attr can be a scalar or a collection""" # lazy construction of yaml Dumper to avoid loading Utils early @@ -223,7 +224,7 @@ class Group: def represent_mapping(self, tag: str, mapping: Any, flow_style: Any = None) -> MappingNode: from yaml import ScalarNode res: MappingNode = super().represent_mapping(tag, mapping, flow_style) - pairs = cast(List[Tuple[ScalarNode, Any]], res.value) + pairs = cast(list[tuple[ScalarNode, Any]], res.value) for k, v in pairs: k.style = None # remove quotes from keys return res @@ -329,9 +330,9 @@ class Path(str): """Marks the file as required and opens a file browser when missing""" is_exe: bool = False """Special cross-platform handling for executables""" - description: Optional[str] = None + description: str | None = None """Title to display when browsing for the file""" - copy_to: Optional[str] = None + copy_to: str | None = None """If not None, copy to AP folder instead of linking it""" @classmethod @@ -339,7 +340,7 @@ class Path(str): """Overload and raise to validate input files from browse""" pass - def browse(self: T, **kwargs: Any) -> Optional[T]: + def browse(self: T, **kwargs: Any) -> T | None: """Opens a file browser to search for the file""" raise NotImplementedError(f"Please use a subclass of Path for {self.__class__.__name__}") @@ -369,12 +370,12 @@ class _LocalPath(str): class FilePath(Path): # path to a file - md5s: ClassVar[List[Union[str, bytes]]] = [] + md5s: ClassVar[list[str | bytes]] = [] """MD5 hashes for default validator.""" def browse(self: T, - filetypes: Optional[typing.Sequence[typing.Tuple[str, typing.Sequence[str]]]] = None, **kwargs: Any)\ - -> Optional[T]: + filetypes: Sequence[tuple[str, Sequence[str]]] | None = None, **kwargs: Any)\ + -> T | None: from Utils import open_filename, is_windows if not filetypes: if self.is_exe: @@ -439,7 +440,7 @@ class FilePath(Path): class FolderPath(Path): # path to a folder - def browse(self: T, **kwargs: Any) -> Optional[T]: + def browse(self: T, **kwargs: Any) -> T | None: from Utils import open_directory res = open_directory(f"Select {self.description or self.__class__.__name__}", self) if res: @@ -597,16 +598,16 @@ class ServerOptions(Group): OFF = 0 ON = 1 - host: Optional[str] = None + host: str | None = None port: int = 38281 - password: Optional[str] = None - multidata: Optional[str] = None - savefile: Optional[str] = None + password: str | None = None + multidata: str | None = None + savefile: str | None = None disable_save: bool = False loglevel: str = "info" logtime: bool = False - server_password: Optional[ServerPassword] = None - disable_item_cheat: Union[DisableItemCheat, bool] = False + server_password: ServerPassword | None = None + disable_item_cheat: DisableItemCheat | bool = False location_check_points: LocationCheckPoints = LocationCheckPoints(1) hint_cost: HintCost = HintCost(10) release_mode: ReleaseMode = ReleaseMode("auto") @@ -702,7 +703,7 @@ does nothing if not found """ sni_path: SNIPath = SNIPath("SNI") - snes_rom_start: Union[SnesRomStart, bool] = True + snes_rom_start: SnesRomStart | bool = True class BizHawkClientOptions(Group): @@ -721,7 +722,7 @@ class BizHawkClientOptions(Group): """ emuhawk_path: EmuHawkPath = EmuHawkPath(None) - rom_start: Union[RomStart, bool] = True + rom_start: RomStart | bool = True # Top-level group with lazy loading of worlds @@ -733,7 +734,7 @@ class Settings(Group): sni_options: SNIOptions = SNIOptions() bizhawkclient_options: BizHawkClientOptions = BizHawkClientOptions() - _filename: Optional[str] = None + _filename: str | None = None def __getattribute__(self, key: str) -> Any: if key.startswith("_") or key in self.__class__.__dict__: @@ -753,7 +754,12 @@ class Settings(Group): return super().__getattribute__(key) # directly import world and grab settings class world_mod, world_cls_name = _world_settings_name_cache[key].rsplit(".", 1) - world = cast(type, getattr(__import__(world_mod, fromlist=[world_cls_name]), world_cls_name)) + try: + world = cast(type, getattr(__import__(world_mod, fromlist=[world_cls_name]), world_cls_name)) + except AttributeError: + import warnings + warnings.warn(f"World {world_cls_name} failed to initialize properly.") + return super().__getattribute__(key) assert getattr(world, "settings_key") == key try: cls_or_name = world.__annotations__["settings"] @@ -787,7 +793,7 @@ class Settings(Group): return super().__getattribute__(key) - def __init__(self, location: Optional[str]): # change to PathLike[str] once we drop 3.8? + def __init__(self, location: str | None): # change to PathLike[str] once we drop 3.8? super().__init__() if location: from Utils import parse_yaml @@ -821,7 +827,7 @@ class Settings(Group): import atexit atexit.register(autosave) - def save(self, location: Optional[str] = None) -> None: # as above + def save(self, location: str | None = None) -> None: # as above from Utils import parse_yaml location = location or self._filename assert location, "No file specified" @@ -854,7 +860,7 @@ class Settings(Group): super().dump(f, level) @property - def filename(self) -> Optional[str]: + def filename(self) -> str | None: return self._filename @@ -867,7 +873,7 @@ def get_settings() -> Settings: if not res: from Utils import user_path, local_path filenames = ("options.yaml", "host.yaml") - locations: List[str] = [] + locations: list[str] = [] if os.path.join(os.getcwd()) != local_path(): locations += filenames # use files from cwd only if it's not the local_path locations += [user_path(filename) for filename in filenames] diff --git a/setup.py b/setup.py index 8d415932d0..98b9dd604a 100644 --- a/setup.py +++ b/setup.py @@ -1,25 +1,28 @@ import base64 import datetime +import io +import json import os import platform import shutil +import subprocess import sys import sysconfig +import threading +import urllib.error +import urllib.request import warnings import zipfile -import urllib.request -import io -import json -import threading -import subprocess - +from collections.abc import Iterable, Sequence from hashlib import sha3_512 from pathlib import Path -from typing import Dict, Iterable, List, Optional, Sequence, Set, Tuple, Union + + +SNI_VERSION = "v0.0.100" # change back to "latest" once tray icon issues are fixed # This is a bit jank. We need cx-Freeze to be able to run anything from this script, so install it -requirement = 'cx-Freeze==8.0.0' +requirement = 'cx-Freeze==8.4.0' try: import pkg_resources try: @@ -27,7 +30,7 @@ try: install_cx_freeze = False except pkg_resources.ResolutionError: install_cx_freeze = True -except ImportError: +except (AttributeError, ImportError): install_cx_freeze = True pkg_resources = None # type: ignore[assignment] @@ -59,14 +62,10 @@ from Utils import version_tuple, is_windows, is_linux from Cython.Build import cythonize -# On Python < 3.10 LogicMixin is not currently supported. -non_apworlds: Set[str] = { +non_apworlds: set[str] = { "A Link to the Past", "Adventure", - "ArchipIDLE", "Archipelago", - "Clique", - "Final Fantasy", "Lufia II Ancient Cave", "Meritous", "Ocarina of Time", @@ -78,9 +77,6 @@ non_apworlds: Set[str] = { "Wargroove", } -# LogicMixin is broken before 3.10 import revamp -if sys.version_info < (3,10): - non_apworlds.add("Hollow Knight") def download_SNI() -> None: print("Updating SNI") @@ -93,7 +89,8 @@ def download_SNI() -> None: machine_name = platform.machine().lower() # force amd64 on macos until we have universal2 sni, otherwise resolve to GOARCH machine_name = "universal" if platform_name == "darwin" else machine_to_go.get(machine_name, machine_name) - with urllib.request.urlopen("https://api.github.com/repos/alttpo/sni/releases/latest") as request: + sni_version_ref = "latest" if SNI_VERSION == "latest" else f"tags/{SNI_VERSION}" + with urllib.request.urlopen(f"https://api.github.com/repos/alttpo/SNI/releases/{sni_version_ref}") as request: data = json.load(request) files = data["assets"] @@ -107,8 +104,8 @@ def download_SNI() -> None: # prefer "many" builds if "many" in download_url: break - # prefer the correct windows or windows7 build - if platform_name == "windows" and ("windows7" in download_url) == (sys.version_info < (3, 9)): + # prefer non-windows7 builds to get up-to-date dependencies + if platform_name == "windows" and "windows7" not in download_url: break if source_url and source_url.endswith(".zip"): @@ -147,15 +144,16 @@ def download_SNI() -> None: print(f"No SNI found for system spec {platform_name} {machine_name}") -signtool: Optional[str] -if os.path.exists("X:/pw.txt"): - print("Using signtool") - with open("X:/pw.txt", encoding="utf-8-sig") as f: - pw = f.read() - signtool = r'signtool sign /f X:/_SITS_Zertifikat_.pfx /p "' + pw + \ - r'" /fd sha256 /td sha256 /tr http://timestamp.digicert.com/ ' -else: - signtool = None +signtool: str | None = None +try: + with urllib.request.urlopen('http://192.168.206.4:12345/connector/status') as response: + html = response.read() + if b"status=OK\n" in html: + signtool = (r'signtool sign /sha1 6df76fe776b82869a5693ddcb1b04589cffa6faf /fd sha256 /td sha256 ' + r'/tr http://timestamp.digicert.com/ ') + print("Using signtool") +except (ConnectionError, TimeoutError, urllib.error.URLError) as e: + pass build_platform = sysconfig.get_platform() @@ -200,12 +198,13 @@ extra_libs = ["libssl.so", "libcrypto.so"] if is_linux else [] def remove_sprites_from_folder(folder: Path) -> None: - for file in os.listdir(folder): - if file != ".gitignore": - os.remove(folder / file) + if os.path.isdir(folder): + for file in os.listdir(folder): + if file != ".gitignore": + os.remove(folder / file) -def _threaded_hash(filepath: Union[str, Path]) -> str: +def _threaded_hash(filepath: str | Path) -> str: hasher = sha3_512() hasher.update(open(filepath, "rb").read()) return base64.b85encode(hasher.digest()).decode() @@ -255,7 +254,7 @@ class BuildExeCommand(cx_Freeze.command.build_exe.build_exe): self.libfolder = Path(self.buildfolder, "lib") self.library = Path(self.libfolder, "library.zip") - def installfile(self, path: Path, subpath: Optional[Union[str, Path]] = None, keep_content: bool = False) -> None: + def installfile(self, path: Path, subpath: str | Path | None = None, keep_content: bool = False) -> None: folder = self.buildfolder if subpath: folder /= subpath @@ -372,25 +371,36 @@ class BuildExeCommand(cx_Freeze.command.build_exe.build_exe): os.makedirs(self.buildfolder / "Players" / "Templates", exist_ok=True) from Options import generate_yaml_templates from worlds.AutoWorld import AutoWorldRegister + from worlds.Files import APWorldContainer + from Utils import version assert not non_apworlds - set(AutoWorldRegister.world_types), \ f"Unknown world {non_apworlds - set(AutoWorldRegister.world_types)} designated for .apworld" - folders_to_remove: List[str] = [] - disabled_worlds_folder = "worlds_disabled" - for entry in os.listdir(disabled_worlds_folder): - if os.path.isdir(os.path.join(disabled_worlds_folder, entry)): - folders_to_remove.append(entry) + folders_to_remove: list[str] = [] generate_yaml_templates(self.buildfolder / "Players" / "Templates", False) for worldname, worldtype in AutoWorldRegister.world_types.items(): if worldname not in non_apworlds: file_name = os.path.split(os.path.dirname(worldtype.__file__))[1] world_directory = self.libfolder / "worlds" / file_name + if os.path.isfile(world_directory / "archipelago.json"): + manifest = json.load(open(world_directory / "archipelago.json")) + else: + manifest = {} # this method creates an apworld that cannot be moved to a different OS or minor python version, # which should be ok - with zipfile.ZipFile(self.libfolder / "worlds" / (file_name + ".apworld"), "x", zipfile.ZIP_DEFLATED, + zip_path = self.libfolder / "worlds" / (file_name + ".apworld") + apworld = APWorldContainer(str(zip_path)) + apworld.minimum_ap_version = version + apworld.maximum_ap_version = version + apworld.game = worldtype.game + manifest.update(apworld.get_manifest()) + apworld.manifest_path = f"{file_name}/archipelago.json" + with zipfile.ZipFile(zip_path, "x", zipfile.ZIP_DEFLATED, compresslevel=9) as zf: for path in world_directory.rglob("*.*"): relative_path = os.path.join(*path.parts[path.parts.index("worlds")+1:]) - zf.write(path, relative_path) + if not relative_path.endswith("archipelago.json"): + zf.write(path, relative_path) + zf.writestr(apworld.manifest_path, json.dumps(manifest)) folders_to_remove.append(file_name) shutil.rmtree(world_directory) shutil.copyfile("meta.yaml", self.buildfolder / "Players" / "Templates" / "meta.yaml") @@ -415,13 +425,14 @@ class BuildExeCommand(cx_Freeze.command.build_exe.build_exe): os.system(signtool + os.path.join(self.buildfolder, "lib", "worlds", "oot", "data", *exe_path)) remove_sprites_from_folder(self.buildfolder / "data" / "sprites" / "alttpr") + remove_sprites_from_folder(self.buildfolder / "data" / "sprites" / "alttp" / "remote") self.create_manifest() if is_windows: # Inno setup stuff with open("setup.ini", "w") as f: - min_supported_windows = "6.2.9200" if sys.version_info > (3, 9) else "6.0.6000" + min_supported_windows = "6.2.9200" f.write(f"[Data]\nsource_path={self.buildfolder}\nmin_windows={min_supported_windows}\n") with open("installdelete.iss", "w") as f: f.writelines("Type: filesandordirs; Name: \"{app}\\lib\\worlds\\"+world_directory+"\"\n" @@ -446,12 +457,12 @@ class AppImageCommand(setuptools.Command): ("app-exec=", None, "The application to run inside the image."), ("yes", "y", 'Answer "yes" to all questions.'), ] - build_folder: Optional[Path] - dist_file: Optional[Path] - app_dir: Optional[Path] + build_folder: Path | None + dist_file: Path | None + app_dir: Path | None app_name: str - app_exec: Optional[Path] - app_icon: Optional[Path] # source file + app_exec: Path | None + app_icon: Path | None # source file app_id: str # lower case name, used for icon and .desktop yes: bool @@ -488,12 +499,12 @@ tmp="${{exe#*/}}" if [ ! "${{#tmp}}" -lt "${{#exe}}" ]; then exe="{default_exe.parent}/$exe" fi -export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$APPDIR/{default_exe.parent}/lib" +export LD_LIBRARY_PATH="${{LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}}$APPDIR/{default_exe.parent}/lib" $APPDIR/$exe "$@" """) launcher_filename.chmod(0o755) - def install_icon(self, src: Path, name: Optional[str] = None, symlink: Optional[Path] = None) -> None: + def install_icon(self, src: Path, name: str | None = None, symlink: Path | None = None) -> None: assert self.app_dir, "Invalid app_dir" try: from PIL import Image @@ -556,7 +567,7 @@ $APPDIR/$exe "$@" subprocess.call(f'ARCH={build_arch} ./appimagetool -n "{self.app_dir}" "{self.dist_file}"', shell=True) -def find_libs(*args: str) -> Sequence[Tuple[str, str]]: +def find_libs(*args: str) -> Sequence[tuple[str, str]]: """Try to find system libraries to be included.""" if not args: return [] @@ -564,7 +575,7 @@ def find_libs(*args: str) -> Sequence[Tuple[str, str]]: arch = build_arch.replace('_', '-') libc = 'libc6' # we currently don't support musl - def parse(line: str) -> Tuple[Tuple[str, str, str], str]: + def parse(line: str) -> tuple[tuple[str, str, str], str]: lib, path = line.strip().split(' => ') lib, typ = lib.split(' ', 1) for test_arch in ('x86-64', 'i386', 'aarch64'): @@ -589,8 +600,8 @@ def find_libs(*args: str) -> Sequence[Tuple[str, str]]: k: v for k, v in (parse(line) for line in data if "=>" in line) } - def find_lib(lib: str, arch: str, libc: str) -> Optional[str]: - cache: Dict[Tuple[str, str, str], str] = getattr(find_libs, "cache") + def find_lib(lib: str, arch: str, libc: str) -> str | None: + cache: dict[tuple[str, str, str], str] = getattr(find_libs, "cache") for k, v in cache.items(): if k == (lib, arch, libc): return v @@ -599,7 +610,7 @@ def find_libs(*args: str) -> Sequence[Tuple[str, str]]: return v return None - res: List[Tuple[str, str]] = [] + res: list[tuple[str, str]] = [] for arg in args: # try exact match, empty libc, empty arch, empty arch and libc file = find_lib(arg, arch, libc) diff --git a/test/TestBase.py b/test/TestBase.py deleted file mode 100644 index bfd92346d3..0000000000 --- a/test/TestBase.py +++ /dev/null @@ -1,3 +0,0 @@ -from .bases import TestBase, WorldTestBase -from warnings import warn -warn("TestBase was renamed to bases", DeprecationWarning) diff --git a/test/bases.py b/test/bases.py index a3ea233174..dd93ca6452 100644 --- a/test/bases.py +++ b/test/bases.py @@ -9,98 +9,7 @@ from test.general import gen_steps from worlds import AutoWorld from worlds.AutoWorld import World, call_all -from BaseClasses import Location, MultiWorld, CollectionState, ItemClassification, Item -from worlds.alttp.Items import item_factory - - -class TestBase(unittest.TestCase): - multiworld: MultiWorld - _state_cache = {} - - def get_state(self, items): - if (self.multiworld, tuple(items)) in self._state_cache: - return self._state_cache[self.multiworld, tuple(items)] - state = CollectionState(self.multiworld) - for item in items: - item.classification = ItemClassification.progression - state.collect(item, prevent_sweep=True) - state.sweep_for_advancements() - state.update_reachable_regions(1) - self._state_cache[self.multiworld, tuple(items)] = state - return state - - def get_path(self, state, region): - def flist_to_iter(node): - while node: - value, node = node - yield value - - from itertools import zip_longest - reversed_path_as_flist = state.path.get(region, (region, None)) - string_path_flat = reversed(list(map(str, flist_to_iter(reversed_path_as_flist)))) - # Now we combine the flat string list into (region, exit) pairs - pathsiter = iter(string_path_flat) - pathpairs = zip_longest(pathsiter, pathsiter) - return list(pathpairs) - - def run_location_tests(self, access_pool): - for i, (location, access, *item_pool) in enumerate(access_pool): - items = item_pool[0] - all_except = item_pool[1] if len(item_pool) > 1 else None - state = self._get_items(item_pool, all_except) - path = self.get_path(state, self.multiworld.get_location(location, 1).parent_region) - with self.subTest(msg="Reach Location", location=location, access=access, items=items, - all_except=all_except, path=path, entry=i): - - self.assertEqual(self.multiworld.get_location(location, 1).can_reach(state), access, - f"failed {self.multiworld.get_location(location, 1)} with: {item_pool}") - - # check for partial solution - if not all_except and access: # we are not supposed to be able to reach location with partial inventory - for missing_item in item_pool[0]: - with self.subTest(msg="Location reachable without required item", location=location, - items=item_pool[0], missing_item=missing_item, entry=i): - state = self._get_items_partial(item_pool, missing_item) - - self.assertEqual(self.multiworld.get_location(location, 1).can_reach(state), False, - f"failed {self.multiworld.get_location(location, 1)}: succeeded with " - f"{missing_item} removed from: {item_pool}") - - def run_entrance_tests(self, access_pool): - for i, (entrance, access, *item_pool) in enumerate(access_pool): - items = item_pool[0] - all_except = item_pool[1] if len(item_pool) > 1 else None - state = self._get_items(item_pool, all_except) - path = self.get_path(state, self.multiworld.get_entrance(entrance, 1).parent_region) - with self.subTest(msg="Reach Entrance", entrance=entrance, access=access, items=items, - all_except=all_except, path=path, entry=i): - - self.assertEqual(self.multiworld.get_entrance(entrance, 1).can_reach(state), access) - - # check for partial solution - if not all_except and access: # we are not supposed to be able to reach location with partial inventory - for missing_item in item_pool[0]: - with self.subTest(msg="Entrance reachable without required item", entrance=entrance, - items=item_pool[0], missing_item=missing_item, entry=i): - state = self._get_items_partial(item_pool, missing_item) - self.assertEqual(self.multiworld.get_entrance(entrance, 1).can_reach(state), False, - f"failed {self.multiworld.get_entrance(entrance, 1)} with: {item_pool}") - - def _get_items(self, item_pool, all_except): - if all_except and len(all_except) > 0: - items = self.multiworld.itempool[:] - items = [item for item in items if - item.name not in all_except and not ("Bottle" in item.name and "AnyBottle" in all_except)] - items.extend(item_factory(item_pool[0], self.multiworld.worlds[1])) - else: - items = item_factory(item_pool[0], self.multiworld.worlds[1]) - return self.get_state(items) - - def _get_items_partial(self, item_pool, missing_item): - new_items = item_pool[0].copy() - new_items.remove(missing_item) - items = item_factory(new_items, self.multiworld.worlds[1]) - return self.get_state(items) +from BaseClasses import Location, MultiWorld, CollectionState, Item class WorldTestBase(unittest.TestCase): @@ -159,7 +68,6 @@ class WorldTestBase(unittest.TestCase): self.multiworld.game[self.player] = self.game self.multiworld.player_name = {self.player: "Tester"} self.multiworld.set_seed(seed) - self.multiworld.state = CollectionState(self.multiworld) random.seed(self.multiworld.seed) self.multiworld.seed_name = get_seed_name(random) # only called to get same RNG progression as Generate.py args = Namespace() @@ -168,6 +76,7 @@ class WorldTestBase(unittest.TestCase): 1: option.from_any(self.options.get(name, option.default)) }) self.multiworld.set_options(args) + self.multiworld.state = CollectionState(self.multiworld) self.world = self.multiworld.worlds[self.player] for step in gen_steps: call_all(self.multiworld, step) diff --git a/test/benchmark/locations.py b/test/benchmark/locations.py index 857e188236..0e496cd3ee 100644 --- a/test/benchmark/locations.py +++ b/test/benchmark/locations.py @@ -29,14 +29,9 @@ def run_locations_benchmark(): rule_iterations: int = 100_000 - if sys.version_info >= (3, 9): - @staticmethod - def format_times_from_counter(counter: collections.Counter[str], top: int = 5) -> str: - return "\n".join(f" {time:.4f} in {name}" for name, time in counter.most_common(top)) - else: - @staticmethod - def format_times_from_counter(counter: collections.Counter, top: int = 5) -> str: - return "\n".join(f" {time:.4f} in {name}" for name, time in counter.most_common(top)) + @staticmethod + def format_times_from_counter(counter: collections.Counter[str], top: int = 5) -> str: + return "\n".join(f" {time:.4f} in {name}" for name, time in counter.most_common(top)) def location_test(self, test_location: Location, state: CollectionState, state_name: str) -> float: with TimeIt(f"{test_location.game} {self.rule_iterations} " @@ -59,13 +54,13 @@ def run_locations_benchmark(): multiworld.game[1] = game multiworld.player_name = {1: "Tester"} multiworld.set_seed(0) - multiworld.state = CollectionState(multiworld) args = argparse.Namespace() for name, option in AutoWorld.AutoWorldRegister.world_types[game].options_dataclass.type_hints.items(): setattr(args, name, { 1: option.from_any(getattr(option, "default")) }) multiworld.set_options(args) + multiworld.state = CollectionState(multiworld) gc.collect() for step in self.gen_steps: diff --git a/test/benchmark/match.py b/test/benchmark/match.py new file mode 100644 index 0000000000..ccb600c0ba --- /dev/null +++ b/test/benchmark/match.py @@ -0,0 +1,66 @@ +"""Micro benchmark comparing match as "switch" with if-elif and dict access""" + +from timeit import timeit + + +def make_match(count: int) -> str: + code = f"for val in range({count}):\n match val:\n" + for n in range(count): + m = n + 1 + code += f" case {n}:\n" + code += f" res = {m}\n" + return code + + +def make_elif(count: int) -> str: + code = f"for val in range({count}):\n" + for n in range(count): + m = n + 1 + code += f" {'' if n == 0 else 'el'}if val == {n}:\n" + code += f" res = {m}\n" + return code + + +def make_dict(count: int, mode: str) -> str: + if mode == "value": + code = "dct = {\n" + for n in range(count): + m = n + 1 + code += f" {n}: {m},\n" + code += "}\n" + code += f"for val in range({count}):\n res = dct[val]" + return code + elif mode == "call": + code = "" + for n in range(count): + m = n + 1 + code += f"def func{n}():\n val = {m}\n\n" + code += "dct = {\n" + for n in range(count): + code += f" {n}: func{n},\n" + code += "}\n" + code += f"for val in range({count}):\n dct[val]()" + return code + return "" + + +def timeit_best_of_5(stmt: str, setup: str = "pass") -> float: + """ + Benchmark some code, returning the best of 5 runs. + :param stmt: Code to benchmark + :param setup: Optional code to set up environment + :return: Time taken in microseconds + """ + return min(timeit(stmt, setup, number=10000, globals={}) for _ in range(5)) * 100 + + +def main() -> None: + for count in (3, 5, 8, 10, 20, 30): + print(f"value of {count:-2} with match: {timeit_best_of_5(make_match(count)) / count:.3f} us") + print(f"value of {count:-2} with elif: {timeit_best_of_5(make_elif(count)) / count:.3f} us") + print(f"value of {count:-2} with dict: {timeit_best_of_5(make_dict(count, 'value')) / count:.3f} us") + print(f"call of {count:-2} with dict: {timeit_best_of_5(make_dict(count, 'call')) / count:.3f} us") + + +if __name__ == "__main__": + main() diff --git a/test/general/__init__.py b/test/general/__init__.py index 6c4d5092cf..53f77a516a 100644 --- a/test/general/__init__.py +++ b/test/general/__init__.py @@ -1,9 +1,9 @@ from argparse import Namespace -from typing import List, Optional, Tuple, Type, Union +from typing import Any, List, Optional, Tuple, Type from BaseClasses import CollectionState, Item, ItemClassification, Location, MultiWorld, Region from worlds import network_data_package -from worlds.AutoWorld import World, call_all +from worlds.AutoWorld import World, WebWorld, call_all gen_steps = ( "generate_early", @@ -17,7 +17,7 @@ gen_steps = ( def setup_solo_multiworld( - world_type: Type[World], steps: Tuple[str, ...] = gen_steps, seed: Optional[int] = None + world_type: Type[World], steps: Tuple[str, ...] = gen_steps, seed: Optional[int] = None ) -> MultiWorld: """ Creates a multiworld with a single player of `world_type`, sets default options, and calls provided gen steps. @@ -31,8 +31,8 @@ def setup_solo_multiworld( return setup_multiworld(world_type, steps, seed) -def setup_multiworld(worlds: Union[List[Type[World]], Type[World]], steps: Tuple[str, ...] = gen_steps, - seed: Optional[int] = None) -> MultiWorld: +def setup_multiworld(worlds: list[type[World]] | type[World], steps: tuple[str, ...] = gen_steps, + seed: int | None = None, options: dict[str, Any] | list[dict[str, Any]] = None) -> MultiWorld: """ Creates a multiworld with a player for each provided world type, allowing duplicates, setting default options, and calling the provided gen steps. @@ -40,33 +40,45 @@ def setup_multiworld(worlds: Union[List[Type[World]], Type[World]], steps: Tuple :param worlds: Type/s of worlds to generate a multiworld for :param steps: Gen steps that should be called before returning. Default calls through pre_fill :param seed: The seed to be used when creating this multiworld + :param options: Options to set on each world. If just one dict of options is passed, it will be used for all worlds. :return: The generated multiworld """ if not isinstance(worlds, list): worlds = [worlds] + + if options is None: + options = [{}] * len(worlds) + elif not isinstance(options, list): + options = [options] * len(worlds) + players = len(worlds) multiworld = MultiWorld(players) multiworld.game = {player: world_type.game for player, world_type in enumerate(worlds, 1)} multiworld.player_name = {player: f"Tester{player}" for player in multiworld.player_ids} multiworld.set_seed(seed) - multiworld.state = CollectionState(multiworld) args = Namespace() - for player, world_type in enumerate(worlds, 1): + for player, (world_type, option_overrides) in enumerate(zip(worlds, options), 1): for key, option in world_type.options_dataclass.type_hints.items(): updated_options = getattr(args, key, {}) - updated_options[player] = option.from_any(option.default) + updated_options[player] = option.from_any(option_overrides.get(key, option.default)) setattr(args, key, updated_options) multiworld.set_options(args) + multiworld.state = CollectionState(multiworld) for step in steps: call_all(multiworld, step) return multiworld +class TestWebWorld(WebWorld): + tutorials = [] + + class TestWorld(World): game = f"Test Game" item_name_to_id = {} location_name_to_id = {} hidden = True + web = TestWebWorld() # add our test world to the data package, so we can test it later diff --git a/test/general/test_entrance_rando.py b/test/general/test_entrance_rando.py index 65853dfc8b..8a697030e8 100644 --- a/test/general/test_entrance_rando.py +++ b/test/general/test_entrance_rando.py @@ -69,11 +69,9 @@ class TestEntranceLookup(unittest.TestCase): exits_set = set([ex for region in multiworld.get_regions(1) for ex in region.exits if not ex.connected_region]) - lookup = EntranceLookup(multiworld.worlds[1].random, coupled=True, usable_exits=exits_set) er_targets = [entrance for region in multiworld.get_regions(1) for entrance in region.entrances if not entrance.parent_region] - for entrance in er_targets: - lookup.add(entrance) + lookup = EntranceLookup(multiworld.worlds[1].random, coupled=True, usable_exits=exits_set, targets=er_targets) retrieved_targets = lookup.get_targets([ERTestGroups.TOP, ERTestGroups.BOTTOM], False, False) @@ -92,11 +90,9 @@ class TestEntranceLookup(unittest.TestCase): exits_set = set([ex for region in multiworld.get_regions(1) for ex in region.exits if not ex.connected_region]) - lookup = EntranceLookup(multiworld.worlds[1].random, coupled=True, usable_exits=exits_set) er_targets = [entrance for region in multiworld.get_regions(1) for entrance in region.entrances if not entrance.parent_region] - for entrance in er_targets: - lookup.add(entrance) + lookup = EntranceLookup(multiworld.worlds[1].random, coupled=True, usable_exits=exits_set, targets=er_targets) retrieved_targets = lookup.get_targets([ERTestGroups.TOP, ERTestGroups.BOTTOM], False, True) @@ -112,12 +108,10 @@ class TestEntranceLookup(unittest.TestCase): for ex in region.exits if not ex.connected_region and ex.name != "region20_right" and ex.name != "region21_left"]) - lookup = EntranceLookup(multiworld.worlds[1].random, coupled=True, usable_exits=exits_set) er_targets = [entrance for region in multiworld.get_regions(1) for entrance in region.entrances if not entrance.parent_region and entrance.name != "region20_right" and entrance.name != "region21_left"] - for entrance in er_targets: - lookup.add(entrance) + lookup = EntranceLookup(multiworld.worlds[1].random, coupled=True, usable_exits=exits_set, targets=er_targets) # region 20 is the bottom left corner of the grid, and therefore only has a right entrance from region 21 # and a top entrance from region 15; since we've told lookup to ignore the right entrance from region 21, # the top entrance from region 15 should be considered a dead-end @@ -129,6 +123,56 @@ class TestEntranceLookup(unittest.TestCase): self.assertTrue(dead_end in lookup.dead_ends) self.assertEqual(len(lookup.dead_ends), 1) + def test_find_target_by_name(self): + """Tests that find_target can find the correct target by name only""" + multiworld = generate_test_multiworld() + generate_disconnected_region_grid(multiworld, 5) + exits_set = set([ex for region in multiworld.get_regions(1) + for ex in region.exits if not ex.connected_region]) + + er_targets = [entrance for region in multiworld.get_regions(1) + for entrance in region.entrances if not entrance.parent_region] + lookup = EntranceLookup(multiworld.worlds[1].random, coupled=True, usable_exits=exits_set, targets=er_targets) + + target = lookup.find_target("region0_right") + self.assertEqual(target.name, "region0_right") + self.assertEqual(target.randomization_group, ERTestGroups.RIGHT) + self.assertIsNone(lookup.find_target("nonexistant")) + + def test_find_target_by_name_and_group(self): + """Tests that find_target can find the correct target by name and group""" + multiworld = generate_test_multiworld() + generate_disconnected_region_grid(multiworld, 5) + exits_set = set([ex for region in multiworld.get_regions(1) + for ex in region.exits if not ex.connected_region]) + + er_targets = [entrance for region in multiworld.get_regions(1) + for entrance in region.entrances if not entrance.parent_region] + lookup = EntranceLookup(multiworld.worlds[1].random, coupled=True, usable_exits=exits_set, targets=er_targets) + + target = lookup.find_target("region0_right", ERTestGroups.RIGHT) + self.assertEqual(target.name, "region0_right") + self.assertEqual(target.randomization_group, ERTestGroups.RIGHT) + # wrong group + self.assertIsNone(lookup.find_target("region0_right", ERTestGroups.LEFT)) + + def test_find_target_by_name_and_group_and_category(self): + """Tests that find_target can find the correct target by name, group, and dead-endedness""" + multiworld = generate_test_multiworld() + generate_disconnected_region_grid(multiworld, 5) + exits_set = set([ex for region in multiworld.get_regions(1) + for ex in region.exits if not ex.connected_region]) + + er_targets = [entrance for region in multiworld.get_regions(1) + for entrance in region.entrances if not entrance.parent_region] + lookup = EntranceLookup(multiworld.worlds[1].random, coupled=True, usable_exits=exits_set, targets=er_targets) + + target = lookup.find_target("region0_right", ERTestGroups.RIGHT, False) + self.assertEqual(target.name, "region0_right") + self.assertEqual(target.randomization_group, ERTestGroups.RIGHT) + # wrong deadendedness + self.assertIsNone(lookup.find_target("region0_right", ERTestGroups.RIGHT, True)) + class TestBakeTargetGroupLookup(unittest.TestCase): def test_lookup_generation(self): multiworld = generate_test_multiworld() @@ -265,12 +309,12 @@ class TestRandomizeEntrances(unittest.TestCase): generate_disconnected_region_grid(multiworld, 5) seen_placement_count = 0 - def verify_coupled(_: ERPlacementState, placed_entrances: list[Entrance]): + def verify_coupled(_: ERPlacementState, placed_exits: list[Entrance], placed_targets: list[Entrance]): nonlocal seen_placement_count - seen_placement_count += len(placed_entrances) - self.assertEqual(2, len(placed_entrances)) - self.assertEqual(placed_entrances[0].parent_region, placed_entrances[1].connected_region) - self.assertEqual(placed_entrances[1].parent_region, placed_entrances[0].connected_region) + seen_placement_count += len(placed_exits) + self.assertEqual(2, len(placed_exits)) + self.assertEqual(placed_exits[0].parent_region, placed_exits[1].connected_region) + self.assertEqual(placed_exits[1].parent_region, placed_exits[0].connected_region) result = randomize_entrances(multiworld.worlds[1], True, directionally_matched_group_lookup, on_connect=verify_coupled) @@ -313,10 +357,10 @@ class TestRandomizeEntrances(unittest.TestCase): generate_disconnected_region_grid(multiworld, 5) seen_placement_count = 0 - def verify_uncoupled(state: ERPlacementState, placed_entrances: list[Entrance]): + def verify_uncoupled(state: ERPlacementState, placed_exits: list[Entrance], placed_targets: list[Entrance]): nonlocal seen_placement_count - seen_placement_count += len(placed_entrances) - self.assertEqual(1, len(placed_entrances)) + seen_placement_count += len(placed_exits) + self.assertEqual(1, len(placed_exits)) result = randomize_entrances(multiworld.worlds[1], False, directionally_matched_group_lookup, on_connect=verify_uncoupled) diff --git a/test/general/test_entrances.py b/test/general/test_entrances.py index 88362c8fa6..79025534ac 100644 --- a/test/general/test_entrances.py +++ b/test/general/test_entrances.py @@ -48,13 +48,14 @@ class TestBase(unittest.TestCase): original_get_all_state = multiworld.get_all_state - def patched_get_all_state(use_cache: bool, allow_partial_entrances: bool = False): + def patched_get_all_state(use_cache: bool | None = None, allow_partial_entrances: bool = False, + **kwargs): self.assertTrue(allow_partial_entrances, ( "Before the connect_entrances step finishes, other worlds might still have partial entrances. " "As such, any call to get_all_state must use allow_partial_entrances = True." )) - return original_get_all_state(use_cache, allow_partial_entrances) + return original_get_all_state(use_cache, allow_partial_entrances, **kwargs) multiworld.get_all_state = patched_get_all_state diff --git a/test/general/test_fill.py b/test/general/test_fill.py index c8bcec9581..bdc38d7913 100644 --- a/test/general/test_fill.py +++ b/test/general/test_fill.py @@ -603,6 +603,28 @@ class TestDistributeItemsRestrictive(unittest.TestCase): self.assertTrue(player3.locations[2].item.advancement) self.assertTrue(player3.locations[3].item.advancement) + def test_deprioritized_does_not_land_on_priority(self): + multiworld = generate_test_multiworld(1) + player1 = generate_player_data(multiworld, 1, 2, prog_item_count=2) + + player1.prog_items[0].classification |= ItemClassification.deprioritized + player1.locations[0].progress_type = LocationProgressType.PRIORITY + + distribute_items_restrictive(multiworld) + + self.assertFalse(player1.locations[0].item.deprioritized) + + def test_deprioritized_still_goes_on_priority_ahead_of_filler(self): + multiworld = generate_test_multiworld(1) + player1 = generate_player_data(multiworld, 1, 2, prog_item_count=1, basic_item_count=1) + + player1.prog_items[0].classification |= ItemClassification.deprioritized + player1.locations[0].progress_type = LocationProgressType.PRIORITY + + distribute_items_restrictive(multiworld) + + self.assertTrue(player1.locations[0].item.advancement) + def test_can_remove_locations_in_fill_hook(self): """Test that distribute_items_restrictive calls the fill hook and allows for item and location removal""" multiworld = generate_test_multiworld() diff --git a/test/general/test_implemented.py b/test/general/test_implemented.py index b74f82b738..de432e3690 100644 --- a/test/general/test_implemented.py +++ b/test/general/test_implemented.py @@ -1,7 +1,7 @@ import unittest from Fill import distribute_items_restrictive -from NetUtils import encode +from NetUtils import convert_to_base_types from worlds.AutoWorld import AutoWorldRegister, call_all from worlds import failed_world_loads from . import setup_solo_multiworld @@ -37,17 +37,18 @@ class TestImplemented(unittest.TestCase): def test_slot_data(self): """Tests that if a world creates slot data, it's json serializable.""" - for game_name, world_type in AutoWorldRegister.world_types.items(): - # has an await for generate_output which isn't being called - if game_name in {"Ocarina of Time"}: - continue + # has an await for generate_output which isn't being called + excluded_games = ("Ocarina of Time",) + worlds_to_test = {game: world + for game, world in AutoWorldRegister.world_types.items() if game not in excluded_games} + for game_name, world_type in worlds_to_test.items(): multiworld = setup_solo_multiworld(world_type) with self.subTest(game=game_name, seed=multiworld.seed): distribute_items_restrictive(multiworld) call_all(multiworld, "post_fill") for key, data in multiworld.worlds[1].fill_slot_data().items(): self.assertIsInstance(key, str, "keys in slot data must be a string") - self.assertIsInstance(encode(data), str, f"object {type(data).__name__} not serializable.") + convert_to_base_types(data) # only put base data types into slot data def test_no_failed_world_loads(self): if failed_world_loads: diff --git a/test/general/test_items.py b/test/general/test_items.py index 1b376b2838..a48576da52 100644 --- a/test/general/test_items.py +++ b/test/general/test_items.py @@ -148,10 +148,9 @@ class TestBase(unittest.TestCase): def test_locality_not_modified(self): """Test that worlds don't modify the locality of items after duplicates are resolved""" - gen_steps = ("generate_early", "create_regions", "create_items") - additional_steps = ("set_rules", "connect_entrances", "generate_basic", "pre_fill") - worlds_to_test = {game: world for game, world in AutoWorldRegister.world_types.items()} - for game_name, world_type in worlds_to_test.items(): + gen_steps = ("generate_early",) + additional_steps = ("create_regions", "create_items", "set_rules", "connect_entrances", "generate_basic", "pre_fill") + for game_name, world_type in AutoWorldRegister.world_types.items(): with self.subTest("Game", game=game_name): multiworld = setup_solo_multiworld(world_type, gen_steps) local_items = multiworld.worlds[1].options.local_items.value.copy() diff --git a/test/general/test_locations.py b/test/general/test_locations.py index 37ae94e003..77ae2602e5 100644 --- a/test/general/test_locations.py +++ b/test/general/test_locations.py @@ -33,7 +33,10 @@ class TestBase(unittest.TestCase): def test_location_creation_steps(self): """Tests that Regions and Locations aren't created after `create_items`.""" gen_steps = ("generate_early", "create_regions", "create_items") - for game_name, world_type in AutoWorldRegister.world_types.items(): + excluded_games = ("Ocarina of Time", "Pokemon Red and Blue") + worlds_to_test = {game: world + for game, world in AutoWorldRegister.world_types.items() if game not in excluded_games} + for game_name, world_type in worlds_to_test.items(): with self.subTest("Game", game_name=game_name): multiworld = setup_solo_multiworld(world_type, gen_steps) region_count = len(multiworld.get_regions()) @@ -54,13 +57,13 @@ class TestBase(unittest.TestCase): call_all(multiworld, "generate_basic") self.assertEqual(region_count, len(multiworld.get_regions()), f"{game_name} modified region count during generate_basic") - self.assertGreaterEqual(location_count, len(multiworld.get_locations()), + self.assertEqual(location_count, len(multiworld.get_locations()), f"{game_name} modified locations count during generate_basic") call_all(multiworld, "pre_fill") self.assertEqual(region_count, len(multiworld.get_regions()), f"{game_name} modified region count during pre_fill") - self.assertGreaterEqual(location_count, len(multiworld.get_locations()), + self.assertEqual(location_count, len(multiworld.get_locations()), f"{game_name} modified locations count during pre_fill") def test_location_group(self): diff --git a/test/general/test_options.py b/test/general/test_options.py index 7a3743e5a4..d8ce7017f2 100644 --- a/test/general/test_options.py +++ b/test/general/test_options.py @@ -1,7 +1,8 @@ import unittest -from BaseClasses import MultiWorld, PlandoOptions -from Options import ItemLinks +from BaseClasses import PlandoOptions +from Options import ItemLinks, Choice +from Utils import restricted_dumps from worlds.AutoWorld import AutoWorldRegister @@ -73,9 +74,10 @@ class TestOptions(unittest.TestCase): def test_pickle_dumps(self): """Test options can be pickled into database for WebHost generation""" - import pickle for gamename, world_type in AutoWorldRegister.world_types.items(): if not world_type.hidden: for option_key, option in world_type.options_dataclass.type_hints.items(): with self.subTest(game=gamename, option=option_key): - pickle.dumps(option.from_any(option.default)) + restricted_dumps(option.from_any(option.default)) + if issubclass(option, Choice) and option.default in option.name_lookup: + restricted_dumps(option.from_text(option.name_lookup[option.default])) diff --git a/test/general/test_packages.py b/test/general/test_packages.py index 32c7bdf47e..1df6187ee0 100644 --- a/test/general/test_packages.py +++ b/test/general/test_packages.py @@ -8,7 +8,12 @@ class TestPackages(unittest.TestCase): to indicate full package rather than namespace package.""" import Utils + # Ignore directories with these names. + ignore_dirs = {".github"} + worlds_path = Utils.local_path("worlds") for dirpath, dirnames, filenames in os.walk(worlds_path): + # Drop ignored directories from dirnames, excluding them from walking. + dirnames[:] = [d for d in dirnames if d not in ignore_dirs] with self.subTest(directory=dirpath): self.assertEqual("__init__.py" in filenames, any(file.endswith(".py") for file in filenames)) diff --git a/test/hosting/__main__.py b/test/hosting/__main__.py index 6640c637b5..e235d7bb72 100644 --- a/test/hosting/__main__.py +++ b/test/hosting/__main__.py @@ -63,12 +63,12 @@ if __name__ == "__main__": spacer = '=' * 80 with TemporaryDirectory() as tempdir: - multis = [["Clique"], ["Temp World"], ["Clique", "Temp World"]] + multis = [["VVVVVV"], ["Temp World"], ["VVVVVV", "Temp World"]] p1_games = [] data_paths = [] rooms = [] - copy_world("Clique", "Temp World") + copy_world("VVVVVV", "Temp World") try: for n, games in enumerate(multis, 1): print(f"Generating [{n}] {', '.join(games)}") @@ -101,7 +101,7 @@ if __name__ == "__main__": with Client(host.address, game, "Player1") as client: local_data_packages = client.games_packages local_collected_items = len(client.checked_locations) - if collected_items < 2: # Clique only has 2 Locations + if collected_items < 2: # Don't collect anything on the last iteration client.collect_any() # TODO: Ctrl+C test here as well @@ -125,7 +125,7 @@ if __name__ == "__main__": with Client(host.address, game, "Player1") as client: web_data_packages = client.games_packages web_collected_items = len(client.checked_locations) - if collected_items < 2: # Clique only has 2 Locations + if collected_items < 2: # Don't collect anything on the last iteration client.collect_any() if collected_items == 1: sleep(1) # wait for the server to collect the item diff --git a/test/hosting/generate.py b/test/hosting/generate.py index d5d39dc95e..e90868eb6f 100644 --- a/test/hosting/generate.py +++ b/test/hosting/generate.py @@ -34,7 +34,7 @@ def _generate_local_inner(games: Iterable[str], f.write(json.dumps({ "name": f"Player{n}", "game": game, - game: {"hard_mode": "true"}, + game: {}, "description": f"generate_local slot {n} ('Player{n}'): {game}", })) diff --git a/test/hosting/webhost.py b/test/hosting/webhost.py index 4db605e8c1..8888c3fb87 100644 --- a/test/hosting/webhost.py +++ b/test/hosting/webhost.py @@ -2,6 +2,8 @@ import re from pathlib import Path from typing import TYPE_CHECKING, Optional, cast +from WebHostLib import to_python + if TYPE_CHECKING: from flask import Flask from werkzeug.test import Client as FlaskClient @@ -103,7 +105,7 @@ def stop_room(app_client: "FlaskClient", poll_interval = 2 print(f"Stopping room {room_id}") - room_uuid = app.url_map.converters["suuid"].to_python(None, room_id) # type: ignore[arg-type] + room_uuid = to_python(room_id) if timeout is not None: sleep(.1) # should not be required, but other things might use threading @@ -156,7 +158,7 @@ def set_room_timeout(room_id: str, timeout: float) -> None: from WebHostLib.models import Room from WebHostLib import app - room_uuid = app.url_map.converters["suuid"].to_python(None, room_id) # type: ignore[arg-type] + room_uuid = to_python(room_id) with db_session: room: Room = Room.get(id=room_uuid) room.timeout = timeout @@ -168,7 +170,7 @@ def get_multidata_for_room(webhost_client: "FlaskClient", room_id: str) -> bytes from WebHostLib.models import Room from WebHostLib import app - room_uuid = app.url_map.converters["suuid"].to_python(None, room_id) # type: ignore[arg-type] + room_uuid = to_python(room_id) with db_session: room: Room = Room.get(id=room_uuid) return cast(bytes, room.seed.multidata) @@ -180,7 +182,7 @@ def set_multidata_for_room(webhost_client: "FlaskClient", room_id: str, data: by from WebHostLib.models import Room from WebHostLib import app - room_uuid = app.url_map.converters["suuid"].to_python(None, room_id) # type: ignore[arg-type] + room_uuid = to_python(room_id) with db_session: room: Room = Room.get(id=room_uuid) room.seed.multidata = data diff --git a/test/hosting/world.py b/test/hosting/world.py index e083e027fe..cd53453c10 100644 --- a/test/hosting/world.py +++ b/test/hosting/world.py @@ -1,13 +1,12 @@ import re import shutil from pathlib import Path -from typing import Dict __all__ = ["copy", "delete"] -_new_worlds: Dict[str, str] = {} +_new_worlds: dict[str, str] = {} def copy(src: str, dst: str) -> None: @@ -31,7 +30,7 @@ def copy(src: str, dst: str) -> None: _new_worlds[dst] = str(dst_folder) with open(dst_folder / "__init__.py", "r", encoding="utf-8-sig") as f: contents = f.read() - contents = re.sub(r'game\s*=\s*[\'"]' + re.escape(src) + r'[\'"]', f'game = "{dst}"', contents) + contents = re.sub(r'game\s*(:\s*[a-zA-Z\[\]]+)?\s*=\s*[\'"]' + re.escape(src) + r'[\'"]', f'game = "{dst}"', contents) with open(dst_folder / "__init__.py", "w", encoding="utf-8") as f: f.write(contents) diff --git a/test/options/test_option_classes.py b/test/options/test_option_classes.py index 8e2c4702c3..ca90db8870 100644 --- a/test/options/test_option_classes.py +++ b/test/options/test_option_classes.py @@ -33,6 +33,15 @@ class TestNumericOptions(unittest.TestCase): self.assertEqual(choice_option_alias, TestChoice.alias_three) self.assertEqual(choice_option_attr, TestChoice.non_option_attr) + self.assertLess(choice_option_string, "two") + self.assertGreater(choice_option_string, "zero") + self.assertLessEqual(choice_option_string, "one") + self.assertLessEqual(choice_option_string, "two") + self.assertGreaterEqual(choice_option_string, "one") + self.assertGreaterEqual(choice_option_string, "zero") + + self.assertGreaterEqual(choice_option_alias, "three") + self.assertRaises(KeyError, TestChoice.from_any, "four") self.assertIn(choice_option_int, [1, 2, 3]) diff --git a/test/webhost/test_docs.py b/test/webhost/test_docs.py index 1e6c1b88f4..a178a7cbf0 100644 --- a/test/webhost/test_docs.py +++ b/test/webhost/test_docs.py @@ -2,6 +2,8 @@ import unittest import Utils import os +from werkzeug.utils import secure_filename + import WebHost from worlds.AutoWorld import AutoWorldRegister @@ -9,36 +11,30 @@ from worlds.AutoWorld import AutoWorldRegister class TestDocs(unittest.TestCase): @classmethod def setUpClass(cls) -> None: - cls.tutorials_data = WebHost.create_ordered_tutorials_file() + WebHost.copy_tutorials_files_to_static() def test_has_tutorial(self): - games_with_tutorial = set(entry["gameTitle"] for entry in self.tutorials_data) for game_name, world_type in AutoWorldRegister.world_types.items(): if not world_type.hidden: with self.subTest(game_name): - try: - self.assertIn(game_name, games_with_tutorial) - except AssertionError: - # look for partial name in the tutorial name - for game in games_with_tutorial: - if game_name in game: - break - else: - self.fail(f"{game_name} has no setup tutorial. " - f"Games with Tutorial: {games_with_tutorial}") + tutorials = world_type.web.tutorials + self.assertGreater(len(tutorials), 0, msg=f"{game_name} has no setup tutorial.") + + safe_name = secure_filename(game_name) + target_path = Utils.local_path("WebHostLib", "static", "generated", "docs", safe_name) + for tutorial in tutorials: + self.assertTrue( + os.path.isfile(Utils.local_path(target_path, secure_filename(tutorial.file_name))), + f'{game_name} missing tutorial file {tutorial.file_name}.' + ) def test_has_game_info(self): for game_name, world_type in AutoWorldRegister.world_types.items(): if not world_type.hidden: - safe_name = Utils.get_file_safe_name(game_name) + safe_name = secure_filename(game_name) target_path = Utils.local_path("WebHostLib", "static", "generated", "docs", safe_name) for game_info_lang in world_type.web.game_info_languages: with self.subTest(game_name): - self.assertTrue( - safe_name == game_name or - not os.path.isfile(Utils.local_path(target_path, f'{game_info_lang}_{game_name}.md')), - f'Info docs have be named _{safe_name}.md for {game_name}.' - ) self.assertTrue( os.path.isfile(Utils.local_path(target_path, f'{game_info_lang}_{safe_name}.md')), f'{game_name} missing game info file for "{game_info_lang}" language.' diff --git a/test/webhost/test_file_generation.py b/test/webhost/test_file_generation.py index 059f6b49a1..7b14ac871b 100644 --- a/test/webhost/test_file_generation.py +++ b/test/webhost/test_file_generation.py @@ -29,8 +29,3 @@ class TestFileGeneration(unittest.TestCase): with open(file, encoding="utf-8-sig") as f: for value in roll_options({file.name: f.read()})[0].values(): self.assertTrue(value is True, f"Default Options for template {file.name} cannot be run.") - - def test_tutorial(self): - WebHost.create_ordered_tutorials_file() - self.assertTrue(os.path.exists(os.path.join(self.correct_path, "static", "generated", "tutorials.json"))) - self.assertFalse(os.path.exists(os.path.join(self.incorrect_path, "static", "generated", "tutorials.json"))) diff --git a/test/webhost/test_sitemap.py b/test/webhost/test_sitemap.py new file mode 100644 index 0000000000..930aa32415 --- /dev/null +++ b/test/webhost/test_sitemap.py @@ -0,0 +1,63 @@ +import urllib.parse +import html +import re +from flask import url_for + +import WebHost +from . import TestBase + + +class TestSitemap(TestBase): + + # Codes for OK and some redirects that we use + valid_status_codes = [200, 302, 308] + + @classmethod + def setUpClass(cls) -> None: + super().setUpClass() + WebHost.copy_tutorials_files_to_static() + + def test_sitemap_route(self) -> None: + """Verify that the sitemap route works correctly and renders the template without errors.""" + with self.app.test_request_context(): + # Test the /sitemap route + with self.client.open("/sitemap") as response: + self.assertEqual(response.status_code, 200) + self.assertIn(b"Site Map", response.data) + + # Test the /index route which should also serve the sitemap + with self.client.open("/index") as response: + self.assertEqual(response.status_code, 200) + self.assertIn(b"Site Map", response.data) + + # Test using url_for with the function name + with self.client.open(url_for('get_sitemap')) as response: + self.assertEqual(response.status_code, 200) + self.assertIn(b'Site Map', response.data) + + def test_sitemap_links(self) -> None: + """ + Verify that all links in the sitemap are valid by making a request to each one. + """ + with self.app.test_request_context(): + with self.client.open(url_for("get_sitemap")) as response: + self.assertEqual(response.status_code, 200) + html_content = response.data.decode() + + # Extract all href links using regex + href_pattern = re.compile(r'href=["\'](.*?)["\']') + links = href_pattern.findall(html_content) + + self.assertTrue(len(links) > 0, "No links found in sitemap") + + # Test each link + for link in links: + # Skip external links + if link.startswith(("http://", "https://")): + continue + + link = urllib.parse.unquote(html.unescape(link)) + + with self.client.open(link) as response, self.subTest(link=link): + self.assertIn(response.status_code, self.valid_status_codes, + f"Link {link} returned invalid status code {response.status_code}") diff --git a/test/webhost/test_tracker.py b/test/webhost/test_tracker.py index 58145d77f3..0796cdb247 100644 --- a/test/webhost/test_tracker.py +++ b/test/webhost/test_tracker.py @@ -93,3 +93,13 @@ class TestTracker(TestBase): headers={"If-Modified-Since": "Wed, 21 Oct 2015 07:28:00"}, # missing timezone ) self.assertEqual(response.status_code, 400) + + def test_tracker_api(self) -> None: + """Verify that tracker api gives a reply for the room.""" + with self.app.test_request_context(): + with self.client.open(url_for("api.tracker_data", tracker=self.tracker_uuid)) as response: + self.assertEqual(response.status_code, 200) + with self.client.open(url_for("api.static_tracker_data", tracker=self.tracker_uuid)) as response: + self.assertEqual(response.status_code, 200) + with self.client.open(url_for("api.tracker_slot_data", tracker=self.tracker_uuid)) as response: + self.assertEqual(response.status_code, 200) diff --git a/test/worlds/__init__.py b/test/worlds/__init__.py index 4bc017511c..4a4e3e07c1 100644 --- a/test/worlds/__init__.py +++ b/test/worlds/__init__.py @@ -1,17 +1,46 @@ -def load_tests(loader, standard_tests, pattern): +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from unittest import TestLoader, TestSuite + + +def load_tests(loader: "TestLoader", standard_tests: "TestSuite", pattern: str): import os import unittest + import fnmatch from .. import file_path from worlds.AutoWorld import AutoWorldRegister suite = unittest.TestSuite() suite.addTests(standard_tests) + + # pattern hack + # all tests from within __init__ are always imported, so we need to filter out the folder earlier + # if the pattern isn't matching a specific world, we don't have much of a solution + + if pattern.startswith("worlds."): + if pattern.endswith(".py"): + pattern = pattern[:-3] + components = pattern.split(".") + world_glob = f"worlds.{components[1]}" + pattern = components[-1] + + elif pattern.startswith(f"worlds{os.path.sep}") or pattern.startswith(f"worlds{os.path.altsep}"): + components = pattern.split(os.path.sep) + if len(components) == 1: + components = pattern.split(os.path.altsep) + world_glob = f"worlds.{components[1]}" + pattern = components[-1] + else: + world_glob = "*" + + folders = [os.path.join(os.path.split(world.__file__)[0], "test") - for world in AutoWorldRegister.world_types.values()] + for world in AutoWorldRegister.world_types.values() + if fnmatch.fnmatch(world.__module__, world_glob)] all_tests = [ test_case for folder in folders if os.path.exists(folder) - for test_collection in loader.discover(folder, top_level_dir=file_path) + for test_collection in loader.discover(folder, top_level_dir=file_path, pattern=pattern) for test_suite in test_collection if isinstance(test_suite, unittest.suite.TestSuite) for test_case in test_suite ] diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index f0004a9f1b..1805b11a09 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -12,16 +12,20 @@ from typing import (Any, Callable, ClassVar, Dict, FrozenSet, Iterable, List, Ma from Options import item_and_loc_options, ItemsAccessibility, OptionGroup, PerGameCommonOptions from BaseClasses import CollectionState -from Utils import deprecate +from Utils import Version if TYPE_CHECKING: from BaseClasses import MultiWorld, Item, Location, Tutorial, Region, Entrance - from . import GamesPackage + from NetUtils import GamesPackage, MultiData from settings import Group perf_logger = logging.getLogger("performance") +class InvalidItemError(KeyError): + pass + + class AutoWorldRegister(type): world_types: Dict[str, Type[World]] = {} __file__: str @@ -71,15 +75,10 @@ class AutoWorldRegister(type): if "required_client_version" in base.__dict__: dct["required_client_version"] = max(dct["required_client_version"], base.__dict__["required_client_version"]) - - # create missing options_dataclass from legacy option_definitions - # TODO - remove this once all worlds use options dataclasses - if "options_dataclass" not in dct and "option_definitions" in dct: - # TODO - switch to deprecate after a version - deprecate(f"{name} Assigned options through option_definitions which is now deprecated. " - "Please use options_dataclass instead.") - dct["options_dataclass"] = make_dataclass(f"{name}Options", dct["option_definitions"].items(), - bases=(PerGameCommonOptions,)) + if "world_version" in dct: + if dct["world_version"] != Version(0, 0, 0): + raise RuntimeError(f"{name} is attempting to set 'world_version' from within the class. world_version " + f"can only be set from manifest.") # construct class new_class = super().__new__(mcs, name, bases, dct) @@ -342,6 +341,8 @@ class World(metaclass=AutoWorldRegister): """If loaded from a .apworld, this is the Path to it.""" __file__: ClassVar[str] """path it was loaded from""" + world_version: ClassVar[Version] = Version(0, 0, 0) + """Optional world version loaded from archipelago.json""" def __init__(self, multiworld: "MultiWorld", player: int): assert multiworld is not None @@ -382,7 +383,7 @@ class World(metaclass=AutoWorldRegister): def create_items(self) -> None: """ Method for creating and submitting items to the itempool. Items and Regions must *not* be created and submitted - to the MultiWorld after this step. If items need to be placed during pre_fill use `get_prefill_items`. + to the MultiWorld after this step. If items need to be placed during pre_fill use `get_pre_fill_items`. """ pass @@ -450,7 +451,7 @@ class World(metaclass=AutoWorldRegister): """ pass - def modify_multidata(self, multidata: Dict[str, Any]) -> None: # TODO: TypedDict for multidata? + def modify_multidata(self, multidata: "MultiData") -> None: """For deeper modification of server multidata.""" pass @@ -493,9 +494,6 @@ class World(metaclass=AutoWorldRegister): Creates a group, which is an instance of World that is responsible for multiple others. An example case is ItemLinks creating these. """ - # TODO remove loop when worlds use options dataclass - for option_key, option in cls.options_dataclass.type_hints.items(): - getattr(multiworld, option_key)[new_player_id] = option.from_any(option.default) group = cls(multiworld, new_player_id) group.options = cls.options_dataclass(**{option_key: option.from_any(option.default) for option_key, option in cls.options_dataclass.type_hints.items()}) @@ -528,7 +526,7 @@ class World(metaclass=AutoWorldRegister): """Called when an item is collected in to state. Useful for things such as progressive items or currency.""" name = self.collect_item(state, item) if name: - state.prog_items[self.player][name] += 1 + state.add_item(name, self.player) return True return False @@ -536,9 +534,7 @@ class World(metaclass=AutoWorldRegister): """Called when an item is removed from to state. Useful for things such as progressive items or currency.""" name = self.collect_item(state, item, True) if name: - state.prog_items[self.player][name] -= 1 - if state.prog_items[self.player][name] < 1: - del (state.prog_items[self.player][name]) + state.remove_item(name, self.player) return True return False diff --git a/worlds/Files.py b/worlds/Files.py index 69a88218ef..cc81a022dd 100644 --- a/worlds/Files.py +++ b/worlds/Files.py @@ -6,15 +6,19 @@ import zipfile from enum import IntEnum import os import threading +from io import BytesIO -from typing import ClassVar, Dict, List, Literal, Tuple, Any, Optional, Union, BinaryIO, overload, Sequence +from typing import (ClassVar, Dict, List, Literal, Tuple, Any, Optional, Union, BinaryIO, overload, Sequence, + TYPE_CHECKING) import bsdiff4 semaphore = threading.Semaphore(os.cpu_count() or 4) del threading -del os + +if TYPE_CHECKING: + from Utils import Version class AutoPatchRegister(abc.ABCMeta): @@ -33,10 +37,8 @@ class AutoPatchRegister(abc.ABCMeta): @staticmethod def get_handler(file: str) -> Optional[AutoPatchRegister]: - for file_ending, handler in AutoPatchRegister.file_endings.items(): - if file.endswith(file_ending): - return handler - return None + _, suffix = os.path.splitext(file) + return AutoPatchRegister.file_endings.get(suffix, None) class AutoPatchExtensionRegister(abc.ABCMeta): @@ -67,7 +69,19 @@ class AutoPatchExtensionRegister(abc.ABCMeta): return handler -container_version: int = 6 +container_version: int = 7 + + +def is_ap_player_container(game: str, data: bytes, player: int): + if not zipfile.is_zipfile(BytesIO(data)): + return False + with zipfile.ZipFile(BytesIO(data), mode='r') as zf: + if "archipelago.json" in zf.namelist(): + manifest = json.loads(zf.read("archipelago.json")) + if "game" in manifest and "player" in manifest: + if game == manifest["game"] and player == manifest["player"]: + return True + return False class InvalidDataError(Exception): @@ -78,24 +92,15 @@ class InvalidDataError(Exception): class APContainer: - """A zipfile containing at least archipelago.json""" - version: int = container_version - compression_level: int = 9 - compression_method: int = zipfile.ZIP_DEFLATED - game: Optional[str] = None - - # instance attributes: + """A zipfile containing at least archipelago.json, which contains a manifest json payload.""" + version: ClassVar[int] = container_version + compression_level: ClassVar[int] = 9 + compression_method: ClassVar[int] = zipfile.ZIP_DEFLATED + manifest_path: str = "archipelago.json" path: Optional[str] - player: Optional[int] - player_name: str - server: str - def __init__(self, path: Optional[str] = None, player: Optional[int] = None, - player_name: str = "", server: str = ""): + def __init__(self, path: Optional[str] = None): self.path = path - self.player = player - self.player_name = player_name - self.server = server def write(self, file: Optional[Union[str, BinaryIO]] = None) -> None: zip_file = file if file else self.path @@ -115,7 +120,7 @@ class APContainer: except Exception as e: raise Exception(f"Manifest {manifest} did not convert to json.") from e else: - opened_zipfile.writestr("archipelago.json", manifest_str) + opened_zipfile.writestr(self.manifest_path, manifest_str) def read(self, file: Optional[Union[str, BinaryIO]] = None) -> None: """Read data into patch object. file can be file-like, such as an outer zip file's stream.""" @@ -135,31 +140,98 @@ class APContainer: message = f"{arg0} - " raise InvalidDataError(f"{message}This might be the incorrect world version for this file") from e - def read_contents(self, opened_zipfile: zipfile.ZipFile) -> None: - with opened_zipfile.open("archipelago.json", "r") as f: + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> Dict[str, Any]: + try: + assert self.manifest_path.endswith("archipelago.json"), "Filename should be archipelago.json" + manifest_info = opened_zipfile.getinfo(self.manifest_path) + except KeyError as e: + for info in opened_zipfile.infolist(): + if info.filename.endswith("archipelago.json"): + manifest_info = info + self.manifest_path = info.filename + break + else: + raise e + with opened_zipfile.open(manifest_info, "r") as f: manifest = json.load(f) if manifest["compatible_version"] > self.version: raise Exception(f"File (version: {manifest['compatible_version']}) too new " f"for this handler (version: {self.version})") - self.player = manifest["player"] - self.server = manifest["server"] - self.player_name = manifest["player_name"] + return manifest def get_manifest(self) -> Dict[str, Any]: return { - "server": self.server, # allow immediate connection to server in multiworld. Empty string otherwise - "player": self.player, - "player_name": self.player_name, - "game": self.game, # minimum version of patch system expected for patching to be successful "compatible_version": 5, "version": container_version, } -class APPatch(APContainer): +class APWorldContainer(APContainer): + """A zipfile containing a world implementation.""" + game: str | None = None + world_version: "Version | None" = None + minimum_ap_version: "Version | None" = None + maximum_ap_version: "Version | None" = None + + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> Dict[str, Any]: + from Utils import tuplize_version, Version + manifest = super().read_contents(opened_zipfile) + self.game = manifest["game"] + for version_key in ("world_version", "minimum_ap_version", "maximum_ap_version"): + if version_key in manifest: + setattr(self, version_key, Version(*tuplize_version(manifest[version_key]))) + return manifest + + def get_manifest(self) -> Dict[str, Any]: + manifest = super().get_manifest() + manifest["game"] = self.game + manifest["compatible_version"] = 7 + for version_key in ("world_version", "minimum_ap_version", "maximum_ap_version"): + version = getattr(self, version_key) + if version: + manifest[version_key] = version.as_simple_string() + return manifest + + +class APPlayerContainer(APContainer): + """A zipfile containing at least archipelago.json meant for a player""" + game: ClassVar[Optional[str]] = None + patch_file_ending: str = "" + + player: Optional[int] + player_name: str + server: str + + def __init__(self, path: Optional[str] = None, player: Optional[int] = None, + player_name: str = "", server: str = ""): + super().__init__(path) + self.player = player + self.player_name = player_name + self.server = server + + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> Dict[str, Any]: + manifest = super().read_contents(opened_zipfile) + self.player = manifest["player"] + self.server = manifest["server"] + self.player_name = manifest["player_name"] + return manifest + + def get_manifest(self) -> Dict[str, Any]: + manifest = super().get_manifest() + manifest.update({ + "server": self.server, # allow immediate connection to server in multiworld. Empty string otherwise + "player": self.player, + "player_name": self.player_name, + "game": self.game, + "patch_file_ending": self.patch_file_ending, + }) + return manifest + + +class APPatch(APPlayerContainer): """ - An `APContainer` that represents a patch file. + An `APPlayerContainer` that represents a patch file. It includes the `procedure` key in the manifest to indicate that it is a patch. Your implementation should inherit from this if your output file @@ -192,7 +264,6 @@ class APProcedurePatch(APAutoPatchInterface): """ hash: Optional[str] # base checksum of source file source_data: bytes - patch_file_ending: str = "" files: Dict[str, bytes] @classmethod @@ -214,16 +285,13 @@ class APProcedurePatch(APAutoPatchInterface): manifest = super(APProcedurePatch, self).get_manifest() manifest["base_checksum"] = self.hash manifest["result_file_ending"] = self.result_file_ending - manifest["patch_file_ending"] = self.patch_file_ending manifest["procedure"] = self.procedure if self.procedure == APDeltaPatch.procedure: manifest["compatible_version"] = 5 return manifest - def read_contents(self, opened_zipfile: zipfile.ZipFile) -> None: - super(APProcedurePatch, self).read_contents(opened_zipfile) - with opened_zipfile.open("archipelago.json", "r") as f: - manifest = json.load(f) + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> Dict[str, Any]: + manifest = super(APProcedurePatch, self).read_contents(opened_zipfile) if "procedure" not in manifest: # support patching files made before moving to procedures self.procedure = [("apply_bsdiff4", ["delta.bsdiff4"])] @@ -232,6 +300,7 @@ class APProcedurePatch(APAutoPatchInterface): for file in opened_zipfile.namelist(): if file not in ["archipelago.json"]: self.files[file] = opened_zipfile.read(file) + return manifest def write_contents(self, opened_zipfile: zipfile.ZipFile) -> None: super(APProcedurePatch, self).write_contents(opened_zipfile) diff --git a/worlds/LauncherComponents.py b/worlds/LauncherComponents.py index d587e65d33..58c724ac2b 100644 --- a/worlds/LauncherComponents.py +++ b/worlds/LauncherComponents.py @@ -5,7 +5,7 @@ import weakref from enum import Enum, auto from typing import Optional, Callable, List, Iterable, Tuple -from Utils import local_path, open_filename +from Utils import local_path, open_filename, is_frozen, is_kivy_running class Type(Enum): @@ -177,10 +177,9 @@ def _install_apworld(apworld_src: str = "") -> Optional[Tuple[pathlib.Path, path if module_name == loaded_name: found_already_loaded = True break - if found_already_loaded: - raise Exception(f"Installed APWorld successfully, but '{module_name}' is already loaded,\n" - "so a Launcher restart is required to use the new installation.\n" - "If the Launcher is not open, no action needs to be taken.") + if found_already_loaded and is_kivy_running(): + raise Exception(f"Installed APWorld successfully, but '{module_name}' is already loaded, " + "so a Launcher restart is required to use the new installation.") world_source = worlds.WorldSource(str(target), is_zip=True) bisect.insort(worlds.world_sources, world_source) world_source.load() @@ -197,7 +196,7 @@ def install_apworld(apworld_path: str = "") -> None: source, target = res except Exception as e: import Utils - Utils.messagebox(e.__class__.__name__, str(e), error=True) + Utils.messagebox("Notice", str(e), error=True) logging.exception(e) else: import Utils @@ -210,30 +209,25 @@ components: List[Component] = [ Component('Launcher', 'Launcher', component_type=Type.HIDDEN), # Core Component('Host', 'MultiServer', 'ArchipelagoServer', cli=True, - file_identifier=SuffixIdentifier('.archipelago', '.zip')), - Component('Generate', 'Generate', cli=True), - Component("Install APWorld", func=install_apworld, file_identifier=SuffixIdentifier(".apworld")), - Component('Text Client', 'CommonClient', 'ArchipelagoTextClient', func=launch_textclient), + file_identifier=SuffixIdentifier('.archipelago', '.zip'), + description="Host a generated multiworld on your computer."), + Component('Generate', 'Generate', cli=True, + description="Generate a multiworld with the YAMLs in the players folder."), + Component("Install APWorld", func=install_apworld, file_identifier=SuffixIdentifier(".apworld"), + description="Install an APWorld to play games not included with Archipelago by default."), + Component('Text Client', 'CommonClient', 'ArchipelagoTextClient', func=launch_textclient, + description="Connect to a multiworld using the text client."), Component('Links Awakening DX Client', 'LinksAwakeningClient', file_identifier=SuffixIdentifier('.apladx')), Component('LttP Adjuster', 'LttPAdjuster'), - # Minecraft - Component('Minecraft Client', 'MinecraftClient', icon='mcicon', cli=True, - file_identifier=SuffixIdentifier('.apmc')), # Ocarina of Time Component('OoT Client', 'OoTClient', file_identifier=SuffixIdentifier('.apz5')), Component('OoT Adjuster', 'OoTAdjuster'), - # FF1 - Component('FF1 Client', 'FF1Client'), # TLoZ Component('Zelda 1 Client', 'Zelda1Client', file_identifier=SuffixIdentifier('.aptloz')), # ChecksFinder Component('ChecksFinder Client', 'ChecksFinderClient'), - # Starcraft 2 - Component('Starcraft 2 Client', 'Starcraft2Client'), - # Wargroove - Component('Wargroove Client', 'WargrooveClient'), # Zillion Component('Zillion Client', 'ZillionClient', file_identifier=SuffixIdentifier('.apzl')), @@ -246,6 +240,41 @@ components: List[Component] = [ # if registering an icon from within an apworld, the format "ap:module.name/path/to/file.png" can be used icon_paths = { 'icon': local_path('data', 'icon.png'), - 'mcicon': local_path('data', 'mcicon.png'), 'discord': local_path('data', 'discord-mark-blue.png'), } + +if not is_frozen(): + def _build_apworlds(): + import json + import os + import zipfile + + from worlds import AutoWorldRegister + from worlds.Files import APWorldContainer + + apworlds_folder = os.path.join("build", "apworlds") + os.makedirs(apworlds_folder, exist_ok=True) + for worldname, worldtype in AutoWorldRegister.world_types.items(): + file_name = os.path.split(os.path.dirname(worldtype.__file__))[1] + world_directory = os.path.join("worlds", file_name) + if os.path.isfile(os.path.join(world_directory, "archipelago.json")): + manifest = json.load(open(os.path.join(world_directory, "archipelago.json"))) + else: + manifest = {} + + zip_path = os.path.join(apworlds_folder, file_name + ".apworld") + apworld = APWorldContainer(str(zip_path)) + apworld.game = worldtype.game + manifest.update(apworld.get_manifest()) + apworld.manifest_path = f"{file_name}/archipelago.json" + with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED, + compresslevel=9) as zf: + for path in pathlib.Path(world_directory).rglob("*.*"): + relative_path = os.path.join(*path.parts[path.parts.index("worlds") + 1:]) + if "__MACOSX" in relative_path or ".DS_STORE" in relative_path or "__pycache__" in relative_path: + continue + if not relative_path.endswith("archipelago.json"): + zf.write(path, relative_path) + zf.writestr(apworld.manifest_path, json.dumps(manifest)) + + components.append(Component('Build apworlds', func=_build_apworlds, cli=True,)) diff --git a/worlds/__init__.py b/worlds/__init__.py index 7db651bdd9..b9ef225f52 100644 --- a/worlds/__init__.py +++ b/worlds/__init__.py @@ -7,9 +7,11 @@ import warnings import zipimport import time import dataclasses -from typing import Dict, List, TypedDict +import json +from typing import List -from Utils import local_path, user_path +from NetUtils import DataPackage +from Utils import local_path, user_path, Version, version_tuple, tuplize_version local_folder = os.path.dirname(__file__) user_folder = user_path("worlds") if user_path() != local_path() else user_path("custom_worlds") @@ -24,8 +26,6 @@ __all__ = { "world_sources", "local_folder", "user_folder", - "GamesPackage", - "DataPackage", "failed_world_loads", } @@ -33,24 +33,13 @@ __all__ = { failed_world_loads: List[str] = [] -class GamesPackage(TypedDict, total=False): - item_name_groups: Dict[str, List[str]] - item_name_to_id: Dict[str, int] - location_name_groups: Dict[str, List[str]] - location_name_to_id: Dict[str, int] - checksum: str - - -class DataPackage(TypedDict): - games: Dict[str, GamesPackage] - - @dataclasses.dataclass(order=True) class WorldSource: path: str # typically relative path from this module is_zip: bool = False relative: bool = True # relative to regular world import folder time_taken: float = -1.0 + version: Version = Version(0, 0, 0) def __repr__(self) -> str: return f"{self.__class__.__name__}({self.path}, is_zip={self.is_zip}, relative={self.relative})" @@ -76,9 +65,7 @@ class WorldSource: sys.modules[mod.__name__] = mod with warnings.catch_warnings(): warnings.filterwarnings("ignore", message="__package__ != __spec__.parent") - # Found no equivalent for < 3.10 - if hasattr(importer, "exec_module"): - importer.exec_module(mod) + importer.exec_module(mod) else: importlib.import_module(f".{self.path}", "worlds") self.time_taken = time.perf_counter()-start @@ -117,12 +104,94 @@ for folder in (folder for folder in (user_folder, local_folder) if folder): # import all submodules to trigger AutoWorldRegister world_sources.sort() +apworlds: list[WorldSource] = [] for world_source in world_sources: - world_source.load() + # load all loose files first: + if world_source.is_zip: + apworlds.append(world_source) + else: + world_source.load() + -# Build the data package for each game. from .AutoWorld import AutoWorldRegister +for world_source in world_sources: + if not world_source.is_zip: + # look for manifest + manifest = {} + for dirpath, dirnames, filenames in os.walk(world_source.resolved_path): + for file in filenames: + if file.endswith("archipelago.json"): + manifest = json.load(open(os.path.join(dirpath, file), "r")) + break + if manifest: + break + game = manifest.get("game") + if game in AutoWorldRegister.world_types: + AutoWorldRegister.world_types[game].world_version = Version(*tuplize_version(manifest.get("world_version", + "0.0.0"))) + +if apworlds: + # encapsulation for namespace / gc purposes + def load_apworlds() -> None: + global apworlds + from .Files import APWorldContainer, InvalidDataError + core_compatible: list[tuple[WorldSource, APWorldContainer]] = [] + + def fail_world(game_name: str, reason: str, add_as_failed_to_load: bool = True) -> None: + if add_as_failed_to_load: + failed_world_loads.append(game_name) + logging.warning(reason) + + for apworld_source in apworlds: + apworld: APWorldContainer = APWorldContainer(apworld_source.resolved_path) + # populate metadata + try: + apworld.read() + except InvalidDataError as e: + if version_tuple < (0, 7, 0): + logging.error( + f"Invalid or missing manifest file for {apworld_source.resolved_path}. " + "This apworld will stop working with Archipelago 0.7.0." + ) + logging.error(e) + else: + raise e + + if apworld.minimum_ap_version and apworld.minimum_ap_version > version_tuple: + fail_world(apworld.game, + f"Did not load {apworld_source.path} " + f"as its minimum core version {apworld.minimum_ap_version} " + f"is higher than current core version {version_tuple}.") + elif apworld.maximum_ap_version and apworld.maximum_ap_version < version_tuple: + fail_world(apworld.game, + f"Did not load {apworld_source.path} " + f"as its maximum core version {apworld.maximum_ap_version} " + f"is lower than current core version {version_tuple}.") + else: + core_compatible.append((apworld_source, apworld)) + # load highest version first + core_compatible.sort( + key=lambda element: element[1].world_version if element[1].world_version else Version(0, 0, 0), + reverse=True) + for apworld_source, apworld in core_compatible: + if apworld.game and apworld.game in AutoWorldRegister.world_types: + fail_world(apworld.game, + f"Did not load {apworld_source.path} " + f"as its game {apworld.game} is already loaded.", + add_as_failed_to_load=False) + else: + apworld_source.load() + if apworld.game in AutoWorldRegister.world_types: + # world could fail to load at this point + if apworld.world_version: + AutoWorldRegister.world_types[apworld.game].world_version = apworld.world_version + load_apworlds() + del load_apworlds + +del apworlds + +# Build the data package for each game. network_data_package: DataPackage = { "games": {world_name: world.get_data_package_data() for world_name, world in AutoWorldRegister.world_types.items()}, } diff --git a/worlds/_bizhawk/client.py b/worlds/_bizhawk/client.py index 16a8325a10..fe8e97e65c 100644 --- a/worlds/_bizhawk/client.py +++ b/worlds/_bizhawk/client.py @@ -19,7 +19,8 @@ def launch_client(*args) -> None: component = Component("BizHawk Client", "BizHawkClient", component_type=Type.CLIENT, func=launch_client, - file_identifier=SuffixIdentifier()) + file_identifier=SuffixIdentifier(), + description="Open the BizHawk client, to play games using the Bizhawk emulator.") components.append(component) diff --git a/worlds/_bizhawk/context.py b/worlds/_bizhawk/context.py index c9b1076644..142c296400 100644 --- a/worlds/_bizhawk/context.py +++ b/worlds/_bizhawk/context.py @@ -4,16 +4,18 @@ checking or launching the client, otherwise it will probably cause circular impo """ import asyncio +import copy import enum import subprocess from typing import Any +import settings from CommonClient import CommonContext, ClientCommandProcessor, get_base_parser, server_loop, logger, gui_enabled import Patch import Utils from . import BizHawkContext, ConnectionStatus, NotConnectedError, RequestFailedError, connect, disconnect, get_hash, \ - get_script_version, get_system, ping + get_script_version, get_system, ping, display_message from .client import BizHawkClient, AutoBizHawkClientRegister @@ -27,20 +29,97 @@ class AuthStatus(enum.IntEnum): AUTHENTICATED = 3 +class TextCategory(str, enum.Enum): + ALL = "all" + INCOMING = "incoming" + OUTGOING = "outgoing" + OTHER = "other" + HINT = "hint" + CHAT = "chat" + SERVER = "server" + + class BizHawkClientCommandProcessor(ClientCommandProcessor): def _cmd_bh(self): """Shows the current status of the client's connection to BizHawk""" - if isinstance(self.ctx, BizHawkClientContext): - if self.ctx.bizhawk_ctx.connection_status == ConnectionStatus.NOT_CONNECTED: - logger.info("BizHawk Connection Status: Not Connected") - elif self.ctx.bizhawk_ctx.connection_status == ConnectionStatus.TENTATIVE: - logger.info("BizHawk Connection Status: Tentatively Connected") - elif self.ctx.bizhawk_ctx.connection_status == ConnectionStatus.CONNECTED: - logger.info("BizHawk Connection Status: Connected") + assert isinstance(self.ctx, BizHawkClientContext) + + if self.ctx.bizhawk_ctx.connection_status == ConnectionStatus.NOT_CONNECTED: + logger.info("BizHawk Connection Status: Not Connected") + elif self.ctx.bizhawk_ctx.connection_status == ConnectionStatus.TENTATIVE: + logger.info("BizHawk Connection Status: Tentatively Connected") + elif self.ctx.bizhawk_ctx.connection_status == ConnectionStatus.CONNECTED: + logger.info("BizHawk Connection Status: Connected") + + def _cmd_toggle_text(self, category: str | None = None, toggle: str | None = None): + """Sets types of incoming messages to forward to the emulator""" + assert isinstance(self.ctx, BizHawkClientContext) + + if category is None: + logger.info("Usage: /toggle_text category [toggle]\n\n" + "category: incoming, outgoing, other, hint, chat, and server\n" + "Or \"all\" to toggle all categories at once\n\n" + "toggle: on, off, true, or false\n" + "Or omit to set it to the opposite of its current state\n\n" + "Example: /toggle_text outgoing on") + return + + category = category.lower() + value: bool | None + if toggle is None: + value = None + elif toggle.lower() in ("on", "true"): + value = True + elif toggle.lower() in ("off", "false"): + value = False + else: + logger.info(f'Unknown value "{toggle}", should be on|off|true|false') + return + + valid_categories = ( + TextCategory.ALL, + TextCategory.OTHER, + TextCategory.INCOMING, + TextCategory.OUTGOING, + TextCategory.HINT, + TextCategory.CHAT, + TextCategory.SERVER, + ) + if category not in valid_categories: + logger.info(f'Unknown value "{category}", should be {"|".join(valid_categories)}') + return + + if category == TextCategory.ALL: + if value is None: + logger.info('Must specify "on" or "off" for category "all"') + return + + if value: + self.ctx.text_passthrough_categories.update(( + TextCategory.OTHER, + TextCategory.INCOMING, + TextCategory.OUTGOING, + TextCategory.HINT, + TextCategory.CHAT, + TextCategory.SERVER, + )) + else: + self.ctx.text_passthrough_categories.clear() + else: + if value is None: + value = category not in self.ctx.text_passthrough_categories + + if value: + self.ctx.text_passthrough_categories.add(category) + else: + self.ctx.text_passthrough_categories.remove(category) + + logger.info(f"Currently Showing Categories: {', '.join(self.ctx.text_passthrough_categories)}") class BizHawkClientContext(CommonContext): command_processor = BizHawkClientCommandProcessor + text_passthrough_categories: set[str] server_seed_name: str | None = None auth_status: AuthStatus password_requested: bool @@ -54,12 +133,33 @@ class BizHawkClientContext(CommonContext): def __init__(self, server_address: str | None, password: str | None): super().__init__(server_address, password) + self.text_passthrough_categories = set() self.auth_status = AuthStatus.NOT_AUTHENTICATED self.password_requested = False self.client_handler = None self.bizhawk_ctx = BizHawkContext() self.watcher_timeout = 0.5 + def _categorize_text(self, args: dict) -> TextCategory: + if "type" not in args or args["type"] in {"Hint", "Join", "Part", "TagsChanged", "Goal", "Release", "Collect", + "Countdown", "ServerChat", "ItemCheat"}: + return TextCategory.SERVER + elif args["type"] == "Chat": + return TextCategory.CHAT + elif args["type"] == "ItemSend": + if args["item"].player == self.slot: + return TextCategory.OUTGOING + elif args["receiving"] == self.slot: + return TextCategory.INCOMING + else: + return TextCategory.OTHER + + def on_print_json(self, args: dict): + super().on_print_json(args) + if self.bizhawk_ctx.connection_status == ConnectionStatus.CONNECTED: + if self._categorize_text(args) in self.text_passthrough_categories: + Utils.async_start(display_message(self.bizhawk_ctx, self.rawjsontotextparser(copy.deepcopy(args["data"])))) + def make_gui(self): ui = super().make_gui() ui.base_title = "Archipelago BizHawk Client" @@ -205,10 +305,10 @@ async def _game_watcher(ctx: BizHawkClientContext): async def _run_game(rom: str): import os - auto_start = Utils.get_settings().bizhawkclient_options.rom_start + auto_start = settings.get_settings().bizhawkclient_options.rom_start if auto_start is True: - emuhawk_path = Utils.get_settings().bizhawkclient_options.emuhawk_path + emuhawk_path = settings.get_settings().bizhawkclient_options.emuhawk_path subprocess.Popen( [ emuhawk_path, diff --git a/worlds/_sc2common/bot/game_data.py b/worlds/_sc2common/bot/game_data.py index 50f10bd669..ed0edf0b8c 100644 --- a/worlds/_sc2common/bot/game_data.py +++ b/worlds/_sc2common/bot/game_data.py @@ -19,7 +19,7 @@ class GameData: """ :param data: """ - self.abilities: Dict[int, AbilityData] = {} + self.abilities: Dict[int, AbilityData] = {a.ability_id: AbilityData(self, a) for a in data.abilities if a.available} self.units: Dict[int, UnitTypeData] = {u.unit_id: UnitTypeData(self, u) for u in data.units if u.available} self.upgrades: Dict[int, UpgradeData] = {u.upgrade_id: UpgradeData(self, u) for u in data.upgrades} # Cached UnitTypeIds so that conversion does not take long. This needs to be moved elsewhere if a new GameData object is created multiple times per game @@ -40,7 +40,7 @@ class AbilityData: self._proto = proto # What happens if we comment this out? Should this not be commented out? What is its purpose? - assert self.id != 0 + # assert self.id != 0 # let the world burn def __repr__(self) -> str: return f"AbilityData(name={self._proto.button_name})" diff --git a/worlds/adventure/Rom.py b/worlds/adventure/Rom.py index 4d56cd19e5..cb104c56d8 100644 --- a/worlds/adventure/Rom.py +++ b/worlds/adventure/Rom.py @@ -182,10 +182,11 @@ class AdventureDeltaPatch(APPatch, metaclass=AutoPatchRegister): json.dumps(self.rom_deltas), compress_type=zipfile.ZIP_LZMA) - def read_contents(self, opened_zipfile: zipfile.ZipFile): - super(AdventureDeltaPatch, self).read_contents(opened_zipfile) + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> dict[str, Any]: + manifest = super(AdventureDeltaPatch, self).read_contents(opened_zipfile) self.foreign_items = AdventureDeltaPatch.read_foreign_items(opened_zipfile) self.autocollect_items = AdventureDeltaPatch.read_autocollect_items(opened_zipfile) + return manifest @classmethod def get_source_data(cls) -> bytes: diff --git a/worlds/ahit/Client.py b/worlds/ahit/Client.py index 0a9d8d6042..64c1124fa8 100644 --- a/worlds/ahit/Client.py +++ b/worlds/ahit/Client.py @@ -238,10 +238,10 @@ async def proxy_loop(ctx: AHITContext): logger.info("Aborting AHIT Proxy Client due to errors") -def launch(): +def launch(*launch_args: str): async def main(): parser = get_base_parser() - args = parser.parse_args() + args = parser.parse_args(launch_args) ctx = AHITContext(args.connect, args.password) logger.info("Starting A Hat in Time proxy server") diff --git a/worlds/ahit/Locations.py b/worlds/ahit/Locations.py index 713113e691..9937c774d1 100644 --- a/worlds/ahit/Locations.py +++ b/worlds/ahit/Locations.py @@ -477,7 +477,7 @@ act_completions = { "Act Completion (Rush Hour)": LocData(2000311210, "Rush Hour", dlc_flags=HatDLC.dlc2, hookshot=True, - required_hats=[HatType.ICE, HatType.BREWING]), + required_hats=[HatType.ICE, HatType.BREWING, HatType.DWELLER]), "Act Completion (Time Rift - Rumbi Factory)": LocData(2000312736, "Time Rift - Rumbi Factory", dlc_flags=HatDLC.dlc2), diff --git a/worlds/ahit/Options.py b/worlds/ahit/Options.py index ab6ba46f19..981480970d 100644 --- a/worlds/ahit/Options.py +++ b/worlds/ahit/Options.py @@ -623,6 +623,23 @@ class ParadeTrapWeight(Range): default = 20 +class DeathLinkAmnesty(Range): + """Amount of forgiven deaths before sending a Death Link. + 0 means that every death will send a Death Link.""" + display_name = "Death Link Amnesty" + range_start = 0 + range_end = 20 + default = 0 + + +class DWDeathLinkAmnesty(Range): + """Amount of forgiven deaths before sending a Death Link during Death Wish levels.""" + display_name = "Death Wish Amnesty" + range_start = 0 + range_end = 30 + default = 5 + + @dataclass class AHITOptions(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool @@ -700,6 +717,8 @@ class AHITOptions(PerGameCommonOptions): ParadeTrapWeight: ParadeTrapWeight death_link: DeathLink + death_link_amnesty: DeathLinkAmnesty + dw_death_link_amnesty: DWDeathLinkAmnesty ahit_option_groups: Dict[str, List[Any]] = { @@ -769,4 +788,6 @@ slot_data_options: List[str] = [ "MaxPonCost", "death_link", + "death_link_amnesty", + "dw_death_link_amnesty", ] diff --git a/worlds/ahit/Rules.py b/worlds/ahit/Rules.py index 2ca0628a68..1c2c5845db 100644 --- a/worlds/ahit/Rules.py +++ b/worlds/ahit/Rules.py @@ -455,7 +455,7 @@ def set_moderate_rules(world: "HatInTimeWorld"): if "Pink Paw Station Thug" in key and is_location_valid(world, key): set_rule(world.multiworld.get_location(key, world.player), lambda state: True) - # Moderate: clear Rush Hour without Hookshot + # Moderate: clear Rush Hour without Hookshot or Dweller Mask set_rule(world.multiworld.get_location("Act Completion (Rush Hour)", world.player), lambda state: state.has("Metro Ticket - Pink", world.player) and state.has("Metro Ticket - Yellow", world.player) diff --git a/worlds/ahit/__init__.py b/worlds/ahit/__init__.py index 16b54064c6..ff11728372 100644 --- a/worlds/ahit/__init__.py +++ b/worlds/ahit/__init__.py @@ -16,9 +16,9 @@ from worlds.LauncherComponents import Component, components, icon_paths, launch from Utils import local_path -def launch_client(): +def launch_client(*args: str): from .Client import launch - launch_component(launch, name="AHITClient") + launch_component(launch, name="AHITClient", args=args) components.append(Component("A Hat in Time Client", "AHITClient", func=launch_client, @@ -34,7 +34,7 @@ class AWebInTime(WebWorld): "Multiworld Setup Guide", "A guide for setting up A Hat in Time to be played in Archipelago.", "English", - "ahit_en.md", + "setup_en.md", "setup/en", ["CookieCat"] )] @@ -260,11 +260,7 @@ class HatInTimeWorld(World): f"{item_name} ({self.multiworld.get_player_name(loc.item.player)})") slot_data["ShopItemNames"] = shop_item_names - - for name, value in self.options.as_dict(*self.options_dataclass.type_hints).items(): - if name in slot_data_options: - slot_data[name] = value - + slot_data.update(self.options.as_dict(*slot_data_options)) return slot_data def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]): diff --git a/worlds/alttp/Dungeons.py b/worlds/alttp/Dungeons.py index 39e8d7072b..6b7da69593 100644 --- a/worlds/alttp/Dungeons.py +++ b/worlds/alttp/Dungeons.py @@ -209,8 +209,8 @@ def fill_dungeons_restrictive(multiworld: MultiWorld): if localized: in_dungeon_items = [item for item in get_dungeon_item_pool(multiworld) if (item.player, item.name) in localized] if in_dungeon_items: - restricted_players = {player for player, restricted in multiworld.restrict_dungeon_item_on_boss.items() if - restricted} + restricted_players = {world.player for world in multiworld.get_game_worlds("A Link to the Past") if + world.options.restrict_dungeon_item_on_boss} locations: typing.List["ALttPLocation"] = [ location for location in get_unfilled_dungeon_locations(multiworld) # filter boss @@ -255,8 +255,9 @@ def fill_dungeons_restrictive(multiworld: MultiWorld): if all_state_base.has("Triforce", player): all_state_base.remove(multiworld.worlds[player].create_item("Triforce")) - for (player, key_drop_shuffle) in multiworld.key_drop_shuffle.items(): - if not key_drop_shuffle and player not in multiworld.groups: + for lttp_world in multiworld.get_game_worlds("A Link to the Past"): + if not lttp_world.options.key_drop_shuffle and lttp_world.player not in multiworld.groups: + player = lttp_world.player for key_loc in key_drop_data: key_data = key_drop_data[key_loc] all_state_base.remove(item_factory(key_data[3], multiworld.worlds[player])) diff --git a/worlds/alttp/ItemPool.py b/worlds/alttp/ItemPool.py index 57ad01b9e4..53059c64bc 100644 --- a/worlds/alttp/ItemPool.py +++ b/worlds/alttp/ItemPool.py @@ -223,7 +223,7 @@ items_reduction_table = ( def generate_itempool(world): - player = world.player + player: int = world.player multiworld = world.multiworld if world.options.item_pool.current_key not in difficulties: @@ -280,7 +280,6 @@ def generate_itempool(world): if multiworld.custom: pool, placed_items, precollected_items, clock_mode, treasure_hunt_required = ( make_custom_item_pool(multiworld, player)) - multiworld.rupoor_cost = min(multiworld.customitemarray[67], 9999) else: (pool, placed_items, precollected_items, clock_mode, treasure_hunt_required, treasure_hunt_total, additional_triforce_pieces) = get_pool_core(multiworld, player) @@ -386,8 +385,8 @@ def generate_itempool(world): if world.options.retro_bow: shop_items = 0 - shop_locations = [location for shop_locations in (shop.region.locations for shop in multiworld.shops if - shop.type == ShopType.Shop and shop.region.player == player) for location in shop_locations if + shop_locations = [location for shop_locations in (shop.region.locations for shop in world.shops if + shop.type == ShopType.Shop) for location in shop_locations if location.shop_slot is not None] for location in shop_locations: if location.shop.inventory[location.shop_slot]["item"] == "Single Arrow": @@ -546,12 +545,14 @@ def set_up_take_anys(multiworld, world, player): connect_entrance(multiworld, entrance.name, old_man_take_any.name, player) entrance.target = 0x58 old_man_take_any.shop = TakeAny(old_man_take_any, 0x0112, 0xE2, True, True, total_shop_slots) - multiworld.shops.append(old_man_take_any.shop) + world.shops.append(old_man_take_any.shop) - swords = [item for item in multiworld.itempool if item.player == player and item.type == 'Sword'] - if swords: - sword = multiworld.random.choice(swords) - multiworld.itempool.remove(sword) + sword_indices = [ + index for index, item in enumerate(multiworld.itempool) if item.player == player and item.type == 'Sword' + ] + if sword_indices: + sword_index = multiworld.random.choice(sword_indices) + sword = multiworld.itempool.pop(sword_index) multiworld.itempool.append(item_factory('Rupees (20)', world)) old_man_take_any.shop.add_inventory(0, sword.name, 0, 0) loc_name = "Old Man Sword Cave" @@ -572,7 +573,7 @@ def set_up_take_anys(multiworld, world, player): connect_entrance(multiworld, entrance.name, take_any.name, player) entrance.target = target take_any.shop = TakeAny(take_any, room_id, 0xE3, True, True, total_shop_slots + num + 1) - multiworld.shops.append(take_any.shop) + world.shops.append(take_any.shop) take_any.shop.add_inventory(0, 'Blue Potion', 0, 0) take_any.shop.add_inventory(1, 'Boss Heart Container', 0, 0) location = ALttPLocation(player, take_any.name, shop_table_by_location[take_any.name], parent=take_any) diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py index 99cc78e2d9..6a5792d21a 100644 --- a/worlds/alttp/Rom.py +++ b/worlds/alttp/Rom.py @@ -1,6 +1,7 @@ from __future__ import annotations import Utils +import settings import worlds.Files LTTPJPN10HASH: str = "03a63945398191337e896e5771f77173" @@ -514,7 +515,8 @@ def _populate_sprite_table(): logging.debug(f"Spritefile {file} could not be loaded as a valid sprite.") with concurrent.futures.ThreadPoolExecutor() as pool: - sprite_paths = [user_path('data', 'sprites', 'alttpr'), user_path('data', 'sprites', 'custom')] + sprite_paths = [user_path("data", "sprites", "alttp", "remote"), + user_path("data", "sprites", "alttp", "custom")] for dir in [dir for dir in sprite_paths if os.path.isdir(dir)]: for file in os.listdir(dir): pool.submit(load_sprite_from_file, os.path.join(dir, file)) @@ -1001,14 +1003,19 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # set light cones rom.write_byte(0x180038, 0x01 if local_world.options.mode == "standard" else 0x00) - rom.write_byte(0x180039, 0x01 if world.light_world_light_cone else 0x00) - rom.write_byte(0x18003A, 0x01 if world.dark_world_light_cone else 0x00) + # light world light cone + rom.write_byte(0x180039, local_world.light_world_light_cone) + # dark world light cone + rom.write_byte(0x18003A, local_world.dark_world_light_cone) GREEN_TWENTY_RUPEES = 0x47 GREEN_CLOCK = item_table["Green Clock"].item_code rom.write_byte(0x18004F, 0x01) # Byrna Invulnerability: on + # Rupoor negative value + rom.write_int16(0x180036, local_world.rupoor_cost) + # handle item_functionality if local_world.options.item_functionality == 'hard': rom.write_byte(0x180181, 0x01) # Make silver arrows work only on ganon @@ -1026,8 +1033,6 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Disable catching fairies rom.write_byte(0x34FD6, 0x80) overflow_replacement = GREEN_TWENTY_RUPEES - # Rupoor negative value - rom.write_int16(0x180036, world.rupoor_cost) # Set stun items rom.write_byte(0x180180, 0x02) # Hookshot only elif local_world.options.item_functionality == 'expert': @@ -1046,8 +1051,6 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): # Disable catching fairies rom.write_byte(0x34FD6, 0x80) overflow_replacement = GREEN_TWENTY_RUPEES - # Rupoor negative value - rom.write_int16(0x180036, world.rupoor_cost) # Set stun items rom.write_byte(0x180180, 0x00) # Nothing else: @@ -1065,8 +1068,6 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x18004F, 0x01) # Enable catching fairies rom.write_byte(0x34FD6, 0xF0) - # Rupoor negative value - rom.write_int16(0x180036, world.rupoor_cost) # Set stun items rom.write_byte(0x180180, 0x03) # All standard items # Set overflow items for progressive equipment @@ -1312,7 +1313,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x18008C, 0x01 if local_world.options.crystals_needed_for_gt == 0 else 0x00) # GT pre-opened if crystal requirement is 0 rom.write_byte(0xF5D73, 0xF0) # bees are catchable rom.write_byte(0xF5F10, 0xF0) # bees are catchable - rom.write_byte(0x180086, 0x00 if world.aga_randomness else 0x01) # set blue ball and ganon warp randomness + rom.write_byte(0x180086, 0x00) # set blue ball and ganon warp randomness rom.write_byte(0x1800A0, 0x01) # return to light world on s+q without mirror rom.write_byte(0x1800A1, 0x01) # enable overworld screen transition draining for water level inside swamp rom.write_byte(0x180174, 0x01 if local_world.fix_fake_world else 0x00) @@ -1617,7 +1618,7 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool): rom.write_byte(0x1800A3, 0x01) # enable correct world setting behaviour after agahnim kills rom.write_byte(0x1800A4, 0x01 if local_world.options.glitches_required != 'no_logic' else 0x00) # enable POD EG fix rom.write_byte(0x186383, 0x01 if local_world.options.glitches_required == 'no_logic' else 0x00) # disable glitching to Triforce from Ganons Room - rom.write_byte(0x180042, 0x01 if world.save_and_quit_from_boss else 0x00) # Allow Save and Quit after boss kill + rom.write_byte(0x180042, 0x01 if local_world.save_and_quit_from_boss else 0x00) # Allow Save and Quit after boss kill # remove shield from uncle rom.write_bytes(0x6D253, [0x00, 0x00, 0xf6, 0xff, 0x00, 0x0E]) @@ -1738,8 +1739,7 @@ def get_price_data(price: int, price_type: int) -> List[int]: def write_custom_shops(rom, world, player): - shops = sorted([shop for shop in world.shops if shop.custom and shop.region.player == player], - key=lambda shop: shop.sram_offset) + shops = sorted([shop for shop in world.worlds[player].shops if shop.custom], key=lambda shop: shop.sram_offset) shop_data = bytearray() items_data = bytearray() @@ -3023,7 +3023,7 @@ def get_base_rom_bytes(file_name: str = "") -> bytes: def get_base_rom_path(file_name: str = "") -> str: - options = Utils.get_settings() + options = settings.get_settings() if not file_name: file_name = options["lttp_options"]["rom_file"] if not os.path.exists(file_name): diff --git a/worlds/alttp/Rules.py b/worlds/alttp/Rules.py index 2d11d537fb..a5b14e0c2d 100644 --- a/worlds/alttp/Rules.py +++ b/worlds/alttp/Rules.py @@ -147,7 +147,6 @@ def set_defeat_dungeon_boss_rule(location): add_rule(location, lambda state: location.parent_region.dungeon.boss.can_defeat(state)) - def set_always_allow(spot, rule): spot.always_allow = rule @@ -463,12 +462,15 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_location('Misery Mire - Big Chest', player), lambda state: state.has('Big Key (Misery Mire)', player)) set_rule(multiworld.get_location('Misery Mire - Spike Chest', player), lambda state: (world.can_take_damage and has_hearts(state, player, 4)) or state.has('Cane of Byrna', player) or state.has('Cape', player)) set_rule(multiworld.get_entrance('Misery Mire Big Key Door', player), lambda state: state.has('Big Key (Misery Mire)', player)) - # How to access crystal switch: - # If have big key: then you will need 2 small keys to be able to hit switch and return to main area, as you can burn key in dark room - # If not big key: cannot burn key in dark room, hence need only 1 key. all doors immediately available lead to a crystal switch. - # The listed chests are those which can be reached if you can reach a crystal switch. - set_rule(multiworld.get_location('Misery Mire - Map Chest', player), lambda state: state._lttp_has_key('Small Key (Misery Mire)', player, 2)) - set_rule(multiworld.get_location('Misery Mire - Main Lobby', player), lambda state: state._lttp_has_key('Small Key (Misery Mire)', player, 2)) + + # The most number of keys you can burn without opening the map chest and without reaching a crystal switch is 1, + # but if you cannot activate a crystal switch except by throwing a pot, you could burn another two going through + # the conveyor crystal room. + set_rule(multiworld.get_location('Misery Mire - Map Chest', player), lambda state: (state._lttp_has_key('Small Key (Misery Mire)', player, 2) and can_activate_crystal_switch(state, player)) or state._lttp_has_key('Small Key (Misery Mire)', player, 4)) + # Using a key on the map door chest will get you the map chest but not a crystal switch. Main Lobby should require + # one more key. + set_rule(multiworld.get_location('Misery Mire - Main Lobby', player), lambda state: (state._lttp_has_key('Small Key (Misery Mire)', player, 3) and can_activate_crystal_switch(state, player)) or state._lttp_has_key('Small Key (Misery Mire)', player, 5)) + # we can place a small key in the West wing iff it also contains/blocks the Big Key, as we cannot reach and softlock with the basement key door yet set_rule(multiworld.get_location('Misery Mire - Conveyor Crystal Key Drop', player), lambda state: state._lttp_has_key('Small Key (Misery Mire)', player, 4) @@ -542,6 +544,8 @@ def global_rules(multiworld: MultiWorld, player: int): set_rule(multiworld.get_location('Ganons Tower - Bob\'s Torch', player), lambda state: state.has('Pegasus Boots', player)) set_rule(multiworld.get_entrance('Ganons Tower (Tile Room)', player), lambda state: state.has('Cane of Somaria', player)) set_rule(multiworld.get_entrance('Ganons Tower (Hookshot Room)', player), lambda state: state.has('Hammer', player) and (state.has('Hookshot', player) or state.has('Pegasus Boots', player))) + set_rule(multiworld.get_location('Ganons Tower - Double Switch Pot Key', player), lambda state: state.has('Cane of Somaria', player) or can_use_bombs(state, player)) + set_rule(multiworld.get_entrance('Ganons Tower (Double Switch Room)', player), lambda state: state.has('Cane of Somaria', player) or can_use_bombs(state, player)) if world.options.pot_shuffle: set_rule(multiworld.get_location('Ganons Tower - Conveyor Cross Pot Key', player), lambda state: state.has('Hammer', player) and (state.has('Hookshot', player) or state.has('Pegasus Boots', player))) set_rule(multiworld.get_entrance('Ganons Tower (Map Room)', player), lambda state: state._lttp_has_key('Small Key (Ganons Tower)', player, 8) or ( @@ -975,18 +979,19 @@ def check_is_dark_world(region): return False -def add_conditional_lamps(world, player): +def add_conditional_lamps(multiworld, player): # Light cones in standard depend on which world we actually are in, not which one the location would normally be # We add Lamp requirements only to those locations which lie in the dark world (or everything if open + local_world = multiworld.worlds[player] def add_conditional_lamp(spot, region, spottype='Location', accessible_torch=False): - if (not world.dark_world_light_cone and check_is_dark_world(world.get_region(region, player))) or ( - not world.light_world_light_cone and not check_is_dark_world(world.get_region(region, player))): + if (not local_world.dark_world_light_cone and check_is_dark_world(local_world.get_region(region))) or ( + not local_world.light_world_light_cone and not check_is_dark_world(local_world.get_region(region))): if spottype == 'Location': - spot = world.get_location(spot, player) + spot = local_world.get_location(spot) else: - spot = world.get_entrance(spot, player) - add_lamp_requirement(world, spot, player, accessible_torch) + spot = local_world.get_entrance(spot) + add_lamp_requirement(multiworld, spot, player, accessible_torch) add_conditional_lamp('Misery Mire (Vitreous)', 'Misery Mire (Entrance)', 'Entrance') add_conditional_lamp('Turtle Rock (Dark Room) (North)', 'Turtle Rock (Entrance)', 'Entrance') @@ -997,7 +1002,7 @@ def add_conditional_lamps(world, player): 'Location', True) add_conditional_lamp('Palace of Darkness - Dark Basement - Right', 'Palace of Darkness (Entrance)', 'Location', True) - if world.worlds[player].options.mode != 'inverted': + if multiworld.worlds[player].options.mode != 'inverted': add_conditional_lamp('Agahnim 1', 'Agahnims Tower', 'Entrance') add_conditional_lamp('Castle Tower - Dark Maze', 'Agahnims Tower') add_conditional_lamp('Castle Tower - Dark Archer Key Drop', 'Agahnims Tower') @@ -1019,10 +1024,10 @@ def add_conditional_lamps(world, player): add_conditional_lamp('Eastern Palace - Boss', 'Eastern Palace', 'Location', True) add_conditional_lamp('Eastern Palace - Prize', 'Eastern Palace', 'Location', True) - if not world.worlds[player].options.mode == "standard": - add_lamp_requirement(world, world.get_location('Sewers - Dark Cross', player), player) - add_lamp_requirement(world, world.get_entrance('Sewers Back Door', player), player) - add_lamp_requirement(world, world.get_entrance('Throne Room', player), player) + if not multiworld.worlds[player].options.mode == "standard": + add_lamp_requirement(multiworld, local_world.get_location("Sewers - Dark Cross"), player) + add_lamp_requirement(multiworld, local_world.get_entrance("Sewers Back Door"), player) + add_lamp_requirement(multiworld, local_world.get_entrance("Throne Room"), player) def open_rules(world, player): diff --git a/worlds/alttp/Shops.py b/worlds/alttp/Shops.py index bb3945f5b0..89e43a1a04 100644 --- a/worlds/alttp/Shops.py +++ b/worlds/alttp/Shops.py @@ -14,8 +14,6 @@ from .Items import item_name_groups from .StateHelpers import has_hearts, can_use_bombs, can_hold_arrows -logger = logging.getLogger("Shops") - @unique class ShopType(IntEnum): @@ -162,7 +160,10 @@ shop_class_mapping = {ShopType.UpgradeShop: UpgradeShop, def push_shop_inventories(multiworld): - shop_slots = [location for shop_locations in (shop.region.locations for shop in multiworld.shops if shop.type + all_shops = [] + for world in multiworld.get_game_worlds(ALttPLocation.game): + all_shops.extend(world.shops) + shop_slots = [location for shop_locations in (shop.region.locations for shop in all_shops if shop.type != ShopType.TakeAny) for location in shop_locations if location.shop_slot is not None] for location in shop_slots: @@ -178,7 +179,7 @@ def push_shop_inventories(multiworld): get_price(multiworld, location.shop.inventory[location.shop_slot], location.player, location.shop_price_type)[1]) - for world in multiworld.get_game_worlds("A Link to the Past"): + for world in multiworld.get_game_worlds(ALttPLocation.game): world.pushed_shop_inventories.set() @@ -225,7 +226,7 @@ def create_shops(multiworld, player: int): if locked is None: shop.locked = True region.shop = shop - multiworld.shops.append(shop) + multiworld.worlds[player].shops.append(shop) for index, item in enumerate(inventory): shop.add_inventory(index, *item) if not locked and (num_slots or type == ShopType.UpgradeShop): @@ -309,50 +310,50 @@ def set_up_shops(multiworld, player: int): from .Options import small_key_shuffle # TODO: move hard+ mode changes for shields here, utilizing the new shops - if multiworld.worlds[player].options.retro_bow: + local_world = multiworld.worlds[player] + + if local_world.options.retro_bow: rss = multiworld.get_region('Red Shield Shop', player).shop + # Can't just replace the single arrow with 10 arrows as retro doesn't need them. replacement_items = [['Red Potion', 150], ['Green Potion', 75], ['Blue Potion', 200], ['Bombs (10)', 50], - ['Blue Shield', 50], ['Small Heart', - 10]] # Can't just replace the single arrow with 10 arrows as retro doesn't need them. - if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: + ['Blue Shield', 50], ['Small Heart', 10]] + if local_world.options.small_key_shuffle == small_key_shuffle.option_universal: replacement_items.append(['Small Key (Universal)', 100]) replacement_item = multiworld.random.choice(replacement_items) rss.add_inventory(2, 'Single Arrow', 80, 1, replacement_item[0], replacement_item[1]) rss.locked = True - if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal or multiworld.worlds[player].options.retro_bow: - for shop in multiworld.random.sample([s for s in multiworld.shops if - s.custom and not s.locked and s.type == ShopType.Shop - and s.region.player == player], 5): + if local_world.options.small_key_shuffle == small_key_shuffle.option_universal or local_world.options.retro_bow: + for shop in multiworld.random.sample([s for s in local_world.shops if + s.custom and not s.locked and s.type == ShopType.Shop], 5): shop.locked = True slots = [0, 1, 2] multiworld.random.shuffle(slots) slots = iter(slots) - if multiworld.worlds[player].options.small_key_shuffle == small_key_shuffle.option_universal: + if local_world.options.small_key_shuffle == small_key_shuffle.option_universal: shop.add_inventory(next(slots), 'Small Key (Universal)', 100) - if multiworld.worlds[player].options.retro_bow: + if local_world.options.retro_bow: shop.push_inventory(next(slots), 'Single Arrow', 80) - if multiworld.worlds[player].options.shuffle_capacity_upgrades: - for shop in multiworld.shops: - if shop.type == ShopType.UpgradeShop and shop.region.player == player and \ + if local_world.options.shuffle_capacity_upgrades: + for shop in local_world.shops: + if shop.type == ShopType.UpgradeShop and \ shop.region.name == "Capacity Upgrade": shop.clear_inventory() - if (multiworld.worlds[player].options.shuffle_shop_inventories or multiworld.worlds[player].options.randomize_shop_prices - or multiworld.worlds[player].options.randomize_cost_types): + if (local_world.options.shuffle_shop_inventories or local_world.options.randomize_shop_prices + or local_world.options.randomize_cost_types): shops = [] total_inventory = [] - for shop in multiworld.shops: - if shop.region.player == player: - if shop.type == ShopType.Shop and not shop.locked: - shops.append(shop) - total_inventory.extend(shop.inventory) + for shop in local_world.shops: + if shop.type == ShopType.Shop and not shop.locked: + shops.append(shop) + total_inventory.extend(shop.inventory) for item in total_inventory: item["price_type"], item["price"] = get_price(multiworld, item, player) - if multiworld.worlds[player].options.shuffle_shop_inventories: + if local_world.options.shuffle_shop_inventories: multiworld.random.shuffle(total_inventory) i = 0 @@ -407,7 +408,7 @@ price_rate_display = { } -def get_price_modifier(item): +def get_price_modifier(item) -> float: if item.game == "A Link to the Past": if any(x in item.name for x in ['Compass', 'Map', 'Single Bomb', 'Single Arrow', 'Piece of Heart']): @@ -418,9 +419,9 @@ def get_price_modifier(item): elif any(x in item.name for x in ['Small Key', 'Heart']): return 0.5 else: - return 1 + return 1.0 if item.advancement: - return 1 + return 1.0 elif item.useful: return 0.5 else: @@ -471,7 +472,7 @@ def get_price(multiworld, item, player: int, price_type=None): def shop_price_rules(state: CollectionState, player: int, location: ALttPLocation): if location.shop_price_type == ShopPriceType.Hearts: - return has_hearts(state, player, (location.shop_price / 8) + 1) + return has_hearts(state, player, (location.shop_price // 8) + 1) elif location.shop_price_type == ShopPriceType.Bombs: return can_use_bombs(state, player, location.shop_price) elif location.shop_price_type == ShopPriceType.Arrows: diff --git a/worlds/alttp/StateHelpers.py b/worlds/alttp/StateHelpers.py index 6ac3c4b8f8..98409c8a8d 100644 --- a/worlds/alttp/StateHelpers.py +++ b/worlds/alttp/StateHelpers.py @@ -14,13 +14,13 @@ def can_bomb_clip(state: CollectionState, region: LTTPRegion, player: int) -> bo def can_buy_unlimited(state: CollectionState, item: str, player: int) -> bool: - return any(shop.region.player == player and shop.has_unlimited(item) and shop.region.can_reach(state) for - shop in state.multiworld.shops) + return any(shop.has_unlimited(item) and shop.region.can_reach(state) for + shop in state.multiworld.worlds[player].shops) def can_buy(state: CollectionState, item: str, player: int) -> bool: - return any(shop.region.player == player and shop.has(item) and shop.region.can_reach(state) for - shop in state.multiworld.shops) + return any(shop.has(item) and shop.region.can_reach(state) for + shop in state.multiworld.worlds[player].shops) def can_shoot_arrows(state: CollectionState, player: int, count: int = 0) -> bool: diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py index 7f8d6ddf68..4ee5b9d266 100644 --- a/worlds/alttp/__init__.py +++ b/worlds/alttp/__init__.py @@ -236,6 +236,8 @@ class ALTTPWorld(World): required_client_version = (0, 4, 1) web = ALTTPWeb() + shops: list[Shop] + pedestal_credit_texts: typing.Dict[int, str] = \ {data.item_code: data.pedestal_credit for data in item_table.values() if data.pedestal_credit} sickkid_credit_texts: typing.Dict[int, str] = \ @@ -282,6 +284,10 @@ class ALTTPWorld(World): clock_mode: str = "" treasure_hunt_required: int = 0 treasure_hunt_total: int = 0 + light_world_light_cone: bool = False + dark_world_light_cone: bool = False + save_and_quit_from_boss: bool = True + rupoor_cost: int = 10 def __init__(self, *args, **kwargs): self.dungeon_local_item_names = set() @@ -298,6 +304,7 @@ class ALTTPWorld(World): self.fix_trock_exit = None self.required_medallions = ["Ether", "Quake"] self.escape_assist = [] + self.shops = [] super(ALTTPWorld, self).__init__(*args, **kwargs) @classmethod @@ -505,10 +512,11 @@ class ALTTPWorld(World): def pre_fill(self): from Fill import fill_restrictive, FillError attempts = 5 - all_state = self.multiworld.get_all_state(use_cache=False) + all_state = self.multiworld.get_all_state(perform_sweep=False) crystals = [self.create_item(name) for name in ['Red Pendant', 'Blue Pendant', 'Green Pendant', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 7', 'Crystal 5', 'Crystal 6']] for crystal in crystals: all_state.remove(crystal) + all_state.sweep_for_advancements() crystal_locations = [self.get_location('Turtle Rock - Prize'), self.get_location('Eastern Palace - Prize'), self.get_location('Desert Palace - Prize'), @@ -799,7 +807,7 @@ class ALTTPWorld(World): return shop_data - if shop_info := [build_shop_info(shop) for shop in self.multiworld.shops if shop.custom]: + if shop_info := [build_shop_info(shop) for shop in self.shops if shop.custom]: spoiler_handle.write('\n\nShops:\n\n') for shop_data in shop_info: spoiler_handle.write("{} [{}]\n {}\n".format(shop_data['location'], shop_data['type'], "\n ".join( diff --git a/worlds/alttp/test/__init__.py b/worlds/alttp/test/__init__.py index 307e75381d..e69de29bb2 100644 --- a/worlds/alttp/test/__init__.py +++ b/worlds/alttp/test/__init__.py @@ -1,22 +0,0 @@ -import unittest -from argparse import Namespace - -from BaseClasses import MultiWorld, CollectionState -from worlds import AutoWorldRegister - - -class LTTPTestBase(unittest.TestCase): - def world_setup(self): - from worlds.alttp.Options import Medallion - self.multiworld = MultiWorld(1) - self.multiworld.game[1] = "A Link to the Past" - self.multiworld.state = CollectionState(self.multiworld) - self.multiworld.set_seed(None) - args = Namespace() - for name, option in AutoWorldRegister.world_types["A Link to the Past"].options_dataclass.type_hints.items(): - setattr(args, name, {1: option.from_any(getattr(option, "default"))}) - self.multiworld.set_options(args) - self.world = self.multiworld.worlds[1] - # by default medallion access is randomized, for unittests we set it to vanilla - self.world.options.misery_mire_medallion.value = Medallion.option_ether - self.world.options.turtle_rock_medallion.value = Medallion.option_quake diff --git a/worlds/alttp/test/bases.py b/worlds/alttp/test/bases.py new file mode 100644 index 0000000000..c3b4f47a69 --- /dev/null +++ b/worlds/alttp/test/bases.py @@ -0,0 +1,113 @@ +import unittest +from argparse import Namespace + +from BaseClasses import MultiWorld, CollectionState, ItemClassification +from worlds import AutoWorldRegister +from ..Items import item_factory + + +class TestBase(unittest.TestCase): + multiworld: MultiWorld + _state_cache = {} + + def get_state(self, items): + if (self.multiworld, tuple(items)) in self._state_cache: + return self._state_cache[self.multiworld, tuple(items)] + state = CollectionState(self.multiworld) + for item in items: + item.classification = ItemClassification.progression + state.collect(item, prevent_sweep=True) + state.sweep_for_advancements() + state.update_reachable_regions(1) + self._state_cache[self.multiworld, tuple(items)] = state + return state + + def get_path(self, state, region): + def flist_to_iter(node): + while node: + value, node = node + yield value + + from itertools import zip_longest + reversed_path_as_flist = state.path.get(region, (region, None)) + string_path_flat = reversed(list(map(str, flist_to_iter(reversed_path_as_flist)))) + # Now we combine the flat string list into (region, exit) pairs + pathsiter = iter(string_path_flat) + pathpairs = zip_longest(pathsiter, pathsiter) + return list(pathpairs) + + def run_location_tests(self, access_pool): + for i, (location, access, *item_pool) in enumerate(access_pool): + items = item_pool[0] + all_except = item_pool[1] if len(item_pool) > 1 else None + state = self._get_items(item_pool, all_except) + path = self.get_path(state, self.multiworld.get_location(location, 1).parent_region) + with self.subTest(msg="Reach Location", location=location, access=access, items=items, + all_except=all_except, path=path, entry=i): + + self.assertEqual(self.multiworld.get_location(location, 1).can_reach(state), access, + f"failed {self.multiworld.get_location(location, 1)} with: {item_pool}") + + # check for partial solution + if not all_except and access: # we are not supposed to be able to reach location with partial inventory + for missing_item in item_pool[0]: + with self.subTest(msg="Location reachable without required item", location=location, + items=item_pool[0], missing_item=missing_item, entry=i): + state = self._get_items_partial(item_pool, missing_item) + + self.assertEqual(self.multiworld.get_location(location, 1).can_reach(state), False, + f"failed {self.multiworld.get_location(location, 1)}: succeeded with " + f"{missing_item} removed from: {item_pool}") + + def run_entrance_tests(self, access_pool): + for i, (entrance, access, *item_pool) in enumerate(access_pool): + items = item_pool[0] + all_except = item_pool[1] if len(item_pool) > 1 else None + state = self._get_items(item_pool, all_except) + path = self.get_path(state, self.multiworld.get_entrance(entrance, 1).parent_region) + with self.subTest(msg="Reach Entrance", entrance=entrance, access=access, items=items, + all_except=all_except, path=path, entry=i): + + self.assertEqual(self.multiworld.get_entrance(entrance, 1).can_reach(state), access) + + # check for partial solution + if not all_except and access: # we are not supposed to be able to reach location with partial inventory + for missing_item in item_pool[0]: + with self.subTest(msg="Entrance reachable without required item", entrance=entrance, + items=item_pool[0], missing_item=missing_item, entry=i): + state = self._get_items_partial(item_pool, missing_item) + self.assertEqual(self.multiworld.get_entrance(entrance, 1).can_reach(state), False, + f"failed {self.multiworld.get_entrance(entrance, 1)} with: {item_pool}") + + def _get_items(self, item_pool, all_except): + if all_except and len(all_except) > 0: + items = self.multiworld.itempool[:] + items = [item for item in items if + item.name not in all_except and not ("Bottle" in item.name and "AnyBottle" in all_except)] + items.extend(item_factory(item_pool[0], self.multiworld.worlds[1])) + else: + items = item_factory(item_pool[0], self.multiworld.worlds[1]) + return self.get_state(items) + + def _get_items_partial(self, item_pool, missing_item): + new_items = item_pool[0].copy() + new_items.remove(missing_item) + items = item_factory(new_items, self.multiworld.worlds[1]) + return self.get_state(items) + + +class LTTPTestBase(unittest.TestCase): + def world_setup(self): + from worlds.alttp.Options import Medallion + self.multiworld = MultiWorld(1) + self.multiworld.game[1] = "A Link to the Past" + self.multiworld.set_seed(None) + args = Namespace() + for name, option in AutoWorldRegister.world_types["A Link to the Past"].options_dataclass.type_hints.items(): + setattr(args, name, {1: option.from_any(getattr(option, "default"))}) + self.multiworld.set_options(args) + self.multiworld.state = CollectionState(self.multiworld) + self.world = self.multiworld.worlds[1] + # by default medallion access is randomized, for unittests we set it to vanilla + self.world.options.misery_mire_medallion.value = Medallion.option_ether + self.world.options.turtle_rock_medallion.value = Medallion.option_quake diff --git a/worlds/alttp/test/dungeons/TestDungeon.py b/worlds/alttp/test/dungeons/TestDungeon.py index c06955a122..dd622c4f7f 100644 --- a/worlds/alttp/test/dungeons/TestDungeon.py +++ b/worlds/alttp/test/dungeons/TestDungeon.py @@ -5,7 +5,7 @@ from worlds.alttp.ItemPool import difficulties from worlds.alttp.Items import item_factory from worlds.alttp.Regions import create_regions from worlds.alttp.Shops import create_shops -from worlds.alttp.test import LTTPTestBase +from worlds.alttp.test.bases import LTTPTestBase class TestDungeon(LTTPTestBase): diff --git a/worlds/alttp/test/dungeons/TestMiseryMire.py b/worlds/alttp/test/dungeons/TestMiseryMire.py index 90b7055b76..b44d7d1bee 100644 --- a/worlds/alttp/test/dungeons/TestMiseryMire.py +++ b/worlds/alttp/test/dungeons/TestMiseryMire.py @@ -32,8 +32,8 @@ class TestMiseryMire(TestDungeon): ["Misery Mire - Main Lobby", False, []], ["Misery Mire - Main Lobby", False, [], ['Pegasus Boots', 'Hookshot']], ["Misery Mire - Main Lobby", False, [], ['Small Key (Misery Mire)', 'Big Key (Misery Mire)']], - ["Misery Mire - Main Lobby", True, ['Small Key (Misery Mire)', 'Small Key (Misery Mire)', 'Hookshot', 'Progressive Sword']], - ["Misery Mire - Main Lobby", True, ['Small Key (Misery Mire)', 'Small Key (Misery Mire)', 'Pegasus Boots', 'Progressive Sword']], + ["Misery Mire - Main Lobby", True, ['Small Key (Misery Mire)', 'Small Key (Misery Mire)', 'Small Key (Misery Mire)', 'Hookshot', 'Progressive Sword']], + ["Misery Mire - Main Lobby", True, ['Small Key (Misery Mire)', 'Small Key (Misery Mire)', 'Small Key (Misery Mire)', 'Pegasus Boots', 'Progressive Sword']], ["Misery Mire - Big Key Chest", False, []], ["Misery Mire - Big Key Chest", False, [], ['Fire Rod', 'Lamp']], diff --git a/worlds/alttp/test/inverted/TestInverted.py b/worlds/alttp/test/inverted/TestInverted.py index 3c86b6ba0a..8dc02de730 100644 --- a/worlds/alttp/test/inverted/TestInverted.py +++ b/worlds/alttp/test/inverted/TestInverted.py @@ -1,13 +1,12 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.EntranceShuffle import link_inverted_entrances -from worlds.alttp.InvertedRegions import create_inverted_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from worlds.alttp.Regions import mark_light_world_regions -from worlds.alttp.Shops import create_shops -from test.bases import TestBase +from ...Dungeons import get_dungeon_item_pool +from ...EntranceShuffle import link_inverted_entrances +from ...InvertedRegions import create_inverted_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Regions import mark_light_world_regions +from ...Shops import create_shops -from worlds.alttp.test import LTTPTestBase +from ..bases import LTTPTestBase, TestBase class TestInverted(TestBase, LTTPTestBase): diff --git a/worlds/alttp/test/inverted/TestInvertedBombRules.py b/worlds/alttp/test/inverted/TestInvertedBombRules.py index ab73d91108..5ad5270957 100644 --- a/worlds/alttp/test/inverted/TestInvertedBombRules.py +++ b/worlds/alttp/test/inverted/TestInvertedBombRules.py @@ -4,7 +4,7 @@ from worlds.alttp.EntranceShuffle import connect_entrance, Inverted_LW_Entrances from worlds.alttp.InvertedRegions import create_inverted_regions from worlds.alttp.ItemPool import difficulties from worlds.alttp.Rules import set_inverted_big_bomb_rules -from worlds.alttp.test import LTTPTestBase +from worlds.alttp.test.bases import LTTPTestBase class TestInvertedBombRules(LTTPTestBase): diff --git a/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py b/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py index 972b617a29..958cd3e728 100644 --- a/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py +++ b/worlds/alttp/test/inverted_minor_glitches/TestInvertedMinor.py @@ -1,14 +1,13 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.EntranceShuffle import link_inverted_entrances -from worlds.alttp.InvertedRegions import create_inverted_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from worlds.alttp.Options import GlitchesRequired -from worlds.alttp.Regions import mark_light_world_regions -from worlds.alttp.Shops import create_shops -from test.bases import TestBase +from ...Dungeons import get_dungeon_item_pool +from ...EntranceShuffle import link_inverted_entrances +from ...InvertedRegions import create_inverted_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Options import GlitchesRequired +from ...Regions import mark_light_world_regions +from ...Shops import create_shops -from worlds.alttp.test import LTTPTestBase +from ..bases import LTTPTestBase, TestBase class TestInvertedMinor(TestBase, LTTPTestBase): diff --git a/worlds/alttp/test/inverted_owg/TestInvertedOWG.py b/worlds/alttp/test/inverted_owg/TestInvertedOWG.py index 4be51f6298..8a6b570d71 100644 --- a/worlds/alttp/test/inverted_owg/TestInvertedOWG.py +++ b/worlds/alttp/test/inverted_owg/TestInvertedOWG.py @@ -1,14 +1,13 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.EntranceShuffle import link_inverted_entrances -from worlds.alttp.InvertedRegions import create_inverted_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from worlds.alttp.Options import GlitchesRequired -from worlds.alttp.Regions import mark_light_world_regions -from worlds.alttp.Shops import create_shops -from test.bases import TestBase +from ...Dungeons import get_dungeon_item_pool +from ...EntranceShuffle import link_inverted_entrances +from ...InvertedRegions import create_inverted_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Options import GlitchesRequired +from ...Regions import mark_light_world_regions +from ...Shops import create_shops -from worlds.alttp.test import LTTPTestBase +from ..bases import LTTPTestBase, TestBase class TestInvertedOWG(TestBase, LTTPTestBase): diff --git a/worlds/alttp/test/items/TestDifficulty.py b/worlds/alttp/test/items/TestDifficulty.py index 69dd8a4dc6..ff4deb858a 100644 --- a/worlds/alttp/test/items/TestDifficulty.py +++ b/worlds/alttp/test/items/TestDifficulty.py @@ -1,5 +1,5 @@ -from worlds.alttp.ItemPool import difficulties -from test.bases import TestBase +from ...ItemPool import difficulties +from ..bases import TestBase base_items = 41 extra_counts = (15, 15, 10, 5, 25) diff --git a/worlds/alttp/test/minor_glitches/TestMinor.py b/worlds/alttp/test/minor_glitches/TestMinor.py index d5ffe8cac5..5ffb1ca8f9 100644 --- a/worlds/alttp/test/minor_glitches/TestMinor.py +++ b/worlds/alttp/test/minor_glitches/TestMinor.py @@ -1,11 +1,10 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.InvertedRegions import mark_dark_world_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from test.bases import TestBase -from worlds.alttp.Options import GlitchesRequired +from ...Dungeons import get_dungeon_item_pool +from ...InvertedRegions import mark_dark_world_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Options import GlitchesRequired -from worlds.alttp.test import LTTPTestBase +from ..bases import LTTPTestBase, TestBase class TestMinor(TestBase, LTTPTestBase): diff --git a/worlds/alttp/test/options/test_dungeon_fill.py b/worlds/alttp/test/options/test_dungeon_fill.py index 17501b65d8..4a0d30f7d9 100644 --- a/worlds/alttp/test/options/test_dungeon_fill.py +++ b/worlds/alttp/test/options/test_dungeon_fill.py @@ -38,7 +38,7 @@ class DungeonFillTestBase(TestCase): def test_original_dungeons(self): self.generate_with_options(DungeonItem.option_original_dungeon) for location in self.multiworld.get_filled_locations(): - with (self.subTest(location=location)): + with (self.subTest(location_name=location.name)): if location.parent_region.dungeon is None: self.assertIs(location.item.dungeon, None) else: @@ -52,7 +52,7 @@ class DungeonFillTestBase(TestCase): def test_own_dungeons(self): self.generate_with_options(DungeonItem.option_own_dungeons) for location in self.multiworld.get_filled_locations(): - with self.subTest(location=location): + with self.subTest(location_name=location.name): if location.parent_region.dungeon is None: self.assertIs(location.item.dungeon, None) else: diff --git a/worlds/alttp/test/owg/TestVanillaOWG.py b/worlds/alttp/test/owg/TestVanillaOWG.py index 6b6db1454b..6c246865e9 100644 --- a/worlds/alttp/test/owg/TestVanillaOWG.py +++ b/worlds/alttp/test/owg/TestVanillaOWG.py @@ -1,11 +1,10 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.InvertedRegions import mark_dark_world_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from test.bases import TestBase -from worlds.alttp.Options import GlitchesRequired +from ...Dungeons import get_dungeon_item_pool +from ...InvertedRegions import mark_dark_world_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Options import GlitchesRequired -from worlds.alttp.test import LTTPTestBase +from ..bases import LTTPTestBase, TestBase class TestVanillaOWG(TestBase, LTTPTestBase): diff --git a/worlds/alttp/test/shops/TestSram.py b/worlds/alttp/test/shops/TestSram.py index 74a41a6289..a7dfd37cbe 100644 --- a/worlds/alttp/test/shops/TestSram.py +++ b/worlds/alttp/test/shops/TestSram.py @@ -1,5 +1,5 @@ -from worlds.alttp.Shops import shop_table -from test.bases import TestBase +from ...Shops import shop_table +from ..bases import TestBase class TestSram(TestBase): diff --git a/worlds/alttp/test/vanilla/TestVanilla.py b/worlds/alttp/test/vanilla/TestVanilla.py index 031aec1ff9..2ddcdadc24 100644 --- a/worlds/alttp/test/vanilla/TestVanilla.py +++ b/worlds/alttp/test/vanilla/TestVanilla.py @@ -1,10 +1,10 @@ -from worlds.alttp.Dungeons import get_dungeon_item_pool -from worlds.alttp.InvertedRegions import mark_dark_world_regions -from worlds.alttp.ItemPool import difficulties -from worlds.alttp.Items import item_factory -from test.bases import TestBase -from worlds.alttp.Options import GlitchesRequired -from worlds.alttp.test import LTTPTestBase +from ...Dungeons import get_dungeon_item_pool +from ...InvertedRegions import mark_dark_world_regions +from ...ItemPool import difficulties +from ...Items import item_factory +from ...Options import GlitchesRequired + +from ..bases import LTTPTestBase, TestBase class TestVanilla(TestBase, LTTPTestBase): diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 40170e0c32..3436374ac7 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -4,7 +4,7 @@ Date: Fri, 15 Mar 2024 18:41:40 +0000 Description: Used to manage Regions in the Aquaria game multiworld randomizer """ -from typing import Dict, Optional +from typing import Dict, Optional, Iterable from BaseClasses import MultiWorld, Region, Entrance, Item, ItemClassification, CollectionState from .Items import AquariaItem, ItemNames from .Locations import AquariaLocations, AquariaLocation, AquariaLocationNames @@ -34,10 +34,15 @@ def _has_li(state: CollectionState, player: int) -> bool: return state.has(ItemNames.LI_AND_LI_SONG, player) -def _has_damaging_item(state: CollectionState, player: int) -> bool: - """`player` in `state` has the shield song item""" - return state.has_any({ItemNames.ENERGY_FORM, ItemNames.NATURE_FORM, ItemNames.BEAST_FORM, ItemNames.LI_AND_LI_SONG, - ItemNames.BABY_NAUTILUS, ItemNames.BABY_PIRANHA, ItemNames.BABY_BLASTER}, player) +DAMAGING_ITEMS:Iterable[str] = [ + ItemNames.ENERGY_FORM, ItemNames.NATURE_FORM, ItemNames.BEAST_FORM, + ItemNames.LI_AND_LI_SONG, ItemNames.BABY_NAUTILUS, ItemNames.BABY_PIRANHA, + ItemNames.BABY_BLASTER +] + +def _has_damaging_item(state: CollectionState, player: int, damaging_items:Iterable[str] = DAMAGING_ITEMS) -> bool: + """`player` in `state` has the an item that do damage other than the ones in `to_remove`""" + return state.has_any(damaging_items, player) def _has_energy_attack_item(state: CollectionState, player: int) -> bool: @@ -566,9 +571,11 @@ class AquariaRegions: self.__connect_one_way_regions(self.openwater_tr, self.openwater_tr_turtle, lambda state: _has_beast_form_or_arnassi_armor(state, self.player)) self.__connect_one_way_regions(self.openwater_tr_turtle, self.openwater_tr) + damaging_items_minus_nature_form = [item for item in DAMAGING_ITEMS if item != ItemNames.NATURE_FORM] self.__connect_one_way_regions(self.openwater_tr, self.openwater_tr_urns, lambda state: _has_bind_song(state, self.player) or - _has_damaging_item(state, self.player)) + _has_damaging_item(state, self.player, + damaging_items_minus_nature_form)) self.__connect_regions(self.openwater_tr, self.openwater_br) self.__connect_regions(self.openwater_tr, self.mithalas_city) self.__connect_regions(self.openwater_tr, self.veil_b) diff --git a/worlds/archipidle/Items.py b/worlds/archipidle/Items.py deleted file mode 100644 index 94665631b7..0000000000 --- a/worlds/archipidle/Items.py +++ /dev/null @@ -1,315 +0,0 @@ -item_table = ( - 'An Old GeoCities Profile', - 'Very Funny Joke', - 'Motivational Video', - 'Staples Easy Button', - 'One Million Dollars', - 'Replica Master Sword', - 'VHS Copy of Jurassic Park', - '32GB USB Drive', - 'Pocket Protector', - 'Leftover Parts from IKEA Furniture', - 'Half-Empty Ink Cartridge for a Printer', - 'Watch Battery', - 'Towel', - 'Scarf', - '2012 Magic the Gathering Core Set Starter Box', - 'Poke\'mon Booster Pack', - 'USB Speakers', - 'Eco-Friendly Spork', - 'Cheeseburger', - 'Brand New Car', - 'Hunting Knife', - 'Zippo Lighter', - 'Red Shirt', - 'One-Up Mushroom', - 'Nokia N-GAGE', - '2-Liter of Sprite', - 'Free trial of the critically acclaimed MMORPG Final Fantasy XIV, including the entirety of A Realm Reborn and the award winning Heavensward and Stormblood expansions up to level 70 with no restrictions on playtime!', - 'Can of Compressed Air', - 'Striped Kitten', - 'USB Power Adapter', - 'Fortune Cookie', - 'Nintendo Power Glove', - 'The Lampshade of No Real Significance', - 'Kneepads of Allure', - 'Get Out of Jail Free Card', - 'Box Set of Stargate SG-1 Season 4', - 'The Missing Left Sock', - 'Poster Tube', - 'Electronic Picture Frame', - 'Bottle of Shampoo', - 'Your Mission, Should You Choose To Accept It', - 'Fanny Pack', - 'Robocop T-Shirt', - 'Suspiciously Small Monocle', - 'Table Saw', - 'Cookies and Cream Milkshake', - 'Deflated Accordion', - 'Grandma\'s Homemade Pie', - 'Invisible Lego on the Floor', - 'Pitfall Trap', - 'Flathead Screwdriver', - 'Leftover Pizza', - 'Voodoo Doll that Looks Like You', - 'Pink Shoelaces', - 'Half a Bottle of Scotch', - 'Reminder Not to Forget Aginah', - 'Medicine Ball', - 'Yoga Mat', - 'Chocolate Orange', - 'Old Concert Tickets', - 'The Pick of Destiny', - 'McGuffin', - 'Just a Regular McMuffin', - '34 Tacos', - 'Duct Tape', - 'Copy of Untitled Goose Game', - 'Partially Used Bed Bath & Beyond Gift Card', - 'Mostly Popped Bubble Wrap', - 'Expired Driver\'s License', - 'The Look, You Know the One', - 'Transformers Lunch Box', - 'MP3 Player', - 'Dry Sharpie', - 'Chalkboard Eraser', - 'Overhead Projector', - 'Physical Copy of the Japanese 1.0 Link to the Past', - 'Collectable Action Figure', - 'Box Set of The Lord of the Rings Books', - 'Lite-Bright', - 'Stories from the Good-Old-Days', - 'Un-Reproducable Bug Reports', - 'Autographed Copy of Shaq-Fu', - 'Game-Winning Baseball', - 'Portable Battery Bank', - 'Blockbuster Membership Card', - 'Offensive Bumper Sticker', - 'Last Sunday\'s Crossword Puzzle', - 'Rubik\'s Cube', - 'Your First Grey Hair', - 'Embarrassing Childhood Photo', - 'Abandoned Sphere One Check', - 'The Internet', - 'Late-Night Cartoons', - 'The Correct Usage of a Semicolon', - 'Microsoft Windows 95 Resource Kit', - 'Car-Phone', - 'Walkman Radio', - 'Relevant XKCD Comic', - 'Razor Scooter', - 'Set of Beyblades', - 'Box of Pogs', - 'Beanie-Baby Collection', - 'Laser Tag Gun', - 'Radio Controlled Car', - 'Boogie Board', - 'Air Jordans', - 'Rubber Duckie', - 'The Last Cookie in the Cookie Jar', - 'Tin-Foil Hat', - 'Button-Up Shirt', - 'Designer Brand Bag', - 'Trapper Keeper', - 'Fake Moustache', - 'Colored Pencils', - 'Pair of 3D Glasses', - 'Pair of Movie Tickets', - 'Refrigerator Magnets', - 'NASCAR Dinner Plates', - 'The Final Boss', - 'Unskippable Cutscenes', - '24 Rolls of Toilet Paper', - 'Canned Soup', - 'Warm Blanket', - '3D Printer', - 'Jetpack', - 'Hoverboard', - 'Joycons with No Drift', - 'Double Rainbow', - 'Ping Pong Ball', - 'Area 51 Arcade Cabinet', - 'Elephant in the Room', - 'The Pink Panther', - 'Denim Shorts', - 'Tennis Racket', - 'Collection of Stuffed Animals', - 'Old Cell Phone', - 'Nintendo Virtual Boy', - 'Box of 5.25 Inch Floppy Disks', - 'Bag of Miscellaneous Wires', - 'Garden Shovel', - 'Leather Gloves', - 'Knife of +9 VS Ogres', - 'Old, Smelly Cheese', - 'Linksys BEFSR41 Router', - 'Ethernet Cables for a LAN Party', - 'Mechanical Pencil', - 'Book of Graph Paper', - '300 Sheets of Printer Paper', - 'One AAA Battery', - 'Box of Old Game Controllers', - 'Sega Dreamcast', - 'Mario\'s Overalls', - 'Betamax Player', - 'Stray Lego', - 'Chocolate Chip Pancakes', - 'Two Blueberry Muffins', - 'Nintendo 64 Controller with a Perfect Thumbstick', - 'Cuckoo Crossing the Road', - 'One Eyed, One Horned, Flying Purple People-Eater', - 'Love Potion Number Nine', - 'Wireless Headphones', - 'Festive Keychain', - 'Bundle of Twisted Cables', - 'Plank of Wood', - 'Broken Ant Farm', - 'Thirty-six American Dollars', - 'Can of Shaving Cream', - 'Blue Hair Dye', - 'Mug Engraved with the AP Logo', - 'Tube of Toothpaste', - 'Album of Elevator Music', - 'Headlight Fluid', - 'Tickets to the Renaissance Faire', - 'Bag of Golf Balls', - 'Box of Packing Peanuts', - 'Bottle of Peanut Butter', - 'Breath of the Wild Cookbook', - 'Stardew Valley Cookbook', - 'Thirteen Angry Chickens', - 'Bowl of Cereal', - 'Rubber Snake', - 'Stale Sunflower Seeds', - 'Alarm Clock Without a Snooze Button', - 'Wet Pineapple', - 'Set of Scented Candles', - 'Adorable Stuffed Animal', - 'The Broodwitch', - 'Old Photo Album', - 'Trade Quest Item', - 'Pair of Fancy Boots', - 'Shoddy Pickaxe', - 'Adventurer\'s Sword', - 'Cute Puppy', - 'Box of Matches', - 'Set of Allen Wrenches', - 'Glass of Water', - 'Magic Shaggy Carpet', - 'Macaroni and Cheese', - 'Chocolate Chip Cookie Dough Ice Cream', - 'Fresh Strawberries', - 'Delicious Tacos', - 'The Krabby Patty Recipe', - 'Map to Waldo\'s Location', - 'Stray Cat', - 'Ham and Cheese Sandwich', - 'DVD Player', - 'Motorcycle Helmet', - 'Fake Flowers', - '6-Pack of Sponges', - 'Heated Pants', - 'Empty Glass Bottle', - 'Brown Paper Bag', - 'Model Train Set', - 'TV Remote', - 'RC Car', - 'Super Soaker 9000', - 'Giant Sunglasses', - 'World\'s Smallest Violin', - 'Pile of Fresh Warm Laundry', - 'Half-Empty Ice Cube Tray', - 'Bob Ross Afro Wig', - 'Empty Cardboard Box', - 'Packet of Soy Sauce', - 'Solutions to a Math Test', - 'Pencil Eraser', - 'The Great Pumpkin', - 'Very Expensive Toaster', - 'Pack of Colored Sharpies', - 'Bag of Chocolate Chips', - 'Grandma\'s Homemade Cookies', - 'Collection of Bottle Caps', - 'Pack of Playing Cards', - 'Boom Box', - 'Toy Sail Boat', - 'Smooth Nail File', - 'Colored Chalk', - 'Missing Button', - 'Rubber Band Ball', - 'Joystick', - 'Galaga Arcade Cabinet', - 'Anime Mouse Pad', - 'Orange and Yellow Glow Sticks', - 'Odd Bookmark', - 'Stray Dice', - 'Tooth Picks', - 'Dirty Dishes', - 'Poke\'mon Card Game Rule Book (Gen 1)', - 'Salt Shaker', - 'Digital Thermometer', - 'Infinite Improbability Drive', - 'Fire Extinguisher', - 'Beeping Smoke Alarm', - 'Greasy Spatula', - 'Progressive Auto Insurance', - 'Mace Windu\'s Purple Lightsaber', - 'An Old Fixer-Upper', - 'Gamer Chair', - 'Comfortable Reclining Chair', - 'Shirt Covered in Dog Hair', - 'Angry Praying Mantis', - 'Card Games on Motorcycles', - 'Trucker Hat', - 'The DK Rap', - 'Three Great Balls', - 'Some Very Sus Behavior', - 'Glass of Orange Juice', - 'Turkey Bacon', - 'Bald Barbie Doll', - 'Developer Commentary', - 'Subscription to Nintendo Power Magazine', - 'DeLorean Time Machine', - 'Unkillable Cockroach', - 'Dungeons & Dragons Rulebook', - 'Boxed Copy of Quest 64', - 'James Bond\'s Gadget Wristwatch', - 'Tube of Go-Gurt', - 'Digital Watch', - 'Laser Pointer', - 'The Secret Cow Level', - 'AOL Free Trial CD-ROM', - 'E.T. for Atari 2600', - 'Season 2 of Knight Rider', - 'Spam E-Mails', - 'Half-Life 3 Release Date', - 'Source Code of Jurassic Park', - 'Moldy Cheese', - 'Comic Book Collection', - 'Hardcover Copy of Scott Pilgrim VS the World', - 'Old Gym Shorts', - 'Very Cool Sunglasses', - 'Your High School Yearbook Picture', - 'Written Invitation to Prom', - 'The Star Wars Holiday Special', - 'Oil Change Coupon', - 'Finger Guns', - 'Box of Tabletop Games', - 'Sock Puppets', - 'The Dog of Wisdom', - 'Surprised Chipmunk', - 'Stonks', - 'A Shrubbery', - 'Roomba with a Knife', - 'Wet Cat', - 'The missing moderator, Frostwares', - '1,793 Crossbows', - 'Holographic First Edition Charizard (Gen 1)', - 'VR Headset', - 'Archipelago 1.0 Release Date', - 'Strand of Galadriel\'s Hair', - 'Can of Meow-Mix', - 'Shake-Weight', - 'DVD Collection of Billy Mays Infomercials', - 'Old CD Key', -) diff --git a/worlds/archipidle/Rules.py b/worlds/archipidle/Rules.py deleted file mode 100644 index 2cc6220c69..0000000000 --- a/worlds/archipidle/Rules.py +++ /dev/null @@ -1,28 +0,0 @@ -from BaseClasses import MultiWorld -from worlds.AutoWorld import LogicMixin - - -class ArchipIDLELogic(LogicMixin): - def _archipidle_location_is_accessible(self, player_id, items_required): - return sum(self.prog_items[player_id].values()) >= items_required - - -def set_rules(world: MultiWorld, player: int): - for i in range(16, 31): - world.get_location(f"IDLE item number {i}", player).access_rule = lambda \ - state: state._archipidle_location_is_accessible(player, 4) - - for i in range(31, 51): - world.get_location(f"IDLE item number {i}", player).access_rule = lambda \ - state: state._archipidle_location_is_accessible(player, 10) - - for i in range(51, 101): - world.get_location(f"IDLE item number {i}", player).access_rule = lambda \ - state: state._archipidle_location_is_accessible(player, 20) - - for i in range(101, 201): - world.get_location(f"IDLE item number {i}", player).access_rule = lambda \ - state: state._archipidle_location_is_accessible(player, 40) - - world.completion_condition[player] =\ - lambda state: state.can_reach(world.get_location("IDLE item number 200", player), "Location", player) diff --git a/worlds/archipidle/__init__.py b/worlds/archipidle/__init__.py deleted file mode 100644 index f4345444ef..0000000000 --- a/worlds/archipidle/__init__.py +++ /dev/null @@ -1,128 +0,0 @@ -from BaseClasses import Item, MultiWorld, Region, Location, Entrance, Tutorial, ItemClassification -from worlds.AutoWorld import World, WebWorld -from datetime import datetime -from .Items import item_table -from .Rules import set_rules - - -class ArchipIDLEWebWorld(WebWorld): - theme = 'partyTime' - tutorials = [ - Tutorial( - tutorial_name='Setup Guide', - description='A guide to playing Archipidle', - language='English', - file_name='guide_en.md', - link='guide/en', - authors=['Farrak Kilhn'] - ), - Tutorial( - tutorial_name='Guide d installation', - description='Un guide pour jouer à Archipidle', - language='Français', - file_name='guide_fr.md', - link='guide/fr', - authors=['TheLynk'] - ) - ] - - -class ArchipIDLEWorld(World): - """ - An idle game which sends a check every thirty to sixty seconds, up to two hundred checks. - """ - game = "ArchipIDLE" - topology_present = False - hidden = (datetime.now().month != 4) # ArchipIDLE is only visible during April - web = ArchipIDLEWebWorld() - - item_name_to_id = {} - start_id = 9000 - for item in item_table: - item_name_to_id[item] = start_id - start_id += 1 - - location_name_to_id = {} - start_id = 9000 - for i in range(1, 201): - location_name_to_id[f"IDLE item number {i}"] = start_id - start_id += 1 - - def set_rules(self): - set_rules(self.multiworld, self.player) - - def create_item(self, name: str) -> Item: - return Item(name, ItemClassification.progression, self.item_name_to_id[name], self.player) - - def create_items(self): - item_pool = [ - ArchipIDLEItem( - item_table[0], - ItemClassification.progression, - self.item_name_to_id[item_table[0]], - self.player - ) - ] - - for i in range(40): - item_pool.append(ArchipIDLEItem( - item_table[1], - ItemClassification.progression, - self.item_name_to_id[item_table[1]], - self.player - )) - - for i in range(40): - item_pool.append(ArchipIDLEItem( - item_table[2], - ItemClassification.filler, - self.item_name_to_id[item_table[2]], - self.player - )) - - item_table_copy = list(item_table[3:]) - self.random.shuffle(item_table_copy) - for i in range(119): - item_pool.append(ArchipIDLEItem( - item_table_copy[i], - ItemClassification.progression if i < 9 else ItemClassification.filler, - self.item_name_to_id[item_table_copy[i]], - self.player - )) - - self.multiworld.itempool += item_pool - - def create_regions(self): - self.multiworld.regions += [ - create_region(self.multiworld, self.player, 'Menu', None, ['Entrance to IDLE Zone']), - create_region(self.multiworld, self.player, 'IDLE Zone', self.location_name_to_id) - ] - - # link up our region with the entrance we just made - self.multiworld.get_entrance('Entrance to IDLE Zone', self.player)\ - .connect(self.multiworld.get_region('IDLE Zone', self.player)) - - def get_filler_item_name(self) -> str: - return self.multiworld.random.choice(item_table) - - -def create_region(world: MultiWorld, player: int, name: str, locations=None, exits=None): - region = Region(name, player, world) - if locations: - for location_name in locations.keys(): - location = ArchipIDLELocation(player, location_name, locations[location_name], region) - region.locations.append(location) - - if exits: - for _exit in exits: - region.exits.append(Entrance(player, _exit, region)) - - return region - - -class ArchipIDLEItem(Item): - game = "ArchipIDLE" - - -class ArchipIDLELocation(Location): - game: str = "ArchipIDLE" diff --git a/worlds/archipidle/docs/en_ArchipIDLE.md b/worlds/archipidle/docs/en_ArchipIDLE.md deleted file mode 100644 index c3b396c649..0000000000 --- a/worlds/archipidle/docs/en_ArchipIDLE.md +++ /dev/null @@ -1,13 +0,0 @@ -# ArchipIDLE - -## What is this game? - -ArchipIDLE was originally the 2022 Archipelago April Fools' Day joke. It is an idle game that sends a location check -on regular intervals. Updated annually with more items, gimmicks, and features, the game is visible -only during the month of April. - -## Where is the options page? - -The [player options page for this game](../player-options) contains all the options you need to configure -and export a config file. - diff --git a/worlds/archipidle/docs/guide_en.md b/worlds/archipidle/docs/guide_en.md deleted file mode 100644 index c450ec421d..0000000000 --- a/worlds/archipidle/docs/guide_en.md +++ /dev/null @@ -1,12 +0,0 @@ -# ArchipIdle Setup Guide - -## Joining a MultiWorld Game -1. Generate a `.yaml` file from the [ArchipIDLE Player Options Page](/games/ArchipIDLE/player-options) -2. Open the ArchipIDLE Client in your web browser by either: - - Navigate to the [ArchipIDLE Client](http://idle.multiworld.link) - - Download the client and run it locally from the - [ArchipIDLE GitHub Releases Page](https://github.com/ArchipelagoMW/archipidle/releases) -3. Enter the server address in the `Server Address` field and press enter -4. Enter your slot name when prompted. This should be the same as the `name` you entered on the - options page above, or the `name` field in your yaml file. -5. Click the "Begin!" button. diff --git a/worlds/archipidle/docs/guide_fr.md b/worlds/archipidle/docs/guide_fr.md deleted file mode 100644 index dc0c8af321..0000000000 --- a/worlds/archipidle/docs/guide_fr.md +++ /dev/null @@ -1,11 +0,0 @@ -# Guide de configuration d'ArchipIdle - -## Rejoindre une partie MultiWorld -1. Générez un fichier `.yaml` à partir de la [page des paramètres du lecteur ArchipIDLE](/games/ArchipIDLE/player-options) -2. Ouvrez le client ArchipIDLE dans votre navigateur Web en : - - Accédez au [Client ArchipIDLE](http://idle.multiworld.link) - - Téléchargez le client et exécutez-le localement à partir du [Page des versions d'ArchipIDLE GitHub](https://github.com/ArchipelagoMW/archipidle/releases) -3. Entrez l'adresse du serveur dans le champ `Server Address` et appuyez sur Entrée -4. Entrez votre nom d'emplacement lorsque vous y êtes invité. Il doit être le même que le `name` que vous avez saisi sur le - page de configuration ci-dessus, ou le champ `name` dans votre fichier yaml. -5. Cliquez sur "Commencer !" bouton. diff --git a/worlds/blasphemous/Options.py b/worlds/blasphemous/Options.py index 2cb2d8a1d3..74eb1139ce 100644 --- a/worlds/blasphemous/Options.py +++ b/worlds/blasphemous/Options.py @@ -207,11 +207,7 @@ class EnemyScaling(DefaultOnToggle): class BlasphemousDeathLink(DeathLink): - """ - When you die, everyone dies. The reverse is also true. - - Note that Guilt Fragments will not appear when killed by Death Link. - """ + __doc__ = DeathLink.__doc__ + "\n\n Note that Guilt Fragments will not appear when killed by death link." @dataclass diff --git a/worlds/bomb_rush_cyberfunk/Options.py b/worlds/bomb_rush_cyberfunk/Options.py index 80831d0645..fd327d48ec 100644 --- a/worlds/bomb_rush_cyberfunk/Options.py +++ b/worlds/bomb_rush_cyberfunk/Options.py @@ -175,11 +175,7 @@ class DamageMultiplier(Range): class BRCDeathLink(DeathLink): - """ - When you die, everyone dies. The reverse is also true. - - This can be changed later in the options menu inside the Archipelago phone app. - """ + __doc__ = DeathLink.__doc__ + "\n\n This can be changed later in the options menu inside the Archipelago phone app." @dataclass diff --git a/worlds/bumpstik/Items.py b/worlds/bumpstik/Items.py index c714b74320..c78668f7ed 100644 --- a/worlds/bumpstik/Items.py +++ b/worlds/bumpstik/Items.py @@ -6,7 +6,6 @@ import typing from BaseClasses import Item, ItemClassification -from worlds.alttp import ALTTPWorld class BumpStikLttPText(typing.NamedTuple): @@ -117,13 +116,17 @@ item_table = { item: offset + x for x, item in enumerate(LttPCreditsText.keys()) } -ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" - for name, texts in LttPCreditsText.items()}) -ALTTPWorld.sickkid_credit_texts.update( - {item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) -ALTTPWorld.magicshop_credit_texts.update( - {item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) -ALTTPWorld.zora_credit_texts.update( - {item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) -ALTTPWorld.fluteboy_credit_texts.update( - {item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +try: + from worlds.alttp import ALTTPWorld + ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" + for name, texts in LttPCreditsText.items()}) + ALTTPWorld.sickkid_credit_texts.update( + {item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) + ALTTPWorld.magicshop_credit_texts.update( + {item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) + ALTTPWorld.zora_credit_texts.update( + {item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) + ALTTPWorld.fluteboy_credit_texts.update( + {item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +except ModuleNotFoundError: + pass diff --git a/worlds/bumpstik/archipelago.json b/worlds/bumpstik/archipelago.json new file mode 100644 index 0000000000..64dc1b9cbb --- /dev/null +++ b/worlds/bumpstik/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Bumper Stickers", + "authors": ["KewlioMZX"], + "world_version": "1.0.0", + "minimum_ap_version": "0.6.4" +} diff --git a/worlds/cccharles/BaseID.py b/worlds/cccharles/BaseID.py new file mode 100644 index 0000000000..ab88fb7a06 --- /dev/null +++ b/worlds/cccharles/BaseID.py @@ -0,0 +1,2 @@ +# CCCharles base ID +base_id = 66600000 diff --git a/worlds/cccharles/Items.py b/worlds/cccharles/Items.py new file mode 100644 index 0000000000..0cf7ced038 --- /dev/null +++ b/worlds/cccharles/Items.py @@ -0,0 +1,167 @@ +from BaseClasses import Item +from .BaseID import base_id + + +class CCCharlesItem(Item): + game = "Choo-Choo Charles" + + +optional_items = { + "Scraps": base_id + 1, + "30 Scraps Reward": base_id + 2, + "25 Scraps Reward": base_id + 3, + "35 Scraps Reward": base_id + 4, + "40 Scraps Reward": base_id + 5, + "South Mine Key": base_id + 6, + "North Mine Key": base_id + 7, + "Mountain Ruin Key": base_id + 8, + "Barn Key": base_id + 9, + "Candice's Key": base_id + 10, + "Dead Fish": base_id + 11, + "Lockpicks": base_id + 12, + "Ancient Tablet": base_id + 13, + "Blue Box": base_id + 14, + "Page Drawing": base_id + 15, + "Journal": base_id + 16, + "Timed Dynamite": base_id + 17, + "Box of Rockets": base_id + 18, + "Breaker": base_id + 19, + "Broken Bob": base_id + 20, + "Employment Contracts": base_id + 21, + "Mob Camp Key": base_id + 22, + "Jar of Pickles": base_id + 23 +} + +useless_items = { + "Orange Paint Can": base_id + 24, + "Green Paint Can": base_id + 25, + "White Paint Can": base_id + 26, + "Pink Paint Can": base_id + 27, + "Grey Paint Can": base_id + 28, + "Blue Paint Can": base_id + 29, + "Black Paint Can": base_id + 30, + "Lime Paint Can": base_id + 31, + "Teal Paint Can": base_id + 32, + "Red Paint Can": base_id + 33, + "Purple Paint Can": base_id + 34, + "The Boomer": base_id + 35, + "Bob": base_id + 36 +} + +progression_items = { + "Green Egg": base_id + 37, + "Blue Egg": base_id + 38, + "Red Egg": base_id + 39, + "Remote Explosive": base_id + 40, + "Remote Explosive x8": base_id + 41, # Originally, Paul gives 8 explosives at once + "Temple Key": base_id + 42, + "Bug Spray": base_id + 43 # Should only be considered progressive in Nightmare Mode +} + +item_groups = { + "Weapons": { + "Bug Spray", + "The Boomer", + "Bob" + }, + "Paint Can": { + "Orange Paint Can", + "Green Paint Can", + "White Paint Can", + "Pink Paint Can", + "Grey Paint Can", + "Blue Paint Can", + "Black Paint Can", + "Lime Paint Can", + "Teal Paint Can", + "Red Paint Can", + "Purple Paint Can" + }, + "Train Upgrade": { + "Scraps", + "30 Scraps Reward", + "25 Scraps Reward", + "40 Scraps Reward" + }, + "Dungeon Keys": { + "South Mine Key", + "North Mine Key", + "Mountain Ruin Key" + }, + "Building Keys": { + "Barn Key", + "Candice's Key", + "Mob Camp Key", + "Temple Key" + }, + "Mission Items": { + "Dead Fish", + "Lockpicks", + "Ancient Tablet", + "Blue Box", + "Page Drawing", + "Journal", + "Timed Dynamite", + "Box of Rockets", + "Breaker", + "Broken Bob", + "Employment Contracts", + "Jar of Pickles", + "Remote Explosive", + "Remote Explosive x8" + }, + "Eggs": { + "Green Egg", + "Blue Egg", + "Red Egg" + } +} + + +# All items excepted the duplications (no item amount) +unique_item_dict = {**optional_items, **useless_items, **progression_items} + +# All 691 items to add to the item pool +full_item_list = [] +full_item_list += ["Scraps"] * 637 # 636 + 1 as Scrap Reward (from Ronny) +full_item_list += ["30 Scraps Reward"] * 3 +full_item_list += ["25 Scraps Reward"] * 1 +full_item_list += ["35 Scraps Reward"] * 2 +full_item_list += ["40 Scraps Reward"] * 1 +full_item_list += ["South Mine Key"] * 1 +full_item_list += ["North Mine Key"] * 1 +full_item_list += ["Mountain Ruin Key"] * 1 +full_item_list += ["Barn Key"] * 1 +full_item_list += ["Candice's Key"] * 1 +full_item_list += ["Dead Fish"] * 1 +full_item_list += ["Lockpicks"] * 1 +full_item_list += ["Ancient Tablet"] * 1 +full_item_list += ["Blue Box"] * 1 +full_item_list += ["Page Drawing"] * 8 +full_item_list += ["Journal"] * 1 +full_item_list += ["Timed Dynamite"] * 1 +full_item_list += ["Box of Rockets"] * 1 +full_item_list += ["Breaker"] * 4 +full_item_list += ["Broken Bob"] * 1 +full_item_list += ["Employment Contracts"] * 1 +full_item_list += ["Mob Camp Key"] * 1 +full_item_list += ["Jar of Pickles"] * 1 +full_item_list += ["Orange Paint Can"] * 1 +full_item_list += ["Green Paint Can"] * 1 +full_item_list += ["White Paint Can"] * 1 +full_item_list += ["Pink Paint Can"] * 1 +full_item_list += ["Grey Paint Can"] * 1 +full_item_list += ["Blue Paint Can"] * 1 +full_item_list += ["Black Paint Can"] * 1 +full_item_list += ["Lime Paint Can"] * 1 +full_item_list += ["Teal Paint Can"] * 1 +full_item_list += ["Red Paint Can"] * 1 +full_item_list += ["Purple Paint Can"] * 1 +full_item_list += ["The Boomer"] * 1 +full_item_list += ["Bob"] * 1 +full_item_list += ["Green Egg"] * 1 +full_item_list += ["Blue Egg"] * 1 +full_item_list += ["Red Egg"] * 1 +full_item_list += ["Remote Explosive x8"] * 1 +full_item_list += ["Temple Key"] * 1 +full_item_list += ["Bug Spray"] * 1 diff --git a/worlds/cccharles/Locations.py b/worlds/cccharles/Locations.py new file mode 100644 index 0000000000..63b502bcf4 --- /dev/null +++ b/worlds/cccharles/Locations.py @@ -0,0 +1,914 @@ +from BaseClasses import Location +from .BaseID import base_id + + +class CCCharlesLocation(Location): + game = "Choo-Choo Charles" + +# "First Station": +# /!\ NOT CONSIDERED YET: train_keypickup Train_KeyPickup Photorealistic_Island (X=-8816.341 Y=23392.416 Z=10219.855) + +loc_start_camp = { + "Start Camp Scraps 1": base_id + 1000, # ItemPickup139_5 Camp (X=24006.348 Y=53777.297 Z=10860.107) + "Start Camp Scraps 2": base_id + 1001 # ItemPickup140_8 Camp (X=23951.754 Y=54897.230 Z=10895.235) +} + +loc_tony_tiddle_mission = { + "Barn Tony Tiddle Mission Start": base_id + 1002 # (dialog 5) -> barn_key (1) +} + +loc_barn = { + "Barn Scraps 1": base_id + 1003, # ItemPickup12 Photorealistic_Island (X=70582.805 Y=52591.066 Z=11976.719) + "Barn Scraps 2": base_id + 1004, # ItemPickup4_2 Photorealistic_Island (X=70536.641 Y=51890.633 Z=11986.488) + "Barn Scraps 3": base_id + 1005, # ItemPickup6 Photorealistic_Island (X=70750.336 Y=52275.828 Z=11994.434) + "Barn Scraps 4": base_id + 1006, # ItemPickup11 Photorealistic_Island (X=70937.719 Y=52989.066 Z=12003.523) + "Barn Scraps 5": base_id + 1007, # ItemPickup5 Photorealistic_Island (X=71303.508 Y=52232.188 Z=12003.997) + "Barn Scraps 6": base_id + 1008, # ItemPickup7 Photorealistic_Island (X=71678.672 Y=52825.531 Z=11977.212) + "Barn Scraps 7": base_id + 1009, # ItemPickup8 Photorealistic_Island (X=71506.961 Y=52357.293 Z=12362.159) + "Barn Scraps 8": base_id + 1010, # ItemPickup9 Photorealistic_Island (X=71029.875 Y=52384.613 Z=12362.159) + "Barn Scraps 9": base_id + 1011 # ItemPickup10 Photorealistic_Island (X=71129.594 Y=52600.262 Z=12364.142) +} + +loc_candice_mission = { + "Tutorial House Candice Mission Start": base_id + 1012 # (dialog 3) -> candice_key (2) +} + +loc_tutorial_house = { + "Tutorial House Scraps 1": base_id + 1013, # ItemPickup17_2 Photorealistic_Island (X=74745.852 Y=73865.555 Z=11426.619) + "Tutorial House Scraps 2": base_id + 1014, # ItemPickup18_2 Photorealistic_Island (X=74864.102 Y=73900.094 Z=11426.619) + "Tutorial House Scraps 3": base_id + 1015, # ItemPickup14_2 Photorealistic_Island (X=74877.625 Y=73738.594 Z=11422.057) \!/ Existing match 4 + "Tutorial House Scraps 4": base_id + 1016, # ItemPickup15_8 Photorealistic_Island (X=75068.992 Y=73971.133 Z=11426.619) + "Tutorial House Scraps 5": base_id + 1017, # ItemPickup21_1 Photorealistic_Island (X=74923.500 Y=73571.648 Z=11426.619) + "Tutorial House Scraps 6": base_id + 1018, # ItemPickup19 Photorealistic_Island (X=75194.906 Y=73495.719 Z=11426.619) + "Tutorial House Scraps 7": base_id + 1019, # ItemPickup13_3 Photorealistic_Island (X=75320.102 Y=73446.352 Z=11487.376) + "Tutorial House Scraps 8": base_id + 1020, # ItemPickup20 Photorealistic_Island (X=75298.680 Y=73580.531 Z=11426.619) + "Tutorial House Scraps 9": base_id + 1021 # ItemPickup16_3 Photorealistic_Island (X=75310.008 Y=73770.742 Z=11489.709) +} + +loc_swamp_edges = { + "Swamp Edges Scraps 1": base_id + 1022, # ItemPickup465_67 Swamp_EnvironmentDetails (X=81964.398 Y=72167.305 Z=10116.385) + "Swamp Edges Scraps 2": base_id + 1023, # ItemPickup460_52 Swamp_EnvironmentDetails (X=89674.047 Y=71610.008 Z=9482.095) + "Swamp Edges Scraps 3": base_id + 1024, # ItemPickup459_49 Swamp_EnvironmentDetails (X=91637.156 Y=73345.672 Z=9492.019) + "Swamp Edges Scraps 4": base_id + 1025, # ItemPickup458_46 Swamp_EnvironmentDetails (X=94601.117 Y=75064.117 Z=9567.464) + "Swamp Edges Scraps 5": base_id + 1026, # ItemPickup457_43 Swamp_EnvironmentDetails (X=95536.641 Y=72622.969 Z=9512.531) + "Swamp Edges Scraps 6": base_id + 1027, # ItemPickup456_40 Swamp_EnvironmentDetails (X=96419.922 Y=65508.676 Z=9838.949) + "Swamp Edges Scraps 7": base_id + 1028, # ItemPickup455_37 Swamp_EnvironmentDetails (X=98158.680 Y=63191.629 Z=10477.084) + "Swamp Edges Scraps 8": base_id + 1029, # ItemPickup55_29 Swamp_EnvironmentDetails (X=93421.820 Y=59200.461 Z=9545.312) + "Swamp Edges Scraps 9": base_id + 1030, # ItemPickup453_31 Swamp_EnvironmentDetails(X=92951.648 Y=56453.527 Z=9560.638) + "Swamp Edges Scraps 10": base_id + 1031, # ItemPickup454_34 Swamp_EnvironmentDetails (X=96943.297 Y=58754.043 Z=10728.124) + "Swamp Edges Scraps 11": base_id + 1032, # ItemPickup452_28 Swamp_EnvironmentDetails (X=95000.617 Y=53070.859 Z=10258.078) + "Swamp Edges Scraps 12": base_id + 1033, # ItemPickup451_25 Swamp_EnvironmentDetails (X=91390.703 Y=53628.707 Z=9498.378) + "Swamp Edges Scraps 13": base_id + 1034, # ItemPickup53_23 Swamp_EnvironmentDetails (X=87628.742 Y=51614.957 Z=9487.013) + "Swamp Edges Scraps 14": base_id + 1035, # ItemPickup448_16 Swamp_EnvironmentDetails (X=89785.992 Y=48603.844 Z=9573.859) + "Swamp Edges Scraps 15": base_id + 1036, # ItemPickup447_11 Swamp_EnvironmentDetails (X=89925.383 Y=46288.707 Z=9499.904) + "Swamp Edges Scraps 16": base_id + 1037, # ItemPickup446_8 Swamp_EnvironmentDetails (X=90848.938 Y=43133.535 Z=9729.535) + "Swamp Edges Scraps 17": base_id + 1038, # ItemPickup445_5 Swamp_EnvironmentDetails (X=87382.383 Y=42475.191 Z=9509.929) + "Swamp Edges Scraps 18": base_id + 1039, # ItemPickup444_2 Swamp_EnvironmentDetails (X=87481.820 Y=39316.820 Z=9757.511) + "Swamp Edges Scraps 19": base_id + 1040, # ItemPickup54_26 Swamp_EnvironmentDetails (X=86039.180 Y=37135.004 Z=9826.263) + "Swamp Edges Scraps 20": base_id + 1041, # ItemPickup475_97 Swamp_EnvironmentDetails (X=81798.609 Y=36766.922 Z=9479.318) + "Swamp Edges Scraps 21": base_id + 1042, # ItemPickup474_94 Swamp_EnvironmentDetails (X=79254.055 Y=40120.293 Z=9879.539) + "Swamp Edges Scraps 22": base_id + 1043, # ItemPickup473_91 Swamp_EnvironmentDetails (X=82251.773 Y=42454.027 Z=9482.057) + "Swamp Edges Scraps 23": base_id + 1044, # ItemPickup472_88 Swamp_EnvironmentDetails (X=84903.977 Y=48323.543 Z=9503.382) + "Swamp Edges Scraps 24": base_id + 1045, # ItemPickup471_85 Swamp_EnvironmentDetails (X=84238.609 Y=51239.547 Z=9529.745) + "Swamp Edges Scraps 25": base_id + 1046, # ItemPickup470_82 Swamp_EnvironmentDetails (X=84439.063 Y=53501.563 Z=9491.291) + "Swamp Edges Scraps 26": base_id + 1047, # ItemPickup52_20 Swamp_EnvironmentDetails (X=83025.086 Y=53275.348 Z=9694.177) + "Swamp Edges Scraps 27": base_id + 1048, # ItemPickup469_79 Swamp_EnvironmentDetails (X=79827.055 Y=54791.504 Z=10121.452) + "Swamp Edges Scraps 28": base_id + 1049, # ItemPickup468_76 Swamp_EnvironmentDetails (X=82266.461 Y=58126.316 Z=9660.493) + "Swamp Edges Scraps 29": base_id + 1050, # ItemPickup467_73 Swamp_EnvironmentDetails (X=75911.297 Y=65155.836 Z=10660.832) + "Swamp Edges Scraps 30": base_id + 1051, # ItemPickup466_70 Swamp_EnvironmentDetails (X=81171.641 Y=66836.125 Z=9673.756) + "Swamp Edges Scraps 31": base_id + 1052, # ItemPickup449_19 Swamp_EnvironmentDetails (X=95254.992 Y=40910.563 Z=10503.727) + "Swamp Edges Scraps 32": base_id + 1053 # ItemPickup450_22 Swamp_EnvironmentDetails (X=93992.992 Y=50773.484 Z=10238.064) +} + +loc_swamp_mission = { + "Swamp Shack Scraps 1": base_id + 1054, # ItemPickup51_17 Swamp_EnvironmentDetails (X=87685.797 Y=69754.008 Z=9629.617) + "Swamp Shack Scraps 2": base_id + 1055, # ItemPickup461_55 Swamp_EnvironmentDetails (X=87308.883 Y=69096.789 Z=9624.543) + "Swamp Islet Scraps 1": base_id + 1056, # ItemPickup462_58 Swamp_EnvironmentDetails (X=88101.219 Y=64553.148 Z=9557.692) + "Swamp Islet Scraps 2": base_id + 1057, # ItemPickup463_61 Swamp_EnvironmentDetails (X=87100.922 Y=63590.965 Z=9582.900) + "Swamp Islet Scraps 3": base_id + 1058, # ItemPickup464_64 Swamp_EnvironmentDetails (X=86399.656 Y=64290.805 Z=9493.576) + "Swamp Islet Dead Fish": base_id + 1059, # Swamp_FishPickup Swamp_EnvironmentDetails (X=87288.945 Y=64278.273 Z=9550.320) + "Swamp Lizbeth Murkwater Mission End": base_id + 1060 # (dialog 2) -> 30_scraps_reward +} + +loc_junkyard_area = { + "Junkyard Area Scraps 1": base_id + 1061, # ItemPickup185_29 Junkyard_Details1 (X=94184.391 Y=89760.258 Z=9331.188) + "Junkyard Area Scraps 2": base_id + 1062, # ItemPickup177_5 Junkyard_Details1 (X=91919.469 Y=89681.602 Z=9407.639) + "Junkyard Area Scraps 3": base_id + 1063, # ItemPickup46_5 Junkyard_Details (X=91696.078 Y=90453.563 Z=9480.997) + "Junkyard Area Scraps 4": base_id + 1064, # ItemPickup178_8 Junkyard_Details1 (X=92453.719 Y=91142.531 Z=9398.951) + "Junkyard Area Scraps 5": base_id + 1065, # ItemPickup182_20 Junkyard_Details1 (X=88645.453 Y=90374.930 Z=9507.291) + "Junkyard Area Scraps 6": base_id + 1066, # ItemPickup48_11 Junkyard_Details (X=88461.953 Y=92077.531 Z=9712.173) + "Junkyard Area Scraps 7": base_id + 1067, # ItemPickup49_14 Junkyard_Details (X=91521.555 Y=93773.641 Z=9421.457) + "Junkyard Area Scraps 8": base_id + 1068, # ItemPickup50_17 Junkyard_Details (X=94741.484 Y=92565.938 Z=9221.093) + "Junkyard Area Scraps 9": base_id + 1069, # ItemPickup186_32 Junkyard_Details1 (X=95256.008 Y=91356.789 Z=9251.082) + "Junkyard Area Scraps 10": base_id + 1070, # ItemPickup45_2 Junkyard_Details (X=94289.664 Y=89951.477 Z=9367.076) + "Junkyard Area Daryl Mission Start": base_id + 1071, # (dialog 4) -> Lockpicks (4) + "Junkyard Area Chest Ancient Tablet": base_id + 1072, # Junkyard_TabletPickup Junkyard_Details (X=90715.367 Y=92168.563 Z=9402.729) + "Junkyard Area Daryl Mission End": base_id + 1073 # (dialog 3) -> 25_scraps_reward +} + +loc_south_house = { + "South House Scraps 1": base_id + 1074, # ItemPickup361_26 Secret12_ExteriorDetails (X=85865.969 Y=103869.656 Z=9453.063) + "South House Scraps 2": base_id + 1075, # ItemPickup360_23 Secret12_ExteriorDetails (X=84403.742 Y=107229.039 Z=9067.245) + "South House Scraps 3": base_id + 1076, # ItemPickup359_20 Secret12_ExteriorDetails (X=83389.789 Y=108817.992 Z=8752.255) + "South House Scraps 4": base_id + 1077, # ItemPickup353_2 Secret12_ExteriorDetails (X=82413.547 Y=109697.477 Z=8637.677) + "South House Scraps 5": base_id + 1078, # ItemPickup354_5 Secret12_ExteriorDetails (X=83000.359 Y=110323.664 Z=8560.229) + "South House Scraps 6": base_id + 1079, # ItemPickup358_17 Secret12_ExteriorDetails (X=82072.625 Y=110482.664 Z=8682.441) + "South House Scraps 7": base_id + 1080, # ItemPickup24_30 Secret12_Details (X=81970.766 Y=111082.117 Z=8647.703) + "South House Scraps 8": base_id + 1081, # ItemPickup356_11 Secret12_ExteriorDetails (X=80915.375 Y=108689.758 Z=8377.754) + "South House Scraps 9": base_id + 1082, # ItemPickup355_8 Secret12_ExteriorDetails (X=81762.180 Y=111371.023 Z=7876.312) + "South House Scraps 10": base_id + 1083, # ItemPickup357_14 Secret12_ExteriorDetails (X=80663.336 Y=113306.695 Z=7226.475) + "South House Scraps 11": base_id + 1084, # ItemPickup23_21 Secret12_Details (X=80520.367 Y=113747.039 Z=7252.808) + "South House Scraps 12": base_id + 1085, # ItemPickup22_18 Secret12_Details (X=80830.273 Y=113871.383 Z=7201.687) + "South House Chest Scraps 1": base_id + 1086, # ItemPickup21 Secret12_Details (X=82079.922 Y=110808.602 Z=8739.324) + "South House Chest Scraps 2": base_id + 1087, # ItemPickup18 Secret12_Details (X=82102.664 Y=110813.664 Z=8726.308) + "South House Chest Scraps 3": base_id + 1088, # ItemPickup17 Secret12_Details (X=82091.547 Y=110810.906 Z=8721.354) \!/ Existing match 1 + "South House Chest Scraps 4": base_id + 1089, # ItemPickup16 Secret12_Details (X=82102.664 Y=110813.664 Z=8708.337) KO + "South House Chest Scraps 5": base_id + 1090, # ItemPickup14 Secret12_Details (X=82091.516 Y=110810.898 Z=8701.793) \!/ Existing match 3 + "South House Chest Scraps 6": base_id + 1091 # ItemPickup13_7 Secret12_Details (X=82102.664 Y=110813.625 Z=8688.776) +} + +loc_junkyard_shed = { + "Junkyard Shed Helen Mission Start": base_id + 1092, # (dialog 8) -> south_mine_key (6) + "Junkyard Shed Scraps 1": base_id + 1093, # ItemPickup424_23 Settlement_A_House_1 (X=98303.992 Y=84476.016 Z=9376.540) + "Junkyard Shed Scraps 2": base_id + 1094, # ItemPickup419_8 Settlement_A_House_1 (X=98174.680 Y=84067.383 Z=9249.197) + "Junkyard Shed Scraps 3": base_id + 1095, # ItemPickup418_5 Settlement_A_House_1 (X=97948.977 Y=83354.656 Z=9339.430) + "Junkyard Shed Scraps 4": base_id + 1096, # ItemPickup417_2 Settlement_A_House_1 (X=98208.391 Y=83088.047 Z=9273.632) + "Junkyard Shed Scraps 5": base_id + 1097, # ItemPickup420_11 Settlement_A_House_1 (X=97757.773 Y=82995.656 Z=9298.597) + "Junkyard Shed Scraps 6": base_id + 1098, # ItemPickup422_17 Settlement_A_House_1 (X=98776.102 Y=80881.133 Z=9286.782) + "Junkyard Shed Scraps 7": base_id + 1099, # ItemPickup421_14 Settlement_A_House_1 (X=99198.508 Y=82057.820 Z=9248.227) + "Junkyard Shed Scraps 8": base_id + 1100 # ItemPickup423_20 Settlement_A_House_1 (X=99208.617 Y=84383.125 Z=9257.880) +} + +loc_military_base = { + "Military Base Sgt Flint Mission End": base_id + 1101, # (dialog 2) -> bug_spray + "Military Base Scraps 1": base_id + 1102, # ItemPickup134_17 Bugspray_Main (X=105743.531 Y=83017.492 Z=9423.290) + "Military Base Scraps 2": base_id + 1103, # ItemPickup129_2 Bugspray_Main (X=108495.805 Y=81616.992 Z=9139.340) + "Military Base Scraps 3": base_id + 1104, # ItemPickup135_20 Bugspray_Main (X=108709.219 Y=85981.016 Z=9650.472) + "Military Base Scraps 4": base_id + 1105, # ItemPickup130_5 Bugspray_Main (X=112004.195 Y=83811.313 Z=8887.996) + "Military Base Scraps 5": base_id + 1106, # ItemPickup131_8 Bugspray_Main (X=110904.867 Y=82024.781 Z=9581.007) + "Military Base Scraps 6": base_id + 1107, # ItemPickup132_11 Bugspray_Main (X=112458.563 Y=81967.945 Z=9850.968) + "Military Base Scraps 7": base_id + 1108, # ItemPickup22_9 Bugspray_Details (X=112541.695 Y=81345.875 Z=9896.940) + "Military Base Scraps 8": base_id + 1109, # ItemPickup133_14 Bugspray_Main (X=111943.391 Y=79970.016 Z=10025.820) + "Military Base Scraps 9": base_id + 1110, # ItemPickup24_8 Bugspray_Details (X=112074.063 Y=83533.398 Z=9008.831) + "Military Base Scraps 10": base_id + 1111, # ItemPickup23_2 Bugspray_Details (X=110738.523 Y=85389.852 Z=9082.626) + "Military Base Scraps 11": base_id + 1112, # ItemPickup136_23 Bugspray_Main (X=112962.594 Y=85872.922 Z=8638.805) + "Military Base Scraps 12": base_id + 1113, # ItemPickup137_26 Bugspray_Main (X=116230.563 Y=84357.602 Z=8580.226) + "Military Base Orange Paint Can": base_id + 1114 # PaintCan_5 Bugspray_Details (X=111916.102 Y=83066.195 Z=9094.554) +} + +loc_south_mine_outside = { + "South Mine Outside Scraps 1": base_id + 1115, # ItemPickup20_1 Mine_1_OutsideMain (X=114794.375 Y=57211.855 Z=8523.348) + "South Mine Outside Scraps 2": base_id + 1116, # ItemPickup15_2 Mine_1_OutsideDetails (X=112523.438 Y=57693.836 Z=8639.382) + "South Mine Outside Scraps 3": base_id + 1117, # ItemPickup22_5 Mine_1_OutsideMain (X=112348.586 Y=59174.289 Z=8945.143) + "South Mine Outside Scraps 4": base_id + 1118, # ItemPickup13_2 Mine_1_OutsideDetails (X=110989.156 Y=57840.090 Z=8700.936) + "South Mine Outside Scraps 5": base_id + 1119, # ItemPickup16_1 Mine_1_OutsideDetails (X=110487.281 Y=54528.535 Z=8589.910) + "South Mine Outside Scraps 6": base_id + 1120, # ItemPickup18_1 Mine_1_OutsideMain (X=113727.297 Y=54791.703 Z=8424.460) + "South Mine Outside Scraps 7": base_id + 1121 # ItemPickup17_3 Mine_1_OutsideMain (X=113965.211 Y=53289.539 Z=8402.346) +} + +loc_south_mine_inside = { + "South Mine Inside Scraps 1": base_id + 1122, # ItemPickup23_4 Mine_1_Interior_1 (X=108659.945 Y=58712.691 Z=8763.015) + "South Mine Inside Scraps 2": base_id + 1123, # ItemPickup24_0 Mine_1_Interior_1 (X=104954.602 Y=61540.488 Z=7876.374) + "South Mine Inside Scraps 3": base_id + 1124, # ItemPickup26_0 Mine_1_Interior_1 (X=104436.758 Y=64091.211 Z=7872.767) + "South Mine Inside Scraps 4": base_id + 1125, # ItemPickup290_20 Mine_1_Interior_2 (X=101356.625 Y=66110.906 Z=8034.738) + "South Mine Inside Scraps 5": base_id + 1126, # ItemPickup287_8 Mine_1_Interior_2 (X=96888.820 Y=64458.559 Z=7917.468) + "South Mine Inside Scraps 6": base_id + 1127, # ItemPickup289_14 Mine_1_Interior_2 (X=95863.180 Y=63252.902 Z=7847.054) + "South Mine Inside Scraps 7": base_id + 1128, # ItemPickup288_11 Mine_1_Interior_2 (X=97337.219 Y=62921.438 Z=7884.393) + "South Mine Inside Scraps 8": base_id + 1129, # ItemPickup285_2 Mine_1_Interior_2 (X=96689.203 Y=61880.895 Z=7806.810) + "South Mine Inside Scraps 9": base_id + 1130, # ItemPickup286_5 Mine_1_Interior_2 (X=98403.227 Y=62812.531 Z=7880.947) + "South Mine Inside Green Egg": base_id + 1131, # ItemPickup14_2 Mine_1_Interior_2 (X=96753.219 Y=62909.504 Z=8030.018) \!/ Existing match 4 + "South Mine Inside Green Paint Can": base_id + 1132 # PaintCan_2 Mine_1_Interior_1 (X=108293.281 Y=64192.094 Z=7872.770) \!/ Existing match 5 +} + +loc_middle_station = { + "Middle Station White Paint Can": base_id + 1133, # PaintCan_2 Station_Details1 (X=34554.141 Y=-7395.408 Z=11897.556) \!/ Existing match 5 + "Middle Station Scraps 1": base_id + 1134, # ItemPickup431_20 Station_BuildingDetails (X=37710.504 Y=-6462.562 Z=11356.691) + "Middle Station Scraps 2": base_id + 1135, # ItemPickup425_2 Station_BuildingDetails (X=37034.340 Y=-4923.256 Z=11348.328) + "Middle Station Scraps 3": base_id + 1136, # ItemPickup427_8 Station_BuildingDetails (X=36689.164 Y=-3727.466 Z=11353.597) + "Middle Station Scraps 4": base_id + 1137, # ItemPickup426_5 Station_BuildingDetails (X=37207.629 Y=-3393.977 Z=11379.110) + "Middle Station Scraps 5": base_id + 1138, # ItemPickup429_14 Station_BuildingDetails (X=37988.219 Y=-3365.906 Z=11350.225) + "Middle Station Scraps 6": base_id + 1139, # ItemPickup428_11 Station_BuildingDetails (X=36956.242 Y=-2746.948 Z=11353.506) + "Middle Station Scraps 7": base_id + 1140, # ItemPickup430_17 Station_BuildingDetails (X=36638.492 Y=-6410.017 Z=11353.546) + "Middle Station Scraps 8": base_id + 1141, # ItemPickup433_26 Station_BuildingDetails (X=35931.168 Y=-7558.021 Z=11899.232) + "Middle Station Scraps 9": base_id + 1142, # ItemPickup434 Station_BuildingDetails (X=35636.855 Y=-7628.500 Z=11903.627) + "Middle Station Scraps 10": base_id + 1143, # ItemPickup435 Station_BuildingDetails (X=34894.152 Y=-7537.087 Z=11903.627) + "Middle Station Scraps 11": base_id + 1144, # ItemPickup13_4 Station_BuildingDetails (X=33505.609 Y=-7742.843 Z=11898.971) + "Middle Station Scraps 12": base_id + 1145, # ItemPickup440_5 Station_Details1 (X=37394.004 Y=-8395.084 Z=11389.296) + "Middle Station Scraps 13": base_id + 1146, # ItemPickup432_23 Station_BuildingDetails (X=36040.695 Y=-8068.016 Z=11456.609) + "Middle Station Scraps 14": base_id + 1147, # ItemPickup16_4 Station_BuildingDetails (X=35360.320 Y=-8441.443 Z=11457.823) + "Middle Station Scraps 15": base_id + 1148, # ItemPickup439_2 Station_Details1 (X=36311.324 Y=-9563.938 Z=11468.039) + "Middle Station Scraps 16": base_id + 1149, # ItemPickup442_11 Station_Details1 (X=33335.656 Y=-13872.785 Z=11189.906) + "Middle Station Scraps 17": base_id + 1150, # ItemPickup441_8 Station_Details1 (X=33129.984 Y=-14073.978 Z=11189.906) + "Middle Station Scraps 18": base_id + 1151, # ItemPickup436_31 Station_BuildingDetails (X=33587.488 Y=-7828.651 Z=11529.446) + "Middle Station Scraps 19": base_id + 1152, # ItemPickup14_3 Station_BuildingDetails (X=34007.254 Y=-7749.381 Z=11533.760) + "Middle Station Scraps 20": base_id + 1153, # ItemPickup443_14 Station_Details1 (X=31457.752 Y=-7120.744 Z=11421.197) + "Middle Station Theodore Mission End": base_id + 1154 # (dialog 2) -> 35_scraps_reward + # "Middle Station Scraps Glitch 1" ItemPickup437_34 (X=34217.613 Y=-9481.271 Z=11505.686) /!\ Glitched scrap + # "Middle Station Scraps Glitch 2" ItemPickup438_37 (X=36101.633 Y=-10459.024 Z=11385.937) /!\ Glitched scrap +} + +loc_canyon = { + "Canyon Scraps 1": base_id + 1155, # ItemPickup156_47 Canyon_Main (X=29432.162 Y=-3164.300 Z=11540.294) + "Canyon Scraps 2": base_id + 1156, # ItemPickup155_44 Canyon_Main (X=26331.086 Y=3036.740 Z=11701.688) + "Canyon Scraps 3": base_id + 1157, # ItemPickup154_41 Canyon_Main (X=22688.129 Y=3906.730 Z=12249.182) + "Canyon Scraps 4": base_id + 1158, # ItemPickup147_20 Canyon_Main (X=20546.193 Y=4371.471 Z=12128.874) + "Canyon Scraps 5": base_id + 1159, # ItemPickup148_23 Canyon_Main (X=20006.584 Y=4928.478 Z=12174.837) + "Canyon Scraps 6": base_id + 1160, # ItemPickup146_17 Canyon_Main (X=19251.633 Y=3798.014 Z=12170.390) + "Canyon Scraps 7": base_id + 1161, # ItemPickup149_26 Canyon_Main (X=18302.678 Y=7323.849 Z=12595.085) + "Canyon Scraps 8": base_id + 1162, # ItemPickup150_29 Canyon_Main (X=19019.563 Y=8172.146 Z=12640.462) + "Canyon Scraps 9": base_id + 1163, # ItemPickup142_5 Canyon_Main (X=18001.689 Y=11138.320 Z=13035.360) + "Canyon Scraps 10": base_id + 1164, # ItemPickup143_8 Canyon_Main (X=16381.525 Y=7191.394 Z=13682.453) + "Canyon Scraps 11": base_id + 1165, # ItemPickup144_11 Canyon_Main (X=18294.928 Y=7870.372 Z=14350.015) + "Canyon Scraps 12": base_id + 1166, # ItemPickup31_2 CanyonCamp_Details (X=20730.520 Y=8032.158 Z=14439.826) + "Canyon Scraps 13": base_id + 1167, # ItemPickup145_14 Canyon_Main (X=24752.658 Y=7959.624 Z=14363.087) + "Canyon Scraps 14": base_id + 1168, # ItemPickup141_2 Canyon_Main (X=20181.992 Y=13816.017 Z=14897.407) + "Canyon Scraps 15": base_id + 1169, # ItemPickup151_32 Canyon_Main (X=23172.160 Y=2842.120 Z=12954.566) + "Canyon Scraps 16": base_id + 1170, # ItemPickup152_35 Canyon_Main (X=22307.621 Y=-1180.840 Z=12451.548) + "Canyon Scraps 17": base_id + 1171, # ItemPickup153_38 Canyon_Main (X=28473.596 Y=6741.842 Z=13314.166) + "Canyon Blue Box": base_id + 1172 # Canyon_BlueBoxPickup CanyonCamp_Details (X=20338.525 Y=4989.111 Z=12323.649) +} + +loc_watchtower = { + "Watchtower Scraps 1": base_id + 1173, # ItemPickup373_13 Secret2_WatchTowerDetails (X=32760.389 Y=-28814.084 Z=10997.447) + "Watchtower Scraps 2": base_id + 1174, # ItemPickup22_6 Secret2_WatchTowerDetails (X=32801.668 Y=-31660.041 Z=10643.390) + "Watchtower Scraps 3": base_id + 1175, # ItemPickup372_10 Secret2_WatchTowerDetails (X=31018.063 Y=-33375.313 Z=11100.126) + "Watchtower Scraps 4": base_id + 1176, # ItemPickup22_16 Secret2_WatchTowerDetails (X=33308.215 Y=-35928.578 Z=10614.347) + "Watchtower Scraps 5": base_id + 1177, # ItemPickup22_2 Secret2_WatchTowerDetails (X=34304.262 Y=-33446.063 Z=10674.936) + "Watchtower Scraps 6": base_id + 1178, # ItemPickup370_2 Secret2_WatchTowerDetails (X=32869.453 Y=-33184.094 Z=10612.040) + "Watchtower Scraps 7": base_id + 1179, # ItemPickup374_16 Secret2_WatchTowerDetails (X=33210.707 Y=-32097.611 Z=11211.031) + "Watchtower Scraps 8": base_id + 1180, # ItemPickup22_10 Secret2_WatchTowerDetails (X=33246.262 Y=-32046.697 Z=11851.025) + "Watchtower Scraps 9": base_id + 1181, # ItemPickup22_8 Secret2_WatchTowerDetails (X=33553.156 Y=-31810.645 Z=11849.521) + "Watchtower Scraps 10": base_id + 1182, # ItemPickup371_7 Secret2_WatchTowerDetails (X=36151.621 Y=-31791.633 Z=11093.785) + "Watchtower Pink Paint Can": base_id + 1183 # PaintCan_2 Secret2_WatchTowerDetails (X=33069.133 Y=-32168.045 Z=11859.582) \!/ Existing match 5 +} + +loc_boulder_field = { + "Boulder Field Page Drawing 1": base_id + 1184, # Pages_Drawing1 Pages_Environment_Details (X=46232.703 Y=-37052.875 Z=9531.116) + "Boulder Field Page Drawing 2": base_id + 1185, # Pages_Drawing2 Pages_Environment_Details (X=51854.980 Y=-31332.070 Z=9804.927) + "Boulder Field Page Drawing 3": base_id + 1186, # Pages_Drawing3 Pages_Environment_Details (X=47595.750 Y=-29931.740 Z=9308.014) + "Boulder Field Page Drawing 4": base_id + 1187, # Pages_Drawing4 Pages_Environment_Details (X=43819.680 Y=-30378.770 Z=9706.599) + "Boulder Field Page Drawing 5": base_id + 1188, # Pages_Drawing5 Pages_Environment_Details (X=47494.746 Y=-20884.781 Z=9812.398) + "Boulder Field Page Drawing 6": base_id + 1189, # Pages_Drawing6 Pages_Environment_Details (X=43725.148 Y=-21952.570 Z=9744.351) + "Boulder Field Page Drawing 7": base_id + 1190, # Pages_Drawing7 Pages_Environment_Details (X=44752.465 Y=-16362.510 Z=10147.004) + "Boulder Field Page Drawing 8": base_id + 1191, # Pages_Drawing8 Pages_Environment_Details (X=50496.270 Y=-26090.533 Z=9835.365) + "Boulder Field Scraps 1": base_id + 1192, # ItemPickup293_8 Pages_Environment_Main (X=41385.406 Y=-32281.871 Z=10240.781) + "Boulder Field Scraps 2": base_id + 1193, # ItemPickup987321 Pages_House_Main (X=46654.969 Y=-38859.254 Z=9920.861) + "Boulder Field Scraps 3": base_id + 1194, # ItemPickup516121 Pages_House_Main (X=44765.836 Y=-41675.559 Z=9938.179) + "Boulder Field Scraps 4": base_id + 1195, # ItemPickup291_2 Pages_Environment_Main (X=50088.270 Y=-30669.107 Z=9267.371) + "Boulder Field Scraps 5": base_id + 1196, # ItemPickup303_38 Pages_Environment_Main (X=48014.609 Y=-28971.115 Z=9199.659) + "Boulder Field Scraps 6": base_id + 1197, # ItemPickup302_35 Pages_Environment_Main (X=50190.266 Y=-26243.977 Z=9648.289) + "Boulder Field Scraps 7": base_id + 1198, # ItemPickup305_44 Pages_Environment_Main (X=47802.246 Y=-22594.684 Z=9631.879) + "Boulder Field Scraps 8": base_id + 1199, # ItemPickup294_11 Pages_Environment_Main (X=44345.996 Y=-23408.535 Z=9659.643) + "Boulder Field Scraps 9": base_id + 1200, # ItemPickup295_14 Pages_Environment_Main (X=41620.590 Y=-22982.641 Z=9720.177) + "Boulder Field Scraps 10": base_id + 1201, # ItemPickup300_29 Pages_Environment_Main (X=52003.172 Y=-19163.049 Z=9925.105) + "Boulder Field Scraps 11": base_id + 1202, # ItemPickup301_32 Pages_Environment_Main (X=51422.176 Y=-22319.322 Z=10663.813) + "Boulder Field Scraps 12": base_id + 1203, # ItemPickup296_17 Pages_Environment_Main (X=43527.176 Y=-17952.570 Z=10812.458) + "Boulder Field Scraps 13": base_id + 1204, # ItemPickup297_20 Pages_Environment_Main (X=45241.871 Y=-15847.636 Z=9952.198) + "Boulder Field Scraps 14": base_id + 1205, # ItemPickup298_23 Pages_Environment_Main (X=46238.027 Y=-18407.420 Z=10199.825) + "Boulder Field Scraps 15": base_id + 1206, # ItemPickup299_26 Pages_Environment_Main (X=49835.617 Y=-17379.959 Z=9810.836) + "Boulder Field Scraps 16": base_id + 1207, # ItemPickup306_47 Pages_Environment_Main (X=45144.594 Y=-33817.090 Z=10136.658) + "Boulder Field Scraps 17": base_id + 1208, # ItemPickup292_5 Pages_Environment_Main (X=44336.184 Y=-37162.367 Z=9789.548) + "Boulder Field Scraps 18": base_id + 1209 # ItemPickup304_41 Pages_Environment_Main (X=44490.160 Y=-26442.754 Z=9974.022) +} + +loc_haunted_house = { + "Haunted House Sasha Mission End": base_id + 1210, # (dialog 2) -> 40_scraps_reward + "Haunted House Scraps 1": base_id + 1211, # ItemPickup1309876 Pages_House_Main (X=42900.188 Y=-43760.617 Z=9900.531) + "Haunted House Scraps 2": base_id + 1212, # ItemPickup22213 Pages_House_Main (X=43608.078 Y=-44642.434 Z=9922.888) + "Haunted House Scraps 3": base_id + 1213, # ItemPickup5423189 Pages_House_Main (X=43992.387 Y=-44259.336 Z=9877.623) + "Haunted House Scraps 4": base_id + 1214, # ItemPickup1312312 Pages_House_Main (X=43340.012 Y=-45362.617 Z=9882.796) + "Haunted House Scraps 5": base_id + 1215, # ItemPickup1596 Pages_House_Main (X=45105.383 Y=-45980.879 Z=9854.796) + "Haunted House Scraps 6": base_id + 1216 # ItemPickup8624 Pages_House_Main (X=45888.406 Y=-46050.246 Z=9555.326) +} + +loc_santiago_house = { + "Santiago House Scraps 1": base_id + 1217, # ItemPickup342_19 PortNPCHouse_Details (X=37271.445 Y=-46075.598 Z=10648.827) + "Santiago House Scraps 2": base_id + 1218, # ItemPickup37_5 PortNPCHouse_Details (X=38330.512 Y=-47184.668 Z=10387.618) + "Santiago House Scraps 3": base_id + 1219, # ItemPickup337_2 PortNPCHouse_Details (X=35720.422 Y=-49536.328 Z=10098.503) + "Santiago House Scraps 4": base_id + 1220, # ItemPickup344_25 PortNPCHouse_Details (X=35466.285 Y=-50363.078 Z=10098.504) + "Santiago House Scraps 5": base_id + 1221, # ItemPickup338_7 PortNPCHouse_Details (X=34274.289 Y=-49947.578 Z=10098.501) + "Santiago House Scraps 6": base_id + 1222, # ItemPickup341_16 PortNPCHouse_Details (X=35584.359 Y=-48195.172 Z=10323.833) + "Santiago House Scraps 7": base_id + 1223, # ItemPickup340_13 PortNPCHouse_Details (X=35019.766 Y=-49904.113 Z=10124.169) + "Santiago House Scraps 8": base_id + 1224, # ItemPickup339_10 PortNPCHouse_Details (X=35527.711 Y=-49614.801 Z=10124.016) + "Santiago House Scraps 9": base_id + 1225, # ItemPickup36_2 PortNPCHouse_Details (X=34471.707 Y=-49497.000 Z=10199.790) + "Santiago House Scraps 10": base_id + 1226, # ItemPickup343_22 PortNPCHouse_Details (X=37920.277 Y=-51867.754 Z=9847.511) + "Santiago House Journal": base_id + 1227 # Port_Journal_Pickup PortNPCHouse_Details (X=34690.777 Y=-49788.359 Z=10214.353) +} + +loc_port = { + "Port Grey Paint Can": base_id + 1228, # PaintCan_13 Port_Details (X=74641.648 Y=-11320.948 Z=7551.767) + "Port Scraps 1": base_id + 1229, # ItemPickup334_32 Port_Main (X=67315.281 Y=-13828.055 Z=10101.339) + "Port Scraps 2": base_id + 1230, # ItemPickup335_35 Port_Main (X=67679.508 Y=-14127.952 Z=10061.037) + "Port Scraps 3": base_id + 1231, # ItemPickup336_38 Port_Main (X=67062.219 Y=-15626.003 Z=10065.956) + "Port Scraps 4": base_id + 1232, # ItemPickup21_15 Port_Main (X=66140.914 Y=-16079.730 Z=10092.268) + "Port Scraps 5": base_id + 1233, # ItemPickup18_12 Port_Main (X=66824.719 Y=-14729.157 Z=10125.234) + "Port Scraps 6": base_id + 1234, # ItemPickup333_29 Port_Main (X=69777.258 Y=-8371.526 Z=9391.735) + "Port Scraps 7": base_id + 1235, # ItemPickup332_26 Port_Main (X=70339.695 Y=-11066.703 Z=8912.465) + "Port Scraps 8": base_id + 1236, # ItemPickup331_23 Port_Main (X=72729.508 Y=-7048.998 Z=8245.522) + "Port Scraps 9": base_id + 1237, # ItemPickup329_17 Port_Main (X=75896.070 Y=-8705.214 Z=7514.992) + "Port Scraps 10": base_id + 1238, # ItemPickup330_20 Port_Main (X=74264.211 Y=-10553.446 Z=7520.141) + "Port Scraps 11": base_id + 1239, # ItemPickup17_9 Port_Main (X=74328.117 Y=-11423.852 Z=7511.827) + "Port Scraps 12": base_id + 1240, # ItemPickup328_14 Port_Main (X=76753.164 Y=-10744.933 Z=7437.174) + "Port Scraps 13": base_id + 1241, # ItemPickup326_8 Port_Main (X=77330.414 Y=-11640.151 Z=7189.003) + "Port Scraps 14": base_id + 1242, # ItemPickup327_11 Port_Main (X=76403.516 Y=-12484.995 Z=7440.368) + "Port Scraps 15": base_id + 1243, # ItemPickup324_2 Port_Main (X=78651.977 Y=-12233.159 Z=7439.514) + "Port Scraps 16": base_id + 1244, # ItemPickup14_5 Port_Main (X=80336.297 Y=-12276.590 Z=7436.639) + "Port Scraps 17": base_id + 1245, # ItemPickup325_5 Port_Main (X=79845.086 Y=-13410.705 Z=7440.597) + "Port Scraps 18": base_id + 1246, # ItemPickup13_2 Port_Main (X=76156.719 Y=-12816.718 Z=7439.269) KO + "Port Scraps 19": base_id + 1247, # ItemPickup16 Port_Main (X=80754.914 Y=-14055.545 Z=7445.339) KO + "Port Santiago Mission End": base_id + 1248 # (dialog 3) -> 35_scraps_reward +} + +loc_trench_house = { + "Trench House Scraps 1": base_id + 1249, # ItemPickup157_2 DeadWoodsEnvironment (X=76340.328 Y=-42886.191 Z=9567.521) + "Trench House Scraps 2": base_id + 1250, # ItemPickup158_5 DeadWoodsEnvironment (X=76013.594 Y=-44140.141 Z=9413.147) + "Trench House Scraps 3": base_id + 1251, # ItemPickup159_11 DeadWoodsEnvironment (X=74408.320 Y=-45424.000 Z=9446.966) + "Trench House Scraps 4": base_id + 1252, # ItemPickup69_14 Secret8_BasementHouseDetails (X=75196.344 Y=-48321.504 Z=9453.302) + "Trench House Scraps 5": base_id + 1253, # ItemPickup160_14 DeadWoodsEnvironment (X=73467.273 Y=-48995.738 Z=9355.070) + "Trench House Scraps 6": base_id + 1254, # ItemPickup163_23 DeadWoodsEnvironment (X=76418.469 Y=-53239.539 Z=9276.892) + "Trench House Scraps 7": base_id + 1255, # ItemPickup173_56 DeadWoodsEnvironment (X=70719.875 Y=-54290.117 Z=9357.084) + "Trench House Scraps 8": base_id + 1256, # ItemPickup165_29 DeadWoodsEnvironment (X=70075.938 Y=-53041.973 Z=9675.481) + "Trench House Scraps 9": base_id + 1257, # ItemPickup162_20 DeadWoodsEnvironment (X=74745.711 Y=-52304.027 Z=9073.130) + "Trench House Scraps 10": base_id + 1258, # ItemPickup68_11 Secret8_BasementHouseDetails (X=74519.750 Y=-53603.063 Z=9078.054) + "Trench House Scraps 11": base_id + 1259, # ItemPickup161_17 DeadWoodsEnvironment (X=73747.492 Y=-52589.906 Z=9104.748) + "Trench House Scraps 12": base_id + 1260, # ItemPickup67_8 Secret8_BasementHouseDetails (X=74333.125 Y=-52847.961 Z=9124.773) + "Trench House Scraps 13": base_id + 1261, # ItemPickup66_5 Secret8_BasementHouseDetails (X=74062.195 Y=-52663.043 Z=9122.827) + "Trench House Scraps 14": base_id + 1262, # ItemPickup65_2 Secret8_BasementHouseDetails (X=74820.492 Y=-51350.051 Z=7956.387) + "Trench House Scraps 15": base_id + 1263, # ItemPickup164_26 DeadWoodsEnvironment (X=75286.289 Y=-51164.098 Z=7957.081) + "Trench House Scraps 16": base_id + 1264, # ItemPickup174_59 DeadWoodsEnvironment (X=68413.258 Y=-56872.816 Z=9349.443) + "Trench House Scraps 17": base_id + 1265, # ItemPickup175_62 DeadWoodsEnvironment (X=67281.281 Y=-59201.371 Z=9254.457) + "Trench House Scraps 18": base_id + 1266, # ItemPickup172_50 DeadWoodsEnvironment (X=69064.219 Y=-48796.352 Z=9770.164) + "Trench House Chest Scraps 1": base_id + 1267, # ItemPickup75123123 Secret8_BasementHouseDetails (X=75042.141 Y=-50830.891 Z=8005.156) + "Trench House Chest Scraps 2": base_id + 1268, # ItemPickup741123 Secret8_BasementHouseDetails (X=75066.516 Y=-50824.398 Z=7995.000) + "Trench House Chest Scraps 3": base_id + 1269, # ItemPickup729842 Secret8_BasementHouseDetails (X=75072.789 Y=-50818.441 Z=7986.979) + "Trench House Chest Scraps 4": base_id + 1270, # ItemPickup711123 Secret8_BasementHouseDetails (X=75038.656 Y=-50827.566 Z=7973.354) + "Trench House Chest Scraps 5": base_id + 1271, # ItemPickup73 Secret8_BasementHouseDetails (X=75060.406 Y=-50828.102 Z=7965.915) + "Trench House Chest Scraps 6": base_id + 1272 # ItemPickup7075674 Secret8_BasementHouseDetails (X=75056.648 Y=-50818.125 Z=7959.868) +} + +loc_doll_woods = { + "Doll Woods Scraps 1": base_id + 1273, # ItemPickup78_2 DeadWoodsDolls (X=60126.234 Y=-49668.906 Z=9970.880) + "Doll Woods Scraps 2": base_id + 1274, # ItemPickup166_32 DeadWoodsEnvironment (X=59854.066 Y=-47313.121 Z=10376.684) + "Doll Woods Scraps 3": base_id + 1275, # ItemPickup80_8 DeadWoodsDolls (X=59130.613 Y=-49597.789 Z=9930.675) + "Doll Woods Scraps 4": base_id + 1276, # ItemPickup168_38 DeadWoodsEnvironment (X=59785.973 Y=-51269.684 Z=10180.019) + "Doll Woods Scraps 5": base_id + 1277, # ItemPickup81_11 DeadWoodsDolls (X=58226.449 Y=-52660.801 Z=10576.626) + "Doll Woods Scraps 6": base_id + 1278, # ItemPickup167_35 DeadWoodsEnvironment (X=56243.176 Y=-49097.793 Z=10869.889) + "Doll Woods Scraps 7": base_id + 1279, # ItemPickup79_5 DeadWoodsDolls (X=59481.672 Y=-45288.137 Z=10897.672) + "Doll Woods Scraps 8": base_id + 1280, # ItemPickup170_44 DeadWoodsEnvironment (X=63807.668 Y=-44674.734 Z=10337.434) + "Doll Woods Scraps 9": base_id + 1281, # ItemPickup171_47 DeadWoodsEnvironment (X=68406.664 Y=-45721.813 Z=10021.356) + "Doll Woods Scraps 10": base_id + 1282 # ItemPickup169_41 DeadWoodsEnvironment (X=62898.469 Y=-47565.703 Z=10744.431) +} + +loc_lost_stairs = { + "Lost Stairs Scraps 1": base_id + 1283, # ItemPickup29_2 Secret1_Stairs2 (X=47087.617 Y=-53476.547 Z=9103.093) + "Lost Stairs Scraps 2": base_id + 1284 # ItemPickup30_5 Secret1_Stairs2 (X=47162.238 Y=-55318.094 Z=9127.096) +} + +loc_east_house = { + "East House Scraps 1": base_id + 1285, # ItemPickup409_5 Secret7_CliffHouseEnvironment (X=97507.664 Y=-53201.270 Z=9174.678) + "East House Scraps 2": base_id + 1286, # ItemPickup408_2 Secret7_CliffHouseEnvironment (X=98511.242 Y=-53899.414 Z=9016.314) + "East House Scraps 3": base_id + 1287, # ItemPickup410_8 Secret7_CliffHouseEnvironment (X=100688.102 Y=-54197.578 Z=8919.432) + "East House Scraps 4": base_id + 1288, # ItemPickup411_11 Secret7_CliffHouseEnvironment (X=103149.773 Y=-54659.980 Z=9002.535) + "East House Scraps 5": base_id + 1289, # ItemPickup416_26 Secret7_CliffHouseEnvironment (X=107458.172 Y=-55683.793 Z=9429.004) + "East House Scraps 6": base_id + 1290, # ItemPickup25_2 Secret7_CliffHouseEnvironment (X=109034.164 Y=-54360.703 Z=9495.910) + "East House Scraps 7": base_id + 1291, # ItemPickup413_17 Secret7_CliffHouseEnvironment (X=109245.148 Y=-55045.242 Z=9553.601) + "East House Scraps 8": base_id + 1292, # ItemPickup414_20 Secret7_CliffHouseEnvironment (X=112556.445 Y=-55851.754 Z=10049.954) + "East House Scraps 9": base_id + 1293, # ItemPickup415_23 Secret7_CliffHouseEnvironment (X=113131.469 Y=-56822.508 Z=10038.047) + "East House Scraps 10": base_id + 1294, # ItemPickup2599786 Secret7_CliffHouseDetails (X=112279.828 Y=-56743.781 Z=10029.549) + "East House Scraps 11": base_id + 1295, # ItemPickup253321 Secret7_CliffHouseDetails (X=112445.508 Y=-56280.320 Z=10059.164) + "East House Scraps 12": base_id + 1296, # ItemPickup2532323 Secret7_CliffHouseDetails (X=112562.211 Y=-56736.332 Z=10454.907) + "East House Scraps 13": base_id + 1297, # ItemPickup257655 Secret7_CliffHouseDetails (X=109313.320 Y=-58221.316 Z=9501.283) + "East House Scraps 14": base_id + 1298, # ItemPickup412_14 Secret7_CliffHouseEnvironment (X=104077.805 Y=-55987.301 Z=9066.847) + "East House Chest Scraps 1": base_id + 1299, # ItemPickup76246 Secret7_CliffHouseDetails (X=112317.242 Y=-55820.805 Z=10497.336) + "East House Chest Scraps 2": base_id + 1300, # ItemPickup76245 Secret7_CliffHouseDetails (X=112326.086 Y=-55808.477 Z=10485.685) + "East House Chest Scraps 3": base_id + 1301, # ItemPickup85131 Secret7_CliffHouseDetails (X=112329.031 Y=-55828.438 Z=10478.107) + "East House Chest Scraps 4": base_id + 1302, # ItemPickup56124 Secret7_CliffHouseDetails (X=112315.922 Y=-55820.102 Z=10466.683) + "East House Chest Scraps 5": base_id + 1303 # ItemPickup25123123123 Secret7_CliffHouseDetails (X=112337.922 Y=-55821.848 Z=10456.924) +} + +loc_rockets_testing_ground = { + "Rockets Testing Ground Timed Dynamite": base_id + 1304, # Boomer_DynamitePickup Boomer_RangeDetails (X=76476.609 Y=-65286.738 Z=8303.742) + "Rockets Testing Ground Scraps 1": base_id + 1305, # ItemPickup105_14 Boomer_HouseDetails (X=88925.570 Y=-63375.051 Z=8563.354) + "Rockets Testing Ground Scraps 2": base_id + 1306, # ItemPickup106_17 Boomer_HouseDetails (X=84234.016 Y=-64475.551 Z=8382.108) + "Rockets Testing Ground Scraps 3": base_id + 1307, # ItemPickup114_23 Boomer_RangeDetails (X=79349.438 Y=-64225.480 Z=8384.219) + "Rockets Testing Ground Scraps 4": base_id + 1308, # ItemPickup22_0 Boomer_RangeDetails (X=79831.070 Y=-65847.766 Z=8301.337) + "Rockets Testing Ground Scraps 5": base_id + 1309, # ItemPickup109_5 Boomer_RangeDetails (X=76526.500 Y=-65394.875 Z=8223.883) + "Rockets Testing Ground Scraps 6": base_id + 1310, # ItemPickup108_2 Boomer_RangeDetails (X=76237.977 Y=-67087.414 Z=8361.979) + "Rockets Testing Ground Scraps 7": base_id + 1311, # ItemPickup115_26 Boomer_RangeDetails (X=78857.672 Y=-67802.227 Z=8257.150) + "Rockets Testing Ground Scraps 8": base_id + 1312, # ItemPickup110_8 Boomer_RangeDetails (X=74878.570 Y=-62927.297 Z=8749.549) + "Rockets Testing Ground Scraps 9": base_id + 1313, # ItemPickup111_11 Boomer_RangeDetails (X=74542.641 Y=-61301.082 Z=9493.931) + "Rockets Testing Ground Scraps 10": base_id + 1314 # ItemPickup23_0 Boomer_RangeDetails (X=77020.859 Y=-62031.320 Z=8873.663) + # "Rockets Testing Ground Scraps Glitch 1" ItemPickup107_20 (X=81308.406 Y=-63482.320 Z=8533.338) /!\ Glitched scrap +} + +loc_rockets_testing_bunker = { + "Rockets Testing Bunker Scraps 1": base_id + 1315, # ItemPickup113_20 Boomer_RangeDetails (X=77552.094 Y=-61144.559 Z=8523.195) + "Rockets Testing Bunker Scraps 2": base_id + 1316, # ItemPickup112_14 Boomer_RangeDetails (X=77670.227 Y=-62029.941 Z=8570.785) + "Rockets Testing Bunker Box of Rockets": base_id + 1317 # Boomer_RocketsPickup Boomer_RangeDetails (X=77330.086 Y=-61504.324 Z=8523.195) +} + +loc_workshop = { + "Workshop Scraps 1": base_id + 1318, # ItemPickup103_8 Boomer_HouseDetails (X=93550.773 Y=-61901.797 Z=8828.551) + "Workshop Scraps 2": base_id + 1319, # ItemPickup102_5 Boomer_HouseDetails (X=93508.047 Y=-64009.910 Z=8783.468) + "Workshop Scraps 3": base_id + 1320, # ItemPickup101_2 Boomer_HouseDetails (X=92011.648 Y=-65572.281 Z=8736.709) + "Workshop Scraps 4": base_id + 1321, # ItemPickup24_2 Boomer_HouseDetails (X=92311.594 Y=-63045.211 Z=8749.977) + "Workshop Scraps 5": base_id + 1322, # ItemPickup104_11 Boomer_HouseDetails (X=91392.734 Y=-63527.629 Z=8709.268) + "Workshop Scraps 6": base_id + 1323, # ItemPickup25_1 Boomer_HouseDetails (X=92986.789 Y=-63012.047 Z=9235.383) + "Workshop John Smith Mission End": base_id + 1324 # (dialog 2) -> the_boomer +} + +loc_east_tower = { + "Greg Mission Start": base_id + 1325, # (dialog 6) -> north_mine_key + "East Tower Scraps 1": base_id + 1326, # ItemPickup231_17 Mine2_NPCHouseDetails (X=95448.250 Y=-67249.156 Z=8607.896) + "East Tower Scraps 2": base_id + 1327, # ItemPickup228_8 Mine2_NPCHouseDetails (X=96339.242 Y=-66374.828 Z=8650.519) + "East Tower Scraps 3": base_id + 1328, # ItemPickup229_11 Mine2_NPCHouseDetails (X=98540.711 Y=-67173.656 Z=8418.825) + "East Tower Scraps 4": base_id + 1329, # ItemPickup230_14 Mine2_NPCHouseDetails (X=97276.414 Y=-68495.008 Z=8337.229) + "East Tower Scraps 5": base_id + 1330, # ItemPickup227_5 Mine2_NPCHouseDetails (X=96470.820 Y=-66540.859 Z=8953.763) + "East Tower Scraps 6": base_id + 1331 # ItemPickup226_2 Mine2_NPCHouseDetails (X=96141.555 Y=-67013.445 Z=9399.308) +} + +loc_lighthouse = { + "Lighthouse Scraps 1": base_id + 1332, # ItemPickup200_41 LighthouseTerrainMain (X=100072.813 Y=-68645.688 Z=8150.313) + "Lighthouse Scraps 2": base_id + 1333, # ItemPickup198_35 LighthouseTerrainMain (X=105340.594 Y=-70828.602 Z=8436.780) + "Lighthouse Scraps 3": base_id + 1334, # ItemPickup199_38 LighthouseTerrainMain (X=103851.688 Y=-73396.625 Z=7973.290) + "Lighthouse Scraps 4": base_id + 1335, # ItemPickup196_29 LighthouseTerrainMain (X=107040.711 Y=-74021.555 Z=8303.216) + "Lighthouse Scraps 5": base_id + 1336, # ItemPickup197_32 LighthouseTerrainMain (X=110566.859 Y=-77435.961 Z=7642.565) + "Lighthouse Scraps 6": base_id + 1337, # ItemPickup32_2 LighthouseShed_Main (X=111451.352 Y=-77351.117 Z=7633.413) + "Lighthouse Scraps 7": base_id + 1338, # ItemPickup35_11 Lighthouse_Main (X=113078.500 Y=-78618.281 Z=7180.793) + "Lighthouse Scraps 8": base_id + 1339, # ItemPickup192_17 LighthouseTerrainMain (X=113396.305 Y=-80315.383 Z=7184.260) + "Lighthouse Scraps 9": base_id + 1340, # ItemPickup193_20 LighthouseTerrainMain (X=114057.484 Y=-81517.836 Z=7245.034) + "Lighthouse Scraps 10": base_id + 1341, # ItemPickup194_23 LighthouseTerrainMain (X=110915.156 Y=-78376.609 Z=7676.131) + "Lighthouse Scraps 11": base_id + 1342, # ItemPickup195_26 LighthouseTerrainMain (X=109341.703 Y=-79014.469 Z=8075.679) + "Lighthouse Scraps 12": base_id + 1343, # ItemPickup33_5 Lighthouse_Details (X=107006.578 Y=-81377.711 Z=8821.629) + "Lighthouse Scraps 13": base_id + 1344, # ItemPickup191_14 LighthouseTerrainMain (X=109240.195 Y=-82951.375 Z=8194.619) + "Lighthouse Scraps 14": base_id + 1345, # ItemPickup190_11 LighthouseTerrainMain (X=106295.719 Y=-84190.578 Z=8581.896) + "Lighthouse Scraps 15": base_id + 1346, # ItemPickup189_8 LighthouseTerrainMain (X=104233.883 Y=-84663.328 Z=7806.311) + "Lighthouse Scraps 16": base_id + 1347, # ItemPickup188_5 LighthouseTerrainMain (X=103209.227 Y=-81564.047 Z=8140.578) + "Lighthouse Scraps 17": base_id + 1348, # ItemPickup187_2 LighthouseTerrainMain (X=104795.555 Y=-81344.758 Z=8775.158) + "Lighthouse Scraps 18": base_id + 1349, # ItemPickup34_8 Lighthouse_Main (X=100843.914 Y=-78038.539 Z=7197.542) + "Lighthouse Breaker 1": base_id + 1350, # ItemPickup13_2 LighthouseShed_Main (X=110781.164 Y=-77296.813 Z=7757.248) \!/ Existing match 6 + "Lighthouse Breaker 2": base_id + 1351, # ItemPickup14 LighthouseShed_Main (X=110899.227 Y=-77239.031 Z=7757.134) \!/ Existing match 3 + "Lighthouse Breaker 3": base_id + 1352, # ItemPickup16 LighthouseShed_Main (X=110948.547 Y=-77253.336 Z=7757.134) \!/ Existing match 2 + "Lighthouse Breaker 4": base_id + 1353, # ItemPickup17 LighthouseShed_Main (X=111001.078 Y=-77205.047 Z=7757.134) \!/ Existing match 1 + "Lighthouse Claire Mission End": base_id + 1354 # (dialog 2) -> 30_scraps_reward +} + +loc_north_mine_outside = { + "North Mine Outside Scraps 1": base_id + 1355, # ItemPickup241_31 Mine2_OutsideDetails (X=-52376.746 Y=-101857.492 Z=10542.841) + "North Mine Outside Scraps 2": base_id + 1356, # ItemPickup242_34 Mine2_OutsideDetails (X=-53786.742 Y=-102067.789 Z=10858.948) + "North Mine Outside Scraps 3": base_id + 1357, # ItemPickup239_25 Mine2_OutsideDetails (X=-57502.777 Y=-105475.336 Z=10609.405) + "North Mine Outside Scraps 4": base_id + 1358, # ItemPickup16_2 Mine2_OutsideDetails (X=-58102.102 Y=-104007.906 Z=11146.535) + "North Mine Outside Scraps 5": base_id + 1359, # ItemPickup238_20 Mine2_OutsideDetails (X=-59474.840 Y=-105053.734 Z=11213.524) + "North Mine Outside Scraps 6": base_id + 1360, # ItemPickup240_28 Mine2_OutsideDetails (X=-55011.750 Y=-104936.359 Z=9935.366) + "North Mine Outside Scraps 7": base_id + 1361, # ItemPickup236_14 Mine2_OutsideDetails (X=-55594.863 Y=-107667.594 Z=9596.611) + "North Mine Outside Scraps 8": base_id + 1362, # ItemPickup15_1 Mine2_Interior2 (X=-56632.578 Y=-109503.406 Z=9280.788) + "North Mine Outside Scraps 9": base_id + 1363, # ItemPickup234_8 Mine2_OutsideDetails (X=-54645.418 Y=-110747.602 Z=9553.452) + "North Mine Outside Scraps 10": base_id + 1364, # ItemPickup232_2 Mine2_OutsideDetails (X=-51561.340 Y=-113574.813 Z=9414.959) + "North Mine Outside Scraps 11": base_id + 1365, # ItemPickup233_5 Mine2_OutsideDetails (X=-54072.105 Y=-112672.031 Z=10077.665) + "North Mine Outside Scraps 12": base_id + 1366, # ItemPickup237_17 Mine2_OutsideDetails (X=-58042.758 Y=-108748.656 Z=9693.470) + "North Mine Outside Scraps 13": base_id + 1367, # ItemPickup235_11 Mine2_OutsideDetails (X=-55717.227 Y=-110610.414 Z=9487.879) + "North Mine Outside Scraps 14": base_id + 1368 # ItemPickup13_2 Mine2_Interior2 (X=-52235.836 Y=-114501.117 Z=9462.438) KO +} + +loc_north_mine_inside = { + "North Mine Inside Scraps 1": base_id + 1369, # ItemPickup17_2 Mine2_Interior1 (X=-58433.055 Y=-104081.570 Z=9378.083) KO + "North Mine Inside Scraps 2": base_id + 1370, # ItemPickup246_2 Mine2_Interior1 (X=-58987.199 Y=-103262.906 Z=9186.494) + "North Mine Inside Scraps 3": base_id + 1371, # ItemPickup247_5 Mine2_Interior1 (X=-58812.801 Y=-99259.570 Z=8847.714) + "North Mine Inside Scraps 4": base_id + 1372, # ItemPickup248_8 Mine2_Interior1 (X=-56634.379 Y=-99529.563 Z=8851.877) + "North Mine Inside Scraps 5": base_id + 1373, # ItemPickup22_4 Mine2_Interior1 (X=-55604.477 Y=-98342.906 Z=8842.766) + "North Mine Inside Scraps 6": base_id + 1374, # ItemPickup250_14 Mine2_Interior1 (X=-54824.535 Y=-98526.492 Z=8852.156) + "North Mine Inside Scraps 7": base_id + 1375, # ItemPickup21_14 Mine2_Interior1 (X=-54887.254 Y=-99047.141 Z=8849.855) + "North Mine Inside Scraps 8": base_id + 1376, # ItemPickup20_2 Mine2_Interior1 (X=-55610.020 Y=-101877.961 Z=9081.042) + "North Mine Inside Scraps 9": base_id + 1377, # ItemPickup19_2 Mine2_Interior1 (X=-56519.340 Y=-101375.008 Z=9001.270) + "North Mine Inside Scraps 10": base_id + 1378, # ItemPickup249_11 Mine2_Interior1 (X=-53329.922 Y=-99469.773 Z=8848.643) + "North Mine Inside Scraps 11": base_id + 1379, # ItemPickup251_17 Mine2_Interior1 (X=-52814.828 Y=-96286.969 Z=8851.372) + "North Mine Inside Scraps 12": base_id + 1380, # ItemPickup24_1 Mine2_Interior1 (X=-52605.957 Y=-96535.156 Z=8940.480) + "North Mine Inside Scraps 13": base_id + 1381, # ItemPickup23_20 Mine2_Interior1 (X=-53237.699 Y=-96609.461 Z=8846.201) + "North Mine Inside Scraps 14": base_id + 1382, # ItemPickup18_5 Mine2_Interior1 (X=-58543.488 Y=-95879.695 Z=8981.646) + "North Mine Inside Blue Egg": base_id + 1383, # Mine2_Egg Mine2_Interior2 (X=-53592.195 Y=-99177.500 Z=8975.387) + "North Mine Inside Blue Paint Can": base_id + 1384 # PaintCan_2 Mine2_Interior2 (X=-56133.391 Y=-101870.047 Z=9004.720) \!/ Existing match 5 + # "North Mine Inside Secret Gear" ItemPickup26_2 (X=-55546.859 Y=-98209.852 Z=8429.085) /!\ Inaccessible gear +} + +loc_wood_bridge = { + "Wood Bridge Scraps 1": base_id + 1385, # ItemPickup127_35 Bridge_Details (X=-66790.141 Y=-110340.367 Z=10454.417) + "Wood Bridge Scraps 2": base_id + 1386, # ItemPickup18613654 Bridge_Details (X=-68364.586 Y=-111691.625 Z=10444.172) + "Wood Bridge Scraps 3": base_id + 1387, # ItemPickup1311221 Bridge_StructureDetails (X=-69013.555 Y=-112353.977 Z=10399.942) + "Wood Bridge Scraps 4": base_id + 1388, # ItemPickup93564 Bridge_StructureDetails (X=-70398.797 Y=-112916.945 Z=10372.192) + "Wood Bridge Scraps 5": base_id + 1389, # ItemPickup161323 Bridge_Details (X=-71336.172 Y=-106966.672 Z=8430.104) + "Wood Bridge Scraps 6": base_id + 1390, # ItemPickup128_38 Bridge_Details (X=-72776.086 Y=-107813.102 Z=8305.589) + "Wood Bridge Scraps 7": base_id + 1391, # ItemPickup17975 Bridge_Details (X=-75224.648 Y=-108280.867 Z=7929.499) + "Wood Bridge Scraps 8": base_id + 1392, # ItemPickup126_32 Bridge_Details (X=-68112.172 Y=-105119.656 Z=9458.937) + "Wood Bridge Scraps 9": base_id + 1393, # ItemPickup118_8 Bridge_Details (X=-71847.625 Y=-103623.203 Z=10707.521) + "Wood Bridge Scraps 10": base_id + 1394, # ItemPickup116_2 Bridge_Details (X=-71812.219 Y=-107256.094 Z=10780.134) + "Wood Bridge Scraps 11": base_id + 1395, # ItemPickup134321 Bridge_Details (X=-72011.570 Y=-109054.547 Z=10866.852) + "Wood Bridge Scraps 12": base_id + 1396, # ItemPickup117_5 Bridge_Details (X=-72862.430 Y=-106144.852 Z=10329.061) + "Wood Bridge Scraps 13": base_id + 1397 # ItemPickup1494567 Bridge_Details (X=-71843.117 Y=-107174.133 Z=10367.116) +} + +loc_museum = { + "Museum Scraps 1": base_id + 1398, # ItemPickup119_11 Bridge_Details (X=-69687.773 Y=-100002.406 Z=10806.339) + "Museum Scraps 2": base_id + 1399, # ItemPickup120_14 Bridge_Details (X=-68035.195 Y=-99480.672 Z=11049.731) + "Museum Scraps 3": base_id + 1400, # ItemPickup125_29 Bridge_Details (X=-66912.641 Y=-99976.750 Z=11064.357) + "Museum Scraps 4": base_id + 1401, # ItemPickup13532 Bridge_HouseDetails (X=-64901.117 Y=-99624.953 Z=11176.359) + "Museum Scraps 5": base_id + 1402, # ItemPickup121_17 Bridge_Details (X=-66082.328 Y=-98105.555 Z=11089.308) + "Museum Scraps 6": base_id + 1403, # ItemPickup21765 Bridge_HouseDetails (X=-67402.742 Y=-97735.133 Z=11153.927) + "Museum Scraps 7": base_id + 1404, # ItemPickup124_26 Bridge_Details (X=-66716.031 Y=-98282.508 Z=11195.624) + "Museum Scraps 8": base_id + 1405, # ItemPickup122_20 Bridge_Details (X=-66582.703 Y=-99092.461 Z=11630.082) + "Museum Scraps 9": base_id + 1406, # ItemPickup123_23 Bridge_Details (X=-66798.164 Y=-99550.266 Z=11547.321) + "Museum Scraps 10": base_id + 1407, # ItemPickup183423 Bridge_HouseDetails (X=-66850.336 Y=-99682.844 Z=11543.618) + "Museum Scraps 11": base_id + 1408, # ItemPickup244_40 Mine2_OutsideDetails (X=-60156.828 Y=-98516.953 Z=11811.422) + "Museum Scraps 12": base_id + 1409, # ItemPickup245_43 Mine2_OutsideDetails (X=-61195.203 Y=-98262.422 Z=11779.118) + "Museum Paul Mission Start": base_id + 1410, # (dialog 6) -> remote_explosive (x8) + "Museum Paul Mission End": base_id + 1411 # (dialog 3) -> temple_key +} + +loc_barbed_shelter = { + "Barbed Shelter Gertrude Mission Start": base_id + 1412, # (dialog 4) -> broken_bob + "Barbed Shelter Scraps 1": base_id + 1413, # ItemPickup100_8 Bob_NPCHouseMain (X=-72525.500 Y=-89333.734 Z=9820.663) + "Barbed Shelter Scraps 2": base_id + 1414, # ItemPickup98_2 Bob_NPCHouseMain (X=-74870.758 Y=-88576.641 Z=9836.814) + "Barbed Shelter Scraps 3": base_id + 1415, # ItemPickup22_1 Bob_NPCHouseDetails (X=-76193.914 Y=-88038.836 Z=9818.776) + "Barbed Shelter Scraps 4": base_id + 1416, # ItemPickup99_5 Bob_NPCHouseMain (X=-74494.859 Y=-87609.969 Z=9837.866) + "Barbed Shelter Scraps 5": base_id + 1417 # ItemPickup23_3 Bob_NPCHouseDetails (X=-74826.930 Y=-88402.039 Z=9929.854) +} + +loc_west_beach = { + "West Beach Chest Scraps 1": base_id + 1418, # ItemPickup9122346 Secret11_Details (X=-85934.047 Y=-89532.547 Z=7383.054) + "West Beach Chest Scraps 2": base_id + 1419, # ItemPickup84 Secret11_Details (X=-85933.977 Y=-89532.977 Z=7369.364) + "West Beach Chest Scraps 3": base_id + 1420, # ItemPickup9099877 Secret11_Details (X=-85951.000 Y=-89527.023 Z=7367.054) + "West Beach Chest Scraps 4": base_id + 1421, # ItemPickup89086423 Secret11_Details (X=-85932.461 Y=-89533.148 Z=7354.001) + "West Beach Chest Scraps 5": base_id + 1422, # ItemPickup83 Secret11_Details (X=-85950.930 Y=-89527.453 Z=7353.365) + "West Beach Chest Scraps 6": base_id + 1423, # ItemPickup82_2 Secret11_Details (X=-85932.391 Y=-89533.578 Z=7340.312) + "West Beach Scraps 1": base_id + 1424, # ItemPickup87_13 Secret11_Details (X=-84489.945 Y=-91235.977 Z=8360.803) + "West Beach Scraps 2": base_id + 1425, # ItemPickup349_2 Secret11_Details1 (X=-84386.320 Y=-90391.789 Z=8376.434) + "West Beach Scraps 3": base_id + 1426, # ItemPickup86_10 Secret11_Details (X=-84714.773 Y=-89876.992 Z=7707.064) + "West Beach Scraps 4": base_id + 1427, # ItemPickup350_5 Secret11_Details1 (X=-85478.672 Y=-90648.414 Z=7708.377) + "West Beach Scraps 5": base_id + 1428, # ItemPickup85_7 Secret11_Details (X=-86276.633 Y=-90674.289 Z=7532.364) + "West Beach Scraps 6": base_id + 1429, # ItemPickup88_16 Secret11_Details (X=-84363.055 Y=-87497.938 Z=7582.647) + "West Beach Scraps 7": base_id + 1430, # ItemPickup351_8 Secret11_Details1 (X=-86556.266 Y=-89748.484 Z=7297.274) + "West Beach Scraps 8": base_id + 1431 # ItemPickup352_11 Secret11_Details1 (X=-83210.836 Y=-92551.953 Z=8460.213) +} + +loc_church = { + "Church Black Paint Can": base_id + 1432, # PaintCan_4 Secret5_ChurchDetails (X=-67628.172 Y=-83801.375 Z=9865.983) + "Church Scraps 1": base_id + 1433, # ItemPickup391_11 Secret5_ChurchDetails (X=-64009.039 Y=-84252.156 Z=10258.335) + "Church Scraps 2": base_id + 1434, # ItemPickup389_5 Secret5_ChurchDetails (X=-66870.719 Y=-85202.180 Z=9843.936) + "Church Scraps 3": base_id + 1435, # ItemPickup388_2 Secret5_ChurchDetails (X=-68588.352 Y=-84041.867 Z=9790.541) + "Church Scraps 4": base_id + 1436, # ItemPickup396_26 Secret5_ChurchDetails (X=-67595.797 Y=-82120.094 Z=9818.303) + "Church Scraps 5": base_id + 1437, # ItemPickup390_8 Secret5_ChurchDetails (X=-67291.000 Y=-83324.836 Z=9774.942) + "Church Scraps 6": base_id + 1438, # ItemPickup392_14 Secret5_ChurchDetails (X=-65849.070 Y=-80676.477 Z=9895.943) + "Church Scraps 7": base_id + 1439, # ItemPickup395_23 Secret5_ChurchDetails (X=-65170.266 Y=-79155.227 Z=9904.275) + "Church Scraps 8": base_id + 1440, # ItemPickup24_4 Secret5_GraveyardMain (X=-64837.563 Y=-80885.305 Z=9906.755) + "Church Scraps 9": base_id + 1441, # ItemPickup22_3 Secret5_ChurchDetails (X=-68248.359 Y=-83578.008 Z=9807.300) + "Church Scraps 10": base_id + 1442, # ItemPickup23_5 Secret5_ChurchDetails (X=-67086.102 Y=-84605.086 Z=9805.521) + "Church Scraps 11": base_id + 1443, # ItemPickup393_17 Secret5_ChurchDetails (X=-67901.930 Y=-83477.625 Z=9812.613) + "Church Scraps 12": base_id + 1444 # ItemPickup394_20 Secret5_ChurchDetails (X=-65834.344 Y=-84192.102 Z=9987.823) +} + +loc_west_cottage = { + "West Cottage Gale Mission Start": base_id + 1445, # (dialog 10) -> mountain_ruin_key + "West Cottage Scraps 1": base_id + 1446, # ItemPickup15_3 Mine3_NPCHouse (X=-74407.695 Y=-81781.250 Z=10120.775) + "West Cottage Scraps 2": base_id + 1447, # ItemPickup283_5 Mine3_NPCHouseDetails (X=-73784.695 Y=-79414.359 Z=10128.285) + "West Cottage Scraps 3": base_id + 1448, # ItemPickup13_1 Mine3_NPCHouse (X=-73992.391 Y=-78600.094 Z=10162.495) + "West Cottage Scraps 4": base_id + 1449, # ItemPickup284_8 Mine3_NPCHouseDetails (X=-71623.000 Y=-75998.023 Z=10275.477) + "West Cottage Scraps 5": base_id + 1450 # ItemPickup282_2 Mine3_NPCHouseDetails (X=-72626.453 Y=-79391.070 Z=10211.037) +} + +loc_caravan = { + "Caravan Scraps 1": base_id + 1451, # ItemPickup348_11 Secret10_PAth (X=-52638.109 Y=-43924.395 Z=10579.809) + "Caravan Scraps 2": base_id + 1452, # ItemPickup347_8 Secret10_PAth (X=-50203.695 Y=-42865.672 Z=10778.871) + "Caravan Scraps 3": base_id + 1453, # ItemPickup346_5 Secret10_PAth (X=-48467.738 Y=-42018.488 Z=10818.758) + "Caravan Scraps 4": base_id + 1454, # ItemPickup77_14 Secret10_Details (X=-46325.219 Y=-41707.512 Z=11003.229) + "Caravan Scraps 5": base_id + 1455, # ItemPickup345_2 Secret10_PAth (X=-44557.043 Y=-40652.930 Z=11076.221) + "Caravan Scraps 6": base_id + 1456, # ItemPickup76_11 Secret10_Details (X=-43380.664 Y=-38207.152 Z=11165.370) + "Caravan Scraps 7": base_id + 1457, # ItemPickup73_2 Secret10_Details (X=-42919.410 Y=-38797.738 Z=11265.633) + "Caravan Scraps 8": base_id + 1458, # ItemPickup74_5 Secret10_Details (X=-42787.523 Y=-38601.820 Z=11254.003) + "Caravan Scraps 9": base_id + 1459, # ItemPickup75_8 Secret10_Details (X=-42711.363 Y=-39141.523 Z=11173.905) + "Caravan Chest Scraps 1": base_id + 1460, # ItemPickup71561 Secret10_Details (X=-42910.668 Y=-38297.309 Z=11233.402) + "Caravan Chest Scraps 2": base_id + 1461, # ItemPickup078654 Secret10_Details (X=-42904.344 Y=-38307.332 Z=11219.678) + "Caravan Chest Scraps 3": base_id + 1462, # ItemPickup02345 Secret10_Details (X=-42904.965 Y=-38280.383 Z=11208.191) + "Caravan Chest Scraps 4": base_id + 1463, # ItemPickup-6546483648 Secret10_Details (X=-42911.680 Y=-38315.254 Z=11204.225) + "Caravan Chest Scraps 5": base_id + 1464 # ItemPickup176752623547 Secret10_Details (X=-42905.090 Y=-38279.828 Z=11192.738) +} + +loc_trailer_cabin = { + "Trailer Cabin Scraps 1": base_id + 1465, # ItemPickup493_17 TrailerCabin_Details (X=-50702.449 Y=-38850.020 Z=10810.316) + "Trailer Cabin Scraps 2": base_id + 1466, # ItemPickup489_5 TrailerCabin_Details (X=-51365.684 Y=-38502.379 Z=10875.761) + "Trailer Cabin Scraps 3": base_id + 1467, # ItemPickup491_11 TrailerCabin_Details (X=-52397.570 Y=-37530.145 Z=10873.624) + "Trailer Cabin Scraps 4": base_id + 1468, # ItemPickup490_8 TrailerCabin_Details (X=-50625.746 Y=-37916.758 Z=10886.909) + "Trailer Cabin Scraps 5": base_id + 1469, # ItemPickup488_2 TrailerCabin_Details (X=-51201.051 Y=-37467.137 Z=10910.795) + "Trailer Cabin Scraps 6": base_id + 1470 # ItemPickup492_14 TrailerCabin_Details (X=-51891.320 Y=-40549.492 Z=10675.211) +} + +loc_towers = { + "Towers Scraps 1": base_id + 1471, # ItemPickup486_32 Towers_Environment_Details (X=-24434.766 Y=-25708.373 Z=11200.865) + "Towers Scraps 2": base_id + 1472, # ItemPickup483_23 Towers_Environment_Details (X=-20970.262 Y=-25678.754 Z=11731.241) + "Towers Scraps 3": base_id + 1473, # ItemPickup481_17 Towers_Environment_Details (X=-19812.230 Y=-27768.301 Z=12051.623) + "Towers Scraps 4": base_id + 1474, # ItemPickup484_26 Towers_Environment_Details (X=-19940.912 Y=-25411.576 Z=12035.366) + "Towers Scraps 5": base_id + 1475, # ItemPickup41_17 Towers_Environment (X=-18596.791 Y=-25100.035 Z=12290.350) + "Towers Scraps 6": base_id + 1476, # ItemPickup482_20 Towers_Environment_Details (X=-23302.396 Y=-23270.324 Z=12036.164) + "Towers Scraps 7": base_id + 1477, # ItemPickup487_35 Towers_Environment_Details (X=-22955.039 Y=-27576.859 Z=11211.258) + "Towers Scraps 8": base_id + 1478, # ItemPickup478_8 Towers_Environment_Details (X=-21485.520 Y=-29634.893 Z=11787.103) + "Towers Scraps 9": base_id + 1479, # ItemPickup477_5 Towers_Environment_Details (X=-23667.957 Y=-29825.240 Z=12035.269) + "Towers Scraps 10": base_id + 1480, # ItemPickup39_11 Towers_Environment (X=-25361.008 Y=-29794.301 Z=12026.073) + "Towers Scraps 11": base_id + 1481, # ItemPickup476_2 Towers_Environment_Details (X=-26549.584 Y=-32768.133 Z=12289.732) + "Towers Scraps 12": base_id + 1482, # ItemPickup38_8 Towers_Environment (X=-27240.127 Y=-27404.748 Z=12027.208) + "Towers Scraps 13": base_id + 1483, # ItemPickup40_14 Towers_Environment (X=-23231.639 Y=-27799.158 Z=11829.792) + "Towers Scraps 14": base_id + 1484, # ItemPickup485_29 Towers_Environment_Details (X=-22949.568 Y=-26146.012 Z=11702.730) + "Towers Scraps 15": base_id + 1485, # ItemPickup479_11 Towers_Environment_Details (X=-19726.715 Y=-32464.682 Z=12118.678) + "Towers Scraps 16": base_id + 1486, # ItemPickup1366543 Tower_BuildingsExteriorDetails (X=-23495.104 Y=-27644.689 Z=11872.844) + "Towers Scraps 17": base_id + 1487, # ItemPickup139978 Tower_BuildingsExteriorDetails (X=-23512.971 Y=-27493.051 Z=12218.543) + "Towers Scraps 18": base_id + 1488, # ItemPickup42_20 Towers_Environment (X=-22731.439 Y=-26331.393 Z=12102.758) + "Towers Scraps 19": base_id + 1489, # ItemPickup131123 Tower_BuildingsExteriorDetails (X=-22599.641 Y=-26454.590 Z=11752.040) + "Towers Scraps 20": base_id + 1490, # ItemPickup196987 Tower_BuildingsExteriorDetails (X=-22589.721 Y=-26397.414 Z=12571.282) + "Towers Scraps 21": base_id + 1491, # ItemPickup138787 Tower_BuildingsExteriorDetails (X=-22163.268 Y=-26775.938 Z=13107.048) + "Towers Scraps 22": base_id + 1492, # ItemPickup43_23 Towers_Environment (X=-21996.184 Y=-26754.393 Z=13105.997) + "Towers Scraps 23": base_id + 1493, # ItemPickup837454 Tower_BuildingsExteriorDetails (X=-24068.221 Y=-27874.443 Z=12819.666) + "Towers Scraps 24": base_id + 1494, # ItemPickup44_29 Towers_Environment (X=-23525.330 Y=-27770.035 Z=12612.871) + "Towers Scraps 25": base_id + 1495, # ItemPickup18932 Tower_BuildingsExteriorDetails (X=-23472.215 Y=-27617.404 Z=13213.256) + "Towers Scraps 26": base_id + 1496, # ItemPickup188348 Tower_BuildingsExteriorDetails (X=-23981.588 Y=-27984.385 Z=13219.854) + "Towers Scraps 27": base_id + 1497, # ItemPickup480_14 Towers_Environment_Details (X=-18696.230 Y=-34511.277 Z=12704.238) + "Towers Lime Paint Can": base_id + 1498, # PaintCan_2 Towers_BuildingsDetails (X=-22288.555 Y=-26022.281 Z=11835.892) \!/ Existing match 5 + "Towers Employment Contracts": base_id + 1499, # Towers_Files_Pickup Tower_BuildingsExteriorDetails (X=-24081.414 Y=-27637.459 Z=13679.163) + "Towers Ronny Mission End": base_id + 1500 # (dialog 3) -> 1_scraps_reward +} + +loc_north_beach = { + "North Beach Chest Scraps 1": base_id + 1501, # ItemPickup9254 Secret3_CampDetails (X=-74444.648 Y=-130627.672 Z=8793.757) + "North Beach Chest Scraps 2": base_id + 1502, # ItemPickup14523 Secret3_CampDetails (X=-74426.539 Y=-130626.547 Z=8781.948) + "North Beach Chest Scraps 3": base_id + 1503, # ItemPickup084537 Secret3_CampDetails (X=-74448.852 Y=-130632.367 Z=8772.555) + "North Beach Chest Scraps 4": base_id + 1504, # ItemPickup17754234 Secret3_CampDetails (X=-74425.523 Y=-130622.875 Z=8755.526) + "North Beach Scraps 1": base_id + 1505, # ItemPickup376_5 Secret3_CampDetails (X=-75003.078 Y=-131084.016 Z=8729.731) + "North Beach Scraps 2": base_id + 1506, # ItemPickup378_11 Secret3_CampDetails (X=-75477.758 Y=-129413.750 Z=9082.617) + "North Beach Scraps 3": base_id + 1507, # ItemPickup377_8 Secret3_CampDetails (X=-75608.453 Y=-130483.430 Z=8909.659) + "North Beach Scraps 4": base_id + 1508, # ItemPickup375_2 Secret3_CampDetails (X=-74143.469 Y=-131117.953 Z=8752.130) + "North Beach Scraps 5": base_id + 1509, # ItemPickup387_6 Secret4_BeachHouseMain (X=-80847.078 Y=-135628.719 Z=7915.444) + "North Beach Scraps 6": base_id + 1510, # ItemPickup386_3 Secret4_BeachHouseMain (X=-84044.789 Y=-137591.000 Z=7359.172) + "North Beach Scraps 7": base_id + 1511, # ItemPickup379_2 Secret4_BeachHouseDetails (X=-83992.836 Y=-132933.531 Z=7941.225) + "North Beach Scraps 8": base_id + 1512, # ItemPickup380_5 Secret4_BeachHouseDetails (X=-87355.734 Y=-134216.438 Z=7237.310) + "North Beach Scraps 9": base_id + 1513, # ItemPickup384_17 Secret4_BeachHouseDetails (X=-89213.844 Y=-134625.922 Z=7185.133) + "North Beach Scraps 10": base_id + 1514, # ItemPickup25_0 Secret4_BeachHouseDetails (X=-88423.430 Y=-135922.969 Z=7290.801) + "North Beach Scraps 11": base_id + 1515, # ItemPickup381_8 Secret4_BeachHouseDetails (X=-87668.977 Y=-136850.359 Z=7275.346) + "North Beach Scraps 12": base_id + 1516, # ItemPickup383_14 Secret4_BeachHouseDetails (X=-90241.328 Y=-136381.000 Z=7199.622) + "North Beach Scraps 13": base_id + 1517, # ItemPickup27_8 Secret4_BeachHouseDetails (X=-91728.680 Y=-135288.203 Z=7319.699) + "North Beach Scraps 14": base_id + 1518, # ItemPickup26_2 Secret4_BeachHouseDetails (X=-88789.039 Y=-135461.719 Z=7305.800) + "North Beach Scraps 15": base_id + 1519, # ItemPickup382_11 Secret4_BeachHouseDetails (X=-88572.078 Y=-135970.734 Z=7302.674) + "North Beach Teal Paint Can": base_id + 1520 # PaintCan_2 Secret4_BeachHouseDetails (X=-91706.805 Y=-134988.453 Z=7347.827) \!/ Existing match 5 + # "North Beach Scraps Glitch 1" ItemPickup385_20 (X=-77651.938 Y=-139721.453 Z=7261.729) /!\ Glitched scrap +} + +loc_mine_shaft = { + "Mine Shaft Chest Scraps 1": base_id + 1521, # ItemPickup0934569 Secret13_Details (X=-17360.789 Y=-74064.367 Z=8038.313) + "Mine Shaft Chest Scraps 2": base_id + 1522, # ItemPickup17234455622 Secret13_Details (X=-17360.814 Y=-74064.367 Z=8024.187) + "Mine Shaft Chest Scraps 3": base_id + 1523, # ItemPickup856743 Secret13_Details (X=-17361.059 Y=-74049.234 Z=8015.940) + "Mine Shaft Chest Scraps 4": base_id + 1524, # ItemPickup16456456 Secret13_Details (X=-17336.465 Y=-74087.063 Z=8009.707) + "Mine Shaft Chest Scraps 5": base_id + 1525, # ItemPickup234743 Secret13_Details (X=-17349.941 Y=-74075.484 Z=8004.179) + "Mine Shaft Chest Scraps 6": base_id + 1526, # ItemPickup1434563456 Secret13_Details (X=-17361.084 Y=-74049.234 Z=8001.814) + "Mine Shaft Chest Scraps 7": base_id + 1527, # ItemPickup13634563456 Secret13_Details (X=-17349.967 Y=-74075.484 Z=7990.054) + "Mine Shaft Scraps 1": base_id + 1528, # ItemPickup369_23 Secret13_Details (X=-16985.645 Y=-70377.273 Z=10837.127) + "Mine Shaft Scraps 2": base_id + 1529, # ItemPickup368_20 Secret13_Details (X=-18292.045 Y=-71003.563 Z=10975.308) + "Mine Shaft Scraps 3": base_id + 1530, # ItemPickup367_17 Secret13_Details (X=-16150.797 Y=-72075.289 Z=10609.141) + "Mine Shaft Scraps 4": base_id + 1531, # ItemPickup24456463 Secret13_EntranceDetails1 (X=-18404.480 Y=-71894.367 Z=10968.230) + "Mine Shaft Scraps 5": base_id + 1532, # ItemPickup2565644 Secret13_Details (X=-17777.268 Y=-71467.172 Z=10441.745) + "Mine Shaft Scraps 6": base_id + 1533, # ItemPickup366_14 Secret13_Details (X=-17630.971 Y=-72800.641 Z=8842.322) + "Mine Shaft Scraps 7": base_id + 1534, # ItemPickup18_8 Secret13_Details (X=-17979.719 Y=-73413.563 Z=8118.260) + "Mine Shaft Scraps 8": base_id + 1535, # ItemPickup21_11 Secret13_Details (X=-16554.467 Y=-74139.781 Z=7892.738) + "Mine Shaft Scraps 9": base_id + 1536, # ItemPickup365_11 Secret13_Details (X=-16343.033 Y=-74617.555 Z=7298.177) + "Mine Shaft Scraps 10": base_id + 1537, # ItemPickup22123 Secret13_Details (X=-12390.332 Y=-77620.320 Z=7324.504) + "Mine Shaft Scraps 11": base_id + 1538, # ItemPickup364_8 Secret13_Details (X=-10969.702 Y=-77961.477 Z=7297.171) + "Mine Shaft Scraps 12": base_id + 1539, # ItemPickup363_5 Secret13_Details (X=-9888.596 Y=-78208.930 Z=7269.473) + "Mine Shaft Scraps 13": base_id + 1540, # ItemPickup362_2 Secret13_Details (X=-8865.696 Y=-79063.977 Z=7247.677) + "Mine Shaft Scraps 14": base_id + 1541 # ItemPickup238976 Secret13_ExitDetails (X=-8143.984 Y=-79764.617 Z=7222.096) +} + +loc_mob_camp = { + "Mob Camp Key": base_id + 1542, # ItemPickup29_0 Bob_CampDetails2 (X=-29114.480 Y=-53608.520 Z=12839.528) + "Mob Camp Scraps 1": base_id + 1543, # ItemPickup25_5 Bob_CampDetails2 (X=-27373.525 Y=-53008.668 Z=12706.465) + "Mob Camp Scraps 2": base_id + 1544, # ItemPickup26_1 Bob_CampDetails2 (X=-28786.941 Y=-53009.762 Z=12760.727) + "Mob Camp Scraps 3": base_id + 1545, # ItemPickup13_14 Mine3_Mountain (X=-29650.207 Y=-53328.070 Z=12724.598) + "Mob Camp Scraps 4": base_id + 1546, # ItemPickup90_5 Bob_CampDetails2 (X=-31515.057 Y=-55533.324 Z=12344.274) + "Mob Camp Scraps 5": base_id + 1547, # ItemPickup49513294 Mine3_Mountain (X=-31847.229 Y=-55152.352 Z=11574.255) + "Mob Camp Scraps 6": base_id + 1548, # ItemPickup92_14 Bob_CampDetails2 (X=-31323.533 Y=-55432.871 Z=11245.139) + "Mob Camp Scraps 7": base_id + 1549, # ItemPickup91_8 Bob_CampDetails2 (X=-31583.443 Y=-55475.805 Z=11234.112) + "Mob Camp Scraps 8": base_id + 1550, # ItemPickup95_23 Bob_CampDetails2 (X=-32925.406 Y=-57157.605 Z=11086.322) + "Mob Camp Scraps 9": base_id + 1551, # ItemPickup96_26 Bob_CampDetails2 (X=-33052.488 Y=-58560.098 Z=11101.021) + "Mob Camp Scraps 10": base_id + 1552, # ItemPickup13121212 Mine3_Mountain (X=-32422.406 Y=-60145.063 Z=11203.182) + "Mob Camp Scraps 11": base_id + 1553, # ItemPickup93_17 Bob_CampDetails2 (X=-30891.457 Y=-60046.465 Z=11237.567) + "Mob Camp Scraps 12": base_id + 1554, # ItemPickup97_29 Bob_CampDetails2 (X=-31888.428 Y=-59222.645 Z=11179.302) + "Mob Camp Scraps 13": base_id + 1555, # ItemPickup62156 Mine3_Mountain (X=-31161.750 Y=-57410.789 Z=11279.820) + "Mob Camp Scraps 14": base_id + 1556, # ItemPickup24_3 Bob_CampDetails2 (X=-31256.545 Y=-59865.809 Z=11904.155) + "Mob Camp Scraps 15": base_id + 1557, # ItemPickup27_0 Bob_CampDetails2 (X=-31757.953 Y=-57179.258 Z=11295.150) + "Mob Camp Scraps 16": base_id + 1558 # ItemPickup89_2 Bob_CampDetails2 (X=-29137.043 Y=-54824.797 Z=12418.673) +} + +loc_mob_camp_locked_room = { + "Mob Camp Locked Room Scraps 1": base_id + 1559, # ItemPickup94_20 Bob_CampDetails2 (X=-31736.459 Y=-59761.465 Z=11211.379) + "Mob Camp Locked Room Scraps 2": base_id + 1560, # ItemPickup28_14 Bob_CampDetails2 (X=-32150.889 Y=-59879.594 Z=11297.058) + "Mob Camp Locked Room Stolen Bob": base_id + 1561 # Bob_Clickbox (X=-31771.172 Y=-59892.449 Z=11323.562) +} + +loc_mine_elevator_exit = { + "Mine Elevator Exit Scraps 1": base_id + 1562, # ItemPickup266_19 Mine3_ExitCampDetails (X=-29587.271 Y=-42650.797 Z=12515.042) + "Mine Elevator Exit Scraps 2": base_id + 1563, # ItemPickup265_16 Mine3_ExitCampDetails (X=-30727.555 Y=-42715.438 Z=12485.763) + "Mine Elevator Exit Scraps 3": base_id + 1564, # ItemPickup267_22 Mine3_ExitCampDetails (X=-29814.680 Y=-43722.777 Z=12518.878) + "Mine Elevator Exit Scraps 4": base_id + 1565, # ItemPickup261_2 Mine3_ExitCampDetails (X=-30983.000 Y=-42943.754 Z=12474.396) + "Mine Elevator Exit Scraps 5": base_id + 1566, # ItemPickup262_5 Mine3_ExitCampDetails (X=-31824.576 Y=-43997.270 Z=12345.908) + "Mine Elevator Exit Scraps 6": base_id + 1567, # ItemPickup268_25 Mine3_ExitCampDetails (X=-32553.924 Y=-44761.855 Z=12341.698) + "Mine Elevator Exit Scraps 7": base_id + 1568, # ItemPickup263_10 Mine3_ExitCampDetails (X=-33598.023 Y=-44369.297 Z=12438.430) + "Mine Elevator Exit Scraps 8": base_id + 1569, # ItemPickup264_13 Mine3_ExitCampDetails (X=-31947.459 Y=-42017.137 Z=12384.311) + "Mine Elevator Exit Scraps 9": base_id + 1570 # ItemPickup269_28 Mine3_ExitCampDetails (X=-30127.123 Y=-46004.891 Z=12229.104) +} + +loc_mountain_ruin_outside = { + "Mountain Ruin Outside Scraps 1": base_id + 1571, # ItemPickup112345556 Mine3_Outside (X=-2218.456 Y=-43914.789 Z=11238.952) + "Mountain Ruin Outside Scraps 2": base_id + 1572, # ItemPickup35621 Mine3_Outside (X=-2402.206 Y=-45494.766 Z=11244.650) + "Mountain Ruin Outside Scraps 3": base_id + 1573, # ItemPickup13000 Mine3_Outside (X=-2781.385 Y=-47365.313 Z=11235.389) + "Mountain Ruin Outside Scraps 4": base_id + 1574, # ItemPickup995959 Mine3_Outside (X=-2961.431 Y=-45445.973 Z=11255.289) + "Mountain Ruin Outside Scraps 5": base_id + 1575, # ItemPickup136999 Mine3_Outside (X=-5873.435 Y=-46300.633 Z=11228.667) + "Mountain Ruin Outside Scraps 6": base_id + 1576, # ItemPickup1589994 Mine3_Outside (X=-1823.357 Y=-47071.813 Z=11161.523) + "Mountain Ruin Outside Scraps 7": base_id + 1577, # ItemPickup09871230948 Mine3_Outside (X=-3478.155 Y=-49094.965 Z=11083.230) + "Mountain Ruin Outside Scraps 8": base_id + 1578, # ItemPickup258_20 Mine3_Camp (X=-4606.678 Y=-50246.180 Z=11613.938) + "Mountain Ruin Outside Scraps 9": base_id + 1579, # ItemPickup257_17 Mine3_Camp (X=-5454.638 Y=-53508.004 Z=12062.944) + "Mountain Ruin Outside Scraps 10": base_id + 1580, # ItemPickup18_3 Mine3_Camp (X=-8192.042 Y=-53726.535 Z=11947.394) + "Mountain Ruin Outside Scraps 11": base_id + 1581, # ItemPickup252_2 Mine3_Camp (X=-9409.834 Y=-53970.621 Z=11923.256) + "Mountain Ruin Outside Scraps 12": base_id + 1582, # ItemPickup254_8 Mine3_Camp (X=-8977.424 Y=-57134.637 Z=12232.596) + "Mountain Ruin Outside Scraps 13": base_id + 1583, # ItemPickup19_1 Mine3_Camp (X=-10449.292 Y=-56481.938 Z=12274.706) + "Mountain Ruin Outside Scraps 14": base_id + 1584, # ItemPickup255_11 Mine3_Camp (X=-10490.690 Y=-56584.301 Z=12281.096) + "Mountain Ruin Outside Scraps 15": base_id + 1585, # ItemPickup256_14 Mine3_Camp (X=-11600.937 Y=-55831.191 Z=12388.329) + "Mountain Ruin Outside Scraps 16": base_id + 1586, # ItemPickup259_23 Mine3_Camp (X=-3307.077 Y=-49973.461 Z=11282.041) + "Mountain Ruin Outside Scraps 17": base_id + 1587 # ItemPickup260_26 Mine3_Camp (X=-8878.345 Y=-49816.922 Z=13700.768) +} + +loc_mountain_ruin_inside = { + "Mountain Ruin Inside Scraps 1": base_id + 1588, # ItemPickup253_5 Mine3_Camp (X=-10647.446 Y=-52039.848 Z=11925.344) + "Mountain Ruin Inside Scraps 2": base_id + 1589, # ItemPickup270_2 Mine3_Interior1 (X=-12834.990 Y=-48683.176 Z=10200.083) + "Mountain Ruin Inside Scraps 3": base_id + 1590, # ItemPickup271_5 Mine3_Interior1 (X=-15748.594 Y=-44925.523 Z=10199.975) + "Mountain Ruin Inside Scraps 4": base_id + 1591, # ItemPickup20_3 Mine3_Interior1 (X=-15312.152 Y=-43957.055 Z=10350.783) + "Mountain Ruin Inside Scraps 5": base_id + 1592, # ItemPickup273_11 Mine3_Interior1 (X=-16709.586 Y=-44997.316 Z=10198.888) + "Mountain Ruin Inside Scraps 6": base_id + 1593, # ItemPickup272_8 Mine3_Interior1 (X=-17412.561 Y=-46041.977 Z=10349.650) + "Mountain Ruin Inside Scraps 7": base_id + 1594, # ItemPickup274_14 Mine3_Interior1 (X=-17452.596 Y=-43804.941 Z=10201.436) + "Mountain Ruin Inside Scraps 8": base_id + 1595, # ItemPickup21_2 Mine3_Interior1 (X=-18119.473 Y=-42001.453 Z=10198.855) + "Mountain Ruin Inside Scraps 9": base_id + 1596, # ItemPickup276_20 Mine3_Interior1 (X=-18975.068 Y=-42906.488 Z=10279.690) + "Mountain Ruin Inside Scraps 10": base_id + 1597, # ItemPickup277_26 Mine3_Interior1 (X=-19727.902 Y=-41581.039 Z=10199.614) + "Mountain Ruin Inside Scraps 11": base_id + 1598, # ItemPickup275_17 Mine3_Interior1 (X=-19187.891 Y=-40516.941 Z=10201.049) + "Mountain Ruin Inside Scraps 12": base_id + 1599, # ItemPickup278_29 Mine3_Interior1 (X=-22470.986 Y=-41602.875 Z=10073.847) + "Mountain Ruin Inside Scraps 13": base_id + 1600, # ItemPickup279_2 Mine3_Interior2 (X=-23717.383 Y=-42597.141 Z=7455.452) + "Mountain Ruin Inside Scraps 14": base_id + 1601, # ItemPickup22_7 Mine3_Interior2 (X=-24494.582 Y=-44598.086 Z=7433.633) + "Mountain Ruin Inside Scraps 15": base_id + 1602, # ItemPickup280_5 Mine3_Interior2 (X=-26783.293 Y=-42331.145 Z=7446.357) + "Mountain Ruin Inside Scraps 16": base_id + 1603, # ItemPickup281_8 Mine3_Interior2 (X=-28636.996 Y=-46745.340 Z=7430.463) + "Mountain Ruin Inside Scraps 17": base_id + 1604, # ItemPickup23_1 Mine3_Interior2 (X=-27752.643 Y=-47453.973 Z=7445.047) + "Mountain Ruin Inside Red Egg": base_id + 1605, # Mine3_EggPickup Mine3_Interior2 (X=-28254.400 Y=-45702.844 Z=7551.568) + "Mountain Ruin Inside Red Paint Can": base_id + 1606 # PaintCan_2 Mine3_Interior2 (X=-31391.293 Y=-44953.223 Z=7448.648) \!/ Existing match 5 +} + +loc_pickle_val = { + "Pickle Val Scraps 1": base_id + 1607, # ItemPickup56_2 Pickles_HouseDetails (X=60402.582 Y=25252.434 Z=11151.982) + "Pickle Val Scraps 2": base_id + 1608, # ItemPickup57_5 Pickles_HouseDetails (X=58717.516 Y=24457.180 Z=11343.938) + "Pickle Val Scraps 3": base_id + 1609, # ItemPickup311_14 Pickles_EnvironmentDetails (X=56455.688 Y=22324.875 Z=11655.192) + "Pickle Val Scraps 4": base_id + 1610, # ItemPickup310_11 Pickles_EnvironmentDetails (X=52888.387 Y=22541.955 Z=12428.012) + "Pickle Val Scraps 5": base_id + 1611, # ItemPickup58_2 Pickles_EnvironmentDetails (X=50374.863 Y=22073.027 Z=12591.468) + "Pickle Val Scraps 6": base_id + 1612, # ItemPickup309_8 Pickles_EnvironmentDetails (X=45985.988 Y=23063.826 Z=13043.497) + "Pickle Val Scraps 7": base_id + 1613, # ItemPickup316_27 Pickles_EnvironmentDetails (X=45533.469 Y=24876.168 Z=13015.539) + "Pickle Val Scraps 8": base_id + 1614, # ItemPickup317_30 Pickles_EnvironmentDetails (X=44928.848 Y=30913.396 Z=14273.230) + "Pickle Val Scraps 9": base_id + 1615, # ItemPickup321_42 Pickles_EnvironmentDetails (X=41572.684 Y=37403.539 Z=13527.379) + "Pickle Val Scraps 10": base_id + 1616, # ItemPickup61_11 Pickles_EnvironmentDetails (X=42266.566 Y=30556.238 Z=13584.196) + "Pickle Val Scraps 11": base_id + 1617, # ItemPickup314_21 Pickles_EnvironmentDetails (X=43356.219 Y=29465.746 Z=13449.486) + "Pickle Val Scraps 12": base_id + 1618, # ItemPickup323_48 Pickles_EnvironmentDetails (X=40893.461 Y=30669.398 Z=13465.039) + "Pickle Val Scraps 13": base_id + 1619, # ItemPickup318_33 Pickles_EnvironmentDetails (X=41276.863 Y=32313.068 Z=13480.846) + "Pickle Val Scraps 14": base_id + 1620, # ItemPickup319_36 Pickles_EnvironmentDetails (X=38630.031 Y=30471.996 Z=13571.207) + "Pickle Val Scraps 15": base_id + 1621, # ItemPickup320_39 Pickles_EnvironmentDetails (X=38596.938 Y=30050.293 Z=13559.574) + "Pickle Val Scraps 16": base_id + 1622, # ItemPickup60_8 Pickles_EnvironmentDetails (X=42042.520 Y=25136.820 Z=13077.339) + "Pickle Val Scraps 17": base_id + 1623, # ItemPickup308_5 Pickles_EnvironmentDetails (X=43770.914 Y=23307.234 Z=12374.002) + "Pickle Val Scraps 18": base_id + 1624, # ItemPickup59_5 Pickles_EnvironmentDetails (X=44672.641 Y=20936.520 Z=12198.017) + "Pickle Val Scraps 19": base_id + 1625, # ItemPickup307_2 Pickles_EnvironmentDetails (X=42844.730 Y=22869.387 Z=12832.900) + "Pickle Val Scraps 20": base_id + 1626, # ItemPickup315_24 Pickles_EnvironmentDetails (X=43397.758 Y=26367.248 Z=13005.097) + "Pickle Val Scraps 21": base_id + 1627, # ItemPickup322_45 Pickles_EnvironmentDetails (X=39352.430 Y=32668.316 Z=14494.778) + "Pickle Val Scraps 22": base_id + 1628, # ItemPickup313 Pickles_EnvironmentDetails (X=59688.781 Y=25266.756 Z=11425.324) + "Pickle Val Scraps 23": base_id + 1629, # ItemPickup312_17 Pickles_EnvironmentDetails (X=59197.871 Y=24760.773 Z=11425.324) + "Pickle Val Purple Paint Can": base_id + 1630, # PaintCan_7 Pickles_EnvironmentDetails (X=40394.855 Y=31546.465 Z=13472.573) + "Pickle Val Jar of Pickles": base_id + 1631, # Pickles_Pickup Pickles_Cave (X=38227.535 Y=30234.848 Z=13593.506) + "Pickle Val Pickle Lady Mission End": base_id + 1632 # (dialog 4) -> 30_scraps_reward +} + +loc_shrine_near_temple = { + "Shrine Near Temple Scraps 1": base_id + 1633, # ItemPickup3 Photorealistic_Island (X=-4675.183 Y=-21143.846 Z=11984.782) + "Shrine Near Temple Scraps 2": base_id + 1634, # ItemPickup_2 Photorealistic_Island (X=-4994.117 Y=-20496.621 Z=11874.112) + "Shrine Near Temple Scraps 3": base_id + 1635 # ItemPickup2 Photorealistic_Island (X=-4196.896 Y=-20477.025 Z=11882.833) +} + +loc_morse_bunker = { + "Morse Bunker Chest Scraps 1": base_id + 1636, # ItemPickup6512 Secret6_BunkerDetails (X=-47961.078 Y=-85433.031 Z=10615.777) + "Morse Bunker Chest Scraps 2": base_id + 1637, # ItemPickup9363 Secret6_BunkerDetails (X=-47958.617 Y=-85444.805 Z=10604.365) + "Morse Bunker Chest Scraps 3": base_id + 1638, # ItemPickup921436 Secret6_BunkerDetails (X=-47953.637 Y=-85426.172 Z=10592.347) + "Morse Bunker Chest Scraps 4": base_id + 1639, # ItemPickup0128704 Secret6_BunkerDetails (X=-47958.691 Y=-85444.805 Z=10587.060) + "Morse Bunker Chest Scraps 5": base_id + 1640, # ItemPickup64_8 Secret6_BunkerDetails (X=-47953.617 Y=-85426.172 Z=10574.149) + "Morse Bunker Scraps 1": base_id + 1641, # ItemPickup397_2 Secret6_BunkerDetails (X=-48336.863 Y=-85458.453 Z=10574.537) + "Morse Bunker Scraps 2": base_id + 1642, # ItemPickup62_2 Secret6_BunkerDetails (X=-48253.844 Y=-84944.609 Z=10573.793) + "Morse Bunker Scraps 3": base_id + 1643, # ItemPickup63_5 Secret6_BunkerDetails (X=-47272.422 Y=-84549.945 Z=10543.671) + "Morse Bunker Scraps 4": base_id + 1644, # ItemPickup398_5 Secret6_BunkerDetails (X=-47080.836 Y=-85268.281 Z=10564.355) + "Morse Bunker Scraps 5": base_id + 1645, # ItemPickup406_31 Secret6_BunkerDetails (X=-47913.855 Y=-85234.258 Z=10819.314) + "Morse Bunker Scraps 6": base_id + 1646, # ItemPickup405_28 Secret6_BunkerDetails (X=-46410.227 Y=-83293.742 Z=10361.746) + "Morse Bunker Scraps 7": base_id + 1647, # ItemPickup399_8 Secret6_BunkerDetails (X=-45204.199 Y=-84841.211 Z=10329.200) + "Morse Bunker Scraps 8": base_id + 1648, # ItemPickup401_14 Secret6_BunkerDetails (X=-43895.801 Y=-83794.750 Z=10265.661) + "Morse Bunker Scraps 9": base_id + 1649, # ItemPickup402_17 Secret6_BunkerDetails (X=-45163.078 Y=-80832.828 Z=10090.777) + "Morse Bunker Scraps 10": base_id + 1650, # ItemPickup403_20 Secret6_BunkerDetails (X=-46782.027 Y=-82284.805 Z=10289.180) + "Morse Bunker Scraps 11": base_id + 1651, # ItemPickup404_23 Secret6_BunkerDetails (X=-49240.047 Y=-83654.961 Z=10898.540) + "Morse Bunker Scraps 12": base_id + 1652, # ItemPickup407_34 Secret6_BunkerDetails (X=-46571.930 Y=-85962.773 Z=10697.339) + "Morse Bunker Scraps 13": base_id + 1653 # ItemPickup400_11 Secret6_BunkerDetails (X=-43472.793 Y=-85983.805 Z=10310.322) +} + +loc_prism_temple = { + "Prism Temple Chest Scraps 1": base_id + 1654, # ItemPickup16632 MainShrine_DetailsREPAIRED (X=12659.641 Y=-27827.016 Z=10930.621) + "Prism Temple Chest Scraps 2": base_id + 1655, # ItemPickup148864 MainShrine_DetailsREPAIRED (X=12648.021 Y=-27825.189 Z=10916.296) + "Prism Temple Chest Scraps 3": base_id + 1656, # ItemPickup13123 MainShrine_DetailsREPAIRED (X=12665.557 Y=-27836.633 Z=10905.999) + "Prism Temple Scraps 1": base_id + 1657, # ItemPickup225_77 MainShrine_ExteriorDetails (X=5281.087 Y=-16620.387 Z=10520.609) + "Prism Temple Scraps 2": base_id + 1658, # ItemPickup223_71 MainShrine_ExteriorDetails (X=15032.147 Y=-16788.352 Z=10992.200) + "Prism Temple Scraps 3": base_id + 1659, # ItemPickup222_68 MainShrine_ExteriorDetails (X=16591.920 Y=-18725.771 Z=11004.751) + "Prism Temple Scraps 4": base_id + 1660, # ItemPickup135123 MainShrine_DetailsREPAIRED (X=17940.854 Y=-20726.746 Z=10999.944) + "Prism Temple Scraps 5": base_id + 1661, # ItemPickup220_62 MainShrine_ExteriorDetails (X=18187.346 Y=-21390.066 Z=11025.650) + "Prism Temple Scraps 6": base_id + 1662, # ItemPickup218_56 MainShrine_ExteriorDetails (X=19218.670 Y=-24017.619 Z=10906.966) + "Prism Temple Scraps 7": base_id + 1663, # ItemPickup209_29 MainShrine_ExteriorDetails (X=7710.977 Y=-23469.254 Z=11012.888) + "Prism Temple Scraps 8": base_id + 1664, # ItemPickup138765 MainShrine_DetailsREPAIRED (X=8160.002 Y=-22335.266 Z=11016.638) + "Prism Temple Scraps 9": base_id + 1665, # ItemPickup210_32 MainShrine_ExteriorDetails (X=8637.903 Y=-24295.850 Z=10929.299) + "Prism Temple Scraps 10": base_id + 1666, # ItemPickup1112 MainShrine_DetailsREPAIRED (X=7923.367 Y=-25204.055 Z=10832.877) + "Prism Temple Scraps 11": base_id + 1667, # ItemPickup214_44 MainShrine_ExteriorDetails (X=10694.420 Y=-27246.365 Z=10569.074) + "Prism Temple Scraps 12": base_id + 1668, # ItemPickup215_47 MainShrine_ExteriorDetails (X=12892.631 Y=-26743.068 Z=10868.578) + "Prism Temple Scraps 13": base_id + 1669, # ItemPickup213_41 MainShrine_ExteriorDetails (X=12483.535 Y=-27253.867 Z=10876.461) + "Prism Temple Scraps 14": base_id + 1670, # ItemPickup212_38 MainShrine_ExteriorDetails (X=13259.813 Y=-27092.033 Z=10887.968) + "Prism Temple Scraps 15": base_id + 1671, # ItemPickup211_35 MainShrine_ExteriorDetails (X=9303.245 Y=-25057.908 Z=10943.273) + "Prism Temple Scraps 16": base_id + 1672, # ItemPickup201_2 MainShrine_ExteriorDetails (X=11750.875 Y=-22999.371 Z=12426.734) + "Prism Temple Scraps 17": base_id + 1673, # ItemPickup203_8 MainShrine_ExteriorDetails (X=12966.615 Y=-23568.324 Z=12519.387) + "Prism Temple Scraps 18": base_id + 1674, # ItemPickup204_11 MainShrine_ExteriorDetails (X=14093.343 Y=-22393.182 Z=12426.847) + "Prism Temple Scraps 19": base_id + 1675, # ItemPickup206_17 MainShrine_ExteriorDetails (X=13767.980 Y=-21269.568 Z=12425.791) + "Prism Temple Scraps 20": base_id + 1676, # ItemPickup207_23 MainShrine_ExteriorDetails (X=12882.754 Y=-20027.527 Z=12516.095) + "Prism Temple Scraps 21": base_id + 1677, # ItemPickup114535 MainShrine_DetailsREPAIRED (X=11883.399 Y=-20801.344 Z=12428.452) + "Prism Temple Scraps 22": base_id + 1678, # ItemPickup208_26 MainShrine_ExteriorDetails (X=13281.792 Y=-21302.344 Z=12902.728) + "Prism Temple Scraps 23": base_id + 1679, # ItemPickup205_14 MainShrine_ExteriorDetails (X=14190.678 Y=-23671.621 Z=11781.533) + "Prism Temple Scraps 24": base_id + 1680, # ItemPickup8903 MainShrine_DetailsREPAIRED (X=14311.736 Y=-22347.758 Z=11765.781) + "Prism Temple Scraps 25": base_id + 1681, # ItemPickup654 MainShrine_DetailsREPAIRED (X=13826.154 Y=-19923.131 Z=11755.189) + "Prism Temple Scraps 26": base_id + 1682, # ItemPickup224_74 MainShrine_ExteriorDetails (X=12443.228 Y=-18577.926 Z=11240.455) + "Prism Temple Scraps 27": base_id + 1683, # ItemPickup202_5 MainShrine_ExteriorDetails (X=10993.180 Y=-23783.047 Z=11754.121) + "Prism Temple Scraps 28": base_id + 1684, # ItemPickup13098 MainShrine_DetailsREPAIRED (X=16762.963 Y=-23634.342 Z=11031.588) + "Prism Temple Scraps 29": base_id + 1685, # ItemPickup221_65 MainShrine_ExteriorDetails (X=17804.979 Y=-23512.395 Z=11066.884) + "Prism Temple Scraps 30": base_id + 1686, # ItemPickup17123123565 MainShrine_DetailsREPAIRED (X=16998.229 Y=-23241.652 Z=11055.539) + "Prism Temple Scraps 31": base_id + 1687, # ItemPickup10812783 MainShrine_DetailsREPAIRED (X=17613.518 Y=-23799.813 Z=11057.277) + "Prism Temple Scraps 32": base_id + 1688, # ItemPickup216_50 MainShrine_ExteriorDetails (X=15342.375 Y=-24807.357 Z=11024.192) + "Prism Temple Scraps 33": base_id + 1689, # ItemPickup217_53 MainShrine_ExteriorDetails (X=15963.284 Y=-24834.156 Z=11021.444) + "Prism Temple Scraps 34": base_id + 1690 # ItemPickup219_59 MainShrine_ExteriorDetails (X=21563.559 Y=-23705.184 Z=10895.696) +} + + +# All locations +location_table: dict[str, int] = { + **loc_start_camp, + **loc_tony_tiddle_mission, + **loc_barn, + **loc_candice_mission, + **loc_tutorial_house, + **loc_swamp_edges, + **loc_swamp_mission, + **loc_junkyard_area, + **loc_south_house, + **loc_junkyard_shed, + **loc_military_base, + **loc_south_mine_outside, + **loc_south_mine_inside, + **loc_middle_station, + **loc_canyon, + **loc_watchtower, + **loc_boulder_field, + **loc_haunted_house, + **loc_santiago_house, + **loc_port, + **loc_trench_house, + **loc_doll_woods, + **loc_lost_stairs, + **loc_east_house, + **loc_rockets_testing_ground, + **loc_rockets_testing_bunker, + **loc_workshop, + **loc_east_tower, + **loc_lighthouse, + **loc_north_mine_outside, + **loc_north_mine_inside, + **loc_wood_bridge, + **loc_museum, + **loc_barbed_shelter, + **loc_west_beach, + **loc_church, + **loc_west_cottage, + **loc_caravan, + **loc_trailer_cabin, + **loc_towers, + **loc_north_beach, + **loc_mine_shaft, + **loc_mob_camp, + **loc_mob_camp_locked_room, + **loc_mine_elevator_exit, + **loc_mountain_ruin_outside, + **loc_mountain_ruin_inside, + **loc_prism_temple, + **loc_pickle_val, + **loc_shrine_near_temple, + **loc_morse_bunker +} diff --git a/worlds/cccharles/Options.py b/worlds/cccharles/Options.py new file mode 100644 index 0000000000..2ce1fc7afe --- /dev/null +++ b/worlds/cccharles/Options.py @@ -0,0 +1,7 @@ +from dataclasses import dataclass +from Options import PerGameCommonOptions, StartInventoryPool + + +@dataclass +class CCCharlesOptions(PerGameCommonOptions): + start_inventory_from_pool: StartInventoryPool diff --git a/worlds/cccharles/Regions.py b/worlds/cccharles/Regions.py new file mode 100644 index 0000000000..68239dc060 --- /dev/null +++ b/worlds/cccharles/Regions.py @@ -0,0 +1,283 @@ +from BaseClasses import MultiWorld, Region, ItemClassification +from .Items import CCCharlesItem +from .Options import CCCharlesOptions +from .Locations import ( + CCCharlesLocation, loc_start_camp, loc_tony_tiddle_mission, loc_barn, loc_candice_mission, \ + loc_tutorial_house, loc_swamp_edges, loc_swamp_mission, loc_junkyard_area, loc_south_house, \ + loc_junkyard_shed, loc_military_base, loc_south_mine_outside, loc_south_mine_inside, \ + loc_middle_station, loc_canyon, loc_watchtower, loc_boulder_field, loc_haunted_house, \ + loc_santiago_house, loc_port, loc_trench_house, loc_doll_woods, loc_lost_stairs, loc_east_house, \ + loc_rockets_testing_ground, loc_rockets_testing_bunker, loc_workshop, loc_east_tower, \ + loc_lighthouse, loc_north_mine_outside, loc_north_mine_inside, loc_wood_bridge, loc_museum, \ + loc_barbed_shelter, loc_west_beach, loc_church, loc_west_cottage, loc_caravan, loc_trailer_cabin, \ + loc_towers, loc_north_beach, loc_mine_shaft, loc_mob_camp, loc_mob_camp_locked_room, \ + loc_mine_elevator_exit, loc_mountain_ruin_outside, loc_mountain_ruin_inside, loc_prism_temple, \ + loc_pickle_val, loc_shrine_near_temple, loc_morse_bunker +) + + +def create_regions(world: MultiWorld, options: CCCharlesOptions, player: int) -> None: + menu_region = Region("Menu", player, world, "Aranearum") + world.regions.append(menu_region) + + start_camp_region = Region("Start Camp", player, world) + start_camp_region.add_locations(loc_start_camp, CCCharlesLocation) + world.regions.append(start_camp_region) + + tony_tiddle_mission_region = Region("Tony Tiddle Mission", player, world) + tony_tiddle_mission_region.add_locations(loc_tony_tiddle_mission, CCCharlesLocation) + world.regions.append(tony_tiddle_mission_region) + + barn_region = Region("Barn", player, world) + barn_region.add_locations(loc_barn, CCCharlesLocation) + world.regions.append(barn_region) + + candice_mission_region = Region("Candice Mission", player, world) + candice_mission_region.add_locations(loc_candice_mission, CCCharlesLocation) + world.regions.append(candice_mission_region) + + tutorial_house_region = Region("Tutorial House", player, world) + tutorial_house_region.add_locations(loc_tutorial_house, CCCharlesLocation) + world.regions.append(tutorial_house_region) + + swamp_edges_region = Region("Swamp Edges", player, world) + swamp_edges_region.add_locations(loc_swamp_edges, CCCharlesLocation) + world.regions.append(swamp_edges_region) + + swamp_mission_region = Region("Swamp Mission", player, world) + swamp_mission_region.add_locations(loc_swamp_mission, CCCharlesLocation) + world.regions.append(swamp_mission_region) + + junkyard_area_region = Region("Junkyard Area", player, world) + junkyard_area_region.add_locations(loc_junkyard_area, CCCharlesLocation) + world.regions.append(junkyard_area_region) + + south_house_region = Region("South House", player, world) + south_house_region.add_locations(loc_south_house, CCCharlesLocation) + world.regions.append(south_house_region) + + junkyard_shed_region = Region("Junkyard Shed", player, world) + junkyard_shed_region.add_locations(loc_junkyard_shed, CCCharlesLocation) + world.regions.append(junkyard_shed_region) + + military_base_region = Region("Military Base", player, world) + military_base_region.add_locations(loc_military_base, CCCharlesLocation) + world.regions.append(military_base_region) + + south_mine_outside_region = Region("South Mine Outside", player, world) + south_mine_outside_region.add_locations(loc_south_mine_outside, CCCharlesLocation) + world.regions.append(south_mine_outside_region) + + south_mine_inside_region = Region("South Mine Inside", player, world) + south_mine_inside_region.add_locations(loc_south_mine_inside, CCCharlesLocation) + world.regions.append(south_mine_inside_region) + + middle_station_region = Region("Middle Station", player, world) + middle_station_region.add_locations(loc_middle_station, CCCharlesLocation) + world.regions.append(middle_station_region) + + canyon_region = Region("Canyon", player, world) + canyon_region.add_locations(loc_canyon, CCCharlesLocation) + world.regions.append(canyon_region) + + watchtower_region = Region("Watchtower", player, world) + watchtower_region.add_locations(loc_watchtower, CCCharlesLocation) + world.regions.append(watchtower_region) + + boulder_field_region = Region("Boulder Field", player, world) + boulder_field_region.add_locations(loc_boulder_field, CCCharlesLocation) + world.regions.append(boulder_field_region) + + haunted_house_region = Region("Haunted House", player, world) + haunted_house_region.add_locations(loc_haunted_house, CCCharlesLocation) + world.regions.append(haunted_house_region) + + santiago_house_region = Region("Santiago House", player, world) + santiago_house_region.add_locations(loc_santiago_house, CCCharlesLocation) + world.regions.append(santiago_house_region) + + port_region = Region("Port", player, world) + port_region.add_locations(loc_port, CCCharlesLocation) + world.regions.append(port_region) + + trench_house_region = Region("Trench House", player, world) + trench_house_region.add_locations(loc_trench_house, CCCharlesLocation) + world.regions.append(trench_house_region) + + doll_woods_region = Region("Doll Woods", player, world) + doll_woods_region.add_locations(loc_doll_woods, CCCharlesLocation) + world.regions.append(doll_woods_region) + + lost_stairs_region = Region("Lost Stairs", player, world) + lost_stairs_region.add_locations(loc_lost_stairs, CCCharlesLocation) + world.regions.append(lost_stairs_region) + + east_house_region = Region("East House", player, world) + east_house_region.add_locations(loc_east_house, CCCharlesLocation) + world.regions.append(east_house_region) + + rockets_testing_ground_region = Region("Rockets Testing Ground", player, world) + rockets_testing_ground_region.add_locations(loc_rockets_testing_ground, CCCharlesLocation) + world.regions.append(rockets_testing_ground_region) + + rockets_testing_bunker_region = Region("Rockets Testing Bunker", player, world) + rockets_testing_bunker_region.add_locations(loc_rockets_testing_bunker, CCCharlesLocation) + world.regions.append(rockets_testing_bunker_region) + + workshop_region = Region("Workshop", player, world) + workshop_region.add_locations(loc_workshop, CCCharlesLocation) + world.regions.append(workshop_region) + + east_tower_region = Region("East Tower", player, world) + east_tower_region.add_locations(loc_east_tower, CCCharlesLocation) + world.regions.append(east_tower_region) + + lighthouse_region = Region("Lighthouse", player, world) + lighthouse_region.add_locations(loc_lighthouse, CCCharlesLocation) + world.regions.append(lighthouse_region) + + north_mine_outside_region = Region("North Mine Outside", player, world) + north_mine_outside_region.add_locations(loc_north_mine_outside, CCCharlesLocation) + world.regions.append(north_mine_outside_region) + + north_mine_inside_region = Region("North Mine Inside", player, world) + north_mine_inside_region.add_locations(loc_north_mine_inside, CCCharlesLocation) + world.regions.append(north_mine_inside_region) + + wood_bridge_region = Region("Wood Bridge", player, world) + wood_bridge_region.add_locations(loc_wood_bridge, CCCharlesLocation) + world.regions.append(wood_bridge_region) + + museum_region = Region("Museum", player, world) + museum_region.add_locations(loc_museum, CCCharlesLocation) + world.regions.append(museum_region) + + barbed_shelter_region = Region("Barbed Shelter", player, world) + barbed_shelter_region.add_locations(loc_barbed_shelter, CCCharlesLocation) + world.regions.append(barbed_shelter_region) + + west_beach_region = Region("West Beach", player, world) + west_beach_region.add_locations(loc_west_beach, CCCharlesLocation) + world.regions.append(west_beach_region) + + church_region = Region("Church", player, world) + church_region.add_locations(loc_church, CCCharlesLocation) + world.regions.append(church_region) + + west_cottage_region = Region("West Cottage", player, world) + west_cottage_region.add_locations(loc_west_cottage, CCCharlesLocation) + world.regions.append(west_cottage_region) + + caravan_region = Region("Caravan", player, world) + caravan_region.add_locations(loc_caravan, CCCharlesLocation) + world.regions.append(caravan_region) + + trailer_cabin_region = Region("Trailer Cabin", player, world) + trailer_cabin_region.add_locations(loc_trailer_cabin, CCCharlesLocation) + world.regions.append(trailer_cabin_region) + + towers_region = Region("Towers", player, world) + towers_region.add_locations(loc_towers, CCCharlesLocation) + world.regions.append(towers_region) + + north_beach_region = Region("North beach", player, world) + north_beach_region.add_locations(loc_north_beach, CCCharlesLocation) + world.regions.append(north_beach_region) + + mine_shaft_region = Region("Mine Shaft", player, world) + mine_shaft_region.add_locations(loc_mine_shaft, CCCharlesLocation) + world.regions.append(mine_shaft_region) + + mob_camp_region = Region("Mob Camp", player, world) + mob_camp_region.add_locations(loc_mob_camp, CCCharlesLocation) + world.regions.append(mob_camp_region) + + mob_camp_locked_room_region = Region("Mob Camp Locked Room", player, world) + mob_camp_locked_room_region.add_locations(loc_mob_camp_locked_room, CCCharlesLocation) + world.regions.append(mob_camp_locked_room_region) + + mine_elevator_exit_region = Region("Mine Elevator Exit", player, world) + mine_elevator_exit_region.add_locations(loc_mine_elevator_exit, CCCharlesLocation) + world.regions.append(mine_elevator_exit_region) + + mountain_ruin_outside_region = Region("Mountain Ruin Outside", player, world) + mountain_ruin_outside_region.add_locations(loc_mountain_ruin_outside, CCCharlesLocation) + world.regions.append(mountain_ruin_outside_region) + + mountain_ruin_inside_region = Region("Mountain Ruin Inside", player, world) + mountain_ruin_inside_region.add_locations(loc_mountain_ruin_inside, CCCharlesLocation) + world.regions.append(mountain_ruin_inside_region) + + prism_temple_region = Region("Prism Temple", player, world) + prism_temple_region.add_locations(loc_prism_temple, CCCharlesLocation) + world.regions.append(prism_temple_region) + + pickle_val_region = Region("Pickle Val", player, world) + pickle_val_region.add_locations(loc_pickle_val, CCCharlesLocation) + world.regions.append(pickle_val_region) + + shrine_near_temple_region = Region("Shrine Near Temple", player, world) + shrine_near_temple_region.add_locations(loc_shrine_near_temple, CCCharlesLocation) + world.regions.append(shrine_near_temple_region) + + morse_bunker_region = Region("Morse Bunker", player, world) + morse_bunker_region.add_locations(loc_morse_bunker, CCCharlesLocation) + world.regions.append(morse_bunker_region) + + # Place "Victory" event at "Final Boss" location + loc_final_boss = CCCharlesLocation(player, "Final Boss", None, prism_temple_region) + loc_final_boss.place_locked_item(CCCharlesItem("Victory", ItemClassification.progression, None, player)) + prism_temple_region.locations.append(loc_final_boss) + + # Connect the Regions by named Entrances that must have access Rules + menu_region.connect(start_camp_region) + menu_region.connect(tony_tiddle_mission_region) + menu_region.connect(barn_region, "Barn Door") + menu_region.connect(candice_mission_region) + menu_region.connect(tutorial_house_region, "Tutorial House Door") + menu_region.connect(swamp_edges_region) + menu_region.connect(swamp_mission_region) + menu_region.connect(junkyard_area_region) + menu_region.connect(south_house_region) + menu_region.connect(junkyard_shed_region) + menu_region.connect(military_base_region) + menu_region.connect(south_mine_outside_region) + south_mine_outside_region.connect(south_mine_inside_region, "South Mine Gate") + menu_region.connect(middle_station_region) + menu_region.connect(canyon_region) + menu_region.connect(watchtower_region) + menu_region.connect(boulder_field_region) + menu_region.connect(haunted_house_region) + menu_region.connect(santiago_house_region) + menu_region.connect(port_region) + menu_region.connect(trench_house_region) + menu_region.connect(doll_woods_region) + menu_region.connect(lost_stairs_region) + menu_region.connect(east_house_region) + menu_region.connect(rockets_testing_ground_region) + rockets_testing_ground_region.connect(rockets_testing_bunker_region, "Stuck Bunker Door") + menu_region.connect(workshop_region) + menu_region.connect(east_tower_region) + menu_region.connect(lighthouse_region) + menu_region.connect(north_mine_outside_region) + north_mine_outside_region.connect(north_mine_inside_region, "North Mine Gate") + menu_region.connect(wood_bridge_region) + menu_region.connect(museum_region) + menu_region.connect(barbed_shelter_region) + menu_region.connect(west_beach_region) + menu_region.connect(church_region) + menu_region.connect(west_cottage_region) + menu_region.connect(caravan_region) + menu_region.connect(trailer_cabin_region) + menu_region.connect(towers_region) + menu_region.connect(north_beach_region) + menu_region.connect(mine_shaft_region) + menu_region.connect(mob_camp_region) + mob_camp_region.connect(mob_camp_locked_room_region, "Mob Camp Locked Door") + menu_region.connect(mine_elevator_exit_region) + menu_region.connect(mountain_ruin_outside_region) + mountain_ruin_outside_region.connect(mountain_ruin_inside_region, "Mountain Ruin Gate") + menu_region.connect(prism_temple_region) + menu_region.connect(pickle_val_region) + menu_region.connect(shrine_near_temple_region) + menu_region.connect(morse_bunker_region) diff --git a/worlds/cccharles/Rules.py b/worlds/cccharles/Rules.py new file mode 100644 index 0000000000..979aacd529 --- /dev/null +++ b/worlds/cccharles/Rules.py @@ -0,0 +1,215 @@ +from BaseClasses import MultiWorld +from ..generic.Rules import set_rule +from .Options import CCCharlesOptions + +# Go mode: Green Egg + Blue Egg + Red Egg + Temple Key + Bug Spray (+ Remote Explosive x8 but the base game ignores it) + +def set_rules(world: MultiWorld, options: CCCharlesOptions, player: int) -> None: + # Tony Tiddle + set_rule(world.get_entrance("Barn Door", player), + lambda state: state.has("Barn Key", player)) + + # Candice + set_rule(world.get_entrance("Tutorial House Door", player), + lambda state: state.has("Candice's Key", player)) + + # Lizbeth Murkwater + set_rule(world.get_location("Swamp Lizbeth Murkwater Mission End", player), + lambda state: state.has("Dead Fish", player)) + + # Daryl + set_rule(world.get_location("Junkyard Area Chest Ancient Tablet", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Junkyard Area Daryl Mission End", player), + lambda state: state.has("Ancient Tablet", player)) + + # South House + set_rule(world.get_location("South House Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("South House Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("South House Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("South House Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("South House Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("South House Chest Scraps 6", player), + lambda state: state.has("Lockpicks", player)) + + # South Mine + set_rule(world.get_entrance("South Mine Gate", player), + lambda state: state.has("South Mine Key", player)) + + set_rule(world.get_location("South Mine Inside Green Paint Can", player), + lambda state: state.has("Lockpicks", player)) + + # Theodore + set_rule(world.get_location("Middle Station Theodore Mission End", player), + lambda state: state.has("Blue Box", player)) + + # Watchtower + set_rule(world.get_location("Watchtower Pink Paint Can", player), + lambda state: state.has("Lockpicks", player)) + + # Sasha + set_rule(world.get_location("Haunted House Sasha Mission End", player), + lambda state: state.has("Page Drawing", player, 8)) + + # Santiago + set_rule(world.get_location("Port Santiago Mission End", player), + lambda state: state.has("Journal", player)) + + # Trench House + set_rule(world.get_location("Trench House Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Trench House Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Trench House Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Trench House Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Trench House Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Trench House Chest Scraps 6", player), + lambda state: state.has("Lockpicks", player)) + + # East House + set_rule(world.get_location("East House Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("East House Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("East House Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("East House Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("East House Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + + # Rocket Testing Bunker + set_rule(world.get_entrance("Stuck Bunker Door", player), + lambda state: state.has("Timed Dynamite", player)) + + # John Smith + set_rule(world.get_location("Workshop John Smith Mission End", player), + lambda state: state.has("Box of Rockets", player)) + + # Claire + set_rule(world.get_location("Lighthouse Claire Mission End", player), + lambda state: state.has("Breaker", player, 4)) + + # North Mine + set_rule(world.get_entrance("North Mine Gate", player), + lambda state: state.has("North Mine Key", player)) + + set_rule(world.get_location("North Mine Inside Blue Paint Can", player), + lambda state: state.has("Lockpicks", player)) + + # Paul + set_rule(world.get_location("Museum Paul Mission End", player), + lambda state: state.has("Remote Explosive x8", player)) + # lambda state: state.has("Remote Explosive", player, 8)) # TODO: Add an option to split remote explosives + + # West Beach + set_rule(world.get_location("West Beach Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("West Beach Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("West Beach Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("West Beach Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("West Beach Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("West Beach Chest Scraps 6", player), + lambda state: state.has("Lockpicks", player)) + + # Caravan + set_rule(world.get_location("Caravan Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Caravan Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Caravan Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Caravan Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Caravan Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + + # Ronny + set_rule(world.get_location("Towers Ronny Mission End", player), + lambda state: state.has("Employment Contracts", player)) + + # North Beach + set_rule(world.get_location("North Beach Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("North Beach Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("North Beach Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("North Beach Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + + # Mine Shaft + set_rule(world.get_location("Mine Shaft Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 6", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Mine Shaft Chest Scraps 7", player), + lambda state: state.has("Lockpicks", player)) + + # Mob Camp + set_rule(world.get_entrance("Mob Camp Locked Door", player), + lambda state: state.has("Mob Camp Key", player)) + + set_rule(world.get_location("Mob Camp Locked Room Stolen Bob", player), + lambda state: state.has("Broken Bob", player)) + + # Mountain Ruin + set_rule(world.get_entrance("Mountain Ruin Gate", player), + lambda state: state.has("Mountain Ruin Key", player)) + + set_rule(world.get_location("Mountain Ruin Inside Red Paint Can", player), + lambda state: state.has("Lockpicks", player)) + + # Prism Temple + set_rule(world.get_location("Prism Temple Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Prism Temple Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Prism Temple Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + + # Pickle Lady + set_rule(world.get_location("Pickle Val Jar of Pickles", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Pickle Val Pickle Lady Mission End", player), + lambda state: state.has("Jar of Pickles", player)) + + # Morse Bunker + set_rule(world.get_location("Morse Bunker Chest Scraps 1", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Morse Bunker Chest Scraps 2", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Morse Bunker Chest Scraps 3", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Morse Bunker Chest Scraps 4", player), + lambda state: state.has("Lockpicks", player)) + set_rule(world.get_location("Morse Bunker Chest Scraps 5", player), + lambda state: state.has("Lockpicks", player)) + + # Add rules to reach the "Go mode" + set_rule(world.get_location("Final Boss", player), + lambda state: state.has("Temple Key", player) + and state.has("Green Egg", player) + and state.has("Blue Egg", player) + and state.has("Red Egg", player)) + world.completion_condition[player] = lambda state: state.has("Victory", player) diff --git a/worlds/cccharles/__init__.py b/worlds/cccharles/__init__.py new file mode 100644 index 0000000000..6d40c0172d --- /dev/null +++ b/worlds/cccharles/__init__.py @@ -0,0 +1,171 @@ +from .Items import CCCharlesItem, unique_item_dict, full_item_list, item_groups +from .Locations import location_table +from .Options import CCCharlesOptions +from .Rules import set_rules +from .Regions import create_regions +from BaseClasses import Tutorial, ItemClassification +from worlds.AutoWorld import World, WebWorld + + +class CCCharlesWeb(WebWorld): + """ + Choo-Choo Charles is a horror game. + A devil spider train from hell called Charles chases any person it finds on an island. + The goal is to gather scraps to upgrade a train to fight Charles and travel by train to find 3 eggs + to lead Charles to a brutal death and save the island. + """ + + theme = "stone" + + setup_en = Tutorial( + "Multiworld Setup Guide", + "A guide to setup Choo-Choo Charles for the Archipelago MultiWorld Randomizer.", + "English", + "setup_en.md", + "setup/en", + ["Yaranorgoth"] + ) + + setup_fr = Tutorial( + "Guide d'Installation Multiworld", + "Un guide pour mettre en place Choo-Choo Charles pour le Randomiseur Multiworld Archipelago", + "Français", + "setup_fr.md", + "setup/fr", + ["Yaranorgoth"] + ) + + tutorials = [setup_en, setup_fr] + + game_info_languages = ["en", "fr"] + rich_text_options_doc = True + + +class CCCharlesWorld(World): + """ + An independent 3D horror game, taking place on an island. + The main gameplay consists of traveling and fighting a monster on board a train. + Upgrading the train requires leaving the train to gather resources with the threat of encountering the monster. + """ + + game = "Choo-Choo Charles" + + web = CCCharlesWeb() + + item_name_to_id = unique_item_dict + location_name_to_id = location_table + item_name_groups = item_groups + + # Options the player can set + options_dataclass = CCCharlesOptions + # Typing hints for all the options we defined + options: CCCharlesOptions + + topology_present = False # Hide path to required location checks in spoiler + + def create_regions(self) -> None: + create_regions(self.multiworld, self.options, self.player) + + def create_item(self, name: str) -> CCCharlesItem: + item_id = unique_item_dict[name] + + match name: + case "Scraps": + classification = ItemClassification.useful + case "30 Scraps Reward": + classification = ItemClassification.useful + case "25 Scraps Reward": + classification = ItemClassification.useful + case "35 Scraps Reward": + classification = ItemClassification.useful + case "40 Scraps Reward": + classification = ItemClassification.useful + case "South Mine Key": + classification = ItemClassification.progression + case "North Mine Key": + classification = ItemClassification.progression + case "Mountain Ruin Key": + classification = ItemClassification.progression + case "Barn Key": + classification = ItemClassification.progression + case "Candice's Key": + classification = ItemClassification.progression + case "Dead Fish": + classification = ItemClassification.progression + case "Lockpicks": + classification = ItemClassification.progression + case "Ancient Tablet": + classification = ItemClassification.progression + case "Blue Box": + classification = ItemClassification.progression + case "Page Drawing": + classification = ItemClassification.progression + case "Journal": + classification = ItemClassification.progression + case "Timed Dynamite": + classification = ItemClassification.progression + case "Box of Rockets": + classification = ItemClassification.progression + case "Breaker": + classification = ItemClassification.progression + case "Broken Bob": + classification = ItemClassification.progression + case "Employment Contracts": + classification = ItemClassification.progression + case "Mob Camp Key": + classification = ItemClassification.progression + case "Jar of Pickles": + classification = ItemClassification.progression + case "Orange Paint Can": + classification = ItemClassification.filler + case "Green Paint Can": + classification = ItemClassification.filler + case "White Paint Can": + classification = ItemClassification.filler + case "Pink Paint Can": + classification = ItemClassification.filler + case "Grey Paint Can": + classification = ItemClassification.filler + case "Blue Paint Can": + classification = ItemClassification.filler + case "Black Paint Can": + classification = ItemClassification.filler + case "Lime Paint Can": + classification = ItemClassification.filler + case "Teal Paint Can": + classification = ItemClassification.filler + case "Red Paint Can": + classification = ItemClassification.filler + case "Purple Paint Can": + classification = ItemClassification.filler + case "The Boomer": + classification = ItemClassification.filler + case "Bob": + classification = ItemClassification.filler + case "Green Egg": + classification = ItemClassification.progression + case "Blue Egg": + classification = ItemClassification.progression + case "Red Egg": + classification = ItemClassification.progression + case "Remote Explosive": + classification = ItemClassification.progression + case "Remote Explosive x8": + classification = ItemClassification.progression + case "Temple Key": + classification = ItemClassification.progression + case "Bug Spray": + classification = ItemClassification.progression + case _: # Should not occur + raise Exception("Unexpected case met: classification cannot be set for unknown item \"" + name + "\"") + + return CCCharlesItem(name, classification, item_id, self.player) + + def create_items(self) -> None: + self.multiworld.itempool += [self.create_item(item) for item in full_item_list] + + def set_rules(self) -> None: + set_rules(self.multiworld, self.options, self.player) + + def get_filler_item_name(self) -> str: + return "Scraps" diff --git a/worlds/cccharles/docs/en_Choo-Choo Charles.md b/worlds/cccharles/docs/en_Choo-Choo Charles.md new file mode 100644 index 0000000000..6d8ed39e03 --- /dev/null +++ b/worlds/cccharles/docs/en_Choo-Choo Charles.md @@ -0,0 +1,39 @@ +# Choo-Choo Charles + +## Game page in other languages +* [Français](fr) + +## Where is the options page? +The [Player Options page](../player-options) contains all the options to configure and export a yaml config file. + +## What does randomization do to this game? +All scraps or any collectable item on the ground (except from Loot Crates) and items received from NPCs missions are considered as locations to check. + +## What is the goal of Choo-Choo Charles when randomized? +Beating the evil train from Hell named "Charles". + +## How is the game managed in Nightmare mode? +At death, the player has to restart a brand-new game, giving him the choice to stay under the Nightmare mode or continuing with the Normal mode if considered too hard. +In this case, all collected items will be redistributed in the inventory and the missions states will be kept. +The Deathlink is not implemented yet. When this option will be available, a choice will be provided to: +* Disable the Deathlink +* Enable the soft Deathlink with respawn at Player Train when a Deathlink event is received +* Enable the hard Deathlink with removal of the game save when a Deathlink event is received + +## What does another world's item look like in Choo-Choo Charles? +Items appearance are kept unchanged. +Any hint that cannot be normally represented in the game is replaced by the miniaturized "DeathDuck" Easter Egg that can be seen out from the physical wall limits of the original game. + +## How is the player informed by an item transmission and hints? +A message appears in game to inform what item is sent or received, including which world and what player the item comes from. +The same method is used for hints. + +## Is it possible to use hints in the game? +No, this is a work in progress. +The following options will be possible once the implementations are available: + +At any moment, the player can press one of the following keys to display a console in the game: +* "~" or "`" (qwerty) +* "²" (azerty) +* "F10" +Then, a hint can be revealed by typing "/hint [player] ". diff --git a/worlds/cccharles/docs/fr_Choo-Choo Charles.md b/worlds/cccharles/docs/fr_Choo-Choo Charles.md new file mode 100644 index 0000000000..42f0c48396 --- /dev/null +++ b/worlds/cccharles/docs/fr_Choo-Choo Charles.md @@ -0,0 +1,36 @@ +# Choo-Choo Charles + +## Où est la page d'options ? +La [page d'options du joueur pour ce jeu](../player-options) contient toutes les options pour configurer et exporter un fichier de configuration yaml. + +## Qu'est ce que la randomisation fait au jeu ? +Tous les débrits ou n'importe quel objet ramassable au sol (excepté les Caisses à Butin) et objets reçus par les missions de PNJs sont considérés comme emplacements à vérifier. + +## Quel est le but de Choo-Choo Charles lorsqu'il est randomisé ? +Vaincre le train démoniaque de l'Enfer nommé "Charles". + +## Comment le jeu est-il géré en mode Nightmare ? +À sa mort, le joueur doit relancer une toute nouvelle partie, lui donnant la possisilité de rester en mode Nightmare ou de poursuivre la partie en mode Normal s'il considère la partie trop difficile. +Dans ce cas, tous les objets collectés seront redistribués dans l'inventaire et les états des missions seront conservés. +Le Deathlink n'est pas implémenté pour l'instant. Lorsque cette option sera disponible, un choix sera fourni pour : +* Désactiver le Deathlink +* Activer le Deathlink modéré avec réapparition au Train du Joueur lorsqu'un évènement Deathlink est reçu +* Activer le Deathlink strict avec suppression de la sauvegarde lorsqu'un évènement Deathlink est reçu + +## À quoi ressemble un objet d'un autre monde dans Choo-Choo Charles ? +Les apparances des objets sont conservés. +Tout indice qui ne peut pas être représenté normalement dans le jeu est remplacé par l'Easter Egg "DeadDuck" miniaturisé qui peut être vu en dehors des limites murales physiques du jeu original. + +## Comment le joueur est-il informé par une transmission d'objet et des indices ? +Un message apparaît en jeu pour informer quel objet est envoyé ou reçu, incluant de quel monde et de quel joueur vient l'objet. +La même méthode est utilisée pour les indices. + +## Est-il possible d'utiliser les indices dans le jeu ? +Non, ceci est un travail en cours. +Les options suivantes seront possibles une fois les implémentations disponibles : + +À n'importe quel moment, le joueur peu appuyer sur l'une des touches suivantes pour afficher la console dans le jeu : +* "~" (qwerty) +* "²" (azerty) +* "F10" +Puis, un indice peut être révélé en tapant "/hint [player] " diff --git a/worlds/cccharles/docs/setup_en.md b/worlds/cccharles/docs/setup_en.md new file mode 100644 index 0000000000..8df0188c03 --- /dev/null +++ b/worlds/cccharles/docs/setup_en.md @@ -0,0 +1,52 @@ +# Choo-Choo Charles MultiWorld Setup Guide +This page is a simplified guide of the [Choo-Choo Charles Multiworld Randomizer Mod page](https://github.com/lgbarrere/CCCharles-Random?tab=readme-ov-file#cccharles-random). + +## Requirements and Required Softwares +* A computer running Windows (the Mod is not handled by Linux or Mac) +* [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) +* A legal copy of the Choo-Choo Charles original game (can be found on [Steam](https://store.steampowered.com/app/1766740/ChooChoo_Charles/)) + +## Mod Installation for playing +### Mod Download +All the required files of the Mod can be found in the [Releases](https://github.com/lgbarrere/CCCharles-Random/releases). +To use the Mod, download and unzip **CCCharles_Random.zip** somewhere safe, then follow the instructions in the next sections of this guide. This archive contains: +* The **Obscure/** folder loading the Mod itself, it runs the code handling all the randomized elements +* The **cccharles.apworld** file containing the randomization logic, used by the host to generate a random seed with the others games + +### Game Setup +The Mod can be installed and played by following these steps (see the [Mod Download](setup_en#mod-download) section to get **CCCharles_Random.zip**): +1. Copy the **Obscure/** folder from **CCCharles_Random.zip** to **\** (where the **Obscure/** folder and **Obscure.exe** are placed) +2. Launch the game, if "OFFLINE" is visible in the upper-right corner of the screen, the Mod is working + +### Create a Config (.yaml) File +The purpose of a YAML file is described in the [Basic Multiworld Setup Guide](https://archipelago.gg/tutorial/Archipelago/setup/en#generating-a-game). + +The [Player Options page](/games/Choo-Choo%20Charles/player-options) allows to configure personal options and export a config YAML file. + +## Joining a MultiWorld Game +Before playing, it is highly recommended to check out the **[Known Issues](setup_en#known-issues)** section +* The game console must be opened to type Archipelago commands, press "F10" key or "`" (or "~") key in querty ("²" key in azerty) +* Type ``/connect `` with \ and \ found on the hosting Archipelago web page in the form ``archipelago.gg:XXXXX`` and ``CCCharles`` +* Disconnection is automatic at game closure but can be manually done with ``/disconnect`` + +## Hosting a MultiWorld or Single-Player Game +See the [Mod Download](setup_en#mod-download) section to get the **cccharles.apworld** file. + +In this section, **Archipelago/** refers to the path where [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) is installed locally. + +Follow these steps to host a remote multiplayer or a local single-player session: +1. Double-click the **cccharles.apworld** to automatically install the world randomization logic +2. Put the **CCCharles.yaml** to **Archipelago/Players/** with the YAML of each player to host +3. Launch the Archipelago launcher and click "Generate" to configure a game with the YAMLs in **Archipelago/output/** +4. For a multiplayer session, go to the [Archipelago HOST GAME page](https://archipelago.gg/uploads) +5. Click "Upload File" and select the generated **AP_\.zip** in **Archipelago/output/** +6. Send the generated room page to each player + +For a local single-player session, click "Host" in the Archipelago launcher by using the generated **AP_\.zip** in **Archipelago/output/** + +## Known Issues +### Major issues +No major issue found. + +### Minor issues +* The current version of the command parser does not accept console commands with a player names containing whitespaces. It is recommended to use underscores "_" instead, for instance: CCCharles_Player_1. diff --git a/worlds/cccharles/docs/setup_fr.md b/worlds/cccharles/docs/setup_fr.md new file mode 100644 index 0000000000..386ec02587 --- /dev/null +++ b/worlds/cccharles/docs/setup_fr.md @@ -0,0 +1,52 @@ +# Guide d'Installation du MultiWorld Choo-Choo Charles +Cette page est un guide simplifié de la [page du Mod Randomiseur Multiworld de Choo-Choo Charles](https://github.com/lgbarrere/CCCharles-Random?tab=readme-ov-file#cccharles-random). + +## Exigences et Logiciels Nécessaires +* Un ordinateur utilisant Windows (le Mod n'est pas utilisable sous Linux ou Mac) +* [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) +* Une copie légale du jeu original Choo-Choo Charles (peut être trouvé sur [Steam](https://store.steampowered.com/app/1766740/ChooChoo_Charles/) + +## Installation du Mod pour jouer +### Téléchargement du Mod +Tous les fichiers nécessaires du Mod se trouvent dans les [Releases](https://github.com/lgbarrere/CCCharles-Random/releases). +Pour utiliser le Mod, télécharger et désarchiver **CCCharles_Random.zip** à un endroit sûr, puis suivre les instructions dans les sections suivantes de ce guide. Cette archive contient : +* Le dossier **Obscure/** qui charge le Mod lui-même, il lance le code qui gère tous les éléments randomisés +* Le fichier **cccharles.apworld** qui contient la logique de randomisation, utilisé par l'hôte pour générer une graine aléatoire avec les autres jeux + +### Préparation du Jeu +Le Mod peut être installé et joué en suivant les étapes suivantes (voir la section [Téléchargement du Mod](setup_fr#téléchargement-du-mod) pour récupérer **CCCharles_Random.zip**) : +1. Copier le dossier **Obscure/** de **CCCharles_Random.zip** vers **\** (où se situent le dossier **Obscure/** et **Obscure.exe**) +2. Lancer le jeu, si "OFFLINE" est visible dans le coin en haut à droite de l'écran, le Mod est actif + +### Créer un Fichier de Configuration (.yaml) +L'objectif d'un fichier YAML est décrit dans le [Guide d'Installation Basique du Multiworld](https://archipelago.gg/tutorial/Archipelago/setup/en#generating-a-game) (en anglais). + +La [page d'Options Joueur](/games/Choo-Choo%20Charles/player-options) permet de configurer des options personnelles et exporter un fichier de configuration YAML. + +## Rejoindre une Partie MultiWorld +Avant de jouer, il est fortement recommandé de consulter la section **[Problèmes Connus](setup_fr#probl%C3%A8mes-connus)**. +* La console du jeu doit être ouverte pour taper des commandes Archipelago, appuyer sur la touche "F10" ou "`" (ou "~") en querty (touche "²" en azerty) +* Taper ``/connect `` avec \ et \ trouvés sur la page web d'hébergement Archipelago sous la forme ``archipelago.gg:XXXXX`` et ``CCCharles`` +* La déconnexion est automatique à la fermeture du jeu mais peut être faite manuellement avec ``/disconnect`` + +## Héberger une partie MultiWorld ou un Seul Joueur +Voir la section [Téléchargement du Mod](setup_fr#téléchargement-du-mod) pour récupérer le fichier **cccharles.apworld**. + +Dans cette section, **Archipelago/** fait référence au chemin d'accès où [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) est installé localement. + +Suivre ces étapes pour héberger une session multijoueur à distance ou locale pour un seul joueur : +1. Double-cliquer sur **cccharles.apworld** pour installer automatiquement la logique de randomisation du monde +2. Placer le **CCCharles.yaml** dans **Archipelago/Players/** avec le YAML de chaque joueur à héberger +3. Exécuter le lanceur Archipelago et cliquer sur "Generate" pour configurer une partie avec les YAML dans **Archipelago/output/** +4. Pour une session multijoueur, aller à la [page Archipelago HOST GAME](https://archipelago.gg/uploads) +5. Cliquer sur "Upload File" et selectionner le **AP_\.zip** généré dans **Archipelago/output/** +6. Envoyer la page de la partie générée à chaque joueur + +Pour une session locale à un seul joueur, cliquer sur "Host" dans le lanceur Archipelago en utilisant **AP_\.zip** généré dans **Archipelago/output/** + +## Problèmes Connus +### Problèmes majeurs +Aucun problème majeur trouvé. + +### Problèmes mineurs +* La version actuelle de l'analyseur de commandes n'accepte pas des commandes de la console dont le nom du joueur contient des espaces. Il est recommandé d'utiliser des soulignés "_" à la place, par exemple : CCCharles_Player_1. diff --git a/worlds/cccharles/test/TestAccess.py b/worlds/cccharles/test/TestAccess.py new file mode 100644 index 0000000000..d088457c7a --- /dev/null +++ b/worlds/cccharles/test/TestAccess.py @@ -0,0 +1,27 @@ +from BaseClasses import CollectionState +from .bases import CCCharlesTestBase + + +class TestAccess(CCCharlesTestBase): + def test_claire_breakers(self) -> None: + """Test locations that require 4 Breakers""" + lighthouse_claire_mission_end = self.world.get_location("Lighthouse Claire Mission End") + + state = CollectionState(self.multiworld) + self.collect_all_but("Breaker") + + breakers_in_pool = self.get_items_by_name("Breaker") + self.assertGreaterEqual(len(breakers_in_pool), 4) # Check at least 4 Breakers are in the item pool + + for breaker in breakers_in_pool[:3]: + state.collect(breaker) # Collect 3 Breakers into state + self.assertFalse( + lighthouse_claire_mission_end.can_reach(state), + "Lighthouse Claire Mission End should not be reachable with only three Breakers" + ) + + state.collect(breakers_in_pool[3]) # Collect 4th breaker into state + self.assertTrue( + lighthouse_claire_mission_end.can_reach(state), + "Lighthouse Claire Mission End should have been reachable with four Breakers" + ) diff --git a/worlds/cccharles/test/__init__.py b/worlds/cccharles/test/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/cccharles/test/bases.py b/worlds/cccharles/test/bases.py new file mode 100644 index 0000000000..4c08d163ec --- /dev/null +++ b/worlds/cccharles/test/bases.py @@ -0,0 +1,5 @@ +from test.bases import WorldTestBase + + +class CCCharlesTestBase(WorldTestBase): + game = "Choo-Choo Charles" diff --git a/worlds/celeste64/Locations.py b/worlds/celeste64/Locations.py index 9e202eca12..ed4521ec10 100644 --- a/worlds/celeste64/Locations.py +++ b/worlds/celeste64/Locations.py @@ -27,7 +27,7 @@ strawberry_location_data_table: Dict[str, Celeste64LocationData] = { LocationName.strawberry_8: Celeste64LocationData(RegionName.nw_girders_island, celeste_64_base_id + 0x07), LocationName.strawberry_9: Celeste64LocationData(RegionName.granny_island, celeste_64_base_id + 0x08), LocationName.strawberry_10: Celeste64LocationData(RegionName.granny_island, celeste_64_base_id + 0x09), - LocationName.strawberry_11: Celeste64LocationData(RegionName.granny_island, celeste_64_base_id + 0x0A), + LocationName.strawberry_11: Celeste64LocationData(RegionName.highway_island, celeste_64_base_id + 0x0A), LocationName.strawberry_12: Celeste64LocationData(RegionName.badeline_tower_lower, celeste_64_base_id + 0x0B), LocationName.strawberry_13: Celeste64LocationData(RegionName.highway_island, celeste_64_base_id + 0x0C), LocationName.strawberry_14: Celeste64LocationData(RegionName.ne_feathers_island, celeste_64_base_id + 0x0D), diff --git a/worlds/celeste64/Rules.py b/worlds/celeste64/Rules.py index 3365a7cf95..732e643b4b 100644 --- a/worlds/celeste64/Rules.py +++ b/worlds/celeste64/Rules.py @@ -82,12 +82,10 @@ location_hard_moves_logic: Dict[str, List[List[str]]] = { [ItemName.double_dash_refill, ItemName.air_dash]], LocationName.strawberry_15: [[ItemName.feather], [ItemName.ground_dash, ItemName.air_dash]], - LocationName.strawberry_17: [[ItemName.double_dash_refill, ItemName.traffic_block]], + LocationName.strawberry_17: [[ItemName.double_dash_refill]], LocationName.strawberry_18: [[ItemName.air_dash, ItemName.climb], [ItemName.double_dash_refill, ItemName.air_dash]], - LocationName.strawberry_19: [[ItemName.air_dash, ItemName.skid_jump], - [ItemName.double_dash_refill, ItemName.spring, ItemName.air_dash], - [ItemName.spring, ItemName.ground_dash, ItemName.air_dash]], + LocationName.strawberry_19: [[ItemName.air_dash]], LocationName.strawberry_20: [[ItemName.breakables, ItemName.air_dash]], LocationName.strawberry_21: [[ItemName.cassette, ItemName.traffic_block, ItemName.breakables, ItemName.air_dash]], diff --git a/worlds/celeste_open_world/CHANGELOG.md b/worlds/celeste_open_world/CHANGELOG.md new file mode 100644 index 0000000000..dbc3d7173b --- /dev/null +++ b/worlds/celeste_open_world/CHANGELOG.md @@ -0,0 +1,47 @@ +# Celeste - Changelog + + +## v1.0 - First Stable Release + +### Features: + +- Goal is to collect a certain number of Strawberries, finish your chosen Goal Area, and reach the credits in the Epilogue +- Locations included: + - Level Clears + - Strawberries + - Crystal Hearts + - Cassettes + - Golden Strawberries + - Keys + - Checkpoints + - Summit Gems + - Cars + - Binoculars + - Rooms +- Items included: + - 34 different interactable objects + - Keys + - Checkpoints + - Summit Gems + - Crystal Hearts + - Cassettes + - Traps + - Bald Trap + - Literature Trap + - Stun Trap + - Invisible Trap + - Fast Trap + - Slow Trap + - Ice Trap + - Reverse Trap + - Screen Flip Trap + - Laughter Trap + - Hiccup Trap + - Zoom Trap +- Aesthetic Options: + - Music Shuffle + - Require Cassette items to hear music + - Hair Length/Color options +- Death Link + - Amnesty option to select how many deaths must occur to send a DeathLink +- Trap Link diff --git a/worlds/celeste_open_world/Items.py b/worlds/celeste_open_world/Items.py new file mode 100644 index 0000000000..51df6e91f1 --- /dev/null +++ b/worlds/celeste_open_world/Items.py @@ -0,0 +1,264 @@ +from typing import NamedTuple, Optional + +from BaseClasses import Item, ItemClassification +from .Names import ItemName + + +level_item_lists: dict[str, set[str]] = { + "0a": set(), + + "1a": {ItemName.springs, ItemName.traffic_blocks, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "1b": {ItemName.springs, ItemName.traffic_blocks, ItemName.dash_refills, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "1c": {ItemName.traffic_blocks, ItemName.dash_refills, ItemName.coins}, + + "2a": {ItemName.springs, ItemName.dream_blocks, ItemName.traffic_blocks, ItemName.strawberry_seeds, ItemName.dash_refills, ItemName.coins}, + "2b": {ItemName.springs, ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins, ItemName.blue_cassette_blocks}, + "2c": {ItemName.springs, ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins}, + + "3a": {ItemName.springs, ItemName.moving_platforms, ItemName.sinking_platforms, ItemName.dash_refills, ItemName.coins, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "3b": {ItemName.springs, ItemName.dash_refills, ItemName.sinking_platforms, ItemName.coins, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "3c": {ItemName.dash_refills, ItemName.sinking_platforms, ItemName.coins}, + + "4a": {ItemName.blue_clouds, ItemName.blue_boosters, ItemName.moving_platforms, ItemName.coins, ItemName.strawberry_seeds, ItemName.springs, ItemName.move_blocks, ItemName.pink_clouds, ItemName.white_block, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "4b": {ItemName.blue_boosters, ItemName.moving_platforms, ItemName.move_blocks, ItemName.springs, ItemName.coins, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.dash_refills, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "4c": {ItemName.blue_boosters, ItemName.move_blocks, ItemName.dash_refills, ItemName.pink_clouds}, + + "5a": {ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ItemName.dash_refills, ItemName.coins, ItemName.springs, ItemName.torches, ItemName.seekers, ItemName.theo_crystal, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "5b": {ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ItemName.dash_refills, ItemName.coins, ItemName.springs, ItemName.torches, ItemName.seekers, ItemName.theo_crystal, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "5c": {ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ItemName.dash_refills}, + + "6a": {ItemName.feathers, ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers, ItemName.springs, ItemName.coins, ItemName.badeline_boosters, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "6b": {ItemName.feathers, ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers, ItemName.coins, ItemName.springs, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "6c": {ItemName.feathers, ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers}, + + "7a": {ItemName.springs, ItemName.dash_refills, ItemName.badeline_boosters, ItemName.traffic_blocks, ItemName.coins, ItemName.dream_blocks, ItemName.sinking_platforms, ItemName.blue_boosters, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.move_blocks, ItemName.moving_platforms, ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ItemName.feathers, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "7b": {ItemName.springs, ItemName.dash_refills, ItemName.badeline_boosters, ItemName.traffic_blocks, ItemName.coins, ItemName.dream_blocks, ItemName.moving_platforms, ItemName.blue_boosters, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.move_blocks, ItemName.swap_blocks, ItemName.red_boosters, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "7c": {ItemName.springs, ItemName.dash_refills, ItemName.badeline_boosters, ItemName.coins, ItemName.pink_clouds}, + + # Epilogue + "8a": set(), + + # Core + "9a": {ItemName.springs, ItemName.dash_refills, ItemName.fire_ice_balls, ItemName.bumpers, ItemName.core_toggles, ItemName.core_blocks, ItemName.coins, ItemName.badeline_boosters, ItemName.feathers, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "9b": {ItemName.springs, ItemName.dash_refills, ItemName.fire_ice_balls, ItemName.bumpers, ItemName.core_toggles, ItemName.core_blocks, ItemName.coins, ItemName.badeline_boosters, ItemName.dream_blocks, ItemName.moving_platforms, ItemName.blue_clouds, ItemName.swap_blocks, ItemName.kevin_blocks, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks}, + "9c": {ItemName.dash_refills, ItemName.bumpers, ItemName.core_toggles, ItemName.core_blocks, ItemName.traffic_blocks, ItemName.dream_blocks, ItemName.pink_clouds, ItemName.swap_blocks, ItemName.kevin_blocks}, + + # Farewell Pre/Post Empty Space + "10a": {ItemName.blue_clouds, ItemName.badeline_boosters, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.swap_blocks, ItemName.springs, ItemName.pufferfish, ItemName.coins, ItemName.dream_blocks, ItemName.jellyfish, ItemName.red_boosters, ItemName.dash_switches, ItemName.move_blocks, ItemName.breaker_boxes, ItemName.traffic_blocks}, + "10b": {ItemName.dream_blocks, ItemName.badeline_boosters, ItemName.bird, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.kevin_blocks, ItemName.coins, ItemName.traffic_blocks, ItemName.move_blocks, ItemName.blue_boosters, ItemName.springs, ItemName.feathers, ItemName.swap_blocks, ItemName.red_boosters, ItemName.core_blocks, ItemName.fire_ice_balls, ItemName.kevin_blocks, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks, ItemName.breaker_boxes, ItemName.pufferfish, ItemName.jellyfish}, + "10c": {ItemName.badeline_boosters, ItemName.double_dash_refills, ItemName.springs, ItemName.pufferfish, ItemName.jellyfish}, +} + +level_cassette_items: dict[str, str] = { + "0a": ItemName.prologue_cassette, + "1a": ItemName.fc_a_cassette, + "1b": ItemName.fc_b_cassette, + "1c": ItemName.fc_c_cassette, + "2a": ItemName.os_a_cassette, + "2b": ItemName.os_b_cassette, + "2c": ItemName.os_c_cassette, + "3a": ItemName.cr_a_cassette, + "3b": ItemName.cr_b_cassette, + "3c": ItemName.cr_c_cassette, + "4a": ItemName.gr_a_cassette, + "4b": ItemName.gr_b_cassette, + "4c": ItemName.gr_c_cassette, + "5a": ItemName.mt_a_cassette, + "5b": ItemName.mt_b_cassette, + "5c": ItemName.mt_c_cassette, + "6a": ItemName.ref_a_cassette, + "6b": ItemName.ref_b_cassette, + "6c": ItemName.ref_c_cassette, + "7a": ItemName.sum_a_cassette, + "7b": ItemName.sum_b_cassette, + "7c": ItemName.sum_c_cassette, + "8a": ItemName.epilogue_cassette, + "9a": ItemName.core_a_cassette, + "9b": ItemName.core_b_cassette, + "9c": ItemName.core_c_cassette, + "10a":ItemName.farewell_cassette, +} + + +celeste_base_id: int = 0xCA10000 + + +class CelesteItem(Item): + game = "Celeste" + + +class CelesteItemData(NamedTuple): + code: Optional[int] = None + type: ItemClassification = ItemClassification.filler + + +collectable_item_data_table: dict[str, CelesteItemData] = { + ItemName.strawberry: CelesteItemData(celeste_base_id + 0x0, ItemClassification.progression_skip_balancing), + ItemName.raspberry: CelesteItemData(celeste_base_id + 0x1, ItemClassification.filler), +} + +goal_item_data_table: dict[str, CelesteItemData] = { + ItemName.house_keys: CelesteItemData(celeste_base_id + 0x10, ItemClassification.progression_skip_balancing), +} + +trap_item_data_table: dict[str, CelesteItemData] = { + ItemName.bald_trap: CelesteItemData(celeste_base_id + 0x20, ItemClassification.trap), + ItemName.literature_trap: CelesteItemData(celeste_base_id + 0x21, ItemClassification.trap), + ItemName.stun_trap: CelesteItemData(celeste_base_id + 0x22, ItemClassification.trap), + ItemName.invisible_trap: CelesteItemData(celeste_base_id + 0x23, ItemClassification.trap), + ItemName.fast_trap: CelesteItemData(celeste_base_id + 0x24, ItemClassification.trap), + ItemName.slow_trap: CelesteItemData(celeste_base_id + 0x25, ItemClassification.trap), + ItemName.ice_trap: CelesteItemData(celeste_base_id + 0x26, ItemClassification.trap), + ItemName.reverse_trap: CelesteItemData(celeste_base_id + 0x28, ItemClassification.trap), + ItemName.screen_flip_trap: CelesteItemData(celeste_base_id + 0x29, ItemClassification.trap), + ItemName.laughter_trap: CelesteItemData(celeste_base_id + 0x2A, ItemClassification.trap), + ItemName.hiccup_trap: CelesteItemData(celeste_base_id + 0x2B, ItemClassification.trap), + ItemName.zoom_trap: CelesteItemData(celeste_base_id + 0x2C, ItemClassification.trap), +} + +checkpoint_item_data_table: dict[str, CelesteItemData] = {} + +key_item_data_table: dict[str, CelesteItemData] = {} +gem_item_data_table: dict[str, CelesteItemData] = {} + +interactable_item_data_table: dict[str, CelesteItemData] = { + ItemName.springs: CelesteItemData(celeste_base_id + 0x2000 + 0x00, ItemClassification.progression), + ItemName.traffic_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x01, ItemClassification.progression), + ItemName.pink_cassette_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x02, ItemClassification.progression), + ItemName.blue_cassette_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x03, ItemClassification.progression), + + ItemName.dream_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x04, ItemClassification.progression), + ItemName.coins: CelesteItemData(celeste_base_id + 0x2000 + 0x05, ItemClassification.progression), + ItemName.strawberry_seeds: CelesteItemData(celeste_base_id + 0x2000 + 0x1F, ItemClassification.progression), + + ItemName.sinking_platforms: CelesteItemData(celeste_base_id + 0x2000 + 0x20, ItemClassification.progression), + + ItemName.moving_platforms: CelesteItemData(celeste_base_id + 0x2000 + 0x06, ItemClassification.progression), + ItemName.blue_boosters: CelesteItemData(celeste_base_id + 0x2000 + 0x07, ItemClassification.progression), + ItemName.blue_clouds: CelesteItemData(celeste_base_id + 0x2000 + 0x08, ItemClassification.progression), + ItemName.move_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x09, ItemClassification.progression), + ItemName.white_block: CelesteItemData(celeste_base_id + 0x2000 + 0x21, ItemClassification.progression), + + ItemName.swap_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x0A, ItemClassification.progression), + ItemName.red_boosters: CelesteItemData(celeste_base_id + 0x2000 + 0x0B, ItemClassification.progression), + ItemName.torches: CelesteItemData(celeste_base_id + 0x2000 + 0x22, ItemClassification.useful), + ItemName.theo_crystal: CelesteItemData(celeste_base_id + 0x2000 + 0x0C, ItemClassification.progression), + + ItemName.feathers: CelesteItemData(celeste_base_id + 0x2000 + 0x0D, ItemClassification.progression), + ItemName.bumpers: CelesteItemData(celeste_base_id + 0x2000 + 0x0E, ItemClassification.progression), + ItemName.kevin_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x0F, ItemClassification.progression), + + ItemName.pink_clouds: CelesteItemData(celeste_base_id + 0x2000 + 0x10, ItemClassification.progression), + ItemName.badeline_boosters: CelesteItemData(celeste_base_id + 0x2000 + 0x11, ItemClassification.progression), + + ItemName.fire_ice_balls: CelesteItemData(celeste_base_id + 0x2000 + 0x12, ItemClassification.progression), + ItemName.core_toggles: CelesteItemData(celeste_base_id + 0x2000 + 0x13, ItemClassification.progression), + ItemName.core_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x14, ItemClassification.progression), + + ItemName.pufferfish: CelesteItemData(celeste_base_id + 0x2000 + 0x15, ItemClassification.progression), + ItemName.jellyfish: CelesteItemData(celeste_base_id + 0x2000 + 0x16, ItemClassification.progression), + ItemName.breaker_boxes: CelesteItemData(celeste_base_id + 0x2000 + 0x17, ItemClassification.progression), + ItemName.dash_refills: CelesteItemData(celeste_base_id + 0x2000 + 0x18, ItemClassification.progression), + ItemName.double_dash_refills: CelesteItemData(celeste_base_id + 0x2000 + 0x19, ItemClassification.progression), + ItemName.yellow_cassette_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x1A, ItemClassification.progression), + ItemName.green_cassette_blocks: CelesteItemData(celeste_base_id + 0x2000 + 0x1B, ItemClassification.progression), + ItemName.bird: CelesteItemData(celeste_base_id + 0x2000 + 0x23, ItemClassification.progression), + + ItemName.dash_switches: CelesteItemData(celeste_base_id + 0x2000 + 0x1C, ItemClassification.progression), + ItemName.seekers: CelesteItemData(celeste_base_id + 0x2000 + 0x1D, ItemClassification.progression), +} + +cassette_item_data_table: dict[str, CelesteItemData] = { + ItemName.prologue_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x00, ItemClassification.filler), + ItemName.fc_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x01, ItemClassification.filler), + ItemName.fc_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x02, ItemClassification.filler), + ItemName.fc_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x03, ItemClassification.filler), + ItemName.os_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x04, ItemClassification.filler), + ItemName.os_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x05, ItemClassification.filler), + ItemName.os_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x06, ItemClassification.filler), + ItemName.cr_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x07, ItemClassification.filler), + ItemName.cr_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x08, ItemClassification.filler), + ItemName.cr_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x09, ItemClassification.filler), + ItemName.gr_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0A, ItemClassification.filler), + ItemName.gr_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0B, ItemClassification.filler), + ItemName.gr_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0C, ItemClassification.filler), + ItemName.mt_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0D, ItemClassification.filler), + ItemName.mt_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0E, ItemClassification.filler), + ItemName.mt_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x0F, ItemClassification.filler), + ItemName.ref_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x10, ItemClassification.filler), + ItemName.ref_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x11, ItemClassification.filler), + ItemName.ref_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x12, ItemClassification.filler), + ItemName.sum_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x13, ItemClassification.filler), + ItemName.sum_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x14, ItemClassification.filler), + ItemName.sum_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x15, ItemClassification.filler), + ItemName.epilogue_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x16, ItemClassification.filler), + ItemName.core_a_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x17, ItemClassification.filler), + ItemName.core_b_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x18, ItemClassification.filler), + ItemName.core_c_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x19, ItemClassification.filler), + ItemName.farewell_cassette: CelesteItemData(celeste_base_id + 0x1000 + 0x1A, ItemClassification.filler), +} + +crystal_heart_item_data_table: dict[str, CelesteItemData] = { + ItemName.crystal_heart_1: CelesteItemData(celeste_base_id + 0x3000 + 0x00, ItemClassification.filler), + ItemName.crystal_heart_2: CelesteItemData(celeste_base_id + 0x3000 + 0x01, ItemClassification.filler), + ItemName.crystal_heart_3: CelesteItemData(celeste_base_id + 0x3000 + 0x02, ItemClassification.filler), + ItemName.crystal_heart_4: CelesteItemData(celeste_base_id + 0x3000 + 0x03, ItemClassification.filler), + ItemName.crystal_heart_5: CelesteItemData(celeste_base_id + 0x3000 + 0x04, ItemClassification.filler), + ItemName.crystal_heart_6: CelesteItemData(celeste_base_id + 0x3000 + 0x05, ItemClassification.filler), + ItemName.crystal_heart_7: CelesteItemData(celeste_base_id + 0x3000 + 0x06, ItemClassification.filler), + ItemName.crystal_heart_8: CelesteItemData(celeste_base_id + 0x3000 + 0x07, ItemClassification.filler), + ItemName.crystal_heart_9: CelesteItemData(celeste_base_id + 0x3000 + 0x08, ItemClassification.filler), + ItemName.crystal_heart_10: CelesteItemData(celeste_base_id + 0x3000 + 0x09, ItemClassification.filler), + ItemName.crystal_heart_11: CelesteItemData(celeste_base_id + 0x3000 + 0x0A, ItemClassification.filler), + ItemName.crystal_heart_12: CelesteItemData(celeste_base_id + 0x3000 + 0x0B, ItemClassification.filler), + ItemName.crystal_heart_13: CelesteItemData(celeste_base_id + 0x3000 + 0x0C, ItemClassification.filler), + ItemName.crystal_heart_14: CelesteItemData(celeste_base_id + 0x3000 + 0x0D, ItemClassification.filler), + ItemName.crystal_heart_15: CelesteItemData(celeste_base_id + 0x3000 + 0x0E, ItemClassification.filler), + ItemName.crystal_heart_16: CelesteItemData(celeste_base_id + 0x3000 + 0x0F, ItemClassification.filler), +} + +def add_checkpoint_to_table(id: int, name: str): + checkpoint_item_data_table[name] = CelesteItemData(id, ItemClassification.progression) + +def add_key_to_table(id: int, name: str): + key_item_data_table[name] = CelesteItemData(id, ItemClassification.progression) + +def add_gem_to_table(id: int, name: str): + gem_item_data_table[name] = CelesteItemData(id, ItemClassification.progression) + +def generate_item_data_table() -> dict[str, CelesteItemData]: + return {**collectable_item_data_table, + **goal_item_data_table, + **trap_item_data_table, + **checkpoint_item_data_table, + **key_item_data_table, + **gem_item_data_table, + **cassette_item_data_table, + **crystal_heart_item_data_table, + **interactable_item_data_table} + + +def generate_item_table() -> dict[str, int]: + return {name: data.code for name, data in generate_item_data_table().items() if data.code is not None} + + +def generate_item_groups() -> dict[str, list[str]]: + item_groups: dict[str, list[str]] = { + "Collectables": list(collectable_item_data_table.keys()), + "Traps": list(trap_item_data_table.keys()), + "Checkpoints": list(checkpoint_item_data_table.keys()), + "Keys": list(key_item_data_table.keys()), + "Gems": list(gem_item_data_table.keys()), + "Cassettes": list(cassette_item_data_table.keys()), + "Crystal Hearts": list(crystal_heart_item_data_table.keys()), + "Interactables": list(interactable_item_data_table.keys()), + + # Commonly mistaken names + "Green Boosters": [ItemName.blue_boosters], + "Green Bubbles": [ItemName.blue_boosters], + "Blue Bubbles": [ItemName.blue_boosters], + "Red Bubbles": [ItemName.red_boosters], + "Touch Switches": [ItemName.coins], + } + + return item_groups diff --git a/worlds/celeste_open_world/Levels.py b/worlds/celeste_open_world/Levels.py new file mode 100644 index 0000000000..1f846bbe57 --- /dev/null +++ b/worlds/celeste_open_world/Levels.py @@ -0,0 +1,208 @@ +from __future__ import annotations +from enum import IntEnum + +from BaseClasses import CollectionState + + +goal_area_option_to_name: dict[int, str] = { + 0: "7a", + 1: "7b", + 2: "7c", + 3: "9a", + 4: "9b", + 5: "9c", + 6: "10a", + 7: "10b", + 8: "10c", +} + + +goal_area_option_to_display_name: dict[int, str] = { + 0: "The Summit A", + 1: "The Summit B", + 2: "The Summit C", + 3: "Core A", + 4: "Core B", + 5: "Core C", + 6: "Farewell", + 7: "Farewell", + 8: "Farewell", +} + +goal_area_to_location_name: dict[str, str] = { + "7a": "The Summit A - Level Clear", + "7b": "The Summit B - Level Clear", + "7c": "The Summit C - Level Clear", + "9a": "Core A - Level Clear", + "9b": "Core B - Level Clear", + "9c": "Core C - Level Clear", + "10a": "Farewell - Crystal Heart?", + "10b": "Farewell - Level Clear", + "10c": "Farewell - Golden Strawberry", +} + + +class LocationType(IntEnum): + strawberry = 0 + golden_strawberry = 1 + cassette = 2 + crystal_heart = 3 + checkpoint = 4 + level_clear = 5 + key = 6 + binoculars = 7 + room_enter = 8 + clutter = 9 + gem = 10 + car = 11 + +class DoorDirection(IntEnum): + up = 0 + right = 1 + down = 2 + left = 3 + special = 4 + + +class Door: + name: str + room_name: str + room: Room + dir: DoorDirection + blocked: bool + closes_behind: bool + region: PreRegion + + def __init__(self, name: str, room_name: str, dir: DoorDirection, blocked: bool, closes_behind: bool): + self.name = name + self.room_name = room_name + self.dir = dir + self.blocked = blocked + self.closes_behind = closes_behind + # Find PreRegion later using our name once we know it exists + + +class PreRegion: + name: str + room_name: str + room: Room + connections: list[RegionConnection] + locations: list[LevelLocation] + + def __init__(self, name: str, room_name: str, connections: list[RegionConnection], locations: list[LevelLocation]): + self.name = name + self.room_name = room_name + self.connections = connections.copy() + self.locations = locations.copy() + + for loc in self.locations: + loc.region = self + + +class RegionConnection: + source_name: str + source: PreRegion + destination_name: str + destination: PreRegion + possible_access: list[list[str]] + + def __init__(self, source_name: str, destination_name: str, possible_access: list[list[str]] = []): + self.source_name = source_name + self.destination_name = destination_name + self.possible_access = possible_access.copy() + + +class LevelLocation: + name: str + display_name: str + region_name: str + region: PreRegion + loc_type: LocationType + possible_access: list[list[str]] + + def __init__(self, name: str, display_name: str, region_name: str, loc_type: LocationType, possible_access: list[list[str]] = []): + self.name = name + self.display_name = display_name + self.region_name = region_name + self.loc_type = loc_type + self.possible_access = possible_access.copy() + +class Room: + level_name: str + name: str + display_name: str + regions: list[PreRegion] + doors: list[Door] + checkpoint: str + checkpoint_region: str + + def __init__(self, level_name: str, name: str, display_name: str, regions: list[PreRegion], doors: list[Door], checkpoint: str = None, checkpoint_region: str = None): + self.level_name = level_name + self.name = name + self.display_name = display_name + self.regions = regions.copy() + self.doors = doors.copy() + self.checkpoint = checkpoint + self.checkpoint_region = checkpoint_region + + from .data.CelesteLevelData import all_regions + + for reg in self.regions: + reg.room = self + + for reg_con in reg.connections: + reg_con.source = reg + reg_con.destination = all_regions[reg_con.destination_name] + + for door in self.doors: + door.room = self + + +class RoomConnection: + level_name: str + source: Door + dest: Door + two_way: bool + + def __init__(self, level_name: str, source: Door, dest: Door): + self.level_name = level_name + self.source = source + self.dest = dest + self.two_way = not self.dest.closes_behind + + if (self.source.dir == DoorDirection.left and self.dest.dir != DoorDirection.right or + self.source.dir == DoorDirection.right and self.dest.dir != DoorDirection.left or + self.source.dir == DoorDirection.up and self.dest.dir != DoorDirection.down or + self.source.dir == DoorDirection.down and self.dest.dir != DoorDirection.up): + raise Exception(f"Door {source.name} ({self.source.dir}) and Door {dest.name} ({self.dest.dir}) have mismatched directions.") + + +class Level: + name: str + display_name: str + rooms: list[Room] + room_connections: list[RoomConnection] + + def __init__(self, name: str, display_name: str, rooms: list[Room], room_connections: list[RoomConnection]): + self.name = name + self.display_name = display_name + self.rooms = rooms.copy() + self.room_connections = room_connections.copy() + + +def load_logic_data() -> dict[str, Level]: + from .data.CelesteLevelData import all_levels + + #for _, level in all_levels.items(): + # print(level.display_name) + # + # for room in level.rooms: + # print(" " + room.display_name) + # + # for region in room.regions: + # print(" " + region.name) + # + # for location in region.locations: + # print(" " + location.display_name) + + return all_levels diff --git a/worlds/celeste_open_world/Locations.py b/worlds/celeste_open_world/Locations.py new file mode 100644 index 0000000000..01ce533666 --- /dev/null +++ b/worlds/celeste_open_world/Locations.py @@ -0,0 +1,281 @@ +from typing import NamedTuple, Optional, TYPE_CHECKING + +from BaseClasses import Location, Region +from worlds.generic.Rules import set_rule + +from .Levels import Level, LocationType +from .Names import ItemName + +if TYPE_CHECKING: + from . import CelesteOpenWorld +else: + CelesteOpenWorld = object + + +celeste_base_id: int = 0xCA10000 + + +class CelesteLocation(Location): + game = "Celeste" + + +class CelesteLocationData(NamedTuple): + region: str + address: Optional[int] = None + + +checkpoint_location_data_table: dict[str, CelesteLocationData] = {} +key_location_data_table: dict[str, CelesteLocationData] = {} + +location_id_offsets: dict[LocationType, int | None] = { + LocationType.strawberry: celeste_base_id, + LocationType.golden_strawberry: celeste_base_id + 0x1000, + LocationType.cassette: celeste_base_id + 0x2000, + LocationType.car: celeste_base_id + 0x2A00, + LocationType.crystal_heart: celeste_base_id + 0x3000, + LocationType.checkpoint: celeste_base_id + 0x4000, + LocationType.level_clear: celeste_base_id + 0x5000, + LocationType.key: celeste_base_id + 0x6000, + LocationType.gem: celeste_base_id + 0x6A00, + LocationType.binoculars: celeste_base_id + 0x7000, + LocationType.room_enter: celeste_base_id + 0x8000, + LocationType.clutter: None, +} + + +def generate_location_table() -> dict[str, int]: + from .Levels import Level, LocationType, load_logic_data + level_data: dict[str, Level] = load_logic_data() + location_table = {} + + location_counts: dict[LocationType, int] = { + LocationType.strawberry: 0, + LocationType.golden_strawberry: 0, + LocationType.cassette: 0, + LocationType.car: 0, + LocationType.crystal_heart: 0, + LocationType.checkpoint: 0, + LocationType.level_clear: 0, + LocationType.key: 0, + LocationType.gem: 0, + LocationType.binoculars: 0, + LocationType.room_enter: 0, + } + + for _, level in level_data.items(): + for room in level.rooms: + if room.name != "10b_GOAL": + location_table[room.display_name] = location_id_offsets[LocationType.room_enter] + location_counts[LocationType.room_enter] + location_counts[LocationType.room_enter] += 1 + + if room.checkpoint is not None and room.checkpoint != "Start": + checkpoint_id: int = location_id_offsets[LocationType.checkpoint] + location_counts[LocationType.checkpoint] + checkpoint_name: str = level.display_name + " - " + room.checkpoint + location_table[checkpoint_name] = checkpoint_id + location_counts[LocationType.checkpoint] += 1 + checkpoint_location_data_table[checkpoint_name] = CelesteLocationData(level.display_name, checkpoint_id) + + from .Items import add_checkpoint_to_table + add_checkpoint_to_table(checkpoint_id, checkpoint_name) + + for region in room.regions: + for location in region.locations: + if location_id_offsets[location.loc_type] is not None: + location_id = location_id_offsets[location.loc_type] + location_counts[location.loc_type] + location_table[location.display_name] = location_id + location_counts[location.loc_type] += 1 + + if location.loc_type == LocationType.key: + from .Items import add_key_to_table + add_key_to_table(location_id, location.display_name) + + if location.loc_type == LocationType.gem: + from .Items import add_gem_to_table + add_gem_to_table(location_id, location.display_name) + + return location_table + + +def create_regions_and_locations(world: CelesteOpenWorld): + menu_region = Region("Menu", world.player, world.multiworld) + world.multiworld.regions.append(menu_region) + + world.active_checkpoint_names: list[str] = [] + world.goal_checkpoint_names: dict[str, str] = dict() + world.active_key_names: list[str] = [] + world.active_gem_names: list[str] = [] + world.active_clutter_names: list[str] = [] + + for _, level in world.level_data.items(): + if level.name not in world.active_levels: + continue + + for room in level.rooms: + room_region = Region(room.name + "_room", world.player, world.multiworld) + world.multiworld.regions.append(room_region) + + for pre_region in room.regions: + region = Region(pre_region.name, world.player, world.multiworld) + world.multiworld.regions.append(region) + + for level_location in pre_region.locations: + if level_location.loc_type == LocationType.golden_strawberry: + if level_location.display_name == "Farewell - Golden Strawberry": + if not world.options.goal_area == "farewell_golden": + continue + elif not world.options.include_goldens: + continue + + if level_location.loc_type == LocationType.car and not world.options.carsanity: + continue + + if level_location.loc_type == LocationType.binoculars and not world.options.binosanity: + continue + + if level_location.loc_type == LocationType.key: + world.active_key_names.append(level_location.display_name) + + if level_location.loc_type == LocationType.gem: + world.active_gem_names.append(level_location.display_name) + + location_rule = None + if len(level_location.possible_access) == 1: + only_access = level_location.possible_access[0] + if len(only_access) == 1: + only_item = level_location.possible_access[0][0] + def location_rule_func(state, only_item=only_item): + return state.has(only_item, world.player) + location_rule = location_rule_func + else: + def location_rule_func(state, only_access=only_access): + return state.has_all(only_access, world.player) + location_rule = location_rule_func + elif len(level_location.possible_access) > 0: + def location_rule_func(state, level_location=level_location): + for sublist in level_location.possible_access: + if state.has_all(sublist, world.player): + return True + return False + location_rule = location_rule_func + + if level_location.loc_type == LocationType.clutter: + world.active_clutter_names.append(level_location.display_name) + location = CelesteLocation(world.player, level_location.display_name, None, region) + if location_rule is not None: + set_rule(location, location_rule) + region.locations.append(location) + continue + + location = CelesteLocation(world.player, level_location.display_name, world.location_name_to_id[level_location.display_name], region) + if location_rule is not None: + set_rule(location, location_rule) + region.locations.append(location) + + for pre_region in room.regions: + region = world.get_region(pre_region.name) + for connection in pre_region.connections: + connection_rule = None + if len(connection.possible_access) == 1: + only_access = connection.possible_access[0] + if len(only_access) == 1: + only_item = connection.possible_access[0][0] + def connection_rule_func(state, only_item=only_item): + return state.has(only_item, world.player) + connection_rule = connection_rule_func + else: + def connection_rule_func(state, only_access=only_access): + return state.has_all(only_access, world.player) + connection_rule = connection_rule_func + elif len(connection.possible_access) > 0: + def connection_rule_func(state, connection=connection): + for sublist in connection.possible_access: + if state.has_all(sublist, world.player): + return True + return False + + connection_rule = connection_rule_func + + if connection_rule is None: + region.add_exits([connection.destination_name]) + else: + region.add_exits([connection.destination_name], {connection.destination_name: connection_rule}) + region.add_exits([room_region.name]) + + if room.checkpoint != None: + if room.checkpoint == "Start": + if world.options.lock_goal_area and (level.name == world.goal_area or (level.name[:2] == world.goal_area[:2] == "10")): + world.goal_start_region: str = room.checkpoint_region + elif level.name == "8a": + world.epilogue_start_region: str = room.checkpoint_region + else: + menu_region.add_exits([room.checkpoint_region]) + else: + checkpoint_location_name = level.display_name + " - " + room.checkpoint + world.active_checkpoint_names.append(checkpoint_location_name) + checkpoint_rule = lambda state, checkpoint_location_name=checkpoint_location_name: state.has(checkpoint_location_name, world.player) + room_region.add_locations({ + checkpoint_location_name: world.location_name_to_id[checkpoint_location_name] + }, CelesteLocation) + + if world.options.lock_goal_area and (level.name == world.goal_area or (level.name[:2] == world.goal_area[:2] == "10")): + world.goal_checkpoint_names[room.checkpoint_region] = checkpoint_location_name + else: + menu_region.add_exits([room.checkpoint_region], {room.checkpoint_region: checkpoint_rule}) + + if world.options.roomsanity: + if room.name != "10b_GOAL": + room_location_name = room.display_name + room_region.add_locations({ + room_location_name: world.location_name_to_id[room_location_name] + }, CelesteLocation) + + for room_connection in level.room_connections: + source_region = world.get_region(room_connection.source.name) + source_region.add_exits([room_connection.dest.name]) + if room_connection.two_way: + dest_region = world.get_region(room_connection.dest.name) + dest_region.add_exits([room_connection.source.name]) + + if level.name == "10b": + # Manually connect the two parts of Farewell + source_region = world.get_region("10a_e-08_east") + source_region.add_exits(["10b_f-door_west"]) + + if level.name == "10c": + # Manually connect the Golden room of Farewell + golden_items: list[str] = [ItemName.traffic_blocks, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.dream_blocks, ItemName.swap_blocks, ItemName.move_blocks, ItemName.blue_boosters, ItemName.springs, ItemName.feathers, ItemName.coins, ItemName.red_boosters, ItemName.kevin_blocks, ItemName.core_blocks, ItemName.fire_ice_balls, ItemName.badeline_boosters, ItemName.bird, ItemName.breaker_boxes, ItemName.pufferfish, ItemName.jellyfish, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks] + golden_rule = lambda state: state.has_all(golden_items, world.player) + + source_region_end = world.get_region("10b_j-19_top") + source_region_end.add_exits(["10c_end-golden_bottom"], {"10c_end-golden_bottom": golden_rule}) + source_region_moon = world.get_region("10b_j-16_east") + source_region_moon.add_exits(["10c_end-golden_bottom"], {"10c_end-golden_bottom": golden_rule}) + source_region_golden = world.get_region("10c_end-golden_top") + source_region_golden.add_exits(["10b_GOAL_main"]) + + +location_data_table: dict[str, int] = generate_location_table() + + +def generate_location_groups() -> dict[str, list[str]]: + from .Levels import Level, LocationType, load_logic_data + level_data: dict[str, Level] = load_logic_data() + + location_groups: dict[str, list[str]] = { + "Strawberries": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.strawberry] and id < location_id_offsets[LocationType.golden_strawberry]], + "Golden Strawberries": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.golden_strawberry] and id < location_id_offsets[LocationType.cassette]], + "Cassettes": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.cassette] and id < location_id_offsets[LocationType.car]], + "Cars": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.car] and id < location_id_offsets[LocationType.crystal_heart]], + "Crystal Hearts": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.crystal_heart] and id < location_id_offsets[LocationType.checkpoint]], + "Checkpoints": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.checkpoint] and id < location_id_offsets[LocationType.level_clear]], + "Level Clears": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.level_clear] and id < location_id_offsets[LocationType.key]], + "Keys": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.key] and id < location_id_offsets[LocationType.gem]], + "Gems": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.gem] and id < location_id_offsets[LocationType.binoculars]], + "Binoculars": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.binoculars] and id < location_id_offsets[LocationType.room_enter]], + "Rooms": [name for name, id in location_data_table.items() if id >= location_id_offsets[LocationType.room_enter]], + } + + for level in level_data.values(): + location_groups.update({level.display_name: [loc_name for loc_name, id in location_data_table.items() if level.display_name in loc_name]}) + + return location_groups diff --git a/worlds/celeste_open_world/Names/ItemName.py b/worlds/celeste_open_world/Names/ItemName.py new file mode 100644 index 0000000000..93b57dde9d --- /dev/null +++ b/worlds/celeste_open_world/Names/ItemName.py @@ -0,0 +1,210 @@ +# Collectables +strawberry = "Strawberry" +raspberry = "Raspberry" + +# Goal Items +house_keys = "Granny's House Keys" +victory = "Victory" + +# Traps +bald_trap = "Bald Trap" +literature_trap = "Literature Trap" +stun_trap = "Stun Trap" +invisible_trap = "Invisible Trap" +fast_trap = "Fast Trap" +slow_trap = "Slow Trap" +ice_trap = "Ice Trap" +reverse_trap = "Reverse Trap" +screen_flip_trap = "Screen Flip Trap" +laughter_trap = "Laughter Trap" +hiccup_trap = "Hiccup Trap" +zoom_trap = "Zoom Trap" + +# Movement +dash = "Dash" +u_dash = "Up Dash" +r_dash = "Right Dash" +d_dash = "Down Dash" +l_dash = "Left Dash" +ur_dash = "Up-Right Dash" +dr_dash = "Down-Right Dash" +dl_dash = "Down-Left Dash" +ul_dash = "Up-Left Dash" + +# Interactables +springs = "Springs" +traffic_blocks = "Traffic Blocks" +pink_cassette_blocks = "Pink Cassette Blocks" +blue_cassette_blocks = "Blue Cassette Blocks" + +dream_blocks = "Dream Blocks" +coins = "Coins" +strawberry_seeds = "Strawberry Seeds" + +sinking_platforms = "Sinking Platforms" + +moving_platforms = "Moving Platforms" +blue_boosters = "Blue Boosters" +blue_clouds = "Blue Clouds" +move_blocks = "Move Blocks" +white_block = "White Block" + +swap_blocks = "Swap Blocks" +red_boosters = "Red Boosters" +torches = "Torches" +theo_crystal = "Theo Crystal" + +feathers = "Feathers" +bumpers = "Bumpers" +kevin_blocks = "Kevins" + +pink_clouds = "Pink Clouds" +badeline_boosters = "Badeline Boosters" + +fire_ice_balls = "Fire and Ice Balls" +core_toggles = "Core Toggles" +core_blocks = "Core Blocks" + +pufferfish = "Pufferfish" +jellyfish = "Jellyfish" +breaker_boxes = "Breaker Boxes" +dash_refills = "Dash Refills" +double_dash_refills = "Double Dash Refills" +yellow_cassette_blocks = "Yellow Cassette Blocks" +green_cassette_blocks = "Green Cassette Blocks" + +dash_switches = "Dash Switches" +seekers = "Seekers" +bird = "Bird" + +brown_clutter = "Celestial Resort A - Brown Clutter" +green_clutter = "Celestial Resort A - Green Clutter" +pink_clutter = "Celestial Resort A - Pink Clutter" + +cannot_access = "Cannot Access" + +# Checkpoints +fc_a_checkpoint_1 = "Forsaken City A - Crossing" +fc_a_checkpoint_2 = "Forsaken City A - Chasm" + +fc_b_checkpoint_1 = "Forsaken City B - Contraption" +fc_b_checkpoint_2 = "Forsaken City B - Scrap Pit" + +os_a_checkpoint_1 = "Old Site A - Intervention" +os_a_checkpoint_2 = "Old Site A - Awake" + +os_b_checkpoint_1 = "Old Site B - Combination Lock" +os_b_checkpoint_2 = "Old Site B - Dream Altar" + +cr_a_checkpoint_1 = "Celestial Resort A - Huge Mess" +cr_a_checkpoint_2 = "Celestial Resort A - Elevator Shaft" +cr_a_checkpoint_3 = "Celestial Resort A - Presidential Suite" + +cr_b_checkpoint_1 = "Celestial Resort B - Staff Quarters" +cr_b_checkpoint_2 = "Celestial Resort B - Library" +cr_b_checkpoint_3 = "Celestial Resort B - Rooftop" + +gr_a_checkpoint_1 = "Golden Ridge A - Shrine" +gr_a_checkpoint_2 = "Golden Ridge A - Old Trail" +gr_a_checkpoint_3 = "Golden Ridge A - Cliff Face" + +gr_b_checkpoint_1 = "Golden Ridge B - Stepping Stones" +gr_b_checkpoint_2 = "Golden Ridge B - Gusty Canyon" +gr_b_checkpoint_3 = "Golden Ridge B - Eye of the Storm" + +mt_a_checkpoint_1 = "Mirror Temple A - Depths" +mt_a_checkpoint_2 = "Mirror Temple A - Unravelling" +mt_a_checkpoint_3 = "Mirror Temple A - Search" +mt_a_checkpoint_4 = "Mirror Temple A - Rescue" + +mt_b_checkpoint_1 = "Mirror Temple B - Central Chamber" +mt_b_checkpoint_2 = "Mirror Temple B - Through the Mirror" +mt_b_checkpoint_3 = "Mirror Temple B - Mix Master" + +ref_a_checkpoint_1 = "Reflection A - Lake" +ref_a_checkpoint_2 = "Reflection A - Hollows" +ref_a_checkpoint_3 = "Reflection A - Reflection" +ref_a_checkpoint_4 = "Reflection A - Rock Bottom" +ref_a_checkpoint_5 = "Reflection A - Resolution" + +ref_b_checkpoint_1 = "Reflection B - Reflection" +ref_b_checkpoint_2 = "Reflection B - Rock Bottom" +ref_b_checkpoint_3 = "Reflection B - Reprieve" + +sum_a_checkpoint_1 = "The Summit A - 500 M" +sum_a_checkpoint_2 = "The Summit A - 1000 M" +sum_a_checkpoint_3 = "The Summit A - 1500 M" +sum_a_checkpoint_4 = "The Summit A - 2000 M" +sum_a_checkpoint_5 = "The Summit A - 2500 M" +sum_a_checkpoint_6 = "The Summit A - 3000 M" + +sum_b_checkpoint_1 = "The Summit B - 500 M" +sum_b_checkpoint_2 = "The Summit B - 1000 M" +sum_b_checkpoint_3 = "The Summit B - 1500 M" +sum_b_checkpoint_4 = "The Summit B - 2000 M" +sum_b_checkpoint_5 = "The Summit B - 2500 M" +sum_b_checkpoint_6 = "The Summit B - 3000 M" + +core_a_checkpoint_1 = "Core A - Into the Core" +core_a_checkpoint_2 = "Core A - Hot and Cold" +core_a_checkpoint_3 = "Core A - Heart of the Mountain" + +core_b_checkpoint_1 = "Core B - Into the Core" +core_b_checkpoint_2 = "Core B - Burning or Freezing" +core_b_checkpoint_3 = "Core B - Heartbeat" + +farewell_checkpoint_1 = "Farewell - Singular" +farewell_checkpoint_2 = "Farewell - Power Source" +farewell_checkpoint_3 = "Farewell - Remembered" +farewell_checkpoint_4 = "Farewell - Event Horizon" +farewell_checkpoint_5 = "Farewell - Determination" +farewell_checkpoint_6 = "Farewell - Stubbornness" +farewell_checkpoint_7 = "Farewell - Reconcilliation" +farewell_checkpoint_8 = "Farewell - Farewell" + +# Cassettes +prologue_cassette = "Prologue Cassette" +fc_a_cassette = "Forsaken City Cassette - A Side" +fc_b_cassette = "Forsaken City Cassette - B Side" +fc_c_cassette = "Forsaken City Cassette - C Side" +os_a_cassette = "Old Site Cassette - A Side" +os_b_cassette = "Old Site Cassette - B Side" +os_c_cassette = "Old Site Cassette - C Side" +cr_a_cassette = "Celestial Resort Cassette - A Side" +cr_b_cassette = "Celestial Resort Cassette - B Side" +cr_c_cassette = "Celestial Resort Cassette - C Side" +gr_a_cassette = "Golden Ridge Cassette - A Side" +gr_b_cassette = "Golden Ridge Cassette - B Side" +gr_c_cassette = "Golden Ridge Cassette - C Side" +mt_a_cassette = "Mirror Temple Cassette - A Side" +mt_b_cassette = "Mirror Temple Cassette - B Side" +mt_c_cassette = "Mirror Temple Cassette - C Side" +ref_a_cassette = "Reflection Cassette - A Side" +ref_b_cassette = "Reflection Cassette - B Side" +ref_c_cassette = "Reflection Cassette - C Side" +sum_a_cassette = "The Summit Cassette - A Side" +sum_b_cassette = "The Summit Cassette - B Side" +sum_c_cassette = "The Summit Cassette - C Side" +epilogue_cassette = "Epilogue Cassette" +core_a_cassette = "Core Cassette - A Side" +core_b_cassette = "Core Cassette - B Side" +core_c_cassette = "Core Cassette - C Side" +farewell_cassette = "Farewell Cassette" + +# Crystal Hearts +crystal_heart_1 = "Crystal Heart 1" +crystal_heart_2 = "Crystal Heart 2" +crystal_heart_3 = "Crystal Heart 3" +crystal_heart_4 = "Crystal Heart 4" +crystal_heart_5 = "Crystal Heart 5" +crystal_heart_6 = "Crystal Heart 6" +crystal_heart_7 = "Crystal Heart 7" +crystal_heart_8 = "Crystal Heart 8" +crystal_heart_9 = "Crystal Heart 9" +crystal_heart_10 = "Crystal Heart 10" +crystal_heart_11 = "Crystal Heart 11" +crystal_heart_12 = "Crystal Heart 12" +crystal_heart_13 = "Crystal Heart 13" +crystal_heart_14 = "Crystal Heart 14" +crystal_heart_15 = "Crystal Heart 15" +crystal_heart_16 = "Crystal Heart 16" diff --git a/worlds/celeste_open_world/Names/__init__.py b/worlds/celeste_open_world/Names/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/celeste_open_world/Options.py b/worlds/celeste_open_world/Options.py new file mode 100644 index 0000000000..75e8928a29 --- /dev/null +++ b/worlds/celeste_open_world/Options.py @@ -0,0 +1,528 @@ +from dataclasses import dataclass +import random + +from Options import Choice, Range, DefaultOnToggle, Toggle, TextChoice, DeathLink, OptionGroup, PerGameCommonOptions, OptionError +from worlds.AutoWorld import World + + +class DeathLinkAmnesty(Range): + """ + How many deaths it takes to send a DeathLink + """ + display_name = "Death Link Amnesty" + range_start = 1 + range_end = 30 + default = 10 + +class TrapLink(Toggle): + """ + Whether your received traps are linked to other players + + You will also receive any linked traps from other players with Trap Link enabled, + if you have a weight above "none" set for that trap + """ + display_name = "Trap Link" + + +class GoalArea(Choice): + """ + What Area must be cleared to gain access to the Epilogue and complete the game + """ + display_name = "Goal Area" + option_the_summit_a = 0 + option_the_summit_b = 1 + option_the_summit_c = 2 + option_core_a = 3 + option_core_b = 4 + option_core_c = 5 + option_empty_space = 6 + option_farewell = 7 + option_farewell_golden = 8 + default = 0 + +class LockGoalArea(DefaultOnToggle): + """ + Determines whether your Goal Area will be locked until you receive your required Strawberries, or only the Epilogue + """ + display_name = "Lock Goal Area" + +class GoalAreaCheckpointsanity(Toggle): + """ + Determines whether the Checkpoints in your Goal Area will be shuffled into the item pool (if Checkpointsanity is active) + """ + display_name = "Goal Area Checkpointsanity" + +class TotalStrawberries(Range): + """ + Maximum number of how many Strawberries can exist + """ + display_name = "Total Strawberries" + range_start = 0 + range_end = 202 + default = 50 + +class StrawberriesRequiredPercentage(Range): + """ + Percentage of existing Strawberries you must receive to access your Goal Area (if Lock Goal Area is active) and the Epilogue + """ + display_name = "Strawberries Required Percentage" + range_start = 0 + range_end = 100 + default = 80 + + +class Checkpointsanity(Toggle): + """ + Determines whether Checkpoints will be shuffled into the item pool + """ + display_name = "Checkpointsanity" + +class Binosanity(Toggle): + """ + Determines whether using Binoculars sends location checks + """ + display_name = "Binosanity" + +class Keysanity(Toggle): + """ + Determines whether individual Keys are shuffled into the item pool + """ + display_name = "Keysanity" + +class Gemsanity(Toggle): + """ + Determines whether Summit Gems are shuffled into the item pool + """ + display_name = "Gemsanity" + +class Carsanity(Toggle): + """ + Determines whether riding on cars grants location checks + """ + display_name = "Carsanity" + +class Roomsanity(Toggle): + """ + Determines whether entering individual rooms sends location checks + """ + display_name = "Roomsanity" + +class IncludeGoldens(Toggle): + """ + Determines whether collecting Golden Strawberries sends location checks + """ + display_name = "Include Goldens" + + +class IncludeCore(Toggle): + """ + Determines whether Chapter 8 - Core Levels will be included + """ + display_name = "Include Core" + +class IncludeFarewell(Choice): + """ + Determines how much of Chapter 9 - Farewell Level will be included + """ + display_name = "Include Farewell" + option_none = 0 + option_empty_space = 1 + option_farewell = 2 + default = 0 + +class IncludeBSides(Toggle): + """ + Determines whether the B-Side Levels will be included + """ + display_name = "Include B-Sides" + +class IncludeCSides(Toggle): + """ + Determines whether the C-Side Levels will be included + """ + display_name = "Include C-Sides" + + +class JunkFillPercentage(Range): + """ + Replace a percentage of non-required Strawberries in the item pool with junk items + """ + display_name = "Junk Fill Percentage" + range_start = 0 + range_end = 100 + default = 50 + +class TrapFillPercentage(Range): + """ + Replace a percentage of junk items in the item pool with random traps + """ + display_name = "Trap Fill Percentage" + range_start = 0 + range_end = 100 + default = 0 + +class TrapExpirationAction(Choice): + """ + The type of action which causes traps to wear off + """ + display_name = "Trap Expiration Action" + option_return_to_menu = 0 + option_deaths = 1 + option_new_screens = 2 + default = 1 + +class TrapExpirationAmount(Range): + """ + The amount of the selected Trap Expiration Action that must occur for the trap to wear off + """ + display_name = "Trap Expiration Amount" + range_start = 1 + range_end = 10 + default = 5 + +class BaseTrapWeight(Choice): + """ + Base Class for Trap Weights + """ + option_none = 0 + option_low = 1 + option_medium = 2 + option_high = 4 + default = 2 + +class BaldTrapWeight(BaseTrapWeight): + """ + Likelihood of receiving a trap which makes Maddy bald + """ + display_name = "Bald Trap Weight" + +class LiteratureTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes the player to read literature + """ + display_name = "Literature Trap Weight" + +class StunTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which briefly stuns Maddy + """ + display_name = "Stun Trap Weight" + +class InvisibleTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which turns Maddy invisible + """ + display_name = "Invisible Trap Weight" + +class FastTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which increases the game speed + """ + display_name = "Fast Trap Weight" + +class SlowTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which decreases the game speed + """ + display_name = "Slow Trap Weight" + +class IceTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes the level to become slippery + """ + display_name = "Ice Trap Weight" + +class ReverseTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes the controls to be reversed + """ + display_name = "Reverse Trap Weight" + +class ScreenFlipTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes the screen to be flipped + """ + display_name = "Screen Flip Trap Weight" + +class LaughterTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes Maddy to laugh uncontrollably + """ + display_name = "Laughter Trap Weight" + +class HiccupTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes Maddy to hiccup uncontrollably + """ + display_name = "Hiccup Trap Weight" + +class ZoomTrapWeight(BaseTrapWeight): + """ + Likelihood of a receiving a trap which causes the camera to focus on Maddy + """ + display_name = "Zoom Trap Weight" + + +class MusicShuffle(Choice): + """ + Music shuffle type + + None: No Music is shuffled + + Consistent: Each music track is consistently shuffled throughout the game + + Singularity: The entire game uses one song for levels + """ + display_name = "Music Shuffle" + option_none = 0 + option_consistent = 1 + option_singularity = 2 + default = 0 + +class RequireCassettes(Toggle): + """ + Determines whether you must receive a level's Cassette Item to hear that level's music + """ + display_name = "Require Cassettes" + + +class MadelineHairLength(Choice): + """ + How long Madeline's hair is + """ + display_name = "Madeline Hair Length" + option_very_short = 1 + option_short = 2 + option_default = 4 + option_long = 7 + option_very_long = 10 + option_absurd = 20 + default = 4 + + +class ColorChoice(TextChoice): + option_strawberry = 0xAC3232 + option_empty = 0x44B7FF + option_double = 0xFF6DEF + option_golden = 0xFFD65C + option_baddy = 0x9B3FB5 + option_fire_red = 0xFF0000 + option_maroon = 0x800000 + option_salmon = 0xFF3A65 + option_orange = 0xD86E0A + option_lime_green = 0x8DF920 + option_bright_green = 0x0DAF05 + option_forest_green = 0x132818 + option_royal_blue = 0x0036BF + option_brown = 0xB78726 + option_black = 0x000000 + option_white = 0xFFFFFF + option_grey = 0x808080 + option_any_color = -1 + + @classmethod + def from_text(cls, text: str) -> Choice: + text = text.lower() + if text == "random": + choice_list = list(cls.name_lookup) + choice_list.remove(cls.option_any_color) + return cls(random.choice(choice_list)) + return super().from_text(text) + + +class MadelineOneDashHairColor(ColorChoice): + """ + What color Madeline's hair is when she has one dash + The `any_color` option will choose a fully random color + A custom color entry may be supplied as a 6-character RGB hex color code + e.g. F542C8 + """ + display_name = "Madeline One Dash Hair Color" + default = ColorChoice.option_strawberry + +class MadelineTwoDashHairColor(ColorChoice): + """ + What color Madeline's hair is when she has two dashes + The `any_color` option will choose a fully random color + A custom color entry may be supplied as a 6-character RGB hex color code + e.g. F542C8 + """ + display_name = "Madeline Two Dash Hair Color" + default = ColorChoice.option_double + +class MadelineNoDashHairColor(ColorChoice): + """ + What color Madeline's hair is when she has no dashes + The `any_color` option will choose a fully random color + A custom color entry may be supplied as a 6-character RGB hex color code + e.g. F542C8 + """ + display_name = "Madeline No Dash Hair Color" + default = ColorChoice.option_empty + +class MadelineFeatherHairColor(ColorChoice): + """ + What color Madeline's hair is when she has a feather + The `any_color` option will choose a fully random color + A custom color entry may be supplied as a 6-character RGB hex color code + e.g. F542C8 + """ + display_name = "Madeline Feather Hair Color" + default = ColorChoice.option_golden + + + +celeste_option_groups = [ + OptionGroup("Goal Options", [ + GoalArea, + LockGoalArea, + GoalAreaCheckpointsanity, + TotalStrawberries, + StrawberriesRequiredPercentage, + ]), + OptionGroup("Location Options", [ + Checkpointsanity, + Binosanity, + Keysanity, + Gemsanity, + Carsanity, + Roomsanity, + IncludeGoldens, + IncludeCore, + IncludeFarewell, + IncludeBSides, + IncludeCSides, + ]), + OptionGroup("Junk and Traps", [ + JunkFillPercentage, + TrapFillPercentage, + TrapExpirationAction, + TrapExpirationAmount, + BaldTrapWeight, + LiteratureTrapWeight, + StunTrapWeight, + InvisibleTrapWeight, + FastTrapWeight, + SlowTrapWeight, + IceTrapWeight, + ReverseTrapWeight, + ScreenFlipTrapWeight, + LaughterTrapWeight, + HiccupTrapWeight, + ZoomTrapWeight, + ]), + OptionGroup("Aesthetic Options", [ + MusicShuffle, + RequireCassettes, + MadelineHairLength, + MadelineOneDashHairColor, + MadelineTwoDashHairColor, + MadelineNoDashHairColor, + MadelineFeatherHairColor, + ]), +] + + +def resolve_options(world: World): + # One Dash Hair + if isinstance(world.options.madeline_one_dash_hair_color.value, str): + try: + world.madeline_one_dash_hair_color = int(world.options.madeline_one_dash_hair_color.value.strip("#")[:6], 16) + except ValueError: + raise OptionError(f"Invalid input for option `madeline_one_dash_hair_color`:" + f"{world.options.madeline_one_dash_hair_color.value} for " + f"{world.player_name}") + elif world.options.madeline_one_dash_hair_color.value == ColorChoice.option_any_color: + world.madeline_one_dash_hair_color = world.random.randint(0, 0xFFFFFF) + else: + world.madeline_one_dash_hair_color = world.options.madeline_one_dash_hair_color.value + + # Two Dash Hair + if isinstance(world.options.madeline_two_dash_hair_color.value, str): + try: + world.madeline_two_dash_hair_color = int(world.options.madeline_two_dash_hair_color.value.strip("#")[:6], 16) + except ValueError: + raise OptionError(f"Invalid input for option `madeline_two_dash_hair_color`:" + f"{world.options.madeline_two_dash_hair_color.value} for " + f"{world.player_name}") + elif world.options.madeline_two_dash_hair_color.value == ColorChoice.option_any_color: + world.madeline_two_dash_hair_color = world.random.randint(0, 0xFFFFFF) + else: + world.madeline_two_dash_hair_color = world.options.madeline_two_dash_hair_color.value + + # No Dash Hair + if isinstance(world.options.madeline_no_dash_hair_color.value, str): + try: + world.madeline_no_dash_hair_color = int(world.options.madeline_no_dash_hair_color.value.strip("#")[:6], 16) + except ValueError: + raise OptionError(f"Invalid input for option `madeline_no_dash_hair_color`:" + f"{world.options.madeline_no_dash_hair_color.value} for " + f"{world.player_name}") + elif world.options.madeline_no_dash_hair_color.value == ColorChoice.option_any_color: + world.madeline_no_dash_hair_color = world.random.randint(0, 0xFFFFFF) + else: + world.madeline_no_dash_hair_color = world.options.madeline_no_dash_hair_color.value + + # Feather Hair + if isinstance(world.options.madeline_feather_hair_color.value, str): + try: + world.madeline_feather_hair_color = int(world.options.madeline_feather_hair_color.value.strip("#")[:6], 16) + except ValueError: + raise OptionError(f"Invalid input for option `madeline_feather_hair_color`:" + f"{world.options.madeline_feather_hair_color.value} for " + f"{world.player_name}") + elif world.options.madeline_feather_hair_color.value == ColorChoice.option_any_color: + world.madeline_feather_hair_color = world.random.randint(0, 0xFFFFFF) + else: + world.madeline_feather_hair_color = world.options.madeline_feather_hair_color.value + + +@dataclass +class CelesteOptions(PerGameCommonOptions): + death_link: DeathLink + death_link_amnesty: DeathLinkAmnesty + trap_link: TrapLink + + goal_area: GoalArea + lock_goal_area: LockGoalArea + goal_area_checkpointsanity: GoalAreaCheckpointsanity + total_strawberries: TotalStrawberries + strawberries_required_percentage: StrawberriesRequiredPercentage + + junk_fill_percentage: JunkFillPercentage + trap_fill_percentage: TrapFillPercentage + trap_expiration_action: TrapExpirationAction + trap_expiration_amount: TrapExpirationAmount + bald_trap_weight: BaldTrapWeight + literature_trap_weight: LiteratureTrapWeight + stun_trap_weight: StunTrapWeight + invisible_trap_weight: InvisibleTrapWeight + fast_trap_weight: FastTrapWeight + slow_trap_weight: SlowTrapWeight + ice_trap_weight: IceTrapWeight + reverse_trap_weight: ReverseTrapWeight + screen_flip_trap_weight: ScreenFlipTrapWeight + laughter_trap_weight: LaughterTrapWeight + hiccup_trap_weight: HiccupTrapWeight + zoom_trap_weight: ZoomTrapWeight + + checkpointsanity: Checkpointsanity + binosanity: Binosanity + keysanity: Keysanity + gemsanity: Gemsanity + carsanity: Carsanity + roomsanity: Roomsanity + include_goldens: IncludeGoldens + include_core: IncludeCore + include_farewell: IncludeFarewell + include_b_sides: IncludeBSides + include_c_sides: IncludeCSides + + music_shuffle: MusicShuffle + require_cassettes: RequireCassettes + + madeline_hair_length: MadelineHairLength + madeline_one_dash_hair_color: MadelineOneDashHairColor + madeline_two_dash_hair_color: MadelineTwoDashHairColor + madeline_no_dash_hair_color: MadelineNoDashHairColor + madeline_feather_hair_color: MadelineFeatherHairColor diff --git a/worlds/celeste_open_world/__init__.py b/worlds/celeste_open_world/__init__.py new file mode 100644 index 0000000000..c0661b5593 --- /dev/null +++ b/worlds/celeste_open_world/__init__.py @@ -0,0 +1,361 @@ +from copy import deepcopy +import math +from typing import TextIO + +from BaseClasses import ItemClassification, Location, MultiWorld, Region, Tutorial +from Utils import visualize_regions +from worlds.AutoWorld import WebWorld, World + +from .Items import CelesteItem, generate_item_table, generate_item_data_table, generate_item_groups, level_item_lists, level_cassette_items,\ + cassette_item_data_table, crystal_heart_item_data_table, trap_item_data_table +from .Locations import CelesteLocation, location_data_table, generate_location_groups, checkpoint_location_data_table, location_id_offsets +from .Names import ItemName +from .Options import CelesteOptions, celeste_option_groups, resolve_options +from .Levels import Level, LocationType, load_logic_data, goal_area_option_to_name, goal_area_option_to_display_name, goal_area_to_location_name + + +class CelesteOpenWebWorld(WebWorld): + theme = "ice" + + setup_en = Tutorial( + tutorial_name="Start Guide", + description="A guide to playing Celeste (Open World) in Archipelago.", + language="English", + file_name="guide_en.md", + link="guide/en", + authors=["PoryGone"] + ) + + tutorials = [setup_en] + + option_groups = celeste_option_groups + + +class CelesteOpenWorld(World): + """ + Celeste (Open World) is a randomizer for the original Celeste. In this acclaimed platformer created by ExOK Games, you control Madeline as she attempts to climb the titular mountain, meeting friends and obstacles along the way. Progression is found in unlocking the ability to interact with various objects in the areas, such as springs, traffic blocks, feathers, and many more. Please be safe on the climb. + """ + + # Class Data + game = "Celeste (Open World)" + web = CelesteOpenWebWorld() + options_dataclass = CelesteOptions + options: CelesteOptions + + apworld_version = 10005 + + level_data: dict[str, Level] = load_logic_data() + + location_name_to_id: dict[str, int] = location_data_table + location_name_groups: dict[str, list[str]] = generate_location_groups() + item_name_to_id: dict[str, int] = generate_item_table() + item_name_groups: dict[str, list[str]] = generate_item_groups() + + + # Instance Data + madeline_one_dash_hair_color: int + madeline_two_dash_hair_color: int + madeline_no_dash_hair_color: int + madeline_feather_hair_color: int + + active_levels: set[str] + active_items: set[str] + + + def generate_early(self) -> None: + if not self.player_name.isascii(): + raise RuntimeError(f"Invalid player_name {self.player_name} for game {self.game}. Name must be ascii.") + + resolve_options(self) + + self.goal_area: str = goal_area_option_to_name[self.options.goal_area.value] + + self.active_levels = {"0a", "1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a"} + if self.options.include_core: + self.active_levels.add("9a") + if self.options.include_farewell >= 1: + self.active_levels.add("10a") + if self.options.include_farewell == 2: + self.active_levels.add("10b") + if self.options.include_b_sides: + self.active_levels.update({"1b", "2b", "3b", "4b", "5b", "6b", "7b"}) + if self.options.include_core: + self.active_levels.add("9b") + if self.options.include_c_sides: + self.active_levels.update({"1c", "2c", "3c", "4c", "5c", "6c", "7c"}) + if self.options.include_core: + self.active_levels.add("9c") + + self.active_levels.add(self.goal_area) + if self.goal_area == "10c": + self.active_levels.add("10a") + self.active_levels.add("10b") + elif self.goal_area == "10b": + self.active_levels.add("10a") + + self.active_items = set() + for level in self.active_levels: + self.active_items.update(level_item_lists[level]) + + + def create_regions(self) -> None: + from .Locations import create_regions_and_locations + + create_regions_and_locations(self) + + + def create_item(self, name: str, force_useful: bool = False) -> CelesteItem: + item_data_table = generate_item_data_table() + + if name == ItemName.strawberry and force_useful: + return CelesteItem(name, ItemClassification.useful, item_data_table[name].code, self.player) + elif name in item_data_table: + return CelesteItem(name, item_data_table[name].type, item_data_table[name].code, self.player) + else: + return CelesteItem(name, ItemClassification.progression, None, self.player) + + def create_items(self) -> None: + item_pool: list[CelesteItem] = [] + + location_count: int = len(self.get_locations()) + goal_area_location_count: int = sum(goal_area_option_to_display_name[self.options.goal_area] in loc.name for loc in self.get_locations()) + + # Goal Items + goal_item_loc: Location = self.get_location(goal_area_to_location_name[self.goal_area]) + goal_item_loc.place_locked_item(self.create_item(ItemName.house_keys)) + location_count -= 1 + + epilogue_region: Region = self.get_region(self.epilogue_start_region) + epilogue_region.add_locations({ItemName.victory: None }, CelesteLocation) + victory_loc: Location = self.get_location(ItemName.victory) + victory_loc.place_locked_item(self.create_item(ItemName.victory)) + + # Checkpoints + for item_name in self.active_checkpoint_names: + if self.options.checkpointsanity: + if not self.options.goal_area_checkpointsanity and goal_area_option_to_display_name[self.options.goal_area] in item_name: + checkpoint_loc: Location = self.get_location(item_name) + checkpoint_loc.place_locked_item(self.create_item(item_name)) + location_count -= 1 + else: + item_pool.append(self.create_item(item_name)) + else: + checkpoint_loc: Location = self.get_location(item_name) + checkpoint_loc.place_locked_item(self.create_item(item_name)) + location_count -= 1 + + # Keys + if self.options.keysanity: + item_pool += [self.create_item(item_name) for item_name in self.active_key_names] + else: + for item_name in self.active_key_names: + key_loc: Location = self.get_location(item_name) + key_loc.place_locked_item(self.create_item(item_name)) + location_count -= 1 + + # Summit Gems + if self.options.gemsanity: + item_pool += [self.create_item(item_name) for item_name in self.active_gem_names] + else: + for item_name in self.active_gem_names: + gem_loc: Location = self.get_location(item_name) + gem_loc.place_locked_item(self.create_item(item_name)) + location_count -= 1 + + # Clutter Events + for item_name in self.active_clutter_names: + clutter_loc: Location = self.get_location(item_name) + clutter_loc.place_locked_item(self.create_item(item_name)) + location_count -= 1 + + # Interactables + item_pool += [self.create_item(item_name) for item_name in sorted(self.active_items)] + + # Strawberries + real_total_strawberries: int = min(self.options.total_strawberries.value, location_count - goal_area_location_count - len(item_pool)) + self.strawberries_required = int(real_total_strawberries * (self.options.strawberries_required_percentage / 100)) + + menu_region = self.get_region("Menu") + if getattr(self, "goal_start_region", None): + menu_region.add_exits([self.goal_start_region], {self.goal_start_region: lambda state: state.has(ItemName.strawberry, self.player, self.strawberries_required)}) + if getattr(self, "goal_checkpoint_names", None): + for region_name, location_name in self.goal_checkpoint_names.items(): + checkpoint_rule = lambda state, location_name=location_name: state.has(location_name, self.player) and state.has(ItemName.strawberry, self.player, self.strawberries_required) + menu_region.add_exits([region_name], {region_name: checkpoint_rule}) + + menu_region.add_exits([self.epilogue_start_region], {self.epilogue_start_region: lambda state: (state.has(ItemName.strawberry, self.player, self.strawberries_required) and state.has(ItemName.house_keys, self.player))}) + + item_pool += [self.create_item(ItemName.strawberry) for _ in range(self.strawberries_required)] + + # Filler and Traps + non_required_strawberries = (real_total_strawberries - self.strawberries_required) + replacement_filler_count = math.floor(non_required_strawberries * (self.options.junk_fill_percentage.value / 100.0)) + remaining_extra_strawberries = non_required_strawberries - replacement_filler_count + item_pool += [self.create_item(ItemName.strawberry, True) for _ in range(remaining_extra_strawberries)] + + trap_weights = [] + trap_weights += ([ItemName.bald_trap] * self.options.bald_trap_weight.value) + trap_weights += ([ItemName.literature_trap] * self.options.literature_trap_weight.value) + trap_weights += ([ItemName.stun_trap] * self.options.stun_trap_weight.value) + trap_weights += ([ItemName.invisible_trap] * self.options.invisible_trap_weight.value) + trap_weights += ([ItemName.fast_trap] * self.options.fast_trap_weight.value) + trap_weights += ([ItemName.slow_trap] * self.options.slow_trap_weight.value) + trap_weights += ([ItemName.ice_trap] * self.options.ice_trap_weight.value) + trap_weights += ([ItemName.reverse_trap] * self.options.reverse_trap_weight.value) + trap_weights += ([ItemName.screen_flip_trap] * self.options.screen_flip_trap_weight.value) + trap_weights += ([ItemName.laughter_trap] * self.options.laughter_trap_weight.value) + trap_weights += ([ItemName.hiccup_trap] * self.options.hiccup_trap_weight.value) + trap_weights += ([ItemName.zoom_trap] * self.options.zoom_trap_weight.value) + + total_filler_count: int = (location_count - len(item_pool)) + + # Cassettes + if self.options.require_cassettes: + shuffled_active_levels = sorted(self.active_levels) + self.random.shuffle(shuffled_active_levels) + for level_name in shuffled_active_levels: + if level_name == "10b" or level_name == "10c": + continue + if level_name not in self.multiworld.precollected_items[self.player]: + if total_filler_count > 0: + item_pool.append(self.create_item(level_cassette_items[level_name])) + total_filler_count -= 1 + else: + self.multiworld.push_precollected(self.create_item(level_cassette_items[level_name])) + + # Crystal Hearts + for name in crystal_heart_item_data_table.keys(): + if total_filler_count > 0: + if name not in self.multiworld.precollected_items[self.player]: + item_pool.append(self.create_item(name)) + total_filler_count -= 1 + + trap_count = 0 if (len(trap_weights) == 0) else math.ceil(total_filler_count * (self.options.trap_fill_percentage.value / 100.0)) + total_filler_count -= trap_count + + item_pool += [self.create_item(ItemName.raspberry) for _ in range(total_filler_count)] + + trap_pool = [] + for i in range(trap_count): + trap_item = self.random.choice(trap_weights) + trap_pool.append(self.create_item(trap_item)) + + item_pool += trap_pool + + self.multiworld.itempool += item_pool + + def get_filler_item_name(self) -> str: + return ItemName.raspberry + + + def set_rules(self) -> None: + self.multiworld.completion_condition[self.player] = lambda state: state.has(ItemName.victory, self.player) + + + def fill_slot_data(self): + return { + "apworld_version": self.apworld_version, + "min_mod_version": 10000, + + "death_link": self.options.death_link.value, + "death_link_amnesty": self.options.death_link_amnesty.value, + "trap_link": self.options.trap_link.value, + + "active_levels": self.active_levels, + "goal_area": self.goal_area, + "lock_goal_area": self.options.lock_goal_area.value, + "strawberries_required": self.strawberries_required, + + "checkpointsanity": self.options.checkpointsanity.value, + "binosanity": self.options.binosanity.value, + "keysanity": self.options.keysanity.value, + "gemsanity": self.options.gemsanity.value, + "carsanity": self.options.carsanity.value, + "roomsanity": self.options.roomsanity.value, + "include_goldens": self.options.include_goldens.value, + + "include_core": self.options.include_core.value, + "include_farewell": self.options.include_farewell.value, + "include_b_sides": self.options.include_b_sides.value, + "include_c_sides": self.options.include_c_sides.value, + + "trap_expiration_action": self.options.trap_expiration_action.value, + "trap_expiration_amount": self.options.trap_expiration_amount.value, + "active_traps": self.output_active_traps(), + + "madeline_hair_length": self.options.madeline_hair_length.value, + "madeline_one_dash_hair_color": self.madeline_one_dash_hair_color, + "madeline_two_dash_hair_color": self.madeline_two_dash_hair_color, + "madeline_no_dash_hair_color": self.madeline_no_dash_hair_color, + "madeline_feather_hair_color": self.madeline_feather_hair_color, + + "music_shuffle": self.options.music_shuffle.value, + "music_map": self.generate_music_data(), + "require_cassettes": self.options.require_cassettes.value, + "chosen_poem": self.random.randint(0, 119), + } + + @classmethod + def stage_write_spoiler_header(cls, multiworld: MultiWorld, spoiler_handle: TextIO): + major: int = cls.apworld_version // 10000 + minor: int = (cls.apworld_version % 10000) // 100 + bugfix: int = (cls.apworld_version % 100) + spoiler_handle.write(f"\nCeleste (Open World) APWorld v{major}.{minor}.{bugfix}\n") + + def output_active_traps(self) -> dict[int, int]: + trap_data = {} + + trap_data[0x20] = self.options.bald_trap_weight.value + trap_data[0x21] = self.options.literature_trap_weight.value + trap_data[0x22] = self.options.stun_trap_weight.value + trap_data[0x23] = self.options.invisible_trap_weight.value + trap_data[0x24] = self.options.fast_trap_weight.value + trap_data[0x25] = self.options.slow_trap_weight.value + trap_data[0x26] = self.options.ice_trap_weight.value + trap_data[0x28] = self.options.reverse_trap_weight.value + trap_data[0x29] = self.options.screen_flip_trap_weight.value + trap_data[0x2A] = self.options.laughter_trap_weight.value + trap_data[0x2B] = self.options.hiccup_trap_weight.value + trap_data[0x2C] = self.options.zoom_trap_weight.value + + return trap_data + + def generate_music_data(self) -> dict[int, int]: + if self.options.music_shuffle == "consistent": + musiclist_o = list(range(0, 48)) + musiclist_s = musiclist_o.copy() + self.random.shuffle(musiclist_s) + + return dict(zip(musiclist_o, musiclist_s)) + elif self.options.music_shuffle == "singularity": + musiclist_o = list(range(0, 48)) + musiclist_s = [self.random.choice(musiclist_o)] * len(musiclist_o) + + return dict(zip(musiclist_o, musiclist_s)) + else: + musiclist_o = list(range(0, 48)) + musiclist_s = musiclist_o.copy() + + return dict(zip(musiclist_o, musiclist_s)) + + + # Useful Debugging tools, kept around for later. + #@classmethod + #def stage_assert_generate(cls, _multiworld: MultiWorld) -> None: + # with open("./worlds/celeste_open_world/data/IDs.txt", "w") as f: + # print("Items:", file=f) + # for name in sorted(CelesteOpenWorld.item_name_to_id, key=CelesteOpenWorld.item_name_to_id.get): + # id = CelesteOpenWorld.item_name_to_id[name] + # print(f"{{ 0x{id:X}, \"{name}\" }},", file=f) + # print("\nLocations:", file=f) + # for name in sorted(CelesteOpenWorld.location_name_to_id, key=CelesteOpenWorld.location_name_to_id.get): + # id = CelesteOpenWorld.location_name_to_id[name] + # print(f"{{ 0x{id:X}, \"{name}\" }},", file=f) + # print("\nLocations 2:", file=f) + # for name in sorted(CelesteOpenWorld.location_name_to_id, key=CelesteOpenWorld.location_name_to_id.get): + # id = CelesteOpenWorld.location_name_to_id[name] + # print(f"{{ \"{name}\", 0x{id:X} }},", file=f) + # + #def generate_output(self, output_directory: str): + # visualize_regions(self.get_region("Menu"), f"Player{self.player}.puml", show_entrance_names=False, + # regions_to_highlight=self.multiworld.get_all_state(self.player).reachable_regions[self.player]) diff --git a/worlds/celeste_open_world/data/CelesteLevelData.json b/worlds/celeste_open_world/data/CelesteLevelData.json new file mode 100644 index 0000000000..9d63696045 --- /dev/null +++ b/worlds/celeste_open_world/data/CelesteLevelData.json @@ -0,0 +1,41232 @@ +{ + "levels": [ + { + "name": "0a", + "display_name": "Prologue", + "rooms": [ + { + "name": "-1", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "car", + "display_name": "Car", + "type": "car", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "0", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "0b", + "regions": [ + { + "name": "south", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "1", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "2", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "3", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "-1", + "source_door": "east", + "dest_room": "0", + "dest_door": "west" + }, + { + "source_room": "0", + "source_door": "north", + "dest_room": "0b", + "dest_door": "south" + }, + { + "source_room": "0", + "source_door": "east", + "dest_room": "1", + "dest_door": "west" + }, + { + "source_room": "1", + "source_door": "east", + "dest_room": "2", + "dest_door": "west" + }, + { + "source_room": "2", + "source_door": "east", + "dest_room": "3", + "dest_door": "west" + } + ] + }, + { + "name": "1a", + "display_name": "Forsaken City A", + "rooms": [ + { + "name": "1", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "main" + }, + { + "name": "2", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "3", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "4", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "3b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "5", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "traffic_blocks" ] ] + }, + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + }, + { + "dest": "bottom", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "bottom", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + }, + { + "dest": "top", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": true, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "5z", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "5a", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Crossing", + "checkpoint_region": "south-west" + }, + { + "name": "6z", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6zb", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "7zb", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6b", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "traffic_blocks" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s0", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s1", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + }, + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6c", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "springs" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": true, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "7", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "7z", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "8z", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "8zb", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "8", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "7a", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "9z", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "8b", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "9", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "9b", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + }, + { + "dest": "north-west", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Chasm", + "checkpoint_region": "west" + }, + { + "name": "9c", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10", + "regions": [ + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10z", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10zb", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "south-east", + "connections": [ + { + "dest": "north", + "rule": [ [ "traffic_blocks", "springs" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [ [ "traffic_blocks" ] ] + }, + { + "dest": "west", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11z", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10a", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12z", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12a", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "traffic_blocks", "dash_refills" ] ] + }, + { + "name": "winged_golden", + "display_name": "Winged Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "1", + "source_door": "east", + "dest_room": "2", + "dest_door": "west" + }, + { + "source_room": "2", + "source_door": "east", + "dest_room": "3", + "dest_door": "west" + }, + { + "source_room": "3", + "source_door": "east", + "dest_room": "4", + "dest_door": "west" + }, + { + "source_room": "4", + "source_door": "east", + "dest_room": "3b", + "dest_door": "west" + }, + { + "source_room": "3b", + "source_door": "top", + "dest_room": "5", + "dest_door": "bottom" + }, + { + "source_room": "5", + "source_door": "west", + "dest_room": "5z", + "dest_door": "east" + }, + { + "source_room": "5", + "source_door": "south-east", + "dest_room": "5a", + "dest_door": "west" + }, + { + "source_room": "5", + "source_door": "top", + "dest_room": "6", + "dest_door": "south-west" + }, + { + "source_room": "6", + "source_door": "west", + "dest_room": "6z", + "dest_door": "east" + }, + { + "source_room": "6", + "source_door": "east", + "dest_room": "6a", + "dest_door": "west" + }, + { + "source_room": "6z", + "source_door": "north-west", + "dest_room": "7zb", + "dest_door": "east" + }, + { + "source_room": "6z", + "source_door": "west", + "dest_room": "6zb", + "dest_door": "east" + }, + { + "source_room": "7zb", + "source_door": "west", + "dest_room": "6zb", + "dest_door": "north-west" + }, + { + "source_room": "6a", + "source_door": "east", + "dest_room": "6b", + "dest_door": "south-west" + }, + { + "source_room": "6b", + "source_door": "north-west", + "dest_room": "s0", + "dest_door": "east" + }, + { + "source_room": "6b", + "source_door": "north-east", + "dest_room": "6c", + "dest_door": "south-west" + }, + { + "source_room": "s0", + "source_door": "west", + "dest_room": "s1", + "dest_door": "east" + }, + { + "source_room": "6c", + "source_door": "north-west", + "dest_room": "7z", + "dest_door": "bottom" + }, + { + "source_room": "6c", + "source_door": "north-east", + "dest_room": "7", + "dest_door": "west" + }, + { + "source_room": "7", + "source_door": "east", + "dest_room": "8", + "dest_door": "south-west" + }, + { + "source_room": "7z", + "source_door": "top", + "dest_room": "8z", + "dest_door": "bottom" + }, + { + "source_room": "8z", + "source_door": "top", + "dest_room": "8zb", + "dest_door": "west" + }, + { + "source_room": "8zb", + "source_door": "east", + "dest_room": "8", + "dest_door": "west" + }, + { + "source_room": "8", + "source_door": "south", + "dest_room": "7a", + "dest_door": "west" + }, + { + "source_room": "8", + "source_door": "north", + "dest_room": "9z", + "dest_door": "east" + }, + { + "source_room": "8", + "source_door": "north-east", + "dest_room": "8b", + "dest_door": "west" + }, + { + "source_room": "7a", + "source_door": "east", + "dest_room": "8", + "dest_door": "south-east" + }, + { + "source_room": "8b", + "source_door": "east", + "dest_room": "9", + "dest_door": "west" + }, + { + "source_room": "9", + "source_door": "east", + "dest_room": "9b", + "dest_door": "west" + }, + { + "source_room": "9b", + "source_door": "north-west", + "dest_room": "10", + "dest_door": "south-east" + }, + { + "source_room": "9b", + "source_door": "north-east", + "dest_room": "10a", + "dest_door": "bottom" + }, + { + "source_room": "9b", + "source_door": "east", + "dest_room": "9c", + "dest_door": "west" + }, + { + "source_room": "10", + "source_door": "south-west", + "dest_room": "10z", + "dest_door": "east" + }, + { + "source_room": "10", + "source_door": "north-west", + "dest_room": "11", + "dest_door": "south-west" + }, + { + "source_room": "10z", + "source_door": "west", + "dest_room": "10zb", + "dest_door": "east" + }, + { + "source_room": "11", + "source_door": "south", + "dest_room": "10", + "dest_door": "north-east" + }, + { + "source_room": "11", + "source_door": "west", + "dest_room": "11z", + "dest_door": "east" + }, + { + "source_room": "10a", + "source_door": "top", + "dest_room": "11", + "dest_door": "south-east" + }, + { + "source_room": "11", + "source_door": "north", + "dest_room": "12", + "dest_door": "south-west" + }, + { + "source_room": "12", + "source_door": "north-west", + "dest_room": "12z", + "dest_door": "east" + }, + { + "source_room": "12", + "source_door": "east", + "dest_room": "12a", + "dest_door": "bottom" + }, + { + "source_room": "12a", + "source_door": "top", + "dest_room": "end", + "dest_door": "south" + } + ] + }, + { + "name": "1b", + "display_name": "Forsaken City B", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Contraption", + "checkpoint_region": "west" + }, + { + "name": "05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "07", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Scrap Pit", + "checkpoint_region": "west" + }, + { + "name": "08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "traffic_blocks", "dash_refills", "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + }, + { + "source_room": "02", + "source_door": "east", + "dest_room": "02b", + "dest_door": "west" + }, + { + "source_room": "02b", + "source_door": "east", + "dest_room": "03", + "dest_door": "west" + }, + { + "source_room": "03", + "source_door": "east", + "dest_room": "04", + "dest_door": "west" + }, + { + "source_room": "04", + "source_door": "east", + "dest_room": "05", + "dest_door": "west" + }, + { + "source_room": "05", + "source_door": "east", + "dest_room": "05b", + "dest_door": "west" + }, + { + "source_room": "05b", + "source_door": "east", + "dest_room": "06", + "dest_door": "west" + }, + { + "source_room": "06", + "source_door": "east", + "dest_room": "07", + "dest_door": "bottom" + }, + { + "source_room": "07", + "source_door": "top", + "dest_room": "08", + "dest_door": "west" + }, + { + "source_room": "08", + "source_door": "east", + "dest_room": "08b", + "dest_door": "west" + }, + { + "source_room": "08b", + "source_door": "east", + "dest_room": "09", + "dest_door": "west" + }, + { + "source_room": "09", + "source_door": "east", + "dest_room": "10", + "dest_door": "west" + }, + { + "source_room": "10", + "source_door": "east", + "dest_room": "11", + "dest_door": "bottom" + }, + { + "source_room": "11", + "source_door": "top", + "dest_room": "end", + "dest_door": "west" + } + ] + }, + { + "name": "1c", + "display_name": "Forsaken City C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "coins", "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "traffic_blocks", "dash_refills", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "2a", + "display_name": "Old Site A", + "rooms": [ + { + "name": "start", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + }, + { + "dest": "top", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "main" + }, + { + "name": "s0", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s1", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s2", + "regions": [ + { + "name": "bottom", + "connections": [], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "0", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "north-west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "1", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d0", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north", + "rule": [] + }, + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "south-east", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d7", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d8", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d3", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d2", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d9", + "regions": [ + { + "name": "north-west", + "connections": [], + "locations": [ + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "dream_blocks", "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d1", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks", "strawberry_seeds" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d6", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d4", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks", "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d5", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "3x", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "3", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Intervention", + "checkpoint_region": "bottom" + }, + { + "name": "4", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "5", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "6", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "7", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "8", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "9", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "coins" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "9b", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks", "dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "2", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12c", + "regions": [ + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12d", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "north", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "phone", + "rule": [] + } + ] + }, + { + "name": "phone", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "phone", + "direction": "special", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_0", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + }, + { + "dest": "top", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "main", + "direction": "special", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_s0", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_s1", + "regions": [ + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_1", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_2", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_3", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Awake", + "checkpoint_region": "west" + }, + { + "name": "end_4", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_3b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "springs" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_3cb", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_3c", + "regions": [ + { + "name": "bottom", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_5", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end_6", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "dream_blocks", "coins", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "start", + "source_door": "top", + "dest_room": "s0", + "dest_door": "bottom" + }, + { + "source_room": "start", + "source_door": "east", + "dest_room": "0", + "dest_door": "south-west" + }, + { + "source_room": "s0", + "source_door": "top", + "dest_room": "s1", + "dest_door": "bottom" + }, + { + "source_room": "s1", + "source_door": "top", + "dest_room": "s2", + "dest_door": "bottom" + }, + { + "source_room": "0", + "source_door": "north-west", + "dest_room": "3x", + "dest_door": "bottom" + }, + { + "source_room": "0", + "source_door": "north-east", + "dest_room": "1", + "dest_door": "north-west" + }, + { + "source_room": "0", + "source_door": "south-east", + "dest_room": "1", + "dest_door": "south-west" + }, + { + "source_room": "1", + "source_door": "south", + "dest_room": "d0", + "dest_door": "north" + }, + { + "source_room": "1", + "source_door": "south-east", + "dest_room": "2", + "dest_door": "south-west" + }, + { + "source_room": "d0", + "source_door": "north-west", + "dest_room": "d1", + "dest_door": "north-east" + }, + { + "source_room": "d0", + "source_door": "west", + "dest_room": "d1", + "dest_door": "south-east" + }, + { + "source_room": "d0", + "source_door": "south-west", + "dest_room": "d6", + "dest_door": "east" + }, + { + "source_room": "d0", + "source_door": "south", + "dest_room": "d9", + "dest_door": "north-west" + }, + { + "source_room": "d0", + "source_door": "south-east", + "dest_room": "d7", + "dest_door": "west" + }, + { + "source_room": "d0", + "source_door": "east", + "dest_room": "d2", + "dest_door": "west" + }, + { + "source_room": "d0", + "source_door": "north-east", + "dest_room": "d4", + "dest_door": "west" + }, + { + "source_room": "d1", + "source_door": "south-west", + "dest_room": "d6", + "dest_door": "west" + }, + { + "source_room": "d7", + "source_door": "east", + "dest_room": "d8", + "dest_door": "west" + }, + { + "source_room": "d2", + "source_door": "east", + "dest_room": "d3", + "dest_door": "north" + }, + { + "source_room": "d4", + "source_door": "east", + "dest_room": "d5", + "dest_door": "west" + }, + { + "source_room": "d4", + "source_door": "south", + "dest_room": "d2", + "dest_door": "north-west" + }, + { + "source_room": "d8", + "source_door": "north-east", + "dest_room": "d3", + "dest_door": "west" + }, + { + "source_room": "d8", + "source_door": "south-east", + "dest_room": "d3", + "dest_door": "south" + }, + { + "source_room": "3x", + "source_door": "top", + "dest_room": "3", + "dest_door": "bottom" + }, + { + "source_room": "3", + "source_door": "top", + "dest_room": "4", + "dest_door": "bottom" + }, + { + "source_room": "4", + "source_door": "top", + "dest_room": "5", + "dest_door": "bottom" + }, + { + "source_room": "5", + "source_door": "top", + "dest_room": "6", + "dest_door": "bottom" + }, + { + "source_room": "6", + "source_door": "top", + "dest_room": "7", + "dest_door": "bottom" + }, + { + "source_room": "7", + "source_door": "top", + "dest_room": "8", + "dest_door": "bottom" + }, + { + "source_room": "8", + "source_door": "top", + "dest_room": "9", + "dest_door": "west" + }, + { + "source_room": "9", + "source_door": "north", + "dest_room": "9b", + "dest_door": "east" + }, + { + "source_room": "9", + "source_door": "south-east", + "dest_room": "10", + "dest_door": "top" + }, + { + "source_room": "9b", + "source_door": "west", + "dest_room": "9", + "dest_door": "north-west" + }, + { + "source_room": "10", + "source_door": "bottom", + "dest_room": "2", + "dest_door": "north-west" + }, + { + "source_room": "2", + "source_door": "south-east", + "dest_room": "11", + "dest_door": "west" + }, + { + "source_room": "11", + "source_door": "east", + "dest_room": "12b", + "dest_door": "west" + }, + { + "source_room": "12b", + "source_door": "north", + "dest_room": "12c", + "dest_door": "south" + }, + { + "source_room": "12b", + "source_door": "south", + "dest_room": "12d", + "dest_door": "north-west" + }, + { + "source_room": "12b", + "source_door": "east", + "dest_room": "12", + "dest_door": "west" + }, + { + "source_room": "12d", + "source_door": "north", + "dest_room": "12b", + "dest_door": "south-east" + }, + { + "source_room": "12", + "source_door": "east", + "dest_room": "13", + "dest_door": "west" + }, + { + "source_room": "13", + "source_door": "phone", + "dest_room": "end_0", + "dest_door": "main" + }, + { + "source_room": "end_0", + "source_door": "top", + "dest_room": "end_s0", + "dest_door": "bottom" + }, + { + "source_room": "end_0", + "source_door": "east", + "dest_room": "end_1", + "dest_door": "west" + }, + { + "source_room": "end_s0", + "source_door": "top", + "dest_room": "end_s1", + "dest_door": "bottom" + }, + { + "source_room": "end_1", + "source_door": "east", + "dest_room": "end_2", + "dest_door": "west" + }, + { + "source_room": "end_1", + "source_door": "north-east", + "dest_room": "end_2", + "dest_door": "north-west" + }, + { + "source_room": "end_2", + "source_door": "east", + "dest_room": "end_3", + "dest_door": "west" + }, + { + "source_room": "end_2", + "source_door": "north-east", + "dest_room": "end_3", + "dest_door": "north-west" + }, + { + "source_room": "end_3", + "source_door": "east", + "dest_room": "end_4", + "dest_door": "west" + }, + { + "source_room": "end_4", + "source_door": "east", + "dest_room": "end_3b", + "dest_door": "west" + }, + { + "source_room": "end_3b", + "source_door": "north", + "dest_room": "end_3cb", + "dest_door": "bottom" + }, + { + "source_room": "end_3b", + "source_door": "east", + "dest_room": "end_5", + "dest_door": "west" + }, + { + "source_room": "end_3cb", + "source_door": "top", + "dest_room": "end_3c", + "dest_door": "bottom" + }, + { + "source_room": "end_5", + "source_door": "east", + "dest_room": "end_6", + "dest_door": "west" + } + ] + }, + { + "name": "2b", + "display_name": "Old Site B", + "rooms": [ + { + "name": "start", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Combination Lock", + "checkpoint_region": "west" + }, + { + "name": "04", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "07", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Dream Altar", + "checkpoint_region": "west" + }, + { + "name": "08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "dream_blocks", "dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "blue_cassette_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "dream_blocks", "dash_refills", "coins", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "start", + "source_door": "east", + "dest_room": "00", + "dest_door": "west" + }, + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "01b", + "dest_door": "west" + }, + { + "source_room": "01b", + "source_door": "east", + "dest_room": "02b", + "dest_door": "west" + }, + { + "source_room": "02b", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + }, + { + "source_room": "02", + "source_door": "east", + "dest_room": "03", + "dest_door": "west" + }, + { + "source_room": "03", + "source_door": "east", + "dest_room": "04", + "dest_door": "bottom" + }, + { + "source_room": "04", + "source_door": "top", + "dest_room": "05", + "dest_door": "bottom" + }, + { + "source_room": "05", + "source_door": "top", + "dest_room": "06", + "dest_door": "west" + }, + { + "source_room": "06", + "source_door": "east", + "dest_room": "07", + "dest_door": "bottom" + }, + { + "source_room": "07", + "source_door": "top", + "dest_room": "08b", + "dest_door": "west" + }, + { + "source_room": "08b", + "source_door": "east", + "dest_room": "08", + "dest_door": "west" + }, + { + "source_room": "08", + "source_door": "east", + "dest_room": "09", + "dest_door": "west" + }, + { + "source_room": "09", + "source_door": "east", + "dest_room": "10", + "dest_door": "west" + }, + { + "source_room": "10", + "source_door": "east", + "dest_room": "11", + "dest_door": "bottom" + }, + { + "source_room": "11", + "source_door": "top", + "dest_room": "end", + "dest_door": "west" + } + ] + }, + { + "name": "2c", + "display_name": "Old Site C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "coins", "dream_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "dream_blocks", "dash_refills", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "3a", + "display_name": "Celestial Resort A", + "rooms": [ + { + "name": "s0", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "main" + }, + { + "name": "s1", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s2", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "s3", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "Front Door Key" ] ] + } + ], + "locations": [ + { + "name": "key_1", + "display_name": "Front Door Key", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "0x-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "00-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [ + [ "sinking_platforms" ], + [ "dash_refills" ] + ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + }, + { + "dest": "main", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + }, + { + "dest": "east", + "rule": [ [ "Hallway Key 1" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "hallway_key_1", + "display_name": "Hallway Key 1", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "far-east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "far-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "00-b", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "00-c", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "dash_refills" ] ] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "0x-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04-b", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "moving_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills", "moving_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "07-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "Hallway Key 2", "dash_refills" ] ] + }, + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "Hallway Key 2", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "07-b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ], + "locations": [ + { + "name": "key_2", + "display_name": "Hallway Key 2", + "type": "key", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06-c", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05-c", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08-c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "moving_platforms", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08-b", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "sinking_platforms", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "bottom", + "rule": [ + [ "brown_clutter" ], + [ "green_clutter" ], + [ "pink_clutter" ] + ] + } + ] + }, + { + "name": "bottom", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Huge Mess", + "checkpoint_region": "west" + }, + { + "name": "09-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [ [ "Huge Mess Key" ] ] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "Huge Mess Key" ] ] + }, + { + "dest": "south-west", + "rule": [ + [ "brown_clutter" ], + [ "green_clutter" ], + [ "pink_clutter" ] + ] + }, + { + "dest": "south", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east-right", + "rule": [] + }, + { + "dest": "north-east-top", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ], + "locations": [ + { + "name": "key_4", + "display_name": "Huge Mess Key", + "type": "key", + "rule": [ [ "brown_clutter", "green_clutter", "pink_clutter" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [ + [ "brown_clutter" ], + [ "green_clutter" ], + [ "pink_clutter" ] + ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east-right", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east-top", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east-right", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east-top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10-x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "west", + "rule": [ [ "brown_clutter" ] ] + } + ], + "locations": [ + { + "name": "brown_clutter", + "display_name": "Brown Clutter", + "type": "clutter", + "rule": [] + } + ] + }, + { + "name": "north-east-top", + "connections": [ + { + "dest": "north-east-right", + "rule": [] + } + ] + }, + { + "name": "north-east-right", + "connections": [ + { + "dest": "north-east-top", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-east-top", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-east-right", + "direction": "right", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "south", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-y", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12-y", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-z", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10-z", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10-y", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10-c", + "regions": [ + { + "name": "south-east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12-c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "top", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12-d", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10-d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [ [ "green_clutter" ] ] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "green_clutter", + "display_name": "Green Clutter", + "type": "clutter", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "pink_clutter" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [ [ "pink_clutter" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "13-b", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "13-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "south-west", + "rule": [ [ "pink_clutter" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [ [ "pink_clutter" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "13-x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12-x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "pink_clutter", + "display_name": "Pink Clutter", + "type": "clutter", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11-a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south-east-bottom", + "connections": [ + { + "dest": "south-east-right", + "rule": [ [ "pink_clutter" ] ] + } + ] + }, + { + "name": "south-east-right", + "connections": [ + { + "dest": "south-east-bottom", + "rule": [ [ "pink_clutter" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-east-bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east-right", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08-x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "09-d", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Elevator Shaft", + "checkpoint_region": "bottom" + }, + { + "name": "08-d", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06-d", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04-d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04-c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "Presidential Suite Key" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [ [ "Presidential Suite Key" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02-c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "key_5", + "display_name": "Presidential Suite Key", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "sinking_platforms" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03-b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01-c", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02-d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "00-d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "Presidential Suite", + "checkpoint_region": "east" + }, + { + "name": "roof00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "coins", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof06b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "roof07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + }, + { + "name": "main", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "Front Door Key", "Hallway Key 1", "Hallway Key 2", "Huge Mess Key", "Presidential Suite Key", "sinking_platforms", "dash_refills", "brown_clutter", "green_clutter", "pink_clutter", "coins", "moving_platforms", "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "s0", + "source_door": "east", + "dest_room": "s1", + "dest_door": "west" + }, + { + "source_room": "s1", + "source_door": "east", + "dest_room": "s2", + "dest_door": "west" + }, + { + "source_room": "s1", + "source_door": "north-east", + "dest_room": "s2", + "dest_door": "north-west" + }, + { + "source_room": "s2", + "source_door": "east", + "dest_room": "s3", + "dest_door": "west" + }, + { + "source_room": "s3", + "source_door": "east", + "dest_room": "0x-a", + "dest_door": "west" + }, + { + "source_room": "0x-a", + "source_door": "east", + "dest_room": "00-a", + "dest_door": "west" + }, + { + "source_room": "00-a", + "source_door": "east", + "dest_room": "02-a", + "dest_door": "west" + }, + { + "source_room": "02-a", + "source_door": "east", + "dest_room": "03-a", + "dest_door": "west" + }, + { + "source_room": "02-a", + "source_door": "top", + "dest_room": "02-b", + "dest_door": "east" + }, + { + "source_room": "02-b", + "source_door": "west", + "dest_room": "01-b", + "dest_door": "east" + }, + { + "source_room": "01-b", + "source_door": "north-west", + "dest_room": "00-b", + "dest_door": "east" + }, + { + "source_room": "01-b", + "source_door": "west", + "dest_room": "00-b", + "dest_door": "south-east" + }, + { + "source_room": "00-b", + "source_door": "south-west", + "dest_room": "0x-b", + "dest_door": "south-east" + }, + { + "source_room": "00-b", + "source_door": "north", + "dest_room": "00-c", + "dest_door": "south-east" + }, + { + "source_room": "00-b", + "source_door": "west", + "dest_room": "0x-b", + "dest_door": "north-east" + }, + { + "source_room": "00-c", + "source_door": "south-west", + "dest_room": "00-b", + "dest_door": "north-west" + }, + { + "source_room": "00-c", + "source_door": "north-east", + "dest_room": "01-c", + "dest_door": "west" + }, + { + "source_room": "0x-b", + "source_door": "west", + "dest_room": "s3", + "dest_door": "north" + }, + { + "source_room": "03-a", + "source_door": "top", + "dest_room": "04-b", + "dest_door": "east" + }, + { + "source_room": "03-a", + "source_door": "east", + "dest_room": "05-a", + "dest_door": "west" + }, + { + "source_room": "05-a", + "source_door": "east", + "dest_room": "06-a", + "dest_door": "west" + }, + { + "source_room": "06-a", + "source_door": "east", + "dest_room": "07-a", + "dest_door": "west" + }, + { + "source_room": "07-a", + "source_door": "top", + "dest_room": "07-b", + "dest_door": "bottom" + }, + { + "source_room": "07-a", + "source_door": "east", + "dest_room": "08-a", + "dest_door": "west" + }, + { + "source_room": "07-b", + "source_door": "west", + "dest_room": "06-b", + "dest_door": "east" + }, + { + "source_room": "06-b", + "source_door": "west", + "dest_room": "06-c", + "dest_door": "south-west" + }, + { + "source_room": "06-c", + "source_door": "north-west", + "dest_room": "05-c", + "dest_door": "east" + }, + { + "source_room": "06-c", + "source_door": "east", + "dest_room": "08-c", + "dest_door": "west" + }, + { + "source_room": "06-c", + "source_door": "south-east", + "dest_room": "07-b", + "dest_door": "top" + }, + { + "source_room": "08-c", + "source_door": "east", + "dest_room": "08-b", + "dest_door": "east" + }, + { + "source_room": "08-b", + "source_door": "west", + "dest_room": "07-b", + "dest_door": "east" + }, + { + "source_room": "08-a", + "source_door": "bottom", + "dest_room": "08-x", + "dest_door": "west" + }, + { + "source_room": "08-a", + "source_door": "east", + "dest_room": "09-b", + "dest_door": "west" + }, + { + "source_room": "09-b", + "source_door": "south-east", + "dest_room": "10-x", + "dest_door": "north-east-top" + }, + { + "source_room": "09-b", + "source_door": "north-west", + "dest_room": "09-d", + "dest_door": "bottom" + }, + { + "source_room": "09-b", + "source_door": "north-east-top", + "dest_room": "10-c", + "dest_door": "south-east" + }, + { + "source_room": "09-b", + "source_door": "east", + "dest_room": "11-a", + "dest_door": "west" + }, + { + "source_room": "09-b", + "source_door": "north-east-right", + "dest_room": "11-b", + "dest_door": "west" + }, + { + "source_room": "10-x", + "source_door": "north-east-right", + "dest_room": "11-x", + "dest_door": "west" + }, + { + "source_room": "11-x", + "source_door": "south", + "dest_room": "11-y", + "dest_door": "west" + }, + { + "source_room": "11-y", + "source_door": "east", + "dest_room": "12-y", + "dest_door": "west" + }, + { + "source_room": "11-y", + "source_door": "south", + "dest_room": "11-z", + "dest_door": "east" + }, + { + "source_room": "11-z", + "source_door": "west", + "dest_room": "10-z", + "dest_door": "bottom" + }, + { + "source_room": "10-z", + "source_door": "top", + "dest_room": "10-y", + "dest_door": "bottom" + }, + { + "source_room": "10-y", + "source_door": "top", + "dest_room": "10-x", + "dest_door": "south-east" + }, + { + "source_room": "10-x", + "source_door": "west", + "dest_room": "09-b", + "dest_door": "south" + }, + { + "source_room": "10-c", + "source_door": "north-east", + "dest_room": "11-c", + "dest_door": "west" + }, + { + "source_room": "10-c", + "source_door": "south-west", + "dest_room": "09-b", + "dest_door": "north" + }, + { + "source_room": "11-c", + "source_door": "east", + "dest_room": "12-c", + "dest_door": "west" + }, + { + "source_room": "11-c", + "source_door": "south-west", + "dest_room": "11-b", + "dest_door": "north-west" + }, + { + "source_room": "12-c", + "source_door": "top", + "dest_room": "12-d", + "dest_door": "bottom" + }, + { + "source_room": "12-d", + "source_door": "top", + "dest_room": "11-d", + "dest_door": "east" + }, + { + "source_room": "11-d", + "source_door": "west", + "dest_room": "10-d", + "dest_door": "east" + }, + { + "source_room": "10-d", + "source_door": "west", + "dest_room": "10-c", + "dest_door": "north-west" + }, + { + "source_room": "11-b", + "source_door": "north-east", + "dest_room": "11-c", + "dest_door": "south-east" + }, + { + "source_room": "11-b", + "source_door": "east", + "dest_room": "12-b", + "dest_door": "west" + }, + { + "source_room": "12-b", + "source_door": "east", + "dest_room": "13-b", + "dest_door": "top" + }, + { + "source_room": "13-b", + "source_door": "bottom", + "dest_room": "13-a", + "dest_door": "west" + }, + { + "source_room": "13-a", + "source_door": "east", + "dest_room": "13-x", + "dest_door": "east" + }, + { + "source_room": "13-x", + "source_door": "west", + "dest_room": "12-x", + "dest_door": "east" + }, + { + "source_room": "12-x", + "source_door": "north-east", + "dest_room": "11-a", + "dest_door": "south-east-bottom" + }, + { + "source_room": "12-x", + "source_door": "west", + "dest_room": "11-a", + "dest_door": "south" + }, + { + "source_room": "11-a", + "source_door": "south-east-right", + "dest_room": "13-a", + "dest_door": "south-west" + }, + { + "source_room": "08-x", + "source_door": "east", + "dest_room": "09-b", + "dest_door": "south-west" + }, + { + "source_room": "09-d", + "source_door": "top", + "dest_room": "08-d", + "dest_door": "east" + }, + { + "source_room": "08-d", + "source_door": "west", + "dest_room": "06-d", + "dest_door": "east" + }, + { + "source_room": "06-d", + "source_door": "west", + "dest_room": "04-d", + "dest_door": "east" + }, + { + "source_room": "04-d", + "source_door": "west", + "dest_room": "02-d", + "dest_door": "east" + }, + { + "source_room": "04-d", + "source_door": "south", + "dest_room": "04-c", + "dest_door": "east" + }, + { + "source_room": "04-c", + "source_door": "west", + "dest_room": "02-c", + "dest_door": "east" + }, + { + "source_room": "04-c", + "source_door": "north-west", + "dest_room": "04-d", + "dest_door": "south-west" + }, + { + "source_room": "02-c", + "source_door": "west", + "dest_room": "01-c", + "dest_door": "east" + }, + { + "source_room": "02-c", + "source_door": "south-east", + "dest_room": "03-b", + "dest_door": "north" + }, + { + "source_room": "03-b", + "source_door": "east", + "dest_room": "04-b", + "dest_door": "west" + }, + { + "source_room": "03-b", + "source_door": "west", + "dest_room": "02-b", + "dest_door": "far-east" + }, + { + "source_room": "02-d", + "source_door": "west", + "dest_room": "00-d", + "dest_door": "east" + }, + { + "source_room": "00-d", + "source_door": "west", + "dest_room": "roof00", + "dest_door": "west" + }, + { + "source_room": "roof00", + "source_door": "east", + "dest_room": "roof01", + "dest_door": "west" + }, + { + "source_room": "roof01", + "source_door": "east", + "dest_room": "roof02", + "dest_door": "west" + }, + { + "source_room": "roof02", + "source_door": "east", + "dest_room": "roof03", + "dest_door": "west" + }, + { + "source_room": "roof03", + "source_door": "east", + "dest_room": "roof04", + "dest_door": "west" + }, + { + "source_room": "roof04", + "source_door": "east", + "dest_room": "roof05", + "dest_door": "west" + }, + { + "source_room": "roof05", + "source_door": "east", + "dest_room": "roof06b", + "dest_door": "west" + }, + { + "source_room": "roof06b", + "source_door": "east", + "dest_room": "roof06", + "dest_door": "west" + }, + { + "source_room": "roof06", + "source_door": "east", + "dest_room": "roof07", + "dest_door": "west" + } + ] + }, + { + "name": "3b", + "display_name": "Celestial Resort B", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "back", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "moving_platforms", "coins", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "sinking_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Staff Quarters", + "checkpoint_region": "west" + }, + { + "name": "07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Library", + "checkpoint_region": "west" + }, + { + "name": "13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "14", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "15", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "16", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "Rooftop", + "checkpoint_region": "west" + }, + { + "name": "17", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills", "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "18", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "19", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "21", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "20", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills", "springs", "coins" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills", "springs", "coins", "moving_platforms", "sinking_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "00", + "source_door": "west", + "dest_room": "back", + "dest_door": "east" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + }, + { + "source_room": "02", + "source_door": "east", + "dest_room": "03", + "dest_door": "west" + }, + { + "source_room": "03", + "source_door": "east", + "dest_room": "04", + "dest_door": "west" + }, + { + "source_room": "04", + "source_door": "east", + "dest_room": "05", + "dest_door": "west" + }, + { + "source_room": "05", + "source_door": "east", + "dest_room": "06", + "dest_door": "west" + }, + { + "source_room": "06", + "source_door": "east", + "dest_room": "07", + "dest_door": "west" + }, + { + "source_room": "07", + "source_door": "east", + "dest_room": "08", + "dest_door": "bottom" + }, + { + "source_room": "08", + "source_door": "top", + "dest_room": "09", + "dest_door": "west" + }, + { + "source_room": "09", + "source_door": "east", + "dest_room": "10", + "dest_door": "west" + }, + { + "source_room": "10", + "source_door": "east", + "dest_room": "11", + "dest_door": "west" + }, + { + "source_room": "11", + "source_door": "east", + "dest_room": "13", + "dest_door": "west" + }, + { + "source_room": "13", + "source_door": "east", + "dest_room": "14", + "dest_door": "west" + }, + { + "source_room": "14", + "source_door": "east", + "dest_room": "15", + "dest_door": "west" + }, + { + "source_room": "15", + "source_door": "east", + "dest_room": "12", + "dest_door": "west" + }, + { + "source_room": "12", + "source_door": "east", + "dest_room": "16", + "dest_door": "west" + }, + { + "source_room": "16", + "source_door": "top", + "dest_room": "17", + "dest_door": "west" + }, + { + "source_room": "17", + "source_door": "east", + "dest_room": "18", + "dest_door": "west" + }, + { + "source_room": "18", + "source_door": "east", + "dest_room": "19", + "dest_door": "west" + }, + { + "source_room": "19", + "source_door": "east", + "dest_room": "21", + "dest_door": "west" + }, + { + "source_room": "21", + "source_door": "east", + "dest_room": "20", + "dest_door": "west" + }, + { + "source_room": "20", + "source_door": "east", + "dest_room": "end", + "dest_door": "west" + } + ] + }, + { + "name": "3c", + "display_name": "Celestial Resort C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "coins", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "sinking_platforms", "dash_refills", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "4a", + "display_name": "Golden Ridge A", + "rooms": [ + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-01x", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_clouds", "pink_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_clouds" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_clouds" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "moving_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "moving_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "blue_clouds", "blue_boosters" ] ] + }, + { + "dest": "east", + "rule": [ [ "blue_clouds" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_clouds" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "strawberry_seeds", "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-11", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-09", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "west", + "rule": [ [ "move_blocks" ] ] + }, + { + "dest": "east", + "rule": [ [ "move_blocks" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "move_blocks" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Shrine", + "checkpoint_region": "south" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "move_blocks" ] ] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "south-west", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "move_blocks" ] ] + }, + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": true, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-sec", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [ [ "white_block" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-secb", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "center", + "connections": [ + { + "dest": "west", + "rule": [ [ "pink_clouds", "move_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "center", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "blue_clouds" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks", "blue_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + }, + { + "dest": "north-west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Old Trail", + "checkpoint_region": "west" + }, + { + "name": "c-01", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pink_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters", "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters", "blue_clouds", "move_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "bottom", + "rule": [] + }, + { + "dest": "top", + "rule": [ [ "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "coins", "move_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06b", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills", "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-08", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "bottom", + "rule": [] + }, + { + "dest": "top", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-10", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Cliff Face", + "checkpoint_region": "west" + }, + { + "name": "d-00b", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + }, + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "coins", "pink_clouds", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_clouds", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "blue_clouds", "pink_clouds", "blue_boosters", "move_blocks", "dash_refills", "springs", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-01x", + "dest_door": "west" + }, + { + "source_room": "a-01x", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-05", + "dest_door": "west" + }, + { + "source_room": "a-05", + "source_door": "east", + "dest_room": "a-06", + "dest_door": "west" + }, + { + "source_room": "a-06", + "source_door": "east", + "dest_room": "a-07", + "dest_door": "west" + }, + { + "source_room": "a-07", + "source_door": "east", + "dest_room": "a-08", + "dest_door": "west" + }, + { + "source_room": "a-08", + "source_door": "north-west", + "dest_room": "a-10", + "dest_door": "east" + }, + { + "source_room": "a-08", + "source_door": "east", + "dest_room": "a-09", + "dest_door": "bottom" + }, + { + "source_room": "a-10", + "source_door": "west", + "dest_room": "a-11", + "dest_door": "east" + }, + { + "source_room": "a-09", + "source_door": "top", + "dest_room": "b-00", + "dest_door": "south" + }, + { + "source_room": "b-00", + "source_door": "south-east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "north-west", + "dest_room": "b-04", + "dest_door": "east" + }, + { + "source_room": "b-04", + "source_door": "west", + "dest_room": "b-06", + "dest_door": "east" + }, + { + "source_room": "b-06", + "source_door": "west", + "dest_room": "b-07", + "dest_door": "west" + }, + { + "source_room": "b-07", + "source_door": "east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "south-west" + }, + { + "source_room": "b-00", + "source_door": "north-east", + "dest_room": "b-02", + "dest_door": "north-west" + }, + { + "source_room": "b-02", + "source_door": "north-east", + "dest_room": "b-sec", + "dest_door": "west" + }, + { + "source_room": "b-sec", + "source_door": "east", + "dest_room": "b-secb", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "north", + "dest_room": "b-05", + "dest_door": "center" + }, + { + "source_room": "b-05", + "source_door": "west", + "dest_room": "b-04", + "dest_door": "north-west" + }, + { + "source_room": "b-02", + "source_door": "north", + "dest_room": "b-05", + "dest_door": "east" + }, + { + "source_room": "b-05", + "source_door": "north-east", + "dest_room": "b-08b", + "dest_door": "west" + }, + { + "source_room": "b-08b", + "source_door": "east", + "dest_room": "b-08", + "dest_door": "west" + }, + { + "source_room": "b-08", + "source_door": "east", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "north-west", + "dest_room": "c-01", + "dest_door": "east" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "c-05", + "dest_door": "west" + }, + { + "source_room": "c-05", + "source_door": "east", + "dest_room": "c-06", + "dest_door": "bottom" + }, + { + "source_room": "c-06", + "source_door": "west", + "dest_room": "c-06b", + "dest_door": "east" + }, + { + "source_room": "c-06", + "source_door": "top", + "dest_room": "c-09", + "dest_door": "west" + }, + { + "source_room": "c-09", + "source_door": "east", + "dest_room": "c-07", + "dest_door": "west" + }, + { + "source_room": "c-07", + "source_door": "east", + "dest_room": "c-08", + "dest_door": "bottom" + }, + { + "source_room": "c-08", + "source_door": "east", + "dest_room": "c-10", + "dest_door": "bottom" + }, + { + "source_room": "c-08", + "source_door": "top", + "dest_room": "d-00", + "dest_door": "west" + }, + { + "source_room": "c-10", + "source_door": "top", + "dest_room": "d-00", + "dest_door": "south" + }, + { + "source_room": "d-00", + "source_door": "north-west", + "dest_room": "d-00b", + "dest_door": "east" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "east", + "dest_room": "d-04", + "dest_door": "west" + }, + { + "source_room": "d-04", + "source_door": "east", + "dest_room": "d-05", + "dest_door": "west" + }, + { + "source_room": "d-05", + "source_door": "east", + "dest_room": "d-06", + "dest_door": "west" + }, + { + "source_room": "d-06", + "source_door": "east", + "dest_room": "d-07", + "dest_door": "west" + }, + { + "source_room": "d-07", + "source_door": "east", + "dest_room": "d-08", + "dest_door": "west" + }, + { + "source_room": "d-08", + "source_door": "east", + "dest_room": "d-09", + "dest_door": "west" + }, + { + "source_room": "d-09", + "source_door": "east", + "dest_room": "d-10", + "dest_door": "west" + } + ] + }, + { + "name": "4b", + "display_name": "Golden Ridge B", + "rooms": [ + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "moving_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "moving_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "move_blocks", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Stepping Stones", + "checkpoint_region": "west" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "move_blocks", "springs", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "moving_platforms", "springs", "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Gusty Canyon", + "checkpoint_region": "west" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "moving_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "move_blocks", "blue_clouds" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "blue_clouds" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_clouds" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Eye of the Storm", + "checkpoint_region": "west" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pink_clouds", "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "blue_boosters", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "end", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills", "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills", "springs", "coins", "moving_platforms", "blue_boosters", "blue_clouds", "pink_clouds", "move_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "bottom" + }, + { + "source_room": "b-02", + "source_door": "top", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-04", + "dest_door": "west" + }, + { + "source_room": "b-04", + "source_door": "east", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "bottom" + }, + { + "source_room": "c-03", + "source_door": "top", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "d-00", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "east", + "dest_room": "end", + "dest_door": "west" + } + ] + }, + { + "name": "4c", + "display_name": "Golden Ridge C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_clouds", "blue_boosters", "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "pink_clouds", "blue_boosters", "move_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "5a", + "display_name": "Mirror Temple A", + "rooms": [ + { + "name": "a-00b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-00x", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + }, + { + "dest": "south-west", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "north", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks", "springs" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "south-west", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [ [ "swap_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [ [ "dash_switches" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [ [ "dash_switches" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-06", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters", "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-07", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills", "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "red_boosters", "swap_blocks" ] ] + }, + { + "dest": "south", + "rule": [] + }, + { + "dest": "north", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ], + "locations": [ + { + "name": "key_1", + "display_name": "Entrance Key", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [ [ "dash_switches" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-11", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills", "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-12", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-15", + "regions": [ + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "coins", "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-14", + "regions": [ + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "Entrance Key" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "Entrance Key" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_switches" ] ] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Depths", + "checkpoint_region": "west" + }, + { + "name": "b-18", + "regions": [ + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "west", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-20", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-21", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "center", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "east-upper", + "rule": [] + }, + { + "dest": "east-lower", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "east-upper", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "east-lower", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east-upper", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east-lower", + "direction": "right", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "key_2", + "display_name": "Depths Key", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-09", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-10", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-11", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "dash_switches" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "swap_blocks" ] ] + }, + { + "dest": "east", + "rule": [ [ "dash_switches", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-17", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "strawberry_seeds", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-22", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "red_boosters", "pink_cassette_blocks", "blue_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "east", + "rule": [ [ "red_boosters", "Depths Key" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters", "Depths Key" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-19", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "red_boosters", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-14", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [] + }, + { + "dest": "south", + "rule": [ [ "Depths Key" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [ [ "Depths Key" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-15", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-16", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "mirror", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "mirror", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "mirror", + "direction": "special", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "void", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "special", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "special", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "bottom", + "connections": [] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "special", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "Unravelling", + "checkpoint_region": "top" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks", "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks", "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "seekers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + }, + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Search", + "checkpoint_region": "south" + }, + { + "name": "d-01", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "south-east-down", + "rule": [] + }, + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "south-west-left", + "connections": [ + { + "dest": "south-west-down", + "rule": [] + } + ] + }, + { + "name": "south-west-down", + "connections": [ + { + "dest": "center", + "rule": [] + }, + { + "dest": "south-west-left", + "rule": [] + } + ] + }, + { + "name": "south-east-right", + "connections": [ + { + "dest": "south-east-down", + "rule": [] + } + ] + }, + { + "name": "south-east-down", + "connections": [ + { + "dest": "center", + "rule": [] + }, + { + "dest": "south-east-right", + "rule": [ [ "seekers" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west-left", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west-down", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east-right", + "direction": "right", + "blocked": true, + "closes_behind": false + }, + { + "name": "south-east-down", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-09", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters", "dash_refills", "swap_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters", "Search Key 1", "Search Key 2" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [] + }, + { + "name": "south-west-left", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "key_3", + "display_name": "Search Key 1", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "south-west-right", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "key_4", + "display_name": "Search Key 2", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "red_boosters", "swap_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west-left", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west-right", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [ [ "red_boosters", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-06", + "regions": [ + { + "name": "north-east", + "connections": [] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "red_boosters", "swap_blocks" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-07", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [ [ "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ + [ "springs" ], + [ "seekers" ] + ] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "coins", "seekers" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-15", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + }, + { + "name": "key_5", + "display_name": "Search Key 3", + "type": "key", + "rule": [ [ "swap_blocks", "seekers" ] ] + } + ] + }, + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-13", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-19b", + "regions": [ + { + "name": "south-east-right", + "connections": [ + { + "dest": "south-east-down", + "rule": [] + } + ] + }, + { + "name": "south-east-down", + "connections": [ + { + "dest": "south-east-right", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-east-right", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east-down", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-19", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks", "springs" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "Search Key 3" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-20", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "seekers", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + + { + "name": "e-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "Rescue", + "checkpoint_region": "west" + }, + { + "name": "e-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "dash_switches", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_switches" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "swap_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "swap_blocks", "springs", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "theo_crystal" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "red_boosters", "swap_blocks", "dash_switches", "Entrance Key", "Depths Key", "Search Key 1", "Search Key 2", "seekers", "coins", "theo_crystal" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00b", + "source_door": "west", + "dest_room": "a-00x", + "dest_door": "east" + }, + { + "source_room": "a-00b", + "source_door": "east", + "dest_room": "a-00d", + "dest_door": "west" + }, + { + "source_room": "a-00d", + "source_door": "east", + "dest_room": "a-00c", + "dest_door": "west" + }, + { + "source_room": "a-00c", + "source_door": "east", + "dest_room": "a-00", + "dest_door": "west" + }, + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-13", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "south-west", + "dest_room": "a-04", + "dest_door": "north" + }, + { + "source_room": "a-01", + "source_door": "south-east", + "dest_room": "a-02", + "dest_door": "north" + }, + { + "source_room": "a-01", + "source_door": "north", + "dest_room": "a-08", + "dest_door": "south" + }, + { + "source_room": "a-02", + "source_door": "west", + "dest_room": "a-03", + "dest_door": "east" + }, + { + "source_room": "a-02", + "source_door": "south", + "dest_room": "a-05", + "dest_door": "north-east" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "south", + "dest_room": "a-05", + "dest_door": "north-west" + }, + { + "source_room": "a-05", + "source_door": "south-west", + "dest_room": "a-07", + "dest_door": "east" + }, + { + "source_room": "a-05", + "source_door": "south-east", + "dest_room": "a-06", + "dest_door": "west" + }, + { + "source_room": "a-08", + "source_door": "west", + "dest_room": "a-10", + "dest_door": "east" + }, + { + "source_room": "a-08", + "source_door": "north", + "dest_room": "a-14", + "dest_door": "south" + }, + { + "source_room": "a-08", + "source_door": "north-east", + "dest_room": "a-12", + "dest_door": "north-west" + }, + { + "source_room": "a-08", + "source_door": "south-east", + "dest_room": "a-12", + "dest_door": "south-west" + }, + { + "source_room": "a-10", + "source_door": "west", + "dest_room": "a-09", + "dest_door": "east" + }, + { + "source_room": "a-09", + "source_door": "west", + "dest_room": "a-11", + "dest_door": "east" + }, + { + "source_room": "a-12", + "source_door": "west", + "dest_room": "a-08", + "dest_door": "east" + }, + { + "source_room": "a-12", + "source_door": "east", + "dest_room": "a-15", + "dest_door": "south" + }, + { + "source_room": "a-13", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + + { + "source_room": "b-00", + "source_door": "north-west", + "dest_room": "b-18", + "dest_door": "south" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "south-west" + }, + { + "source_room": "b-01", + "source_door": "west", + "dest_room": "b-20", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "north", + "dest_room": "b-20", + "dest_door": "south" + }, + { + "source_room": "b-01", + "source_door": "north-east", + "dest_room": "b-20", + "dest_door": "east" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-01b", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "south", + "dest_room": "b-01c", + "dest_door": "west" + }, + { + "source_room": "b-01c", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "south-east" + }, + { + "source_room": "b-20", + "source_door": "south-west", + "dest_room": "b-01", + "dest_door": "north-west" + }, + { + "source_room": "b-20", + "source_door": "north-west", + "dest_room": "b-21", + "dest_door": "east" + }, + { + "source_room": "b-01b", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "north-west", + "dest_room": "b-03", + "dest_door": "east" + }, + { + "source_room": "b-02", + "source_door": "north", + "dest_room": "b-04", + "dest_door": "south" + }, + { + "source_room": "b-02", + "source_door": "north-east", + "dest_room": "b-05", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east-upper", + "dest_room": "b-06", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east-lower", + "dest_room": "b-11", + "dest_door": "north-west" + }, + { + "source_room": "b-02", + "source_door": "south-east", + "dest_room": "b-11", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "south", + "dest_room": "b-10", + "dest_door": "east" + }, + { + "source_room": "b-04", + "source_door": "west", + "dest_room": "b-07", + "dest_door": "south" + }, + { + "source_room": "b-07", + "source_door": "north", + "dest_room": "b-08", + "dest_door": "west" + }, + { + "source_room": "b-08", + "source_door": "east", + "dest_room": "b-09", + "dest_door": "north" + }, + { + "source_room": "b-09", + "source_door": "south", + "dest_room": "b-04", + "dest_door": "east" + }, + { + "source_room": "b-11", + "source_door": "south-west", + "dest_room": "b-12", + "dest_door": "west" + }, + { + "source_room": "b-11", + "source_door": "south-east", + "dest_room": "b-12", + "dest_door": "east" + }, + { + "source_room": "b-11", + "source_door": "east", + "dest_room": "b-13", + "dest_door": "west" + }, + { + "source_room": "b-13", + "source_door": "east", + "dest_room": "b-17", + "dest_door": "west" + }, + { + "source_room": "b-13", + "source_door": "north-east", + "dest_room": "b-17", + "dest_door": "north-west" + }, + { + "source_room": "b-17", + "source_door": "east", + "dest_room": "b-22", + "dest_door": "west" + }, + { + "source_room": "b-06", + "source_door": "east", + "dest_room": "b-19", + "dest_door": "west" + }, + { + "source_room": "b-06", + "source_door": "north-east", + "dest_room": "b-19", + "dest_door": "north-west" + }, + { + "source_room": "b-19", + "source_door": "east", + "dest_room": "b-14", + "dest_door": "west" + }, + { + "source_room": "b-14", + "source_door": "south", + "dest_room": "b-15", + "dest_door": "west" + }, + { + "source_room": "b-14", + "source_door": "north", + "dest_room": "b-16", + "dest_door": "bottom" + }, + { + "source_room": "b-16", + "source_door": "mirror", + "dest_room": "void", + "dest_door": "east" + }, + { + "source_room": "void", + "source_door": "west", + "dest_room": "c-00", + "dest_door": "top" + }, + { + "source_room": "c-00", + "source_door": "bottom", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-01b", + "dest_door": "west" + }, + { + "source_room": "c-01b", + "source_door": "east", + "dest_room": "c-01c", + "dest_door": "west" + }, + { + "source_room": "c-01c", + "source_door": "east", + "dest_room": "c-08b", + "dest_door": "west" + }, + { + "source_room": "c-08b", + "source_door": "east", + "dest_room": "c-08", + "dest_door": "west" + }, + { + "source_room": "c-08", + "source_door": "east", + "dest_room": "c-10", + "dest_door": "west" + }, + { + "source_room": "c-10", + "source_door": "east", + "dest_room": "c-12", + "dest_door": "west" + }, + { + "source_room": "c-12", + "source_door": "east", + "dest_room": "c-07", + "dest_door": "west" + }, + { + "source_room": "c-07", + "source_door": "east", + "dest_room": "c-11", + "dest_door": "west" + }, + { + "source_room": "c-11", + "source_door": "east", + "dest_room": "c-09", + "dest_door": "west" + }, + { + "source_room": "c-09", + "source_door": "east", + "dest_room": "c-13", + "dest_door": "west" + }, + { + "source_room": "c-13", + "source_door": "east", + "dest_room": "d-00", + "dest_door": "south" + }, + + { + "source_room": "d-00", + "source_door": "north", + "dest_room": "d-01", + "dest_door": "south" + }, + { + "source_room": "d-00", + "source_door": "west", + "dest_room": "d-05", + "dest_door": "east" + }, + { + "source_room": "d-05", + "source_door": "south", + "dest_room": "d-02", + "dest_door": "east" + }, + { + "source_room": "d-01", + "source_door": "north-west", + "dest_room": "d-09", + "dest_door": "east" + }, + { + "source_room": "d-01", + "source_door": "west", + "dest_room": "d-09", + "dest_door": "east" + }, + { + "source_room": "d-01", + "source_door": "south-west-down", + "dest_room": "d-05", + "dest_door": "north" + }, + { + "source_room": "d-01", + "source_door": "south-east-down", + "dest_room": "d-07", + "dest_door": "north" + }, + { + "source_room": "d-01", + "source_door": "south-east-right", + "dest_room": "d-15", + "dest_door": "south-west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-15", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "north-east", + "dest_room": "d-15", + "dest_door": "north-west" + }, + { + "source_room": "d-09", + "source_door": "west", + "dest_room": "d-04", + "dest_door": "north" + }, + { + "source_room": "d-04", + "source_door": "west", + "dest_room": "d-19b", + "dest_door": "south-east-right" + }, + { + "source_room": "d-04", + "source_door": "south-east", + "dest_room": "d-01", + "dest_door": "south-west-left" + }, + { + "source_room": "d-05", + "source_door": "west", + "dest_room": "d-06", + "dest_door": "south-east" + }, + { + "source_room": "d-05", + "source_door": "south", + "dest_room": "d-02", + "dest_door": "east" + }, + { + "source_room": "d-06", + "source_door": "north-east", + "dest_room": "d-04", + "dest_door": "south-west-right" + }, + { + "source_room": "d-06", + "source_door": "north-west", + "dest_room": "d-04", + "dest_door": "south-west-left" + }, + { + "source_room": "d-07", + "source_door": "west", + "dest_room": "d-00", + "dest_door": "east" + }, + { + "source_room": "d-02", + "source_door": "west", + "dest_room": "d-03", + "dest_door": "east" + }, + { + "source_room": "d-03", + "source_door": "west", + "dest_room": "d-06", + "dest_door": "south-west" + }, + { + "source_room": "d-15", + "source_door": "south-east", + "dest_room": "d-13", + "dest_door": "east" + }, + { + "source_room": "d-13", + "source_door": "west", + "dest_room": "d-15", + "dest_door": "south" + }, + { + "source_room": "d-19b", + "source_door": "south-east-down", + "dest_room": "d-19", + "dest_door": "east" + }, + { + "source_room": "d-19b", + "source_door": "north-east", + "dest_room": "d-10", + "dest_door": "west" + }, + { + "source_room": "d-19", + "source_door": "west", + "dest_room": "d-19b", + "dest_door": "south-west" + }, + { + "source_room": "d-10", + "source_door": "east", + "dest_room": "d-20", + "dest_door": "west" + }, + { + "source_room": "d-20", + "source_door": "east", + "dest_room": "e-00", + "dest_door": "west" + }, + { + "source_room": "e-00", + "source_door": "east", + "dest_room": "e-01", + "dest_door": "west" + }, + { + "source_room": "e-01", + "source_door": "east", + "dest_room": "e-02", + "dest_door": "west" + }, + { + "source_room": "e-02", + "source_door": "east", + "dest_room": "e-03", + "dest_door": "west" + }, + { + "source_room": "e-03", + "source_door": "east", + "dest_room": "e-04", + "dest_door": "west" + }, + { + "source_room": "e-04", + "source_door": "east", + "dest_room": "e-06", + "dest_door": "west" + }, + { + "source_room": "e-06", + "source_door": "east", + "dest_room": "e-05", + "dest_door": "west" + }, + { + "source_room": "e-05", + "source_door": "east", + "dest_room": "e-07", + "dest_door": "west" + }, + { + "source_room": "e-07", + "source_door": "east", + "dest_room": "e-08", + "dest_door": "west" + }, + { + "source_room": "e-08", + "source_door": "east", + "dest_room": "e-09", + "dest_door": "west" + }, + { + "source_room": "e-09", + "source_door": "east", + "dest_room": "e-10", + "dest_door": "west" + }, + { + "source_room": "e-10", + "source_door": "east", + "dest_room": "e-11", + "dest_door": "west" + } + ] + }, + { + "name": "5b", + "display_name": "Mirror Temple B", + "rooms": [ + { + "name": "start", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [ [ "Central Chamber Key 2" ] ] + }, + { + "dest": "north", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Central Chamber", + "checkpoint_region": "south" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + }, + { + "dest": "east", + "rule": [ [ "red_boosters", "Central Chamber Key 2" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks", "dash_refills", "red_boosters" ] ] + } + ] + }, + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north", + "rule": [ [ "red_boosters", "Central Chamber Key 1" ] ] + }, + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "center", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "center", + "rule": [] + } + ], + "locations": [ + { + "name": "key_1", + "display_name": "Central Chamber Key 1", + "type": "key", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "center", + "rule": [] + } + ], + "locations": [ + { + "name": "key_2", + "display_name": "Central Chamber Key 2", + "type": "key", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [ [ "swap_blocks", "dash_refills", "coins" ] ] + } + ] + }, + { + "name": "south", + "connections": [] + } + ], + "doors": [ + { + "name": "north", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "north", + "connections": [] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "main", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters", "dash_switches", "Central Chamber Key 1" ] ] + }, + { + "dest": "west", + "rule": [ [ "dash_switches" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "main", + "rule": [ [ "red_boosters", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "main", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08", + "regions": [ + { + "name": "south", + "connections": [] + }, + { + "name": "north", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [ [ "swap_blocks", "springs" ] ] + }, + { + "dest": "north", + "rule": [ [ "dash_switches", "swap_blocks", "springs", "Central Chamber Key 1" ] ] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-09", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "mirror", + "rule": [ [ "swap_blocks", "red_boosters", "dash_switches" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "mirror", + "connections": [] + } + ], + "doors": [ + { + "name": "mirror", + "direction": "special", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "bottom", + "connections": [] + }, + { + "name": "mirror", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills", "dash_switches" ] ] + } + ] + } + ], + "doors": [ + { + "name": "mirror", + "direction": "special", + "blocked": false, + "closes_behind": true + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Through the Mirror", + "checkpoint_region": "mirror" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "seekers", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "seekers", "dash_switches", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "seekers", "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "seekers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Mix Master", + "checkpoint_region": "west" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "springs", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "springs", "dash_switches", "seekers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "springs", "swap_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "theo_crystal", "springs", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "springs", "swap_blocks" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "Central Chamber Key 1", "Central Chamber Key 2", "pink_cassette_blocks", "blue_cassette_blocks", "theo_crystal", "dash_refills", "springs", "coins", "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "start", + "source_door": "east", + "dest_room": "a-00", + "dest_door": "west" + }, + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "south" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "north", + "dest_room": "b-02", + "dest_door": "south" + }, + { + "source_room": "b-00", + "source_door": "west", + "dest_room": "b-06", + "dest_door": "east" + }, + { + "source_room": "b-01", + "source_door": "north", + "dest_room": "b-04", + "dest_door": "east" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-07", + "dest_door": "south" + }, + { + "source_room": "b-04", + "source_door": "west", + "dest_room": "b-02", + "dest_door": "south-east" + }, + { + "source_room": "b-02", + "source_door": "north-west", + "dest_room": "b-05", + "dest_door": "north" + }, + { + "source_room": "b-02", + "source_door": "north-east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "north", + "dest_room": "b-08", + "dest_door": "south" + }, + { + "source_room": "b-05", + "source_door": "south", + "dest_room": "b-02", + "dest_door": "south-west" + }, + { + "source_room": "b-07", + "source_door": "north", + "dest_room": "b-03", + "dest_door": "east" + }, + { + "source_room": "b-03", + "source_door": "north", + "dest_room": "b-08", + "dest_door": "east" + }, + { + "source_room": "b-08", + "source_door": "north", + "dest_room": "b-09", + "dest_door": "bottom" + }, + { + "source_room": "b-09", + "source_door": "mirror", + "dest_room": "c-00", + "dest_door": "mirror" + }, + { + "source_room": "c-00", + "source_door": "bottom", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "west" + }, + { + "source_room": "c-03", + "source_door": "east", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "d-00", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "east", + "dest_room": "d-04", + "dest_door": "west" + }, + { + "source_room": "d-04", + "source_door": "east", + "dest_room": "d-05", + "dest_door": "west" + } + ] + }, + { + "name": "5c", + "display_name": "Mirror Temple C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "red_boosters", "dash_refills", "dash_switches" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "red_boosters", "dash_refills", "dash_switches", "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "6a", + "display_name": "Reflection A", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "kevin_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "east" + }, + { + "name": "01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "bottom-west", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "bottom-west", + "connections": [] + }, + { + "name": "top-west", + "connections": [ + { + "dest": "top", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "top-west", + "rule": [ [ "feathers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "bottom-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "kevin_blocks" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-west", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west", + "direction": "left", + "blocked": true, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Hollows", + "checkpoint_region": "south" + }, + { + "name": "04b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04c", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04d", + "regions": [ + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "04e", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "pink_cassette_blocks", "blue_cassette_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "10b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "bumpers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "12b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "bumpers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "14a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "14b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "coins", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "15", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "16a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "16b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "17", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "cannot_access" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "18a", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "18b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "19", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [ [ "feathers" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "20", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Reflection", + "checkpoint_region": "west" + }, + { + "name": "b-00b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00c", + "regions": [ + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02b", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Rock Bottom", + "checkpoint_region": "west" + }, + { + "name": "boss-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "feathers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "bumpers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-14", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-15", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-16", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-17", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-18", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-19", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "boss-20", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "feathers", "dash_refills", "kevin_blocks", "bumpers", "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "after-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Resolution", + "checkpoint_region": "bottom" + }, + { + "name": "after-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "goal", + "rule": [ [ "badeline_boosters" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "west", + "dest_room": "01", + "dest_door": "bottom" + }, + { + "source_room": "01", + "source_door": "top", + "dest_room": "02", + "dest_door": "bottom" + }, + { + "source_room": "02", + "source_door": "bottom-west", + "dest_room": "03", + "dest_door": "bottom" + }, + { + "source_room": "02", + "source_door": "top", + "dest_room": "02b", + "dest_door": "bottom" + }, + { + "source_room": "03", + "source_door": "top", + "dest_room": "02", + "dest_door": "top-west" + }, + { + "source_room": "02b", + "source_door": "top", + "dest_room": "04", + "dest_door": "south" + }, + + { + "source_room": "04", + "source_door": "north-west", + "dest_room": "04b", + "dest_door": "east" + }, + { + "source_room": "04", + "source_door": "south-east", + "dest_room": "04d", + "dest_door": "west" + }, + { + "source_room": "04", + "source_door": "east", + "dest_room": "05", + "dest_door": "west" + }, + { + "source_room": "04", + "source_door": "south-west", + "dest_room": "04e", + "dest_door": "east" + }, + { + "source_room": "04b", + "source_door": "west", + "dest_room": "04c", + "dest_door": "east" + }, + { + "source_room": "05", + "source_door": "east", + "dest_room": "06", + "dest_door": "west" + }, + { + "source_room": "06", + "source_door": "east", + "dest_room": "07", + "dest_door": "west" + }, + { + "source_room": "07", + "source_door": "east", + "dest_room": "08a", + "dest_door": "west" + }, + { + "source_room": "07", + "source_door": "north-east", + "dest_room": "08b", + "dest_door": "west" + }, + { + "source_room": "08a", + "source_door": "east", + "dest_room": "09", + "dest_door": "west" + }, + { + "source_room": "08b", + "source_door": "east", + "dest_room": "09", + "dest_door": "north-west" + }, + { + "source_room": "09", + "source_door": "east", + "dest_room": "10a", + "dest_door": "west" + }, + { + "source_room": "09", + "source_door": "north-east", + "dest_room": "10b", + "dest_door": "west" + }, + { + "source_room": "10a", + "source_door": "east", + "dest_room": "11", + "dest_door": "west" + }, + { + "source_room": "10b", + "source_door": "east", + "dest_room": "11", + "dest_door": "north-west" + }, + { + "source_room": "11", + "source_door": "east", + "dest_room": "12a", + "dest_door": "west" + }, + { + "source_room": "11", + "source_door": "north-east", + "dest_room": "12b", + "dest_door": "west" + }, + { + "source_room": "12a", + "source_door": "east", + "dest_room": "13", + "dest_door": "west" + }, + { + "source_room": "12b", + "source_door": "east", + "dest_room": "13", + "dest_door": "north-west" + }, + { + "source_room": "13", + "source_door": "east", + "dest_room": "14a", + "dest_door": "west" + }, + { + "source_room": "13", + "source_door": "north-east", + "dest_room": "14b", + "dest_door": "west" + }, + { + "source_room": "14a", + "source_door": "east", + "dest_room": "15", + "dest_door": "west" + }, + { + "source_room": "14b", + "source_door": "east", + "dest_room": "15", + "dest_door": "north-west" + }, + { + "source_room": "15", + "source_door": "east", + "dest_room": "16a", + "dest_door": "west" + }, + { + "source_room": "15", + "source_door": "north-east", + "dest_room": "16b", + "dest_door": "west" + }, + { + "source_room": "16a", + "source_door": "east", + "dest_room": "17", + "dest_door": "west" + }, + { + "source_room": "16b", + "source_door": "east", + "dest_room": "17", + "dest_door": "north-west" + }, + { + "source_room": "17", + "source_door": "east", + "dest_room": "18a", + "dest_door": "west" + }, + { + "source_room": "17", + "source_door": "north-east", + "dest_room": "18b", + "dest_door": "west" + }, + { + "source_room": "18a", + "source_door": "east", + "dest_room": "19", + "dest_door": "west" + }, + { + "source_room": "18b", + "source_door": "east", + "dest_room": "19", + "dest_door": "north-west" + }, + { + "source_room": "19", + "source_door": "east", + "dest_room": "20", + "dest_door": "west" + }, + { + "source_room": "20", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "top", + "dest_room": "b-00b", + "dest_door": "bottom" + }, + { + "source_room": "b-00b", + "source_door": "top", + "dest_room": "b-00c", + "dest_door": "east" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "top" + }, + { + "source_room": "b-02", + "source_door": "bottom", + "dest_room": "b-02b", + "dest_door": "top" + }, + { + "source_room": "b-02b", + "source_door": "bottom", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "boss-00", + "dest_door": "west" + }, + { + "source_room": "boss-00", + "source_door": "east", + "dest_room": "boss-01", + "dest_door": "west" + }, + { + "source_room": "boss-01", + "source_door": "east", + "dest_room": "boss-02", + "dest_door": "west" + }, + { + "source_room": "boss-02", + "source_door": "east", + "dest_room": "boss-03", + "dest_door": "west" + }, + { + "source_room": "boss-03", + "source_door": "east", + "dest_room": "boss-04", + "dest_door": "west" + }, + { + "source_room": "boss-04", + "source_door": "east", + "dest_room": "boss-05", + "dest_door": "west" + }, + { + "source_room": "boss-05", + "source_door": "east", + "dest_room": "boss-06", + "dest_door": "west" + }, + { + "source_room": "boss-06", + "source_door": "east", + "dest_room": "boss-07", + "dest_door": "west" + }, + { + "source_room": "boss-07", + "source_door": "east", + "dest_room": "boss-08", + "dest_door": "west" + }, + { + "source_room": "boss-08", + "source_door": "east", + "dest_room": "boss-09", + "dest_door": "west" + }, + { + "source_room": "boss-09", + "source_door": "east", + "dest_room": "boss-10", + "dest_door": "west" + }, + { + "source_room": "boss-10", + "source_door": "east", + "dest_room": "boss-11", + "dest_door": "west" + }, + { + "source_room": "boss-11", + "source_door": "east", + "dest_room": "boss-12", + "dest_door": "west" + }, + { + "source_room": "boss-12", + "source_door": "east", + "dest_room": "boss-13", + "dest_door": "west" + }, + { + "source_room": "boss-13", + "source_door": "east", + "dest_room": "boss-14", + "dest_door": "west" + }, + { + "source_room": "boss-14", + "source_door": "east", + "dest_room": "boss-15", + "dest_door": "west" + }, + { + "source_room": "boss-15", + "source_door": "east", + "dest_room": "boss-16", + "dest_door": "west" + }, + { + "source_room": "boss-16", + "source_door": "east", + "dest_room": "boss-17", + "dest_door": "west" + }, + { + "source_room": "boss-17", + "source_door": "east", + "dest_room": "boss-18", + "dest_door": "west" + }, + { + "source_room": "boss-18", + "source_door": "east", + "dest_room": "boss-19", + "dest_door": "west" + }, + { + "source_room": "boss-19", + "source_door": "east", + "dest_room": "boss-20", + "dest_door": "west" + }, + { + "source_room": "boss-20", + "source_door": "east", + "dest_room": "after-00", + "dest_door": "bottom" + }, + { + "source_room": "after-00", + "source_door": "top", + "dest_room": "after-01", + "dest_door": "bottom" + } + ] + }, + { + "name": "6b", + "display_name": "Reflection B", + "rooms": [ + { + "name": "a-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "kevin_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "bottom" + }, + { + "name": "a-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "feathers", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "bumpers", "feathers" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "kevin_blocks", "dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Reflection", + "checkpoint_region": "west" + }, + { + "name": "b-01", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills", "kevin_blocks" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills", "kevin_blocks" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Rock Bottom", + "checkpoint_region": "west" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "kevin_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Reprieve", + "checkpoint_region": "west" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "feathers", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "kevin_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "kevin_blocks", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "blue_cassette_blocks", "bumpers" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "blue_cassette_blocks", "bumpers", "dash_refills", "springs", "coins", "kevin_blocks", "feathers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00", + "source_door": "top", + "dest_room": "a-01", + "dest_door": "bottom" + }, + { + "source_room": "a-01", + "source_door": "top", + "dest_room": "a-02", + "dest_door": "bottom" + }, + { + "source_room": "a-02", + "source_door": "top", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-05", + "dest_door": "west" + }, + { + "source_room": "a-05", + "source_door": "east", + "dest_room": "a-06", + "dest_door": "west" + }, + { + "source_room": "a-06", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "top" + }, + { + "source_room": "b-01", + "source_door": "bottom", + "dest_room": "b-02", + "dest_door": "top" + }, + { + "source_room": "b-02", + "source_door": "bottom", + "dest_room": "b-03", + "dest_door": "top" + }, + { + "source_room": "b-03", + "source_door": "bottom", + "dest_room": "b-04", + "dest_door": "top" + }, + { + "source_room": "b-04", + "source_door": "bottom", + "dest_room": "b-05", + "dest_door": "top" + }, + { + "source_room": "b-05", + "source_door": "bottom", + "dest_room": "b-06", + "dest_door": "top" + }, + { + "source_room": "b-06", + "source_door": "bottom", + "dest_room": "b-07", + "dest_door": "top" + }, + { + "source_room": "b-07", + "source_door": "bottom", + "dest_room": "b-08", + "dest_door": "top" + }, + { + "source_room": "b-08", + "source_door": "bottom", + "dest_room": "b-10", + "dest_door": "west" + }, + { + "source_room": "b-10", + "source_door": "east", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "west" + }, + { + "source_room": "c-03", + "source_door": "east", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "d-00", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "east", + "dest_room": "d-04", + "dest_door": "west" + }, + { + "source_room": "d-04", + "source_door": "east", + "dest_room": "d-05", + "dest_door": "west" + } + ] + }, + { + "name": "6c", + "display_name": "Reflection C", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "kevin_blocks", "dash_refills", "bumpers" ] ] + } + ], + "locations": [ + { + "name": "binoculars_1", + "display_name": "Binoculars 1", + "type": "binoculars", + "rule": [] + }, + { + "name": "binoculars_2", + "display_name": "Binoculars 2", + "type": "binoculars", + "rule": [ [ "kevin_blocks", "dash_refills", "bumpers" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "kevin_blocks", "dash_refills", "bumpers", "feathers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "7a", + "display_name": "The Summit A", + "rooms": [ + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "springs" ] ] + }, + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02b", + "regions": [ + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "springs" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04b", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "springs", "dash_refills" ] ] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-06", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters", "springs" ] ] + }, + { + "dest": "top-side", + "rule": [ [ "badeline_boosters", "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + }, + { + "name": "top-side", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters" ] ] + } + ], + "locations": [ + { + "name": "gem_1", + "display_name": "Gem 1", + "type": "gem", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "500 M", + "checkpoint_region": "bottom" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02b", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02e", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02d", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "gem_2", + "display_name": "Gem 2", + "type": "gem", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north", + "rule": [ [ "traffic_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "coins", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-09", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "traffic_blocks" ] ] + }, + { + "dest": "top-side", + "rule": [] + } + ] + }, + { + "name": "top-side", + "connections": [ + { + "dest": "top", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "1000 M", + "checkpoint_region": "west" + }, + { + "name": "c-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "springs", "coins" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03b", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-05", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + }, + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06b", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "dream_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06c", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "gem_3", + "display_name": "Gem 3", + "type": "gem", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-07b", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dream_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-09", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "1500 M", + "checkpoint_region": "bottom" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "sinking_platforms" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-01b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-01c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "sinking_platforms" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-01d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "coins", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "cannot_access" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [ [ "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ + [ "coins" ], + [ "dash_refills" ] + ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + }, + { + "dest": "north-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05b", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "gem_4", + "display_name": "Gem 4", + "type": "gem", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south-east", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-07", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north", + "rule": [ [ "dash_refills" ] ] + }, + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-11", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [ [ "blue_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "2000 M", + "checkpoint_region": "bottom" + }, + { + "name": "e-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "blue_clouds" ] ] + }, + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south-west", + "rule": [ [ "blue_boosters", "blue_clouds" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-01", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-01b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-01c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "gem_5", + "display_name": "Gem 5", + "type": "gem", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pink_clouds" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "pink_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-03", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "moving_platforms" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-07", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "move_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-08", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_clouds" ] ] + }, + { + "dest": "east", + "rule": [ [ "blue_clouds" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-09", + "regions": [ + { + "name": "north", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north", + "direction": "up", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-11", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "move_blocks" ] ] + }, + { + "dest": "east", + "rule": [ [ "move_blocks", "blue_boosters" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-12", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "strawberry_seeds", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-10", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-10b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "dash_refills", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-13", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters", "dash_refills", "move_blocks", "blue_boosters", "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "left", + "blocked": true, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "2500 M", + "checkpoint_region": "south" + }, + { + "name": "f-01", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "right", + "blocked": true, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": true, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-02b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters", "dash_refills", "swap_blocks", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "gem_6", + "display_name": "Gem 6", + "type": "gem", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "south-west", + "rule": [] + }, + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + }, + { + "dest": "south-east", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "2500 M Key" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-06", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "north-west", + "rule": [] + }, + { + "dest": "north-east", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south-west", + "rule": [] + } + ] + }, + { + "name": "south-west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "south", + "connections": [] + }, + { + "name": "south-east", + "connections": [], + "locations": [ + { + "name": "key", + "display_name": "2500 M Key", + "type": "key", + "rule": [ [ "red_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "south-west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north-west", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "east", + "rule": [ [ "swap_blocks", "red_boosters", "dash_refills" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": true, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-08b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "springs" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "swap_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-08d", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_switches", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-08c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "swap_blocks" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-10b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dash_refills", "dash_switches" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-11", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters", "swap_blocks", "springs", "red_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [] + }, + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + }, + { + "name": "strawberry_3", + "display_name": "Strawberry 3", + "type": "strawberry", + "rule": [ [ "dash_switches" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "3000 M", + "checkpoint_region": "bottom" + }, + { + "name": "g-00b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "c26", + "rule": [] + } + ], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart", + "type": "crystal_heart", + "rule": [ [ "Gem 1", "Gem 2", "Gem 3", "Gem 4", "Gem 5", "Gem 6" ] ] + } + ] + }, + { + "name": "c26", + "connections": [ + { + "dest": "c24", + "rule": [ [ "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "c24", + "connections": [ + { + "dest": "c21", + "rule": [ [ "springs" ] ] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "c21", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "dash_refills", "badeline_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry_3", + "display_name": "Strawberry 3", + "type": "strawberry", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "c18", + "rule": [ [ "blue_clouds" ] ] + } + ] + }, + { + "name": "c18", + "connections": [ + { + "dest": "c16", + "rule": [ [ "dash_refills", "blue_clouds" ] ] + } + ], + "locations": [ + { + "name": "strawberry_1", + "display_name": "Strawberry 1", + "type": "strawberry", + "rule": [ [ "dash_refills", "blue_clouds" ] ] + } + ] + }, + { + "name": "c16", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "coins", "dash_refills", "pink_clouds", "badeline_boosters" ] ] + } + ], + "locations": [ + { + "name": "strawberry_2", + "display_name": "Strawberry 2", + "type": "strawberry", + "rule": [] + }, + { + "name": "strawberry_3", + "display_name": "Strawberry 3", + "type": "strawberry", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "blue_clouds", "feathers" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "goal", + "rule": [ [ "springs", "dash_refills", "feathers" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [ [ "springs" ] ] + }, + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "springs", "dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "dash_refills", "feathers", "blue_clouds", "pink_clouds", "coins", "badeline_boosters", "red_boosters", "swap_blocks", "dash_switches", "2500 M Key", "move_blocks", "blue_boosters", "dream_blocks", "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "north", + "dest_room": "a-02b", + "dest_door": "east" + }, + { + "source_room": "a-02b", + "source_door": "west", + "dest_room": "a-02", + "dest_door": "north-west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "north", + "dest_room": "a-04b", + "dest_door": "east" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-05", + "dest_door": "west" + }, + { + "source_room": "a-05", + "source_door": "east", + "dest_room": "a-06", + "dest_door": "bottom" + }, + { + "source_room": "a-06", + "source_door": "top", + "dest_room": "b-00", + "dest_door": "bottom" + }, + { + "source_room": "b-00", + "source_door": "top", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "south" + }, + { + "source_room": "b-02", + "source_door": "north-west", + "dest_room": "b-02b", + "dest_door": "south" + }, + { + "source_room": "b-02", + "source_door": "north", + "dest_room": "b-02d", + "dest_door": "south" + }, + { + "source_room": "b-02", + "source_door": "north-east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-02b", + "source_door": "north-west", + "dest_room": "b-02e", + "dest_door": "east" + }, + { + "source_room": "b-02b", + "source_door": "north-east", + "dest_room": "b-02c", + "dest_door": "west" + }, + { + "source_room": "b-02c", + "source_door": "east", + "dest_room": "b-05", + "dest_door": "north-west" + }, + { + "source_room": "b-02c", + "source_door": "south-east", + "dest_room": "b-02d", + "dest_door": "north" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-04", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "north", + "dest_room": "b-05", + "dest_door": "west" + }, + { + "source_room": "b-05", + "source_door": "east", + "dest_room": "b-06", + "dest_door": "west" + }, + { + "source_room": "b-06", + "source_door": "east", + "dest_room": "b-07", + "dest_door": "west" + }, + { + "source_room": "b-07", + "source_door": "east", + "dest_room": "b-08", + "dest_door": "west" + }, + { + "source_room": "b-08", + "source_door": "east", + "dest_room": "b-09", + "dest_door": "bottom" + }, + { + "source_room": "b-09", + "source_door": "top", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "bottom" + }, + { + "source_room": "c-01", + "source_door": "top", + "dest_room": "c-02", + "dest_door": "bottom" + }, + { + "source_room": "c-02", + "source_door": "top", + "dest_room": "c-03", + "dest_door": "south" + }, + { + "source_room": "c-03", + "source_door": "west", + "dest_room": "c-03b", + "dest_door": "east" + }, + { + "source_room": "c-03", + "source_door": "east", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-04", + "source_door": "north-west", + "dest_room": "c-06", + "dest_door": "south" + }, + { + "source_room": "c-04", + "source_door": "north-east", + "dest_room": "c-06b", + "dest_door": "south" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "c-05", + "dest_door": "west" + }, + { + "source_room": "c-06", + "source_door": "east", + "dest_room": "c-06b", + "dest_door": "west" + }, + { + "source_room": "c-06", + "source_door": "north", + "dest_room": "c-07", + "dest_door": "south-west" + }, + { + "source_room": "c-06b", + "source_door": "east", + "dest_room": "c-06c", + "dest_door": "west" + }, + { + "source_room": "c-06b", + "source_door": "north", + "dest_room": "c-07", + "dest_door": "south-east" + }, + { + "source_room": "c-07", + "source_door": "west", + "dest_room": "c-07b", + "dest_door": "east" + }, + { + "source_room": "c-07", + "source_door": "east", + "dest_room": "c-08", + "dest_door": "west" + }, + { + "source_room": "c-08", + "source_door": "east", + "dest_room": "c-09", + "dest_door": "bottom" + }, + { + "source_room": "c-09", + "source_door": "top", + "dest_room": "d-00", + "dest_door": "bottom" + }, + { + "source_room": "d-00", + "source_door": "top", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-01b", + "dest_door": "west" + }, + { + "source_room": "d-01b", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-01b", + "source_door": "south-west", + "dest_room": "d-01c", + "dest_door": "west" + }, + { + "source_room": "d-01c", + "source_door": "south", + "dest_room": "d-01d", + "dest_door": "west" + }, + { + "source_room": "d-01c", + "source_door": "east", + "dest_room": "d-01b", + "dest_door": "south-east" + }, + { + "source_room": "d-01d", + "source_door": "east", + "dest_room": "d-01c", + "dest_door": "south-east" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "east", + "dest_room": "d-04", + "dest_door": "west" + }, + { + "source_room": "d-03", + "source_door": "north-east", + "dest_room": "d-03b", + "dest_door": "east" + }, + { + "source_room": "d-03b", + "source_door": "west", + "dest_room": "d-03", + "dest_door": "north-west" + }, + { + "source_room": "d-04", + "source_door": "east", + "dest_room": "d-05", + "dest_door": "west" + }, + { + "source_room": "d-05", + "source_door": "east", + "dest_room": "d-05b", + "dest_door": "west" + }, + { + "source_room": "d-05", + "source_door": "north-east", + "dest_room": "d-06", + "dest_door": "south-west" + }, + { + "source_room": "d-06", + "source_door": "west", + "dest_room": "d-07", + "dest_door": "east" + }, + { + "source_room": "d-06", + "source_door": "south-east", + "dest_room": "d-08", + "dest_door": "west" + }, + { + "source_room": "d-06", + "source_door": "east", + "dest_room": "d-09", + "dest_door": "west" + }, + { + "source_room": "d-08", + "source_door": "east", + "dest_room": "d-10", + "dest_door": "west" + }, + { + "source_room": "d-09", + "source_door": "east", + "dest_room": "d-10", + "dest_door": "north-west" + }, + { + "source_room": "d-10", + "source_door": "north-east", + "dest_room": "d-10b", + "dest_door": "east" + }, + { + "source_room": "d-10", + "source_door": "east", + "dest_room": "d-11", + "dest_door": "bottom" + }, + { + "source_room": "d-10b", + "source_door": "west", + "dest_room": "d-10", + "dest_door": "north" + }, + { + "source_room": "d-11", + "source_door": "top", + "dest_room": "e-00b", + "dest_door": "bottom" + }, + { + "source_room": "e-00b", + "source_door": "top", + "dest_room": "e-00", + "dest_door": "south-west" + }, + { + "source_room": "e-00", + "source_door": "west", + "dest_room": "e-01", + "dest_door": "east" + }, + { + "source_room": "e-00", + "source_door": "north-west", + "dest_room": "e-02", + "dest_door": "west" + }, + { + "source_room": "e-00", + "source_door": "east", + "dest_room": "e-03", + "dest_door": "south-west" + }, + { + "source_room": "e-01", + "source_door": "west", + "dest_room": "e-01b", + "dest_door": "east" + }, + { + "source_room": "e-01b", + "source_door": "west", + "dest_room": "e-01c", + "dest_door": "west" + }, + { + "source_room": "e-01c", + "source_door": "east", + "dest_room": "e-01", + "dest_door": "north" + }, + { + "source_room": "e-02", + "source_door": "east", + "dest_room": "e-03", + "dest_door": "west" + }, + { + "source_room": "e-03", + "source_door": "east", + "dest_room": "e-04", + "dest_door": "west" + }, + { + "source_room": "e-04", + "source_door": "east", + "dest_room": "e-05", + "dest_door": "west" + }, + { + "source_room": "e-05", + "source_door": "east", + "dest_room": "e-06", + "dest_door": "west" + }, + { + "source_room": "e-06", + "source_door": "east", + "dest_room": "e-07", + "dest_door": "bottom" + }, + { + "source_room": "e-07", + "source_door": "top", + "dest_room": "e-08", + "dest_door": "south" + }, + { + "source_room": "e-08", + "source_door": "west", + "dest_room": "e-09", + "dest_door": "east" + }, + { + "source_room": "e-08", + "source_door": "east", + "dest_room": "e-10", + "dest_door": "south" + }, + { + "source_room": "e-09", + "source_door": "north", + "dest_room": "e-11", + "dest_door": "south" + }, + { + "source_room": "e-11", + "source_door": "north", + "dest_room": "e-12", + "dest_door": "west" + }, + { + "source_room": "e-11", + "source_door": "east", + "dest_room": "e-10", + "dest_door": "north" + }, + { + "source_room": "e-10", + "source_door": "east", + "dest_room": "e-10b", + "dest_door": "west" + }, + { + "source_room": "e-10b", + "source_door": "east", + "dest_room": "e-13", + "dest_door": "bottom" + }, + { + "source_room": "e-13", + "source_door": "top", + "dest_room": "f-00", + "dest_door": "south" + }, + { + "source_room": "f-00", + "source_door": "west", + "dest_room": "f-01", + "dest_door": "south" + }, + { + "source_room": "f-00", + "source_door": "east", + "dest_room": "f-02", + "dest_door": "west" + }, + { + "source_room": "f-00", + "source_door": "north-east", + "dest_room": "f-02", + "dest_door": "north-west" + }, + { + "source_room": "f-01", + "source_door": "north", + "dest_room": "f-00", + "dest_door": "north-west" + }, + { + "source_room": "f-02", + "source_door": "north-east", + "dest_room": "f-02b", + "dest_door": "west" + }, + { + "source_room": "f-02", + "source_door": "east", + "dest_room": "f-04", + "dest_door": "west" + }, + { + "source_room": "f-02b", + "source_door": "east", + "dest_room": "f-07", + "dest_door": "west" + }, + { + "source_room": "f-04", + "source_door": "east", + "dest_room": "f-03", + "dest_door": "west" + }, + { + "source_room": "f-03", + "source_door": "east", + "dest_room": "f-05", + "dest_door": "west" + }, + { + "source_room": "f-05", + "source_door": "east", + "dest_room": "f-08", + "dest_door": "west" + }, + { + "source_room": "f-05", + "source_door": "south-west", + "dest_room": "f-06", + "dest_door": "north-west" + }, + { + "source_room": "f-05", + "source_door": "south", + "dest_room": "f-06", + "dest_door": "north" + }, + { + "source_room": "f-05", + "source_door": "south-east", + "dest_room": "f-06", + "dest_door": "north-east" + }, + { + "source_room": "f-05", + "source_door": "north-west", + "dest_room": "f-07", + "dest_door": "south-west" + }, + { + "source_room": "f-05", + "source_door": "north", + "dest_room": "f-07", + "dest_door": "south" + }, + { + "source_room": "f-05", + "source_door": "north-east", + "dest_room": "f-07", + "dest_door": "south-east" + }, + { + "source_room": "f-08", + "source_door": "north-west", + "dest_room": "f-08b", + "dest_door": "west" + }, + { + "source_room": "f-08", + "source_door": "east", + "dest_room": "f-09", + "dest_door": "west" + }, + { + "source_room": "f-09", + "source_door": "east", + "dest_room": "f-10", + "dest_door": "west" + }, + { + "source_room": "f-08b", + "source_door": "east", + "dest_room": "f-08d", + "dest_door": "west" + }, + { + "source_room": "f-08d", + "source_door": "east", + "dest_room": "f-08c", + "dest_door": "west" + }, + { + "source_room": "f-08c", + "source_door": "east", + "dest_room": "f-10", + "dest_door": "north-east" + }, + { + "source_room": "f-10", + "source_door": "east", + "dest_room": "f-10b", + "dest_door": "west" + }, + { + "source_room": "f-10b", + "source_door": "east", + "dest_room": "f-11", + "dest_door": "bottom" + }, + { + "source_room": "f-11", + "source_door": "top", + "dest_room": "g-00", + "dest_door": "bottom" + }, + { + "source_room": "g-00", + "source_door": "top", + "dest_room": "g-00b", + "dest_door": "bottom" + }, + { + "source_room": "g-00b", + "source_door": "top", + "dest_room": "g-01", + "dest_door": "bottom" + }, + { + "source_room": "g-01", + "source_door": "top", + "dest_room": "g-02", + "dest_door": "bottom" + }, + { + "source_room": "g-02", + "source_door": "top", + "dest_room": "g-03", + "dest_door": "bottom" + } + ] + }, + { + "name": "7b", + "display_name": "The Summit B", + "rooms": [ + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "traffic_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "500 M", + "checkpoint_region": "bottom" + }, + { + "name": "b-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "traffic_blocks", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "1000 M", + "checkpoint_region": "west" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "1500 M", + "checkpoint_region": "west" + }, + { + "name": "d-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "moving_platforms", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "blue_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "2000 M", + "checkpoint_region": "west" + }, + { + "name": "e-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "blue_clouds", "pink_clouds", "coins", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "2500 M", + "checkpoint_region": "west" + }, + { + "name": "f-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "swap_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "swap_blocks", "dash_refills", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "dash_refills", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "3000 M", + "checkpoint_region": "bottom" + }, + { + "name": "g-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "dash_refills", "pink_clouds", "blue_clouds", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "springs", "dash_refills", "pink_clouds", "blue_clouds", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "goal", + "rule": [ [ "blue_cassette_blocks", "pink_cassette_blocks", "blue_clouds" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "dash_refills", "blue_clouds", "pink_clouds", "coins", "badeline_boosters", "red_boosters", "swap_blocks", "move_blocks", "blue_boosters", "dream_blocks", "traffic_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "bottom" + }, + { + "source_room": "a-03", + "source_door": "top", + "dest_room": "b-00", + "dest_door": "bottom" + }, + { + "source_room": "b-00", + "source_door": "top", + "dest_room": "b-01", + "dest_door": "bottom" + }, + { + "source_room": "b-01", + "source_door": "top", + "dest_room": "b-02", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east", + "dest_room": "b-03", + "dest_door": "bottom" + }, + { + "source_room": "b-03", + "source_door": "top", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "bottom" + }, + { + "source_room": "c-03", + "source_door": "top", + "dest_room": "d-00", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "east", + "dest_room": "d-01", + "dest_door": "west" + }, + { + "source_room": "d-01", + "source_door": "east", + "dest_room": "d-02", + "dest_door": "west" + }, + { + "source_room": "d-02", + "source_door": "east", + "dest_room": "d-03", + "dest_door": "bottom" + }, + { + "source_room": "d-03", + "source_door": "top", + "dest_room": "e-00", + "dest_door": "west" + }, + { + "source_room": "e-00", + "source_door": "east", + "dest_room": "e-01", + "dest_door": "west" + }, + { + "source_room": "e-01", + "source_door": "east", + "dest_room": "e-02", + "dest_door": "west" + }, + { + "source_room": "e-02", + "source_door": "east", + "dest_room": "e-03", + "dest_door": "bottom" + }, + { + "source_room": "e-03", + "source_door": "top", + "dest_room": "f-00", + "dest_door": "west" + }, + { + "source_room": "f-00", + "source_door": "east", + "dest_room": "f-01", + "dest_door": "west" + }, + { + "source_room": "f-01", + "source_door": "east", + "dest_room": "f-02", + "dest_door": "west" + }, + { + "source_room": "f-02", + "source_door": "east", + "dest_room": "f-03", + "dest_door": "bottom" + }, + { + "source_room": "f-03", + "source_door": "top", + "dest_room": "g-00", + "dest_door": "bottom" + }, + { + "source_room": "g-00", + "source_door": "top", + "dest_room": "g-01", + "dest_door": "bottom" + }, + { + "source_room": "g-01", + "source_door": "top", + "dest_room": "g-02", + "dest_door": "bottom" + }, + { + "source_room": "g-02", + "source_door": "top", + "dest_room": "g-03", + "dest_door": "bottom" + } + ] + }, + { + "name": "7c", + "display_name": "The Summit C", + "rooms": [ + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "badeline_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "coins", "badeline_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "pink_clouds", "dash_refills", "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "pink_clouds", "dash_refills", "springs", "coins", "badeline_boosters" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + }, + { + "source_room": "02", + "source_door": "east", + "dest_room": "03", + "dest_door": "west" + } + ] + }, + { + "name": "8a", + "display_name": "Epilogue", + "rooms": [ + { + "name": "outside", + "regions": [ + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "east" + }, + { + "name": "bridge", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "secret", + "regions": [ + { + "name": "west", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "outside", + "source_door": "east", + "dest_room": "bridge", + "dest_door": "west" + }, + { + "source_room": "bridge", + "source_door": "east", + "dest_room": "secret", + "dest_door": "west" + } + ] + }, + { + "name": "9a", + "display_name": "Core A", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "0x", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "car", + "display_name": "Car", + "type": "car", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Into the Core", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [] + }, + { + "dest": "north", + "rule": [ [ "fire_ice_balls", "core_toggles", "core_blocks", "dash_refills", "coins" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "north-west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_toggles" ] ] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "fire_ice_balls", "core_toggles", "dash_refills", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "fire_ice_balls", "core_toggles", "core_blocks", "dash_refills", "bumpers", "coins" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_toggles" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "core_toggles", "core_blocks", "bumpers" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_toggles", "core_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "north-east", + "rule": [ [ "core_toggles", "fire_ice_balls", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Hot and Cold", + "checkpoint_region": "west" + }, + { + "name": "c-00b", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "fire_ice_balls", "core_toggles", "dash_refills", "bumpers" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "fire_ice_balls", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "core_blocks", "core_toggles", "fire_ice_balls", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "dash_refills", "bumpers" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "core_blocks", "core_toggles", "dash_refills", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "north", + "rule": [ [ "core_toggles", "fire_ice_balls", "dash_refills" ] ] + }, + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "fire_ice_balls", "dash_refills" ] ] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03b", + "regions": [ + { + "name": "west", + "connections": [] + }, + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + }, + { + "dest": "east", + "rule": [ [ "core_toggles" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "south", + "rule": [ [ "core_toggles" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Heart of the Mountain", + "checkpoint_region": "bottom" + }, + { + "name": "d-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_toggles" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_blocks", "core_toggles" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_toggles", "fire_ice_balls" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-06", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_blocks" ] ] + } + ], + "locations": [ + { + "name": "strawberry", + "display_name": "Strawberry", + "type": "strawberry", + "rule": [ [ "dash_refills", "core_blocks" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-07", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_blocks", "core_toggles", "fire_ice_balls", "springs", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_blocks", "core_toggles", "fire_ice_balls", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bumpers", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "bumpers", "core_toggles", "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-10c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "center", + "rule": [ [ "core_blocks", "core_toggles", "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ] + }, + { + "name": "center", + "connections": [ + { + "dest": "east", + "rule": [] + } + ], + "locations": [ + { + "name": "cassette", + "display_name": "Cassette", + "type": "cassette", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "space", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "dash_refills", "springs", "coins", "bumpers", "feathers", "badeline_boosters", "core_blocks", "core_toggles", "fire_ice_balls", "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "00", + "source_door": "west", + "dest_room": "0x", + "dest_door": "east" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + }, + { + "source_room": "02", + "source_door": "east", + "dest_room": "a-00", + "dest_door": "west" + }, + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "bottom" + }, + { + "source_room": "a-03", + "source_door": "top", + "dest_room": "b-00", + "dest_door": "south" + }, + { + "source_room": "b-00", + "source_door": "west", + "dest_room": "b-06", + "dest_door": "east" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "north", + "dest_room": "b-07b", + "dest_door": "bottom" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-04", + "dest_door": "west" + }, + { + "source_room": "b-04", + "source_door": "east", + "dest_room": "b-05", + "dest_door": "east" + }, + { + "source_room": "b-05", + "source_door": "west", + "dest_room": "b-04", + "dest_door": "north-west" + }, + { + "source_room": "b-07b", + "source_door": "top", + "dest_room": "b-07", + "dest_door": "bottom" + }, + { + "source_room": "b-07", + "source_door": "top", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "north-east", + "dest_room": "c-00b", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "west" + }, + { + "source_room": "c-03", + "source_door": "east", + "dest_room": "c-04", + "dest_door": "west" + }, + { + "source_room": "c-03", + "source_door": "north", + "dest_room": "c-03b", + "dest_door": "south" + }, + { + "source_room": "c-03b", + "source_door": "west", + "dest_room": "c-03", + "dest_door": "north-west" + }, + { + "source_room": "c-03b", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "north-east" + }, + { + "source_room": "c-04", + "source_door": "east", + "dest_room": "d-00", + "dest_door": "bottom" + }, + { + "source_room": "d-00", + "source_door": "top", + "dest_room": "d-01", + "dest_door": "bottom" + }, + { + "source_room": "d-01", + "source_door": "top", + "dest_room": "d-02", + "dest_door": "bottom" + }, + { + "source_room": "d-02", + "source_door": "top", + "dest_room": "d-03", + "dest_door": "bottom" + }, + { + "source_room": "d-03", + "source_door": "top", + "dest_room": "d-04", + "dest_door": "bottom" + }, + { + "source_room": "d-04", + "source_door": "top", + "dest_room": "d-05", + "dest_door": "bottom" + }, + { + "source_room": "d-05", + "source_door": "top", + "dest_room": "d-06", + "dest_door": "bottom" + }, + { + "source_room": "d-06", + "source_door": "top", + "dest_room": "d-07", + "dest_door": "bottom" + }, + { + "source_room": "d-07", + "source_door": "top", + "dest_room": "d-08", + "dest_door": "west" + }, + { + "source_room": "d-08", + "source_door": "east", + "dest_room": "d-09", + "dest_door": "west" + }, + { + "source_room": "d-09", + "source_door": "east", + "dest_room": "d-10", + "dest_door": "west" + }, + { + "source_room": "d-10", + "source_door": "east", + "dest_room": "d-10b", + "dest_door": "west" + }, + { + "source_room": "d-10b", + "source_door": "east", + "dest_room": "d-10c", + "dest_door": "west" + }, + { + "source_room": "d-10c", + "source_door": "east", + "dest_room": "d-11", + "dest_door": "west" + }, + { + "source_room": "d-11", + "source_door": "east", + "dest_room": "space", + "dest_door": "west" + } + ] + }, + { + "name": "9b", + "display_name": "Core B", + "rooms": [ + { + "name": "00", + "regions": [ + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "east" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Into the Core", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "fire_ice_balls", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "fire_ice_balls" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "fire_ice_balls" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "dash_refills", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Burning or Freezing", + "checkpoint_region": "west" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "core_toggles", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_toggles", "fire_ice_balls", "bumpers", "dash_refills", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_toggles", "fire_ice_balls" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_blocks", "core_toggles", "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Heartbeat", + "checkpoint_region": "bottom" + }, + { + "name": "c-02", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "core_toggles", "bumpers", "fire_ice_balls" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "springs" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-04", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "springs", "traffic_blocks", "dream_blocks", "moving_platforms", "blue_clouds", "swap_blocks", "kevin_blocks", "core_blocks", "badeline_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_toggles", "core_blocks", "bumpers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "fire_ice_balls", "core_toggles", "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "fire_ice_balls", "core_toggles", "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_toggles" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "core_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "space", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "dash_refills", "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "dash_refills", "bumpers", "coins", "springs", "traffic_blocks", "dream_blocks", "moving_platforms", "blue_clouds", "swap_blocks", "kevin_blocks", "core_blocks", "badeline_boosters", "core_toggles", "fire_ice_balls", "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "a-00", + "dest_door": "west" + }, + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-05", + "dest_door": "west" + }, + { + "source_room": "a-05", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-04", + "dest_door": "west" + }, + { + "source_room": "b-04", + "source_door": "east", + "dest_room": "b-05", + "dest_door": "west" + }, + { + "source_room": "b-05", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "bottom" + }, + { + "source_room": "c-01", + "source_door": "top", + "dest_room": "c-02", + "dest_door": "bottom" + }, + { + "source_room": "c-02", + "source_door": "top", + "dest_room": "c-03", + "dest_door": "bottom" + }, + { + "source_room": "c-03", + "source_door": "top", + "dest_room": "c-04", + "dest_door": "bottom" + }, + { + "source_room": "c-04", + "source_door": "top", + "dest_room": "c-05", + "dest_door": "west" + }, + { + "source_room": "c-05", + "source_door": "east", + "dest_room": "c-06", + "dest_door": "west" + }, + { + "source_room": "c-06", + "source_door": "east", + "dest_room": "c-08", + "dest_door": "west" + }, + { + "source_room": "c-08", + "source_door": "east", + "dest_room": "c-07", + "dest_door": "west" + }, + { + "source_room": "c-07", + "source_door": "east", + "dest_room": "space", + "dest_door": "west" + } + ] + }, + { + "name": "9c", + "display_name": "Core C", + "rooms": [ + { + "name": "intro", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "core_blocks", "dash_refills", "core_toggles", "bumpers" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "goal", + "rule": [ [ "springs", "traffic_blocks", "dash_refills", "core_toggles", "dream_blocks", "bumpers", "pink_clouds", "swap_blocks", "kevin_blocks", "core_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "goal", + "connections": [], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + }, + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "springs", "traffic_blocks", "dash_refills", "core_toggles", "dream_blocks", "bumpers", "pink_clouds", "swap_blocks", "kevin_blocks", "core_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "intro", + "source_door": "east", + "dest_room": "00", + "dest_door": "west" + }, + { + "source_room": "00", + "source_door": "east", + "dest_room": "01", + "dest_door": "west" + }, + { + "source_room": "01", + "source_door": "east", + "dest_room": "02", + "dest_door": "west" + } + ] + }, + { + "name": "10a", + "display_name": "Farewell", + "rooms": [ + { + "name": "intro-00-past", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "special", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Start", + "checkpoint_region": "west" + }, + { + "name": "intro-01-future", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "badeline_boosters", "blue_clouds" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "special", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "intro-02-launch", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "badeline_boosters", "blue_clouds" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "intro-03-space", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Singular", + "checkpoint_region": "west" + }, + { + "name": "a-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "double_dash_refills", "dash_refills" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "a-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "coins", "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "coins", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs", "dream_blocks", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "b-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish" ] ] + }, + { + "dest": "north-east", + "rule": [ [ "jellyfish", "dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + }, + { + "name": "north-east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Power Source", + "checkpoint_region": "west" + }, + { + "name": "c-00b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-alt-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-alt-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "c-03", + "regions": [ + { + "name": "south-west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "jellyfish", "springs" ] ] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south-west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "south-east", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "north", + "rule": [ [ "red_boosters", "Power Source Key 1", "Power Source Key 2", "Power Source Key 3", "Power Source Key 4", "Power Source Key 5" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [ [ "Power Source Key 5" ] ] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [ [ "double_dash_refills", "dash_switches" ] ] + }, + { + "dest": "north-west", + "rule": [ [ "double_dash_refills", "springs", "dash_switches" ] ] + }, + { + "dest": "south-east-door", + "rule": [] + } + ] + }, + { + "name": "north-west", + "connections": [ + { + "dest": "south", + "rule": [ [ "jellyfish", "dash_switches" ] ] + }, + { + "dest": "breaker", + "rule": [ [ "jellyfish", "springs", "dash_switches", "breaker_boxes" ] ] + } + ] + }, + { + "name": "breaker", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "north-east-door", + "rule": [] + }, + { + "dest": "south-west-door", + "rule": [] + }, + { + "dest": "west-door", + "rule": [] + }, + { + "dest": "north-west-door", + "rule": [] + } + ] + }, + { + "name": "north-east-door", + "connections": [ + { + "dest": "south", + "rule": [ [ "breaker_boxes" ] ] + } + ] + }, + { + "name": "south-east-door", + "connections": [ + { + "dest": "south", + "rule": [ [ "breaker_boxes" ] ] + } + ] + }, + { + "name": "south-west-door", + "connections": [ + { + "dest": "south", + "rule": [ [ "breaker_boxes" ] ] + } + ] + }, + { + "name": "west-door", + "connections": [ + { + "dest": "south", + "rule": [ [ "breaker_boxes" ] ] + } + ] + }, + { + "name": "north-west-door", + "connections": [ + { + "dest": "south", + "rule": [ [ "breaker_boxes" ] ] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east-door", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east-door", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-west-door", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "west-door", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-west-door", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-04", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "key_1", + "display_name": "Power Source Key 1", + "type": "key", + "rule": [ [ "double_dash_refills", "jellyfish" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-03", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [ [ "breaker_boxes" ] ] + }, + { + "name": "key_2", + "display_name": "Power Source Key 2", + "type": "key", + "rule": [ [ "breaker_boxes", "double_dash_refills", "jellyfish" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-01", + "regions": [ + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "key_3", + "display_name": "Power Source Key 3", + "type": "key", + "rule": [ [ "dash_refills", "dash_switches", "jellyfish" ] ] + } + ] + } + ], + "doors": [ + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-02", + "regions": [ + { + "name": "bottom", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [ [ "breaker_boxes" ] ] + }, + { + "name": "key_4", + "display_name": "Power Source Key 4", + "type": "key", + "rule": [ [ "breaker_boxes", "double_dash_refills", "springs", "move_blocks", "jellyfish" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "d-05", + "regions": [ + { + "name": "west", + "connections": [], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "key_5", + "display_name": "Power Source Key 5", + "type": "key", + "rule": [ [ "double_dash_refills", "coins", "red_boosters", "jellyfish" ] ] + } + ] + }, + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00y", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + }, + { + "dest": "south-east", + "rule": [] + } + ] + }, + { + "name": "south-east", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north-east", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": false + }, + { + "name": "south-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north-east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00yb", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "red_boosters", "dash_refills", "double_dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "left", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00z", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Remembered", + "checkpoint_region": "south" + }, + { + "name": "e-00", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "blue_clouds", "pufferfish", "coins", "double_dash_refills" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-00b", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "jellyfish", "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-01", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "north", + "rule": [ [ "jellyfish", "springs", "dash_refills" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + }, + { + "name": "car", + "display_name": "Secret Car", + "type": "car", + "rule": [ [ "jellyfish", "springs", "dash_refills" ] ] + } + ] + }, + { + "name": "north", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs", "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "dash_switches" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs", "coins", "traffic_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-05b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-05c", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "swap_blocks", "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "dash_refills", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs", "double_dash_refills", "move_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "e-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "double_dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [], + "locations": [ + { + "name": "crystal_heart", + "display_name": "Crystal Heart?", + "type": "crystal_heart", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "intro-00-past", + "source_door": "east", + "dest_room": "intro-01-future", + "dest_door": "west" + }, + { + "source_room": "intro-01-future", + "source_door": "east", + "dest_room": "intro-02-launch", + "dest_door": "bottom" + }, + { + "source_room": "intro-02-launch", + "source_door": "top", + "dest_room": "intro-03-space", + "dest_door": "west" + }, + { + "source_room": "intro-03-space", + "source_door": "east", + "dest_room": "a-00", + "dest_door": "west" + }, + { + "source_room": "a-00", + "source_door": "east", + "dest_room": "a-01", + "dest_door": "west" + }, + { + "source_room": "a-01", + "source_door": "east", + "dest_room": "a-02", + "dest_door": "west" + }, + { + "source_room": "a-02", + "source_door": "east", + "dest_room": "a-03", + "dest_door": "west" + }, + { + "source_room": "a-03", + "source_door": "east", + "dest_room": "a-04", + "dest_door": "west" + }, + { + "source_room": "a-04", + "source_door": "east", + "dest_room": "a-05", + "dest_door": "west" + }, + { + "source_room": "a-05", + "source_door": "east", + "dest_room": "b-00", + "dest_door": "west" + }, + { + "source_room": "b-00", + "source_door": "east", + "dest_room": "b-01", + "dest_door": "west" + }, + { + "source_room": "b-01", + "source_door": "east", + "dest_room": "b-02", + "dest_door": "west" + }, + { + "source_room": "b-02", + "source_door": "east", + "dest_room": "b-03", + "dest_door": "west" + }, + { + "source_room": "b-03", + "source_door": "east", + "dest_room": "b-04", + "dest_door": "west" + }, + { + "source_room": "b-04", + "source_door": "east", + "dest_room": "b-05", + "dest_door": "west" + }, + { + "source_room": "b-05", + "source_door": "east", + "dest_room": "b-06", + "dest_door": "west" + }, + { + "source_room": "b-06", + "source_door": "east", + "dest_room": "b-07", + "dest_door": "west" + }, + { + "source_room": "b-07", + "source_door": "east", + "dest_room": "c-00", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "east", + "dest_room": "c-00b", + "dest_door": "west" + }, + { + "source_room": "c-00", + "source_door": "north-east", + "dest_room": "c-alt-00", + "dest_door": "west" + }, + { + "source_room": "c-00b", + "source_door": "east", + "dest_room": "c-01", + "dest_door": "west" + }, + { + "source_room": "c-01", + "source_door": "east", + "dest_room": "c-02", + "dest_door": "west" + }, + { + "source_room": "c-02", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "south" + }, + { + "source_room": "c-alt-00", + "source_door": "east", + "dest_room": "c-alt-01", + "dest_door": "west" + }, + { + "source_room": "c-alt-01", + "source_door": "east", + "dest_room": "c-03", + "dest_door": "south-west" + }, + { + "source_room": "c-03", + "source_door": "north", + "dest_room": "d-00", + "dest_door": "south" + }, + { + "source_room": "d-00", + "source_door": "north-east-door", + "dest_room": "d-04", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "south-east-door", + "dest_room": "d-03", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "south-west-door", + "dest_room": "d-01", + "dest_door": "east" + }, + { + "source_room": "d-00", + "source_door": "west-door", + "dest_room": "d-02", + "dest_door": "bottom" + }, + { + "source_room": "d-00", + "source_door": "north-west-door", + "dest_room": "d-05", + "dest_door": "west" + }, + { + "source_room": "d-00", + "source_door": "north", + "dest_room": "d-05", + "dest_door": "south" + }, + { + "source_room": "d-05", + "source_door": "north", + "dest_room": "e-00y", + "dest_door": "south" + }, + { + "source_room": "e-00y", + "source_door": "north", + "dest_room": "e-00z", + "dest_door": "south" + }, + { + "source_room": "e-00y", + "source_door": "south-east", + "dest_room": "e-00yb", + "dest_door": "south" + }, + { + "source_room": "e-00yb", + "source_door": "north", + "dest_room": "e-00y", + "dest_door": "north-east" + }, + { + "source_room": "e-00z", + "source_door": "north", + "dest_room": "e-00", + "dest_door": "south" + }, + { + "source_room": "e-00", + "source_door": "north", + "dest_room": "e-00b", + "dest_door": "south" + }, + { + "source_room": "e-00b", + "source_door": "north", + "dest_room": "e-01", + "dest_door": "south" + }, + { + "source_room": "e-01", + "source_door": "north", + "dest_room": "e-02", + "dest_door": "west" + }, + { + "source_room": "e-02", + "source_door": "east", + "dest_room": "e-03", + "dest_door": "west" + }, + { + "source_room": "e-03", + "source_door": "east", + "dest_room": "e-04", + "dest_door": "west" + }, + { + "source_room": "e-04", + "source_door": "east", + "dest_room": "e-05", + "dest_door": "west" + }, + { + "source_room": "e-05", + "source_door": "east", + "dest_room": "e-05b", + "dest_door": "west" + }, + { + "source_room": "e-05b", + "source_door": "east", + "dest_room": "e-05c", + "dest_door": "west" + }, + { + "source_room": "e-05c", + "source_door": "east", + "dest_room": "e-06", + "dest_door": "west" + }, + { + "source_room": "e-06", + "source_door": "east", + "dest_room": "e-07", + "dest_door": "west" + }, + { + "source_room": "e-07", + "source_door": "east", + "dest_room": "e-08", + "dest_door": "west" + } + ] + }, + { + "name": "10b", + "display_name": "Farewell", + "rooms": [ + { + "name": "f-door", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Event Horizon", + "checkpoint_region": "west" + }, + { + "name": "f-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dream_blocks" ] ] + } + ], + "locations": [ + { + "name": "car", + "display_name": "Internet Car", + "type": "car", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "kevin_blocks", "dream_blocks", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "coins", "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "f-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-00", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dash_refills", "traffic_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-01", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "blue_boosters" ] ] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-03", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "dream_blocks", "coins" ] ] + } + ] + }, + { + "name": "top", + "connections": [] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "move_blocks", "springs" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "g-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "feathers" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [ [ "double_dash_refills", "dash_refills", "springs", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-00b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Determination", + "checkpoint_region": "west" + }, + { + "name": "h-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "swap_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "springs", "move_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "double_dash_refills", "springs" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-03b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "double_dash_refills", "core_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-04", + "regions": [ + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [] + }, + { + "dest": "bottom", + "rule": [ [ "red_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + }, + { + "name": "bottom", + "connections": [] + } + ], + "doors": [ + { + "name": "top", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + }, + { + "name": "bottom", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-04b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "top", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "springs", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-06b", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "fire_ice_balls", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [ + { + "dest": "bottom", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_boosters", "springs", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars_1", + "display_name": "Binoculars 1", + "type": "binoculars", + "rule": [] + }, + { + "name": "binoculars_2", + "display_name": "Binoculars 2", + "type": "binoculars", + "rule": [ [ "blue_boosters", "springs", "coins" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "coins", "feathers", "kevin_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "h-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "feathers", "springs", "badeline_boosters" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks", "green_cassette_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [ + { + "dest": "west", + "rule": [ [ "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks", "green_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Stubbornness", + "checkpoint_region": "west" + }, + { + "name": "i-00b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "springs", "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks", "green_cassette_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "coins", "springs", "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "blue_cassette_blocks", "pink_cassette_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "red_boosters", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "i-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "blue_cassette_blocks", "pink_cassette_blocks", "yellow_cassette_blocks" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-00", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Reconciliation", + "checkpoint_region": "west" + }, + { + "name": "j-00b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "double_dash_refills", "springs", "jellyfish", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-01", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "springs", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-02", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-03", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "springs", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-04", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "bird" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-05", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "bird", "badeline_boosters", "feathers" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-06", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dash_refills", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-07", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "feathers", "springs", "bird" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-08", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "dream_blocks", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-09", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "springs", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-10", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "pufferfish", "swap_blocks", "dash_refills", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-11", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "move_blocks", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-12", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "dash_refills", "double_dash_refills", "bird" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-13", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "feathers", "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-14", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "traffic_blocks", "pufferfish", "double_dash_refills", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-14b", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "springs", "jellyfish", "double_dash_refills" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-15", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "kevin_blocks", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-16", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [ [ "jellyfish", "pufferfish", "springs", "dash_refills", "double_dash_refills", "coins", "feathers", "bird", "badeline_boosters", "breaker_boxes" ] ] + }, + { + "dest": "top", + "rule": [ [ "jellyfish", "pufferfish", "springs", "dash_refills", "double_dash_refills", "coins", "feathers", "bird", "badeline_boosters", "breaker_boxes" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "left", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "Farewell", + "checkpoint_region": "west" + }, + { + "name": "j-17", + "regions": [ + { + "name": "south", + "connections": [ + { + "dest": "west", + "rule": [] + } + ] + }, + { + "name": "west", + "connections": [ + { + "dest": "south", + "rule": [] + } + ] + }, + { + "name": "north", + "connections": [ + { + "dest": "south", + "rule": [] + }, + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "south", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "west", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "north", + "direction": "up", + "blocked": false, + "closes_behind": false + }, + { + "name": "east", + "direction": "right", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-18", + "regions": [ + { + "name": "west", + "connections": [ + { + "dest": "east", + "rule": [] + } + ] + }, + { + "name": "east", + "connections": [] + } + ], + "doors": [ + { + "name": "west", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "east", + "direction": "down", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "j-19", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "jellyfish", "springs", "dash_refills", "double_dash_refills", "coins" ] ] + } + ], + "locations": [ + { + "name": "binoculars", + "display_name": "Binoculars", + "type": "binoculars", + "rule": [] + } + ] + }, + { + "name": "top", + "connections": [], + "locations": [ + { + "name": "moon_berry", + "display_name": "Moon Berry", + "type": "strawberry", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "left", + "blocked": false, + "closes_behind": false + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": false + } + ], + "checkpoint": "", + "checkpoint_region": "" + }, + { + "name": "GOAL", + "regions": [ + { + "name": "main", + "connections": [ + { + "dest": "moon", + "rule": [] + } + ], + "locations": [ + { + "name": "clear", + "display_name": "Level Clear", + "type": "level_clear", + "rule": [] + } + ] + }, + { + "name": "moon", + "connections": [ + { + "dest": "main", + "rule": [] + } + ] + } + ], + "doors": [ + { + "name": "main", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "moon", + "direction": "down", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [ + { + "source_room": "f-door", + "source_door": "east", + "dest_room": "f-00", + "dest_door": "west" + }, + { + "source_room": "f-00", + "source_door": "east", + "dest_room": "f-01", + "dest_door": "west" + }, + { + "source_room": "f-01", + "source_door": "east", + "dest_room": "f-02", + "dest_door": "west" + }, + { + "source_room": "f-02", + "source_door": "east", + "dest_room": "f-03", + "dest_door": "west" + }, + { + "source_room": "f-03", + "source_door": "east", + "dest_room": "f-04", + "dest_door": "west" + }, + { + "source_room": "f-04", + "source_door": "east", + "dest_room": "f-05", + "dest_door": "west" + }, + { + "source_room": "f-05", + "source_door": "east", + "dest_room": "f-06", + "dest_door": "west" + }, + { + "source_room": "f-06", + "source_door": "east", + "dest_room": "f-07", + "dest_door": "west" + }, + { + "source_room": "f-07", + "source_door": "east", + "dest_room": "f-08", + "dest_door": "west" + }, + { + "source_room": "f-08", + "source_door": "east", + "dest_room": "f-09", + "dest_door": "west" + }, + { + "source_room": "f-09", + "source_door": "east", + "dest_room": "g-00", + "dest_door": "bottom" + }, + { + "source_room": "g-00", + "source_door": "top", + "dest_room": "g-01", + "dest_door": "bottom" + }, + { + "source_room": "g-01", + "source_door": "top", + "dest_room": "g-03", + "dest_door": "bottom" + }, + { + "source_room": "g-03", + "source_door": "top", + "dest_room": "g-02", + "dest_door": "west" + }, + { + "source_room": "g-02", + "source_door": "east", + "dest_room": "g-04", + "dest_door": "west" + }, + { + "source_room": "g-04", + "source_door": "east", + "dest_room": "g-05", + "dest_door": "west" + }, + { + "source_room": "g-05", + "source_door": "east", + "dest_room": "g-06", + "dest_door": "west" + }, + { + "source_room": "g-06", + "source_door": "east", + "dest_room": "h-00b", + "dest_door": "west" + }, + { + "source_room": "h-00b", + "source_door": "east", + "dest_room": "h-00", + "dest_door": "west" + }, + { + "source_room": "h-00", + "source_door": "east", + "dest_room": "h-01", + "dest_door": "west" + }, + { + "source_room": "h-01", + "source_door": "east", + "dest_room": "h-02", + "dest_door": "west" + }, + { + "source_room": "h-02", + "source_door": "east", + "dest_room": "h-03", + "dest_door": "west" + }, + { + "source_room": "h-03", + "source_door": "east", + "dest_room": "h-03b", + "dest_door": "west" + }, + { + "source_room": "h-03b", + "source_door": "east", + "dest_room": "h-04", + "dest_door": "top" + }, + { + "source_room": "h-04", + "source_door": "east", + "dest_room": "h-04b", + "dest_door": "west" + }, + { + "source_room": "h-04", + "source_door": "bottom", + "dest_room": "h-05", + "dest_door": "west" + }, + { + "source_room": "h-04b", + "source_door": "east", + "dest_room": "h-05", + "dest_door": "top" + }, + { + "source_room": "h-05", + "source_door": "east", + "dest_room": "h-06", + "dest_door": "west" + }, + { + "source_room": "h-06", + "source_door": "east", + "dest_room": "h-06b", + "dest_door": "bottom" + }, + { + "source_room": "h-06b", + "source_door": "top", + "dest_room": "h-07", + "dest_door": "west" + }, + { + "source_room": "h-07", + "source_door": "east", + "dest_room": "h-08", + "dest_door": "west" + }, + { + "source_room": "h-08", + "source_door": "east", + "dest_room": "h-09", + "dest_door": "west" + }, + { + "source_room": "h-09", + "source_door": "east", + "dest_room": "h-10", + "dest_door": "west" + }, + { + "source_room": "h-10", + "source_door": "east", + "dest_room": "i-00", + "dest_door": "west" + }, + { + "source_room": "i-00", + "source_door": "east", + "dest_room": "i-00b", + "dest_door": "west" + }, + { + "source_room": "i-00b", + "source_door": "east", + "dest_room": "i-01", + "dest_door": "west" + }, + { + "source_room": "i-01", + "source_door": "east", + "dest_room": "i-02", + "dest_door": "west" + }, + { + "source_room": "i-02", + "source_door": "east", + "dest_room": "i-03", + "dest_door": "west" + }, + { + "source_room": "i-03", + "source_door": "east", + "dest_room": "i-04", + "dest_door": "west" + }, + { + "source_room": "i-04", + "source_door": "east", + "dest_room": "i-05", + "dest_door": "west" + }, + { + "source_room": "i-05", + "source_door": "east", + "dest_room": "j-00", + "dest_door": "west" + }, + { + "source_room": "j-00", + "source_door": "east", + "dest_room": "j-00b", + "dest_door": "west" + }, + { + "source_room": "j-00b", + "source_door": "east", + "dest_room": "j-01", + "dest_door": "west" + }, + { + "source_room": "j-01", + "source_door": "east", + "dest_room": "j-02", + "dest_door": "west" + }, + { + "source_room": "j-02", + "source_door": "east", + "dest_room": "j-03", + "dest_door": "west" + }, + { + "source_room": "j-03", + "source_door": "east", + "dest_room": "j-04", + "dest_door": "west" + }, + { + "source_room": "j-04", + "source_door": "east", + "dest_room": "j-05", + "dest_door": "west" + }, + { + "source_room": "j-05", + "source_door": "east", + "dest_room": "j-06", + "dest_door": "west" + }, + { + "source_room": "j-06", + "source_door": "east", + "dest_room": "j-07", + "dest_door": "west" + }, + { + "source_room": "j-07", + "source_door": "east", + "dest_room": "j-08", + "dest_door": "west" + }, + { + "source_room": "j-08", + "source_door": "east", + "dest_room": "j-09", + "dest_door": "west" + }, + { + "source_room": "j-09", + "source_door": "east", + "dest_room": "j-10", + "dest_door": "west" + }, + { + "source_room": "j-10", + "source_door": "east", + "dest_room": "j-11", + "dest_door": "west" + }, + { + "source_room": "j-11", + "source_door": "east", + "dest_room": "j-12", + "dest_door": "west" + }, + { + "source_room": "j-12", + "source_door": "east", + "dest_room": "j-13", + "dest_door": "west" + }, + { + "source_room": "j-13", + "source_door": "east", + "dest_room": "j-14", + "dest_door": "west" + }, + { + "source_room": "j-14", + "source_door": "east", + "dest_room": "j-14b", + "dest_door": "west" + }, + { + "source_room": "j-14b", + "source_door": "east", + "dest_room": "j-15", + "dest_door": "west" + }, + { + "source_room": "j-15", + "source_door": "east", + "dest_room": "j-16", + "dest_door": "west" + }, + { + "source_room": "j-16", + "source_door": "east", + "dest_room": "GOAL", + "dest_door": "main" + }, + { + "source_room": "j-16", + "source_door": "top", + "dest_room": "j-17", + "dest_door": "south" + }, + { + "source_room": "j-17", + "source_door": "west", + "dest_room": "j-18", + "dest_door": "west" + }, + { + "source_room": "j-17", + "source_door": "east", + "dest_room": "j-19", + "dest_door": "bottom" + }, + { + "source_room": "j-18", + "source_door": "east", + "dest_room": "j-17", + "dest_door": "north" + }, + { + "source_room": "j-19", + "source_door": "top", + "dest_room": "GOAL", + "dest_door": "moon" + } + ] + }, + { + "name": "10c", + "display_name": "Farewell", + "rooms": [ + { + "name": "end-golden", + "regions": [ + { + "name": "bottom", + "connections": [ + { + "dest": "top", + "rule": [ [ "double_dash_refills", "jellyfish", "springs", "pufferfish", "badeline_boosters" ] ] + } + ], + "locations": [ + { + "name": "binoculars_1", + "display_name": "Binoculars 1", + "type": "binoculars", + "rule": [] + }, + { + "name": "binoculars_2", + "display_name": "Binoculars 2", + "type": "binoculars", + "rule": [] + }, + { + "name": "binoculars_3", + "display_name": "Binoculars 3", + "type": "binoculars", + "rule": [ [ "double_dash_refills", "jellyfish", "springs", "pufferfish" ] ] + } + ] + }, + { + "name": "top", + "connections": [], + "locations": [ + { + "name": "golden", + "display_name": "Golden Strawberry", + "type": "golden_strawberry", + "rule": [ [ "traffic_blocks", "dash_refills", "double_dash_refills", "dream_blocks", "swap_blocks", "move_blocks", "blue_boosters", "springs", "feathers", "coins", "red_boosters", "kevin_blocks", "core_blocks", "fire_ice_balls", "badeline_boosters", "bird", "breaker_boxes", "pufferfish", "jellyfish", "pink_cassette_blocks", "blue_cassette_blocks", "yellow_cassette_blocks", "green_cassette_blocks" ] ] + } + ] + } + ], + "doors": [ + { + "name": "bottom", + "direction": "down", + "blocked": false, + "closes_behind": true + }, + { + "name": "top", + "direction": "up", + "blocked": false, + "closes_behind": true + } + ], + "checkpoint": "", + "checkpoint_region": "" + } + ], + "room_connections": [] + } + ] +} \ No newline at end of file diff --git a/worlds/celeste_open_world/data/CelesteLevelData.py b/worlds/celeste_open_world/data/CelesteLevelData.py new file mode 100644 index 0000000000..6ba43fc34d --- /dev/null +++ b/worlds/celeste_open_world/data/CelesteLevelData.py @@ -0,0 +1,9792 @@ +# THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MANUALLY EDIT. + +from ..Levels import Level, Room, PreRegion, LevelLocation, RegionConnection, RoomConnection, Door, DoorDirection, LocationType +from ..Names import ItemName + +all_doors: dict[str, Door] = { + "0a_-1_east": Door("0a_-1_east", "0a_-1", DoorDirection.right, False, False), + + "0a_0_west": Door("0a_0_west", "0a_0", DoorDirection.left, False, False), + "0a_0_east": Door("0a_0_east", "0a_0", DoorDirection.right, False, False), + "0a_0_north": Door("0a_0_north", "0a_0", DoorDirection.up, False, False), + + "0a_0b_south": Door("0a_0b_south", "0a_0b", DoorDirection.down, False, False), + + "0a_1_west": Door("0a_1_west", "0a_1", DoorDirection.left, False, False), + "0a_1_east": Door("0a_1_east", "0a_1", DoorDirection.right, False, False), + + "0a_2_west": Door("0a_2_west", "0a_2", DoorDirection.left, False, False), + "0a_2_east": Door("0a_2_east", "0a_2", DoorDirection.right, False, False), + + "0a_3_west": Door("0a_3_west", "0a_3", DoorDirection.left, False, False), + + "1a_1_east": Door("1a_1_east", "1a_1", DoorDirection.up, False, False), + + "1a_2_west": Door("1a_2_west", "1a_2", DoorDirection.down, False, True), + "1a_2_east": Door("1a_2_east", "1a_2", DoorDirection.up, False, False), + + "1a_3_west": Door("1a_3_west", "1a_3", DoorDirection.down, False, True), + "1a_3_east": Door("1a_3_east", "1a_3", DoorDirection.up, False, False), + + "1a_4_west": Door("1a_4_west", "1a_4", DoorDirection.down, False, True), + "1a_4_east": Door("1a_4_east", "1a_4", DoorDirection.up, False, False), + + "1a_3b_west": Door("1a_3b_west", "1a_3b", DoorDirection.down, False, True), + "1a_3b_top": Door("1a_3b_top", "1a_3b", DoorDirection.up, False, False), + + "1a_5_bottom": Door("1a_5_bottom", "1a_5", DoorDirection.down, False, True), + "1a_5_west": Door("1a_5_west", "1a_5", DoorDirection.left, False, False), + "1a_5_south-east": Door("1a_5_south-east", "1a_5", DoorDirection.right, True, False), + "1a_5_top": Door("1a_5_top", "1a_5", DoorDirection.up, False, False), + + "1a_5z_east": Door("1a_5z_east", "1a_5z", DoorDirection.right, False, False), + + "1a_5a_west": Door("1a_5a_west", "1a_5a", DoorDirection.left, False, False), + + "1a_6_south-west": Door("1a_6_south-west", "1a_6", DoorDirection.down, False, True), + "1a_6_west": Door("1a_6_west", "1a_6", DoorDirection.left, False, False), + "1a_6_east": Door("1a_6_east", "1a_6", DoorDirection.right, False, False), + + "1a_6z_north-west": Door("1a_6z_north-west", "1a_6z", DoorDirection.up, False, False), + "1a_6z_west": Door("1a_6z_west", "1a_6z", DoorDirection.left, False, False), + "1a_6z_east": Door("1a_6z_east", "1a_6z", DoorDirection.right, False, False), + + "1a_6zb_north-west": Door("1a_6zb_north-west", "1a_6zb", DoorDirection.up, False, True), + "1a_6zb_east": Door("1a_6zb_east", "1a_6zb", DoorDirection.right, False, False), + + "1a_7zb_west": Door("1a_7zb_west", "1a_7zb", DoorDirection.down, False, False), + "1a_7zb_east": Door("1a_7zb_east", "1a_7zb", DoorDirection.down, False, False), + + "1a_6a_west": Door("1a_6a_west", "1a_6a", DoorDirection.left, False, False), + "1a_6a_east": Door("1a_6a_east", "1a_6a", DoorDirection.right, False, False), + + "1a_6b_north-west": Door("1a_6b_north-west", "1a_6b", DoorDirection.left, False, False), + "1a_6b_south-west": Door("1a_6b_south-west", "1a_6b", DoorDirection.left, False, False), + "1a_6b_north-east": Door("1a_6b_north-east", "1a_6b", DoorDirection.right, False, False), + + "1a_s0_west": Door("1a_s0_west", "1a_s0", DoorDirection.left, False, False), + "1a_s0_east": Door("1a_s0_east", "1a_s0", DoorDirection.right, False, False), + + "1a_s1_east": Door("1a_s1_east", "1a_s1", DoorDirection.right, False, False), + + "1a_6c_south-west": Door("1a_6c_south-west", "1a_6c", DoorDirection.left, False, False), + "1a_6c_north-west": Door("1a_6c_north-west", "1a_6c", DoorDirection.left, True, False), + "1a_6c_north-east": Door("1a_6c_north-east", "1a_6c", DoorDirection.up, False, False), + + "1a_7_west": Door("1a_7_west", "1a_7", DoorDirection.down, False, True), + "1a_7_east": Door("1a_7_east", "1a_7", DoorDirection.up, False, False), + + "1a_7z_bottom": Door("1a_7z_bottom", "1a_7z", DoorDirection.right, False, False), + "1a_7z_top": Door("1a_7z_top", "1a_7z", DoorDirection.up, True, False), + + "1a_8z_bottom": Door("1a_8z_bottom", "1a_8z", DoorDirection.down, False, False), + "1a_8z_top": Door("1a_8z_top", "1a_8z", DoorDirection.right, False, False), + + "1a_8zb_west": Door("1a_8zb_west", "1a_8zb", DoorDirection.left, False, False), + "1a_8zb_east": Door("1a_8zb_east", "1a_8zb", DoorDirection.right, False, False), + + "1a_8_south-west": Door("1a_8_south-west", "1a_8", DoorDirection.down, False, True), + "1a_8_west": Door("1a_8_west", "1a_8", DoorDirection.left, False, True), + "1a_8_south": Door("1a_8_south", "1a_8", DoorDirection.down, False, False), + "1a_8_south-east": Door("1a_8_south-east", "1a_8", DoorDirection.down, False, True), + "1a_8_north": Door("1a_8_north", "1a_8", DoorDirection.up, False, False), + "1a_8_north-east": Door("1a_8_north-east", "1a_8", DoorDirection.right, False, False), + + "1a_7a_west": Door("1a_7a_west", "1a_7a", DoorDirection.up, False, False), + "1a_7a_east": Door("1a_7a_east", "1a_7a", DoorDirection.up, False, False), + + "1a_9z_east": Door("1a_9z_east", "1a_9z", DoorDirection.down, False, False), + + "1a_8b_west": Door("1a_8b_west", "1a_8b", DoorDirection.left, False, False), + "1a_8b_east": Door("1a_8b_east", "1a_8b", DoorDirection.up, False, False), + + "1a_9_west": Door("1a_9_west", "1a_9", DoorDirection.down, False, True), + "1a_9_east": Door("1a_9_east", "1a_9", DoorDirection.right, False, False), + + "1a_9b_west": Door("1a_9b_west", "1a_9b", DoorDirection.left, False, False), + "1a_9b_north-west": Door("1a_9b_north-west", "1a_9b", DoorDirection.up, False, False), + "1a_9b_east": Door("1a_9b_east", "1a_9b", DoorDirection.right, False, False), + "1a_9b_north-east": Door("1a_9b_north-east", "1a_9b", DoorDirection.up, False, False), + + "1a_9c_west": Door("1a_9c_west", "1a_9c", DoorDirection.left, False, True), + + "1a_10_south-east": Door("1a_10_south-east", "1a_10", DoorDirection.down, False, False), + "1a_10_south-west": Door("1a_10_south-west", "1a_10", DoorDirection.left, False, False), + "1a_10_north-west": Door("1a_10_north-west", "1a_10", DoorDirection.up, False, False), + "1a_10_north-east": Door("1a_10_north-east", "1a_10", DoorDirection.up, False, True), + + "1a_10z_west": Door("1a_10z_west", "1a_10z", DoorDirection.left, False, False), + "1a_10z_east": Door("1a_10z_east", "1a_10z", DoorDirection.right, False, False), + + "1a_10zb_east": Door("1a_10zb_east", "1a_10zb", DoorDirection.right, False, False), + + "1a_11_south": Door("1a_11_south", "1a_11", DoorDirection.down, False, False), + "1a_11_south-west": Door("1a_11_south-west", "1a_11", DoorDirection.down, False, False), + "1a_11_west": Door("1a_11_west", "1a_11", DoorDirection.left, False, False), + "1a_11_south-east": Door("1a_11_south-east", "1a_11", DoorDirection.down, False, True), + "1a_11_north": Door("1a_11_north", "1a_11", DoorDirection.up, False, False), + + "1a_11z_east": Door("1a_11z_east", "1a_11z", DoorDirection.right, False, False), + + "1a_10a_bottom": Door("1a_10a_bottom", "1a_10a", DoorDirection.down, False, False), + "1a_10a_top": Door("1a_10a_top", "1a_10a", DoorDirection.up, False, False), + + "1a_12_south-west": Door("1a_12_south-west", "1a_12", DoorDirection.down, False, True), + "1a_12_north-west": Door("1a_12_north-west", "1a_12", DoorDirection.left, False, False), + "1a_12_east": Door("1a_12_east", "1a_12", DoorDirection.right, False, True), + + "1a_12z_east": Door("1a_12z_east", "1a_12z", DoorDirection.right, False, False), + + "1a_12a_bottom": Door("1a_12a_bottom", "1a_12a", DoorDirection.left, False, False), + "1a_12a_top": Door("1a_12a_top", "1a_12a", DoorDirection.up, False, False), + + "1a_end_south": Door("1a_end_south", "1a_end", DoorDirection.down, False, True), + + "1b_00_east": Door("1b_00_east", "1b_00", DoorDirection.up, False, False), + + "1b_01_west": Door("1b_01_west", "1b_01", DoorDirection.down, False, True), + "1b_01_east": Door("1b_01_east", "1b_01", DoorDirection.up, False, False), + + "1b_02_west": Door("1b_02_west", "1b_02", DoorDirection.down, False, True), + "1b_02_east": Door("1b_02_east", "1b_02", DoorDirection.up, False, False), + + "1b_02b_west": Door("1b_02b_west", "1b_02b", DoorDirection.down, False, True), + "1b_02b_east": Door("1b_02b_east", "1b_02b", DoorDirection.up, False, False), + + "1b_03_west": Door("1b_03_west", "1b_03", DoorDirection.down, False, True), + "1b_03_east": Door("1b_03_east", "1b_03", DoorDirection.right, False, False), + + "1b_04_west": Door("1b_04_west", "1b_04", DoorDirection.left, False, True), + "1b_04_east": Door("1b_04_east", "1b_04", DoorDirection.up, False, False), + + "1b_05_west": Door("1b_05_west", "1b_05", DoorDirection.down, False, True), + "1b_05_east": Door("1b_05_east", "1b_05", DoorDirection.up, False, False), + + "1b_05b_west": Door("1b_05b_west", "1b_05b", DoorDirection.down, False, True), + "1b_05b_east": Door("1b_05b_east", "1b_05b", DoorDirection.up, False, False), + + "1b_06_west": Door("1b_06_west", "1b_06", DoorDirection.down, False, True), + "1b_06_east": Door("1b_06_east", "1b_06", DoorDirection.right, False, False), + + "1b_07_bottom": Door("1b_07_bottom", "1b_07", DoorDirection.left, False, False), + "1b_07_top": Door("1b_07_top", "1b_07", DoorDirection.up, False, False), + + "1b_08_west": Door("1b_08_west", "1b_08", DoorDirection.down, False, True), + "1b_08_east": Door("1b_08_east", "1b_08", DoorDirection.up, False, False), + + "1b_08b_west": Door("1b_08b_west", "1b_08b", DoorDirection.down, False, True), + "1b_08b_east": Door("1b_08b_east", "1b_08b", DoorDirection.up, False, False), + + "1b_09_west": Door("1b_09_west", "1b_09", DoorDirection.down, False, True), + "1b_09_east": Door("1b_09_east", "1b_09", DoorDirection.right, False, False), + + "1b_10_west": Door("1b_10_west", "1b_10", DoorDirection.left, False, False), + "1b_10_east": Door("1b_10_east", "1b_10", DoorDirection.right, False, False), + + "1b_11_bottom": Door("1b_11_bottom", "1b_11", DoorDirection.left, False, False), + "1b_11_top": Door("1b_11_top", "1b_11", DoorDirection.up, False, False), + + "1b_end_west": Door("1b_end_west", "1b_end", DoorDirection.down, False, True), + + "1c_00_east": Door("1c_00_east", "1c_00", DoorDirection.right, False, False), + + "1c_01_west": Door("1c_01_west", "1c_01", DoorDirection.left, False, True), + "1c_01_east": Door("1c_01_east", "1c_01", DoorDirection.right, False, False), + + "1c_02_west": Door("1c_02_west", "1c_02", DoorDirection.left, False, True), + + "2a_start_east": Door("2a_start_east", "2a_start", DoorDirection.right, False, False), + "2a_start_top": Door("2a_start_top", "2a_start", DoorDirection.up, False, False), + + "2a_s0_bottom": Door("2a_s0_bottom", "2a_s0", DoorDirection.down, False, False), + "2a_s0_top": Door("2a_s0_top", "2a_s0", DoorDirection.up, False, False), + + "2a_s1_bottom": Door("2a_s1_bottom", "2a_s1", DoorDirection.down, False, False), + "2a_s1_top": Door("2a_s1_top", "2a_s1", DoorDirection.up, False, False), + + "2a_s2_bottom": Door("2a_s2_bottom", "2a_s2", DoorDirection.down, False, False), + + "2a_0_south-west": Door("2a_0_south-west", "2a_0", DoorDirection.left, False, False), + "2a_0_south-east": Door("2a_0_south-east", "2a_0", DoorDirection.right, False, False), + "2a_0_north-west": Door("2a_0_north-west", "2a_0", DoorDirection.up, False, False), + "2a_0_north-east": Door("2a_0_north-east", "2a_0", DoorDirection.right, False, False), + + "2a_1_south-west": Door("2a_1_south-west", "2a_1", DoorDirection.left, False, False), + "2a_1_south-east": Door("2a_1_south-east", "2a_1", DoorDirection.right, False, False), + "2a_1_north-west": Door("2a_1_north-west", "2a_1", DoorDirection.left, False, False), + "2a_1_south": Door("2a_1_south", "2a_1", DoorDirection.down, False, False), + + "2a_d0_north": Door("2a_d0_north", "2a_d0", DoorDirection.up, False, False), + "2a_d0_north-west": Door("2a_d0_north-west", "2a_d0", DoorDirection.left, False, False), + "2a_d0_west": Door("2a_d0_west", "2a_d0", DoorDirection.left, False, False), + "2a_d0_south-west": Door("2a_d0_south-west", "2a_d0", DoorDirection.left, False, False), + "2a_d0_south": Door("2a_d0_south", "2a_d0", DoorDirection.down, False, False), + "2a_d0_south-east": Door("2a_d0_south-east", "2a_d0", DoorDirection.right, True, False), + "2a_d0_east": Door("2a_d0_east", "2a_d0", DoorDirection.right, False, False), + "2a_d0_north-east": Door("2a_d0_north-east", "2a_d0", DoorDirection.right, False, False), + + "2a_d7_west": Door("2a_d7_west", "2a_d7", DoorDirection.left, False, False), + "2a_d7_east": Door("2a_d7_east", "2a_d7", DoorDirection.right, False, False), + + "2a_d8_west": Door("2a_d8_west", "2a_d8", DoorDirection.left, False, False), + "2a_d8_south-east": Door("2a_d8_south-east", "2a_d8", DoorDirection.right, False, False), + "2a_d8_north-east": Door("2a_d8_north-east", "2a_d8", DoorDirection.right, False, False), + + "2a_d3_west": Door("2a_d3_west", "2a_d3", DoorDirection.left, False, False), + "2a_d3_south": Door("2a_d3_south", "2a_d3", DoorDirection.left, False, False), + "2a_d3_north": Door("2a_d3_north", "2a_d3", DoorDirection.left, False, False), + + "2a_d2_west": Door("2a_d2_west", "2a_d2", DoorDirection.left, False, False), + "2a_d2_north-west": Door("2a_d2_north-west", "2a_d2", DoorDirection.up, False, True), + "2a_d2_east": Door("2a_d2_east", "2a_d2", DoorDirection.right, False, False), + + "2a_d9_north-west": Door("2a_d9_north-west", "2a_d9", DoorDirection.up, False, False), + + "2a_d1_north-east": Door("2a_d1_north-east", "2a_d1", DoorDirection.right, False, False), + "2a_d1_south-east": Door("2a_d1_south-east", "2a_d1", DoorDirection.right, False, False), + "2a_d1_south-west": Door("2a_d1_south-west", "2a_d1", DoorDirection.down, True, False), + + "2a_d6_west": Door("2a_d6_west", "2a_d6", DoorDirection.up, False, False), + "2a_d6_east": Door("2a_d6_east", "2a_d6", DoorDirection.right, False, False), + + "2a_d4_west": Door("2a_d4_west", "2a_d4", DoorDirection.left, False, False), + "2a_d4_east": Door("2a_d4_east", "2a_d4", DoorDirection.right, False, False), + "2a_d4_south": Door("2a_d4_south", "2a_d4", DoorDirection.down, False, False), + + "2a_d5_west": Door("2a_d5_west", "2a_d5", DoorDirection.left, False, False), + + "2a_3x_bottom": Door("2a_3x_bottom", "2a_3x", DoorDirection.down, False, False), + "2a_3x_top": Door("2a_3x_top", "2a_3x", DoorDirection.up, False, False), + + "2a_3_bottom": Door("2a_3_bottom", "2a_3", DoorDirection.down, False, True), + "2a_3_top": Door("2a_3_top", "2a_3", DoorDirection.up, False, False), + + "2a_4_bottom": Door("2a_4_bottom", "2a_4", DoorDirection.down, False, True), + "2a_4_top": Door("2a_4_top", "2a_4", DoorDirection.up, False, False), + + "2a_5_bottom": Door("2a_5_bottom", "2a_5", DoorDirection.down, False, True), + "2a_5_top": Door("2a_5_top", "2a_5", DoorDirection.up, False, False), + + "2a_6_bottom": Door("2a_6_bottom", "2a_6", DoorDirection.down, False, True), + "2a_6_top": Door("2a_6_top", "2a_6", DoorDirection.up, False, False), + + "2a_7_bottom": Door("2a_7_bottom", "2a_7", DoorDirection.down, False, True), + "2a_7_top": Door("2a_7_top", "2a_7", DoorDirection.up, False, False), + + "2a_8_bottom": Door("2a_8_bottom", "2a_8", DoorDirection.down, False, True), + "2a_8_top": Door("2a_8_top", "2a_8", DoorDirection.right, False, False), + + "2a_9_west": Door("2a_9_west", "2a_9", DoorDirection.left, False, False), + "2a_9_north": Door("2a_9_north", "2a_9", DoorDirection.up, False, False), + "2a_9_north-west": Door("2a_9_north-west", "2a_9", DoorDirection.up, False, False), + "2a_9_south-east": Door("2a_9_south-east", "2a_9", DoorDirection.down, False, False), + + "2a_9b_east": Door("2a_9b_east", "2a_9b", DoorDirection.down, False, True), + "2a_9b_west": Door("2a_9b_west", "2a_9b", DoorDirection.down, False, False), + + "2a_10_bottom": Door("2a_10_bottom", "2a_10", DoorDirection.down, False, True), + "2a_10_top": Door("2a_10_top", "2a_10", DoorDirection.up, False, False), + + "2a_2_north-west": Door("2a_2_north-west", "2a_2", DoorDirection.up, False, False), + "2a_2_south-west": Door("2a_2_south-west", "2a_2", DoorDirection.left, False, False), + "2a_2_south-east": Door("2a_2_south-east", "2a_2", DoorDirection.right, False, False), + + "2a_11_west": Door("2a_11_west", "2a_11", DoorDirection.left, False, False), + "2a_11_east": Door("2a_11_east", "2a_11", DoorDirection.right, False, False), + + "2a_12b_west": Door("2a_12b_west", "2a_12b", DoorDirection.left, False, False), + "2a_12b_north": Door("2a_12b_north", "2a_12b", DoorDirection.up, False, False), + "2a_12b_south": Door("2a_12b_south", "2a_12b", DoorDirection.down, False, False), + "2a_12b_south-east": Door("2a_12b_south-east", "2a_12b", DoorDirection.down, False, True), + "2a_12b_east": Door("2a_12b_east", "2a_12b", DoorDirection.right, False, True), + + "2a_12c_south": Door("2a_12c_south", "2a_12c", DoorDirection.down, False, False), + + "2a_12d_north-west": Door("2a_12d_north-west", "2a_12d", DoorDirection.up, False, False), + "2a_12d_north": Door("2a_12d_north", "2a_12d", DoorDirection.up, False, False), + + "2a_12_west": Door("2a_12_west", "2a_12", DoorDirection.left, False, False), + "2a_12_east": Door("2a_12_east", "2a_12", DoorDirection.right, False, False), + + "2a_13_west": Door("2a_13_west", "2a_13", DoorDirection.left, False, False), + "2a_13_phone": Door("2a_13_phone", "2a_13", DoorDirection.special, False, True), + + "2a_end_0_main": Door("2a_end_0_main", "2a_end_0", DoorDirection.special, False, True), + "2a_end_0_east": Door("2a_end_0_east", "2a_end_0", DoorDirection.right, False, False), + "2a_end_0_top": Door("2a_end_0_top", "2a_end_0", DoorDirection.up, False, False), + + "2a_end_s0_bottom": Door("2a_end_s0_bottom", "2a_end_s0", DoorDirection.down, False, False), + "2a_end_s0_top": Door("2a_end_s0_top", "2a_end_s0", DoorDirection.up, False, False), + + "2a_end_s1_bottom": Door("2a_end_s1_bottom", "2a_end_s1", DoorDirection.down, False, False), + + "2a_end_1_west": Door("2a_end_1_west", "2a_end_1", DoorDirection.left, False, False), + "2a_end_1_north-east": Door("2a_end_1_north-east", "2a_end_1", DoorDirection.right, False, False), + "2a_end_1_east": Door("2a_end_1_east", "2a_end_1", DoorDirection.right, False, False), + + "2a_end_2_north-west": Door("2a_end_2_north-west", "2a_end_2", DoorDirection.left, False, False), + "2a_end_2_west": Door("2a_end_2_west", "2a_end_2", DoorDirection.left, False, False), + "2a_end_2_north-east": Door("2a_end_2_north-east", "2a_end_2", DoorDirection.right, False, False), + "2a_end_2_east": Door("2a_end_2_east", "2a_end_2", DoorDirection.right, False, False), + + "2a_end_3_north-west": Door("2a_end_3_north-west", "2a_end_3", DoorDirection.left, False, True), + "2a_end_3_west": Door("2a_end_3_west", "2a_end_3", DoorDirection.left, False, True), + "2a_end_3_east": Door("2a_end_3_east", "2a_end_3", DoorDirection.right, False, False), + + "2a_end_4_west": Door("2a_end_4_west", "2a_end_4", DoorDirection.left, False, False), + "2a_end_4_east": Door("2a_end_4_east", "2a_end_4", DoorDirection.right, False, False), + + "2a_end_3b_west": Door("2a_end_3b_west", "2a_end_3b", DoorDirection.left, False, False), + "2a_end_3b_north": Door("2a_end_3b_north", "2a_end_3b", DoorDirection.up, False, False), + "2a_end_3b_east": Door("2a_end_3b_east", "2a_end_3b", DoorDirection.right, False, False), + + "2a_end_3cb_bottom": Door("2a_end_3cb_bottom", "2a_end_3cb", DoorDirection.down, False, False), + "2a_end_3cb_top": Door("2a_end_3cb_top", "2a_end_3cb", DoorDirection.up, False, False), + + "2a_end_3c_bottom": Door("2a_end_3c_bottom", "2a_end_3c", DoorDirection.down, False, False), + + "2a_end_5_west": Door("2a_end_5_west", "2a_end_5", DoorDirection.left, False, False), + "2a_end_5_east": Door("2a_end_5_east", "2a_end_5", DoorDirection.right, False, False), + + "2a_end_6_west": Door("2a_end_6_west", "2a_end_6", DoorDirection.left, False, False), + + "2b_start_east": Door("2b_start_east", "2b_start", DoorDirection.right, False, False), + + "2b_00_west": Door("2b_00_west", "2b_00", DoorDirection.left, False, False), + "2b_00_east": Door("2b_00_east", "2b_00", DoorDirection.right, False, False), + + "2b_01_west": Door("2b_01_west", "2b_01", DoorDirection.left, False, False), + "2b_01_east": Door("2b_01_east", "2b_01", DoorDirection.up, False, False), + + "2b_01b_west": Door("2b_01b_west", "2b_01b", DoorDirection.down, False, True), + "2b_01b_east": Door("2b_01b_east", "2b_01b", DoorDirection.up, False, False), + + "2b_02b_west": Door("2b_02b_west", "2b_02b", DoorDirection.down, False, True), + "2b_02b_east": Door("2b_02b_east", "2b_02b", DoorDirection.up, False, False), + + "2b_02_west": Door("2b_02_west", "2b_02", DoorDirection.down, False, True), + "2b_02_east": Door("2b_02_east", "2b_02", DoorDirection.up, False, False), + + "2b_03_west": Door("2b_03_west", "2b_03", DoorDirection.down, False, True), + "2b_03_east": Door("2b_03_east", "2b_03", DoorDirection.up, False, False), + + "2b_04_bottom": Door("2b_04_bottom", "2b_04", DoorDirection.down, False, True), + "2b_04_top": Door("2b_04_top", "2b_04", DoorDirection.up, False, False), + + "2b_05_bottom": Door("2b_05_bottom", "2b_05", DoorDirection.down, False, True), + "2b_05_top": Door("2b_05_top", "2b_05", DoorDirection.up, False, False), + + "2b_06_west": Door("2b_06_west", "2b_06", DoorDirection.down, False, True), + "2b_06_east": Door("2b_06_east", "2b_06", DoorDirection.right, False, False), + + "2b_07_bottom": Door("2b_07_bottom", "2b_07", DoorDirection.left, False, False), + "2b_07_top": Door("2b_07_top", "2b_07", DoorDirection.up, False, False), + + "2b_08b_west": Door("2b_08b_west", "2b_08b", DoorDirection.down, False, True), + "2b_08b_east": Door("2b_08b_east", "2b_08b", DoorDirection.up, False, False), + + "2b_08_west": Door("2b_08_west", "2b_08", DoorDirection.down, False, True), + "2b_08_east": Door("2b_08_east", "2b_08", DoorDirection.up, False, False), + + "2b_09_west": Door("2b_09_west", "2b_09", DoorDirection.down, False, True), + "2b_09_east": Door("2b_09_east", "2b_09", DoorDirection.right, False, False), + + "2b_10_west": Door("2b_10_west", "2b_10", DoorDirection.left, False, False), + "2b_10_east": Door("2b_10_east", "2b_10", DoorDirection.up, False, False), + + "2b_11_bottom": Door("2b_11_bottom", "2b_11", DoorDirection.down, False, True), + "2b_11_top": Door("2b_11_top", "2b_11", DoorDirection.up, False, False), + + "2b_end_west": Door("2b_end_west", "2b_end", DoorDirection.down, False, True), + + "2c_00_east": Door("2c_00_east", "2c_00", DoorDirection.right, False, False), + + "2c_01_west": Door("2c_01_west", "2c_01", DoorDirection.left, False, False), + "2c_01_east": Door("2c_01_east", "2c_01", DoorDirection.right, False, False), + + "2c_02_west": Door("2c_02_west", "2c_02", DoorDirection.left, False, True), + + "3a_s0_east": Door("3a_s0_east", "3a_s0", DoorDirection.right, False, False), + + "3a_s1_west": Door("3a_s1_west", "3a_s1", DoorDirection.left, False, False), + "3a_s1_east": Door("3a_s1_east", "3a_s1", DoorDirection.right, False, False), + "3a_s1_north-east": Door("3a_s1_north-east", "3a_s1", DoorDirection.right, False, False), + + "3a_s2_west": Door("3a_s2_west", "3a_s2", DoorDirection.left, False, False), + "3a_s2_north-west": Door("3a_s2_north-west", "3a_s2", DoorDirection.left, False, False), + "3a_s2_east": Door("3a_s2_east", "3a_s2", DoorDirection.right, False, False), + + "3a_s3_west": Door("3a_s3_west", "3a_s3", DoorDirection.left, False, False), + "3a_s3_north": Door("3a_s3_north", "3a_s3", DoorDirection.right, False, False), + "3a_s3_east": Door("3a_s3_east", "3a_s3", DoorDirection.right, False, False), + + "3a_0x-a_west": Door("3a_0x-a_west", "3a_0x-a", DoorDirection.left, False, True), + "3a_0x-a_east": Door("3a_0x-a_east", "3a_0x-a", DoorDirection.right, False, False), + + "3a_00-a_west": Door("3a_00-a_west", "3a_00-a", DoorDirection.left, False, False), + "3a_00-a_east": Door("3a_00-a_east", "3a_00-a", DoorDirection.right, False, False), + + "3a_02-a_west": Door("3a_02-a_west", "3a_02-a", DoorDirection.left, False, True), + "3a_02-a_top": Door("3a_02-a_top", "3a_02-a", DoorDirection.up, False, False), + "3a_02-a_east": Door("3a_02-a_east", "3a_02-a", DoorDirection.right, True, False), + + "3a_02-b_west": Door("3a_02-b_west", "3a_02-b", DoorDirection.left, False, False), + "3a_02-b_east": Door("3a_02-b_east", "3a_02-b", DoorDirection.down, False, False), + "3a_02-b_far-east": Door("3a_02-b_far-east", "3a_02-b", DoorDirection.right, False, False), + + "3a_01-b_west": Door("3a_01-b_west", "3a_01-b", DoorDirection.left, False, False), + "3a_01-b_north-west": Door("3a_01-b_north-west", "3a_01-b", DoorDirection.left, False, False), + "3a_01-b_east": Door("3a_01-b_east", "3a_01-b", DoorDirection.right, False, False), + + "3a_00-b_south-west": Door("3a_00-b_south-west", "3a_00-b", DoorDirection.left, False, False), + "3a_00-b_south-east": Door("3a_00-b_south-east", "3a_00-b", DoorDirection.right, False, False), + "3a_00-b_west": Door("3a_00-b_west", "3a_00-b", DoorDirection.left, False, False), + "3a_00-b_north-west": Door("3a_00-b_north-west", "3a_00-b", DoorDirection.up, False, False), + "3a_00-b_east": Door("3a_00-b_east", "3a_00-b", DoorDirection.right, False, False), + "3a_00-b_north": Door("3a_00-b_north", "3a_00-b", DoorDirection.up, True, False), + + "3a_00-c_south-west": Door("3a_00-c_south-west", "3a_00-c", DoorDirection.down, False, False), + "3a_00-c_south-east": Door("3a_00-c_south-east", "3a_00-c", DoorDirection.down, False, False), + "3a_00-c_north-east": Door("3a_00-c_north-east", "3a_00-c", DoorDirection.right, False, False), + + "3a_0x-b_west": Door("3a_0x-b_west", "3a_0x-b", DoorDirection.left, False, False), + "3a_0x-b_south-east": Door("3a_0x-b_south-east", "3a_0x-b", DoorDirection.right, False, False), + "3a_0x-b_north-east": Door("3a_0x-b_north-east", "3a_0x-b", DoorDirection.right, False, False), + + "3a_03-a_west": Door("3a_03-a_west", "3a_03-a", DoorDirection.left, False, False), + "3a_03-a_top": Door("3a_03-a_top", "3a_03-a", DoorDirection.up, False, False), + "3a_03-a_east": Door("3a_03-a_east", "3a_03-a", DoorDirection.right, False, False), + + "3a_04-b_west": Door("3a_04-b_west", "3a_04-b", DoorDirection.left, False, False), + "3a_04-b_east": Door("3a_04-b_east", "3a_04-b", DoorDirection.down, False, False), + + "3a_05-a_west": Door("3a_05-a_west", "3a_05-a", DoorDirection.left, False, False), + "3a_05-a_east": Door("3a_05-a_east", "3a_05-a", DoorDirection.right, False, False), + + "3a_06-a_west": Door("3a_06-a_west", "3a_06-a", DoorDirection.left, False, False), + "3a_06-a_east": Door("3a_06-a_east", "3a_06-a", DoorDirection.right, False, False), + + "3a_07-a_west": Door("3a_07-a_west", "3a_07-a", DoorDirection.left, False, False), + "3a_07-a_top": Door("3a_07-a_top", "3a_07-a", DoorDirection.up, False, False), + "3a_07-a_east": Door("3a_07-a_east", "3a_07-a", DoorDirection.right, False, False), + + "3a_07-b_bottom": Door("3a_07-b_bottom", "3a_07-b", DoorDirection.down, False, False), + "3a_07-b_west": Door("3a_07-b_west", "3a_07-b", DoorDirection.left, False, False), + "3a_07-b_top": Door("3a_07-b_top", "3a_07-b", DoorDirection.up, False, False), + "3a_07-b_east": Door("3a_07-b_east", "3a_07-b", DoorDirection.right, False, False), + + "3a_06-b_west": Door("3a_06-b_west", "3a_06-b", DoorDirection.up, False, False), + "3a_06-b_east": Door("3a_06-b_east", "3a_06-b", DoorDirection.right, False, False), + + "3a_06-c_south-west": Door("3a_06-c_south-west", "3a_06-c", DoorDirection.down, False, True), + "3a_06-c_north-west": Door("3a_06-c_north-west", "3a_06-c", DoorDirection.left, False, False), + "3a_06-c_south-east": Door("3a_06-c_south-east", "3a_06-c", DoorDirection.down, True, False), + "3a_06-c_east": Door("3a_06-c_east", "3a_06-c", DoorDirection.right, False, False), + + "3a_05-c_east": Door("3a_05-c_east", "3a_05-c", DoorDirection.right, False, False), + + "3a_08-c_west": Door("3a_08-c_west", "3a_08-c", DoorDirection.left, False, False), + "3a_08-c_east": Door("3a_08-c_east", "3a_08-c", DoorDirection.down, False, False), + + "3a_08-b_west": Door("3a_08-b_west", "3a_08-b", DoorDirection.left, False, False), + "3a_08-b_east": Door("3a_08-b_east", "3a_08-b", DoorDirection.up, False, False), + + "3a_08-a_west": Door("3a_08-a_west", "3a_08-a", DoorDirection.left, False, True), + "3a_08-a_bottom": Door("3a_08-a_bottom", "3a_08-a", DoorDirection.down, False, False), + "3a_08-a_east": Door("3a_08-a_east", "3a_08-a", DoorDirection.right, False, False), + + "3a_09-b_west": Door("3a_09-b_west", "3a_09-b", DoorDirection.left, False, False), + "3a_09-b_north-west": Door("3a_09-b_north-west", "3a_09-b", DoorDirection.up, False, False), + "3a_09-b_south-west": Door("3a_09-b_south-west", "3a_09-b", DoorDirection.down, False, True), + "3a_09-b_south": Door("3a_09-b_south", "3a_09-b", DoorDirection.down, False, True), + "3a_09-b_south-east": Door("3a_09-b_south-east", "3a_09-b", DoorDirection.down, False, False), + "3a_09-b_east": Door("3a_09-b_east", "3a_09-b", DoorDirection.right, False, False), + "3a_09-b_north-east-right": Door("3a_09-b_north-east-right", "3a_09-b", DoorDirection.right, False, False), + "3a_09-b_north-east-top": Door("3a_09-b_north-east-top", "3a_09-b", DoorDirection.up, False, False), + "3a_09-b_north": Door("3a_09-b_north", "3a_09-b", DoorDirection.up, False, True), + + "3a_10-x_west": Door("3a_10-x_west", "3a_10-x", DoorDirection.up, False, False), + "3a_10-x_south-east": Door("3a_10-x_south-east", "3a_10-x", DoorDirection.down, False, True), + "3a_10-x_north-east-top": Door("3a_10-x_north-east-top", "3a_10-x", DoorDirection.up, False, True), + "3a_10-x_north-east-right": Door("3a_10-x_north-east-right", "3a_10-x", DoorDirection.right, False, True), + + "3a_11-x_west": Door("3a_11-x_west", "3a_11-x", DoorDirection.left, False, False), + "3a_11-x_south": Door("3a_11-x_south", "3a_11-x", DoorDirection.down, False, False), + + "3a_11-y_west": Door("3a_11-y_west", "3a_11-y", DoorDirection.up, False, False), + "3a_11-y_east": Door("3a_11-y_east", "3a_11-y", DoorDirection.right, False, False), + "3a_11-y_south": Door("3a_11-y_south", "3a_11-y", DoorDirection.down, False, False), + + "3a_12-y_west": Door("3a_12-y_west", "3a_12-y", DoorDirection.left, False, False), + + "3a_11-z_west": Door("3a_11-z_west", "3a_11-z", DoorDirection.left, False, False), + "3a_11-z_east": Door("3a_11-z_east", "3a_11-z", DoorDirection.up, False, False), + + "3a_10-z_bottom": Door("3a_10-z_bottom", "3a_10-z", DoorDirection.right, False, False), + "3a_10-z_top": Door("3a_10-z_top", "3a_10-z", DoorDirection.up, False, False), + + "3a_10-y_bottom": Door("3a_10-y_bottom", "3a_10-y", DoorDirection.down, False, True), + "3a_10-y_top": Door("3a_10-y_top", "3a_10-y", DoorDirection.up, False, False), + + "3a_10-c_south-east": Door("3a_10-c_south-east", "3a_10-c", DoorDirection.down, False, False), + "3a_10-c_north-east": Door("3a_10-c_north-east", "3a_10-c", DoorDirection.right, False, False), + "3a_10-c_north-west": Door("3a_10-c_north-west", "3a_10-c", DoorDirection.up, False, False), + "3a_10-c_south-west": Door("3a_10-c_south-west", "3a_10-c", DoorDirection.down, False, False), + + "3a_11-c_south-east": Door("3a_11-c_south-east", "3a_11-c", DoorDirection.down, False, True), + "3a_11-c_east": Door("3a_11-c_east", "3a_11-c", DoorDirection.right, False, False), + "3a_11-c_west": Door("3a_11-c_west", "3a_11-c", DoorDirection.left, False, False), + "3a_11-c_south-west": Door("3a_11-c_south-west", "3a_11-c", DoorDirection.down, False, False), + + "3a_12-c_west": Door("3a_12-c_west", "3a_12-c", DoorDirection.left, False, False), + "3a_12-c_top": Door("3a_12-c_top", "3a_12-c", DoorDirection.up, False, False), + + "3a_12-d_bottom": Door("3a_12-d_bottom", "3a_12-d", DoorDirection.down, False, True), + "3a_12-d_top": Door("3a_12-d_top", "3a_12-d", DoorDirection.left, False, False), + + "3a_11-d_west": Door("3a_11-d_west", "3a_11-d", DoorDirection.left, False, False), + "3a_11-d_east": Door("3a_11-d_east", "3a_11-d", DoorDirection.right, False, False), + + "3a_10-d_west": Door("3a_10-d_west", "3a_10-d", DoorDirection.down, False, False), + "3a_10-d_east": Door("3a_10-d_east", "3a_10-d", DoorDirection.right, False, False), + + "3a_11-b_west": Door("3a_11-b_west", "3a_11-b", DoorDirection.left, False, False), + "3a_11-b_north-west": Door("3a_11-b_north-west", "3a_11-b", DoorDirection.up, False, False), + "3a_11-b_east": Door("3a_11-b_east", "3a_11-b", DoorDirection.right, False, False), + "3a_11-b_north-east": Door("3a_11-b_north-east", "3a_11-b", DoorDirection.up, False, False), + + "3a_12-b_west": Door("3a_12-b_west", "3a_12-b", DoorDirection.left, False, False), + "3a_12-b_east": Door("3a_12-b_east", "3a_12-b", DoorDirection.right, False, False), + + "3a_13-b_top": Door("3a_13-b_top", "3a_13-b", DoorDirection.left, False, False), + "3a_13-b_bottom": Door("3a_13-b_bottom", "3a_13-b", DoorDirection.down, False, False), + + "3a_13-a_west": Door("3a_13-a_west", "3a_13-a", DoorDirection.up, False, False), + "3a_13-a_south-west": Door("3a_13-a_south-west", "3a_13-a", DoorDirection.left, False, False), + "3a_13-a_east": Door("3a_13-a_east", "3a_13-a", DoorDirection.down, False, False), + + "3a_13-x_west": Door("3a_13-x_west", "3a_13-x", DoorDirection.left, False, False), + "3a_13-x_east": Door("3a_13-x_east", "3a_13-x", DoorDirection.up, False, False), + + "3a_12-x_west": Door("3a_12-x_west", "3a_12-x", DoorDirection.up, False, False), + "3a_12-x_north-east": Door("3a_12-x_north-east", "3a_12-x", DoorDirection.up, False, False), + "3a_12-x_east": Door("3a_12-x_east", "3a_12-x", DoorDirection.right, False, False), + + "3a_11-a_west": Door("3a_11-a_west", "3a_11-a", DoorDirection.left, False, False), + "3a_11-a_south": Door("3a_11-a_south", "3a_11-a", DoorDirection.down, False, True), + "3a_11-a_south-east-bottom": Door("3a_11-a_south-east-bottom", "3a_11-a", DoorDirection.down, False, False), + "3a_11-a_south-east-right": Door("3a_11-a_south-east-right", "3a_11-a", DoorDirection.right, False, False), + + "3a_08-x_west": Door("3a_08-x_west", "3a_08-x", DoorDirection.up, False, False), + "3a_08-x_east": Door("3a_08-x_east", "3a_08-x", DoorDirection.up, False, False), + + "3a_09-d_bottom": Door("3a_09-d_bottom", "3a_09-d", DoorDirection.down, False, True), + "3a_09-d_top": Door("3a_09-d_top", "3a_09-d", DoorDirection.left, False, False), + + "3a_08-d_west": Door("3a_08-d_west", "3a_08-d", DoorDirection.left, False, False), + "3a_08-d_east": Door("3a_08-d_east", "3a_08-d", DoorDirection.right, False, False), + + "3a_06-d_west": Door("3a_06-d_west", "3a_06-d", DoorDirection.left, False, False), + "3a_06-d_east": Door("3a_06-d_east", "3a_06-d", DoorDirection.right, False, False), + + "3a_04-d_west": Door("3a_04-d_west", "3a_04-d", DoorDirection.left, False, False), + "3a_04-d_south-west": Door("3a_04-d_south-west", "3a_04-d", DoorDirection.down, False, False), + "3a_04-d_south": Door("3a_04-d_south", "3a_04-d", DoorDirection.down, False, False), + "3a_04-d_east": Door("3a_04-d_east", "3a_04-d", DoorDirection.right, False, False), + + "3a_04-c_west": Door("3a_04-c_west", "3a_04-c", DoorDirection.left, False, False), + "3a_04-c_north-west": Door("3a_04-c_north-west", "3a_04-c", DoorDirection.up, False, False), + "3a_04-c_east": Door("3a_04-c_east", "3a_04-c", DoorDirection.up, False, False), + + "3a_02-c_west": Door("3a_02-c_west", "3a_02-c", DoorDirection.left, False, False), + "3a_02-c_east": Door("3a_02-c_east", "3a_02-c", DoorDirection.right, False, False), + "3a_02-c_south-east": Door("3a_02-c_south-east", "3a_02-c", DoorDirection.down, False, False), + + "3a_03-b_west": Door("3a_03-b_west", "3a_03-b", DoorDirection.left, False, False), + "3a_03-b_east": Door("3a_03-b_east", "3a_03-b", DoorDirection.right, False, False), + "3a_03-b_north": Door("3a_03-b_north", "3a_03-b", DoorDirection.up, False, False), + + "3a_01-c_west": Door("3a_01-c_west", "3a_01-c", DoorDirection.left, False, False), + "3a_01-c_east": Door("3a_01-c_east", "3a_01-c", DoorDirection.right, False, False), + + "3a_02-d_west": Door("3a_02-d_west", "3a_02-d", DoorDirection.left, False, False), + "3a_02-d_east": Door("3a_02-d_east", "3a_02-d", DoorDirection.right, False, False), + + "3a_00-d_west": Door("3a_00-d_west", "3a_00-d", DoorDirection.up, False, False), + "3a_00-d_east": Door("3a_00-d_east", "3a_00-d", DoorDirection.right, False, True), + + "3a_roof00_west": Door("3a_roof00_west", "3a_roof00", DoorDirection.down, False, True), + "3a_roof00_east": Door("3a_roof00_east", "3a_roof00", DoorDirection.right, False, False), + + "3a_roof01_west": Door("3a_roof01_west", "3a_roof01", DoorDirection.left, False, False), + "3a_roof01_east": Door("3a_roof01_east", "3a_roof01", DoorDirection.right, False, False), + + "3a_roof02_west": Door("3a_roof02_west", "3a_roof02", DoorDirection.left, False, False), + "3a_roof02_east": Door("3a_roof02_east", "3a_roof02", DoorDirection.right, False, False), + + "3a_roof03_west": Door("3a_roof03_west", "3a_roof03", DoorDirection.left, False, False), + "3a_roof03_east": Door("3a_roof03_east", "3a_roof03", DoorDirection.right, False, False), + + "3a_roof04_west": Door("3a_roof04_west", "3a_roof04", DoorDirection.left, False, False), + "3a_roof04_east": Door("3a_roof04_east", "3a_roof04", DoorDirection.right, False, False), + + "3a_roof05_west": Door("3a_roof05_west", "3a_roof05", DoorDirection.left, False, False), + "3a_roof05_east": Door("3a_roof05_east", "3a_roof05", DoorDirection.right, False, False), + + "3a_roof06b_west": Door("3a_roof06b_west", "3a_roof06b", DoorDirection.left, False, False), + "3a_roof06b_east": Door("3a_roof06b_east", "3a_roof06b", DoorDirection.right, False, False), + + "3a_roof06_west": Door("3a_roof06_west", "3a_roof06", DoorDirection.left, False, False), + "3a_roof06_east": Door("3a_roof06_east", "3a_roof06", DoorDirection.right, False, False), + + "3a_roof07_west": Door("3a_roof07_west", "3a_roof07", DoorDirection.left, False, False), + + "3b_00_west": Door("3b_00_west", "3b_00", DoorDirection.left, False, False), + "3b_00_east": Door("3b_00_east", "3b_00", DoorDirection.right, False, False), + + "3b_back_east": Door("3b_back_east", "3b_back", DoorDirection.right, False, False), + + "3b_01_west": Door("3b_01_west", "3b_01", DoorDirection.left, False, False), + "3b_01_east": Door("3b_01_east", "3b_01", DoorDirection.right, False, False), + + "3b_02_west": Door("3b_02_west", "3b_02", DoorDirection.left, False, True), + "3b_02_east": Door("3b_02_east", "3b_02", DoorDirection.right, False, False), + + "3b_03_west": Door("3b_03_west", "3b_03", DoorDirection.left, False, False), + "3b_03_east": Door("3b_03_east", "3b_03", DoorDirection.right, False, False), + + "3b_04_west": Door("3b_04_west", "3b_04", DoorDirection.left, False, False), + "3b_04_east": Door("3b_04_east", "3b_04", DoorDirection.right, False, False), + + "3b_05_west": Door("3b_05_west", "3b_05", DoorDirection.left, False, False), + "3b_05_east": Door("3b_05_east", "3b_05", DoorDirection.right, False, False), + + "3b_06_west": Door("3b_06_west", "3b_06", DoorDirection.left, False, True), + "3b_06_east": Door("3b_06_east", "3b_06", DoorDirection.right, False, False), + + "3b_07_west": Door("3b_07_west", "3b_07", DoorDirection.left, False, False), + "3b_07_east": Door("3b_07_east", "3b_07", DoorDirection.right, False, False), + + "3b_08_bottom": Door("3b_08_bottom", "3b_08", DoorDirection.left, False, False), + "3b_08_top": Door("3b_08_top", "3b_08", DoorDirection.up, False, False), + + "3b_09_west": Door("3b_09_west", "3b_09", DoorDirection.down, False, True), + "3b_09_east": Door("3b_09_east", "3b_09", DoorDirection.right, False, False), + + "3b_10_west": Door("3b_10_west", "3b_10", DoorDirection.left, False, False), + "3b_10_east": Door("3b_10_east", "3b_10", DoorDirection.right, False, False), + + "3b_11_west": Door("3b_11_west", "3b_11", DoorDirection.left, False, True), + "3b_11_east": Door("3b_11_east", "3b_11", DoorDirection.right, False, False), + + "3b_13_west": Door("3b_13_west", "3b_13", DoorDirection.left, False, False), + "3b_13_east": Door("3b_13_east", "3b_13", DoorDirection.right, False, False), + + "3b_14_west": Door("3b_14_west", "3b_14", DoorDirection.left, False, False), + "3b_14_east": Door("3b_14_east", "3b_14", DoorDirection.right, False, False), + + "3b_15_west": Door("3b_15_west", "3b_15", DoorDirection.left, False, False), + "3b_15_east": Door("3b_15_east", "3b_15", DoorDirection.right, False, False), + + "3b_12_west": Door("3b_12_west", "3b_12", DoorDirection.left, False, False), + "3b_12_east": Door("3b_12_east", "3b_12", DoorDirection.right, False, False), + + "3b_16_west": Door("3b_16_west", "3b_16", DoorDirection.left, False, True), + "3b_16_top": Door("3b_16_top", "3b_16", DoorDirection.up, True, False), + + "3b_17_west": Door("3b_17_west", "3b_17", DoorDirection.down, False, True), + "3b_17_east": Door("3b_17_east", "3b_17", DoorDirection.right, False, False), + + "3b_18_west": Door("3b_18_west", "3b_18", DoorDirection.left, False, False), + "3b_18_east": Door("3b_18_east", "3b_18", DoorDirection.right, False, False), + + "3b_19_west": Door("3b_19_west", "3b_19", DoorDirection.left, False, False), + "3b_19_east": Door("3b_19_east", "3b_19", DoorDirection.right, False, False), + + "3b_21_west": Door("3b_21_west", "3b_21", DoorDirection.left, False, False), + "3b_21_east": Door("3b_21_east", "3b_21", DoorDirection.right, False, False), + + "3b_20_west": Door("3b_20_west", "3b_20", DoorDirection.left, False, False), + "3b_20_east": Door("3b_20_east", "3b_20", DoorDirection.down, False, False), + + "3b_end_west": Door("3b_end_west", "3b_end", DoorDirection.up, False, True), + + "3c_00_east": Door("3c_00_east", "3c_00", DoorDirection.up, False, False), + + "3c_01_west": Door("3c_01_west", "3c_01", DoorDirection.down, False, False), + "3c_01_east": Door("3c_01_east", "3c_01", DoorDirection.right, False, False), + + "3c_02_west": Door("3c_02_west", "3c_02", DoorDirection.left, False, True), + + "4a_a-00_east": Door("4a_a-00_east", "4a_a-00", DoorDirection.right, False, False), + + "4a_a-01_west": Door("4a_a-01_west", "4a_a-01", DoorDirection.left, False, False), + "4a_a-01_east": Door("4a_a-01_east", "4a_a-01", DoorDirection.right, False, False), + + "4a_a-01x_west": Door("4a_a-01x_west", "4a_a-01x", DoorDirection.left, False, False), + "4a_a-01x_east": Door("4a_a-01x_east", "4a_a-01x", DoorDirection.right, False, False), + + "4a_a-02_west": Door("4a_a-02_west", "4a_a-02", DoorDirection.left, False, False), + "4a_a-02_east": Door("4a_a-02_east", "4a_a-02", DoorDirection.right, False, False), + + "4a_a-03_west": Door("4a_a-03_west", "4a_a-03", DoorDirection.left, False, False), + "4a_a-03_east": Door("4a_a-03_east", "4a_a-03", DoorDirection.right, False, False), + + "4a_a-04_west": Door("4a_a-04_west", "4a_a-04", DoorDirection.left, False, False), + "4a_a-04_east": Door("4a_a-04_east", "4a_a-04", DoorDirection.right, False, False), + + "4a_a-05_west": Door("4a_a-05_west", "4a_a-05", DoorDirection.left, False, False), + "4a_a-05_east": Door("4a_a-05_east", "4a_a-05", DoorDirection.right, False, False), + + "4a_a-06_west": Door("4a_a-06_west", "4a_a-06", DoorDirection.left, False, False), + "4a_a-06_east": Door("4a_a-06_east", "4a_a-06", DoorDirection.right, False, False), + + "4a_a-07_west": Door("4a_a-07_west", "4a_a-07", DoorDirection.left, False, False), + "4a_a-07_east": Door("4a_a-07_east", "4a_a-07", DoorDirection.right, False, False), + + "4a_a-08_west": Door("4a_a-08_west", "4a_a-08", DoorDirection.left, False, False), + "4a_a-08_north-west": Door("4a_a-08_north-west", "4a_a-08", DoorDirection.left, False, False), + "4a_a-08_east": Door("4a_a-08_east", "4a_a-08", DoorDirection.up, False, False), + + "4a_a-10_west": Door("4a_a-10_west", "4a_a-10", DoorDirection.left, False, False), + "4a_a-10_east": Door("4a_a-10_east", "4a_a-10", DoorDirection.right, False, False), + + "4a_a-11_east": Door("4a_a-11_east", "4a_a-11", DoorDirection.right, False, False), + + "4a_a-09_bottom": Door("4a_a-09_bottom", "4a_a-09", DoorDirection.down, False, True), + "4a_a-09_top": Door("4a_a-09_top", "4a_a-09", DoorDirection.up, False, False), + + "4a_b-00_south": Door("4a_b-00_south", "4a_b-00", DoorDirection.down, False, True), + "4a_b-00_south-east": Door("4a_b-00_south-east", "4a_b-00", DoorDirection.right, False, False), + "4a_b-00_east": Door("4a_b-00_east", "4a_b-00", DoorDirection.right, False, False), + "4a_b-00_north-east": Door("4a_b-00_north-east", "4a_b-00", DoorDirection.right, False, False), + "4a_b-00_west": Door("4a_b-00_west", "4a_b-00", DoorDirection.left, False, False), + "4a_b-00_north-west": Door("4a_b-00_north-west", "4a_b-00", DoorDirection.left, False, False), + "4a_b-00_north": Door("4a_b-00_north", "4a_b-00", DoorDirection.up, False, False), + + "4a_b-01_west": Door("4a_b-01_west", "4a_b-01", DoorDirection.left, False, False), + + "4a_b-04_west": Door("4a_b-04_west", "4a_b-04", DoorDirection.left, False, False), + "4a_b-04_north-west": Door("4a_b-04_north-west", "4a_b-04", DoorDirection.up, False, False), + "4a_b-04_east": Door("4a_b-04_east", "4a_b-04", DoorDirection.right, False, False), + + "4a_b-06_west": Door("4a_b-06_west", "4a_b-06", DoorDirection.down, False, False), + "4a_b-06_east": Door("4a_b-06_east", "4a_b-06", DoorDirection.right, False, False), + + "4a_b-07_west": Door("4a_b-07_west", "4a_b-07", DoorDirection.up, False, False), + "4a_b-07_east": Door("4a_b-07_east", "4a_b-07", DoorDirection.right, False, False), + + "4a_b-03_west": Door("4a_b-03_west", "4a_b-03", DoorDirection.left, False, False), + "4a_b-03_east": Door("4a_b-03_east", "4a_b-03", DoorDirection.right, False, False), + + "4a_b-02_south-west": Door("4a_b-02_south-west", "4a_b-02", DoorDirection.left, False, False), + "4a_b-02_north-west": Door("4a_b-02_north-west", "4a_b-02", DoorDirection.left, False, False), + "4a_b-02_north-east": Door("4a_b-02_north-east", "4a_b-02", DoorDirection.right, True, False), + "4a_b-02_north": Door("4a_b-02_north", "4a_b-02", DoorDirection.up, False, False), + + "4a_b-sec_west": Door("4a_b-sec_west", "4a_b-sec", DoorDirection.left, False, False), + "4a_b-sec_east": Door("4a_b-sec_east", "4a_b-sec", DoorDirection.right, True, False), + + "4a_b-secb_west": Door("4a_b-secb_west", "4a_b-secb", DoorDirection.left, False, False), + + "4a_b-05_west": Door("4a_b-05_west", "4a_b-05", DoorDirection.down, False, False), + "4a_b-05_center": Door("4a_b-05_center", "4a_b-05", DoorDirection.down, False, True), + "4a_b-05_north-east": Door("4a_b-05_north-east", "4a_b-05", DoorDirection.up, False, False), + "4a_b-05_east": Door("4a_b-05_east", "4a_b-05", DoorDirection.down, False, False), + + "4a_b-08b_west": Door("4a_b-08b_west", "4a_b-08b", DoorDirection.down, False, False), + "4a_b-08b_east": Door("4a_b-08b_east", "4a_b-08b", DoorDirection.up, False, False), + + "4a_b-08_west": Door("4a_b-08_west", "4a_b-08", DoorDirection.down, False, False), + "4a_b-08_east": Door("4a_b-08_east", "4a_b-08", DoorDirection.up, False, False), + + "4a_c-00_west": Door("4a_c-00_west", "4a_c-00", DoorDirection.down, False, True), + "4a_c-00_north-west": Door("4a_c-00_north-west", "4a_c-00", DoorDirection.left, False, False), + "4a_c-00_east": Door("4a_c-00_east", "4a_c-00", DoorDirection.right, False, False), + + "4a_c-01_east": Door("4a_c-01_east", "4a_c-01", DoorDirection.right, False, False), + + "4a_c-02_west": Door("4a_c-02_west", "4a_c-02", DoorDirection.left, False, False), + "4a_c-02_east": Door("4a_c-02_east", "4a_c-02", DoorDirection.up, False, False), + + "4a_c-04_west": Door("4a_c-04_west", "4a_c-04", DoorDirection.down, False, True), + "4a_c-04_east": Door("4a_c-04_east", "4a_c-04", DoorDirection.right, False, False), + + "4a_c-05_west": Door("4a_c-05_west", "4a_c-05", DoorDirection.left, False, False), + "4a_c-05_east": Door("4a_c-05_east", "4a_c-05", DoorDirection.up, False, False), + + "4a_c-06_bottom": Door("4a_c-06_bottom", "4a_c-06", DoorDirection.down, False, False), + "4a_c-06_west": Door("4a_c-06_west", "4a_c-06", DoorDirection.left, False, False), + "4a_c-06_top": Door("4a_c-06_top", "4a_c-06", DoorDirection.up, False, False), + + "4a_c-06b_east": Door("4a_c-06b_east", "4a_c-06b", DoorDirection.right, False, False), + + "4a_c-09_west": Door("4a_c-09_west", "4a_c-09", DoorDirection.down, False, True), + "4a_c-09_east": Door("4a_c-09_east", "4a_c-09", DoorDirection.up, False, False), + + "4a_c-07_west": Door("4a_c-07_west", "4a_c-07", DoorDirection.down, False, True), + "4a_c-07_east": Door("4a_c-07_east", "4a_c-07", DoorDirection.right, False, False), + + "4a_c-08_bottom": Door("4a_c-08_bottom", "4a_c-08", DoorDirection.left, False, False), + "4a_c-08_east": Door("4a_c-08_east", "4a_c-08", DoorDirection.right, False, False), + "4a_c-08_top": Door("4a_c-08_top", "4a_c-08", DoorDirection.up, False, False), + + "4a_c-10_bottom": Door("4a_c-10_bottom", "4a_c-10", DoorDirection.left, False, False), + "4a_c-10_top": Door("4a_c-10_top", "4a_c-10", DoorDirection.up, False, False), + + "4a_d-00_west": Door("4a_d-00_west", "4a_d-00", DoorDirection.down, False, True), + "4a_d-00_south": Door("4a_d-00_south", "4a_d-00", DoorDirection.down, False, True), + "4a_d-00_north-west": Door("4a_d-00_north-west", "4a_d-00", DoorDirection.left, False, False), + "4a_d-00_east": Door("4a_d-00_east", "4a_d-00", DoorDirection.right, False, False), + + "4a_d-00b_east": Door("4a_d-00b_east", "4a_d-00b", DoorDirection.right, False, False), + + "4a_d-01_west": Door("4a_d-01_west", "4a_d-01", DoorDirection.left, False, False), + "4a_d-01_east": Door("4a_d-01_east", "4a_d-01", DoorDirection.right, False, False), + + "4a_d-02_west": Door("4a_d-02_west", "4a_d-02", DoorDirection.left, False, False), + "4a_d-02_east": Door("4a_d-02_east", "4a_d-02", DoorDirection.right, False, False), + + "4a_d-03_west": Door("4a_d-03_west", "4a_d-03", DoorDirection.left, False, False), + "4a_d-03_east": Door("4a_d-03_east", "4a_d-03", DoorDirection.right, False, False), + + "4a_d-04_west": Door("4a_d-04_west", "4a_d-04", DoorDirection.left, False, False), + "4a_d-04_east": Door("4a_d-04_east", "4a_d-04", DoorDirection.right, False, False), + + "4a_d-05_west": Door("4a_d-05_west", "4a_d-05", DoorDirection.left, False, False), + "4a_d-05_east": Door("4a_d-05_east", "4a_d-05", DoorDirection.right, False, False), + + "4a_d-06_west": Door("4a_d-06_west", "4a_d-06", DoorDirection.left, False, False), + "4a_d-06_east": Door("4a_d-06_east", "4a_d-06", DoorDirection.right, False, False), + + "4a_d-07_west": Door("4a_d-07_west", "4a_d-07", DoorDirection.left, False, False), + "4a_d-07_east": Door("4a_d-07_east", "4a_d-07", DoorDirection.right, False, False), + + "4a_d-08_west": Door("4a_d-08_west", "4a_d-08", DoorDirection.left, False, False), + "4a_d-08_east": Door("4a_d-08_east", "4a_d-08", DoorDirection.right, False, False), + + "4a_d-09_west": Door("4a_d-09_west", "4a_d-09", DoorDirection.left, False, False), + "4a_d-09_east": Door("4a_d-09_east", "4a_d-09", DoorDirection.right, False, False), + + "4a_d-10_west": Door("4a_d-10_west", "4a_d-10", DoorDirection.left, False, True), + + "4b_a-00_east": Door("4b_a-00_east", "4b_a-00", DoorDirection.right, False, False), + + "4b_a-01_west": Door("4b_a-01_west", "4b_a-01", DoorDirection.left, False, False), + "4b_a-01_east": Door("4b_a-01_east", "4b_a-01", DoorDirection.right, False, False), + + "4b_a-02_west": Door("4b_a-02_west", "4b_a-02", DoorDirection.left, False, False), + "4b_a-02_east": Door("4b_a-02_east", "4b_a-02", DoorDirection.right, False, False), + + "4b_a-03_west": Door("4b_a-03_west", "4b_a-03", DoorDirection.left, False, False), + "4b_a-03_east": Door("4b_a-03_east", "4b_a-03", DoorDirection.right, False, False), + + "4b_a-04_west": Door("4b_a-04_west", "4b_a-04", DoorDirection.left, False, False), + "4b_a-04_east": Door("4b_a-04_east", "4b_a-04", DoorDirection.right, False, False), + + "4b_b-00_west": Door("4b_b-00_west", "4b_b-00", DoorDirection.left, False, False), + "4b_b-00_east": Door("4b_b-00_east", "4b_b-00", DoorDirection.right, False, False), + + "4b_b-01_west": Door("4b_b-01_west", "4b_b-01", DoorDirection.left, False, False), + "4b_b-01_east": Door("4b_b-01_east", "4b_b-01", DoorDirection.up, False, False), + + "4b_b-02_bottom": Door("4b_b-02_bottom", "4b_b-02", DoorDirection.down, False, True), + "4b_b-02_top": Door("4b_b-02_top", "4b_b-02", DoorDirection.up, False, False), + + "4b_b-03_west": Door("4b_b-03_west", "4b_b-03", DoorDirection.down, False, True), + "4b_b-03_east": Door("4b_b-03_east", "4b_b-03", DoorDirection.up, False, False), + + "4b_b-04_west": Door("4b_b-04_west", "4b_b-04", DoorDirection.down, False, True), + "4b_b-04_east": Door("4b_b-04_east", "4b_b-04", DoorDirection.right, False, False), + + "4b_c-00_west": Door("4b_c-00_west", "4b_c-00", DoorDirection.left, False, True), + "4b_c-00_east": Door("4b_c-00_east", "4b_c-00", DoorDirection.right, False, False), + + "4b_c-01_west": Door("4b_c-01_west", "4b_c-01", DoorDirection.left, False, False), + "4b_c-01_east": Door("4b_c-01_east", "4b_c-01", DoorDirection.right, False, False), + + "4b_c-02_west": Door("4b_c-02_west", "4b_c-02", DoorDirection.left, False, False), + "4b_c-02_east": Door("4b_c-02_east", "4b_c-02", DoorDirection.right, False, False), + + "4b_c-03_bottom": Door("4b_c-03_bottom", "4b_c-03", DoorDirection.left, False, False), + "4b_c-03_top": Door("4b_c-03_top", "4b_c-03", DoorDirection.up, False, False), + + "4b_c-04_west": Door("4b_c-04_west", "4b_c-04", DoorDirection.down, False, True), + "4b_c-04_east": Door("4b_c-04_east", "4b_c-04", DoorDirection.right, False, False), + + "4b_d-00_west": Door("4b_d-00_west", "4b_d-00", DoorDirection.left, False, False), + "4b_d-00_east": Door("4b_d-00_east", "4b_d-00", DoorDirection.right, False, False), + + "4b_d-01_west": Door("4b_d-01_west", "4b_d-01", DoorDirection.left, False, False), + "4b_d-01_east": Door("4b_d-01_east", "4b_d-01", DoorDirection.right, False, False), + + "4b_d-02_west": Door("4b_d-02_west", "4b_d-02", DoorDirection.left, False, False), + "4b_d-02_east": Door("4b_d-02_east", "4b_d-02", DoorDirection.right, False, False), + + "4b_d-03_west": Door("4b_d-03_west", "4b_d-03", DoorDirection.left, False, False), + "4b_d-03_east": Door("4b_d-03_east", "4b_d-03", DoorDirection.right, False, False), + + "4b_end_west": Door("4b_end_west", "4b_end", DoorDirection.left, False, False), + + "4c_00_east": Door("4c_00_east", "4c_00", DoorDirection.right, False, False), + + "4c_01_west": Door("4c_01_west", "4c_01", DoorDirection.left, False, False), + "4c_01_east": Door("4c_01_east", "4c_01", DoorDirection.right, False, False), + + "4c_02_west": Door("4c_02_west", "4c_02", DoorDirection.left, False, False), + + "5a_a-00b_west": Door("5a_a-00b_west", "5a_a-00b", DoorDirection.left, False, False), + "5a_a-00b_east": Door("5a_a-00b_east", "5a_a-00b", DoorDirection.right, False, False), + + "5a_a-00x_east": Door("5a_a-00x_east", "5a_a-00x", DoorDirection.right, False, False), + + "5a_a-00d_west": Door("5a_a-00d_west", "5a_a-00d", DoorDirection.left, False, False), + "5a_a-00d_east": Door("5a_a-00d_east", "5a_a-00d", DoorDirection.right, False, False), + + "5a_a-00c_west": Door("5a_a-00c_west", "5a_a-00c", DoorDirection.left, False, False), + "5a_a-00c_east": Door("5a_a-00c_east", "5a_a-00c", DoorDirection.right, False, False), + + "5a_a-00_west": Door("5a_a-00_west", "5a_a-00", DoorDirection.left, False, False), + "5a_a-00_east": Door("5a_a-00_east", "5a_a-00", DoorDirection.right, False, False), + + "5a_a-01_west": Door("5a_a-01_west", "5a_a-01", DoorDirection.left, False, True), + "5a_a-01_south-west": Door("5a_a-01_south-west", "5a_a-01", DoorDirection.down, False, False), + "5a_a-01_south-east": Door("5a_a-01_south-east", "5a_a-01", DoorDirection.down, False, False), + "5a_a-01_east": Door("5a_a-01_east", "5a_a-01", DoorDirection.right, False, False), + "5a_a-01_north": Door("5a_a-01_north", "5a_a-01", DoorDirection.up, False, False), + + "5a_a-02_west": Door("5a_a-02_west", "5a_a-02", DoorDirection.left, False, False), + "5a_a-02_north": Door("5a_a-02_north", "5a_a-02", DoorDirection.up, False, False), + "5a_a-02_south": Door("5a_a-02_south", "5a_a-02", DoorDirection.down, False, False), + + "5a_a-03_west": Door("5a_a-03_west", "5a_a-03", DoorDirection.left, False, False), + "5a_a-03_east": Door("5a_a-03_east", "5a_a-03", DoorDirection.right, False, False), + + "5a_a-04_east": Door("5a_a-04_east", "5a_a-04", DoorDirection.right, False, False), + "5a_a-04_north": Door("5a_a-04_north", "5a_a-04", DoorDirection.up, False, False), + "5a_a-04_south": Door("5a_a-04_south", "5a_a-04", DoorDirection.down, False, False), + + "5a_a-05_north-west": Door("5a_a-05_north-west", "5a_a-05", DoorDirection.up, False, False), + "5a_a-05_south-west": Door("5a_a-05_south-west", "5a_a-05", DoorDirection.left, False, False), + "5a_a-05_south-east": Door("5a_a-05_south-east", "5a_a-05", DoorDirection.right, False, False), + "5a_a-05_north-east": Door("5a_a-05_north-east", "5a_a-05", DoorDirection.up, False, False), + + "5a_a-06_west": Door("5a_a-06_west", "5a_a-06", DoorDirection.left, False, False), + + "5a_a-07_east": Door("5a_a-07_east", "5a_a-07", DoorDirection.right, False, False), + + "5a_a-08_west": Door("5a_a-08_west", "5a_a-08", DoorDirection.left, False, False), + "5a_a-08_south": Door("5a_a-08_south", "5a_a-08", DoorDirection.down, False, False), + "5a_a-08_south-east": Door("5a_a-08_south-east", "5a_a-08", DoorDirection.right, False, False), + "5a_a-08_east": Door("5a_a-08_east", "5a_a-08", DoorDirection.right, False, False), + "5a_a-08_north-east": Door("5a_a-08_north-east", "5a_a-08", DoorDirection.right, False, False), + "5a_a-08_north": Door("5a_a-08_north", "5a_a-08", DoorDirection.up, False, False), + + "5a_a-10_west": Door("5a_a-10_west", "5a_a-10", DoorDirection.left, False, False), + "5a_a-10_east": Door("5a_a-10_east", "5a_a-10", DoorDirection.right, False, False), + + "5a_a-09_west": Door("5a_a-09_west", "5a_a-09", DoorDirection.left, False, False), + "5a_a-09_east": Door("5a_a-09_east", "5a_a-09", DoorDirection.right, False, False), + + "5a_a-11_east": Door("5a_a-11_east", "5a_a-11", DoorDirection.right, False, False), + + "5a_a-12_north-west": Door("5a_a-12_north-west", "5a_a-12", DoorDirection.left, False, False), + "5a_a-12_west": Door("5a_a-12_west", "5a_a-12", DoorDirection.left, False, False), + "5a_a-12_south-west": Door("5a_a-12_south-west", "5a_a-12", DoorDirection.left, False, False), + "5a_a-12_east": Door("5a_a-12_east", "5a_a-12", DoorDirection.up, False, False), + + "5a_a-15_south": Door("5a_a-15_south", "5a_a-15", DoorDirection.down, False, False), + + "5a_a-14_south": Door("5a_a-14_south", "5a_a-14", DoorDirection.down, False, False), + + "5a_a-13_west": Door("5a_a-13_west", "5a_a-13", DoorDirection.left, False, False), + "5a_a-13_east": Door("5a_a-13_east", "5a_a-13", DoorDirection.right, False, False), + + "5a_b-00_west": Door("5a_b-00_west", "5a_b-00", DoorDirection.left, False, True), + "5a_b-00_north-west": Door("5a_b-00_north-west", "5a_b-00", DoorDirection.up, False, False), + "5a_b-00_east": Door("5a_b-00_east", "5a_b-00", DoorDirection.right, False, False), + + "5a_b-18_south": Door("5a_b-18_south", "5a_b-18", DoorDirection.down, False, False), + + "5a_b-01_south-west": Door("5a_b-01_south-west", "5a_b-01", DoorDirection.left, False, True), + "5a_b-01_west": Door("5a_b-01_west", "5a_b-01", DoorDirection.up, False, False), + "5a_b-01_north-west": Door("5a_b-01_north-west", "5a_b-01", DoorDirection.up, False, True), + "5a_b-01_north": Door("5a_b-01_north", "5a_b-01", DoorDirection.up, False, False), + "5a_b-01_north-east": Door("5a_b-01_north-east", "5a_b-01", DoorDirection.up, False, False), + "5a_b-01_east": Door("5a_b-01_east", "5a_b-01", DoorDirection.right, False, False), + "5a_b-01_south-east": Door("5a_b-01_south-east", "5a_b-01", DoorDirection.down, False, True), + "5a_b-01_south": Door("5a_b-01_south", "5a_b-01", DoorDirection.down, False, False), + + "5a_b-01c_west": Door("5a_b-01c_west", "5a_b-01c", DoorDirection.up, False, False), + "5a_b-01c_east": Door("5a_b-01c_east", "5a_b-01c", DoorDirection.up, False, False), + + "5a_b-20_north-west": Door("5a_b-20_north-west", "5a_b-20", DoorDirection.left, False, False), + "5a_b-20_west": Door("5a_b-20_west", "5a_b-20", DoorDirection.down, False, True), + "5a_b-20_south-west": Door("5a_b-20_south-west", "5a_b-20", DoorDirection.down, False, False), + "5a_b-20_south": Door("5a_b-20_south", "5a_b-20", DoorDirection.down, False, False), + "5a_b-20_east": Door("5a_b-20_east", "5a_b-20", DoorDirection.down, False, False), + + "5a_b-21_east": Door("5a_b-21_east", "5a_b-21", DoorDirection.right, False, False), + + "5a_b-01b_west": Door("5a_b-01b_west", "5a_b-01b", DoorDirection.left, False, False), + "5a_b-01b_east": Door("5a_b-01b_east", "5a_b-01b", DoorDirection.right, False, False), + + "5a_b-02_west": Door("5a_b-02_west", "5a_b-02", DoorDirection.left, False, True), + "5a_b-02_north-west": Door("5a_b-02_north-west", "5a_b-02", DoorDirection.left, False, True), + "5a_b-02_north": Door("5a_b-02_north", "5a_b-02", DoorDirection.up, False, False), + "5a_b-02_north-east": Door("5a_b-02_north-east", "5a_b-02", DoorDirection.right, False, False), + "5a_b-02_east-upper": Door("5a_b-02_east-upper", "5a_b-02", DoorDirection.right, False, False), + "5a_b-02_east-lower": Door("5a_b-02_east-lower", "5a_b-02", DoorDirection.right, False, True), + "5a_b-02_south-east": Door("5a_b-02_south-east", "5a_b-02", DoorDirection.right, False, True), + "5a_b-02_south": Door("5a_b-02_south", "5a_b-02", DoorDirection.down, False, False), + + "5a_b-03_east": Door("5a_b-03_east", "5a_b-03", DoorDirection.right, False, False), + + "5a_b-05_west": Door("5a_b-05_west", "5a_b-05", DoorDirection.left, False, False), + + "5a_b-04_west": Door("5a_b-04_west", "5a_b-04", DoorDirection.left, False, False), + "5a_b-04_east": Door("5a_b-04_east", "5a_b-04", DoorDirection.right, False, False), + "5a_b-04_south": Door("5a_b-04_south", "5a_b-04", DoorDirection.down, False, False), + + "5a_b-07_north": Door("5a_b-07_north", "5a_b-07", DoorDirection.right, False, False), + "5a_b-07_south": Door("5a_b-07_south", "5a_b-07", DoorDirection.right, False, False), + + "5a_b-08_west": Door("5a_b-08_west", "5a_b-08", DoorDirection.left, False, False), + "5a_b-08_east": Door("5a_b-08_east", "5a_b-08", DoorDirection.right, False, False), + + "5a_b-09_north": Door("5a_b-09_north", "5a_b-09", DoorDirection.left, False, False), + "5a_b-09_south": Door("5a_b-09_south", "5a_b-09", DoorDirection.left, False, False), + + "5a_b-10_east": Door("5a_b-10_east", "5a_b-10", DoorDirection.up, False, False), + + "5a_b-11_north-west": Door("5a_b-11_north-west", "5a_b-11", DoorDirection.left, False, False), + "5a_b-11_west": Door("5a_b-11_west", "5a_b-11", DoorDirection.left, False, False), + "5a_b-11_south-west": Door("5a_b-11_south-west", "5a_b-11", DoorDirection.down, False, False), + "5a_b-11_south-east": Door("5a_b-11_south-east", "5a_b-11", DoorDirection.down, False, False), + "5a_b-11_east": Door("5a_b-11_east", "5a_b-11", DoorDirection.right, False, False), + + "5a_b-12_west": Door("5a_b-12_west", "5a_b-12", DoorDirection.up, False, False), + "5a_b-12_east": Door("5a_b-12_east", "5a_b-12", DoorDirection.up, False, False), + + "5a_b-13_west": Door("5a_b-13_west", "5a_b-13", DoorDirection.left, False, False), + "5a_b-13_east": Door("5a_b-13_east", "5a_b-13", DoorDirection.right, False, False), + "5a_b-13_north-east": Door("5a_b-13_north-east", "5a_b-13", DoorDirection.right, False, False), + + "5a_b-17_west": Door("5a_b-17_west", "5a_b-17", DoorDirection.left, False, False), + "5a_b-17_east": Door("5a_b-17_east", "5a_b-17", DoorDirection.right, False, False), + "5a_b-17_north-west": Door("5a_b-17_north-west", "5a_b-17", DoorDirection.left, False, False), + + "5a_b-22_west": Door("5a_b-22_west", "5a_b-22", DoorDirection.left, False, False), + + "5a_b-06_west": Door("5a_b-06_west", "5a_b-06", DoorDirection.left, False, False), + "5a_b-06_east": Door("5a_b-06_east", "5a_b-06", DoorDirection.right, False, False), + "5a_b-06_north-east": Door("5a_b-06_north-east", "5a_b-06", DoorDirection.right, False, False), + + "5a_b-19_west": Door("5a_b-19_west", "5a_b-19", DoorDirection.left, False, True), + "5a_b-19_east": Door("5a_b-19_east", "5a_b-19", DoorDirection.right, False, False), + "5a_b-19_north-west": Door("5a_b-19_north-west", "5a_b-19", DoorDirection.left, False, False), + + "5a_b-14_west": Door("5a_b-14_west", "5a_b-14", DoorDirection.left, False, True), + "5a_b-14_south": Door("5a_b-14_south", "5a_b-14", DoorDirection.right, False, False), + "5a_b-14_north": Door("5a_b-14_north", "5a_b-14", DoorDirection.up, False, False), + + "5a_b-15_west": Door("5a_b-15_west", "5a_b-15", DoorDirection.left, False, False), + + "5a_b-16_bottom": Door("5a_b-16_bottom", "5a_b-16", DoorDirection.down, False, False), + "5a_b-16_mirror": Door("5a_b-16_mirror", "5a_b-16", DoorDirection.special, False, False), + + "5a_void_east": Door("5a_void_east", "5a_void", DoorDirection.special, False, True), + "5a_void_west": Door("5a_void_west", "5a_void", DoorDirection.special, False, False), + + "5a_c-00_bottom": Door("5a_c-00_bottom", "5a_c-00", DoorDirection.right, False, False), + "5a_c-00_top": Door("5a_c-00_top", "5a_c-00", DoorDirection.special, False, True), + + "5a_c-01_west": Door("5a_c-01_west", "5a_c-01", DoorDirection.left, False, False), + "5a_c-01_east": Door("5a_c-01_east", "5a_c-01", DoorDirection.right, False, False), + + "5a_c-01b_west": Door("5a_c-01b_west", "5a_c-01b", DoorDirection.left, False, True), + "5a_c-01b_east": Door("5a_c-01b_east", "5a_c-01b", DoorDirection.right, False, False), + + "5a_c-01c_west": Door("5a_c-01c_west", "5a_c-01c", DoorDirection.left, False, True), + "5a_c-01c_east": Door("5a_c-01c_east", "5a_c-01c", DoorDirection.right, False, False), + + "5a_c-08b_west": Door("5a_c-08b_west", "5a_c-08b", DoorDirection.left, False, True), + "5a_c-08b_east": Door("5a_c-08b_east", "5a_c-08b", DoorDirection.right, False, False), + + "5a_c-08_west": Door("5a_c-08_west", "5a_c-08", DoorDirection.left, False, True), + "5a_c-08_east": Door("5a_c-08_east", "5a_c-08", DoorDirection.right, False, False), + + "5a_c-10_west": Door("5a_c-10_west", "5a_c-10", DoorDirection.left, False, False), + "5a_c-10_east": Door("5a_c-10_east", "5a_c-10", DoorDirection.right, False, False), + + "5a_c-12_west": Door("5a_c-12_west", "5a_c-12", DoorDirection.left, False, True), + "5a_c-12_east": Door("5a_c-12_east", "5a_c-12", DoorDirection.right, False, False), + + "5a_c-07_west": Door("5a_c-07_west", "5a_c-07", DoorDirection.left, False, True), + "5a_c-07_east": Door("5a_c-07_east", "5a_c-07", DoorDirection.right, False, False), + + "5a_c-11_west": Door("5a_c-11_west", "5a_c-11", DoorDirection.left, False, True), + "5a_c-11_east": Door("5a_c-11_east", "5a_c-11", DoorDirection.right, False, False), + + "5a_c-09_west": Door("5a_c-09_west", "5a_c-09", DoorDirection.left, False, False), + "5a_c-09_east": Door("5a_c-09_east", "5a_c-09", DoorDirection.right, False, False), + + "5a_c-13_west": Door("5a_c-13_west", "5a_c-13", DoorDirection.left, False, False), + "5a_c-13_east": Door("5a_c-13_east", "5a_c-13", DoorDirection.up, False, False), + + "5a_d-00_south": Door("5a_d-00_south", "5a_d-00", DoorDirection.down, False, True), + "5a_d-00_north": Door("5a_d-00_north", "5a_d-00", DoorDirection.up, False, False), + "5a_d-00_west": Door("5a_d-00_west", "5a_d-00", DoorDirection.left, False, False), + "5a_d-00_east": Door("5a_d-00_east", "5a_d-00", DoorDirection.right, False, False), + + "5a_d-01_south": Door("5a_d-01_south", "5a_d-01", DoorDirection.down, False, True), + "5a_d-01_south-west-left": Door("5a_d-01_south-west-left", "5a_d-01", DoorDirection.left, False, False), + "5a_d-01_south-west-down": Door("5a_d-01_south-west-down", "5a_d-01", DoorDirection.down, False, False), + "5a_d-01_south-east-right": Door("5a_d-01_south-east-right", "5a_d-01", DoorDirection.right, True, False), + "5a_d-01_south-east-down": Door("5a_d-01_south-east-down", "5a_d-01", DoorDirection.down, False, False), + "5a_d-01_west": Door("5a_d-01_west", "5a_d-01", DoorDirection.left, False, False), + "5a_d-01_east": Door("5a_d-01_east", "5a_d-01", DoorDirection.right, False, False), + "5a_d-01_north-west": Door("5a_d-01_north-west", "5a_d-01", DoorDirection.left, False, False), + "5a_d-01_north-east": Door("5a_d-01_north-east", "5a_d-01", DoorDirection.right, False, False), + + "5a_d-09_west": Door("5a_d-09_west", "5a_d-09", DoorDirection.down, False, False), + "5a_d-09_east": Door("5a_d-09_east", "5a_d-09", DoorDirection.right, False, False), + + "5a_d-04_west": Door("5a_d-04_west", "5a_d-04", DoorDirection.left, False, False), + "5a_d-04_east": Door("5a_d-04_east", "5a_d-04", DoorDirection.right, False, False), + "5a_d-04_south-west-left": Door("5a_d-04_south-west-left", "5a_d-04", DoorDirection.down, False, False), + "5a_d-04_south-west-right": Door("5a_d-04_south-west-right", "5a_d-04", DoorDirection.down, False, False), + "5a_d-04_south-east": Door("5a_d-04_south-east", "5a_d-04", DoorDirection.right, False, False), + "5a_d-04_north": Door("5a_d-04_north", "5a_d-04", DoorDirection.up, False, False), + + "5a_d-05_west": Door("5a_d-05_west", "5a_d-05", DoorDirection.left, False, False), + "5a_d-05_north": Door("5a_d-05_north", "5a_d-05", DoorDirection.up, False, False), + "5a_d-05_east": Door("5a_d-05_east", "5a_d-05", DoorDirection.right, False, False), + "5a_d-05_south": Door("5a_d-05_south", "5a_d-05", DoorDirection.down, False, False), + + "5a_d-06_north-east": Door("5a_d-06_north-east", "5a_d-06", DoorDirection.up, False, False), + "5a_d-06_south-east": Door("5a_d-06_south-east", "5a_d-06", DoorDirection.right, False, True), + "5a_d-06_south-west": Door("5a_d-06_south-west", "5a_d-06", DoorDirection.down, False, False), + "5a_d-06_north-west": Door("5a_d-06_north-west", "5a_d-06", DoorDirection.up, False, False), + + "5a_d-07_north": Door("5a_d-07_north", "5a_d-07", DoorDirection.up, False, False), + "5a_d-07_west": Door("5a_d-07_west", "5a_d-07", DoorDirection.left, False, False), + + "5a_d-02_west": Door("5a_d-02_west", "5a_d-02", DoorDirection.left, False, False), + "5a_d-02_east": Door("5a_d-02_east", "5a_d-02", DoorDirection.up, False, False), + + "5a_d-03_west": Door("5a_d-03_west", "5a_d-03", DoorDirection.up, False, False), + "5a_d-03_east": Door("5a_d-03_east", "5a_d-03", DoorDirection.right, False, False), + + "5a_d-15_north-west": Door("5a_d-15_north-west", "5a_d-15", DoorDirection.left, False, False), + "5a_d-15_west": Door("5a_d-15_west", "5a_d-15", DoorDirection.left, False, False), + "5a_d-15_south-west": Door("5a_d-15_south-west", "5a_d-15", DoorDirection.left, False, False), + "5a_d-15_south": Door("5a_d-15_south", "5a_d-15", DoorDirection.down, False, False), + "5a_d-15_south-east": Door("5a_d-15_south-east", "5a_d-15", DoorDirection.down, False, False), + + "5a_d-13_west": Door("5a_d-13_west", "5a_d-13", DoorDirection.up, False, False), + "5a_d-13_east": Door("5a_d-13_east", "5a_d-13", DoorDirection.up, False, True), + + "5a_d-19b_south-east-right": Door("5a_d-19b_south-east-right", "5a_d-19b", DoorDirection.right, False, False), + "5a_d-19b_south-east-down": Door("5a_d-19b_south-east-down", "5a_d-19b", DoorDirection.down, False, False), + "5a_d-19b_south-west": Door("5a_d-19b_south-west", "5a_d-19b", DoorDirection.down, False, False), + "5a_d-19b_north-east": Door("5a_d-19b_north-east", "5a_d-19b", DoorDirection.right, False, False), + + "5a_d-19_east": Door("5a_d-19_east", "5a_d-19", DoorDirection.up, False, False), + "5a_d-19_west": Door("5a_d-19_west", "5a_d-19", DoorDirection.up, False, False), + + "5a_d-10_east": Door("5a_d-10_east", "5a_d-10", DoorDirection.up, False, False), + "5a_d-10_west": Door("5a_d-10_west", "5a_d-10", DoorDirection.left, False, False), + + "5a_d-20_east": Door("5a_d-20_east", "5a_d-20", DoorDirection.right, False, False), + "5a_d-20_west": Door("5a_d-20_west", "5a_d-20", DoorDirection.down, False, True), + + "5a_e-00_east": Door("5a_e-00_east", "5a_e-00", DoorDirection.right, False, False), + "5a_e-00_west": Door("5a_e-00_west", "5a_e-00", DoorDirection.left, False, True), + + "5a_e-01_east": Door("5a_e-01_east", "5a_e-01", DoorDirection.right, False, False), + "5a_e-01_west": Door("5a_e-01_west", "5a_e-01", DoorDirection.left, False, True), + + "5a_e-02_east": Door("5a_e-02_east", "5a_e-02", DoorDirection.right, False, False), + "5a_e-02_west": Door("5a_e-02_west", "5a_e-02", DoorDirection.left, False, True), + + "5a_e-03_east": Door("5a_e-03_east", "5a_e-03", DoorDirection.right, False, False), + "5a_e-03_west": Door("5a_e-03_west", "5a_e-03", DoorDirection.left, False, True), + + "5a_e-04_east": Door("5a_e-04_east", "5a_e-04", DoorDirection.right, False, False), + "5a_e-04_west": Door("5a_e-04_west", "5a_e-04", DoorDirection.left, False, True), + + "5a_e-06_east": Door("5a_e-06_east", "5a_e-06", DoorDirection.right, False, False), + "5a_e-06_west": Door("5a_e-06_west", "5a_e-06", DoorDirection.left, False, True), + + "5a_e-05_east": Door("5a_e-05_east", "5a_e-05", DoorDirection.right, False, False), + "5a_e-05_west": Door("5a_e-05_west", "5a_e-05", DoorDirection.left, False, True), + + "5a_e-07_east": Door("5a_e-07_east", "5a_e-07", DoorDirection.right, False, False), + "5a_e-07_west": Door("5a_e-07_west", "5a_e-07", DoorDirection.left, False, True), + + "5a_e-08_east": Door("5a_e-08_east", "5a_e-08", DoorDirection.right, False, False), + "5a_e-08_west": Door("5a_e-08_west", "5a_e-08", DoorDirection.left, False, True), + + "5a_e-09_east": Door("5a_e-09_east", "5a_e-09", DoorDirection.right, False, False), + "5a_e-09_west": Door("5a_e-09_west", "5a_e-09", DoorDirection.left, False, True), + + "5a_e-10_east": Door("5a_e-10_east", "5a_e-10", DoorDirection.right, False, False), + "5a_e-10_west": Door("5a_e-10_west", "5a_e-10", DoorDirection.left, False, True), + + "5a_e-11_west": Door("5a_e-11_west", "5a_e-11", DoorDirection.left, False, True), + + "5b_start_east": Door("5b_start_east", "5b_start", DoorDirection.right, False, False), + + "5b_a-00_west": Door("5b_a-00_west", "5b_a-00", DoorDirection.left, False, False), + "5b_a-00_east": Door("5b_a-00_east", "5b_a-00", DoorDirection.right, False, False), + + "5b_a-01_west": Door("5b_a-01_west", "5b_a-01", DoorDirection.left, False, False), + "5b_a-01_east": Door("5b_a-01_east", "5b_a-01", DoorDirection.right, False, False), + + "5b_a-02_west": Door("5b_a-02_west", "5b_a-02", DoorDirection.left, False, False), + "5b_a-02_east": Door("5b_a-02_east", "5b_a-02", DoorDirection.up, False, False), + + "5b_b-00_south": Door("5b_b-00_south", "5b_b-00", DoorDirection.down, False, True), + "5b_b-00_west": Door("5b_b-00_west", "5b_b-00", DoorDirection.left, False, False), + "5b_b-00_north": Door("5b_b-00_north", "5b_b-00", DoorDirection.up, False, False), + "5b_b-00_east": Door("5b_b-00_east", "5b_b-00", DoorDirection.right, False, False), + + "5b_b-01_west": Door("5b_b-01_west", "5b_b-01", DoorDirection.left, False, False), + "5b_b-01_north": Door("5b_b-01_north", "5b_b-01", DoorDirection.up, False, False), + "5b_b-01_east": Door("5b_b-01_east", "5b_b-01", DoorDirection.right, False, False), + + "5b_b-04_west": Door("5b_b-04_west", "5b_b-04", DoorDirection.left, False, False), + "5b_b-04_east": Door("5b_b-04_east", "5b_b-04", DoorDirection.down, False, False), + + "5b_b-02_south": Door("5b_b-02_south", "5b_b-02", DoorDirection.down, False, True), + "5b_b-02_north-west": Door("5b_b-02_north-west", "5b_b-02", DoorDirection.left, False, False), + "5b_b-02_south-west": Door("5b_b-02_south-west", "5b_b-02", DoorDirection.left, False, False), + "5b_b-02_north": Door("5b_b-02_north", "5b_b-02", DoorDirection.up, False, False), + "5b_b-02_north-east": Door("5b_b-02_north-east", "5b_b-02", DoorDirection.right, False, False), + "5b_b-02_south-east": Door("5b_b-02_south-east", "5b_b-02", DoorDirection.right, False, False), + + "5b_b-05_north": Door("5b_b-05_north", "5b_b-05", DoorDirection.right, False, False), + "5b_b-05_south": Door("5b_b-05_south", "5b_b-05", DoorDirection.right, False, False), + + "5b_b-06_east": Door("5b_b-06_east", "5b_b-06", DoorDirection.right, False, False), + + "5b_b-07_north": Door("5b_b-07_north", "5b_b-07", DoorDirection.up, False, False), + "5b_b-07_south": Door("5b_b-07_south", "5b_b-07", DoorDirection.left, False, False), + + "5b_b-03_north": Door("5b_b-03_north", "5b_b-03", DoorDirection.up, False, False), + "5b_b-03_west": Door("5b_b-03_west", "5b_b-03", DoorDirection.left, False, False), + "5b_b-03_east": Door("5b_b-03_east", "5b_b-03", DoorDirection.down, False, True), + + "5b_b-08_north": Door("5b_b-08_north", "5b_b-08", DoorDirection.up, False, False), + "5b_b-08_south": Door("5b_b-08_south", "5b_b-08", DoorDirection.down, False, False), + "5b_b-08_east": Door("5b_b-08_east", "5b_b-08", DoorDirection.down, False, True), + + "5b_b-09_mirror": Door("5b_b-09_mirror", "5b_b-09", DoorDirection.special, False, False), + "5b_b-09_bottom": Door("5b_b-09_bottom", "5b_b-09", DoorDirection.down, False, True), + + "5b_c-00_mirror": Door("5b_c-00_mirror", "5b_c-00", DoorDirection.special, False, True), + "5b_c-00_bottom": Door("5b_c-00_bottom", "5b_c-00", DoorDirection.right, False, False), + + "5b_c-01_west": Door("5b_c-01_west", "5b_c-01", DoorDirection.left, False, True), + "5b_c-01_east": Door("5b_c-01_east", "5b_c-01", DoorDirection.right, False, False), + + "5b_c-02_west": Door("5b_c-02_west", "5b_c-02", DoorDirection.left, False, True), + "5b_c-02_east": Door("5b_c-02_east", "5b_c-02", DoorDirection.right, False, False), + + "5b_c-03_west": Door("5b_c-03_west", "5b_c-03", DoorDirection.left, False, True), + "5b_c-03_east": Door("5b_c-03_east", "5b_c-03", DoorDirection.right, False, False), + + "5b_c-04_west": Door("5b_c-04_west", "5b_c-04", DoorDirection.left, False, True), + "5b_c-04_east": Door("5b_c-04_east", "5b_c-04", DoorDirection.up, False, False), + + "5b_d-00_west": Door("5b_d-00_west", "5b_d-00", DoorDirection.down, False, True), + "5b_d-00_east": Door("5b_d-00_east", "5b_d-00", DoorDirection.right, False, False), + + "5b_d-01_west": Door("5b_d-01_west", "5b_d-01", DoorDirection.left, False, True), + "5b_d-01_east": Door("5b_d-01_east", "5b_d-01", DoorDirection.right, False, False), + + "5b_d-02_west": Door("5b_d-02_west", "5b_d-02", DoorDirection.left, False, True), + "5b_d-02_east": Door("5b_d-02_east", "5b_d-02", DoorDirection.right, False, False), + + "5b_d-03_west": Door("5b_d-03_west", "5b_d-03", DoorDirection.left, False, True), + "5b_d-03_east": Door("5b_d-03_east", "5b_d-03", DoorDirection.right, False, False), + + "5b_d-04_west": Door("5b_d-04_west", "5b_d-04", DoorDirection.left, False, True), + "5b_d-04_east": Door("5b_d-04_east", "5b_d-04", DoorDirection.right, False, False), + + "5b_d-05_west": Door("5b_d-05_west", "5b_d-05", DoorDirection.left, False, False), + + "5c_00_east": Door("5c_00_east", "5c_00", DoorDirection.right, False, False), + + "5c_01_west": Door("5c_01_west", "5c_01", DoorDirection.left, False, False), + "5c_01_east": Door("5c_01_east", "5c_01", DoorDirection.right, False, False), + + "5c_02_west": Door("5c_02_west", "5c_02", DoorDirection.left, False, False), + + "6a_00_west": Door("6a_00_west", "6a_00", DoorDirection.up, False, False), + + "6a_01_bottom": Door("6a_01_bottom", "6a_01", DoorDirection.down, False, True), + "6a_01_top": Door("6a_01_top", "6a_01", DoorDirection.up, False, False), + + "6a_02_bottom": Door("6a_02_bottom", "6a_02", DoorDirection.down, False, True), + "6a_02_bottom-west": Door("6a_02_bottom-west", "6a_02", DoorDirection.left, False, False), + "6a_02_top-west": Door("6a_02_top-west", "6a_02", DoorDirection.left, False, False), + "6a_02_top": Door("6a_02_top", "6a_02", DoorDirection.up, False, False), + + "6a_03_bottom": Door("6a_03_bottom", "6a_03", DoorDirection.right, False, False), + "6a_03_top": Door("6a_03_top", "6a_03", DoorDirection.right, False, False), + + "6a_02b_bottom": Door("6a_02b_bottom", "6a_02b", DoorDirection.down, False, True), + "6a_02b_top": Door("6a_02b_top", "6a_02b", DoorDirection.up, False, False), + + "6a_04_south": Door("6a_04_south", "6a_04", DoorDirection.down, False, True), + "6a_04_south-west": Door("6a_04_south-west", "6a_04", DoorDirection.left, True, False), + "6a_04_south-east": Door("6a_04_south-east", "6a_04", DoorDirection.right, False, False), + "6a_04_east": Door("6a_04_east", "6a_04", DoorDirection.right, False, False), + "6a_04_north-west": Door("6a_04_north-west", "6a_04", DoorDirection.left, False, False), + + "6a_04b_west": Door("6a_04b_west", "6a_04b", DoorDirection.left, False, False), + "6a_04b_east": Door("6a_04b_east", "6a_04b", DoorDirection.right, False, False), + + "6a_04c_east": Door("6a_04c_east", "6a_04c", DoorDirection.right, False, False), + + "6a_04d_west": Door("6a_04d_west", "6a_04d", DoorDirection.left, False, False), + + "6a_04e_east": Door("6a_04e_east", "6a_04e", DoorDirection.right, False, False), + + "6a_05_west": Door("6a_05_west", "6a_05", DoorDirection.left, False, False), + "6a_05_east": Door("6a_05_east", "6a_05", DoorDirection.right, False, False), + + "6a_06_west": Door("6a_06_west", "6a_06", DoorDirection.left, False, False), + "6a_06_east": Door("6a_06_east", "6a_06", DoorDirection.right, False, False), + + "6a_07_west": Door("6a_07_west", "6a_07", DoorDirection.left, False, False), + "6a_07_east": Door("6a_07_east", "6a_07", DoorDirection.right, False, False), + "6a_07_north-east": Door("6a_07_north-east", "6a_07", DoorDirection.right, False, False), + + "6a_08a_west": Door("6a_08a_west", "6a_08a", DoorDirection.left, False, False), + "6a_08a_east": Door("6a_08a_east", "6a_08a", DoorDirection.right, False, False), + + "6a_08b_west": Door("6a_08b_west", "6a_08b", DoorDirection.left, False, False), + "6a_08b_east": Door("6a_08b_east", "6a_08b", DoorDirection.right, False, False), + + "6a_09_west": Door("6a_09_west", "6a_09", DoorDirection.left, False, True), + "6a_09_north-west": Door("6a_09_north-west", "6a_09", DoorDirection.left, False, True), + "6a_09_east": Door("6a_09_east", "6a_09", DoorDirection.right, False, False), + "6a_09_north-east": Door("6a_09_north-east", "6a_09", DoorDirection.right, False, False), + + "6a_10a_west": Door("6a_10a_west", "6a_10a", DoorDirection.left, False, False), + "6a_10a_east": Door("6a_10a_east", "6a_10a", DoorDirection.right, False, False), + + "6a_10b_west": Door("6a_10b_west", "6a_10b", DoorDirection.left, False, False), + "6a_10b_east": Door("6a_10b_east", "6a_10b", DoorDirection.right, False, False), + + "6a_11_west": Door("6a_11_west", "6a_11", DoorDirection.left, False, True), + "6a_11_north-west": Door("6a_11_north-west", "6a_11", DoorDirection.left, False, True), + "6a_11_east": Door("6a_11_east", "6a_11", DoorDirection.right, False, False), + "6a_11_north-east": Door("6a_11_north-east", "6a_11", DoorDirection.right, False, False), + + "6a_12a_west": Door("6a_12a_west", "6a_12a", DoorDirection.left, False, False), + "6a_12a_east": Door("6a_12a_east", "6a_12a", DoorDirection.right, False, False), + + "6a_12b_west": Door("6a_12b_west", "6a_12b", DoorDirection.left, False, False), + "6a_12b_east": Door("6a_12b_east", "6a_12b", DoorDirection.right, False, False), + + "6a_13_west": Door("6a_13_west", "6a_13", DoorDirection.left, False, True), + "6a_13_north-west": Door("6a_13_north-west", "6a_13", DoorDirection.left, False, True), + "6a_13_east": Door("6a_13_east", "6a_13", DoorDirection.right, False, False), + "6a_13_north-east": Door("6a_13_north-east", "6a_13", DoorDirection.right, False, False), + + "6a_14a_west": Door("6a_14a_west", "6a_14a", DoorDirection.left, False, False), + "6a_14a_east": Door("6a_14a_east", "6a_14a", DoorDirection.right, False, False), + + "6a_14b_west": Door("6a_14b_west", "6a_14b", DoorDirection.left, False, False), + "6a_14b_east": Door("6a_14b_east", "6a_14b", DoorDirection.right, False, False), + + "6a_15_west": Door("6a_15_west", "6a_15", DoorDirection.left, False, True), + "6a_15_north-west": Door("6a_15_north-west", "6a_15", DoorDirection.left, False, True), + "6a_15_east": Door("6a_15_east", "6a_15", DoorDirection.right, False, False), + "6a_15_north-east": Door("6a_15_north-east", "6a_15", DoorDirection.right, False, False), + + "6a_16a_west": Door("6a_16a_west", "6a_16a", DoorDirection.left, False, False), + "6a_16a_east": Door("6a_16a_east", "6a_16a", DoorDirection.right, False, False), + + "6a_16b_west": Door("6a_16b_west", "6a_16b", DoorDirection.left, False, False), + "6a_16b_east": Door("6a_16b_east", "6a_16b", DoorDirection.right, False, False), + + "6a_17_west": Door("6a_17_west", "6a_17", DoorDirection.left, False, True), + "6a_17_north-west": Door("6a_17_north-west", "6a_17", DoorDirection.left, False, True), + "6a_17_east": Door("6a_17_east", "6a_17", DoorDirection.right, False, False), + "6a_17_north-east": Door("6a_17_north-east", "6a_17", DoorDirection.right, False, False), + + "6a_18a_west": Door("6a_18a_west", "6a_18a", DoorDirection.left, False, False), + "6a_18a_east": Door("6a_18a_east", "6a_18a", DoorDirection.right, False, False), + + "6a_18b_west": Door("6a_18b_west", "6a_18b", DoorDirection.left, False, False), + "6a_18b_east": Door("6a_18b_east", "6a_18b", DoorDirection.right, False, False), + + "6a_19_west": Door("6a_19_west", "6a_19", DoorDirection.left, False, True), + "6a_19_north-west": Door("6a_19_north-west", "6a_19", DoorDirection.left, False, True), + "6a_19_east": Door("6a_19_east", "6a_19", DoorDirection.right, False, False), + + "6a_20_west": Door("6a_20_west", "6a_20", DoorDirection.left, False, False), + "6a_20_east": Door("6a_20_east", "6a_20", DoorDirection.right, False, False), + + "6a_b-00_west": Door("6a_b-00_west", "6a_b-00", DoorDirection.left, False, True), + "6a_b-00_top": Door("6a_b-00_top", "6a_b-00", DoorDirection.up, False, False), + "6a_b-00_east": Door("6a_b-00_east", "6a_b-00", DoorDirection.right, False, False), + + "6a_b-00b_bottom": Door("6a_b-00b_bottom", "6a_b-00b", DoorDirection.down, False, False), + "6a_b-00b_top": Door("6a_b-00b_top", "6a_b-00b", DoorDirection.left, False, False), + + "6a_b-00c_east": Door("6a_b-00c_east", "6a_b-00c", DoorDirection.right, False, False), + + "6a_b-01_west": Door("6a_b-01_west", "6a_b-01", DoorDirection.left, False, False), + "6a_b-01_east": Door("6a_b-01_east", "6a_b-01", DoorDirection.down, False, False), + + "6a_b-02_top": Door("6a_b-02_top", "6a_b-02", DoorDirection.up, False, False), + "6a_b-02_bottom": Door("6a_b-02_bottom", "6a_b-02", DoorDirection.right, False, False), + + "6a_b-02b_top": Door("6a_b-02b_top", "6a_b-02b", DoorDirection.left, False, False), + "6a_b-02b_bottom": Door("6a_b-02b_bottom", "6a_b-02b", DoorDirection.right, False, False), + + "6a_b-03_west": Door("6a_b-03_west", "6a_b-03", DoorDirection.left, False, False), + "6a_b-03_east": Door("6a_b-03_east", "6a_b-03", DoorDirection.right, False, False), + + "6a_boss-00_west": Door("6a_boss-00_west", "6a_boss-00", DoorDirection.left, False, True), + "6a_boss-00_east": Door("6a_boss-00_east", "6a_boss-00", DoorDirection.down, False, False), + + "6a_boss-01_west": Door("6a_boss-01_west", "6a_boss-01", DoorDirection.up, False, False), + "6a_boss-01_east": Door("6a_boss-01_east", "6a_boss-01", DoorDirection.down, False, False), + + "6a_boss-02_west": Door("6a_boss-02_west", "6a_boss-02", DoorDirection.up, False, False), + "6a_boss-02_east": Door("6a_boss-02_east", "6a_boss-02", DoorDirection.down, False, False), + + "6a_boss-03_west": Door("6a_boss-03_west", "6a_boss-03", DoorDirection.up, False, False), + "6a_boss-03_east": Door("6a_boss-03_east", "6a_boss-03", DoorDirection.down, False, False), + + "6a_boss-04_west": Door("6a_boss-04_west", "6a_boss-04", DoorDirection.up, False, False), + "6a_boss-04_east": Door("6a_boss-04_east", "6a_boss-04", DoorDirection.right, False, False), + + "6a_boss-05_west": Door("6a_boss-05_west", "6a_boss-05", DoorDirection.left, False, False), + "6a_boss-05_east": Door("6a_boss-05_east", "6a_boss-05", DoorDirection.down, False, False), + + "6a_boss-06_west": Door("6a_boss-06_west", "6a_boss-06", DoorDirection.up, False, False), + "6a_boss-06_east": Door("6a_boss-06_east", "6a_boss-06", DoorDirection.down, False, False), + + "6a_boss-07_west": Door("6a_boss-07_west", "6a_boss-07", DoorDirection.up, False, False), + "6a_boss-07_east": Door("6a_boss-07_east", "6a_boss-07", DoorDirection.down, False, False), + + "6a_boss-08_west": Door("6a_boss-08_west", "6a_boss-08", DoorDirection.up, False, False), + "6a_boss-08_east": Door("6a_boss-08_east", "6a_boss-08", DoorDirection.down, False, False), + + "6a_boss-09_west": Door("6a_boss-09_west", "6a_boss-09", DoorDirection.up, False, False), + "6a_boss-09_east": Door("6a_boss-09_east", "6a_boss-09", DoorDirection.right, False, False), + + "6a_boss-10_west": Door("6a_boss-10_west", "6a_boss-10", DoorDirection.left, False, False), + "6a_boss-10_east": Door("6a_boss-10_east", "6a_boss-10", DoorDirection.right, False, False), + + "6a_boss-11_west": Door("6a_boss-11_west", "6a_boss-11", DoorDirection.left, False, False), + "6a_boss-11_east": Door("6a_boss-11_east", "6a_boss-11", DoorDirection.down, False, False), + + "6a_boss-12_west": Door("6a_boss-12_west", "6a_boss-12", DoorDirection.up, False, False), + "6a_boss-12_east": Door("6a_boss-12_east", "6a_boss-12", DoorDirection.down, False, False), + + "6a_boss-13_west": Door("6a_boss-13_west", "6a_boss-13", DoorDirection.up, False, False), + "6a_boss-13_east": Door("6a_boss-13_east", "6a_boss-13", DoorDirection.right, False, False), + + "6a_boss-14_west": Door("6a_boss-14_west", "6a_boss-14", DoorDirection.left, False, False), + "6a_boss-14_east": Door("6a_boss-14_east", "6a_boss-14", DoorDirection.right, False, False), + + "6a_boss-15_west": Door("6a_boss-15_west", "6a_boss-15", DoorDirection.left, False, False), + "6a_boss-15_east": Door("6a_boss-15_east", "6a_boss-15", DoorDirection.down, False, False), + + "6a_boss-16_west": Door("6a_boss-16_west", "6a_boss-16", DoorDirection.up, False, False), + "6a_boss-16_east": Door("6a_boss-16_east", "6a_boss-16", DoorDirection.right, False, False), + + "6a_boss-17_west": Door("6a_boss-17_west", "6a_boss-17", DoorDirection.left, False, False), + "6a_boss-17_east": Door("6a_boss-17_east", "6a_boss-17", DoorDirection.down, False, False), + + "6a_boss-18_west": Door("6a_boss-18_west", "6a_boss-18", DoorDirection.up, False, False), + "6a_boss-18_east": Door("6a_boss-18_east", "6a_boss-18", DoorDirection.right, False, False), + + "6a_boss-19_west": Door("6a_boss-19_west", "6a_boss-19", DoorDirection.left, False, False), + "6a_boss-19_east": Door("6a_boss-19_east", "6a_boss-19", DoorDirection.right, False, False), + + "6a_boss-20_west": Door("6a_boss-20_west", "6a_boss-20", DoorDirection.left, False, False), + "6a_boss-20_east": Door("6a_boss-20_east", "6a_boss-20", DoorDirection.up, False, False), + + "6a_after-00_bottom": Door("6a_after-00_bottom", "6a_after-00", DoorDirection.down, False, True), + "6a_after-00_top": Door("6a_after-00_top", "6a_after-00", DoorDirection.up, False, False), + + "6a_after-01_bottom": Door("6a_after-01_bottom", "6a_after-01", DoorDirection.down, False, True), + + "6b_a-00_top": Door("6b_a-00_top", "6b_a-00", DoorDirection.up, False, False), + + "6b_a-01_bottom": Door("6b_a-01_bottom", "6b_a-01", DoorDirection.down, False, True), + "6b_a-01_top": Door("6b_a-01_top", "6b_a-01", DoorDirection.up, False, False), + + "6b_a-02_bottom": Door("6b_a-02_bottom", "6b_a-02", DoorDirection.down, False, True), + "6b_a-02_top": Door("6b_a-02_top", "6b_a-02", DoorDirection.up, False, False), + + "6b_a-03_west": Door("6b_a-03_west", "6b_a-03", DoorDirection.down, False, True), + "6b_a-03_east": Door("6b_a-03_east", "6b_a-03", DoorDirection.right, False, False), + + "6b_a-04_west": Door("6b_a-04_west", "6b_a-04", DoorDirection.left, False, False), + "6b_a-04_east": Door("6b_a-04_east", "6b_a-04", DoorDirection.right, False, False), + + "6b_a-05_west": Door("6b_a-05_west", "6b_a-05", DoorDirection.left, False, False), + "6b_a-05_east": Door("6b_a-05_east", "6b_a-05", DoorDirection.right, False, False), + + "6b_a-06_west": Door("6b_a-06_west", "6b_a-06", DoorDirection.left, False, False), + "6b_a-06_east": Door("6b_a-06_east", "6b_a-06", DoorDirection.right, False, False), + + "6b_b-00_west": Door("6b_b-00_west", "6b_b-00", DoorDirection.left, False, True), + "6b_b-00_east": Door("6b_b-00_east", "6b_b-00", DoorDirection.down, False, False), + + "6b_b-01_top": Door("6b_b-01_top", "6b_b-01", DoorDirection.up, False, False), + "6b_b-01_bottom": Door("6b_b-01_bottom", "6b_b-01", DoorDirection.right, False, False), + + "6b_b-02_top": Door("6b_b-02_top", "6b_b-02", DoorDirection.left, False, False), + "6b_b-02_bottom": Door("6b_b-02_bottom", "6b_b-02", DoorDirection.right, False, False), + + "6b_b-03_top": Door("6b_b-03_top", "6b_b-03", DoorDirection.left, False, False), + "6b_b-03_bottom": Door("6b_b-03_bottom", "6b_b-03", DoorDirection.right, False, False), + + "6b_b-04_top": Door("6b_b-04_top", "6b_b-04", DoorDirection.left, False, False), + "6b_b-04_bottom": Door("6b_b-04_bottom", "6b_b-04", DoorDirection.right, False, False), + + "6b_b-05_top": Door("6b_b-05_top", "6b_b-05", DoorDirection.left, False, False), + "6b_b-05_bottom": Door("6b_b-05_bottom", "6b_b-05", DoorDirection.right, False, False), + + "6b_b-06_top": Door("6b_b-06_top", "6b_b-06", DoorDirection.left, False, False), + "6b_b-06_bottom": Door("6b_b-06_bottom", "6b_b-06", DoorDirection.right, False, False), + + "6b_b-07_top": Door("6b_b-07_top", "6b_b-07", DoorDirection.left, False, False), + "6b_b-07_bottom": Door("6b_b-07_bottom", "6b_b-07", DoorDirection.right, False, False), + + "6b_b-08_top": Door("6b_b-08_top", "6b_b-08", DoorDirection.left, False, False), + "6b_b-08_bottom": Door("6b_b-08_bottom", "6b_b-08", DoorDirection.right, False, False), + + "6b_b-10_west": Door("6b_b-10_west", "6b_b-10", DoorDirection.left, False, False), + "6b_b-10_east": Door("6b_b-10_east", "6b_b-10", DoorDirection.right, False, False), + + "6b_c-00_west": Door("6b_c-00_west", "6b_c-00", DoorDirection.left, False, True), + "6b_c-00_east": Door("6b_c-00_east", "6b_c-00", DoorDirection.right, False, False), + + "6b_c-01_west": Door("6b_c-01_west", "6b_c-01", DoorDirection.left, False, True), + "6b_c-01_east": Door("6b_c-01_east", "6b_c-01", DoorDirection.right, False, False), + + "6b_c-02_west": Door("6b_c-02_west", "6b_c-02", DoorDirection.left, False, True), + "6b_c-02_east": Door("6b_c-02_east", "6b_c-02", DoorDirection.right, False, False), + + "6b_c-03_west": Door("6b_c-03_west", "6b_c-03", DoorDirection.left, False, True), + "6b_c-03_east": Door("6b_c-03_east", "6b_c-03", DoorDirection.right, False, False), + + "6b_c-04_west": Door("6b_c-04_west", "6b_c-04", DoorDirection.left, False, True), + "6b_c-04_east": Door("6b_c-04_east", "6b_c-04", DoorDirection.right, False, False), + + "6b_d-00_west": Door("6b_d-00_west", "6b_d-00", DoorDirection.left, False, True), + "6b_d-00_east": Door("6b_d-00_east", "6b_d-00", DoorDirection.up, False, False), + + "6b_d-01_west": Door("6b_d-01_west", "6b_d-01", DoorDirection.down, False, True), + "6b_d-01_east": Door("6b_d-01_east", "6b_d-01", DoorDirection.right, False, False), + + "6b_d-02_west": Door("6b_d-02_west", "6b_d-02", DoorDirection.left, False, False), + "6b_d-02_east": Door("6b_d-02_east", "6b_d-02", DoorDirection.right, False, False), + + "6b_d-03_west": Door("6b_d-03_west", "6b_d-03", DoorDirection.left, False, False), + "6b_d-03_east": Door("6b_d-03_east", "6b_d-03", DoorDirection.right, False, False), + + "6b_d-04_west": Door("6b_d-04_west", "6b_d-04", DoorDirection.left, False, False), + "6b_d-04_east": Door("6b_d-04_east", "6b_d-04", DoorDirection.right, False, False), + + "6b_d-05_west": Door("6b_d-05_west", "6b_d-05", DoorDirection.left, False, False), + + "6c_00_east": Door("6c_00_east", "6c_00", DoorDirection.right, False, False), + + "6c_01_west": Door("6c_01_west", "6c_01", DoorDirection.left, False, False), + "6c_01_east": Door("6c_01_east", "6c_01", DoorDirection.right, False, False), + + "6c_02_west": Door("6c_02_west", "6c_02", DoorDirection.left, False, False), + + "7a_a-00_east": Door("7a_a-00_east", "7a_a-00", DoorDirection.right, False, False), + + "7a_a-01_west": Door("7a_a-01_west", "7a_a-01", DoorDirection.left, False, True), + "7a_a-01_east": Door("7a_a-01_east", "7a_a-01", DoorDirection.right, False, False), + + "7a_a-02_west": Door("7a_a-02_west", "7a_a-02", DoorDirection.left, False, True), + "7a_a-02_north": Door("7a_a-02_north", "7a_a-02", DoorDirection.up, False, False), + "7a_a-02_north-west": Door("7a_a-02_north-west", "7a_a-02", DoorDirection.up, False, True), + "7a_a-02_east": Door("7a_a-02_east", "7a_a-02", DoorDirection.right, False, False), + + "7a_a-02b_east": Door("7a_a-02b_east", "7a_a-02b", DoorDirection.down, False, True), + "7a_a-02b_west": Door("7a_a-02b_west", "7a_a-02b", DoorDirection.down, False, False), + + "7a_a-03_west": Door("7a_a-03_west", "7a_a-03", DoorDirection.left, False, False), + "7a_a-03_east": Door("7a_a-03_east", "7a_a-03", DoorDirection.right, False, False), + + "7a_a-04_west": Door("7a_a-04_west", "7a_a-04", DoorDirection.left, False, False), + "7a_a-04_north": Door("7a_a-04_north", "7a_a-04", DoorDirection.up, True, False), + "7a_a-04_east": Door("7a_a-04_east", "7a_a-04", DoorDirection.right, False, False), + + "7a_a-04b_east": Door("7a_a-04b_east", "7a_a-04b", DoorDirection.down, False, False), + + "7a_a-05_west": Door("7a_a-05_west", "7a_a-05", DoorDirection.left, False, False), + "7a_a-05_east": Door("7a_a-05_east", "7a_a-05", DoorDirection.right, False, False), + + "7a_a-06_bottom": Door("7a_a-06_bottom", "7a_a-06", DoorDirection.left, False, False), + "7a_a-06_top": Door("7a_a-06_top", "7a_a-06", DoorDirection.up, False, False), + + "7a_b-00_bottom": Door("7a_b-00_bottom", "7a_b-00", DoorDirection.down, False, True), + "7a_b-00_top": Door("7a_b-00_top", "7a_b-00", DoorDirection.up, False, False), + + "7a_b-01_west": Door("7a_b-01_west", "7a_b-01", DoorDirection.down, False, True), + "7a_b-01_east": Door("7a_b-01_east", "7a_b-01", DoorDirection.right, False, False), + + "7a_b-02_south": Door("7a_b-02_south", "7a_b-02", DoorDirection.left, False, False), + "7a_b-02_north-west": Door("7a_b-02_north-west", "7a_b-02", DoorDirection.left, False, False), + "7a_b-02_north": Door("7a_b-02_north", "7a_b-02", DoorDirection.up, False, False), + "7a_b-02_north-east": Door("7a_b-02_north-east", "7a_b-02", DoorDirection.right, False, False), + + "7a_b-02b_south": Door("7a_b-02b_south", "7a_b-02b", DoorDirection.right, False, False), + "7a_b-02b_north-west": Door("7a_b-02b_north-west", "7a_b-02b", DoorDirection.left, False, False), + "7a_b-02b_north-east": Door("7a_b-02b_north-east", "7a_b-02b", DoorDirection.right, False, False), + + "7a_b-02e_east": Door("7a_b-02e_east", "7a_b-02e", DoorDirection.right, False, False), + + "7a_b-02c_west": Door("7a_b-02c_west", "7a_b-02c", DoorDirection.left, False, False), + "7a_b-02c_south-east": Door("7a_b-02c_south-east", "7a_b-02c", DoorDirection.down, False, False), + "7a_b-02c_east": Door("7a_b-02c_east", "7a_b-02c", DoorDirection.right, False, False), + + "7a_b-02d_north": Door("7a_b-02d_north", "7a_b-02d", DoorDirection.up, False, False), + "7a_b-02d_south": Door("7a_b-02d_south", "7a_b-02d", DoorDirection.down, False, False), + + "7a_b-03_west": Door("7a_b-03_west", "7a_b-03", DoorDirection.left, False, False), + "7a_b-03_north": Door("7a_b-03_north", "7a_b-03", DoorDirection.up, False, False), + "7a_b-03_east": Door("7a_b-03_east", "7a_b-03", DoorDirection.right, False, False), + + "7a_b-04_west": Door("7a_b-04_west", "7a_b-04", DoorDirection.left, False, False), + + "7a_b-05_west": Door("7a_b-05_west", "7a_b-05", DoorDirection.down, False, True), + "7a_b-05_north-west": Door("7a_b-05_north-west", "7a_b-05", DoorDirection.left, False, True), + "7a_b-05_east": Door("7a_b-05_east", "7a_b-05", DoorDirection.right, False, False), + + "7a_b-06_west": Door("7a_b-06_west", "7a_b-06", DoorDirection.left, False, False), + "7a_b-06_east": Door("7a_b-06_east", "7a_b-06", DoorDirection.right, False, False), + + "7a_b-07_west": Door("7a_b-07_west", "7a_b-07", DoorDirection.left, False, False), + "7a_b-07_east": Door("7a_b-07_east", "7a_b-07", DoorDirection.right, False, False), + + "7a_b-08_west": Door("7a_b-08_west", "7a_b-08", DoorDirection.left, False, False), + "7a_b-08_east": Door("7a_b-08_east", "7a_b-08", DoorDirection.right, False, False), + + "7a_b-09_bottom": Door("7a_b-09_bottom", "7a_b-09", DoorDirection.left, False, False), + "7a_b-09_top": Door("7a_b-09_top", "7a_b-09", DoorDirection.up, False, False), + + "7a_c-00_west": Door("7a_c-00_west", "7a_c-00", DoorDirection.down, False, True), + "7a_c-00_east": Door("7a_c-00_east", "7a_c-00", DoorDirection.up, False, False), + + "7a_c-01_bottom": Door("7a_c-01_bottom", "7a_c-01", DoorDirection.down, False, True), + "7a_c-01_top": Door("7a_c-01_top", "7a_c-01", DoorDirection.up, False, False), + + "7a_c-02_bottom": Door("7a_c-02_bottom", "7a_c-02", DoorDirection.down, False, True), + "7a_c-02_top": Door("7a_c-02_top", "7a_c-02", DoorDirection.up, False, False), + + "7a_c-03_south": Door("7a_c-03_south", "7a_c-03", DoorDirection.down, False, True), + "7a_c-03_west": Door("7a_c-03_west", "7a_c-03", DoorDirection.left, False, False), + "7a_c-03_east": Door("7a_c-03_east", "7a_c-03", DoorDirection.right, False, False), + + "7a_c-03b_east": Door("7a_c-03b_east", "7a_c-03b", DoorDirection.right, False, False), + + "7a_c-04_west": Door("7a_c-04_west", "7a_c-04", DoorDirection.left, False, True), + "7a_c-04_north-west": Door("7a_c-04_north-west", "7a_c-04", DoorDirection.up, False, False), + "7a_c-04_north-east": Door("7a_c-04_north-east", "7a_c-04", DoorDirection.up, False, False), + "7a_c-04_east": Door("7a_c-04_east", "7a_c-04", DoorDirection.right, False, False), + + "7a_c-05_west": Door("7a_c-05_west", "7a_c-05", DoorDirection.left, False, False), + + "7a_c-06_south": Door("7a_c-06_south", "7a_c-06", DoorDirection.down, False, False), + "7a_c-06_north": Door("7a_c-06_north", "7a_c-06", DoorDirection.up, False, False), + "7a_c-06_east": Door("7a_c-06_east", "7a_c-06", DoorDirection.right, False, False), + + "7a_c-06b_south": Door("7a_c-06b_south", "7a_c-06b", DoorDirection.down, False, False), + "7a_c-06b_north": Door("7a_c-06b_north", "7a_c-06b", DoorDirection.up, False, False), + "7a_c-06b_west": Door("7a_c-06b_west", "7a_c-06b", DoorDirection.left, False, False), + "7a_c-06b_east": Door("7a_c-06b_east", "7a_c-06b", DoorDirection.right, True, False), + + "7a_c-06c_west": Door("7a_c-06c_west", "7a_c-06c", DoorDirection.left, False, False), + + "7a_c-07_west": Door("7a_c-07_west", "7a_c-07", DoorDirection.left, False, False), + "7a_c-07_south-west": Door("7a_c-07_south-west", "7a_c-07", DoorDirection.down, False, True), + "7a_c-07_south-east": Door("7a_c-07_south-east", "7a_c-07", DoorDirection.down, False, True), + "7a_c-07_east": Door("7a_c-07_east", "7a_c-07", DoorDirection.right, False, False), + + "7a_c-07b_east": Door("7a_c-07b_east", "7a_c-07b", DoorDirection.right, False, False), + + "7a_c-08_west": Door("7a_c-08_west", "7a_c-08", DoorDirection.left, False, False), + "7a_c-08_east": Door("7a_c-08_east", "7a_c-08", DoorDirection.right, False, False), + + "7a_c-09_bottom": Door("7a_c-09_bottom", "7a_c-09", DoorDirection.left, False, False), + "7a_c-09_top": Door("7a_c-09_top", "7a_c-09", DoorDirection.up, False, False), + + "7a_d-00_bottom": Door("7a_d-00_bottom", "7a_d-00", DoorDirection.down, False, True), + "7a_d-00_top": Door("7a_d-00_top", "7a_d-00", DoorDirection.up, False, False), + + "7a_d-01_west": Door("7a_d-01_west", "7a_d-01", DoorDirection.down, False, True), + "7a_d-01_east": Door("7a_d-01_east", "7a_d-01", DoorDirection.right, False, False), + + "7a_d-01b_west": Door("7a_d-01b_west", "7a_d-01b", DoorDirection.left, False, False), + "7a_d-01b_south-west": Door("7a_d-01b_south-west", "7a_d-01b", DoorDirection.down, False, False), + "7a_d-01b_east": Door("7a_d-01b_east", "7a_d-01b", DoorDirection.right, False, False), + "7a_d-01b_south-east": Door("7a_d-01b_south-east", "7a_d-01b", DoorDirection.down, False, False), + + "7a_d-01c_west": Door("7a_d-01c_west", "7a_d-01c", DoorDirection.up, False, False), + "7a_d-01c_south": Door("7a_d-01c_south", "7a_d-01c", DoorDirection.down, False, False), + "7a_d-01c_east": Door("7a_d-01c_east", "7a_d-01c", DoorDirection.up, False, False), + "7a_d-01c_south-east": Door("7a_d-01c_south-east", "7a_d-01c", DoorDirection.down, False, False), + + "7a_d-01d_west": Door("7a_d-01d_west", "7a_d-01d", DoorDirection.up, False, False), + "7a_d-01d_east": Door("7a_d-01d_east", "7a_d-01d", DoorDirection.up, False, False), + + "7a_d-02_west": Door("7a_d-02_west", "7a_d-02", DoorDirection.left, False, False), + "7a_d-02_east": Door("7a_d-02_east", "7a_d-02", DoorDirection.right, False, False), + + "7a_d-03_west": Door("7a_d-03_west", "7a_d-03", DoorDirection.left, False, False), + "7a_d-03_north-west": Door("7a_d-03_north-west", "7a_d-03", DoorDirection.up, False, True), + "7a_d-03_east": Door("7a_d-03_east", "7a_d-03", DoorDirection.right, False, False), + "7a_d-03_north-east": Door("7a_d-03_north-east", "7a_d-03", DoorDirection.up, False, False), + + "7a_d-03b_west": Door("7a_d-03b_west", "7a_d-03b", DoorDirection.down, False, False), + "7a_d-03b_east": Door("7a_d-03b_east", "7a_d-03b", DoorDirection.down, False, True), + + "7a_d-04_west": Door("7a_d-04_west", "7a_d-04", DoorDirection.left, False, False), + "7a_d-04_east": Door("7a_d-04_east", "7a_d-04", DoorDirection.right, False, False), + + "7a_d-05_west": Door("7a_d-05_west", "7a_d-05", DoorDirection.left, False, False), + "7a_d-05_north-east": Door("7a_d-05_north-east", "7a_d-05", DoorDirection.up, False, False), + "7a_d-05_east": Door("7a_d-05_east", "7a_d-05", DoorDirection.right, False, False), + + "7a_d-05b_west": Door("7a_d-05b_west", "7a_d-05b", DoorDirection.left, False, False), + + "7a_d-06_west": Door("7a_d-06_west", "7a_d-06", DoorDirection.left, False, False), + "7a_d-06_south-west": Door("7a_d-06_south-west", "7a_d-06", DoorDirection.down, False, False), + "7a_d-06_south-east": Door("7a_d-06_south-east", "7a_d-06", DoorDirection.down, True, False), + "7a_d-06_east": Door("7a_d-06_east", "7a_d-06", DoorDirection.right, False, False), + + "7a_d-07_east": Door("7a_d-07_east", "7a_d-07", DoorDirection.right, False, False), + + "7a_d-08_west": Door("7a_d-08_west", "7a_d-08", DoorDirection.up, False, False), + "7a_d-08_east": Door("7a_d-08_east", "7a_d-08", DoorDirection.right, False, False), + + "7a_d-09_west": Door("7a_d-09_west", "7a_d-09", DoorDirection.left, False, False), + "7a_d-09_east": Door("7a_d-09_east", "7a_d-09", DoorDirection.down, False, False), + + "7a_d-10_west": Door("7a_d-10_west", "7a_d-10", DoorDirection.left, False, True), + "7a_d-10_north-west": Door("7a_d-10_north-west", "7a_d-10", DoorDirection.up, False, True), + "7a_d-10_north": Door("7a_d-10_north", "7a_d-10", DoorDirection.up, False, True), + "7a_d-10_north-east": Door("7a_d-10_north-east", "7a_d-10", DoorDirection.up, False, False), + "7a_d-10_east": Door("7a_d-10_east", "7a_d-10", DoorDirection.right, False, False), + + "7a_d-10b_west": Door("7a_d-10b_west", "7a_d-10b", DoorDirection.down, False, False), + "7a_d-10b_east": Door("7a_d-10b_east", "7a_d-10b", DoorDirection.down, False, True), + + "7a_d-11_bottom": Door("7a_d-11_bottom", "7a_d-11", DoorDirection.left, False, False), + "7a_d-11_top": Door("7a_d-11_top", "7a_d-11", DoorDirection.up, False, False), + + "7a_e-00b_bottom": Door("7a_e-00b_bottom", "7a_e-00b", DoorDirection.down, False, True), + "7a_e-00b_top": Door("7a_e-00b_top", "7a_e-00b", DoorDirection.up, False, False), + + "7a_e-00_west": Door("7a_e-00_west", "7a_e-00", DoorDirection.left, False, False), + "7a_e-00_south-west": Door("7a_e-00_south-west", "7a_e-00", DoorDirection.down, False, True), + "7a_e-00_north-west": Door("7a_e-00_north-west", "7a_e-00", DoorDirection.up, False, False), + "7a_e-00_east": Door("7a_e-00_east", "7a_e-00", DoorDirection.right, False, False), + + "7a_e-01_west": Door("7a_e-01_west", "7a_e-01", DoorDirection.left, False, False), + "7a_e-01_north": Door("7a_e-01_north", "7a_e-01", DoorDirection.up, False, True), + "7a_e-01_east": Door("7a_e-01_east", "7a_e-01", DoorDirection.right, False, True), + + "7a_e-01b_west": Door("7a_e-01b_west", "7a_e-01b", DoorDirection.up, False, False), + "7a_e-01b_east": Door("7a_e-01b_east", "7a_e-01b", DoorDirection.right, False, False), + + "7a_e-01c_west": Door("7a_e-01c_west", "7a_e-01c", DoorDirection.down, False, True), + "7a_e-01c_east": Door("7a_e-01c_east", "7a_e-01c", DoorDirection.down, False, False), + + "7a_e-02_west": Door("7a_e-02_west", "7a_e-02", DoorDirection.down, False, True), + "7a_e-02_east": Door("7a_e-02_east", "7a_e-02", DoorDirection.right, False, False), + + "7a_e-03_south-west": Door("7a_e-03_south-west", "7a_e-03", DoorDirection.left, False, False), + "7a_e-03_west": Door("7a_e-03_west", "7a_e-03", DoorDirection.left, False, False), + "7a_e-03_east": Door("7a_e-03_east", "7a_e-03", DoorDirection.right, False, False), + + "7a_e-04_west": Door("7a_e-04_west", "7a_e-04", DoorDirection.left, False, False), + "7a_e-04_east": Door("7a_e-04_east", "7a_e-04", DoorDirection.right, False, False), + + "7a_e-05_west": Door("7a_e-05_west", "7a_e-05", DoorDirection.left, False, False), + "7a_e-05_east": Door("7a_e-05_east", "7a_e-05", DoorDirection.right, False, False), + + "7a_e-06_west": Door("7a_e-06_west", "7a_e-06", DoorDirection.left, False, False), + "7a_e-06_east": Door("7a_e-06_east", "7a_e-06", DoorDirection.right, False, False), + + "7a_e-07_bottom": Door("7a_e-07_bottom", "7a_e-07", DoorDirection.left, False, False), + "7a_e-07_top": Door("7a_e-07_top", "7a_e-07", DoorDirection.up, False, False), + + "7a_e-08_south": Door("7a_e-08_south", "7a_e-08", DoorDirection.down, False, True), + "7a_e-08_west": Door("7a_e-08_west", "7a_e-08", DoorDirection.left, False, False), + "7a_e-08_east": Door("7a_e-08_east", "7a_e-08", DoorDirection.right, False, False), + + "7a_e-09_north": Door("7a_e-09_north", "7a_e-09", DoorDirection.up, True, False), + "7a_e-09_east": Door("7a_e-09_east", "7a_e-09", DoorDirection.right, False, False), + + "7a_e-11_south": Door("7a_e-11_south", "7a_e-11", DoorDirection.down, False, False), + "7a_e-11_north": Door("7a_e-11_north", "7a_e-11", DoorDirection.up, False, False), + "7a_e-11_east": Door("7a_e-11_east", "7a_e-11", DoorDirection.down, False, False), + + "7a_e-12_west": Door("7a_e-12_west", "7a_e-12", DoorDirection.down, False, False), + + "7a_e-10_south": Door("7a_e-10_south", "7a_e-10", DoorDirection.left, False, False), + "7a_e-10_north": Door("7a_e-10_north", "7a_e-10", DoorDirection.up, False, True), + "7a_e-10_east": Door("7a_e-10_east", "7a_e-10", DoorDirection.right, False, False), + + "7a_e-10b_west": Door("7a_e-10b_west", "7a_e-10b", DoorDirection.left, False, False), + "7a_e-10b_east": Door("7a_e-10b_east", "7a_e-10b", DoorDirection.right, False, False), + + "7a_e-13_bottom": Door("7a_e-13_bottom", "7a_e-13", DoorDirection.left, False, False), + "7a_e-13_top": Door("7a_e-13_top", "7a_e-13", DoorDirection.up, False, False), + + "7a_f-00_south": Door("7a_f-00_south", "7a_f-00", DoorDirection.down, False, True), + "7a_f-00_west": Door("7a_f-00_west", "7a_f-00", DoorDirection.left, True, False), + "7a_f-00_north-west": Door("7a_f-00_north-west", "7a_f-00", DoorDirection.left, False, True), + "7a_f-00_east": Door("7a_f-00_east", "7a_f-00", DoorDirection.right, False, False), + "7a_f-00_north-east": Door("7a_f-00_north-east", "7a_f-00", DoorDirection.right, False, False), + + "7a_f-01_south": Door("7a_f-01_south", "7a_f-01", DoorDirection.right, False, False), + "7a_f-01_north": Door("7a_f-01_north", "7a_f-01", DoorDirection.right, True, False), + + "7a_f-02_west": Door("7a_f-02_west", "7a_f-02", DoorDirection.left, True, False), + "7a_f-02_north-west": Door("7a_f-02_north-west", "7a_f-02", DoorDirection.left, False, True), + "7a_f-02_east": Door("7a_f-02_east", "7a_f-02", DoorDirection.right, False, False), + "7a_f-02_north-east": Door("7a_f-02_north-east", "7a_f-02", DoorDirection.up, False, False), + + "7a_f-02b_west": Door("7a_f-02b_west", "7a_f-02b", DoorDirection.down, False, False), + "7a_f-02b_east": Door("7a_f-02b_east", "7a_f-02b", DoorDirection.right, False, False), + + "7a_f-04_west": Door("7a_f-04_west", "7a_f-04", DoorDirection.left, False, False), + "7a_f-04_east": Door("7a_f-04_east", "7a_f-04", DoorDirection.right, False, False), + + "7a_f-03_west": Door("7a_f-03_west", "7a_f-03", DoorDirection.left, False, False), + "7a_f-03_east": Door("7a_f-03_east", "7a_f-03", DoorDirection.right, False, False), + + "7a_f-05_west": Door("7a_f-05_west", "7a_f-05", DoorDirection.left, False, False), + "7a_f-05_south-west": Door("7a_f-05_south-west", "7a_f-05", DoorDirection.down, False, True), + "7a_f-05_north-west": Door("7a_f-05_north-west", "7a_f-05", DoorDirection.up, False, False), + "7a_f-05_south": Door("7a_f-05_south", "7a_f-05", DoorDirection.down, False, False), + "7a_f-05_north": Door("7a_f-05_north", "7a_f-05", DoorDirection.up, False, False), + "7a_f-05_south-east": Door("7a_f-05_south-east", "7a_f-05", DoorDirection.down, False, True), + "7a_f-05_east": Door("7a_f-05_east", "7a_f-05", DoorDirection.right, False, False), + "7a_f-05_north-east": Door("7a_f-05_north-east", "7a_f-05", DoorDirection.up, False, False), + + "7a_f-06_north-west": Door("7a_f-06_north-west", "7a_f-06", DoorDirection.up, False, False), + "7a_f-06_north": Door("7a_f-06_north", "7a_f-06", DoorDirection.up, False, False), + "7a_f-06_north-east": Door("7a_f-06_north-east", "7a_f-06", DoorDirection.up, False, False), + + "7a_f-07_west": Door("7a_f-07_west", "7a_f-07", DoorDirection.left, False, True), + "7a_f-07_south-west": Door("7a_f-07_south-west", "7a_f-07", DoorDirection.down, False, True), + "7a_f-07_south": Door("7a_f-07_south", "7a_f-07", DoorDirection.down, False, False), + "7a_f-07_south-east": Door("7a_f-07_south-east", "7a_f-07", DoorDirection.down, False, True), + + "7a_f-08_west": Door("7a_f-08_west", "7a_f-08", DoorDirection.left, False, False), + "7a_f-08_north-west": Door("7a_f-08_north-west", "7a_f-08", DoorDirection.up, True, False), + "7a_f-08_east": Door("7a_f-08_east", "7a_f-08", DoorDirection.right, False, False), + + "7a_f-08b_west": Door("7a_f-08b_west", "7a_f-08b", DoorDirection.down, False, False), + "7a_f-08b_east": Door("7a_f-08b_east", "7a_f-08b", DoorDirection.right, False, False), + + "7a_f-08d_west": Door("7a_f-08d_west", "7a_f-08d", DoorDirection.left, False, False), + "7a_f-08d_east": Door("7a_f-08d_east", "7a_f-08d", DoorDirection.right, False, False), + + "7a_f-08c_west": Door("7a_f-08c_west", "7a_f-08c", DoorDirection.left, False, False), + "7a_f-08c_east": Door("7a_f-08c_east", "7a_f-08c", DoorDirection.down, False, False), + + "7a_f-09_west": Door("7a_f-09_west", "7a_f-09", DoorDirection.left, False, False), + "7a_f-09_east": Door("7a_f-09_east", "7a_f-09", DoorDirection.right, False, False), + + "7a_f-10_west": Door("7a_f-10_west", "7a_f-10", DoorDirection.left, False, False), + "7a_f-10_north-east": Door("7a_f-10_north-east", "7a_f-10", DoorDirection.up, False, True), + "7a_f-10_east": Door("7a_f-10_east", "7a_f-10", DoorDirection.right, False, False), + + "7a_f-10b_west": Door("7a_f-10b_west", "7a_f-10b", DoorDirection.left, False, False), + "7a_f-10b_east": Door("7a_f-10b_east", "7a_f-10b", DoorDirection.right, False, False), + + "7a_f-11_bottom": Door("7a_f-11_bottom", "7a_f-11", DoorDirection.left, False, False), + "7a_f-11_top": Door("7a_f-11_top", "7a_f-11", DoorDirection.up, False, False), + + "7a_g-00_bottom": Door("7a_g-00_bottom", "7a_g-00", DoorDirection.down, False, True), + "7a_g-00_top": Door("7a_g-00_top", "7a_g-00", DoorDirection.up, False, False), + + "7a_g-00b_bottom": Door("7a_g-00b_bottom", "7a_g-00b", DoorDirection.down, False, True), + "7a_g-00b_top": Door("7a_g-00b_top", "7a_g-00b", DoorDirection.up, False, False), + + "7a_g-01_bottom": Door("7a_g-01_bottom", "7a_g-01", DoorDirection.down, False, True), + "7a_g-01_top": Door("7a_g-01_top", "7a_g-01", DoorDirection.up, False, False), + + "7a_g-02_bottom": Door("7a_g-02_bottom", "7a_g-02", DoorDirection.down, False, True), + "7a_g-02_top": Door("7a_g-02_top", "7a_g-02", DoorDirection.up, False, False), + + "7a_g-03_bottom": Door("7a_g-03_bottom", "7a_g-03", DoorDirection.down, False, True), + + "7b_a-00_east": Door("7b_a-00_east", "7b_a-00", DoorDirection.right, False, False), + + "7b_a-01_west": Door("7b_a-01_west", "7b_a-01", DoorDirection.left, False, False), + "7b_a-01_east": Door("7b_a-01_east", "7b_a-01", DoorDirection.right, False, False), + + "7b_a-02_west": Door("7b_a-02_west", "7b_a-02", DoorDirection.left, False, False), + "7b_a-02_east": Door("7b_a-02_east", "7b_a-02", DoorDirection.right, False, False), + + "7b_a-03_bottom": Door("7b_a-03_bottom", "7b_a-03", DoorDirection.left, False, True), + "7b_a-03_top": Door("7b_a-03_top", "7b_a-03", DoorDirection.up, False, False), + + "7b_b-00_bottom": Door("7b_b-00_bottom", "7b_b-00", DoorDirection.down, False, True), + "7b_b-00_top": Door("7b_b-00_top", "7b_b-00", DoorDirection.up, False, False), + + "7b_b-01_bottom": Door("7b_b-01_bottom", "7b_b-01", DoorDirection.down, False, True), + "7b_b-01_top": Door("7b_b-01_top", "7b_b-01", DoorDirection.up, False, False), + + "7b_b-02_west": Door("7b_b-02_west", "7b_b-02", DoorDirection.down, False, True), + "7b_b-02_east": Door("7b_b-02_east", "7b_b-02", DoorDirection.right, False, False), + + "7b_b-03_bottom": Door("7b_b-03_bottom", "7b_b-03", DoorDirection.left, False, False), + "7b_b-03_top": Door("7b_b-03_top", "7b_b-03", DoorDirection.up, False, False), + + "7b_c-01_west": Door("7b_c-01_west", "7b_c-01", DoorDirection.down, False, True), + "7b_c-01_east": Door("7b_c-01_east", "7b_c-01", DoorDirection.up, False, False), + + "7b_c-00_west": Door("7b_c-00_west", "7b_c-00", DoorDirection.down, False, True), + "7b_c-00_east": Door("7b_c-00_east", "7b_c-00", DoorDirection.up, False, False), + + "7b_c-02_west": Door("7b_c-02_west", "7b_c-02", DoorDirection.down, False, True), + "7b_c-02_east": Door("7b_c-02_east", "7b_c-02", DoorDirection.right, False, False), + + "7b_c-03_bottom": Door("7b_c-03_bottom", "7b_c-03", DoorDirection.left, False, True), + "7b_c-03_top": Door("7b_c-03_top", "7b_c-03", DoorDirection.up, False, False), + + "7b_d-00_west": Door("7b_d-00_west", "7b_d-00", DoorDirection.down, False, True), + "7b_d-00_east": Door("7b_d-00_east", "7b_d-00", DoorDirection.right, False, False), + + "7b_d-01_west": Door("7b_d-01_west", "7b_d-01", DoorDirection.left, False, False), + "7b_d-01_east": Door("7b_d-01_east", "7b_d-01", DoorDirection.right, False, False), + + "7b_d-02_west": Door("7b_d-02_west", "7b_d-02", DoorDirection.left, False, False), + "7b_d-02_east": Door("7b_d-02_east", "7b_d-02", DoorDirection.right, False, False), + + "7b_d-03_bottom": Door("7b_d-03_bottom", "7b_d-03", DoorDirection.left, False, False), + "7b_d-03_top": Door("7b_d-03_top", "7b_d-03", DoorDirection.up, False, False), + + "7b_e-00_west": Door("7b_e-00_west", "7b_e-00", DoorDirection.down, False, True), + "7b_e-00_east": Door("7b_e-00_east", "7b_e-00", DoorDirection.up, False, False), + + "7b_e-01_west": Door("7b_e-01_west", "7b_e-01", DoorDirection.down, False, True), + "7b_e-01_east": Door("7b_e-01_east", "7b_e-01", DoorDirection.up, False, False), + + "7b_e-02_west": Door("7b_e-02_west", "7b_e-02", DoorDirection.down, False, True), + "7b_e-02_east": Door("7b_e-02_east", "7b_e-02", DoorDirection.right, False, False), + + "7b_e-03_bottom": Door("7b_e-03_bottom", "7b_e-03", DoorDirection.left, False, False), + "7b_e-03_top": Door("7b_e-03_top", "7b_e-03", DoorDirection.up, False, False), + + "7b_f-00_west": Door("7b_f-00_west", "7b_f-00", DoorDirection.down, False, True), + "7b_f-00_east": Door("7b_f-00_east", "7b_f-00", DoorDirection.right, False, False), + + "7b_f-01_west": Door("7b_f-01_west", "7b_f-01", DoorDirection.left, False, False), + "7b_f-01_east": Door("7b_f-01_east", "7b_f-01", DoorDirection.right, False, False), + + "7b_f-02_west": Door("7b_f-02_west", "7b_f-02", DoorDirection.left, False, False), + "7b_f-02_east": Door("7b_f-02_east", "7b_f-02", DoorDirection.right, False, False), + + "7b_f-03_bottom": Door("7b_f-03_bottom", "7b_f-03", DoorDirection.left, False, False), + "7b_f-03_top": Door("7b_f-03_top", "7b_f-03", DoorDirection.up, False, False), + + "7b_g-00_bottom": Door("7b_g-00_bottom", "7b_g-00", DoorDirection.down, False, True), + "7b_g-00_top": Door("7b_g-00_top", "7b_g-00", DoorDirection.up, False, False), + + "7b_g-01_bottom": Door("7b_g-01_bottom", "7b_g-01", DoorDirection.down, False, True), + "7b_g-01_top": Door("7b_g-01_top", "7b_g-01", DoorDirection.up, False, False), + + "7b_g-02_bottom": Door("7b_g-02_bottom", "7b_g-02", DoorDirection.down, False, True), + "7b_g-02_top": Door("7b_g-02_top", "7b_g-02", DoorDirection.up, False, False), + + "7b_g-03_bottom": Door("7b_g-03_bottom", "7b_g-03", DoorDirection.down, False, True), + + "7c_01_east": Door("7c_01_east", "7c_01", DoorDirection.up, False, False), + + "7c_02_west": Door("7c_02_west", "7c_02", DoorDirection.down, False, True), + "7c_02_east": Door("7c_02_east", "7c_02", DoorDirection.up, False, False), + + "7c_03_west": Door("7c_03_west", "7c_03", DoorDirection.down, False, True), + + "8a_outside_east": Door("8a_outside_east", "8a_outside", DoorDirection.right, False, False), + + "8a_bridge_west": Door("8a_bridge_west", "8a_bridge", DoorDirection.left, False, False), + "8a_bridge_east": Door("8a_bridge_east", "8a_bridge", DoorDirection.right, False, False), + + "8a_secret_west": Door("8a_secret_west", "8a_secret", DoorDirection.left, False, False), + + "9a_00_east": Door("9a_00_east", "9a_00", DoorDirection.right, False, False), + "9a_00_west": Door("9a_00_west", "9a_00", DoorDirection.left, False, False), + + "9a_0x_east": Door("9a_0x_east", "9a_0x", DoorDirection.right, False, False), + + "9a_01_west": Door("9a_01_west", "9a_01", DoorDirection.left, False, False), + "9a_01_east": Door("9a_01_east", "9a_01", DoorDirection.right, False, False), + + "9a_02_west": Door("9a_02_west", "9a_02", DoorDirection.left, False, False), + "9a_02_east": Door("9a_02_east", "9a_02", DoorDirection.right, False, False), + + "9a_a-00_west": Door("9a_a-00_west", "9a_a-00", DoorDirection.left, False, True), + "9a_a-00_east": Door("9a_a-00_east", "9a_a-00", DoorDirection.right, False, False), + + "9a_a-01_west": Door("9a_a-01_west", "9a_a-01", DoorDirection.left, False, False), + "9a_a-01_east": Door("9a_a-01_east", "9a_a-01", DoorDirection.right, False, False), + + "9a_a-02_west": Door("9a_a-02_west", "9a_a-02", DoorDirection.left, False, False), + "9a_a-02_east": Door("9a_a-02_east", "9a_a-02", DoorDirection.up, False, False), + + "9a_a-03_bottom": Door("9a_a-03_bottom", "9a_a-03", DoorDirection.down, False, True), + "9a_a-03_top": Door("9a_a-03_top", "9a_a-03", DoorDirection.up, False, False), + + "9a_b-00_west": Door("9a_b-00_west", "9a_b-00", DoorDirection.left, False, False), + "9a_b-00_south": Door("9a_b-00_south", "9a_b-00", DoorDirection.down, False, True), + "9a_b-00_north": Door("9a_b-00_north", "9a_b-00", DoorDirection.up, False, False), + "9a_b-00_east": Door("9a_b-00_east", "9a_b-00", DoorDirection.right, False, False), + + "9a_b-01_west": Door("9a_b-01_west", "9a_b-01", DoorDirection.left, False, False), + "9a_b-01_east": Door("9a_b-01_east", "9a_b-01", DoorDirection.right, False, False), + + "9a_b-02_west": Door("9a_b-02_west", "9a_b-02", DoorDirection.left, False, False), + "9a_b-02_east": Door("9a_b-02_east", "9a_b-02", DoorDirection.right, False, False), + + "9a_b-03_west": Door("9a_b-03_west", "9a_b-03", DoorDirection.left, False, False), + "9a_b-03_east": Door("9a_b-03_east", "9a_b-03", DoorDirection.right, False, False), + + "9a_b-04_north-west": Door("9a_b-04_north-west", "9a_b-04", DoorDirection.up, False, False), + "9a_b-04_west": Door("9a_b-04_west", "9a_b-04", DoorDirection.left, False, False), + "9a_b-04_east": Door("9a_b-04_east", "9a_b-04", DoorDirection.up, False, False), + + "9a_b-05_west": Door("9a_b-05_west", "9a_b-05", DoorDirection.down, False, False), + "9a_b-05_east": Door("9a_b-05_east", "9a_b-05", DoorDirection.down, False, True), + + "9a_b-06_east": Door("9a_b-06_east", "9a_b-06", DoorDirection.right, False, False), + + "9a_b-07b_bottom": Door("9a_b-07b_bottom", "9a_b-07b", DoorDirection.down, False, True), + "9a_b-07b_top": Door("9a_b-07b_top", "9a_b-07b", DoorDirection.up, False, False), + + "9a_b-07_bottom": Door("9a_b-07_bottom", "9a_b-07", DoorDirection.down, False, True), + "9a_b-07_top": Door("9a_b-07_top", "9a_b-07", DoorDirection.up, False, False), + + "9a_c-00_west": Door("9a_c-00_west", "9a_c-00", DoorDirection.down, False, True), + "9a_c-00_north-east": Door("9a_c-00_north-east", "9a_c-00", DoorDirection.up, False, False), + "9a_c-00_east": Door("9a_c-00_east", "9a_c-00", DoorDirection.right, False, False), + + "9a_c-00b_west": Door("9a_c-00b_west", "9a_c-00b", DoorDirection.down, False, False), + + "9a_c-01_west": Door("9a_c-01_west", "9a_c-01", DoorDirection.left, False, False), + "9a_c-01_east": Door("9a_c-01_east", "9a_c-01", DoorDirection.right, False, False), + + "9a_c-02_west": Door("9a_c-02_west", "9a_c-02", DoorDirection.left, False, False), + "9a_c-02_east": Door("9a_c-02_east", "9a_c-02", DoorDirection.right, False, False), + + "9a_c-03_west": Door("9a_c-03_west", "9a_c-03", DoorDirection.left, False, False), + "9a_c-03_north-west": Door("9a_c-03_north-west", "9a_c-03", DoorDirection.up, False, True), + "9a_c-03_north": Door("9a_c-03_north", "9a_c-03", DoorDirection.up, False, False), + "9a_c-03_north-east": Door("9a_c-03_north-east", "9a_c-03", DoorDirection.up, False, True), + "9a_c-03_east": Door("9a_c-03_east", "9a_c-03", DoorDirection.right, False, False), + + "9a_c-03b_west": Door("9a_c-03b_west", "9a_c-03b", DoorDirection.down, False, False), + "9a_c-03b_south": Door("9a_c-03b_south", "9a_c-03b", DoorDirection.down, False, False), + "9a_c-03b_east": Door("9a_c-03b_east", "9a_c-03b", DoorDirection.down, False, False), + + "9a_c-04_west": Door("9a_c-04_west", "9a_c-04", DoorDirection.left, False, False), + "9a_c-04_east": Door("9a_c-04_east", "9a_c-04", DoorDirection.right, False, False), + + "9a_d-00_bottom": Door("9a_d-00_bottom", "9a_d-00", DoorDirection.left, False, True), + "9a_d-00_top": Door("9a_d-00_top", "9a_d-00", DoorDirection.up, False, False), + + "9a_d-01_bottom": Door("9a_d-01_bottom", "9a_d-01", DoorDirection.down, False, True), + "9a_d-01_top": Door("9a_d-01_top", "9a_d-01", DoorDirection.up, False, False), + + "9a_d-02_bottom": Door("9a_d-02_bottom", "9a_d-02", DoorDirection.down, False, True), + "9a_d-02_top": Door("9a_d-02_top", "9a_d-02", DoorDirection.up, False, False), + + "9a_d-03_bottom": Door("9a_d-03_bottom", "9a_d-03", DoorDirection.down, False, True), + "9a_d-03_top": Door("9a_d-03_top", "9a_d-03", DoorDirection.up, False, False), + + "9a_d-04_bottom": Door("9a_d-04_bottom", "9a_d-04", DoorDirection.down, False, True), + "9a_d-04_top": Door("9a_d-04_top", "9a_d-04", DoorDirection.up, False, False), + + "9a_d-05_bottom": Door("9a_d-05_bottom", "9a_d-05", DoorDirection.down, False, True), + "9a_d-05_top": Door("9a_d-05_top", "9a_d-05", DoorDirection.up, False, False), + + "9a_d-06_bottom": Door("9a_d-06_bottom", "9a_d-06", DoorDirection.down, False, True), + "9a_d-06_top": Door("9a_d-06_top", "9a_d-06", DoorDirection.up, False, False), + + "9a_d-07_bottom": Door("9a_d-07_bottom", "9a_d-07", DoorDirection.down, False, True), + "9a_d-07_top": Door("9a_d-07_top", "9a_d-07", DoorDirection.up, False, False), + + "9a_d-08_west": Door("9a_d-08_west", "9a_d-08", DoorDirection.down, False, True), + "9a_d-08_east": Door("9a_d-08_east", "9a_d-08", DoorDirection.right, False, False), + + "9a_d-09_west": Door("9a_d-09_west", "9a_d-09", DoorDirection.left, False, True), + "9a_d-09_east": Door("9a_d-09_east", "9a_d-09", DoorDirection.right, False, False), + + "9a_d-10_west": Door("9a_d-10_west", "9a_d-10", DoorDirection.left, False, True), + "9a_d-10_east": Door("9a_d-10_east", "9a_d-10", DoorDirection.right, False, False), + + "9a_d-10b_west": Door("9a_d-10b_west", "9a_d-10b", DoorDirection.left, False, True), + "9a_d-10b_east": Door("9a_d-10b_east", "9a_d-10b", DoorDirection.right, False, False), + + "9a_d-10c_west": Door("9a_d-10c_west", "9a_d-10c", DoorDirection.left, False, True), + "9a_d-10c_east": Door("9a_d-10c_east", "9a_d-10c", DoorDirection.right, False, False), + + "9a_d-11_west": Door("9a_d-11_west", "9a_d-11", DoorDirection.left, False, True), + "9a_d-11_east": Door("9a_d-11_east", "9a_d-11", DoorDirection.right, False, False), + + "9a_space_west": Door("9a_space_west", "9a_space", DoorDirection.left, False, True), + + "9b_00_east": Door("9b_00_east", "9b_00", DoorDirection.right, False, False), + + "9b_01_west": Door("9b_01_west", "9b_01", DoorDirection.left, False, False), + "9b_01_east": Door("9b_01_east", "9b_01", DoorDirection.right, False, False), + + "9b_a-00_west": Door("9b_a-00_west", "9b_a-00", DoorDirection.left, False, True), + "9b_a-00_east": Door("9b_a-00_east", "9b_a-00", DoorDirection.right, False, False), + + "9b_a-01_west": Door("9b_a-01_west", "9b_a-01", DoorDirection.left, False, False), + "9b_a-01_east": Door("9b_a-01_east", "9b_a-01", DoorDirection.right, False, False), + + "9b_a-02_west": Door("9b_a-02_west", "9b_a-02", DoorDirection.left, False, False), + "9b_a-02_east": Door("9b_a-02_east", "9b_a-02", DoorDirection.up, False, False), + + "9b_a-03_west": Door("9b_a-03_west", "9b_a-03", DoorDirection.down, False, True), + "9b_a-03_east": Door("9b_a-03_east", "9b_a-03", DoorDirection.right, False, False), + + "9b_a-04_west": Door("9b_a-04_west", "9b_a-04", DoorDirection.left, False, False), + "9b_a-04_east": Door("9b_a-04_east", "9b_a-04", DoorDirection.right, False, False), + + "9b_a-05_west": Door("9b_a-05_west", "9b_a-05", DoorDirection.left, False, False), + "9b_a-05_east": Door("9b_a-05_east", "9b_a-05", DoorDirection.up, False, False), + + "9b_b-00_west": Door("9b_b-00_west", "9b_b-00", DoorDirection.down, False, True), + "9b_b-00_east": Door("9b_b-00_east", "9b_b-00", DoorDirection.right, False, False), + + "9b_b-01_west": Door("9b_b-01_west", "9b_b-01", DoorDirection.left, False, False), + "9b_b-01_east": Door("9b_b-01_east", "9b_b-01", DoorDirection.right, False, False), + + "9b_b-02_west": Door("9b_b-02_west", "9b_b-02", DoorDirection.left, False, False), + "9b_b-02_east": Door("9b_b-02_east", "9b_b-02", DoorDirection.right, False, False), + + "9b_b-03_west": Door("9b_b-03_west", "9b_b-03", DoorDirection.left, False, False), + "9b_b-03_east": Door("9b_b-03_east", "9b_b-03", DoorDirection.right, False, False), + + "9b_b-04_west": Door("9b_b-04_west", "9b_b-04", DoorDirection.left, False, False), + "9b_b-04_east": Door("9b_b-04_east", "9b_b-04", DoorDirection.right, False, False), + + "9b_b-05_west": Door("9b_b-05_west", "9b_b-05", DoorDirection.left, False, False), + "9b_b-05_east": Door("9b_b-05_east", "9b_b-05", DoorDirection.right, False, False), + + "9b_c-01_bottom": Door("9b_c-01_bottom", "9b_c-01", DoorDirection.left, False, True), + "9b_c-01_top": Door("9b_c-01_top", "9b_c-01", DoorDirection.up, False, False), + + "9b_c-02_bottom": Door("9b_c-02_bottom", "9b_c-02", DoorDirection.down, False, True), + "9b_c-02_top": Door("9b_c-02_top", "9b_c-02", DoorDirection.up, False, False), + + "9b_c-03_bottom": Door("9b_c-03_bottom", "9b_c-03", DoorDirection.down, False, True), + "9b_c-03_top": Door("9b_c-03_top", "9b_c-03", DoorDirection.up, False, False), + + "9b_c-04_bottom": Door("9b_c-04_bottom", "9b_c-04", DoorDirection.down, False, True), + "9b_c-04_top": Door("9b_c-04_top", "9b_c-04", DoorDirection.up, False, False), + + "9b_c-05_west": Door("9b_c-05_west", "9b_c-05", DoorDirection.down, False, True), + "9b_c-05_east": Door("9b_c-05_east", "9b_c-05", DoorDirection.right, False, False), + + "9b_c-06_west": Door("9b_c-06_west", "9b_c-06", DoorDirection.left, False, False), + "9b_c-06_east": Door("9b_c-06_east", "9b_c-06", DoorDirection.right, False, False), + + "9b_c-08_west": Door("9b_c-08_west", "9b_c-08", DoorDirection.left, False, False), + "9b_c-08_east": Door("9b_c-08_east", "9b_c-08", DoorDirection.right, False, False), + + "9b_c-07_west": Door("9b_c-07_west", "9b_c-07", DoorDirection.left, False, False), + "9b_c-07_east": Door("9b_c-07_east", "9b_c-07", DoorDirection.right, False, False), + + "9b_space_west": Door("9b_space_west", "9b_space", DoorDirection.left, False, True), + + "9c_intro_east": Door("9c_intro_east", "9c_intro", DoorDirection.right, False, False), + + "9c_00_west": Door("9c_00_west", "9c_00", DoorDirection.left, False, False), + "9c_00_east": Door("9c_00_east", "9c_00", DoorDirection.right, False, False), + + "9c_01_west": Door("9c_01_west", "9c_01", DoorDirection.left, False, True), + "9c_01_east": Door("9c_01_east", "9c_01", DoorDirection.right, False, False), + + "9c_02_west": Door("9c_02_west", "9c_02", DoorDirection.left, False, True), + + "10a_intro-00-past_east": Door("10a_intro-00-past_east", "10a_intro-00-past", DoorDirection.special, False, False), + + "10a_intro-01-future_west": Door("10a_intro-01-future_west", "10a_intro-01-future", DoorDirection.special, False, True), + "10a_intro-01-future_east": Door("10a_intro-01-future_east", "10a_intro-01-future", DoorDirection.up, False, False), + + "10a_intro-02-launch_bottom": Door("10a_intro-02-launch_bottom", "10a_intro-02-launch", DoorDirection.down, False, True), + "10a_intro-02-launch_top": Door("10a_intro-02-launch_top", "10a_intro-02-launch", DoorDirection.up, False, False), + + "10a_intro-03-space_west": Door("10a_intro-03-space_west", "10a_intro-03-space", DoorDirection.down, False, True), + "10a_intro-03-space_east": Door("10a_intro-03-space_east", "10a_intro-03-space", DoorDirection.right, False, False), + + "10a_a-00_west": Door("10a_a-00_west", "10a_a-00", DoorDirection.left, False, False), + "10a_a-00_east": Door("10a_a-00_east", "10a_a-00", DoorDirection.right, False, False), + + "10a_a-01_west": Door("10a_a-01_west", "10a_a-01", DoorDirection.left, False, False), + "10a_a-01_east": Door("10a_a-01_east", "10a_a-01", DoorDirection.right, False, False), + + "10a_a-02_west": Door("10a_a-02_west", "10a_a-02", DoorDirection.left, False, False), + "10a_a-02_east": Door("10a_a-02_east", "10a_a-02", DoorDirection.right, False, False), + + "10a_a-03_west": Door("10a_a-03_west", "10a_a-03", DoorDirection.left, False, False), + "10a_a-03_east": Door("10a_a-03_east", "10a_a-03", DoorDirection.right, False, False), + + "10a_a-04_west": Door("10a_a-04_west", "10a_a-04", DoorDirection.left, False, False), + "10a_a-04_east": Door("10a_a-04_east", "10a_a-04", DoorDirection.right, False, False), + + "10a_a-05_west": Door("10a_a-05_west", "10a_a-05", DoorDirection.left, False, False), + "10a_a-05_east": Door("10a_a-05_east", "10a_a-05", DoorDirection.right, False, False), + + "10a_b-00_west": Door("10a_b-00_west", "10a_b-00", DoorDirection.left, False, False), + "10a_b-00_east": Door("10a_b-00_east", "10a_b-00", DoorDirection.right, False, False), + + "10a_b-01_west": Door("10a_b-01_west", "10a_b-01", DoorDirection.left, False, False), + "10a_b-01_east": Door("10a_b-01_east", "10a_b-01", DoorDirection.right, False, False), + + "10a_b-02_west": Door("10a_b-02_west", "10a_b-02", DoorDirection.left, False, False), + "10a_b-02_east": Door("10a_b-02_east", "10a_b-02", DoorDirection.right, False, False), + + "10a_b-03_west": Door("10a_b-03_west", "10a_b-03", DoorDirection.left, False, False), + "10a_b-03_east": Door("10a_b-03_east", "10a_b-03", DoorDirection.right, False, False), + + "10a_b-04_west": Door("10a_b-04_west", "10a_b-04", DoorDirection.left, False, False), + "10a_b-04_east": Door("10a_b-04_east", "10a_b-04", DoorDirection.right, False, False), + + "10a_b-05_west": Door("10a_b-05_west", "10a_b-05", DoorDirection.left, False, False), + "10a_b-05_east": Door("10a_b-05_east", "10a_b-05", DoorDirection.right, False, False), + + "10a_b-06_west": Door("10a_b-06_west", "10a_b-06", DoorDirection.left, False, False), + "10a_b-06_east": Door("10a_b-06_east", "10a_b-06", DoorDirection.right, False, False), + + "10a_b-07_west": Door("10a_b-07_west", "10a_b-07", DoorDirection.left, False, False), + "10a_b-07_east": Door("10a_b-07_east", "10a_b-07", DoorDirection.right, False, False), + + "10a_c-00_west": Door("10a_c-00_west", "10a_c-00", DoorDirection.left, False, False), + "10a_c-00_east": Door("10a_c-00_east", "10a_c-00", DoorDirection.right, False, False), + "10a_c-00_north-east": Door("10a_c-00_north-east", "10a_c-00", DoorDirection.right, False, False), + + "10a_c-00b_west": Door("10a_c-00b_west", "10a_c-00b", DoorDirection.left, False, False), + "10a_c-00b_east": Door("10a_c-00b_east", "10a_c-00b", DoorDirection.right, False, False), + + "10a_c-01_west": Door("10a_c-01_west", "10a_c-01", DoorDirection.left, False, False), + "10a_c-01_east": Door("10a_c-01_east", "10a_c-01", DoorDirection.right, False, False), + + "10a_c-02_west": Door("10a_c-02_west", "10a_c-02", DoorDirection.left, False, False), + "10a_c-02_east": Door("10a_c-02_east", "10a_c-02", DoorDirection.up, False, False), + + "10a_c-alt-00_west": Door("10a_c-alt-00_west", "10a_c-alt-00", DoorDirection.left, False, False), + "10a_c-alt-00_east": Door("10a_c-alt-00_east", "10a_c-alt-00", DoorDirection.right, False, False), + + "10a_c-alt-01_west": Door("10a_c-alt-01_west", "10a_c-alt-01", DoorDirection.left, False, False), + "10a_c-alt-01_east": Door("10a_c-alt-01_east", "10a_c-alt-01", DoorDirection.right, False, False), + + "10a_c-03_south-west": Door("10a_c-03_south-west", "10a_c-03", DoorDirection.left, False, False), + "10a_c-03_south": Door("10a_c-03_south", "10a_c-03", DoorDirection.down, False, True), + "10a_c-03_north": Door("10a_c-03_north", "10a_c-03", DoorDirection.up, False, False), + + "10a_d-00_south": Door("10a_d-00_south", "10a_d-00", DoorDirection.down, False, True), + "10a_d-00_north": Door("10a_d-00_north", "10a_d-00", DoorDirection.up, False, False), + "10a_d-00_north-east-door": Door("10a_d-00_north-east-door", "10a_d-00", DoorDirection.right, False, False), + "10a_d-00_south-east-door": Door("10a_d-00_south-east-door", "10a_d-00", DoorDirection.right, False, False), + "10a_d-00_south-west-door": Door("10a_d-00_south-west-door", "10a_d-00", DoorDirection.left, False, False), + "10a_d-00_west-door": Door("10a_d-00_west-door", "10a_d-00", DoorDirection.up, False, False), + "10a_d-00_north-west-door": Door("10a_d-00_north-west-door", "10a_d-00", DoorDirection.up, False, False), + + "10a_d-04_west": Door("10a_d-04_west", "10a_d-04", DoorDirection.left, False, False), + + "10a_d-03_west": Door("10a_d-03_west", "10a_d-03", DoorDirection.left, False, False), + + "10a_d-01_east": Door("10a_d-01_east", "10a_d-01", DoorDirection.right, False, False), + + "10a_d-02_bottom": Door("10a_d-02_bottom", "10a_d-02", DoorDirection.down, False, False), + + "10a_d-05_west": Door("10a_d-05_west", "10a_d-05", DoorDirection.down, False, False), + "10a_d-05_south": Door("10a_d-05_south", "10a_d-05", DoorDirection.down, False, True), + "10a_d-05_north": Door("10a_d-05_north", "10a_d-05", DoorDirection.up, False, False), + + "10a_e-00y_south": Door("10a_e-00y_south", "10a_e-00y", DoorDirection.down, False, False), + "10a_e-00y_south-east": Door("10a_e-00y_south-east", "10a_e-00y", DoorDirection.right, False, False), + "10a_e-00y_north-east": Door("10a_e-00y_north-east", "10a_e-00y", DoorDirection.right, False, False), + "10a_e-00y_north": Door("10a_e-00y_north", "10a_e-00y", DoorDirection.up, False, False), + + "10a_e-00yb_south": Door("10a_e-00yb_south", "10a_e-00yb", DoorDirection.left, False, False), + "10a_e-00yb_north": Door("10a_e-00yb_north", "10a_e-00yb", DoorDirection.left, False, False), + + "10a_e-00z_south": Door("10a_e-00z_south", "10a_e-00z", DoorDirection.down, False, True), + "10a_e-00z_north": Door("10a_e-00z_north", "10a_e-00z", DoorDirection.up, False, False), + + "10a_e-00_south": Door("10a_e-00_south", "10a_e-00", DoorDirection.down, False, True), + "10a_e-00_north": Door("10a_e-00_north", "10a_e-00", DoorDirection.up, False, False), + + "10a_e-00b_south": Door("10a_e-00b_south", "10a_e-00b", DoorDirection.down, False, True), + "10a_e-00b_north": Door("10a_e-00b_north", "10a_e-00b", DoorDirection.up, False, False), + + "10a_e-01_south": Door("10a_e-01_south", "10a_e-01", DoorDirection.down, False, True), + "10a_e-01_north": Door("10a_e-01_north", "10a_e-01", DoorDirection.up, False, False), + + "10a_e-02_west": Door("10a_e-02_west", "10a_e-02", DoorDirection.down, False, True), + "10a_e-02_east": Door("10a_e-02_east", "10a_e-02", DoorDirection.right, False, False), + + "10a_e-03_west": Door("10a_e-03_west", "10a_e-03", DoorDirection.left, False, False), + "10a_e-03_east": Door("10a_e-03_east", "10a_e-03", DoorDirection.right, False, False), + + "10a_e-04_west": Door("10a_e-04_west", "10a_e-04", DoorDirection.left, False, False), + "10a_e-04_east": Door("10a_e-04_east", "10a_e-04", DoorDirection.right, False, False), + + "10a_e-05_west": Door("10a_e-05_west", "10a_e-05", DoorDirection.left, False, False), + "10a_e-05_east": Door("10a_e-05_east", "10a_e-05", DoorDirection.right, False, False), + + "10a_e-05b_west": Door("10a_e-05b_west", "10a_e-05b", DoorDirection.left, False, False), + "10a_e-05b_east": Door("10a_e-05b_east", "10a_e-05b", DoorDirection.right, False, False), + + "10a_e-05c_west": Door("10a_e-05c_west", "10a_e-05c", DoorDirection.left, False, False), + "10a_e-05c_east": Door("10a_e-05c_east", "10a_e-05c", DoorDirection.right, False, False), + + "10a_e-06_west": Door("10a_e-06_west", "10a_e-06", DoorDirection.left, False, False), + "10a_e-06_east": Door("10a_e-06_east", "10a_e-06", DoorDirection.right, False, False), + + "10a_e-07_west": Door("10a_e-07_west", "10a_e-07", DoorDirection.left, False, False), + "10a_e-07_east": Door("10a_e-07_east", "10a_e-07", DoorDirection.right, False, False), + + "10a_e-08_west": Door("10a_e-08_west", "10a_e-08", DoorDirection.left, False, False), + "10a_e-08_east": Door("10a_e-08_east", "10a_e-08", DoorDirection.right, False, False), + + "10b_f-door_west": Door("10b_f-door_west", "10b_f-door", DoorDirection.left, False, True), + "10b_f-door_east": Door("10b_f-door_east", "10b_f-door", DoorDirection.right, False, False), + + "10b_f-00_west": Door("10b_f-00_west", "10b_f-00", DoorDirection.left, False, False), + "10b_f-00_east": Door("10b_f-00_east", "10b_f-00", DoorDirection.right, False, False), + + "10b_f-01_west": Door("10b_f-01_west", "10b_f-01", DoorDirection.left, False, False), + "10b_f-01_east": Door("10b_f-01_east", "10b_f-01", DoorDirection.right, False, False), + + "10b_f-02_west": Door("10b_f-02_west", "10b_f-02", DoorDirection.left, False, False), + "10b_f-02_east": Door("10b_f-02_east", "10b_f-02", DoorDirection.right, False, False), + + "10b_f-03_west": Door("10b_f-03_west", "10b_f-03", DoorDirection.left, False, False), + "10b_f-03_east": Door("10b_f-03_east", "10b_f-03", DoorDirection.right, False, False), + + "10b_f-04_west": Door("10b_f-04_west", "10b_f-04", DoorDirection.left, False, False), + "10b_f-04_east": Door("10b_f-04_east", "10b_f-04", DoorDirection.right, False, False), + + "10b_f-05_west": Door("10b_f-05_west", "10b_f-05", DoorDirection.left, False, False), + "10b_f-05_east": Door("10b_f-05_east", "10b_f-05", DoorDirection.right, False, False), + + "10b_f-06_west": Door("10b_f-06_west", "10b_f-06", DoorDirection.left, False, False), + "10b_f-06_east": Door("10b_f-06_east", "10b_f-06", DoorDirection.right, False, False), + + "10b_f-07_west": Door("10b_f-07_west", "10b_f-07", DoorDirection.left, False, False), + "10b_f-07_east": Door("10b_f-07_east", "10b_f-07", DoorDirection.right, False, False), + + "10b_f-08_west": Door("10b_f-08_west", "10b_f-08", DoorDirection.left, False, False), + "10b_f-08_east": Door("10b_f-08_east", "10b_f-08", DoorDirection.right, False, False), + + "10b_f-09_west": Door("10b_f-09_west", "10b_f-09", DoorDirection.left, False, False), + "10b_f-09_east": Door("10b_f-09_east", "10b_f-09", DoorDirection.up, False, False), + + "10b_g-00_bottom": Door("10b_g-00_bottom", "10b_g-00", DoorDirection.down, False, True), + "10b_g-00_top": Door("10b_g-00_top", "10b_g-00", DoorDirection.up, False, False), + + "10b_g-01_bottom": Door("10b_g-01_bottom", "10b_g-01", DoorDirection.down, False, True), + "10b_g-01_top": Door("10b_g-01_top", "10b_g-01", DoorDirection.up, False, False), + + "10b_g-03_bottom": Door("10b_g-03_bottom", "10b_g-03", DoorDirection.down, False, True), + "10b_g-03_top": Door("10b_g-03_top", "10b_g-03", DoorDirection.up, False, False), + + "10b_g-02_west": Door("10b_g-02_west", "10b_g-02", DoorDirection.down, False, True), + "10b_g-02_east": Door("10b_g-02_east", "10b_g-02", DoorDirection.up, False, False), + + "10b_g-04_west": Door("10b_g-04_west", "10b_g-04", DoorDirection.down, False, True), + "10b_g-04_east": Door("10b_g-04_east", "10b_g-04", DoorDirection.right, False, False), + + "10b_g-05_west": Door("10b_g-05_west", "10b_g-05", DoorDirection.left, False, False), + "10b_g-05_east": Door("10b_g-05_east", "10b_g-05", DoorDirection.right, False, False), + + "10b_g-06_west": Door("10b_g-06_west", "10b_g-06", DoorDirection.left, False, False), + "10b_g-06_east": Door("10b_g-06_east", "10b_g-06", DoorDirection.right, False, False), + + "10b_h-00b_west": Door("10b_h-00b_west", "10b_h-00b", DoorDirection.left, False, False), + "10b_h-00b_east": Door("10b_h-00b_east", "10b_h-00b", DoorDirection.down, False, False), + + "10b_h-00_west": Door("10b_h-00_west", "10b_h-00", DoorDirection.up, False, False), + "10b_h-00_east": Door("10b_h-00_east", "10b_h-00", DoorDirection.right, False, False), + + "10b_h-01_west": Door("10b_h-01_west", "10b_h-01", DoorDirection.left, False, False), + "10b_h-01_east": Door("10b_h-01_east", "10b_h-01", DoorDirection.up, False, False), + + "10b_h-02_west": Door("10b_h-02_west", "10b_h-02", DoorDirection.down, False, True), + "10b_h-02_east": Door("10b_h-02_east", "10b_h-02", DoorDirection.right, False, False), + + "10b_h-03_west": Door("10b_h-03_west", "10b_h-03", DoorDirection.left, False, False), + "10b_h-03_east": Door("10b_h-03_east", "10b_h-03", DoorDirection.right, False, False), + + "10b_h-03b_west": Door("10b_h-03b_west", "10b_h-03b", DoorDirection.left, False, False), + "10b_h-03b_east": Door("10b_h-03b_east", "10b_h-03b", DoorDirection.right, False, False), + + "10b_h-04_top": Door("10b_h-04_top", "10b_h-04", DoorDirection.left, False, False), + "10b_h-04_east": Door("10b_h-04_east", "10b_h-04", DoorDirection.right, False, False), + "10b_h-04_bottom": Door("10b_h-04_bottom", "10b_h-04", DoorDirection.right, False, False), + + "10b_h-04b_west": Door("10b_h-04b_west", "10b_h-04b", DoorDirection.left, False, False), + "10b_h-04b_east": Door("10b_h-04b_east", "10b_h-04b", DoorDirection.down, False, False), + + "10b_h-05_west": Door("10b_h-05_west", "10b_h-05", DoorDirection.left, False, False), + "10b_h-05_top": Door("10b_h-05_top", "10b_h-05", DoorDirection.up, False, True), + "10b_h-05_east": Door("10b_h-05_east", "10b_h-05", DoorDirection.right, False, False), + + "10b_h-06_west": Door("10b_h-06_west", "10b_h-06", DoorDirection.left, False, False), + "10b_h-06_east": Door("10b_h-06_east", "10b_h-06", DoorDirection.up, False, False), + + "10b_h-06b_bottom": Door("10b_h-06b_bottom", "10b_h-06b", DoorDirection.down, False, True), + "10b_h-06b_top": Door("10b_h-06b_top", "10b_h-06b", DoorDirection.up, False, False), + + "10b_h-07_west": Door("10b_h-07_west", "10b_h-07", DoorDirection.down, False, True), + "10b_h-07_east": Door("10b_h-07_east", "10b_h-07", DoorDirection.right, False, False), + + "10b_h-08_west": Door("10b_h-08_west", "10b_h-08", DoorDirection.left, False, True), + "10b_h-08_east": Door("10b_h-08_east", "10b_h-08", DoorDirection.right, False, False), + + "10b_h-09_west": Door("10b_h-09_west", "10b_h-09", DoorDirection.left, False, False), + "10b_h-09_east": Door("10b_h-09_east", "10b_h-09", DoorDirection.right, False, False), + + "10b_h-10_west": Door("10b_h-10_west", "10b_h-10", DoorDirection.left, False, False), + "10b_h-10_east": Door("10b_h-10_east", "10b_h-10", DoorDirection.up, False, False), + + "10b_i-00_west": Door("10b_i-00_west", "10b_i-00", DoorDirection.down, False, True), + "10b_i-00_east": Door("10b_i-00_east", "10b_i-00", DoorDirection.right, False, False), + + "10b_i-00b_west": Door("10b_i-00b_west", "10b_i-00b", DoorDirection.left, False, False), + "10b_i-00b_east": Door("10b_i-00b_east", "10b_i-00b", DoorDirection.right, False, False), + + "10b_i-01_west": Door("10b_i-01_west", "10b_i-01", DoorDirection.left, False, False), + "10b_i-01_east": Door("10b_i-01_east", "10b_i-01", DoorDirection.right, False, False), + + "10b_i-02_west": Door("10b_i-02_west", "10b_i-02", DoorDirection.left, False, False), + "10b_i-02_east": Door("10b_i-02_east", "10b_i-02", DoorDirection.right, False, False), + + "10b_i-03_west": Door("10b_i-03_west", "10b_i-03", DoorDirection.left, False, False), + "10b_i-03_east": Door("10b_i-03_east", "10b_i-03", DoorDirection.right, False, False), + + "10b_i-04_west": Door("10b_i-04_west", "10b_i-04", DoorDirection.left, False, False), + "10b_i-04_east": Door("10b_i-04_east", "10b_i-04", DoorDirection.right, False, False), + + "10b_i-05_west": Door("10b_i-05_west", "10b_i-05", DoorDirection.left, False, False), + "10b_i-05_east": Door("10b_i-05_east", "10b_i-05", DoorDirection.right, False, False), + + "10b_j-00_west": Door("10b_j-00_west", "10b_j-00", DoorDirection.left, False, True), + "10b_j-00_east": Door("10b_j-00_east", "10b_j-00", DoorDirection.right, False, False), + + "10b_j-00b_west": Door("10b_j-00b_west", "10b_j-00b", DoorDirection.left, False, False), + "10b_j-00b_east": Door("10b_j-00b_east", "10b_j-00b", DoorDirection.right, False, False), + + "10b_j-01_west": Door("10b_j-01_west", "10b_j-01", DoorDirection.left, False, False), + "10b_j-01_east": Door("10b_j-01_east", "10b_j-01", DoorDirection.right, False, False), + + "10b_j-02_west": Door("10b_j-02_west", "10b_j-02", DoorDirection.left, False, False), + "10b_j-02_east": Door("10b_j-02_east", "10b_j-02", DoorDirection.right, False, False), + + "10b_j-03_west": Door("10b_j-03_west", "10b_j-03", DoorDirection.left, False, False), + "10b_j-03_east": Door("10b_j-03_east", "10b_j-03", DoorDirection.right, False, False), + + "10b_j-04_west": Door("10b_j-04_west", "10b_j-04", DoorDirection.left, False, False), + "10b_j-04_east": Door("10b_j-04_east", "10b_j-04", DoorDirection.right, False, False), + + "10b_j-05_west": Door("10b_j-05_west", "10b_j-05", DoorDirection.left, False, False), + "10b_j-05_east": Door("10b_j-05_east", "10b_j-05", DoorDirection.right, False, False), + + "10b_j-06_west": Door("10b_j-06_west", "10b_j-06", DoorDirection.left, False, False), + "10b_j-06_east": Door("10b_j-06_east", "10b_j-06", DoorDirection.right, False, False), + + "10b_j-07_west": Door("10b_j-07_west", "10b_j-07", DoorDirection.left, False, False), + "10b_j-07_east": Door("10b_j-07_east", "10b_j-07", DoorDirection.right, False, False), + + "10b_j-08_west": Door("10b_j-08_west", "10b_j-08", DoorDirection.left, False, False), + "10b_j-08_east": Door("10b_j-08_east", "10b_j-08", DoorDirection.right, False, False), + + "10b_j-09_west": Door("10b_j-09_west", "10b_j-09", DoorDirection.left, False, False), + "10b_j-09_east": Door("10b_j-09_east", "10b_j-09", DoorDirection.right, False, False), + + "10b_j-10_west": Door("10b_j-10_west", "10b_j-10", DoorDirection.left, False, False), + "10b_j-10_east": Door("10b_j-10_east", "10b_j-10", DoorDirection.right, False, False), + + "10b_j-11_west": Door("10b_j-11_west", "10b_j-11", DoorDirection.left, False, False), + "10b_j-11_east": Door("10b_j-11_east", "10b_j-11", DoorDirection.right, False, False), + + "10b_j-12_west": Door("10b_j-12_west", "10b_j-12", DoorDirection.left, False, False), + "10b_j-12_east": Door("10b_j-12_east", "10b_j-12", DoorDirection.right, False, False), + + "10b_j-13_west": Door("10b_j-13_west", "10b_j-13", DoorDirection.left, False, False), + "10b_j-13_east": Door("10b_j-13_east", "10b_j-13", DoorDirection.right, False, False), + + "10b_j-14_west": Door("10b_j-14_west", "10b_j-14", DoorDirection.left, False, False), + "10b_j-14_east": Door("10b_j-14_east", "10b_j-14", DoorDirection.right, False, False), + + "10b_j-14b_west": Door("10b_j-14b_west", "10b_j-14b", DoorDirection.left, False, False), + "10b_j-14b_east": Door("10b_j-14b_east", "10b_j-14b", DoorDirection.right, False, False), + + "10b_j-15_west": Door("10b_j-15_west", "10b_j-15", DoorDirection.left, False, False), + "10b_j-15_east": Door("10b_j-15_east", "10b_j-15", DoorDirection.right, False, False), + + "10b_j-16_west": Door("10b_j-16_west", "10b_j-16", DoorDirection.left, False, True), + "10b_j-16_top": Door("10b_j-16_top", "10b_j-16", DoorDirection.up, False, False), + "10b_j-16_east": Door("10b_j-16_east", "10b_j-16", DoorDirection.up, False, False), + + "10b_j-17_south": Door("10b_j-17_south", "10b_j-17", DoorDirection.down, False, True), + "10b_j-17_west": Door("10b_j-17_west", "10b_j-17", DoorDirection.up, False, False), + "10b_j-17_north": Door("10b_j-17_north", "10b_j-17", DoorDirection.up, False, False), + "10b_j-17_east": Door("10b_j-17_east", "10b_j-17", DoorDirection.right, False, False), + + "10b_j-18_west": Door("10b_j-18_west", "10b_j-18", DoorDirection.down, False, True), + "10b_j-18_east": Door("10b_j-18_east", "10b_j-18", DoorDirection.down, False, False), + + "10b_j-19_bottom": Door("10b_j-19_bottom", "10b_j-19", DoorDirection.left, False, False), + "10b_j-19_top": Door("10b_j-19_top", "10b_j-19", DoorDirection.up, False, False), + + "10b_GOAL_main": Door("10b_GOAL_main", "10b_GOAL", DoorDirection.down, False, True), + "10b_GOAL_moon": Door("10b_GOAL_moon", "10b_GOAL", DoorDirection.down, False, True), + + "10c_end-golden_bottom": Door("10c_end-golden_bottom", "10c_end-golden", DoorDirection.down, False, True), + "10c_end-golden_top": Door("10c_end-golden_top", "10c_end-golden", DoorDirection.up, False, True), + +} + +all_region_connections: dict[str, RegionConnection] = { + "0a_-1_main---0a_-1_east": RegionConnection("0a_-1_main", "0a_-1_east", []), + "0a_-1_east---0a_-1_main": RegionConnection("0a_-1_east", "0a_-1_main", []), + + "0a_0_west---0a_0_main": RegionConnection("0a_0_west", "0a_0_main", []), + "0a_0_main---0a_0_west": RegionConnection("0a_0_main", "0a_0_west", []), + "0a_0_main---0a_0_east": RegionConnection("0a_0_main", "0a_0_east", []), + "0a_0_main---0a_0_north": RegionConnection("0a_0_main", "0a_0_north", []), + "0a_0_north---0a_0_main": RegionConnection("0a_0_north", "0a_0_main", []), + "0a_0_east---0a_0_main": RegionConnection("0a_0_east", "0a_0_main", []), + + + "0a_1_west---0a_1_main": RegionConnection("0a_1_west", "0a_1_main", []), + "0a_1_main---0a_1_west": RegionConnection("0a_1_main", "0a_1_west", []), + "0a_1_main---0a_1_east": RegionConnection("0a_1_main", "0a_1_east", []), + "0a_1_east---0a_1_main": RegionConnection("0a_1_east", "0a_1_main", []), + + "0a_2_west---0a_2_main": RegionConnection("0a_2_west", "0a_2_main", []), + "0a_2_main---0a_2_west": RegionConnection("0a_2_main", "0a_2_west", []), + "0a_2_main---0a_2_east": RegionConnection("0a_2_main", "0a_2_east", []), + "0a_2_east---0a_2_main": RegionConnection("0a_2_east", "0a_2_main", []), + + "0a_3_west---0a_3_main": RegionConnection("0a_3_west", "0a_3_main", []), + "0a_3_main---0a_3_west": RegionConnection("0a_3_main", "0a_3_west", []), + "0a_3_main---0a_3_east": RegionConnection("0a_3_main", "0a_3_east", []), + "0a_3_east---0a_3_main": RegionConnection("0a_3_east", "0a_3_main", []), + + "1a_1_main---1a_1_east": RegionConnection("1a_1_main", "1a_1_east", []), + "1a_1_east---1a_1_main": RegionConnection("1a_1_east", "1a_1_main", []), + + "1a_2_west---1a_2_east": RegionConnection("1a_2_west", "1a_2_east", []), + "1a_2_east---1a_2_west": RegionConnection("1a_2_east", "1a_2_west", []), + + "1a_3_west---1a_3_east": RegionConnection("1a_3_west", "1a_3_east", []), + "1a_3_east---1a_3_west": RegionConnection("1a_3_east", "1a_3_west", []), + + "1a_4_west---1a_4_east": RegionConnection("1a_4_west", "1a_4_east", [[ItemName.traffic_blocks, ], ]), + "1a_4_east---1a_4_west": RegionConnection("1a_4_east", "1a_4_west", []), + + "1a_3b_west---1a_3b_east": RegionConnection("1a_3b_west", "1a_3b_east", []), + "1a_3b_east---1a_3b_west": RegionConnection("1a_3b_east", "1a_3b_west", []), + "1a_3b_east---1a_3b_top": RegionConnection("1a_3b_east", "1a_3b_top", []), + "1a_3b_top---1a_3b_west": RegionConnection("1a_3b_top", "1a_3b_west", []), + "1a_3b_top---1a_3b_east": RegionConnection("1a_3b_top", "1a_3b_east", []), + + "1a_5_bottom---1a_5_west": RegionConnection("1a_5_bottom", "1a_5_west", []), + "1a_5_bottom---1a_5_north-west": RegionConnection("1a_5_bottom", "1a_5_north-west", [[ItemName.traffic_blocks, ], ]), + "1a_5_bottom---1a_5_center": RegionConnection("1a_5_bottom", "1a_5_center", []), + "1a_5_west---1a_5_bottom": RegionConnection("1a_5_west", "1a_5_bottom", []), + "1a_5_north-west---1a_5_center": RegionConnection("1a_5_north-west", "1a_5_center", []), + "1a_5_north-west---1a_5_bottom": RegionConnection("1a_5_north-west", "1a_5_bottom", []), + "1a_5_center---1a_5_north-east": RegionConnection("1a_5_center", "1a_5_north-east", []), + "1a_5_center---1a_5_bottom": RegionConnection("1a_5_center", "1a_5_bottom", []), + "1a_5_center---1a_5_south-east": RegionConnection("1a_5_center", "1a_5_south-east", []), + "1a_5_south-east---1a_5_north-east": RegionConnection("1a_5_south-east", "1a_5_north-east", []), + "1a_5_south-east---1a_5_center": RegionConnection("1a_5_south-east", "1a_5_center", []), + "1a_5_north-east---1a_5_center": RegionConnection("1a_5_north-east", "1a_5_center", []), + "1a_5_north-east---1a_5_top": RegionConnection("1a_5_north-east", "1a_5_top", [[ItemName.springs, ], ]), + "1a_5_top---1a_5_north-east": RegionConnection("1a_5_top", "1a_5_north-east", []), + + + + "1a_6_south-west---1a_6_west": RegionConnection("1a_6_south-west", "1a_6_west", []), + "1a_6_west---1a_6_south-west": RegionConnection("1a_6_west", "1a_6_south-west", []), + "1a_6_west---1a_6_east": RegionConnection("1a_6_west", "1a_6_east", [[ItemName.dash_refills, ], ]), + "1a_6_east---1a_6_west": RegionConnection("1a_6_east", "1a_6_west", [[ItemName.cannot_access, ], ]), + + "1a_6z_north-west---1a_6z_west": RegionConnection("1a_6z_north-west", "1a_6z_west", []), + "1a_6z_west---1a_6z_north-west": RegionConnection("1a_6z_west", "1a_6z_north-west", []), + "1a_6z_west---1a_6z_east": RegionConnection("1a_6z_west", "1a_6z_east", []), + "1a_6z_east---1a_6z_west": RegionConnection("1a_6z_east", "1a_6z_west", [[ItemName.dash_refills, ], ]), + + "1a_6zb_north-west---1a_6zb_main": RegionConnection("1a_6zb_north-west", "1a_6zb_main", []), + "1a_6zb_main---1a_6zb_north-west": RegionConnection("1a_6zb_main", "1a_6zb_north-west", []), + "1a_6zb_main---1a_6zb_east": RegionConnection("1a_6zb_main", "1a_6zb_east", []), + "1a_6zb_east---1a_6zb_main": RegionConnection("1a_6zb_east", "1a_6zb_main", []), + + "1a_7zb_west---1a_7zb_east": RegionConnection("1a_7zb_west", "1a_7zb_east", [[ItemName.dash_refills, ], ]), + "1a_7zb_east---1a_7zb_west": RegionConnection("1a_7zb_east", "1a_7zb_west", [[ItemName.springs, ItemName.dash_refills, ], ]), + + "1a_6a_west---1a_6a_east": RegionConnection("1a_6a_west", "1a_6a_east", [[ItemName.dash_refills, ], ]), + "1a_6a_east---1a_6a_west": RegionConnection("1a_6a_east", "1a_6a_west", []), + + "1a_6b_south-west---1a_6b_north-west": RegionConnection("1a_6b_south-west", "1a_6b_north-west", [[ItemName.traffic_blocks, ], ]), + "1a_6b_south-west---1a_6b_north-east": RegionConnection("1a_6b_south-west", "1a_6b_north-east", [[ItemName.traffic_blocks, ], ]), + "1a_6b_north-west---1a_6b_south-west": RegionConnection("1a_6b_north-west", "1a_6b_south-west", []), + "1a_6b_north-east---1a_6b_south-west": RegionConnection("1a_6b_north-east", "1a_6b_south-west", []), + + "1a_s0_west---1a_s0_east": RegionConnection("1a_s0_west", "1a_s0_east", []), + "1a_s0_east---1a_s0_west": RegionConnection("1a_s0_east", "1a_s0_west", [[ItemName.traffic_blocks, ], ]), + + + "1a_6c_south-west---1a_6c_north-west": RegionConnection("1a_6c_south-west", "1a_6c_north-west", [[ItemName.springs, ], ]), + "1a_6c_south-west---1a_6c_north-east": RegionConnection("1a_6c_south-west", "1a_6c_north-east", [[ItemName.springs, ], ]), + "1a_6c_north-west---1a_6c_south-west": RegionConnection("1a_6c_north-west", "1a_6c_south-west", []), + "1a_6c_north-east---1a_6c_south-west": RegionConnection("1a_6c_north-east", "1a_6c_south-west", []), + + "1a_7_west---1a_7_east": RegionConnection("1a_7_west", "1a_7_east", []), + "1a_7_east---1a_7_west": RegionConnection("1a_7_east", "1a_7_west", []), + + "1a_7z_bottom---1a_7z_top": RegionConnection("1a_7z_bottom", "1a_7z_top", []), + "1a_7z_top---1a_7z_bottom": RegionConnection("1a_7z_top", "1a_7z_bottom", []), + + "1a_8z_bottom---1a_8z_top": RegionConnection("1a_8z_bottom", "1a_8z_top", [[ItemName.traffic_blocks, ], ]), + "1a_8z_top---1a_8z_bottom": RegionConnection("1a_8z_top", "1a_8z_bottom", []), + + "1a_8zb_west---1a_8zb_east": RegionConnection("1a_8zb_west", "1a_8zb_east", [[ItemName.dash_refills, ], ]), + "1a_8zb_east---1a_8zb_west": RegionConnection("1a_8zb_east", "1a_8zb_west", [[ItemName.cannot_access, ], ]), + + "1a_8_south-west---1a_8_south": RegionConnection("1a_8_south-west", "1a_8_south", []), + "1a_8_south-west---1a_8_north": RegionConnection("1a_8_south-west", "1a_8_north", []), + "1a_8_west---1a_8_south-west": RegionConnection("1a_8_west", "1a_8_south-west", []), + "1a_8_south-east---1a_8_north": RegionConnection("1a_8_south-east", "1a_8_north", []), + "1a_8_south-east---1a_8_south": RegionConnection("1a_8_south-east", "1a_8_south", []), + "1a_8_north---1a_8_north-east": RegionConnection("1a_8_north", "1a_8_north-east", []), + "1a_8_north---1a_8_south": RegionConnection("1a_8_north", "1a_8_south", []), + "1a_8_north-east---1a_8_north": RegionConnection("1a_8_north-east", "1a_8_north", []), + + "1a_7a_east---1a_7a_west": RegionConnection("1a_7a_east", "1a_7a_west", []), + "1a_7a_west---1a_7a_east": RegionConnection("1a_7a_west", "1a_7a_east", []), + + + "1a_8b_east---1a_8b_west": RegionConnection("1a_8b_east", "1a_8b_west", []), + "1a_8b_west---1a_8b_east": RegionConnection("1a_8b_west", "1a_8b_east", [[ItemName.traffic_blocks, ], ]), + + "1a_9_east---1a_9_west": RegionConnection("1a_9_east", "1a_9_west", [[ItemName.cannot_access, ], ]), + "1a_9_west---1a_9_east": RegionConnection("1a_9_west", "1a_9_east", [[ItemName.traffic_blocks, ], ]), + + "1a_9b_east---1a_9b_north-east": RegionConnection("1a_9b_east", "1a_9b_north-east", []), + "1a_9b_north-east---1a_9b_east": RegionConnection("1a_9b_north-east", "1a_9b_east", []), + "1a_9b_north-east---1a_9b_west": RegionConnection("1a_9b_north-east", "1a_9b_west", []), + "1a_9b_west---1a_9b_east": RegionConnection("1a_9b_west", "1a_9b_east", [[ItemName.traffic_blocks, ], ]), + "1a_9b_west---1a_9b_north-west": RegionConnection("1a_9b_west", "1a_9b_north-west", [[ItemName.traffic_blocks, ], ]), + "1a_9b_north-west---1a_9b_west": RegionConnection("1a_9b_north-west", "1a_9b_west", []), + + + "1a_10_south-east---1a_10_south-west": RegionConnection("1a_10_south-east", "1a_10_south-west", []), + "1a_10_south-east---1a_10_north-west": RegionConnection("1a_10_south-east", "1a_10_north-west", [[ItemName.traffic_blocks, ], ]), + "1a_10_south-west---1a_10_south-east": RegionConnection("1a_10_south-west", "1a_10_south-east", []), + "1a_10_north-west---1a_10_south-east": RegionConnection("1a_10_north-west", "1a_10_south-east", []), + "1a_10_north-east---1a_10_south-east": RegionConnection("1a_10_north-east", "1a_10_south-east", []), + + "1a_10z_west---1a_10z_east": RegionConnection("1a_10z_west", "1a_10z_east", []), + "1a_10z_east---1a_10z_west": RegionConnection("1a_10z_east", "1a_10z_west", [[ItemName.springs, ], ]), + + + "1a_11_south-east---1a_11_north": RegionConnection("1a_11_south-east", "1a_11_north", [[ItemName.traffic_blocks, ItemName.springs, ], ]), + "1a_11_south-west---1a_11_south": RegionConnection("1a_11_south-west", "1a_11_south", [[ItemName.traffic_blocks, ], ]), + "1a_11_south-west---1a_11_west": RegionConnection("1a_11_south-west", "1a_11_west", [[ItemName.traffic_blocks, ], ]), + "1a_11_north---1a_11_south-east": RegionConnection("1a_11_north", "1a_11_south-east", []), + "1a_11_west---1a_11_south-west": RegionConnection("1a_11_west", "1a_11_south-west", [[ItemName.traffic_blocks, ], ]), + "1a_11_south---1a_11_south-west": RegionConnection("1a_11_south", "1a_11_south-west", []), + + + "1a_10a_bottom---1a_10a_top": RegionConnection("1a_10a_bottom", "1a_10a_top", [[ItemName.dash_refills, ], ]), + "1a_10a_top---1a_10a_bottom": RegionConnection("1a_10a_top", "1a_10a_bottom", [[ItemName.cannot_access, ], ]), + + "1a_12_south-west---1a_12_north-west": RegionConnection("1a_12_south-west", "1a_12_north-west", []), + "1a_12_south-west---1a_12_east": RegionConnection("1a_12_south-west", "1a_12_east", []), + "1a_12_north-west---1a_12_south-west": RegionConnection("1a_12_north-west", "1a_12_south-west", []), + + + "1a_12a_bottom---1a_12a_top": RegionConnection("1a_12a_bottom", "1a_12a_top", [[ItemName.traffic_blocks, ], ]), + "1a_12a_top---1a_12a_bottom": RegionConnection("1a_12a_top", "1a_12a_bottom", []), + + "1a_end_south---1a_end_main": RegionConnection("1a_end_south", "1a_end_main", []), + "1a_end_main---1a_end_south": RegionConnection("1a_end_main", "1a_end_south", []), + + "1b_00_west---1b_00_east": RegionConnection("1b_00_west", "1b_00_east", []), + "1b_00_east---1b_00_west": RegionConnection("1b_00_east", "1b_00_west", []), + + "1b_01_west---1b_01_east": RegionConnection("1b_01_west", "1b_01_east", [[ItemName.traffic_blocks, ], ]), + "1b_01_east---1b_01_west": RegionConnection("1b_01_east", "1b_01_west", [[ItemName.cannot_access, ], ]), + + "1b_02_west---1b_02_east": RegionConnection("1b_02_west", "1b_02_east", [[ItemName.traffic_blocks, ], ]), + "1b_02_east---1b_02_west": RegionConnection("1b_02_east", "1b_02_west", [[ItemName.cannot_access, ], ]), + + "1b_02b_west---1b_02b_east": RegionConnection("1b_02b_west", "1b_02b_east", [[ItemName.traffic_blocks, ], ]), + "1b_02b_east---1b_02b_west": RegionConnection("1b_02b_east", "1b_02b_west", [[ItemName.cannot_access, ], ]), + + "1b_03_west---1b_03_east": RegionConnection("1b_03_west", "1b_03_east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "1b_03_east---1b_03_west": RegionConnection("1b_03_east", "1b_03_west", [[ItemName.cannot_access, ], ]), + + "1b_04_west---1b_04_east": RegionConnection("1b_04_west", "1b_04_east", [[ItemName.traffic_blocks, ItemName.springs, ], ]), + "1b_04_east---1b_04_west": RegionConnection("1b_04_east", "1b_04_west", [[ItemName.cannot_access, ], ]), + + "1b_05_west---1b_05_east": RegionConnection("1b_05_west", "1b_05_east", [[ItemName.traffic_blocks, ], ]), + "1b_05_east---1b_05_west": RegionConnection("1b_05_east", "1b_05_west", [[ItemName.cannot_access, ], ]), + + "1b_05b_west---1b_05b_east": RegionConnection("1b_05b_west", "1b_05b_east", [[ItemName.springs, ItemName.dash_refills, ], ]), + "1b_05b_east---1b_05b_west": RegionConnection("1b_05b_east", "1b_05b_west", [[ItemName.cannot_access, ], ]), + + "1b_06_west---1b_06_east": RegionConnection("1b_06_west", "1b_06_east", [[ItemName.springs, ItemName.dash_refills, ], ]), + "1b_06_east---1b_06_west": RegionConnection("1b_06_east", "1b_06_west", [[ItemName.cannot_access, ], ]), + + "1b_07_bottom---1b_07_top": RegionConnection("1b_07_bottom", "1b_07_top", [[ItemName.traffic_blocks, ], ]), + "1b_07_top---1b_07_bottom": RegionConnection("1b_07_top", "1b_07_bottom", []), + + "1b_08_west---1b_08_east": RegionConnection("1b_08_west", "1b_08_east", [[ItemName.traffic_blocks, ], ]), + + "1b_08b_west---1b_08b_east": RegionConnection("1b_08b_west", "1b_08b_east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "1b_08b_east---1b_08b_west": RegionConnection("1b_08b_east", "1b_08b_west", [[ItemName.cannot_access, ], ]), + + "1b_09_west---1b_09_east": RegionConnection("1b_09_west", "1b_09_east", [[ItemName.traffic_blocks, ], ]), + "1b_09_east---1b_09_west": RegionConnection("1b_09_east", "1b_09_west", []), + + "1b_10_west---1b_10_east": RegionConnection("1b_10_west", "1b_10_east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + + "1b_11_bottom---1b_11_top": RegionConnection("1b_11_bottom", "1b_11_top", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "1b_11_top---1b_11_bottom": RegionConnection("1b_11_top", "1b_11_bottom", []), + + "1b_end_west---1b_end_goal": RegionConnection("1b_end_west", "1b_end_goal", [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ], ]), + + "1c_00_west---1c_00_east": RegionConnection("1c_00_west", "1c_00_east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "1c_00_east---1c_00_west": RegionConnection("1c_00_east", "1c_00_west", [[ItemName.cannot_access, ], ]), + + "1c_01_west---1c_01_east": RegionConnection("1c_01_west", "1c_01_east", [[ItemName.traffic_blocks, ], ]), + "1c_01_east---1c_01_west": RegionConnection("1c_01_east", "1c_01_west", []), + + "1c_02_west---1c_02_goal": RegionConnection("1c_02_west", "1c_02_goal", [[ItemName.coins, ItemName.traffic_blocks, ], ]), + + "2a_start_main---2a_start_east": RegionConnection("2a_start_main", "2a_start_east", []), + "2a_start_top---2a_start_east": RegionConnection("2a_start_top", "2a_start_east", []), + "2a_start_top---2a_start_main": RegionConnection("2a_start_top", "2a_start_main", []), + "2a_start_east---2a_start_main": RegionConnection("2a_start_east", "2a_start_main", []), + "2a_start_east---2a_start_top": RegionConnection("2a_start_east", "2a_start_top", []), + + "2a_s0_bottom---2a_s0_top": RegionConnection("2a_s0_bottom", "2a_s0_top", []), + "2a_s0_top---2a_s0_bottom": RegionConnection("2a_s0_top", "2a_s0_bottom", []), + + "2a_s1_bottom---2a_s1_top": RegionConnection("2a_s1_bottom", "2a_s1_top", []), + "2a_s1_top---2a_s1_bottom": RegionConnection("2a_s1_top", "2a_s1_bottom", []), + + + "2a_0_south-west---2a_0_south-east": RegionConnection("2a_0_south-west", "2a_0_south-east", []), + "2a_0_south-east---2a_0_north-east": RegionConnection("2a_0_south-east", "2a_0_north-east", [[ItemName.dream_blocks, ], ]), + "2a_0_south-east---2a_0_south-west": RegionConnection("2a_0_south-east", "2a_0_south-west", []), + "2a_0_south-east---2a_0_north-west": RegionConnection("2a_0_south-east", "2a_0_north-west", [[ItemName.dream_blocks, ], ]), + "2a_0_north-west---2a_0_south-west": RegionConnection("2a_0_north-west", "2a_0_south-west", []), + "2a_0_north-east---2a_0_south-east": RegionConnection("2a_0_north-east", "2a_0_south-east", [[ItemName.dream_blocks, ], ]), + "2a_0_north-east---2a_0_north-west": RegionConnection("2a_0_north-east", "2a_0_north-west", [[ItemName.dream_blocks, ], ]), + + "2a_1_south-west---2a_1_south": RegionConnection("2a_1_south-west", "2a_1_south", []), + "2a_1_south---2a_1_south-west": RegionConnection("2a_1_south", "2a_1_south-west", []), + "2a_1_south---2a_1_south-east": RegionConnection("2a_1_south", "2a_1_south-east", []), + "2a_1_south-east---2a_1_south": RegionConnection("2a_1_south-east", "2a_1_south", []), + + "2a_d0_north---2a_d0_north-west": RegionConnection("2a_d0_north", "2a_d0_north-west", []), + "2a_d0_north-west---2a_d0_north": RegionConnection("2a_d0_north-west", "2a_d0_north", []), + "2a_d0_north-west---2a_d0_west": RegionConnection("2a_d0_north-west", "2a_d0_west", []), + "2a_d0_north-west---2a_d0_north-east": RegionConnection("2a_d0_north-west", "2a_d0_north-east", [[ItemName.dream_blocks, ], ]), + "2a_d0_west---2a_d0_north-west": RegionConnection("2a_d0_west", "2a_d0_north-west", []), + "2a_d0_west---2a_d0_south-west": RegionConnection("2a_d0_west", "2a_d0_south-west", []), + "2a_d0_west---2a_d0_east": RegionConnection("2a_d0_west", "2a_d0_east", []), + "2a_d0_south-west---2a_d0_south": RegionConnection("2a_d0_south-west", "2a_d0_south", [[ItemName.dream_blocks, ], ]), + "2a_d0_south-west---2a_d0_south-east": RegionConnection("2a_d0_south-west", "2a_d0_south-east", []), + "2a_d0_south-west---2a_d0_south-east": RegionConnection("2a_d0_south-west", "2a_d0_south-east", [[ItemName.cannot_access, ], ]), + "2a_d0_south---2a_d0_south-west": RegionConnection("2a_d0_south", "2a_d0_south-west", [[ItemName.dream_blocks, ], ]), + "2a_d0_south-east---2a_d0_south-west": RegionConnection("2a_d0_south-east", "2a_d0_south-west", []), + "2a_d0_south-east---2a_d0_east": RegionConnection("2a_d0_south-east", "2a_d0_east", []), + "2a_d0_east---2a_d0_west": RegionConnection("2a_d0_east", "2a_d0_west", [[ItemName.dream_blocks, ], ]), + "2a_d0_east---2a_d0_south-east": RegionConnection("2a_d0_east", "2a_d0_south-east", []), + "2a_d0_north-east---2a_d0_north-west": RegionConnection("2a_d0_north-east", "2a_d0_north-west", [[ItemName.dream_blocks, ], ]), + + "2a_d7_west---2a_d7_east": RegionConnection("2a_d7_west", "2a_d7_east", [[ItemName.dash_refills, ], ]), + "2a_d7_east---2a_d7_west": RegionConnection("2a_d7_east", "2a_d7_west", [[ItemName.cannot_access, ], ]), + + "2a_d8_west---2a_d8_south-east": RegionConnection("2a_d8_west", "2a_d8_south-east", [[ItemName.dash_refills, ], ]), + "2a_d8_south-east---2a_d8_west": RegionConnection("2a_d8_south-east", "2a_d8_west", [[ItemName.cannot_access, ], ]), + "2a_d8_south-east---2a_d8_north-east": RegionConnection("2a_d8_south-east", "2a_d8_north-east", []), + + "2a_d3_west---2a_d3_north": RegionConnection("2a_d3_west", "2a_d3_north", [[ItemName.dream_blocks, ], ]), + "2a_d3_north---2a_d3_west": RegionConnection("2a_d3_north", "2a_d3_west", [[ItemName.dream_blocks, ], ]), + + "2a_d2_west---2a_d2_east": RegionConnection("2a_d2_west", "2a_d2_east", []), + "2a_d2_north-west---2a_d2_west": RegionConnection("2a_d2_north-west", "2a_d2_west", []), + "2a_d2_east---2a_d2_west": RegionConnection("2a_d2_east", "2a_d2_west", []), + + + "2a_d1_south-west---2a_d1_south-east": RegionConnection("2a_d1_south-west", "2a_d1_south-east", []), + "2a_d1_south-west---2a_d1_north-east": RegionConnection("2a_d1_south-west", "2a_d1_north-east", []), + "2a_d1_south-east---2a_d1_south-west": RegionConnection("2a_d1_south-east", "2a_d1_south-west", []), + "2a_d1_south-east---2a_d1_north-east": RegionConnection("2a_d1_south-east", "2a_d1_north-east", []), + "2a_d1_north-east---2a_d1_south-west": RegionConnection("2a_d1_north-east", "2a_d1_south-west", []), + "2a_d1_north-east---2a_d1_south-east": RegionConnection("2a_d1_north-east", "2a_d1_south-east", []), + + "2a_d6_west---2a_d6_east": RegionConnection("2a_d6_west", "2a_d6_east", []), + "2a_d6_east---2a_d6_west": RegionConnection("2a_d6_east", "2a_d6_west", [[ItemName.cannot_access, ], ]), + + "2a_d4_west---2a_d4_east": RegionConnection("2a_d4_west", "2a_d4_east", []), + "2a_d4_west---2a_d4_south": RegionConnection("2a_d4_west", "2a_d4_south", [[ItemName.dream_blocks, ], ]), + "2a_d4_east---2a_d4_west": RegionConnection("2a_d4_east", "2a_d4_west", []), + "2a_d4_south---2a_d4_west": RegionConnection("2a_d4_south", "2a_d4_west", [[ItemName.dream_blocks, ], ]), + + + "2a_3x_bottom---2a_3x_top": RegionConnection("2a_3x_bottom", "2a_3x_top", [[ItemName.dream_blocks, ], ]), + "2a_3x_top---2a_3x_bottom": RegionConnection("2a_3x_top", "2a_3x_bottom", [[ItemName.dream_blocks, ], ]), + + "2a_3_bottom---2a_3_top": RegionConnection("2a_3_bottom", "2a_3_top", [[ItemName.dream_blocks, ], ]), + "2a_3_top---2a_3_bottom": RegionConnection("2a_3_top", "2a_3_bottom", [[ItemName.dream_blocks, ], ]), + + "2a_4_bottom---2a_4_top": RegionConnection("2a_4_bottom", "2a_4_top", [[ItemName.dream_blocks, ], ]), + "2a_4_top---2a_4_bottom": RegionConnection("2a_4_top", "2a_4_bottom", [[ItemName.dream_blocks, ], ]), + + "2a_5_bottom---2a_5_top": RegionConnection("2a_5_bottom", "2a_5_top", [[ItemName.dream_blocks, ], ]), + "2a_5_top---2a_5_bottom": RegionConnection("2a_5_top", "2a_5_bottom", [[ItemName.dream_blocks, ], ]), + + "2a_6_bottom---2a_6_top": RegionConnection("2a_6_bottom", "2a_6_top", [[ItemName.dream_blocks, ItemName.coins, ], ]), + "2a_6_top---2a_6_bottom": RegionConnection("2a_6_top", "2a_6_bottom", [[ItemName.cannot_access, ], ]), + + "2a_7_bottom---2a_7_top": RegionConnection("2a_7_bottom", "2a_7_top", [[ItemName.dream_blocks, ItemName.coins, ], ]), + "2a_7_top---2a_7_bottom": RegionConnection("2a_7_top", "2a_7_bottom", [[ItemName.cannot_access, ], ]), + + "2a_8_bottom---2a_8_top": RegionConnection("2a_8_bottom", "2a_8_top", [[ItemName.dream_blocks, ], ]), + "2a_8_top---2a_8_bottom": RegionConnection("2a_8_top", "2a_8_bottom", [[ItemName.cannot_access, ], ]), + + "2a_9_west---2a_9_north": RegionConnection("2a_9_west", "2a_9_north", [[ItemName.dream_blocks, ], ]), + "2a_9_north---2a_9_south": RegionConnection("2a_9_north", "2a_9_south", [[ItemName.dream_blocks, ], ]), + "2a_9_north---2a_9_west": RegionConnection("2a_9_north", "2a_9_west", [[ItemName.cannot_access, ], ]), + "2a_9_north-west---2a_9_west": RegionConnection("2a_9_north-west", "2a_9_west", []), + "2a_9_south---2a_9_south-east": RegionConnection("2a_9_south", "2a_9_south-east", [[ItemName.coins, ], ]), + + "2a_9b_east---2a_9b_west": RegionConnection("2a_9b_east", "2a_9b_west", []), + "2a_9b_west---2a_9b_east": RegionConnection("2a_9b_west", "2a_9b_east", []), + + "2a_10_top---2a_10_bottom": RegionConnection("2a_10_top", "2a_10_bottom", [[ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + "2a_10_bottom---2a_10_top": RegionConnection("2a_10_bottom", "2a_10_top", [[ItemName.cannot_access, ], ]), + + "2a_2_north-west---2a_2_south-east": RegionConnection("2a_2_north-west", "2a_2_south-east", []), + "2a_2_south-east---2a_2_north-west": RegionConnection("2a_2_south-east", "2a_2_north-west", []), + + "2a_11_west---2a_11_east": RegionConnection("2a_11_west", "2a_11_east", []), + "2a_11_east---2a_11_west": RegionConnection("2a_11_east", "2a_11_west", []), + + "2a_12b_west---2a_12b_north": RegionConnection("2a_12b_west", "2a_12b_north", [[ItemName.dream_blocks, ], ]), + "2a_12b_north---2a_12b_west": RegionConnection("2a_12b_north", "2a_12b_west", [[ItemName.dream_blocks, ], ]), + "2a_12b_north---2a_12b_south": RegionConnection("2a_12b_north", "2a_12b_south", [[ItemName.dream_blocks, ], ]), + "2a_12b_north---2a_12b_east": RegionConnection("2a_12b_north", "2a_12b_east", [[ItemName.dream_blocks, ], ]), + "2a_12b_south---2a_12b_north": RegionConnection("2a_12b_south", "2a_12b_north", [[ItemName.dream_blocks, ], ]), + "2a_12b_east---2a_12b_north": RegionConnection("2a_12b_east", "2a_12b_north", [[ItemName.dream_blocks, ], ]), + "2a_12b_south-east---2a_12b_north": RegionConnection("2a_12b_south-east", "2a_12b_north", []), + + + "2a_12d_north-west---2a_12d_north": RegionConnection("2a_12d_north-west", "2a_12d_north", []), + "2a_12d_north---2a_12d_north-west": RegionConnection("2a_12d_north", "2a_12d_north-west", []), + + "2a_12_west---2a_12_east": RegionConnection("2a_12_west", "2a_12_east", []), + "2a_12_east---2a_12_west": RegionConnection("2a_12_east", "2a_12_west", []), + + "2a_13_west---2a_13_phone": RegionConnection("2a_13_west", "2a_13_phone", []), + "2a_13_phone---2a_13_west": RegionConnection("2a_13_phone", "2a_13_west", []), + + "2a_end_0_main---2a_end_0_east": RegionConnection("2a_end_0_main", "2a_end_0_east", []), + "2a_end_0_top---2a_end_0_east": RegionConnection("2a_end_0_top", "2a_end_0_east", []), + "2a_end_0_top---2a_end_0_main": RegionConnection("2a_end_0_top", "2a_end_0_main", []), + "2a_end_0_east---2a_end_0_main": RegionConnection("2a_end_0_east", "2a_end_0_main", []), + "2a_end_0_east---2a_end_0_top": RegionConnection("2a_end_0_east", "2a_end_0_top", []), + + "2a_end_s0_bottom---2a_end_s0_top": RegionConnection("2a_end_s0_bottom", "2a_end_s0_top", []), + "2a_end_s0_top---2a_end_s0_bottom": RegionConnection("2a_end_s0_top", "2a_end_s0_bottom", []), + + + "2a_end_1_west---2a_end_1_east": RegionConnection("2a_end_1_west", "2a_end_1_east", []), + "2a_end_1_west---2a_end_1_north-east": RegionConnection("2a_end_1_west", "2a_end_1_north-east", []), + "2a_end_1_north-east---2a_end_1_west": RegionConnection("2a_end_1_north-east", "2a_end_1_west", []), + "2a_end_1_east---2a_end_1_west": RegionConnection("2a_end_1_east", "2a_end_1_west", []), + + "2a_end_2_north-west---2a_end_2_north-east": RegionConnection("2a_end_2_north-west", "2a_end_2_north-east", []), + "2a_end_2_west---2a_end_2_east": RegionConnection("2a_end_2_west", "2a_end_2_east", []), + "2a_end_2_north-east---2a_end_2_north-west": RegionConnection("2a_end_2_north-east", "2a_end_2_north-west", []), + "2a_end_2_east---2a_end_2_west": RegionConnection("2a_end_2_east", "2a_end_2_west", []), + + "2a_end_3_north-west---2a_end_3_west": RegionConnection("2a_end_3_north-west", "2a_end_3_west", []), + "2a_end_3_west---2a_end_3_east": RegionConnection("2a_end_3_west", "2a_end_3_east", []), + "2a_end_3_west---2a_end_3_north-west": RegionConnection("2a_end_3_west", "2a_end_3_north-west", []), + "2a_end_3_east---2a_end_3_west": RegionConnection("2a_end_3_east", "2a_end_3_west", []), + + "2a_end_4_west---2a_end_4_east": RegionConnection("2a_end_4_west", "2a_end_4_east", []), + "2a_end_4_east---2a_end_4_west": RegionConnection("2a_end_4_east", "2a_end_4_west", []), + + "2a_end_3b_west---2a_end_3b_north": RegionConnection("2a_end_3b_west", "2a_end_3b_north", [[ItemName.springs, ], ]), + "2a_end_3b_west---2a_end_3b_east": RegionConnection("2a_end_3b_west", "2a_end_3b_east", []), + "2a_end_3b_north---2a_end_3b_west": RegionConnection("2a_end_3b_north", "2a_end_3b_west", []), + "2a_end_3b_east---2a_end_3b_west": RegionConnection("2a_end_3b_east", "2a_end_3b_west", []), + + "2a_end_3cb_bottom---2a_end_3cb_top": RegionConnection("2a_end_3cb_bottom", "2a_end_3cb_top", []), + "2a_end_3cb_top---2a_end_3cb_bottom": RegionConnection("2a_end_3cb_top", "2a_end_3cb_bottom", []), + + + "2a_end_5_west---2a_end_5_east": RegionConnection("2a_end_5_west", "2a_end_5_east", []), + "2a_end_5_east---2a_end_5_west": RegionConnection("2a_end_5_east", "2a_end_5_west", []), + + "2a_end_6_west---2a_end_6_main": RegionConnection("2a_end_6_west", "2a_end_6_main", []), + "2a_end_6_main---2a_end_6_west": RegionConnection("2a_end_6_main", "2a_end_6_west", []), + + "2b_start_west---2b_start_east": RegionConnection("2b_start_west", "2b_start_east", []), + "2b_start_east---2b_start_west": RegionConnection("2b_start_east", "2b_start_west", []), + + "2b_00_west---2b_00_east": RegionConnection("2b_00_west", "2b_00_east", [[ItemName.dream_blocks, ], ]), + "2b_00_east---2b_00_west": RegionConnection("2b_00_east", "2b_00_west", [[ItemName.dream_blocks, ], ]), + + "2b_01_west---2b_01_east": RegionConnection("2b_01_west", "2b_01_east", [[ItemName.dream_blocks, ], ]), + "2b_01_east---2b_01_west": RegionConnection("2b_01_east", "2b_01_west", [[ItemName.dream_blocks, ], ]), + + "2b_01b_west---2b_01b_east": RegionConnection("2b_01b_west", "2b_01b_east", [[ItemName.dream_blocks, ], ]), + "2b_01b_east---2b_01b_west": RegionConnection("2b_01b_east", "2b_01b_west", [[ItemName.cannot_access, ], ]), + + "2b_02b_west---2b_02b_east": RegionConnection("2b_02b_west", "2b_02b_east", [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + "2b_02b_east---2b_02b_west": RegionConnection("2b_02b_east", "2b_02b_west", [[ItemName.cannot_access, ], ]), + + "2b_02_west---2b_02_east": RegionConnection("2b_02_west", "2b_02_east", [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + "2b_02_east---2b_02_west": RegionConnection("2b_02_east", "2b_02_west", [[ItemName.cannot_access, ], ]), + + "2b_03_west---2b_03_east": RegionConnection("2b_03_west", "2b_03_east", [[ItemName.dream_blocks, ItemName.coins, ], ]), + "2b_03_east---2b_03_west": RegionConnection("2b_03_east", "2b_03_west", [[ItemName.cannot_access, ], ]), + + "2b_04_bottom---2b_04_top": RegionConnection("2b_04_bottom", "2b_04_top", [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + "2b_04_top---2b_04_bottom": RegionConnection("2b_04_top", "2b_04_bottom", [[ItemName.cannot_access, ], ]), + + "2b_05_bottom---2b_05_top": RegionConnection("2b_05_bottom", "2b_05_top", [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + "2b_05_top---2b_05_bottom": RegionConnection("2b_05_top", "2b_05_bottom", [[ItemName.cannot_access, ], ]), + + "2b_06_west---2b_06_east": RegionConnection("2b_06_west", "2b_06_east", [[ItemName.dream_blocks, ItemName.coins, ], ]), + "2b_06_east---2b_06_west": RegionConnection("2b_06_east", "2b_06_west", [[ItemName.cannot_access, ], ]), + + "2b_07_bottom---2b_07_top": RegionConnection("2b_07_bottom", "2b_07_top", [[ItemName.dream_blocks, ItemName.coins, ], ]), + "2b_07_top---2b_07_bottom": RegionConnection("2b_07_top", "2b_07_bottom", [[ItemName.cannot_access, ], ]), + + "2b_08b_west---2b_08b_east": RegionConnection("2b_08b_west", "2b_08b_east", [[ItemName.dream_blocks, ItemName.springs, ], ]), + "2b_08b_east---2b_08b_west": RegionConnection("2b_08b_east", "2b_08b_west", [[ItemName.cannot_access, ], ]), + + "2b_08_west---2b_08_east": RegionConnection("2b_08_west", "2b_08_east", [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + + "2b_09_west---2b_09_east": RegionConnection("2b_09_west", "2b_09_east", [[ItemName.dream_blocks, ], ]), + + "2b_10_west---2b_10_east": RegionConnection("2b_10_west", "2b_10_east", [[ItemName.dream_blocks, ItemName.coins, ], ]), + + "2b_11_bottom---2b_11_top": RegionConnection("2b_11_bottom", "2b_11_top", [[ItemName.springs, ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + + "2b_end_west---2b_end_goal": RegionConnection("2b_end_west", "2b_end_goal", [[ItemName.blue_cassette_blocks, ItemName.dash_refills, ], ]), + + "2c_00_west---2c_00_east": RegionConnection("2c_00_west", "2c_00_east", [[ItemName.dream_blocks, ], ]), + "2c_00_east---2c_00_west": RegionConnection("2c_00_east", "2c_00_west", [[ItemName.dream_blocks, ], ]), + + "2c_01_west---2c_01_east": RegionConnection("2c_01_west", "2c_01_east", [[ItemName.dream_blocks, ItemName.coins, ], ]), + + "2c_02_west---2c_02_goal": RegionConnection("2c_02_west", "2c_02_goal", [[ItemName.coins, ItemName.dream_blocks, ItemName.dash_refills, ], ]), + + "3a_s0_main---3a_s0_east": RegionConnection("3a_s0_main", "3a_s0_east", []), + "3a_s0_east---3a_s0_main": RegionConnection("3a_s0_east", "3a_s0_main", []), + + "3a_s1_west---3a_s1_east": RegionConnection("3a_s1_west", "3a_s1_east", []), + "3a_s1_west---3a_s1_north-east": RegionConnection("3a_s1_west", "3a_s1_north-east", []), + "3a_s1_east---3a_s1_west": RegionConnection("3a_s1_east", "3a_s1_west", []), + "3a_s1_north-east---3a_s1_west": RegionConnection("3a_s1_north-east", "3a_s1_west", []), + + "3a_s2_west---3a_s2_east": RegionConnection("3a_s2_west", "3a_s2_east", []), + "3a_s2_north-west---3a_s2_east": RegionConnection("3a_s2_north-west", "3a_s2_east", []), + "3a_s2_east---3a_s2_west": RegionConnection("3a_s2_east", "3a_s2_west", []), + "3a_s2_east---3a_s2_north-west": RegionConnection("3a_s2_east", "3a_s2_north-west", []), + + "3a_s3_west---3a_s3_east": RegionConnection("3a_s3_west", "3a_s3_east", [["Celestial Resort A - Front Door Key", ], ]), + "3a_s3_east---3a_s3_west": RegionConnection("3a_s3_east", "3a_s3_west", []), + + "3a_0x-a_west---3a_0x-a_east": RegionConnection("3a_0x-a_west", "3a_0x-a_east", []), + "3a_0x-a_east---3a_0x-a_west": RegionConnection("3a_0x-a_east", "3a_0x-a_west", []), + + "3a_00-a_west---3a_00-a_east": RegionConnection("3a_00-a_west", "3a_00-a_east", []), + "3a_00-a_east---3a_00-a_west": RegionConnection("3a_00-a_east", "3a_00-a_west", []), + + "3a_02-a_west---3a_02-a_main": RegionConnection("3a_02-a_west", "3a_02-a_main", [[ItemName.sinking_platforms, ], [ItemName.dash_refills, ], ]), + "3a_02-a_top---3a_02-a_west": RegionConnection("3a_02-a_top", "3a_02-a_west", [[ItemName.dash_refills, ], ]), + "3a_02-a_top---3a_02-a_main": RegionConnection("3a_02-a_top", "3a_02-a_main", [[ItemName.dash_refills, ], ]), + "3a_02-a_main---3a_02-a_top": RegionConnection("3a_02-a_main", "3a_02-a_top", [[ItemName.dash_refills, ], ]), + "3a_02-a_main---3a_02-a_east": RegionConnection("3a_02-a_main", "3a_02-a_east", [["Celestial Resort A - Hallway Key 1", ], ]), + "3a_02-a_east---3a_02-a_main": RegionConnection("3a_02-a_east", "3a_02-a_main", []), + + "3a_02-b_west---3a_02-b_east": RegionConnection("3a_02-b_west", "3a_02-b_east", []), + "3a_02-b_east---3a_02-b_west": RegionConnection("3a_02-b_east", "3a_02-b_west", []), + + "3a_01-b_west---3a_01-b_east": RegionConnection("3a_01-b_west", "3a_01-b_east", []), + "3a_01-b_north-west---3a_01-b_west": RegionConnection("3a_01-b_north-west", "3a_01-b_west", []), + "3a_01-b_east---3a_01-b_west": RegionConnection("3a_01-b_east", "3a_01-b_west", []), + "3a_01-b_east---3a_01-b_north-west": RegionConnection("3a_01-b_east", "3a_01-b_north-west", [[ItemName.springs, ], ]), + + "3a_00-b_south-west---3a_00-b_south-east": RegionConnection("3a_00-b_south-west", "3a_00-b_south-east", []), + "3a_00-b_south-east---3a_00-b_south-west": RegionConnection("3a_00-b_south-east", "3a_00-b_south-west", []), + "3a_00-b_west---3a_00-b_north-west": RegionConnection("3a_00-b_west", "3a_00-b_north-west", []), + "3a_00-b_north-west---3a_00-b_west": RegionConnection("3a_00-b_north-west", "3a_00-b_west", []), + "3a_00-b_east---3a_00-b_north": RegionConnection("3a_00-b_east", "3a_00-b_north", []), + "3a_00-b_north---3a_00-b_east": RegionConnection("3a_00-b_north", "3a_00-b_east", []), + + "3a_00-c_south-west---3a_00-c_south-east": RegionConnection("3a_00-c_south-west", "3a_00-c_south-east", [[ItemName.dash_refills, ], ]), + "3a_00-c_south-east---3a_00-c_south-west": RegionConnection("3a_00-c_south-east", "3a_00-c_south-west", [[ItemName.dash_refills, ], ]), + "3a_00-c_south-east---3a_00-c_north-east": RegionConnection("3a_00-c_south-east", "3a_00-c_north-east", []), + "3a_00-c_north-east---3a_00-c_south-east": RegionConnection("3a_00-c_north-east", "3a_00-c_south-east", []), + + "3a_0x-b_west---3a_0x-b_south-east": RegionConnection("3a_0x-b_west", "3a_0x-b_south-east", []), + "3a_0x-b_north-east---3a_0x-b_west": RegionConnection("3a_0x-b_north-east", "3a_0x-b_west", [[ItemName.dash_refills, ], ]), + + "3a_03-a_west---3a_03-a_east": RegionConnection("3a_03-a_west", "3a_03-a_east", [[ItemName.sinking_platforms, ], ]), + "3a_03-a_top---3a_03-a_east": RegionConnection("3a_03-a_top", "3a_03-a_east", []), + "3a_03-a_east---3a_03-a_top": RegionConnection("3a_03-a_east", "3a_03-a_top", []), + + + "3a_05-a_west---3a_05-a_east": RegionConnection("3a_05-a_west", "3a_05-a_east", [[ItemName.dash_refills, ItemName.moving_platforms, ], ]), + "3a_05-a_east---3a_05-a_west": RegionConnection("3a_05-a_east", "3a_05-a_west", [[ItemName.dash_refills, ItemName.moving_platforms, ], ]), + + "3a_06-a_west---3a_06-a_east": RegionConnection("3a_06-a_west", "3a_06-a_east", []), + + "3a_07-a_west---3a_07-a_east": RegionConnection("3a_07-a_west", "3a_07-a_east", [["Celestial Resort A - Hallway Key 2", ItemName.dash_refills, ], ]), + "3a_07-a_west---3a_07-a_top": RegionConnection("3a_07-a_west", "3a_07-a_top", []), + "3a_07-a_top---3a_07-a_west": RegionConnection("3a_07-a_top", "3a_07-a_west", []), + "3a_07-a_east---3a_07-a_west": RegionConnection("3a_07-a_east", "3a_07-a_west", [["Celestial Resort A - Hallway Key 2", ItemName.dash_refills, ], ]), + + "3a_07-b_bottom---3a_07-b_west": RegionConnection("3a_07-b_bottom", "3a_07-b_west", []), + "3a_07-b_west---3a_07-b_bottom": RegionConnection("3a_07-b_west", "3a_07-b_bottom", []), + "3a_07-b_east---3a_07-b_bottom": RegionConnection("3a_07-b_east", "3a_07-b_bottom", []), + + "3a_06-b_west---3a_06-b_east": RegionConnection("3a_06-b_west", "3a_06-b_east", []), + "3a_06-b_east---3a_06-b_west": RegionConnection("3a_06-b_east", "3a_06-b_west", []), + + "3a_06-c_south-west---3a_06-c_north-west": RegionConnection("3a_06-c_south-west", "3a_06-c_north-west", []), + "3a_06-c_south-west---3a_06-c_south-east": RegionConnection("3a_06-c_south-west", "3a_06-c_south-east", []), + "3a_06-c_north-west---3a_06-c_south-west": RegionConnection("3a_06-c_north-west", "3a_06-c_south-west", []), + "3a_06-c_south-east---3a_06-c_south-west": RegionConnection("3a_06-c_south-east", "3a_06-c_south-west", []), + "3a_06-c_south-east---3a_06-c_east": RegionConnection("3a_06-c_south-east", "3a_06-c_east", []), + "3a_06-c_east---3a_06-c_south-east": RegionConnection("3a_06-c_east", "3a_06-c_south-east", []), + + + "3a_08-c_west---3a_08-c_east": RegionConnection("3a_08-c_west", "3a_08-c_east", [[ItemName.coins, ItemName.moving_platforms, ItemName.springs, ], ]), + + "3a_08-b_east---3a_08-b_west": RegionConnection("3a_08-b_east", "3a_08-b_west", [[ItemName.sinking_platforms, ItemName.coins, ], ]), + + "3a_08-a_west---3a_08-a_east": RegionConnection("3a_08-a_west", "3a_08-a_east", []), + "3a_08-a_west---3a_08-a_bottom": RegionConnection("3a_08-a_west", "3a_08-a_bottom", [[ItemName.brown_clutter, ], [ItemName.green_clutter, ], [ItemName.pink_clutter, ], ]), + "3a_08-a_east---3a_08-a_west": RegionConnection("3a_08-a_east", "3a_08-a_west", []), + + "3a_09-b_west---3a_09-b_center": RegionConnection("3a_09-b_west", "3a_09-b_center", []), + "3a_09-b_north-west---3a_09-b_center": RegionConnection("3a_09-b_north-west", "3a_09-b_center", [["Celestial Resort A - Huge Mess Key", ], ]), + "3a_09-b_center---3a_09-b_west": RegionConnection("3a_09-b_center", "3a_09-b_west", []), + "3a_09-b_center---3a_09-b_north-west": RegionConnection("3a_09-b_center", "3a_09-b_north-west", [["Celestial Resort A - Huge Mess Key", ], ]), + "3a_09-b_center---3a_09-b_south-west": RegionConnection("3a_09-b_center", "3a_09-b_south-west", [[ItemName.brown_clutter, ], [ItemName.green_clutter, ], [ItemName.pink_clutter, ], ]), + "3a_09-b_center---3a_09-b_south": RegionConnection("3a_09-b_center", "3a_09-b_south", []), + "3a_09-b_center---3a_09-b_south-east": RegionConnection("3a_09-b_center", "3a_09-b_south-east", []), + "3a_09-b_center---3a_09-b_east": RegionConnection("3a_09-b_center", "3a_09-b_east", []), + "3a_09-b_center---3a_09-b_north-east-right": RegionConnection("3a_09-b_center", "3a_09-b_north-east-right", []), + "3a_09-b_center---3a_09-b_north-east-top": RegionConnection("3a_09-b_center", "3a_09-b_north-east-top", []), + "3a_09-b_center---3a_09-b_north": RegionConnection("3a_09-b_center", "3a_09-b_north", []), + "3a_09-b_south-west---3a_09-b_center": RegionConnection("3a_09-b_south-west", "3a_09-b_center", [[ItemName.brown_clutter, ], [ItemName.green_clutter, ], [ItemName.pink_clutter, ], ]), + "3a_09-b_south---3a_09-b_center": RegionConnection("3a_09-b_south", "3a_09-b_center", []), + "3a_09-b_south-east---3a_09-b_center": RegionConnection("3a_09-b_south-east", "3a_09-b_center", []), + "3a_09-b_east---3a_09-b_center": RegionConnection("3a_09-b_east", "3a_09-b_center", []), + "3a_09-b_north-east-right---3a_09-b_center": RegionConnection("3a_09-b_north-east-right", "3a_09-b_center", []), + "3a_09-b_north-east-top---3a_09-b_center": RegionConnection("3a_09-b_north-east-top", "3a_09-b_center", []), + "3a_09-b_north---3a_09-b_center": RegionConnection("3a_09-b_north", "3a_09-b_center", []), + + "3a_10-x_west---3a_10-x_south-east": RegionConnection("3a_10-x_west", "3a_10-x_south-east", []), + "3a_10-x_south-east---3a_10-x_west": RegionConnection("3a_10-x_south-east", "3a_10-x_west", [[ItemName.brown_clutter, ], ]), + "3a_10-x_north-east-top---3a_10-x_north-east-right": RegionConnection("3a_10-x_north-east-top", "3a_10-x_north-east-right", []), + "3a_10-x_north-east-right---3a_10-x_north-east-top": RegionConnection("3a_10-x_north-east-right", "3a_10-x_north-east-top", []), + + "3a_11-x_west---3a_11-x_south": RegionConnection("3a_11-x_west", "3a_11-x_south", [[ItemName.coins, ], ]), + + "3a_11-y_west---3a_11-y_east": RegionConnection("3a_11-y_west", "3a_11-y_east", []), + "3a_11-y_east---3a_11-y_east": RegionConnection("3a_11-y_east", "3a_11-y_east", []), + "3a_11-y_east---3a_11-y_south": RegionConnection("3a_11-y_east", "3a_11-y_south", []), + "3a_11-y_south---3a_11-y_east": RegionConnection("3a_11-y_south", "3a_11-y_east", []), + + + "3a_11-z_west---3a_11-z_east": RegionConnection("3a_11-z_west", "3a_11-z_east", [[ItemName.dash_refills, ], ]), + "3a_11-z_east---3a_11-z_west": RegionConnection("3a_11-z_east", "3a_11-z_west", [[ItemName.dash_refills, ], ]), + + "3a_10-z_bottom---3a_10-z_top": RegionConnection("3a_10-z_bottom", "3a_10-z_top", [[ItemName.sinking_platforms, ], ]), + "3a_10-z_top---3a_10-z_bottom": RegionConnection("3a_10-z_top", "3a_10-z_bottom", []), + + "3a_10-y_bottom---3a_10-y_top": RegionConnection("3a_10-y_bottom", "3a_10-y_top", []), + "3a_10-y_top---3a_10-y_bottom": RegionConnection("3a_10-y_top", "3a_10-y_bottom", []), + + "3a_10-c_south-east---3a_10-c_north-east": RegionConnection("3a_10-c_south-east", "3a_10-c_north-east", []), + "3a_10-c_north-east---3a_10-c_south-east": RegionConnection("3a_10-c_north-east", "3a_10-c_south-east", []), + "3a_10-c_north-west---3a_10-c_south-west": RegionConnection("3a_10-c_north-west", "3a_10-c_south-west", []), + "3a_10-c_south-west---3a_10-c_north-west": RegionConnection("3a_10-c_south-west", "3a_10-c_north-west", []), + + "3a_11-c_west---3a_11-c_east": RegionConnection("3a_11-c_west", "3a_11-c_east", []), + "3a_11-c_east---3a_11-c_west": RegionConnection("3a_11-c_east", "3a_11-c_west", []), + "3a_11-c_south-east---3a_11-c_south-west": RegionConnection("3a_11-c_south-east", "3a_11-c_south-west", []), + "3a_11-c_south-west---3a_11-c_south-east": RegionConnection("3a_11-c_south-west", "3a_11-c_south-east", []), + + "3a_12-c_west---3a_12-c_top": RegionConnection("3a_12-c_west", "3a_12-c_top", []), + "3a_12-c_top---3a_12-c_west": RegionConnection("3a_12-c_top", "3a_12-c_west", []), + + "3a_12-d_bottom---3a_12-d_top": RegionConnection("3a_12-d_bottom", "3a_12-d_top", []), + + "3a_11-d_west---3a_11-d_east": RegionConnection("3a_11-d_west", "3a_11-d_east", [[ItemName.cannot_access, ], ]), + "3a_11-d_east---3a_11-d_west": RegionConnection("3a_11-d_east", "3a_11-d_west", [[ItemName.dash_refills, ], ]), + + "3a_10-d_west---3a_10-d_main": RegionConnection("3a_10-d_west", "3a_10-d_main", [[ItemName.green_clutter, ], ]), + "3a_10-d_main---3a_10-d_west": RegionConnection("3a_10-d_main", "3a_10-d_west", []), + "3a_10-d_east---3a_10-d_main": RegionConnection("3a_10-d_east", "3a_10-d_main", []), + + "3a_11-b_west---3a_11-b_east": RegionConnection("3a_11-b_west", "3a_11-b_east", []), + "3a_11-b_north-west---3a_11-b_west": RegionConnection("3a_11-b_north-west", "3a_11-b_west", []), + "3a_11-b_east---3a_11-b_west": RegionConnection("3a_11-b_east", "3a_11-b_west", []), + "3a_11-b_east---3a_11-b_north-east": RegionConnection("3a_11-b_east", "3a_11-b_north-east", [[ItemName.pink_clutter, ], ]), + "3a_11-b_north-east---3a_11-b_east": RegionConnection("3a_11-b_north-east", "3a_11-b_east", [[ItemName.pink_clutter, ], ]), + + "3a_12-b_west---3a_12-b_east": RegionConnection("3a_12-b_west", "3a_12-b_east", []), + "3a_12-b_east---3a_12-b_west": RegionConnection("3a_12-b_east", "3a_12-b_west", []), + + "3a_13-b_top---3a_13-b_bottom": RegionConnection("3a_13-b_top", "3a_13-b_bottom", []), + "3a_13-b_bottom---3a_13-b_top": RegionConnection("3a_13-b_bottom", "3a_13-b_top", []), + + "3a_13-a_west---3a_13-a_east": RegionConnection("3a_13-a_west", "3a_13-a_east", []), + "3a_13-a_west---3a_13-a_south-west": RegionConnection("3a_13-a_west", "3a_13-a_south-west", [[ItemName.pink_clutter, ], ]), + "3a_13-a_south-west---3a_13-a_west": RegionConnection("3a_13-a_south-west", "3a_13-a_west", [[ItemName.pink_clutter, ], ]), + + "3a_13-x_west---3a_13-x_east": RegionConnection("3a_13-x_west", "3a_13-x_east", []), + "3a_13-x_east---3a_13-x_west": RegionConnection("3a_13-x_east", "3a_13-x_west", []), + + "3a_12-x_west---3a_12-x_east": RegionConnection("3a_12-x_west", "3a_12-x_east", []), + "3a_12-x_north-east---3a_12-x_east": RegionConnection("3a_12-x_north-east", "3a_12-x_east", []), + "3a_12-x_east---3a_12-x_west": RegionConnection("3a_12-x_east", "3a_12-x_west", []), + + "3a_11-a_west---3a_11-a_south": RegionConnection("3a_11-a_west", "3a_11-a_south", []), + "3a_11-a_south---3a_11-a_west": RegionConnection("3a_11-a_south", "3a_11-a_west", []), + "3a_11-a_south-east-bottom---3a_11-a_south-east-right": RegionConnection("3a_11-a_south-east-bottom", "3a_11-a_south-east-right", [[ItemName.pink_clutter, ], ]), + "3a_11-a_south-east-right---3a_11-a_south-east-bottom": RegionConnection("3a_11-a_south-east-right", "3a_11-a_south-east-bottom", [[ItemName.pink_clutter, ], ]), + + "3a_08-x_west---3a_08-x_east": RegionConnection("3a_08-x_west", "3a_08-x_east", []), + "3a_08-x_east---3a_08-x_west": RegionConnection("3a_08-x_east", "3a_08-x_west", []), + + "3a_09-d_bottom---3a_09-d_top": RegionConnection("3a_09-d_bottom", "3a_09-d_top", []), + + "3a_08-d_east---3a_08-d_west": RegionConnection("3a_08-d_east", "3a_08-d_west", [[ItemName.dash_refills, ItemName.coins, ], ]), + + "3a_06-d_east---3a_06-d_west": RegionConnection("3a_06-d_east", "3a_06-d_west", [[ItemName.dash_refills, ], ]), + + "3a_04-d_west---3a_04-d_west": RegionConnection("3a_04-d_west", "3a_04-d_west", []), + "3a_04-d_south-west---3a_04-d_west": RegionConnection("3a_04-d_south-west", "3a_04-d_west", []), + "3a_04-d_south---3a_04-d_south-west": RegionConnection("3a_04-d_south", "3a_04-d_south-west", [[ItemName.cannot_access, ], ]), + "3a_04-d_east---3a_04-d_south": RegionConnection("3a_04-d_east", "3a_04-d_south", [[ItemName.dash_refills, ], ]), + + "3a_04-c_west---3a_04-c_north-west": RegionConnection("3a_04-c_west", "3a_04-c_north-west", [["Celestial Resort A - Presidential Suite Key", ], ]), + "3a_04-c_west---3a_04-c_east": RegionConnection("3a_04-c_west", "3a_04-c_east", []), + "3a_04-c_north-west---3a_04-c_west": RegionConnection("3a_04-c_north-west", "3a_04-c_west", [["Celestial Resort A - Presidential Suite Key", ], ]), + "3a_04-c_east---3a_04-c_west": RegionConnection("3a_04-c_east", "3a_04-c_west", []), + + "3a_02-c_west---3a_02-c_east": RegionConnection("3a_02-c_west", "3a_02-c_east", []), + "3a_02-c_east---3a_02-c_west": RegionConnection("3a_02-c_east", "3a_02-c_west", [[ItemName.sinking_platforms, ], ]), + "3a_02-c_east---3a_02-c_south-east": RegionConnection("3a_02-c_east", "3a_02-c_south-east", []), + "3a_02-c_south-east---3a_02-c_east": RegionConnection("3a_02-c_south-east", "3a_02-c_east", []), + + "3a_03-b_west---3a_03-b_east": RegionConnection("3a_03-b_west", "3a_03-b_east", []), + "3a_03-b_east---3a_03-b_west": RegionConnection("3a_03-b_east", "3a_03-b_west", []), + "3a_03-b_east---3a_03-b_north": RegionConnection("3a_03-b_east", "3a_03-b_north", []), + "3a_03-b_north---3a_03-b_east": RegionConnection("3a_03-b_north", "3a_03-b_east", []), + + + "3a_02-d_west---3a_02-d_east": RegionConnection("3a_02-d_west", "3a_02-d_east", [[ItemName.cannot_access, ], ]), + "3a_02-d_east---3a_02-d_west": RegionConnection("3a_02-d_east", "3a_02-d_west", [[ItemName.dash_refills, ], ]), + + "3a_00-d_west---3a_00-d_east": RegionConnection("3a_00-d_west", "3a_00-d_east", []), + "3a_00-d_east---3a_00-d_west": RegionConnection("3a_00-d_east", "3a_00-d_west", []), + + "3a_roof00_west---3a_roof00_east": RegionConnection("3a_roof00_west", "3a_roof00_east", []), + "3a_roof00_east---3a_roof00_west": RegionConnection("3a_roof00_east", "3a_roof00_west", []), + + "3a_roof01_west---3a_roof01_east": RegionConnection("3a_roof01_west", "3a_roof01_east", [[ItemName.springs, ], ]), + + "3a_roof02_west---3a_roof02_east": RegionConnection("3a_roof02_west", "3a_roof02_east", []), + "3a_roof02_east---3a_roof02_west": RegionConnection("3a_roof02_east", "3a_roof02_west", []), + + "3a_roof03_west---3a_roof03_east": RegionConnection("3a_roof03_west", "3a_roof03_east", [[ItemName.springs, ItemName.coins, ItemName.dash_refills, ], ]), + + "3a_roof04_west---3a_roof04_east": RegionConnection("3a_roof04_west", "3a_roof04_east", []), + "3a_roof04_east---3a_roof04_west": RegionConnection("3a_roof04_east", "3a_roof04_west", []), + + "3a_roof05_west---3a_roof05_east": RegionConnection("3a_roof05_west", "3a_roof05_east", [[ItemName.springs, ], ]), + + "3a_roof06b_west---3a_roof06b_east": RegionConnection("3a_roof06b_west", "3a_roof06b_east", [[ItemName.dash_refills, ], ]), + "3a_roof06b_east---3a_roof06b_west": RegionConnection("3a_roof06b_east", "3a_roof06b_west", [[ItemName.dash_refills, ], ]), + + "3a_roof06_west---3a_roof06_east": RegionConnection("3a_roof06_west", "3a_roof06_east", []), + "3a_roof06_east---3a_roof06_west": RegionConnection("3a_roof06_east", "3a_roof06_west", []), + + "3a_roof07_west---3a_roof07_main": RegionConnection("3a_roof07_west", "3a_roof07_main", []), + "3a_roof07_main---3a_roof07_west": RegionConnection("3a_roof07_main", "3a_roof07_west", []), + + "3b_00_west---3b_00_east": RegionConnection("3b_00_west", "3b_00_east", []), + "3b_00_east---3b_00_west": RegionConnection("3b_00_east", "3b_00_west", []), + + + "3b_01_west---3b_01_east": RegionConnection("3b_01_west", "3b_01_east", [[ItemName.dash_refills, ], ]), + "3b_01_east---3b_01_west": RegionConnection("3b_01_east", "3b_01_west", [[ItemName.dash_refills, ], ]), + + "3b_02_west---3b_02_east": RegionConnection("3b_02_west", "3b_02_east", []), + "3b_02_east---3b_02_west": RegionConnection("3b_02_east", "3b_02_west", []), + + "3b_03_west---3b_03_east": RegionConnection("3b_03_west", "3b_03_east", [[ItemName.dash_refills, ], ]), + "3b_03_east---3b_03_west": RegionConnection("3b_03_east", "3b_03_west", [[ItemName.dash_refills, ], ]), + + "3b_04_west---3b_04_east": RegionConnection("3b_04_west", "3b_04_east", [[ItemName.dash_refills, ], ]), + "3b_04_east---3b_04_west": RegionConnection("3b_04_east", "3b_04_west", [[ItemName.dash_refills, ], ]), + + "3b_05_west---3b_05_east": RegionConnection("3b_05_west", "3b_05_east", [[ItemName.moving_platforms, ItemName.coins, ItemName.springs, ], ]), + + "3b_06_west---3b_06_east": RegionConnection("3b_06_west", "3b_06_east", [[ItemName.sinking_platforms, ], ]), + "3b_06_east---3b_06_west": RegionConnection("3b_06_east", "3b_06_west", [[ItemName.sinking_platforms, ], ]), + + "3b_07_west---3b_07_east": RegionConnection("3b_07_west", "3b_07_east", []), + "3b_07_east---3b_07_west": RegionConnection("3b_07_east", "3b_07_west", []), + + "3b_08_bottom---3b_08_top": RegionConnection("3b_08_bottom", "3b_08_top", [[ItemName.dash_refills, ], ]), + "3b_08_top---3b_08_bottom": RegionConnection("3b_08_top", "3b_08_bottom", []), + + "3b_09_west---3b_09_east": RegionConnection("3b_09_west", "3b_09_east", []), + "3b_09_east---3b_09_east": RegionConnection("3b_09_east", "3b_09_east", []), + + "3b_10_west---3b_10_east": RegionConnection("3b_10_west", "3b_10_east", [[ItemName.dash_refills, ], ]), + + "3b_11_west---3b_11_east": RegionConnection("3b_11_west", "3b_11_east", [[ItemName.dash_refills, ], ]), + "3b_11_east---3b_11_west": RegionConnection("3b_11_east", "3b_11_west", [[ItemName.dash_refills, ], ]), + + "3b_13_west---3b_13_east": RegionConnection("3b_13_west", "3b_13_east", [[ItemName.springs, ], ]), + "3b_13_east---3b_13_west": RegionConnection("3b_13_east", "3b_13_west", [[ItemName.springs, ], ]), + + "3b_14_west---3b_14_east": RegionConnection("3b_14_west", "3b_14_east", [[ItemName.dash_refills, ], ]), + "3b_14_east---3b_14_west": RegionConnection("3b_14_east", "3b_14_west", [[ItemName.dash_refills, ], ]), + + "3b_15_west---3b_15_east": RegionConnection("3b_15_west", "3b_15_east", []), + "3b_15_east---3b_15_west": RegionConnection("3b_15_east", "3b_15_west", []), + + "3b_12_west---3b_12_east": RegionConnection("3b_12_west", "3b_12_east", [[ItemName.springs, ], ]), + "3b_12_east---3b_12_west": RegionConnection("3b_12_east", "3b_12_west", [[ItemName.springs, ], ]), + + "3b_16_west---3b_16_top": RegionConnection("3b_16_west", "3b_16_top", []), + "3b_16_top---3b_16_west": RegionConnection("3b_16_top", "3b_16_west", []), + + "3b_17_west---3b_17_east": RegionConnection("3b_17_west", "3b_17_east", [[ItemName.dash_refills, ItemName.springs, ], ]), + "3b_17_east---3b_17_west": RegionConnection("3b_17_east", "3b_17_west", [[ItemName.dash_refills, ItemName.springs, ], ]), + + "3b_18_west---3b_18_east": RegionConnection("3b_18_west", "3b_18_east", []), + "3b_18_east---3b_18_west": RegionConnection("3b_18_east", "3b_18_west", []), + + "3b_19_west---3b_19_east": RegionConnection("3b_19_west", "3b_19_east", [[ItemName.springs, ItemName.dash_refills, ], ]), + "3b_19_east---3b_19_west": RegionConnection("3b_19_east", "3b_19_west", [[ItemName.springs, ItemName.dash_refills, ], ]), + + "3b_21_west---3b_21_east": RegionConnection("3b_21_west", "3b_21_east", [[ItemName.dash_refills, ], ]), + "3b_21_east---3b_21_west": RegionConnection("3b_21_east", "3b_21_west", [[ItemName.dash_refills, ], ]), + + "3b_20_west---3b_20_east": RegionConnection("3b_20_west", "3b_20_east", [[ItemName.dash_refills, ItemName.coins, ], ]), + + "3b_end_west---3b_end_goal": RegionConnection("3b_end_west", "3b_end_goal", [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ItemName.springs, ItemName.coins, ], ]), + + "3c_00_west---3c_00_east": RegionConnection("3c_00_west", "3c_00_east", [[ItemName.dash_refills, ], ]), + "3c_00_east---3c_00_west": RegionConnection("3c_00_east", "3c_00_west", [[ItemName.dash_refills, ], ]), + + "3c_01_west---3c_01_east": RegionConnection("3c_01_west", "3c_01_east", [[ItemName.sinking_platforms, ], ]), + + "3c_02_west---3c_02_goal": RegionConnection("3c_02_west", "3c_02_goal", [[ItemName.coins, ItemName.dash_refills, ], ]), + + "4a_a-00_west---4a_a-00_east": RegionConnection("4a_a-00_west", "4a_a-00_east", [[ItemName.blue_clouds, ], ]), + "4a_a-00_east---4a_a-00_west": RegionConnection("4a_a-00_east", "4a_a-00_west", []), + + "4a_a-01_west---4a_a-01_east": RegionConnection("4a_a-01_west", "4a_a-01_east", [[ItemName.blue_boosters, ], ]), + "4a_a-01_east---4a_a-01_west": RegionConnection("4a_a-01_east", "4a_a-01_west", [[ItemName.blue_boosters, ], ]), + + "4a_a-01x_west---4a_a-01x_east": RegionConnection("4a_a-01x_west", "4a_a-01x_east", [[ItemName.blue_boosters, ], ]), + "4a_a-01x_east---4a_a-01x_west": RegionConnection("4a_a-01x_east", "4a_a-01x_west", [[ItemName.blue_boosters, ], ]), + + "4a_a-02_west---4a_a-02_east": RegionConnection("4a_a-02_west", "4a_a-02_east", []), + "4a_a-02_east---4a_a-02_west": RegionConnection("4a_a-02_east", "4a_a-02_west", []), + + "4a_a-03_west---4a_a-03_east": RegionConnection("4a_a-03_west", "4a_a-03_east", [[ItemName.blue_boosters, ], ]), + "4a_a-03_east---4a_a-03_west": RegionConnection("4a_a-03_east", "4a_a-03_west", [[ItemName.blue_boosters, ], ]), + + "4a_a-04_west---4a_a-04_east": RegionConnection("4a_a-04_west", "4a_a-04_east", [[ItemName.blue_clouds, ItemName.pink_clouds, ], ]), + "4a_a-04_east---4a_a-04_west": RegionConnection("4a_a-04_east", "4a_a-04_west", [[ItemName.blue_clouds, ], ]), + + "4a_a-05_west---4a_a-05_east": RegionConnection("4a_a-05_west", "4a_a-05_east", [[ItemName.moving_platforms, ], ]), + "4a_a-05_east---4a_a-05_west": RegionConnection("4a_a-05_east", "4a_a-05_west", [[ItemName.moving_platforms, ], ]), + + "4a_a-06_west---4a_a-06_east": RegionConnection("4a_a-06_west", "4a_a-06_east", []), + "4a_a-06_east---4a_a-06_west": RegionConnection("4a_a-06_east", "4a_a-06_west", []), + + "4a_a-07_west---4a_a-07_east": RegionConnection("4a_a-07_west", "4a_a-07_east", [[ItemName.blue_boosters, ItemName.coins, ], ]), + + "4a_a-08_west---4a_a-08_north-west": RegionConnection("4a_a-08_west", "4a_a-08_north-west", [[ItemName.blue_clouds, ItemName.blue_boosters, ], ]), + "4a_a-08_west---4a_a-08_east": RegionConnection("4a_a-08_west", "4a_a-08_east", [[ItemName.blue_clouds, ], ]), + "4a_a-08_north-west---4a_a-08_west": RegionConnection("4a_a-08_north-west", "4a_a-08_west", []), + "4a_a-08_east---4a_a-08_west": RegionConnection("4a_a-08_east", "4a_a-08_west", [[ItemName.blue_clouds, ], ]), + + "4a_a-10_west---4a_a-10_east": RegionConnection("4a_a-10_west", "4a_a-10_east", []), + "4a_a-10_east---4a_a-10_west": RegionConnection("4a_a-10_east", "4a_a-10_west", []), + + + "4a_a-09_bottom---4a_a-09_top": RegionConnection("4a_a-09_bottom", "4a_a-09_top", []), + "4a_a-09_top---4a_a-09_bottom": RegionConnection("4a_a-09_top", "4a_a-09_bottom", []), + + "4a_b-00_south---4a_b-00_south-east": RegionConnection("4a_b-00_south", "4a_b-00_south-east", []), + "4a_b-00_south---4a_b-00_west": RegionConnection("4a_b-00_south", "4a_b-00_west", [[ItemName.move_blocks, ], ]), + "4a_b-00_south---4a_b-00_east": RegionConnection("4a_b-00_south", "4a_b-00_east", [[ItemName.move_blocks, ], ]), + "4a_b-00_south---4a_b-00_north-east": RegionConnection("4a_b-00_south", "4a_b-00_north-east", [[ItemName.move_blocks, ], ]), + "4a_b-00_south-east---4a_b-00_south": RegionConnection("4a_b-00_south-east", "4a_b-00_south", []), + "4a_b-00_east---4a_b-00_south": RegionConnection("4a_b-00_east", "4a_b-00_south", []), + "4a_b-00_east---4a_b-00_north-west": RegionConnection("4a_b-00_east", "4a_b-00_north-west", []), + "4a_b-00_west---4a_b-00_south": RegionConnection("4a_b-00_west", "4a_b-00_south", []), + "4a_b-00_west---4a_b-00_north-west": RegionConnection("4a_b-00_west", "4a_b-00_north-west", []), + "4a_b-00_north-west---4a_b-00_south": RegionConnection("4a_b-00_north-west", "4a_b-00_south", []), + "4a_b-00_north-west---4a_b-00_north": RegionConnection("4a_b-00_north-west", "4a_b-00_north", []), + "4a_b-00_north---4a_b-00_north-west": RegionConnection("4a_b-00_north", "4a_b-00_north-west", []), + + + "4a_b-04_north-west---4a_b-04_east": RegionConnection("4a_b-04_north-west", "4a_b-04_east", []), + "4a_b-04_east---4a_b-04_west": RegionConnection("4a_b-04_east", "4a_b-04_west", [[ItemName.move_blocks, ], ]), + + "4a_b-06_west---4a_b-06_east": RegionConnection("4a_b-06_west", "4a_b-06_east", [[ItemName.cannot_access, ], ]), + "4a_b-06_east---4a_b-06_west": RegionConnection("4a_b-06_east", "4a_b-06_west", [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + + "4a_b-07_west---4a_b-07_east": RegionConnection("4a_b-07_west", "4a_b-07_east", [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + + "4a_b-03_west---4a_b-03_east": RegionConnection("4a_b-03_west", "4a_b-03_east", []), + "4a_b-03_east---4a_b-03_west": RegionConnection("4a_b-03_east", "4a_b-03_west", []), + + "4a_b-02_north-west---4a_b-02_north-east": RegionConnection("4a_b-02_north-west", "4a_b-02_north-east", []), + "4a_b-02_north-west---4a_b-02_north": RegionConnection("4a_b-02_north-west", "4a_b-02_north", []), + "4a_b-02_north-east---4a_b-02_north-west": RegionConnection("4a_b-02_north-east", "4a_b-02_north-west", []), + "4a_b-02_north---4a_b-02_north-west": RegionConnection("4a_b-02_north", "4a_b-02_north-west", []), + + "4a_b-sec_west---4a_b-sec_east": RegionConnection("4a_b-sec_west", "4a_b-sec_east", []), + "4a_b-sec_east---4a_b-sec_west": RegionConnection("4a_b-sec_east", "4a_b-sec_west", []), + + + "4a_b-05_center---4a_b-05_west": RegionConnection("4a_b-05_center", "4a_b-05_west", [[ItemName.pink_clouds, ItemName.move_blocks, ], ]), + "4a_b-05_north-east---4a_b-05_east": RegionConnection("4a_b-05_north-east", "4a_b-05_east", []), + "4a_b-05_east---4a_b-05_north-east": RegionConnection("4a_b-05_east", "4a_b-05_north-east", [[ItemName.move_blocks, ], ]), + + "4a_b-08b_west---4a_b-08b_east": RegionConnection("4a_b-08b_west", "4a_b-08b_east", [[ItemName.move_blocks, ItemName.dash_refills, ], ]), + "4a_b-08b_east---4a_b-08b_west": RegionConnection("4a_b-08b_east", "4a_b-08b_west", [[ItemName.dash_refills, ], ]), + + "4a_b-08_west---4a_b-08_east": RegionConnection("4a_b-08_west", "4a_b-08_east", [[ItemName.move_blocks, ItemName.blue_clouds, ], ]), + + "4a_c-00_west---4a_c-00_east": RegionConnection("4a_c-00_west", "4a_c-00_east", [[ItemName.blue_boosters, ], ]), + "4a_c-00_west---4a_c-00_north-west": RegionConnection("4a_c-00_west", "4a_c-00_north-west", []), + "4a_c-00_east---4a_c-00_west": RegionConnection("4a_c-00_east", "4a_c-00_west", [[ItemName.blue_boosters, ], ]), + "4a_c-00_north-west---4a_c-00_west": RegionConnection("4a_c-00_north-west", "4a_c-00_west", []), + + + "4a_c-02_west---4a_c-02_east": RegionConnection("4a_c-02_west", "4a_c-02_east", [[ItemName.blue_boosters, ], ]), + "4a_c-02_east---4a_c-02_west": RegionConnection("4a_c-02_east", "4a_c-02_west", [[ItemName.blue_boosters, ], ]), + + "4a_c-04_west---4a_c-04_east": RegionConnection("4a_c-04_west", "4a_c-04_east", [[ItemName.pink_clouds, ], ]), + + "4a_c-05_west---4a_c-05_east": RegionConnection("4a_c-05_west", "4a_c-05_east", [[ItemName.blue_boosters, ItemName.move_blocks, ], ]), + "4a_c-05_east---4a_c-05_west": RegionConnection("4a_c-05_east", "4a_c-05_west", [[ItemName.cannot_access, ], ]), + + "4a_c-06_bottom---4a_c-06_west": RegionConnection("4a_c-06_bottom", "4a_c-06_west", [[ItemName.blue_boosters, ItemName.blue_clouds, ItemName.move_blocks, ], ]), + "4a_c-06_west---4a_c-06_bottom": RegionConnection("4a_c-06_west", "4a_c-06_bottom", []), + "4a_c-06_west---4a_c-06_top": RegionConnection("4a_c-06_west", "4a_c-06_top", [[ItemName.move_blocks, ], ]), + + + "4a_c-09_west---4a_c-09_east": RegionConnection("4a_c-09_west", "4a_c-09_east", [[ItemName.coins, ItemName.move_blocks, ], ]), + + "4a_c-07_west---4a_c-07_east": RegionConnection("4a_c-07_west", "4a_c-07_east", []), + + "4a_c-08_bottom---4a_c-08_east": RegionConnection("4a_c-08_bottom", "4a_c-08_east", [[ItemName.springs, ], ]), + "4a_c-08_east---4a_c-08_bottom": RegionConnection("4a_c-08_east", "4a_c-08_bottom", []), + "4a_c-08_east---4a_c-08_top": RegionConnection("4a_c-08_east", "4a_c-08_top", [[ItemName.blue_boosters, ], ]), + "4a_c-08_top---4a_c-08_east": RegionConnection("4a_c-08_top", "4a_c-08_east", []), + + "4a_c-10_bottom---4a_c-10_top": RegionConnection("4a_c-10_bottom", "4a_c-10_top", [[ItemName.blue_boosters, ], ]), + "4a_c-10_top---4a_c-10_bottom": RegionConnection("4a_c-10_top", "4a_c-10_bottom", [[ItemName.blue_boosters, ], ]), + + "4a_d-00_west---4a_d-00_east": RegionConnection("4a_d-00_west", "4a_d-00_east", []), + "4a_d-00_west---4a_d-00_south": RegionConnection("4a_d-00_west", "4a_d-00_south", []), + "4a_d-00_west---4a_d-00_north-west": RegionConnection("4a_d-00_west", "4a_d-00_north-west", []), + "4a_d-00_south---4a_d-00_west": RegionConnection("4a_d-00_south", "4a_d-00_west", []), + "4a_d-00_east---4a_d-00_west": RegionConnection("4a_d-00_east", "4a_d-00_west", []), + "4a_d-00_north-west---4a_d-00_west": RegionConnection("4a_d-00_north-west", "4a_d-00_west", []), + + + "4a_d-01_west---4a_d-01_east": RegionConnection("4a_d-01_west", "4a_d-01_east", []), + "4a_d-01_east---4a_d-01_west": RegionConnection("4a_d-01_east", "4a_d-01_west", []), + + "4a_d-02_west---4a_d-02_east": RegionConnection("4a_d-02_west", "4a_d-02_east", [[ItemName.move_blocks, ItemName.coins, ItemName.pink_clouds, ItemName.blue_boosters, ], ]), + + "4a_d-03_west---4a_d-03_east": RegionConnection("4a_d-03_west", "4a_d-03_east", []), + "4a_d-03_east---4a_d-03_west": RegionConnection("4a_d-03_east", "4a_d-03_west", []), + + "4a_d-04_west---4a_d-04_east": RegionConnection("4a_d-04_west", "4a_d-04_east", []), + "4a_d-04_east---4a_d-04_west": RegionConnection("4a_d-04_east", "4a_d-04_west", []), + + "4a_d-05_west---4a_d-05_east": RegionConnection("4a_d-05_west", "4a_d-05_east", []), + "4a_d-05_east---4a_d-05_west": RegionConnection("4a_d-05_east", "4a_d-05_west", []), + + "4a_d-06_west---4a_d-06_east": RegionConnection("4a_d-06_west", "4a_d-06_east", [[ItemName.blue_boosters, ], ]), + "4a_d-06_east---4a_d-06_west": RegionConnection("4a_d-06_east", "4a_d-06_west", []), + + "4a_d-07_west---4a_d-07_east": RegionConnection("4a_d-07_west", "4a_d-07_east", [[ItemName.blue_boosters, ], ]), + "4a_d-07_east---4a_d-07_west": RegionConnection("4a_d-07_east", "4a_d-07_west", [[ItemName.blue_boosters, ], ]), + + "4a_d-08_west---4a_d-08_east": RegionConnection("4a_d-08_west", "4a_d-08_east", [[ItemName.blue_clouds, ItemName.blue_boosters, ], ]), + + "4a_d-09_west---4a_d-09_east": RegionConnection("4a_d-09_west", "4a_d-09_east", [[ItemName.blue_boosters, ], ]), + "4a_d-09_east---4a_d-09_west": RegionConnection("4a_d-09_east", "4a_d-09_west", [[ItemName.blue_boosters, ], ]), + + "4a_d-10_west---4a_d-10_goal": RegionConnection("4a_d-10_west", "4a_d-10_goal", []), + + "4b_a-00_west---4b_a-00_east": RegionConnection("4b_a-00_west", "4b_a-00_east", [[ItemName.blue_boosters, ], ]), + "4b_a-00_east---4b_a-00_west": RegionConnection("4b_a-00_east", "4b_a-00_west", [[ItemName.blue_boosters, ], ]), + + "4b_a-01_west---4b_a-01_east": RegionConnection("4b_a-01_west", "4b_a-01_east", [[ItemName.moving_platforms, ], ]), + "4b_a-01_east---4b_a-01_west": RegionConnection("4b_a-01_east", "4b_a-01_west", [[ItemName.moving_platforms, ], ]), + + "4b_a-02_west---4b_a-02_east": RegionConnection("4b_a-02_west", "4b_a-02_east", [[ItemName.blue_boosters, ], ]), + + "4b_a-03_west---4b_a-03_east": RegionConnection("4b_a-03_west", "4b_a-03_east", [[ItemName.springs, ItemName.move_blocks, ItemName.blue_boosters, ], ]), + + "4b_a-04_west---4b_a-04_east": RegionConnection("4b_a-04_west", "4b_a-04_east", [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + + "4b_b-00_west---4b_b-00_east": RegionConnection("4b_b-00_west", "4b_b-00_east", [[ItemName.blue_boosters, ], ]), + + "4b_b-01_west---4b_b-01_east": RegionConnection("4b_b-01_west", "4b_b-01_east", [[ItemName.blue_boosters, ], ]), + "4b_b-01_east---4b_b-01_west": RegionConnection("4b_b-01_east", "4b_b-01_west", [[ItemName.cannot_access, ], ]), + + "4b_b-02_bottom---4b_b-02_top": RegionConnection("4b_b-02_bottom", "4b_b-02_top", [[ItemName.move_blocks, ItemName.springs, ItemName.dash_refills, ], ]), + "4b_b-02_top---4b_b-02_bottom": RegionConnection("4b_b-02_top", "4b_b-02_bottom", []), + + "4b_b-03_west---4b_b-03_east": RegionConnection("4b_b-03_west", "4b_b-03_east", [[ItemName.coins, ItemName.moving_platforms, ItemName.springs, ItemName.blue_boosters, ], ]), + + "4b_b-04_west---4b_b-04_east": RegionConnection("4b_b-04_west", "4b_b-04_east", [[ItemName.blue_boosters, ], ]), + + "4b_c-00_west---4b_c-00_east": RegionConnection("4b_c-00_west", "4b_c-00_east", [[ItemName.blue_boosters, ], ]), + + "4b_c-01_west---4b_c-01_east": RegionConnection("4b_c-01_west", "4b_c-01_east", [[ItemName.moving_platforms, ], ]), + "4b_c-01_east---4b_c-01_west": RegionConnection("4b_c-01_east", "4b_c-01_west", [[ItemName.cannot_access, ], ]), + + "4b_c-02_west---4b_c-02_east": RegionConnection("4b_c-02_west", "4b_c-02_east", [[ItemName.move_blocks, ], ]), + + "4b_c-03_bottom---4b_c-03_top": RegionConnection("4b_c-03_bottom", "4b_c-03_top", [[ItemName.move_blocks, ItemName.blue_clouds, ], ]), + "4b_c-03_top---4b_c-03_bottom": RegionConnection("4b_c-03_top", "4b_c-03_bottom", [[ItemName.blue_clouds, ], ]), + + "4b_c-04_west---4b_c-04_east": RegionConnection("4b_c-04_west", "4b_c-04_east", [[ItemName.blue_boosters, ], ]), + "4b_c-04_east---4b_c-04_west": RegionConnection("4b_c-04_east", "4b_c-04_west", []), + + "4b_d-00_west---4b_d-00_east": RegionConnection("4b_d-00_west", "4b_d-00_east", [[ItemName.blue_clouds, ], ]), + "4b_d-00_east---4b_d-00_west": RegionConnection("4b_d-00_east", "4b_d-00_west", [[ItemName.blue_clouds, ], ]), + + "4b_d-01_west---4b_d-01_east": RegionConnection("4b_d-01_west", "4b_d-01_east", [[ItemName.pink_clouds, ItemName.blue_boosters, ], ]), + "4b_d-01_east---4b_d-01_west": RegionConnection("4b_d-01_east", "4b_d-01_west", [[ItemName.cannot_access, ], ]), + + "4b_d-02_west---4b_d-02_east": RegionConnection("4b_d-02_west", "4b_d-02_east", [[ItemName.dash_refills, ItemName.blue_boosters, ItemName.coins, ], ]), + "4b_d-02_east---4b_d-02_west": RegionConnection("4b_d-02_east", "4b_d-02_west", [[ItemName.cannot_access, ], ]), + + "4b_d-03_west---4b_d-03_east": RegionConnection("4b_d-03_west", "4b_d-03_east", [[ItemName.blue_boosters, ], ]), + + "4b_end_west---4b_end_goal": RegionConnection("4b_end_west", "4b_end_goal", [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ItemName.blue_boosters, ], ]), + + "4c_00_west---4c_00_east": RegionConnection("4c_00_west", "4c_00_east", [[ItemName.blue_boosters, ], ]), + + "4c_01_west---4c_01_east": RegionConnection("4c_01_west", "4c_01_east", [[ItemName.move_blocks, ItemName.dash_refills, ], ]), + "4c_01_east---4c_01_west": RegionConnection("4c_01_east", "4c_01_west", [[ItemName.cannot_access, ], ]), + + "4c_02_west---4c_02_goal": RegionConnection("4c_02_west", "4c_02_goal", [[ItemName.pink_clouds, ItemName.blue_boosters, ItemName.move_blocks, ], ]), + + "5a_a-00b_west---5a_a-00b_east": RegionConnection("5a_a-00b_west", "5a_a-00b_east", []), + "5a_a-00b_east---5a_a-00b_west": RegionConnection("5a_a-00b_east", "5a_a-00b_west", []), + + + "5a_a-00d_west---5a_a-00d_east": RegionConnection("5a_a-00d_west", "5a_a-00d_east", []), + "5a_a-00d_east---5a_a-00d_west": RegionConnection("5a_a-00d_east", "5a_a-00d_west", []), + + "5a_a-00c_west---5a_a-00c_east": RegionConnection("5a_a-00c_west", "5a_a-00c_east", []), + "5a_a-00c_east---5a_a-00c_west": RegionConnection("5a_a-00c_east", "5a_a-00c_west", []), + + "5a_a-00_west---5a_a-00_east": RegionConnection("5a_a-00_west", "5a_a-00_east", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + + "5a_a-01_west---5a_a-01_center": RegionConnection("5a_a-01_west", "5a_a-01_center", []), + "5a_a-01_center---5a_a-01_west": RegionConnection("5a_a-01_center", "5a_a-01_west", []), + "5a_a-01_center---5a_a-01_east": RegionConnection("5a_a-01_center", "5a_a-01_east", []), + "5a_a-01_center---5a_a-01_south-west": RegionConnection("5a_a-01_center", "5a_a-01_south-west", [[ItemName.swap_blocks, ], ]), + "5a_a-01_center---5a_a-01_south-east": RegionConnection("5a_a-01_center", "5a_a-01_south-east", [[ItemName.swap_blocks, ], ]), + "5a_a-01_center---5a_a-01_north": RegionConnection("5a_a-01_center", "5a_a-01_north", [[ItemName.red_boosters, ], ]), + "5a_a-01_east---5a_a-01_center": RegionConnection("5a_a-01_east", "5a_a-01_center", []), + "5a_a-01_south-west---5a_a-01_center": RegionConnection("5a_a-01_south-west", "5a_a-01_center", []), + "5a_a-01_south-east---5a_a-01_center": RegionConnection("5a_a-01_south-east", "5a_a-01_center", []), + "5a_a-01_north---5a_a-01_center": RegionConnection("5a_a-01_north", "5a_a-01_center", []), + + "5a_a-02_west---5a_a-02_north": RegionConnection("5a_a-02_west", "5a_a-02_north", []), + "5a_a-02_west---5a_a-02_south": RegionConnection("5a_a-02_west", "5a_a-02_south", []), + "5a_a-02_north---5a_a-02_west": RegionConnection("5a_a-02_north", "5a_a-02_west", []), + "5a_a-02_south---5a_a-02_west": RegionConnection("5a_a-02_south", "5a_a-02_west", []), + + "5a_a-03_west---5a_a-03_east": RegionConnection("5a_a-03_west", "5a_a-03_east", []), + "5a_a-03_east---5a_a-03_west": RegionConnection("5a_a-03_east", "5a_a-03_west", []), + + "5a_a-04_east---5a_a-04_north": RegionConnection("5a_a-04_east", "5a_a-04_north", []), + "5a_a-04_east---5a_a-04_south": RegionConnection("5a_a-04_east", "5a_a-04_south", []), + "5a_a-04_north---5a_a-04_east": RegionConnection("5a_a-04_north", "5a_a-04_east", []), + "5a_a-04_south---5a_a-04_east": RegionConnection("5a_a-04_south", "5a_a-04_east", []), + + "5a_a-05_north-west---5a_a-05_center": RegionConnection("5a_a-05_north-west", "5a_a-05_center", []), + "5a_a-05_center---5a_a-05_north-west": RegionConnection("5a_a-05_center", "5a_a-05_north-west", []), + "5a_a-05_center---5a_a-05_north-east": RegionConnection("5a_a-05_center", "5a_a-05_north-east", []), + "5a_a-05_center---5a_a-05_south-west": RegionConnection("5a_a-05_center", "5a_a-05_south-west", [[ItemName.swap_blocks, ], ]), + "5a_a-05_center---5a_a-05_south-east": RegionConnection("5a_a-05_center", "5a_a-05_south-east", [[ItemName.swap_blocks, ], ]), + "5a_a-05_north-east---5a_a-05_center": RegionConnection("5a_a-05_north-east", "5a_a-05_center", []), + "5a_a-05_south-west---5a_a-05_center": RegionConnection("5a_a-05_south-west", "5a_a-05_center", [[ItemName.dash_switches, ], ]), + "5a_a-05_south-east---5a_a-05_center": RegionConnection("5a_a-05_south-east", "5a_a-05_center", [[ItemName.dash_switches, ], ]), + + + + "5a_a-08_west---5a_a-08_center": RegionConnection("5a_a-08_west", "5a_a-08_center", []), + "5a_a-08_center---5a_a-08_west": RegionConnection("5a_a-08_center", "5a_a-08_west", []), + "5a_a-08_center---5a_a-08_north-east": RegionConnection("5a_a-08_center", "5a_a-08_north-east", [[ItemName.red_boosters, ItemName.swap_blocks, ], ]), + "5a_a-08_center---5a_a-08_south": RegionConnection("5a_a-08_center", "5a_a-08_south", []), + "5a_a-08_center---5a_a-08_north": RegionConnection("5a_a-08_center", "5a_a-08_north", [[ItemName.swap_blocks, ], ]), + "5a_a-08_east---5a_a-08_south-east": RegionConnection("5a_a-08_east", "5a_a-08_south-east", []), + "5a_a-08_south---5a_a-08_center": RegionConnection("5a_a-08_south", "5a_a-08_center", []), + "5a_a-08_south-east---5a_a-08_center": RegionConnection("5a_a-08_south-east", "5a_a-08_center", [[ItemName.dash_switches, ], ]), + "5a_a-08_south-east---5a_a-08_east": RegionConnection("5a_a-08_south-east", "5a_a-08_east", []), + "5a_a-08_north-east---5a_a-08_center": RegionConnection("5a_a-08_north-east", "5a_a-08_center", []), + "5a_a-08_north---5a_a-08_center": RegionConnection("5a_a-08_north", "5a_a-08_center", []), + + "5a_a-10_west---5a_a-10_east": RegionConnection("5a_a-10_west", "5a_a-10_east", [[ItemName.swap_blocks, ], ]), + "5a_a-10_east---5a_a-10_west": RegionConnection("5a_a-10_east", "5a_a-10_west", [[ItemName.swap_blocks, ], ]), + + "5a_a-09_west---5a_a-09_east": RegionConnection("5a_a-09_west", "5a_a-09_east", [[ItemName.red_boosters, ], ]), + "5a_a-09_east---5a_a-09_west": RegionConnection("5a_a-09_east", "5a_a-09_west", [[ItemName.red_boosters, ], ]), + + + "5a_a-12_north-west---5a_a-12_west": RegionConnection("5a_a-12_north-west", "5a_a-12_west", [[ItemName.red_boosters, ], ]), + "5a_a-12_south-west---5a_a-12_east": RegionConnection("5a_a-12_south-west", "5a_a-12_east", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + + + + "5a_a-13_west---5a_a-13_east": RegionConnection("5a_a-13_west", "5a_a-13_east", [["Mirror Temple A - Entrance Key", ], ]), + "5a_a-13_east---5a_a-13_west": RegionConnection("5a_a-13_east", "5a_a-13_west", [["Mirror Temple A - Entrance Key", ], ]), + + "5a_b-00_west---5a_b-00_east": RegionConnection("5a_b-00_west", "5a_b-00_east", [[ItemName.dash_switches, ], ]), + "5a_b-00_west---5a_b-00_north-west": RegionConnection("5a_b-00_west", "5a_b-00_north-west", []), + "5a_b-00_north-west---5a_b-00_west": RegionConnection("5a_b-00_north-west", "5a_b-00_west", []), + + + "5a_b-01_south-west---5a_b-01_center": RegionConnection("5a_b-01_south-west", "5a_b-01_center", []), + "5a_b-01_center---5a_b-01_south-west": RegionConnection("5a_b-01_center", "5a_b-01_south-west", []), + "5a_b-01_center---5a_b-01_west": RegionConnection("5a_b-01_center", "5a_b-01_west", [[ItemName.swap_blocks, ], ]), + "5a_b-01_center---5a_b-01_north-west": RegionConnection("5a_b-01_center", "5a_b-01_north-west", []), + "5a_b-01_center---5a_b-01_north": RegionConnection("5a_b-01_center", "5a_b-01_north", []), + "5a_b-01_center---5a_b-01_north-east": RegionConnection("5a_b-01_center", "5a_b-01_north-east", []), + "5a_b-01_center---5a_b-01_east": RegionConnection("5a_b-01_center", "5a_b-01_east", [[ItemName.swap_blocks, ], ]), + "5a_b-01_center---5a_b-01_south-east": RegionConnection("5a_b-01_center", "5a_b-01_south-east", []), + "5a_b-01_center---5a_b-01_south": RegionConnection("5a_b-01_center", "5a_b-01_south", []), + "5a_b-01_west---5a_b-01_center": RegionConnection("5a_b-01_west", "5a_b-01_center", [[ItemName.swap_blocks, ], ]), + "5a_b-01_north-west---5a_b-01_center": RegionConnection("5a_b-01_north-west", "5a_b-01_center", []), + "5a_b-01_north---5a_b-01_center": RegionConnection("5a_b-01_north", "5a_b-01_center", []), + "5a_b-01_north-east---5a_b-01_center": RegionConnection("5a_b-01_north-east", "5a_b-01_center", []), + "5a_b-01_east---5a_b-01_center": RegionConnection("5a_b-01_east", "5a_b-01_center", []), + "5a_b-01_south-east---5a_b-01_center": RegionConnection("5a_b-01_south-east", "5a_b-01_center", []), + "5a_b-01_south---5a_b-01_center": RegionConnection("5a_b-01_south", "5a_b-01_center", []), + + "5a_b-01c_west---5a_b-01c_east": RegionConnection("5a_b-01c_west", "5a_b-01c_east", [[ItemName.swap_blocks, ], ]), + "5a_b-01c_east---5a_b-01c_west": RegionConnection("5a_b-01c_east", "5a_b-01c_west", [[ItemName.cannot_access, ], ]), + + "5a_b-20_north-west---5a_b-20_west": RegionConnection("5a_b-20_north-west", "5a_b-20_west", []), + "5a_b-20_west---5a_b-20_north-west": RegionConnection("5a_b-20_west", "5a_b-20_north-west", []), + "5a_b-20_west---5a_b-20_south-west": RegionConnection("5a_b-20_west", "5a_b-20_south-west", []), + "5a_b-20_south-west---5a_b-20_west": RegionConnection("5a_b-20_south-west", "5a_b-20_west", []), + + + "5a_b-01b_west---5a_b-01b_east": RegionConnection("5a_b-01b_west", "5a_b-01b_east", [[ItemName.swap_blocks, ], ]), + "5a_b-01b_east---5a_b-01b_west": RegionConnection("5a_b-01b_east", "5a_b-01b_west", [[ItemName.swap_blocks, ], ]), + + "5a_b-02_center---5a_b-02_west": RegionConnection("5a_b-02_center", "5a_b-02_west", []), + "5a_b-02_center---5a_b-02_north-west": RegionConnection("5a_b-02_center", "5a_b-02_north-west", [[ItemName.red_boosters, ], ]), + "5a_b-02_center---5a_b-02_north": RegionConnection("5a_b-02_center", "5a_b-02_north", [[ItemName.red_boosters, ], ]), + "5a_b-02_center---5a_b-02_north-east": RegionConnection("5a_b-02_center", "5a_b-02_north-east", [[ItemName.red_boosters, ], ]), + "5a_b-02_center---5a_b-02_east-upper": RegionConnection("5a_b-02_center", "5a_b-02_east-upper", []), + "5a_b-02_center---5a_b-02_east-lower": RegionConnection("5a_b-02_center", "5a_b-02_east-lower", [[ItemName.red_boosters, ], ]), + "5a_b-02_center---5a_b-02_south-east": RegionConnection("5a_b-02_center", "5a_b-02_south-east", []), + "5a_b-02_center---5a_b-02_south": RegionConnection("5a_b-02_center", "5a_b-02_south", []), + "5a_b-02_west---5a_b-02_center": RegionConnection("5a_b-02_west", "5a_b-02_center", []), + "5a_b-02_north-west---5a_b-02_center": RegionConnection("5a_b-02_north-west", "5a_b-02_center", []), + "5a_b-02_north---5a_b-02_center": RegionConnection("5a_b-02_north", "5a_b-02_center", []), + "5a_b-02_north-east---5a_b-02_center": RegionConnection("5a_b-02_north-east", "5a_b-02_center", []), + "5a_b-02_east-upper---5a_b-02_center": RegionConnection("5a_b-02_east-upper", "5a_b-02_center", []), + "5a_b-02_east-lower---5a_b-02_center": RegionConnection("5a_b-02_east-lower", "5a_b-02_center", []), + "5a_b-02_south-east---5a_b-02_center": RegionConnection("5a_b-02_south-east", "5a_b-02_center", []), + "5a_b-02_south---5a_b-02_center": RegionConnection("5a_b-02_south", "5a_b-02_center", []), + + + + "5a_b-04_west---5a_b-04_south": RegionConnection("5a_b-04_west", "5a_b-04_south", []), + "5a_b-04_east---5a_b-04_south": RegionConnection("5a_b-04_east", "5a_b-04_south", []), + "5a_b-04_south---5a_b-04_west": RegionConnection("5a_b-04_south", "5a_b-04_west", []), + + "5a_b-07_north---5a_b-07_south": RegionConnection("5a_b-07_north", "5a_b-07_south", []), + "5a_b-07_south---5a_b-07_north": RegionConnection("5a_b-07_south", "5a_b-07_north", [[ItemName.dash_refills, ], ]), + + "5a_b-08_west---5a_b-08_east": RegionConnection("5a_b-08_west", "5a_b-08_east", [[ItemName.dash_refills, ], ]), + "5a_b-08_east---5a_b-08_west": RegionConnection("5a_b-08_east", "5a_b-08_west", [[ItemName.cannot_access, ], ]), + + "5a_b-09_north---5a_b-09_south": RegionConnection("5a_b-09_north", "5a_b-09_south", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + "5a_b-09_south---5a_b-09_north": RegionConnection("5a_b-09_south", "5a_b-09_north", [[ItemName.cannot_access, ], ]), + + + "5a_b-11_north-west---5a_b-11_west": RegionConnection("5a_b-11_north-west", "5a_b-11_west", []), + "5a_b-11_north-west---5a_b-11_east": RegionConnection("5a_b-11_north-west", "5a_b-11_east", [[ItemName.dash_switches, ], ]), + "5a_b-11_west---5a_b-11_south-west": RegionConnection("5a_b-11_west", "5a_b-11_south-west", []), + "5a_b-11_south-west---5a_b-11_west": RegionConnection("5a_b-11_south-west", "5a_b-11_west", []), + "5a_b-11_south-west---5a_b-11_south-east": RegionConnection("5a_b-11_south-west", "5a_b-11_south-east", []), + "5a_b-11_south-east---5a_b-11_south-west": RegionConnection("5a_b-11_south-east", "5a_b-11_south-west", []), + "5a_b-11_east---5a_b-11_west": RegionConnection("5a_b-11_east", "5a_b-11_west", [[ItemName.cannot_access, ], ]), + + "5a_b-12_west---5a_b-12_east": RegionConnection("5a_b-12_west", "5a_b-12_east", []), + "5a_b-12_east---5a_b-12_west": RegionConnection("5a_b-12_east", "5a_b-12_west", []), + + "5a_b-13_west---5a_b-13_north-east": RegionConnection("5a_b-13_west", "5a_b-13_north-east", [[ItemName.swap_blocks, ], ]), + "5a_b-13_west---5a_b-13_east": RegionConnection("5a_b-13_west", "5a_b-13_east", [[ItemName.dash_switches, ItemName.swap_blocks, ], ]), + "5a_b-13_north-east---5a_b-13_west": RegionConnection("5a_b-13_north-east", "5a_b-13_west", []), + + "5a_b-17_west---5a_b-17_east": RegionConnection("5a_b-17_west", "5a_b-17_east", []), + "5a_b-17_east---5a_b-17_west": RegionConnection("5a_b-17_east", "5a_b-17_west", []), + + + "5a_b-06_west---5a_b-06_north-east": RegionConnection("5a_b-06_west", "5a_b-06_north-east", [[ItemName.red_boosters, ], ]), + "5a_b-06_west---5a_b-06_east": RegionConnection("5a_b-06_west", "5a_b-06_east", [[ItemName.red_boosters, "Mirror Temple A - Depths Key", ], ]), + "5a_b-06_east---5a_b-06_west": RegionConnection("5a_b-06_east", "5a_b-06_west", [[ItemName.red_boosters, "Mirror Temple A - Depths Key", ], ]), + + "5a_b-19_west---5a_b-19_north-west": RegionConnection("5a_b-19_west", "5a_b-19_north-west", []), + "5a_b-19_west---5a_b-19_east": RegionConnection("5a_b-19_west", "5a_b-19_east", [[ItemName.red_boosters, ItemName.dash_refills, ], ]), + "5a_b-19_north-west---5a_b-19_west": RegionConnection("5a_b-19_north-west", "5a_b-19_west", []), + + "5a_b-14_west---5a_b-14_north": RegionConnection("5a_b-14_west", "5a_b-14_north", []), + "5a_b-14_west---5a_b-14_south": RegionConnection("5a_b-14_west", "5a_b-14_south", [["Mirror Temple A - Depths Key", ], ]), + "5a_b-14_south---5a_b-14_west": RegionConnection("5a_b-14_south", "5a_b-14_west", [["Mirror Temple A - Depths Key", ], ]), + "5a_b-14_north---5a_b-14_west": RegionConnection("5a_b-14_north", "5a_b-14_west", []), + + + "5a_b-16_bottom---5a_b-16_mirror": RegionConnection("5a_b-16_bottom", "5a_b-16_mirror", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + + "5a_void_east---5a_void_west": RegionConnection("5a_void_east", "5a_void_west", []), + "5a_void_west---5a_void_east": RegionConnection("5a_void_west", "5a_void_east", []), + + "5a_c-00_top---5a_c-00_bottom": RegionConnection("5a_c-00_top", "5a_c-00_bottom", []), + + "5a_c-01_west---5a_c-01_east": RegionConnection("5a_c-01_west", "5a_c-01_east", []), + "5a_c-01_east---5a_c-01_west": RegionConnection("5a_c-01_east", "5a_c-01_west", []), + + "5a_c-01b_west---5a_c-01b_east": RegionConnection("5a_c-01b_west", "5a_c-01b_east", [[ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ], ]), + + "5a_c-01c_west---5a_c-01c_east": RegionConnection("5a_c-01c_west", "5a_c-01c_east", [[ItemName.swap_blocks, ItemName.red_boosters, ], ]), + + "5a_c-08b_west---5a_c-08b_east": RegionConnection("5a_c-08b_west", "5a_c-08b_east", [[ItemName.dash_switches, ], ]), + + "5a_c-08_west---5a_c-08_east": RegionConnection("5a_c-08_west", "5a_c-08_east", []), + + "5a_c-10_west---5a_c-10_east": RegionConnection("5a_c-10_west", "5a_c-10_east", [[ItemName.coins, ], ]), + + "5a_c-12_west---5a_c-12_east": RegionConnection("5a_c-12_west", "5a_c-12_east", [[ItemName.coins, ], ]), + + "5a_c-07_west---5a_c-07_east": RegionConnection("5a_c-07_west", "5a_c-07_east", [[ItemName.coins, ], ]), + + "5a_c-11_west---5a_c-11_east": RegionConnection("5a_c-11_west", "5a_c-11_east", []), + "5a_c-11_east---5a_c-11_east": RegionConnection("5a_c-11_east", "5a_c-11_east", []), + + "5a_c-09_west---5a_c-09_east": RegionConnection("5a_c-09_west", "5a_c-09_east", [[ItemName.coins, ], ]), + + "5a_c-13_west---5a_c-13_east": RegionConnection("5a_c-13_west", "5a_c-13_east", [[ItemName.coins, ], ]), + + "5a_d-00_south---5a_d-00_north": RegionConnection("5a_d-00_south", "5a_d-00_north", [[ItemName.red_boosters, ], ]), + "5a_d-00_east---5a_d-00_west": RegionConnection("5a_d-00_east", "5a_d-00_west", [[ItemName.red_boosters, ], ]), + + "5a_d-01_south---5a_d-01_center": RegionConnection("5a_d-01_south", "5a_d-01_center", []), + "5a_d-01_center---5a_d-01_south": RegionConnection("5a_d-01_center", "5a_d-01_south", []), + "5a_d-01_center---5a_d-01_south-east-down": RegionConnection("5a_d-01_center", "5a_d-01_south-east-down", []), + "5a_d-01_center---5a_d-01_west": RegionConnection("5a_d-01_center", "5a_d-01_west", []), + "5a_d-01_center---5a_d-01_east": RegionConnection("5a_d-01_center", "5a_d-01_east", []), + "5a_d-01_center---5a_d-01_north-west": RegionConnection("5a_d-01_center", "5a_d-01_north-west", []), + "5a_d-01_center---5a_d-01_north-east": RegionConnection("5a_d-01_center", "5a_d-01_north-east", []), + "5a_d-01_south-west-left---5a_d-01_south-west-down": RegionConnection("5a_d-01_south-west-left", "5a_d-01_south-west-down", []), + "5a_d-01_south-west-down---5a_d-01_center": RegionConnection("5a_d-01_south-west-down", "5a_d-01_center", []), + "5a_d-01_south-west-down---5a_d-01_south-west-left": RegionConnection("5a_d-01_south-west-down", "5a_d-01_south-west-left", []), + "5a_d-01_south-east-right---5a_d-01_south-east-down": RegionConnection("5a_d-01_south-east-right", "5a_d-01_south-east-down", []), + "5a_d-01_south-east-down---5a_d-01_center": RegionConnection("5a_d-01_south-east-down", "5a_d-01_center", []), + "5a_d-01_south-east-down---5a_d-01_south-east-right": RegionConnection("5a_d-01_south-east-down", "5a_d-01_south-east-right", [[ItemName.seekers, ], ]), + "5a_d-01_west---5a_d-01_center": RegionConnection("5a_d-01_west", "5a_d-01_center", []), + "5a_d-01_east---5a_d-01_center": RegionConnection("5a_d-01_east", "5a_d-01_center", []), + "5a_d-01_north-west---5a_d-01_center": RegionConnection("5a_d-01_north-west", "5a_d-01_center", []), + "5a_d-01_north-east---5a_d-01_center": RegionConnection("5a_d-01_north-east", "5a_d-01_center", []), + + "5a_d-09_east---5a_d-09_west": RegionConnection("5a_d-09_east", "5a_d-09_west", [[ItemName.red_boosters, ItemName.dash_refills, ItemName.swap_blocks, ], ]), + + "5a_d-04_east---5a_d-04_west": RegionConnection("5a_d-04_east", "5a_d-04_west", [[ItemName.red_boosters, "Mirror Temple A - Search Key 1", "Mirror Temple A - Search Key 2", ], ]), + "5a_d-04_east---5a_d-04_south-east": RegionConnection("5a_d-04_east", "5a_d-04_south-east", []), + "5a_d-04_south-west-left---5a_d-04_east": RegionConnection("5a_d-04_south-west-left", "5a_d-04_east", []), + "5a_d-04_south-west-right---5a_d-04_east": RegionConnection("5a_d-04_south-west-right", "5a_d-04_east", []), + "5a_d-04_north---5a_d-04_east": RegionConnection("5a_d-04_north", "5a_d-04_east", []), + + "5a_d-05_north---5a_d-05_west": RegionConnection("5a_d-05_north", "5a_d-05_west", [[ItemName.red_boosters, ItemName.swap_blocks, ], ]), + "5a_d-05_east---5a_d-05_south": RegionConnection("5a_d-05_east", "5a_d-05_south", []), + "5a_d-05_south---5a_d-05_east": RegionConnection("5a_d-05_south", "5a_d-05_east", []), + + "5a_d-06_south-east---5a_d-06_north-east": RegionConnection("5a_d-06_south-east", "5a_d-06_north-east", [[ItemName.red_boosters, ItemName.swap_blocks, ], ]), + "5a_d-06_south-west---5a_d-06_north-west": RegionConnection("5a_d-06_south-west", "5a_d-06_north-west", [[ItemName.springs, ], ]), + "5a_d-06_north-west---5a_d-06_south-west": RegionConnection("5a_d-06_north-west", "5a_d-06_south-west", []), + + "5a_d-07_north---5a_d-07_west": RegionConnection("5a_d-07_north", "5a_d-07_west", [[ItemName.coins, ], ]), + + "5a_d-02_east---5a_d-02_west": RegionConnection("5a_d-02_east", "5a_d-02_west", [[ItemName.springs, ], [ItemName.seekers, ], ]), + + "5a_d-03_east---5a_d-03_west": RegionConnection("5a_d-03_east", "5a_d-03_west", [[ItemName.coins, ItemName.seekers, ], ]), + + "5a_d-15_north-west---5a_d-15_center": RegionConnection("5a_d-15_north-west", "5a_d-15_center", []), + "5a_d-15_center---5a_d-15_north-west": RegionConnection("5a_d-15_center", "5a_d-15_north-west", []), + "5a_d-15_center---5a_d-15_south-west": RegionConnection("5a_d-15_center", "5a_d-15_south-west", []), + "5a_d-15_center---5a_d-15_south-east": RegionConnection("5a_d-15_center", "5a_d-15_south-east", []), + "5a_d-15_south-west---5a_d-15_center": RegionConnection("5a_d-15_south-west", "5a_d-15_center", []), + "5a_d-15_south---5a_d-15_center": RegionConnection("5a_d-15_south", "5a_d-15_center", []), + + "5a_d-13_east---5a_d-13_west": RegionConnection("5a_d-13_east", "5a_d-13_west", []), + "5a_d-13_west---5a_d-13_west": RegionConnection("5a_d-13_west", "5a_d-13_west", []), + + "5a_d-19b_south-east-right---5a_d-19b_south-east-down": RegionConnection("5a_d-19b_south-east-right", "5a_d-19b_south-east-down", []), + "5a_d-19b_south-east-down---5a_d-19b_south-east-right": RegionConnection("5a_d-19b_south-east-down", "5a_d-19b_south-east-right", []), + "5a_d-19b_south-west---5a_d-19b_north-east": RegionConnection("5a_d-19b_south-west", "5a_d-19b_north-east", []), + "5a_d-19b_north-east---5a_d-19b_south-west": RegionConnection("5a_d-19b_north-east", "5a_d-19b_south-west", []), + + "5a_d-19_east---5a_d-19_west": RegionConnection("5a_d-19_east", "5a_d-19_west", [[ItemName.swap_blocks, ItemName.springs, ], ]), + + "5a_d-10_west---5a_d-10_east": RegionConnection("5a_d-10_west", "5a_d-10_east", [[ItemName.dash_refills, ], ]), + + "5a_d-20_west---5a_d-20_east": RegionConnection("5a_d-20_west", "5a_d-20_east", [[ItemName.seekers, ItemName.coins, ], ]), + + "5a_e-00_west---5a_e-00_east": RegionConnection("5a_e-00_west", "5a_e-00_east", [[ItemName.theo_crystal, ], ]), + + "5a_e-01_west---5a_e-01_east": RegionConnection("5a_e-01_west", "5a_e-01_east", [[ItemName.theo_crystal, ItemName.dash_switches, ], ]), + + "5a_e-02_west---5a_e-02_east": RegionConnection("5a_e-02_west", "5a_e-02_east", [[ItemName.theo_crystal, ItemName.dash_switches, ], ]), + + "5a_e-03_west---5a_e-03_east": RegionConnection("5a_e-03_west", "5a_e-03_east", [[ItemName.theo_crystal, ItemName.dash_switches, ], ]), + + "5a_e-04_west---5a_e-04_east": RegionConnection("5a_e-04_west", "5a_e-04_east", [[ItemName.theo_crystal, ItemName.coins, ], ]), + + "5a_e-06_west---5a_e-06_east": RegionConnection("5a_e-06_west", "5a_e-06_east", [[ItemName.theo_crystal, ItemName.dash_switches, ItemName.springs, ], ]), + + "5a_e-05_west---5a_e-05_east": RegionConnection("5a_e-05_west", "5a_e-05_east", [[ItemName.theo_crystal, ItemName.swap_blocks, ItemName.coins, ], ]), + + "5a_e-07_west---5a_e-07_east": RegionConnection("5a_e-07_west", "5a_e-07_east", [[ItemName.theo_crystal, ], ]), + + "5a_e-08_west---5a_e-08_east": RegionConnection("5a_e-08_west", "5a_e-08_east", [[ItemName.theo_crystal, ItemName.swap_blocks, ], ]), + + "5a_e-09_west---5a_e-09_east": RegionConnection("5a_e-09_west", "5a_e-09_east", [[ItemName.theo_crystal, ItemName.swap_blocks, ], ]), + + "5a_e-10_west---5a_e-10_east": RegionConnection("5a_e-10_west", "5a_e-10_east", [[ItemName.theo_crystal, ItemName.swap_blocks, ItemName.springs, ItemName.dash_switches, ], ]), + + "5a_e-11_west---5a_e-11_goal": RegionConnection("5a_e-11_west", "5a_e-11_goal", [[ItemName.theo_crystal, ], ]), + + "5b_start_west---5b_start_east": RegionConnection("5b_start_west", "5b_start_east", []), + "5b_start_east---5b_start_west": RegionConnection("5b_start_east", "5b_start_west", []), + + "5b_a-00_west---5b_a-00_east": RegionConnection("5b_a-00_west", "5b_a-00_east", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + + "5b_a-01_west---5b_a-01_east": RegionConnection("5b_a-01_west", "5b_a-01_east", [[ItemName.red_boosters, ], ]), + + "5b_a-02_west---5b_a-02_east": RegionConnection("5b_a-02_west", "5b_a-02_east", [[ItemName.swap_blocks, ], ]), + + "5b_b-00_south---5b_b-00_west": RegionConnection("5b_b-00_south", "5b_b-00_west", [["Mirror Temple B - Central Chamber Key 2", ], ]), + "5b_b-00_south---5b_b-00_north": RegionConnection("5b_b-00_south", "5b_b-00_north", []), + "5b_b-00_south---5b_b-00_east": RegionConnection("5b_b-00_south", "5b_b-00_east", []), + "5b_b-00_west---5b_b-00_south": RegionConnection("5b_b-00_west", "5b_b-00_south", []), + "5b_b-00_north---5b_b-00_south": RegionConnection("5b_b-00_north", "5b_b-00_south", []), + "5b_b-00_east---5b_b-00_south": RegionConnection("5b_b-00_east", "5b_b-00_south", []), + + "5b_b-01_west---5b_b-01_north": RegionConnection("5b_b-01_west", "5b_b-01_north", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + "5b_b-01_west---5b_b-01_east": RegionConnection("5b_b-01_west", "5b_b-01_east", [[ItemName.red_boosters, "Mirror Temple B - Central Chamber Key 2", ], ]), + + "5b_b-04_east---5b_b-04_west": RegionConnection("5b_b-04_east", "5b_b-04_west", [[ItemName.swap_blocks, ItemName.dash_refills, ItemName.red_boosters, ], ]), + + "5b_b-02_south---5b_b-02_center": RegionConnection("5b_b-02_south", "5b_b-02_center", []), + "5b_b-02_center---5b_b-02_south": RegionConnection("5b_b-02_center", "5b_b-02_south", []), + "5b_b-02_center---5b_b-02_north": RegionConnection("5b_b-02_center", "5b_b-02_north", [[ItemName.red_boosters, "Mirror Temple B - Central Chamber Key 1", ], ]), + "5b_b-02_center---5b_b-02_north-west": RegionConnection("5b_b-02_center", "5b_b-02_north-west", []), + "5b_b-02_center---5b_b-02_north-east": RegionConnection("5b_b-02_center", "5b_b-02_north-east", []), + "5b_b-02_north-west---5b_b-02_center": RegionConnection("5b_b-02_north-west", "5b_b-02_center", []), + "5b_b-02_north-east---5b_b-02_center": RegionConnection("5b_b-02_north-east", "5b_b-02_center", []), + "5b_b-02_north---5b_b-02_center": RegionConnection("5b_b-02_north", "5b_b-02_center", []), + "5b_b-02_south-west---5b_b-02_center": RegionConnection("5b_b-02_south-west", "5b_b-02_center", []), + "5b_b-02_south-east---5b_b-02_center": RegionConnection("5b_b-02_south-east", "5b_b-02_center", []), + + "5b_b-05_north---5b_b-05_south": RegionConnection("5b_b-05_north", "5b_b-05_south", [[ItemName.swap_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + + + "5b_b-07_south---5b_b-07_north": RegionConnection("5b_b-07_south", "5b_b-07_north", [[ItemName.swap_blocks, ], ]), + + "5b_b-03_main---5b_b-03_north": RegionConnection("5b_b-03_main", "5b_b-03_north", [[ItemName.red_boosters, ItemName.dash_switches, "Mirror Temple B - Central Chamber Key 1", ], ]), + "5b_b-03_main---5b_b-03_west": RegionConnection("5b_b-03_main", "5b_b-03_west", [[ItemName.dash_switches, ], ]), + "5b_b-03_north---5b_b-03_main": RegionConnection("5b_b-03_north", "5b_b-03_main", [[ItemName.red_boosters, ItemName.dash_switches, ], ]), + "5b_b-03_east---5b_b-03_main": RegionConnection("5b_b-03_east", "5b_b-03_main", [[ItemName.red_boosters, ], ]), + + "5b_b-08_east---5b_b-08_south": RegionConnection("5b_b-08_east", "5b_b-08_south", [[ItemName.swap_blocks, ItemName.springs, ], ]), + "5b_b-08_east---5b_b-08_north": RegionConnection("5b_b-08_east", "5b_b-08_north", [[ItemName.dash_switches, ItemName.swap_blocks, ItemName.springs, "Mirror Temple B - Central Chamber Key 1", ], ]), + + "5b_b-09_bottom---5b_b-09_mirror": RegionConnection("5b_b-09_bottom", "5b_b-09_mirror", [[ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_switches, ], ]), + + "5b_c-00_mirror---5b_c-00_bottom": RegionConnection("5b_c-00_mirror", "5b_c-00_bottom", [[ItemName.dash_refills, ItemName.dash_switches, ], ]), + + "5b_c-01_west---5b_c-01_east": RegionConnection("5b_c-01_west", "5b_c-01_east", [[ItemName.seekers, ItemName.coins, ], ]), + + "5b_c-02_west---5b_c-02_east": RegionConnection("5b_c-02_west", "5b_c-02_east", [[ItemName.seekers, ItemName.dash_switches, ItemName.dash_refills, ], ]), + + "5b_c-03_west---5b_c-03_east": RegionConnection("5b_c-03_west", "5b_c-03_east", [[ItemName.seekers, ItemName.red_boosters, ], ]), + + "5b_c-04_west---5b_c-04_east": RegionConnection("5b_c-04_west", "5b_c-04_east", [[ItemName.seekers, ], ]), + + "5b_d-00_west---5b_d-00_east": RegionConnection("5b_d-00_west", "5b_d-00_east", [[ItemName.theo_crystal, ], ]), + + "5b_d-01_west---5b_d-01_east": RegionConnection("5b_d-01_west", "5b_d-01_east", [[ItemName.theo_crystal, ItemName.springs, ItemName.dash_switches, ], ]), + + "5b_d-02_west---5b_d-02_east": RegionConnection("5b_d-02_west", "5b_d-02_east", [[ItemName.theo_crystal, ItemName.springs, ItemName.dash_switches, ItemName.seekers, ], ]), + + "5b_d-03_west---5b_d-03_east": RegionConnection("5b_d-03_west", "5b_d-03_east", [[ItemName.theo_crystal, ItemName.springs, ItemName.swap_blocks, ItemName.coins, ], ]), + + "5b_d-04_west---5b_d-04_east": RegionConnection("5b_d-04_west", "5b_d-04_east", [[ItemName.theo_crystal, ItemName.springs, ItemName.dash_refills, ], ]), + + "5b_d-05_west---5b_d-05_goal": RegionConnection("5b_d-05_west", "5b_d-05_goal", [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.springs, ItemName.swap_blocks, ], ]), + + "5c_00_west---5c_00_east": RegionConnection("5c_00_west", "5c_00_east", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + "5c_00_east---5c_00_west": RegionConnection("5c_00_east", "5c_00_west", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + + "5c_01_west---5c_01_east": RegionConnection("5c_01_west", "5c_01_east", [[ItemName.swap_blocks, ], ]), + "5c_01_east---5c_01_west": RegionConnection("5c_01_east", "5c_01_west", [[ItemName.cannot_access, ], ]), + + "5c_02_west---5c_02_goal": RegionConnection("5c_02_west", "5c_02_goal", [[ItemName.red_boosters, ItemName.dash_refills, ItemName.dash_switches, ], ]), + + "6a_00_west---6a_00_east": RegionConnection("6a_00_west", "6a_00_east", []), + "6a_00_east---6a_00_west": RegionConnection("6a_00_east", "6a_00_west", [[ItemName.kevin_blocks, ], ]), + + "6a_01_bottom---6a_01_top": RegionConnection("6a_01_bottom", "6a_01_top", [[ItemName.feathers, ], ]), + "6a_01_top---6a_01_bottom": RegionConnection("6a_01_top", "6a_01_bottom", []), + + "6a_02_bottom---6a_02_bottom-west": RegionConnection("6a_02_bottom", "6a_02_bottom-west", [[ItemName.feathers, ], ]), + "6a_02_top-west---6a_02_top": RegionConnection("6a_02_top-west", "6a_02_top", [[ItemName.feathers, ], ]), + "6a_02_top---6a_02_top-west": RegionConnection("6a_02_top", "6a_02_top-west", [[ItemName.feathers, ], ]), + + "6a_03_bottom---6a_03_top": RegionConnection("6a_03_bottom", "6a_03_top", [[ItemName.feathers, ], ]), + + "6a_02b_bottom---6a_02b_top": RegionConnection("6a_02b_bottom", "6a_02b_top", [[ItemName.kevin_blocks, ], ]), + + "6a_04_south---6a_04_south-west": RegionConnection("6a_04_south", "6a_04_south-west", [[ItemName.kevin_blocks, ], ]), + "6a_04_south---6a_04_south-east": RegionConnection("6a_04_south", "6a_04_south-east", []), + "6a_04_south-west---6a_04_south": RegionConnection("6a_04_south-west", "6a_04_south", []), + "6a_04_south-west---6a_04_east": RegionConnection("6a_04_south-west", "6a_04_east", [[ItemName.feathers, ], ]), + "6a_04_south-east---6a_04_south": RegionConnection("6a_04_south-east", "6a_04_south", []), + "6a_04_east---6a_04_south": RegionConnection("6a_04_east", "6a_04_south", []), + "6a_04_east---6a_04_north-west": RegionConnection("6a_04_east", "6a_04_north-west", [[ItemName.feathers, ], ]), + "6a_04_north-west---6a_04_south": RegionConnection("6a_04_north-west", "6a_04_south", []), + + "6a_04b_west---6a_04b_east": RegionConnection("6a_04b_west", "6a_04b_east", []), + "6a_04b_east---6a_04b_west": RegionConnection("6a_04b_east", "6a_04b_west", []), + + + + + "6a_05_west---6a_05_east": RegionConnection("6a_05_west", "6a_05_east", [[ItemName.kevin_blocks, ], ]), + + "6a_06_west---6a_06_east": RegionConnection("6a_06_west", "6a_06_east", [[ItemName.kevin_blocks, ItemName.feathers, ], ]), + + "6a_07_west---6a_07_east": RegionConnection("6a_07_west", "6a_07_east", []), + "6a_07_west---6a_07_north-east": RegionConnection("6a_07_west", "6a_07_north-east", []), + "6a_07_east---6a_07_west": RegionConnection("6a_07_east", "6a_07_west", []), + "6a_07_north-east---6a_07_west": RegionConnection("6a_07_north-east", "6a_07_west", []), + + "6a_08a_west---6a_08a_east": RegionConnection("6a_08a_west", "6a_08a_east", [[ItemName.kevin_blocks, ItemName.dash_refills, ], ]), + + "6a_08b_west---6a_08b_east": RegionConnection("6a_08b_west", "6a_08b_east", [[ItemName.kevin_blocks, ItemName.feathers, ], ]), + + "6a_09_west---6a_09_north-west": RegionConnection("6a_09_west", "6a_09_north-west", []), + "6a_09_north-west---6a_09_north-east": RegionConnection("6a_09_north-west", "6a_09_north-east", []), + "6a_09_east---6a_09_west": RegionConnection("6a_09_east", "6a_09_west", []), + "6a_09_north-east---6a_09_east": RegionConnection("6a_09_north-east", "6a_09_east", []), + + "6a_10a_west---6a_10a_east": RegionConnection("6a_10a_west", "6a_10a_east", [[ItemName.dash_refills, ], ]), + "6a_10a_east---6a_10a_east": RegionConnection("6a_10a_east", "6a_10a_east", [[ItemName.cannot_access, ], ]), + + "6a_10b_west---6a_10b_east": RegionConnection("6a_10b_west", "6a_10b_east", [[ItemName.bumpers, ], ]), + "6a_10b_east---6a_10b_west": RegionConnection("6a_10b_east", "6a_10b_west", [[ItemName.bumpers, ], ]), + + "6a_11_west---6a_11_north-west": RegionConnection("6a_11_west", "6a_11_north-west", [[ItemName.bumpers, ], ]), + "6a_11_north-west---6a_11_north-east": RegionConnection("6a_11_north-west", "6a_11_north-east", [[ItemName.bumpers, ], ]), + "6a_11_east---6a_11_north-east": RegionConnection("6a_11_east", "6a_11_north-east", []), + "6a_11_north-east---6a_11_north-west": RegionConnection("6a_11_north-east", "6a_11_north-west", []), + "6a_11_north-east---6a_11_east": RegionConnection("6a_11_north-east", "6a_11_east", []), + + "6a_12a_west---6a_12a_east": RegionConnection("6a_12a_west", "6a_12a_east", [[ItemName.feathers, ], ]), + + "6a_12b_west---6a_12b_east": RegionConnection("6a_12b_west", "6a_12b_east", [[ItemName.kevin_blocks, ItemName.bumpers, ], ]), + "6a_12b_east---6a_12b_west": RegionConnection("6a_12b_east", "6a_12b_west", [[ItemName.bumpers, ], ]), + + "6a_13_west---6a_13_north-west": RegionConnection("6a_13_west", "6a_13_north-west", []), + "6a_13_north-west---6a_13_east": RegionConnection("6a_13_north-west", "6a_13_east", []), + "6a_13_north-west---6a_13_north-east": RegionConnection("6a_13_north-west", "6a_13_north-east", []), + "6a_13_east---6a_13_north-east": RegionConnection("6a_13_east", "6a_13_north-east", []), + "6a_13_north-east---6a_13_north-west": RegionConnection("6a_13_north-east", "6a_13_north-west", []), + "6a_13_north-east---6a_13_east": RegionConnection("6a_13_north-east", "6a_13_east", []), + + "6a_14a_west---6a_14a_east": RegionConnection("6a_14a_west", "6a_14a_east", [[ItemName.bumpers, ItemName.dash_refills, ], ]), + + "6a_14b_west---6a_14b_east": RegionConnection("6a_14b_west", "6a_14b_east", [[ItemName.springs, ItemName.coins, ItemName.bumpers, ], ]), + + "6a_15_west---6a_15_north-west": RegionConnection("6a_15_west", "6a_15_north-west", []), + "6a_15_north-west---6a_15_east": RegionConnection("6a_15_north-west", "6a_15_east", []), + "6a_15_north-west---6a_15_north-east": RegionConnection("6a_15_north-west", "6a_15_north-east", []), + "6a_15_east---6a_15_north-east": RegionConnection("6a_15_east", "6a_15_north-east", []), + "6a_15_north-east---6a_15_north-west": RegionConnection("6a_15_north-east", "6a_15_north-west", []), + "6a_15_north-east---6a_15_east": RegionConnection("6a_15_north-east", "6a_15_east", []), + + "6a_16a_west---6a_16a_east": RegionConnection("6a_16a_west", "6a_16a_east", [[ItemName.feathers, ], ]), + + "6a_16b_west---6a_16b_east": RegionConnection("6a_16b_west", "6a_16b_east", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6a_17_west---6a_17_north-west": RegionConnection("6a_17_west", "6a_17_north-west", []), + "6a_17_north-west---6a_17_east": RegionConnection("6a_17_north-west", "6a_17_east", []), + "6a_17_north-west---6a_17_north-east": RegionConnection("6a_17_north-west", "6a_17_north-east", [[ItemName.kevin_blocks, ], ]), + "6a_17_east---6a_17_north-east": RegionConnection("6a_17_east", "6a_17_north-east", []), + "6a_17_north-east---6a_17_north-west": RegionConnection("6a_17_north-east", "6a_17_north-west", [[ItemName.cannot_access, ], ]), + "6a_17_north-east---6a_17_east": RegionConnection("6a_17_north-east", "6a_17_east", []), + + "6a_18a_west---6a_18a_east": RegionConnection("6a_18a_west", "6a_18a_east", [[ItemName.bumpers, ItemName.feathers, ], ]), + + "6a_18b_west---6a_18b_east": RegionConnection("6a_18b_west", "6a_18b_east", [[ItemName.bumpers, ], ]), + + "6a_19_west---6a_19_north-west": RegionConnection("6a_19_west", "6a_19_north-west", []), + "6a_19_west---6a_19_east": RegionConnection("6a_19_west", "6a_19_east", [[ItemName.feathers, ], ]), + "6a_19_north-west---6a_19_west": RegionConnection("6a_19_north-west", "6a_19_west", [[ItemName.feathers, ], ]), + "6a_19_north-west---6a_19_east": RegionConnection("6a_19_north-west", "6a_19_east", []), + + "6a_20_west---6a_20_east": RegionConnection("6a_20_west", "6a_20_east", [[ItemName.feathers, ], ]), + + "6a_b-00_west---6a_b-00_east": RegionConnection("6a_b-00_west", "6a_b-00_east", []), + "6a_b-00_west---6a_b-00_top": RegionConnection("6a_b-00_west", "6a_b-00_top", []), + "6a_b-00_east---6a_b-00_west": RegionConnection("6a_b-00_east", "6a_b-00_west", []), + "6a_b-00_top---6a_b-00_west": RegionConnection("6a_b-00_top", "6a_b-00_west", []), + + "6a_b-00b_bottom---6a_b-00b_top": RegionConnection("6a_b-00b_bottom", "6a_b-00b_top", []), + "6a_b-00b_top---6a_b-00b_bottom": RegionConnection("6a_b-00b_top", "6a_b-00b_bottom", []), + + + "6a_b-01_west---6a_b-01_east": RegionConnection("6a_b-01_west", "6a_b-01_east", []), + "6a_b-01_east---6a_b-01_west": RegionConnection("6a_b-01_east", "6a_b-01_west", []), + + "6a_b-02_top---6a_b-02_bottom": RegionConnection("6a_b-02_top", "6a_b-02_bottom", [[ItemName.kevin_blocks, ], ]), + + "6a_b-02b_top---6a_b-02b_bottom": RegionConnection("6a_b-02b_top", "6a_b-02b_bottom", []), + + "6a_b-03_west---6a_b-03_east": RegionConnection("6a_b-03_west", "6a_b-03_east", [[ItemName.kevin_blocks, ], ]), + + "6a_boss-00_west---6a_boss-00_east": RegionConnection("6a_boss-00_west", "6a_boss-00_east", []), + "6a_boss-00_east---6a_boss-00_west": RegionConnection("6a_boss-00_east", "6a_boss-00_west", []), + + "6a_boss-01_west---6a_boss-01_east": RegionConnection("6a_boss-01_west", "6a_boss-01_east", []), + "6a_boss-01_east---6a_boss-01_west": RegionConnection("6a_boss-01_east", "6a_boss-01_west", []), + + "6a_boss-02_west---6a_boss-02_east": RegionConnection("6a_boss-02_west", "6a_boss-02_east", [[ItemName.springs, ], ]), + "6a_boss-02_east---6a_boss-02_west": RegionConnection("6a_boss-02_east", "6a_boss-02_west", []), + + "6a_boss-03_west---6a_boss-03_east": RegionConnection("6a_boss-03_west", "6a_boss-03_east", []), + "6a_boss-03_east---6a_boss-03_west": RegionConnection("6a_boss-03_east", "6a_boss-03_west", []), + + "6a_boss-04_west---6a_boss-04_east": RegionConnection("6a_boss-04_west", "6a_boss-04_east", []), + "6a_boss-04_east---6a_boss-04_west": RegionConnection("6a_boss-04_east", "6a_boss-04_west", []), + + "6a_boss-05_west---6a_boss-05_east": RegionConnection("6a_boss-05_west", "6a_boss-05_east", [[ItemName.dash_refills, ], ]), + "6a_boss-05_east---6a_boss-05_west": RegionConnection("6a_boss-05_east", "6a_boss-05_west", [[ItemName.dash_refills, ], ]), + + "6a_boss-06_west---6a_boss-06_east": RegionConnection("6a_boss-06_west", "6a_boss-06_east", []), + "6a_boss-06_east---6a_boss-06_west": RegionConnection("6a_boss-06_east", "6a_boss-06_west", []), + + "6a_boss-07_west---6a_boss-07_east": RegionConnection("6a_boss-07_west", "6a_boss-07_east", [[ItemName.feathers, ], ]), + "6a_boss-07_east---6a_boss-07_west": RegionConnection("6a_boss-07_east", "6a_boss-07_west", [[ItemName.feathers, ], ]), + + "6a_boss-08_west---6a_boss-08_east": RegionConnection("6a_boss-08_west", "6a_boss-08_east", [[ItemName.dash_refills, ], ]), + + "6a_boss-09_west---6a_boss-09_east": RegionConnection("6a_boss-09_west", "6a_boss-09_east", [[ItemName.feathers, ], ]), + + "6a_boss-10_west---6a_boss-10_east": RegionConnection("6a_boss-10_west", "6a_boss-10_east", [[ItemName.bumpers, ], ]), + "6a_boss-10_east---6a_boss-10_west": RegionConnection("6a_boss-10_east", "6a_boss-10_west", [[ItemName.bumpers, ], ]), + + "6a_boss-11_west---6a_boss-11_east": RegionConnection("6a_boss-11_west", "6a_boss-11_east", [[ItemName.bumpers, ], ]), + + "6a_boss-12_west---6a_boss-12_east": RegionConnection("6a_boss-12_west", "6a_boss-12_east", [[ItemName.dash_refills, ], ]), + + "6a_boss-13_west---6a_boss-13_east": RegionConnection("6a_boss-13_west", "6a_boss-13_east", []), + "6a_boss-13_east---6a_boss-13_west": RegionConnection("6a_boss-13_east", "6a_boss-13_west", []), + + "6a_boss-14_west---6a_boss-14_east": RegionConnection("6a_boss-14_west", "6a_boss-14_east", []), + "6a_boss-14_east---6a_boss-14_west": RegionConnection("6a_boss-14_east", "6a_boss-14_west", []), + + "6a_boss-15_west---6a_boss-15_east": RegionConnection("6a_boss-15_west", "6a_boss-15_east", []), + + "6a_boss-16_west---6a_boss-16_east": RegionConnection("6a_boss-16_west", "6a_boss-16_east", []), + "6a_boss-16_east---6a_boss-16_west": RegionConnection("6a_boss-16_east", "6a_boss-16_west", []), + + "6a_boss-17_west---6a_boss-17_east": RegionConnection("6a_boss-17_west", "6a_boss-17_east", []), + "6a_boss-17_east---6a_boss-17_west": RegionConnection("6a_boss-17_east", "6a_boss-17_west", [[ItemName.cannot_access, ], ]), + + "6a_boss-18_west---6a_boss-18_east": RegionConnection("6a_boss-18_west", "6a_boss-18_east", [[ItemName.feathers, ItemName.bumpers, ], ]), + + "6a_boss-19_west---6a_boss-19_east": RegionConnection("6a_boss-19_west", "6a_boss-19_east", [[ItemName.feathers, ItemName.bumpers, ], ]), + + "6a_boss-20_west---6a_boss-20_east": RegionConnection("6a_boss-20_west", "6a_boss-20_east", []), + "6a_boss-20_east---6a_boss-20_west": RegionConnection("6a_boss-20_east", "6a_boss-20_west", []), + + "6a_after-00_bottom---6a_after-00_top": RegionConnection("6a_after-00_bottom", "6a_after-00_top", []), + "6a_after-00_top---6a_after-00_bottom": RegionConnection("6a_after-00_top", "6a_after-00_bottom", []), + + "6a_after-01_bottom---6a_after-01_goal": RegionConnection("6a_after-01_bottom", "6a_after-01_goal", [[ItemName.badeline_boosters, ], ]), + + "6b_a-00_bottom---6b_a-00_top": RegionConnection("6b_a-00_bottom", "6b_a-00_top", [[ItemName.kevin_blocks, ], ]), + + "6b_a-01_bottom---6b_a-01_top": RegionConnection("6b_a-01_bottom", "6b_a-01_top", [[ItemName.feathers, ItemName.dash_refills, ], ]), + + "6b_a-02_bottom---6b_a-02_top": RegionConnection("6b_a-02_bottom", "6b_a-02_top", [[ItemName.bumpers, ItemName.feathers, ], ]), + + "6b_a-03_west---6b_a-03_east": RegionConnection("6b_a-03_west", "6b_a-03_east", [[ItemName.kevin_blocks, ItemName.coins, ], ]), + + "6b_a-04_west---6b_a-04_east": RegionConnection("6b_a-04_west", "6b_a-04_east", [[ItemName.bumpers, ], ]), + + "6b_a-05_west---6b_a-05_east": RegionConnection("6b_a-05_west", "6b_a-05_east", [[ItemName.bumpers, ], ]), + + "6b_a-06_west---6b_a-06_east": RegionConnection("6b_a-06_west", "6b_a-06_east", [[ItemName.bumpers, ItemName.kevin_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + + "6b_b-00_west---6b_b-00_east": RegionConnection("6b_b-00_west", "6b_b-00_east", []), + + "6b_b-01_top---6b_b-01_bottom": RegionConnection("6b_b-01_top", "6b_b-01_bottom", [[ItemName.dash_refills, ], ]), + + "6b_b-02_top---6b_b-02_bottom": RegionConnection("6b_b-02_top", "6b_b-02_bottom", [[ItemName.dash_refills, ItemName.kevin_blocks, ], ]), + + "6b_b-03_top---6b_b-03_bottom": RegionConnection("6b_b-03_top", "6b_b-03_bottom", [[ItemName.bumpers, ], ]), + + "6b_b-04_top---6b_b-04_bottom": RegionConnection("6b_b-04_top", "6b_b-04_bottom", [[ItemName.dash_refills, ], ]), + + "6b_b-05_top---6b_b-05_bottom": RegionConnection("6b_b-05_top", "6b_b-05_bottom", [[ItemName.dash_refills, ItemName.kevin_blocks, ], ]), + + "6b_b-06_top---6b_b-06_bottom": RegionConnection("6b_b-06_top", "6b_b-06_bottom", []), + + "6b_b-07_top---6b_b-07_bottom": RegionConnection("6b_b-07_top", "6b_b-07_bottom", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6b_b-08_top---6b_b-08_bottom": RegionConnection("6b_b-08_top", "6b_b-08_bottom", [[ItemName.dash_refills, ], ]), + + "6b_b-10_west---6b_b-10_east": RegionConnection("6b_b-10_west", "6b_b-10_east", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6b_c-00_west---6b_c-00_east": RegionConnection("6b_c-00_west", "6b_c-00_east", [[ItemName.springs, ], ]), + + "6b_c-01_west---6b_c-01_east": RegionConnection("6b_c-01_west", "6b_c-01_east", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6b_c-02_west---6b_c-02_east": RegionConnection("6b_c-02_west", "6b_c-02_east", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6b_c-03_west---6b_c-03_east": RegionConnection("6b_c-03_west", "6b_c-03_east", [[ItemName.dash_refills, ItemName.feathers, ItemName.coins, ], ]), + + "6b_c-04_west---6b_c-04_east": RegionConnection("6b_c-04_west", "6b_c-04_east", [[ItemName.dash_refills, ItemName.feathers, ItemName.bumpers, ], ]), + + "6b_d-00_west---6b_d-00_east": RegionConnection("6b_d-00_west", "6b_d-00_east", [[ItemName.dash_refills, ItemName.kevin_blocks, ], ]), + + "6b_d-01_west---6b_d-01_east": RegionConnection("6b_d-01_west", "6b_d-01_east", [[ItemName.bumpers, ], ]), + + "6b_d-02_west---6b_d-02_east": RegionConnection("6b_d-02_west", "6b_d-02_east", [[ItemName.bumpers, ItemName.feathers, ItemName.coins, ], ]), + + "6b_d-03_west---6b_d-03_east": RegionConnection("6b_d-03_west", "6b_d-03_east", [[ItemName.bumpers, ItemName.kevin_blocks, ], ]), + + "6b_d-04_west---6b_d-04_east": RegionConnection("6b_d-04_west", "6b_d-04_east", [[ItemName.bumpers, ItemName.kevin_blocks, ItemName.feathers, ], ]), + + "6b_d-05_west---6b_d-05_goal": RegionConnection("6b_d-05_west", "6b_d-05_goal", [[ItemName.blue_cassette_blocks, ItemName.bumpers, ], ]), + + "6c_00_west---6c_00_east": RegionConnection("6c_00_west", "6c_00_east", [[ItemName.bumpers, ], ]), + + "6c_01_west---6c_01_east": RegionConnection("6c_01_west", "6c_01_east", [[ItemName.dash_refills, ItemName.feathers, ], ]), + + "6c_02_west---6c_02_goal": RegionConnection("6c_02_west", "6c_02_goal", [[ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers, ], ]), + + "7a_a-00_west---7a_a-00_east": RegionConnection("7a_a-00_west", "7a_a-00_east", []), + "7a_a-00_east---7a_a-00_west": RegionConnection("7a_a-00_east", "7a_a-00_west", []), + + "7a_a-01_west---7a_a-01_east": RegionConnection("7a_a-01_west", "7a_a-01_east", [[ItemName.dash_refills, ], ]), + "7a_a-01_east---7a_a-01_east": RegionConnection("7a_a-01_east", "7a_a-01_east", [[ItemName.dash_refills, ], ]), + + "7a_a-02_west---7a_a-02_north": RegionConnection("7a_a-02_west", "7a_a-02_north", [[ItemName.springs, ], ]), + "7a_a-02_west---7a_a-02_east": RegionConnection("7a_a-02_west", "7a_a-02_east", [[ItemName.springs, ], ]), + "7a_a-02_east---7a_a-02_west": RegionConnection("7a_a-02_east", "7a_a-02_west", []), + "7a_a-02_north---7a_a-02_west": RegionConnection("7a_a-02_north", "7a_a-02_west", []), + "7a_a-02_north-west---7a_a-02_west": RegionConnection("7a_a-02_north-west", "7a_a-02_west", []), + + "7a_a-02b_east---7a_a-02b_west": RegionConnection("7a_a-02b_east", "7a_a-02b_west", []), + "7a_a-02b_west---7a_a-02b_east": RegionConnection("7a_a-02b_west", "7a_a-02b_east", []), + + "7a_a-03_west---7a_a-03_east": RegionConnection("7a_a-03_west", "7a_a-03_east", [[ItemName.springs, ], ]), + "7a_a-03_east---7a_a-03_west": RegionConnection("7a_a-03_east", "7a_a-03_west", [[ItemName.springs, ], ]), + + "7a_a-04_west---7a_a-04_east": RegionConnection("7a_a-04_west", "7a_a-04_east", [[ItemName.dash_refills, ItemName.springs, ], ]), + "7a_a-04_north---7a_a-04_east": RegionConnection("7a_a-04_north", "7a_a-04_east", []), + "7a_a-04_east---7a_a-04_west": RegionConnection("7a_a-04_east", "7a_a-04_west", []), + "7a_a-04_east---7a_a-04_north": RegionConnection("7a_a-04_east", "7a_a-04_north", []), + + + "7a_a-05_west---7a_a-05_east": RegionConnection("7a_a-05_west", "7a_a-05_east", [[ItemName.dash_refills, ], ]), + "7a_a-05_east---7a_a-05_west": RegionConnection("7a_a-05_east", "7a_a-05_west", [[ItemName.dash_refills, ], ]), + + "7a_a-06_bottom---7a_a-06_top": RegionConnection("7a_a-06_bottom", "7a_a-06_top", [[ItemName.badeline_boosters, ItemName.springs, ], ]), + "7a_a-06_bottom---7a_a-06_top-side": RegionConnection("7a_a-06_bottom", "7a_a-06_top-side", [[ItemName.badeline_boosters, ItemName.springs, ], ]), + "7a_a-06_top---7a_a-06_bottom": RegionConnection("7a_a-06_top", "7a_a-06_bottom", []), + "7a_a-06_top-side---7a_a-06_top": RegionConnection("7a_a-06_top-side", "7a_a-06_top", [[ItemName.badeline_boosters, ], ]), + + "7a_b-00_bottom---7a_b-00_top": RegionConnection("7a_b-00_bottom", "7a_b-00_top", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-00_top---7a_b-00_bottom": RegionConnection("7a_b-00_top", "7a_b-00_bottom", []), + + "7a_b-01_west---7a_b-01_east": RegionConnection("7a_b-01_west", "7a_b-01_east", [[ItemName.traffic_blocks, ItemName.springs, ], ]), + + "7a_b-02_south---7a_b-02_north-west": RegionConnection("7a_b-02_south", "7a_b-02_north-west", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02_south---7a_b-02_north-east": RegionConnection("7a_b-02_south", "7a_b-02_north-east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02_north-west---7a_b-02_north": RegionConnection("7a_b-02_north-west", "7a_b-02_north", []), + "7a_b-02_north---7a_b-02_north-east": RegionConnection("7a_b-02_north", "7a_b-02_north-east", []), + "7a_b-02_north-east---7a_b-02_south": RegionConnection("7a_b-02_north-east", "7a_b-02_south", []), + "7a_b-02_north-east---7a_b-02_north": RegionConnection("7a_b-02_north-east", "7a_b-02_north", []), + + "7a_b-02b_south---7a_b-02b_north-west": RegionConnection("7a_b-02b_south", "7a_b-02b_north-west", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02b_south---7a_b-02b_north-east": RegionConnection("7a_b-02b_south", "7a_b-02b_north-east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02b_north-west---7a_b-02b_north-east": RegionConnection("7a_b-02b_north-west", "7a_b-02b_north-east", []), + "7a_b-02b_north-east---7a_b-02b_south": RegionConnection("7a_b-02b_north-east", "7a_b-02b_south", []), + "7a_b-02b_north-east---7a_b-02b_north-west": RegionConnection("7a_b-02b_north-east", "7a_b-02b_north-west", []), + + + "7a_b-02c_west---7a_b-02c_east": RegionConnection("7a_b-02c_west", "7a_b-02c_east", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02c_east---7a_b-02c_west": RegionConnection("7a_b-02c_east", "7a_b-02c_west", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-02c_east---7a_b-02c_south-east": RegionConnection("7a_b-02c_east", "7a_b-02c_south-east", []), + "7a_b-02c_south-east---7a_b-02c_east": RegionConnection("7a_b-02c_south-east", "7a_b-02c_east", []), + + "7a_b-02d_north---7a_b-02d_south": RegionConnection("7a_b-02d_north", "7a_b-02d_south", [[ItemName.dash_refills, ], ]), + "7a_b-02d_south---7a_b-02d_north": RegionConnection("7a_b-02d_south", "7a_b-02d_north", [[ItemName.dash_refills, ], ]), + + "7a_b-03_west---7a_b-03_east": RegionConnection("7a_b-03_west", "7a_b-03_east", []), + "7a_b-03_east---7a_b-03_west": RegionConnection("7a_b-03_east", "7a_b-03_west", []), + "7a_b-03_east---7a_b-03_north": RegionConnection("7a_b-03_east", "7a_b-03_north", [[ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "7a_b-03_north---7a_b-03_east": RegionConnection("7a_b-03_north", "7a_b-03_east", []), + + + "7a_b-05_west---7a_b-05_east": RegionConnection("7a_b-05_west", "7a_b-05_east", [[ItemName.springs, ItemName.coins, ItemName.dash_refills, ], ]), + "7a_b-05_north-west---7a_b-05_west": RegionConnection("7a_b-05_north-west", "7a_b-05_west", []), + + "7a_b-06_west---7a_b-06_east": RegionConnection("7a_b-06_west", "7a_b-06_east", [[ItemName.traffic_blocks, ], ]), + "7a_b-06_east---7a_b-06_west": RegionConnection("7a_b-06_east", "7a_b-06_west", []), + + "7a_b-07_west---7a_b-07_east": RegionConnection("7a_b-07_west", "7a_b-07_east", [[ItemName.traffic_blocks, ], ]), + "7a_b-07_east---7a_b-07_west": RegionConnection("7a_b-07_east", "7a_b-07_west", []), + + "7a_b-08_west---7a_b-08_east": RegionConnection("7a_b-08_west", "7a_b-08_east", [[ItemName.springs, ], ]), + + "7a_b-09_bottom---7a_b-09_top": RegionConnection("7a_b-09_bottom", "7a_b-09_top", [[ItemName.traffic_blocks, ItemName.badeline_boosters, ], ]), + "7a_b-09_top---7a_b-09_bottom": RegionConnection("7a_b-09_top", "7a_b-09_bottom", [[ItemName.traffic_blocks, ], ]), + "7a_b-09_top---7a_b-09_top-side": RegionConnection("7a_b-09_top", "7a_b-09_top-side", []), + "7a_b-09_top-side---7a_b-09_top": RegionConnection("7a_b-09_top-side", "7a_b-09_top", []), + + "7a_c-00_west---7a_c-00_east": RegionConnection("7a_c-00_west", "7a_c-00_east", [[ItemName.dream_blocks, ], ]), + "7a_c-00_east---7a_c-00_west": RegionConnection("7a_c-00_east", "7a_c-00_west", [[ItemName.dream_blocks, ], ]), + + "7a_c-01_bottom---7a_c-01_top": RegionConnection("7a_c-01_bottom", "7a_c-01_top", [[ItemName.dream_blocks, ], ]), + "7a_c-01_top---7a_c-01_bottom": RegionConnection("7a_c-01_top", "7a_c-01_bottom", [[ItemName.dream_blocks, ], ]), + + "7a_c-02_bottom---7a_c-02_top": RegionConnection("7a_c-02_bottom", "7a_c-02_top", [[ItemName.dream_blocks, ItemName.springs, ItemName.coins, ], ]), + + "7a_c-03_south---7a_c-03_west": RegionConnection("7a_c-03_south", "7a_c-03_west", []), + "7a_c-03_south---7a_c-03_east": RegionConnection("7a_c-03_south", "7a_c-03_east", [[ItemName.dream_blocks, ], ]), + "7a_c-03_west---7a_c-03_south": RegionConnection("7a_c-03_west", "7a_c-03_south", []), + "7a_c-03_east---7a_c-03_south": RegionConnection("7a_c-03_east", "7a_c-03_south", [[ItemName.dream_blocks, ], ]), + + + "7a_c-04_west---7a_c-04_north-west": RegionConnection("7a_c-04_west", "7a_c-04_north-west", [[ItemName.dream_blocks, ], ]), + "7a_c-04_west---7a_c-04_east": RegionConnection("7a_c-04_west", "7a_c-04_east", []), + "7a_c-04_north-west---7a_c-04_west": RegionConnection("7a_c-04_north-west", "7a_c-04_west", [[ItemName.dream_blocks, ], ]), + "7a_c-04_north-east---7a_c-04_east": RegionConnection("7a_c-04_north-east", "7a_c-04_east", [[ItemName.dream_blocks, ], ]), + "7a_c-04_east---7a_c-04_north-east": RegionConnection("7a_c-04_east", "7a_c-04_north-east", [[ItemName.dream_blocks, ], ]), + "7a_c-04_east---7a_c-04_west": RegionConnection("7a_c-04_east", "7a_c-04_west", []), + + + "7a_c-06_south---7a_c-06_north": RegionConnection("7a_c-06_south", "7a_c-06_north", [[ItemName.dream_blocks, ], ]), + "7a_c-06_south---7a_c-06_east": RegionConnection("7a_c-06_south", "7a_c-06_east", [[ItemName.dream_blocks, ], ]), + "7a_c-06_north---7a_c-06_south": RegionConnection("7a_c-06_north", "7a_c-06_south", []), + "7a_c-06_east---7a_c-06_south": RegionConnection("7a_c-06_east", "7a_c-06_south", [[ItemName.dream_blocks, ], ]), + + "7a_c-06b_south---7a_c-06b_east": RegionConnection("7a_c-06b_south", "7a_c-06b_east", [[ItemName.dream_blocks, ItemName.dream_blocks, ], ]), + "7a_c-06b_west---7a_c-06b_east": RegionConnection("7a_c-06b_west", "7a_c-06b_east", [[ItemName.dream_blocks, ], ]), + "7a_c-06b_east---7a_c-06b_north": RegionConnection("7a_c-06b_east", "7a_c-06b_north", [[ItemName.dream_blocks, ], ]), + + + "7a_c-07_west---7a_c-07_south-west": RegionConnection("7a_c-07_west", "7a_c-07_south-west", []), + "7a_c-07_south-west---7a_c-07_west": RegionConnection("7a_c-07_south-west", "7a_c-07_west", []), + "7a_c-07_south-west---7a_c-07_south-east": RegionConnection("7a_c-07_south-west", "7a_c-07_south-east", []), + "7a_c-07_south-east---7a_c-07_south-west": RegionConnection("7a_c-07_south-east", "7a_c-07_south-west", []), + "7a_c-07_south-east---7a_c-07_east": RegionConnection("7a_c-07_south-east", "7a_c-07_east", [[ItemName.dream_blocks, ], ]), + "7a_c-07_east---7a_c-07_south-east": RegionConnection("7a_c-07_east", "7a_c-07_south-east", [[ItemName.dream_blocks, ], ]), + + + "7a_c-08_west---7a_c-08_east": RegionConnection("7a_c-08_west", "7a_c-08_east", [[ItemName.dream_blocks, ], ]), + "7a_c-08_east---7a_c-08_west": RegionConnection("7a_c-08_east", "7a_c-08_west", [[ItemName.dream_blocks, ], ]), + + "7a_c-09_bottom---7a_c-09_top": RegionConnection("7a_c-09_bottom", "7a_c-09_top", [[ItemName.dream_blocks, ItemName.badeline_boosters, ], ]), + "7a_c-09_top---7a_c-09_bottom": RegionConnection("7a_c-09_top", "7a_c-09_bottom", [[ItemName.dream_blocks, ], ]), + + "7a_d-00_bottom---7a_d-00_top": RegionConnection("7a_d-00_bottom", "7a_d-00_top", [[ItemName.dash_refills, ], ]), + "7a_d-00_top---7a_d-00_bottom": RegionConnection("7a_d-00_top", "7a_d-00_bottom", []), + + "7a_d-01_west---7a_d-01_east": RegionConnection("7a_d-01_west", "7a_d-01_east", [[ItemName.sinking_platforms, ], ]), + "7a_d-01_east---7a_d-01_west": RegionConnection("7a_d-01_east", "7a_d-01_west", [[ItemName.sinking_platforms, ], ]), + + "7a_d-01b_west---7a_d-01b_east": RegionConnection("7a_d-01b_west", "7a_d-01b_east", []), + "7a_d-01b_west---7a_d-01b_south-west": RegionConnection("7a_d-01b_west", "7a_d-01b_south-west", []), + "7a_d-01b_south-west---7a_d-01b_west": RegionConnection("7a_d-01b_south-west", "7a_d-01b_west", []), + "7a_d-01b_east---7a_d-01b_west": RegionConnection("7a_d-01b_east", "7a_d-01b_west", []), + "7a_d-01b_south-east---7a_d-01b_east": RegionConnection("7a_d-01b_south-east", "7a_d-01b_east", []), + + "7a_d-01c_west---7a_d-01c_east": RegionConnection("7a_d-01c_west", "7a_d-01c_east", []), + "7a_d-01c_south---7a_d-01c_east": RegionConnection("7a_d-01c_south", "7a_d-01c_east", []), + "7a_d-01c_east---7a_d-01c_west": RegionConnection("7a_d-01c_east", "7a_d-01c_west", []), + "7a_d-01c_east---7a_d-01c_south": RegionConnection("7a_d-01c_east", "7a_d-01c_south", []), + "7a_d-01c_south-east---7a_d-01c_east": RegionConnection("7a_d-01c_south-east", "7a_d-01c_east", []), + + "7a_d-01d_west---7a_d-01d_east": RegionConnection("7a_d-01d_west", "7a_d-01d_east", []), + "7a_d-01d_east---7a_d-01d_west": RegionConnection("7a_d-01d_east", "7a_d-01d_west", []), + + "7a_d-02_west---7a_d-02_east": RegionConnection("7a_d-02_west", "7a_d-02_east", [[ItemName.coins, ], ]), + + "7a_d-03_west---7a_d-03_east": RegionConnection("7a_d-03_west", "7a_d-03_east", []), + "7a_d-03_west---7a_d-03_north-east": RegionConnection("7a_d-03_west", "7a_d-03_north-east", []), + "7a_d-03_north-west---7a_d-03_west": RegionConnection("7a_d-03_north-west", "7a_d-03_west", []), + "7a_d-03_east---7a_d-03_west": RegionConnection("7a_d-03_east", "7a_d-03_west", [[ItemName.cannot_access, ], ]), + "7a_d-03_north-east---7a_d-03_west": RegionConnection("7a_d-03_north-east", "7a_d-03_west", []), + + "7a_d-03b_west---7a_d-03b_east": RegionConnection("7a_d-03b_west", "7a_d-03b_east", []), + "7a_d-03b_east---7a_d-03b_west": RegionConnection("7a_d-03b_east", "7a_d-03b_west", []), + + "7a_d-04_west---7a_d-04_east": RegionConnection("7a_d-04_west", "7a_d-04_east", []), + "7a_d-04_east---7a_d-04_west": RegionConnection("7a_d-04_east", "7a_d-04_west", []), + + "7a_d-05_west---7a_d-05_east": RegionConnection("7a_d-05_west", "7a_d-05_east", [[ItemName.coins, ], [ItemName.dash_refills, ], ]), + "7a_d-05_north-east---7a_d-05_east": RegionConnection("7a_d-05_north-east", "7a_d-05_east", []), + "7a_d-05_east---7a_d-05_west": RegionConnection("7a_d-05_east", "7a_d-05_west", [[ItemName.dash_refills, ], ]), + "7a_d-05_east---7a_d-05_north-east": RegionConnection("7a_d-05_east", "7a_d-05_north-east", []), + + + "7a_d-06_west---7a_d-06_south-west": RegionConnection("7a_d-06_west", "7a_d-06_south-west", []), + "7a_d-06_south-west---7a_d-06_west": RegionConnection("7a_d-06_south-west", "7a_d-06_west", []), + "7a_d-06_south-west---7a_d-06_east": RegionConnection("7a_d-06_south-west", "7a_d-06_east", []), + "7a_d-06_south-east---7a_d-06_west": RegionConnection("7a_d-06_south-east", "7a_d-06_west", []), + "7a_d-06_south-east---7a_d-06_east": RegionConnection("7a_d-06_south-east", "7a_d-06_east", []), + "7a_d-06_east---7a_d-06_south-east": RegionConnection("7a_d-06_east", "7a_d-06_south-east", []), + + + "7a_d-08_west---7a_d-08_east": RegionConnection("7a_d-08_west", "7a_d-08_east", [[ItemName.dash_refills, ], ]), + "7a_d-08_east---7a_d-08_west": RegionConnection("7a_d-08_east", "7a_d-08_west", [[ItemName.dash_refills, ], ]), + + "7a_d-09_west---7a_d-09_east": RegionConnection("7a_d-09_west", "7a_d-09_east", [[ItemName.springs, ], ]), + + "7a_d-10_west---7a_d-10_north-west": RegionConnection("7a_d-10_west", "7a_d-10_north-west", []), + "7a_d-10_north-west---7a_d-10_west": RegionConnection("7a_d-10_north-west", "7a_d-10_west", []), + "7a_d-10_north-west---7a_d-10_east": RegionConnection("7a_d-10_north-west", "7a_d-10_east", []), + "7a_d-10_north---7a_d-10_north-west": RegionConnection("7a_d-10_north", "7a_d-10_north-west", []), + "7a_d-10_north---7a_d-10_north-east": RegionConnection("7a_d-10_north", "7a_d-10_north-east", [[ItemName.dash_refills, ], ]), + "7a_d-10_north-east---7a_d-10_north": RegionConnection("7a_d-10_north-east", "7a_d-10_north", [[ItemName.dash_refills, ], ]), + "7a_d-10_north-east---7a_d-10_east": RegionConnection("7a_d-10_north-east", "7a_d-10_east", [[ItemName.dash_refills, ], ]), + "7a_d-10_east---7a_d-10_north-east": RegionConnection("7a_d-10_east", "7a_d-10_north-east", [[ItemName.dash_refills, ], ]), + + "7a_d-10b_west---7a_d-10b_east": RegionConnection("7a_d-10b_west", "7a_d-10b_east", []), + "7a_d-10b_east---7a_d-10b_west": RegionConnection("7a_d-10b_east", "7a_d-10b_west", []), + + "7a_d-11_bottom---7a_d-11_top": RegionConnection("7a_d-11_bottom", "7a_d-11_top", [[ItemName.badeline_boosters, ], ]), + "7a_d-11_top---7a_d-11_bottom": RegionConnection("7a_d-11_top", "7a_d-11_bottom", []), + + "7a_e-00b_bottom---7a_e-00b_top": RegionConnection("7a_e-00b_bottom", "7a_e-00b_top", [[ItemName.blue_boosters, ], ]), + "7a_e-00b_top---7a_e-00b_bottom": RegionConnection("7a_e-00b_top", "7a_e-00b_bottom", [[ItemName.blue_boosters, ], ]), + + "7a_e-00_west---7a_e-00_south-west": RegionConnection("7a_e-00_west", "7a_e-00_south-west", []), + "7a_e-00_west---7a_e-00_north-west": RegionConnection("7a_e-00_west", "7a_e-00_north-west", []), + "7a_e-00_south-west---7a_e-00_east": RegionConnection("7a_e-00_south-west", "7a_e-00_east", [[ItemName.blue_boosters, ItemName.blue_clouds, ], ]), + "7a_e-00_south-west---7a_e-00_west": RegionConnection("7a_e-00_south-west", "7a_e-00_west", []), + "7a_e-00_north-west---7a_e-00_south-west": RegionConnection("7a_e-00_north-west", "7a_e-00_south-west", []), + "7a_e-00_east---7a_e-00_south-west": RegionConnection("7a_e-00_east", "7a_e-00_south-west", [[ItemName.blue_boosters, ItemName.blue_clouds, ], ]), + + "7a_e-01_north---7a_e-01_east": RegionConnection("7a_e-01_north", "7a_e-01_east", []), + "7a_e-01_east---7a_e-01_west": RegionConnection("7a_e-01_east", "7a_e-01_west", []), + + "7a_e-01b_west---7a_e-01b_east": RegionConnection("7a_e-01b_west", "7a_e-01b_east", []), + "7a_e-01b_east---7a_e-01b_west": RegionConnection("7a_e-01b_east", "7a_e-01b_west", []), + + "7a_e-01c_west---7a_e-01c_east": RegionConnection("7a_e-01c_west", "7a_e-01c_east", [[ItemName.move_blocks, ], ]), + + "7a_e-02_west---7a_e-02_east": RegionConnection("7a_e-02_west", "7a_e-02_east", [[ItemName.pink_clouds, ], ]), + + "7a_e-03_south-west---7a_e-03_east": RegionConnection("7a_e-03_south-west", "7a_e-03_east", [[ItemName.blue_boosters, ItemName.moving_platforms, ], ]), + "7a_e-03_west---7a_e-03_east": RegionConnection("7a_e-03_west", "7a_e-03_east", []), + "7a_e-03_east---7a_e-03_west": RegionConnection("7a_e-03_east", "7a_e-03_west", []), + + "7a_e-04_west---7a_e-04_east": RegionConnection("7a_e-04_west", "7a_e-04_east", [[ItemName.blue_boosters, ItemName.springs, ], ]), + + "7a_e-05_west---7a_e-05_east": RegionConnection("7a_e-05_west", "7a_e-05_east", []), + "7a_e-05_east---7a_e-05_west": RegionConnection("7a_e-05_east", "7a_e-05_west", []), + + "7a_e-06_west---7a_e-06_east": RegionConnection("7a_e-06_west", "7a_e-06_east", [[ItemName.move_blocks, ], ]), + + "7a_e-07_bottom---7a_e-07_top": RegionConnection("7a_e-07_bottom", "7a_e-07_top", [[ItemName.move_blocks, ], ]), + + "7a_e-08_south---7a_e-08_west": RegionConnection("7a_e-08_south", "7a_e-08_west", [[ItemName.blue_clouds, ], ]), + "7a_e-08_south---7a_e-08_east": RegionConnection("7a_e-08_south", "7a_e-08_east", [[ItemName.blue_clouds, ], ]), + "7a_e-08_west---7a_e-08_south": RegionConnection("7a_e-08_west", "7a_e-08_south", []), + "7a_e-08_east---7a_e-08_south": RegionConnection("7a_e-08_east", "7a_e-08_south", []), + + "7a_e-09_north---7a_e-09_east": RegionConnection("7a_e-09_north", "7a_e-09_east", []), + "7a_e-09_east---7a_e-09_north": RegionConnection("7a_e-09_east", "7a_e-09_north", []), + + "7a_e-11_south---7a_e-11_north": RegionConnection("7a_e-11_south", "7a_e-11_north", [[ItemName.move_blocks, ], ]), + "7a_e-11_south---7a_e-11_east": RegionConnection("7a_e-11_south", "7a_e-11_east", [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + "7a_e-11_north---7a_e-11_south": RegionConnection("7a_e-11_north", "7a_e-11_south", []), + + + "7a_e-10_south---7a_e-10_east": RegionConnection("7a_e-10_south", "7a_e-10_east", [[ItemName.blue_boosters, ], ]), + "7a_e-10_north---7a_e-10_south": RegionConnection("7a_e-10_north", "7a_e-10_south", []), + + "7a_e-10b_west---7a_e-10b_east": RegionConnection("7a_e-10b_west", "7a_e-10b_east", [[ItemName.move_blocks, ItemName.dash_refills, ItemName.springs, ], ]), + + "7a_e-13_bottom---7a_e-13_top": RegionConnection("7a_e-13_bottom", "7a_e-13_top", [[ItemName.badeline_boosters, ItemName.dash_refills, ItemName.move_blocks, ItemName.blue_boosters, ItemName.springs, ], ]), + + "7a_f-00_south---7a_f-00_west": RegionConnection("7a_f-00_south", "7a_f-00_west", []), + "7a_f-00_south---7a_f-00_east": RegionConnection("7a_f-00_south", "7a_f-00_east", [[ItemName.red_boosters, ], ]), + "7a_f-00_west---7a_f-00_south": RegionConnection("7a_f-00_west", "7a_f-00_south", []), + "7a_f-00_north-west---7a_f-00_west": RegionConnection("7a_f-00_north-west", "7a_f-00_west", []), + "7a_f-00_north-west---7a_f-00_north-east": RegionConnection("7a_f-00_north-west", "7a_f-00_north-east", [[ItemName.red_boosters, ], ]), + + "7a_f-01_south---7a_f-01_north": RegionConnection("7a_f-01_south", "7a_f-01_north", []), + "7a_f-01_north---7a_f-01_south": RegionConnection("7a_f-01_north", "7a_f-01_south", []), + + "7a_f-02_west---7a_f-02_east": RegionConnection("7a_f-02_west", "7a_f-02_east", [[ItemName.swap_blocks, ], ]), + "7a_f-02_north-west---7a_f-02_north-east": RegionConnection("7a_f-02_north-west", "7a_f-02_north-east", [[ItemName.red_boosters, ], ]), + "7a_f-02_north-east---7a_f-02_east": RegionConnection("7a_f-02_north-east", "7a_f-02_east", []), + + "7a_f-02b_west---7a_f-02b_east": RegionConnection("7a_f-02b_west", "7a_f-02b_east", [[ItemName.red_boosters, ItemName.dash_refills, ItemName.swap_blocks, ItemName.dash_switches, ], ]), + + "7a_f-04_west---7a_f-04_east": RegionConnection("7a_f-04_west", "7a_f-04_east", [[ItemName.swap_blocks, ], ]), + + "7a_f-03_west---7a_f-03_east": RegionConnection("7a_f-03_west", "7a_f-03_east", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + "7a_f-03_east---7a_f-03_west": RegionConnection("7a_f-03_east", "7a_f-03_west", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + + "7a_f-05_west---7a_f-05_south": RegionConnection("7a_f-05_west", "7a_f-05_south", []), + "7a_f-05_south-west---7a_f-05_south": RegionConnection("7a_f-05_south-west", "7a_f-05_south", []), + "7a_f-05_north-west---7a_f-05_south": RegionConnection("7a_f-05_north-west", "7a_f-05_south", []), + "7a_f-05_south---7a_f-05_west": RegionConnection("7a_f-05_south", "7a_f-05_west", []), + "7a_f-05_south---7a_f-05_south-west": RegionConnection("7a_f-05_south", "7a_f-05_south-west", []), + "7a_f-05_south---7a_f-05_north-west": RegionConnection("7a_f-05_south", "7a_f-05_north-west", []), + "7a_f-05_south---7a_f-05_north": RegionConnection("7a_f-05_south", "7a_f-05_north", []), + "7a_f-05_south---7a_f-05_north-east": RegionConnection("7a_f-05_south", "7a_f-05_north-east", []), + "7a_f-05_south---7a_f-05_south-east": RegionConnection("7a_f-05_south", "7a_f-05_south-east", []), + "7a_f-05_south---7a_f-05_east": RegionConnection("7a_f-05_south", "7a_f-05_east", [["The Summit A - 2500 M Key", ], ]), + "7a_f-05_north---7a_f-05_south": RegionConnection("7a_f-05_north", "7a_f-05_south", []), + "7a_f-05_north-east---7a_f-05_south": RegionConnection("7a_f-05_north-east", "7a_f-05_south", []), + "7a_f-05_south-east---7a_f-05_south": RegionConnection("7a_f-05_south-east", "7a_f-05_south", []), + + "7a_f-06_north-west---7a_f-06_north": RegionConnection("7a_f-06_north-west", "7a_f-06_north", []), + "7a_f-06_north---7a_f-06_north-west": RegionConnection("7a_f-06_north", "7a_f-06_north-west", []), + "7a_f-06_north---7a_f-06_north-east": RegionConnection("7a_f-06_north", "7a_f-06_north-east", []), + "7a_f-06_north-east---7a_f-06_north": RegionConnection("7a_f-06_north-east", "7a_f-06_north", []), + + "7a_f-07_west---7a_f-07_south-west": RegionConnection("7a_f-07_west", "7a_f-07_south-west", []), + + "7a_f-08_west---7a_f-08_north-west": RegionConnection("7a_f-08_west", "7a_f-08_north-west", [[ItemName.red_boosters, ], ]), + "7a_f-08_west---7a_f-08_east": RegionConnection("7a_f-08_west", "7a_f-08_east", [[ItemName.swap_blocks, ItemName.red_boosters, ItemName.dash_refills, ], ]), + "7a_f-08_north-west---7a_f-08_west": RegionConnection("7a_f-08_north-west", "7a_f-08_west", []), + + "7a_f-08b_west---7a_f-08b_east": RegionConnection("7a_f-08b_west", "7a_f-08b_east", [[ItemName.springs, ], ]), + "7a_f-08b_east---7a_f-08b_west": RegionConnection("7a_f-08b_east", "7a_f-08b_west", [[ItemName.springs, ], ]), + + "7a_f-08d_west---7a_f-08d_east": RegionConnection("7a_f-08d_west", "7a_f-08d_east", [[ItemName.dash_switches, ItemName.springs, ], ]), + + "7a_f-08c_west---7a_f-08c_east": RegionConnection("7a_f-08c_west", "7a_f-08c_east", [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + + "7a_f-09_west---7a_f-09_east": RegionConnection("7a_f-09_west", "7a_f-09_east", [[ItemName.red_boosters, ], ]), + + "7a_f-10_west---7a_f-10_east": RegionConnection("7a_f-10_west", "7a_f-10_east", [[ItemName.swap_blocks, ], ]), + "7a_f-10_north-east---7a_f-10_east": RegionConnection("7a_f-10_north-east", "7a_f-10_east", []), + + "7a_f-10b_west---7a_f-10b_east": RegionConnection("7a_f-10b_west", "7a_f-10b_east", [[ItemName.springs, ItemName.dash_refills, ItemName.dash_switches, ], ]), + + "7a_f-11_bottom---7a_f-11_top": RegionConnection("7a_f-11_bottom", "7a_f-11_top", [[ItemName.badeline_boosters, ItemName.swap_blocks, ItemName.springs, ItemName.red_boosters, ], ]), + "7a_f-11_top---7a_f-11_bottom": RegionConnection("7a_f-11_top", "7a_f-11_bottom", []), + + "7a_g-00_bottom---7a_g-00_top": RegionConnection("7a_g-00_bottom", "7a_g-00_top", [[ItemName.dash_refills, ItemName.badeline_boosters, ], ]), + + "7a_g-00b_bottom---7a_g-00b_c26": RegionConnection("7a_g-00b_bottom", "7a_g-00b_c26", []), + "7a_g-00b_c26---7a_g-00b_c24": RegionConnection("7a_g-00b_c26", "7a_g-00b_c24", [[ItemName.dash_refills, ], ]), + "7a_g-00b_c24---7a_g-00b_c21": RegionConnection("7a_g-00b_c24", "7a_g-00b_c21", [[ItemName.springs, ], ]), + "7a_g-00b_c21---7a_g-00b_top": RegionConnection("7a_g-00b_c21", "7a_g-00b_top", [[ItemName.springs, ItemName.dash_refills, ItemName.badeline_boosters, ], ]), + + "7a_g-01_bottom---7a_g-01_c18": RegionConnection("7a_g-01_bottom", "7a_g-01_c18", [[ItemName.blue_clouds, ], ]), + "7a_g-01_c18---7a_g-01_c16": RegionConnection("7a_g-01_c18", "7a_g-01_c16", [[ItemName.dash_refills, ItemName.blue_clouds, ], ]), + "7a_g-01_c16---7a_g-01_top": RegionConnection("7a_g-01_c16", "7a_g-01_top", [[ItemName.springs, ItemName.coins, ItemName.dash_refills, ItemName.pink_clouds, ItemName.badeline_boosters, ], ]), + + "7a_g-02_bottom---7a_g-02_top": RegionConnection("7a_g-02_bottom", "7a_g-02_top", [[ItemName.blue_clouds, ItemName.feathers, ], ]), + + "7a_g-03_bottom---7a_g-03_goal": RegionConnection("7a_g-03_bottom", "7a_g-03_goal", [[ItemName.springs, ItemName.dash_refills, ItemName.feathers, ], ]), + + "7b_a-00_west---7b_a-00_east": RegionConnection("7b_a-00_west", "7b_a-00_east", [[ItemName.springs, ], ]), + + "7b_a-01_west---7b_a-01_east": RegionConnection("7b_a-01_west", "7b_a-01_east", [[ItemName.springs, ], ]), + + "7b_a-02_west---7b_a-02_east": RegionConnection("7b_a-02_west", "7b_a-02_east", [[ItemName.springs, ], ]), + + "7b_a-03_bottom---7b_a-03_top": RegionConnection("7b_a-03_bottom", "7b_a-03_top", [[ItemName.springs, ItemName.badeline_boosters, ], ]), + + "7b_b-00_bottom---7b_b-00_top": RegionConnection("7b_b-00_bottom", "7b_b-00_top", [[ItemName.dash_refills, ItemName.traffic_blocks, ], ]), + "7b_b-00_top---7b_b-00_bottom": RegionConnection("7b_b-00_top", "7b_b-00_bottom", []), + + "7b_b-01_bottom---7b_b-01_top": RegionConnection("7b_b-01_bottom", "7b_b-01_top", [[ItemName.traffic_blocks, ], ]), + "7b_b-01_top---7b_b-01_bottom": RegionConnection("7b_b-01_top", "7b_b-01_bottom", []), + + "7b_b-02_west---7b_b-02_east": RegionConnection("7b_b-02_west", "7b_b-02_east", [[ItemName.springs, ], ]), + + "7b_b-03_bottom---7b_b-03_top": RegionConnection("7b_b-03_bottom", "7b_b-03_top", [[ItemName.traffic_blocks, ItemName.badeline_boosters, ], ]), + + "7b_c-01_west---7b_c-01_east": RegionConnection("7b_c-01_west", "7b_c-01_east", [[ItemName.dream_blocks, ItemName.springs, ], ]), + + "7b_c-00_west---7b_c-00_east": RegionConnection("7b_c-00_west", "7b_c-00_east", [[ItemName.dream_blocks, ], ]), + + "7b_c-02_west---7b_c-02_east": RegionConnection("7b_c-02_west", "7b_c-02_east", [[ItemName.dream_blocks, ItemName.springs, ], ]), + + "7b_c-03_bottom---7b_c-03_top": RegionConnection("7b_c-03_bottom", "7b_c-03_top", [[ItemName.dream_blocks, ItemName.badeline_boosters, ], ]), + + "7b_d-00_west---7b_d-00_east": RegionConnection("7b_d-00_west", "7b_d-00_east", [[ItemName.springs, ], ]), + + "7b_d-01_west---7b_d-01_east": RegionConnection("7b_d-01_west", "7b_d-01_east", [[ItemName.dash_refills, ], ]), + + "7b_d-02_west---7b_d-02_east": RegionConnection("7b_d-02_west", "7b_d-02_east", [[ItemName.springs, ItemName.moving_platforms, ItemName.coins, ], ]), + + "7b_d-03_bottom---7b_d-03_top": RegionConnection("7b_d-03_bottom", "7b_d-03_top", [[ItemName.springs, ItemName.badeline_boosters, ], ]), + + "7b_e-00_west---7b_e-00_east": RegionConnection("7b_e-00_west", "7b_e-00_east", [[ItemName.blue_boosters, ItemName.blue_clouds, ], ]), + + "7b_e-01_west---7b_e-01_east": RegionConnection("7b_e-01_west", "7b_e-01_east", [[ItemName.move_blocks, ItemName.springs, ], ]), + + "7b_e-02_west---7b_e-02_east": RegionConnection("7b_e-02_west", "7b_e-02_east", []), + + "7b_e-03_bottom---7b_e-03_top": RegionConnection("7b_e-03_bottom", "7b_e-03_top", [[ItemName.blue_clouds, ItemName.pink_clouds, ItemName.coins, ItemName.badeline_boosters, ], ]), + + "7b_f-00_west---7b_f-00_east": RegionConnection("7b_f-00_west", "7b_f-00_east", [[ItemName.springs, ItemName.swap_blocks, ], ]), + + "7b_f-01_west---7b_f-01_east": RegionConnection("7b_f-01_west", "7b_f-01_east", [[ItemName.red_boosters, ], ]), + + "7b_f-02_west---7b_f-02_east": RegionConnection("7b_f-02_west", "7b_f-02_east", [[ItemName.springs, ItemName.swap_blocks, ItemName.dash_refills, ], ]), + + "7b_f-03_bottom---7b_f-03_top": RegionConnection("7b_f-03_bottom", "7b_f-03_top", [[ItemName.dash_refills, ItemName.swap_blocks, ItemName.dash_refills, ItemName.badeline_boosters, ], ]), + + "7b_g-00_bottom---7b_g-00_top": RegionConnection("7b_g-00_bottom", "7b_g-00_top", [[ItemName.springs, ItemName.dash_refills, ItemName.badeline_boosters, ], ]), + + "7b_g-01_bottom---7b_g-01_top": RegionConnection("7b_g-01_bottom", "7b_g-01_top", [[ItemName.springs, ItemName.dash_refills, ItemName.pink_clouds, ItemName.blue_clouds, ItemName.badeline_boosters, ], ]), + + "7b_g-02_bottom---7b_g-02_top": RegionConnection("7b_g-02_bottom", "7b_g-02_top", [[ItemName.springs, ItemName.dash_refills, ItemName.pink_clouds, ItemName.blue_clouds, ItemName.badeline_boosters, ], ]), + + "7b_g-03_bottom---7b_g-03_goal": RegionConnection("7b_g-03_bottom", "7b_g-03_goal", [[ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.blue_clouds, ], ]), + + "7c_01_west---7c_01_east": RegionConnection("7c_01_west", "7c_01_east", [[ItemName.dash_refills, ItemName.badeline_boosters, ], ]), + + "7c_02_west---7c_02_east": RegionConnection("7c_02_west", "7c_02_east", [[ItemName.springs, ItemName.coins, ItemName.badeline_boosters, ], ]), + + "7c_03_west---7c_03_goal": RegionConnection("7c_03_west", "7c_03_goal", [[ItemName.pink_clouds, ItemName.dash_refills, ItemName.springs, ], ]), + + + "8a_bridge_west---8a_bridge_east": RegionConnection("8a_bridge_west", "8a_bridge_east", []), + "8a_bridge_east---8a_bridge_west": RegionConnection("8a_bridge_east", "8a_bridge_west", []), + + + "9a_00_west---9a_00_east": RegionConnection("9a_00_west", "9a_00_east", []), + "9a_00_east---9a_00_west": RegionConnection("9a_00_east", "9a_00_west", []), + + + "9a_01_west---9a_01_east": RegionConnection("9a_01_west", "9a_01_east", [[ItemName.dash_refills, ], ]), + "9a_01_east---9a_01_west": RegionConnection("9a_01_east", "9a_01_west", []), + + "9a_02_west---9a_02_east": RegionConnection("9a_02_west", "9a_02_east", []), + "9a_02_east---9a_02_west": RegionConnection("9a_02_east", "9a_02_west", []), + + "9a_a-00_west---9a_a-00_east": RegionConnection("9a_a-00_west", "9a_a-00_east", [[ItemName.dash_refills, ], ]), + "9a_a-00_east---9a_a-00_west": RegionConnection("9a_a-00_east", "9a_a-00_west", []), + + "9a_a-01_west---9a_a-01_east": RegionConnection("9a_a-01_west", "9a_a-01_east", [[ItemName.dash_refills, ItemName.springs, ], ]), + "9a_a-01_east---9a_a-01_west": RegionConnection("9a_a-01_east", "9a_a-01_west", []), + + "9a_a-02_west---9a_a-02_east": RegionConnection("9a_a-02_west", "9a_a-02_east", [[ItemName.core_blocks, ], ]), + "9a_a-02_east---9a_a-02_west": RegionConnection("9a_a-02_east", "9a_a-02_west", [[ItemName.core_blocks, ], ]), + + "9a_a-03_bottom---9a_a-03_top": RegionConnection("9a_a-03_bottom", "9a_a-03_top", []), + "9a_a-03_top---9a_a-03_bottom": RegionConnection("9a_a-03_top", "9a_a-03_bottom", []), + + "9a_b-00_west---9a_b-00_south": RegionConnection("9a_b-00_west", "9a_b-00_south", []), + "9a_b-00_south---9a_b-00_west": RegionConnection("9a_b-00_south", "9a_b-00_west", []), + "9a_b-00_south---9a_b-00_east": RegionConnection("9a_b-00_south", "9a_b-00_east", []), + "9a_b-00_south---9a_b-00_north": RegionConnection("9a_b-00_south", "9a_b-00_north", [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.core_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + "9a_b-00_north---9a_b-00_south": RegionConnection("9a_b-00_north", "9a_b-00_south", []), + "9a_b-00_east---9a_b-00_south": RegionConnection("9a_b-00_east", "9a_b-00_south", []), + + "9a_b-01_west---9a_b-01_east": RegionConnection("9a_b-01_west", "9a_b-01_east", [[ItemName.core_blocks, ], ]), + "9a_b-01_east---9a_b-01_west": RegionConnection("9a_b-01_east", "9a_b-01_west", [[ItemName.core_blocks, ], ]), + + "9a_b-02_west---9a_b-02_east": RegionConnection("9a_b-02_west", "9a_b-02_east", [[ItemName.core_blocks, ], ]), + "9a_b-02_east---9a_b-02_west": RegionConnection("9a_b-02_east", "9a_b-02_west", [[ItemName.core_blocks, ], ]), + + "9a_b-03_west---9a_b-03_east": RegionConnection("9a_b-03_west", "9a_b-03_east", [[ItemName.core_blocks, ], ]), + "9a_b-03_east---9a_b-03_west": RegionConnection("9a_b-03_east", "9a_b-03_west", [[ItemName.core_blocks, ], ]), + + "9a_b-04_north-west---9a_b-04_east": RegionConnection("9a_b-04_north-west", "9a_b-04_east", [[ItemName.core_toggles, ], ]), + "9a_b-04_west---9a_b-04_east": RegionConnection("9a_b-04_west", "9a_b-04_east", [[ItemName.core_blocks, ItemName.core_toggles, ], ]), + + "9a_b-05_east---9a_b-05_west": RegionConnection("9a_b-05_east", "9a_b-05_west", [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.dash_refills, ItemName.coins, ], ]), + + + "9a_b-07b_bottom---9a_b-07b_top": RegionConnection("9a_b-07b_bottom", "9a_b-07b_top", [[ItemName.dash_refills, ItemName.core_toggles, ], ]), + "9a_b-07b_top---9a_b-07b_bottom": RegionConnection("9a_b-07b_top", "9a_b-07b_bottom", []), + + "9a_b-07_bottom---9a_b-07_top": RegionConnection("9a_b-07_bottom", "9a_b-07_top", [[ItemName.core_toggles, ItemName.core_blocks, ItemName.bumpers, ], ]), + + "9a_c-00_west---9a_c-00_east": RegionConnection("9a_c-00_west", "9a_c-00_east", [[ItemName.core_toggles, ItemName.core_blocks, ItemName.dash_refills, ], ]), + "9a_c-00_north-east---9a_c-00_east": RegionConnection("9a_c-00_north-east", "9a_c-00_east", [[ItemName.core_toggles, ], ]), + "9a_c-00_east---9a_c-00_north-east": RegionConnection("9a_c-00_east", "9a_c-00_north-east", [[ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + + + "9a_c-01_west---9a_c-01_east": RegionConnection("9a_c-01_west", "9a_c-01_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + "9a_c-01_east---9a_c-01_west": RegionConnection("9a_c-01_east", "9a_c-01_west", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + + "9a_c-02_west---9a_c-02_east": RegionConnection("9a_c-02_west", "9a_c-02_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.dash_refills, ItemName.bumpers, ], ]), + + "9a_c-03_west---9a_c-03_north": RegionConnection("9a_c-03_west", "9a_c-03_north", [[ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + "9a_c-03_west---9a_c-03_east": RegionConnection("9a_c-03_west", "9a_c-03_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + "9a_c-03_north-west---9a_c-03_west": RegionConnection("9a_c-03_north-west", "9a_c-03_west", []), + "9a_c-03_north-east---9a_c-03_east": RegionConnection("9a_c-03_north-east", "9a_c-03_east", []), + + "9a_c-03b_south---9a_c-03b_west": RegionConnection("9a_c-03b_south", "9a_c-03b_west", []), + "9a_c-03b_south---9a_c-03b_east": RegionConnection("9a_c-03b_south", "9a_c-03b_east", [[ItemName.core_toggles, ], ]), + "9a_c-03b_east---9a_c-03b_south": RegionConnection("9a_c-03b_east", "9a_c-03b_south", [[ItemName.core_toggles, ], ]), + + "9a_c-04_west---9a_c-04_east": RegionConnection("9a_c-04_west", "9a_c-04_east", [[ItemName.dash_refills, ], ]), + "9a_c-04_east---9a_c-04_west": RegionConnection("9a_c-04_east", "9a_c-04_west", [[ItemName.dash_refills, ], ]), + + "9a_d-00_bottom---9a_d-00_top": RegionConnection("9a_d-00_bottom", "9a_d-00_top", [[ItemName.dash_refills, ], ]), + + "9a_d-01_bottom---9a_d-01_top": RegionConnection("9a_d-01_bottom", "9a_d-01_top", [[ItemName.dash_refills, ], ]), + + "9a_d-02_bottom---9a_d-02_top": RegionConnection("9a_d-02_bottom", "9a_d-02_top", [[ItemName.dash_refills, ItemName.core_toggles, ], ]), + + "9a_d-03_bottom---9a_d-03_top": RegionConnection("9a_d-03_bottom", "9a_d-03_top", [[ItemName.dash_refills, ItemName.core_blocks, ItemName.core_toggles, ], ]), + + "9a_d-04_bottom---9a_d-04_top": RegionConnection("9a_d-04_bottom", "9a_d-04_top", [[ItemName.dash_refills, ], ]), + + "9a_d-05_bottom---9a_d-05_top": RegionConnection("9a_d-05_bottom", "9a_d-05_top", [[ItemName.dash_refills, ItemName.core_toggles, ItemName.fire_ice_balls, ], ]), + + "9a_d-06_bottom---9a_d-06_top": RegionConnection("9a_d-06_bottom", "9a_d-06_top", [[ItemName.dash_refills, ItemName.core_blocks, ], ]), + + "9a_d-07_bottom---9a_d-07_top": RegionConnection("9a_d-07_bottom", "9a_d-07_top", [[ItemName.dash_refills, ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.springs, ItemName.badeline_boosters, ], ]), + + "9a_d-08_west---9a_d-08_east": RegionConnection("9a_d-08_west", "9a_d-08_east", [[ItemName.dash_refills, ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.bumpers, ], ]), + + "9a_d-09_west---9a_d-09_east": RegionConnection("9a_d-09_west", "9a_d-09_east", [[ItemName.dash_refills, ItemName.core_toggles, ], ]), + + "9a_d-10_west---9a_d-10_east": RegionConnection("9a_d-10_west", "9a_d-10_east", [[ItemName.bumpers, ItemName.core_toggles, ], ]), + + "9a_d-10b_west---9a_d-10b_east": RegionConnection("9a_d-10b_west", "9a_d-10b_east", [[ItemName.dash_refills, ItemName.bumpers, ItemName.core_toggles, ItemName.core_blocks, ], ]), + + "9a_d-10c_west---9a_d-10c_east": RegionConnection("9a_d-10c_west", "9a_d-10c_east", [[ItemName.feathers, ItemName.core_toggles, ], ]), + + "9a_d-11_west---9a_d-11_center": RegionConnection("9a_d-11_west", "9a_d-11_center", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + "9a_d-11_center---9a_d-11_east": RegionConnection("9a_d-11_center", "9a_d-11_east", []), + + "9a_space_west---9a_space_goal": RegionConnection("9a_space_west", "9a_space_goal", []), + + + "9b_01_west---9b_01_east": RegionConnection("9b_01_west", "9b_01_east", []), + "9b_01_east---9b_01_west": RegionConnection("9b_01_east", "9b_01_west", []), + + "9b_a-00_west---9b_a-00_east": RegionConnection("9b_a-00_west", "9b_a-00_east", [[ItemName.dash_refills, ], ]), + "9b_a-00_east---9b_a-00_west": RegionConnection("9b_a-00_east", "9b_a-00_west", [[ItemName.dash_refills, ], ]), + + "9b_a-01_west---9b_a-01_east": RegionConnection("9b_a-01_west", "9b_a-01_east", [[ItemName.core_blocks, ], ]), + + "9b_a-02_west---9b_a-02_east": RegionConnection("9b_a-02_west", "9b_a-02_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.dash_refills, ], ]), + + "9b_a-03_west---9b_a-03_east": RegionConnection("9b_a-03_west", "9b_a-03_east", [[ItemName.fire_ice_balls, ], ]), + "9b_a-03_east---9b_a-03_west": RegionConnection("9b_a-03_east", "9b_a-03_west", [[ItemName.fire_ice_balls, ], ]), + + "9b_a-04_west---9b_a-04_east": RegionConnection("9b_a-04_west", "9b_a-04_east", [[ItemName.core_blocks, ItemName.dash_refills, ], ]), + + "9b_a-05_west---9b_a-05_east": RegionConnection("9b_a-05_west", "9b_a-05_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.dash_refills, ItemName.bumpers, ], ]), + + "9b_b-00_west---9b_b-00_east": RegionConnection("9b_b-00_west", "9b_b-00_east", [[ItemName.core_blocks, ], ]), + + "9b_b-01_west---9b_b-01_east": RegionConnection("9b_b-01_west", "9b_b-01_east", [[ItemName.core_blocks, ItemName.core_toggles, ItemName.bumpers, ], ]), + + "9b_b-02_west---9b_b-02_east": RegionConnection("9b_b-02_west", "9b_b-02_east", [[ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.bumpers, ItemName.dash_refills, ItemName.coins, ], ]), + + "9b_b-03_west---9b_b-03_east": RegionConnection("9b_b-03_west", "9b_b-03_east", [[ItemName.dash_refills, ItemName.core_toggles, ], ]), + + "9b_b-04_west---9b_b-04_east": RegionConnection("9b_b-04_west", "9b_b-04_east", [[ItemName.dash_refills, ], ]), + + "9b_b-05_west---9b_b-05_east": RegionConnection("9b_b-05_west", "9b_b-05_east", [[ItemName.dash_refills, ItemName.core_toggles, ItemName.fire_ice_balls, ], ]), + + "9b_c-01_bottom---9b_c-01_top": RegionConnection("9b_c-01_bottom", "9b_c-01_top", [[ItemName.dash_refills, ItemName.core_blocks, ItemName.core_toggles, ItemName.springs, ], ]), + + "9b_c-02_bottom---9b_c-02_top": RegionConnection("9b_c-02_bottom", "9b_c-02_top", [[ItemName.dash_refills, ItemName.core_toggles, ItemName.bumpers, ItemName.fire_ice_balls, ], ]), + + "9b_c-03_bottom---9b_c-03_top": RegionConnection("9b_c-03_bottom", "9b_c-03_top", [[ItemName.dash_refills, ItemName.springs, ], ]), + + "9b_c-04_bottom---9b_c-04_top": RegionConnection("9b_c-04_bottom", "9b_c-04_top", [[ItemName.dash_refills, ItemName.springs, ItemName.traffic_blocks, ItemName.dream_blocks, ItemName.moving_platforms, ItemName.blue_clouds, ItemName.swap_blocks, ItemName.kevin_blocks, ItemName.core_blocks, ItemName.badeline_boosters, ], ]), + + "9b_c-05_west---9b_c-05_east": RegionConnection("9b_c-05_west", "9b_c-05_east", [[ItemName.dash_refills, ItemName.core_toggles, ItemName.core_blocks, ItemName.bumpers, ], ]), + + "9b_c-06_west---9b_c-06_east": RegionConnection("9b_c-06_west", "9b_c-06_east", [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.core_blocks, ], ]), + "9b_c-06_east---9b_c-06_west": RegionConnection("9b_c-06_east", "9b_c-06_west", [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.core_blocks, ], ]), + + "9b_c-08_west---9b_c-08_east": RegionConnection("9b_c-08_west", "9b_c-08_east", [[ItemName.dash_refills, ItemName.core_toggles, ], ]), + + "9b_c-07_west---9b_c-07_east": RegionConnection("9b_c-07_west", "9b_c-07_east", [[ItemName.dash_refills, ItemName.core_blocks, ], ]), + + "9b_space_west---9b_space_goal": RegionConnection("9b_space_west", "9b_space_goal", [[ItemName.dash_refills, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + + "9c_intro_west---9c_intro_east": RegionConnection("9c_intro_west", "9c_intro_east", []), + "9c_intro_east---9c_intro_west": RegionConnection("9c_intro_east", "9c_intro_west", []), + + "9c_00_west---9c_00_east": RegionConnection("9c_00_west", "9c_00_east", [[ItemName.dash_refills, ], ]), + + "9c_01_west---9c_01_east": RegionConnection("9c_01_west", "9c_01_east", [[ItemName.core_blocks, ItemName.dash_refills, ItemName.core_toggles, ItemName.bumpers, ], ]), + + "9c_02_west---9c_02_goal": RegionConnection("9c_02_west", "9c_02_goal", [[ItemName.springs, ItemName.traffic_blocks, ItemName.dash_refills, ItemName.core_toggles, ItemName.dream_blocks, ItemName.bumpers, ItemName.pink_clouds, ItemName.swap_blocks, ItemName.kevin_blocks, ItemName.core_blocks, ], ]), + + "10a_intro-00-past_west---10a_intro-00-past_east": RegionConnection("10a_intro-00-past_west", "10a_intro-00-past_east", []), + "10a_intro-00-past_east---10a_intro-00-past_west": RegionConnection("10a_intro-00-past_east", "10a_intro-00-past_west", []), + + "10a_intro-01-future_west---10a_intro-01-future_east": RegionConnection("10a_intro-01-future_west", "10a_intro-01-future_east", [[ItemName.badeline_boosters, ItemName.blue_clouds, ], ]), + + "10a_intro-02-launch_bottom---10a_intro-02-launch_top": RegionConnection("10a_intro-02-launch_bottom", "10a_intro-02-launch_top", [[ItemName.badeline_boosters, ItemName.blue_clouds, ], ]), + "10a_intro-02-launch_top---10a_intro-02-launch_bottom": RegionConnection("10a_intro-02-launch_top", "10a_intro-02-launch_bottom", []), + + "10a_intro-03-space_west---10a_intro-03-space_east": RegionConnection("10a_intro-03-space_west", "10a_intro-03-space_east", []), + "10a_intro-03-space_east---10a_intro-03-space_west": RegionConnection("10a_intro-03-space_east", "10a_intro-03-space_west", []), + + "10a_a-00_west---10a_a-00_east": RegionConnection("10a_a-00_west", "10a_a-00_east", [[ItemName.double_dash_refills, ], ]), + "10a_a-00_east---10a_a-00_west": RegionConnection("10a_a-00_east", "10a_a-00_west", []), + + "10a_a-01_west---10a_a-01_east": RegionConnection("10a_a-01_west", "10a_a-01_east", [[ItemName.double_dash_refills, ItemName.dash_refills, ], ]), + "10a_a-01_east---10a_a-01_west": RegionConnection("10a_a-01_east", "10a_a-01_west", [[ItemName.double_dash_refills, ItemName.dash_refills, ], ]), + + "10a_a-02_west---10a_a-02_east": RegionConnection("10a_a-02_west", "10a_a-02_east", [[ItemName.double_dash_refills, ItemName.swap_blocks, ], ]), + + "10a_a-03_west---10a_a-03_east": RegionConnection("10a_a-03_west", "10a_a-03_east", [[ItemName.double_dash_refills, ItemName.swap_blocks, ], ]), + + "10a_a-04_west---10a_a-04_east": RegionConnection("10a_a-04_west", "10a_a-04_east", [[ItemName.double_dash_refills, ItemName.springs, ], ]), + + "10a_a-05_west---10a_a-05_east": RegionConnection("10a_a-05_west", "10a_a-05_east", [[ItemName.coins, ItemName.springs, ], ]), + + "10a_b-00_west---10a_b-00_east": RegionConnection("10a_b-00_west", "10a_b-00_east", [[ItemName.pufferfish, ], ]), + + "10a_b-01_west---10a_b-01_east": RegionConnection("10a_b-01_west", "10a_b-01_east", [[ItemName.pufferfish, ], ]), + + "10a_b-02_west---10a_b-02_east": RegionConnection("10a_b-02_west", "10a_b-02_east", [[ItemName.pufferfish, ItemName.coins, ], ]), + + "10a_b-03_west---10a_b-03_east": RegionConnection("10a_b-03_west", "10a_b-03_east", [[ItemName.pufferfish, ItemName.coins, ItemName.dream_blocks, ], ]), + + "10a_b-04_west---10a_b-04_east": RegionConnection("10a_b-04_west", "10a_b-04_east", [[ItemName.pufferfish, ItemName.coins, ItemName.springs, ], ]), + + "10a_b-05_west---10a_b-05_east": RegionConnection("10a_b-05_west", "10a_b-05_east", [[ItemName.pufferfish, ItemName.springs, ], ]), + + "10a_b-06_west---10a_b-06_east": RegionConnection("10a_b-06_west", "10a_b-06_east", [[ItemName.pufferfish, ItemName.springs, ItemName.dream_blocks, ItemName.dash_refills, ], ]), + + "10a_b-07_west---10a_b-07_east": RegionConnection("10a_b-07_west", "10a_b-07_east", [[ItemName.double_dash_refills, ItemName.dash_refills, ], ]), + + "10a_c-00_west---10a_c-00_east": RegionConnection("10a_c-00_west", "10a_c-00_east", [[ItemName.jellyfish, ], ]), + "10a_c-00_west---10a_c-00_north-east": RegionConnection("10a_c-00_west", "10a_c-00_north-east", [[ItemName.jellyfish, ItemName.dash_refills, ], ]), + + "10a_c-00b_west---10a_c-00b_east": RegionConnection("10a_c-00b_west", "10a_c-00b_east", [[ItemName.jellyfish, ItemName.springs, ], ]), + + "10a_c-01_west---10a_c-01_east": RegionConnection("10a_c-01_west", "10a_c-01_east", [[ItemName.jellyfish, ], ]), + + "10a_c-02_west---10a_c-02_east": RegionConnection("10a_c-02_west", "10a_c-02_east", [[ItemName.jellyfish, ], ]), + + "10a_c-alt-00_west---10a_c-alt-00_east": RegionConnection("10a_c-alt-00_west", "10a_c-alt-00_east", [[ItemName.jellyfish, ItemName.double_dash_refills, ], ]), + + "10a_c-alt-01_west---10a_c-alt-01_east": RegionConnection("10a_c-alt-01_west", "10a_c-alt-01_east", []), + + "10a_c-03_south-west---10a_c-03_south": RegionConnection("10a_c-03_south-west", "10a_c-03_south", []), + "10a_c-03_south---10a_c-03_north": RegionConnection("10a_c-03_south", "10a_c-03_north", [[ItemName.jellyfish, ItemName.springs, ], ]), + "10a_c-03_north---10a_c-03_south": RegionConnection("10a_c-03_north", "10a_c-03_south", []), + + "10a_d-00_south---10a_d-00_south-east": RegionConnection("10a_d-00_south", "10a_d-00_south-east", [[ItemName.red_boosters, ], ]), + "10a_d-00_south---10a_d-00_north": RegionConnection("10a_d-00_south", "10a_d-00_north", [[ItemName.red_boosters, "Farewell - Power Source Key 1", "Farewell - Power Source Key 2", "Farewell - Power Source Key 3", "Farewell - Power Source Key 4", "Farewell - Power Source Key 5", ], ]), + "10a_d-00_north---10a_d-00_south": RegionConnection("10a_d-00_north", "10a_d-00_south", [["Farewell - Power Source Key 5", ], ]), + "10a_d-00_south-east---10a_d-00_south": RegionConnection("10a_d-00_south-east", "10a_d-00_south", [[ItemName.double_dash_refills, ItemName.dash_switches, ], ]), + "10a_d-00_south-east---10a_d-00_north-west": RegionConnection("10a_d-00_south-east", "10a_d-00_north-west", [[ItemName.double_dash_refills, ItemName.springs, ItemName.dash_switches, ], ]), + "10a_d-00_south-east---10a_d-00_south-east-door": RegionConnection("10a_d-00_south-east", "10a_d-00_south-east-door", []), + "10a_d-00_north-west---10a_d-00_south": RegionConnection("10a_d-00_north-west", "10a_d-00_south", [[ItemName.jellyfish, ItemName.dash_switches, ], ]), + "10a_d-00_north-west---10a_d-00_breaker": RegionConnection("10a_d-00_north-west", "10a_d-00_breaker", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_switches, ItemName.breaker_boxes, ], ]), + "10a_d-00_breaker---10a_d-00_south": RegionConnection("10a_d-00_breaker", "10a_d-00_south", []), + "10a_d-00_breaker---10a_d-00_north-east-door": RegionConnection("10a_d-00_breaker", "10a_d-00_north-east-door", []), + "10a_d-00_breaker---10a_d-00_south-west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_south-west-door", []), + "10a_d-00_breaker---10a_d-00_west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_west-door", []), + "10a_d-00_breaker---10a_d-00_north-west-door": RegionConnection("10a_d-00_breaker", "10a_d-00_north-west-door", []), + "10a_d-00_north-east-door---10a_d-00_south": RegionConnection("10a_d-00_north-east-door", "10a_d-00_south", [[ItemName.breaker_boxes, ], ]), + "10a_d-00_south-east-door---10a_d-00_south": RegionConnection("10a_d-00_south-east-door", "10a_d-00_south", [[ItemName.breaker_boxes, ], ]), + "10a_d-00_south-west-door---10a_d-00_south": RegionConnection("10a_d-00_south-west-door", "10a_d-00_south", [[ItemName.breaker_boxes, ], ]), + "10a_d-00_west-door---10a_d-00_south": RegionConnection("10a_d-00_west-door", "10a_d-00_south", [[ItemName.breaker_boxes, ], ]), + "10a_d-00_north-west-door---10a_d-00_south": RegionConnection("10a_d-00_north-west-door", "10a_d-00_south", [[ItemName.breaker_boxes, ], ]), + + + + + + "10a_d-05_south---10a_d-05_north": RegionConnection("10a_d-05_south", "10a_d-05_north", [[ItemName.red_boosters, ], ]), + + "10a_e-00y_south---10a_e-00y_north": RegionConnection("10a_e-00y_south", "10a_e-00y_north", [[ItemName.red_boosters, ], ]), + "10a_e-00y_south---10a_e-00y_south-east": RegionConnection("10a_e-00y_south", "10a_e-00y_south-east", []), + "10a_e-00y_south-east---10a_e-00y_south": RegionConnection("10a_e-00y_south-east", "10a_e-00y_south", []), + "10a_e-00y_north-east---10a_e-00y_north": RegionConnection("10a_e-00y_north-east", "10a_e-00y_north", [[ItemName.red_boosters, ], ]), + + "10a_e-00yb_south---10a_e-00yb_north": RegionConnection("10a_e-00yb_south", "10a_e-00yb_north", [[ItemName.red_boosters, ItemName.dash_refills, ItemName.double_dash_refills, ], ]), + + "10a_e-00z_south---10a_e-00z_north": RegionConnection("10a_e-00z_south", "10a_e-00z_north", []), + "10a_e-00z_north---10a_e-00z_south": RegionConnection("10a_e-00z_north", "10a_e-00z_south", []), + + "10a_e-00_south---10a_e-00_north": RegionConnection("10a_e-00_south", "10a_e-00_north", [[ItemName.blue_clouds, ItemName.pufferfish, ItemName.coins, ItemName.double_dash_refills, ], ]), + + "10a_e-00b_south---10a_e-00b_north": RegionConnection("10a_e-00b_south", "10a_e-00b_north", [[ItemName.jellyfish, ItemName.springs, ], ]), + "10a_e-00b_north---10a_e-00b_south": RegionConnection("10a_e-00b_north", "10a_e-00b_south", []), + + "10a_e-01_south---10a_e-01_north": RegionConnection("10a_e-01_south", "10a_e-01_north", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_refills, ], ]), + + "10a_e-02_west---10a_e-02_east": RegionConnection("10a_e-02_west", "10a_e-02_east", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_refills, ItemName.coins, ], ]), + + "10a_e-03_west---10a_e-03_east": RegionConnection("10a_e-03_west", "10a_e-03_east", [[ItemName.pufferfish, ItemName.springs, ItemName.double_dash_refills, ], ]), + "10a_e-03_east---10a_e-03_east": RegionConnection("10a_e-03_east", "10a_e-03_east", [[ItemName.pufferfish, ], ]), + + "10a_e-04_west---10a_e-04_east": RegionConnection("10a_e-04_west", "10a_e-04_east", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_switches, ], ]), + + "10a_e-05_west---10a_e-05_east": RegionConnection("10a_e-05_west", "10a_e-05_east", [[ItemName.pufferfish, ItemName.springs, ItemName.coins, ItemName.traffic_blocks, ], ]), + + "10a_e-05b_west---10a_e-05b_east": RegionConnection("10a_e-05b_west", "10a_e-05b_east", [[ItemName.pufferfish, ItemName.swap_blocks, ], ]), + + "10a_e-05c_west---10a_e-05c_east": RegionConnection("10a_e-05c_west", "10a_e-05c_east", [[ItemName.pufferfish, ItemName.swap_blocks, ItemName.double_dash_refills, ], ]), + + "10a_e-06_west---10a_e-06_east": RegionConnection("10a_e-06_west", "10a_e-06_east", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_refills, ItemName.coins, ], ]), + + "10a_e-07_west---10a_e-07_east": RegionConnection("10a_e-07_west", "10a_e-07_east", [[ItemName.pufferfish, ItemName.springs, ItemName.double_dash_refills, ItemName.move_blocks, ], ]), + + "10a_e-08_west---10a_e-08_east": RegionConnection("10a_e-08_west", "10a_e-08_east", [[ItemName.jellyfish, ItemName.springs, ItemName.double_dash_refills, ItemName.coins, ], ]), + + "10b_f-door_west---10b_f-door_east": RegionConnection("10b_f-door_west", "10b_f-door_east", [[ItemName.double_dash_refills, ], ]), + "10b_f-door_east---10b_f-door_west": RegionConnection("10b_f-door_east", "10b_f-door_west", []), + + "10b_f-00_west---10b_f-00_east": RegionConnection("10b_f-00_west", "10b_f-00_east", [[ItemName.springs, ItemName.dream_blocks, ], ]), + + "10b_f-01_west---10b_f-01_east": RegionConnection("10b_f-01_west", "10b_f-01_east", []), + "10b_f-01_east---10b_f-01_west": RegionConnection("10b_f-01_east", "10b_f-01_west", []), + + "10b_f-02_west---10b_f-02_east": RegionConnection("10b_f-02_west", "10b_f-02_east", []), + + "10b_f-03_west---10b_f-03_east": RegionConnection("10b_f-03_west", "10b_f-03_east", [[ItemName.double_dash_refills, ], ]), + + "10b_f-04_west---10b_f-04_east": RegionConnection("10b_f-04_west", "10b_f-04_east", []), + "10b_f-04_east---10b_f-04_west": RegionConnection("10b_f-04_east", "10b_f-04_west", []), + + "10b_f-05_west---10b_f-05_east": RegionConnection("10b_f-05_west", "10b_f-05_east", [[ItemName.double_dash_refills, ], ]), + + "10b_f-06_west---10b_f-06_east": RegionConnection("10b_f-06_west", "10b_f-06_east", [[ItemName.double_dash_refills, ItemName.kevin_blocks, ItemName.dream_blocks, ItemName.coins, ], ]), + + "10b_f-07_west---10b_f-07_east": RegionConnection("10b_f-07_west", "10b_f-07_east", [[ItemName.dash_refills, ItemName.traffic_blocks, ], ]), + + "10b_f-08_west---10b_f-08_east": RegionConnection("10b_f-08_west", "10b_f-08_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ItemName.move_blocks, ], ]), + + "10b_f-09_west---10b_f-09_east": RegionConnection("10b_f-09_west", "10b_f-09_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ], ]), + + "10b_g-00_bottom---10b_g-00_top": RegionConnection("10b_g-00_bottom", "10b_g-00_top", [[ItemName.dash_refills, ItemName.traffic_blocks, ], ]), + "10b_g-00_top---10b_g-00_bottom": RegionConnection("10b_g-00_top", "10b_g-00_bottom", []), + + "10b_g-01_bottom---10b_g-01_top": RegionConnection("10b_g-01_bottom", "10b_g-01_top", [[ItemName.blue_boosters, ], ]), + "10b_g-01_top---10b_g-01_bottom": RegionConnection("10b_g-01_top", "10b_g-01_bottom", []), + + "10b_g-03_bottom---10b_g-03_top": RegionConnection("10b_g-03_bottom", "10b_g-03_top", [[ItemName.dream_blocks, ItemName.coins, ], ]), + + "10b_g-02_west---10b_g-02_east": RegionConnection("10b_g-02_west", "10b_g-02_east", [[ItemName.dream_blocks, ], ]), + + "10b_g-04_west---10b_g-04_east": RegionConnection("10b_g-04_west", "10b_g-04_east", [[ItemName.move_blocks, ItemName.springs, ], ]), + + "10b_g-05_west---10b_g-05_east": RegionConnection("10b_g-05_west", "10b_g-05_east", []), + + "10b_g-06_west---10b_g-06_east": RegionConnection("10b_g-06_west", "10b_g-06_east", [[ItemName.double_dash_refills, ItemName.feathers, ], ]), + + "10b_h-00b_west---10b_h-00b_east": RegionConnection("10b_h-00b_west", "10b_h-00b_east", [[ItemName.double_dash_refills, ItemName.feathers, ], ]), + + "10b_h-00_west---10b_h-00_east": RegionConnection("10b_h-00_west", "10b_h-00_east", [[ItemName.dash_refills, ItemName.swap_blocks, ], ]), + + "10b_h-01_west---10b_h-01_east": RegionConnection("10b_h-01_west", "10b_h-01_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.springs, ItemName.move_blocks, ], ]), + + "10b_h-02_west---10b_h-02_east": RegionConnection("10b_h-02_west", "10b_h-02_east", [[ItemName.red_boosters, ], ]), + + "10b_h-03_west---10b_h-03_east": RegionConnection("10b_h-03_west", "10b_h-03_east", [[ItemName.coins, ItemName.double_dash_refills, ItemName.springs, ], ]), + + "10b_h-03b_west---10b_h-03b_east": RegionConnection("10b_h-03b_west", "10b_h-03b_east", [[ItemName.coins, ItemName.double_dash_refills, ItemName.core_blocks, ], ]), + + "10b_h-04_top---10b_h-04_east": RegionConnection("10b_h-04_top", "10b_h-04_east", []), + "10b_h-04_top---10b_h-04_bottom": RegionConnection("10b_h-04_top", "10b_h-04_bottom", [[ItemName.red_boosters, ], ]), + + "10b_h-04b_west---10b_h-04b_east": RegionConnection("10b_h-04b_west", "10b_h-04b_east", [[ItemName.double_dash_refills, ], ]), + + "10b_h-05_west---10b_h-05_top": RegionConnection("10b_h-05_west", "10b_h-05_top", []), + "10b_h-05_top---10b_h-05_east": RegionConnection("10b_h-05_top", "10b_h-05_east", [[ItemName.double_dash_refills, ItemName.coins, ], ]), + + "10b_h-06_west---10b_h-06_east": RegionConnection("10b_h-06_west", "10b_h-06_east", [[ItemName.dash_refills, ItemName.springs, ItemName.feathers, ], ]), + + "10b_h-06b_bottom---10b_h-06b_top": RegionConnection("10b_h-06b_bottom", "10b_h-06b_top", [[ItemName.fire_ice_balls, ItemName.coins, ], ]), + "10b_h-06b_top---10b_h-06b_bottom": RegionConnection("10b_h-06b_top", "10b_h-06b_bottom", []), + + "10b_h-07_west---10b_h-07_east": RegionConnection("10b_h-07_west", "10b_h-07_east", [[ItemName.blue_boosters, ItemName.springs, ItemName.coins, ], ]), + + "10b_h-08_west---10b_h-08_east": RegionConnection("10b_h-08_west", "10b_h-08_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ], ]), + + "10b_h-09_west---10b_h-09_east": RegionConnection("10b_h-09_west", "10b_h-09_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ItemName.feathers, ItemName.kevin_blocks, ], ]), + + "10b_h-10_west---10b_h-10_east": RegionConnection("10b_h-10_west", "10b_h-10_east", [[ItemName.feathers, ItemName.springs, ItemName.badeline_boosters, ], ]), + + "10b_i-00_west---10b_i-00_east": RegionConnection("10b_i-00_west", "10b_i-00_east", [[ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks, ], ]), + "10b_i-00_east---10b_i-00_west": RegionConnection("10b_i-00_east", "10b_i-00_west", [[ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks, ], ]), + + "10b_i-00b_west---10b_i-00b_east": RegionConnection("10b_i-00b_west", "10b_i-00b_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.springs, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks, ], ]), + + "10b_i-01_west---10b_i-01_east": RegionConnection("10b_i-01_west", "10b_i-01_east", [[ItemName.coins, ItemName.springs, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ], ]), + + "10b_i-02_west---10b_i-02_east": RegionConnection("10b_i-02_west", "10b_i-02_east", [[ItemName.double_dash_refills, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + + "10b_i-03_west---10b_i-03_east": RegionConnection("10b_i-03_west", "10b_i-03_east", [[ItemName.double_dash_refills, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ], ]), + + "10b_i-04_west---10b_i-04_east": RegionConnection("10b_i-04_west", "10b_i-04_east", [[ItemName.red_boosters, ItemName.coins, ], ]), + + "10b_i-05_west---10b_i-05_east": RegionConnection("10b_i-05_west", "10b_i-05_east", [[ItemName.double_dash_refills, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ItemName.yellow_cassette_blocks, ], ]), + + "10b_j-00_west---10b_j-00_east": RegionConnection("10b_j-00_west", "10b_j-00_east", [[ItemName.dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-00b_west---10b_j-00b_east": RegionConnection("10b_j-00b_west", "10b_j-00b_east", [[ItemName.double_dash_refills, ItemName.springs, ItemName.jellyfish, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-01_west---10b_j-01_east": RegionConnection("10b_j-01_west", "10b_j-01_east", [[ItemName.dash_refills, ItemName.springs, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-02_west---10b_j-02_east": RegionConnection("10b_j-02_west", "10b_j-02_east", [[ItemName.jellyfish, ItemName.springs, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-03_west---10b_j-03_east": RegionConnection("10b_j-03_west", "10b_j-03_east", [[ItemName.pufferfish, ItemName.springs, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-04_west---10b_j-04_east": RegionConnection("10b_j-04_west", "10b_j-04_east", [[ItemName.jellyfish, ItemName.bird, ], ]), + + "10b_j-05_west---10b_j-05_east": RegionConnection("10b_j-05_west", "10b_j-05_east", [[ItemName.bird, ItemName.badeline_boosters, ItemName.feathers, ], ]), + + "10b_j-06_west---10b_j-06_east": RegionConnection("10b_j-06_west", "10b_j-06_east", [[ItemName.dash_refills, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-07_west---10b_j-07_east": RegionConnection("10b_j-07_west", "10b_j-07_east", [[ItemName.pufferfish, ItemName.feathers, ItemName.springs, ItemName.bird, ], ]), + + "10b_j-08_west---10b_j-08_east": RegionConnection("10b_j-08_west", "10b_j-08_east", [[ItemName.dream_blocks, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-09_west---10b_j-09_east": RegionConnection("10b_j-09_west", "10b_j-09_east", [[ItemName.jellyfish, ItemName.springs, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-10_west---10b_j-10_east": RegionConnection("10b_j-10_west", "10b_j-10_east", [[ItemName.pufferfish, ItemName.swap_blocks, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-11_west---10b_j-11_east": RegionConnection("10b_j-11_west", "10b_j-11_east", [[ItemName.springs, ItemName.move_blocks, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-12_west---10b_j-12_east": RegionConnection("10b_j-12_west", "10b_j-12_east", [[ItemName.springs, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.bird, ], ]), + + "10b_j-13_west---10b_j-13_east": RegionConnection("10b_j-13_west", "10b_j-13_east", [[ItemName.springs, ItemName.feathers, ItemName.double_dash_refills, ], ]), + + "10b_j-14_west---10b_j-14_east": RegionConnection("10b_j-14_west", "10b_j-14_east", [[ItemName.traffic_blocks, ItemName.pufferfish, ItemName.double_dash_refills, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-14b_west---10b_j-14b_east": RegionConnection("10b_j-14b_west", "10b_j-14b_east", [[ItemName.springs, ItemName.jellyfish, ItemName.double_dash_refills, ], ]), + + "10b_j-15_west---10b_j-15_east": RegionConnection("10b_j-15_west", "10b_j-15_east", [[ItemName.kevin_blocks, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-16_west---10b_j-16_east": RegionConnection("10b_j-16_west", "10b_j-16_east", [[ItemName.jellyfish, ItemName.pufferfish, ItemName.springs, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ItemName.feathers, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + "10b_j-16_west---10b_j-16_top": RegionConnection("10b_j-16_west", "10b_j-16_top", [[ItemName.jellyfish, ItemName.pufferfish, ItemName.springs, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ItemName.feathers, ItemName.bird, ItemName.badeline_boosters, ItemName.breaker_boxes, ], ]), + + "10b_j-17_south---10b_j-17_west": RegionConnection("10b_j-17_south", "10b_j-17_west", []), + "10b_j-17_west---10b_j-17_south": RegionConnection("10b_j-17_west", "10b_j-17_south", []), + "10b_j-17_north---10b_j-17_south": RegionConnection("10b_j-17_north", "10b_j-17_south", []), + "10b_j-17_north---10b_j-17_east": RegionConnection("10b_j-17_north", "10b_j-17_east", []), + + "10b_j-18_west---10b_j-18_east": RegionConnection("10b_j-18_west", "10b_j-18_east", []), + + "10b_j-19_bottom---10b_j-19_top": RegionConnection("10b_j-19_bottom", "10b_j-19_top", [[ItemName.jellyfish, ItemName.springs, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.coins, ], ]), + + "10b_GOAL_main---10b_GOAL_moon": RegionConnection("10b_GOAL_main", "10b_GOAL_moon", []), + "10b_GOAL_moon---10b_GOAL_main": RegionConnection("10b_GOAL_moon", "10b_GOAL_main", []), + + "10c_end-golden_bottom---10c_end-golden_top": RegionConnection("10c_end-golden_bottom", "10c_end-golden_top", [[ItemName.double_dash_refills, ItemName.jellyfish, ItemName.springs, ItemName.pufferfish, ItemName.badeline_boosters, ], ]), + +} + +all_locations: dict[str, LevelLocation] = { + "0a_-1_car": LevelLocation("0a_-1_car", "Prologue - Car", "0a_-1_main", LocationType.car, []), + "0a_3_clear": LevelLocation("0a_3_clear", "Prologue - Level Clear", "0a_3_east", LocationType.level_clear, []), + + "1a_2_strawberry": LevelLocation("1a_2_strawberry", "Forsaken City A - Room 2 Strawberry", "1a_2_west", LocationType.strawberry, [[ItemName.springs, ], ]), + "1a_3_strawberry": LevelLocation("1a_3_strawberry", "Forsaken City A - Room 3 Strawberry", "1a_3_east", LocationType.strawberry, []), + "1a_3b_strawberry": LevelLocation("1a_3b_strawberry", "Forsaken City A - Room 3b Strawberry", "1a_3b_top", LocationType.strawberry, []), + "1a_5_strawberry": LevelLocation("1a_5_strawberry", "Forsaken City A - Room 5 Strawberry", "1a_5_north-west", LocationType.strawberry, []), + "1a_5z_strawberry": LevelLocation("1a_5z_strawberry", "Forsaken City A - Room 5z Strawberry", "1a_5z_east", LocationType.strawberry, [[ItemName.springs, ], ]), + "1a_5a_strawberry": LevelLocation("1a_5a_strawberry", "Forsaken City A - Room 5a Strawberry", "1a_5a_west", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_6_strawberry": LevelLocation("1a_6_strawberry", "Forsaken City A - Room 6 Strawberry", "1a_6_east", LocationType.strawberry, []), + "1a_7zb_strawberry": LevelLocation("1a_7zb_strawberry", "Forsaken City A - Room 7zb Strawberry", "1a_7zb_west", LocationType.strawberry, []), + "1a_s1_strawberry": LevelLocation("1a_s1_strawberry", "Forsaken City A - Room s1 Strawberry", "1a_s1_east", LocationType.strawberry, []), + "1a_s1_crystal_heart": LevelLocation("1a_s1_crystal_heart", "Forsaken City A - Crystal Heart", "1a_s1_east", LocationType.crystal_heart, []), + "1a_7z_strawberry": LevelLocation("1a_7z_strawberry", "Forsaken City A - Room 7z Strawberry", "1a_7z_bottom", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "1a_8zb_strawberry": LevelLocation("1a_8zb_strawberry", "Forsaken City A - Room 8zb Strawberry", "1a_8zb_west", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "1a_7a_strawberry": LevelLocation("1a_7a_strawberry", "Forsaken City A - Room 7a Strawberry", "1a_7a_east", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_9z_strawberry": LevelLocation("1a_9z_strawberry", "Forsaken City A - Room 9z Strawberry", "1a_9z_east", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_8b_strawberry": LevelLocation("1a_8b_strawberry", "Forsaken City A - Room 8b Strawberry", "1a_8b_east", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_9_strawberry": LevelLocation("1a_9_strawberry", "Forsaken City A - Room 9 Strawberry", "1a_9_west", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_9b_strawberry": LevelLocation("1a_9b_strawberry", "Forsaken City A - Room 9b Strawberry", "1a_9b_east", LocationType.strawberry, []), + "1a_9c_strawberry": LevelLocation("1a_9c_strawberry", "Forsaken City A - Room 9c Strawberry", "1a_9c_west", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "1a_10zb_strawberry": LevelLocation("1a_10zb_strawberry", "Forsaken City A - Room 10zb Strawberry", "1a_10zb_east", LocationType.strawberry, []), + "1a_11_strawberry": LevelLocation("1a_11_strawberry", "Forsaken City A - Room 11 Strawberry", "1a_11_south", LocationType.strawberry, []), + "1a_11z_cassette": LevelLocation("1a_11z_cassette", "Forsaken City A - Cassette", "1a_11z_east", LocationType.cassette, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + "1a_12z_strawberry": LevelLocation("1a_12z_strawberry", "Forsaken City A - Room 12z Strawberry", "1a_12z_east", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "1a_end_clear": LevelLocation("1a_end_clear", "Forsaken City A - Level Clear", "1a_end_main", LocationType.level_clear, []), + "1a_end_golden": LevelLocation("1a_end_golden", "Forsaken City A - Golden Strawberry", "1a_end_main", LocationType.golden_strawberry, [[ItemName.springs, ItemName.traffic_blocks, ItemName.dash_refills, ], ]), + "1a_end_winged_golden": LevelLocation("1a_end_winged_golden", "Forsaken City A - Winged Golden Strawberry", "1a_end_main", LocationType.golden_strawberry, [[ItemName.springs, ItemName.traffic_blocks, ], ]), + + "1b_03_binoculars": LevelLocation("1b_03_binoculars", "Forsaken City B - Room 03 Binoculars", "1b_03_west", LocationType.binoculars, []), + "1b_09_binoculars": LevelLocation("1b_09_binoculars", "Forsaken City B - Room 09 Binoculars", "1b_09_west", LocationType.binoculars, []), + "1b_end_clear": LevelLocation("1b_end_clear", "Forsaken City B - Level Clear", "1b_end_goal", LocationType.level_clear, []), + "1b_end_golden": LevelLocation("1b_end_golden", "Forsaken City B - Golden Strawberry", "1b_end_goal", LocationType.golden_strawberry, [[ItemName.springs, ItemName.traffic_blocks, ItemName.dash_refills, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + + "1c_01_binoculars": LevelLocation("1c_01_binoculars", "Forsaken City C - Room 01 Binoculars", "1c_01_west", LocationType.binoculars, []), + "1c_02_binoculars": LevelLocation("1c_02_binoculars", "Forsaken City C - Room 02 Binoculars", "1c_02_west", LocationType.binoculars, []), + "1c_02_clear": LevelLocation("1c_02_clear", "Forsaken City C - Level Clear", "1c_02_goal", LocationType.level_clear, []), + "1c_02_golden": LevelLocation("1c_02_golden", "Forsaken City C - Golden Strawberry", "1c_02_goal", LocationType.golden_strawberry, [[ItemName.traffic_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + + "2a_s2_crystal_heart": LevelLocation("2a_s2_crystal_heart", "Old Site A - Crystal Heart", "2a_s2_bottom", LocationType.crystal_heart, []), + "2a_1_strawberry": LevelLocation("2a_1_strawberry", "Old Site A - Room 1 Strawberry", "2a_1_north-west", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_d0_strawberry": LevelLocation("2a_d0_strawberry", "Old Site A - Room d0 Strawberry", "2a_d0_north", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_d3_binoculars": LevelLocation("2a_d3_binoculars", "Old Site A - Room d3 Binoculars", "2a_d3_north", LocationType.binoculars, []), + "2a_d3_strawberry": LevelLocation("2a_d3_strawberry", "Old Site A - Room d3 Strawberry", "2a_d3_south", LocationType.strawberry, []), + "2a_d2_strawberry_1": LevelLocation("2a_d2_strawberry_1", "Old Site A - Room d2 Strawberry 1", "2a_d2_north-west", LocationType.strawberry, []), + "2a_d2_strawberry_2": LevelLocation("2a_d2_strawberry_2", "Old Site A - Room d2 Strawberry 2", "2a_d2_east", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_d9_cassette": LevelLocation("2a_d9_cassette", "Old Site A - Cassette", "2a_d9_north-west", LocationType.cassette, [[ItemName.dream_blocks, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + "2a_d1_strawberry": LevelLocation("2a_d1_strawberry", "Old Site A - Room d1 Strawberry", "2a_d1_south-west", LocationType.strawberry, [[ItemName.dream_blocks, ItemName.strawberry_seeds, ], ]), + "2a_d6_strawberry": LevelLocation("2a_d6_strawberry", "Old Site A - Room d6 Strawberry", "2a_d6_west", LocationType.strawberry, []), + "2a_d4_strawberry": LevelLocation("2a_d4_strawberry", "Old Site A - Room d4 Strawberry", "2a_d4_west", LocationType.strawberry, [[ItemName.traffic_blocks, ItemName.dream_blocks, ], ]), + "2a_d5_strawberry": LevelLocation("2a_d5_strawberry", "Old Site A - Room d5 Strawberry", "2a_d5_west", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_4_strawberry": LevelLocation("2a_4_strawberry", "Old Site A - Room 4 Strawberry", "2a_4_bottom", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_5_strawberry": LevelLocation("2a_5_strawberry", "Old Site A - Room 5 Strawberry", "2a_5_bottom", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_8_strawberry": LevelLocation("2a_8_strawberry", "Old Site A - Room 8 Strawberry", "2a_8_bottom", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_9_strawberry": LevelLocation("2a_9_strawberry", "Old Site A - Room 9 Strawberry", "2a_9_south", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_9b_strawberry": LevelLocation("2a_9b_strawberry", "Old Site A - Room 9b Strawberry", "2a_9b_east", LocationType.strawberry, []), + "2a_10_strawberry": LevelLocation("2a_10_strawberry", "Old Site A - Room 10 Strawberry", "2a_10_top", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_12c_strawberry": LevelLocation("2a_12c_strawberry", "Old Site A - Room 12c Strawberry", "2a_12c_south", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_12d_strawberry": LevelLocation("2a_12d_strawberry", "Old Site A - Room 12d Strawberry", "2a_12d_north-west", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "2a_end_3c_strawberry": LevelLocation("2a_end_3c_strawberry", "Old Site A - Room end_3c Strawberry", "2a_end_3c_bottom", LocationType.strawberry, [[ItemName.springs, ], ]), + "2a_end_6_clear": LevelLocation("2a_end_6_clear", "Old Site A - Level Clear", "2a_end_6_main", LocationType.level_clear, []), + "2a_end_6_golden": LevelLocation("2a_end_6_golden", "Old Site A - Golden Strawberry", "2a_end_6_main", LocationType.golden_strawberry, [[ItemName.dream_blocks, ItemName.coins, ItemName.dash_refills, ], ]), + + "2b_10_binoculars": LevelLocation("2b_10_binoculars", "Old Site B - Room 10 Binoculars", "2b_10_west", LocationType.binoculars, []), + "2b_11_binoculars": LevelLocation("2b_11_binoculars", "Old Site B - Room 11 Binoculars", "2b_11_bottom", LocationType.binoculars, []), + "2b_end_clear": LevelLocation("2b_end_clear", "Old Site B - Level Clear", "2b_end_goal", LocationType.level_clear, []), + "2b_end_golden": LevelLocation("2b_end_golden", "Old Site B - Golden Strawberry", "2b_end_goal", LocationType.golden_strawberry, [[ItemName.springs, ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins, ItemName.blue_cassette_blocks, ], ]), + + "2c_02_binoculars": LevelLocation("2c_02_binoculars", "Old Site C - Room 02 Binoculars", "2c_02_west", LocationType.binoculars, []), + "2c_02_clear": LevelLocation("2c_02_clear", "Old Site C - Level Clear", "2c_02_goal", LocationType.level_clear, []), + "2c_02_golden": LevelLocation("2c_02_golden", "Old Site C - Golden Strawberry", "2c_02_goal", LocationType.golden_strawberry, [[ItemName.dream_blocks, ItemName.dash_refills, ItemName.coins, ], ]), + + "3a_s2_strawberry_1": LevelLocation("3a_s2_strawberry_1", "Celestial Resort A - Room s2 Strawberry 1", "3a_s2_west", LocationType.strawberry, []), + "3a_s2_strawberry_2": LevelLocation("3a_s2_strawberry_2", "Celestial Resort A - Room s2 Strawberry 2", "3a_s2_north-west", LocationType.strawberry, []), + "3a_s3_key_1": LevelLocation("3a_s3_key_1", "Celestial Resort A - Front Door Key", "3a_s3_west", LocationType.key, []), + "3a_s3_strawberry": LevelLocation("3a_s3_strawberry", "Celestial Resort A - Room s3 Strawberry", "3a_s3_north", LocationType.strawberry, []), + "3a_00-a_strawberry": LevelLocation("3a_00-a_strawberry", "Celestial Resort A - Room 00-a Strawberry", "3a_00-a_east", LocationType.strawberry, []), + "3a_02-b_hallway_key_1": LevelLocation("3a_02-b_hallway_key_1", "Celestial Resort A - Hallway Key 1", "3a_02-b_east", LocationType.key, []), + "3a_00-b_strawberry": LevelLocation("3a_00-b_strawberry", "Celestial Resort A - Room 00-b Strawberry", "3a_00-b_east", LocationType.strawberry, []), + "3a_04-b_strawberry": LevelLocation("3a_04-b_strawberry", "Celestial Resort A - Room 04-b Strawberry", "3a_04-b_east", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "3a_06-a_strawberry": LevelLocation("3a_06-a_strawberry", "Celestial Resort A - Room 06-a Strawberry", "3a_06-a_west", LocationType.strawberry, []), + "3a_07-b_strawberry": LevelLocation("3a_07-b_strawberry", "Celestial Resort A - Room 07-b Strawberry", "3a_07-b_top", LocationType.strawberry, []), + "3a_07-b_key_2": LevelLocation("3a_07-b_key_2", "Celestial Resort A - Hallway Key 2", "3a_07-b_east", LocationType.key, []), + "3a_06-b_strawberry": LevelLocation("3a_06-b_strawberry", "Celestial Resort A - Room 06-b Strawberry", "3a_06-b_east", LocationType.strawberry, []), + "3a_06-c_strawberry": LevelLocation("3a_06-c_strawberry", "Celestial Resort A - Room 06-c Strawberry", "3a_06-c_south-west", LocationType.strawberry, []), + "3a_05-c_strawberry": LevelLocation("3a_05-c_strawberry", "Celestial Resort A - Room 05-c Strawberry", "3a_05-c_east", LocationType.strawberry, []), + "3a_09-b_key_4": LevelLocation("3a_09-b_key_4", "Celestial Resort A - Huge Mess Key", "3a_09-b_center", LocationType.key, [[ItemName.brown_clutter, ItemName.green_clutter, ItemName.pink_clutter, ], ]), + "3a_10-x_brown_clutter": LevelLocation("3a_10-x_brown_clutter", "Celestial Resort A - Brown Clutter", "3a_10-x_south-east", LocationType.clutter, []), + "3a_12-y_strawberry": LevelLocation("3a_12-y_strawberry", "Celestial Resort A - Room 12-y Strawberry", "3a_12-y_west", LocationType.strawberry, []), + "3a_10-y_strawberry": LevelLocation("3a_10-y_strawberry", "Celestial Resort A - Room 10-y Strawberry", "3a_10-y_bottom", LocationType.strawberry, []), + "3a_11-c_crystal_heart": LevelLocation("3a_11-c_crystal_heart", "Celestial Resort A - Crystal Heart", "3a_11-c_south-east", LocationType.crystal_heart, []), + "3a_12-c_strawberry": LevelLocation("3a_12-c_strawberry", "Celestial Resort A - Room 12-c Strawberry", "3a_12-c_west", LocationType.strawberry, []), + "3a_11-d_strawberry": LevelLocation("3a_11-d_strawberry", "Celestial Resort A - Room 11-d Strawberry", "3a_11-d_east", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "3a_10-d_green_clutter": LevelLocation("3a_10-d_green_clutter", "Celestial Resort A - Green Clutter", "3a_10-d_main", LocationType.clutter, []), + "3a_13-b_strawberry": LevelLocation("3a_13-b_strawberry", "Celestial Resort A - Room 13-b Strawberry", "3a_13-b_top", LocationType.strawberry, []), + "3a_13-x_strawberry": LevelLocation("3a_13-x_strawberry", "Celestial Resort A - Room 13-x Strawberry", "3a_13-x_west", LocationType.strawberry, []), + "3a_12-x_pink_clutter": LevelLocation("3a_12-x_pink_clutter", "Celestial Resort A - Pink Clutter", "3a_12-x_east", LocationType.clutter, []), + "3a_08-x_strawberry": LevelLocation("3a_08-x_strawberry", "Celestial Resort A - Room 08-x Strawberry", "3a_08-x_west", LocationType.strawberry, []), + "3a_06-d_strawberry": LevelLocation("3a_06-d_strawberry", "Celestial Resort A - Room 06-d Strawberry", "3a_06-d_east", LocationType.strawberry, []), + "3a_04-c_strawberry": LevelLocation("3a_04-c_strawberry", "Celestial Resort A - Room 04-c Strawberry", "3a_04-c_east", LocationType.strawberry, []), + "3a_02-c_key_5": LevelLocation("3a_02-c_key_5", "Celestial Resort A - Presidential Suite Key", "3a_02-c_west", LocationType.key, []), + "3a_03-b_strawberry_1": LevelLocation("3a_03-b_strawberry_1", "Celestial Resort A - Room 03-b Strawberry 1", "3a_03-b_west", LocationType.strawberry, []), + "3a_03-b_strawberry_2": LevelLocation("3a_03-b_strawberry_2", "Celestial Resort A - Room 03-b Strawberry 2", "3a_03-b_west", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "3a_01-c_cassette": LevelLocation("3a_01-c_cassette", "Celestial Resort A - Cassette", "3a_01-c_east", LocationType.cassette, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + "3a_roof03_strawberry": LevelLocation("3a_roof03_strawberry", "Celestial Resort A - Room roof03 Strawberry", "3a_roof03_west", LocationType.strawberry, []), + "3a_roof06_strawberry_1": LevelLocation("3a_roof06_strawberry_1", "Celestial Resort A - Room roof06 Strawberry 1", "3a_roof06_west", LocationType.strawberry, []), + "3a_roof06_strawberry_2": LevelLocation("3a_roof06_strawberry_2", "Celestial Resort A - Room roof06 Strawberry 2", "3a_roof06_west", LocationType.strawberry, []), + "3a_roof07_clear": LevelLocation("3a_roof07_clear", "Celestial Resort A - Level Clear", "3a_roof07_main", LocationType.level_clear, []), + "3a_roof07_golden": LevelLocation("3a_roof07_golden", "Celestial Resort A - Golden Strawberry", "3a_roof07_main", LocationType.golden_strawberry, [["Celestial Resort A - Front Door Key", "Celestial Resort A - Hallway Key 1", "Celestial Resort A - Hallway Key 2", "Celestial Resort A - Huge Mess Key", "Celestial Resort A - Presidential Suite Key", ItemName.sinking_platforms, ItemName.dash_refills, ItemName.brown_clutter, ItemName.green_clutter, ItemName.pink_clutter, ItemName.coins, ItemName.moving_platforms, ItemName.springs, ], ]), + + "3b_back_binoculars": LevelLocation("3b_back_binoculars", "Celestial Resort B - Room back Binoculars", "3b_back_east", LocationType.binoculars, []), + "3b_12_binoculars": LevelLocation("3b_12_binoculars", "Celestial Resort B - Room 12 Binoculars", "3b_12_west", LocationType.binoculars, []), + "3b_end_clear": LevelLocation("3b_end_clear", "Celestial Resort B - Level Clear", "3b_end_goal", LocationType.level_clear, []), + "3b_end_golden": LevelLocation("3b_end_golden", "Celestial Resort B - Golden Strawberry", "3b_end_goal", LocationType.golden_strawberry, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.moving_platforms, ItemName.sinking_platforms, ], ]), + + "3c_02_binoculars": LevelLocation("3c_02_binoculars", "Celestial Resort C - Room 02 Binoculars", "3c_02_west", LocationType.binoculars, []), + "3c_02_clear": LevelLocation("3c_02_clear", "Celestial Resort C - Level Clear", "3c_02_goal", LocationType.level_clear, []), + "3c_02_golden": LevelLocation("3c_02_golden", "Celestial Resort C - Golden Strawberry", "3c_02_goal", LocationType.golden_strawberry, [[ItemName.sinking_platforms, ItemName.dash_refills, ItemName.coins, ], ]), + + "4a_a-01x_strawberry": LevelLocation("4a_a-01x_strawberry", "Golden Ridge A - Room a-01x Strawberry", "4a_a-01x_west", LocationType.strawberry, []), + "4a_a-02_strawberry": LevelLocation("4a_a-02_strawberry", "Golden Ridge A - Room a-02 Strawberry", "4a_a-02_west", LocationType.strawberry, []), + "4a_a-03_strawberry": LevelLocation("4a_a-03_strawberry", "Golden Ridge A - Room a-03 Strawberry", "4a_a-03_west", LocationType.strawberry, [[ItemName.blue_boosters, ], ]), + "4a_a-04_strawberry": LevelLocation("4a_a-04_strawberry", "Golden Ridge A - Room a-04 Strawberry", "4a_a-04_east", LocationType.strawberry, [[ItemName.blue_clouds, ], ]), + "4a_a-06_strawberry": LevelLocation("4a_a-06_strawberry", "Golden Ridge A - Room a-06 Strawberry", "4a_a-06_west", LocationType.strawberry, []), + "4a_a-07_strawberry": LevelLocation("4a_a-07_strawberry", "Golden Ridge A - Room a-07 Strawberry", "4a_a-07_east", LocationType.strawberry, []), + "4a_a-10_strawberry": LevelLocation("4a_a-10_strawberry", "Golden Ridge A - Room a-10 Strawberry", "4a_a-10_east", LocationType.strawberry, [[ItemName.strawberry_seeds, ItemName.springs, ], ]), + "4a_a-11_binoculars": LevelLocation("4a_a-11_binoculars", "Golden Ridge A - Room a-11 Binoculars", "4a_a-11_east", LocationType.binoculars, []), + "4a_a-11_cassette": LevelLocation("4a_a-11_cassette", "Golden Ridge A - Cassette", "4a_a-11_east", LocationType.cassette, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + "4a_a-09_strawberry": LevelLocation("4a_a-09_strawberry", "Golden Ridge A - Room a-09 Strawberry", "4a_a-09_top", LocationType.strawberry, []), + "4a_b-01_strawberry_1": LevelLocation("4a_b-01_strawberry_1", "Golden Ridge A - Room b-01 Strawberry 1", "4a_b-01_west", LocationType.strawberry, [[ItemName.move_blocks, ], ]), + "4a_b-01_strawberry_2": LevelLocation("4a_b-01_strawberry_2", "Golden Ridge A - Room b-01 Strawberry 2", "4a_b-01_west", LocationType.strawberry, [[ItemName.move_blocks, ], ]), + "4a_b-04_strawberry": LevelLocation("4a_b-04_strawberry", "Golden Ridge A - Room b-04 Strawberry", "4a_b-04_north-west", LocationType.strawberry, []), + "4a_b-07_strawberry": LevelLocation("4a_b-07_strawberry", "Golden Ridge A - Room b-07 Strawberry", "4a_b-07_west", LocationType.strawberry, [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + "4a_b-03_strawberry": LevelLocation("4a_b-03_strawberry", "Golden Ridge A - Room b-03 Strawberry", "4a_b-03_west", LocationType.strawberry, [[ItemName.move_blocks, ], ]), + "4a_b-02_strawberry_1": LevelLocation("4a_b-02_strawberry_1", "Golden Ridge A - Room b-02 Strawberry 1", "4a_b-02_south-west", LocationType.strawberry, [[ItemName.move_blocks, ], ]), + "4a_b-02_binoculars": LevelLocation("4a_b-02_binoculars", "Golden Ridge A - Room b-02 Binoculars", "4a_b-02_south-west", LocationType.binoculars, []), + "4a_b-02_strawberry_2": LevelLocation("4a_b-02_strawberry_2", "Golden Ridge A - Room b-02 Strawberry 2", "4a_b-02_north-east", LocationType.strawberry, []), + "4a_b-sec_crystal_heart": LevelLocation("4a_b-sec_crystal_heart", "Golden Ridge A - Crystal Heart", "4a_b-sec_west", LocationType.crystal_heart, [[ItemName.white_block, ], ]), + "4a_b-secb_strawberry": LevelLocation("4a_b-secb_strawberry", "Golden Ridge A - Room b-secb Strawberry", "4a_b-secb_west", LocationType.strawberry, [[ItemName.move_blocks, ], ]), + "4a_b-08_strawberry": LevelLocation("4a_b-08_strawberry", "Golden Ridge A - Room b-08 Strawberry", "4a_b-08_west", LocationType.strawberry, [[ItemName.move_blocks, ItemName.blue_clouds, ], ]), + "4a_c-00_strawberry": LevelLocation("4a_c-00_strawberry", "Golden Ridge A - Room c-00 Strawberry", "4a_c-00_west", LocationType.strawberry, []), + "4a_c-01_strawberry": LevelLocation("4a_c-01_strawberry", "Golden Ridge A - Room c-01 Strawberry", "4a_c-01_east", LocationType.strawberry, []), + "4a_c-05_strawberry": LevelLocation("4a_c-05_strawberry", "Golden Ridge A - Room c-05 Strawberry", "4a_c-05_east", LocationType.strawberry, [[ItemName.blue_boosters, ItemName.move_blocks, ], ]), + "4a_c-06_strawberry": LevelLocation("4a_c-06_strawberry", "Golden Ridge A - Room c-06 Strawberry", "4a_c-06_west", LocationType.strawberry, [[ItemName.coins, ItemName.move_blocks, ], ]), + "4a_c-06b_strawberry": LevelLocation("4a_c-06b_strawberry", "Golden Ridge A - Room c-06b Strawberry", "4a_c-06b_east", LocationType.strawberry, [[ItemName.dash_refills, ItemName.blue_boosters, ], ]), + "4a_c-08_strawberry": LevelLocation("4a_c-08_strawberry", "Golden Ridge A - Room c-08 Strawberry", "4a_c-08_east", LocationType.strawberry, [[ItemName.blue_boosters, ], ]), + "4a_c-10_strawberry": LevelLocation("4a_c-10_strawberry", "Golden Ridge A - Room c-10 Strawberry", "4a_c-10_top", LocationType.strawberry, []), + "4a_d-00b_strawberry": LevelLocation("4a_d-00b_strawberry", "Golden Ridge A - Room d-00b Strawberry", "4a_d-00b_east", LocationType.strawberry, [[ItemName.move_blocks, ItemName.blue_boosters, ], ]), + "4a_d-00b_binoculars": LevelLocation("4a_d-00b_binoculars", "Golden Ridge A - Room d-00b Binoculars", "4a_d-00b_east", LocationType.binoculars, []), + "4a_d-01_strawberry": LevelLocation("4a_d-01_strawberry", "Golden Ridge A - Room d-01 Strawberry", "4a_d-01_east", LocationType.strawberry, []), + "4a_d-04_strawberry": LevelLocation("4a_d-04_strawberry", "Golden Ridge A - Room d-04 Strawberry", "4a_d-04_east", LocationType.strawberry, []), + "4a_d-07_strawberry": LevelLocation("4a_d-07_strawberry", "Golden Ridge A - Room d-07 Strawberry", "4a_d-07_west", LocationType.strawberry, [[ItemName.blue_boosters, ], ]), + "4a_d-09_strawberry": LevelLocation("4a_d-09_strawberry", "Golden Ridge A - Room d-09 Strawberry", "4a_d-09_west", LocationType.strawberry, [[ItemName.blue_boosters, ], ]), + "4a_d-10_clear": LevelLocation("4a_d-10_clear", "Golden Ridge A - Level Clear", "4a_d-10_goal", LocationType.level_clear, []), + "4a_d-10_golden": LevelLocation("4a_d-10_golden", "Golden Ridge A - Golden Strawberry", "4a_d-10_goal", LocationType.golden_strawberry, [[ItemName.blue_clouds, ItemName.pink_clouds, ItemName.blue_boosters, ItemName.move_blocks, ItemName.dash_refills, ItemName.springs, ItemName.coins, ], ]), + + "4b_b-02_binoculars": LevelLocation("4b_b-02_binoculars", "Golden Ridge B - Room b-02 Binoculars", "4b_b-02_bottom", LocationType.binoculars, []), + "4b_c-03_binoculars": LevelLocation("4b_c-03_binoculars", "Golden Ridge B - Room c-03 Binoculars", "4b_c-03_bottom", LocationType.binoculars, []), + "4b_d-01_binoculars": LevelLocation("4b_d-01_binoculars", "Golden Ridge B - Room d-01 Binoculars", "4b_d-01_west", LocationType.binoculars, []), + "4b_end_binoculars": LevelLocation("4b_end_binoculars", "Golden Ridge B - Room end Binoculars", "4b_end_west", LocationType.binoculars, []), + "4b_end_clear": LevelLocation("4b_end_clear", "Golden Ridge B - Level Clear", "4b_end_goal", LocationType.level_clear, []), + "4b_end_golden": LevelLocation("4b_end_golden", "Golden Ridge B - Golden Strawberry", "4b_end_goal", LocationType.golden_strawberry, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.moving_platforms, ItemName.blue_boosters, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.move_blocks, ], ]), + + "4c_01_binoculars": LevelLocation("4c_01_binoculars", "Golden Ridge C - Room 01 Binoculars", "4c_01_west", LocationType.binoculars, []), + "4c_02_binoculars": LevelLocation("4c_02_binoculars", "Golden Ridge C - Room 02 Binoculars", "4c_02_west", LocationType.binoculars, []), + "4c_02_clear": LevelLocation("4c_02_clear", "Golden Ridge C - Level Clear", "4c_02_goal", LocationType.level_clear, []), + "4c_02_golden": LevelLocation("4c_02_golden", "Golden Ridge C - Golden Strawberry", "4c_02_goal", LocationType.golden_strawberry, [[ItemName.pink_clouds, ItemName.blue_boosters, ItemName.move_blocks, ItemName.dash_refills, ], ]), + + "5a_a-00x_strawberry": LevelLocation("5a_a-00x_strawberry", "Mirror Temple A - Room a-00x Strawberry", "5a_a-00x_east", LocationType.strawberry, []), + "5a_a-01_strawberry_1": LevelLocation("5a_a-01_strawberry_1", "Mirror Temple A - Room a-01 Strawberry 1", "5a_a-01_center", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_a-01_strawberry_2": LevelLocation("5a_a-01_strawberry_2", "Mirror Temple A - Room a-01 Strawberry 2", "5a_a-01_center", LocationType.strawberry, []), + "5a_a-02_strawberry": LevelLocation("5a_a-02_strawberry", "Mirror Temple A - Room a-02 Strawberry", "5a_a-02_west", LocationType.strawberry, [[ItemName.swap_blocks, ], ]), + "5a_a-03_strawberry": LevelLocation("5a_a-03_strawberry", "Mirror Temple A - Room a-03 Strawberry", "5a_a-03_west", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_a-04_strawberry": LevelLocation("5a_a-04_strawberry", "Mirror Temple A - Room a-04 Strawberry", "5a_a-04_east", LocationType.strawberry, [[ItemName.swap_blocks, ItemName.springs, ], ]), + "5a_a-05_strawberry": LevelLocation("5a_a-05_strawberry", "Mirror Temple A - Room a-05 Strawberry", "5a_a-05_center", LocationType.strawberry, [[ItemName.swap_blocks, ], ]), + "5a_a-06_strawberry": LevelLocation("5a_a-06_strawberry", "Mirror Temple A - Room a-06 Strawberry", "5a_a-06_west", LocationType.strawberry, [[ItemName.red_boosters, ItemName.swap_blocks, ], ]), + "5a_a-07_strawberry": LevelLocation("5a_a-07_strawberry", "Mirror Temple A - Room a-07 Strawberry", "5a_a-07_east", LocationType.strawberry, [[ItemName.dash_refills, ItemName.swap_blocks, ], ]), + "5a_a-08_key_1": LevelLocation("5a_a-08_key_1", "Mirror Temple A - Entrance Key", "5a_a-08_east", LocationType.key, []), + "5a_a-11_strawberry": LevelLocation("5a_a-11_strawberry", "Mirror Temple A - Room a-11 Strawberry", "5a_a-11_east", LocationType.strawberry, [[ItemName.dash_refills, ItemName.swap_blocks, ], ]), + "5a_a-15_strawberry": LevelLocation("5a_a-15_strawberry", "Mirror Temple A - Room a-15 Strawberry", "5a_a-15_south", LocationType.strawberry, [[ItemName.coins, ItemName.red_boosters, ], ]), + "5a_a-14_strawberry": LevelLocation("5a_a-14_strawberry", "Mirror Temple A - Room a-14 Strawberry", "5a_a-14_south", LocationType.strawberry, [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + "5a_b-18_strawberry": LevelLocation("5a_b-18_strawberry", "Mirror Temple A - Room b-18 Strawberry", "5a_b-18_south", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_b-01c_strawberry": LevelLocation("5a_b-01c_strawberry", "Mirror Temple A - Room b-01c Strawberry", "5a_b-01c_east", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_b-20_strawberry_1": LevelLocation("5a_b-20_strawberry_1", "Mirror Temple A - Room b-20 Strawberry 1", "5a_b-20_south", LocationType.strawberry, []), + "5a_b-20_strawberry_2": LevelLocation("5a_b-20_strawberry_2", "Mirror Temple A - Room b-20 Strawberry 2", "5a_b-20_east", LocationType.strawberry, [[ItemName.swap_blocks, ], ]), + "5a_b-21_strawberry": LevelLocation("5a_b-21_strawberry", "Mirror Temple A - Room b-21 Strawberry", "5a_b-21_east", LocationType.strawberry, [[ItemName.red_boosters, ItemName.dash_refills, ], ]), + "5a_b-03_strawberry": LevelLocation("5a_b-03_strawberry", "Mirror Temple A - Room b-03 Strawberry", "5a_b-03_east", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_b-05_strawberry": LevelLocation("5a_b-05_strawberry", "Mirror Temple A - Room b-05 Strawberry", "5a_b-05_west", LocationType.strawberry, [[ItemName.red_boosters, ItemName.dash_refills, ], ]), + "5a_b-04_key_2": LevelLocation("5a_b-04_key_2", "Mirror Temple A - Depths Key", "5a_b-04_east", LocationType.key, []), + "5a_b-10_strawberry": LevelLocation("5a_b-10_strawberry", "Mirror Temple A - Room b-10 Strawberry", "5a_b-10_east", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_b-12_strawberry": LevelLocation("5a_b-12_strawberry", "Mirror Temple A - Room b-12 Strawberry", "5a_b-12_east", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_b-17_strawberry_2": LevelLocation("5a_b-17_strawberry_2", "Mirror Temple A - Room b-17 Strawberry 2", "5a_b-17_west", LocationType.strawberry, [[ItemName.strawberry_seeds, ItemName.springs, ], ]), + "5a_b-17_strawberry_1": LevelLocation("5a_b-17_strawberry_1", "Mirror Temple A - Room b-17 Strawberry 1", "5a_b-17_north-west", LocationType.strawberry, []), + "5a_b-22_binoculars": LevelLocation("5a_b-22_binoculars", "Mirror Temple A - Room b-22 Binoculars", "5a_b-22_west", LocationType.binoculars, []), + "5a_b-22_cassette": LevelLocation("5a_b-22_cassette", "Mirror Temple A - Cassette", "5a_b-22_west", LocationType.cassette, [[ItemName.red_boosters, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ], ]), + "5a_b-15_crystal_heart": LevelLocation("5a_b-15_crystal_heart", "Mirror Temple A - Crystal Heart", "5a_b-15_west", LocationType.crystal_heart, [[ItemName.swap_blocks, ], ]), + "5a_c-08_strawberry": LevelLocation("5a_c-08_strawberry", "Mirror Temple A - Room c-08 Strawberry", "5a_c-08_east", LocationType.strawberry, [[ItemName.seekers, ], ]), + "5a_d-04_key_3": LevelLocation("5a_d-04_key_3", "Mirror Temple A - Search Key 1", "5a_d-04_south-west-left", LocationType.key, []), + "5a_d-04_key_4": LevelLocation("5a_d-04_key_4", "Mirror Temple A - Search Key 2", "5a_d-04_south-west-right", LocationType.key, []), + "5a_d-04_strawberry_2": LevelLocation("5a_d-04_strawberry_2", "Mirror Temple A - Room d-04 Strawberry 2", "5a_d-04_south-east", LocationType.strawberry, [[ItemName.red_boosters, ItemName.swap_blocks, ], ]), + "5a_d-04_strawberry_1": LevelLocation("5a_d-04_strawberry_1", "Mirror Temple A - Room d-04 Strawberry 1", "5a_d-04_north", LocationType.strawberry, []), + "5a_d-15_strawberry_2": LevelLocation("5a_d-15_strawberry_2", "Mirror Temple A - Room d-15 Strawberry 2", "5a_d-15_center", LocationType.strawberry, [[ItemName.swap_blocks, ItemName.dash_refills, ], ]), + "5a_d-15_key_5": LevelLocation("5a_d-15_key_5", "Mirror Temple A - Search Key 3", "5a_d-15_center", LocationType.key, [[ItemName.swap_blocks, ItemName.seekers, ], ]), + "5a_d-15_strawberry_1": LevelLocation("5a_d-15_strawberry_1", "Mirror Temple A - Room d-15 Strawberry 1", "5a_d-15_west", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "5a_d-13_strawberry": LevelLocation("5a_d-13_strawberry", "Mirror Temple A - Room d-13 Strawberry", "5a_d-13_west", LocationType.strawberry, []), + "5a_d-19_strawberry": LevelLocation("5a_d-19_strawberry", "Mirror Temple A - Room d-19 Strawberry", "5a_d-19_east", LocationType.strawberry, [["Mirror Temple A - Search Key 3", ], ]), + "5a_e-06_strawberry": LevelLocation("5a_e-06_strawberry", "Mirror Temple A - Room e-06 Strawberry", "5a_e-06_east", LocationType.strawberry, [[ItemName.dash_switches, ], ]), + "5a_e-11_clear": LevelLocation("5a_e-11_clear", "Mirror Temple A - Level Clear", "5a_e-11_goal", LocationType.level_clear, []), + "5a_e-11_golden": LevelLocation("5a_e-11_golden", "Mirror Temple A - Golden Strawberry", "5a_e-11_goal", LocationType.golden_strawberry, [[ItemName.red_boosters, ItemName.swap_blocks, ItemName.dash_switches, "Mirror Temple A - Entrance Key", "Mirror Temple A - Depths Key", "Mirror Temple A - Search Key 1", "Mirror Temple A - Search Key 2", ItemName.seekers, ItemName.coins, ItemName.theo_crystal, ], ]), + + "5b_b-02_key_1": LevelLocation("5b_b-02_key_1", "Mirror Temple B - Central Chamber Key 1", "5b_b-02_south-west", LocationType.key, []), + "5b_b-02_key_2": LevelLocation("5b_b-02_key_2", "Mirror Temple B - Central Chamber Key 2", "5b_b-02_south-east", LocationType.key, []), + "5b_b-09_binoculars": LevelLocation("5b_b-09_binoculars", "Mirror Temple B - Room b-09 Binoculars", "5b_b-09_bottom", LocationType.binoculars, []), + "5b_d-05_clear": LevelLocation("5b_d-05_clear", "Mirror Temple B - Level Clear", "5b_d-05_goal", LocationType.level_clear, []), + "5b_d-05_golden": LevelLocation("5b_d-05_golden", "Mirror Temple B - Golden Strawberry", "5b_d-05_goal", LocationType.golden_strawberry, [["Mirror Temple B - Central Chamber Key 1", "Mirror Temple B - Central Chamber Key 2", ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.theo_crystal, ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.swap_blocks, ], ]), + + "5c_02_binoculars": LevelLocation("5c_02_binoculars", "Mirror Temple C - Room 02 Binoculars", "5c_02_west", LocationType.binoculars, []), + "5c_02_clear": LevelLocation("5c_02_clear", "Mirror Temple C - Level Clear", "5c_02_goal", LocationType.level_clear, []), + "5c_02_golden": LevelLocation("5c_02_golden", "Mirror Temple C - Golden Strawberry", "5c_02_goal", LocationType.golden_strawberry, [[ItemName.red_boosters, ItemName.dash_refills, ItemName.dash_switches, ItemName.swap_blocks, ], ]), + + "6a_04c_crystal_heart": LevelLocation("6a_04c_crystal_heart", "Reflection A - Crystal Heart", "6a_04c_east", LocationType.crystal_heart, []), + "6a_04e_binoculars": LevelLocation("6a_04e_binoculars", "Reflection A - Room 04e Binoculars", "6a_04e_east", LocationType.binoculars, []), + "6a_04e_cassette": LevelLocation("6a_04e_cassette", "Reflection A - Cassette", "6a_04e_east", LocationType.cassette, [[ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.dash_refills, ], ]), + "6a_boss-20_golden": LevelLocation("6a_boss-20_golden", "Reflection A - Golden Strawberry", "6a_boss-20_east", LocationType.golden_strawberry, [[ItemName.feathers, ItemName.dash_refills, ItemName.kevin_blocks, ItemName.bumpers, ItemName.springs, ], ]), + "6a_after-01_clear": LevelLocation("6a_after-01_clear", "Reflection A - Level Clear", "6a_after-01_goal", LocationType.level_clear, []), + + "6b_a-02_binoculars": LevelLocation("6b_a-02_binoculars", "Reflection B - Room a-02 Binoculars", "6b_a-02_bottom", LocationType.binoculars, []), + "6b_a-06_binoculars": LevelLocation("6b_a-06_binoculars", "Reflection B - Room a-06 Binoculars", "6b_a-06_west", LocationType.binoculars, []), + "6b_d-05_clear": LevelLocation("6b_d-05_clear", "Reflection B - Level Clear", "6b_d-05_goal", LocationType.level_clear, []), + "6b_d-05_golden": LevelLocation("6b_d-05_golden", "Reflection B - Golden Strawberry", "6b_d-05_goal", LocationType.golden_strawberry, [[ItemName.blue_cassette_blocks, ItemName.bumpers, ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.kevin_blocks, ItemName.feathers, ], ]), + + "6c_02_binoculars_1": LevelLocation("6c_02_binoculars_1", "Reflection C - Room 02 Binoculars 1", "6c_02_west", LocationType.binoculars, []), + "6c_02_binoculars_2": LevelLocation("6c_02_binoculars_2", "Reflection C - Room 02 Binoculars 2", "6c_02_west", LocationType.binoculars, [[ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers, ], ]), + "6c_02_clear": LevelLocation("6c_02_clear", "Reflection C - Level Clear", "6c_02_goal", LocationType.level_clear, []), + "6c_02_golden": LevelLocation("6c_02_golden", "Reflection C - Golden Strawberry", "6c_02_goal", LocationType.golden_strawberry, [[ItemName.kevin_blocks, ItemName.dash_refills, ItemName.bumpers, ItemName.feathers, ], ]), + + "7a_a-02b_strawberry": LevelLocation("7a_a-02b_strawberry", "The Summit A - Room a-02b Strawberry", "7a_a-02b_east", LocationType.strawberry, []), + "7a_a-04b_strawberry_1": LevelLocation("7a_a-04b_strawberry_1", "The Summit A - Room a-04b Strawberry 1", "7a_a-04b_east", LocationType.strawberry, [[ItemName.springs, ItemName.dash_refills, ], ]), + "7a_a-04b_strawberry_2": LevelLocation("7a_a-04b_strawberry_2", "The Summit A - Room a-04b Strawberry 2", "7a_a-04b_east", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "7a_a-05_strawberry": LevelLocation("7a_a-05_strawberry", "The Summit A - Room a-05 Strawberry", "7a_a-05_west", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "7a_a-06_gem_1": LevelLocation("7a_a-06_gem_1", "The Summit A - Gem 1", "7a_a-06_top-side", LocationType.gem, []), + "7a_b-01_binoculars": LevelLocation("7a_b-01_binoculars", "The Summit A - Room b-01 Binoculars", "7a_b-01_west", LocationType.binoculars, []), + "7a_b-02_binoculars": LevelLocation("7a_b-02_binoculars", "The Summit A - Room b-02 Binoculars", "7a_b-02_south", LocationType.binoculars, []), + "7a_b-02_strawberry": LevelLocation("7a_b-02_strawberry", "The Summit A - Room b-02 Strawberry", "7a_b-02_south", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "7a_b-02b_binoculars": LevelLocation("7a_b-02b_binoculars", "The Summit A - Room b-02b Binoculars", "7a_b-02b_south", LocationType.binoculars, []), + "7a_b-02b_strawberry": LevelLocation("7a_b-02b_strawberry", "The Summit A - Room b-02b Strawberry", "7a_b-02b_north-east", LocationType.strawberry, []), + "7a_b-02e_strawberry": LevelLocation("7a_b-02e_strawberry", "The Summit A - Room b-02e Strawberry", "7a_b-02e_east", LocationType.strawberry, [[ItemName.traffic_blocks, ], ]), + "7a_b-02d_gem_2": LevelLocation("7a_b-02d_gem_2", "The Summit A - Gem 2", "7a_b-02d_south", LocationType.gem, []), + "7a_b-04_strawberry": LevelLocation("7a_b-04_strawberry", "The Summit A - Room b-04 Strawberry", "7a_b-04_west", LocationType.strawberry, [[ItemName.springs, ], ]), + "7a_b-08_strawberry": LevelLocation("7a_b-08_strawberry", "The Summit A - Room b-08 Strawberry", "7a_b-08_east", LocationType.strawberry, []), + "7a_b-09_strawberry": LevelLocation("7a_b-09_strawberry", "The Summit A - Room b-09 Strawberry", "7a_b-09_top-side", LocationType.strawberry, []), + "7a_c-03b_binoculars": LevelLocation("7a_c-03b_binoculars", "The Summit A - Room c-03b Binoculars", "7a_c-03b_east", LocationType.binoculars, []), + "7a_c-03b_strawberry": LevelLocation("7a_c-03b_strawberry", "The Summit A - Room c-03b Strawberry", "7a_c-03b_east", LocationType.strawberry, [[ItemName.dream_blocks, ItemName.dash_refills, ], ]), + "7a_c-05_binoculars": LevelLocation("7a_c-05_binoculars", "The Summit A - Room c-05 Binoculars", "7a_c-05_west", LocationType.binoculars, []), + "7a_c-05_strawberry": LevelLocation("7a_c-05_strawberry", "The Summit A - Room c-05 Strawberry", "7a_c-05_west", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "7a_c-06b_strawberry": LevelLocation("7a_c-06b_strawberry", "The Summit A - Room c-06b Strawberry", "7a_c-06b_west", LocationType.strawberry, []), + "7a_c-06c_binoculars": LevelLocation("7a_c-06c_binoculars", "The Summit A - Room c-06c Binoculars", "7a_c-06c_west", LocationType.binoculars, []), + "7a_c-06c_gem_3": LevelLocation("7a_c-06c_gem_3", "The Summit A - Gem 3", "7a_c-06c_west", LocationType.gem, [[ItemName.dream_blocks, ItemName.coins, ], ]), + "7a_c-07b_binoculars": LevelLocation("7a_c-07b_binoculars", "The Summit A - Room c-07b Binoculars", "7a_c-07b_east", LocationType.binoculars, []), + "7a_c-07b_strawberry": LevelLocation("7a_c-07b_strawberry", "The Summit A - Room c-07b Strawberry", "7a_c-07b_east", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "7a_c-08_strawberry": LevelLocation("7a_c-08_strawberry", "The Summit A - Room c-08 Strawberry", "7a_c-08_west", LocationType.strawberry, [[ItemName.dream_blocks, ], ]), + "7a_c-09_strawberry": LevelLocation("7a_c-09_strawberry", "The Summit A - Room c-09 Strawberry", "7a_c-09_top", LocationType.strawberry, []), + "7a_d-00_strawberry": LevelLocation("7a_d-00_strawberry", "The Summit A - Room d-00 Strawberry", "7a_d-00_bottom", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "7a_d-01c_strawberry": LevelLocation("7a_d-01c_strawberry", "The Summit A - Room d-01c Strawberry", "7a_d-01c_east", LocationType.strawberry, [[ItemName.sinking_platforms, ], ]), + "7a_d-01d_strawberry": LevelLocation("7a_d-01d_strawberry", "The Summit A - Room d-01d Strawberry", "7a_d-01d_west", LocationType.strawberry, [[ItemName.coins, ItemName.dash_refills, ], ]), + "7a_d-03_strawberry": LevelLocation("7a_d-03_strawberry", "The Summit A - Room d-03 Strawberry", "7a_d-03_west", LocationType.strawberry, []), + "7a_d-03b_cassette": LevelLocation("7a_d-03b_cassette", "The Summit A - Cassette", "7a_d-03b_east", LocationType.cassette, [[ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + "7a_d-04_strawberry": LevelLocation("7a_d-04_strawberry", "The Summit A - Room d-04 Strawberry", "7a_d-04_west", LocationType.strawberry, []), + "7a_d-05b_gem_4": LevelLocation("7a_d-05b_gem_4", "The Summit A - Gem 4", "7a_d-05b_west", LocationType.gem, [[ItemName.dash_refills, ], ]), + "7a_d-07_strawberry": LevelLocation("7a_d-07_strawberry", "The Summit A - Room d-07 Strawberry", "7a_d-07_east", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "7a_d-08_strawberry": LevelLocation("7a_d-08_strawberry", "The Summit A - Room d-08 Strawberry", "7a_d-08_east", LocationType.strawberry, []), + "7a_d-10b_strawberry": LevelLocation("7a_d-10b_strawberry", "The Summit A - Room d-10b Strawberry", "7a_d-10b_east", LocationType.strawberry, [[ItemName.springs, ], ]), + "7a_e-01c_gem_5": LevelLocation("7a_e-01c_gem_5", "The Summit A - Gem 5", "7a_e-01c_west", LocationType.gem, []), + "7a_e-02_strawberry": LevelLocation("7a_e-02_strawberry", "The Summit A - Room e-02 Strawberry", "7a_e-02_west", LocationType.strawberry, [[ItemName.pink_clouds, ], ]), + "7a_e-05_strawberry": LevelLocation("7a_e-05_strawberry", "The Summit A - Room e-05 Strawberry", "7a_e-05_east", LocationType.strawberry, []), + "7a_e-07_strawberry": LevelLocation("7a_e-07_strawberry", "The Summit A - Room e-07 Strawberry", "7a_e-07_bottom", LocationType.strawberry, [[ItemName.move_blocks, ItemName.dash_refills, ], ]), + "7a_e-09_strawberry": LevelLocation("7a_e-09_strawberry", "The Summit A - Room e-09 Strawberry", "7a_e-09_east", LocationType.strawberry, []), + "7a_e-11_strawberry": LevelLocation("7a_e-11_strawberry", "The Summit A - Room e-11 Strawberry", "7a_e-11_east", LocationType.strawberry, []), + "7a_e-12_strawberry": LevelLocation("7a_e-12_strawberry", "The Summit A - Room e-12 Strawberry", "7a_e-12_west", LocationType.strawberry, [[ItemName.strawberry_seeds, ItemName.dash_refills, ], ]), + "7a_e-10_strawberry": LevelLocation("7a_e-10_strawberry", "The Summit A - Room e-10 Strawberry", "7a_e-10_south", LocationType.strawberry, [[ItemName.blue_boosters, ], ]), + "7a_e-13_strawberry": LevelLocation("7a_e-13_strawberry", "The Summit A - Room e-13 Strawberry", "7a_e-13_top", LocationType.strawberry, []), + "7a_f-00_strawberry": LevelLocation("7a_f-00_strawberry", "The Summit A - Room f-00 Strawberry", "7a_f-00_west", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "7a_f-01_strawberry": LevelLocation("7a_f-01_strawberry", "The Summit A - Room f-01 Strawberry", "7a_f-01_south", LocationType.strawberry, [[ItemName.swap_blocks, ], ]), + "7a_f-02b_gem_6": LevelLocation("7a_f-02b_gem_6", "The Summit A - Gem 6", "7a_f-02b_east", LocationType.gem, []), + "7a_f-07_strawberry": LevelLocation("7a_f-07_strawberry", "The Summit A - Room f-07 Strawberry", "7a_f-07_south-west", LocationType.strawberry, [[ItemName.red_boosters, ], ]), + "7a_f-07_key": LevelLocation("7a_f-07_key", "The Summit A - 2500 M Key", "7a_f-07_south-east", LocationType.key, [[ItemName.red_boosters, ], ]), + "7a_f-08b_strawberry": LevelLocation("7a_f-08b_strawberry", "The Summit A - Room f-08b Strawberry", "7a_f-08b_east", LocationType.strawberry, [[ItemName.swap_blocks, ], ]), + "7a_f-08c_strawberry": LevelLocation("7a_f-08c_strawberry", "The Summit A - Room f-08c Strawberry", "7a_f-08c_east", LocationType.strawberry, []), + "7a_f-11_strawberry_1": LevelLocation("7a_f-11_strawberry_1", "The Summit A - Room f-11 Strawberry 1", "7a_f-11_top", LocationType.strawberry, []), + "7a_f-11_strawberry_2": LevelLocation("7a_f-11_strawberry_2", "The Summit A - Room f-11 Strawberry 2", "7a_f-11_top", LocationType.strawberry, []), + "7a_f-11_strawberry_3": LevelLocation("7a_f-11_strawberry_3", "The Summit A - Room f-11 Strawberry 3", "7a_f-11_top", LocationType.strawberry, [[ItemName.dash_switches, ], ]), + "7a_g-00b_crystal_heart": LevelLocation("7a_g-00b_crystal_heart", "The Summit A - Crystal Heart", "7a_g-00b_bottom", LocationType.crystal_heart, [["The Summit A - Gem 1", "The Summit A - Gem 2", "The Summit A - Gem 3", "The Summit A - Gem 4", "The Summit A - Gem 5", "The Summit A - Gem 6", ], ]), + "7a_g-00b_strawberry_1": LevelLocation("7a_g-00b_strawberry_1", "The Summit A - Room g-00b Strawberry 1", "7a_g-00b_c26", LocationType.strawberry, [[ItemName.dash_refills, ], ]), + "7a_g-00b_strawberry_2": LevelLocation("7a_g-00b_strawberry_2", "The Summit A - Room g-00b Strawberry 2", "7a_g-00b_c24", LocationType.strawberry, [[ItemName.springs, ], ]), + "7a_g-00b_strawberry_3": LevelLocation("7a_g-00b_strawberry_3", "The Summit A - Room g-00b Strawberry 3", "7a_g-00b_c21", LocationType.strawberry, [[ItemName.springs, ], ]), + "7a_g-01_strawberry_1": LevelLocation("7a_g-01_strawberry_1", "The Summit A - Room g-01 Strawberry 1", "7a_g-01_c18", LocationType.strawberry, [[ItemName.dash_refills, ItemName.blue_clouds, ], ]), + "7a_g-01_strawberry_2": LevelLocation("7a_g-01_strawberry_2", "The Summit A - Room g-01 Strawberry 2", "7a_g-01_c16", LocationType.strawberry, []), + "7a_g-01_strawberry_3": LevelLocation("7a_g-01_strawberry_3", "The Summit A - Room g-01 Strawberry 3", "7a_g-01_c16", LocationType.strawberry, []), + "7a_g-03_binoculars": LevelLocation("7a_g-03_binoculars", "The Summit A - Room g-03 Binoculars", "7a_g-03_bottom", LocationType.binoculars, [[ItemName.springs, ], ]), + "7a_g-03_strawberry": LevelLocation("7a_g-03_strawberry", "The Summit A - Room g-03 Strawberry", "7a_g-03_bottom", LocationType.strawberry, [[ItemName.springs, ItemName.dash_refills, ItemName.feathers, ], ]), + "7a_g-03_clear": LevelLocation("7a_g-03_clear", "The Summit A - Level Clear", "7a_g-03_goal", LocationType.level_clear, []), + "7a_g-03_golden": LevelLocation("7a_g-03_golden", "The Summit A - Golden Strawberry", "7a_g-03_goal", LocationType.golden_strawberry, [[ItemName.springs, ItemName.dash_refills, ItemName.feathers, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.coins, ItemName.badeline_boosters, ItemName.red_boosters, ItemName.swap_blocks, ItemName.dash_switches, "The Summit A - 2500 M Key", ItemName.move_blocks, ItemName.blue_boosters, ItemName.dream_blocks, ItemName.traffic_blocks, ], ]), + + "7b_b-01_binoculars": LevelLocation("7b_b-01_binoculars", "The Summit B - Room b-01 Binoculars", "7b_b-01_bottom", LocationType.binoculars, []), + "7b_b-02_binoculars": LevelLocation("7b_b-02_binoculars", "The Summit B - Room b-02 Binoculars", "7b_b-02_west", LocationType.binoculars, [[ItemName.springs, ], ]), + "7b_g-03_clear": LevelLocation("7b_g-03_clear", "The Summit B - Level Clear", "7b_g-03_goal", LocationType.level_clear, []), + "7b_g-03_golden": LevelLocation("7b_g-03_golden", "The Summit B - Golden Strawberry", "7b_g-03_goal", LocationType.golden_strawberry, [[ItemName.springs, ItemName.dash_refills, ItemName.blue_clouds, ItemName.pink_clouds, ItemName.coins, ItemName.badeline_boosters, ItemName.red_boosters, ItemName.swap_blocks, ItemName.move_blocks, ItemName.blue_boosters, ItemName.dream_blocks, ItemName.traffic_blocks, ], ]), + + "7c_01_binoculars": LevelLocation("7c_01_binoculars", "The Summit C - Room 01 Binoculars", "7c_01_west", LocationType.binoculars, []), + "7c_03_binoculars": LevelLocation("7c_03_binoculars", "The Summit C - Room 03 Binoculars", "7c_03_west", LocationType.binoculars, []), + "7c_03_clear": LevelLocation("7c_03_clear", "The Summit C - Level Clear", "7c_03_goal", LocationType.level_clear, []), + "7c_03_golden": LevelLocation("7c_03_golden", "The Summit C - Golden Strawberry", "7c_03_goal", LocationType.golden_strawberry, [[ItemName.pink_clouds, ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.badeline_boosters, ], ]), + + + "9a_0x_car": LevelLocation("9a_0x_car", "Core A - Car", "9a_0x_east", LocationType.car, []), + "9a_b-06_strawberry": LevelLocation("9a_b-06_strawberry", "Core A - Room b-06 Strawberry", "9a_b-06_east", LocationType.strawberry, [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.core_blocks, ItemName.dash_refills, ItemName.bumpers, ItemName.coins, ], ]), + "9a_c-00b_strawberry": LevelLocation("9a_c-00b_strawberry", "Core A - Room c-00b Strawberry", "9a_c-00b_west", LocationType.strawberry, [[ItemName.fire_ice_balls, ItemName.core_toggles, ItemName.dash_refills, ItemName.bumpers, ], ]), + "9a_c-02_strawberry": LevelLocation("9a_c-02_strawberry", "Core A - Room c-02 Strawberry", "9a_c-02_west", LocationType.strawberry, [[ItemName.core_blocks, ItemName.core_toggles, ItemName.dash_refills, ItemName.bumpers, ], ]), + "9a_c-03b_strawberry": LevelLocation("9a_c-03b_strawberry", "Core A - Room c-03b Strawberry", "9a_c-03b_south", LocationType.strawberry, [[ItemName.core_toggles, ], ]), + "9a_d-06_strawberry": LevelLocation("9a_d-06_strawberry", "Core A - Room d-06 Strawberry", "9a_d-06_bottom", LocationType.strawberry, [[ItemName.dash_refills, ItemName.core_blocks, ], ]), + "9a_d-11_cassette": LevelLocation("9a_d-11_cassette", "Core A - Cassette", "9a_d-11_center", LocationType.cassette, []), + "9a_space_clear": LevelLocation("9a_space_clear", "Core A - Level Clear", "9a_space_goal", LocationType.level_clear, []), + "9a_space_golden": LevelLocation("9a_space_golden", "Core A - Golden Strawberry", "9a_space_goal", LocationType.golden_strawberry, [[ItemName.dash_refills, ItemName.springs, ItemName.coins, ItemName.bumpers, ItemName.feathers, ItemName.badeline_boosters, ItemName.core_blocks, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + + "9b_space_clear": LevelLocation("9b_space_clear", "Core B - Level Clear", "9b_space_goal", LocationType.level_clear, []), + "9b_space_golden": LevelLocation("9b_space_golden", "Core B - Golden Strawberry", "9b_space_goal", LocationType.golden_strawberry, [[ItemName.dash_refills, ItemName.bumpers, ItemName.coins, ItemName.springs, ItemName.traffic_blocks, ItemName.dream_blocks, ItemName.moving_platforms, ItemName.blue_clouds, ItemName.swap_blocks, ItemName.kevin_blocks, ItemName.core_blocks, ItemName.badeline_boosters, ItemName.core_toggles, ItemName.fire_ice_balls, ItemName.blue_cassette_blocks, ItemName.pink_cassette_blocks, ], ]), + + "9c_01_binoculars": LevelLocation("9c_01_binoculars", "Core C - Room 01 Binoculars", "9c_01_west", LocationType.binoculars, []), + "9c_02_binoculars": LevelLocation("9c_02_binoculars", "Core C - Room 02 Binoculars", "9c_02_west", LocationType.binoculars, []), + "9c_02_clear": LevelLocation("9c_02_clear", "Core C - Level Clear", "9c_02_goal", LocationType.level_clear, []), + "9c_02_golden": LevelLocation("9c_02_golden", "Core C - Golden Strawberry", "9c_02_goal", LocationType.golden_strawberry, [[ItemName.springs, ItemName.traffic_blocks, ItemName.dash_refills, ItemName.core_toggles, ItemName.dream_blocks, ItemName.bumpers, ItemName.pink_clouds, ItemName.swap_blocks, ItemName.kevin_blocks, ItemName.core_blocks, ], ]), + + "10a_a-04_binoculars": LevelLocation("10a_a-04_binoculars", "Farewell - Room a-04 Binoculars", "10a_a-04_west", LocationType.binoculars, []), + "10a_b-06_binoculars": LevelLocation("10a_b-06_binoculars", "Farewell - Room b-06 Binoculars", "10a_b-06_west", LocationType.binoculars, []), + "10a_d-00_binoculars": LevelLocation("10a_d-00_binoculars", "Farewell - Room d-00 Binoculars", "10a_d-00_south", LocationType.binoculars, []), + "10a_d-04_binoculars": LevelLocation("10a_d-04_binoculars", "Farewell - Room d-04 Binoculars", "10a_d-04_west", LocationType.binoculars, []), + "10a_d-04_key_1": LevelLocation("10a_d-04_key_1", "Farewell - Power Source Key 1", "10a_d-04_west", LocationType.key, [[ItemName.double_dash_refills, ItemName.jellyfish, ], ]), + "10a_d-03_binoculars": LevelLocation("10a_d-03_binoculars", "Farewell - Room d-03 Binoculars", "10a_d-03_west", LocationType.binoculars, [[ItemName.breaker_boxes, ], ]), + "10a_d-03_key_2": LevelLocation("10a_d-03_key_2", "Farewell - Power Source Key 2", "10a_d-03_west", LocationType.key, [[ItemName.breaker_boxes, ItemName.double_dash_refills, ItemName.jellyfish, ], ]), + "10a_d-01_binoculars": LevelLocation("10a_d-01_binoculars", "Farewell - Room d-01 Binoculars", "10a_d-01_east", LocationType.binoculars, []), + "10a_d-01_key_3": LevelLocation("10a_d-01_key_3", "Farewell - Power Source Key 3", "10a_d-01_east", LocationType.key, [[ItemName.dash_refills, ItemName.dash_switches, ItemName.jellyfish, ], ]), + "10a_d-02_binoculars": LevelLocation("10a_d-02_binoculars", "Farewell - Room d-02 Binoculars", "10a_d-02_bottom", LocationType.binoculars, [[ItemName.breaker_boxes, ], ]), + "10a_d-02_key_4": LevelLocation("10a_d-02_key_4", "Farewell - Power Source Key 4", "10a_d-02_bottom", LocationType.key, [[ItemName.breaker_boxes, ItemName.double_dash_refills, ItemName.springs, ItemName.move_blocks, ItemName.jellyfish, ], ]), + "10a_d-05_binoculars": LevelLocation("10a_d-05_binoculars", "Farewell - Room d-05 Binoculars", "10a_d-05_west", LocationType.binoculars, []), + "10a_d-05_key_5": LevelLocation("10a_d-05_key_5", "Farewell - Power Source Key 5", "10a_d-05_west", LocationType.key, [[ItemName.double_dash_refills, ItemName.coins, ItemName.red_boosters, ItemName.jellyfish, ], ]), + "10a_e-00yb_binoculars": LevelLocation("10a_e-00yb_binoculars", "Farewell - Room e-00yb Binoculars", "10a_e-00yb_south", LocationType.binoculars, []), + "10a_e-00b_binoculars": LevelLocation("10a_e-00b_binoculars", "Farewell - Room e-00b Binoculars", "10a_e-00b_south", LocationType.binoculars, []), + "10a_e-01_binoculars": LevelLocation("10a_e-01_binoculars", "Farewell - Room e-01 Binoculars", "10a_e-01_south", LocationType.binoculars, []), + "10a_e-01_car": LevelLocation("10a_e-01_car", "Farewell - Secret Car", "10a_e-01_south", LocationType.car, [[ItemName.jellyfish, ItemName.springs, ItemName.dash_refills, ], ]), + "10a_e-02_binoculars": LevelLocation("10a_e-02_binoculars", "Farewell - Room e-02 Binoculars", "10a_e-02_west", LocationType.binoculars, []), + "10a_e-04_binoculars": LevelLocation("10a_e-04_binoculars", "Farewell - Room e-04 Binoculars", "10a_e-04_west", LocationType.binoculars, []), + "10a_e-08_binoculars": LevelLocation("10a_e-08_binoculars", "Farewell - Room e-08 Binoculars", "10a_e-08_west", LocationType.binoculars, []), + "10a_e-08_crystal_heart": LevelLocation("10a_e-08_crystal_heart", "Farewell - Crystal Heart?", "10a_e-08_east", LocationType.crystal_heart, []), + + "10b_f-00_car": LevelLocation("10b_f-00_car", "Farewell - Internet Car", "10b_f-00_west", LocationType.car, []), + "10b_f-06_binoculars": LevelLocation("10b_f-06_binoculars", "Farewell - Room f-06 Binoculars", "10b_f-06_west", LocationType.binoculars, []), + "10b_f-07_binoculars": LevelLocation("10b_f-07_binoculars", "Farewell - Room f-07 Binoculars", "10b_f-07_west", LocationType.binoculars, []), + "10b_f-08_binoculars": LevelLocation("10b_f-08_binoculars", "Farewell - Room f-08 Binoculars", "10b_f-08_west", LocationType.binoculars, []), + "10b_f-09_binoculars": LevelLocation("10b_f-09_binoculars", "Farewell - Room f-09 Binoculars", "10b_f-09_west", LocationType.binoculars, []), + "10b_g-00_binoculars": LevelLocation("10b_g-00_binoculars", "Farewell - Room g-00 Binoculars", "10b_g-00_bottom", LocationType.binoculars, []), + "10b_g-04_binoculars": LevelLocation("10b_g-04_binoculars", "Farewell - Room g-04 Binoculars", "10b_g-04_west", LocationType.binoculars, []), + "10b_g-06_binoculars": LevelLocation("10b_g-06_binoculars", "Farewell - Room g-06 Binoculars", "10b_g-06_west", LocationType.binoculars, [[ItemName.double_dash_refills, ItemName.dash_refills, ItemName.springs, ItemName.feathers, ], ]), + "10b_h-01_binoculars": LevelLocation("10b_h-01_binoculars", "Farewell - Room h-01 Binoculars", "10b_h-01_west", LocationType.binoculars, []), + "10b_h-02_binoculars": LevelLocation("10b_h-02_binoculars", "Farewell - Room h-02 Binoculars", "10b_h-02_west", LocationType.binoculars, []), + "10b_h-03b_binoculars": LevelLocation("10b_h-03b_binoculars", "Farewell - Room h-03b Binoculars", "10b_h-03b_west", LocationType.binoculars, []), + "10b_h-04_binoculars": LevelLocation("10b_h-04_binoculars", "Farewell - Room h-04 Binoculars", "10b_h-04_top", LocationType.binoculars, []), + "10b_h-05_binoculars": LevelLocation("10b_h-05_binoculars", "Farewell - Room h-05 Binoculars", "10b_h-05_top", LocationType.binoculars, []), + "10b_h-06b_binoculars": LevelLocation("10b_h-06b_binoculars", "Farewell - Room h-06b Binoculars", "10b_h-06b_bottom", LocationType.binoculars, []), + "10b_h-07_binoculars_1": LevelLocation("10b_h-07_binoculars_1", "Farewell - Room h-07 Binoculars 1", "10b_h-07_west", LocationType.binoculars, []), + "10b_h-07_binoculars_2": LevelLocation("10b_h-07_binoculars_2", "Farewell - Room h-07 Binoculars 2", "10b_h-07_west", LocationType.binoculars, [[ItemName.blue_boosters, ItemName.springs, ItemName.coins, ], ]), + "10b_h-08_binoculars": LevelLocation("10b_h-08_binoculars", "Farewell - Room h-08 Binoculars", "10b_h-08_west", LocationType.binoculars, []), + "10b_h-09_binoculars": LevelLocation("10b_h-09_binoculars", "Farewell - Room h-09 Binoculars", "10b_h-09_west", LocationType.binoculars, []), + "10b_i-00b_binoculars": LevelLocation("10b_i-00b_binoculars", "Farewell - Room i-00b Binoculars", "10b_i-00b_west", LocationType.binoculars, []), + "10b_i-02_binoculars": LevelLocation("10b_i-02_binoculars", "Farewell - Room i-02 Binoculars", "10b_i-02_west", LocationType.binoculars, []), + "10b_i-04_binoculars": LevelLocation("10b_i-04_binoculars", "Farewell - Room i-04 Binoculars", "10b_i-04_west", LocationType.binoculars, []), + "10b_i-05_binoculars": LevelLocation("10b_i-05_binoculars", "Farewell - Room i-05 Binoculars", "10b_i-05_west", LocationType.binoculars, []), + "10b_j-16_binoculars": LevelLocation("10b_j-16_binoculars", "Farewell - Room j-16 Binoculars", "10b_j-16_west", LocationType.binoculars, []), + "10b_j-19_binoculars": LevelLocation("10b_j-19_binoculars", "Farewell - Room j-19 Binoculars", "10b_j-19_bottom", LocationType.binoculars, []), + "10b_j-19_moon_berry": LevelLocation("10b_j-19_moon_berry", "Farewell - Moon Berry", "10b_j-19_top", LocationType.strawberry, []), + "10b_GOAL_clear": LevelLocation("10b_GOAL_clear", "Farewell - Level Clear", "10b_GOAL_main", LocationType.level_clear, []), + + "10c_end-golden_binoculars_1": LevelLocation("10c_end-golden_binoculars_1", "Farewell - Room end-golden Binoculars 1", "10c_end-golden_bottom", LocationType.binoculars, []), + "10c_end-golden_binoculars_2": LevelLocation("10c_end-golden_binoculars_2", "Farewell - Room end-golden Binoculars 2", "10c_end-golden_bottom", LocationType.binoculars, []), + "10c_end-golden_binoculars_3": LevelLocation("10c_end-golden_binoculars_3", "Farewell - Room end-golden Binoculars 3", "10c_end-golden_bottom", LocationType.binoculars, [[ItemName.double_dash_refills, ItemName.jellyfish, ItemName.springs, ItemName.pufferfish, ], ]), + "10c_end-golden_golden": LevelLocation("10c_end-golden_golden", "Farewell - Golden Strawberry", "10c_end-golden_top", LocationType.golden_strawberry, [[ItemName.traffic_blocks, ItemName.dash_refills, ItemName.double_dash_refills, ItemName.dream_blocks, ItemName.swap_blocks, ItemName.move_blocks, ItemName.blue_boosters, ItemName.springs, ItemName.feathers, ItemName.coins, ItemName.red_boosters, ItemName.kevin_blocks, ItemName.core_blocks, ItemName.fire_ice_balls, ItemName.badeline_boosters, ItemName.bird, ItemName.breaker_boxes, ItemName.pufferfish, ItemName.jellyfish, ItemName.pink_cassette_blocks, ItemName.blue_cassette_blocks, ItemName.yellow_cassette_blocks, ItemName.green_cassette_blocks, ], ]), + +} + +all_regions: dict[str, PreRegion] = { + "0a_-1_main": PreRegion("0a_-1_main", "0a_-1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_-1_main"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_-1_main"]), + "0a_-1_east": PreRegion("0a_-1_east", "0a_-1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_-1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_-1_east"]), + + "0a_0_west": PreRegion("0a_0_west", "0a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_0_west"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_0_west"]), + "0a_0_main": PreRegion("0a_0_main", "0a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_0_main"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_0_main"]), + "0a_0_north": PreRegion("0a_0_north", "0a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_0_north"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_0_north"]), + "0a_0_east": PreRegion("0a_0_east", "0a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_0_east"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_0_east"]), + + "0a_0b_south": PreRegion("0a_0b_south", "0a_0b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_0b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_0b_south"]), + + "0a_1_west": PreRegion("0a_1_west", "0a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_1_west"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_1_west"]), + "0a_1_main": PreRegion("0a_1_main", "0a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_1_main"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_1_main"]), + "0a_1_east": PreRegion("0a_1_east", "0a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_1_east"]), + + "0a_2_west": PreRegion("0a_2_west", "0a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_2_west"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_2_west"]), + "0a_2_main": PreRegion("0a_2_main", "0a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_2_main"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_2_main"]), + "0a_2_east": PreRegion("0a_2_east", "0a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_2_east"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_2_east"]), + + "0a_3_west": PreRegion("0a_3_west", "0a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_3_west"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_3_west"]), + "0a_3_main": PreRegion("0a_3_main", "0a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_3_main"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_3_main"]), + "0a_3_east": PreRegion("0a_3_east", "0a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "0a_3_east"], [loc for _, loc in all_locations.items() if loc.region_name == "0a_3_east"]), + + "1a_1_main": PreRegion("1a_1_main", "1a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_1_main"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_1_main"]), + "1a_1_east": PreRegion("1a_1_east", "1a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_1_east"]), + + "1a_2_west": PreRegion("1a_2_west", "1a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_2_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_2_west"]), + "1a_2_east": PreRegion("1a_2_east", "1a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_2_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_2_east"]), + + "1a_3_west": PreRegion("1a_3_west", "1a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_3_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_3_west"]), + "1a_3_east": PreRegion("1a_3_east", "1a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_3_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_3_east"]), + + "1a_4_west": PreRegion("1a_4_west", "1a_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_4_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_4_west"]), + "1a_4_east": PreRegion("1a_4_east", "1a_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_4_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_4_east"]), + + "1a_3b_west": PreRegion("1a_3b_west", "1a_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_3b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_3b_west"]), + "1a_3b_east": PreRegion("1a_3b_east", "1a_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_3b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_3b_east"]), + "1a_3b_top": PreRegion("1a_3b_top", "1a_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_3b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_3b_top"]), + + "1a_5_bottom": PreRegion("1a_5_bottom", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_bottom"]), + "1a_5_west": PreRegion("1a_5_west", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_west"]), + "1a_5_north-west": PreRegion("1a_5_north-west", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_north-west"]), + "1a_5_center": PreRegion("1a_5_center", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_center"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_center"]), + "1a_5_south-east": PreRegion("1a_5_south-east", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_south-east"]), + "1a_5_north-east": PreRegion("1a_5_north-east", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_north-east"]), + "1a_5_top": PreRegion("1a_5_top", "1a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5_top"]), + + "1a_5z_east": PreRegion("1a_5z_east", "1a_5z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5z_east"]), + + "1a_5a_west": PreRegion("1a_5a_west", "1a_5a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_5a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_5a_west"]), + + "1a_6_south-west": PreRegion("1a_6_south-west", "1a_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6_south-west"]), + "1a_6_west": PreRegion("1a_6_west", "1a_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6_west"]), + "1a_6_east": PreRegion("1a_6_east", "1a_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6_east"]), + + "1a_6z_north-west": PreRegion("1a_6z_north-west", "1a_6z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6z_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6z_north-west"]), + "1a_6z_west": PreRegion("1a_6z_west", "1a_6z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6z_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6z_west"]), + "1a_6z_east": PreRegion("1a_6z_east", "1a_6z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6z_east"]), + + "1a_6zb_north-west": PreRegion("1a_6zb_north-west", "1a_6zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6zb_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6zb_north-west"]), + "1a_6zb_main": PreRegion("1a_6zb_main", "1a_6zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6zb_main"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6zb_main"]), + "1a_6zb_east": PreRegion("1a_6zb_east", "1a_6zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6zb_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6zb_east"]), + + "1a_7zb_west": PreRegion("1a_7zb_west", "1a_7zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7zb_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7zb_west"]), + "1a_7zb_east": PreRegion("1a_7zb_east", "1a_7zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7zb_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7zb_east"]), + + "1a_6a_west": PreRegion("1a_6a_west", "1a_6a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6a_west"]), + "1a_6a_east": PreRegion("1a_6a_east", "1a_6a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6a_east"]), + + "1a_6b_south-west": PreRegion("1a_6b_south-west", "1a_6b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6b_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6b_south-west"]), + "1a_6b_north-west": PreRegion("1a_6b_north-west", "1a_6b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6b_north-west"]), + "1a_6b_north-east": PreRegion("1a_6b_north-east", "1a_6b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6b_north-east"]), + + "1a_s0_west": PreRegion("1a_s0_west", "1a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_s0_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_s0_west"]), + "1a_s0_east": PreRegion("1a_s0_east", "1a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_s0_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_s0_east"]), + + "1a_s1_east": PreRegion("1a_s1_east", "1a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_s1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_s1_east"]), + + "1a_6c_south-west": PreRegion("1a_6c_south-west", "1a_6c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6c_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6c_south-west"]), + "1a_6c_north-west": PreRegion("1a_6c_north-west", "1a_6c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6c_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6c_north-west"]), + "1a_6c_north-east": PreRegion("1a_6c_north-east", "1a_6c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_6c_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_6c_north-east"]), + + "1a_7_west": PreRegion("1a_7_west", "1a_7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7_west"]), + "1a_7_east": PreRegion("1a_7_east", "1a_7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7_east"]), + + "1a_7z_bottom": PreRegion("1a_7z_bottom", "1a_7z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7z_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7z_bottom"]), + "1a_7z_top": PreRegion("1a_7z_top", "1a_7z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7z_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7z_top"]), + + "1a_8z_bottom": PreRegion("1a_8z_bottom", "1a_8z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8z_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8z_bottom"]), + "1a_8z_top": PreRegion("1a_8z_top", "1a_8z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8z_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8z_top"]), + + "1a_8zb_west": PreRegion("1a_8zb_west", "1a_8zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8zb_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8zb_west"]), + "1a_8zb_east": PreRegion("1a_8zb_east", "1a_8zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8zb_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8zb_east"]), + + "1a_8_south-west": PreRegion("1a_8_south-west", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_south-west"]), + "1a_8_west": PreRegion("1a_8_west", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_west"]), + "1a_8_south": PreRegion("1a_8_south", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_south"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_south"]), + "1a_8_south-east": PreRegion("1a_8_south-east", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_south-east"]), + "1a_8_north": PreRegion("1a_8_north", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_north"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_north"]), + "1a_8_north-east": PreRegion("1a_8_north-east", "1a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8_north-east"]), + + "1a_7a_east": PreRegion("1a_7a_east", "1a_7a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7a_east"]), + "1a_7a_west": PreRegion("1a_7a_west", "1a_7a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_7a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_7a_west"]), + + "1a_9z_east": PreRegion("1a_9z_east", "1a_9z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9z_east"]), + + "1a_8b_east": PreRegion("1a_8b_east", "1a_8b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8b_east"]), + "1a_8b_west": PreRegion("1a_8b_west", "1a_8b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_8b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_8b_west"]), + + "1a_9_east": PreRegion("1a_9_east", "1a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9_east"]), + "1a_9_west": PreRegion("1a_9_west", "1a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9_west"]), + + "1a_9b_east": PreRegion("1a_9b_east", "1a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9b_east"]), + "1a_9b_north-east": PreRegion("1a_9b_north-east", "1a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9b_north-east"]), + "1a_9b_west": PreRegion("1a_9b_west", "1a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9b_west"]), + "1a_9b_north-west": PreRegion("1a_9b_north-west", "1a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9b_north-west"]), + + "1a_9c_west": PreRegion("1a_9c_west", "1a_9c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_9c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_9c_west"]), + + "1a_10_south-east": PreRegion("1a_10_south-east", "1a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10_south-east"]), + "1a_10_south-west": PreRegion("1a_10_south-west", "1a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10_south-west"]), + "1a_10_north-west": PreRegion("1a_10_north-west", "1a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10_north-west"]), + "1a_10_north-east": PreRegion("1a_10_north-east", "1a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10_north-east"]), + + "1a_10z_west": PreRegion("1a_10z_west", "1a_10z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10z_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10z_west"]), + "1a_10z_east": PreRegion("1a_10z_east", "1a_10z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10z_east"]), + + "1a_10zb_east": PreRegion("1a_10zb_east", "1a_10zb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10zb_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10zb_east"]), + + "1a_11_south-east": PreRegion("1a_11_south-east", "1a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11_south-east"]), + "1a_11_south-west": PreRegion("1a_11_south-west", "1a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11_south-west"]), + "1a_11_north": PreRegion("1a_11_north", "1a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11_north"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11_north"]), + "1a_11_west": PreRegion("1a_11_west", "1a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11_west"]), + "1a_11_south": PreRegion("1a_11_south", "1a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11_south"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11_south"]), + + "1a_11z_east": PreRegion("1a_11z_east", "1a_11z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_11z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_11z_east"]), + + "1a_10a_bottom": PreRegion("1a_10a_bottom", "1a_10a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10a_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10a_bottom"]), + "1a_10a_top": PreRegion("1a_10a_top", "1a_10a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_10a_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_10a_top"]), + + "1a_12_south-west": PreRegion("1a_12_south-west", "1a_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12_south-west"]), + "1a_12_north-west": PreRegion("1a_12_north-west", "1a_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12_north-west"]), + "1a_12_east": PreRegion("1a_12_east", "1a_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12_east"]), + + "1a_12z_east": PreRegion("1a_12z_east", "1a_12z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12z_east"]), + + "1a_12a_bottom": PreRegion("1a_12a_bottom", "1a_12a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12a_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12a_bottom"]), + "1a_12a_top": PreRegion("1a_12a_top", "1a_12a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_12a_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_12a_top"]), + + "1a_end_south": PreRegion("1a_end_south", "1a_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_end_south"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_end_south"]), + "1a_end_main": PreRegion("1a_end_main", "1a_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1a_end_main"], [loc for _, loc in all_locations.items() if loc.region_name == "1a_end_main"]), + + "1b_00_west": PreRegion("1b_00_west", "1b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_00_west"]), + "1b_00_east": PreRegion("1b_00_east", "1b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_00_east"]), + + "1b_01_west": PreRegion("1b_01_west", "1b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_01_west"]), + "1b_01_east": PreRegion("1b_01_east", "1b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_01_east"]), + + "1b_02_west": PreRegion("1b_02_west", "1b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_02_west"]), + "1b_02_east": PreRegion("1b_02_east", "1b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_02_east"]), + + "1b_02b_west": PreRegion("1b_02b_west", "1b_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_02b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_02b_west"]), + "1b_02b_east": PreRegion("1b_02b_east", "1b_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_02b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_02b_east"]), + + "1b_03_west": PreRegion("1b_03_west", "1b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_03_west"]), + "1b_03_east": PreRegion("1b_03_east", "1b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_03_east"]), + + "1b_04_west": PreRegion("1b_04_west", "1b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_04_west"]), + "1b_04_east": PreRegion("1b_04_east", "1b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_04_east"]), + + "1b_05_west": PreRegion("1b_05_west", "1b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_05_west"]), + "1b_05_east": PreRegion("1b_05_east", "1b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_05_east"]), + + "1b_05b_west": PreRegion("1b_05b_west", "1b_05b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_05b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_05b_west"]), + "1b_05b_east": PreRegion("1b_05b_east", "1b_05b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_05b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_05b_east"]), + + "1b_06_west": PreRegion("1b_06_west", "1b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_06_west"]), + "1b_06_east": PreRegion("1b_06_east", "1b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_06_east"]), + + "1b_07_bottom": PreRegion("1b_07_bottom", "1b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_07_bottom"]), + "1b_07_top": PreRegion("1b_07_top", "1b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_07_top"]), + + "1b_08_west": PreRegion("1b_08_west", "1b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_08_west"]), + "1b_08_east": PreRegion("1b_08_east", "1b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_08_east"]), + + "1b_08b_west": PreRegion("1b_08b_west", "1b_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_08b_west"]), + "1b_08b_east": PreRegion("1b_08b_east", "1b_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_08b_east"]), + + "1b_09_west": PreRegion("1b_09_west", "1b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_09_west"]), + "1b_09_east": PreRegion("1b_09_east", "1b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_09_east"]), + + "1b_10_west": PreRegion("1b_10_west", "1b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_10_west"]), + "1b_10_east": PreRegion("1b_10_east", "1b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_10_east"]), + + "1b_11_bottom": PreRegion("1b_11_bottom", "1b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_11_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_11_bottom"]), + "1b_11_top": PreRegion("1b_11_top", "1b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_11_top"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_11_top"]), + + "1b_end_west": PreRegion("1b_end_west", "1b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_end_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_end_west"]), + "1b_end_goal": PreRegion("1b_end_goal", "1b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1b_end_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "1b_end_goal"]), + + "1c_00_west": PreRegion("1c_00_west", "1c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_00_west"]), + "1c_00_east": PreRegion("1c_00_east", "1c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_00_east"]), + + "1c_01_west": PreRegion("1c_01_west", "1c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_01_west"]), + "1c_01_east": PreRegion("1c_01_east", "1c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_01_east"]), + + "1c_02_west": PreRegion("1c_02_west", "1c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_02_west"]), + "1c_02_goal": PreRegion("1c_02_goal", "1c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "1c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "1c_02_goal"]), + + "2a_start_main": PreRegion("2a_start_main", "2a_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_start_main"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_start_main"]), + "2a_start_top": PreRegion("2a_start_top", "2a_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_start_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_start_top"]), + "2a_start_east": PreRegion("2a_start_east", "2a_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_start_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_start_east"]), + + "2a_s0_bottom": PreRegion("2a_s0_bottom", "2a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_s0_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_s0_bottom"]), + "2a_s0_top": PreRegion("2a_s0_top", "2a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_s0_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_s0_top"]), + + "2a_s1_bottom": PreRegion("2a_s1_bottom", "2a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_s1_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_s1_bottom"]), + "2a_s1_top": PreRegion("2a_s1_top", "2a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_s1_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_s1_top"]), + + "2a_s2_bottom": PreRegion("2a_s2_bottom", "2a_s2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_s2_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_s2_bottom"]), + + "2a_0_south-west": PreRegion("2a_0_south-west", "2a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_0_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_0_south-west"]), + "2a_0_south-east": PreRegion("2a_0_south-east", "2a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_0_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_0_south-east"]), + "2a_0_north-west": PreRegion("2a_0_north-west", "2a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_0_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_0_north-west"]), + "2a_0_north-east": PreRegion("2a_0_north-east", "2a_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_0_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_0_north-east"]), + + "2a_1_south-west": PreRegion("2a_1_south-west", "2a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_1_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_1_south-west"]), + "2a_1_south": PreRegion("2a_1_south", "2a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_1_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_1_south"]), + "2a_1_south-east": PreRegion("2a_1_south-east", "2a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_1_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_1_south-east"]), + "2a_1_north-west": PreRegion("2a_1_north-west", "2a_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_1_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_1_north-west"]), + + "2a_d0_north": PreRegion("2a_d0_north", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_north"]), + "2a_d0_north-west": PreRegion("2a_d0_north-west", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_north-west"]), + "2a_d0_west": PreRegion("2a_d0_west", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_west"]), + "2a_d0_south-west": PreRegion("2a_d0_south-west", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_south-west"]), + "2a_d0_south": PreRegion("2a_d0_south", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_south"]), + "2a_d0_south-east": PreRegion("2a_d0_south-east", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_south-east"]), + "2a_d0_east": PreRegion("2a_d0_east", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_east"]), + "2a_d0_north-east": PreRegion("2a_d0_north-east", "2a_d0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d0_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d0_north-east"]), + + "2a_d7_west": PreRegion("2a_d7_west", "2a_d7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d7_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d7_west"]), + "2a_d7_east": PreRegion("2a_d7_east", "2a_d7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d7_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d7_east"]), + + "2a_d8_west": PreRegion("2a_d8_west", "2a_d8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d8_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d8_west"]), + "2a_d8_south-east": PreRegion("2a_d8_south-east", "2a_d8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d8_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d8_south-east"]), + "2a_d8_north-east": PreRegion("2a_d8_north-east", "2a_d8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d8_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d8_north-east"]), + + "2a_d3_west": PreRegion("2a_d3_west", "2a_d3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d3_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d3_west"]), + "2a_d3_north": PreRegion("2a_d3_north", "2a_d3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d3_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d3_north"]), + "2a_d3_south": PreRegion("2a_d3_south", "2a_d3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d3_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d3_south"]), + + "2a_d2_west": PreRegion("2a_d2_west", "2a_d2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d2_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d2_west"]), + "2a_d2_north-west": PreRegion("2a_d2_north-west", "2a_d2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d2_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d2_north-west"]), + "2a_d2_east": PreRegion("2a_d2_east", "2a_d2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d2_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d2_east"]), + + "2a_d9_north-west": PreRegion("2a_d9_north-west", "2a_d9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d9_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d9_north-west"]), + + "2a_d1_south-west": PreRegion("2a_d1_south-west", "2a_d1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d1_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d1_south-west"]), + "2a_d1_south-east": PreRegion("2a_d1_south-east", "2a_d1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d1_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d1_south-east"]), + "2a_d1_north-east": PreRegion("2a_d1_north-east", "2a_d1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d1_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d1_north-east"]), + + "2a_d6_west": PreRegion("2a_d6_west", "2a_d6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d6_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d6_west"]), + "2a_d6_east": PreRegion("2a_d6_east", "2a_d6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d6_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d6_east"]), + + "2a_d4_west": PreRegion("2a_d4_west", "2a_d4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d4_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d4_west"]), + "2a_d4_east": PreRegion("2a_d4_east", "2a_d4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d4_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d4_east"]), + "2a_d4_south": PreRegion("2a_d4_south", "2a_d4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d4_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d4_south"]), + + "2a_d5_west": PreRegion("2a_d5_west", "2a_d5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_d5_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_d5_west"]), + + "2a_3x_bottom": PreRegion("2a_3x_bottom", "2a_3x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_3x_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_3x_bottom"]), + "2a_3x_top": PreRegion("2a_3x_top", "2a_3x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_3x_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_3x_top"]), + + "2a_3_bottom": PreRegion("2a_3_bottom", "2a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_3_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_3_bottom"]), + "2a_3_top": PreRegion("2a_3_top", "2a_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_3_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_3_top"]), + + "2a_4_bottom": PreRegion("2a_4_bottom", "2a_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_4_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_4_bottom"]), + "2a_4_top": PreRegion("2a_4_top", "2a_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_4_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_4_top"]), + + "2a_5_bottom": PreRegion("2a_5_bottom", "2a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_5_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_5_bottom"]), + "2a_5_top": PreRegion("2a_5_top", "2a_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_5_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_5_top"]), + + "2a_6_bottom": PreRegion("2a_6_bottom", "2a_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_6_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_6_bottom"]), + "2a_6_top": PreRegion("2a_6_top", "2a_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_6_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_6_top"]), + + "2a_7_bottom": PreRegion("2a_7_bottom", "2a_7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_7_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_7_bottom"]), + "2a_7_top": PreRegion("2a_7_top", "2a_7", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_7_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_7_top"]), + + "2a_8_bottom": PreRegion("2a_8_bottom", "2a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_8_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_8_bottom"]), + "2a_8_top": PreRegion("2a_8_top", "2a_8", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_8_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_8_top"]), + + "2a_9_west": PreRegion("2a_9_west", "2a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9_west"]), + "2a_9_north": PreRegion("2a_9_north", "2a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9_north"]), + "2a_9_north-west": PreRegion("2a_9_north-west", "2a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9_north-west"]), + "2a_9_south": PreRegion("2a_9_south", "2a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9_south"]), + "2a_9_south-east": PreRegion("2a_9_south-east", "2a_9", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9_south-east"]), + + "2a_9b_east": PreRegion("2a_9b_east", "2a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9b_east"]), + "2a_9b_west": PreRegion("2a_9b_west", "2a_9b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_9b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_9b_west"]), + + "2a_10_top": PreRegion("2a_10_top", "2a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_10_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_10_top"]), + "2a_10_bottom": PreRegion("2a_10_bottom", "2a_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_10_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_10_bottom"]), + + "2a_2_north-west": PreRegion("2a_2_north-west", "2a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_2_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_2_north-west"]), + "2a_2_south-west": PreRegion("2a_2_south-west", "2a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_2_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_2_south-west"]), + "2a_2_south-east": PreRegion("2a_2_south-east", "2a_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_2_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_2_south-east"]), + + "2a_11_west": PreRegion("2a_11_west", "2a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_11_west"]), + "2a_11_east": PreRegion("2a_11_east", "2a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_11_east"]), + + "2a_12b_west": PreRegion("2a_12b_west", "2a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12b_west"]), + "2a_12b_north": PreRegion("2a_12b_north", "2a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12b_north"]), + "2a_12b_south": PreRegion("2a_12b_south", "2a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12b_south"]), + "2a_12b_east": PreRegion("2a_12b_east", "2a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12b_east"]), + "2a_12b_south-east": PreRegion("2a_12b_south-east", "2a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12b_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12b_south-east"]), + + "2a_12c_south": PreRegion("2a_12c_south", "2a_12c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12c_south"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12c_south"]), + + "2a_12d_north-west": PreRegion("2a_12d_north-west", "2a_12d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12d_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12d_north-west"]), + "2a_12d_north": PreRegion("2a_12d_north", "2a_12d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12d_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12d_north"]), + + "2a_12_west": PreRegion("2a_12_west", "2a_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12_west"]), + "2a_12_east": PreRegion("2a_12_east", "2a_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_12_east"]), + + "2a_13_west": PreRegion("2a_13_west", "2a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_13_west"]), + "2a_13_phone": PreRegion("2a_13_phone", "2a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_13_phone"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_13_phone"]), + + "2a_end_0_main": PreRegion("2a_end_0_main", "2a_end_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_0_main"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_0_main"]), + "2a_end_0_top": PreRegion("2a_end_0_top", "2a_end_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_0_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_0_top"]), + "2a_end_0_east": PreRegion("2a_end_0_east", "2a_end_0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_0_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_0_east"]), + + "2a_end_s0_bottom": PreRegion("2a_end_s0_bottom", "2a_end_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_s0_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_s0_bottom"]), + "2a_end_s0_top": PreRegion("2a_end_s0_top", "2a_end_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_s0_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_s0_top"]), + + "2a_end_s1_bottom": PreRegion("2a_end_s1_bottom", "2a_end_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_s1_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_s1_bottom"]), + + "2a_end_1_west": PreRegion("2a_end_1_west", "2a_end_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_1_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_1_west"]), + "2a_end_1_north-east": PreRegion("2a_end_1_north-east", "2a_end_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_1_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_1_north-east"]), + "2a_end_1_east": PreRegion("2a_end_1_east", "2a_end_1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_1_east"]), + + "2a_end_2_north-west": PreRegion("2a_end_2_north-west", "2a_end_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_2_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_2_north-west"]), + "2a_end_2_west": PreRegion("2a_end_2_west", "2a_end_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_2_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_2_west"]), + "2a_end_2_north-east": PreRegion("2a_end_2_north-east", "2a_end_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_2_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_2_north-east"]), + "2a_end_2_east": PreRegion("2a_end_2_east", "2a_end_2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_2_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_2_east"]), + + "2a_end_3_north-west": PreRegion("2a_end_3_north-west", "2a_end_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3_north-west"]), + "2a_end_3_west": PreRegion("2a_end_3_west", "2a_end_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3_west"]), + "2a_end_3_east": PreRegion("2a_end_3_east", "2a_end_3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3_east"]), + + "2a_end_4_west": PreRegion("2a_end_4_west", "2a_end_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_4_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_4_west"]), + "2a_end_4_east": PreRegion("2a_end_4_east", "2a_end_4", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_4_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_4_east"]), + + "2a_end_3b_west": PreRegion("2a_end_3b_west", "2a_end_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3b_west"]), + "2a_end_3b_north": PreRegion("2a_end_3b_north", "2a_end_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3b_north"]), + "2a_end_3b_east": PreRegion("2a_end_3b_east", "2a_end_3b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3b_east"]), + + "2a_end_3cb_bottom": PreRegion("2a_end_3cb_bottom", "2a_end_3cb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3cb_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3cb_bottom"]), + "2a_end_3cb_top": PreRegion("2a_end_3cb_top", "2a_end_3cb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3cb_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3cb_top"]), + + "2a_end_3c_bottom": PreRegion("2a_end_3c_bottom", "2a_end_3c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_3c_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_3c_bottom"]), + + "2a_end_5_west": PreRegion("2a_end_5_west", "2a_end_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_5_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_5_west"]), + "2a_end_5_east": PreRegion("2a_end_5_east", "2a_end_5", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_5_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_5_east"]), + + "2a_end_6_west": PreRegion("2a_end_6_west", "2a_end_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_6_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_6_west"]), + "2a_end_6_main": PreRegion("2a_end_6_main", "2a_end_6", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2a_end_6_main"], [loc for _, loc in all_locations.items() if loc.region_name == "2a_end_6_main"]), + + "2b_start_west": PreRegion("2b_start_west", "2b_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_start_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_start_west"]), + "2b_start_east": PreRegion("2b_start_east", "2b_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_start_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_start_east"]), + + "2b_00_west": PreRegion("2b_00_west", "2b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_00_west"]), + "2b_00_east": PreRegion("2b_00_east", "2b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_00_east"]), + + "2b_01_west": PreRegion("2b_01_west", "2b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_01_west"]), + "2b_01_east": PreRegion("2b_01_east", "2b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_01_east"]), + + "2b_01b_west": PreRegion("2b_01b_west", "2b_01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_01b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_01b_west"]), + "2b_01b_east": PreRegion("2b_01b_east", "2b_01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_01b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_01b_east"]), + + "2b_02b_west": PreRegion("2b_02b_west", "2b_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_02b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_02b_west"]), + "2b_02b_east": PreRegion("2b_02b_east", "2b_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_02b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_02b_east"]), + + "2b_02_west": PreRegion("2b_02_west", "2b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_02_west"]), + "2b_02_east": PreRegion("2b_02_east", "2b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_02_east"]), + + "2b_03_west": PreRegion("2b_03_west", "2b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_03_west"]), + "2b_03_east": PreRegion("2b_03_east", "2b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_03_east"]), + + "2b_04_bottom": PreRegion("2b_04_bottom", "2b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_04_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_04_bottom"]), + "2b_04_top": PreRegion("2b_04_top", "2b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_04_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_04_top"]), + + "2b_05_bottom": PreRegion("2b_05_bottom", "2b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_05_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_05_bottom"]), + "2b_05_top": PreRegion("2b_05_top", "2b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_05_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_05_top"]), + + "2b_06_west": PreRegion("2b_06_west", "2b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_06_west"]), + "2b_06_east": PreRegion("2b_06_east", "2b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_06_east"]), + + "2b_07_bottom": PreRegion("2b_07_bottom", "2b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_07_bottom"]), + "2b_07_top": PreRegion("2b_07_top", "2b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_07_top"]), + + "2b_08b_west": PreRegion("2b_08b_west", "2b_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_08b_west"]), + "2b_08b_east": PreRegion("2b_08b_east", "2b_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_08b_east"]), + + "2b_08_west": PreRegion("2b_08_west", "2b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_08_west"]), + "2b_08_east": PreRegion("2b_08_east", "2b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_08_east"]), + + "2b_09_west": PreRegion("2b_09_west", "2b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_09_west"]), + "2b_09_east": PreRegion("2b_09_east", "2b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_09_east"]), + + "2b_10_west": PreRegion("2b_10_west", "2b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_10_west"]), + "2b_10_east": PreRegion("2b_10_east", "2b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_10_east"]), + + "2b_11_bottom": PreRegion("2b_11_bottom", "2b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_11_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_11_bottom"]), + "2b_11_top": PreRegion("2b_11_top", "2b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_11_top"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_11_top"]), + + "2b_end_west": PreRegion("2b_end_west", "2b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_end_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_end_west"]), + "2b_end_goal": PreRegion("2b_end_goal", "2b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2b_end_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "2b_end_goal"]), + + "2c_00_west": PreRegion("2c_00_west", "2c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_00_west"]), + "2c_00_east": PreRegion("2c_00_east", "2c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_00_east"]), + + "2c_01_west": PreRegion("2c_01_west", "2c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_01_west"]), + "2c_01_east": PreRegion("2c_01_east", "2c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_01_east"]), + + "2c_02_west": PreRegion("2c_02_west", "2c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_02_west"]), + "2c_02_goal": PreRegion("2c_02_goal", "2c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "2c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "2c_02_goal"]), + + "3a_s0_main": PreRegion("3a_s0_main", "3a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s0_main"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s0_main"]), + "3a_s0_east": PreRegion("3a_s0_east", "3a_s0", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s0_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s0_east"]), + + "3a_s1_west": PreRegion("3a_s1_west", "3a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s1_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s1_west"]), + "3a_s1_east": PreRegion("3a_s1_east", "3a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s1_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s1_east"]), + "3a_s1_north-east": PreRegion("3a_s1_north-east", "3a_s1", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s1_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s1_north-east"]), + + "3a_s2_west": PreRegion("3a_s2_west", "3a_s2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s2_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s2_west"]), + "3a_s2_north-west": PreRegion("3a_s2_north-west", "3a_s2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s2_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s2_north-west"]), + "3a_s2_east": PreRegion("3a_s2_east", "3a_s2", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s2_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s2_east"]), + + "3a_s3_west": PreRegion("3a_s3_west", "3a_s3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s3_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s3_west"]), + "3a_s3_north": PreRegion("3a_s3_north", "3a_s3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s3_north"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s3_north"]), + "3a_s3_east": PreRegion("3a_s3_east", "3a_s3", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_s3_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_s3_east"]), + + "3a_0x-a_west": PreRegion("3a_0x-a_west", "3a_0x-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_0x-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_0x-a_west"]), + "3a_0x-a_east": PreRegion("3a_0x-a_east", "3a_0x-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_0x-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_0x-a_east"]), + + "3a_00-a_west": PreRegion("3a_00-a_west", "3a_00-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-a_west"]), + "3a_00-a_east": PreRegion("3a_00-a_east", "3a_00-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-a_east"]), + + "3a_02-a_west": PreRegion("3a_02-a_west", "3a_02-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-a_west"]), + "3a_02-a_top": PreRegion("3a_02-a_top", "3a_02-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-a_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-a_top"]), + "3a_02-a_main": PreRegion("3a_02-a_main", "3a_02-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-a_main"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-a_main"]), + "3a_02-a_east": PreRegion("3a_02-a_east", "3a_02-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-a_east"]), + + "3a_02-b_west": PreRegion("3a_02-b_west", "3a_02-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-b_west"]), + "3a_02-b_east": PreRegion("3a_02-b_east", "3a_02-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-b_east"]), + "3a_02-b_far-east": PreRegion("3a_02-b_far-east", "3a_02-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-b_far-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-b_far-east"]), + + "3a_01-b_west": PreRegion("3a_01-b_west", "3a_01-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_01-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_01-b_west"]), + "3a_01-b_north-west": PreRegion("3a_01-b_north-west", "3a_01-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_01-b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_01-b_north-west"]), + "3a_01-b_east": PreRegion("3a_01-b_east", "3a_01-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_01-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_01-b_east"]), + + "3a_00-b_south-west": PreRegion("3a_00-b_south-west", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_south-west"]), + "3a_00-b_south-east": PreRegion("3a_00-b_south-east", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_south-east"]), + "3a_00-b_west": PreRegion("3a_00-b_west", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_west"]), + "3a_00-b_north-west": PreRegion("3a_00-b_north-west", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_north-west"]), + "3a_00-b_east": PreRegion("3a_00-b_east", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_east"]), + "3a_00-b_north": PreRegion("3a_00-b_north", "3a_00-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-b_north"]), + + "3a_00-c_south-west": PreRegion("3a_00-c_south-west", "3a_00-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-c_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-c_south-west"]), + "3a_00-c_south-east": PreRegion("3a_00-c_south-east", "3a_00-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-c_south-east"]), + "3a_00-c_north-east": PreRegion("3a_00-c_north-east", "3a_00-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-c_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-c_north-east"]), + + "3a_0x-b_west": PreRegion("3a_0x-b_west", "3a_0x-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_0x-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_0x-b_west"]), + "3a_0x-b_south-east": PreRegion("3a_0x-b_south-east", "3a_0x-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_0x-b_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_0x-b_south-east"]), + "3a_0x-b_north-east": PreRegion("3a_0x-b_north-east", "3a_0x-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_0x-b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_0x-b_north-east"]), + + "3a_03-a_west": PreRegion("3a_03-a_west", "3a_03-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-a_west"]), + "3a_03-a_top": PreRegion("3a_03-a_top", "3a_03-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-a_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-a_top"]), + "3a_03-a_east": PreRegion("3a_03-a_east", "3a_03-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-a_east"]), + + "3a_04-b_west": PreRegion("3a_04-b_west", "3a_04-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-b_west"]), + "3a_04-b_east": PreRegion("3a_04-b_east", "3a_04-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-b_east"]), + + "3a_05-a_west": PreRegion("3a_05-a_west", "3a_05-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_05-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_05-a_west"]), + "3a_05-a_east": PreRegion("3a_05-a_east", "3a_05-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_05-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_05-a_east"]), + + "3a_06-a_west": PreRegion("3a_06-a_west", "3a_06-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-a_west"]), + "3a_06-a_east": PreRegion("3a_06-a_east", "3a_06-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-a_east"]), + + "3a_07-a_west": PreRegion("3a_07-a_west", "3a_07-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-a_west"]), + "3a_07-a_top": PreRegion("3a_07-a_top", "3a_07-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-a_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-a_top"]), + "3a_07-a_east": PreRegion("3a_07-a_east", "3a_07-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-a_east"]), + + "3a_07-b_bottom": PreRegion("3a_07-b_bottom", "3a_07-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-b_bottom"]), + "3a_07-b_west": PreRegion("3a_07-b_west", "3a_07-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-b_west"]), + "3a_07-b_top": PreRegion("3a_07-b_top", "3a_07-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-b_top"]), + "3a_07-b_east": PreRegion("3a_07-b_east", "3a_07-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_07-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_07-b_east"]), + + "3a_06-b_west": PreRegion("3a_06-b_west", "3a_06-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-b_west"]), + "3a_06-b_east": PreRegion("3a_06-b_east", "3a_06-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-b_east"]), + + "3a_06-c_south-west": PreRegion("3a_06-c_south-west", "3a_06-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-c_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-c_south-west"]), + "3a_06-c_north-west": PreRegion("3a_06-c_north-west", "3a_06-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-c_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-c_north-west"]), + "3a_06-c_south-east": PreRegion("3a_06-c_south-east", "3a_06-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-c_south-east"]), + "3a_06-c_east": PreRegion("3a_06-c_east", "3a_06-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-c_east"]), + + "3a_05-c_east": PreRegion("3a_05-c_east", "3a_05-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_05-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_05-c_east"]), + + "3a_08-c_west": PreRegion("3a_08-c_west", "3a_08-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-c_west"]), + "3a_08-c_east": PreRegion("3a_08-c_east", "3a_08-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-c_east"]), + + "3a_08-b_west": PreRegion("3a_08-b_west", "3a_08-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-b_west"]), + "3a_08-b_east": PreRegion("3a_08-b_east", "3a_08-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-b_east"]), + + "3a_08-a_west": PreRegion("3a_08-a_west", "3a_08-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-a_west"]), + "3a_08-a_bottom": PreRegion("3a_08-a_bottom", "3a_08-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-a_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-a_bottom"]), + "3a_08-a_east": PreRegion("3a_08-a_east", "3a_08-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-a_east"]), + + "3a_09-b_west": PreRegion("3a_09-b_west", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_west"]), + "3a_09-b_north-west": PreRegion("3a_09-b_north-west", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_north-west"]), + "3a_09-b_center": PreRegion("3a_09-b_center", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_center"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_center"]), + "3a_09-b_south-west": PreRegion("3a_09-b_south-west", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_south-west"]), + "3a_09-b_south": PreRegion("3a_09-b_south", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_south"]), + "3a_09-b_south-east": PreRegion("3a_09-b_south-east", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_south-east"]), + "3a_09-b_east": PreRegion("3a_09-b_east", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_east"]), + "3a_09-b_north-east-right": PreRegion("3a_09-b_north-east-right", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_north-east-right"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_north-east-right"]), + "3a_09-b_north-east-top": PreRegion("3a_09-b_north-east-top", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_north-east-top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_north-east-top"]), + "3a_09-b_north": PreRegion("3a_09-b_north", "3a_09-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-b_north"]), + + "3a_10-x_west": PreRegion("3a_10-x_west", "3a_10-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-x_west"]), + "3a_10-x_south-east": PreRegion("3a_10-x_south-east", "3a_10-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-x_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-x_south-east"]), + "3a_10-x_north-east-top": PreRegion("3a_10-x_north-east-top", "3a_10-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-x_north-east-top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-x_north-east-top"]), + "3a_10-x_north-east-right": PreRegion("3a_10-x_north-east-right", "3a_10-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-x_north-east-right"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-x_north-east-right"]), + + "3a_11-x_west": PreRegion("3a_11-x_west", "3a_11-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-x_west"]), + "3a_11-x_south": PreRegion("3a_11-x_south", "3a_11-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-x_south"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-x_south"]), + + "3a_11-y_west": PreRegion("3a_11-y_west", "3a_11-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-y_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-y_west"]), + "3a_11-y_east": PreRegion("3a_11-y_east", "3a_11-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-y_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-y_east"]), + "3a_11-y_south": PreRegion("3a_11-y_south", "3a_11-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-y_south"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-y_south"]), + + "3a_12-y_west": PreRegion("3a_12-y_west", "3a_12-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-y_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-y_west"]), + + "3a_11-z_west": PreRegion("3a_11-z_west", "3a_11-z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-z_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-z_west"]), + "3a_11-z_east": PreRegion("3a_11-z_east", "3a_11-z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-z_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-z_east"]), + + "3a_10-z_bottom": PreRegion("3a_10-z_bottom", "3a_10-z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-z_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-z_bottom"]), + "3a_10-z_top": PreRegion("3a_10-z_top", "3a_10-z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-z_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-z_top"]), + + "3a_10-y_bottom": PreRegion("3a_10-y_bottom", "3a_10-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-y_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-y_bottom"]), + "3a_10-y_top": PreRegion("3a_10-y_top", "3a_10-y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-y_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-y_top"]), + + "3a_10-c_south-east": PreRegion("3a_10-c_south-east", "3a_10-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-c_south-east"]), + "3a_10-c_north-east": PreRegion("3a_10-c_north-east", "3a_10-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-c_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-c_north-east"]), + "3a_10-c_north-west": PreRegion("3a_10-c_north-west", "3a_10-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-c_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-c_north-west"]), + "3a_10-c_south-west": PreRegion("3a_10-c_south-west", "3a_10-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-c_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-c_south-west"]), + + "3a_11-c_west": PreRegion("3a_11-c_west", "3a_11-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-c_west"]), + "3a_11-c_east": PreRegion("3a_11-c_east", "3a_11-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-c_east"]), + "3a_11-c_south-east": PreRegion("3a_11-c_south-east", "3a_11-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-c_south-east"]), + "3a_11-c_south-west": PreRegion("3a_11-c_south-west", "3a_11-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-c_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-c_south-west"]), + + "3a_12-c_west": PreRegion("3a_12-c_west", "3a_12-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-c_west"]), + "3a_12-c_top": PreRegion("3a_12-c_top", "3a_12-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-c_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-c_top"]), + + "3a_12-d_bottom": PreRegion("3a_12-d_bottom", "3a_12-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-d_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-d_bottom"]), + "3a_12-d_top": PreRegion("3a_12-d_top", "3a_12-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-d_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-d_top"]), + + "3a_11-d_west": PreRegion("3a_11-d_west", "3a_11-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-d_west"]), + "3a_11-d_east": PreRegion("3a_11-d_east", "3a_11-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-d_east"]), + + "3a_10-d_west": PreRegion("3a_10-d_west", "3a_10-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-d_west"]), + "3a_10-d_main": PreRegion("3a_10-d_main", "3a_10-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-d_main"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-d_main"]), + "3a_10-d_east": PreRegion("3a_10-d_east", "3a_10-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_10-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_10-d_east"]), + + "3a_11-b_west": PreRegion("3a_11-b_west", "3a_11-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-b_west"]), + "3a_11-b_north-west": PreRegion("3a_11-b_north-west", "3a_11-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-b_north-west"]), + "3a_11-b_east": PreRegion("3a_11-b_east", "3a_11-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-b_east"]), + "3a_11-b_north-east": PreRegion("3a_11-b_north-east", "3a_11-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-b_north-east"]), + + "3a_12-b_west": PreRegion("3a_12-b_west", "3a_12-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-b_west"]), + "3a_12-b_east": PreRegion("3a_12-b_east", "3a_12-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-b_east"]), + + "3a_13-b_top": PreRegion("3a_13-b_top", "3a_13-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-b_top"]), + "3a_13-b_bottom": PreRegion("3a_13-b_bottom", "3a_13-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-b_bottom"]), + + "3a_13-a_west": PreRegion("3a_13-a_west", "3a_13-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-a_west"]), + "3a_13-a_south-west": PreRegion("3a_13-a_south-west", "3a_13-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-a_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-a_south-west"]), + "3a_13-a_east": PreRegion("3a_13-a_east", "3a_13-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-a_east"]), + + "3a_13-x_west": PreRegion("3a_13-x_west", "3a_13-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-x_west"]), + "3a_13-x_east": PreRegion("3a_13-x_east", "3a_13-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_13-x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_13-x_east"]), + + "3a_12-x_west": PreRegion("3a_12-x_west", "3a_12-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-x_west"]), + "3a_12-x_north-east": PreRegion("3a_12-x_north-east", "3a_12-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-x_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-x_north-east"]), + "3a_12-x_east": PreRegion("3a_12-x_east", "3a_12-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_12-x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_12-x_east"]), + + "3a_11-a_west": PreRegion("3a_11-a_west", "3a_11-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-a_west"]), + "3a_11-a_south": PreRegion("3a_11-a_south", "3a_11-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-a_south"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-a_south"]), + "3a_11-a_south-east-bottom": PreRegion("3a_11-a_south-east-bottom", "3a_11-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-a_south-east-bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-a_south-east-bottom"]), + "3a_11-a_south-east-right": PreRegion("3a_11-a_south-east-right", "3a_11-a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_11-a_south-east-right"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_11-a_south-east-right"]), + + "3a_08-x_west": PreRegion("3a_08-x_west", "3a_08-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-x_west"]), + "3a_08-x_east": PreRegion("3a_08-x_east", "3a_08-x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-x_east"]), + + "3a_09-d_bottom": PreRegion("3a_09-d_bottom", "3a_09-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-d_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-d_bottom"]), + "3a_09-d_top": PreRegion("3a_09-d_top", "3a_09-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_09-d_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_09-d_top"]), + + "3a_08-d_west": PreRegion("3a_08-d_west", "3a_08-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-d_west"]), + "3a_08-d_east": PreRegion("3a_08-d_east", "3a_08-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_08-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_08-d_east"]), + + "3a_06-d_west": PreRegion("3a_06-d_west", "3a_06-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-d_west"]), + "3a_06-d_east": PreRegion("3a_06-d_east", "3a_06-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_06-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_06-d_east"]), + + "3a_04-d_west": PreRegion("3a_04-d_west", "3a_04-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-d_west"]), + "3a_04-d_south-west": PreRegion("3a_04-d_south-west", "3a_04-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-d_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-d_south-west"]), + "3a_04-d_south": PreRegion("3a_04-d_south", "3a_04-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-d_south"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-d_south"]), + "3a_04-d_east": PreRegion("3a_04-d_east", "3a_04-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-d_east"]), + + "3a_04-c_west": PreRegion("3a_04-c_west", "3a_04-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-c_west"]), + "3a_04-c_north-west": PreRegion("3a_04-c_north-west", "3a_04-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-c_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-c_north-west"]), + "3a_04-c_east": PreRegion("3a_04-c_east", "3a_04-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_04-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_04-c_east"]), + + "3a_02-c_west": PreRegion("3a_02-c_west", "3a_02-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-c_west"]), + "3a_02-c_east": PreRegion("3a_02-c_east", "3a_02-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-c_east"]), + "3a_02-c_south-east": PreRegion("3a_02-c_south-east", "3a_02-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-c_south-east"]), + + "3a_03-b_west": PreRegion("3a_03-b_west", "3a_03-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-b_west"]), + "3a_03-b_east": PreRegion("3a_03-b_east", "3a_03-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-b_east"]), + "3a_03-b_north": PreRegion("3a_03-b_north", "3a_03-b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_03-b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_03-b_north"]), + + "3a_01-c_west": PreRegion("3a_01-c_west", "3a_01-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_01-c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_01-c_west"]), + "3a_01-c_east": PreRegion("3a_01-c_east", "3a_01-c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_01-c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_01-c_east"]), + + "3a_02-d_west": PreRegion("3a_02-d_west", "3a_02-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-d_west"]), + "3a_02-d_east": PreRegion("3a_02-d_east", "3a_02-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_02-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_02-d_east"]), + + "3a_00-d_west": PreRegion("3a_00-d_west", "3a_00-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-d_west"]), + "3a_00-d_east": PreRegion("3a_00-d_east", "3a_00-d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_00-d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_00-d_east"]), + + "3a_roof00_west": PreRegion("3a_roof00_west", "3a_roof00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof00_west"]), + "3a_roof00_east": PreRegion("3a_roof00_east", "3a_roof00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof00_east"]), + + "3a_roof01_west": PreRegion("3a_roof01_west", "3a_roof01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof01_west"]), + "3a_roof01_east": PreRegion("3a_roof01_east", "3a_roof01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof01_east"]), + + "3a_roof02_west": PreRegion("3a_roof02_west", "3a_roof02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof02_west"]), + "3a_roof02_east": PreRegion("3a_roof02_east", "3a_roof02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof02_east"]), + + "3a_roof03_west": PreRegion("3a_roof03_west", "3a_roof03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof03_west"]), + "3a_roof03_east": PreRegion("3a_roof03_east", "3a_roof03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof03_east"]), + + "3a_roof04_west": PreRegion("3a_roof04_west", "3a_roof04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof04_west"]), + "3a_roof04_east": PreRegion("3a_roof04_east", "3a_roof04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof04_east"]), + + "3a_roof05_west": PreRegion("3a_roof05_west", "3a_roof05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof05_west"]), + "3a_roof05_east": PreRegion("3a_roof05_east", "3a_roof05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof05_east"]), + + "3a_roof06b_west": PreRegion("3a_roof06b_west", "3a_roof06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof06b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof06b_west"]), + "3a_roof06b_east": PreRegion("3a_roof06b_east", "3a_roof06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof06b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof06b_east"]), + + "3a_roof06_west": PreRegion("3a_roof06_west", "3a_roof06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof06_west"]), + "3a_roof06_east": PreRegion("3a_roof06_east", "3a_roof06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof06_east"]), + + "3a_roof07_west": PreRegion("3a_roof07_west", "3a_roof07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof07_west"]), + "3a_roof07_main": PreRegion("3a_roof07_main", "3a_roof07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3a_roof07_main"], [loc for _, loc in all_locations.items() if loc.region_name == "3a_roof07_main"]), + + "3b_00_west": PreRegion("3b_00_west", "3b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_00_west"]), + "3b_00_east": PreRegion("3b_00_east", "3b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_00_east"]), + + "3b_back_east": PreRegion("3b_back_east", "3b_back", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_back_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_back_east"]), + + "3b_01_west": PreRegion("3b_01_west", "3b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_01_west"]), + "3b_01_east": PreRegion("3b_01_east", "3b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_01_east"]), + + "3b_02_west": PreRegion("3b_02_west", "3b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_02_west"]), + "3b_02_east": PreRegion("3b_02_east", "3b_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_02_east"]), + + "3b_03_west": PreRegion("3b_03_west", "3b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_03_west"]), + "3b_03_east": PreRegion("3b_03_east", "3b_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_03_east"]), + + "3b_04_west": PreRegion("3b_04_west", "3b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_04_west"]), + "3b_04_east": PreRegion("3b_04_east", "3b_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_04_east"]), + + "3b_05_west": PreRegion("3b_05_west", "3b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_05_west"]), + "3b_05_east": PreRegion("3b_05_east", "3b_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_05_east"]), + + "3b_06_west": PreRegion("3b_06_west", "3b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_06_west"]), + "3b_06_east": PreRegion("3b_06_east", "3b_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_06_east"]), + + "3b_07_west": PreRegion("3b_07_west", "3b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_07_west"]), + "3b_07_east": PreRegion("3b_07_east", "3b_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_07_east"]), + + "3b_08_bottom": PreRegion("3b_08_bottom", "3b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_08_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_08_bottom"]), + "3b_08_top": PreRegion("3b_08_top", "3b_08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_08_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_08_top"]), + + "3b_09_west": PreRegion("3b_09_west", "3b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_09_west"]), + "3b_09_east": PreRegion("3b_09_east", "3b_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_09_east"]), + + "3b_10_west": PreRegion("3b_10_west", "3b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_10_west"]), + "3b_10_east": PreRegion("3b_10_east", "3b_10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_10_east"]), + + "3b_11_west": PreRegion("3b_11_west", "3b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_11_west"]), + "3b_11_east": PreRegion("3b_11_east", "3b_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_11_east"]), + + "3b_13_west": PreRegion("3b_13_west", "3b_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_13_west"]), + "3b_13_east": PreRegion("3b_13_east", "3b_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_13_east"]), + + "3b_14_west": PreRegion("3b_14_west", "3b_14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_14_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_14_west"]), + "3b_14_east": PreRegion("3b_14_east", "3b_14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_14_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_14_east"]), + + "3b_15_west": PreRegion("3b_15_west", "3b_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_15_west"]), + "3b_15_east": PreRegion("3b_15_east", "3b_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_15_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_15_east"]), + + "3b_12_west": PreRegion("3b_12_west", "3b_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_12_west"]), + "3b_12_east": PreRegion("3b_12_east", "3b_12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_12_east"]), + + "3b_16_west": PreRegion("3b_16_west", "3b_16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_16_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_16_west"]), + "3b_16_top": PreRegion("3b_16_top", "3b_16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_16_top"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_16_top"]), + + "3b_17_west": PreRegion("3b_17_west", "3b_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_17_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_17_west"]), + "3b_17_east": PreRegion("3b_17_east", "3b_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_17_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_17_east"]), + + "3b_18_west": PreRegion("3b_18_west", "3b_18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_18_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_18_west"]), + "3b_18_east": PreRegion("3b_18_east", "3b_18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_18_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_18_east"]), + + "3b_19_west": PreRegion("3b_19_west", "3b_19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_19_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_19_west"]), + "3b_19_east": PreRegion("3b_19_east", "3b_19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_19_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_19_east"]), + + "3b_21_west": PreRegion("3b_21_west", "3b_21", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_21_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_21_west"]), + "3b_21_east": PreRegion("3b_21_east", "3b_21", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_21_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_21_east"]), + + "3b_20_west": PreRegion("3b_20_west", "3b_20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_20_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_20_west"]), + "3b_20_east": PreRegion("3b_20_east", "3b_20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_20_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_20_east"]), + + "3b_end_west": PreRegion("3b_end_west", "3b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_end_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_end_west"]), + "3b_end_goal": PreRegion("3b_end_goal", "3b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3b_end_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "3b_end_goal"]), + + "3c_00_west": PreRegion("3c_00_west", "3c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_00_west"]), + "3c_00_east": PreRegion("3c_00_east", "3c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_00_east"]), + + "3c_01_west": PreRegion("3c_01_west", "3c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_01_west"]), + "3c_01_east": PreRegion("3c_01_east", "3c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_01_east"]), + + "3c_02_west": PreRegion("3c_02_west", "3c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_02_west"]), + "3c_02_goal": PreRegion("3c_02_goal", "3c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "3c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "3c_02_goal"]), + + "4a_a-00_west": PreRegion("4a_a-00_west", "4a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-00_west"]), + "4a_a-00_east": PreRegion("4a_a-00_east", "4a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-00_east"]), + + "4a_a-01_west": PreRegion("4a_a-01_west", "4a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-01_west"]), + "4a_a-01_east": PreRegion("4a_a-01_east", "4a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-01_east"]), + + "4a_a-01x_west": PreRegion("4a_a-01x_west", "4a_a-01x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-01x_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-01x_west"]), + "4a_a-01x_east": PreRegion("4a_a-01x_east", "4a_a-01x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-01x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-01x_east"]), + + "4a_a-02_west": PreRegion("4a_a-02_west", "4a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-02_west"]), + "4a_a-02_east": PreRegion("4a_a-02_east", "4a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-02_east"]), + + "4a_a-03_west": PreRegion("4a_a-03_west", "4a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-03_west"]), + "4a_a-03_east": PreRegion("4a_a-03_east", "4a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-03_east"]), + + "4a_a-04_west": PreRegion("4a_a-04_west", "4a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-04_west"]), + "4a_a-04_east": PreRegion("4a_a-04_east", "4a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-04_east"]), + + "4a_a-05_west": PreRegion("4a_a-05_west", "4a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-05_west"]), + "4a_a-05_east": PreRegion("4a_a-05_east", "4a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-05_east"]), + + "4a_a-06_west": PreRegion("4a_a-06_west", "4a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-06_west"]), + "4a_a-06_east": PreRegion("4a_a-06_east", "4a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-06_east"]), + + "4a_a-07_west": PreRegion("4a_a-07_west", "4a_a-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-07_west"]), + "4a_a-07_east": PreRegion("4a_a-07_east", "4a_a-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-07_east"]), + + "4a_a-08_west": PreRegion("4a_a-08_west", "4a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-08_west"]), + "4a_a-08_north-west": PreRegion("4a_a-08_north-west", "4a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-08_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-08_north-west"]), + "4a_a-08_east": PreRegion("4a_a-08_east", "4a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-08_east"]), + + "4a_a-10_west": PreRegion("4a_a-10_west", "4a_a-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-10_west"]), + "4a_a-10_east": PreRegion("4a_a-10_east", "4a_a-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-10_east"]), + + "4a_a-11_east": PreRegion("4a_a-11_east", "4a_a-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-11_east"]), + + "4a_a-09_bottom": PreRegion("4a_a-09_bottom", "4a_a-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-09_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-09_bottom"]), + "4a_a-09_top": PreRegion("4a_a-09_top", "4a_a-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_a-09_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_a-09_top"]), + + "4a_b-00_south": PreRegion("4a_b-00_south", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_south"]), + "4a_b-00_south-east": PreRegion("4a_b-00_south-east", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_south-east"]), + "4a_b-00_east": PreRegion("4a_b-00_east", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_east"]), + "4a_b-00_west": PreRegion("4a_b-00_west", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_west"]), + "4a_b-00_north-east": PreRegion("4a_b-00_north-east", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_north-east"]), + "4a_b-00_north-west": PreRegion("4a_b-00_north-west", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_north-west"]), + "4a_b-00_north": PreRegion("4a_b-00_north", "4a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-00_north"]), + + "4a_b-01_west": PreRegion("4a_b-01_west", "4a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-01_west"]), + + "4a_b-04_west": PreRegion("4a_b-04_west", "4a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-04_west"]), + "4a_b-04_north-west": PreRegion("4a_b-04_north-west", "4a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-04_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-04_north-west"]), + "4a_b-04_east": PreRegion("4a_b-04_east", "4a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-04_east"]), + + "4a_b-06_west": PreRegion("4a_b-06_west", "4a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-06_west"]), + "4a_b-06_east": PreRegion("4a_b-06_east", "4a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-06_east"]), + + "4a_b-07_west": PreRegion("4a_b-07_west", "4a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-07_west"]), + "4a_b-07_east": PreRegion("4a_b-07_east", "4a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-07_east"]), + + "4a_b-03_west": PreRegion("4a_b-03_west", "4a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-03_west"]), + "4a_b-03_east": PreRegion("4a_b-03_east", "4a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-03_east"]), + + "4a_b-02_south-west": PreRegion("4a_b-02_south-west", "4a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-02_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-02_south-west"]), + "4a_b-02_north-west": PreRegion("4a_b-02_north-west", "4a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-02_north-west"]), + "4a_b-02_north-east": PreRegion("4a_b-02_north-east", "4a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-02_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-02_north-east"]), + "4a_b-02_north": PreRegion("4a_b-02_north", "4a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-02_north"]), + + "4a_b-sec_west": PreRegion("4a_b-sec_west", "4a_b-sec", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-sec_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-sec_west"]), + "4a_b-sec_east": PreRegion("4a_b-sec_east", "4a_b-sec", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-sec_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-sec_east"]), + + "4a_b-secb_west": PreRegion("4a_b-secb_west", "4a_b-secb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-secb_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-secb_west"]), + + "4a_b-05_center": PreRegion("4a_b-05_center", "4a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-05_center"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-05_center"]), + "4a_b-05_west": PreRegion("4a_b-05_west", "4a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-05_west"]), + "4a_b-05_north-east": PreRegion("4a_b-05_north-east", "4a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-05_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-05_north-east"]), + "4a_b-05_east": PreRegion("4a_b-05_east", "4a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-05_east"]), + + "4a_b-08b_west": PreRegion("4a_b-08b_west", "4a_b-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-08b_west"]), + "4a_b-08b_east": PreRegion("4a_b-08b_east", "4a_b-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-08b_east"]), + + "4a_b-08_west": PreRegion("4a_b-08_west", "4a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-08_west"]), + "4a_b-08_east": PreRegion("4a_b-08_east", "4a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_b-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_b-08_east"]), + + "4a_c-00_west": PreRegion("4a_c-00_west", "4a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-00_west"]), + "4a_c-00_east": PreRegion("4a_c-00_east", "4a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-00_east"]), + "4a_c-00_north-west": PreRegion("4a_c-00_north-west", "4a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-00_north-west"]), + + "4a_c-01_east": PreRegion("4a_c-01_east", "4a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-01_east"]), + + "4a_c-02_west": PreRegion("4a_c-02_west", "4a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-02_west"]), + "4a_c-02_east": PreRegion("4a_c-02_east", "4a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-02_east"]), + + "4a_c-04_west": PreRegion("4a_c-04_west", "4a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-04_west"]), + "4a_c-04_east": PreRegion("4a_c-04_east", "4a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-04_east"]), + + "4a_c-05_west": PreRegion("4a_c-05_west", "4a_c-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-05_west"]), + "4a_c-05_east": PreRegion("4a_c-05_east", "4a_c-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-05_east"]), + + "4a_c-06_bottom": PreRegion("4a_c-06_bottom", "4a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-06_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-06_bottom"]), + "4a_c-06_west": PreRegion("4a_c-06_west", "4a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-06_west"]), + "4a_c-06_top": PreRegion("4a_c-06_top", "4a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-06_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-06_top"]), + + "4a_c-06b_east": PreRegion("4a_c-06b_east", "4a_c-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-06b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-06b_east"]), + + "4a_c-09_west": PreRegion("4a_c-09_west", "4a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-09_west"]), + "4a_c-09_east": PreRegion("4a_c-09_east", "4a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-09_east"]), + + "4a_c-07_west": PreRegion("4a_c-07_west", "4a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-07_west"]), + "4a_c-07_east": PreRegion("4a_c-07_east", "4a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-07_east"]), + + "4a_c-08_bottom": PreRegion("4a_c-08_bottom", "4a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-08_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-08_bottom"]), + "4a_c-08_east": PreRegion("4a_c-08_east", "4a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-08_east"]), + "4a_c-08_top": PreRegion("4a_c-08_top", "4a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-08_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-08_top"]), + + "4a_c-10_bottom": PreRegion("4a_c-10_bottom", "4a_c-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-10_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-10_bottom"]), + "4a_c-10_top": PreRegion("4a_c-10_top", "4a_c-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_c-10_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_c-10_top"]), + + "4a_d-00_west": PreRegion("4a_d-00_west", "4a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-00_west"]), + "4a_d-00_south": PreRegion("4a_d-00_south", "4a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-00_south"]), + "4a_d-00_east": PreRegion("4a_d-00_east", "4a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-00_east"]), + "4a_d-00_north-west": PreRegion("4a_d-00_north-west", "4a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-00_north-west"]), + + "4a_d-00b_east": PreRegion("4a_d-00b_east", "4a_d-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-00b_east"]), + + "4a_d-01_west": PreRegion("4a_d-01_west", "4a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-01_west"]), + "4a_d-01_east": PreRegion("4a_d-01_east", "4a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-01_east"]), + + "4a_d-02_west": PreRegion("4a_d-02_west", "4a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-02_west"]), + "4a_d-02_east": PreRegion("4a_d-02_east", "4a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-02_east"]), + + "4a_d-03_west": PreRegion("4a_d-03_west", "4a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-03_west"]), + "4a_d-03_east": PreRegion("4a_d-03_east", "4a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-03_east"]), + + "4a_d-04_west": PreRegion("4a_d-04_west", "4a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-04_west"]), + "4a_d-04_east": PreRegion("4a_d-04_east", "4a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-04_east"]), + + "4a_d-05_west": PreRegion("4a_d-05_west", "4a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-05_west"]), + "4a_d-05_east": PreRegion("4a_d-05_east", "4a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-05_east"]), + + "4a_d-06_west": PreRegion("4a_d-06_west", "4a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-06_west"]), + "4a_d-06_east": PreRegion("4a_d-06_east", "4a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-06_east"]), + + "4a_d-07_west": PreRegion("4a_d-07_west", "4a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-07_west"]), + "4a_d-07_east": PreRegion("4a_d-07_east", "4a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-07_east"]), + + "4a_d-08_west": PreRegion("4a_d-08_west", "4a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-08_west"]), + "4a_d-08_east": PreRegion("4a_d-08_east", "4a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-08_east"]), + + "4a_d-09_west": PreRegion("4a_d-09_west", "4a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-09_west"]), + "4a_d-09_east": PreRegion("4a_d-09_east", "4a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-09_east"]), + + "4a_d-10_west": PreRegion("4a_d-10_west", "4a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-10_west"]), + "4a_d-10_goal": PreRegion("4a_d-10_goal", "4a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4a_d-10_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "4a_d-10_goal"]), + + "4b_a-00_west": PreRegion("4b_a-00_west", "4b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-00_west"]), + "4b_a-00_east": PreRegion("4b_a-00_east", "4b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-00_east"]), + + "4b_a-01_west": PreRegion("4b_a-01_west", "4b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-01_west"]), + "4b_a-01_east": PreRegion("4b_a-01_east", "4b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-01_east"]), + + "4b_a-02_west": PreRegion("4b_a-02_west", "4b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-02_west"]), + "4b_a-02_east": PreRegion("4b_a-02_east", "4b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-02_east"]), + + "4b_a-03_west": PreRegion("4b_a-03_west", "4b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-03_west"]), + "4b_a-03_east": PreRegion("4b_a-03_east", "4b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-03_east"]), + + "4b_a-04_west": PreRegion("4b_a-04_west", "4b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-04_west"]), + "4b_a-04_east": PreRegion("4b_a-04_east", "4b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_a-04_east"]), + + "4b_b-00_west": PreRegion("4b_b-00_west", "4b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-00_west"]), + "4b_b-00_east": PreRegion("4b_b-00_east", "4b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-00_east"]), + + "4b_b-01_west": PreRegion("4b_b-01_west", "4b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-01_west"]), + "4b_b-01_east": PreRegion("4b_b-01_east", "4b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-01_east"]), + + "4b_b-02_bottom": PreRegion("4b_b-02_bottom", "4b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-02_bottom"]), + "4b_b-02_top": PreRegion("4b_b-02_top", "4b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-02_top"]), + + "4b_b-03_west": PreRegion("4b_b-03_west", "4b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-03_west"]), + "4b_b-03_east": PreRegion("4b_b-03_east", "4b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-03_east"]), + + "4b_b-04_west": PreRegion("4b_b-04_west", "4b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-04_west"]), + "4b_b-04_east": PreRegion("4b_b-04_east", "4b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_b-04_east"]), + + "4b_c-00_west": PreRegion("4b_c-00_west", "4b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-00_west"]), + "4b_c-00_east": PreRegion("4b_c-00_east", "4b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-00_east"]), + + "4b_c-01_west": PreRegion("4b_c-01_west", "4b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-01_west"]), + "4b_c-01_east": PreRegion("4b_c-01_east", "4b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-01_east"]), + + "4b_c-02_west": PreRegion("4b_c-02_west", "4b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-02_west"]), + "4b_c-02_east": PreRegion("4b_c-02_east", "4b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-02_east"]), + + "4b_c-03_bottom": PreRegion("4b_c-03_bottom", "4b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-03_bottom"]), + "4b_c-03_top": PreRegion("4b_c-03_top", "4b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-03_top"]), + + "4b_c-04_west": PreRegion("4b_c-04_west", "4b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-04_west"]), + "4b_c-04_east": PreRegion("4b_c-04_east", "4b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_c-04_east"]), + + "4b_d-00_west": PreRegion("4b_d-00_west", "4b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-00_west"]), + "4b_d-00_east": PreRegion("4b_d-00_east", "4b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-00_east"]), + + "4b_d-01_west": PreRegion("4b_d-01_west", "4b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-01_west"]), + "4b_d-01_east": PreRegion("4b_d-01_east", "4b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-01_east"]), + + "4b_d-02_west": PreRegion("4b_d-02_west", "4b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-02_west"]), + "4b_d-02_east": PreRegion("4b_d-02_east", "4b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-02_east"]), + + "4b_d-03_west": PreRegion("4b_d-03_west", "4b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-03_west"]), + "4b_d-03_east": PreRegion("4b_d-03_east", "4b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_d-03_east"]), + + "4b_end_west": PreRegion("4b_end_west", "4b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_end_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_end_west"]), + "4b_end_goal": PreRegion("4b_end_goal", "4b_end", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4b_end_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "4b_end_goal"]), + + "4c_00_west": PreRegion("4c_00_west", "4c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_00_west"]), + "4c_00_east": PreRegion("4c_00_east", "4c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_00_east"]), + + "4c_01_west": PreRegion("4c_01_west", "4c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_01_west"]), + "4c_01_east": PreRegion("4c_01_east", "4c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_01_east"]), + + "4c_02_west": PreRegion("4c_02_west", "4c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_02_west"]), + "4c_02_goal": PreRegion("4c_02_goal", "4c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "4c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "4c_02_goal"]), + + "5a_a-00b_west": PreRegion("5a_a-00b_west", "5a_a-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00b_west"]), + "5a_a-00b_east": PreRegion("5a_a-00b_east", "5a_a-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00b_east"]), + + "5a_a-00x_east": PreRegion("5a_a-00x_east", "5a_a-00x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00x_east"]), + + "5a_a-00d_west": PreRegion("5a_a-00d_west", "5a_a-00d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00d_west"]), + "5a_a-00d_east": PreRegion("5a_a-00d_east", "5a_a-00d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00d_east"]), + + "5a_a-00c_west": PreRegion("5a_a-00c_west", "5a_a-00c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00c_west"]), + "5a_a-00c_east": PreRegion("5a_a-00c_east", "5a_a-00c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00c_east"]), + + "5a_a-00_west": PreRegion("5a_a-00_west", "5a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00_west"]), + "5a_a-00_east": PreRegion("5a_a-00_east", "5a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-00_east"]), + + "5a_a-01_west": PreRegion("5a_a-01_west", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_west"]), + "5a_a-01_center": PreRegion("5a_a-01_center", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_center"]), + "5a_a-01_east": PreRegion("5a_a-01_east", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_east"]), + "5a_a-01_south-west": PreRegion("5a_a-01_south-west", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_south-west"]), + "5a_a-01_south-east": PreRegion("5a_a-01_south-east", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_south-east"]), + "5a_a-01_north": PreRegion("5a_a-01_north", "5a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-01_north"]), + + "5a_a-02_west": PreRegion("5a_a-02_west", "5a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-02_west"]), + "5a_a-02_north": PreRegion("5a_a-02_north", "5a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-02_north"]), + "5a_a-02_south": PreRegion("5a_a-02_south", "5a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-02_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-02_south"]), + + "5a_a-03_west": PreRegion("5a_a-03_west", "5a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-03_west"]), + "5a_a-03_east": PreRegion("5a_a-03_east", "5a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-03_east"]), + + "5a_a-04_east": PreRegion("5a_a-04_east", "5a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-04_east"]), + "5a_a-04_north": PreRegion("5a_a-04_north", "5a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-04_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-04_north"]), + "5a_a-04_south": PreRegion("5a_a-04_south", "5a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-04_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-04_south"]), + + "5a_a-05_north-west": PreRegion("5a_a-05_north-west", "5a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-05_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-05_north-west"]), + "5a_a-05_center": PreRegion("5a_a-05_center", "5a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-05_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-05_center"]), + "5a_a-05_north-east": PreRegion("5a_a-05_north-east", "5a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-05_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-05_north-east"]), + "5a_a-05_south-west": PreRegion("5a_a-05_south-west", "5a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-05_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-05_south-west"]), + "5a_a-05_south-east": PreRegion("5a_a-05_south-east", "5a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-05_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-05_south-east"]), + + "5a_a-06_west": PreRegion("5a_a-06_west", "5a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-06_west"]), + + "5a_a-07_east": PreRegion("5a_a-07_east", "5a_a-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-07_east"]), + + "5a_a-08_west": PreRegion("5a_a-08_west", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_west"]), + "5a_a-08_center": PreRegion("5a_a-08_center", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_center"]), + "5a_a-08_east": PreRegion("5a_a-08_east", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_east"]), + "5a_a-08_south": PreRegion("5a_a-08_south", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_south"]), + "5a_a-08_south-east": PreRegion("5a_a-08_south-east", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_south-east"]), + "5a_a-08_north-east": PreRegion("5a_a-08_north-east", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_north-east"]), + "5a_a-08_north": PreRegion("5a_a-08_north", "5a_a-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-08_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-08_north"]), + + "5a_a-10_west": PreRegion("5a_a-10_west", "5a_a-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-10_west"]), + "5a_a-10_east": PreRegion("5a_a-10_east", "5a_a-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-10_east"]), + + "5a_a-09_west": PreRegion("5a_a-09_west", "5a_a-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-09_west"]), + "5a_a-09_east": PreRegion("5a_a-09_east", "5a_a-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-09_east"]), + + "5a_a-11_east": PreRegion("5a_a-11_east", "5a_a-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-11_east"]), + + "5a_a-12_north-west": PreRegion("5a_a-12_north-west", "5a_a-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-12_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-12_north-west"]), + "5a_a-12_west": PreRegion("5a_a-12_west", "5a_a-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-12_west"]), + "5a_a-12_south-west": PreRegion("5a_a-12_south-west", "5a_a-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-12_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-12_south-west"]), + "5a_a-12_east": PreRegion("5a_a-12_east", "5a_a-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-12_east"]), + + "5a_a-15_south": PreRegion("5a_a-15_south", "5a_a-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-15_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-15_south"]), + + "5a_a-14_south": PreRegion("5a_a-14_south", "5a_a-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-14_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-14_south"]), + + "5a_a-13_west": PreRegion("5a_a-13_west", "5a_a-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-13_west"]), + "5a_a-13_east": PreRegion("5a_a-13_east", "5a_a-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_a-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_a-13_east"]), + + "5a_b-00_west": PreRegion("5a_b-00_west", "5a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-00_west"]), + "5a_b-00_north-west": PreRegion("5a_b-00_north-west", "5a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-00_north-west"]), + "5a_b-00_east": PreRegion("5a_b-00_east", "5a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-00_east"]), + + "5a_b-18_south": PreRegion("5a_b-18_south", "5a_b-18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-18_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-18_south"]), + + "5a_b-01_south-west": PreRegion("5a_b-01_south-west", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_south-west"]), + "5a_b-01_center": PreRegion("5a_b-01_center", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_center"]), + "5a_b-01_west": PreRegion("5a_b-01_west", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_west"]), + "5a_b-01_north-west": PreRegion("5a_b-01_north-west", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_north-west"]), + "5a_b-01_north": PreRegion("5a_b-01_north", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_north"]), + "5a_b-01_north-east": PreRegion("5a_b-01_north-east", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_north-east"]), + "5a_b-01_east": PreRegion("5a_b-01_east", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_east"]), + "5a_b-01_south-east": PreRegion("5a_b-01_south-east", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_south-east"]), + "5a_b-01_south": PreRegion("5a_b-01_south", "5a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01_south"]), + + "5a_b-01c_west": PreRegion("5a_b-01c_west", "5a_b-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01c_west"]), + "5a_b-01c_east": PreRegion("5a_b-01c_east", "5a_b-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01c_east"]), + + "5a_b-20_north-west": PreRegion("5a_b-20_north-west", "5a_b-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-20_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-20_north-west"]), + "5a_b-20_west": PreRegion("5a_b-20_west", "5a_b-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-20_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-20_west"]), + "5a_b-20_south-west": PreRegion("5a_b-20_south-west", "5a_b-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-20_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-20_south-west"]), + "5a_b-20_south": PreRegion("5a_b-20_south", "5a_b-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-20_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-20_south"]), + "5a_b-20_east": PreRegion("5a_b-20_east", "5a_b-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-20_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-20_east"]), + + "5a_b-21_east": PreRegion("5a_b-21_east", "5a_b-21", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-21_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-21_east"]), + + "5a_b-01b_west": PreRegion("5a_b-01b_west", "5a_b-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01b_west"]), + "5a_b-01b_east": PreRegion("5a_b-01b_east", "5a_b-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-01b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-01b_east"]), + + "5a_b-02_center": PreRegion("5a_b-02_center", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_center"]), + "5a_b-02_west": PreRegion("5a_b-02_west", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_west"]), + "5a_b-02_north-west": PreRegion("5a_b-02_north-west", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_north-west"]), + "5a_b-02_north": PreRegion("5a_b-02_north", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_north"]), + "5a_b-02_north-east": PreRegion("5a_b-02_north-east", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_north-east"]), + "5a_b-02_east-upper": PreRegion("5a_b-02_east-upper", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_east-upper"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_east-upper"]), + "5a_b-02_east-lower": PreRegion("5a_b-02_east-lower", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_east-lower"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_east-lower"]), + "5a_b-02_south-east": PreRegion("5a_b-02_south-east", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_south-east"]), + "5a_b-02_south": PreRegion("5a_b-02_south", "5a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-02_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-02_south"]), + + "5a_b-03_east": PreRegion("5a_b-03_east", "5a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-03_east"]), + + "5a_b-05_west": PreRegion("5a_b-05_west", "5a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-05_west"]), + + "5a_b-04_west": PreRegion("5a_b-04_west", "5a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-04_west"]), + "5a_b-04_east": PreRegion("5a_b-04_east", "5a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-04_east"]), + "5a_b-04_south": PreRegion("5a_b-04_south", "5a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-04_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-04_south"]), + + "5a_b-07_north": PreRegion("5a_b-07_north", "5a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-07_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-07_north"]), + "5a_b-07_south": PreRegion("5a_b-07_south", "5a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-07_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-07_south"]), + + "5a_b-08_west": PreRegion("5a_b-08_west", "5a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-08_west"]), + "5a_b-08_east": PreRegion("5a_b-08_east", "5a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-08_east"]), + + "5a_b-09_north": PreRegion("5a_b-09_north", "5a_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-09_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-09_north"]), + "5a_b-09_south": PreRegion("5a_b-09_south", "5a_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-09_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-09_south"]), + + "5a_b-10_east": PreRegion("5a_b-10_east", "5a_b-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-10_east"]), + + "5a_b-11_north-west": PreRegion("5a_b-11_north-west", "5a_b-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-11_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-11_north-west"]), + "5a_b-11_west": PreRegion("5a_b-11_west", "5a_b-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-11_west"]), + "5a_b-11_south-west": PreRegion("5a_b-11_south-west", "5a_b-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-11_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-11_south-west"]), + "5a_b-11_south-east": PreRegion("5a_b-11_south-east", "5a_b-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-11_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-11_south-east"]), + "5a_b-11_east": PreRegion("5a_b-11_east", "5a_b-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-11_east"]), + + "5a_b-12_west": PreRegion("5a_b-12_west", "5a_b-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-12_west"]), + "5a_b-12_east": PreRegion("5a_b-12_east", "5a_b-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-12_east"]), + + "5a_b-13_west": PreRegion("5a_b-13_west", "5a_b-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-13_west"]), + "5a_b-13_east": PreRegion("5a_b-13_east", "5a_b-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-13_east"]), + "5a_b-13_north-east": PreRegion("5a_b-13_north-east", "5a_b-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-13_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-13_north-east"]), + + "5a_b-17_west": PreRegion("5a_b-17_west", "5a_b-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-17_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-17_west"]), + "5a_b-17_east": PreRegion("5a_b-17_east", "5a_b-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-17_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-17_east"]), + "5a_b-17_north-west": PreRegion("5a_b-17_north-west", "5a_b-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-17_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-17_north-west"]), + + "5a_b-22_west": PreRegion("5a_b-22_west", "5a_b-22", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-22_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-22_west"]), + + "5a_b-06_west": PreRegion("5a_b-06_west", "5a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-06_west"]), + "5a_b-06_east": PreRegion("5a_b-06_east", "5a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-06_east"]), + "5a_b-06_north-east": PreRegion("5a_b-06_north-east", "5a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-06_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-06_north-east"]), + + "5a_b-19_west": PreRegion("5a_b-19_west", "5a_b-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-19_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-19_west"]), + "5a_b-19_east": PreRegion("5a_b-19_east", "5a_b-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-19_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-19_east"]), + "5a_b-19_north-west": PreRegion("5a_b-19_north-west", "5a_b-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-19_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-19_north-west"]), + + "5a_b-14_west": PreRegion("5a_b-14_west", "5a_b-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-14_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-14_west"]), + "5a_b-14_south": PreRegion("5a_b-14_south", "5a_b-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-14_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-14_south"]), + "5a_b-14_north": PreRegion("5a_b-14_north", "5a_b-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-14_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-14_north"]), + + "5a_b-15_west": PreRegion("5a_b-15_west", "5a_b-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-15_west"]), + + "5a_b-16_bottom": PreRegion("5a_b-16_bottom", "5a_b-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-16_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-16_bottom"]), + "5a_b-16_mirror": PreRegion("5a_b-16_mirror", "5a_b-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_b-16_mirror"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_b-16_mirror"]), + + "5a_void_east": PreRegion("5a_void_east", "5a_void", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_void_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_void_east"]), + "5a_void_west": PreRegion("5a_void_west", "5a_void", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_void_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_void_west"]), + + "5a_c-00_bottom": PreRegion("5a_c-00_bottom", "5a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-00_bottom"]), + "5a_c-00_top": PreRegion("5a_c-00_top", "5a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-00_top"]), + + "5a_c-01_west": PreRegion("5a_c-01_west", "5a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01_west"]), + "5a_c-01_east": PreRegion("5a_c-01_east", "5a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01_east"]), + + "5a_c-01b_west": PreRegion("5a_c-01b_west", "5a_c-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01b_west"]), + "5a_c-01b_east": PreRegion("5a_c-01b_east", "5a_c-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01b_east"]), + + "5a_c-01c_west": PreRegion("5a_c-01c_west", "5a_c-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01c_west"]), + "5a_c-01c_east": PreRegion("5a_c-01c_east", "5a_c-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-01c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-01c_east"]), + + "5a_c-08b_west": PreRegion("5a_c-08b_west", "5a_c-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-08b_west"]), + "5a_c-08b_east": PreRegion("5a_c-08b_east", "5a_c-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-08b_east"]), + + "5a_c-08_west": PreRegion("5a_c-08_west", "5a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-08_west"]), + "5a_c-08_east": PreRegion("5a_c-08_east", "5a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-08_east"]), + + "5a_c-10_west": PreRegion("5a_c-10_west", "5a_c-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-10_west"]), + "5a_c-10_east": PreRegion("5a_c-10_east", "5a_c-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-10_east"]), + + "5a_c-12_west": PreRegion("5a_c-12_west", "5a_c-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-12_west"]), + "5a_c-12_east": PreRegion("5a_c-12_east", "5a_c-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-12_east"]), + + "5a_c-07_west": PreRegion("5a_c-07_west", "5a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-07_west"]), + "5a_c-07_east": PreRegion("5a_c-07_east", "5a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-07_east"]), + + "5a_c-11_west": PreRegion("5a_c-11_west", "5a_c-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-11_west"]), + "5a_c-11_east": PreRegion("5a_c-11_east", "5a_c-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-11_east"]), + + "5a_c-09_west": PreRegion("5a_c-09_west", "5a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-09_west"]), + "5a_c-09_east": PreRegion("5a_c-09_east", "5a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-09_east"]), + + "5a_c-13_west": PreRegion("5a_c-13_west", "5a_c-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-13_west"]), + "5a_c-13_east": PreRegion("5a_c-13_east", "5a_c-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_c-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_c-13_east"]), + + "5a_d-00_south": PreRegion("5a_d-00_south", "5a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-00_south"]), + "5a_d-00_north": PreRegion("5a_d-00_north", "5a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-00_north"]), + "5a_d-00_west": PreRegion("5a_d-00_west", "5a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-00_west"]), + "5a_d-00_east": PreRegion("5a_d-00_east", "5a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-00_east"]), + + "5a_d-01_south": PreRegion("5a_d-01_south", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_south"]), + "5a_d-01_center": PreRegion("5a_d-01_center", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_center"]), + "5a_d-01_south-west-left": PreRegion("5a_d-01_south-west-left", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_south-west-left"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_south-west-left"]), + "5a_d-01_south-west-down": PreRegion("5a_d-01_south-west-down", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_south-west-down"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_south-west-down"]), + "5a_d-01_south-east-right": PreRegion("5a_d-01_south-east-right", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_south-east-right"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_south-east-right"]), + "5a_d-01_south-east-down": PreRegion("5a_d-01_south-east-down", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_south-east-down"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_south-east-down"]), + "5a_d-01_west": PreRegion("5a_d-01_west", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_west"]), + "5a_d-01_east": PreRegion("5a_d-01_east", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_east"]), + "5a_d-01_north-west": PreRegion("5a_d-01_north-west", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_north-west"]), + "5a_d-01_north-east": PreRegion("5a_d-01_north-east", "5a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-01_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-01_north-east"]), + + "5a_d-09_east": PreRegion("5a_d-09_east", "5a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-09_east"]), + "5a_d-09_west": PreRegion("5a_d-09_west", "5a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-09_west"]), + + "5a_d-04_east": PreRegion("5a_d-04_east", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_east"]), + "5a_d-04_west": PreRegion("5a_d-04_west", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_west"]), + "5a_d-04_south-west-left": PreRegion("5a_d-04_south-west-left", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_south-west-left"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_south-west-left"]), + "5a_d-04_south-west-right": PreRegion("5a_d-04_south-west-right", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_south-west-right"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_south-west-right"]), + "5a_d-04_south-east": PreRegion("5a_d-04_south-east", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_south-east"]), + "5a_d-04_north": PreRegion("5a_d-04_north", "5a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-04_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-04_north"]), + + "5a_d-05_north": PreRegion("5a_d-05_north", "5a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-05_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-05_north"]), + "5a_d-05_east": PreRegion("5a_d-05_east", "5a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-05_east"]), + "5a_d-05_south": PreRegion("5a_d-05_south", "5a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-05_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-05_south"]), + "5a_d-05_west": PreRegion("5a_d-05_west", "5a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-05_west"]), + + "5a_d-06_north-east": PreRegion("5a_d-06_north-east", "5a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-06_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-06_north-east"]), + "5a_d-06_south-east": PreRegion("5a_d-06_south-east", "5a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-06_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-06_south-east"]), + "5a_d-06_south-west": PreRegion("5a_d-06_south-west", "5a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-06_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-06_south-west"]), + "5a_d-06_north-west": PreRegion("5a_d-06_north-west", "5a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-06_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-06_north-west"]), + + "5a_d-07_west": PreRegion("5a_d-07_west", "5a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-07_west"]), + "5a_d-07_north": PreRegion("5a_d-07_north", "5a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-07_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-07_north"]), + + "5a_d-02_east": PreRegion("5a_d-02_east", "5a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-02_east"]), + "5a_d-02_west": PreRegion("5a_d-02_west", "5a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-02_west"]), + + "5a_d-03_east": PreRegion("5a_d-03_east", "5a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-03_east"]), + "5a_d-03_west": PreRegion("5a_d-03_west", "5a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-03_west"]), + + "5a_d-15_north-west": PreRegion("5a_d-15_north-west", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_north-west"]), + "5a_d-15_center": PreRegion("5a_d-15_center", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_center"]), + "5a_d-15_west": PreRegion("5a_d-15_west", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_west"]), + "5a_d-15_south-west": PreRegion("5a_d-15_south-west", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_south-west"]), + "5a_d-15_south": PreRegion("5a_d-15_south", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_south"]), + "5a_d-15_south-east": PreRegion("5a_d-15_south-east", "5a_d-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-15_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-15_south-east"]), + + "5a_d-13_east": PreRegion("5a_d-13_east", "5a_d-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-13_east"]), + "5a_d-13_west": PreRegion("5a_d-13_west", "5a_d-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-13_west"]), + + "5a_d-19b_south-east-right": PreRegion("5a_d-19b_south-east-right", "5a_d-19b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19b_south-east-right"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19b_south-east-right"]), + "5a_d-19b_south-east-down": PreRegion("5a_d-19b_south-east-down", "5a_d-19b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19b_south-east-down"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19b_south-east-down"]), + "5a_d-19b_south-west": PreRegion("5a_d-19b_south-west", "5a_d-19b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19b_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19b_south-west"]), + "5a_d-19b_north-east": PreRegion("5a_d-19b_north-east", "5a_d-19b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19b_north-east"]), + + "5a_d-19_east": PreRegion("5a_d-19_east", "5a_d-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19_east"]), + "5a_d-19_west": PreRegion("5a_d-19_west", "5a_d-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-19_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-19_west"]), + + "5a_d-10_west": PreRegion("5a_d-10_west", "5a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-10_west"]), + "5a_d-10_east": PreRegion("5a_d-10_east", "5a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-10_east"]), + + "5a_d-20_west": PreRegion("5a_d-20_west", "5a_d-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-20_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-20_west"]), + "5a_d-20_east": PreRegion("5a_d-20_east", "5a_d-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_d-20_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_d-20_east"]), + + "5a_e-00_west": PreRegion("5a_e-00_west", "5a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-00_west"]), + "5a_e-00_east": PreRegion("5a_e-00_east", "5a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-00_east"]), + + "5a_e-01_west": PreRegion("5a_e-01_west", "5a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-01_west"]), + "5a_e-01_east": PreRegion("5a_e-01_east", "5a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-01_east"]), + + "5a_e-02_west": PreRegion("5a_e-02_west", "5a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-02_west"]), + "5a_e-02_east": PreRegion("5a_e-02_east", "5a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-02_east"]), + + "5a_e-03_west": PreRegion("5a_e-03_west", "5a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-03_west"]), + "5a_e-03_east": PreRegion("5a_e-03_east", "5a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-03_east"]), + + "5a_e-04_west": PreRegion("5a_e-04_west", "5a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-04_west"]), + "5a_e-04_east": PreRegion("5a_e-04_east", "5a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-04_east"]), + + "5a_e-06_west": PreRegion("5a_e-06_west", "5a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-06_west"]), + "5a_e-06_east": PreRegion("5a_e-06_east", "5a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-06_east"]), + + "5a_e-05_west": PreRegion("5a_e-05_west", "5a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-05_west"]), + "5a_e-05_east": PreRegion("5a_e-05_east", "5a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-05_east"]), + + "5a_e-07_west": PreRegion("5a_e-07_west", "5a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-07_west"]), + "5a_e-07_east": PreRegion("5a_e-07_east", "5a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-07_east"]), + + "5a_e-08_west": PreRegion("5a_e-08_west", "5a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-08_west"]), + "5a_e-08_east": PreRegion("5a_e-08_east", "5a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-08_east"]), + + "5a_e-09_west": PreRegion("5a_e-09_west", "5a_e-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-09_west"]), + "5a_e-09_east": PreRegion("5a_e-09_east", "5a_e-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-09_east"]), + + "5a_e-10_west": PreRegion("5a_e-10_west", "5a_e-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-10_west"]), + "5a_e-10_east": PreRegion("5a_e-10_east", "5a_e-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-10_east"]), + + "5a_e-11_west": PreRegion("5a_e-11_west", "5a_e-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-11_west"]), + "5a_e-11_goal": PreRegion("5a_e-11_goal", "5a_e-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5a_e-11_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "5a_e-11_goal"]), + + "5b_start_west": PreRegion("5b_start_west", "5b_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_start_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_start_west"]), + "5b_start_east": PreRegion("5b_start_east", "5b_start", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_start_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_start_east"]), + + "5b_a-00_west": PreRegion("5b_a-00_west", "5b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-00_west"]), + "5b_a-00_east": PreRegion("5b_a-00_east", "5b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-00_east"]), + + "5b_a-01_west": PreRegion("5b_a-01_west", "5b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-01_west"]), + "5b_a-01_east": PreRegion("5b_a-01_east", "5b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-01_east"]), + + "5b_a-02_west": PreRegion("5b_a-02_west", "5b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-02_west"]), + "5b_a-02_east": PreRegion("5b_a-02_east", "5b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_a-02_east"]), + + "5b_b-00_south": PreRegion("5b_b-00_south", "5b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-00_south"]), + "5b_b-00_west": PreRegion("5b_b-00_west", "5b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-00_west"]), + "5b_b-00_north": PreRegion("5b_b-00_north", "5b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-00_north"]), + "5b_b-00_east": PreRegion("5b_b-00_east", "5b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-00_east"]), + + "5b_b-01_west": PreRegion("5b_b-01_west", "5b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-01_west"]), + "5b_b-01_north": PreRegion("5b_b-01_north", "5b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-01_north"]), + "5b_b-01_east": PreRegion("5b_b-01_east", "5b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-01_east"]), + + "5b_b-04_east": PreRegion("5b_b-04_east", "5b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-04_east"]), + "5b_b-04_west": PreRegion("5b_b-04_west", "5b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-04_west"]), + + "5b_b-02_south": PreRegion("5b_b-02_south", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_south"]), + "5b_b-02_center": PreRegion("5b_b-02_center", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_center"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_center"]), + "5b_b-02_north-west": PreRegion("5b_b-02_north-west", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_north-west"]), + "5b_b-02_north-east": PreRegion("5b_b-02_north-east", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_north-east"]), + "5b_b-02_north": PreRegion("5b_b-02_north", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_north"]), + "5b_b-02_south-west": PreRegion("5b_b-02_south-west", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_south-west"]), + "5b_b-02_south-east": PreRegion("5b_b-02_south-east", "5b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-02_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-02_south-east"]), + + "5b_b-05_north": PreRegion("5b_b-05_north", "5b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-05_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-05_north"]), + "5b_b-05_south": PreRegion("5b_b-05_south", "5b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-05_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-05_south"]), + + "5b_b-06_east": PreRegion("5b_b-06_east", "5b_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-06_east"]), + + "5b_b-07_north": PreRegion("5b_b-07_north", "5b_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-07_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-07_north"]), + "5b_b-07_south": PreRegion("5b_b-07_south", "5b_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-07_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-07_south"]), + + "5b_b-03_west": PreRegion("5b_b-03_west", "5b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-03_west"]), + "5b_b-03_main": PreRegion("5b_b-03_main", "5b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-03_main"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-03_main"]), + "5b_b-03_north": PreRegion("5b_b-03_north", "5b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-03_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-03_north"]), + "5b_b-03_east": PreRegion("5b_b-03_east", "5b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-03_east"]), + + "5b_b-08_south": PreRegion("5b_b-08_south", "5b_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-08_south"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-08_south"]), + "5b_b-08_north": PreRegion("5b_b-08_north", "5b_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-08_north"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-08_north"]), + "5b_b-08_east": PreRegion("5b_b-08_east", "5b_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-08_east"]), + + "5b_b-09_bottom": PreRegion("5b_b-09_bottom", "5b_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-09_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-09_bottom"]), + "5b_b-09_mirror": PreRegion("5b_b-09_mirror", "5b_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_b-09_mirror"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_b-09_mirror"]), + + "5b_c-00_bottom": PreRegion("5b_c-00_bottom", "5b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-00_bottom"]), + "5b_c-00_mirror": PreRegion("5b_c-00_mirror", "5b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-00_mirror"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-00_mirror"]), + + "5b_c-01_west": PreRegion("5b_c-01_west", "5b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-01_west"]), + "5b_c-01_east": PreRegion("5b_c-01_east", "5b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-01_east"]), + + "5b_c-02_west": PreRegion("5b_c-02_west", "5b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-02_west"]), + "5b_c-02_east": PreRegion("5b_c-02_east", "5b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-02_east"]), + + "5b_c-03_west": PreRegion("5b_c-03_west", "5b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-03_west"]), + "5b_c-03_east": PreRegion("5b_c-03_east", "5b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-03_east"]), + + "5b_c-04_west": PreRegion("5b_c-04_west", "5b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-04_west"]), + "5b_c-04_east": PreRegion("5b_c-04_east", "5b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_c-04_east"]), + + "5b_d-00_west": PreRegion("5b_d-00_west", "5b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-00_west"]), + "5b_d-00_east": PreRegion("5b_d-00_east", "5b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-00_east"]), + + "5b_d-01_west": PreRegion("5b_d-01_west", "5b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-01_west"]), + "5b_d-01_east": PreRegion("5b_d-01_east", "5b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-01_east"]), + + "5b_d-02_west": PreRegion("5b_d-02_west", "5b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-02_west"]), + "5b_d-02_east": PreRegion("5b_d-02_east", "5b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-02_east"]), + + "5b_d-03_west": PreRegion("5b_d-03_west", "5b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-03_west"]), + "5b_d-03_east": PreRegion("5b_d-03_east", "5b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-03_east"]), + + "5b_d-04_west": PreRegion("5b_d-04_west", "5b_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-04_west"]), + "5b_d-04_east": PreRegion("5b_d-04_east", "5b_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-04_east"]), + + "5b_d-05_west": PreRegion("5b_d-05_west", "5b_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-05_west"]), + "5b_d-05_goal": PreRegion("5b_d-05_goal", "5b_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5b_d-05_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "5b_d-05_goal"]), + + "5c_00_west": PreRegion("5c_00_west", "5c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_00_west"]), + "5c_00_east": PreRegion("5c_00_east", "5c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_00_east"]), + + "5c_01_west": PreRegion("5c_01_west", "5c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_01_west"]), + "5c_01_east": PreRegion("5c_01_east", "5c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_01_east"]), + + "5c_02_west": PreRegion("5c_02_west", "5c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_02_west"]), + "5c_02_goal": PreRegion("5c_02_goal", "5c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "5c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "5c_02_goal"]), + + "6a_00_west": PreRegion("6a_00_west", "6a_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_00_west"]), + "6a_00_east": PreRegion("6a_00_east", "6a_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_00_east"]), + + "6a_01_bottom": PreRegion("6a_01_bottom", "6a_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_01_bottom"]), + "6a_01_top": PreRegion("6a_01_top", "6a_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_01_top"]), + + "6a_02_bottom": PreRegion("6a_02_bottom", "6a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02_bottom"]), + "6a_02_bottom-west": PreRegion("6a_02_bottom-west", "6a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02_bottom-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02_bottom-west"]), + "6a_02_top-west": PreRegion("6a_02_top-west", "6a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02_top-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02_top-west"]), + "6a_02_top": PreRegion("6a_02_top", "6a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02_top"]), + + "6a_03_bottom": PreRegion("6a_03_bottom", "6a_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_03_bottom"]), + "6a_03_top": PreRegion("6a_03_top", "6a_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_03_top"]), + + "6a_02b_bottom": PreRegion("6a_02b_bottom", "6a_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02b_bottom"]), + "6a_02b_top": PreRegion("6a_02b_top", "6a_02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_02b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_02b_top"]), + + "6a_04_south": PreRegion("6a_04_south", "6a_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04_south"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04_south"]), + "6a_04_south-west": PreRegion("6a_04_south-west", "6a_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04_south-west"]), + "6a_04_south-east": PreRegion("6a_04_south-east", "6a_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04_south-east"]), + "6a_04_east": PreRegion("6a_04_east", "6a_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04_east"]), + "6a_04_north-west": PreRegion("6a_04_north-west", "6a_04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04_north-west"]), + + "6a_04b_west": PreRegion("6a_04b_west", "6a_04b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04b_west"]), + "6a_04b_east": PreRegion("6a_04b_east", "6a_04b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04b_east"]), + + "6a_04c_east": PreRegion("6a_04c_east", "6a_04c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04c_east"]), + + "6a_04d_west": PreRegion("6a_04d_west", "6a_04d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04d_west"]), + + "6a_04e_east": PreRegion("6a_04e_east", "6a_04e", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_04e_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_04e_east"]), + + "6a_05_west": PreRegion("6a_05_west", "6a_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_05_west"]), + "6a_05_east": PreRegion("6a_05_east", "6a_05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_05_east"]), + + "6a_06_west": PreRegion("6a_06_west", "6a_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_06_west"]), + "6a_06_east": PreRegion("6a_06_east", "6a_06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_06_east"]), + + "6a_07_west": PreRegion("6a_07_west", "6a_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_07_west"]), + "6a_07_east": PreRegion("6a_07_east", "6a_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_07_east"]), + "6a_07_north-east": PreRegion("6a_07_north-east", "6a_07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_07_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_07_north-east"]), + + "6a_08a_west": PreRegion("6a_08a_west", "6a_08a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_08a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_08a_west"]), + "6a_08a_east": PreRegion("6a_08a_east", "6a_08a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_08a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_08a_east"]), + + "6a_08b_west": PreRegion("6a_08b_west", "6a_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_08b_west"]), + "6a_08b_east": PreRegion("6a_08b_east", "6a_08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_08b_east"]), + + "6a_09_west": PreRegion("6a_09_west", "6a_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_09_west"]), + "6a_09_north-west": PreRegion("6a_09_north-west", "6a_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_09_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_09_north-west"]), + "6a_09_east": PreRegion("6a_09_east", "6a_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_09_east"]), + "6a_09_north-east": PreRegion("6a_09_north-east", "6a_09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_09_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_09_north-east"]), + + "6a_10a_west": PreRegion("6a_10a_west", "6a_10a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_10a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_10a_west"]), + "6a_10a_east": PreRegion("6a_10a_east", "6a_10a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_10a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_10a_east"]), + + "6a_10b_west": PreRegion("6a_10b_west", "6a_10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_10b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_10b_west"]), + "6a_10b_east": PreRegion("6a_10b_east", "6a_10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_10b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_10b_east"]), + + "6a_11_west": PreRegion("6a_11_west", "6a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_11_west"]), + "6a_11_north-west": PreRegion("6a_11_north-west", "6a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_11_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_11_north-west"]), + "6a_11_east": PreRegion("6a_11_east", "6a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_11_east"]), + "6a_11_north-east": PreRegion("6a_11_north-east", "6a_11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_11_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_11_north-east"]), + + "6a_12a_west": PreRegion("6a_12a_west", "6a_12a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_12a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_12a_west"]), + "6a_12a_east": PreRegion("6a_12a_east", "6a_12a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_12a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_12a_east"]), + + "6a_12b_west": PreRegion("6a_12b_west", "6a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_12b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_12b_west"]), + "6a_12b_east": PreRegion("6a_12b_east", "6a_12b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_12b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_12b_east"]), + + "6a_13_west": PreRegion("6a_13_west", "6a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_13_west"]), + "6a_13_north-west": PreRegion("6a_13_north-west", "6a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_13_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_13_north-west"]), + "6a_13_east": PreRegion("6a_13_east", "6a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_13_east"]), + "6a_13_north-east": PreRegion("6a_13_north-east", "6a_13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_13_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_13_north-east"]), + + "6a_14a_west": PreRegion("6a_14a_west", "6a_14a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_14a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_14a_west"]), + "6a_14a_east": PreRegion("6a_14a_east", "6a_14a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_14a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_14a_east"]), + + "6a_14b_west": PreRegion("6a_14b_west", "6a_14b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_14b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_14b_west"]), + "6a_14b_east": PreRegion("6a_14b_east", "6a_14b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_14b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_14b_east"]), + + "6a_15_west": PreRegion("6a_15_west", "6a_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_15_west"]), + "6a_15_north-west": PreRegion("6a_15_north-west", "6a_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_15_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_15_north-west"]), + "6a_15_east": PreRegion("6a_15_east", "6a_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_15_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_15_east"]), + "6a_15_north-east": PreRegion("6a_15_north-east", "6a_15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_15_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_15_north-east"]), + + "6a_16a_west": PreRegion("6a_16a_west", "6a_16a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_16a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_16a_west"]), + "6a_16a_east": PreRegion("6a_16a_east", "6a_16a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_16a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_16a_east"]), + + "6a_16b_west": PreRegion("6a_16b_west", "6a_16b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_16b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_16b_west"]), + "6a_16b_east": PreRegion("6a_16b_east", "6a_16b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_16b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_16b_east"]), + + "6a_17_west": PreRegion("6a_17_west", "6a_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_17_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_17_west"]), + "6a_17_north-west": PreRegion("6a_17_north-west", "6a_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_17_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_17_north-west"]), + "6a_17_east": PreRegion("6a_17_east", "6a_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_17_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_17_east"]), + "6a_17_north-east": PreRegion("6a_17_north-east", "6a_17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_17_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_17_north-east"]), + + "6a_18a_west": PreRegion("6a_18a_west", "6a_18a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_18a_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_18a_west"]), + "6a_18a_east": PreRegion("6a_18a_east", "6a_18a", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_18a_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_18a_east"]), + + "6a_18b_west": PreRegion("6a_18b_west", "6a_18b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_18b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_18b_west"]), + "6a_18b_east": PreRegion("6a_18b_east", "6a_18b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_18b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_18b_east"]), + + "6a_19_west": PreRegion("6a_19_west", "6a_19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_19_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_19_west"]), + "6a_19_north-west": PreRegion("6a_19_north-west", "6a_19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_19_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_19_north-west"]), + "6a_19_east": PreRegion("6a_19_east", "6a_19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_19_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_19_east"]), + + "6a_20_west": PreRegion("6a_20_west", "6a_20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_20_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_20_west"]), + "6a_20_east": PreRegion("6a_20_east", "6a_20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_20_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_20_east"]), + + "6a_b-00_west": PreRegion("6a_b-00_west", "6a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00_west"]), + "6a_b-00_east": PreRegion("6a_b-00_east", "6a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00_east"]), + "6a_b-00_top": PreRegion("6a_b-00_top", "6a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00_top"]), + + "6a_b-00b_bottom": PreRegion("6a_b-00b_bottom", "6a_b-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00b_bottom"]), + "6a_b-00b_top": PreRegion("6a_b-00b_top", "6a_b-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00b_top"]), + + "6a_b-00c_east": PreRegion("6a_b-00c_east", "6a_b-00c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-00c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-00c_east"]), + + "6a_b-01_west": PreRegion("6a_b-01_west", "6a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-01_west"]), + "6a_b-01_east": PreRegion("6a_b-01_east", "6a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-01_east"]), + + "6a_b-02_top": PreRegion("6a_b-02_top", "6a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-02_top"]), + "6a_b-02_bottom": PreRegion("6a_b-02_bottom", "6a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-02_bottom"]), + + "6a_b-02b_top": PreRegion("6a_b-02b_top", "6a_b-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-02b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-02b_top"]), + "6a_b-02b_bottom": PreRegion("6a_b-02b_bottom", "6a_b-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-02b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-02b_bottom"]), + + "6a_b-03_west": PreRegion("6a_b-03_west", "6a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-03_west"]), + "6a_b-03_east": PreRegion("6a_b-03_east", "6a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_b-03_east"]), + + "6a_boss-00_west": PreRegion("6a_boss-00_west", "6a_boss-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-00_west"]), + "6a_boss-00_east": PreRegion("6a_boss-00_east", "6a_boss-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-00_east"]), + + "6a_boss-01_west": PreRegion("6a_boss-01_west", "6a_boss-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-01_west"]), + "6a_boss-01_east": PreRegion("6a_boss-01_east", "6a_boss-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-01_east"]), + + "6a_boss-02_west": PreRegion("6a_boss-02_west", "6a_boss-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-02_west"]), + "6a_boss-02_east": PreRegion("6a_boss-02_east", "6a_boss-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-02_east"]), + + "6a_boss-03_west": PreRegion("6a_boss-03_west", "6a_boss-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-03_west"]), + "6a_boss-03_east": PreRegion("6a_boss-03_east", "6a_boss-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-03_east"]), + + "6a_boss-04_west": PreRegion("6a_boss-04_west", "6a_boss-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-04_west"]), + "6a_boss-04_east": PreRegion("6a_boss-04_east", "6a_boss-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-04_east"]), + + "6a_boss-05_west": PreRegion("6a_boss-05_west", "6a_boss-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-05_west"]), + "6a_boss-05_east": PreRegion("6a_boss-05_east", "6a_boss-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-05_east"]), + + "6a_boss-06_west": PreRegion("6a_boss-06_west", "6a_boss-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-06_west"]), + "6a_boss-06_east": PreRegion("6a_boss-06_east", "6a_boss-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-06_east"]), + + "6a_boss-07_west": PreRegion("6a_boss-07_west", "6a_boss-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-07_west"]), + "6a_boss-07_east": PreRegion("6a_boss-07_east", "6a_boss-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-07_east"]), + + "6a_boss-08_west": PreRegion("6a_boss-08_west", "6a_boss-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-08_west"]), + "6a_boss-08_east": PreRegion("6a_boss-08_east", "6a_boss-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-08_east"]), + + "6a_boss-09_west": PreRegion("6a_boss-09_west", "6a_boss-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-09_west"]), + "6a_boss-09_east": PreRegion("6a_boss-09_east", "6a_boss-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-09_east"]), + + "6a_boss-10_west": PreRegion("6a_boss-10_west", "6a_boss-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-10_west"]), + "6a_boss-10_east": PreRegion("6a_boss-10_east", "6a_boss-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-10_east"]), + + "6a_boss-11_west": PreRegion("6a_boss-11_west", "6a_boss-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-11_west"]), + "6a_boss-11_east": PreRegion("6a_boss-11_east", "6a_boss-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-11_east"]), + + "6a_boss-12_west": PreRegion("6a_boss-12_west", "6a_boss-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-12_west"]), + "6a_boss-12_east": PreRegion("6a_boss-12_east", "6a_boss-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-12_east"]), + + "6a_boss-13_west": PreRegion("6a_boss-13_west", "6a_boss-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-13_west"]), + "6a_boss-13_east": PreRegion("6a_boss-13_east", "6a_boss-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-13_east"]), + + "6a_boss-14_west": PreRegion("6a_boss-14_west", "6a_boss-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-14_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-14_west"]), + "6a_boss-14_east": PreRegion("6a_boss-14_east", "6a_boss-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-14_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-14_east"]), + + "6a_boss-15_west": PreRegion("6a_boss-15_west", "6a_boss-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-15_west"]), + "6a_boss-15_east": PreRegion("6a_boss-15_east", "6a_boss-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-15_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-15_east"]), + + "6a_boss-16_west": PreRegion("6a_boss-16_west", "6a_boss-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-16_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-16_west"]), + "6a_boss-16_east": PreRegion("6a_boss-16_east", "6a_boss-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-16_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-16_east"]), + + "6a_boss-17_west": PreRegion("6a_boss-17_west", "6a_boss-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-17_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-17_west"]), + "6a_boss-17_east": PreRegion("6a_boss-17_east", "6a_boss-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-17_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-17_east"]), + + "6a_boss-18_west": PreRegion("6a_boss-18_west", "6a_boss-18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-18_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-18_west"]), + "6a_boss-18_east": PreRegion("6a_boss-18_east", "6a_boss-18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-18_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-18_east"]), + + "6a_boss-19_west": PreRegion("6a_boss-19_west", "6a_boss-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-19_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-19_west"]), + "6a_boss-19_east": PreRegion("6a_boss-19_east", "6a_boss-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-19_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-19_east"]), + + "6a_boss-20_west": PreRegion("6a_boss-20_west", "6a_boss-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-20_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-20_west"]), + "6a_boss-20_east": PreRegion("6a_boss-20_east", "6a_boss-20", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_boss-20_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_boss-20_east"]), + + "6a_after-00_bottom": PreRegion("6a_after-00_bottom", "6a_after-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_after-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_after-00_bottom"]), + "6a_after-00_top": PreRegion("6a_after-00_top", "6a_after-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_after-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_after-00_top"]), + + "6a_after-01_bottom": PreRegion("6a_after-01_bottom", "6a_after-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_after-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_after-01_bottom"]), + "6a_after-01_goal": PreRegion("6a_after-01_goal", "6a_after-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6a_after-01_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "6a_after-01_goal"]), + + "6b_a-00_bottom": PreRegion("6b_a-00_bottom", "6b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-00_bottom"]), + "6b_a-00_top": PreRegion("6b_a-00_top", "6b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-00_top"]), + + "6b_a-01_bottom": PreRegion("6b_a-01_bottom", "6b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-01_bottom"]), + "6b_a-01_top": PreRegion("6b_a-01_top", "6b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-01_top"]), + + "6b_a-02_bottom": PreRegion("6b_a-02_bottom", "6b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-02_bottom"]), + "6b_a-02_top": PreRegion("6b_a-02_top", "6b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-02_top"]), + + "6b_a-03_west": PreRegion("6b_a-03_west", "6b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-03_west"]), + "6b_a-03_east": PreRegion("6b_a-03_east", "6b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-03_east"]), + + "6b_a-04_west": PreRegion("6b_a-04_west", "6b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-04_west"]), + "6b_a-04_east": PreRegion("6b_a-04_east", "6b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-04_east"]), + + "6b_a-05_west": PreRegion("6b_a-05_west", "6b_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-05_west"]), + "6b_a-05_east": PreRegion("6b_a-05_east", "6b_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-05_east"]), + + "6b_a-06_west": PreRegion("6b_a-06_west", "6b_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-06_west"]), + "6b_a-06_east": PreRegion("6b_a-06_east", "6b_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_a-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_a-06_east"]), + + "6b_b-00_west": PreRegion("6b_b-00_west", "6b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-00_west"]), + "6b_b-00_east": PreRegion("6b_b-00_east", "6b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-00_east"]), + + "6b_b-01_top": PreRegion("6b_b-01_top", "6b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-01_top"]), + "6b_b-01_bottom": PreRegion("6b_b-01_bottom", "6b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-01_bottom"]), + + "6b_b-02_top": PreRegion("6b_b-02_top", "6b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-02_top"]), + "6b_b-02_bottom": PreRegion("6b_b-02_bottom", "6b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-02_bottom"]), + + "6b_b-03_top": PreRegion("6b_b-03_top", "6b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-03_top"]), + "6b_b-03_bottom": PreRegion("6b_b-03_bottom", "6b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-03_bottom"]), + + "6b_b-04_top": PreRegion("6b_b-04_top", "6b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-04_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-04_top"]), + "6b_b-04_bottom": PreRegion("6b_b-04_bottom", "6b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-04_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-04_bottom"]), + + "6b_b-05_top": PreRegion("6b_b-05_top", "6b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-05_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-05_top"]), + "6b_b-05_bottom": PreRegion("6b_b-05_bottom", "6b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-05_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-05_bottom"]), + + "6b_b-06_top": PreRegion("6b_b-06_top", "6b_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-06_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-06_top"]), + "6b_b-06_bottom": PreRegion("6b_b-06_bottom", "6b_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-06_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-06_bottom"]), + + "6b_b-07_top": PreRegion("6b_b-07_top", "6b_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-07_top"]), + "6b_b-07_bottom": PreRegion("6b_b-07_bottom", "6b_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-07_bottom"]), + + "6b_b-08_top": PreRegion("6b_b-08_top", "6b_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-08_top"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-08_top"]), + "6b_b-08_bottom": PreRegion("6b_b-08_bottom", "6b_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-08_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-08_bottom"]), + + "6b_b-10_west": PreRegion("6b_b-10_west", "6b_b-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-10_west"]), + "6b_b-10_east": PreRegion("6b_b-10_east", "6b_b-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_b-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_b-10_east"]), + + "6b_c-00_west": PreRegion("6b_c-00_west", "6b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-00_west"]), + "6b_c-00_east": PreRegion("6b_c-00_east", "6b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-00_east"]), + + "6b_c-01_west": PreRegion("6b_c-01_west", "6b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-01_west"]), + "6b_c-01_east": PreRegion("6b_c-01_east", "6b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-01_east"]), + + "6b_c-02_west": PreRegion("6b_c-02_west", "6b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-02_west"]), + "6b_c-02_east": PreRegion("6b_c-02_east", "6b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-02_east"]), + + "6b_c-03_west": PreRegion("6b_c-03_west", "6b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-03_west"]), + "6b_c-03_east": PreRegion("6b_c-03_east", "6b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-03_east"]), + + "6b_c-04_west": PreRegion("6b_c-04_west", "6b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-04_west"]), + "6b_c-04_east": PreRegion("6b_c-04_east", "6b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_c-04_east"]), + + "6b_d-00_west": PreRegion("6b_d-00_west", "6b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-00_west"]), + "6b_d-00_east": PreRegion("6b_d-00_east", "6b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-00_east"]), + + "6b_d-01_west": PreRegion("6b_d-01_west", "6b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-01_west"]), + "6b_d-01_east": PreRegion("6b_d-01_east", "6b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-01_east"]), + + "6b_d-02_west": PreRegion("6b_d-02_west", "6b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-02_west"]), + "6b_d-02_east": PreRegion("6b_d-02_east", "6b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-02_east"]), + + "6b_d-03_west": PreRegion("6b_d-03_west", "6b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-03_west"]), + "6b_d-03_east": PreRegion("6b_d-03_east", "6b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-03_east"]), + + "6b_d-04_west": PreRegion("6b_d-04_west", "6b_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-04_west"]), + "6b_d-04_east": PreRegion("6b_d-04_east", "6b_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-04_east"]), + + "6b_d-05_west": PreRegion("6b_d-05_west", "6b_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-05_west"]), + "6b_d-05_goal": PreRegion("6b_d-05_goal", "6b_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6b_d-05_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "6b_d-05_goal"]), + + "6c_00_west": PreRegion("6c_00_west", "6c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_00_west"]), + "6c_00_east": PreRegion("6c_00_east", "6c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_00_east"]), + + "6c_01_west": PreRegion("6c_01_west", "6c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_01_west"]), + "6c_01_east": PreRegion("6c_01_east", "6c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_01_east"]), + + "6c_02_west": PreRegion("6c_02_west", "6c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_02_west"]), + "6c_02_goal": PreRegion("6c_02_goal", "6c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "6c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "6c_02_goal"]), + + "7a_a-00_west": PreRegion("7a_a-00_west", "7a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-00_west"]), + "7a_a-00_east": PreRegion("7a_a-00_east", "7a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-00_east"]), + + "7a_a-01_west": PreRegion("7a_a-01_west", "7a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-01_west"]), + "7a_a-01_east": PreRegion("7a_a-01_east", "7a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-01_east"]), + + "7a_a-02_west": PreRegion("7a_a-02_west", "7a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02_west"]), + "7a_a-02_east": PreRegion("7a_a-02_east", "7a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02_east"]), + "7a_a-02_north": PreRegion("7a_a-02_north", "7a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02_north"]), + "7a_a-02_north-west": PreRegion("7a_a-02_north-west", "7a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02_north-west"]), + + "7a_a-02b_east": PreRegion("7a_a-02b_east", "7a_a-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02b_east"]), + "7a_a-02b_west": PreRegion("7a_a-02b_west", "7a_a-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-02b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-02b_west"]), + + "7a_a-03_west": PreRegion("7a_a-03_west", "7a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-03_west"]), + "7a_a-03_east": PreRegion("7a_a-03_east", "7a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-03_east"]), + + "7a_a-04_west": PreRegion("7a_a-04_west", "7a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-04_west"]), + "7a_a-04_north": PreRegion("7a_a-04_north", "7a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-04_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-04_north"]), + "7a_a-04_east": PreRegion("7a_a-04_east", "7a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-04_east"]), + + "7a_a-04b_east": PreRegion("7a_a-04b_east", "7a_a-04b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-04b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-04b_east"]), + + "7a_a-05_west": PreRegion("7a_a-05_west", "7a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-05_west"]), + "7a_a-05_east": PreRegion("7a_a-05_east", "7a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-05_east"]), + + "7a_a-06_bottom": PreRegion("7a_a-06_bottom", "7a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-06_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-06_bottom"]), + "7a_a-06_top": PreRegion("7a_a-06_top", "7a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-06_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-06_top"]), + "7a_a-06_top-side": PreRegion("7a_a-06_top-side", "7a_a-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_a-06_top-side"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_a-06_top-side"]), + + "7a_b-00_bottom": PreRegion("7a_b-00_bottom", "7a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-00_bottom"]), + "7a_b-00_top": PreRegion("7a_b-00_top", "7a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-00_top"]), + + "7a_b-01_west": PreRegion("7a_b-01_west", "7a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-01_west"]), + "7a_b-01_east": PreRegion("7a_b-01_east", "7a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-01_east"]), + + "7a_b-02_south": PreRegion("7a_b-02_south", "7a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02_south"]), + "7a_b-02_north-west": PreRegion("7a_b-02_north-west", "7a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02_north-west"]), + "7a_b-02_north": PreRegion("7a_b-02_north", "7a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02_north"]), + "7a_b-02_north-east": PreRegion("7a_b-02_north-east", "7a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02_north-east"]), + + "7a_b-02b_south": PreRegion("7a_b-02b_south", "7a_b-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02b_south"]), + "7a_b-02b_north-west": PreRegion("7a_b-02b_north-west", "7a_b-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02b_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02b_north-west"]), + "7a_b-02b_north-east": PreRegion("7a_b-02b_north-east", "7a_b-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02b_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02b_north-east"]), + + "7a_b-02e_east": PreRegion("7a_b-02e_east", "7a_b-02e", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02e_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02e_east"]), + + "7a_b-02c_west": PreRegion("7a_b-02c_west", "7a_b-02c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02c_west"]), + "7a_b-02c_east": PreRegion("7a_b-02c_east", "7a_b-02c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02c_east"]), + "7a_b-02c_south-east": PreRegion("7a_b-02c_south-east", "7a_b-02c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02c_south-east"]), + + "7a_b-02d_north": PreRegion("7a_b-02d_north", "7a_b-02d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02d_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02d_north"]), + "7a_b-02d_south": PreRegion("7a_b-02d_south", "7a_b-02d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-02d_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-02d_south"]), + + "7a_b-03_west": PreRegion("7a_b-03_west", "7a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-03_west"]), + "7a_b-03_east": PreRegion("7a_b-03_east", "7a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-03_east"]), + "7a_b-03_north": PreRegion("7a_b-03_north", "7a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-03_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-03_north"]), + + "7a_b-04_west": PreRegion("7a_b-04_west", "7a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-04_west"]), + + "7a_b-05_west": PreRegion("7a_b-05_west", "7a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-05_west"]), + "7a_b-05_east": PreRegion("7a_b-05_east", "7a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-05_east"]), + "7a_b-05_north-west": PreRegion("7a_b-05_north-west", "7a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-05_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-05_north-west"]), + + "7a_b-06_west": PreRegion("7a_b-06_west", "7a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-06_west"]), + "7a_b-06_east": PreRegion("7a_b-06_east", "7a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-06_east"]), + + "7a_b-07_west": PreRegion("7a_b-07_west", "7a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-07_west"]), + "7a_b-07_east": PreRegion("7a_b-07_east", "7a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-07_east"]), + + "7a_b-08_west": PreRegion("7a_b-08_west", "7a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-08_west"]), + "7a_b-08_east": PreRegion("7a_b-08_east", "7a_b-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-08_east"]), + + "7a_b-09_bottom": PreRegion("7a_b-09_bottom", "7a_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-09_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-09_bottom"]), + "7a_b-09_top": PreRegion("7a_b-09_top", "7a_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-09_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-09_top"]), + "7a_b-09_top-side": PreRegion("7a_b-09_top-side", "7a_b-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_b-09_top-side"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_b-09_top-side"]), + + "7a_c-00_west": PreRegion("7a_c-00_west", "7a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-00_west"]), + "7a_c-00_east": PreRegion("7a_c-00_east", "7a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-00_east"]), + + "7a_c-01_bottom": PreRegion("7a_c-01_bottom", "7a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-01_bottom"]), + "7a_c-01_top": PreRegion("7a_c-01_top", "7a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-01_top"]), + + "7a_c-02_bottom": PreRegion("7a_c-02_bottom", "7a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-02_bottom"]), + "7a_c-02_top": PreRegion("7a_c-02_top", "7a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-02_top"]), + + "7a_c-03_south": PreRegion("7a_c-03_south", "7a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-03_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-03_south"]), + "7a_c-03_west": PreRegion("7a_c-03_west", "7a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-03_west"]), + "7a_c-03_east": PreRegion("7a_c-03_east", "7a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-03_east"]), + + "7a_c-03b_east": PreRegion("7a_c-03b_east", "7a_c-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-03b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-03b_east"]), + + "7a_c-04_west": PreRegion("7a_c-04_west", "7a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-04_west"]), + "7a_c-04_north-west": PreRegion("7a_c-04_north-west", "7a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-04_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-04_north-west"]), + "7a_c-04_north-east": PreRegion("7a_c-04_north-east", "7a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-04_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-04_north-east"]), + "7a_c-04_east": PreRegion("7a_c-04_east", "7a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-04_east"]), + + "7a_c-05_west": PreRegion("7a_c-05_west", "7a_c-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-05_west"]), + + "7a_c-06_south": PreRegion("7a_c-06_south", "7a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06_south"]), + "7a_c-06_north": PreRegion("7a_c-06_north", "7a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06_north"]), + "7a_c-06_east": PreRegion("7a_c-06_east", "7a_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06_east"]), + + "7a_c-06b_south": PreRegion("7a_c-06b_south", "7a_c-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06b_south"]), + "7a_c-06b_north": PreRegion("7a_c-06b_north", "7a_c-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06b_north"]), + "7a_c-06b_west": PreRegion("7a_c-06b_west", "7a_c-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06b_west"]), + "7a_c-06b_east": PreRegion("7a_c-06b_east", "7a_c-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06b_east"]), + + "7a_c-06c_west": PreRegion("7a_c-06c_west", "7a_c-06c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-06c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-06c_west"]), + + "7a_c-07_west": PreRegion("7a_c-07_west", "7a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-07_west"]), + "7a_c-07_south-west": PreRegion("7a_c-07_south-west", "7a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-07_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-07_south-west"]), + "7a_c-07_south-east": PreRegion("7a_c-07_south-east", "7a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-07_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-07_south-east"]), + "7a_c-07_east": PreRegion("7a_c-07_east", "7a_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-07_east"]), + + "7a_c-07b_east": PreRegion("7a_c-07b_east", "7a_c-07b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-07b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-07b_east"]), + + "7a_c-08_west": PreRegion("7a_c-08_west", "7a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-08_west"]), + "7a_c-08_east": PreRegion("7a_c-08_east", "7a_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-08_east"]), + + "7a_c-09_bottom": PreRegion("7a_c-09_bottom", "7a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-09_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-09_bottom"]), + "7a_c-09_top": PreRegion("7a_c-09_top", "7a_c-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_c-09_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_c-09_top"]), + + "7a_d-00_bottom": PreRegion("7a_d-00_bottom", "7a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-00_bottom"]), + "7a_d-00_top": PreRegion("7a_d-00_top", "7a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-00_top"]), + + "7a_d-01_west": PreRegion("7a_d-01_west", "7a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01_west"]), + "7a_d-01_east": PreRegion("7a_d-01_east", "7a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01_east"]), + + "7a_d-01b_west": PreRegion("7a_d-01b_west", "7a_d-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01b_west"]), + "7a_d-01b_south-west": PreRegion("7a_d-01b_south-west", "7a_d-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01b_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01b_south-west"]), + "7a_d-01b_east": PreRegion("7a_d-01b_east", "7a_d-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01b_east"]), + "7a_d-01b_south-east": PreRegion("7a_d-01b_south-east", "7a_d-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01b_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01b_south-east"]), + + "7a_d-01c_west": PreRegion("7a_d-01c_west", "7a_d-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01c_west"]), + "7a_d-01c_south": PreRegion("7a_d-01c_south", "7a_d-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01c_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01c_south"]), + "7a_d-01c_east": PreRegion("7a_d-01c_east", "7a_d-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01c_east"]), + "7a_d-01c_south-east": PreRegion("7a_d-01c_south-east", "7a_d-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01c_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01c_south-east"]), + + "7a_d-01d_west": PreRegion("7a_d-01d_west", "7a_d-01d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01d_west"]), + "7a_d-01d_east": PreRegion("7a_d-01d_east", "7a_d-01d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-01d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-01d_east"]), + + "7a_d-02_west": PreRegion("7a_d-02_west", "7a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-02_west"]), + "7a_d-02_east": PreRegion("7a_d-02_east", "7a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-02_east"]), + + "7a_d-03_west": PreRegion("7a_d-03_west", "7a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03_west"]), + "7a_d-03_north-west": PreRegion("7a_d-03_north-west", "7a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03_north-west"]), + "7a_d-03_east": PreRegion("7a_d-03_east", "7a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03_east"]), + "7a_d-03_north-east": PreRegion("7a_d-03_north-east", "7a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03_north-east"]), + + "7a_d-03b_west": PreRegion("7a_d-03b_west", "7a_d-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03b_west"]), + "7a_d-03b_east": PreRegion("7a_d-03b_east", "7a_d-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-03b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-03b_east"]), + + "7a_d-04_west": PreRegion("7a_d-04_west", "7a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-04_west"]), + "7a_d-04_east": PreRegion("7a_d-04_east", "7a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-04_east"]), + + "7a_d-05_west": PreRegion("7a_d-05_west", "7a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-05_west"]), + "7a_d-05_north-east": PreRegion("7a_d-05_north-east", "7a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-05_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-05_north-east"]), + "7a_d-05_east": PreRegion("7a_d-05_east", "7a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-05_east"]), + + "7a_d-05b_west": PreRegion("7a_d-05b_west", "7a_d-05b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-05b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-05b_west"]), + + "7a_d-06_west": PreRegion("7a_d-06_west", "7a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-06_west"]), + "7a_d-06_south-west": PreRegion("7a_d-06_south-west", "7a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-06_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-06_south-west"]), + "7a_d-06_south-east": PreRegion("7a_d-06_south-east", "7a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-06_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-06_south-east"]), + "7a_d-06_east": PreRegion("7a_d-06_east", "7a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-06_east"]), + + "7a_d-07_east": PreRegion("7a_d-07_east", "7a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-07_east"]), + + "7a_d-08_west": PreRegion("7a_d-08_west", "7a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-08_west"]), + "7a_d-08_east": PreRegion("7a_d-08_east", "7a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-08_east"]), + + "7a_d-09_west": PreRegion("7a_d-09_west", "7a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-09_west"]), + "7a_d-09_east": PreRegion("7a_d-09_east", "7a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-09_east"]), + + "7a_d-10_west": PreRegion("7a_d-10_west", "7a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10_west"]), + "7a_d-10_north-west": PreRegion("7a_d-10_north-west", "7a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10_north-west"]), + "7a_d-10_north": PreRegion("7a_d-10_north", "7a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10_north"]), + "7a_d-10_north-east": PreRegion("7a_d-10_north-east", "7a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10_north-east"]), + "7a_d-10_east": PreRegion("7a_d-10_east", "7a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10_east"]), + + "7a_d-10b_west": PreRegion("7a_d-10b_west", "7a_d-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10b_west"]), + "7a_d-10b_east": PreRegion("7a_d-10b_east", "7a_d-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-10b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-10b_east"]), + + "7a_d-11_bottom": PreRegion("7a_d-11_bottom", "7a_d-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-11_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-11_bottom"]), + "7a_d-11_top": PreRegion("7a_d-11_top", "7a_d-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_d-11_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_d-11_top"]), + + "7a_e-00b_bottom": PreRegion("7a_e-00b_bottom", "7a_e-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00b_bottom"]), + "7a_e-00b_top": PreRegion("7a_e-00b_top", "7a_e-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00b_top"]), + + "7a_e-00_west": PreRegion("7a_e-00_west", "7a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00_west"]), + "7a_e-00_south-west": PreRegion("7a_e-00_south-west", "7a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00_south-west"]), + "7a_e-00_north-west": PreRegion("7a_e-00_north-west", "7a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00_north-west"]), + "7a_e-00_east": PreRegion("7a_e-00_east", "7a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-00_east"]), + + "7a_e-01_west": PreRegion("7a_e-01_west", "7a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01_west"]), + "7a_e-01_north": PreRegion("7a_e-01_north", "7a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01_north"]), + "7a_e-01_east": PreRegion("7a_e-01_east", "7a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01_east"]), + + "7a_e-01b_west": PreRegion("7a_e-01b_west", "7a_e-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01b_west"]), + "7a_e-01b_east": PreRegion("7a_e-01b_east", "7a_e-01b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01b_east"]), + + "7a_e-01c_west": PreRegion("7a_e-01c_west", "7a_e-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01c_west"]), + "7a_e-01c_east": PreRegion("7a_e-01c_east", "7a_e-01c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-01c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-01c_east"]), + + "7a_e-02_west": PreRegion("7a_e-02_west", "7a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-02_west"]), + "7a_e-02_east": PreRegion("7a_e-02_east", "7a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-02_east"]), + + "7a_e-03_south-west": PreRegion("7a_e-03_south-west", "7a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-03_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-03_south-west"]), + "7a_e-03_west": PreRegion("7a_e-03_west", "7a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-03_west"]), + "7a_e-03_east": PreRegion("7a_e-03_east", "7a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-03_east"]), + + "7a_e-04_west": PreRegion("7a_e-04_west", "7a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-04_west"]), + "7a_e-04_east": PreRegion("7a_e-04_east", "7a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-04_east"]), + + "7a_e-05_west": PreRegion("7a_e-05_west", "7a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-05_west"]), + "7a_e-05_east": PreRegion("7a_e-05_east", "7a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-05_east"]), + + "7a_e-06_west": PreRegion("7a_e-06_west", "7a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-06_west"]), + "7a_e-06_east": PreRegion("7a_e-06_east", "7a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-06_east"]), + + "7a_e-07_bottom": PreRegion("7a_e-07_bottom", "7a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-07_bottom"]), + "7a_e-07_top": PreRegion("7a_e-07_top", "7a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-07_top"]), + + "7a_e-08_south": PreRegion("7a_e-08_south", "7a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-08_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-08_south"]), + "7a_e-08_west": PreRegion("7a_e-08_west", "7a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-08_west"]), + "7a_e-08_east": PreRegion("7a_e-08_east", "7a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-08_east"]), + + "7a_e-09_north": PreRegion("7a_e-09_north", "7a_e-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-09_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-09_north"]), + "7a_e-09_east": PreRegion("7a_e-09_east", "7a_e-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-09_east"]), + + "7a_e-11_south": PreRegion("7a_e-11_south", "7a_e-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-11_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-11_south"]), + "7a_e-11_north": PreRegion("7a_e-11_north", "7a_e-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-11_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-11_north"]), + "7a_e-11_east": PreRegion("7a_e-11_east", "7a_e-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-11_east"]), + + "7a_e-12_west": PreRegion("7a_e-12_west", "7a_e-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-12_west"]), + + "7a_e-10_south": PreRegion("7a_e-10_south", "7a_e-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-10_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-10_south"]), + "7a_e-10_north": PreRegion("7a_e-10_north", "7a_e-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-10_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-10_north"]), + "7a_e-10_east": PreRegion("7a_e-10_east", "7a_e-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-10_east"]), + + "7a_e-10b_west": PreRegion("7a_e-10b_west", "7a_e-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-10b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-10b_west"]), + "7a_e-10b_east": PreRegion("7a_e-10b_east", "7a_e-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-10b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-10b_east"]), + + "7a_e-13_bottom": PreRegion("7a_e-13_bottom", "7a_e-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-13_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-13_bottom"]), + "7a_e-13_top": PreRegion("7a_e-13_top", "7a_e-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_e-13_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_e-13_top"]), + + "7a_f-00_south": PreRegion("7a_f-00_south", "7a_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-00_south"]), + "7a_f-00_west": PreRegion("7a_f-00_west", "7a_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-00_west"]), + "7a_f-00_north-west": PreRegion("7a_f-00_north-west", "7a_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-00_north-west"]), + "7a_f-00_north-east": PreRegion("7a_f-00_north-east", "7a_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-00_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-00_north-east"]), + "7a_f-00_east": PreRegion("7a_f-00_east", "7a_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-00_east"]), + + "7a_f-01_south": PreRegion("7a_f-01_south", "7a_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-01_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-01_south"]), + "7a_f-01_north": PreRegion("7a_f-01_north", "7a_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-01_north"]), + + "7a_f-02_west": PreRegion("7a_f-02_west", "7a_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02_west"]), + "7a_f-02_north-west": PreRegion("7a_f-02_north-west", "7a_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02_north-west"]), + "7a_f-02_north-east": PreRegion("7a_f-02_north-east", "7a_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02_north-east"]), + "7a_f-02_east": PreRegion("7a_f-02_east", "7a_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02_east"]), + + "7a_f-02b_west": PreRegion("7a_f-02b_west", "7a_f-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02b_west"]), + "7a_f-02b_east": PreRegion("7a_f-02b_east", "7a_f-02b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-02b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-02b_east"]), + + "7a_f-04_west": PreRegion("7a_f-04_west", "7a_f-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-04_west"]), + "7a_f-04_east": PreRegion("7a_f-04_east", "7a_f-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-04_east"]), + + "7a_f-03_west": PreRegion("7a_f-03_west", "7a_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-03_west"]), + "7a_f-03_east": PreRegion("7a_f-03_east", "7a_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-03_east"]), + + "7a_f-05_west": PreRegion("7a_f-05_west", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_west"]), + "7a_f-05_south-west": PreRegion("7a_f-05_south-west", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_south-west"]), + "7a_f-05_north-west": PreRegion("7a_f-05_north-west", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_north-west"]), + "7a_f-05_south": PreRegion("7a_f-05_south", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_south"]), + "7a_f-05_north": PreRegion("7a_f-05_north", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_north"]), + "7a_f-05_north-east": PreRegion("7a_f-05_north-east", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_north-east"]), + "7a_f-05_south-east": PreRegion("7a_f-05_south-east", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_south-east"]), + "7a_f-05_east": PreRegion("7a_f-05_east", "7a_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-05_east"]), + + "7a_f-06_north-west": PreRegion("7a_f-06_north-west", "7a_f-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-06_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-06_north-west"]), + "7a_f-06_north": PreRegion("7a_f-06_north", "7a_f-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-06_north"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-06_north"]), + "7a_f-06_north-east": PreRegion("7a_f-06_north-east", "7a_f-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-06_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-06_north-east"]), + + "7a_f-07_west": PreRegion("7a_f-07_west", "7a_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-07_west"]), + "7a_f-07_south-west": PreRegion("7a_f-07_south-west", "7a_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-07_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-07_south-west"]), + "7a_f-07_south": PreRegion("7a_f-07_south", "7a_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-07_south"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-07_south"]), + "7a_f-07_south-east": PreRegion("7a_f-07_south-east", "7a_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-07_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-07_south-east"]), + + "7a_f-08_west": PreRegion("7a_f-08_west", "7a_f-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08_west"]), + "7a_f-08_north-west": PreRegion("7a_f-08_north-west", "7a_f-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08_north-west"]), + "7a_f-08_east": PreRegion("7a_f-08_east", "7a_f-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08_east"]), + + "7a_f-08b_west": PreRegion("7a_f-08b_west", "7a_f-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08b_west"]), + "7a_f-08b_east": PreRegion("7a_f-08b_east", "7a_f-08b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08b_east"]), + + "7a_f-08d_west": PreRegion("7a_f-08d_west", "7a_f-08d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08d_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08d_west"]), + "7a_f-08d_east": PreRegion("7a_f-08d_east", "7a_f-08d", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08d_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08d_east"]), + + "7a_f-08c_west": PreRegion("7a_f-08c_west", "7a_f-08c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08c_west"]), + "7a_f-08c_east": PreRegion("7a_f-08c_east", "7a_f-08c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-08c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-08c_east"]), + + "7a_f-09_west": PreRegion("7a_f-09_west", "7a_f-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-09_west"]), + "7a_f-09_east": PreRegion("7a_f-09_east", "7a_f-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-09_east"]), + + "7a_f-10_west": PreRegion("7a_f-10_west", "7a_f-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-10_west"]), + "7a_f-10_north-east": PreRegion("7a_f-10_north-east", "7a_f-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-10_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-10_north-east"]), + "7a_f-10_east": PreRegion("7a_f-10_east", "7a_f-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-10_east"]), + + "7a_f-10b_west": PreRegion("7a_f-10b_west", "7a_f-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-10b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-10b_west"]), + "7a_f-10b_east": PreRegion("7a_f-10b_east", "7a_f-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-10b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-10b_east"]), + + "7a_f-11_bottom": PreRegion("7a_f-11_bottom", "7a_f-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-11_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-11_bottom"]), + "7a_f-11_top": PreRegion("7a_f-11_top", "7a_f-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_f-11_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_f-11_top"]), + + "7a_g-00_bottom": PreRegion("7a_g-00_bottom", "7a_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00_bottom"]), + "7a_g-00_top": PreRegion("7a_g-00_top", "7a_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00_top"]), + + "7a_g-00b_bottom": PreRegion("7a_g-00b_bottom", "7a_g-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00b_bottom"]), + "7a_g-00b_c26": PreRegion("7a_g-00b_c26", "7a_g-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00b_c26"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00b_c26"]), + "7a_g-00b_c24": PreRegion("7a_g-00b_c24", "7a_g-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00b_c24"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00b_c24"]), + "7a_g-00b_c21": PreRegion("7a_g-00b_c21", "7a_g-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00b_c21"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00b_c21"]), + "7a_g-00b_top": PreRegion("7a_g-00b_top", "7a_g-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-00b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-00b_top"]), + + "7a_g-01_bottom": PreRegion("7a_g-01_bottom", "7a_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-01_bottom"]), + "7a_g-01_c18": PreRegion("7a_g-01_c18", "7a_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-01_c18"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-01_c18"]), + "7a_g-01_c16": PreRegion("7a_g-01_c16", "7a_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-01_c16"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-01_c16"]), + "7a_g-01_top": PreRegion("7a_g-01_top", "7a_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-01_top"]), + + "7a_g-02_bottom": PreRegion("7a_g-02_bottom", "7a_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-02_bottom"]), + "7a_g-02_top": PreRegion("7a_g-02_top", "7a_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-02_top"]), + + "7a_g-03_bottom": PreRegion("7a_g-03_bottom", "7a_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-03_bottom"]), + "7a_g-03_goal": PreRegion("7a_g-03_goal", "7a_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7a_g-03_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "7a_g-03_goal"]), + + "7b_a-00_west": PreRegion("7b_a-00_west", "7b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-00_west"]), + "7b_a-00_east": PreRegion("7b_a-00_east", "7b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-00_east"]), + + "7b_a-01_west": PreRegion("7b_a-01_west", "7b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-01_west"]), + "7b_a-01_east": PreRegion("7b_a-01_east", "7b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-01_east"]), + + "7b_a-02_west": PreRegion("7b_a-02_west", "7b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-02_west"]), + "7b_a-02_east": PreRegion("7b_a-02_east", "7b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-02_east"]), + + "7b_a-03_bottom": PreRegion("7b_a-03_bottom", "7b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-03_bottom"]), + "7b_a-03_top": PreRegion("7b_a-03_top", "7b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_a-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_a-03_top"]), + + "7b_b-00_bottom": PreRegion("7b_b-00_bottom", "7b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-00_bottom"]), + "7b_b-00_top": PreRegion("7b_b-00_top", "7b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-00_top"]), + + "7b_b-01_bottom": PreRegion("7b_b-01_bottom", "7b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-01_bottom"]), + "7b_b-01_top": PreRegion("7b_b-01_top", "7b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-01_top"]), + + "7b_b-02_west": PreRegion("7b_b-02_west", "7b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-02_west"]), + "7b_b-02_east": PreRegion("7b_b-02_east", "7b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-02_east"]), + + "7b_b-03_bottom": PreRegion("7b_b-03_bottom", "7b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-03_bottom"]), + "7b_b-03_top": PreRegion("7b_b-03_top", "7b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_b-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_b-03_top"]), + + "7b_c-01_west": PreRegion("7b_c-01_west", "7b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-01_west"]), + "7b_c-01_east": PreRegion("7b_c-01_east", "7b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-01_east"]), + + "7b_c-00_west": PreRegion("7b_c-00_west", "7b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-00_west"]), + "7b_c-00_east": PreRegion("7b_c-00_east", "7b_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-00_east"]), + + "7b_c-02_west": PreRegion("7b_c-02_west", "7b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-02_west"]), + "7b_c-02_east": PreRegion("7b_c-02_east", "7b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-02_east"]), + + "7b_c-03_bottom": PreRegion("7b_c-03_bottom", "7b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-03_bottom"]), + "7b_c-03_top": PreRegion("7b_c-03_top", "7b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_c-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_c-03_top"]), + + "7b_d-00_west": PreRegion("7b_d-00_west", "7b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-00_west"]), + "7b_d-00_east": PreRegion("7b_d-00_east", "7b_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-00_east"]), + + "7b_d-01_west": PreRegion("7b_d-01_west", "7b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-01_west"]), + "7b_d-01_east": PreRegion("7b_d-01_east", "7b_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-01_east"]), + + "7b_d-02_west": PreRegion("7b_d-02_west", "7b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-02_west"]), + "7b_d-02_east": PreRegion("7b_d-02_east", "7b_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-02_east"]), + + "7b_d-03_bottom": PreRegion("7b_d-03_bottom", "7b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-03_bottom"]), + "7b_d-03_top": PreRegion("7b_d-03_top", "7b_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_d-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_d-03_top"]), + + "7b_e-00_west": PreRegion("7b_e-00_west", "7b_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-00_west"]), + "7b_e-00_east": PreRegion("7b_e-00_east", "7b_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-00_east"]), + + "7b_e-01_west": PreRegion("7b_e-01_west", "7b_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-01_west"]), + "7b_e-01_east": PreRegion("7b_e-01_east", "7b_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-01_east"]), + + "7b_e-02_west": PreRegion("7b_e-02_west", "7b_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-02_west"]), + "7b_e-02_east": PreRegion("7b_e-02_east", "7b_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-02_east"]), + + "7b_e-03_bottom": PreRegion("7b_e-03_bottom", "7b_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-03_bottom"]), + "7b_e-03_top": PreRegion("7b_e-03_top", "7b_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_e-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_e-03_top"]), + + "7b_f-00_west": PreRegion("7b_f-00_west", "7b_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-00_west"]), + "7b_f-00_east": PreRegion("7b_f-00_east", "7b_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-00_east"]), + + "7b_f-01_west": PreRegion("7b_f-01_west", "7b_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-01_west"]), + "7b_f-01_east": PreRegion("7b_f-01_east", "7b_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-01_east"]), + + "7b_f-02_west": PreRegion("7b_f-02_west", "7b_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-02_west"]), + "7b_f-02_east": PreRegion("7b_f-02_east", "7b_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-02_east"]), + + "7b_f-03_bottom": PreRegion("7b_f-03_bottom", "7b_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-03_bottom"]), + "7b_f-03_top": PreRegion("7b_f-03_top", "7b_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_f-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_f-03_top"]), + + "7b_g-00_bottom": PreRegion("7b_g-00_bottom", "7b_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-00_bottom"]), + "7b_g-00_top": PreRegion("7b_g-00_top", "7b_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-00_top"]), + + "7b_g-01_bottom": PreRegion("7b_g-01_bottom", "7b_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-01_bottom"]), + "7b_g-01_top": PreRegion("7b_g-01_top", "7b_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-01_top"]), + + "7b_g-02_bottom": PreRegion("7b_g-02_bottom", "7b_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-02_bottom"]), + "7b_g-02_top": PreRegion("7b_g-02_top", "7b_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-02_top"]), + + "7b_g-03_bottom": PreRegion("7b_g-03_bottom", "7b_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-03_bottom"]), + "7b_g-03_goal": PreRegion("7b_g-03_goal", "7b_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7b_g-03_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "7b_g-03_goal"]), + + "7c_01_west": PreRegion("7c_01_west", "7c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_01_west"]), + "7c_01_east": PreRegion("7c_01_east", "7c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_01_east"]), + + "7c_02_west": PreRegion("7c_02_west", "7c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_02_west"]), + "7c_02_east": PreRegion("7c_02_east", "7c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_02_east"]), + + "7c_03_west": PreRegion("7c_03_west", "7c_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_03_west"]), + "7c_03_goal": PreRegion("7c_03_goal", "7c_03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "7c_03_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "7c_03_goal"]), + + "8a_outside_east": PreRegion("8a_outside_east", "8a_outside", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "8a_outside_east"], [loc for _, loc in all_locations.items() if loc.region_name == "8a_outside_east"]), + + "8a_bridge_west": PreRegion("8a_bridge_west", "8a_bridge", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "8a_bridge_west"], [loc for _, loc in all_locations.items() if loc.region_name == "8a_bridge_west"]), + "8a_bridge_east": PreRegion("8a_bridge_east", "8a_bridge", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "8a_bridge_east"], [loc for _, loc in all_locations.items() if loc.region_name == "8a_bridge_east"]), + + "8a_secret_west": PreRegion("8a_secret_west", "8a_secret", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "8a_secret_west"], [loc for _, loc in all_locations.items() if loc.region_name == "8a_secret_west"]), + + "9a_00_west": PreRegion("9a_00_west", "9a_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_00_west"]), + "9a_00_east": PreRegion("9a_00_east", "9a_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_00_east"]), + + "9a_0x_east": PreRegion("9a_0x_east", "9a_0x", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_0x_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_0x_east"]), + + "9a_01_west": PreRegion("9a_01_west", "9a_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_01_west"]), + "9a_01_east": PreRegion("9a_01_east", "9a_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_01_east"]), + + "9a_02_west": PreRegion("9a_02_west", "9a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_02_west"]), + "9a_02_east": PreRegion("9a_02_east", "9a_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_02_east"]), + + "9a_a-00_west": PreRegion("9a_a-00_west", "9a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-00_west"]), + "9a_a-00_east": PreRegion("9a_a-00_east", "9a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-00_east"]), + + "9a_a-01_west": PreRegion("9a_a-01_west", "9a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-01_west"]), + "9a_a-01_east": PreRegion("9a_a-01_east", "9a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-01_east"]), + + "9a_a-02_west": PreRegion("9a_a-02_west", "9a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-02_west"]), + "9a_a-02_east": PreRegion("9a_a-02_east", "9a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-02_east"]), + + "9a_a-03_bottom": PreRegion("9a_a-03_bottom", "9a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-03_bottom"]), + "9a_a-03_top": PreRegion("9a_a-03_top", "9a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_a-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_a-03_top"]), + + "9a_b-00_west": PreRegion("9a_b-00_west", "9a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-00_west"]), + "9a_b-00_south": PreRegion("9a_b-00_south", "9a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-00_south"]), + "9a_b-00_north": PreRegion("9a_b-00_north", "9a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-00_north"]), + "9a_b-00_east": PreRegion("9a_b-00_east", "9a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-00_east"]), + + "9a_b-01_west": PreRegion("9a_b-01_west", "9a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-01_west"]), + "9a_b-01_east": PreRegion("9a_b-01_east", "9a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-01_east"]), + + "9a_b-02_west": PreRegion("9a_b-02_west", "9a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-02_west"]), + "9a_b-02_east": PreRegion("9a_b-02_east", "9a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-02_east"]), + + "9a_b-03_west": PreRegion("9a_b-03_west", "9a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-03_west"]), + "9a_b-03_east": PreRegion("9a_b-03_east", "9a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-03_east"]), + + "9a_b-04_north-west": PreRegion("9a_b-04_north-west", "9a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-04_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-04_north-west"]), + "9a_b-04_west": PreRegion("9a_b-04_west", "9a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-04_west"]), + "9a_b-04_east": PreRegion("9a_b-04_east", "9a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-04_east"]), + + "9a_b-05_west": PreRegion("9a_b-05_west", "9a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-05_west"]), + "9a_b-05_east": PreRegion("9a_b-05_east", "9a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-05_east"]), + + "9a_b-06_east": PreRegion("9a_b-06_east", "9a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-06_east"]), + + "9a_b-07b_bottom": PreRegion("9a_b-07b_bottom", "9a_b-07b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-07b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-07b_bottom"]), + "9a_b-07b_top": PreRegion("9a_b-07b_top", "9a_b-07b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-07b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-07b_top"]), + + "9a_b-07_bottom": PreRegion("9a_b-07_bottom", "9a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-07_bottom"]), + "9a_b-07_top": PreRegion("9a_b-07_top", "9a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_b-07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_b-07_top"]), + + "9a_c-00_west": PreRegion("9a_c-00_west", "9a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-00_west"]), + "9a_c-00_north-east": PreRegion("9a_c-00_north-east", "9a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-00_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-00_north-east"]), + "9a_c-00_east": PreRegion("9a_c-00_east", "9a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-00_east"]), + + "9a_c-00b_west": PreRegion("9a_c-00b_west", "9a_c-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-00b_west"]), + + "9a_c-01_west": PreRegion("9a_c-01_west", "9a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-01_west"]), + "9a_c-01_east": PreRegion("9a_c-01_east", "9a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-01_east"]), + + "9a_c-02_west": PreRegion("9a_c-02_west", "9a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-02_west"]), + "9a_c-02_east": PreRegion("9a_c-02_east", "9a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-02_east"]), + + "9a_c-03_west": PreRegion("9a_c-03_west", "9a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03_west"]), + "9a_c-03_north-west": PreRegion("9a_c-03_north-west", "9a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03_north-west"]), + "9a_c-03_north": PreRegion("9a_c-03_north", "9a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03_north"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03_north"]), + "9a_c-03_north-east": PreRegion("9a_c-03_north-east", "9a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03_north-east"]), + "9a_c-03_east": PreRegion("9a_c-03_east", "9a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03_east"]), + + "9a_c-03b_west": PreRegion("9a_c-03b_west", "9a_c-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03b_west"]), + "9a_c-03b_south": PreRegion("9a_c-03b_south", "9a_c-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03b_south"]), + "9a_c-03b_east": PreRegion("9a_c-03b_east", "9a_c-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-03b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-03b_east"]), + + "9a_c-04_west": PreRegion("9a_c-04_west", "9a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-04_west"]), + "9a_c-04_east": PreRegion("9a_c-04_east", "9a_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_c-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_c-04_east"]), + + "9a_d-00_bottom": PreRegion("9a_d-00_bottom", "9a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-00_bottom"]), + "9a_d-00_top": PreRegion("9a_d-00_top", "9a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-00_top"]), + + "9a_d-01_bottom": PreRegion("9a_d-01_bottom", "9a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-01_bottom"]), + "9a_d-01_top": PreRegion("9a_d-01_top", "9a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-01_top"]), + + "9a_d-02_bottom": PreRegion("9a_d-02_bottom", "9a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-02_bottom"]), + "9a_d-02_top": PreRegion("9a_d-02_top", "9a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-02_top"]), + + "9a_d-03_bottom": PreRegion("9a_d-03_bottom", "9a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-03_bottom"]), + "9a_d-03_top": PreRegion("9a_d-03_top", "9a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-03_top"]), + + "9a_d-04_bottom": PreRegion("9a_d-04_bottom", "9a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-04_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-04_bottom"]), + "9a_d-04_top": PreRegion("9a_d-04_top", "9a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-04_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-04_top"]), + + "9a_d-05_bottom": PreRegion("9a_d-05_bottom", "9a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-05_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-05_bottom"]), + "9a_d-05_top": PreRegion("9a_d-05_top", "9a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-05_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-05_top"]), + + "9a_d-06_bottom": PreRegion("9a_d-06_bottom", "9a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-06_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-06_bottom"]), + "9a_d-06_top": PreRegion("9a_d-06_top", "9a_d-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-06_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-06_top"]), + + "9a_d-07_bottom": PreRegion("9a_d-07_bottom", "9a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-07_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-07_bottom"]), + "9a_d-07_top": PreRegion("9a_d-07_top", "9a_d-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-07_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-07_top"]), + + "9a_d-08_west": PreRegion("9a_d-08_west", "9a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-08_west"]), + "9a_d-08_east": PreRegion("9a_d-08_east", "9a_d-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-08_east"]), + + "9a_d-09_west": PreRegion("9a_d-09_west", "9a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-09_west"]), + "9a_d-09_east": PreRegion("9a_d-09_east", "9a_d-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-09_east"]), + + "9a_d-10_west": PreRegion("9a_d-10_west", "9a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10_west"]), + "9a_d-10_east": PreRegion("9a_d-10_east", "9a_d-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10_east"]), + + "9a_d-10b_west": PreRegion("9a_d-10b_west", "9a_d-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10b_west"]), + "9a_d-10b_east": PreRegion("9a_d-10b_east", "9a_d-10b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10b_east"]), + + "9a_d-10c_west": PreRegion("9a_d-10c_west", "9a_d-10c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10c_west"]), + "9a_d-10c_east": PreRegion("9a_d-10c_east", "9a_d-10c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-10c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-10c_east"]), + + "9a_d-11_west": PreRegion("9a_d-11_west", "9a_d-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-11_west"]), + "9a_d-11_center": PreRegion("9a_d-11_center", "9a_d-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-11_center"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-11_center"]), + "9a_d-11_east": PreRegion("9a_d-11_east", "9a_d-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_d-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_d-11_east"]), + + "9a_space_west": PreRegion("9a_space_west", "9a_space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_space_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_space_west"]), + "9a_space_goal": PreRegion("9a_space_goal", "9a_space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9a_space_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "9a_space_goal"]), + + "9b_00_east": PreRegion("9b_00_east", "9b_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_00_east"]), + + "9b_01_west": PreRegion("9b_01_west", "9b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_01_west"]), + "9b_01_east": PreRegion("9b_01_east", "9b_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_01_east"]), + + "9b_a-00_west": PreRegion("9b_a-00_west", "9b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-00_west"]), + "9b_a-00_east": PreRegion("9b_a-00_east", "9b_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-00_east"]), + + "9b_a-01_west": PreRegion("9b_a-01_west", "9b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-01_west"]), + "9b_a-01_east": PreRegion("9b_a-01_east", "9b_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-01_east"]), + + "9b_a-02_west": PreRegion("9b_a-02_west", "9b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-02_west"]), + "9b_a-02_east": PreRegion("9b_a-02_east", "9b_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-02_east"]), + + "9b_a-03_west": PreRegion("9b_a-03_west", "9b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-03_west"]), + "9b_a-03_east": PreRegion("9b_a-03_east", "9b_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-03_east"]), + + "9b_a-04_west": PreRegion("9b_a-04_west", "9b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-04_west"]), + "9b_a-04_east": PreRegion("9b_a-04_east", "9b_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-04_east"]), + + "9b_a-05_west": PreRegion("9b_a-05_west", "9b_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-05_west"]), + "9b_a-05_east": PreRegion("9b_a-05_east", "9b_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_a-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_a-05_east"]), + + "9b_b-00_west": PreRegion("9b_b-00_west", "9b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-00_west"]), + "9b_b-00_east": PreRegion("9b_b-00_east", "9b_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-00_east"]), + + "9b_b-01_west": PreRegion("9b_b-01_west", "9b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-01_west"]), + "9b_b-01_east": PreRegion("9b_b-01_east", "9b_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-01_east"]), + + "9b_b-02_west": PreRegion("9b_b-02_west", "9b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-02_west"]), + "9b_b-02_east": PreRegion("9b_b-02_east", "9b_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-02_east"]), + + "9b_b-03_west": PreRegion("9b_b-03_west", "9b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-03_west"]), + "9b_b-03_east": PreRegion("9b_b-03_east", "9b_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-03_east"]), + + "9b_b-04_west": PreRegion("9b_b-04_west", "9b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-04_west"]), + "9b_b-04_east": PreRegion("9b_b-04_east", "9b_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-04_east"]), + + "9b_b-05_west": PreRegion("9b_b-05_west", "9b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-05_west"]), + "9b_b-05_east": PreRegion("9b_b-05_east", "9b_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_b-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_b-05_east"]), + + "9b_c-01_bottom": PreRegion("9b_c-01_bottom", "9b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-01_bottom"]), + "9b_c-01_top": PreRegion("9b_c-01_top", "9b_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-01_top"]), + + "9b_c-02_bottom": PreRegion("9b_c-02_bottom", "9b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-02_bottom"]), + "9b_c-02_top": PreRegion("9b_c-02_top", "9b_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-02_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-02_top"]), + + "9b_c-03_bottom": PreRegion("9b_c-03_bottom", "9b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-03_bottom"]), + "9b_c-03_top": PreRegion("9b_c-03_top", "9b_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-03_top"]), + + "9b_c-04_bottom": PreRegion("9b_c-04_bottom", "9b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-04_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-04_bottom"]), + "9b_c-04_top": PreRegion("9b_c-04_top", "9b_c-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-04_top"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-04_top"]), + + "9b_c-05_west": PreRegion("9b_c-05_west", "9b_c-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-05_west"]), + "9b_c-05_east": PreRegion("9b_c-05_east", "9b_c-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-05_east"]), + + "9b_c-06_west": PreRegion("9b_c-06_west", "9b_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-06_west"]), + "9b_c-06_east": PreRegion("9b_c-06_east", "9b_c-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-06_east"]), + + "9b_c-08_west": PreRegion("9b_c-08_west", "9b_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-08_west"]), + "9b_c-08_east": PreRegion("9b_c-08_east", "9b_c-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-08_east"]), + + "9b_c-07_west": PreRegion("9b_c-07_west", "9b_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-07_west"]), + "9b_c-07_east": PreRegion("9b_c-07_east", "9b_c-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_c-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_c-07_east"]), + + "9b_space_west": PreRegion("9b_space_west", "9b_space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_space_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_space_west"]), + "9b_space_goal": PreRegion("9b_space_goal", "9b_space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9b_space_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "9b_space_goal"]), + + "9c_intro_west": PreRegion("9c_intro_west", "9c_intro", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_intro_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_intro_west"]), + "9c_intro_east": PreRegion("9c_intro_east", "9c_intro", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_intro_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_intro_east"]), + + "9c_00_west": PreRegion("9c_00_west", "9c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_00_west"]), + "9c_00_east": PreRegion("9c_00_east", "9c_00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_00_east"]), + + "9c_01_west": PreRegion("9c_01_west", "9c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_01_west"]), + "9c_01_east": PreRegion("9c_01_east", "9c_01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_01_east"]), + + "9c_02_west": PreRegion("9c_02_west", "9c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_02_west"]), + "9c_02_goal": PreRegion("9c_02_goal", "9c_02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "9c_02_goal"], [loc for _, loc in all_locations.items() if loc.region_name == "9c_02_goal"]), + + "10a_intro-00-past_west": PreRegion("10a_intro-00-past_west", "10a_intro-00-past", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-00-past_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-00-past_west"]), + "10a_intro-00-past_east": PreRegion("10a_intro-00-past_east", "10a_intro-00-past", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-00-past_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-00-past_east"]), + + "10a_intro-01-future_west": PreRegion("10a_intro-01-future_west", "10a_intro-01-future", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-01-future_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-01-future_west"]), + "10a_intro-01-future_east": PreRegion("10a_intro-01-future_east", "10a_intro-01-future", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-01-future_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-01-future_east"]), + + "10a_intro-02-launch_bottom": PreRegion("10a_intro-02-launch_bottom", "10a_intro-02-launch", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-02-launch_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-02-launch_bottom"]), + "10a_intro-02-launch_top": PreRegion("10a_intro-02-launch_top", "10a_intro-02-launch", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-02-launch_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-02-launch_top"]), + + "10a_intro-03-space_west": PreRegion("10a_intro-03-space_west", "10a_intro-03-space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-03-space_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-03-space_west"]), + "10a_intro-03-space_east": PreRegion("10a_intro-03-space_east", "10a_intro-03-space", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_intro-03-space_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_intro-03-space_east"]), + + "10a_a-00_west": PreRegion("10a_a-00_west", "10a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-00_west"]), + "10a_a-00_east": PreRegion("10a_a-00_east", "10a_a-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-00_east"]), + + "10a_a-01_west": PreRegion("10a_a-01_west", "10a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-01_west"]), + "10a_a-01_east": PreRegion("10a_a-01_east", "10a_a-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-01_east"]), + + "10a_a-02_west": PreRegion("10a_a-02_west", "10a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-02_west"]), + "10a_a-02_east": PreRegion("10a_a-02_east", "10a_a-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-02_east"]), + + "10a_a-03_west": PreRegion("10a_a-03_west", "10a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-03_west"]), + "10a_a-03_east": PreRegion("10a_a-03_east", "10a_a-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-03_east"]), + + "10a_a-04_west": PreRegion("10a_a-04_west", "10a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-04_west"]), + "10a_a-04_east": PreRegion("10a_a-04_east", "10a_a-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-04_east"]), + + "10a_a-05_west": PreRegion("10a_a-05_west", "10a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-05_west"]), + "10a_a-05_east": PreRegion("10a_a-05_east", "10a_a-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_a-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_a-05_east"]), + + "10a_b-00_west": PreRegion("10a_b-00_west", "10a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-00_west"]), + "10a_b-00_east": PreRegion("10a_b-00_east", "10a_b-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-00_east"]), + + "10a_b-01_west": PreRegion("10a_b-01_west", "10a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-01_west"]), + "10a_b-01_east": PreRegion("10a_b-01_east", "10a_b-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-01_east"]), + + "10a_b-02_west": PreRegion("10a_b-02_west", "10a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-02_west"]), + "10a_b-02_east": PreRegion("10a_b-02_east", "10a_b-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-02_east"]), + + "10a_b-03_west": PreRegion("10a_b-03_west", "10a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-03_west"]), + "10a_b-03_east": PreRegion("10a_b-03_east", "10a_b-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-03_east"]), + + "10a_b-04_west": PreRegion("10a_b-04_west", "10a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-04_west"]), + "10a_b-04_east": PreRegion("10a_b-04_east", "10a_b-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-04_east"]), + + "10a_b-05_west": PreRegion("10a_b-05_west", "10a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-05_west"]), + "10a_b-05_east": PreRegion("10a_b-05_east", "10a_b-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-05_east"]), + + "10a_b-06_west": PreRegion("10a_b-06_west", "10a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-06_west"]), + "10a_b-06_east": PreRegion("10a_b-06_east", "10a_b-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-06_east"]), + + "10a_b-07_west": PreRegion("10a_b-07_west", "10a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-07_west"]), + "10a_b-07_east": PreRegion("10a_b-07_east", "10a_b-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_b-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_b-07_east"]), + + "10a_c-00_west": PreRegion("10a_c-00_west", "10a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-00_west"]), + "10a_c-00_east": PreRegion("10a_c-00_east", "10a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-00_east"]), + "10a_c-00_north-east": PreRegion("10a_c-00_north-east", "10a_c-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-00_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-00_north-east"]), + + "10a_c-00b_west": PreRegion("10a_c-00b_west", "10a_c-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-00b_west"]), + "10a_c-00b_east": PreRegion("10a_c-00b_east", "10a_c-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-00b_east"]), + + "10a_c-01_west": PreRegion("10a_c-01_west", "10a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-01_west"]), + "10a_c-01_east": PreRegion("10a_c-01_east", "10a_c-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-01_east"]), + + "10a_c-02_west": PreRegion("10a_c-02_west", "10a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-02_west"]), + "10a_c-02_east": PreRegion("10a_c-02_east", "10a_c-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-02_east"]), + + "10a_c-alt-00_west": PreRegion("10a_c-alt-00_west", "10a_c-alt-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-alt-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-alt-00_west"]), + "10a_c-alt-00_east": PreRegion("10a_c-alt-00_east", "10a_c-alt-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-alt-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-alt-00_east"]), + + "10a_c-alt-01_west": PreRegion("10a_c-alt-01_west", "10a_c-alt-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-alt-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-alt-01_west"]), + "10a_c-alt-01_east": PreRegion("10a_c-alt-01_east", "10a_c-alt-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-alt-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-alt-01_east"]), + + "10a_c-03_south-west": PreRegion("10a_c-03_south-west", "10a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-03_south-west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-03_south-west"]), + "10a_c-03_south": PreRegion("10a_c-03_south", "10a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-03_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-03_south"]), + "10a_c-03_north": PreRegion("10a_c-03_north", "10a_c-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_c-03_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_c-03_north"]), + + "10a_d-00_south": PreRegion("10a_d-00_south", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_south"]), + "10a_d-00_north": PreRegion("10a_d-00_north", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_north"]), + "10a_d-00_south-east": PreRegion("10a_d-00_south-east", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_south-east"]), + "10a_d-00_north-west": PreRegion("10a_d-00_north-west", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_north-west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_north-west"]), + "10a_d-00_breaker": PreRegion("10a_d-00_breaker", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_breaker"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_breaker"]), + "10a_d-00_north-east-door": PreRegion("10a_d-00_north-east-door", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_north-east-door"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_north-east-door"]), + "10a_d-00_south-east-door": PreRegion("10a_d-00_south-east-door", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_south-east-door"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_south-east-door"]), + "10a_d-00_south-west-door": PreRegion("10a_d-00_south-west-door", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_south-west-door"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_south-west-door"]), + "10a_d-00_west-door": PreRegion("10a_d-00_west-door", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_west-door"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_west-door"]), + "10a_d-00_north-west-door": PreRegion("10a_d-00_north-west-door", "10a_d-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-00_north-west-door"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-00_north-west-door"]), + + "10a_d-04_west": PreRegion("10a_d-04_west", "10a_d-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-04_west"]), + + "10a_d-03_west": PreRegion("10a_d-03_west", "10a_d-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-03_west"]), + + "10a_d-01_east": PreRegion("10a_d-01_east", "10a_d-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-01_east"]), + + "10a_d-02_bottom": PreRegion("10a_d-02_bottom", "10a_d-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-02_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-02_bottom"]), + + "10a_d-05_west": PreRegion("10a_d-05_west", "10a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-05_west"]), + "10a_d-05_south": PreRegion("10a_d-05_south", "10a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-05_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-05_south"]), + "10a_d-05_north": PreRegion("10a_d-05_north", "10a_d-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_d-05_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_d-05_north"]), + + "10a_e-00y_south": PreRegion("10a_e-00y_south", "10a_e-00y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00y_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00y_south"]), + "10a_e-00y_south-east": PreRegion("10a_e-00y_south-east", "10a_e-00y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00y_south-east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00y_south-east"]), + "10a_e-00y_north-east": PreRegion("10a_e-00y_north-east", "10a_e-00y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00y_north-east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00y_north-east"]), + "10a_e-00y_north": PreRegion("10a_e-00y_north", "10a_e-00y", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00y_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00y_north"]), + + "10a_e-00yb_south": PreRegion("10a_e-00yb_south", "10a_e-00yb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00yb_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00yb_south"]), + "10a_e-00yb_north": PreRegion("10a_e-00yb_north", "10a_e-00yb", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00yb_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00yb_north"]), + + "10a_e-00z_south": PreRegion("10a_e-00z_south", "10a_e-00z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00z_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00z_south"]), + "10a_e-00z_north": PreRegion("10a_e-00z_north", "10a_e-00z", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00z_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00z_north"]), + + "10a_e-00_south": PreRegion("10a_e-00_south", "10a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00_south"]), + "10a_e-00_north": PreRegion("10a_e-00_north", "10a_e-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00_north"]), + + "10a_e-00b_south": PreRegion("10a_e-00b_south", "10a_e-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00b_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00b_south"]), + "10a_e-00b_north": PreRegion("10a_e-00b_north", "10a_e-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-00b_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-00b_north"]), + + "10a_e-01_south": PreRegion("10a_e-01_south", "10a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-01_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-01_south"]), + "10a_e-01_north": PreRegion("10a_e-01_north", "10a_e-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-01_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-01_north"]), + + "10a_e-02_west": PreRegion("10a_e-02_west", "10a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-02_west"]), + "10a_e-02_east": PreRegion("10a_e-02_east", "10a_e-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-02_east"]), + + "10a_e-03_west": PreRegion("10a_e-03_west", "10a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-03_west"]), + "10a_e-03_east": PreRegion("10a_e-03_east", "10a_e-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-03_east"]), + + "10a_e-04_west": PreRegion("10a_e-04_west", "10a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-04_west"]), + "10a_e-04_east": PreRegion("10a_e-04_east", "10a_e-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-04_east"]), + + "10a_e-05_west": PreRegion("10a_e-05_west", "10a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05_west"]), + "10a_e-05_east": PreRegion("10a_e-05_east", "10a_e-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05_east"]), + + "10a_e-05b_west": PreRegion("10a_e-05b_west", "10a_e-05b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05b_west"]), + "10a_e-05b_east": PreRegion("10a_e-05b_east", "10a_e-05b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05b_east"]), + + "10a_e-05c_west": PreRegion("10a_e-05c_west", "10a_e-05c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05c_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05c_west"]), + "10a_e-05c_east": PreRegion("10a_e-05c_east", "10a_e-05c", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-05c_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-05c_east"]), + + "10a_e-06_west": PreRegion("10a_e-06_west", "10a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-06_west"]), + "10a_e-06_east": PreRegion("10a_e-06_east", "10a_e-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-06_east"]), + + "10a_e-07_west": PreRegion("10a_e-07_west", "10a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-07_west"]), + "10a_e-07_east": PreRegion("10a_e-07_east", "10a_e-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-07_east"]), + + "10a_e-08_west": PreRegion("10a_e-08_west", "10a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-08_west"]), + "10a_e-08_east": PreRegion("10a_e-08_east", "10a_e-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10a_e-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10a_e-08_east"]), + + "10b_f-door_west": PreRegion("10b_f-door_west", "10b_f-door", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-door_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-door_west"]), + "10b_f-door_east": PreRegion("10b_f-door_east", "10b_f-door", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-door_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-door_east"]), + + "10b_f-00_west": PreRegion("10b_f-00_west", "10b_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-00_west"]), + "10b_f-00_east": PreRegion("10b_f-00_east", "10b_f-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-00_east"]), + + "10b_f-01_west": PreRegion("10b_f-01_west", "10b_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-01_west"]), + "10b_f-01_east": PreRegion("10b_f-01_east", "10b_f-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-01_east"]), + + "10b_f-02_west": PreRegion("10b_f-02_west", "10b_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-02_west"]), + "10b_f-02_east": PreRegion("10b_f-02_east", "10b_f-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-02_east"]), + + "10b_f-03_west": PreRegion("10b_f-03_west", "10b_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-03_west"]), + "10b_f-03_east": PreRegion("10b_f-03_east", "10b_f-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-03_east"]), + + "10b_f-04_west": PreRegion("10b_f-04_west", "10b_f-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-04_west"]), + "10b_f-04_east": PreRegion("10b_f-04_east", "10b_f-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-04_east"]), + + "10b_f-05_west": PreRegion("10b_f-05_west", "10b_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-05_west"]), + "10b_f-05_east": PreRegion("10b_f-05_east", "10b_f-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-05_east"]), + + "10b_f-06_west": PreRegion("10b_f-06_west", "10b_f-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-06_west"]), + "10b_f-06_east": PreRegion("10b_f-06_east", "10b_f-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-06_east"]), + + "10b_f-07_west": PreRegion("10b_f-07_west", "10b_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-07_west"]), + "10b_f-07_east": PreRegion("10b_f-07_east", "10b_f-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-07_east"]), + + "10b_f-08_west": PreRegion("10b_f-08_west", "10b_f-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-08_west"]), + "10b_f-08_east": PreRegion("10b_f-08_east", "10b_f-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-08_east"]), + + "10b_f-09_west": PreRegion("10b_f-09_west", "10b_f-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-09_west"]), + "10b_f-09_east": PreRegion("10b_f-09_east", "10b_f-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_f-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_f-09_east"]), + + "10b_g-00_bottom": PreRegion("10b_g-00_bottom", "10b_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-00_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-00_bottom"]), + "10b_g-00_top": PreRegion("10b_g-00_top", "10b_g-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-00_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-00_top"]), + + "10b_g-01_bottom": PreRegion("10b_g-01_bottom", "10b_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-01_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-01_bottom"]), + "10b_g-01_top": PreRegion("10b_g-01_top", "10b_g-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-01_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-01_top"]), + + "10b_g-03_bottom": PreRegion("10b_g-03_bottom", "10b_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-03_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-03_bottom"]), + "10b_g-03_top": PreRegion("10b_g-03_top", "10b_g-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-03_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-03_top"]), + + "10b_g-02_west": PreRegion("10b_g-02_west", "10b_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-02_west"]), + "10b_g-02_east": PreRegion("10b_g-02_east", "10b_g-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-02_east"]), + + "10b_g-04_west": PreRegion("10b_g-04_west", "10b_g-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-04_west"]), + "10b_g-04_east": PreRegion("10b_g-04_east", "10b_g-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-04_east"]), + + "10b_g-05_west": PreRegion("10b_g-05_west", "10b_g-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-05_west"]), + "10b_g-05_east": PreRegion("10b_g-05_east", "10b_g-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-05_east"]), + + "10b_g-06_west": PreRegion("10b_g-06_west", "10b_g-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-06_west"]), + "10b_g-06_east": PreRegion("10b_g-06_east", "10b_g-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_g-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_g-06_east"]), + + "10b_h-00b_west": PreRegion("10b_h-00b_west", "10b_h-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-00b_west"]), + "10b_h-00b_east": PreRegion("10b_h-00b_east", "10b_h-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-00b_east"]), + + "10b_h-00_west": PreRegion("10b_h-00_west", "10b_h-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-00_west"]), + "10b_h-00_east": PreRegion("10b_h-00_east", "10b_h-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-00_east"]), + + "10b_h-01_west": PreRegion("10b_h-01_west", "10b_h-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-01_west"]), + "10b_h-01_east": PreRegion("10b_h-01_east", "10b_h-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-01_east"]), + + "10b_h-02_west": PreRegion("10b_h-02_west", "10b_h-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-02_west"]), + "10b_h-02_east": PreRegion("10b_h-02_east", "10b_h-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-02_east"]), + + "10b_h-03_west": PreRegion("10b_h-03_west", "10b_h-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-03_west"]), + "10b_h-03_east": PreRegion("10b_h-03_east", "10b_h-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-03_east"]), + + "10b_h-03b_west": PreRegion("10b_h-03b_west", "10b_h-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-03b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-03b_west"]), + "10b_h-03b_east": PreRegion("10b_h-03b_east", "10b_h-03b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-03b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-03b_east"]), + + "10b_h-04_top": PreRegion("10b_h-04_top", "10b_h-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-04_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-04_top"]), + "10b_h-04_east": PreRegion("10b_h-04_east", "10b_h-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-04_east"]), + "10b_h-04_bottom": PreRegion("10b_h-04_bottom", "10b_h-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-04_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-04_bottom"]), + + "10b_h-04b_west": PreRegion("10b_h-04b_west", "10b_h-04b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-04b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-04b_west"]), + "10b_h-04b_east": PreRegion("10b_h-04b_east", "10b_h-04b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-04b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-04b_east"]), + + "10b_h-05_west": PreRegion("10b_h-05_west", "10b_h-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-05_west"]), + "10b_h-05_top": PreRegion("10b_h-05_top", "10b_h-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-05_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-05_top"]), + "10b_h-05_east": PreRegion("10b_h-05_east", "10b_h-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-05_east"]), + + "10b_h-06_west": PreRegion("10b_h-06_west", "10b_h-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-06_west"]), + "10b_h-06_east": PreRegion("10b_h-06_east", "10b_h-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-06_east"]), + + "10b_h-06b_bottom": PreRegion("10b_h-06b_bottom", "10b_h-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-06b_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-06b_bottom"]), + "10b_h-06b_top": PreRegion("10b_h-06b_top", "10b_h-06b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-06b_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-06b_top"]), + + "10b_h-07_west": PreRegion("10b_h-07_west", "10b_h-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-07_west"]), + "10b_h-07_east": PreRegion("10b_h-07_east", "10b_h-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-07_east"]), + + "10b_h-08_west": PreRegion("10b_h-08_west", "10b_h-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-08_west"]), + "10b_h-08_east": PreRegion("10b_h-08_east", "10b_h-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-08_east"]), + + "10b_h-09_west": PreRegion("10b_h-09_west", "10b_h-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-09_west"]), + "10b_h-09_east": PreRegion("10b_h-09_east", "10b_h-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-09_east"]), + + "10b_h-10_west": PreRegion("10b_h-10_west", "10b_h-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-10_west"]), + "10b_h-10_east": PreRegion("10b_h-10_east", "10b_h-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_h-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_h-10_east"]), + + "10b_i-00_west": PreRegion("10b_i-00_west", "10b_i-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-00_west"]), + "10b_i-00_east": PreRegion("10b_i-00_east", "10b_i-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-00_east"]), + + "10b_i-00b_west": PreRegion("10b_i-00b_west", "10b_i-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-00b_west"]), + "10b_i-00b_east": PreRegion("10b_i-00b_east", "10b_i-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-00b_east"]), + + "10b_i-01_west": PreRegion("10b_i-01_west", "10b_i-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-01_west"]), + "10b_i-01_east": PreRegion("10b_i-01_east", "10b_i-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-01_east"]), + + "10b_i-02_west": PreRegion("10b_i-02_west", "10b_i-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-02_west"]), + "10b_i-02_east": PreRegion("10b_i-02_east", "10b_i-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-02_east"]), + + "10b_i-03_west": PreRegion("10b_i-03_west", "10b_i-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-03_west"]), + "10b_i-03_east": PreRegion("10b_i-03_east", "10b_i-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-03_east"]), + + "10b_i-04_west": PreRegion("10b_i-04_west", "10b_i-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-04_west"]), + "10b_i-04_east": PreRegion("10b_i-04_east", "10b_i-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-04_east"]), + + "10b_i-05_west": PreRegion("10b_i-05_west", "10b_i-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-05_west"]), + "10b_i-05_east": PreRegion("10b_i-05_east", "10b_i-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_i-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_i-05_east"]), + + "10b_j-00_west": PreRegion("10b_j-00_west", "10b_j-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-00_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-00_west"]), + "10b_j-00_east": PreRegion("10b_j-00_east", "10b_j-00", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-00_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-00_east"]), + + "10b_j-00b_west": PreRegion("10b_j-00b_west", "10b_j-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-00b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-00b_west"]), + "10b_j-00b_east": PreRegion("10b_j-00b_east", "10b_j-00b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-00b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-00b_east"]), + + "10b_j-01_west": PreRegion("10b_j-01_west", "10b_j-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-01_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-01_west"]), + "10b_j-01_east": PreRegion("10b_j-01_east", "10b_j-01", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-01_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-01_east"]), + + "10b_j-02_west": PreRegion("10b_j-02_west", "10b_j-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-02_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-02_west"]), + "10b_j-02_east": PreRegion("10b_j-02_east", "10b_j-02", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-02_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-02_east"]), + + "10b_j-03_west": PreRegion("10b_j-03_west", "10b_j-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-03_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-03_west"]), + "10b_j-03_east": PreRegion("10b_j-03_east", "10b_j-03", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-03_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-03_east"]), + + "10b_j-04_west": PreRegion("10b_j-04_west", "10b_j-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-04_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-04_west"]), + "10b_j-04_east": PreRegion("10b_j-04_east", "10b_j-04", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-04_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-04_east"]), + + "10b_j-05_west": PreRegion("10b_j-05_west", "10b_j-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-05_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-05_west"]), + "10b_j-05_east": PreRegion("10b_j-05_east", "10b_j-05", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-05_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-05_east"]), + + "10b_j-06_west": PreRegion("10b_j-06_west", "10b_j-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-06_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-06_west"]), + "10b_j-06_east": PreRegion("10b_j-06_east", "10b_j-06", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-06_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-06_east"]), + + "10b_j-07_west": PreRegion("10b_j-07_west", "10b_j-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-07_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-07_west"]), + "10b_j-07_east": PreRegion("10b_j-07_east", "10b_j-07", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-07_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-07_east"]), + + "10b_j-08_west": PreRegion("10b_j-08_west", "10b_j-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-08_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-08_west"]), + "10b_j-08_east": PreRegion("10b_j-08_east", "10b_j-08", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-08_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-08_east"]), + + "10b_j-09_west": PreRegion("10b_j-09_west", "10b_j-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-09_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-09_west"]), + "10b_j-09_east": PreRegion("10b_j-09_east", "10b_j-09", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-09_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-09_east"]), + + "10b_j-10_west": PreRegion("10b_j-10_west", "10b_j-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-10_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-10_west"]), + "10b_j-10_east": PreRegion("10b_j-10_east", "10b_j-10", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-10_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-10_east"]), + + "10b_j-11_west": PreRegion("10b_j-11_west", "10b_j-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-11_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-11_west"]), + "10b_j-11_east": PreRegion("10b_j-11_east", "10b_j-11", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-11_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-11_east"]), + + "10b_j-12_west": PreRegion("10b_j-12_west", "10b_j-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-12_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-12_west"]), + "10b_j-12_east": PreRegion("10b_j-12_east", "10b_j-12", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-12_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-12_east"]), + + "10b_j-13_west": PreRegion("10b_j-13_west", "10b_j-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-13_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-13_west"]), + "10b_j-13_east": PreRegion("10b_j-13_east", "10b_j-13", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-13_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-13_east"]), + + "10b_j-14_west": PreRegion("10b_j-14_west", "10b_j-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-14_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-14_west"]), + "10b_j-14_east": PreRegion("10b_j-14_east", "10b_j-14", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-14_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-14_east"]), + + "10b_j-14b_west": PreRegion("10b_j-14b_west", "10b_j-14b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-14b_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-14b_west"]), + "10b_j-14b_east": PreRegion("10b_j-14b_east", "10b_j-14b", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-14b_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-14b_east"]), + + "10b_j-15_west": PreRegion("10b_j-15_west", "10b_j-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-15_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-15_west"]), + "10b_j-15_east": PreRegion("10b_j-15_east", "10b_j-15", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-15_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-15_east"]), + + "10b_j-16_west": PreRegion("10b_j-16_west", "10b_j-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-16_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-16_west"]), + "10b_j-16_top": PreRegion("10b_j-16_top", "10b_j-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-16_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-16_top"]), + "10b_j-16_east": PreRegion("10b_j-16_east", "10b_j-16", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-16_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-16_east"]), + + "10b_j-17_south": PreRegion("10b_j-17_south", "10b_j-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-17_south"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-17_south"]), + "10b_j-17_west": PreRegion("10b_j-17_west", "10b_j-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-17_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-17_west"]), + "10b_j-17_north": PreRegion("10b_j-17_north", "10b_j-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-17_north"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-17_north"]), + "10b_j-17_east": PreRegion("10b_j-17_east", "10b_j-17", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-17_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-17_east"]), + + "10b_j-18_west": PreRegion("10b_j-18_west", "10b_j-18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-18_west"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-18_west"]), + "10b_j-18_east": PreRegion("10b_j-18_east", "10b_j-18", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-18_east"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-18_east"]), + + "10b_j-19_bottom": PreRegion("10b_j-19_bottom", "10b_j-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-19_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-19_bottom"]), + "10b_j-19_top": PreRegion("10b_j-19_top", "10b_j-19", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_j-19_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_j-19_top"]), + + "10b_GOAL_main": PreRegion("10b_GOAL_main", "10b_GOAL", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_GOAL_main"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_GOAL_main"]), + "10b_GOAL_moon": PreRegion("10b_GOAL_moon", "10b_GOAL", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10b_GOAL_moon"], [loc for _, loc in all_locations.items() if loc.region_name == "10b_GOAL_moon"]), + + "10c_end-golden_bottom": PreRegion("10c_end-golden_bottom", "10c_end-golden", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10c_end-golden_bottom"], [loc for _, loc in all_locations.items() if loc.region_name == "10c_end-golden_bottom"]), + "10c_end-golden_top": PreRegion("10c_end-golden_top", "10c_end-golden", [reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == "10c_end-golden_top"], [loc for _, loc in all_locations.items() if loc.region_name == "10c_end-golden_top"]), + +} + +all_room_connections: dict[str, RoomConnection] = { + "0a_-1_east---0a_0_west": RoomConnection("0a", all_doors["0a_-1_east"], all_doors["0a_0_west"]), + "0a_0_north---0a_0b_south": RoomConnection("0a", all_doors["0a_0_north"], all_doors["0a_0b_south"]), + "0a_0_east---0a_1_west": RoomConnection("0a", all_doors["0a_0_east"], all_doors["0a_1_west"]), + "0a_1_east---0a_2_west": RoomConnection("0a", all_doors["0a_1_east"], all_doors["0a_2_west"]), + "0a_2_east---0a_3_west": RoomConnection("0a", all_doors["0a_2_east"], all_doors["0a_3_west"]), + + "1a_1_east---1a_2_west": RoomConnection("1a", all_doors["1a_1_east"], all_doors["1a_2_west"]), + "1a_2_east---1a_3_west": RoomConnection("1a", all_doors["1a_2_east"], all_doors["1a_3_west"]), + "1a_3_east---1a_4_west": RoomConnection("1a", all_doors["1a_3_east"], all_doors["1a_4_west"]), + "1a_4_east---1a_3b_west": RoomConnection("1a", all_doors["1a_4_east"], all_doors["1a_3b_west"]), + "1a_3b_top---1a_5_bottom": RoomConnection("1a", all_doors["1a_3b_top"], all_doors["1a_5_bottom"]), + "1a_5_west---1a_5z_east": RoomConnection("1a", all_doors["1a_5_west"], all_doors["1a_5z_east"]), + "1a_5_south-east---1a_5a_west": RoomConnection("1a", all_doors["1a_5_south-east"], all_doors["1a_5a_west"]), + "1a_5_top---1a_6_south-west": RoomConnection("1a", all_doors["1a_5_top"], all_doors["1a_6_south-west"]), + "1a_6_west---1a_6z_east": RoomConnection("1a", all_doors["1a_6_west"], all_doors["1a_6z_east"]), + "1a_6_east---1a_6a_west": RoomConnection("1a", all_doors["1a_6_east"], all_doors["1a_6a_west"]), + "1a_6z_north-west---1a_7zb_east": RoomConnection("1a", all_doors["1a_6z_north-west"], all_doors["1a_7zb_east"]), + "1a_6z_west---1a_6zb_east": RoomConnection("1a", all_doors["1a_6z_west"], all_doors["1a_6zb_east"]), + "1a_7zb_west---1a_6zb_north-west": RoomConnection("1a", all_doors["1a_7zb_west"], all_doors["1a_6zb_north-west"]), + "1a_6a_east---1a_6b_south-west": RoomConnection("1a", all_doors["1a_6a_east"], all_doors["1a_6b_south-west"]), + "1a_6b_north-west---1a_s0_east": RoomConnection("1a", all_doors["1a_6b_north-west"], all_doors["1a_s0_east"]), + "1a_6b_north-east---1a_6c_south-west": RoomConnection("1a", all_doors["1a_6b_north-east"], all_doors["1a_6c_south-west"]), + "1a_s0_west---1a_s1_east": RoomConnection("1a", all_doors["1a_s0_west"], all_doors["1a_s1_east"]), + "1a_6c_north-west---1a_7z_bottom": RoomConnection("1a", all_doors["1a_6c_north-west"], all_doors["1a_7z_bottom"]), + "1a_6c_north-east---1a_7_west": RoomConnection("1a", all_doors["1a_6c_north-east"], all_doors["1a_7_west"]), + "1a_7_east---1a_8_south-west": RoomConnection("1a", all_doors["1a_7_east"], all_doors["1a_8_south-west"]), + "1a_7z_top---1a_8z_bottom": RoomConnection("1a", all_doors["1a_7z_top"], all_doors["1a_8z_bottom"]), + "1a_8z_top---1a_8zb_west": RoomConnection("1a", all_doors["1a_8z_top"], all_doors["1a_8zb_west"]), + "1a_8zb_east---1a_8_west": RoomConnection("1a", all_doors["1a_8zb_east"], all_doors["1a_8_west"]), + "1a_8_south---1a_7a_west": RoomConnection("1a", all_doors["1a_8_south"], all_doors["1a_7a_west"]), + "1a_8_north---1a_9z_east": RoomConnection("1a", all_doors["1a_8_north"], all_doors["1a_9z_east"]), + "1a_8_north-east---1a_8b_west": RoomConnection("1a", all_doors["1a_8_north-east"], all_doors["1a_8b_west"]), + "1a_7a_east---1a_8_south-east": RoomConnection("1a", all_doors["1a_7a_east"], all_doors["1a_8_south-east"]), + "1a_8b_east---1a_9_west": RoomConnection("1a", all_doors["1a_8b_east"], all_doors["1a_9_west"]), + "1a_9_east---1a_9b_west": RoomConnection("1a", all_doors["1a_9_east"], all_doors["1a_9b_west"]), + "1a_9b_north-west---1a_10_south-east": RoomConnection("1a", all_doors["1a_9b_north-west"], all_doors["1a_10_south-east"]), + "1a_9b_north-east---1a_10a_bottom": RoomConnection("1a", all_doors["1a_9b_north-east"], all_doors["1a_10a_bottom"]), + "1a_9b_east---1a_9c_west": RoomConnection("1a", all_doors["1a_9b_east"], all_doors["1a_9c_west"]), + "1a_10_south-west---1a_10z_east": RoomConnection("1a", all_doors["1a_10_south-west"], all_doors["1a_10z_east"]), + "1a_10_north-west---1a_11_south-west": RoomConnection("1a", all_doors["1a_10_north-west"], all_doors["1a_11_south-west"]), + "1a_10z_west---1a_10zb_east": RoomConnection("1a", all_doors["1a_10z_west"], all_doors["1a_10zb_east"]), + "1a_11_south---1a_10_north-east": RoomConnection("1a", all_doors["1a_11_south"], all_doors["1a_10_north-east"]), + "1a_11_west---1a_11z_east": RoomConnection("1a", all_doors["1a_11_west"], all_doors["1a_11z_east"]), + "1a_10a_top---1a_11_south-east": RoomConnection("1a", all_doors["1a_10a_top"], all_doors["1a_11_south-east"]), + "1a_11_north---1a_12_south-west": RoomConnection("1a", all_doors["1a_11_north"], all_doors["1a_12_south-west"]), + "1a_12_north-west---1a_12z_east": RoomConnection("1a", all_doors["1a_12_north-west"], all_doors["1a_12z_east"]), + "1a_12_east---1a_12a_bottom": RoomConnection("1a", all_doors["1a_12_east"], all_doors["1a_12a_bottom"]), + "1a_12a_top---1a_end_south": RoomConnection("1a", all_doors["1a_12a_top"], all_doors["1a_end_south"]), + + "1b_00_east---1b_01_west": RoomConnection("1b", all_doors["1b_00_east"], all_doors["1b_01_west"]), + "1b_01_east---1b_02_west": RoomConnection("1b", all_doors["1b_01_east"], all_doors["1b_02_west"]), + "1b_02_east---1b_02b_west": RoomConnection("1b", all_doors["1b_02_east"], all_doors["1b_02b_west"]), + "1b_02b_east---1b_03_west": RoomConnection("1b", all_doors["1b_02b_east"], all_doors["1b_03_west"]), + "1b_03_east---1b_04_west": RoomConnection("1b", all_doors["1b_03_east"], all_doors["1b_04_west"]), + "1b_04_east---1b_05_west": RoomConnection("1b", all_doors["1b_04_east"], all_doors["1b_05_west"]), + "1b_05_east---1b_05b_west": RoomConnection("1b", all_doors["1b_05_east"], all_doors["1b_05b_west"]), + "1b_05b_east---1b_06_west": RoomConnection("1b", all_doors["1b_05b_east"], all_doors["1b_06_west"]), + "1b_06_east---1b_07_bottom": RoomConnection("1b", all_doors["1b_06_east"], all_doors["1b_07_bottom"]), + "1b_07_top---1b_08_west": RoomConnection("1b", all_doors["1b_07_top"], all_doors["1b_08_west"]), + "1b_08_east---1b_08b_west": RoomConnection("1b", all_doors["1b_08_east"], all_doors["1b_08b_west"]), + "1b_08b_east---1b_09_west": RoomConnection("1b", all_doors["1b_08b_east"], all_doors["1b_09_west"]), + "1b_09_east---1b_10_west": RoomConnection("1b", all_doors["1b_09_east"], all_doors["1b_10_west"]), + "1b_10_east---1b_11_bottom": RoomConnection("1b", all_doors["1b_10_east"], all_doors["1b_11_bottom"]), + "1b_11_top---1b_end_west": RoomConnection("1b", all_doors["1b_11_top"], all_doors["1b_end_west"]), + + "1c_00_east---1c_01_west": RoomConnection("1c", all_doors["1c_00_east"], all_doors["1c_01_west"]), + "1c_01_east---1c_02_west": RoomConnection("1c", all_doors["1c_01_east"], all_doors["1c_02_west"]), + + "2a_start_top---2a_s0_bottom": RoomConnection("2a", all_doors["2a_start_top"], all_doors["2a_s0_bottom"]), + "2a_start_east---2a_0_south-west": RoomConnection("2a", all_doors["2a_start_east"], all_doors["2a_0_south-west"]), + "2a_s0_top---2a_s1_bottom": RoomConnection("2a", all_doors["2a_s0_top"], all_doors["2a_s1_bottom"]), + "2a_s1_top---2a_s2_bottom": RoomConnection("2a", all_doors["2a_s1_top"], all_doors["2a_s2_bottom"]), + "2a_0_north-west---2a_3x_bottom": RoomConnection("2a", all_doors["2a_0_north-west"], all_doors["2a_3x_bottom"]), + "2a_0_north-east---2a_1_north-west": RoomConnection("2a", all_doors["2a_0_north-east"], all_doors["2a_1_north-west"]), + "2a_0_south-east---2a_1_south-west": RoomConnection("2a", all_doors["2a_0_south-east"], all_doors["2a_1_south-west"]), + "2a_1_south---2a_d0_north": RoomConnection("2a", all_doors["2a_1_south"], all_doors["2a_d0_north"]), + "2a_1_south-east---2a_2_south-west": RoomConnection("2a", all_doors["2a_1_south-east"], all_doors["2a_2_south-west"]), + "2a_d0_north-west---2a_d1_north-east": RoomConnection("2a", all_doors["2a_d0_north-west"], all_doors["2a_d1_north-east"]), + "2a_d0_west---2a_d1_south-east": RoomConnection("2a", all_doors["2a_d0_west"], all_doors["2a_d1_south-east"]), + "2a_d0_south-west---2a_d6_east": RoomConnection("2a", all_doors["2a_d0_south-west"], all_doors["2a_d6_east"]), + "2a_d0_south---2a_d9_north-west": RoomConnection("2a", all_doors["2a_d0_south"], all_doors["2a_d9_north-west"]), + "2a_d0_south-east---2a_d7_west": RoomConnection("2a", all_doors["2a_d0_south-east"], all_doors["2a_d7_west"]), + "2a_d0_east---2a_d2_west": RoomConnection("2a", all_doors["2a_d0_east"], all_doors["2a_d2_west"]), + "2a_d0_north-east---2a_d4_west": RoomConnection("2a", all_doors["2a_d0_north-east"], all_doors["2a_d4_west"]), + "2a_d1_south-west---2a_d6_west": RoomConnection("2a", all_doors["2a_d1_south-west"], all_doors["2a_d6_west"]), + "2a_d7_east---2a_d8_west": RoomConnection("2a", all_doors["2a_d7_east"], all_doors["2a_d8_west"]), + "2a_d2_east---2a_d3_north": RoomConnection("2a", all_doors["2a_d2_east"], all_doors["2a_d3_north"]), + "2a_d4_east---2a_d5_west": RoomConnection("2a", all_doors["2a_d4_east"], all_doors["2a_d5_west"]), + "2a_d4_south---2a_d2_north-west": RoomConnection("2a", all_doors["2a_d4_south"], all_doors["2a_d2_north-west"]), + "2a_d8_north-east---2a_d3_west": RoomConnection("2a", all_doors["2a_d8_north-east"], all_doors["2a_d3_west"]), + "2a_d8_south-east---2a_d3_south": RoomConnection("2a", all_doors["2a_d8_south-east"], all_doors["2a_d3_south"]), + "2a_3x_top---2a_3_bottom": RoomConnection("2a", all_doors["2a_3x_top"], all_doors["2a_3_bottom"]), + "2a_3_top---2a_4_bottom": RoomConnection("2a", all_doors["2a_3_top"], all_doors["2a_4_bottom"]), + "2a_4_top---2a_5_bottom": RoomConnection("2a", all_doors["2a_4_top"], all_doors["2a_5_bottom"]), + "2a_5_top---2a_6_bottom": RoomConnection("2a", all_doors["2a_5_top"], all_doors["2a_6_bottom"]), + "2a_6_top---2a_7_bottom": RoomConnection("2a", all_doors["2a_6_top"], all_doors["2a_7_bottom"]), + "2a_7_top---2a_8_bottom": RoomConnection("2a", all_doors["2a_7_top"], all_doors["2a_8_bottom"]), + "2a_8_top---2a_9_west": RoomConnection("2a", all_doors["2a_8_top"], all_doors["2a_9_west"]), + "2a_9_north---2a_9b_east": RoomConnection("2a", all_doors["2a_9_north"], all_doors["2a_9b_east"]), + "2a_9_south-east---2a_10_top": RoomConnection("2a", all_doors["2a_9_south-east"], all_doors["2a_10_top"]), + "2a_9b_west---2a_9_north-west": RoomConnection("2a", all_doors["2a_9b_west"], all_doors["2a_9_north-west"]), + "2a_10_bottom---2a_2_north-west": RoomConnection("2a", all_doors["2a_10_bottom"], all_doors["2a_2_north-west"]), + "2a_2_south-east---2a_11_west": RoomConnection("2a", all_doors["2a_2_south-east"], all_doors["2a_11_west"]), + "2a_11_east---2a_12b_west": RoomConnection("2a", all_doors["2a_11_east"], all_doors["2a_12b_west"]), + "2a_12b_north---2a_12c_south": RoomConnection("2a", all_doors["2a_12b_north"], all_doors["2a_12c_south"]), + "2a_12b_south---2a_12d_north-west": RoomConnection("2a", all_doors["2a_12b_south"], all_doors["2a_12d_north-west"]), + "2a_12b_east---2a_12_west": RoomConnection("2a", all_doors["2a_12b_east"], all_doors["2a_12_west"]), + "2a_12d_north---2a_12b_south-east": RoomConnection("2a", all_doors["2a_12d_north"], all_doors["2a_12b_south-east"]), + "2a_12_east---2a_13_west": RoomConnection("2a", all_doors["2a_12_east"], all_doors["2a_13_west"]), + "2a_13_phone---2a_end_0_main": RoomConnection("2a", all_doors["2a_13_phone"], all_doors["2a_end_0_main"]), + "2a_end_0_top---2a_end_s0_bottom": RoomConnection("2a", all_doors["2a_end_0_top"], all_doors["2a_end_s0_bottom"]), + "2a_end_0_east---2a_end_1_west": RoomConnection("2a", all_doors["2a_end_0_east"], all_doors["2a_end_1_west"]), + "2a_end_s0_top---2a_end_s1_bottom": RoomConnection("2a", all_doors["2a_end_s0_top"], all_doors["2a_end_s1_bottom"]), + "2a_end_1_east---2a_end_2_west": RoomConnection("2a", all_doors["2a_end_1_east"], all_doors["2a_end_2_west"]), + "2a_end_1_north-east---2a_end_2_north-west": RoomConnection("2a", all_doors["2a_end_1_north-east"], all_doors["2a_end_2_north-west"]), + "2a_end_2_east---2a_end_3_west": RoomConnection("2a", all_doors["2a_end_2_east"], all_doors["2a_end_3_west"]), + "2a_end_2_north-east---2a_end_3_north-west": RoomConnection("2a", all_doors["2a_end_2_north-east"], all_doors["2a_end_3_north-west"]), + "2a_end_3_east---2a_end_4_west": RoomConnection("2a", all_doors["2a_end_3_east"], all_doors["2a_end_4_west"]), + "2a_end_4_east---2a_end_3b_west": RoomConnection("2a", all_doors["2a_end_4_east"], all_doors["2a_end_3b_west"]), + "2a_end_3b_north---2a_end_3cb_bottom": RoomConnection("2a", all_doors["2a_end_3b_north"], all_doors["2a_end_3cb_bottom"]), + "2a_end_3b_east---2a_end_5_west": RoomConnection("2a", all_doors["2a_end_3b_east"], all_doors["2a_end_5_west"]), + "2a_end_3cb_top---2a_end_3c_bottom": RoomConnection("2a", all_doors["2a_end_3cb_top"], all_doors["2a_end_3c_bottom"]), + "2a_end_5_east---2a_end_6_west": RoomConnection("2a", all_doors["2a_end_5_east"], all_doors["2a_end_6_west"]), + + "2b_start_east---2b_00_west": RoomConnection("2b", all_doors["2b_start_east"], all_doors["2b_00_west"]), + "2b_00_east---2b_01_west": RoomConnection("2b", all_doors["2b_00_east"], all_doors["2b_01_west"]), + "2b_01_east---2b_01b_west": RoomConnection("2b", all_doors["2b_01_east"], all_doors["2b_01b_west"]), + "2b_01b_east---2b_02b_west": RoomConnection("2b", all_doors["2b_01b_east"], all_doors["2b_02b_west"]), + "2b_02b_east---2b_02_west": RoomConnection("2b", all_doors["2b_02b_east"], all_doors["2b_02_west"]), + "2b_02_east---2b_03_west": RoomConnection("2b", all_doors["2b_02_east"], all_doors["2b_03_west"]), + "2b_03_east---2b_04_bottom": RoomConnection("2b", all_doors["2b_03_east"], all_doors["2b_04_bottom"]), + "2b_04_top---2b_05_bottom": RoomConnection("2b", all_doors["2b_04_top"], all_doors["2b_05_bottom"]), + "2b_05_top---2b_06_west": RoomConnection("2b", all_doors["2b_05_top"], all_doors["2b_06_west"]), + "2b_06_east---2b_07_bottom": RoomConnection("2b", all_doors["2b_06_east"], all_doors["2b_07_bottom"]), + "2b_07_top---2b_08b_west": RoomConnection("2b", all_doors["2b_07_top"], all_doors["2b_08b_west"]), + "2b_08b_east---2b_08_west": RoomConnection("2b", all_doors["2b_08b_east"], all_doors["2b_08_west"]), + "2b_08_east---2b_09_west": RoomConnection("2b", all_doors["2b_08_east"], all_doors["2b_09_west"]), + "2b_09_east---2b_10_west": RoomConnection("2b", all_doors["2b_09_east"], all_doors["2b_10_west"]), + "2b_10_east---2b_11_bottom": RoomConnection("2b", all_doors["2b_10_east"], all_doors["2b_11_bottom"]), + "2b_11_top---2b_end_west": RoomConnection("2b", all_doors["2b_11_top"], all_doors["2b_end_west"]), + + "2c_00_east---2c_01_west": RoomConnection("2c", all_doors["2c_00_east"], all_doors["2c_01_west"]), + "2c_01_east---2c_02_west": RoomConnection("2c", all_doors["2c_01_east"], all_doors["2c_02_west"]), + + "3a_s0_east---3a_s1_west": RoomConnection("3a", all_doors["3a_s0_east"], all_doors["3a_s1_west"]), + "3a_s1_east---3a_s2_west": RoomConnection("3a", all_doors["3a_s1_east"], all_doors["3a_s2_west"]), + "3a_s1_north-east---3a_s2_north-west": RoomConnection("3a", all_doors["3a_s1_north-east"], all_doors["3a_s2_north-west"]), + "3a_s2_east---3a_s3_west": RoomConnection("3a", all_doors["3a_s2_east"], all_doors["3a_s3_west"]), + "3a_s3_east---3a_0x-a_west": RoomConnection("3a", all_doors["3a_s3_east"], all_doors["3a_0x-a_west"]), + "3a_0x-a_east---3a_00-a_west": RoomConnection("3a", all_doors["3a_0x-a_east"], all_doors["3a_00-a_west"]), + "3a_00-a_east---3a_02-a_west": RoomConnection("3a", all_doors["3a_00-a_east"], all_doors["3a_02-a_west"]), + "3a_02-a_east---3a_03-a_west": RoomConnection("3a", all_doors["3a_02-a_east"], all_doors["3a_03-a_west"]), + "3a_02-a_top---3a_02-b_east": RoomConnection("3a", all_doors["3a_02-a_top"], all_doors["3a_02-b_east"]), + "3a_02-b_west---3a_01-b_east": RoomConnection("3a", all_doors["3a_02-b_west"], all_doors["3a_01-b_east"]), + "3a_01-b_north-west---3a_00-b_east": RoomConnection("3a", all_doors["3a_01-b_north-west"], all_doors["3a_00-b_east"]), + "3a_01-b_west---3a_00-b_south-east": RoomConnection("3a", all_doors["3a_01-b_west"], all_doors["3a_00-b_south-east"]), + "3a_00-b_south-west---3a_0x-b_south-east": RoomConnection("3a", all_doors["3a_00-b_south-west"], all_doors["3a_0x-b_south-east"]), + "3a_00-b_north---3a_00-c_south-east": RoomConnection("3a", all_doors["3a_00-b_north"], all_doors["3a_00-c_south-east"]), + "3a_00-b_west---3a_0x-b_north-east": RoomConnection("3a", all_doors["3a_00-b_west"], all_doors["3a_0x-b_north-east"]), + "3a_00-c_south-west---3a_00-b_north-west": RoomConnection("3a", all_doors["3a_00-c_south-west"], all_doors["3a_00-b_north-west"]), + "3a_00-c_north-east---3a_01-c_west": RoomConnection("3a", all_doors["3a_00-c_north-east"], all_doors["3a_01-c_west"]), + "3a_0x-b_west---3a_s3_north": RoomConnection("3a", all_doors["3a_0x-b_west"], all_doors["3a_s3_north"]), + "3a_03-a_top---3a_04-b_east": RoomConnection("3a", all_doors["3a_03-a_top"], all_doors["3a_04-b_east"]), + "3a_03-a_east---3a_05-a_west": RoomConnection("3a", all_doors["3a_03-a_east"], all_doors["3a_05-a_west"]), + "3a_05-a_east---3a_06-a_west": RoomConnection("3a", all_doors["3a_05-a_east"], all_doors["3a_06-a_west"]), + "3a_06-a_east---3a_07-a_west": RoomConnection("3a", all_doors["3a_06-a_east"], all_doors["3a_07-a_west"]), + "3a_07-a_top---3a_07-b_bottom": RoomConnection("3a", all_doors["3a_07-a_top"], all_doors["3a_07-b_bottom"]), + "3a_07-a_east---3a_08-a_west": RoomConnection("3a", all_doors["3a_07-a_east"], all_doors["3a_08-a_west"]), + "3a_07-b_west---3a_06-b_east": RoomConnection("3a", all_doors["3a_07-b_west"], all_doors["3a_06-b_east"]), + "3a_06-b_west---3a_06-c_south-west": RoomConnection("3a", all_doors["3a_06-b_west"], all_doors["3a_06-c_south-west"]), + "3a_06-c_north-west---3a_05-c_east": RoomConnection("3a", all_doors["3a_06-c_north-west"], all_doors["3a_05-c_east"]), + "3a_06-c_east---3a_08-c_west": RoomConnection("3a", all_doors["3a_06-c_east"], all_doors["3a_08-c_west"]), + "3a_06-c_south-east---3a_07-b_top": RoomConnection("3a", all_doors["3a_06-c_south-east"], all_doors["3a_07-b_top"]), + "3a_08-c_east---3a_08-b_east": RoomConnection("3a", all_doors["3a_08-c_east"], all_doors["3a_08-b_east"]), + "3a_08-b_west---3a_07-b_east": RoomConnection("3a", all_doors["3a_08-b_west"], all_doors["3a_07-b_east"]), + "3a_08-a_bottom---3a_08-x_west": RoomConnection("3a", all_doors["3a_08-a_bottom"], all_doors["3a_08-x_west"]), + "3a_08-a_east---3a_09-b_west": RoomConnection("3a", all_doors["3a_08-a_east"], all_doors["3a_09-b_west"]), + "3a_09-b_south-east---3a_10-x_north-east-top": RoomConnection("3a", all_doors["3a_09-b_south-east"], all_doors["3a_10-x_north-east-top"]), + "3a_09-b_north-west---3a_09-d_bottom": RoomConnection("3a", all_doors["3a_09-b_north-west"], all_doors["3a_09-d_bottom"]), + "3a_09-b_north-east-top---3a_10-c_south-east": RoomConnection("3a", all_doors["3a_09-b_north-east-top"], all_doors["3a_10-c_south-east"]), + "3a_09-b_east---3a_11-a_west": RoomConnection("3a", all_doors["3a_09-b_east"], all_doors["3a_11-a_west"]), + "3a_09-b_north-east-right---3a_11-b_west": RoomConnection("3a", all_doors["3a_09-b_north-east-right"], all_doors["3a_11-b_west"]), + "3a_10-x_north-east-right---3a_11-x_west": RoomConnection("3a", all_doors["3a_10-x_north-east-right"], all_doors["3a_11-x_west"]), + "3a_11-x_south---3a_11-y_west": RoomConnection("3a", all_doors["3a_11-x_south"], all_doors["3a_11-y_west"]), + "3a_11-y_east---3a_12-y_west": RoomConnection("3a", all_doors["3a_11-y_east"], all_doors["3a_12-y_west"]), + "3a_11-y_south---3a_11-z_east": RoomConnection("3a", all_doors["3a_11-y_south"], all_doors["3a_11-z_east"]), + "3a_11-z_west---3a_10-z_bottom": RoomConnection("3a", all_doors["3a_11-z_west"], all_doors["3a_10-z_bottom"]), + "3a_10-z_top---3a_10-y_bottom": RoomConnection("3a", all_doors["3a_10-z_top"], all_doors["3a_10-y_bottom"]), + "3a_10-y_top---3a_10-x_south-east": RoomConnection("3a", all_doors["3a_10-y_top"], all_doors["3a_10-x_south-east"]), + "3a_10-x_west---3a_09-b_south": RoomConnection("3a", all_doors["3a_10-x_west"], all_doors["3a_09-b_south"]), + "3a_10-c_north-east---3a_11-c_west": RoomConnection("3a", all_doors["3a_10-c_north-east"], all_doors["3a_11-c_west"]), + "3a_10-c_south-west---3a_09-b_north": RoomConnection("3a", all_doors["3a_10-c_south-west"], all_doors["3a_09-b_north"]), + "3a_11-c_east---3a_12-c_west": RoomConnection("3a", all_doors["3a_11-c_east"], all_doors["3a_12-c_west"]), + "3a_11-c_south-west---3a_11-b_north-west": RoomConnection("3a", all_doors["3a_11-c_south-west"], all_doors["3a_11-b_north-west"]), + "3a_12-c_top---3a_12-d_bottom": RoomConnection("3a", all_doors["3a_12-c_top"], all_doors["3a_12-d_bottom"]), + "3a_12-d_top---3a_11-d_east": RoomConnection("3a", all_doors["3a_12-d_top"], all_doors["3a_11-d_east"]), + "3a_11-d_west---3a_10-d_east": RoomConnection("3a", all_doors["3a_11-d_west"], all_doors["3a_10-d_east"]), + "3a_10-d_west---3a_10-c_north-west": RoomConnection("3a", all_doors["3a_10-d_west"], all_doors["3a_10-c_north-west"]), + "3a_11-b_north-east---3a_11-c_south-east": RoomConnection("3a", all_doors["3a_11-b_north-east"], all_doors["3a_11-c_south-east"]), + "3a_11-b_east---3a_12-b_west": RoomConnection("3a", all_doors["3a_11-b_east"], all_doors["3a_12-b_west"]), + "3a_12-b_east---3a_13-b_top": RoomConnection("3a", all_doors["3a_12-b_east"], all_doors["3a_13-b_top"]), + "3a_13-b_bottom---3a_13-a_west": RoomConnection("3a", all_doors["3a_13-b_bottom"], all_doors["3a_13-a_west"]), + "3a_13-a_east---3a_13-x_east": RoomConnection("3a", all_doors["3a_13-a_east"], all_doors["3a_13-x_east"]), + "3a_13-x_west---3a_12-x_east": RoomConnection("3a", all_doors["3a_13-x_west"], all_doors["3a_12-x_east"]), + "3a_12-x_north-east---3a_11-a_south-east-bottom": RoomConnection("3a", all_doors["3a_12-x_north-east"], all_doors["3a_11-a_south-east-bottom"]), + "3a_12-x_west---3a_11-a_south": RoomConnection("3a", all_doors["3a_12-x_west"], all_doors["3a_11-a_south"]), + "3a_11-a_south-east-right---3a_13-a_south-west": RoomConnection("3a", all_doors["3a_11-a_south-east-right"], all_doors["3a_13-a_south-west"]), + "3a_08-x_east---3a_09-b_south-west": RoomConnection("3a", all_doors["3a_08-x_east"], all_doors["3a_09-b_south-west"]), + "3a_09-d_top---3a_08-d_east": RoomConnection("3a", all_doors["3a_09-d_top"], all_doors["3a_08-d_east"]), + "3a_08-d_west---3a_06-d_east": RoomConnection("3a", all_doors["3a_08-d_west"], all_doors["3a_06-d_east"]), + "3a_06-d_west---3a_04-d_east": RoomConnection("3a", all_doors["3a_06-d_west"], all_doors["3a_04-d_east"]), + "3a_04-d_west---3a_02-d_east": RoomConnection("3a", all_doors["3a_04-d_west"], all_doors["3a_02-d_east"]), + "3a_04-d_south---3a_04-c_east": RoomConnection("3a", all_doors["3a_04-d_south"], all_doors["3a_04-c_east"]), + "3a_04-c_west---3a_02-c_east": RoomConnection("3a", all_doors["3a_04-c_west"], all_doors["3a_02-c_east"]), + "3a_04-c_north-west---3a_04-d_south-west": RoomConnection("3a", all_doors["3a_04-c_north-west"], all_doors["3a_04-d_south-west"]), + "3a_02-c_west---3a_01-c_east": RoomConnection("3a", all_doors["3a_02-c_west"], all_doors["3a_01-c_east"]), + "3a_02-c_south-east---3a_03-b_north": RoomConnection("3a", all_doors["3a_02-c_south-east"], all_doors["3a_03-b_north"]), + "3a_03-b_east---3a_04-b_west": RoomConnection("3a", all_doors["3a_03-b_east"], all_doors["3a_04-b_west"]), + "3a_03-b_west---3a_02-b_far-east": RoomConnection("3a", all_doors["3a_03-b_west"], all_doors["3a_02-b_far-east"]), + "3a_02-d_west---3a_00-d_east": RoomConnection("3a", all_doors["3a_02-d_west"], all_doors["3a_00-d_east"]), + "3a_00-d_west---3a_roof00_west": RoomConnection("3a", all_doors["3a_00-d_west"], all_doors["3a_roof00_west"]), + "3a_roof00_east---3a_roof01_west": RoomConnection("3a", all_doors["3a_roof00_east"], all_doors["3a_roof01_west"]), + "3a_roof01_east---3a_roof02_west": RoomConnection("3a", all_doors["3a_roof01_east"], all_doors["3a_roof02_west"]), + "3a_roof02_east---3a_roof03_west": RoomConnection("3a", all_doors["3a_roof02_east"], all_doors["3a_roof03_west"]), + "3a_roof03_east---3a_roof04_west": RoomConnection("3a", all_doors["3a_roof03_east"], all_doors["3a_roof04_west"]), + "3a_roof04_east---3a_roof05_west": RoomConnection("3a", all_doors["3a_roof04_east"], all_doors["3a_roof05_west"]), + "3a_roof05_east---3a_roof06b_west": RoomConnection("3a", all_doors["3a_roof05_east"], all_doors["3a_roof06b_west"]), + "3a_roof06b_east---3a_roof06_west": RoomConnection("3a", all_doors["3a_roof06b_east"], all_doors["3a_roof06_west"]), + "3a_roof06_east---3a_roof07_west": RoomConnection("3a", all_doors["3a_roof06_east"], all_doors["3a_roof07_west"]), + + "3b_00_east---3b_01_west": RoomConnection("3b", all_doors["3b_00_east"], all_doors["3b_01_west"]), + "3b_00_west---3b_back_east": RoomConnection("3b", all_doors["3b_00_west"], all_doors["3b_back_east"]), + "3b_01_east---3b_02_west": RoomConnection("3b", all_doors["3b_01_east"], all_doors["3b_02_west"]), + "3b_02_east---3b_03_west": RoomConnection("3b", all_doors["3b_02_east"], all_doors["3b_03_west"]), + "3b_03_east---3b_04_west": RoomConnection("3b", all_doors["3b_03_east"], all_doors["3b_04_west"]), + "3b_04_east---3b_05_west": RoomConnection("3b", all_doors["3b_04_east"], all_doors["3b_05_west"]), + "3b_05_east---3b_06_west": RoomConnection("3b", all_doors["3b_05_east"], all_doors["3b_06_west"]), + "3b_06_east---3b_07_west": RoomConnection("3b", all_doors["3b_06_east"], all_doors["3b_07_west"]), + "3b_07_east---3b_08_bottom": RoomConnection("3b", all_doors["3b_07_east"], all_doors["3b_08_bottom"]), + "3b_08_top---3b_09_west": RoomConnection("3b", all_doors["3b_08_top"], all_doors["3b_09_west"]), + "3b_09_east---3b_10_west": RoomConnection("3b", all_doors["3b_09_east"], all_doors["3b_10_west"]), + "3b_10_east---3b_11_west": RoomConnection("3b", all_doors["3b_10_east"], all_doors["3b_11_west"]), + "3b_11_east---3b_13_west": RoomConnection("3b", all_doors["3b_11_east"], all_doors["3b_13_west"]), + "3b_13_east---3b_14_west": RoomConnection("3b", all_doors["3b_13_east"], all_doors["3b_14_west"]), + "3b_14_east---3b_15_west": RoomConnection("3b", all_doors["3b_14_east"], all_doors["3b_15_west"]), + "3b_15_east---3b_12_west": RoomConnection("3b", all_doors["3b_15_east"], all_doors["3b_12_west"]), + "3b_12_east---3b_16_west": RoomConnection("3b", all_doors["3b_12_east"], all_doors["3b_16_west"]), + "3b_16_top---3b_17_west": RoomConnection("3b", all_doors["3b_16_top"], all_doors["3b_17_west"]), + "3b_17_east---3b_18_west": RoomConnection("3b", all_doors["3b_17_east"], all_doors["3b_18_west"]), + "3b_18_east---3b_19_west": RoomConnection("3b", all_doors["3b_18_east"], all_doors["3b_19_west"]), + "3b_19_east---3b_21_west": RoomConnection("3b", all_doors["3b_19_east"], all_doors["3b_21_west"]), + "3b_21_east---3b_20_west": RoomConnection("3b", all_doors["3b_21_east"], all_doors["3b_20_west"]), + "3b_20_east---3b_end_west": RoomConnection("3b", all_doors["3b_20_east"], all_doors["3b_end_west"]), + + "3c_00_east---3c_01_west": RoomConnection("3c", all_doors["3c_00_east"], all_doors["3c_01_west"]), + "3c_01_east---3c_02_west": RoomConnection("3c", all_doors["3c_01_east"], all_doors["3c_02_west"]), + + "4a_a-00_east---4a_a-01_west": RoomConnection("4a", all_doors["4a_a-00_east"], all_doors["4a_a-01_west"]), + "4a_a-01_east---4a_a-01x_west": RoomConnection("4a", all_doors["4a_a-01_east"], all_doors["4a_a-01x_west"]), + "4a_a-01x_east---4a_a-02_west": RoomConnection("4a", all_doors["4a_a-01x_east"], all_doors["4a_a-02_west"]), + "4a_a-02_east---4a_a-03_west": RoomConnection("4a", all_doors["4a_a-02_east"], all_doors["4a_a-03_west"]), + "4a_a-03_east---4a_a-04_west": RoomConnection("4a", all_doors["4a_a-03_east"], all_doors["4a_a-04_west"]), + "4a_a-04_east---4a_a-05_west": RoomConnection("4a", all_doors["4a_a-04_east"], all_doors["4a_a-05_west"]), + "4a_a-05_east---4a_a-06_west": RoomConnection("4a", all_doors["4a_a-05_east"], all_doors["4a_a-06_west"]), + "4a_a-06_east---4a_a-07_west": RoomConnection("4a", all_doors["4a_a-06_east"], all_doors["4a_a-07_west"]), + "4a_a-07_east---4a_a-08_west": RoomConnection("4a", all_doors["4a_a-07_east"], all_doors["4a_a-08_west"]), + "4a_a-08_north-west---4a_a-10_east": RoomConnection("4a", all_doors["4a_a-08_north-west"], all_doors["4a_a-10_east"]), + "4a_a-08_east---4a_a-09_bottom": RoomConnection("4a", all_doors["4a_a-08_east"], all_doors["4a_a-09_bottom"]), + "4a_a-10_west---4a_a-11_east": RoomConnection("4a", all_doors["4a_a-10_west"], all_doors["4a_a-11_east"]), + "4a_a-09_top---4a_b-00_south": RoomConnection("4a", all_doors["4a_a-09_top"], all_doors["4a_b-00_south"]), + "4a_b-00_south-east---4a_b-01_west": RoomConnection("4a", all_doors["4a_b-00_south-east"], all_doors["4a_b-01_west"]), + "4a_b-00_north-west---4a_b-04_east": RoomConnection("4a", all_doors["4a_b-00_north-west"], all_doors["4a_b-04_east"]), + "4a_b-04_west---4a_b-06_east": RoomConnection("4a", all_doors["4a_b-04_west"], all_doors["4a_b-06_east"]), + "4a_b-06_west---4a_b-07_west": RoomConnection("4a", all_doors["4a_b-06_west"], all_doors["4a_b-07_west"]), + "4a_b-07_east---4a_b-03_west": RoomConnection("4a", all_doors["4a_b-07_east"], all_doors["4a_b-03_west"]), + "4a_b-03_east---4a_b-00_west": RoomConnection("4a", all_doors["4a_b-03_east"], all_doors["4a_b-00_west"]), + "4a_b-00_east---4a_b-02_south-west": RoomConnection("4a", all_doors["4a_b-00_east"], all_doors["4a_b-02_south-west"]), + "4a_b-00_north-east---4a_b-02_north-west": RoomConnection("4a", all_doors["4a_b-00_north-east"], all_doors["4a_b-02_north-west"]), + "4a_b-02_north-east---4a_b-sec_west": RoomConnection("4a", all_doors["4a_b-02_north-east"], all_doors["4a_b-sec_west"]), + "4a_b-sec_east---4a_b-secb_west": RoomConnection("4a", all_doors["4a_b-sec_east"], all_doors["4a_b-secb_west"]), + "4a_b-00_north---4a_b-05_center": RoomConnection("4a", all_doors["4a_b-00_north"], all_doors["4a_b-05_center"]), + "4a_b-05_west---4a_b-04_north-west": RoomConnection("4a", all_doors["4a_b-05_west"], all_doors["4a_b-04_north-west"]), + "4a_b-02_north---4a_b-05_east": RoomConnection("4a", all_doors["4a_b-02_north"], all_doors["4a_b-05_east"]), + "4a_b-05_north-east---4a_b-08b_west": RoomConnection("4a", all_doors["4a_b-05_north-east"], all_doors["4a_b-08b_west"]), + "4a_b-08b_east---4a_b-08_west": RoomConnection("4a", all_doors["4a_b-08b_east"], all_doors["4a_b-08_west"]), + "4a_b-08_east---4a_c-00_west": RoomConnection("4a", all_doors["4a_b-08_east"], all_doors["4a_c-00_west"]), + "4a_c-00_north-west---4a_c-01_east": RoomConnection("4a", all_doors["4a_c-00_north-west"], all_doors["4a_c-01_east"]), + "4a_c-00_east---4a_c-02_west": RoomConnection("4a", all_doors["4a_c-00_east"], all_doors["4a_c-02_west"]), + "4a_c-02_east---4a_c-04_west": RoomConnection("4a", all_doors["4a_c-02_east"], all_doors["4a_c-04_west"]), + "4a_c-04_east---4a_c-05_west": RoomConnection("4a", all_doors["4a_c-04_east"], all_doors["4a_c-05_west"]), + "4a_c-05_east---4a_c-06_bottom": RoomConnection("4a", all_doors["4a_c-05_east"], all_doors["4a_c-06_bottom"]), + "4a_c-06_west---4a_c-06b_east": RoomConnection("4a", all_doors["4a_c-06_west"], all_doors["4a_c-06b_east"]), + "4a_c-06_top---4a_c-09_west": RoomConnection("4a", all_doors["4a_c-06_top"], all_doors["4a_c-09_west"]), + "4a_c-09_east---4a_c-07_west": RoomConnection("4a", all_doors["4a_c-09_east"], all_doors["4a_c-07_west"]), + "4a_c-07_east---4a_c-08_bottom": RoomConnection("4a", all_doors["4a_c-07_east"], all_doors["4a_c-08_bottom"]), + "4a_c-08_east---4a_c-10_bottom": RoomConnection("4a", all_doors["4a_c-08_east"], all_doors["4a_c-10_bottom"]), + "4a_c-08_top---4a_d-00_west": RoomConnection("4a", all_doors["4a_c-08_top"], all_doors["4a_d-00_west"]), + "4a_c-10_top---4a_d-00_south": RoomConnection("4a", all_doors["4a_c-10_top"], all_doors["4a_d-00_south"]), + "4a_d-00_north-west---4a_d-00b_east": RoomConnection("4a", all_doors["4a_d-00_north-west"], all_doors["4a_d-00b_east"]), + "4a_d-00_east---4a_d-01_west": RoomConnection("4a", all_doors["4a_d-00_east"], all_doors["4a_d-01_west"]), + "4a_d-01_east---4a_d-02_west": RoomConnection("4a", all_doors["4a_d-01_east"], all_doors["4a_d-02_west"]), + "4a_d-02_east---4a_d-03_west": RoomConnection("4a", all_doors["4a_d-02_east"], all_doors["4a_d-03_west"]), + "4a_d-03_east---4a_d-04_west": RoomConnection("4a", all_doors["4a_d-03_east"], all_doors["4a_d-04_west"]), + "4a_d-04_east---4a_d-05_west": RoomConnection("4a", all_doors["4a_d-04_east"], all_doors["4a_d-05_west"]), + "4a_d-05_east---4a_d-06_west": RoomConnection("4a", all_doors["4a_d-05_east"], all_doors["4a_d-06_west"]), + "4a_d-06_east---4a_d-07_west": RoomConnection("4a", all_doors["4a_d-06_east"], all_doors["4a_d-07_west"]), + "4a_d-07_east---4a_d-08_west": RoomConnection("4a", all_doors["4a_d-07_east"], all_doors["4a_d-08_west"]), + "4a_d-08_east---4a_d-09_west": RoomConnection("4a", all_doors["4a_d-08_east"], all_doors["4a_d-09_west"]), + "4a_d-09_east---4a_d-10_west": RoomConnection("4a", all_doors["4a_d-09_east"], all_doors["4a_d-10_west"]), + + "4b_a-00_east---4b_a-01_west": RoomConnection("4b", all_doors["4b_a-00_east"], all_doors["4b_a-01_west"]), + "4b_a-01_east---4b_a-02_west": RoomConnection("4b", all_doors["4b_a-01_east"], all_doors["4b_a-02_west"]), + "4b_a-02_east---4b_a-03_west": RoomConnection("4b", all_doors["4b_a-02_east"], all_doors["4b_a-03_west"]), + "4b_a-03_east---4b_a-04_west": RoomConnection("4b", all_doors["4b_a-03_east"], all_doors["4b_a-04_west"]), + "4b_a-04_east---4b_b-00_west": RoomConnection("4b", all_doors["4b_a-04_east"], all_doors["4b_b-00_west"]), + "4b_b-00_east---4b_b-01_west": RoomConnection("4b", all_doors["4b_b-00_east"], all_doors["4b_b-01_west"]), + "4b_b-01_east---4b_b-02_bottom": RoomConnection("4b", all_doors["4b_b-01_east"], all_doors["4b_b-02_bottom"]), + "4b_b-02_top---4b_b-03_west": RoomConnection("4b", all_doors["4b_b-02_top"], all_doors["4b_b-03_west"]), + "4b_b-03_east---4b_b-04_west": RoomConnection("4b", all_doors["4b_b-03_east"], all_doors["4b_b-04_west"]), + "4b_b-04_east---4b_c-00_west": RoomConnection("4b", all_doors["4b_b-04_east"], all_doors["4b_c-00_west"]), + "4b_c-00_east---4b_c-01_west": RoomConnection("4b", all_doors["4b_c-00_east"], all_doors["4b_c-01_west"]), + "4b_c-01_east---4b_c-02_west": RoomConnection("4b", all_doors["4b_c-01_east"], all_doors["4b_c-02_west"]), + "4b_c-02_east---4b_c-03_bottom": RoomConnection("4b", all_doors["4b_c-02_east"], all_doors["4b_c-03_bottom"]), + "4b_c-03_top---4b_c-04_west": RoomConnection("4b", all_doors["4b_c-03_top"], all_doors["4b_c-04_west"]), + "4b_c-04_east---4b_d-00_west": RoomConnection("4b", all_doors["4b_c-04_east"], all_doors["4b_d-00_west"]), + "4b_d-00_east---4b_d-01_west": RoomConnection("4b", all_doors["4b_d-00_east"], all_doors["4b_d-01_west"]), + "4b_d-01_east---4b_d-02_west": RoomConnection("4b", all_doors["4b_d-01_east"], all_doors["4b_d-02_west"]), + "4b_d-02_east---4b_d-03_west": RoomConnection("4b", all_doors["4b_d-02_east"], all_doors["4b_d-03_west"]), + "4b_d-03_east---4b_end_west": RoomConnection("4b", all_doors["4b_d-03_east"], all_doors["4b_end_west"]), + + "4c_00_east---4c_01_west": RoomConnection("4c", all_doors["4c_00_east"], all_doors["4c_01_west"]), + "4c_01_east---4c_02_west": RoomConnection("4c", all_doors["4c_01_east"], all_doors["4c_02_west"]), + + "5a_a-00b_west---5a_a-00x_east": RoomConnection("5a", all_doors["5a_a-00b_west"], all_doors["5a_a-00x_east"]), + "5a_a-00b_east---5a_a-00d_west": RoomConnection("5a", all_doors["5a_a-00b_east"], all_doors["5a_a-00d_west"]), + "5a_a-00d_east---5a_a-00c_west": RoomConnection("5a", all_doors["5a_a-00d_east"], all_doors["5a_a-00c_west"]), + "5a_a-00c_east---5a_a-00_west": RoomConnection("5a", all_doors["5a_a-00c_east"], all_doors["5a_a-00_west"]), + "5a_a-00_east---5a_a-01_west": RoomConnection("5a", all_doors["5a_a-00_east"], all_doors["5a_a-01_west"]), + "5a_a-01_east---5a_a-13_west": RoomConnection("5a", all_doors["5a_a-01_east"], all_doors["5a_a-13_west"]), + "5a_a-01_south-west---5a_a-04_north": RoomConnection("5a", all_doors["5a_a-01_south-west"], all_doors["5a_a-04_north"]), + "5a_a-01_south-east---5a_a-02_north": RoomConnection("5a", all_doors["5a_a-01_south-east"], all_doors["5a_a-02_north"]), + "5a_a-01_north---5a_a-08_south": RoomConnection("5a", all_doors["5a_a-01_north"], all_doors["5a_a-08_south"]), + "5a_a-02_west---5a_a-03_east": RoomConnection("5a", all_doors["5a_a-02_west"], all_doors["5a_a-03_east"]), + "5a_a-02_south---5a_a-05_north-east": RoomConnection("5a", all_doors["5a_a-02_south"], all_doors["5a_a-05_north-east"]), + "5a_a-04_east---5a_a-03_west": RoomConnection("5a", all_doors["5a_a-04_east"], all_doors["5a_a-03_west"]), + "5a_a-04_south---5a_a-05_north-west": RoomConnection("5a", all_doors["5a_a-04_south"], all_doors["5a_a-05_north-west"]), + "5a_a-05_south-west---5a_a-07_east": RoomConnection("5a", all_doors["5a_a-05_south-west"], all_doors["5a_a-07_east"]), + "5a_a-05_south-east---5a_a-06_west": RoomConnection("5a", all_doors["5a_a-05_south-east"], all_doors["5a_a-06_west"]), + "5a_a-08_west---5a_a-10_east": RoomConnection("5a", all_doors["5a_a-08_west"], all_doors["5a_a-10_east"]), + "5a_a-08_north---5a_a-14_south": RoomConnection("5a", all_doors["5a_a-08_north"], all_doors["5a_a-14_south"]), + "5a_a-08_north-east---5a_a-12_north-west": RoomConnection("5a", all_doors["5a_a-08_north-east"], all_doors["5a_a-12_north-west"]), + "5a_a-08_south-east---5a_a-12_south-west": RoomConnection("5a", all_doors["5a_a-08_south-east"], all_doors["5a_a-12_south-west"]), + "5a_a-10_west---5a_a-09_east": RoomConnection("5a", all_doors["5a_a-10_west"], all_doors["5a_a-09_east"]), + "5a_a-09_west---5a_a-11_east": RoomConnection("5a", all_doors["5a_a-09_west"], all_doors["5a_a-11_east"]), + "5a_a-12_west---5a_a-08_east": RoomConnection("5a", all_doors["5a_a-12_west"], all_doors["5a_a-08_east"]), + "5a_a-12_east---5a_a-15_south": RoomConnection("5a", all_doors["5a_a-12_east"], all_doors["5a_a-15_south"]), + "5a_a-13_east---5a_b-00_west": RoomConnection("5a", all_doors["5a_a-13_east"], all_doors["5a_b-00_west"]), + "5a_b-00_north-west---5a_b-18_south": RoomConnection("5a", all_doors["5a_b-00_north-west"], all_doors["5a_b-18_south"]), + "5a_b-00_east---5a_b-01_south-west": RoomConnection("5a", all_doors["5a_b-00_east"], all_doors["5a_b-01_south-west"]), + "5a_b-01_west---5a_b-20_west": RoomConnection("5a", all_doors["5a_b-01_west"], all_doors["5a_b-20_west"]), + "5a_b-01_north---5a_b-20_south": RoomConnection("5a", all_doors["5a_b-01_north"], all_doors["5a_b-20_south"]), + "5a_b-01_north-east---5a_b-20_east": RoomConnection("5a", all_doors["5a_b-01_north-east"], all_doors["5a_b-20_east"]), + "5a_b-01_east---5a_b-01b_west": RoomConnection("5a", all_doors["5a_b-01_east"], all_doors["5a_b-01b_west"]), + "5a_b-01_south---5a_b-01c_west": RoomConnection("5a", all_doors["5a_b-01_south"], all_doors["5a_b-01c_west"]), + "5a_b-01c_east---5a_b-01_south-east": RoomConnection("5a", all_doors["5a_b-01c_east"], all_doors["5a_b-01_south-east"]), + "5a_b-20_south-west---5a_b-01_north-west": RoomConnection("5a", all_doors["5a_b-20_south-west"], all_doors["5a_b-01_north-west"]), + "5a_b-20_north-west---5a_b-21_east": RoomConnection("5a", all_doors["5a_b-20_north-west"], all_doors["5a_b-21_east"]), + "5a_b-01b_east---5a_b-02_west": RoomConnection("5a", all_doors["5a_b-01b_east"], all_doors["5a_b-02_west"]), + "5a_b-02_north-west---5a_b-03_east": RoomConnection("5a", all_doors["5a_b-02_north-west"], all_doors["5a_b-03_east"]), + "5a_b-02_north---5a_b-04_south": RoomConnection("5a", all_doors["5a_b-02_north"], all_doors["5a_b-04_south"]), + "5a_b-02_north-east---5a_b-05_west": RoomConnection("5a", all_doors["5a_b-02_north-east"], all_doors["5a_b-05_west"]), + "5a_b-02_east-upper---5a_b-06_west": RoomConnection("5a", all_doors["5a_b-02_east-upper"], all_doors["5a_b-06_west"]), + "5a_b-02_east-lower---5a_b-11_north-west": RoomConnection("5a", all_doors["5a_b-02_east-lower"], all_doors["5a_b-11_north-west"]), + "5a_b-02_south-east---5a_b-11_west": RoomConnection("5a", all_doors["5a_b-02_south-east"], all_doors["5a_b-11_west"]), + "5a_b-02_south---5a_b-10_east": RoomConnection("5a", all_doors["5a_b-02_south"], all_doors["5a_b-10_east"]), + "5a_b-04_west---5a_b-07_south": RoomConnection("5a", all_doors["5a_b-04_west"], all_doors["5a_b-07_south"]), + "5a_b-07_north---5a_b-08_west": RoomConnection("5a", all_doors["5a_b-07_north"], all_doors["5a_b-08_west"]), + "5a_b-08_east---5a_b-09_north": RoomConnection("5a", all_doors["5a_b-08_east"], all_doors["5a_b-09_north"]), + "5a_b-09_south---5a_b-04_east": RoomConnection("5a", all_doors["5a_b-09_south"], all_doors["5a_b-04_east"]), + "5a_b-11_south-west---5a_b-12_west": RoomConnection("5a", all_doors["5a_b-11_south-west"], all_doors["5a_b-12_west"]), + "5a_b-11_south-east---5a_b-12_east": RoomConnection("5a", all_doors["5a_b-11_south-east"], all_doors["5a_b-12_east"]), + "5a_b-11_east---5a_b-13_west": RoomConnection("5a", all_doors["5a_b-11_east"], all_doors["5a_b-13_west"]), + "5a_b-13_east---5a_b-17_west": RoomConnection("5a", all_doors["5a_b-13_east"], all_doors["5a_b-17_west"]), + "5a_b-13_north-east---5a_b-17_north-west": RoomConnection("5a", all_doors["5a_b-13_north-east"], all_doors["5a_b-17_north-west"]), + "5a_b-17_east---5a_b-22_west": RoomConnection("5a", all_doors["5a_b-17_east"], all_doors["5a_b-22_west"]), + "5a_b-06_east---5a_b-19_west": RoomConnection("5a", all_doors["5a_b-06_east"], all_doors["5a_b-19_west"]), + "5a_b-06_north-east---5a_b-19_north-west": RoomConnection("5a", all_doors["5a_b-06_north-east"], all_doors["5a_b-19_north-west"]), + "5a_b-19_east---5a_b-14_west": RoomConnection("5a", all_doors["5a_b-19_east"], all_doors["5a_b-14_west"]), + "5a_b-14_south---5a_b-15_west": RoomConnection("5a", all_doors["5a_b-14_south"], all_doors["5a_b-15_west"]), + "5a_b-14_north---5a_b-16_bottom": RoomConnection("5a", all_doors["5a_b-14_north"], all_doors["5a_b-16_bottom"]), + "5a_b-16_mirror---5a_void_east": RoomConnection("5a", all_doors["5a_b-16_mirror"], all_doors["5a_void_east"]), + "5a_void_west---5a_c-00_top": RoomConnection("5a", all_doors["5a_void_west"], all_doors["5a_c-00_top"]), + "5a_c-00_bottom---5a_c-01_west": RoomConnection("5a", all_doors["5a_c-00_bottom"], all_doors["5a_c-01_west"]), + "5a_c-01_east---5a_c-01b_west": RoomConnection("5a", all_doors["5a_c-01_east"], all_doors["5a_c-01b_west"]), + "5a_c-01b_east---5a_c-01c_west": RoomConnection("5a", all_doors["5a_c-01b_east"], all_doors["5a_c-01c_west"]), + "5a_c-01c_east---5a_c-08b_west": RoomConnection("5a", all_doors["5a_c-01c_east"], all_doors["5a_c-08b_west"]), + "5a_c-08b_east---5a_c-08_west": RoomConnection("5a", all_doors["5a_c-08b_east"], all_doors["5a_c-08_west"]), + "5a_c-08_east---5a_c-10_west": RoomConnection("5a", all_doors["5a_c-08_east"], all_doors["5a_c-10_west"]), + "5a_c-10_east---5a_c-12_west": RoomConnection("5a", all_doors["5a_c-10_east"], all_doors["5a_c-12_west"]), + "5a_c-12_east---5a_c-07_west": RoomConnection("5a", all_doors["5a_c-12_east"], all_doors["5a_c-07_west"]), + "5a_c-07_east---5a_c-11_west": RoomConnection("5a", all_doors["5a_c-07_east"], all_doors["5a_c-11_west"]), + "5a_c-11_east---5a_c-09_west": RoomConnection("5a", all_doors["5a_c-11_east"], all_doors["5a_c-09_west"]), + "5a_c-09_east---5a_c-13_west": RoomConnection("5a", all_doors["5a_c-09_east"], all_doors["5a_c-13_west"]), + "5a_c-13_east---5a_d-00_south": RoomConnection("5a", all_doors["5a_c-13_east"], all_doors["5a_d-00_south"]), + "5a_d-00_north---5a_d-01_south": RoomConnection("5a", all_doors["5a_d-00_north"], all_doors["5a_d-01_south"]), + "5a_d-00_west---5a_d-05_east": RoomConnection("5a", all_doors["5a_d-00_west"], all_doors["5a_d-05_east"]), + "5a_d-05_south---5a_d-02_east": RoomConnection("5a", all_doors["5a_d-05_south"], all_doors["5a_d-02_east"]), + "5a_d-01_north-west---5a_d-09_east": RoomConnection("5a", all_doors["5a_d-01_north-west"], all_doors["5a_d-09_east"]), + "5a_d-01_west---5a_d-09_east": RoomConnection("5a", all_doors["5a_d-01_west"], all_doors["5a_d-09_east"]), + "5a_d-01_south-west-down---5a_d-05_north": RoomConnection("5a", all_doors["5a_d-01_south-west-down"], all_doors["5a_d-05_north"]), + "5a_d-01_south-east-down---5a_d-07_north": RoomConnection("5a", all_doors["5a_d-01_south-east-down"], all_doors["5a_d-07_north"]), + "5a_d-01_south-east-right---5a_d-15_south-west": RoomConnection("5a", all_doors["5a_d-01_south-east-right"], all_doors["5a_d-15_south-west"]), + "5a_d-01_east---5a_d-15_west": RoomConnection("5a", all_doors["5a_d-01_east"], all_doors["5a_d-15_west"]), + "5a_d-01_north-east---5a_d-15_north-west": RoomConnection("5a", all_doors["5a_d-01_north-east"], all_doors["5a_d-15_north-west"]), + "5a_d-09_west---5a_d-04_north": RoomConnection("5a", all_doors["5a_d-09_west"], all_doors["5a_d-04_north"]), + "5a_d-04_west---5a_d-19b_south-east-right": RoomConnection("5a", all_doors["5a_d-04_west"], all_doors["5a_d-19b_south-east-right"]), + "5a_d-04_south-east---5a_d-01_south-west-left": RoomConnection("5a", all_doors["5a_d-04_south-east"], all_doors["5a_d-01_south-west-left"]), + "5a_d-05_west---5a_d-06_south-east": RoomConnection("5a", all_doors["5a_d-05_west"], all_doors["5a_d-06_south-east"]), + "5a_d-05_south---5a_d-02_east": RoomConnection("5a", all_doors["5a_d-05_south"], all_doors["5a_d-02_east"]), + "5a_d-06_north-east---5a_d-04_south-west-right": RoomConnection("5a", all_doors["5a_d-06_north-east"], all_doors["5a_d-04_south-west-right"]), + "5a_d-06_north-west---5a_d-04_south-west-left": RoomConnection("5a", all_doors["5a_d-06_north-west"], all_doors["5a_d-04_south-west-left"]), + "5a_d-07_west---5a_d-00_east": RoomConnection("5a", all_doors["5a_d-07_west"], all_doors["5a_d-00_east"]), + "5a_d-02_west---5a_d-03_east": RoomConnection("5a", all_doors["5a_d-02_west"], all_doors["5a_d-03_east"]), + "5a_d-03_west---5a_d-06_south-west": RoomConnection("5a", all_doors["5a_d-03_west"], all_doors["5a_d-06_south-west"]), + "5a_d-15_south-east---5a_d-13_east": RoomConnection("5a", all_doors["5a_d-15_south-east"], all_doors["5a_d-13_east"]), + "5a_d-13_west---5a_d-15_south": RoomConnection("5a", all_doors["5a_d-13_west"], all_doors["5a_d-15_south"]), + "5a_d-19b_south-east-down---5a_d-19_east": RoomConnection("5a", all_doors["5a_d-19b_south-east-down"], all_doors["5a_d-19_east"]), + "5a_d-19b_north-east---5a_d-10_west": RoomConnection("5a", all_doors["5a_d-19b_north-east"], all_doors["5a_d-10_west"]), + "5a_d-19_west---5a_d-19b_south-west": RoomConnection("5a", all_doors["5a_d-19_west"], all_doors["5a_d-19b_south-west"]), + "5a_d-10_east---5a_d-20_west": RoomConnection("5a", all_doors["5a_d-10_east"], all_doors["5a_d-20_west"]), + "5a_d-20_east---5a_e-00_west": RoomConnection("5a", all_doors["5a_d-20_east"], all_doors["5a_e-00_west"]), + "5a_e-00_east---5a_e-01_west": RoomConnection("5a", all_doors["5a_e-00_east"], all_doors["5a_e-01_west"]), + "5a_e-01_east---5a_e-02_west": RoomConnection("5a", all_doors["5a_e-01_east"], all_doors["5a_e-02_west"]), + "5a_e-02_east---5a_e-03_west": RoomConnection("5a", all_doors["5a_e-02_east"], all_doors["5a_e-03_west"]), + "5a_e-03_east---5a_e-04_west": RoomConnection("5a", all_doors["5a_e-03_east"], all_doors["5a_e-04_west"]), + "5a_e-04_east---5a_e-06_west": RoomConnection("5a", all_doors["5a_e-04_east"], all_doors["5a_e-06_west"]), + "5a_e-06_east---5a_e-05_west": RoomConnection("5a", all_doors["5a_e-06_east"], all_doors["5a_e-05_west"]), + "5a_e-05_east---5a_e-07_west": RoomConnection("5a", all_doors["5a_e-05_east"], all_doors["5a_e-07_west"]), + "5a_e-07_east---5a_e-08_west": RoomConnection("5a", all_doors["5a_e-07_east"], all_doors["5a_e-08_west"]), + "5a_e-08_east---5a_e-09_west": RoomConnection("5a", all_doors["5a_e-08_east"], all_doors["5a_e-09_west"]), + "5a_e-09_east---5a_e-10_west": RoomConnection("5a", all_doors["5a_e-09_east"], all_doors["5a_e-10_west"]), + "5a_e-10_east---5a_e-11_west": RoomConnection("5a", all_doors["5a_e-10_east"], all_doors["5a_e-11_west"]), + + "5b_start_east---5b_a-00_west": RoomConnection("5b", all_doors["5b_start_east"], all_doors["5b_a-00_west"]), + "5b_a-00_east---5b_a-01_west": RoomConnection("5b", all_doors["5b_a-00_east"], all_doors["5b_a-01_west"]), + "5b_a-01_east---5b_a-02_west": RoomConnection("5b", all_doors["5b_a-01_east"], all_doors["5b_a-02_west"]), + "5b_a-02_east---5b_b-00_south": RoomConnection("5b", all_doors["5b_a-02_east"], all_doors["5b_b-00_south"]), + "5b_b-00_east---5b_b-01_west": RoomConnection("5b", all_doors["5b_b-00_east"], all_doors["5b_b-01_west"]), + "5b_b-00_north---5b_b-02_south": RoomConnection("5b", all_doors["5b_b-00_north"], all_doors["5b_b-02_south"]), + "5b_b-00_west---5b_b-06_east": RoomConnection("5b", all_doors["5b_b-00_west"], all_doors["5b_b-06_east"]), + "5b_b-01_north---5b_b-04_east": RoomConnection("5b", all_doors["5b_b-01_north"], all_doors["5b_b-04_east"]), + "5b_b-01_east---5b_b-07_south": RoomConnection("5b", all_doors["5b_b-01_east"], all_doors["5b_b-07_south"]), + "5b_b-04_west---5b_b-02_south-east": RoomConnection("5b", all_doors["5b_b-04_west"], all_doors["5b_b-02_south-east"]), + "5b_b-02_north-west---5b_b-05_north": RoomConnection("5b", all_doors["5b_b-02_north-west"], all_doors["5b_b-05_north"]), + "5b_b-02_north-east---5b_b-03_west": RoomConnection("5b", all_doors["5b_b-02_north-east"], all_doors["5b_b-03_west"]), + "5b_b-02_north---5b_b-08_south": RoomConnection("5b", all_doors["5b_b-02_north"], all_doors["5b_b-08_south"]), + "5b_b-05_south---5b_b-02_south-west": RoomConnection("5b", all_doors["5b_b-05_south"], all_doors["5b_b-02_south-west"]), + "5b_b-07_north---5b_b-03_east": RoomConnection("5b", all_doors["5b_b-07_north"], all_doors["5b_b-03_east"]), + "5b_b-03_north---5b_b-08_east": RoomConnection("5b", all_doors["5b_b-03_north"], all_doors["5b_b-08_east"]), + "5b_b-08_north---5b_b-09_bottom": RoomConnection("5b", all_doors["5b_b-08_north"], all_doors["5b_b-09_bottom"]), + "5b_b-09_mirror---5b_c-00_mirror": RoomConnection("5b", all_doors["5b_b-09_mirror"], all_doors["5b_c-00_mirror"]), + "5b_c-00_bottom---5b_c-01_west": RoomConnection("5b", all_doors["5b_c-00_bottom"], all_doors["5b_c-01_west"]), + "5b_c-01_east---5b_c-02_west": RoomConnection("5b", all_doors["5b_c-01_east"], all_doors["5b_c-02_west"]), + "5b_c-02_east---5b_c-03_west": RoomConnection("5b", all_doors["5b_c-02_east"], all_doors["5b_c-03_west"]), + "5b_c-03_east---5b_c-04_west": RoomConnection("5b", all_doors["5b_c-03_east"], all_doors["5b_c-04_west"]), + "5b_c-04_east---5b_d-00_west": RoomConnection("5b", all_doors["5b_c-04_east"], all_doors["5b_d-00_west"]), + "5b_d-00_east---5b_d-01_west": RoomConnection("5b", all_doors["5b_d-00_east"], all_doors["5b_d-01_west"]), + "5b_d-00_east---5b_d-01_west": RoomConnection("5b", all_doors["5b_d-00_east"], all_doors["5b_d-01_west"]), + "5b_d-01_east---5b_d-02_west": RoomConnection("5b", all_doors["5b_d-01_east"], all_doors["5b_d-02_west"]), + "5b_d-02_east---5b_d-03_west": RoomConnection("5b", all_doors["5b_d-02_east"], all_doors["5b_d-03_west"]), + "5b_d-03_east---5b_d-04_west": RoomConnection("5b", all_doors["5b_d-03_east"], all_doors["5b_d-04_west"]), + "5b_d-04_east---5b_d-05_west": RoomConnection("5b", all_doors["5b_d-04_east"], all_doors["5b_d-05_west"]), + + "5c_00_east---5c_01_west": RoomConnection("5c", all_doors["5c_00_east"], all_doors["5c_01_west"]), + "5c_01_east---5c_02_west": RoomConnection("5c", all_doors["5c_01_east"], all_doors["5c_02_west"]), + + "6a_00_west---6a_01_bottom": RoomConnection("6a", all_doors["6a_00_west"], all_doors["6a_01_bottom"]), + "6a_01_top---6a_02_bottom": RoomConnection("6a", all_doors["6a_01_top"], all_doors["6a_02_bottom"]), + "6a_02_bottom-west---6a_03_bottom": RoomConnection("6a", all_doors["6a_02_bottom-west"], all_doors["6a_03_bottom"]), + "6a_02_top---6a_02b_bottom": RoomConnection("6a", all_doors["6a_02_top"], all_doors["6a_02b_bottom"]), + "6a_03_top---6a_02_top-west": RoomConnection("6a", all_doors["6a_03_top"], all_doors["6a_02_top-west"]), + "6a_02b_top---6a_04_south": RoomConnection("6a", all_doors["6a_02b_top"], all_doors["6a_04_south"]), + "6a_04_north-west---6a_04b_east": RoomConnection("6a", all_doors["6a_04_north-west"], all_doors["6a_04b_east"]), + "6a_04_south-east---6a_04d_west": RoomConnection("6a", all_doors["6a_04_south-east"], all_doors["6a_04d_west"]), + "6a_04_east---6a_05_west": RoomConnection("6a", all_doors["6a_04_east"], all_doors["6a_05_west"]), + "6a_04_south-west---6a_04e_east": RoomConnection("6a", all_doors["6a_04_south-west"], all_doors["6a_04e_east"]), + "6a_04b_west---6a_04c_east": RoomConnection("6a", all_doors["6a_04b_west"], all_doors["6a_04c_east"]), + "6a_05_east---6a_06_west": RoomConnection("6a", all_doors["6a_05_east"], all_doors["6a_06_west"]), + "6a_06_east---6a_07_west": RoomConnection("6a", all_doors["6a_06_east"], all_doors["6a_07_west"]), + "6a_07_east---6a_08a_west": RoomConnection("6a", all_doors["6a_07_east"], all_doors["6a_08a_west"]), + "6a_07_north-east---6a_08b_west": RoomConnection("6a", all_doors["6a_07_north-east"], all_doors["6a_08b_west"]), + "6a_08a_east---6a_09_west": RoomConnection("6a", all_doors["6a_08a_east"], all_doors["6a_09_west"]), + "6a_08b_east---6a_09_north-west": RoomConnection("6a", all_doors["6a_08b_east"], all_doors["6a_09_north-west"]), + "6a_09_east---6a_10a_west": RoomConnection("6a", all_doors["6a_09_east"], all_doors["6a_10a_west"]), + "6a_09_north-east---6a_10b_west": RoomConnection("6a", all_doors["6a_09_north-east"], all_doors["6a_10b_west"]), + "6a_10a_east---6a_11_west": RoomConnection("6a", all_doors["6a_10a_east"], all_doors["6a_11_west"]), + "6a_10b_east---6a_11_north-west": RoomConnection("6a", all_doors["6a_10b_east"], all_doors["6a_11_north-west"]), + "6a_11_east---6a_12a_west": RoomConnection("6a", all_doors["6a_11_east"], all_doors["6a_12a_west"]), + "6a_11_north-east---6a_12b_west": RoomConnection("6a", all_doors["6a_11_north-east"], all_doors["6a_12b_west"]), + "6a_12a_east---6a_13_west": RoomConnection("6a", all_doors["6a_12a_east"], all_doors["6a_13_west"]), + "6a_12b_east---6a_13_north-west": RoomConnection("6a", all_doors["6a_12b_east"], all_doors["6a_13_north-west"]), + "6a_13_east---6a_14a_west": RoomConnection("6a", all_doors["6a_13_east"], all_doors["6a_14a_west"]), + "6a_13_north-east---6a_14b_west": RoomConnection("6a", all_doors["6a_13_north-east"], all_doors["6a_14b_west"]), + "6a_14a_east---6a_15_west": RoomConnection("6a", all_doors["6a_14a_east"], all_doors["6a_15_west"]), + "6a_14b_east---6a_15_north-west": RoomConnection("6a", all_doors["6a_14b_east"], all_doors["6a_15_north-west"]), + "6a_15_east---6a_16a_west": RoomConnection("6a", all_doors["6a_15_east"], all_doors["6a_16a_west"]), + "6a_15_north-east---6a_16b_west": RoomConnection("6a", all_doors["6a_15_north-east"], all_doors["6a_16b_west"]), + "6a_16a_east---6a_17_west": RoomConnection("6a", all_doors["6a_16a_east"], all_doors["6a_17_west"]), + "6a_16b_east---6a_17_north-west": RoomConnection("6a", all_doors["6a_16b_east"], all_doors["6a_17_north-west"]), + "6a_17_east---6a_18a_west": RoomConnection("6a", all_doors["6a_17_east"], all_doors["6a_18a_west"]), + "6a_17_north-east---6a_18b_west": RoomConnection("6a", all_doors["6a_17_north-east"], all_doors["6a_18b_west"]), + "6a_18a_east---6a_19_west": RoomConnection("6a", all_doors["6a_18a_east"], all_doors["6a_19_west"]), + "6a_18b_east---6a_19_north-west": RoomConnection("6a", all_doors["6a_18b_east"], all_doors["6a_19_north-west"]), + "6a_19_east---6a_20_west": RoomConnection("6a", all_doors["6a_19_east"], all_doors["6a_20_west"]), + "6a_20_east---6a_b-00_west": RoomConnection("6a", all_doors["6a_20_east"], all_doors["6a_b-00_west"]), + "6a_b-00_east---6a_b-01_west": RoomConnection("6a", all_doors["6a_b-00_east"], all_doors["6a_b-01_west"]), + "6a_b-00_top---6a_b-00b_bottom": RoomConnection("6a", all_doors["6a_b-00_top"], all_doors["6a_b-00b_bottom"]), + "6a_b-00b_top---6a_b-00c_east": RoomConnection("6a", all_doors["6a_b-00b_top"], all_doors["6a_b-00c_east"]), + "6a_b-01_east---6a_b-02_top": RoomConnection("6a", all_doors["6a_b-01_east"], all_doors["6a_b-02_top"]), + "6a_b-02_bottom---6a_b-02b_top": RoomConnection("6a", all_doors["6a_b-02_bottom"], all_doors["6a_b-02b_top"]), + "6a_b-02b_bottom---6a_b-03_west": RoomConnection("6a", all_doors["6a_b-02b_bottom"], all_doors["6a_b-03_west"]), + "6a_b-03_east---6a_boss-00_west": RoomConnection("6a", all_doors["6a_b-03_east"], all_doors["6a_boss-00_west"]), + "6a_boss-00_east---6a_boss-01_west": RoomConnection("6a", all_doors["6a_boss-00_east"], all_doors["6a_boss-01_west"]), + "6a_boss-01_east---6a_boss-02_west": RoomConnection("6a", all_doors["6a_boss-01_east"], all_doors["6a_boss-02_west"]), + "6a_boss-02_east---6a_boss-03_west": RoomConnection("6a", all_doors["6a_boss-02_east"], all_doors["6a_boss-03_west"]), + "6a_boss-03_east---6a_boss-04_west": RoomConnection("6a", all_doors["6a_boss-03_east"], all_doors["6a_boss-04_west"]), + "6a_boss-04_east---6a_boss-05_west": RoomConnection("6a", all_doors["6a_boss-04_east"], all_doors["6a_boss-05_west"]), + "6a_boss-05_east---6a_boss-06_west": RoomConnection("6a", all_doors["6a_boss-05_east"], all_doors["6a_boss-06_west"]), + "6a_boss-06_east---6a_boss-07_west": RoomConnection("6a", all_doors["6a_boss-06_east"], all_doors["6a_boss-07_west"]), + "6a_boss-07_east---6a_boss-08_west": RoomConnection("6a", all_doors["6a_boss-07_east"], all_doors["6a_boss-08_west"]), + "6a_boss-08_east---6a_boss-09_west": RoomConnection("6a", all_doors["6a_boss-08_east"], all_doors["6a_boss-09_west"]), + "6a_boss-09_east---6a_boss-10_west": RoomConnection("6a", all_doors["6a_boss-09_east"], all_doors["6a_boss-10_west"]), + "6a_boss-10_east---6a_boss-11_west": RoomConnection("6a", all_doors["6a_boss-10_east"], all_doors["6a_boss-11_west"]), + "6a_boss-11_east---6a_boss-12_west": RoomConnection("6a", all_doors["6a_boss-11_east"], all_doors["6a_boss-12_west"]), + "6a_boss-12_east---6a_boss-13_west": RoomConnection("6a", all_doors["6a_boss-12_east"], all_doors["6a_boss-13_west"]), + "6a_boss-13_east---6a_boss-14_west": RoomConnection("6a", all_doors["6a_boss-13_east"], all_doors["6a_boss-14_west"]), + "6a_boss-14_east---6a_boss-15_west": RoomConnection("6a", all_doors["6a_boss-14_east"], all_doors["6a_boss-15_west"]), + "6a_boss-15_east---6a_boss-16_west": RoomConnection("6a", all_doors["6a_boss-15_east"], all_doors["6a_boss-16_west"]), + "6a_boss-16_east---6a_boss-17_west": RoomConnection("6a", all_doors["6a_boss-16_east"], all_doors["6a_boss-17_west"]), + "6a_boss-17_east---6a_boss-18_west": RoomConnection("6a", all_doors["6a_boss-17_east"], all_doors["6a_boss-18_west"]), + "6a_boss-18_east---6a_boss-19_west": RoomConnection("6a", all_doors["6a_boss-18_east"], all_doors["6a_boss-19_west"]), + "6a_boss-19_east---6a_boss-20_west": RoomConnection("6a", all_doors["6a_boss-19_east"], all_doors["6a_boss-20_west"]), + "6a_boss-20_east---6a_after-00_bottom": RoomConnection("6a", all_doors["6a_boss-20_east"], all_doors["6a_after-00_bottom"]), + "6a_after-00_top---6a_after-01_bottom": RoomConnection("6a", all_doors["6a_after-00_top"], all_doors["6a_after-01_bottom"]), + + "6b_a-00_top---6b_a-01_bottom": RoomConnection("6b", all_doors["6b_a-00_top"], all_doors["6b_a-01_bottom"]), + "6b_a-01_top---6b_a-02_bottom": RoomConnection("6b", all_doors["6b_a-01_top"], all_doors["6b_a-02_bottom"]), + "6b_a-02_top---6b_a-03_west": RoomConnection("6b", all_doors["6b_a-02_top"], all_doors["6b_a-03_west"]), + "6b_a-03_east---6b_a-04_west": RoomConnection("6b", all_doors["6b_a-03_east"], all_doors["6b_a-04_west"]), + "6b_a-04_east---6b_a-05_west": RoomConnection("6b", all_doors["6b_a-04_east"], all_doors["6b_a-05_west"]), + "6b_a-05_east---6b_a-06_west": RoomConnection("6b", all_doors["6b_a-05_east"], all_doors["6b_a-06_west"]), + "6b_a-06_east---6b_b-00_west": RoomConnection("6b", all_doors["6b_a-06_east"], all_doors["6b_b-00_west"]), + "6b_b-00_east---6b_b-01_top": RoomConnection("6b", all_doors["6b_b-00_east"], all_doors["6b_b-01_top"]), + "6b_b-01_bottom---6b_b-02_top": RoomConnection("6b", all_doors["6b_b-01_bottom"], all_doors["6b_b-02_top"]), + "6b_b-02_bottom---6b_b-03_top": RoomConnection("6b", all_doors["6b_b-02_bottom"], all_doors["6b_b-03_top"]), + "6b_b-03_bottom---6b_b-04_top": RoomConnection("6b", all_doors["6b_b-03_bottom"], all_doors["6b_b-04_top"]), + "6b_b-04_bottom---6b_b-05_top": RoomConnection("6b", all_doors["6b_b-04_bottom"], all_doors["6b_b-05_top"]), + "6b_b-05_bottom---6b_b-06_top": RoomConnection("6b", all_doors["6b_b-05_bottom"], all_doors["6b_b-06_top"]), + "6b_b-06_bottom---6b_b-07_top": RoomConnection("6b", all_doors["6b_b-06_bottom"], all_doors["6b_b-07_top"]), + "6b_b-07_bottom---6b_b-08_top": RoomConnection("6b", all_doors["6b_b-07_bottom"], all_doors["6b_b-08_top"]), + "6b_b-08_bottom---6b_b-10_west": RoomConnection("6b", all_doors["6b_b-08_bottom"], all_doors["6b_b-10_west"]), + "6b_b-10_east---6b_c-00_west": RoomConnection("6b", all_doors["6b_b-10_east"], all_doors["6b_c-00_west"]), + "6b_c-00_east---6b_c-01_west": RoomConnection("6b", all_doors["6b_c-00_east"], all_doors["6b_c-01_west"]), + "6b_c-01_east---6b_c-02_west": RoomConnection("6b", all_doors["6b_c-01_east"], all_doors["6b_c-02_west"]), + "6b_c-02_east---6b_c-03_west": RoomConnection("6b", all_doors["6b_c-02_east"], all_doors["6b_c-03_west"]), + "6b_c-03_east---6b_c-04_west": RoomConnection("6b", all_doors["6b_c-03_east"], all_doors["6b_c-04_west"]), + "6b_c-04_east---6b_d-00_west": RoomConnection("6b", all_doors["6b_c-04_east"], all_doors["6b_d-00_west"]), + "6b_d-00_east---6b_d-01_west": RoomConnection("6b", all_doors["6b_d-00_east"], all_doors["6b_d-01_west"]), + "6b_d-01_east---6b_d-02_west": RoomConnection("6b", all_doors["6b_d-01_east"], all_doors["6b_d-02_west"]), + "6b_d-02_east---6b_d-03_west": RoomConnection("6b", all_doors["6b_d-02_east"], all_doors["6b_d-03_west"]), + "6b_d-03_east---6b_d-04_west": RoomConnection("6b", all_doors["6b_d-03_east"], all_doors["6b_d-04_west"]), + "6b_d-04_east---6b_d-05_west": RoomConnection("6b", all_doors["6b_d-04_east"], all_doors["6b_d-05_west"]), + + "6c_00_east---6c_01_west": RoomConnection("6c", all_doors["6c_00_east"], all_doors["6c_01_west"]), + "6c_01_east---6c_02_west": RoomConnection("6c", all_doors["6c_01_east"], all_doors["6c_02_west"]), + + "7a_a-00_east---7a_a-01_west": RoomConnection("7a", all_doors["7a_a-00_east"], all_doors["7a_a-01_west"]), + "7a_a-01_east---7a_a-02_west": RoomConnection("7a", all_doors["7a_a-01_east"], all_doors["7a_a-02_west"]), + "7a_a-02_north---7a_a-02b_east": RoomConnection("7a", all_doors["7a_a-02_north"], all_doors["7a_a-02b_east"]), + "7a_a-02b_west---7a_a-02_north-west": RoomConnection("7a", all_doors["7a_a-02b_west"], all_doors["7a_a-02_north-west"]), + "7a_a-02_east---7a_a-03_west": RoomConnection("7a", all_doors["7a_a-02_east"], all_doors["7a_a-03_west"]), + "7a_a-03_east---7a_a-04_west": RoomConnection("7a", all_doors["7a_a-03_east"], all_doors["7a_a-04_west"]), + "7a_a-04_north---7a_a-04b_east": RoomConnection("7a", all_doors["7a_a-04_north"], all_doors["7a_a-04b_east"]), + "7a_a-04_east---7a_a-05_west": RoomConnection("7a", all_doors["7a_a-04_east"], all_doors["7a_a-05_west"]), + "7a_a-05_east---7a_a-06_bottom": RoomConnection("7a", all_doors["7a_a-05_east"], all_doors["7a_a-06_bottom"]), + "7a_a-06_top---7a_b-00_bottom": RoomConnection("7a", all_doors["7a_a-06_top"], all_doors["7a_b-00_bottom"]), + "7a_b-00_top---7a_b-01_west": RoomConnection("7a", all_doors["7a_b-00_top"], all_doors["7a_b-01_west"]), + "7a_b-01_east---7a_b-02_south": RoomConnection("7a", all_doors["7a_b-01_east"], all_doors["7a_b-02_south"]), + "7a_b-02_north-west---7a_b-02b_south": RoomConnection("7a", all_doors["7a_b-02_north-west"], all_doors["7a_b-02b_south"]), + "7a_b-02_north---7a_b-02d_south": RoomConnection("7a", all_doors["7a_b-02_north"], all_doors["7a_b-02d_south"]), + "7a_b-02_north-east---7a_b-03_west": RoomConnection("7a", all_doors["7a_b-02_north-east"], all_doors["7a_b-03_west"]), + "7a_b-02b_north-west---7a_b-02e_east": RoomConnection("7a", all_doors["7a_b-02b_north-west"], all_doors["7a_b-02e_east"]), + "7a_b-02b_north-east---7a_b-02c_west": RoomConnection("7a", all_doors["7a_b-02b_north-east"], all_doors["7a_b-02c_west"]), + "7a_b-02c_east---7a_b-05_north-west": RoomConnection("7a", all_doors["7a_b-02c_east"], all_doors["7a_b-05_north-west"]), + "7a_b-02c_south-east---7a_b-02d_north": RoomConnection("7a", all_doors["7a_b-02c_south-east"], all_doors["7a_b-02d_north"]), + "7a_b-03_east---7a_b-04_west": RoomConnection("7a", all_doors["7a_b-03_east"], all_doors["7a_b-04_west"]), + "7a_b-03_north---7a_b-05_west": RoomConnection("7a", all_doors["7a_b-03_north"], all_doors["7a_b-05_west"]), + "7a_b-05_east---7a_b-06_west": RoomConnection("7a", all_doors["7a_b-05_east"], all_doors["7a_b-06_west"]), + "7a_b-06_east---7a_b-07_west": RoomConnection("7a", all_doors["7a_b-06_east"], all_doors["7a_b-07_west"]), + "7a_b-07_east---7a_b-08_west": RoomConnection("7a", all_doors["7a_b-07_east"], all_doors["7a_b-08_west"]), + "7a_b-08_east---7a_b-09_bottom": RoomConnection("7a", all_doors["7a_b-08_east"], all_doors["7a_b-09_bottom"]), + "7a_b-09_top---7a_c-00_west": RoomConnection("7a", all_doors["7a_b-09_top"], all_doors["7a_c-00_west"]), + "7a_c-00_east---7a_c-01_bottom": RoomConnection("7a", all_doors["7a_c-00_east"], all_doors["7a_c-01_bottom"]), + "7a_c-01_top---7a_c-02_bottom": RoomConnection("7a", all_doors["7a_c-01_top"], all_doors["7a_c-02_bottom"]), + "7a_c-02_top---7a_c-03_south": RoomConnection("7a", all_doors["7a_c-02_top"], all_doors["7a_c-03_south"]), + "7a_c-03_west---7a_c-03b_east": RoomConnection("7a", all_doors["7a_c-03_west"], all_doors["7a_c-03b_east"]), + "7a_c-03_east---7a_c-04_west": RoomConnection("7a", all_doors["7a_c-03_east"], all_doors["7a_c-04_west"]), + "7a_c-04_north-west---7a_c-06_south": RoomConnection("7a", all_doors["7a_c-04_north-west"], all_doors["7a_c-06_south"]), + "7a_c-04_north-east---7a_c-06b_south": RoomConnection("7a", all_doors["7a_c-04_north-east"], all_doors["7a_c-06b_south"]), + "7a_c-04_east---7a_c-05_west": RoomConnection("7a", all_doors["7a_c-04_east"], all_doors["7a_c-05_west"]), + "7a_c-06_east---7a_c-06b_west": RoomConnection("7a", all_doors["7a_c-06_east"], all_doors["7a_c-06b_west"]), + "7a_c-06_north---7a_c-07_south-west": RoomConnection("7a", all_doors["7a_c-06_north"], all_doors["7a_c-07_south-west"]), + "7a_c-06b_east---7a_c-06c_west": RoomConnection("7a", all_doors["7a_c-06b_east"], all_doors["7a_c-06c_west"]), + "7a_c-06b_north---7a_c-07_south-east": RoomConnection("7a", all_doors["7a_c-06b_north"], all_doors["7a_c-07_south-east"]), + "7a_c-07_west---7a_c-07b_east": RoomConnection("7a", all_doors["7a_c-07_west"], all_doors["7a_c-07b_east"]), + "7a_c-07_east---7a_c-08_west": RoomConnection("7a", all_doors["7a_c-07_east"], all_doors["7a_c-08_west"]), + "7a_c-08_east---7a_c-09_bottom": RoomConnection("7a", all_doors["7a_c-08_east"], all_doors["7a_c-09_bottom"]), + "7a_c-09_top---7a_d-00_bottom": RoomConnection("7a", all_doors["7a_c-09_top"], all_doors["7a_d-00_bottom"]), + "7a_d-00_top---7a_d-01_west": RoomConnection("7a", all_doors["7a_d-00_top"], all_doors["7a_d-01_west"]), + "7a_d-01_east---7a_d-01b_west": RoomConnection("7a", all_doors["7a_d-01_east"], all_doors["7a_d-01b_west"]), + "7a_d-01b_east---7a_d-02_west": RoomConnection("7a", all_doors["7a_d-01b_east"], all_doors["7a_d-02_west"]), + "7a_d-01b_south-west---7a_d-01c_west": RoomConnection("7a", all_doors["7a_d-01b_south-west"], all_doors["7a_d-01c_west"]), + "7a_d-01c_south---7a_d-01d_west": RoomConnection("7a", all_doors["7a_d-01c_south"], all_doors["7a_d-01d_west"]), + "7a_d-01c_east---7a_d-01b_south-east": RoomConnection("7a", all_doors["7a_d-01c_east"], all_doors["7a_d-01b_south-east"]), + "7a_d-01d_east---7a_d-01c_south-east": RoomConnection("7a", all_doors["7a_d-01d_east"], all_doors["7a_d-01c_south-east"]), + "7a_d-02_east---7a_d-03_west": RoomConnection("7a", all_doors["7a_d-02_east"], all_doors["7a_d-03_west"]), + "7a_d-03_east---7a_d-04_west": RoomConnection("7a", all_doors["7a_d-03_east"], all_doors["7a_d-04_west"]), + "7a_d-03_north-east---7a_d-03b_east": RoomConnection("7a", all_doors["7a_d-03_north-east"], all_doors["7a_d-03b_east"]), + "7a_d-03b_west---7a_d-03_north-west": RoomConnection("7a", all_doors["7a_d-03b_west"], all_doors["7a_d-03_north-west"]), + "7a_d-04_east---7a_d-05_west": RoomConnection("7a", all_doors["7a_d-04_east"], all_doors["7a_d-05_west"]), + "7a_d-05_east---7a_d-05b_west": RoomConnection("7a", all_doors["7a_d-05_east"], all_doors["7a_d-05b_west"]), + "7a_d-05_north-east---7a_d-06_south-west": RoomConnection("7a", all_doors["7a_d-05_north-east"], all_doors["7a_d-06_south-west"]), + "7a_d-06_west---7a_d-07_east": RoomConnection("7a", all_doors["7a_d-06_west"], all_doors["7a_d-07_east"]), + "7a_d-06_south-east---7a_d-08_west": RoomConnection("7a", all_doors["7a_d-06_south-east"], all_doors["7a_d-08_west"]), + "7a_d-06_east---7a_d-09_west": RoomConnection("7a", all_doors["7a_d-06_east"], all_doors["7a_d-09_west"]), + "7a_d-08_east---7a_d-10_west": RoomConnection("7a", all_doors["7a_d-08_east"], all_doors["7a_d-10_west"]), + "7a_d-09_east---7a_d-10_north-west": RoomConnection("7a", all_doors["7a_d-09_east"], all_doors["7a_d-10_north-west"]), + "7a_d-10_north-east---7a_d-10b_east": RoomConnection("7a", all_doors["7a_d-10_north-east"], all_doors["7a_d-10b_east"]), + "7a_d-10_east---7a_d-11_bottom": RoomConnection("7a", all_doors["7a_d-10_east"], all_doors["7a_d-11_bottom"]), + "7a_d-10b_west---7a_d-10_north": RoomConnection("7a", all_doors["7a_d-10b_west"], all_doors["7a_d-10_north"]), + "7a_d-11_top---7a_e-00b_bottom": RoomConnection("7a", all_doors["7a_d-11_top"], all_doors["7a_e-00b_bottom"]), + "7a_e-00b_top---7a_e-00_south-west": RoomConnection("7a", all_doors["7a_e-00b_top"], all_doors["7a_e-00_south-west"]), + "7a_e-00_west---7a_e-01_east": RoomConnection("7a", all_doors["7a_e-00_west"], all_doors["7a_e-01_east"]), + "7a_e-00_north-west---7a_e-02_west": RoomConnection("7a", all_doors["7a_e-00_north-west"], all_doors["7a_e-02_west"]), + "7a_e-00_east---7a_e-03_south-west": RoomConnection("7a", all_doors["7a_e-00_east"], all_doors["7a_e-03_south-west"]), + "7a_e-01_west---7a_e-01b_east": RoomConnection("7a", all_doors["7a_e-01_west"], all_doors["7a_e-01b_east"]), + "7a_e-01b_west---7a_e-01c_west": RoomConnection("7a", all_doors["7a_e-01b_west"], all_doors["7a_e-01c_west"]), + "7a_e-01c_east---7a_e-01_north": RoomConnection("7a", all_doors["7a_e-01c_east"], all_doors["7a_e-01_north"]), + "7a_e-02_east---7a_e-03_west": RoomConnection("7a", all_doors["7a_e-02_east"], all_doors["7a_e-03_west"]), + "7a_e-03_east---7a_e-04_west": RoomConnection("7a", all_doors["7a_e-03_east"], all_doors["7a_e-04_west"]), + "7a_e-04_east---7a_e-05_west": RoomConnection("7a", all_doors["7a_e-04_east"], all_doors["7a_e-05_west"]), + "7a_e-05_east---7a_e-06_west": RoomConnection("7a", all_doors["7a_e-05_east"], all_doors["7a_e-06_west"]), + "7a_e-06_east---7a_e-07_bottom": RoomConnection("7a", all_doors["7a_e-06_east"], all_doors["7a_e-07_bottom"]), + "7a_e-07_top---7a_e-08_south": RoomConnection("7a", all_doors["7a_e-07_top"], all_doors["7a_e-08_south"]), + "7a_e-08_west---7a_e-09_east": RoomConnection("7a", all_doors["7a_e-08_west"], all_doors["7a_e-09_east"]), + "7a_e-08_east---7a_e-10_south": RoomConnection("7a", all_doors["7a_e-08_east"], all_doors["7a_e-10_south"]), + "7a_e-09_north---7a_e-11_south": RoomConnection("7a", all_doors["7a_e-09_north"], all_doors["7a_e-11_south"]), + "7a_e-11_north---7a_e-12_west": RoomConnection("7a", all_doors["7a_e-11_north"], all_doors["7a_e-12_west"]), + "7a_e-11_east---7a_e-10_north": RoomConnection("7a", all_doors["7a_e-11_east"], all_doors["7a_e-10_north"]), + "7a_e-10_east---7a_e-10b_west": RoomConnection("7a", all_doors["7a_e-10_east"], all_doors["7a_e-10b_west"]), + "7a_e-10b_east---7a_e-13_bottom": RoomConnection("7a", all_doors["7a_e-10b_east"], all_doors["7a_e-13_bottom"]), + "7a_e-13_top---7a_f-00_south": RoomConnection("7a", all_doors["7a_e-13_top"], all_doors["7a_f-00_south"]), + "7a_f-00_west---7a_f-01_south": RoomConnection("7a", all_doors["7a_f-00_west"], all_doors["7a_f-01_south"]), + "7a_f-00_east---7a_f-02_west": RoomConnection("7a", all_doors["7a_f-00_east"], all_doors["7a_f-02_west"]), + "7a_f-00_north-east---7a_f-02_north-west": RoomConnection("7a", all_doors["7a_f-00_north-east"], all_doors["7a_f-02_north-west"]), + "7a_f-01_north---7a_f-00_north-west": RoomConnection("7a", all_doors["7a_f-01_north"], all_doors["7a_f-00_north-west"]), + "7a_f-02_north-east---7a_f-02b_west": RoomConnection("7a", all_doors["7a_f-02_north-east"], all_doors["7a_f-02b_west"]), + "7a_f-02_east---7a_f-04_west": RoomConnection("7a", all_doors["7a_f-02_east"], all_doors["7a_f-04_west"]), + "7a_f-02b_east---7a_f-07_west": RoomConnection("7a", all_doors["7a_f-02b_east"], all_doors["7a_f-07_west"]), + "7a_f-04_east---7a_f-03_west": RoomConnection("7a", all_doors["7a_f-04_east"], all_doors["7a_f-03_west"]), + "7a_f-03_east---7a_f-05_west": RoomConnection("7a", all_doors["7a_f-03_east"], all_doors["7a_f-05_west"]), + "7a_f-05_east---7a_f-08_west": RoomConnection("7a", all_doors["7a_f-05_east"], all_doors["7a_f-08_west"]), + "7a_f-05_south-west---7a_f-06_north-west": RoomConnection("7a", all_doors["7a_f-05_south-west"], all_doors["7a_f-06_north-west"]), + "7a_f-05_south---7a_f-06_north": RoomConnection("7a", all_doors["7a_f-05_south"], all_doors["7a_f-06_north"]), + "7a_f-05_south-east---7a_f-06_north-east": RoomConnection("7a", all_doors["7a_f-05_south-east"], all_doors["7a_f-06_north-east"]), + "7a_f-05_north-west---7a_f-07_south-west": RoomConnection("7a", all_doors["7a_f-05_north-west"], all_doors["7a_f-07_south-west"]), + "7a_f-05_north---7a_f-07_south": RoomConnection("7a", all_doors["7a_f-05_north"], all_doors["7a_f-07_south"]), + "7a_f-05_north-east---7a_f-07_south-east": RoomConnection("7a", all_doors["7a_f-05_north-east"], all_doors["7a_f-07_south-east"]), + "7a_f-08_north-west---7a_f-08b_west": RoomConnection("7a", all_doors["7a_f-08_north-west"], all_doors["7a_f-08b_west"]), + "7a_f-08_east---7a_f-09_west": RoomConnection("7a", all_doors["7a_f-08_east"], all_doors["7a_f-09_west"]), + "7a_f-09_east---7a_f-10_west": RoomConnection("7a", all_doors["7a_f-09_east"], all_doors["7a_f-10_west"]), + "7a_f-08b_east---7a_f-08d_west": RoomConnection("7a", all_doors["7a_f-08b_east"], all_doors["7a_f-08d_west"]), + "7a_f-08d_east---7a_f-08c_west": RoomConnection("7a", all_doors["7a_f-08d_east"], all_doors["7a_f-08c_west"]), + "7a_f-08c_east---7a_f-10_north-east": RoomConnection("7a", all_doors["7a_f-08c_east"], all_doors["7a_f-10_north-east"]), + "7a_f-10_east---7a_f-10b_west": RoomConnection("7a", all_doors["7a_f-10_east"], all_doors["7a_f-10b_west"]), + "7a_f-10b_east---7a_f-11_bottom": RoomConnection("7a", all_doors["7a_f-10b_east"], all_doors["7a_f-11_bottom"]), + "7a_f-11_top---7a_g-00_bottom": RoomConnection("7a", all_doors["7a_f-11_top"], all_doors["7a_g-00_bottom"]), + "7a_g-00_top---7a_g-00b_bottom": RoomConnection("7a", all_doors["7a_g-00_top"], all_doors["7a_g-00b_bottom"]), + "7a_g-00b_top---7a_g-01_bottom": RoomConnection("7a", all_doors["7a_g-00b_top"], all_doors["7a_g-01_bottom"]), + "7a_g-01_top---7a_g-02_bottom": RoomConnection("7a", all_doors["7a_g-01_top"], all_doors["7a_g-02_bottom"]), + "7a_g-02_top---7a_g-03_bottom": RoomConnection("7a", all_doors["7a_g-02_top"], all_doors["7a_g-03_bottom"]), + + "7b_a-00_east---7b_a-01_west": RoomConnection("7b", all_doors["7b_a-00_east"], all_doors["7b_a-01_west"]), + "7b_a-01_east---7b_a-02_west": RoomConnection("7b", all_doors["7b_a-01_east"], all_doors["7b_a-02_west"]), + "7b_a-02_east---7b_a-03_bottom": RoomConnection("7b", all_doors["7b_a-02_east"], all_doors["7b_a-03_bottom"]), + "7b_a-03_top---7b_b-00_bottom": RoomConnection("7b", all_doors["7b_a-03_top"], all_doors["7b_b-00_bottom"]), + "7b_b-00_top---7b_b-01_bottom": RoomConnection("7b", all_doors["7b_b-00_top"], all_doors["7b_b-01_bottom"]), + "7b_b-01_top---7b_b-02_west": RoomConnection("7b", all_doors["7b_b-01_top"], all_doors["7b_b-02_west"]), + "7b_b-02_east---7b_b-03_bottom": RoomConnection("7b", all_doors["7b_b-02_east"], all_doors["7b_b-03_bottom"]), + "7b_b-03_top---7b_c-01_west": RoomConnection("7b", all_doors["7b_b-03_top"], all_doors["7b_c-01_west"]), + "7b_c-01_east---7b_c-00_west": RoomConnection("7b", all_doors["7b_c-01_east"], all_doors["7b_c-00_west"]), + "7b_c-00_east---7b_c-02_west": RoomConnection("7b", all_doors["7b_c-00_east"], all_doors["7b_c-02_west"]), + "7b_c-02_east---7b_c-03_bottom": RoomConnection("7b", all_doors["7b_c-02_east"], all_doors["7b_c-03_bottom"]), + "7b_c-03_top---7b_d-00_west": RoomConnection("7b", all_doors["7b_c-03_top"], all_doors["7b_d-00_west"]), + "7b_d-00_east---7b_d-01_west": RoomConnection("7b", all_doors["7b_d-00_east"], all_doors["7b_d-01_west"]), + "7b_d-01_east---7b_d-02_west": RoomConnection("7b", all_doors["7b_d-01_east"], all_doors["7b_d-02_west"]), + "7b_d-02_east---7b_d-03_bottom": RoomConnection("7b", all_doors["7b_d-02_east"], all_doors["7b_d-03_bottom"]), + "7b_d-03_top---7b_e-00_west": RoomConnection("7b", all_doors["7b_d-03_top"], all_doors["7b_e-00_west"]), + "7b_e-00_east---7b_e-01_west": RoomConnection("7b", all_doors["7b_e-00_east"], all_doors["7b_e-01_west"]), + "7b_e-01_east---7b_e-02_west": RoomConnection("7b", all_doors["7b_e-01_east"], all_doors["7b_e-02_west"]), + "7b_e-02_east---7b_e-03_bottom": RoomConnection("7b", all_doors["7b_e-02_east"], all_doors["7b_e-03_bottom"]), + "7b_e-03_top---7b_f-00_west": RoomConnection("7b", all_doors["7b_e-03_top"], all_doors["7b_f-00_west"]), + "7b_f-00_east---7b_f-01_west": RoomConnection("7b", all_doors["7b_f-00_east"], all_doors["7b_f-01_west"]), + "7b_f-01_east---7b_f-02_west": RoomConnection("7b", all_doors["7b_f-01_east"], all_doors["7b_f-02_west"]), + "7b_f-02_east---7b_f-03_bottom": RoomConnection("7b", all_doors["7b_f-02_east"], all_doors["7b_f-03_bottom"]), + "7b_f-03_top---7b_g-00_bottom": RoomConnection("7b", all_doors["7b_f-03_top"], all_doors["7b_g-00_bottom"]), + "7b_g-00_top---7b_g-01_bottom": RoomConnection("7b", all_doors["7b_g-00_top"], all_doors["7b_g-01_bottom"]), + "7b_g-01_top---7b_g-02_bottom": RoomConnection("7b", all_doors["7b_g-01_top"], all_doors["7b_g-02_bottom"]), + "7b_g-02_top---7b_g-03_bottom": RoomConnection("7b", all_doors["7b_g-02_top"], all_doors["7b_g-03_bottom"]), + + "7c_01_east---7c_02_west": RoomConnection("7c", all_doors["7c_01_east"], all_doors["7c_02_west"]), + "7c_02_east---7c_03_west": RoomConnection("7c", all_doors["7c_02_east"], all_doors["7c_03_west"]), + + "8a_outside_east---8a_bridge_west": RoomConnection("8a", all_doors["8a_outside_east"], all_doors["8a_bridge_west"]), + "8a_bridge_east---8a_secret_west": RoomConnection("8a", all_doors["8a_bridge_east"], all_doors["8a_secret_west"]), + + "9a_00_east---9a_01_west": RoomConnection("9a", all_doors["9a_00_east"], all_doors["9a_01_west"]), + "9a_00_west---9a_0x_east": RoomConnection("9a", all_doors["9a_00_west"], all_doors["9a_0x_east"]), + "9a_01_east---9a_02_west": RoomConnection("9a", all_doors["9a_01_east"], all_doors["9a_02_west"]), + "9a_02_east---9a_a-00_west": RoomConnection("9a", all_doors["9a_02_east"], all_doors["9a_a-00_west"]), + "9a_a-00_east---9a_a-01_west": RoomConnection("9a", all_doors["9a_a-00_east"], all_doors["9a_a-01_west"]), + "9a_a-01_east---9a_a-02_west": RoomConnection("9a", all_doors["9a_a-01_east"], all_doors["9a_a-02_west"]), + "9a_a-02_east---9a_a-03_bottom": RoomConnection("9a", all_doors["9a_a-02_east"], all_doors["9a_a-03_bottom"]), + "9a_a-03_top---9a_b-00_south": RoomConnection("9a", all_doors["9a_a-03_top"], all_doors["9a_b-00_south"]), + "9a_b-00_west---9a_b-06_east": RoomConnection("9a", all_doors["9a_b-00_west"], all_doors["9a_b-06_east"]), + "9a_b-00_east---9a_b-01_west": RoomConnection("9a", all_doors["9a_b-00_east"], all_doors["9a_b-01_west"]), + "9a_b-00_north---9a_b-07b_bottom": RoomConnection("9a", all_doors["9a_b-00_north"], all_doors["9a_b-07b_bottom"]), + "9a_b-01_east---9a_b-02_west": RoomConnection("9a", all_doors["9a_b-01_east"], all_doors["9a_b-02_west"]), + "9a_b-02_east---9a_b-03_west": RoomConnection("9a", all_doors["9a_b-02_east"], all_doors["9a_b-03_west"]), + "9a_b-03_east---9a_b-04_west": RoomConnection("9a", all_doors["9a_b-03_east"], all_doors["9a_b-04_west"]), + "9a_b-04_east---9a_b-05_east": RoomConnection("9a", all_doors["9a_b-04_east"], all_doors["9a_b-05_east"]), + "9a_b-05_west---9a_b-04_north-west": RoomConnection("9a", all_doors["9a_b-05_west"], all_doors["9a_b-04_north-west"]), + "9a_b-07b_top---9a_b-07_bottom": RoomConnection("9a", all_doors["9a_b-07b_top"], all_doors["9a_b-07_bottom"]), + "9a_b-07_top---9a_c-00_west": RoomConnection("9a", all_doors["9a_b-07_top"], all_doors["9a_c-00_west"]), + "9a_c-00_north-east---9a_c-00b_west": RoomConnection("9a", all_doors["9a_c-00_north-east"], all_doors["9a_c-00b_west"]), + "9a_c-00_east---9a_c-01_west": RoomConnection("9a", all_doors["9a_c-00_east"], all_doors["9a_c-01_west"]), + "9a_c-01_east---9a_c-02_west": RoomConnection("9a", all_doors["9a_c-01_east"], all_doors["9a_c-02_west"]), + "9a_c-02_east---9a_c-03_west": RoomConnection("9a", all_doors["9a_c-02_east"], all_doors["9a_c-03_west"]), + "9a_c-03_east---9a_c-04_west": RoomConnection("9a", all_doors["9a_c-03_east"], all_doors["9a_c-04_west"]), + "9a_c-03_north---9a_c-03b_south": RoomConnection("9a", all_doors["9a_c-03_north"], all_doors["9a_c-03b_south"]), + "9a_c-03b_west---9a_c-03_north-west": RoomConnection("9a", all_doors["9a_c-03b_west"], all_doors["9a_c-03_north-west"]), + "9a_c-03b_east---9a_c-03_north-east": RoomConnection("9a", all_doors["9a_c-03b_east"], all_doors["9a_c-03_north-east"]), + "9a_c-04_east---9a_d-00_bottom": RoomConnection("9a", all_doors["9a_c-04_east"], all_doors["9a_d-00_bottom"]), + "9a_d-00_top---9a_d-01_bottom": RoomConnection("9a", all_doors["9a_d-00_top"], all_doors["9a_d-01_bottom"]), + "9a_d-01_top---9a_d-02_bottom": RoomConnection("9a", all_doors["9a_d-01_top"], all_doors["9a_d-02_bottom"]), + "9a_d-02_top---9a_d-03_bottom": RoomConnection("9a", all_doors["9a_d-02_top"], all_doors["9a_d-03_bottom"]), + "9a_d-03_top---9a_d-04_bottom": RoomConnection("9a", all_doors["9a_d-03_top"], all_doors["9a_d-04_bottom"]), + "9a_d-04_top---9a_d-05_bottom": RoomConnection("9a", all_doors["9a_d-04_top"], all_doors["9a_d-05_bottom"]), + "9a_d-05_top---9a_d-06_bottom": RoomConnection("9a", all_doors["9a_d-05_top"], all_doors["9a_d-06_bottom"]), + "9a_d-06_top---9a_d-07_bottom": RoomConnection("9a", all_doors["9a_d-06_top"], all_doors["9a_d-07_bottom"]), + "9a_d-07_top---9a_d-08_west": RoomConnection("9a", all_doors["9a_d-07_top"], all_doors["9a_d-08_west"]), + "9a_d-08_east---9a_d-09_west": RoomConnection("9a", all_doors["9a_d-08_east"], all_doors["9a_d-09_west"]), + "9a_d-09_east---9a_d-10_west": RoomConnection("9a", all_doors["9a_d-09_east"], all_doors["9a_d-10_west"]), + "9a_d-10_east---9a_d-10b_west": RoomConnection("9a", all_doors["9a_d-10_east"], all_doors["9a_d-10b_west"]), + "9a_d-10b_east---9a_d-10c_west": RoomConnection("9a", all_doors["9a_d-10b_east"], all_doors["9a_d-10c_west"]), + "9a_d-10c_east---9a_d-11_west": RoomConnection("9a", all_doors["9a_d-10c_east"], all_doors["9a_d-11_west"]), + "9a_d-11_east---9a_space_west": RoomConnection("9a", all_doors["9a_d-11_east"], all_doors["9a_space_west"]), + + "9b_00_east---9b_01_west": RoomConnection("9b", all_doors["9b_00_east"], all_doors["9b_01_west"]), + "9b_01_east---9b_a-00_west": RoomConnection("9b", all_doors["9b_01_east"], all_doors["9b_a-00_west"]), + "9b_a-00_east---9b_a-01_west": RoomConnection("9b", all_doors["9b_a-00_east"], all_doors["9b_a-01_west"]), + "9b_a-01_east---9b_a-02_west": RoomConnection("9b", all_doors["9b_a-01_east"], all_doors["9b_a-02_west"]), + "9b_a-02_east---9b_a-03_west": RoomConnection("9b", all_doors["9b_a-02_east"], all_doors["9b_a-03_west"]), + "9b_a-03_east---9b_a-04_west": RoomConnection("9b", all_doors["9b_a-03_east"], all_doors["9b_a-04_west"]), + "9b_a-04_east---9b_a-05_west": RoomConnection("9b", all_doors["9b_a-04_east"], all_doors["9b_a-05_west"]), + "9b_a-05_east---9b_b-00_west": RoomConnection("9b", all_doors["9b_a-05_east"], all_doors["9b_b-00_west"]), + "9b_b-00_east---9b_b-01_west": RoomConnection("9b", all_doors["9b_b-00_east"], all_doors["9b_b-01_west"]), + "9b_b-01_east---9b_b-02_west": RoomConnection("9b", all_doors["9b_b-01_east"], all_doors["9b_b-02_west"]), + "9b_b-02_east---9b_b-03_west": RoomConnection("9b", all_doors["9b_b-02_east"], all_doors["9b_b-03_west"]), + "9b_b-03_east---9b_b-04_west": RoomConnection("9b", all_doors["9b_b-03_east"], all_doors["9b_b-04_west"]), + "9b_b-04_east---9b_b-05_west": RoomConnection("9b", all_doors["9b_b-04_east"], all_doors["9b_b-05_west"]), + "9b_b-05_east---9b_c-01_bottom": RoomConnection("9b", all_doors["9b_b-05_east"], all_doors["9b_c-01_bottom"]), + "9b_c-01_top---9b_c-02_bottom": RoomConnection("9b", all_doors["9b_c-01_top"], all_doors["9b_c-02_bottom"]), + "9b_c-02_top---9b_c-03_bottom": RoomConnection("9b", all_doors["9b_c-02_top"], all_doors["9b_c-03_bottom"]), + "9b_c-03_top---9b_c-04_bottom": RoomConnection("9b", all_doors["9b_c-03_top"], all_doors["9b_c-04_bottom"]), + "9b_c-04_top---9b_c-05_west": RoomConnection("9b", all_doors["9b_c-04_top"], all_doors["9b_c-05_west"]), + "9b_c-05_east---9b_c-06_west": RoomConnection("9b", all_doors["9b_c-05_east"], all_doors["9b_c-06_west"]), + "9b_c-06_east---9b_c-08_west": RoomConnection("9b", all_doors["9b_c-06_east"], all_doors["9b_c-08_west"]), + "9b_c-08_east---9b_c-07_west": RoomConnection("9b", all_doors["9b_c-08_east"], all_doors["9b_c-07_west"]), + "9b_c-07_east---9b_space_west": RoomConnection("9b", all_doors["9b_c-07_east"], all_doors["9b_space_west"]), + + "9c_intro_east---9c_00_west": RoomConnection("9c", all_doors["9c_intro_east"], all_doors["9c_00_west"]), + "9c_00_east---9c_01_west": RoomConnection("9c", all_doors["9c_00_east"], all_doors["9c_01_west"]), + "9c_01_east---9c_02_west": RoomConnection("9c", all_doors["9c_01_east"], all_doors["9c_02_west"]), + + "10a_intro-00-past_east---10a_intro-01-future_west": RoomConnection("10a", all_doors["10a_intro-00-past_east"], all_doors["10a_intro-01-future_west"]), + "10a_intro-01-future_east---10a_intro-02-launch_bottom": RoomConnection("10a", all_doors["10a_intro-01-future_east"], all_doors["10a_intro-02-launch_bottom"]), + "10a_intro-02-launch_top---10a_intro-03-space_west": RoomConnection("10a", all_doors["10a_intro-02-launch_top"], all_doors["10a_intro-03-space_west"]), + "10a_intro-03-space_east---10a_a-00_west": RoomConnection("10a", all_doors["10a_intro-03-space_east"], all_doors["10a_a-00_west"]), + "10a_a-00_east---10a_a-01_west": RoomConnection("10a", all_doors["10a_a-00_east"], all_doors["10a_a-01_west"]), + "10a_a-01_east---10a_a-02_west": RoomConnection("10a", all_doors["10a_a-01_east"], all_doors["10a_a-02_west"]), + "10a_a-02_east---10a_a-03_west": RoomConnection("10a", all_doors["10a_a-02_east"], all_doors["10a_a-03_west"]), + "10a_a-03_east---10a_a-04_west": RoomConnection("10a", all_doors["10a_a-03_east"], all_doors["10a_a-04_west"]), + "10a_a-04_east---10a_a-05_west": RoomConnection("10a", all_doors["10a_a-04_east"], all_doors["10a_a-05_west"]), + "10a_a-05_east---10a_b-00_west": RoomConnection("10a", all_doors["10a_a-05_east"], all_doors["10a_b-00_west"]), + "10a_b-00_east---10a_b-01_west": RoomConnection("10a", all_doors["10a_b-00_east"], all_doors["10a_b-01_west"]), + "10a_b-01_east---10a_b-02_west": RoomConnection("10a", all_doors["10a_b-01_east"], all_doors["10a_b-02_west"]), + "10a_b-02_east---10a_b-03_west": RoomConnection("10a", all_doors["10a_b-02_east"], all_doors["10a_b-03_west"]), + "10a_b-03_east---10a_b-04_west": RoomConnection("10a", all_doors["10a_b-03_east"], all_doors["10a_b-04_west"]), + "10a_b-04_east---10a_b-05_west": RoomConnection("10a", all_doors["10a_b-04_east"], all_doors["10a_b-05_west"]), + "10a_b-05_east---10a_b-06_west": RoomConnection("10a", all_doors["10a_b-05_east"], all_doors["10a_b-06_west"]), + "10a_b-06_east---10a_b-07_west": RoomConnection("10a", all_doors["10a_b-06_east"], all_doors["10a_b-07_west"]), + "10a_b-07_east---10a_c-00_west": RoomConnection("10a", all_doors["10a_b-07_east"], all_doors["10a_c-00_west"]), + "10a_c-00_east---10a_c-00b_west": RoomConnection("10a", all_doors["10a_c-00_east"], all_doors["10a_c-00b_west"]), + "10a_c-00_north-east---10a_c-alt-00_west": RoomConnection("10a", all_doors["10a_c-00_north-east"], all_doors["10a_c-alt-00_west"]), + "10a_c-00b_east---10a_c-01_west": RoomConnection("10a", all_doors["10a_c-00b_east"], all_doors["10a_c-01_west"]), + "10a_c-01_east---10a_c-02_west": RoomConnection("10a", all_doors["10a_c-01_east"], all_doors["10a_c-02_west"]), + "10a_c-02_east---10a_c-03_south": RoomConnection("10a", all_doors["10a_c-02_east"], all_doors["10a_c-03_south"]), + "10a_c-alt-00_east---10a_c-alt-01_west": RoomConnection("10a", all_doors["10a_c-alt-00_east"], all_doors["10a_c-alt-01_west"]), + "10a_c-alt-01_east---10a_c-03_south-west": RoomConnection("10a", all_doors["10a_c-alt-01_east"], all_doors["10a_c-03_south-west"]), + "10a_c-03_north---10a_d-00_south": RoomConnection("10a", all_doors["10a_c-03_north"], all_doors["10a_d-00_south"]), + "10a_d-00_north-east-door---10a_d-04_west": RoomConnection("10a", all_doors["10a_d-00_north-east-door"], all_doors["10a_d-04_west"]), + "10a_d-00_south-east-door---10a_d-03_west": RoomConnection("10a", all_doors["10a_d-00_south-east-door"], all_doors["10a_d-03_west"]), + "10a_d-00_south-west-door---10a_d-01_east": RoomConnection("10a", all_doors["10a_d-00_south-west-door"], all_doors["10a_d-01_east"]), + "10a_d-00_west-door---10a_d-02_bottom": RoomConnection("10a", all_doors["10a_d-00_west-door"], all_doors["10a_d-02_bottom"]), + "10a_d-00_north-west-door---10a_d-05_west": RoomConnection("10a", all_doors["10a_d-00_north-west-door"], all_doors["10a_d-05_west"]), + "10a_d-00_north---10a_d-05_south": RoomConnection("10a", all_doors["10a_d-00_north"], all_doors["10a_d-05_south"]), + "10a_d-05_north---10a_e-00y_south": RoomConnection("10a", all_doors["10a_d-05_north"], all_doors["10a_e-00y_south"]), + "10a_e-00y_north---10a_e-00z_south": RoomConnection("10a", all_doors["10a_e-00y_north"], all_doors["10a_e-00z_south"]), + "10a_e-00y_south-east---10a_e-00yb_south": RoomConnection("10a", all_doors["10a_e-00y_south-east"], all_doors["10a_e-00yb_south"]), + "10a_e-00yb_north---10a_e-00y_north-east": RoomConnection("10a", all_doors["10a_e-00yb_north"], all_doors["10a_e-00y_north-east"]), + "10a_e-00z_north---10a_e-00_south": RoomConnection("10a", all_doors["10a_e-00z_north"], all_doors["10a_e-00_south"]), + "10a_e-00_north---10a_e-00b_south": RoomConnection("10a", all_doors["10a_e-00_north"], all_doors["10a_e-00b_south"]), + "10a_e-00b_north---10a_e-01_south": RoomConnection("10a", all_doors["10a_e-00b_north"], all_doors["10a_e-01_south"]), + "10a_e-01_north---10a_e-02_west": RoomConnection("10a", all_doors["10a_e-01_north"], all_doors["10a_e-02_west"]), + "10a_e-02_east---10a_e-03_west": RoomConnection("10a", all_doors["10a_e-02_east"], all_doors["10a_e-03_west"]), + "10a_e-03_east---10a_e-04_west": RoomConnection("10a", all_doors["10a_e-03_east"], all_doors["10a_e-04_west"]), + "10a_e-04_east---10a_e-05_west": RoomConnection("10a", all_doors["10a_e-04_east"], all_doors["10a_e-05_west"]), + "10a_e-05_east---10a_e-05b_west": RoomConnection("10a", all_doors["10a_e-05_east"], all_doors["10a_e-05b_west"]), + "10a_e-05b_east---10a_e-05c_west": RoomConnection("10a", all_doors["10a_e-05b_east"], all_doors["10a_e-05c_west"]), + "10a_e-05c_east---10a_e-06_west": RoomConnection("10a", all_doors["10a_e-05c_east"], all_doors["10a_e-06_west"]), + "10a_e-06_east---10a_e-07_west": RoomConnection("10a", all_doors["10a_e-06_east"], all_doors["10a_e-07_west"]), + "10a_e-07_east---10a_e-08_west": RoomConnection("10a", all_doors["10a_e-07_east"], all_doors["10a_e-08_west"]), + + "10b_f-door_east---10b_f-00_west": RoomConnection("10b", all_doors["10b_f-door_east"], all_doors["10b_f-00_west"]), + "10b_f-00_east---10b_f-01_west": RoomConnection("10b", all_doors["10b_f-00_east"], all_doors["10b_f-01_west"]), + "10b_f-01_east---10b_f-02_west": RoomConnection("10b", all_doors["10b_f-01_east"], all_doors["10b_f-02_west"]), + "10b_f-02_east---10b_f-03_west": RoomConnection("10b", all_doors["10b_f-02_east"], all_doors["10b_f-03_west"]), + "10b_f-03_east---10b_f-04_west": RoomConnection("10b", all_doors["10b_f-03_east"], all_doors["10b_f-04_west"]), + "10b_f-04_east---10b_f-05_west": RoomConnection("10b", all_doors["10b_f-04_east"], all_doors["10b_f-05_west"]), + "10b_f-05_east---10b_f-06_west": RoomConnection("10b", all_doors["10b_f-05_east"], all_doors["10b_f-06_west"]), + "10b_f-06_east---10b_f-07_west": RoomConnection("10b", all_doors["10b_f-06_east"], all_doors["10b_f-07_west"]), + "10b_f-07_east---10b_f-08_west": RoomConnection("10b", all_doors["10b_f-07_east"], all_doors["10b_f-08_west"]), + "10b_f-08_east---10b_f-09_west": RoomConnection("10b", all_doors["10b_f-08_east"], all_doors["10b_f-09_west"]), + "10b_f-09_east---10b_g-00_bottom": RoomConnection("10b", all_doors["10b_f-09_east"], all_doors["10b_g-00_bottom"]), + "10b_g-00_top---10b_g-01_bottom": RoomConnection("10b", all_doors["10b_g-00_top"], all_doors["10b_g-01_bottom"]), + "10b_g-01_top---10b_g-03_bottom": RoomConnection("10b", all_doors["10b_g-01_top"], all_doors["10b_g-03_bottom"]), + "10b_g-03_top---10b_g-02_west": RoomConnection("10b", all_doors["10b_g-03_top"], all_doors["10b_g-02_west"]), + "10b_g-02_east---10b_g-04_west": RoomConnection("10b", all_doors["10b_g-02_east"], all_doors["10b_g-04_west"]), + "10b_g-04_east---10b_g-05_west": RoomConnection("10b", all_doors["10b_g-04_east"], all_doors["10b_g-05_west"]), + "10b_g-05_east---10b_g-06_west": RoomConnection("10b", all_doors["10b_g-05_east"], all_doors["10b_g-06_west"]), + "10b_g-06_east---10b_h-00b_west": RoomConnection("10b", all_doors["10b_g-06_east"], all_doors["10b_h-00b_west"]), + "10b_h-00b_east---10b_h-00_west": RoomConnection("10b", all_doors["10b_h-00b_east"], all_doors["10b_h-00_west"]), + "10b_h-00_east---10b_h-01_west": RoomConnection("10b", all_doors["10b_h-00_east"], all_doors["10b_h-01_west"]), + "10b_h-01_east---10b_h-02_west": RoomConnection("10b", all_doors["10b_h-01_east"], all_doors["10b_h-02_west"]), + "10b_h-02_east---10b_h-03_west": RoomConnection("10b", all_doors["10b_h-02_east"], all_doors["10b_h-03_west"]), + "10b_h-03_east---10b_h-03b_west": RoomConnection("10b", all_doors["10b_h-03_east"], all_doors["10b_h-03b_west"]), + "10b_h-03b_east---10b_h-04_top": RoomConnection("10b", all_doors["10b_h-03b_east"], all_doors["10b_h-04_top"]), + "10b_h-04_east---10b_h-04b_west": RoomConnection("10b", all_doors["10b_h-04_east"], all_doors["10b_h-04b_west"]), + "10b_h-04_bottom---10b_h-05_west": RoomConnection("10b", all_doors["10b_h-04_bottom"], all_doors["10b_h-05_west"]), + "10b_h-04b_east---10b_h-05_top": RoomConnection("10b", all_doors["10b_h-04b_east"], all_doors["10b_h-05_top"]), + "10b_h-05_east---10b_h-06_west": RoomConnection("10b", all_doors["10b_h-05_east"], all_doors["10b_h-06_west"]), + "10b_h-06_east---10b_h-06b_bottom": RoomConnection("10b", all_doors["10b_h-06_east"], all_doors["10b_h-06b_bottom"]), + "10b_h-06b_top---10b_h-07_west": RoomConnection("10b", all_doors["10b_h-06b_top"], all_doors["10b_h-07_west"]), + "10b_h-07_east---10b_h-08_west": RoomConnection("10b", all_doors["10b_h-07_east"], all_doors["10b_h-08_west"]), + "10b_h-08_east---10b_h-09_west": RoomConnection("10b", all_doors["10b_h-08_east"], all_doors["10b_h-09_west"]), + "10b_h-09_east---10b_h-10_west": RoomConnection("10b", all_doors["10b_h-09_east"], all_doors["10b_h-10_west"]), + "10b_h-10_east---10b_i-00_west": RoomConnection("10b", all_doors["10b_h-10_east"], all_doors["10b_i-00_west"]), + "10b_i-00_east---10b_i-00b_west": RoomConnection("10b", all_doors["10b_i-00_east"], all_doors["10b_i-00b_west"]), + "10b_i-00b_east---10b_i-01_west": RoomConnection("10b", all_doors["10b_i-00b_east"], all_doors["10b_i-01_west"]), + "10b_i-01_east---10b_i-02_west": RoomConnection("10b", all_doors["10b_i-01_east"], all_doors["10b_i-02_west"]), + "10b_i-02_east---10b_i-03_west": RoomConnection("10b", all_doors["10b_i-02_east"], all_doors["10b_i-03_west"]), + "10b_i-03_east---10b_i-04_west": RoomConnection("10b", all_doors["10b_i-03_east"], all_doors["10b_i-04_west"]), + "10b_i-04_east---10b_i-05_west": RoomConnection("10b", all_doors["10b_i-04_east"], all_doors["10b_i-05_west"]), + "10b_i-05_east---10b_j-00_west": RoomConnection("10b", all_doors["10b_i-05_east"], all_doors["10b_j-00_west"]), + "10b_j-00_east---10b_j-00b_west": RoomConnection("10b", all_doors["10b_j-00_east"], all_doors["10b_j-00b_west"]), + "10b_j-00b_east---10b_j-01_west": RoomConnection("10b", all_doors["10b_j-00b_east"], all_doors["10b_j-01_west"]), + "10b_j-01_east---10b_j-02_west": RoomConnection("10b", all_doors["10b_j-01_east"], all_doors["10b_j-02_west"]), + "10b_j-02_east---10b_j-03_west": RoomConnection("10b", all_doors["10b_j-02_east"], all_doors["10b_j-03_west"]), + "10b_j-03_east---10b_j-04_west": RoomConnection("10b", all_doors["10b_j-03_east"], all_doors["10b_j-04_west"]), + "10b_j-04_east---10b_j-05_west": RoomConnection("10b", all_doors["10b_j-04_east"], all_doors["10b_j-05_west"]), + "10b_j-05_east---10b_j-06_west": RoomConnection("10b", all_doors["10b_j-05_east"], all_doors["10b_j-06_west"]), + "10b_j-06_east---10b_j-07_west": RoomConnection("10b", all_doors["10b_j-06_east"], all_doors["10b_j-07_west"]), + "10b_j-07_east---10b_j-08_west": RoomConnection("10b", all_doors["10b_j-07_east"], all_doors["10b_j-08_west"]), + "10b_j-08_east---10b_j-09_west": RoomConnection("10b", all_doors["10b_j-08_east"], all_doors["10b_j-09_west"]), + "10b_j-09_east---10b_j-10_west": RoomConnection("10b", all_doors["10b_j-09_east"], all_doors["10b_j-10_west"]), + "10b_j-10_east---10b_j-11_west": RoomConnection("10b", all_doors["10b_j-10_east"], all_doors["10b_j-11_west"]), + "10b_j-11_east---10b_j-12_west": RoomConnection("10b", all_doors["10b_j-11_east"], all_doors["10b_j-12_west"]), + "10b_j-12_east---10b_j-13_west": RoomConnection("10b", all_doors["10b_j-12_east"], all_doors["10b_j-13_west"]), + "10b_j-13_east---10b_j-14_west": RoomConnection("10b", all_doors["10b_j-13_east"], all_doors["10b_j-14_west"]), + "10b_j-14_east---10b_j-14b_west": RoomConnection("10b", all_doors["10b_j-14_east"], all_doors["10b_j-14b_west"]), + "10b_j-14b_east---10b_j-15_west": RoomConnection("10b", all_doors["10b_j-14b_east"], all_doors["10b_j-15_west"]), + "10b_j-15_east---10b_j-16_west": RoomConnection("10b", all_doors["10b_j-15_east"], all_doors["10b_j-16_west"]), + "10b_j-16_east---10b_GOAL_main": RoomConnection("10b", all_doors["10b_j-16_east"], all_doors["10b_GOAL_main"]), + "10b_j-16_top---10b_j-17_south": RoomConnection("10b", all_doors["10b_j-16_top"], all_doors["10b_j-17_south"]), + "10b_j-17_west---10b_j-18_west": RoomConnection("10b", all_doors["10b_j-17_west"], all_doors["10b_j-18_west"]), + "10b_j-17_east---10b_j-19_bottom": RoomConnection("10b", all_doors["10b_j-17_east"], all_doors["10b_j-19_bottom"]), + "10b_j-18_east---10b_j-17_north": RoomConnection("10b", all_doors["10b_j-18_east"], all_doors["10b_j-17_north"]), + "10b_j-19_top---10b_GOAL_moon": RoomConnection("10b", all_doors["10b_j-19_top"], all_doors["10b_GOAL_moon"]), + + +} + +all_rooms: dict[str, Room] = { + "0a_-1": Room("0a", "0a_-1", "Prologue - Room -1", [reg for _, reg in all_regions.items() if reg.room_name == "0a_-1"], [door for _, door in all_doors.items() if door.room_name == "0a_-1"]), + "0a_0": Room("0a", "0a_0", "Prologue - Room 0", [reg for _, reg in all_regions.items() if reg.room_name == "0a_0"], [door for _, door in all_doors.items() if door.room_name == "0a_0"], "Start", "0a_0_west"), + "0a_0b": Room("0a", "0a_0b", "Prologue - Room 0b", [reg for _, reg in all_regions.items() if reg.room_name == "0a_0b"], [door for _, door in all_doors.items() if door.room_name == "0a_0b"]), + "0a_1": Room("0a", "0a_1", "Prologue - Room 1", [reg for _, reg in all_regions.items() if reg.room_name == "0a_1"], [door for _, door in all_doors.items() if door.room_name == "0a_1"]), + "0a_2": Room("0a", "0a_2", "Prologue - Room 2", [reg for _, reg in all_regions.items() if reg.room_name == "0a_2"], [door for _, door in all_doors.items() if door.room_name == "0a_2"]), + "0a_3": Room("0a", "0a_3", "Prologue - Room 3", [reg for _, reg in all_regions.items() if reg.room_name == "0a_3"], [door for _, door in all_doors.items() if door.room_name == "0a_3"]), + + "1a_1": Room("1a", "1a_1", "Forsaken City A - Room 1", [reg for _, reg in all_regions.items() if reg.room_name == "1a_1"], [door for _, door in all_doors.items() if door.room_name == "1a_1"], "Start", "1a_1_main"), + "1a_2": Room("1a", "1a_2", "Forsaken City A - Room 2", [reg for _, reg in all_regions.items() if reg.room_name == "1a_2"], [door for _, door in all_doors.items() if door.room_name == "1a_2"]), + "1a_3": Room("1a", "1a_3", "Forsaken City A - Room 3", [reg for _, reg in all_regions.items() if reg.room_name == "1a_3"], [door for _, door in all_doors.items() if door.room_name == "1a_3"]), + "1a_4": Room("1a", "1a_4", "Forsaken City A - Room 4", [reg for _, reg in all_regions.items() if reg.room_name == "1a_4"], [door for _, door in all_doors.items() if door.room_name == "1a_4"]), + "1a_3b": Room("1a", "1a_3b", "Forsaken City A - Room 3b", [reg for _, reg in all_regions.items() if reg.room_name == "1a_3b"], [door for _, door in all_doors.items() if door.room_name == "1a_3b"]), + "1a_5": Room("1a", "1a_5", "Forsaken City A - Room 5", [reg for _, reg in all_regions.items() if reg.room_name == "1a_5"], [door for _, door in all_doors.items() if door.room_name == "1a_5"]), + "1a_5z": Room("1a", "1a_5z", "Forsaken City A - Room 5z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_5z"], [door for _, door in all_doors.items() if door.room_name == "1a_5z"]), + "1a_5a": Room("1a", "1a_5a", "Forsaken City A - Room 5a", [reg for _, reg in all_regions.items() if reg.room_name == "1a_5a"], [door for _, door in all_doors.items() if door.room_name == "1a_5a"]), + "1a_6": Room("1a", "1a_6", "Forsaken City A - Room 6", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6"], [door for _, door in all_doors.items() if door.room_name == "1a_6"], "Crossing", "1a_6_south-west"), + "1a_6z": Room("1a", "1a_6z", "Forsaken City A - Room 6z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6z"], [door for _, door in all_doors.items() if door.room_name == "1a_6z"]), + "1a_6zb": Room("1a", "1a_6zb", "Forsaken City A - Room 6zb", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6zb"], [door for _, door in all_doors.items() if door.room_name == "1a_6zb"]), + "1a_7zb": Room("1a", "1a_7zb", "Forsaken City A - Room 7zb", [reg for _, reg in all_regions.items() if reg.room_name == "1a_7zb"], [door for _, door in all_doors.items() if door.room_name == "1a_7zb"]), + "1a_6a": Room("1a", "1a_6a", "Forsaken City A - Room 6a", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6a"], [door for _, door in all_doors.items() if door.room_name == "1a_6a"]), + "1a_6b": Room("1a", "1a_6b", "Forsaken City A - Room 6b", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6b"], [door for _, door in all_doors.items() if door.room_name == "1a_6b"]), + "1a_s0": Room("1a", "1a_s0", "Forsaken City A - Room s0", [reg for _, reg in all_regions.items() if reg.room_name == "1a_s0"], [door for _, door in all_doors.items() if door.room_name == "1a_s0"]), + "1a_s1": Room("1a", "1a_s1", "Forsaken City A - Room s1", [reg for _, reg in all_regions.items() if reg.room_name == "1a_s1"], [door for _, door in all_doors.items() if door.room_name == "1a_s1"]), + "1a_6c": Room("1a", "1a_6c", "Forsaken City A - Room 6c", [reg for _, reg in all_regions.items() if reg.room_name == "1a_6c"], [door for _, door in all_doors.items() if door.room_name == "1a_6c"]), + "1a_7": Room("1a", "1a_7", "Forsaken City A - Room 7", [reg for _, reg in all_regions.items() if reg.room_name == "1a_7"], [door for _, door in all_doors.items() if door.room_name == "1a_7"]), + "1a_7z": Room("1a", "1a_7z", "Forsaken City A - Room 7z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_7z"], [door for _, door in all_doors.items() if door.room_name == "1a_7z"]), + "1a_8z": Room("1a", "1a_8z", "Forsaken City A - Room 8z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_8z"], [door for _, door in all_doors.items() if door.room_name == "1a_8z"]), + "1a_8zb": Room("1a", "1a_8zb", "Forsaken City A - Room 8zb", [reg for _, reg in all_regions.items() if reg.room_name == "1a_8zb"], [door for _, door in all_doors.items() if door.room_name == "1a_8zb"]), + "1a_8": Room("1a", "1a_8", "Forsaken City A - Room 8", [reg for _, reg in all_regions.items() if reg.room_name == "1a_8"], [door for _, door in all_doors.items() if door.room_name == "1a_8"]), + "1a_7a": Room("1a", "1a_7a", "Forsaken City A - Room 7a", [reg for _, reg in all_regions.items() if reg.room_name == "1a_7a"], [door for _, door in all_doors.items() if door.room_name == "1a_7a"]), + "1a_9z": Room("1a", "1a_9z", "Forsaken City A - Room 9z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_9z"], [door for _, door in all_doors.items() if door.room_name == "1a_9z"]), + "1a_8b": Room("1a", "1a_8b", "Forsaken City A - Room 8b", [reg for _, reg in all_regions.items() if reg.room_name == "1a_8b"], [door for _, door in all_doors.items() if door.room_name == "1a_8b"]), + "1a_9": Room("1a", "1a_9", "Forsaken City A - Room 9", [reg for _, reg in all_regions.items() if reg.room_name == "1a_9"], [door for _, door in all_doors.items() if door.room_name == "1a_9"]), + "1a_9b": Room("1a", "1a_9b", "Forsaken City A - Room 9b", [reg for _, reg in all_regions.items() if reg.room_name == "1a_9b"], [door for _, door in all_doors.items() if door.room_name == "1a_9b"], "Chasm", "1a_9b_west"), + "1a_9c": Room("1a", "1a_9c", "Forsaken City A - Room 9c", [reg for _, reg in all_regions.items() if reg.room_name == "1a_9c"], [door for _, door in all_doors.items() if door.room_name == "1a_9c"]), + "1a_10": Room("1a", "1a_10", "Forsaken City A - Room 10", [reg for _, reg in all_regions.items() if reg.room_name == "1a_10"], [door for _, door in all_doors.items() if door.room_name == "1a_10"]), + "1a_10z": Room("1a", "1a_10z", "Forsaken City A - Room 10z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_10z"], [door for _, door in all_doors.items() if door.room_name == "1a_10z"]), + "1a_10zb": Room("1a", "1a_10zb", "Forsaken City A - Room 10zb", [reg for _, reg in all_regions.items() if reg.room_name == "1a_10zb"], [door for _, door in all_doors.items() if door.room_name == "1a_10zb"]), + "1a_11": Room("1a", "1a_11", "Forsaken City A - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "1a_11"], [door for _, door in all_doors.items() if door.room_name == "1a_11"]), + "1a_11z": Room("1a", "1a_11z", "Forsaken City A - Room 11z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_11z"], [door for _, door in all_doors.items() if door.room_name == "1a_11z"]), + "1a_10a": Room("1a", "1a_10a", "Forsaken City A - Room 10a", [reg for _, reg in all_regions.items() if reg.room_name == "1a_10a"], [door for _, door in all_doors.items() if door.room_name == "1a_10a"]), + "1a_12": Room("1a", "1a_12", "Forsaken City A - Room 12", [reg for _, reg in all_regions.items() if reg.room_name == "1a_12"], [door for _, door in all_doors.items() if door.room_name == "1a_12"]), + "1a_12z": Room("1a", "1a_12z", "Forsaken City A - Room 12z", [reg for _, reg in all_regions.items() if reg.room_name == "1a_12z"], [door for _, door in all_doors.items() if door.room_name == "1a_12z"]), + "1a_12a": Room("1a", "1a_12a", "Forsaken City A - Room 12a", [reg for _, reg in all_regions.items() if reg.room_name == "1a_12a"], [door for _, door in all_doors.items() if door.room_name == "1a_12a"]), + "1a_end": Room("1a", "1a_end", "Forsaken City A - Room end", [reg for _, reg in all_regions.items() if reg.room_name == "1a_end"], [door for _, door in all_doors.items() if door.room_name == "1a_end"]), + + "1b_00": Room("1b", "1b_00", "Forsaken City B - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "1b_00"], [door for _, door in all_doors.items() if door.room_name == "1b_00"], "Start", "1b_00_west"), + "1b_01": Room("1b", "1b_01", "Forsaken City B - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "1b_01"], [door for _, door in all_doors.items() if door.room_name == "1b_01"]), + "1b_02": Room("1b", "1b_02", "Forsaken City B - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "1b_02"], [door for _, door in all_doors.items() if door.room_name == "1b_02"]), + "1b_02b": Room("1b", "1b_02b", "Forsaken City B - Room 02b", [reg for _, reg in all_regions.items() if reg.room_name == "1b_02b"], [door for _, door in all_doors.items() if door.room_name == "1b_02b"]), + "1b_03": Room("1b", "1b_03", "Forsaken City B - Room 03", [reg for _, reg in all_regions.items() if reg.room_name == "1b_03"], [door for _, door in all_doors.items() if door.room_name == "1b_03"]), + "1b_04": Room("1b", "1b_04", "Forsaken City B - Room 04", [reg for _, reg in all_regions.items() if reg.room_name == "1b_04"], [door for _, door in all_doors.items() if door.room_name == "1b_04"], "Contraption", "1b_04_west"), + "1b_05": Room("1b", "1b_05", "Forsaken City B - Room 05", [reg for _, reg in all_regions.items() if reg.room_name == "1b_05"], [door for _, door in all_doors.items() if door.room_name == "1b_05"]), + "1b_05b": Room("1b", "1b_05b", "Forsaken City B - Room 05b", [reg for _, reg in all_regions.items() if reg.room_name == "1b_05b"], [door for _, door in all_doors.items() if door.room_name == "1b_05b"]), + "1b_06": Room("1b", "1b_06", "Forsaken City B - Room 06", [reg for _, reg in all_regions.items() if reg.room_name == "1b_06"], [door for _, door in all_doors.items() if door.room_name == "1b_06"]), + "1b_07": Room("1b", "1b_07", "Forsaken City B - Room 07", [reg for _, reg in all_regions.items() if reg.room_name == "1b_07"], [door for _, door in all_doors.items() if door.room_name == "1b_07"]), + "1b_08": Room("1b", "1b_08", "Forsaken City B - Room 08", [reg for _, reg in all_regions.items() if reg.room_name == "1b_08"], [door for _, door in all_doors.items() if door.room_name == "1b_08"], "Scrap Pit", "1b_08_west"), + "1b_08b": Room("1b", "1b_08b", "Forsaken City B - Room 08b", [reg for _, reg in all_regions.items() if reg.room_name == "1b_08b"], [door for _, door in all_doors.items() if door.room_name == "1b_08b"]), + "1b_09": Room("1b", "1b_09", "Forsaken City B - Room 09", [reg for _, reg in all_regions.items() if reg.room_name == "1b_09"], [door for _, door in all_doors.items() if door.room_name == "1b_09"]), + "1b_10": Room("1b", "1b_10", "Forsaken City B - Room 10", [reg for _, reg in all_regions.items() if reg.room_name == "1b_10"], [door for _, door in all_doors.items() if door.room_name == "1b_10"]), + "1b_11": Room("1b", "1b_11", "Forsaken City B - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "1b_11"], [door for _, door in all_doors.items() if door.room_name == "1b_11"]), + "1b_end": Room("1b", "1b_end", "Forsaken City B - Room end", [reg for _, reg in all_regions.items() if reg.room_name == "1b_end"], [door for _, door in all_doors.items() if door.room_name == "1b_end"]), + + "1c_00": Room("1c", "1c_00", "Forsaken City C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "1c_00"], [door for _, door in all_doors.items() if door.room_name == "1c_00"], "Start", "1c_00_west"), + "1c_01": Room("1c", "1c_01", "Forsaken City C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "1c_01"], [door for _, door in all_doors.items() if door.room_name == "1c_01"]), + "1c_02": Room("1c", "1c_02", "Forsaken City C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "1c_02"], [door for _, door in all_doors.items() if door.room_name == "1c_02"]), + + "2a_start": Room("2a", "2a_start", "Old Site A - Room start", [reg for _, reg in all_regions.items() if reg.room_name == "2a_start"], [door for _, door in all_doors.items() if door.room_name == "2a_start"], "Start", "2a_start_main"), + "2a_s0": Room("2a", "2a_s0", "Old Site A - Room s0", [reg for _, reg in all_regions.items() if reg.room_name == "2a_s0"], [door for _, door in all_doors.items() if door.room_name == "2a_s0"]), + "2a_s1": Room("2a", "2a_s1", "Old Site A - Room s1", [reg for _, reg in all_regions.items() if reg.room_name == "2a_s1"], [door for _, door in all_doors.items() if door.room_name == "2a_s1"]), + "2a_s2": Room("2a", "2a_s2", "Old Site A - Room s2", [reg for _, reg in all_regions.items() if reg.room_name == "2a_s2"], [door for _, door in all_doors.items() if door.room_name == "2a_s2"]), + "2a_0": Room("2a", "2a_0", "Old Site A - Room 0", [reg for _, reg in all_regions.items() if reg.room_name == "2a_0"], [door for _, door in all_doors.items() if door.room_name == "2a_0"]), + "2a_1": Room("2a", "2a_1", "Old Site A - Room 1", [reg for _, reg in all_regions.items() if reg.room_name == "2a_1"], [door for _, door in all_doors.items() if door.room_name == "2a_1"]), + "2a_d0": Room("2a", "2a_d0", "Old Site A - Room d0", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d0"], [door for _, door in all_doors.items() if door.room_name == "2a_d0"]), + "2a_d7": Room("2a", "2a_d7", "Old Site A - Room d7", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d7"], [door for _, door in all_doors.items() if door.room_name == "2a_d7"]), + "2a_d8": Room("2a", "2a_d8", "Old Site A - Room d8", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d8"], [door for _, door in all_doors.items() if door.room_name == "2a_d8"]), + "2a_d3": Room("2a", "2a_d3", "Old Site A - Room d3", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d3"], [door for _, door in all_doors.items() if door.room_name == "2a_d3"]), + "2a_d2": Room("2a", "2a_d2", "Old Site A - Room d2", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d2"], [door for _, door in all_doors.items() if door.room_name == "2a_d2"]), + "2a_d9": Room("2a", "2a_d9", "Old Site A - Room d9", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d9"], [door for _, door in all_doors.items() if door.room_name == "2a_d9"]), + "2a_d1": Room("2a", "2a_d1", "Old Site A - Room d1", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d1"], [door for _, door in all_doors.items() if door.room_name == "2a_d1"]), + "2a_d6": Room("2a", "2a_d6", "Old Site A - Room d6", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d6"], [door for _, door in all_doors.items() if door.room_name == "2a_d6"]), + "2a_d4": Room("2a", "2a_d4", "Old Site A - Room d4", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d4"], [door for _, door in all_doors.items() if door.room_name == "2a_d4"]), + "2a_d5": Room("2a", "2a_d5", "Old Site A - Room d5", [reg for _, reg in all_regions.items() if reg.room_name == "2a_d5"], [door for _, door in all_doors.items() if door.room_name == "2a_d5"]), + "2a_3x": Room("2a", "2a_3x", "Old Site A - Room 3x", [reg for _, reg in all_regions.items() if reg.room_name == "2a_3x"], [door for _, door in all_doors.items() if door.room_name == "2a_3x"]), + "2a_3": Room("2a", "2a_3", "Old Site A - Room 3", [reg for _, reg in all_regions.items() if reg.room_name == "2a_3"], [door for _, door in all_doors.items() if door.room_name == "2a_3"], "Intervention", "2a_3_bottom"), + "2a_4": Room("2a", "2a_4", "Old Site A - Room 4", [reg for _, reg in all_regions.items() if reg.room_name == "2a_4"], [door for _, door in all_doors.items() if door.room_name == "2a_4"]), + "2a_5": Room("2a", "2a_5", "Old Site A - Room 5", [reg for _, reg in all_regions.items() if reg.room_name == "2a_5"], [door for _, door in all_doors.items() if door.room_name == "2a_5"]), + "2a_6": Room("2a", "2a_6", "Old Site A - Room 6", [reg for _, reg in all_regions.items() if reg.room_name == "2a_6"], [door for _, door in all_doors.items() if door.room_name == "2a_6"]), + "2a_7": Room("2a", "2a_7", "Old Site A - Room 7", [reg for _, reg in all_regions.items() if reg.room_name == "2a_7"], [door for _, door in all_doors.items() if door.room_name == "2a_7"]), + "2a_8": Room("2a", "2a_8", "Old Site A - Room 8", [reg for _, reg in all_regions.items() if reg.room_name == "2a_8"], [door for _, door in all_doors.items() if door.room_name == "2a_8"]), + "2a_9": Room("2a", "2a_9", "Old Site A - Room 9", [reg for _, reg in all_regions.items() if reg.room_name == "2a_9"], [door for _, door in all_doors.items() if door.room_name == "2a_9"]), + "2a_9b": Room("2a", "2a_9b", "Old Site A - Room 9b", [reg for _, reg in all_regions.items() if reg.room_name == "2a_9b"], [door for _, door in all_doors.items() if door.room_name == "2a_9b"]), + "2a_10": Room("2a", "2a_10", "Old Site A - Room 10", [reg for _, reg in all_regions.items() if reg.room_name == "2a_10"], [door for _, door in all_doors.items() if door.room_name == "2a_10"]), + "2a_2": Room("2a", "2a_2", "Old Site A - Room 2", [reg for _, reg in all_regions.items() if reg.room_name == "2a_2"], [door for _, door in all_doors.items() if door.room_name == "2a_2"]), + "2a_11": Room("2a", "2a_11", "Old Site A - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "2a_11"], [door for _, door in all_doors.items() if door.room_name == "2a_11"]), + "2a_12b": Room("2a", "2a_12b", "Old Site A - Room 12b", [reg for _, reg in all_regions.items() if reg.room_name == "2a_12b"], [door for _, door in all_doors.items() if door.room_name == "2a_12b"]), + "2a_12c": Room("2a", "2a_12c", "Old Site A - Room 12c", [reg for _, reg in all_regions.items() if reg.room_name == "2a_12c"], [door for _, door in all_doors.items() if door.room_name == "2a_12c"]), + "2a_12d": Room("2a", "2a_12d", "Old Site A - Room 12d", [reg for _, reg in all_regions.items() if reg.room_name == "2a_12d"], [door for _, door in all_doors.items() if door.room_name == "2a_12d"]), + "2a_12": Room("2a", "2a_12", "Old Site A - Room 12", [reg for _, reg in all_regions.items() if reg.room_name == "2a_12"], [door for _, door in all_doors.items() if door.room_name == "2a_12"]), + "2a_13": Room("2a", "2a_13", "Old Site A - Room 13", [reg for _, reg in all_regions.items() if reg.room_name == "2a_13"], [door for _, door in all_doors.items() if door.room_name == "2a_13"]), + "2a_end_0": Room("2a", "2a_end_0", "Old Site A - Room end_0", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_0"], [door for _, door in all_doors.items() if door.room_name == "2a_end_0"]), + "2a_end_s0": Room("2a", "2a_end_s0", "Old Site A - Room end_s0", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_s0"], [door for _, door in all_doors.items() if door.room_name == "2a_end_s0"]), + "2a_end_s1": Room("2a", "2a_end_s1", "Old Site A - Room end_s1", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_s1"], [door for _, door in all_doors.items() if door.room_name == "2a_end_s1"]), + "2a_end_1": Room("2a", "2a_end_1", "Old Site A - Room end_1", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_1"], [door for _, door in all_doors.items() if door.room_name == "2a_end_1"]), + "2a_end_2": Room("2a", "2a_end_2", "Old Site A - Room end_2", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_2"], [door for _, door in all_doors.items() if door.room_name == "2a_end_2"]), + "2a_end_3": Room("2a", "2a_end_3", "Old Site A - Room end_3", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_3"], [door for _, door in all_doors.items() if door.room_name == "2a_end_3"], "Awake", "2a_end_3_west"), + "2a_end_4": Room("2a", "2a_end_4", "Old Site A - Room end_4", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_4"], [door for _, door in all_doors.items() if door.room_name == "2a_end_4"]), + "2a_end_3b": Room("2a", "2a_end_3b", "Old Site A - Room end_3b", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_3b"], [door for _, door in all_doors.items() if door.room_name == "2a_end_3b"]), + "2a_end_3cb": Room("2a", "2a_end_3cb", "Old Site A - Room end_3cb", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_3cb"], [door for _, door in all_doors.items() if door.room_name == "2a_end_3cb"]), + "2a_end_3c": Room("2a", "2a_end_3c", "Old Site A - Room end_3c", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_3c"], [door for _, door in all_doors.items() if door.room_name == "2a_end_3c"]), + "2a_end_5": Room("2a", "2a_end_5", "Old Site A - Room end_5", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_5"], [door for _, door in all_doors.items() if door.room_name == "2a_end_5"]), + "2a_end_6": Room("2a", "2a_end_6", "Old Site A - Room end_6", [reg for _, reg in all_regions.items() if reg.room_name == "2a_end_6"], [door for _, door in all_doors.items() if door.room_name == "2a_end_6"]), + + "2b_start": Room("2b", "2b_start", "Old Site B - Room start", [reg for _, reg in all_regions.items() if reg.room_name == "2b_start"], [door for _, door in all_doors.items() if door.room_name == "2b_start"], "Start", "2b_start_west"), + "2b_00": Room("2b", "2b_00", "Old Site B - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "2b_00"], [door for _, door in all_doors.items() if door.room_name == "2b_00"]), + "2b_01": Room("2b", "2b_01", "Old Site B - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "2b_01"], [door for _, door in all_doors.items() if door.room_name == "2b_01"]), + "2b_01b": Room("2b", "2b_01b", "Old Site B - Room 01b", [reg for _, reg in all_regions.items() if reg.room_name == "2b_01b"], [door for _, door in all_doors.items() if door.room_name == "2b_01b"]), + "2b_02b": Room("2b", "2b_02b", "Old Site B - Room 02b", [reg for _, reg in all_regions.items() if reg.room_name == "2b_02b"], [door for _, door in all_doors.items() if door.room_name == "2b_02b"]), + "2b_02": Room("2b", "2b_02", "Old Site B - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "2b_02"], [door for _, door in all_doors.items() if door.room_name == "2b_02"]), + "2b_03": Room("2b", "2b_03", "Old Site B - Room 03", [reg for _, reg in all_regions.items() if reg.room_name == "2b_03"], [door for _, door in all_doors.items() if door.room_name == "2b_03"], "Combination Lock", "2b_03_west"), + "2b_04": Room("2b", "2b_04", "Old Site B - Room 04", [reg for _, reg in all_regions.items() if reg.room_name == "2b_04"], [door for _, door in all_doors.items() if door.room_name == "2b_04"]), + "2b_05": Room("2b", "2b_05", "Old Site B - Room 05", [reg for _, reg in all_regions.items() if reg.room_name == "2b_05"], [door for _, door in all_doors.items() if door.room_name == "2b_05"]), + "2b_06": Room("2b", "2b_06", "Old Site B - Room 06", [reg for _, reg in all_regions.items() if reg.room_name == "2b_06"], [door for _, door in all_doors.items() if door.room_name == "2b_06"]), + "2b_07": Room("2b", "2b_07", "Old Site B - Room 07", [reg for _, reg in all_regions.items() if reg.room_name == "2b_07"], [door for _, door in all_doors.items() if door.room_name == "2b_07"]), + "2b_08b": Room("2b", "2b_08b", "Old Site B - Room 08b", [reg for _, reg in all_regions.items() if reg.room_name == "2b_08b"], [door for _, door in all_doors.items() if door.room_name == "2b_08b"], "Dream Altar", "2b_08b_west"), + "2b_08": Room("2b", "2b_08", "Old Site B - Room 08", [reg for _, reg in all_regions.items() if reg.room_name == "2b_08"], [door for _, door in all_doors.items() if door.room_name == "2b_08"]), + "2b_09": Room("2b", "2b_09", "Old Site B - Room 09", [reg for _, reg in all_regions.items() if reg.room_name == "2b_09"], [door for _, door in all_doors.items() if door.room_name == "2b_09"]), + "2b_10": Room("2b", "2b_10", "Old Site B - Room 10", [reg for _, reg in all_regions.items() if reg.room_name == "2b_10"], [door for _, door in all_doors.items() if door.room_name == "2b_10"]), + "2b_11": Room("2b", "2b_11", "Old Site B - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "2b_11"], [door for _, door in all_doors.items() if door.room_name == "2b_11"]), + "2b_end": Room("2b", "2b_end", "Old Site B - Room end", [reg for _, reg in all_regions.items() if reg.room_name == "2b_end"], [door for _, door in all_doors.items() if door.room_name == "2b_end"]), + + "2c_00": Room("2c", "2c_00", "Old Site C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "2c_00"], [door for _, door in all_doors.items() if door.room_name == "2c_00"], "Start", "2c_00_west"), + "2c_01": Room("2c", "2c_01", "Old Site C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "2c_01"], [door for _, door in all_doors.items() if door.room_name == "2c_01"]), + "2c_02": Room("2c", "2c_02", "Old Site C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "2c_02"], [door for _, door in all_doors.items() if door.room_name == "2c_02"]), + + "3a_s0": Room("3a", "3a_s0", "Celestial Resort A - Room s0", [reg for _, reg in all_regions.items() if reg.room_name == "3a_s0"], [door for _, door in all_doors.items() if door.room_name == "3a_s0"], "Start", "3a_s0_main"), + "3a_s1": Room("3a", "3a_s1", "Celestial Resort A - Room s1", [reg for _, reg in all_regions.items() if reg.room_name == "3a_s1"], [door for _, door in all_doors.items() if door.room_name == "3a_s1"]), + "3a_s2": Room("3a", "3a_s2", "Celestial Resort A - Room s2", [reg for _, reg in all_regions.items() if reg.room_name == "3a_s2"], [door for _, door in all_doors.items() if door.room_name == "3a_s2"]), + "3a_s3": Room("3a", "3a_s3", "Celestial Resort A - Room s3", [reg for _, reg in all_regions.items() if reg.room_name == "3a_s3"], [door for _, door in all_doors.items() if door.room_name == "3a_s3"]), + "3a_0x-a": Room("3a", "3a_0x-a", "Celestial Resort A - Room 0x-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_0x-a"], [door for _, door in all_doors.items() if door.room_name == "3a_0x-a"]), + "3a_00-a": Room("3a", "3a_00-a", "Celestial Resort A - Room 00-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_00-a"], [door for _, door in all_doors.items() if door.room_name == "3a_00-a"]), + "3a_02-a": Room("3a", "3a_02-a", "Celestial Resort A - Room 02-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_02-a"], [door for _, door in all_doors.items() if door.room_name == "3a_02-a"]), + "3a_02-b": Room("3a", "3a_02-b", "Celestial Resort A - Room 02-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_02-b"], [door for _, door in all_doors.items() if door.room_name == "3a_02-b"]), + "3a_01-b": Room("3a", "3a_01-b", "Celestial Resort A - Room 01-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_01-b"], [door for _, door in all_doors.items() if door.room_name == "3a_01-b"]), + "3a_00-b": Room("3a", "3a_00-b", "Celestial Resort A - Room 00-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_00-b"], [door for _, door in all_doors.items() if door.room_name == "3a_00-b"]), + "3a_00-c": Room("3a", "3a_00-c", "Celestial Resort A - Room 00-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_00-c"], [door for _, door in all_doors.items() if door.room_name == "3a_00-c"]), + "3a_0x-b": Room("3a", "3a_0x-b", "Celestial Resort A - Room 0x-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_0x-b"], [door for _, door in all_doors.items() if door.room_name == "3a_0x-b"]), + "3a_03-a": Room("3a", "3a_03-a", "Celestial Resort A - Room 03-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_03-a"], [door for _, door in all_doors.items() if door.room_name == "3a_03-a"]), + "3a_04-b": Room("3a", "3a_04-b", "Celestial Resort A - Room 04-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_04-b"], [door for _, door in all_doors.items() if door.room_name == "3a_04-b"]), + "3a_05-a": Room("3a", "3a_05-a", "Celestial Resort A - Room 05-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_05-a"], [door for _, door in all_doors.items() if door.room_name == "3a_05-a"]), + "3a_06-a": Room("3a", "3a_06-a", "Celestial Resort A - Room 06-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_06-a"], [door for _, door in all_doors.items() if door.room_name == "3a_06-a"]), + "3a_07-a": Room("3a", "3a_07-a", "Celestial Resort A - Room 07-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_07-a"], [door for _, door in all_doors.items() if door.room_name == "3a_07-a"]), + "3a_07-b": Room("3a", "3a_07-b", "Celestial Resort A - Room 07-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_07-b"], [door for _, door in all_doors.items() if door.room_name == "3a_07-b"]), + "3a_06-b": Room("3a", "3a_06-b", "Celestial Resort A - Room 06-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_06-b"], [door for _, door in all_doors.items() if door.room_name == "3a_06-b"]), + "3a_06-c": Room("3a", "3a_06-c", "Celestial Resort A - Room 06-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_06-c"], [door for _, door in all_doors.items() if door.room_name == "3a_06-c"]), + "3a_05-c": Room("3a", "3a_05-c", "Celestial Resort A - Room 05-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_05-c"], [door for _, door in all_doors.items() if door.room_name == "3a_05-c"]), + "3a_08-c": Room("3a", "3a_08-c", "Celestial Resort A - Room 08-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_08-c"], [door for _, door in all_doors.items() if door.room_name == "3a_08-c"]), + "3a_08-b": Room("3a", "3a_08-b", "Celestial Resort A - Room 08-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_08-b"], [door for _, door in all_doors.items() if door.room_name == "3a_08-b"]), + "3a_08-a": Room("3a", "3a_08-a", "Celestial Resort A - Room 08-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_08-a"], [door for _, door in all_doors.items() if door.room_name == "3a_08-a"], "Huge Mess", "3a_08-a_west"), + "3a_09-b": Room("3a", "3a_09-b", "Celestial Resort A - Room 09-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_09-b"], [door for _, door in all_doors.items() if door.room_name == "3a_09-b"]), + "3a_10-x": Room("3a", "3a_10-x", "Celestial Resort A - Room 10-x", [reg for _, reg in all_regions.items() if reg.room_name == "3a_10-x"], [door for _, door in all_doors.items() if door.room_name == "3a_10-x"]), + "3a_11-x": Room("3a", "3a_11-x", "Celestial Resort A - Room 11-x", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-x"], [door for _, door in all_doors.items() if door.room_name == "3a_11-x"]), + "3a_11-y": Room("3a", "3a_11-y", "Celestial Resort A - Room 11-y", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-y"], [door for _, door in all_doors.items() if door.room_name == "3a_11-y"]), + "3a_12-y": Room("3a", "3a_12-y", "Celestial Resort A - Room 12-y", [reg for _, reg in all_regions.items() if reg.room_name == "3a_12-y"], [door for _, door in all_doors.items() if door.room_name == "3a_12-y"]), + "3a_11-z": Room("3a", "3a_11-z", "Celestial Resort A - Room 11-z", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-z"], [door for _, door in all_doors.items() if door.room_name == "3a_11-z"]), + "3a_10-z": Room("3a", "3a_10-z", "Celestial Resort A - Room 10-z", [reg for _, reg in all_regions.items() if reg.room_name == "3a_10-z"], [door for _, door in all_doors.items() if door.room_name == "3a_10-z"]), + "3a_10-y": Room("3a", "3a_10-y", "Celestial Resort A - Room 10-y", [reg for _, reg in all_regions.items() if reg.room_name == "3a_10-y"], [door for _, door in all_doors.items() if door.room_name == "3a_10-y"]), + "3a_10-c": Room("3a", "3a_10-c", "Celestial Resort A - Room 10-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_10-c"], [door for _, door in all_doors.items() if door.room_name == "3a_10-c"]), + "3a_11-c": Room("3a", "3a_11-c", "Celestial Resort A - Room 11-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-c"], [door for _, door in all_doors.items() if door.room_name == "3a_11-c"]), + "3a_12-c": Room("3a", "3a_12-c", "Celestial Resort A - Room 12-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_12-c"], [door for _, door in all_doors.items() if door.room_name == "3a_12-c"]), + "3a_12-d": Room("3a", "3a_12-d", "Celestial Resort A - Room 12-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_12-d"], [door for _, door in all_doors.items() if door.room_name == "3a_12-d"]), + "3a_11-d": Room("3a", "3a_11-d", "Celestial Resort A - Room 11-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-d"], [door for _, door in all_doors.items() if door.room_name == "3a_11-d"]), + "3a_10-d": Room("3a", "3a_10-d", "Celestial Resort A - Room 10-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_10-d"], [door for _, door in all_doors.items() if door.room_name == "3a_10-d"]), + "3a_11-b": Room("3a", "3a_11-b", "Celestial Resort A - Room 11-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-b"], [door for _, door in all_doors.items() if door.room_name == "3a_11-b"]), + "3a_12-b": Room("3a", "3a_12-b", "Celestial Resort A - Room 12-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_12-b"], [door for _, door in all_doors.items() if door.room_name == "3a_12-b"]), + "3a_13-b": Room("3a", "3a_13-b", "Celestial Resort A - Room 13-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_13-b"], [door for _, door in all_doors.items() if door.room_name == "3a_13-b"]), + "3a_13-a": Room("3a", "3a_13-a", "Celestial Resort A - Room 13-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_13-a"], [door for _, door in all_doors.items() if door.room_name == "3a_13-a"]), + "3a_13-x": Room("3a", "3a_13-x", "Celestial Resort A - Room 13-x", [reg for _, reg in all_regions.items() if reg.room_name == "3a_13-x"], [door for _, door in all_doors.items() if door.room_name == "3a_13-x"]), + "3a_12-x": Room("3a", "3a_12-x", "Celestial Resort A - Room 12-x", [reg for _, reg in all_regions.items() if reg.room_name == "3a_12-x"], [door for _, door in all_doors.items() if door.room_name == "3a_12-x"]), + "3a_11-a": Room("3a", "3a_11-a", "Celestial Resort A - Room 11-a", [reg for _, reg in all_regions.items() if reg.room_name == "3a_11-a"], [door for _, door in all_doors.items() if door.room_name == "3a_11-a"]), + "3a_08-x": Room("3a", "3a_08-x", "Celestial Resort A - Room 08-x", [reg for _, reg in all_regions.items() if reg.room_name == "3a_08-x"], [door for _, door in all_doors.items() if door.room_name == "3a_08-x"]), + "3a_09-d": Room("3a", "3a_09-d", "Celestial Resort A - Room 09-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_09-d"], [door for _, door in all_doors.items() if door.room_name == "3a_09-d"], "Elevator Shaft", "3a_09-d_bottom"), + "3a_08-d": Room("3a", "3a_08-d", "Celestial Resort A - Room 08-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_08-d"], [door for _, door in all_doors.items() if door.room_name == "3a_08-d"]), + "3a_06-d": Room("3a", "3a_06-d", "Celestial Resort A - Room 06-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_06-d"], [door for _, door in all_doors.items() if door.room_name == "3a_06-d"]), + "3a_04-d": Room("3a", "3a_04-d", "Celestial Resort A - Room 04-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_04-d"], [door for _, door in all_doors.items() if door.room_name == "3a_04-d"]), + "3a_04-c": Room("3a", "3a_04-c", "Celestial Resort A - Room 04-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_04-c"], [door for _, door in all_doors.items() if door.room_name == "3a_04-c"]), + "3a_02-c": Room("3a", "3a_02-c", "Celestial Resort A - Room 02-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_02-c"], [door for _, door in all_doors.items() if door.room_name == "3a_02-c"]), + "3a_03-b": Room("3a", "3a_03-b", "Celestial Resort A - Room 03-b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_03-b"], [door for _, door in all_doors.items() if door.room_name == "3a_03-b"]), + "3a_01-c": Room("3a", "3a_01-c", "Celestial Resort A - Room 01-c", [reg for _, reg in all_regions.items() if reg.room_name == "3a_01-c"], [door for _, door in all_doors.items() if door.room_name == "3a_01-c"]), + "3a_02-d": Room("3a", "3a_02-d", "Celestial Resort A - Room 02-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_02-d"], [door for _, door in all_doors.items() if door.room_name == "3a_02-d"]), + "3a_00-d": Room("3a", "3a_00-d", "Celestial Resort A - Room 00-d", [reg for _, reg in all_regions.items() if reg.room_name == "3a_00-d"], [door for _, door in all_doors.items() if door.room_name == "3a_00-d"], "Presidential Suite", "3a_00-d_east"), + "3a_roof00": Room("3a", "3a_roof00", "Celestial Resort A - Room roof00", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof00"], [door for _, door in all_doors.items() if door.room_name == "3a_roof00"]), + "3a_roof01": Room("3a", "3a_roof01", "Celestial Resort A - Room roof01", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof01"], [door for _, door in all_doors.items() if door.room_name == "3a_roof01"]), + "3a_roof02": Room("3a", "3a_roof02", "Celestial Resort A - Room roof02", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof02"], [door for _, door in all_doors.items() if door.room_name == "3a_roof02"]), + "3a_roof03": Room("3a", "3a_roof03", "Celestial Resort A - Room roof03", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof03"], [door for _, door in all_doors.items() if door.room_name == "3a_roof03"]), + "3a_roof04": Room("3a", "3a_roof04", "Celestial Resort A - Room roof04", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof04"], [door for _, door in all_doors.items() if door.room_name == "3a_roof04"]), + "3a_roof05": Room("3a", "3a_roof05", "Celestial Resort A - Room roof05", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof05"], [door for _, door in all_doors.items() if door.room_name == "3a_roof05"]), + "3a_roof06b": Room("3a", "3a_roof06b", "Celestial Resort A - Room roof06b", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof06b"], [door for _, door in all_doors.items() if door.room_name == "3a_roof06b"]), + "3a_roof06": Room("3a", "3a_roof06", "Celestial Resort A - Room roof06", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof06"], [door for _, door in all_doors.items() if door.room_name == "3a_roof06"]), + "3a_roof07": Room("3a", "3a_roof07", "Celestial Resort A - Room roof07", [reg for _, reg in all_regions.items() if reg.room_name == "3a_roof07"], [door for _, door in all_doors.items() if door.room_name == "3a_roof07"]), + + "3b_00": Room("3b", "3b_00", "Celestial Resort B - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "3b_00"], [door for _, door in all_doors.items() if door.room_name == "3b_00"], "Start", "3b_00_west"), + "3b_back": Room("3b", "3b_back", "Celestial Resort B - Room back", [reg for _, reg in all_regions.items() if reg.room_name == "3b_back"], [door for _, door in all_doors.items() if door.room_name == "3b_back"]), + "3b_01": Room("3b", "3b_01", "Celestial Resort B - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "3b_01"], [door for _, door in all_doors.items() if door.room_name == "3b_01"]), + "3b_02": Room("3b", "3b_02", "Celestial Resort B - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "3b_02"], [door for _, door in all_doors.items() if door.room_name == "3b_02"]), + "3b_03": Room("3b", "3b_03", "Celestial Resort B - Room 03", [reg for _, reg in all_regions.items() if reg.room_name == "3b_03"], [door for _, door in all_doors.items() if door.room_name == "3b_03"]), + "3b_04": Room("3b", "3b_04", "Celestial Resort B - Room 04", [reg for _, reg in all_regions.items() if reg.room_name == "3b_04"], [door for _, door in all_doors.items() if door.room_name == "3b_04"]), + "3b_05": Room("3b", "3b_05", "Celestial Resort B - Room 05", [reg for _, reg in all_regions.items() if reg.room_name == "3b_05"], [door for _, door in all_doors.items() if door.room_name == "3b_05"]), + "3b_06": Room("3b", "3b_06", "Celestial Resort B - Room 06", [reg for _, reg in all_regions.items() if reg.room_name == "3b_06"], [door for _, door in all_doors.items() if door.room_name == "3b_06"], "Staff Quarters", "3b_06_west"), + "3b_07": Room("3b", "3b_07", "Celestial Resort B - Room 07", [reg for _, reg in all_regions.items() if reg.room_name == "3b_07"], [door for _, door in all_doors.items() if door.room_name == "3b_07"]), + "3b_08": Room("3b", "3b_08", "Celestial Resort B - Room 08", [reg for _, reg in all_regions.items() if reg.room_name == "3b_08"], [door for _, door in all_doors.items() if door.room_name == "3b_08"]), + "3b_09": Room("3b", "3b_09", "Celestial Resort B - Room 09", [reg for _, reg in all_regions.items() if reg.room_name == "3b_09"], [door for _, door in all_doors.items() if door.room_name == "3b_09"]), + "3b_10": Room("3b", "3b_10", "Celestial Resort B - Room 10", [reg for _, reg in all_regions.items() if reg.room_name == "3b_10"], [door for _, door in all_doors.items() if door.room_name == "3b_10"]), + "3b_11": Room("3b", "3b_11", "Celestial Resort B - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "3b_11"], [door for _, door in all_doors.items() if door.room_name == "3b_11"], "Library", "3b_11_west"), + "3b_13": Room("3b", "3b_13", "Celestial Resort B - Room 13", [reg for _, reg in all_regions.items() if reg.room_name == "3b_13"], [door for _, door in all_doors.items() if door.room_name == "3b_13"]), + "3b_14": Room("3b", "3b_14", "Celestial Resort B - Room 14", [reg for _, reg in all_regions.items() if reg.room_name == "3b_14"], [door for _, door in all_doors.items() if door.room_name == "3b_14"]), + "3b_15": Room("3b", "3b_15", "Celestial Resort B - Room 15", [reg for _, reg in all_regions.items() if reg.room_name == "3b_15"], [door for _, door in all_doors.items() if door.room_name == "3b_15"]), + "3b_12": Room("3b", "3b_12", "Celestial Resort B - Room 12", [reg for _, reg in all_regions.items() if reg.room_name == "3b_12"], [door for _, door in all_doors.items() if door.room_name == "3b_12"]), + "3b_16": Room("3b", "3b_16", "Celestial Resort B - Room 16", [reg for _, reg in all_regions.items() if reg.room_name == "3b_16"], [door for _, door in all_doors.items() if door.room_name == "3b_16"], "Rooftop", "3b_16_west"), + "3b_17": Room("3b", "3b_17", "Celestial Resort B - Room 17", [reg for _, reg in all_regions.items() if reg.room_name == "3b_17"], [door for _, door in all_doors.items() if door.room_name == "3b_17"]), + "3b_18": Room("3b", "3b_18", "Celestial Resort B - Room 18", [reg for _, reg in all_regions.items() if reg.room_name == "3b_18"], [door for _, door in all_doors.items() if door.room_name == "3b_18"]), + "3b_19": Room("3b", "3b_19", "Celestial Resort B - Room 19", [reg for _, reg in all_regions.items() if reg.room_name == "3b_19"], [door for _, door in all_doors.items() if door.room_name == "3b_19"]), + "3b_21": Room("3b", "3b_21", "Celestial Resort B - Room 21", [reg for _, reg in all_regions.items() if reg.room_name == "3b_21"], [door for _, door in all_doors.items() if door.room_name == "3b_21"]), + "3b_20": Room("3b", "3b_20", "Celestial Resort B - Room 20", [reg for _, reg in all_regions.items() if reg.room_name == "3b_20"], [door for _, door in all_doors.items() if door.room_name == "3b_20"]), + "3b_end": Room("3b", "3b_end", "Celestial Resort B - Room end", [reg for _, reg in all_regions.items() if reg.room_name == "3b_end"], [door for _, door in all_doors.items() if door.room_name == "3b_end"]), + + "3c_00": Room("3c", "3c_00", "Celestial Resort C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "3c_00"], [door for _, door in all_doors.items() if door.room_name == "3c_00"], "Start", "3c_00_west"), + "3c_01": Room("3c", "3c_01", "Celestial Resort C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "3c_01"], [door for _, door in all_doors.items() if door.room_name == "3c_01"]), + "3c_02": Room("3c", "3c_02", "Celestial Resort C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "3c_02"], [door for _, door in all_doors.items() if door.room_name == "3c_02"]), + + "4a_a-00": Room("4a", "4a_a-00", "Golden Ridge A - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-00"], [door for _, door in all_doors.items() if door.room_name == "4a_a-00"], "Start", "4a_a-00_west"), + "4a_a-01": Room("4a", "4a_a-01", "Golden Ridge A - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-01"], [door for _, door in all_doors.items() if door.room_name == "4a_a-01"]), + "4a_a-01x": Room("4a", "4a_a-01x", "Golden Ridge A - Room a-01x", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-01x"], [door for _, door in all_doors.items() if door.room_name == "4a_a-01x"]), + "4a_a-02": Room("4a", "4a_a-02", "Golden Ridge A - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-02"], [door for _, door in all_doors.items() if door.room_name == "4a_a-02"]), + "4a_a-03": Room("4a", "4a_a-03", "Golden Ridge A - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-03"], [door for _, door in all_doors.items() if door.room_name == "4a_a-03"]), + "4a_a-04": Room("4a", "4a_a-04", "Golden Ridge A - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-04"], [door for _, door in all_doors.items() if door.room_name == "4a_a-04"]), + "4a_a-05": Room("4a", "4a_a-05", "Golden Ridge A - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-05"], [door for _, door in all_doors.items() if door.room_name == "4a_a-05"]), + "4a_a-06": Room("4a", "4a_a-06", "Golden Ridge A - Room a-06", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-06"], [door for _, door in all_doors.items() if door.room_name == "4a_a-06"]), + "4a_a-07": Room("4a", "4a_a-07", "Golden Ridge A - Room a-07", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-07"], [door for _, door in all_doors.items() if door.room_name == "4a_a-07"]), + "4a_a-08": Room("4a", "4a_a-08", "Golden Ridge A - Room a-08", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-08"], [door for _, door in all_doors.items() if door.room_name == "4a_a-08"]), + "4a_a-10": Room("4a", "4a_a-10", "Golden Ridge A - Room a-10", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-10"], [door for _, door in all_doors.items() if door.room_name == "4a_a-10"]), + "4a_a-11": Room("4a", "4a_a-11", "Golden Ridge A - Room a-11", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-11"], [door for _, door in all_doors.items() if door.room_name == "4a_a-11"]), + "4a_a-09": Room("4a", "4a_a-09", "Golden Ridge A - Room a-09", [reg for _, reg in all_regions.items() if reg.room_name == "4a_a-09"], [door for _, door in all_doors.items() if door.room_name == "4a_a-09"]), + "4a_b-00": Room("4a", "4a_b-00", "Golden Ridge A - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-00"], [door for _, door in all_doors.items() if door.room_name == "4a_b-00"], "Shrine", "4a_b-00_south"), + "4a_b-01": Room("4a", "4a_b-01", "Golden Ridge A - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-01"], [door for _, door in all_doors.items() if door.room_name == "4a_b-01"]), + "4a_b-04": Room("4a", "4a_b-04", "Golden Ridge A - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-04"], [door for _, door in all_doors.items() if door.room_name == "4a_b-04"]), + "4a_b-06": Room("4a", "4a_b-06", "Golden Ridge A - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-06"], [door for _, door in all_doors.items() if door.room_name == "4a_b-06"]), + "4a_b-07": Room("4a", "4a_b-07", "Golden Ridge A - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-07"], [door for _, door in all_doors.items() if door.room_name == "4a_b-07"]), + "4a_b-03": Room("4a", "4a_b-03", "Golden Ridge A - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-03"], [door for _, door in all_doors.items() if door.room_name == "4a_b-03"]), + "4a_b-02": Room("4a", "4a_b-02", "Golden Ridge A - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-02"], [door for _, door in all_doors.items() if door.room_name == "4a_b-02"]), + "4a_b-sec": Room("4a", "4a_b-sec", "Golden Ridge A - Room b-sec", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-sec"], [door for _, door in all_doors.items() if door.room_name == "4a_b-sec"]), + "4a_b-secb": Room("4a", "4a_b-secb", "Golden Ridge A - Room b-secb", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-secb"], [door for _, door in all_doors.items() if door.room_name == "4a_b-secb"]), + "4a_b-05": Room("4a", "4a_b-05", "Golden Ridge A - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-05"], [door for _, door in all_doors.items() if door.room_name == "4a_b-05"]), + "4a_b-08b": Room("4a", "4a_b-08b", "Golden Ridge A - Room b-08b", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-08b"], [door for _, door in all_doors.items() if door.room_name == "4a_b-08b"]), + "4a_b-08": Room("4a", "4a_b-08", "Golden Ridge A - Room b-08", [reg for _, reg in all_regions.items() if reg.room_name == "4a_b-08"], [door for _, door in all_doors.items() if door.room_name == "4a_b-08"]), + "4a_c-00": Room("4a", "4a_c-00", "Golden Ridge A - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-00"], [door for _, door in all_doors.items() if door.room_name == "4a_c-00"], "Old Trail", "4a_c-00_west"), + "4a_c-01": Room("4a", "4a_c-01", "Golden Ridge A - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-01"], [door for _, door in all_doors.items() if door.room_name == "4a_c-01"]), + "4a_c-02": Room("4a", "4a_c-02", "Golden Ridge A - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-02"], [door for _, door in all_doors.items() if door.room_name == "4a_c-02"]), + "4a_c-04": Room("4a", "4a_c-04", "Golden Ridge A - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-04"], [door for _, door in all_doors.items() if door.room_name == "4a_c-04"]), + "4a_c-05": Room("4a", "4a_c-05", "Golden Ridge A - Room c-05", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-05"], [door for _, door in all_doors.items() if door.room_name == "4a_c-05"]), + "4a_c-06": Room("4a", "4a_c-06", "Golden Ridge A - Room c-06", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-06"], [door for _, door in all_doors.items() if door.room_name == "4a_c-06"]), + "4a_c-06b": Room("4a", "4a_c-06b", "Golden Ridge A - Room c-06b", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-06b"], [door for _, door in all_doors.items() if door.room_name == "4a_c-06b"]), + "4a_c-09": Room("4a", "4a_c-09", "Golden Ridge A - Room c-09", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-09"], [door for _, door in all_doors.items() if door.room_name == "4a_c-09"]), + "4a_c-07": Room("4a", "4a_c-07", "Golden Ridge A - Room c-07", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-07"], [door for _, door in all_doors.items() if door.room_name == "4a_c-07"]), + "4a_c-08": Room("4a", "4a_c-08", "Golden Ridge A - Room c-08", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-08"], [door for _, door in all_doors.items() if door.room_name == "4a_c-08"]), + "4a_c-10": Room("4a", "4a_c-10", "Golden Ridge A - Room c-10", [reg for _, reg in all_regions.items() if reg.room_name == "4a_c-10"], [door for _, door in all_doors.items() if door.room_name == "4a_c-10"]), + "4a_d-00": Room("4a", "4a_d-00", "Golden Ridge A - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-00"], [door for _, door in all_doors.items() if door.room_name == "4a_d-00"], "Cliff Face", "4a_d-00_west"), + "4a_d-00b": Room("4a", "4a_d-00b", "Golden Ridge A - Room d-00b", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-00b"], [door for _, door in all_doors.items() if door.room_name == "4a_d-00b"]), + "4a_d-01": Room("4a", "4a_d-01", "Golden Ridge A - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-01"], [door for _, door in all_doors.items() if door.room_name == "4a_d-01"]), + "4a_d-02": Room("4a", "4a_d-02", "Golden Ridge A - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-02"], [door for _, door in all_doors.items() if door.room_name == "4a_d-02"]), + "4a_d-03": Room("4a", "4a_d-03", "Golden Ridge A - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-03"], [door for _, door in all_doors.items() if door.room_name == "4a_d-03"]), + "4a_d-04": Room("4a", "4a_d-04", "Golden Ridge A - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-04"], [door for _, door in all_doors.items() if door.room_name == "4a_d-04"]), + "4a_d-05": Room("4a", "4a_d-05", "Golden Ridge A - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-05"], [door for _, door in all_doors.items() if door.room_name == "4a_d-05"]), + "4a_d-06": Room("4a", "4a_d-06", "Golden Ridge A - Room d-06", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-06"], [door for _, door in all_doors.items() if door.room_name == "4a_d-06"]), + "4a_d-07": Room("4a", "4a_d-07", "Golden Ridge A - Room d-07", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-07"], [door for _, door in all_doors.items() if door.room_name == "4a_d-07"]), + "4a_d-08": Room("4a", "4a_d-08", "Golden Ridge A - Room d-08", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-08"], [door for _, door in all_doors.items() if door.room_name == "4a_d-08"]), + "4a_d-09": Room("4a", "4a_d-09", "Golden Ridge A - Room d-09", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-09"], [door for _, door in all_doors.items() if door.room_name == "4a_d-09"]), + "4a_d-10": Room("4a", "4a_d-10", "Golden Ridge A - Room d-10", [reg for _, reg in all_regions.items() if reg.room_name == "4a_d-10"], [door for _, door in all_doors.items() if door.room_name == "4a_d-10"]), + + "4b_a-00": Room("4b", "4b_a-00", "Golden Ridge B - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "4b_a-00"], [door for _, door in all_doors.items() if door.room_name == "4b_a-00"], "Start", "4b_a-00_west"), + "4b_a-01": Room("4b", "4b_a-01", "Golden Ridge B - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "4b_a-01"], [door for _, door in all_doors.items() if door.room_name == "4b_a-01"]), + "4b_a-02": Room("4b", "4b_a-02", "Golden Ridge B - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "4b_a-02"], [door for _, door in all_doors.items() if door.room_name == "4b_a-02"]), + "4b_a-03": Room("4b", "4b_a-03", "Golden Ridge B - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "4b_a-03"], [door for _, door in all_doors.items() if door.room_name == "4b_a-03"]), + "4b_a-04": Room("4b", "4b_a-04", "Golden Ridge B - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "4b_a-04"], [door for _, door in all_doors.items() if door.room_name == "4b_a-04"]), + "4b_b-00": Room("4b", "4b_b-00", "Golden Ridge B - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "4b_b-00"], [door for _, door in all_doors.items() if door.room_name == "4b_b-00"], "Stepping Stones", "4b_b-00_west"), + "4b_b-01": Room("4b", "4b_b-01", "Golden Ridge B - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "4b_b-01"], [door for _, door in all_doors.items() if door.room_name == "4b_b-01"]), + "4b_b-02": Room("4b", "4b_b-02", "Golden Ridge B - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "4b_b-02"], [door for _, door in all_doors.items() if door.room_name == "4b_b-02"]), + "4b_b-03": Room("4b", "4b_b-03", "Golden Ridge B - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "4b_b-03"], [door for _, door in all_doors.items() if door.room_name == "4b_b-03"]), + "4b_b-04": Room("4b", "4b_b-04", "Golden Ridge B - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "4b_b-04"], [door for _, door in all_doors.items() if door.room_name == "4b_b-04"]), + "4b_c-00": Room("4b", "4b_c-00", "Golden Ridge B - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "4b_c-00"], [door for _, door in all_doors.items() if door.room_name == "4b_c-00"], "Gusty Canyon", "4b_c-00_west"), + "4b_c-01": Room("4b", "4b_c-01", "Golden Ridge B - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "4b_c-01"], [door for _, door in all_doors.items() if door.room_name == "4b_c-01"]), + "4b_c-02": Room("4b", "4b_c-02", "Golden Ridge B - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "4b_c-02"], [door for _, door in all_doors.items() if door.room_name == "4b_c-02"]), + "4b_c-03": Room("4b", "4b_c-03", "Golden Ridge B - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "4b_c-03"], [door for _, door in all_doors.items() if door.room_name == "4b_c-03"]), + "4b_c-04": Room("4b", "4b_c-04", "Golden Ridge B - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "4b_c-04"], [door for _, door in all_doors.items() if door.room_name == "4b_c-04"]), + "4b_d-00": Room("4b", "4b_d-00", "Golden Ridge B - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "4b_d-00"], [door for _, door in all_doors.items() if door.room_name == "4b_d-00"], "Eye of the Storm", "4b_d-00_west"), + "4b_d-01": Room("4b", "4b_d-01", "Golden Ridge B - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "4b_d-01"], [door for _, door in all_doors.items() if door.room_name == "4b_d-01"]), + "4b_d-02": Room("4b", "4b_d-02", "Golden Ridge B - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "4b_d-02"], [door for _, door in all_doors.items() if door.room_name == "4b_d-02"]), + "4b_d-03": Room("4b", "4b_d-03", "Golden Ridge B - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "4b_d-03"], [door for _, door in all_doors.items() if door.room_name == "4b_d-03"]), + "4b_end": Room("4b", "4b_end", "Golden Ridge B - Room end", [reg for _, reg in all_regions.items() if reg.room_name == "4b_end"], [door for _, door in all_doors.items() if door.room_name == "4b_end"]), + + "4c_00": Room("4c", "4c_00", "Golden Ridge C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "4c_00"], [door for _, door in all_doors.items() if door.room_name == "4c_00"], "Start", "4c_00_west"), + "4c_01": Room("4c", "4c_01", "Golden Ridge C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "4c_01"], [door for _, door in all_doors.items() if door.room_name == "4c_01"]), + "4c_02": Room("4c", "4c_02", "Golden Ridge C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "4c_02"], [door for _, door in all_doors.items() if door.room_name == "4c_02"]), + + "5a_a-00b": Room("5a", "5a_a-00b", "Mirror Temple A - Room a-00b", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-00b"], [door for _, door in all_doors.items() if door.room_name == "5a_a-00b"], "Start", "5a_a-00b_west"), + "5a_a-00x": Room("5a", "5a_a-00x", "Mirror Temple A - Room a-00x", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-00x"], [door for _, door in all_doors.items() if door.room_name == "5a_a-00x"]), + "5a_a-00d": Room("5a", "5a_a-00d", "Mirror Temple A - Room a-00d", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-00d"], [door for _, door in all_doors.items() if door.room_name == "5a_a-00d"]), + "5a_a-00c": Room("5a", "5a_a-00c", "Mirror Temple A - Room a-00c", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-00c"], [door for _, door in all_doors.items() if door.room_name == "5a_a-00c"]), + "5a_a-00": Room("5a", "5a_a-00", "Mirror Temple A - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-00"], [door for _, door in all_doors.items() if door.room_name == "5a_a-00"]), + "5a_a-01": Room("5a", "5a_a-01", "Mirror Temple A - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-01"], [door for _, door in all_doors.items() if door.room_name == "5a_a-01"]), + "5a_a-02": Room("5a", "5a_a-02", "Mirror Temple A - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-02"], [door for _, door in all_doors.items() if door.room_name == "5a_a-02"]), + "5a_a-03": Room("5a", "5a_a-03", "Mirror Temple A - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-03"], [door for _, door in all_doors.items() if door.room_name == "5a_a-03"]), + "5a_a-04": Room("5a", "5a_a-04", "Mirror Temple A - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-04"], [door for _, door in all_doors.items() if door.room_name == "5a_a-04"]), + "5a_a-05": Room("5a", "5a_a-05", "Mirror Temple A - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-05"], [door for _, door in all_doors.items() if door.room_name == "5a_a-05"]), + "5a_a-06": Room("5a", "5a_a-06", "Mirror Temple A - Room a-06", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-06"], [door for _, door in all_doors.items() if door.room_name == "5a_a-06"]), + "5a_a-07": Room("5a", "5a_a-07", "Mirror Temple A - Room a-07", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-07"], [door for _, door in all_doors.items() if door.room_name == "5a_a-07"]), + "5a_a-08": Room("5a", "5a_a-08", "Mirror Temple A - Room a-08", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-08"], [door for _, door in all_doors.items() if door.room_name == "5a_a-08"]), + "5a_a-10": Room("5a", "5a_a-10", "Mirror Temple A - Room a-10", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-10"], [door for _, door in all_doors.items() if door.room_name == "5a_a-10"]), + "5a_a-09": Room("5a", "5a_a-09", "Mirror Temple A - Room a-09", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-09"], [door for _, door in all_doors.items() if door.room_name == "5a_a-09"]), + "5a_a-11": Room("5a", "5a_a-11", "Mirror Temple A - Room a-11", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-11"], [door for _, door in all_doors.items() if door.room_name == "5a_a-11"]), + "5a_a-12": Room("5a", "5a_a-12", "Mirror Temple A - Room a-12", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-12"], [door for _, door in all_doors.items() if door.room_name == "5a_a-12"]), + "5a_a-15": Room("5a", "5a_a-15", "Mirror Temple A - Room a-15", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-15"], [door for _, door in all_doors.items() if door.room_name == "5a_a-15"]), + "5a_a-14": Room("5a", "5a_a-14", "Mirror Temple A - Room a-14", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-14"], [door for _, door in all_doors.items() if door.room_name == "5a_a-14"]), + "5a_a-13": Room("5a", "5a_a-13", "Mirror Temple A - Room a-13", [reg for _, reg in all_regions.items() if reg.room_name == "5a_a-13"], [door for _, door in all_doors.items() if door.room_name == "5a_a-13"]), + "5a_b-00": Room("5a", "5a_b-00", "Mirror Temple A - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-00"], [door for _, door in all_doors.items() if door.room_name == "5a_b-00"], "Depths", "5a_b-00_west"), + "5a_b-18": Room("5a", "5a_b-18", "Mirror Temple A - Room b-18", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-18"], [door for _, door in all_doors.items() if door.room_name == "5a_b-18"]), + "5a_b-01": Room("5a", "5a_b-01", "Mirror Temple A - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-01"], [door for _, door in all_doors.items() if door.room_name == "5a_b-01"]), + "5a_b-01c": Room("5a", "5a_b-01c", "Mirror Temple A - Room b-01c", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-01c"], [door for _, door in all_doors.items() if door.room_name == "5a_b-01c"]), + "5a_b-20": Room("5a", "5a_b-20", "Mirror Temple A - Room b-20", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-20"], [door for _, door in all_doors.items() if door.room_name == "5a_b-20"]), + "5a_b-21": Room("5a", "5a_b-21", "Mirror Temple A - Room b-21", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-21"], [door for _, door in all_doors.items() if door.room_name == "5a_b-21"]), + "5a_b-01b": Room("5a", "5a_b-01b", "Mirror Temple A - Room b-01b", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-01b"], [door for _, door in all_doors.items() if door.room_name == "5a_b-01b"]), + "5a_b-02": Room("5a", "5a_b-02", "Mirror Temple A - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-02"], [door for _, door in all_doors.items() if door.room_name == "5a_b-02"]), + "5a_b-03": Room("5a", "5a_b-03", "Mirror Temple A - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-03"], [door for _, door in all_doors.items() if door.room_name == "5a_b-03"]), + "5a_b-05": Room("5a", "5a_b-05", "Mirror Temple A - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-05"], [door for _, door in all_doors.items() if door.room_name == "5a_b-05"]), + "5a_b-04": Room("5a", "5a_b-04", "Mirror Temple A - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-04"], [door for _, door in all_doors.items() if door.room_name == "5a_b-04"]), + "5a_b-07": Room("5a", "5a_b-07", "Mirror Temple A - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-07"], [door for _, door in all_doors.items() if door.room_name == "5a_b-07"]), + "5a_b-08": Room("5a", "5a_b-08", "Mirror Temple A - Room b-08", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-08"], [door for _, door in all_doors.items() if door.room_name == "5a_b-08"]), + "5a_b-09": Room("5a", "5a_b-09", "Mirror Temple A - Room b-09", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-09"], [door for _, door in all_doors.items() if door.room_name == "5a_b-09"]), + "5a_b-10": Room("5a", "5a_b-10", "Mirror Temple A - Room b-10", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-10"], [door for _, door in all_doors.items() if door.room_name == "5a_b-10"]), + "5a_b-11": Room("5a", "5a_b-11", "Mirror Temple A - Room b-11", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-11"], [door for _, door in all_doors.items() if door.room_name == "5a_b-11"]), + "5a_b-12": Room("5a", "5a_b-12", "Mirror Temple A - Room b-12", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-12"], [door for _, door in all_doors.items() if door.room_name == "5a_b-12"]), + "5a_b-13": Room("5a", "5a_b-13", "Mirror Temple A - Room b-13", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-13"], [door for _, door in all_doors.items() if door.room_name == "5a_b-13"]), + "5a_b-17": Room("5a", "5a_b-17", "Mirror Temple A - Room b-17", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-17"], [door for _, door in all_doors.items() if door.room_name == "5a_b-17"]), + "5a_b-22": Room("5a", "5a_b-22", "Mirror Temple A - Room b-22", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-22"], [door for _, door in all_doors.items() if door.room_name == "5a_b-22"]), + "5a_b-06": Room("5a", "5a_b-06", "Mirror Temple A - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-06"], [door for _, door in all_doors.items() if door.room_name == "5a_b-06"]), + "5a_b-19": Room("5a", "5a_b-19", "Mirror Temple A - Room b-19", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-19"], [door for _, door in all_doors.items() if door.room_name == "5a_b-19"]), + "5a_b-14": Room("5a", "5a_b-14", "Mirror Temple A - Room b-14", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-14"], [door for _, door in all_doors.items() if door.room_name == "5a_b-14"]), + "5a_b-15": Room("5a", "5a_b-15", "Mirror Temple A - Room b-15", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-15"], [door for _, door in all_doors.items() if door.room_name == "5a_b-15"]), + "5a_b-16": Room("5a", "5a_b-16", "Mirror Temple A - Room b-16", [reg for _, reg in all_regions.items() if reg.room_name == "5a_b-16"], [door for _, door in all_doors.items() if door.room_name == "5a_b-16"]), + "5a_void": Room("5a", "5a_void", "Mirror Temple A - Room void", [reg for _, reg in all_regions.items() if reg.room_name == "5a_void"], [door for _, door in all_doors.items() if door.room_name == "5a_void"]), + "5a_c-00": Room("5a", "5a_c-00", "Mirror Temple A - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-00"], [door for _, door in all_doors.items() if door.room_name == "5a_c-00"], "Unravelling", "5a_c-00_top"), + "5a_c-01": Room("5a", "5a_c-01", "Mirror Temple A - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-01"], [door for _, door in all_doors.items() if door.room_name == "5a_c-01"]), + "5a_c-01b": Room("5a", "5a_c-01b", "Mirror Temple A - Room c-01b", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-01b"], [door for _, door in all_doors.items() if door.room_name == "5a_c-01b"]), + "5a_c-01c": Room("5a", "5a_c-01c", "Mirror Temple A - Room c-01c", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-01c"], [door for _, door in all_doors.items() if door.room_name == "5a_c-01c"]), + "5a_c-08b": Room("5a", "5a_c-08b", "Mirror Temple A - Room c-08b", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-08b"], [door for _, door in all_doors.items() if door.room_name == "5a_c-08b"]), + "5a_c-08": Room("5a", "5a_c-08", "Mirror Temple A - Room c-08", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-08"], [door for _, door in all_doors.items() if door.room_name == "5a_c-08"]), + "5a_c-10": Room("5a", "5a_c-10", "Mirror Temple A - Room c-10", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-10"], [door for _, door in all_doors.items() if door.room_name == "5a_c-10"]), + "5a_c-12": Room("5a", "5a_c-12", "Mirror Temple A - Room c-12", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-12"], [door for _, door in all_doors.items() if door.room_name == "5a_c-12"]), + "5a_c-07": Room("5a", "5a_c-07", "Mirror Temple A - Room c-07", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-07"], [door for _, door in all_doors.items() if door.room_name == "5a_c-07"]), + "5a_c-11": Room("5a", "5a_c-11", "Mirror Temple A - Room c-11", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-11"], [door for _, door in all_doors.items() if door.room_name == "5a_c-11"]), + "5a_c-09": Room("5a", "5a_c-09", "Mirror Temple A - Room c-09", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-09"], [door for _, door in all_doors.items() if door.room_name == "5a_c-09"]), + "5a_c-13": Room("5a", "5a_c-13", "Mirror Temple A - Room c-13", [reg for _, reg in all_regions.items() if reg.room_name == "5a_c-13"], [door for _, door in all_doors.items() if door.room_name == "5a_c-13"]), + "5a_d-00": Room("5a", "5a_d-00", "Mirror Temple A - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-00"], [door for _, door in all_doors.items() if door.room_name == "5a_d-00"], "Search", "5a_d-00_south"), + "5a_d-01": Room("5a", "5a_d-01", "Mirror Temple A - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-01"], [door for _, door in all_doors.items() if door.room_name == "5a_d-01"]), + "5a_d-09": Room("5a", "5a_d-09", "Mirror Temple A - Room d-09", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-09"], [door for _, door in all_doors.items() if door.room_name == "5a_d-09"]), + "5a_d-04": Room("5a", "5a_d-04", "Mirror Temple A - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-04"], [door for _, door in all_doors.items() if door.room_name == "5a_d-04"]), + "5a_d-05": Room("5a", "5a_d-05", "Mirror Temple A - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-05"], [door for _, door in all_doors.items() if door.room_name == "5a_d-05"]), + "5a_d-06": Room("5a", "5a_d-06", "Mirror Temple A - Room d-06", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-06"], [door for _, door in all_doors.items() if door.room_name == "5a_d-06"]), + "5a_d-07": Room("5a", "5a_d-07", "Mirror Temple A - Room d-07", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-07"], [door for _, door in all_doors.items() if door.room_name == "5a_d-07"]), + "5a_d-02": Room("5a", "5a_d-02", "Mirror Temple A - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-02"], [door for _, door in all_doors.items() if door.room_name == "5a_d-02"]), + "5a_d-03": Room("5a", "5a_d-03", "Mirror Temple A - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-03"], [door for _, door in all_doors.items() if door.room_name == "5a_d-03"]), + "5a_d-15": Room("5a", "5a_d-15", "Mirror Temple A - Room d-15", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-15"], [door for _, door in all_doors.items() if door.room_name == "5a_d-15"]), + "5a_d-13": Room("5a", "5a_d-13", "Mirror Temple A - Room d-13", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-13"], [door for _, door in all_doors.items() if door.room_name == "5a_d-13"]), + "5a_d-19b": Room("5a", "5a_d-19b", "Mirror Temple A - Room d-19b", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-19b"], [door for _, door in all_doors.items() if door.room_name == "5a_d-19b"]), + "5a_d-19": Room("5a", "5a_d-19", "Mirror Temple A - Room d-19", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-19"], [door for _, door in all_doors.items() if door.room_name == "5a_d-19"]), + "5a_d-10": Room("5a", "5a_d-10", "Mirror Temple A - Room d-10", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-10"], [door for _, door in all_doors.items() if door.room_name == "5a_d-10"]), + "5a_d-20": Room("5a", "5a_d-20", "Mirror Temple A - Room d-20", [reg for _, reg in all_regions.items() if reg.room_name == "5a_d-20"], [door for _, door in all_doors.items() if door.room_name == "5a_d-20"]), + "5a_e-00": Room("5a", "5a_e-00", "Mirror Temple A - Room e-00", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-00"], [door for _, door in all_doors.items() if door.room_name == "5a_e-00"], "Rescue", "5a_e-00_west"), + "5a_e-01": Room("5a", "5a_e-01", "Mirror Temple A - Room e-01", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-01"], [door for _, door in all_doors.items() if door.room_name == "5a_e-01"]), + "5a_e-02": Room("5a", "5a_e-02", "Mirror Temple A - Room e-02", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-02"], [door for _, door in all_doors.items() if door.room_name == "5a_e-02"]), + "5a_e-03": Room("5a", "5a_e-03", "Mirror Temple A - Room e-03", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-03"], [door for _, door in all_doors.items() if door.room_name == "5a_e-03"]), + "5a_e-04": Room("5a", "5a_e-04", "Mirror Temple A - Room e-04", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-04"], [door for _, door in all_doors.items() if door.room_name == "5a_e-04"]), + "5a_e-06": Room("5a", "5a_e-06", "Mirror Temple A - Room e-06", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-06"], [door for _, door in all_doors.items() if door.room_name == "5a_e-06"]), + "5a_e-05": Room("5a", "5a_e-05", "Mirror Temple A - Room e-05", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-05"], [door for _, door in all_doors.items() if door.room_name == "5a_e-05"]), + "5a_e-07": Room("5a", "5a_e-07", "Mirror Temple A - Room e-07", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-07"], [door for _, door in all_doors.items() if door.room_name == "5a_e-07"]), + "5a_e-08": Room("5a", "5a_e-08", "Mirror Temple A - Room e-08", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-08"], [door for _, door in all_doors.items() if door.room_name == "5a_e-08"]), + "5a_e-09": Room("5a", "5a_e-09", "Mirror Temple A - Room e-09", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-09"], [door for _, door in all_doors.items() if door.room_name == "5a_e-09"]), + "5a_e-10": Room("5a", "5a_e-10", "Mirror Temple A - Room e-10", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-10"], [door for _, door in all_doors.items() if door.room_name == "5a_e-10"]), + "5a_e-11": Room("5a", "5a_e-11", "Mirror Temple A - Room e-11", [reg for _, reg in all_regions.items() if reg.room_name == "5a_e-11"], [door for _, door in all_doors.items() if door.room_name == "5a_e-11"]), + + "5b_start": Room("5b", "5b_start", "Mirror Temple B - Room start", [reg for _, reg in all_regions.items() if reg.room_name == "5b_start"], [door for _, door in all_doors.items() if door.room_name == "5b_start"], "Start", "5b_start_west"), + "5b_a-00": Room("5b", "5b_a-00", "Mirror Temple B - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "5b_a-00"], [door for _, door in all_doors.items() if door.room_name == "5b_a-00"]), + "5b_a-01": Room("5b", "5b_a-01", "Mirror Temple B - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "5b_a-01"], [door for _, door in all_doors.items() if door.room_name == "5b_a-01"]), + "5b_a-02": Room("5b", "5b_a-02", "Mirror Temple B - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "5b_a-02"], [door for _, door in all_doors.items() if door.room_name == "5b_a-02"]), + "5b_b-00": Room("5b", "5b_b-00", "Mirror Temple B - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-00"], [door for _, door in all_doors.items() if door.room_name == "5b_b-00"], "Central Chamber", "5b_b-00_south"), + "5b_b-01": Room("5b", "5b_b-01", "Mirror Temple B - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-01"], [door for _, door in all_doors.items() if door.room_name == "5b_b-01"]), + "5b_b-04": Room("5b", "5b_b-04", "Mirror Temple B - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-04"], [door for _, door in all_doors.items() if door.room_name == "5b_b-04"]), + "5b_b-02": Room("5b", "5b_b-02", "Mirror Temple B - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-02"], [door for _, door in all_doors.items() if door.room_name == "5b_b-02"]), + "5b_b-05": Room("5b", "5b_b-05", "Mirror Temple B - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-05"], [door for _, door in all_doors.items() if door.room_name == "5b_b-05"]), + "5b_b-06": Room("5b", "5b_b-06", "Mirror Temple B - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-06"], [door for _, door in all_doors.items() if door.room_name == "5b_b-06"]), + "5b_b-07": Room("5b", "5b_b-07", "Mirror Temple B - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-07"], [door for _, door in all_doors.items() if door.room_name == "5b_b-07"]), + "5b_b-03": Room("5b", "5b_b-03", "Mirror Temple B - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-03"], [door for _, door in all_doors.items() if door.room_name == "5b_b-03"]), + "5b_b-08": Room("5b", "5b_b-08", "Mirror Temple B - Room b-08", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-08"], [door for _, door in all_doors.items() if door.room_name == "5b_b-08"]), + "5b_b-09": Room("5b", "5b_b-09", "Mirror Temple B - Room b-09", [reg for _, reg in all_regions.items() if reg.room_name == "5b_b-09"], [door for _, door in all_doors.items() if door.room_name == "5b_b-09"]), + "5b_c-00": Room("5b", "5b_c-00", "Mirror Temple B - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "5b_c-00"], [door for _, door in all_doors.items() if door.room_name == "5b_c-00"], "Through the Mirror", "5b_c-00_mirror"), + "5b_c-01": Room("5b", "5b_c-01", "Mirror Temple B - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "5b_c-01"], [door for _, door in all_doors.items() if door.room_name == "5b_c-01"]), + "5b_c-02": Room("5b", "5b_c-02", "Mirror Temple B - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "5b_c-02"], [door for _, door in all_doors.items() if door.room_name == "5b_c-02"]), + "5b_c-03": Room("5b", "5b_c-03", "Mirror Temple B - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "5b_c-03"], [door for _, door in all_doors.items() if door.room_name == "5b_c-03"]), + "5b_c-04": Room("5b", "5b_c-04", "Mirror Temple B - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "5b_c-04"], [door for _, door in all_doors.items() if door.room_name == "5b_c-04"]), + "5b_d-00": Room("5b", "5b_d-00", "Mirror Temple B - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-00"], [door for _, door in all_doors.items() if door.room_name == "5b_d-00"], "Mix Master", "5b_d-00_west"), + "5b_d-01": Room("5b", "5b_d-01", "Mirror Temple B - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-01"], [door for _, door in all_doors.items() if door.room_name == "5b_d-01"]), + "5b_d-02": Room("5b", "5b_d-02", "Mirror Temple B - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-02"], [door for _, door in all_doors.items() if door.room_name == "5b_d-02"]), + "5b_d-03": Room("5b", "5b_d-03", "Mirror Temple B - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-03"], [door for _, door in all_doors.items() if door.room_name == "5b_d-03"]), + "5b_d-04": Room("5b", "5b_d-04", "Mirror Temple B - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-04"], [door for _, door in all_doors.items() if door.room_name == "5b_d-04"]), + "5b_d-05": Room("5b", "5b_d-05", "Mirror Temple B - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "5b_d-05"], [door for _, door in all_doors.items() if door.room_name == "5b_d-05"]), + + "5c_00": Room("5c", "5c_00", "Mirror Temple C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "5c_00"], [door for _, door in all_doors.items() if door.room_name == "5c_00"], "Start", "5c_00_west"), + "5c_01": Room("5c", "5c_01", "Mirror Temple C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "5c_01"], [door for _, door in all_doors.items() if door.room_name == "5c_01"]), + "5c_02": Room("5c", "5c_02", "Mirror Temple C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "5c_02"], [door for _, door in all_doors.items() if door.room_name == "5c_02"]), + + "6a_00": Room("6a", "6a_00", "Reflection A - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "6a_00"], [door for _, door in all_doors.items() if door.room_name == "6a_00"], "Start", "6a_00_east"), + "6a_01": Room("6a", "6a_01", "Reflection A - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "6a_01"], [door for _, door in all_doors.items() if door.room_name == "6a_01"]), + "6a_02": Room("6a", "6a_02", "Reflection A - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "6a_02"], [door for _, door in all_doors.items() if door.room_name == "6a_02"]), + "6a_03": Room("6a", "6a_03", "Reflection A - Room 03", [reg for _, reg in all_regions.items() if reg.room_name == "6a_03"], [door for _, door in all_doors.items() if door.room_name == "6a_03"]), + "6a_02b": Room("6a", "6a_02b", "Reflection A - Room 02b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_02b"], [door for _, door in all_doors.items() if door.room_name == "6a_02b"]), + "6a_04": Room("6a", "6a_04", "Reflection A - Room 04", [reg for _, reg in all_regions.items() if reg.room_name == "6a_04"], [door for _, door in all_doors.items() if door.room_name == "6a_04"], "Hollows", "6a_04_south"), + "6a_04b": Room("6a", "6a_04b", "Reflection A - Room 04b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_04b"], [door for _, door in all_doors.items() if door.room_name == "6a_04b"]), + "6a_04c": Room("6a", "6a_04c", "Reflection A - Room 04c", [reg for _, reg in all_regions.items() if reg.room_name == "6a_04c"], [door for _, door in all_doors.items() if door.room_name == "6a_04c"]), + "6a_04d": Room("6a", "6a_04d", "Reflection A - Room 04d", [reg for _, reg in all_regions.items() if reg.room_name == "6a_04d"], [door for _, door in all_doors.items() if door.room_name == "6a_04d"]), + "6a_04e": Room("6a", "6a_04e", "Reflection A - Room 04e", [reg for _, reg in all_regions.items() if reg.room_name == "6a_04e"], [door for _, door in all_doors.items() if door.room_name == "6a_04e"]), + "6a_05": Room("6a", "6a_05", "Reflection A - Room 05", [reg for _, reg in all_regions.items() if reg.room_name == "6a_05"], [door for _, door in all_doors.items() if door.room_name == "6a_05"]), + "6a_06": Room("6a", "6a_06", "Reflection A - Room 06", [reg for _, reg in all_regions.items() if reg.room_name == "6a_06"], [door for _, door in all_doors.items() if door.room_name == "6a_06"]), + "6a_07": Room("6a", "6a_07", "Reflection A - Room 07", [reg for _, reg in all_regions.items() if reg.room_name == "6a_07"], [door for _, door in all_doors.items() if door.room_name == "6a_07"]), + "6a_08a": Room("6a", "6a_08a", "Reflection A - Room 08a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_08a"], [door for _, door in all_doors.items() if door.room_name == "6a_08a"]), + "6a_08b": Room("6a", "6a_08b", "Reflection A - Room 08b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_08b"], [door for _, door in all_doors.items() if door.room_name == "6a_08b"]), + "6a_09": Room("6a", "6a_09", "Reflection A - Room 09", [reg for _, reg in all_regions.items() if reg.room_name == "6a_09"], [door for _, door in all_doors.items() if door.room_name == "6a_09"]), + "6a_10a": Room("6a", "6a_10a", "Reflection A - Room 10a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_10a"], [door for _, door in all_doors.items() if door.room_name == "6a_10a"]), + "6a_10b": Room("6a", "6a_10b", "Reflection A - Room 10b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_10b"], [door for _, door in all_doors.items() if door.room_name == "6a_10b"]), + "6a_11": Room("6a", "6a_11", "Reflection A - Room 11", [reg for _, reg in all_regions.items() if reg.room_name == "6a_11"], [door for _, door in all_doors.items() if door.room_name == "6a_11"]), + "6a_12a": Room("6a", "6a_12a", "Reflection A - Room 12a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_12a"], [door for _, door in all_doors.items() if door.room_name == "6a_12a"]), + "6a_12b": Room("6a", "6a_12b", "Reflection A - Room 12b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_12b"], [door for _, door in all_doors.items() if door.room_name == "6a_12b"]), + "6a_13": Room("6a", "6a_13", "Reflection A - Room 13", [reg for _, reg in all_regions.items() if reg.room_name == "6a_13"], [door for _, door in all_doors.items() if door.room_name == "6a_13"]), + "6a_14a": Room("6a", "6a_14a", "Reflection A - Room 14a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_14a"], [door for _, door in all_doors.items() if door.room_name == "6a_14a"]), + "6a_14b": Room("6a", "6a_14b", "Reflection A - Room 14b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_14b"], [door for _, door in all_doors.items() if door.room_name == "6a_14b"]), + "6a_15": Room("6a", "6a_15", "Reflection A - Room 15", [reg for _, reg in all_regions.items() if reg.room_name == "6a_15"], [door for _, door in all_doors.items() if door.room_name == "6a_15"]), + "6a_16a": Room("6a", "6a_16a", "Reflection A - Room 16a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_16a"], [door for _, door in all_doors.items() if door.room_name == "6a_16a"]), + "6a_16b": Room("6a", "6a_16b", "Reflection A - Room 16b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_16b"], [door for _, door in all_doors.items() if door.room_name == "6a_16b"]), + "6a_17": Room("6a", "6a_17", "Reflection A - Room 17", [reg for _, reg in all_regions.items() if reg.room_name == "6a_17"], [door for _, door in all_doors.items() if door.room_name == "6a_17"]), + "6a_18a": Room("6a", "6a_18a", "Reflection A - Room 18a", [reg for _, reg in all_regions.items() if reg.room_name == "6a_18a"], [door for _, door in all_doors.items() if door.room_name == "6a_18a"]), + "6a_18b": Room("6a", "6a_18b", "Reflection A - Room 18b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_18b"], [door for _, door in all_doors.items() if door.room_name == "6a_18b"]), + "6a_19": Room("6a", "6a_19", "Reflection A - Room 19", [reg for _, reg in all_regions.items() if reg.room_name == "6a_19"], [door for _, door in all_doors.items() if door.room_name == "6a_19"]), + "6a_20": Room("6a", "6a_20", "Reflection A - Room 20", [reg for _, reg in all_regions.items() if reg.room_name == "6a_20"], [door for _, door in all_doors.items() if door.room_name == "6a_20"]), + "6a_b-00": Room("6a", "6a_b-00", "Reflection A - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-00"], [door for _, door in all_doors.items() if door.room_name == "6a_b-00"], "Reflection", "6a_b-00_west"), + "6a_b-00b": Room("6a", "6a_b-00b", "Reflection A - Room b-00b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-00b"], [door for _, door in all_doors.items() if door.room_name == "6a_b-00b"]), + "6a_b-00c": Room("6a", "6a_b-00c", "Reflection A - Room b-00c", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-00c"], [door for _, door in all_doors.items() if door.room_name == "6a_b-00c"]), + "6a_b-01": Room("6a", "6a_b-01", "Reflection A - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-01"], [door for _, door in all_doors.items() if door.room_name == "6a_b-01"]), + "6a_b-02": Room("6a", "6a_b-02", "Reflection A - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-02"], [door for _, door in all_doors.items() if door.room_name == "6a_b-02"]), + "6a_b-02b": Room("6a", "6a_b-02b", "Reflection A - Room b-02b", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-02b"], [door for _, door in all_doors.items() if door.room_name == "6a_b-02b"]), + "6a_b-03": Room("6a", "6a_b-03", "Reflection A - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "6a_b-03"], [door for _, door in all_doors.items() if door.room_name == "6a_b-03"]), + "6a_boss-00": Room("6a", "6a_boss-00", "Reflection A - Room boss-00", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-00"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-00"], "Rock Bottom", "6a_boss-00_west"), + "6a_boss-01": Room("6a", "6a_boss-01", "Reflection A - Room boss-01", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-01"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-01"]), + "6a_boss-02": Room("6a", "6a_boss-02", "Reflection A - Room boss-02", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-02"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-02"]), + "6a_boss-03": Room("6a", "6a_boss-03", "Reflection A - Room boss-03", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-03"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-03"]), + "6a_boss-04": Room("6a", "6a_boss-04", "Reflection A - Room boss-04", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-04"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-04"]), + "6a_boss-05": Room("6a", "6a_boss-05", "Reflection A - Room boss-05", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-05"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-05"]), + "6a_boss-06": Room("6a", "6a_boss-06", "Reflection A - Room boss-06", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-06"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-06"]), + "6a_boss-07": Room("6a", "6a_boss-07", "Reflection A - Room boss-07", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-07"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-07"]), + "6a_boss-08": Room("6a", "6a_boss-08", "Reflection A - Room boss-08", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-08"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-08"]), + "6a_boss-09": Room("6a", "6a_boss-09", "Reflection A - Room boss-09", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-09"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-09"]), + "6a_boss-10": Room("6a", "6a_boss-10", "Reflection A - Room boss-10", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-10"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-10"]), + "6a_boss-11": Room("6a", "6a_boss-11", "Reflection A - Room boss-11", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-11"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-11"]), + "6a_boss-12": Room("6a", "6a_boss-12", "Reflection A - Room boss-12", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-12"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-12"]), + "6a_boss-13": Room("6a", "6a_boss-13", "Reflection A - Room boss-13", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-13"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-13"]), + "6a_boss-14": Room("6a", "6a_boss-14", "Reflection A - Room boss-14", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-14"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-14"]), + "6a_boss-15": Room("6a", "6a_boss-15", "Reflection A - Room boss-15", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-15"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-15"]), + "6a_boss-16": Room("6a", "6a_boss-16", "Reflection A - Room boss-16", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-16"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-16"]), + "6a_boss-17": Room("6a", "6a_boss-17", "Reflection A - Room boss-17", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-17"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-17"]), + "6a_boss-18": Room("6a", "6a_boss-18", "Reflection A - Room boss-18", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-18"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-18"]), + "6a_boss-19": Room("6a", "6a_boss-19", "Reflection A - Room boss-19", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-19"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-19"]), + "6a_boss-20": Room("6a", "6a_boss-20", "Reflection A - Room boss-20", [reg for _, reg in all_regions.items() if reg.room_name == "6a_boss-20"], [door for _, door in all_doors.items() if door.room_name == "6a_boss-20"]), + "6a_after-00": Room("6a", "6a_after-00", "Reflection A - Room after-00", [reg for _, reg in all_regions.items() if reg.room_name == "6a_after-00"], [door for _, door in all_doors.items() if door.room_name == "6a_after-00"], "Resolution", "6a_after-00_bottom"), + "6a_after-01": Room("6a", "6a_after-01", "Reflection A - Room after-01", [reg for _, reg in all_regions.items() if reg.room_name == "6a_after-01"], [door for _, door in all_doors.items() if door.room_name == "6a_after-01"]), + + "6b_a-00": Room("6b", "6b_a-00", "Reflection B - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-00"], [door for _, door in all_doors.items() if door.room_name == "6b_a-00"], "Start", "6b_a-00_bottom"), + "6b_a-01": Room("6b", "6b_a-01", "Reflection B - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-01"], [door for _, door in all_doors.items() if door.room_name == "6b_a-01"]), + "6b_a-02": Room("6b", "6b_a-02", "Reflection B - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-02"], [door for _, door in all_doors.items() if door.room_name == "6b_a-02"]), + "6b_a-03": Room("6b", "6b_a-03", "Reflection B - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-03"], [door for _, door in all_doors.items() if door.room_name == "6b_a-03"]), + "6b_a-04": Room("6b", "6b_a-04", "Reflection B - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-04"], [door for _, door in all_doors.items() if door.room_name == "6b_a-04"]), + "6b_a-05": Room("6b", "6b_a-05", "Reflection B - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-05"], [door for _, door in all_doors.items() if door.room_name == "6b_a-05"]), + "6b_a-06": Room("6b", "6b_a-06", "Reflection B - Room a-06", [reg for _, reg in all_regions.items() if reg.room_name == "6b_a-06"], [door for _, door in all_doors.items() if door.room_name == "6b_a-06"]), + "6b_b-00": Room("6b", "6b_b-00", "Reflection B - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-00"], [door for _, door in all_doors.items() if door.room_name == "6b_b-00"], "Reflection", "6b_b-00_west"), + "6b_b-01": Room("6b", "6b_b-01", "Reflection B - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-01"], [door for _, door in all_doors.items() if door.room_name == "6b_b-01"]), + "6b_b-02": Room("6b", "6b_b-02", "Reflection B - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-02"], [door for _, door in all_doors.items() if door.room_name == "6b_b-02"]), + "6b_b-03": Room("6b", "6b_b-03", "Reflection B - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-03"], [door for _, door in all_doors.items() if door.room_name == "6b_b-03"]), + "6b_b-04": Room("6b", "6b_b-04", "Reflection B - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-04"], [door for _, door in all_doors.items() if door.room_name == "6b_b-04"]), + "6b_b-05": Room("6b", "6b_b-05", "Reflection B - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-05"], [door for _, door in all_doors.items() if door.room_name == "6b_b-05"]), + "6b_b-06": Room("6b", "6b_b-06", "Reflection B - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-06"], [door for _, door in all_doors.items() if door.room_name == "6b_b-06"]), + "6b_b-07": Room("6b", "6b_b-07", "Reflection B - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-07"], [door for _, door in all_doors.items() if door.room_name == "6b_b-07"]), + "6b_b-08": Room("6b", "6b_b-08", "Reflection B - Room b-08", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-08"], [door for _, door in all_doors.items() if door.room_name == "6b_b-08"]), + "6b_b-10": Room("6b", "6b_b-10", "Reflection B - Room b-10", [reg for _, reg in all_regions.items() if reg.room_name == "6b_b-10"], [door for _, door in all_doors.items() if door.room_name == "6b_b-10"]), + "6b_c-00": Room("6b", "6b_c-00", "Reflection B - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "6b_c-00"], [door for _, door in all_doors.items() if door.room_name == "6b_c-00"], "Rock Bottom", "6b_c-00_west"), + "6b_c-01": Room("6b", "6b_c-01", "Reflection B - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "6b_c-01"], [door for _, door in all_doors.items() if door.room_name == "6b_c-01"]), + "6b_c-02": Room("6b", "6b_c-02", "Reflection B - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "6b_c-02"], [door for _, door in all_doors.items() if door.room_name == "6b_c-02"]), + "6b_c-03": Room("6b", "6b_c-03", "Reflection B - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "6b_c-03"], [door for _, door in all_doors.items() if door.room_name == "6b_c-03"]), + "6b_c-04": Room("6b", "6b_c-04", "Reflection B - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "6b_c-04"], [door for _, door in all_doors.items() if door.room_name == "6b_c-04"]), + "6b_d-00": Room("6b", "6b_d-00", "Reflection B - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-00"], [door for _, door in all_doors.items() if door.room_name == "6b_d-00"], "Reprieve", "6b_d-00_west"), + "6b_d-01": Room("6b", "6b_d-01", "Reflection B - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-01"], [door for _, door in all_doors.items() if door.room_name == "6b_d-01"]), + "6b_d-02": Room("6b", "6b_d-02", "Reflection B - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-02"], [door for _, door in all_doors.items() if door.room_name == "6b_d-02"]), + "6b_d-03": Room("6b", "6b_d-03", "Reflection B - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-03"], [door for _, door in all_doors.items() if door.room_name == "6b_d-03"]), + "6b_d-04": Room("6b", "6b_d-04", "Reflection B - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-04"], [door for _, door in all_doors.items() if door.room_name == "6b_d-04"]), + "6b_d-05": Room("6b", "6b_d-05", "Reflection B - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "6b_d-05"], [door for _, door in all_doors.items() if door.room_name == "6b_d-05"]), + + "6c_00": Room("6c", "6c_00", "Reflection C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "6c_00"], [door for _, door in all_doors.items() if door.room_name == "6c_00"], "Start", "6c_00_west"), + "6c_01": Room("6c", "6c_01", "Reflection C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "6c_01"], [door for _, door in all_doors.items() if door.room_name == "6c_01"]), + "6c_02": Room("6c", "6c_02", "Reflection C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "6c_02"], [door for _, door in all_doors.items() if door.room_name == "6c_02"]), + + "7a_a-00": Room("7a", "7a_a-00", "The Summit A - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-00"], [door for _, door in all_doors.items() if door.room_name == "7a_a-00"], "Start", "7a_a-00_west"), + "7a_a-01": Room("7a", "7a_a-01", "The Summit A - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-01"], [door for _, door in all_doors.items() if door.room_name == "7a_a-01"]), + "7a_a-02": Room("7a", "7a_a-02", "The Summit A - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-02"], [door for _, door in all_doors.items() if door.room_name == "7a_a-02"]), + "7a_a-02b": Room("7a", "7a_a-02b", "The Summit A - Room a-02b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-02b"], [door for _, door in all_doors.items() if door.room_name == "7a_a-02b"]), + "7a_a-03": Room("7a", "7a_a-03", "The Summit A - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-03"], [door for _, door in all_doors.items() if door.room_name == "7a_a-03"]), + "7a_a-04": Room("7a", "7a_a-04", "The Summit A - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-04"], [door for _, door in all_doors.items() if door.room_name == "7a_a-04"]), + "7a_a-04b": Room("7a", "7a_a-04b", "The Summit A - Room a-04b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-04b"], [door for _, door in all_doors.items() if door.room_name == "7a_a-04b"]), + "7a_a-05": Room("7a", "7a_a-05", "The Summit A - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-05"], [door for _, door in all_doors.items() if door.room_name == "7a_a-05"]), + "7a_a-06": Room("7a", "7a_a-06", "The Summit A - Room a-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_a-06"], [door for _, door in all_doors.items() if door.room_name == "7a_a-06"]), + "7a_b-00": Room("7a", "7a_b-00", "The Summit A - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-00"], [door for _, door in all_doors.items() if door.room_name == "7a_b-00"], "500 M", "7a_b-00_bottom"), + "7a_b-01": Room("7a", "7a_b-01", "The Summit A - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-01"], [door for _, door in all_doors.items() if door.room_name == "7a_b-01"]), + "7a_b-02": Room("7a", "7a_b-02", "The Summit A - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-02"], [door for _, door in all_doors.items() if door.room_name == "7a_b-02"]), + "7a_b-02b": Room("7a", "7a_b-02b", "The Summit A - Room b-02b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-02b"], [door for _, door in all_doors.items() if door.room_name == "7a_b-02b"]), + "7a_b-02e": Room("7a", "7a_b-02e", "The Summit A - Room b-02e", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-02e"], [door for _, door in all_doors.items() if door.room_name == "7a_b-02e"]), + "7a_b-02c": Room("7a", "7a_b-02c", "The Summit A - Room b-02c", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-02c"], [door for _, door in all_doors.items() if door.room_name == "7a_b-02c"]), + "7a_b-02d": Room("7a", "7a_b-02d", "The Summit A - Room b-02d", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-02d"], [door for _, door in all_doors.items() if door.room_name == "7a_b-02d"]), + "7a_b-03": Room("7a", "7a_b-03", "The Summit A - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-03"], [door for _, door in all_doors.items() if door.room_name == "7a_b-03"]), + "7a_b-04": Room("7a", "7a_b-04", "The Summit A - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-04"], [door for _, door in all_doors.items() if door.room_name == "7a_b-04"]), + "7a_b-05": Room("7a", "7a_b-05", "The Summit A - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-05"], [door for _, door in all_doors.items() if door.room_name == "7a_b-05"]), + "7a_b-06": Room("7a", "7a_b-06", "The Summit A - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-06"], [door for _, door in all_doors.items() if door.room_name == "7a_b-06"]), + "7a_b-07": Room("7a", "7a_b-07", "The Summit A - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-07"], [door for _, door in all_doors.items() if door.room_name == "7a_b-07"]), + "7a_b-08": Room("7a", "7a_b-08", "The Summit A - Room b-08", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-08"], [door for _, door in all_doors.items() if door.room_name == "7a_b-08"]), + "7a_b-09": Room("7a", "7a_b-09", "The Summit A - Room b-09", [reg for _, reg in all_regions.items() if reg.room_name == "7a_b-09"], [door for _, door in all_doors.items() if door.room_name == "7a_b-09"]), + "7a_c-00": Room("7a", "7a_c-00", "The Summit A - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-00"], [door for _, door in all_doors.items() if door.room_name == "7a_c-00"], "1000 M", "7a_c-00_west"), + "7a_c-01": Room("7a", "7a_c-01", "The Summit A - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-01"], [door for _, door in all_doors.items() if door.room_name == "7a_c-01"]), + "7a_c-02": Room("7a", "7a_c-02", "The Summit A - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-02"], [door for _, door in all_doors.items() if door.room_name == "7a_c-02"]), + "7a_c-03": Room("7a", "7a_c-03", "The Summit A - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-03"], [door for _, door in all_doors.items() if door.room_name == "7a_c-03"]), + "7a_c-03b": Room("7a", "7a_c-03b", "The Summit A - Room c-03b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-03b"], [door for _, door in all_doors.items() if door.room_name == "7a_c-03b"]), + "7a_c-04": Room("7a", "7a_c-04", "The Summit A - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-04"], [door for _, door in all_doors.items() if door.room_name == "7a_c-04"]), + "7a_c-05": Room("7a", "7a_c-05", "The Summit A - Room c-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-05"], [door for _, door in all_doors.items() if door.room_name == "7a_c-05"]), + "7a_c-06": Room("7a", "7a_c-06", "The Summit A - Room c-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-06"], [door for _, door in all_doors.items() if door.room_name == "7a_c-06"]), + "7a_c-06b": Room("7a", "7a_c-06b", "The Summit A - Room c-06b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-06b"], [door for _, door in all_doors.items() if door.room_name == "7a_c-06b"]), + "7a_c-06c": Room("7a", "7a_c-06c", "The Summit A - Room c-06c", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-06c"], [door for _, door in all_doors.items() if door.room_name == "7a_c-06c"]), + "7a_c-07": Room("7a", "7a_c-07", "The Summit A - Room c-07", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-07"], [door for _, door in all_doors.items() if door.room_name == "7a_c-07"]), + "7a_c-07b": Room("7a", "7a_c-07b", "The Summit A - Room c-07b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-07b"], [door for _, door in all_doors.items() if door.room_name == "7a_c-07b"]), + "7a_c-08": Room("7a", "7a_c-08", "The Summit A - Room c-08", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-08"], [door for _, door in all_doors.items() if door.room_name == "7a_c-08"]), + "7a_c-09": Room("7a", "7a_c-09", "The Summit A - Room c-09", [reg for _, reg in all_regions.items() if reg.room_name == "7a_c-09"], [door for _, door in all_doors.items() if door.room_name == "7a_c-09"]), + "7a_d-00": Room("7a", "7a_d-00", "The Summit A - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-00"], [door for _, door in all_doors.items() if door.room_name == "7a_d-00"], "1500 M", "7a_d-00_bottom"), + "7a_d-01": Room("7a", "7a_d-01", "The Summit A - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-01"], [door for _, door in all_doors.items() if door.room_name == "7a_d-01"]), + "7a_d-01b": Room("7a", "7a_d-01b", "The Summit A - Room d-01b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-01b"], [door for _, door in all_doors.items() if door.room_name == "7a_d-01b"]), + "7a_d-01c": Room("7a", "7a_d-01c", "The Summit A - Room d-01c", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-01c"], [door for _, door in all_doors.items() if door.room_name == "7a_d-01c"]), + "7a_d-01d": Room("7a", "7a_d-01d", "The Summit A - Room d-01d", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-01d"], [door for _, door in all_doors.items() if door.room_name == "7a_d-01d"]), + "7a_d-02": Room("7a", "7a_d-02", "The Summit A - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-02"], [door for _, door in all_doors.items() if door.room_name == "7a_d-02"]), + "7a_d-03": Room("7a", "7a_d-03", "The Summit A - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-03"], [door for _, door in all_doors.items() if door.room_name == "7a_d-03"]), + "7a_d-03b": Room("7a", "7a_d-03b", "The Summit A - Room d-03b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-03b"], [door for _, door in all_doors.items() if door.room_name == "7a_d-03b"]), + "7a_d-04": Room("7a", "7a_d-04", "The Summit A - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-04"], [door for _, door in all_doors.items() if door.room_name == "7a_d-04"]), + "7a_d-05": Room("7a", "7a_d-05", "The Summit A - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-05"], [door for _, door in all_doors.items() if door.room_name == "7a_d-05"]), + "7a_d-05b": Room("7a", "7a_d-05b", "The Summit A - Room d-05b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-05b"], [door for _, door in all_doors.items() if door.room_name == "7a_d-05b"]), + "7a_d-06": Room("7a", "7a_d-06", "The Summit A - Room d-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-06"], [door for _, door in all_doors.items() if door.room_name == "7a_d-06"]), + "7a_d-07": Room("7a", "7a_d-07", "The Summit A - Room d-07", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-07"], [door for _, door in all_doors.items() if door.room_name == "7a_d-07"]), + "7a_d-08": Room("7a", "7a_d-08", "The Summit A - Room d-08", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-08"], [door for _, door in all_doors.items() if door.room_name == "7a_d-08"]), + "7a_d-09": Room("7a", "7a_d-09", "The Summit A - Room d-09", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-09"], [door for _, door in all_doors.items() if door.room_name == "7a_d-09"]), + "7a_d-10": Room("7a", "7a_d-10", "The Summit A - Room d-10", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-10"], [door for _, door in all_doors.items() if door.room_name == "7a_d-10"]), + "7a_d-10b": Room("7a", "7a_d-10b", "The Summit A - Room d-10b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-10b"], [door for _, door in all_doors.items() if door.room_name == "7a_d-10b"]), + "7a_d-11": Room("7a", "7a_d-11", "The Summit A - Room d-11", [reg for _, reg in all_regions.items() if reg.room_name == "7a_d-11"], [door for _, door in all_doors.items() if door.room_name == "7a_d-11"]), + "7a_e-00b": Room("7a", "7a_e-00b", "The Summit A - Room e-00b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-00b"], [door for _, door in all_doors.items() if door.room_name == "7a_e-00b"], "2000 M", "7a_e-00b_bottom"), + "7a_e-00": Room("7a", "7a_e-00", "The Summit A - Room e-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-00"], [door for _, door in all_doors.items() if door.room_name == "7a_e-00"]), + "7a_e-01": Room("7a", "7a_e-01", "The Summit A - Room e-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-01"], [door for _, door in all_doors.items() if door.room_name == "7a_e-01"]), + "7a_e-01b": Room("7a", "7a_e-01b", "The Summit A - Room e-01b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-01b"], [door for _, door in all_doors.items() if door.room_name == "7a_e-01b"]), + "7a_e-01c": Room("7a", "7a_e-01c", "The Summit A - Room e-01c", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-01c"], [door for _, door in all_doors.items() if door.room_name == "7a_e-01c"]), + "7a_e-02": Room("7a", "7a_e-02", "The Summit A - Room e-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-02"], [door for _, door in all_doors.items() if door.room_name == "7a_e-02"]), + "7a_e-03": Room("7a", "7a_e-03", "The Summit A - Room e-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-03"], [door for _, door in all_doors.items() if door.room_name == "7a_e-03"]), + "7a_e-04": Room("7a", "7a_e-04", "The Summit A - Room e-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-04"], [door for _, door in all_doors.items() if door.room_name == "7a_e-04"]), + "7a_e-05": Room("7a", "7a_e-05", "The Summit A - Room e-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-05"], [door for _, door in all_doors.items() if door.room_name == "7a_e-05"]), + "7a_e-06": Room("7a", "7a_e-06", "The Summit A - Room e-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-06"], [door for _, door in all_doors.items() if door.room_name == "7a_e-06"]), + "7a_e-07": Room("7a", "7a_e-07", "The Summit A - Room e-07", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-07"], [door for _, door in all_doors.items() if door.room_name == "7a_e-07"]), + "7a_e-08": Room("7a", "7a_e-08", "The Summit A - Room e-08", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-08"], [door for _, door in all_doors.items() if door.room_name == "7a_e-08"]), + "7a_e-09": Room("7a", "7a_e-09", "The Summit A - Room e-09", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-09"], [door for _, door in all_doors.items() if door.room_name == "7a_e-09"]), + "7a_e-11": Room("7a", "7a_e-11", "The Summit A - Room e-11", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-11"], [door for _, door in all_doors.items() if door.room_name == "7a_e-11"]), + "7a_e-12": Room("7a", "7a_e-12", "The Summit A - Room e-12", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-12"], [door for _, door in all_doors.items() if door.room_name == "7a_e-12"]), + "7a_e-10": Room("7a", "7a_e-10", "The Summit A - Room e-10", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-10"], [door for _, door in all_doors.items() if door.room_name == "7a_e-10"]), + "7a_e-10b": Room("7a", "7a_e-10b", "The Summit A - Room e-10b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-10b"], [door for _, door in all_doors.items() if door.room_name == "7a_e-10b"]), + "7a_e-13": Room("7a", "7a_e-13", "The Summit A - Room e-13", [reg for _, reg in all_regions.items() if reg.room_name == "7a_e-13"], [door for _, door in all_doors.items() if door.room_name == "7a_e-13"]), + "7a_f-00": Room("7a", "7a_f-00", "The Summit A - Room f-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-00"], [door for _, door in all_doors.items() if door.room_name == "7a_f-00"], "2500 M", "7a_f-00_south"), + "7a_f-01": Room("7a", "7a_f-01", "The Summit A - Room f-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-01"], [door for _, door in all_doors.items() if door.room_name == "7a_f-01"]), + "7a_f-02": Room("7a", "7a_f-02", "The Summit A - Room f-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-02"], [door for _, door in all_doors.items() if door.room_name == "7a_f-02"]), + "7a_f-02b": Room("7a", "7a_f-02b", "The Summit A - Room f-02b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-02b"], [door for _, door in all_doors.items() if door.room_name == "7a_f-02b"]), + "7a_f-04": Room("7a", "7a_f-04", "The Summit A - Room f-04", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-04"], [door for _, door in all_doors.items() if door.room_name == "7a_f-04"]), + "7a_f-03": Room("7a", "7a_f-03", "The Summit A - Room f-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-03"], [door for _, door in all_doors.items() if door.room_name == "7a_f-03"]), + "7a_f-05": Room("7a", "7a_f-05", "The Summit A - Room f-05", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-05"], [door for _, door in all_doors.items() if door.room_name == "7a_f-05"]), + "7a_f-06": Room("7a", "7a_f-06", "The Summit A - Room f-06", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-06"], [door for _, door in all_doors.items() if door.room_name == "7a_f-06"]), + "7a_f-07": Room("7a", "7a_f-07", "The Summit A - Room f-07", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-07"], [door for _, door in all_doors.items() if door.room_name == "7a_f-07"]), + "7a_f-08": Room("7a", "7a_f-08", "The Summit A - Room f-08", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-08"], [door for _, door in all_doors.items() if door.room_name == "7a_f-08"]), + "7a_f-08b": Room("7a", "7a_f-08b", "The Summit A - Room f-08b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-08b"], [door for _, door in all_doors.items() if door.room_name == "7a_f-08b"]), + "7a_f-08d": Room("7a", "7a_f-08d", "The Summit A - Room f-08d", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-08d"], [door for _, door in all_doors.items() if door.room_name == "7a_f-08d"]), + "7a_f-08c": Room("7a", "7a_f-08c", "The Summit A - Room f-08c", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-08c"], [door for _, door in all_doors.items() if door.room_name == "7a_f-08c"]), + "7a_f-09": Room("7a", "7a_f-09", "The Summit A - Room f-09", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-09"], [door for _, door in all_doors.items() if door.room_name == "7a_f-09"]), + "7a_f-10": Room("7a", "7a_f-10", "The Summit A - Room f-10", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-10"], [door for _, door in all_doors.items() if door.room_name == "7a_f-10"]), + "7a_f-10b": Room("7a", "7a_f-10b", "The Summit A - Room f-10b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-10b"], [door for _, door in all_doors.items() if door.room_name == "7a_f-10b"]), + "7a_f-11": Room("7a", "7a_f-11", "The Summit A - Room f-11", [reg for _, reg in all_regions.items() if reg.room_name == "7a_f-11"], [door for _, door in all_doors.items() if door.room_name == "7a_f-11"]), + "7a_g-00": Room("7a", "7a_g-00", "The Summit A - Room g-00", [reg for _, reg in all_regions.items() if reg.room_name == "7a_g-00"], [door for _, door in all_doors.items() if door.room_name == "7a_g-00"], "3000 M", "7a_g-00_bottom"), + "7a_g-00b": Room("7a", "7a_g-00b", "The Summit A - Room g-00b", [reg for _, reg in all_regions.items() if reg.room_name == "7a_g-00b"], [door for _, door in all_doors.items() if door.room_name == "7a_g-00b"]), + "7a_g-01": Room("7a", "7a_g-01", "The Summit A - Room g-01", [reg for _, reg in all_regions.items() if reg.room_name == "7a_g-01"], [door for _, door in all_doors.items() if door.room_name == "7a_g-01"]), + "7a_g-02": Room("7a", "7a_g-02", "The Summit A - Room g-02", [reg for _, reg in all_regions.items() if reg.room_name == "7a_g-02"], [door for _, door in all_doors.items() if door.room_name == "7a_g-02"]), + "7a_g-03": Room("7a", "7a_g-03", "The Summit A - Room g-03", [reg for _, reg in all_regions.items() if reg.room_name == "7a_g-03"], [door for _, door in all_doors.items() if door.room_name == "7a_g-03"]), + + "7b_a-00": Room("7b", "7b_a-00", "The Summit B - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_a-00"], [door for _, door in all_doors.items() if door.room_name == "7b_a-00"], "Start", "7b_a-00_west"), + "7b_a-01": Room("7b", "7b_a-01", "The Summit B - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_a-01"], [door for _, door in all_doors.items() if door.room_name == "7b_a-01"]), + "7b_a-02": Room("7b", "7b_a-02", "The Summit B - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_a-02"], [door for _, door in all_doors.items() if door.room_name == "7b_a-02"]), + "7b_a-03": Room("7b", "7b_a-03", "The Summit B - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_a-03"], [door for _, door in all_doors.items() if door.room_name == "7b_a-03"]), + "7b_b-00": Room("7b", "7b_b-00", "The Summit B - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_b-00"], [door for _, door in all_doors.items() if door.room_name == "7b_b-00"], "500 M", "7b_b-00_bottom"), + "7b_b-01": Room("7b", "7b_b-01", "The Summit B - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_b-01"], [door for _, door in all_doors.items() if door.room_name == "7b_b-01"]), + "7b_b-02": Room("7b", "7b_b-02", "The Summit B - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_b-02"], [door for _, door in all_doors.items() if door.room_name == "7b_b-02"]), + "7b_b-03": Room("7b", "7b_b-03", "The Summit B - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_b-03"], [door for _, door in all_doors.items() if door.room_name == "7b_b-03"]), + "7b_c-01": Room("7b", "7b_c-01", "The Summit B - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_c-01"], [door for _, door in all_doors.items() if door.room_name == "7b_c-01"], "1000 M", "7b_c-01_west"), + "7b_c-00": Room("7b", "7b_c-00", "The Summit B - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_c-00"], [door for _, door in all_doors.items() if door.room_name == "7b_c-00"]), + "7b_c-02": Room("7b", "7b_c-02", "The Summit B - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_c-02"], [door for _, door in all_doors.items() if door.room_name == "7b_c-02"]), + "7b_c-03": Room("7b", "7b_c-03", "The Summit B - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_c-03"], [door for _, door in all_doors.items() if door.room_name == "7b_c-03"]), + "7b_d-00": Room("7b", "7b_d-00", "The Summit B - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_d-00"], [door for _, door in all_doors.items() if door.room_name == "7b_d-00"], "1500 M", "7b_d-00_west"), + "7b_d-01": Room("7b", "7b_d-01", "The Summit B - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_d-01"], [door for _, door in all_doors.items() if door.room_name == "7b_d-01"]), + "7b_d-02": Room("7b", "7b_d-02", "The Summit B - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_d-02"], [door for _, door in all_doors.items() if door.room_name == "7b_d-02"]), + "7b_d-03": Room("7b", "7b_d-03", "The Summit B - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_d-03"], [door for _, door in all_doors.items() if door.room_name == "7b_d-03"]), + "7b_e-00": Room("7b", "7b_e-00", "The Summit B - Room e-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_e-00"], [door for _, door in all_doors.items() if door.room_name == "7b_e-00"], "2000 M", "7b_e-00_west"), + "7b_e-01": Room("7b", "7b_e-01", "The Summit B - Room e-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_e-01"], [door for _, door in all_doors.items() if door.room_name == "7b_e-01"]), + "7b_e-02": Room("7b", "7b_e-02", "The Summit B - Room e-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_e-02"], [door for _, door in all_doors.items() if door.room_name == "7b_e-02"]), + "7b_e-03": Room("7b", "7b_e-03", "The Summit B - Room e-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_e-03"], [door for _, door in all_doors.items() if door.room_name == "7b_e-03"]), + "7b_f-00": Room("7b", "7b_f-00", "The Summit B - Room f-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_f-00"], [door for _, door in all_doors.items() if door.room_name == "7b_f-00"], "2500 M", "7b_f-00_west"), + "7b_f-01": Room("7b", "7b_f-01", "The Summit B - Room f-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_f-01"], [door for _, door in all_doors.items() if door.room_name == "7b_f-01"]), + "7b_f-02": Room("7b", "7b_f-02", "The Summit B - Room f-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_f-02"], [door for _, door in all_doors.items() if door.room_name == "7b_f-02"]), + "7b_f-03": Room("7b", "7b_f-03", "The Summit B - Room f-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_f-03"], [door for _, door in all_doors.items() if door.room_name == "7b_f-03"]), + "7b_g-00": Room("7b", "7b_g-00", "The Summit B - Room g-00", [reg for _, reg in all_regions.items() if reg.room_name == "7b_g-00"], [door for _, door in all_doors.items() if door.room_name == "7b_g-00"], "3000 M", "7b_g-00_bottom"), + "7b_g-01": Room("7b", "7b_g-01", "The Summit B - Room g-01", [reg for _, reg in all_regions.items() if reg.room_name == "7b_g-01"], [door for _, door in all_doors.items() if door.room_name == "7b_g-01"]), + "7b_g-02": Room("7b", "7b_g-02", "The Summit B - Room g-02", [reg for _, reg in all_regions.items() if reg.room_name == "7b_g-02"], [door for _, door in all_doors.items() if door.room_name == "7b_g-02"]), + "7b_g-03": Room("7b", "7b_g-03", "The Summit B - Room g-03", [reg for _, reg in all_regions.items() if reg.room_name == "7b_g-03"], [door for _, door in all_doors.items() if door.room_name == "7b_g-03"]), + + "7c_01": Room("7c", "7c_01", "The Summit C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "7c_01"], [door for _, door in all_doors.items() if door.room_name == "7c_01"], "Start", "7c_01_west"), + "7c_02": Room("7c", "7c_02", "The Summit C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "7c_02"], [door for _, door in all_doors.items() if door.room_name == "7c_02"]), + "7c_03": Room("7c", "7c_03", "The Summit C - Room 03", [reg for _, reg in all_regions.items() if reg.room_name == "7c_03"], [door for _, door in all_doors.items() if door.room_name == "7c_03"]), + + "8a_outside": Room("8a", "8a_outside", "Epilogue - Room outside", [reg for _, reg in all_regions.items() if reg.room_name == "8a_outside"], [door for _, door in all_doors.items() if door.room_name == "8a_outside"], "Start", "8a_outside_east"), + "8a_bridge": Room("8a", "8a_bridge", "Epilogue - Room bridge", [reg for _, reg in all_regions.items() if reg.room_name == "8a_bridge"], [door for _, door in all_doors.items() if door.room_name == "8a_bridge"]), + "8a_secret": Room("8a", "8a_secret", "Epilogue - Room secret", [reg for _, reg in all_regions.items() if reg.room_name == "8a_secret"], [door for _, door in all_doors.items() if door.room_name == "8a_secret"]), + + "9a_00": Room("9a", "9a_00", "Core A - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "9a_00"], [door for _, door in all_doors.items() if door.room_name == "9a_00"], "Start", "9a_00_west"), + "9a_0x": Room("9a", "9a_0x", "Core A - Room 0x", [reg for _, reg in all_regions.items() if reg.room_name == "9a_0x"], [door for _, door in all_doors.items() if door.room_name == "9a_0x"]), + "9a_01": Room("9a", "9a_01", "Core A - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "9a_01"], [door for _, door in all_doors.items() if door.room_name == "9a_01"]), + "9a_02": Room("9a", "9a_02", "Core A - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "9a_02"], [door for _, door in all_doors.items() if door.room_name == "9a_02"]), + "9a_a-00": Room("9a", "9a_a-00", "Core A - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "9a_a-00"], [door for _, door in all_doors.items() if door.room_name == "9a_a-00"], "Into the Core", "9a_a-00_west"), + "9a_a-01": Room("9a", "9a_a-01", "Core A - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "9a_a-01"], [door for _, door in all_doors.items() if door.room_name == "9a_a-01"]), + "9a_a-02": Room("9a", "9a_a-02", "Core A - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "9a_a-02"], [door for _, door in all_doors.items() if door.room_name == "9a_a-02"]), + "9a_a-03": Room("9a", "9a_a-03", "Core A - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "9a_a-03"], [door for _, door in all_doors.items() if door.room_name == "9a_a-03"]), + "9a_b-00": Room("9a", "9a_b-00", "Core A - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-00"], [door for _, door in all_doors.items() if door.room_name == "9a_b-00"]), + "9a_b-01": Room("9a", "9a_b-01", "Core A - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-01"], [door for _, door in all_doors.items() if door.room_name == "9a_b-01"]), + "9a_b-02": Room("9a", "9a_b-02", "Core A - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-02"], [door for _, door in all_doors.items() if door.room_name == "9a_b-02"]), + "9a_b-03": Room("9a", "9a_b-03", "Core A - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-03"], [door for _, door in all_doors.items() if door.room_name == "9a_b-03"]), + "9a_b-04": Room("9a", "9a_b-04", "Core A - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-04"], [door for _, door in all_doors.items() if door.room_name == "9a_b-04"]), + "9a_b-05": Room("9a", "9a_b-05", "Core A - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-05"], [door for _, door in all_doors.items() if door.room_name == "9a_b-05"]), + "9a_b-06": Room("9a", "9a_b-06", "Core A - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-06"], [door for _, door in all_doors.items() if door.room_name == "9a_b-06"]), + "9a_b-07b": Room("9a", "9a_b-07b", "Core A - Room b-07b", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-07b"], [door for _, door in all_doors.items() if door.room_name == "9a_b-07b"]), + "9a_b-07": Room("9a", "9a_b-07", "Core A - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "9a_b-07"], [door for _, door in all_doors.items() if door.room_name == "9a_b-07"]), + "9a_c-00": Room("9a", "9a_c-00", "Core A - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-00"], [door for _, door in all_doors.items() if door.room_name == "9a_c-00"], "Hot and Cold", "9a_c-00_west"), + "9a_c-00b": Room("9a", "9a_c-00b", "Core A - Room c-00b", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-00b"], [door for _, door in all_doors.items() if door.room_name == "9a_c-00b"]), + "9a_c-01": Room("9a", "9a_c-01", "Core A - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-01"], [door for _, door in all_doors.items() if door.room_name == "9a_c-01"]), + "9a_c-02": Room("9a", "9a_c-02", "Core A - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-02"], [door for _, door in all_doors.items() if door.room_name == "9a_c-02"]), + "9a_c-03": Room("9a", "9a_c-03", "Core A - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-03"], [door for _, door in all_doors.items() if door.room_name == "9a_c-03"]), + "9a_c-03b": Room("9a", "9a_c-03b", "Core A - Room c-03b", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-03b"], [door for _, door in all_doors.items() if door.room_name == "9a_c-03b"]), + "9a_c-04": Room("9a", "9a_c-04", "Core A - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "9a_c-04"], [door for _, door in all_doors.items() if door.room_name == "9a_c-04"]), + "9a_d-00": Room("9a", "9a_d-00", "Core A - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-00"], [door for _, door in all_doors.items() if door.room_name == "9a_d-00"], "Heart of the Mountain", "9a_d-00_bottom"), + "9a_d-01": Room("9a", "9a_d-01", "Core A - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-01"], [door for _, door in all_doors.items() if door.room_name == "9a_d-01"]), + "9a_d-02": Room("9a", "9a_d-02", "Core A - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-02"], [door for _, door in all_doors.items() if door.room_name == "9a_d-02"]), + "9a_d-03": Room("9a", "9a_d-03", "Core A - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-03"], [door for _, door in all_doors.items() if door.room_name == "9a_d-03"]), + "9a_d-04": Room("9a", "9a_d-04", "Core A - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-04"], [door for _, door in all_doors.items() if door.room_name == "9a_d-04"]), + "9a_d-05": Room("9a", "9a_d-05", "Core A - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-05"], [door for _, door in all_doors.items() if door.room_name == "9a_d-05"]), + "9a_d-06": Room("9a", "9a_d-06", "Core A - Room d-06", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-06"], [door for _, door in all_doors.items() if door.room_name == "9a_d-06"]), + "9a_d-07": Room("9a", "9a_d-07", "Core A - Room d-07", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-07"], [door for _, door in all_doors.items() if door.room_name == "9a_d-07"]), + "9a_d-08": Room("9a", "9a_d-08", "Core A - Room d-08", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-08"], [door for _, door in all_doors.items() if door.room_name == "9a_d-08"]), + "9a_d-09": Room("9a", "9a_d-09", "Core A - Room d-09", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-09"], [door for _, door in all_doors.items() if door.room_name == "9a_d-09"]), + "9a_d-10": Room("9a", "9a_d-10", "Core A - Room d-10", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-10"], [door for _, door in all_doors.items() if door.room_name == "9a_d-10"]), + "9a_d-10b": Room("9a", "9a_d-10b", "Core A - Room d-10b", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-10b"], [door for _, door in all_doors.items() if door.room_name == "9a_d-10b"]), + "9a_d-10c": Room("9a", "9a_d-10c", "Core A - Room d-10c", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-10c"], [door for _, door in all_doors.items() if door.room_name == "9a_d-10c"]), + "9a_d-11": Room("9a", "9a_d-11", "Core A - Room d-11", [reg for _, reg in all_regions.items() if reg.room_name == "9a_d-11"], [door for _, door in all_doors.items() if door.room_name == "9a_d-11"]), + "9a_space": Room("9a", "9a_space", "Core A - Room space", [reg for _, reg in all_regions.items() if reg.room_name == "9a_space"], [door for _, door in all_doors.items() if door.room_name == "9a_space"]), + + "9b_00": Room("9b", "9b_00", "Core B - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "9b_00"], [door for _, door in all_doors.items() if door.room_name == "9b_00"], "Start", "9b_00_east"), + "9b_01": Room("9b", "9b_01", "Core B - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "9b_01"], [door for _, door in all_doors.items() if door.room_name == "9b_01"]), + "9b_a-00": Room("9b", "9b_a-00", "Core B - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-00"], [door for _, door in all_doors.items() if door.room_name == "9b_a-00"], "Into the Core", "9b_a-00_west"), + "9b_a-01": Room("9b", "9b_a-01", "Core B - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-01"], [door for _, door in all_doors.items() if door.room_name == "9b_a-01"]), + "9b_a-02": Room("9b", "9b_a-02", "Core B - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-02"], [door for _, door in all_doors.items() if door.room_name == "9b_a-02"]), + "9b_a-03": Room("9b", "9b_a-03", "Core B - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-03"], [door for _, door in all_doors.items() if door.room_name == "9b_a-03"]), + "9b_a-04": Room("9b", "9b_a-04", "Core B - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-04"], [door for _, door in all_doors.items() if door.room_name == "9b_a-04"]), + "9b_a-05": Room("9b", "9b_a-05", "Core B - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "9b_a-05"], [door for _, door in all_doors.items() if door.room_name == "9b_a-05"]), + "9b_b-00": Room("9b", "9b_b-00", "Core B - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-00"], [door for _, door in all_doors.items() if door.room_name == "9b_b-00"], "Burning or Freezing", "9b_b-00_west"), + "9b_b-01": Room("9b", "9b_b-01", "Core B - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-01"], [door for _, door in all_doors.items() if door.room_name == "9b_b-01"]), + "9b_b-02": Room("9b", "9b_b-02", "Core B - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-02"], [door for _, door in all_doors.items() if door.room_name == "9b_b-02"]), + "9b_b-03": Room("9b", "9b_b-03", "Core B - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-03"], [door for _, door in all_doors.items() if door.room_name == "9b_b-03"]), + "9b_b-04": Room("9b", "9b_b-04", "Core B - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-04"], [door for _, door in all_doors.items() if door.room_name == "9b_b-04"]), + "9b_b-05": Room("9b", "9b_b-05", "Core B - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "9b_b-05"], [door for _, door in all_doors.items() if door.room_name == "9b_b-05"]), + "9b_c-01": Room("9b", "9b_c-01", "Core B - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-01"], [door for _, door in all_doors.items() if door.room_name == "9b_c-01"], "Heartbeat", "9b_c-01_bottom"), + "9b_c-02": Room("9b", "9b_c-02", "Core B - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-02"], [door for _, door in all_doors.items() if door.room_name == "9b_c-02"]), + "9b_c-03": Room("9b", "9b_c-03", "Core B - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-03"], [door for _, door in all_doors.items() if door.room_name == "9b_c-03"]), + "9b_c-04": Room("9b", "9b_c-04", "Core B - Room c-04", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-04"], [door for _, door in all_doors.items() if door.room_name == "9b_c-04"]), + "9b_c-05": Room("9b", "9b_c-05", "Core B - Room c-05", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-05"], [door for _, door in all_doors.items() if door.room_name == "9b_c-05"]), + "9b_c-06": Room("9b", "9b_c-06", "Core B - Room c-06", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-06"], [door for _, door in all_doors.items() if door.room_name == "9b_c-06"]), + "9b_c-08": Room("9b", "9b_c-08", "Core B - Room c-08", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-08"], [door for _, door in all_doors.items() if door.room_name == "9b_c-08"]), + "9b_c-07": Room("9b", "9b_c-07", "Core B - Room c-07", [reg for _, reg in all_regions.items() if reg.room_name == "9b_c-07"], [door for _, door in all_doors.items() if door.room_name == "9b_c-07"]), + "9b_space": Room("9b", "9b_space", "Core B - Room space", [reg for _, reg in all_regions.items() if reg.room_name == "9b_space"], [door for _, door in all_doors.items() if door.room_name == "9b_space"]), + + "9c_intro": Room("9c", "9c_intro", "Core C - Room intro", [reg for _, reg in all_regions.items() if reg.room_name == "9c_intro"], [door for _, door in all_doors.items() if door.room_name == "9c_intro"], "Start", "9c_intro_west"), + "9c_00": Room("9c", "9c_00", "Core C - Room 00", [reg for _, reg in all_regions.items() if reg.room_name == "9c_00"], [door for _, door in all_doors.items() if door.room_name == "9c_00"]), + "9c_01": Room("9c", "9c_01", "Core C - Room 01", [reg for _, reg in all_regions.items() if reg.room_name == "9c_01"], [door for _, door in all_doors.items() if door.room_name == "9c_01"]), + "9c_02": Room("9c", "9c_02", "Core C - Room 02", [reg for _, reg in all_regions.items() if reg.room_name == "9c_02"], [door for _, door in all_doors.items() if door.room_name == "9c_02"]), + + "10a_intro-00-past": Room("10a", "10a_intro-00-past", "Farewell - Room intro-00-past", [reg for _, reg in all_regions.items() if reg.room_name == "10a_intro-00-past"], [door for _, door in all_doors.items() if door.room_name == "10a_intro-00-past"], "Start", "10a_intro-00-past_west"), + "10a_intro-01-future": Room("10a", "10a_intro-01-future", "Farewell - Room intro-01-future", [reg for _, reg in all_regions.items() if reg.room_name == "10a_intro-01-future"], [door for _, door in all_doors.items() if door.room_name == "10a_intro-01-future"]), + "10a_intro-02-launch": Room("10a", "10a_intro-02-launch", "Farewell - Room intro-02-launch", [reg for _, reg in all_regions.items() if reg.room_name == "10a_intro-02-launch"], [door for _, door in all_doors.items() if door.room_name == "10a_intro-02-launch"]), + "10a_intro-03-space": Room("10a", "10a_intro-03-space", "Farewell - Room intro-03-space", [reg for _, reg in all_regions.items() if reg.room_name == "10a_intro-03-space"], [door for _, door in all_doors.items() if door.room_name == "10a_intro-03-space"]), + "10a_a-00": Room("10a", "10a_a-00", "Farewell - Room a-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-00"], [door for _, door in all_doors.items() if door.room_name == "10a_a-00"], "Singular", "10a_a-00_west"), + "10a_a-01": Room("10a", "10a_a-01", "Farewell - Room a-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-01"], [door for _, door in all_doors.items() if door.room_name == "10a_a-01"]), + "10a_a-02": Room("10a", "10a_a-02", "Farewell - Room a-02", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-02"], [door for _, door in all_doors.items() if door.room_name == "10a_a-02"]), + "10a_a-03": Room("10a", "10a_a-03", "Farewell - Room a-03", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-03"], [door for _, door in all_doors.items() if door.room_name == "10a_a-03"]), + "10a_a-04": Room("10a", "10a_a-04", "Farewell - Room a-04", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-04"], [door for _, door in all_doors.items() if door.room_name == "10a_a-04"]), + "10a_a-05": Room("10a", "10a_a-05", "Farewell - Room a-05", [reg for _, reg in all_regions.items() if reg.room_name == "10a_a-05"], [door for _, door in all_doors.items() if door.room_name == "10a_a-05"]), + "10a_b-00": Room("10a", "10a_b-00", "Farewell - Room b-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-00"], [door for _, door in all_doors.items() if door.room_name == "10a_b-00"]), + "10a_b-01": Room("10a", "10a_b-01", "Farewell - Room b-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-01"], [door for _, door in all_doors.items() if door.room_name == "10a_b-01"]), + "10a_b-02": Room("10a", "10a_b-02", "Farewell - Room b-02", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-02"], [door for _, door in all_doors.items() if door.room_name == "10a_b-02"]), + "10a_b-03": Room("10a", "10a_b-03", "Farewell - Room b-03", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-03"], [door for _, door in all_doors.items() if door.room_name == "10a_b-03"]), + "10a_b-04": Room("10a", "10a_b-04", "Farewell - Room b-04", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-04"], [door for _, door in all_doors.items() if door.room_name == "10a_b-04"]), + "10a_b-05": Room("10a", "10a_b-05", "Farewell - Room b-05", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-05"], [door for _, door in all_doors.items() if door.room_name == "10a_b-05"]), + "10a_b-06": Room("10a", "10a_b-06", "Farewell - Room b-06", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-06"], [door for _, door in all_doors.items() if door.room_name == "10a_b-06"]), + "10a_b-07": Room("10a", "10a_b-07", "Farewell - Room b-07", [reg for _, reg in all_regions.items() if reg.room_name == "10a_b-07"], [door for _, door in all_doors.items() if door.room_name == "10a_b-07"]), + "10a_c-00": Room("10a", "10a_c-00", "Farewell - Room c-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-00"], [door for _, door in all_doors.items() if door.room_name == "10a_c-00"], "Power Source", "10a_c-00_west"), + "10a_c-00b": Room("10a", "10a_c-00b", "Farewell - Room c-00b", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-00b"], [door for _, door in all_doors.items() if door.room_name == "10a_c-00b"]), + "10a_c-01": Room("10a", "10a_c-01", "Farewell - Room c-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-01"], [door for _, door in all_doors.items() if door.room_name == "10a_c-01"]), + "10a_c-02": Room("10a", "10a_c-02", "Farewell - Room c-02", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-02"], [door for _, door in all_doors.items() if door.room_name == "10a_c-02"]), + "10a_c-alt-00": Room("10a", "10a_c-alt-00", "Farewell - Room c-alt-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-alt-00"], [door for _, door in all_doors.items() if door.room_name == "10a_c-alt-00"]), + "10a_c-alt-01": Room("10a", "10a_c-alt-01", "Farewell - Room c-alt-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-alt-01"], [door for _, door in all_doors.items() if door.room_name == "10a_c-alt-01"]), + "10a_c-03": Room("10a", "10a_c-03", "Farewell - Room c-03", [reg for _, reg in all_regions.items() if reg.room_name == "10a_c-03"], [door for _, door in all_doors.items() if door.room_name == "10a_c-03"]), + "10a_d-00": Room("10a", "10a_d-00", "Farewell - Room d-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-00"], [door for _, door in all_doors.items() if door.room_name == "10a_d-00"]), + "10a_d-04": Room("10a", "10a_d-04", "Farewell - Room d-04", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-04"], [door for _, door in all_doors.items() if door.room_name == "10a_d-04"]), + "10a_d-03": Room("10a", "10a_d-03", "Farewell - Room d-03", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-03"], [door for _, door in all_doors.items() if door.room_name == "10a_d-03"]), + "10a_d-01": Room("10a", "10a_d-01", "Farewell - Room d-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-01"], [door for _, door in all_doors.items() if door.room_name == "10a_d-01"]), + "10a_d-02": Room("10a", "10a_d-02", "Farewell - Room d-02", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-02"], [door for _, door in all_doors.items() if door.room_name == "10a_d-02"]), + "10a_d-05": Room("10a", "10a_d-05", "Farewell - Room d-05", [reg for _, reg in all_regions.items() if reg.room_name == "10a_d-05"], [door for _, door in all_doors.items() if door.room_name == "10a_d-05"]), + "10a_e-00y": Room("10a", "10a_e-00y", "Farewell - Room e-00y", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-00y"], [door for _, door in all_doors.items() if door.room_name == "10a_e-00y"]), + "10a_e-00yb": Room("10a", "10a_e-00yb", "Farewell - Room e-00yb", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-00yb"], [door for _, door in all_doors.items() if door.room_name == "10a_e-00yb"]), + "10a_e-00z": Room("10a", "10a_e-00z", "Farewell - Room e-00z", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-00z"], [door for _, door in all_doors.items() if door.room_name == "10a_e-00z"], "Remembered", "10a_e-00z_south"), + "10a_e-00": Room("10a", "10a_e-00", "Farewell - Room e-00", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-00"], [door for _, door in all_doors.items() if door.room_name == "10a_e-00"]), + "10a_e-00b": Room("10a", "10a_e-00b", "Farewell - Room e-00b", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-00b"], [door for _, door in all_doors.items() if door.room_name == "10a_e-00b"]), + "10a_e-01": Room("10a", "10a_e-01", "Farewell - Room e-01", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-01"], [door for _, door in all_doors.items() if door.room_name == "10a_e-01"]), + "10a_e-02": Room("10a", "10a_e-02", "Farewell - Room e-02", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-02"], [door for _, door in all_doors.items() if door.room_name == "10a_e-02"]), + "10a_e-03": Room("10a", "10a_e-03", "Farewell - Room e-03", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-03"], [door for _, door in all_doors.items() if door.room_name == "10a_e-03"]), + "10a_e-04": Room("10a", "10a_e-04", "Farewell - Room e-04", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-04"], [door for _, door in all_doors.items() if door.room_name == "10a_e-04"]), + "10a_e-05": Room("10a", "10a_e-05", "Farewell - Room e-05", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-05"], [door for _, door in all_doors.items() if door.room_name == "10a_e-05"]), + "10a_e-05b": Room("10a", "10a_e-05b", "Farewell - Room e-05b", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-05b"], [door for _, door in all_doors.items() if door.room_name == "10a_e-05b"]), + "10a_e-05c": Room("10a", "10a_e-05c", "Farewell - Room e-05c", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-05c"], [door for _, door in all_doors.items() if door.room_name == "10a_e-05c"]), + "10a_e-06": Room("10a", "10a_e-06", "Farewell - Room e-06", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-06"], [door for _, door in all_doors.items() if door.room_name == "10a_e-06"]), + "10a_e-07": Room("10a", "10a_e-07", "Farewell - Room e-07", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-07"], [door for _, door in all_doors.items() if door.room_name == "10a_e-07"]), + "10a_e-08": Room("10a", "10a_e-08", "Farewell - Room e-08", [reg for _, reg in all_regions.items() if reg.room_name == "10a_e-08"], [door for _, door in all_doors.items() if door.room_name == "10a_e-08"]), + + "10b_f-door": Room("10b", "10b_f-door", "Farewell - Room f-door", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-door"], [door for _, door in all_doors.items() if door.room_name == "10b_f-door"], "Event Horizon", "10b_f-door_west"), + "10b_f-00": Room("10b", "10b_f-00", "Farewell - Room f-00", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-00"], [door for _, door in all_doors.items() if door.room_name == "10b_f-00"]), + "10b_f-01": Room("10b", "10b_f-01", "Farewell - Room f-01", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-01"], [door for _, door in all_doors.items() if door.room_name == "10b_f-01"]), + "10b_f-02": Room("10b", "10b_f-02", "Farewell - Room f-02", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-02"], [door for _, door in all_doors.items() if door.room_name == "10b_f-02"]), + "10b_f-03": Room("10b", "10b_f-03", "Farewell - Room f-03", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-03"], [door for _, door in all_doors.items() if door.room_name == "10b_f-03"]), + "10b_f-04": Room("10b", "10b_f-04", "Farewell - Room f-04", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-04"], [door for _, door in all_doors.items() if door.room_name == "10b_f-04"]), + "10b_f-05": Room("10b", "10b_f-05", "Farewell - Room f-05", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-05"], [door for _, door in all_doors.items() if door.room_name == "10b_f-05"]), + "10b_f-06": Room("10b", "10b_f-06", "Farewell - Room f-06", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-06"], [door for _, door in all_doors.items() if door.room_name == "10b_f-06"]), + "10b_f-07": Room("10b", "10b_f-07", "Farewell - Room f-07", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-07"], [door for _, door in all_doors.items() if door.room_name == "10b_f-07"]), + "10b_f-08": Room("10b", "10b_f-08", "Farewell - Room f-08", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-08"], [door for _, door in all_doors.items() if door.room_name == "10b_f-08"]), + "10b_f-09": Room("10b", "10b_f-09", "Farewell - Room f-09", [reg for _, reg in all_regions.items() if reg.room_name == "10b_f-09"], [door for _, door in all_doors.items() if door.room_name == "10b_f-09"]), + "10b_g-00": Room("10b", "10b_g-00", "Farewell - Room g-00", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-00"], [door for _, door in all_doors.items() if door.room_name == "10b_g-00"]), + "10b_g-01": Room("10b", "10b_g-01", "Farewell - Room g-01", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-01"], [door for _, door in all_doors.items() if door.room_name == "10b_g-01"]), + "10b_g-03": Room("10b", "10b_g-03", "Farewell - Room g-03", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-03"], [door for _, door in all_doors.items() if door.room_name == "10b_g-03"]), + "10b_g-02": Room("10b", "10b_g-02", "Farewell - Room g-02", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-02"], [door for _, door in all_doors.items() if door.room_name == "10b_g-02"]), + "10b_g-04": Room("10b", "10b_g-04", "Farewell - Room g-04", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-04"], [door for _, door in all_doors.items() if door.room_name == "10b_g-04"]), + "10b_g-05": Room("10b", "10b_g-05", "Farewell - Room g-05", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-05"], [door for _, door in all_doors.items() if door.room_name == "10b_g-05"]), + "10b_g-06": Room("10b", "10b_g-06", "Farewell - Room g-06", [reg for _, reg in all_regions.items() if reg.room_name == "10b_g-06"], [door for _, door in all_doors.items() if door.room_name == "10b_g-06"]), + "10b_h-00b": Room("10b", "10b_h-00b", "Farewell - Room h-00b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-00b"], [door for _, door in all_doors.items() if door.room_name == "10b_h-00b"], "Determination", "10b_h-00b_west"), + "10b_h-00": Room("10b", "10b_h-00", "Farewell - Room h-00", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-00"], [door for _, door in all_doors.items() if door.room_name == "10b_h-00"]), + "10b_h-01": Room("10b", "10b_h-01", "Farewell - Room h-01", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-01"], [door for _, door in all_doors.items() if door.room_name == "10b_h-01"]), + "10b_h-02": Room("10b", "10b_h-02", "Farewell - Room h-02", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-02"], [door for _, door in all_doors.items() if door.room_name == "10b_h-02"]), + "10b_h-03": Room("10b", "10b_h-03", "Farewell - Room h-03", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-03"], [door for _, door in all_doors.items() if door.room_name == "10b_h-03"]), + "10b_h-03b": Room("10b", "10b_h-03b", "Farewell - Room h-03b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-03b"], [door for _, door in all_doors.items() if door.room_name == "10b_h-03b"]), + "10b_h-04": Room("10b", "10b_h-04", "Farewell - Room h-04", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-04"], [door for _, door in all_doors.items() if door.room_name == "10b_h-04"]), + "10b_h-04b": Room("10b", "10b_h-04b", "Farewell - Room h-04b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-04b"], [door for _, door in all_doors.items() if door.room_name == "10b_h-04b"]), + "10b_h-05": Room("10b", "10b_h-05", "Farewell - Room h-05", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-05"], [door for _, door in all_doors.items() if door.room_name == "10b_h-05"]), + "10b_h-06": Room("10b", "10b_h-06", "Farewell - Room h-06", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-06"], [door for _, door in all_doors.items() if door.room_name == "10b_h-06"]), + "10b_h-06b": Room("10b", "10b_h-06b", "Farewell - Room h-06b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-06b"], [door for _, door in all_doors.items() if door.room_name == "10b_h-06b"]), + "10b_h-07": Room("10b", "10b_h-07", "Farewell - Room h-07", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-07"], [door for _, door in all_doors.items() if door.room_name == "10b_h-07"]), + "10b_h-08": Room("10b", "10b_h-08", "Farewell - Room h-08", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-08"], [door for _, door in all_doors.items() if door.room_name == "10b_h-08"]), + "10b_h-09": Room("10b", "10b_h-09", "Farewell - Room h-09", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-09"], [door for _, door in all_doors.items() if door.room_name == "10b_h-09"]), + "10b_h-10": Room("10b", "10b_h-10", "Farewell - Room h-10", [reg for _, reg in all_regions.items() if reg.room_name == "10b_h-10"], [door for _, door in all_doors.items() if door.room_name == "10b_h-10"]), + "10b_i-00": Room("10b", "10b_i-00", "Farewell - Room i-00", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-00"], [door for _, door in all_doors.items() if door.room_name == "10b_i-00"], "Stubbornness", "10b_i-00_west"), + "10b_i-00b": Room("10b", "10b_i-00b", "Farewell - Room i-00b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-00b"], [door for _, door in all_doors.items() if door.room_name == "10b_i-00b"]), + "10b_i-01": Room("10b", "10b_i-01", "Farewell - Room i-01", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-01"], [door for _, door in all_doors.items() if door.room_name == "10b_i-01"]), + "10b_i-02": Room("10b", "10b_i-02", "Farewell - Room i-02", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-02"], [door for _, door in all_doors.items() if door.room_name == "10b_i-02"]), + "10b_i-03": Room("10b", "10b_i-03", "Farewell - Room i-03", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-03"], [door for _, door in all_doors.items() if door.room_name == "10b_i-03"]), + "10b_i-04": Room("10b", "10b_i-04", "Farewell - Room i-04", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-04"], [door for _, door in all_doors.items() if door.room_name == "10b_i-04"]), + "10b_i-05": Room("10b", "10b_i-05", "Farewell - Room i-05", [reg for _, reg in all_regions.items() if reg.room_name == "10b_i-05"], [door for _, door in all_doors.items() if door.room_name == "10b_i-05"]), + "10b_j-00": Room("10b", "10b_j-00", "Farewell - Room j-00", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-00"], [door for _, door in all_doors.items() if door.room_name == "10b_j-00"], "Reconciliation", "10b_j-00_west"), + "10b_j-00b": Room("10b", "10b_j-00b", "Farewell - Room j-00b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-00b"], [door for _, door in all_doors.items() if door.room_name == "10b_j-00b"]), + "10b_j-01": Room("10b", "10b_j-01", "Farewell - Room j-01", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-01"], [door for _, door in all_doors.items() if door.room_name == "10b_j-01"]), + "10b_j-02": Room("10b", "10b_j-02", "Farewell - Room j-02", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-02"], [door for _, door in all_doors.items() if door.room_name == "10b_j-02"]), + "10b_j-03": Room("10b", "10b_j-03", "Farewell - Room j-03", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-03"], [door for _, door in all_doors.items() if door.room_name == "10b_j-03"]), + "10b_j-04": Room("10b", "10b_j-04", "Farewell - Room j-04", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-04"], [door for _, door in all_doors.items() if door.room_name == "10b_j-04"]), + "10b_j-05": Room("10b", "10b_j-05", "Farewell - Room j-05", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-05"], [door for _, door in all_doors.items() if door.room_name == "10b_j-05"]), + "10b_j-06": Room("10b", "10b_j-06", "Farewell - Room j-06", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-06"], [door for _, door in all_doors.items() if door.room_name == "10b_j-06"]), + "10b_j-07": Room("10b", "10b_j-07", "Farewell - Room j-07", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-07"], [door for _, door in all_doors.items() if door.room_name == "10b_j-07"]), + "10b_j-08": Room("10b", "10b_j-08", "Farewell - Room j-08", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-08"], [door for _, door in all_doors.items() if door.room_name == "10b_j-08"]), + "10b_j-09": Room("10b", "10b_j-09", "Farewell - Room j-09", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-09"], [door for _, door in all_doors.items() if door.room_name == "10b_j-09"]), + "10b_j-10": Room("10b", "10b_j-10", "Farewell - Room j-10", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-10"], [door for _, door in all_doors.items() if door.room_name == "10b_j-10"]), + "10b_j-11": Room("10b", "10b_j-11", "Farewell - Room j-11", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-11"], [door for _, door in all_doors.items() if door.room_name == "10b_j-11"]), + "10b_j-12": Room("10b", "10b_j-12", "Farewell - Room j-12", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-12"], [door for _, door in all_doors.items() if door.room_name == "10b_j-12"]), + "10b_j-13": Room("10b", "10b_j-13", "Farewell - Room j-13", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-13"], [door for _, door in all_doors.items() if door.room_name == "10b_j-13"]), + "10b_j-14": Room("10b", "10b_j-14", "Farewell - Room j-14", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-14"], [door for _, door in all_doors.items() if door.room_name == "10b_j-14"]), + "10b_j-14b": Room("10b", "10b_j-14b", "Farewell - Room j-14b", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-14b"], [door for _, door in all_doors.items() if door.room_name == "10b_j-14b"]), + "10b_j-15": Room("10b", "10b_j-15", "Farewell - Room j-15", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-15"], [door for _, door in all_doors.items() if door.room_name == "10b_j-15"]), + "10b_j-16": Room("10b", "10b_j-16", "Farewell - Room j-16", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-16"], [door for _, door in all_doors.items() if door.room_name == "10b_j-16"], "Farewell", "10b_j-16_west"), + "10b_j-17": Room("10b", "10b_j-17", "Farewell - Room j-17", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-17"], [door for _, door in all_doors.items() if door.room_name == "10b_j-17"]), + "10b_j-18": Room("10b", "10b_j-18", "Farewell - Room j-18", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-18"], [door for _, door in all_doors.items() if door.room_name == "10b_j-18"]), + "10b_j-19": Room("10b", "10b_j-19", "Farewell - Room j-19", [reg for _, reg in all_regions.items() if reg.room_name == "10b_j-19"], [door for _, door in all_doors.items() if door.room_name == "10b_j-19"]), + "10b_GOAL": Room("10b", "10b_GOAL", "Farewell - Room GOAL", [reg for _, reg in all_regions.items() if reg.room_name == "10b_GOAL"], [door for _, door in all_doors.items() if door.room_name == "10b_GOAL"]), + + "10c_end-golden": Room("10c", "10c_end-golden", "Farewell - Room end-golden", [reg for _, reg in all_regions.items() if reg.room_name == "10c_end-golden"], [door for _, door in all_doors.items() if door.room_name == "10c_end-golden"]), + +} + +all_levels: dict[str, Level] = { + "0a": Level("0a", "Prologue", [room for _, room in all_rooms.items() if room.level_name == "0a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "0a"]), + "1a": Level("1a", "Forsaken City A", [room for _, room in all_rooms.items() if room.level_name == "1a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "1a"]), + "1b": Level("1b", "Forsaken City B", [room for _, room in all_rooms.items() if room.level_name == "1b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "1b"]), + "1c": Level("1c", "Forsaken City C", [room for _, room in all_rooms.items() if room.level_name == "1c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "1c"]), + "2a": Level("2a", "Old Site A", [room for _, room in all_rooms.items() if room.level_name == "2a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "2a"]), + "2b": Level("2b", "Old Site B", [room for _, room in all_rooms.items() if room.level_name == "2b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "2b"]), + "2c": Level("2c", "Old Site C", [room for _, room in all_rooms.items() if room.level_name == "2c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "2c"]), + "3a": Level("3a", "Celestial Resort A", [room for _, room in all_rooms.items() if room.level_name == "3a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "3a"]), + "3b": Level("3b", "Celestial Resort B", [room for _, room in all_rooms.items() if room.level_name == "3b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "3b"]), + "3c": Level("3c", "Celestial Resort C", [room for _, room in all_rooms.items() if room.level_name == "3c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "3c"]), + "4a": Level("4a", "Golden Ridge A", [room for _, room in all_rooms.items() if room.level_name == "4a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "4a"]), + "4b": Level("4b", "Golden Ridge B", [room for _, room in all_rooms.items() if room.level_name == "4b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "4b"]), + "4c": Level("4c", "Golden Ridge C", [room for _, room in all_rooms.items() if room.level_name == "4c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "4c"]), + "5a": Level("5a", "Mirror Temple A", [room for _, room in all_rooms.items() if room.level_name == "5a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "5a"]), + "5b": Level("5b", "Mirror Temple B", [room for _, room in all_rooms.items() if room.level_name == "5b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "5b"]), + "5c": Level("5c", "Mirror Temple C", [room for _, room in all_rooms.items() if room.level_name == "5c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "5c"]), + "6a": Level("6a", "Reflection A", [room for _, room in all_rooms.items() if room.level_name == "6a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "6a"]), + "6b": Level("6b", "Reflection B", [room for _, room in all_rooms.items() if room.level_name == "6b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "6b"]), + "6c": Level("6c", "Reflection C", [room for _, room in all_rooms.items() if room.level_name == "6c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "6c"]), + "7a": Level("7a", "The Summit A", [room for _, room in all_rooms.items() if room.level_name == "7a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "7a"]), + "7b": Level("7b", "The Summit B", [room for _, room in all_rooms.items() if room.level_name == "7b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "7b"]), + "7c": Level("7c", "The Summit C", [room for _, room in all_rooms.items() if room.level_name == "7c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "7c"]), + "8a": Level("8a", "Epilogue", [room for _, room in all_rooms.items() if room.level_name == "8a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "8a"]), + "9a": Level("9a", "Core A", [room for _, room in all_rooms.items() if room.level_name == "9a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "9a"]), + "9b": Level("9b", "Core B", [room for _, room in all_rooms.items() if room.level_name == "9b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "9b"]), + "9c": Level("9c", "Core C", [room for _, room in all_rooms.items() if room.level_name == "9c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "9c"]), + "10a": Level("10a", "Farewell", [room for _, room in all_rooms.items() if room.level_name == "10a"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "10a"]), + "10b": Level("10b", "Farewell", [room for _, room in all_rooms.items() if room.level_name == "10b"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "10b"]), + "10c": Level("10c", "Farewell", [room for _, room in all_rooms.items() if room.level_name == "10c"], [room_con for _, room_con in all_room_connections.items() if room_con.level_name == "10c"]), + +} + diff --git a/worlds/celeste_open_world/data/ParseData.py b/worlds/celeste_open_world/data/ParseData.py new file mode 100644 index 0000000000..b9f8f47267 --- /dev/null +++ b/worlds/celeste_open_world/data/ParseData.py @@ -0,0 +1,190 @@ +if __name__ == "__main__": + import json + + all_doors: list[str] = [] + all_region_connections: list[str] = [] + all_locations: list[str] = [] + all_regions: list[str] = [] + all_room_connections: list[str] = [] + all_rooms: list[str] = [] + all_levels: list[str] = [] + + + data_file = open('CelesteLevelData.json') + level_data = json.load(data_file) + data_file.close() + + # Levels + for level in level_data["levels"]: + level_str = (f" \"{level['name']}\": Level(\"{level['name']}\", " + f"\"{level['display_name']}\", " + f"[room for _, room in all_rooms.items() if room.level_name == \"{level['name']}\"], " + f"[room_con for _, room_con in all_room_connections.items() if room_con.level_name == \"{level['name']}\"])," + ) + + all_levels.append(level_str) + + # Rooms + for room in level["rooms"]: + room_full_name = f"{level['name']}_{room['name']}" + room_full_display_name = f"{level['display_name']} - Room {room['name']}" + + room_str = (f" \"{room_full_name}\": Room(\"{level['name']}\", " + f"\"{room_full_name}\", \"{room_full_display_name}\", " + f"[reg for _, reg in all_regions.items() if reg.room_name == \"{room_full_name}\"], " + f"[door for _, door in all_doors.items() if door.room_name == \"{room_full_name}\"]" + ) + + if "checkpoint" in room and room["checkpoint"] != "": + room_str += f", \"{room['checkpoint']}\", \"{room_full_name}_{room['checkpoint_region']}\"" + room_str += ")," + + all_rooms.append(room_str) + + # Regions + for region in room["regions"]: + region_full_name = f"{room_full_name}_{region['name']}" + + region_str = (f" \"{region_full_name}\": PreRegion(\"{region_full_name}\", " + f"\"{room_full_name}\", " + f"[reg_con for _, reg_con in all_region_connections.items() if reg_con.source_name == \"{region_full_name}\"], " + f"[loc for _, loc in all_locations.items() if loc.region_name == \"{region_full_name}\"])," + ) + + all_regions.append(region_str) + + # Locations + if "locations" in region: + for location in region["locations"]: + location_full_name = f"{room_full_name}_{location['name']}" + + location_display_name = location['display_name'] + if (location['type'] == "strawberry" and location_display_name != "Moon Berry") or location['type'] == "binoculars" : + location_display_name = f"Room {room['name']} {location_display_name}" + location_full_display_name = f"{level['display_name']} - {location_display_name}" + + location_str = (f" \"{location_full_name}\": LevelLocation(\"{location_full_name}\", " + f"\"{location_full_display_name}\", \"{region_full_name}\", " + f"LocationType.{location['type']}, [" + ) + + if "rule" in location: + for possible_access in location['rule']: + location_str += f"[" + for item in possible_access: + if "Key" in item or "Gem" in item: + location_str += f"\"{level['display_name']} - {item}\", " + else: + location_str += f"ItemName.{item}, " + location_str += f"], " + elif "rules" in location: + raise Exception(f"Location {location_full_name} uses 'rules' instead of 'rule") + + location_str += "])," + + all_locations.append(location_str) + + # Region Connections + for reg_con in region["connections"]: + dest_region_full_name = f"{room_full_name}_{reg_con['dest']}" + reg_con_full_name = f"{region_full_name}---{dest_region_full_name}" + + reg_con_str = f" \"{reg_con_full_name}\": RegionConnection(\"{region_full_name}\", \"{dest_region_full_name}\", [" + + for possible_access in reg_con['rule']: + reg_con_str += f"[" + for item in possible_access: + if "Key" in item or "Gem" in item: + reg_con_str += f"\"{level['display_name']} - {item}\", " + else: + reg_con_str += f"ItemName.{item}, " + reg_con_str += f"], " + + reg_con_str += "])," + + all_region_connections.append(reg_con_str) + + for door in room["doors"]: + door_full_name = f"{room_full_name}_{door['name']}" + + door_str = (f" \"{door_full_name}\": Door(\"{door_full_name}\", " + f"\"{room_full_name}\", " + f"DoorDirection.{door['direction']}, " + ) + + door_str += "True, " if door["blocked"] else "False, " + door_str += "True)," if door["closes_behind"] else "False)," + + all_doors.append(door_str) + + all_regions.append("") + all_region_connections.append("") + all_doors.append("") + + all_locations.append("") + all_rooms.append("") + + # Room Connections + for room_con in level["room_connections"]: + source_door_full_name = f"{level['name']}_{room_con['source_room']}_{room_con['source_door']}" + dest_door_full_name = f"{level['name']}_{room_con['dest_room']}_{room_con['dest_door']}" + + room_con_str = (f" \"{source_door_full_name}---{dest_door_full_name}\": RoomConnection(\"{level['name']}\", " + f"all_doors[\"{source_door_full_name}\"], " + f"all_doors[\"{dest_door_full_name}\"])," + ) + + all_room_connections.append(room_con_str) + + all_room_connections.append("") + + + all_levels.append("") + + + import sys + out_file = open("CelesteLevelData.py", "w") + sys.stdout = out_file + + print("# THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MANUALLY EDIT.") + print("") + print("from ..Levels import Level, Room, PreRegion, LevelLocation, RegionConnection, RoomConnection, Door, DoorDirection, LocationType") + print("from ..Names import ItemName") + print("") + print("all_doors: dict[str, Door] = {") + for line in all_doors: + print(line) + print("}") + print("") + print("all_region_connections: dict[str, RegionConnection] = {") + for line in all_region_connections: + print(line) + print("}") + print("") + print("all_locations: dict[str, LevelLocation] = {") + for line in all_locations: + print(line) + print("}") + print("") + print("all_regions: dict[str, PreRegion] = {") + for line in all_regions: + print(line) + print("}") + print("") + print("all_room_connections: dict[str, RoomConnection] = {") + for line in all_room_connections: + print(line) + print("}") + print("") + print("all_rooms: dict[str, Room] = {") + for line in all_rooms: + print(line) + print("}") + print("") + print("all_levels: dict[str, Level] = {") + for line in all_levels: + print(line) + print("}") + print("") + + out_file.close() diff --git a/worlds/celeste_open_world/data/__init__.py b/worlds/celeste_open_world/data/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/celeste_open_world/docs/en_Celeste (Open World).md b/worlds/celeste_open_world/docs/en_Celeste (Open World).md new file mode 100644 index 0000000000..c27c4d6480 --- /dev/null +++ b/worlds/celeste_open_world/docs/en_Celeste (Open World).md @@ -0,0 +1,98 @@ +# Celeste Open World + +## What is this game? + +**Celeste (Open World)** is a Randomizer for the original Celeste. In this acclaimed platformer created by ExOK Games, you control Madeline as she attempts to climb the titular mountain, meeting friends and obstacles along the way. +This randomizer takes an "Open World" approach. All of your active areas are open to you from the start. Progression is found in unlocking the ability to interact with various objects in the areas, such as springs, traffic blocks, feathers, and many more. One area can be selected as your "Goal Area", requiring you to clear that area before you can access the Epilogue and finish the game. Additionally, you can be required to receive a customizable amount of `Strawberry` items to access the Epilogue and optionally to access your Goal Area as well. +There are a variety of progression, location, and aesthetic options available. Please be safe on the climb. + +## Where is the options page? + +The [player options page for this game](../player-options) contains all the options you need to configure and export a config file. + +## What does randomization do to this game? + +By default, the Prologue, the A-Side levels for Chapters 1-7, and the Epilogue are included in the randomizer. Using options, B- and C-Sides can also be included, as can the Core and Farewell chapters. One level is chosen via an option to be the "Goal Area". Obtaining the required amount of Strawberry items from the multiworld and clearing this Goal Area will grant access to the Epilogue and the Credits, which is the goal of the randomizer. + +## What items get shuffled? + +The main collectable in this game is Strawberries, which you must collect to complete the game. + +16 Crystal Heart items are included as filler items (Heart Gates are disabled in this mod). Any additional space in the item pool is filled by Raspberries, which do nothing, and Traps. + +The following interactable items are included in the item pool, so long as any active level includes them: +- Springs +- Dash Refills +- Traffic Blocks +- Pink Cassette Blocks +- Blue Cassette Blocks +- Dream Blocks +- Coins +- Strawberry Seeds +- Sinking Platforms +- Moving Platforms +- Blue Clouds +- Pink Clouds +- Blue Boosters +- Red Boosters +- Move Blocks +- White Block +- Swap Blocks +- Dash Switches +- Torches +- Theo Crystal +- Feathers +- Bumpers +- Kevins +- Badeline Boosters +- Fire and Ice Balls +- Core Toggles +- Core Blocks +- Pufferfish +- Jellyfish +- Double Dash Refills +- Breaker Boxes +- Yellow Cassette Blocks +- Green Cassette Blocks +- Bird + +Additionally, the following items can optionally be included in the Item Pool: +- Keys +- Checkpoints +- Summit Gems +- One Cassette per active level + +Finally, the following Traps can be optionally included in the Item Pool: +- Bald Trap +- Literature Trap +- Stun Trap +- Invisible Trap +- Fast Trap +- Slow Trap +- Ice Trap +- Reverse Trap +- Screen Flip Trap +- Laughter Trap +- Hiccup Trap +- Zoom Trap + +## What locations get shuffled? + +By default, the locations in Celeste (Open World) which can contain items are: +- Level Clears +- Strawberries +- Crystal Hearts +- Cassettes + +Additionally, the following locations can optionally be included in the Location Pool: +- Golden Strawberries +- Keys +- Checkpoints +- Summit Gems +- Cars +- Binoculars +- Rooms + +## How can I get started? + +To get started playing Celeste (Open World) in Archipelago, [go to the setup guide for this game](../../../tutorial/Celeste%20(Open%20World)/guide/en) diff --git a/worlds/celeste_open_world/docs/guide_en.md b/worlds/celeste_open_world/docs/guide_en.md new file mode 100644 index 0000000000..eb96d62762 --- /dev/null +++ b/worlds/celeste_open_world/docs/guide_en.md @@ -0,0 +1,20 @@ +# Celeste (Open World) Setup Guide + +## Required Software +- The latest version of Celeste (1.4) from any official PC game distributor +- Olympus (Celeste Mod Manager) from: [Olympus Download Page](https://everestapi.github.io/) +- The latest version of the Archipelago Open World mod for Celeste from: [GitHub Release](https://github.com/PoryGoneDev/Celeste-Archipelago-Open-World/releases) + +## Installation Procedures (Windows/Linux) + +1. Install the latest version of Celeste (v1.4) on PC +2. Install `Olympus` (mod manager/launcher) and `Everest` (mod loader) per its instructions: [Olympus Setup Instructions](https://everestapi.github.io/) +3. Place the `Archipelago_Open_World.zip` from the GitHub release into the `mods` folder in your Celeste install +4. (Recommended) From the main menu, enter `Mod Options` and set `Debug Mode` to `Everest` or `Always`. This will give you access to a rudimentary Text Client which can be toggled with the `~` key. + +## Joining a MultiWorld Game + +1. Load Everest from the Olympus Launcher with the Archipelago Open World mod enabled +2. Enter the Connection Menu via the `Connect` button on the main menu +3. Use the keyboard to enter your connection information, then press the Connect button +4. Once connected, you can use the Debug Menu (opened with `~`) as a Text Client, by typing "`!ap `" followed by what you would normally enter into a Text Client diff --git a/worlds/checksfinder/docs/setup_en.md b/worlds/checksfinder/docs/setup_en.md index e15763ab31..fc1fb51848 100644 --- a/worlds/checksfinder/docs/setup_en.md +++ b/worlds/checksfinder/docs/setup_en.md @@ -3,7 +3,8 @@ ## Required Software - ChecksFinder from - the [Github releases Page for the game](https://github.com/jonloveslegos/ChecksFinder/releases) (latest version) + the [Github releases Page for the game](https://github.com/jonloveslegos/ChecksFinder/releases) (latest version), or + from the [itch.io Page for the game](https://suncat0.itch.io/checksfinder) (including web version) ## Configuring your YAML file @@ -18,13 +19,13 @@ You can customize your options by visiting the [ChecksFinder Player Options Page ## Joining a MultiWorld Game -1. Start ChecksFinder -2. Enter the following information: - - Enter the server url (starting from `wss://` for https connection like archipelago.gg, and starting from `ws://` for http connection and local multiserver) - - Enter server port - - Enter the name of the slot you wish to connect to - - Enter the room password (optional) - - Press `Play Online` to connect -3. Start playing! - -Game options and controls are described in the readme on the github repository for the game +1. Start ChecksFinder and press `Play Online` +2. Switch to the console window/tab +3. Enter the following information: + - Server url + - Server port + - The name of the slot you wish to connect to + - The room password (optional) +4. Press `Connect` to connect +5. Switch to the game window/tab +6. Start playing! diff --git a/worlds/civ_6/Container.py b/worlds/civ_6/Container.py index 0c5340d9c2..a5790c1ec4 100644 --- a/worlds/civ_6/Container.py +++ b/worlds/civ_6/Container.py @@ -1,10 +1,9 @@ from dataclasses import dataclass import os -import io from typing import TYPE_CHECKING, Dict, List, Optional, cast import zipfile from BaseClasses import Location -from worlds.Files import APContainer, AutoPatchRegister +from worlds.Files import APPlayerContainer from .Enum import CivVICheckType from .Locations import CivVILocation, CivVILocationData @@ -26,22 +25,19 @@ class CivTreeItem: ui_tree_row: int -class CivVIContainer(APContainer, metaclass=AutoPatchRegister): +class CivVIContainer(APPlayerContainer): """ Responsible for generating the dynamic mod files for the Civ VI multiworld """ game: Optional[str] = "Civilization VI" patch_file_ending = ".apcivvi" - def __init__(self, patch_data: Dict[str, str] | io.BytesIO, base_path: str = "", output_directory: str = "", + def __init__(self, patch_data: Dict[str, str], base_path: str = "", output_directory: str = "", player: Optional[int] = None, player_name: str = "", server: str = ""): - if isinstance(patch_data, io.BytesIO): - super().__init__(patch_data, player, player_name, server) - else: - self.patch_data = patch_data - self.file_path = base_path - container_path = os.path.join(output_directory, base_path + ".apcivvi") - super().__init__(container_path, player, player_name, server) + self.patch_data = patch_data + self.file_path = base_path + container_path = os.path.join(output_directory, base_path + ".apcivvi") + super().__init__(container_path, player, player_name, server) def write_contents(self, opened_zipfile: zipfile.ZipFile) -> None: for filename, yml in self.patch_data.items(): diff --git a/worlds/civ_6/data/boosts.py b/worlds/civ_6/data/boosts.py index a397720815..49cedfdfd9 100644 --- a/worlds/civ_6/data/boosts.py +++ b/worlds/civ_6/data/boosts.py @@ -78,8 +78,8 @@ boosts: List[CivVIBoostData] = [ CivVIBoostData( "BOOST_TECH_IRON_WORKING", "ERA_CLASSICAL", - ["TECH_MINING"], - 1, + ["TECH_MINING", "TECH_BRONZE_WORKING"], + 2, "DEFAULT", ), CivVIBoostData( @@ -165,15 +165,9 @@ boosts: List[CivVIBoostData] = [ "BOOST_TECH_CASTLES", "ERA_MEDIEVAL", [ - "CIVIC_DIVINE_RIGHT", - "CIVIC_EXPLORATION", - "CIVIC_REFORMED_CHURCH", "CIVIC_SUFFRAGE", "CIVIC_TOTALITARIANISM", "CIVIC_CLASS_STRUGGLE", - "CIVIC_DIGITAL_DEMOCRACY", - "CIVIC_CORPORATE_LIBERTARIANISM", - "CIVIC_SYNTHETIC_TECHNOCRACY", ], 1, "DEFAULT", @@ -393,9 +387,6 @@ boosts: List[CivVIBoostData] = [ "CIVIC_SUFFRAGE", "CIVIC_TOTALITARIANISM", "CIVIC_CLASS_STRUGGLE", - "CIVIC_DIGITAL_DEMOCRACY", - "CIVIC_CORPORATE_LIBERTARIANISM", - "CIVIC_SYNTHETIC_TECHNOCRACY", ], 1, "DEFAULT", diff --git a/worlds/civ_6/docs/en_Civilization VI.md b/worlds/civ_6/docs/en_Civilization VI.md index 215da00aa4..2a5f5fbd73 100644 --- a/worlds/civ_6/docs/en_Civilization VI.md +++ b/worlds/civ_6/docs/en_Civilization VI.md @@ -20,16 +20,17 @@ A short period after receiving an item, you will get a notification indicating y ## FAQs - Do I need the DLC to play this? - - Yes, you need both Rise & Fall and Gathering Storm. + - You need both expansions, Rise & Fall and Gathering Storm. You do not need the other DLCs but they fully work with this. - Does this work with Multiplayer? - It does not and, despite my best efforts, probably won't until there's a new way for external programs to be able to interact with the game. -- Does my mod that reskins Barbarians as various Pro Wrestlers work with this? - - Only one way to find out! Any mods that modify techs/civics will most likely cause issues, though. +- Does this work with other mods? + - A lot of mods seem to work without issues combined with this, but you should avoid any mods that change things in the tech or civic tree, as even if they would work it could cause issues with the logic. - "Help! I can't see any of the items that have been sent to me!" - Both trees by default will show you the researchable Archipelago locations. To view the normal tree, you can click "Toggle Archipelago Tree" in the top-left corner of the tree view. - "Oh no! I received the Machinery tech and now instead of getting an Archer next turn, I have to wait an additional 10 turns to get a Crossbowman!" - Vanilla prevents you from building units of the same class from an earlier tech level after you have researched a later variant. For example, this could be problematic if someone unlocks Crossbowmen for you right out the gate since you won't be able to make Archers (which have a much lower production cost). -Solution: You can now go in to the tech tree, click "Toggle Archipelago Tree" to view your unlocked techs, and then can click any tech you have unlocked to toggle whether it is currently active or not. + - Solution: You can now go in to the tech tree, click "Toggle Archipelago Tree" to view your unlocked techs, and then can click any tech you have unlocked to toggle whether it is currently active or not. + - If you think you should be able to make Field Cannons but seemingly can't try disabling `Telecommunications` - "How does DeathLink work? Am I going to have to start a new game every time one of my friends dies?" - Heavens no, my fellow Archipelago appreciator. When configuring your Archipelago options for Civilization on the options page, there are several choices available for you to fine tune the way you'd like to be punished for the follies of your friends. These include: Having a random unit destroyed, losing a percentage of gold or faith, or even losing a point on your era score. If you can't make up your mind, you can elect to have any of them be selected every time a death link is sent your way. In the event you lose one of your units in combat (this means captured units don't count), then you will send a death link event to the rest of your friends. @@ -39,7 +40,8 @@ Solution: You can now go in to the tech tree, click "Toggle Archipelago Tree" to 1. `TECH_WRITING` 2. `TECH_EDUCATION` 3. `TECH_CHEMISTRY` - - If you want to see the details around each item, you can review [this file](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/civ_6/data/progressive_districts.json). + - An important thing to note is that the seaport is part of progressive industrial zones, due to electricity having both an industrial zone building and the seaport. + - If you want to see the details around each item, you can review [this file](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/civ_6/data/progressive_districts.py). ## Boostsanity Boostsanity takes all of the Eureka & Inspiration events and makes them location checks. This feature is the one to change up the way Civilization is played in an AP multiworld/randomizer. What normally are mundane tasks that are passively collected now become a novel and interesting bucket list that you need to pay attention to in order to unlock items for yourself and others! @@ -56,4 +58,3 @@ Boosts have logic associated with them in order to verify you can always reach t - The unpredictable timing of boosts and unlocking them can occasionally lead to scenarios where you'll have to first encounter a locked era defeat and then load a previous save. To help reduce the frequency of this, local `PROGRESSIVE_ERA` items will never be located at a boost check. - There's too many boosts, how will I know which one's I should focus on?! - In order to give a little more focus to all the boosts rather than just arbitrarily picking them at random, items in both of the vanilla trees will now have an advisor icon on them if its associated boost contains a progression item. - diff --git a/worlds/civ_6/docs/setup_en.md b/worlds/civ_6/docs/setup_en.md index 9cf4744b65..fb8404190f 100644 --- a/worlds/civ_6/docs/setup_en.md +++ b/worlds/civ_6/docs/setup_en.md @@ -6,12 +6,14 @@ This guide is meant to help you get up and running with Civilization VI in Archi The following are required in order to play Civ VI in Archipelago: -- Windows OS (Firaxis does not support the necessary tooling for Mac, or Linux) +- Windows OS (Firaxis does not support the necessary tooling for Mac, or Linux). -- Installed [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) v0.4.5 or higher. +- Installed [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases). - The latest version of the [Civ VI AP Mod](https://github.com/hesto2/civilization_archipelago_mod/releases/latest). +- A copy of the game `Civilization VI` including the two expansions `Rise & Fall` and `Gathering Storm` (both the Steam and Epic version should work). + ## Enabling the tuner In the main menu, navigate to the "Game Options" page. On the "Game" menu, make sure that "Tuner (disables achievements)" is enabled. @@ -20,27 +22,32 @@ In the main menu, navigate to the "Game Options" page. On the "Game" menu, make 1. Download and unzip the latest release of the mod from [GitHub](https://github.com/hesto2/civilization_archipelago_mod/releases/latest). -2. Copy the folder containing the mod files to your Civ VI mods folder. On Windows, this is usually located at `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods`. If you use OneDrive, check if the folder is instead located in your OneDrive file structure. +2. Copy the folder containing the mod files to your Civ VI mods folder. On Windows, this is usually located at `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods`. If you use OneDrive, check if the folder is instead located in your OneDrive file structure, and use that path when relevant in future steps. 3. After the Archipelago host generates a game, you should be given a `.apcivvi` file. Associate the file with the Archipelago Launcher and double click it. -4. Copy the contents of the new folder it generates (it will have the same name as the `.apcivvi` file) into your Civilization VI Archipelago Mod folder. If double clicking the `.apcivvi` file doesn't generate a folder, you can just rename it to a file ending with `.zip` and extract its contents to a new folder. To do this, right click the `.apcivvi` file and click "Rename", make sure it ends in `.zip`, then right click it again and select "Extract All". +4. Copy the contents of the new folder it generates (it will have the same name as the `.apcivvi` file) into your Civilization VI Archipelago Mod folder. If double clicking the `.apcivvi` file doesn't generate a folder, you can instead open it as a zip file. You can do this by either right clicking it and opening it with a program that handles zip files, or by right clicking and renaming the file extension from `apcivvi` to `zip`. -5. Your finished mod folder should look something like this: - -- Civ VI Mods Directory - - civilization_archipelago_mod - - NewItems.xml - - InitOptions.lua - - Archipelago.modinfo - - All the other mod files, etc. +5. Place the files generated from the `.apcivvi` in your archipelago mod folder (there should be five files placed there from the apcivvi file, overwrite if asked). Your mod path should look something like `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods\civilization_archipelago_mod`. ## Configuring your game -When configuring your game, make sure to start the game in the Ancient Era and leave all settings related to starting technologies and civics as the defaults. Other than that, configure difficulty, AI, etc. as you normally would. +Make sure you enable the mod in the main title under Additional Content > Mods. When configuring your game, make sure to start the game in the Ancient Era and leave all settings related to starting technologies and civics as the defaults. Other than that, configure difficulty, AI, etc. as you normally would. ## Troubleshooting +- If you have troubles with file extension related stuff, make sure Windows shows file extensions as they are turned off by default. If you don't know how to turn them on it is just a quick google search away. + - If you are getting an error: "The remote computer refused the network connection", or something else related to the client (or tuner) not being able to connect, it likely indicates the tuner is not actually enabled. One simple way to verify that it is enabled is, after completing the setup steps, go to Main Menu → Options → Look for an option named "Tuner" and verify it is set to "Enabled" -- If your game gets in a state where someone has sent you items or you have sent locations but these are not correctly sent to the multiworld, you can run `/resync` from the Civ 6 client. This may take up to a minute depending on how many items there are. +- If your game gets in a state where someone has sent you items or you have sent locations but these are not correctly sent to the multiworld, you can run `/resync` from the Civ 6 client. This may take up to a minute depending on how many items there are. This can resend certain items to you, like one time bonuses. + +- If the archipelago mod does not appear in the mod selector in the game, make sure the mod is correctly placed as a folder in the `Sid Meier's Civilization VI\Mods` folder, there should not be any loose files in there only folders. As in the path should look something like `C:\Users\YOUR_USER\Documents\My Games\Sid Meier's Civilization VI\Mods\civilization_archipelago_mod`. + +- If it still does not appear make sure you have the right folder, one way to verify you are in the right place is to find the general folder area where your Civ VI save files are located. + +- If you get an error when trying to start a game saying `Error - One or more Mods failed to load content`, make sure the files from the `.apcivvi` are placed into the `civilization_archipelago_mod` as loose files and not as a folder. + +- If you still have any errors make sure the two expansions Rise & Fall and Gathering Storm are active in the mod selector (all the official DLC works without issues but Rise & Fall and Gathering Storm are required for the mod). + +- If boostsanity is enabled and those items are not being sent out but regular techs are, make sure you placed the files from your new room in the mod folder. diff --git a/worlds/clique/Items.py b/worlds/clique/Items.py deleted file mode 100644 index 81e2540bac..0000000000 --- a/worlds/clique/Items.py +++ /dev/null @@ -1,38 +0,0 @@ -from typing import Callable, Dict, NamedTuple, Optional, TYPE_CHECKING - -from BaseClasses import Item, ItemClassification - -if TYPE_CHECKING: - from . import CliqueWorld - - -class CliqueItem(Item): - game = "Clique" - - -class CliqueItemData(NamedTuple): - code: Optional[int] = None - type: ItemClassification = ItemClassification.filler - can_create: Callable[["CliqueWorld"], bool] = lambda world: True - - -item_data_table: Dict[str, CliqueItemData] = { - "Feeling of Satisfaction": CliqueItemData( - code=69696969, - type=ItemClassification.progression, - ), - "Button Activation": CliqueItemData( - code=69696968, - type=ItemClassification.progression, - can_create=lambda world: world.options.hard_mode, - ), - "A Cool Filler Item (No Satisfaction Guaranteed)": CliqueItemData( - code=69696967, - can_create=lambda world: False # Only created from `get_filler_item_name`. - ), - "The Urge to Push": CliqueItemData( - type=ItemClassification.progression, - ), -} - -item_table = {name: data.code for name, data in item_data_table.items() if data.code is not None} diff --git a/worlds/clique/Locations.py b/worlds/clique/Locations.py deleted file mode 100644 index 900b497eb4..0000000000 --- a/worlds/clique/Locations.py +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Callable, Dict, NamedTuple, Optional, TYPE_CHECKING - -from BaseClasses import Location - -if TYPE_CHECKING: - from . import CliqueWorld - - -class CliqueLocation(Location): - game = "Clique" - - -class CliqueLocationData(NamedTuple): - region: str - address: Optional[int] = None - can_create: Callable[["CliqueWorld"], bool] = lambda world: True - locked_item: Optional[str] = None - - -location_data_table: Dict[str, CliqueLocationData] = { - "The Big Red Button": CliqueLocationData( - region="The Button Realm", - address=69696969, - ), - "The Item on the Desk": CliqueLocationData( - region="The Button Realm", - address=69696968, - can_create=lambda world: world.options.hard_mode, - ), - "In the Player's Mind": CliqueLocationData( - region="The Button Realm", - locked_item="The Urge to Push", - ), -} - -location_table = {name: data.address for name, data in location_data_table.items() if data.address is not None} -locked_locations = {name: data for name, data in location_data_table.items() if data.locked_item} diff --git a/worlds/clique/Options.py b/worlds/clique/Options.py deleted file mode 100644 index d88a128990..0000000000 --- a/worlds/clique/Options.py +++ /dev/null @@ -1,34 +0,0 @@ -from dataclasses import dataclass -from Options import Choice, Toggle, PerGameCommonOptions, StartInventoryPool - - -class HardMode(Toggle): - """Only for the most masochistically inclined... Requires button activation!""" - display_name = "Hard Mode" - - -class ButtonColor(Choice): - """Customize your button! Now available in 12 unique colors.""" - display_name = "Button Color" - option_red = 0 - option_orange = 1 - option_yellow = 2 - option_green = 3 - option_cyan = 4 - option_blue = 5 - option_magenta = 6 - option_purple = 7 - option_pink = 8 - option_brown = 9 - option_white = 10 - option_black = 11 - - -@dataclass -class CliqueOptions(PerGameCommonOptions): - color: ButtonColor - hard_mode: HardMode - start_inventory_from_pool: StartInventoryPool - - # DeathLink is always on. Always. - # death_link: DeathLink diff --git a/worlds/clique/Regions.py b/worlds/clique/Regions.py deleted file mode 100644 index 04e317067f..0000000000 --- a/worlds/clique/Regions.py +++ /dev/null @@ -1,11 +0,0 @@ -from typing import Dict, List, NamedTuple - - -class CliqueRegionData(NamedTuple): - connecting_regions: List[str] = [] - - -region_data_table: Dict[str, CliqueRegionData] = { - "Menu": CliqueRegionData(["The Button Realm"]), - "The Button Realm": CliqueRegionData(), -} diff --git a/worlds/clique/Rules.py b/worlds/clique/Rules.py deleted file mode 100644 index 63ecd4e9e1..0000000000 --- a/worlds/clique/Rules.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Callable, TYPE_CHECKING - -from BaseClasses import CollectionState - -if TYPE_CHECKING: - from . import CliqueWorld - - -def get_button_rule(world: "CliqueWorld") -> Callable[[CollectionState], bool]: - if world.options.hard_mode: - return lambda state: state.has("Button Activation", world.player) - - return lambda state: True diff --git a/worlds/clique/__init__.py b/worlds/clique/__init__.py deleted file mode 100644 index 70777c51b0..0000000000 --- a/worlds/clique/__init__.py +++ /dev/null @@ -1,102 +0,0 @@ -from typing import List, Dict, Any - -from BaseClasses import Region, Tutorial -from worlds.AutoWorld import WebWorld, World -from .Items import CliqueItem, item_data_table, item_table -from .Locations import CliqueLocation, location_data_table, location_table, locked_locations -from .Options import CliqueOptions -from .Regions import region_data_table -from .Rules import get_button_rule - - -class CliqueWebWorld(WebWorld): - theme = "partyTime" - - setup_en = Tutorial( - tutorial_name="Start Guide", - description="A guide to playing Clique.", - language="English", - file_name="guide_en.md", - link="guide/en", - authors=["Phar"] - ) - - setup_de = Tutorial( - tutorial_name="Anleitung zum Anfangen", - description="Eine Anleitung um Clique zu spielen.", - language="Deutsch", - file_name="guide_de.md", - link="guide/de", - authors=["Held_der_Zeit"] - ) - - tutorials = [setup_en, setup_de] - game_info_languages = ["en", "de"] - - -class CliqueWorld(World): - """The greatest game of all time.""" - - game = "Clique" - web = CliqueWebWorld() - options: CliqueOptions - options_dataclass = CliqueOptions - location_name_to_id = location_table - item_name_to_id = item_table - - def create_item(self, name: str) -> CliqueItem: - return CliqueItem(name, item_data_table[name].type, item_data_table[name].code, self.player) - - def create_items(self) -> None: - item_pool: List[CliqueItem] = [] - for name, item in item_data_table.items(): - if item.code and item.can_create(self): - item_pool.append(self.create_item(name)) - - self.multiworld.itempool += item_pool - - def create_regions(self) -> None: - # Create regions. - for region_name in region_data_table.keys(): - region = Region(region_name, self.player, self.multiworld) - self.multiworld.regions.append(region) - - # Create locations. - for region_name, region_data in region_data_table.items(): - region = self.get_region(region_name) - region.add_locations({ - location_name: location_data.address for location_name, location_data in location_data_table.items() - if location_data.region == region_name and location_data.can_create(self) - }, CliqueLocation) - region.add_exits(region_data_table[region_name].connecting_regions) - - # Place locked locations. - for location_name, location_data in locked_locations.items(): - # Ignore locations we never created. - if not location_data.can_create(self): - continue - - locked_item = self.create_item(location_data_table[location_name].locked_item) - self.get_location(location_name).place_locked_item(locked_item) - - # Set priority location for the Big Red Button! - self.options.priority_locations.value.add("The Big Red Button") - - def get_filler_item_name(self) -> str: - return "A Cool Filler Item (No Satisfaction Guaranteed)" - - def set_rules(self) -> None: - button_rule = get_button_rule(self) - self.get_location("The Big Red Button").access_rule = button_rule - self.get_location("In the Player's Mind").access_rule = button_rule - - # Do not allow button activations on buttons. - self.get_location("The Big Red Button").item_rule = lambda item: item.name != "Button Activation" - - # Completion condition. - self.multiworld.completion_condition[self.player] = lambda state: state.has("The Urge to Push", self.player) - - def fill_slot_data(self) -> Dict[str, Any]: - return { - "color": self.options.color.current_key - } diff --git a/worlds/clique/docs/de_Clique.md b/worlds/clique/docs/de_Clique.md deleted file mode 100644 index cde0a23cf6..0000000000 --- a/worlds/clique/docs/de_Clique.md +++ /dev/null @@ -1,18 +0,0 @@ -# Clique - -## Was ist das für ein Spiel? - -~~Clique ist ein psychologisches Überlebens-Horror Spiel, in dem der Spieler der Versuchung wiederstehen muss große~~ -~~(rote) Knöpfe zu drücken.~~ - -Clique ist ein scherzhaftes Spiel, welches für Archipelago im März 2023 entwickelt wurde, um zu zeigen, wie einfach -es sein kann eine Welt für Archipelago zu entwicklen. Das Ziel des Spiels ist es den großen (standardmäßig) roten -Knopf zu drücken. Wenn ein Spieler auf dem `hard_mode` (schwieriger Modus) spielt, muss dieser warten bis jemand -anderes in der Multiworld den Knopf aktiviert, damit er gedrückt werden kann. - -Clique kann auf den meisten modernen, HTML5-fähigen Browsern gespielt werden. - -## Wo ist die Seite für die Einstellungen? - -Die [Seite für die Spielereinstellungen dieses Spiels](../player-options) enthält alle Optionen die man benötigt um -eine YAML-Datei zu konfigurieren und zu exportieren. diff --git a/worlds/clique/docs/en_Clique.md b/worlds/clique/docs/en_Clique.md deleted file mode 100644 index e9cb164fec..0000000000 --- a/worlds/clique/docs/en_Clique.md +++ /dev/null @@ -1,16 +0,0 @@ -# Clique - -## What is this game? - -~~Clique is a psychological survival horror game where a player must survive the temptation to press red buttons.~~ - -Clique is a joke game developed for Archipelago in March 2023 to showcase how easy it can be to develop a world for -Archipelago. The objective of the game is to press the big red button. If a player is playing on `hard_mode`, they must -wait for someone else in the multiworld to "activate" their button before they can press it. - -Clique can be played on most modern HTML5-capable browsers. - -## Where is the options page? - -The [player options page for this game](../player-options) contains all the options you need to configure -and export a config file. diff --git a/worlds/clique/docs/guide_de.md b/worlds/clique/docs/guide_de.md deleted file mode 100644 index 26e08dbbdd..0000000000 --- a/worlds/clique/docs/guide_de.md +++ /dev/null @@ -1,25 +0,0 @@ -# Clique Anleitung - -Nachdem dein Seed generiert wurde, gehe auf die Website von [Clique dem Spiel](http://clique.pharware.com/) und gib -Server-Daten, deinen Slot-Namen und ein Passwort (falls vorhanden) ein. Klicke dann auf "Connect" (Verbinden). - -Wenn du auf "Einfach" spielst, kannst du unbedenklich den Knopf drücken und deine "Befriedigung" erhalten. - -Wenn du auf "Schwer" spielst, ist es sehr wahrscheinlich, dass du warten musst bevor du dein Ziel erreichen kannst. -Glücklicherweise läuft Click auf den meißten großen Browsern, die HTML5 unterstützen. Das heißt du kannst Clique auf -deinem Handy starten und produktiv sein während du wartest! - -Falls du einige Ideen brauchst was du tun kannst, während du wartest bis der Knopf aktiviert wurde, versuche -(mindestens) eins der Folgenden: - -- Dein Zimmer aufräumen. -- Die Wäsche machen. -- Etwas Essen von einem X-Belieben Fast Food Restaruant holen. -- Das tägliche Wordle machen. -- ~~Deine Seele an **Phar** verkaufen.~~ -- Deine Hausaufgaben erledigen. -- Deine Post abholen. - - -~~Solltest du auf irgendwelche Probleme in diesem Spiel stoßen, solltest du keinesfalls nicht **thephar** auf~~ -~~Discord kontaktieren. *zwinker* *zwinker*~~ diff --git a/worlds/clique/docs/guide_en.md b/worlds/clique/docs/guide_en.md deleted file mode 100644 index c3c113fe90..0000000000 --- a/worlds/clique/docs/guide_en.md +++ /dev/null @@ -1,22 +0,0 @@ -# Clique Start Guide - -After rolling your seed, go to the [Clique Game](http://clique.pharware.com/) site and enter the server details, your -slot name, and a room password if one is required. Then click "Connect". - -If you're playing on "easy mode", just click the button and receive "Satisfaction". - -If you're playing on "hard mode", you may need to wait for activation before you can complete your objective. Luckily, -Clique runs in most major browsers that support HTML5, so you can load Clique on your phone and be productive while -you wait! - -If you need some ideas for what to do while waiting for button activation, give the following a try: - -- Clean your room. -- Wash the dishes. -- Get some food from a non-descript fast food restaurant. -- Do the daily Wordle. -- ~~Sell your soul to Phar.~~ -- Do your school work. - - -~~If you run into any issues with this game, definitely do not contact **thephar** on discord. *wink* *wink*~~ diff --git a/worlds/cv64/__init__.py b/worlds/cv64/__init__.py index 1bd069a2ce..117fd44ea0 100644 --- a/worlds/cv64/__init__.py +++ b/worlds/cv64/__init__.py @@ -37,7 +37,7 @@ class CV64Web(WebWorld): tutorials = [Tutorial( "Multiworld Setup Guide", - "A guide to setting up the Archipleago Castlevania 64 randomizer on your computer and connecting it to a " + "A guide to setting up the Archipelago Castlevania 64 randomizer on your computer and connecting it to a " "multiworld.", "English", "setup_en.md", diff --git a/worlds/cv64/data/patches.py b/worlds/cv64/data/patches.py index 6ef4eafb67..4a964612f0 100644 --- a/worlds/cv64/data/patches.py +++ b/worlds/cv64/data/patches.py @@ -2893,3 +2893,18 @@ dog_bite_ice_trap_fix = [ 0x25291CB8, # ADDIU T1, T1, 0x1CB8 0x01200008 # JR T1 ] + +shimmy_speed_modifier = [ + # Increases the player's speed while shimmying as long as they are not holding down Z. If they are holding Z, it + # will be the normal speed, allowing it to still be used to set up any tricks that might require the normal speed + # (like Left Tower Skip). + 0x3C088038, # LUI T0, 0x8038 + 0x91087D7E, # LBU T0, 0x7D7E (T0) + 0x31090020, # ANDI T1, T0, 0x0020 + 0x3C0A800A, # LUI T2, 0x800A + 0x240B005A, # ADDIU T3, R0, 0x005A + 0x55200001, # BNEZL T1, [forward 0x01] + 0x240B0032, # ADDIU T3, R0, 0x0032 + 0xA14B3641, # SB T3, 0x3641 (T2) + 0x0800B7C3 # J 0x8002DF0C +] diff --git a/worlds/cv64/options.py b/worlds/cv64/options.py index 07e86347bd..62d7ec3369 100644 --- a/worlds/cv64/options.py +++ b/worlds/cv64/options.py @@ -1,6 +1,6 @@ from dataclasses import dataclass from Options import (OptionGroup, Choice, DefaultOnToggle, ItemsAccessibility, PerGameCommonOptions, Range, Toggle, - StartInventoryPool) + StartInventoryPool, DeathLink) class CharacterStages(Choice): @@ -424,6 +424,7 @@ class PantherDash(Choice): class IncreaseShimmySpeed(Toggle): """ Increases the speed at which characters shimmy left and right while hanging on ledges. + Hold Z to use the regular speed in case it's needed to do something. """ display_name = "Increase Shimmy Speed" @@ -506,12 +507,11 @@ class WindowColorA(Range): default = 8 -class DeathLink(Choice): - """ - When you die, everyone dies. Of course the reverse is true too. - Explosive: Makes received DeathLinks kill you via the Magical Nitro explosion instead of the normal death animation. - """ - display_name = "DeathLink" +class CV64DeathLink(Choice): + __doc__ = (DeathLink.__doc__ + "\n\n Explosive: Makes received death links kill you via the Magical Nitro " + + "explosion instead of the normal death animation.") + + display_name = "Death Link" option_off = 0 alias_no = 0 alias_true = 1 @@ -574,7 +574,7 @@ class CV64Options(PerGameCommonOptions): map_lighting: MapLighting fall_guard: FallGuard cinematic_experience: CinematicExperience - death_link: DeathLink + death_link: CV64DeathLink cv64_option_groups = [ @@ -583,7 +583,7 @@ cv64_option_groups = [ RenonFightCondition, VincentFightCondition, BadEndingCondition, IncreaseItemLimit, NerfHealingItems, LoadingZoneHeals, InvisibleItems, DropPreviousSubWeapon, PermanentPowerUps, IceTrapPercentage, IceTrapAppearance, DisableTimeRestrictions, SkipGondolas, SkipWaterwayBlocks, Countdown, BigToss, PantherDash, - IncreaseShimmySpeed, FallGuard, DeathLink + IncreaseShimmySpeed, FallGuard, CV64DeathLink ]), OptionGroup("cosmetics", [ WindowColorR, WindowColorG, WindowColorB, WindowColorA, BackgroundMusic, MapLighting, CinematicExperience diff --git a/worlds/cv64/rom.py b/worlds/cv64/rom.py index 1833c7812b..a40d3ab300 100644 --- a/worlds/cv64/rom.py +++ b/worlds/cv64/rom.py @@ -16,7 +16,7 @@ from .text import cv64_string_to_bytearray, cv64_text_truncate, cv64_text_wrap from .aesthetics import renon_item_dialogue, get_item_text_color from .locations import get_location_info from .options import CharacterStages, VincentFightCondition, RenonFightCondition, PostBehemothBoss, RoomOfClocksBoss, \ - BadEndingCondition, DeathLink, DraculasCondition, InvisibleItems, Countdown, PantherDash + BadEndingCondition, CV64DeathLink, DraculasCondition, InvisibleItems, Countdown, PantherDash from settings import get_settings if TYPE_CHECKING: @@ -356,7 +356,7 @@ class CV64PatchExtensions(APPatchExtension): rom_data.write_int32s(0xBFE190, patches.subweapon_surface_checker) # Make received DeathLinks blow you to smithereens instead of kill you normally. - if options["death_link"] == DeathLink.option_explosive: + if options["death_link"] == CV64DeathLink.option_explosive: rom_data.write_int32s(0xBFC0D0, patches.deathlink_nitro_edition) rom_data.write_int32(0x27A70, 0x10000008) # B [forward 0x08] rom_data.write_int32(0x27AA0, 0x0C0FFA78) # JAL 0x803FE9E0 @@ -365,7 +365,7 @@ class CV64PatchExtensions(APPatchExtension): rom_data.write_int32(0x32DBC, 0x00000000) # Set the DeathLink ROM flag if it's on at all. - if options["death_link"] != DeathLink.option_off: + if options["death_link"] != CV64DeathLink.option_off: rom_data.write_byte(0xBFBFDE, 0x01) # DeathLink counter decrementer code @@ -607,9 +607,10 @@ class CV64PatchExtensions(APPatchExtension): rom_data.write_int32(0xAA530, 0x080FF880) # J 0x803FE200 rom_data.write_int32s(0xBFE200, patches.coffin_cutscene_skipper) - # Increase shimmy speed + # Shimmy speed increase hack if options["increase_shimmy_speed"]: - rom_data.write_byte(0xA4241, 0x5A) + rom_data.write_int32(0x97EB4, 0x803FE9F0) + rom_data.write_int32s(0xBFE9F0, patches.shimmy_speed_modifier) # Disable landing fall damage if options["fall_guard"]: diff --git a/worlds/cvcotm/__init__.py b/worlds/cvcotm/__init__.py index 0f5077e709..829c73ae88 100644 --- a/worlds/cvcotm/__init__.py +++ b/worlds/cvcotm/__init__.py @@ -41,7 +41,7 @@ class CVCotMWeb(WebWorld): tutorials = [Tutorial( "Multiworld Setup Guide", - "A guide to setting up the Archipleago Castlevania: Circle of the Moon randomizer on your computer and " + "A guide to setting up the Archipelago Castlevania: Circle of the Moon randomizer on your computer and " "connecting it to a multiworld.", "English", "setup_en.md", @@ -211,7 +211,8 @@ class CVCotMWorld(World): "ignore_cleansing": self.options.ignore_cleansing.value, "skip_tutorials": self.options.skip_tutorials.value, "required_last_keys": self.required_last_keys, - "completion_goal": self.options.completion_goal.value} + "completion_goal": self.options.completion_goal.value, + "nerf_roc_wing": self.options.nerf_roc_wing.value} def get_filler_item_name(self) -> str: return self.random.choice(FILLER_ITEM_NAMES) diff --git a/worlds/cvcotm/aesthetics.py b/worlds/cvcotm/aesthetics.py index d1668b1db1..86134f8e09 100644 --- a/worlds/cvcotm/aesthetics.py +++ b/worlds/cvcotm/aesthetics.py @@ -48,11 +48,17 @@ class OtherGameAppearancesInfo(TypedDict): other_game_item_appearances: Dict[str, Dict[str, OtherGameAppearancesInfo]] = { - # NOTE: Symphony of the Night is currently an unsupported world not in main. + # NOTE: Symphony of the Night and Harmony of Dissonance are custom worlds that are not core verified. "Symphony of the Night": {"Life Vessel": {"type": 0xE4, "appearance": 0x01}, "Heart Vessel": {"type": 0xE4, "appearance": 0x00}}, + + "Castlevania - Harmony of Dissonance": {"Life Max Up": {"type": 0xE4, + "appearance": 0x01}, + "Heart Max Up": {"type": 0xE4, + "appearance": 0x00}}, + "Timespinner": {"Max HP": {"type": 0xE4, "appearance": 0x01}, "Max Aura": {"type": 0xE4, @@ -728,8 +734,8 @@ def get_start_inventory_data(world: "CVCotMWorld") -> Tuple[Dict[int, bytes], bo magic_items_array[array_offset] += 1 # Add the start inventory arrays to the offset data in bytes form. - start_inventory_data[0x680080] = bytes(magic_items_array) - start_inventory_data[0x6800A0] = bytes(cards_array) + start_inventory_data[0x690080] = bytes(magic_items_array) + start_inventory_data[0x6900A0] = bytes(cards_array) # Add the extra max HP/MP/Hearts to all classes' base stats. Doing it this way makes us less likely to hit the max # possible Max Ups. diff --git a/worlds/cvcotm/data/patches.py b/worlds/cvcotm/data/patches.py index c2a9aa791f..37fba3bd40 100644 --- a/worlds/cvcotm/data/patches.py +++ b/worlds/cvcotm/data/patches.py @@ -132,40 +132,40 @@ start_inventory_giver = [ # Magic Items 0x13, 0x48, # ldr r0, =0x202572F - 0x14, 0x49, # ldr r1, =0x8680080 + 0x14, 0x49, # ldr r1, =0x8690080 0x00, 0x22, # mov r2, #0 0x8B, 0x5C, # ldrb r3, [r1, r2] 0x83, 0x54, # strb r3, [r0, r2] 0x01, 0x32, # adds r2, #1 0x08, 0x2A, # cmp r2, #8 - 0xFA, 0xDB, # blt 0x8680006 + 0xFA, 0xDB, # blt 0x8690006 # Max Ups 0x11, 0x48, # ldr r0, =0x202572C - 0x12, 0x49, # ldr r1, =0x8680090 + 0x12, 0x49, # ldr r1, =0x8690090 0x00, 0x22, # mov r2, #0 0x8B, 0x5C, # ldrb r3, [r1, r2] 0x83, 0x54, # strb r3, [r0, r2] 0x01, 0x32, # adds r2, #1 0x03, 0x2A, # cmp r2, #3 - 0xFA, 0xDB, # blt 0x8680016 + 0xFA, 0xDB, # blt 0x8690016 # Cards 0x0F, 0x48, # ldr r0, =0x2025674 - 0x10, 0x49, # ldr r1, =0x86800A0 + 0x10, 0x49, # ldr r1, =0x86900A0 0x00, 0x22, # mov r2, #0 0x8B, 0x5C, # ldrb r3, [r1, r2] 0x83, 0x54, # strb r3, [r0, r2] 0x01, 0x32, # adds r2, #1 0x14, 0x2A, # cmp r2, #0x14 - 0xFA, 0xDB, # blt 0x8680026 + 0xFA, 0xDB, # blt 0x8690026 # Inventory Items (not currently supported) 0x0D, 0x48, # ldr r0, =0x20256ED - 0x0E, 0x49, # ldr r1, =0x86800C0 + 0x0E, 0x49, # ldr r1, =0x86900C0 0x00, 0x22, # mov r2, #0 0x8B, 0x5C, # ldrb r3, [r1, r2] 0x83, 0x54, # strb r3, [r0, r2] 0x01, 0x32, # adds r2, #1 0x36, 0x2A, # cmp r2, #36 - 0xFA, 0xDB, # blt 0x8680036 + 0xFA, 0xDB, # blt 0x8690036 # Return to the function that checks for Magician Mode. 0xBA, 0x21, # movs r1, #0xBA 0x89, 0x00, # lsls r1, r1, #2 @@ -176,13 +176,13 @@ start_inventory_giver = [ # LDR number pool 0x78, 0x7F, 0x00, 0x08, 0x2F, 0x57, 0x02, 0x02, - 0x80, 0x00, 0x68, 0x08, + 0x80, 0x00, 0x69, 0x08, 0x2C, 0x57, 0x02, 0x02, - 0x90, 0x00, 0x68, 0x08, + 0x90, 0x00, 0x69, 0x08, 0x74, 0x56, 0x02, 0x02, - 0xA0, 0x00, 0x68, 0x08, + 0xA0, 0x00, 0x69, 0x08, 0xED, 0x56, 0x02, 0x02, - 0xC0, 0x00, 0x68, 0x08, + 0xC0, 0x00, 0x69, 0x08, ] max_max_up_checker = [ diff --git a/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md b/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md index 695c5f0ff9..611a1a376e 100644 --- a/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md +++ b/worlds/cvcotm/docs/en_Castlevania - Circle of the Moon.md @@ -3,7 +3,7 @@ ## Quick Links - [Setup](/tutorial/Castlevania%20-%20Circle%20of%20the%20Moon/setup/en) - [Options Page](/games/Castlevania%20-%20Circle%20of%20the%20Moon/player-options) -- [PopTracker Pack](https://github.com/sassyvania/Circle-of-the-Moon-Rando-AP-Map-Tracker-/releases/latest) +- [PopTracker Pack](https://github.com/BowserCrusher/Circle-of-the-Moon-AP-Tracker/releases/latest) - [Repo for the original, standalone CotMR](https://github.com/calm-palm/cotm-randomizer) - [Web version of the above randomizer](https://rando.circleofthemoon.com/) - [A more in-depth guide to CotMR's nuances](https://docs.google.com/document/d/1uot4BD9XW7A--A8ecgoY8mLK_vSoQRpY5XCkzgas87c/view?usp=sharing) diff --git a/worlds/cvcotm/docs/setup_en.md b/worlds/cvcotm/docs/setup_en.md index 459e0d6afb..4c34dcb836 100644 --- a/worlds/cvcotm/docs/setup_en.md +++ b/worlds/cvcotm/docs/setup_en.md @@ -22,7 +22,7 @@ clear it. ## Optional Software -- [Castlevania: Circle of the Moon AP Tracker](https://github.com/sassyvania/Circle-of-the-Moon-Rando-AP-Map-Tracker-/releases/latest), for use with +- [Castlevania: Circle of the Moon AP Tracker](https://github.com/BowserCrusher/Circle-of-the-Moon-AP-Tracker/releases/latest), for use with [PopTracker](https://github.com/black-sliver/PopTracker/releases). ## Generating and Patching a Game @@ -64,7 +64,7 @@ perfectly safe to make progress offline; everything will re-sync when you reconn Castlevania: Circle of the Moon has a fully functional map tracker that supports auto-tracking. -1. Download [Castlevania: Circle of the Moon AP Tracker](https://github.com/sassyvania/Circle-of-the-Moon-Rando-AP-Map-Tracker-/releases/latest) and +1. Download [Castlevania: Circle of the Moon AP Tracker](https://github.com/BowserCrusher/Circle-of-the-Moon-AP-Tracker/releases/latest) and [PopTracker](https://github.com/black-sliver/PopTracker/releases). 2. Put the tracker pack into `packs/` in your PopTracker install. 3. Open PopTracker, and load the Castlevania: Circle of the Moon pack. diff --git a/worlds/cvcotm/rom.py b/worlds/cvcotm/rom.py index 6ae0b6e438..350829292b 100644 --- a/worlds/cvcotm/rom.py +++ b/worlds/cvcotm/rom.py @@ -335,8 +335,8 @@ class CVCotMPatchExtensions(APPatchExtension): rom_data.write_bytes(0x679A60, patches.kickless_roc_height_shortener) # Give the player their Start Inventory upon entering their name on a new file. - rom_data.write_bytes(0x7F70, [0x00, 0x48, 0x87, 0x46, 0x00, 0x00, 0x68, 0x08]) - rom_data.write_bytes(0x680000, patches.start_inventory_giver) + rom_data.write_bytes(0x7F70, [0x00, 0x48, 0x87, 0x46, 0x00, 0x00, 0x69, 0x08]) + rom_data.write_bytes(0x690000, patches.start_inventory_giver) # Prevent Max Ups from exceeding 255. rom_data.write_bytes(0x5E170, [0x00, 0x4A, 0x97, 0x46, 0x00, 0x00, 0x6A, 0x08]) diff --git a/worlds/dark_souls_3/Items.py b/worlds/dark_souls_3/Items.py index 044e3616f7..0980781ae8 100644 --- a/worlds/dark_souls_3/Items.py +++ b/worlds/dark_souls_3/Items.py @@ -511,7 +511,7 @@ _vanilla_items = [ DS3ItemData("Elkhorn Round Shield", 0x0133C510, DS3ItemCategory.SHIELD_INFUSIBLE), DS3ItemData("Warrior's Round Shield", 0x0133EC20, DS3ItemCategory.SHIELD_INFUSIBLE), DS3ItemData("Caduceus Round Shield", 0x01341330, DS3ItemCategory.SHIELD_INFUSIBLE), - DS3ItemData("Red and White Shield", 0x01343A40, DS3ItemCategory.SHIELD_INFUSIBLE), + DS3ItemData("Red and White Round Shield", 0x01343A40, DS3ItemCategory.SHIELD_INFUSIBLE), DS3ItemData("Blessed Red and White Shield+1", 0x01343FB9, DS3ItemCategory.SHIELD), DS3ItemData("Plank Shield", 0x01346150, DS3ItemCategory.SHIELD_INFUSIBLE), DS3ItemData("Leather Shield", 0x01348860, DS3ItemCategory.SHIELD_INFUSIBLE), diff --git a/worlds/dark_souls_3/Locations.py b/worlds/dark_souls_3/Locations.py index 7b30997581..b4e45fb577 100644 --- a/worlds/dark_souls_3/Locations.py +++ b/worlds/dark_souls_3/Locations.py @@ -732,8 +732,9 @@ location_tables: Dict[str, List[DS3LocationData]] = { missable=True), # requires projectile DS3LocationData("US: Flame Stoneplate Ring - hanging corpse by Mound-Maker transport", "Flame Stoneplate Ring"), - DS3LocationData("US: Red and White Shield - chasm, hanging corpse", "Red and White Shield", - static="02,0:53100740::", missable=True), # requires projectile + DS3LocationData("US: Red and White Round Shield - chasm, hanging corpse", + "Red and White Round Shield", static="02,0:53100740::", + missable=True), # requires projectile DS3LocationData("US: Small Leather Shield - first building, hanging corpse by entrance", "Small Leather Shield"), DS3LocationData("US: Pale Tongue - tower village, hanging corpse", "Pale Tongue"), @@ -883,7 +884,7 @@ location_tables: Dict[str, List[DS3LocationData]] = { DS3LocationData("RS: Homeward Bone - balcony by Farron Keep", "Homeward Bone x2"), DS3LocationData("RS: Titanite Shard - woods, surrounded by enemies", "Titanite Shard"), DS3LocationData("RS: Twin Dragon Greatshield - woods by Crucifixion Woods bonfire", - "Twin Dragon Greatshield"), + "Twin Dragon Greatshield", missable=True), # After Eclipse DS3LocationData("RS: Sorcerer Hood - water beneath stronghold", "Sorcerer Hood", hidden=True), # Hidden fall DS3LocationData("RS: Sorcerer Robe - water beneath stronghold", "Sorcerer Robe", @@ -1886,7 +1887,7 @@ location_tables: Dict[str, List[DS3LocationData]] = { DS3LocationData("AL: Twinkling Titanite - lizard after light cathedral #2", "Twinkling Titanite", lizard=True), DS3LocationData("AL: Aldrich's Ruby - dark cathedral, miniboss", "Aldrich's Ruby", - miniboss=True), # Deep Accursed drop + miniboss=True, missable=True), # Deep Accursed drop, missable after defeating Aldrich DS3LocationData("AL: Aldrich Faithful - water reserves, talk to McDonnel", "Aldrich Faithful", hidden=True), # Behind illusory wall diff --git a/worlds/dark_souls_3/__init__.py b/worlds/dark_souls_3/__init__.py index b9f32a8d40..a1ad2f6a70 100644 --- a/worlds/dark_souls_3/__init__.py +++ b/worlds/dark_souls_3/__init__.py @@ -75,6 +75,13 @@ class DarkSouls3World(World): """The pool of all items within this particular world. This is a subset of `self.multiworld.itempool`.""" + missable_dupe_prog_locs: Set[str] = {"PC: Storm Ruler - Siegward", + "US: Pyromancy Flame - Cornyx", + "US: Tower Key - kill Irina"} + """Locations whose vanilla item is a missable duplicate of a non-missable progression item. + If vanilla, these locations shouldn't be expected progression, so they aren't created and don't get rules. + """ + def __init__(self, multiworld: MultiWorld, player: int): super().__init__(multiworld, player) self.all_excluded_locations = set() @@ -258,10 +265,11 @@ class DarkSouls3World(World): new_location.progress_type = LocationProgressType.EXCLUDED else: # Don't allow missable duplicates of progression items to be expected progression. - if location.name in {"PC: Storm Ruler - Siegward", - "US: Pyromancy Flame - Cornyx", - "US: Tower Key - kill Irina"}: - continue + if location.name in self.missable_dupe_prog_locs: continue + + # Don't create DLC and NGP locations if those are disabled + if location.dlc and not self.options.enable_dlc: continue + if location.ngp and not self.options.enable_ngp: continue # Replace non-randomized items with events that give the default item event_item = ( @@ -273,9 +281,7 @@ class DarkSouls3World(World): self.player, location, parent = new_region, - event = True, ) - event_item.code = None new_location.place_locked_item(event_item) if location.name in excluded: excluded.remove(location.name) @@ -707,7 +713,7 @@ class DarkSouls3World(World): if self._is_location_available("US: Young White Branch - by white tree #2"): self._add_item_rule( "US: Young White Branch - by white tree #2", - lambda item: item.player == self.player and not item.data.unique + lambda item: item.player != self.player or not item.data.unique ) # Make sure the Storm Ruler is available BEFORE Yhorm the Giant @@ -1288,8 +1294,9 @@ class DarkSouls3World(World): data = location_dictionary[location] if data.dlc and not self.options.enable_dlc: continue if data.ngp and not self.options.enable_ngp: continue + # Don't add rules to missable duplicates of progression items + if location in self.missable_dupe_prog_locs and not self._is_location_available(location): continue - if not self._is_location_available(location): continue if isinstance(rule, str): assert item_dictionary[rule].classification == ItemClassification.progression rule = lambda state, item=rule: state.has(item, self.player) diff --git a/worlds/dark_souls_3/detailed_location_descriptions.py b/worlds/dark_souls_3/detailed_location_descriptions.py index 6e6cf1eb0b..5a505a0e57 100644 --- a/worlds/dark_souls_3/detailed_location_descriptions.py +++ b/worlds/dark_souls_3/detailed_location_descriptions.py @@ -22,7 +22,7 @@ if __name__ == '__main__': response = requests.get(url) if response.status_code != 200: raise Exception(f"Got {response.status_code} when downloading static randomizer locations") - annotations = yaml.load(response.text, Loader=yaml.Loader) + annotations = yaml.safe_load(response.text) static_to_archi_regions = { area['Name']: area['Archipelago'] diff --git a/worlds/dark_souls_3/docs/locations_en.md b/worlds/dark_souls_3/docs/locations_en.md index 8411b8c42a..4f0160a96d 100644 --- a/worlds/dark_souls_3/docs/locations_en.md +++ b/worlds/dark_souls_3/docs/locations_en.md @@ -2239,7 +2239,7 @@ static _Dark Souls III_ randomizer]. US: Pyromancy Flame - CornyxGiven by Cornyx in Firelink Shrine or dropped. US: Red Bug Pellet - tower village building, basementOn the floor of the building after the Fire Demon encounter US: Red Hilted Halberd - chasm cryptIn the skeleton area accessible from Grave Key or dropping down from near Eygon -US: Red and White Shield - chasm, hanging corpseOn a hanging corpse in the ravine accessible with the Grave Key or dropping down near Eygon, to the entrance of Irina's prison. Must be shot down with an arrow or projective. +US: Red and White Round Shield - chasm, hanging corpseOn a hanging corpse in the ravine accessible with the Grave Key or dropping down near Eygon, to the entrance of Irina's prison. Must be shot down with an arrow or projective. US: Reinforced Club - by white treeNear the Birch Tree where giant shoots arrows US: Repair Powder - first building, balconyOn the balcony of the first Undead Settlement building US: Rusted Coin - awning above Dilapidated BridgeOn a wooden ledge near the Dilapidated Bridge bonfire. Must be jumped to from near Cathedral Evangelist enemy diff --git a/worlds/dark_souls_3/docs/setup_en.md b/worlds/dark_souls_3/docs/setup_en.md index 4c3a6b2a7d..7edf0d54e1 100644 --- a/worlds/dark_souls_3/docs/setup_en.md +++ b/worlds/dark_souls_3/docs/setup_en.md @@ -39,16 +39,14 @@ randomized item and (optionally) enemy locations. You only need to do this once To run _Dark Souls III_ in Archipelago mode: -1. Start Steam. **Do not run in offline mode.** Running Steam in offline mode will make certain - scripted invaders fail to spawn. Instead, change the game itself to offline mode on the menu - screen. +1. Start Steam. **Do not run Steam in offline mode.** Running Steam in offline mode will make certain + scripted invaders fail to spawn. -2. Run `launchmod_darksouls3.bat`. This will start _Dark Souls III_ as well as a command prompt that +2. To prevent you from getting penalized, **make sure to set _Dark Souls III_ to offline mode in the game options.** + +3. Run `launchmod_darksouls3.bat`. This will start _Dark Souls III_ as well as a command prompt that you can use to interact with the Archipelago server. -3. Type `/connect {SERVER_IP}:{SERVER_PORT} {SLOT_NAME}` into the command prompt, with the - appropriate values filled in. For example: `/connect archipelago.gg:24242 PlayerName`. - 4. Start playing as normal. An "Archipelago connected" message will appear onscreen once you have control of your character and the connection is established. @@ -73,7 +71,7 @@ things to keep in mind: * To run the game itself, just run `launchmod_darksouls3.bat` under Proton. -[.NET Runtime]: https://dotnet.microsoft.com/en-us/download/dotnet/8.0 +[.NET Runtime]: https://dotnet.microsoft.com/en-us/download/dotnet/6.0 [WINE]: https://www.winehq.org/ ## Troubleshooting diff --git a/worlds/dkc3/Regions.py b/worlds/dkc3/Regions.py index 6e968dbe1e..c6c7dd362e 100644 --- a/worlds/dkc3/Regions.py +++ b/worlds/dkc3/Regions.py @@ -802,8 +802,10 @@ def connect_regions(world: World, level_list): for i in range(0, len(kremwood_forest_levels) - 1): connect(world, world.player, names, LocationName.kremwood_forest_region, kremwood_forest_levels[i]) - connect(world, world.player, names, LocationName.kremwood_forest_region, kremwood_forest_levels[-1], - lambda state: (state.can_reach(LocationName.riverside_race_flag, "Location", world.player))) + connection = connect(world, world.player, names, LocationName.kremwood_forest_region, kremwood_forest_levels[-1], + lambda state: (state.can_reach(LocationName.riverside_race_flag, "Location", world.player))) + world.multiworld.register_indirect_condition(world.get_location(LocationName.riverside_race_flag).parent_region, + connection) # Cotton-Top Cove Connections cotton_top_cove_levels = [ @@ -837,8 +839,11 @@ def connect_regions(world: World, level_list): connect(world, world.player, names, LocationName.mekanos_region, LocationName.sky_high_secret_region, lambda state: (state.has(ItemName.bowling_ball, world.player, 1))) else: - connect(world, world.player, names, LocationName.mekanos_region, LocationName.sky_high_secret_region, - lambda state: (state.can_reach(LocationName.bleaks_house, "Location", world.player))) + connection = connect(world, world.player, names, LocationName.mekanos_region, + LocationName.sky_high_secret_region, + lambda state: (state.can_reach(LocationName.bleaks_house, "Location", world.player))) + world.multiworld.register_indirect_condition(world.get_location(LocationName.bleaks_house).parent_region, + connection) # K3 Connections k3_levels = [ @@ -946,3 +951,4 @@ def connect(world: World, player: int, used_names: typing.Dict[str, int], source source_region.exits.append(connection) connection.connect(target_region) + return connection diff --git a/worlds/dkc3/Rom.py b/worlds/dkc3/Rom.py index fb8bc2b122..cde4d8c764 100644 --- a/worlds/dkc3/Rom.py +++ b/worlds/dkc3/Rom.py @@ -1,3 +1,4 @@ + import Utils from Utils import read_snes_rom from worlds.AutoWorld import World @@ -735,9 +736,9 @@ def get_base_rom_bytes(file_name: str = "") -> bytes: return base_rom_bytes def get_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() if not file_name: - file_name = options["dkc3_options"]["rom_file"] + from settings import get_settings + file_name = get_settings()["dkc3_options"]["rom_file"] if not os.path.exists(file_name): file_name = Utils.user_path(file_name) return file_name diff --git a/worlds/dlcquest/Items.py b/worlds/dlcquest/Items.py index 550d92419b..5496885a74 100644 --- a/worlds/dlcquest/Items.py +++ b/worlds/dlcquest/Items.py @@ -30,7 +30,6 @@ class Group(enum.Enum): Deprecated = enum.auto() - @dataclass(frozen=True) class ItemData: code_without_offset: offset @@ -98,14 +97,15 @@ def create_trap_items(world, world_options: Options.DLCQuestOptions, trap_needed return traps -def create_items(world, world_options: Options.DLCQuestOptions, locations_count: int, excluded_items: list[str], random: Random): +def create_items(world, world_options: Options.DLCQuestOptions, locations_count: int, excluded_items: list[str], + random: Random): created_items = [] if world_options.campaign == Options.Campaign.option_basic or world_options.campaign == Options.Campaign.option_both: - create_items_basic(world_options, created_items, world, excluded_items) + create_items_campaign(world_options, created_items, world, excluded_items, Group.DLCQuest, 825, 250) if (world_options.campaign == Options.Campaign.option_live_freemium_or_die or world_options.campaign == Options.Campaign.option_both): - create_items_lfod(world_options, created_items, world, excluded_items) + create_items_campaign(world_options, created_items, world, excluded_items, Group.Freemium, 889, 200) trap_items = create_trap_items(world, world_options, locations_count - len(created_items), random) created_items += trap_items @@ -113,27 +113,8 @@ def create_items(world, world_options: Options.DLCQuestOptions, locations_count: return created_items -def create_items_lfod(world_options, created_items, world, excluded_items): - for item in items_by_group[Group.Freemium]: - if item.name in excluded_items: - excluded_items.remove(item) - continue - - if item.has_any_group(Group.DLC): - created_items.append(world.create_item(item)) - if item.has_any_group(Group.Item) and world_options.item_shuffle == Options.ItemShuffle.option_shuffled: - created_items.append(world.create_item(item)) - if item.has_any_group(Group.Twice): - created_items.append(world.create_item(item)) - if world_options.coinsanity == Options.CoinSanity.option_coin: - if world_options.coinbundlequantity == -1: - create_coin_piece(created_items, world, 889, 200, Group.Freemium) - return - create_coin(world_options, created_items, world, 889, 200, Group.Freemium) - - -def create_items_basic(world_options, created_items, world, excluded_items): - for item in items_by_group[Group.DLCQuest]: +def create_items_campaign(world_options: Options.DLCQuestOptions, created_items: list[DLCQuestItem], world, excluded_items: list[str], group: Group, total_coins: int, required_coins: int): + for item in items_by_group[group]: if item.name in excluded_items: excluded_items.remove(item.name) continue @@ -146,14 +127,15 @@ def create_items_basic(world_options, created_items, world, excluded_items): created_items.append(world.create_item(item)) if world_options.coinsanity == Options.CoinSanity.option_coin: if world_options.coinbundlequantity == -1: - create_coin_piece(created_items, world, 825, 250, Group.DLCQuest) + create_coin_piece(created_items, world, total_coins, required_coins, group) return - create_coin(world_options, created_items, world, 825, 250, Group.DLCQuest) + create_coin(world_options, created_items, world, total_coins, required_coins, group) def create_coin(world_options, created_items, world, total_coins, required_coins, group): coin_bundle_required = math.ceil(required_coins / world_options.coinbundlequantity) - coin_bundle_useful = math.ceil((total_coins - coin_bundle_required * world_options.coinbundlequantity) / world_options.coinbundlequantity) + coin_bundle_useful = math.ceil( + (total_coins - coin_bundle_required * world_options.coinbundlequantity) / world_options.coinbundlequantity) for item in items_by_group[group]: if item.has_any_group(Group.Coin): for i in range(coin_bundle_required): @@ -165,7 +147,7 @@ def create_coin(world_options, created_items, world, total_coins, required_coins def create_coin_piece(created_items, world, total_coins, required_coins, group): for item in items_by_group[group]: if item.has_any_group(Group.Piece): - for i in range(required_coins*10): + for i in range(required_coins * 10): created_items.append(world.create_item(item)) for i in range((total_coins - required_coins) * 10): created_items.append(world.create_item(item, ItemClassification.useful)) diff --git a/worlds/dlcquest/Rules.py b/worlds/dlcquest/Rules.py index 3461d0633e..5dfd80165a 100644 --- a/worlds/dlcquest/Rules.py +++ b/worlds/dlcquest/Rules.py @@ -280,16 +280,19 @@ def set_boss_door_requirements_rules(player, world): set_rule(world.get_entrance("Boss Door", player), has_3_swords) -def set_lfod_self_obtained_items_rules(world_options, player, world): +def set_lfod_self_obtained_items_rules(world_options, player, multiworld): if world_options.item_shuffle != Options.ItemShuffle.option_disabled: return - set_rule(world.get_entrance("Vines", player), + world = multiworld.worlds[player] + set_rule(world.get_entrance("Vines"), lambda state: state.has("Incredibly Important Pack", player)) - set_rule(world.get_entrance("Behind Rocks", player), + set_rule(world.get_entrance("Behind Rocks"), lambda state: state.can_reach("Cut Content", 'region', player)) - set_rule(world.get_entrance("Pickaxe Hard Cave", player), + multiworld.register_indirect_condition(world.get_region("Cut Content"), world.get_entrance("Behind Rocks")) + set_rule(world.get_entrance("Pickaxe Hard Cave"), lambda state: state.can_reach("Cut Content", 'region', player) and state.has("Name Change Pack", player)) + multiworld.register_indirect_condition(world.get_region("Cut Content"), world.get_entrance("Pickaxe Hard Cave")) def set_lfod_shuffled_items_rules(world_options, player, world): diff --git a/worlds/factorio/Client.py b/worlds/factorio/Client.py index 199cb29b86..51eb487f84 100644 --- a/worlds/factorio/Client.py +++ b/worlds/factorio/Client.py @@ -59,6 +59,19 @@ class FactorioCommandProcessor(ClientCommandProcessor): def _cmd_toggle_chat(self): """Toggle sending of chat messages from players on the Factorio server to Archipelago.""" self.ctx.toggle_bridge_chat_out() + + def _cmd_rcon_reconnect(self) -> bool: + """Reconnect the RCON client if its disconnected.""" + try: + result = self.ctx.rcon_client.send_command("/help") + if result: + self.output("RCON Client already connected.") + return True + except factorio_rcon.RCONNetworkError: + self.ctx.rcon_client = factorio_rcon.RCONClient("localhost", self.ctx.rcon_port, self.ctx.rcon_password, timeout=5) + self.output("RCON Client successfully reconnected.") + return True + return False class FactorioContext(CommonContext): @@ -69,7 +82,9 @@ class FactorioContext(CommonContext): # updated by spinup server mod_version: Version = Version(0, 0, 0) - def __init__(self, server_address, password, filter_item_sends: bool, bridge_chat_out: bool): + def __init__(self, server_address, password, filter_item_sends: bool, bridge_chat_out: bool, + rcon_port: int, rcon_password: str, server_settings_path: str | None, + factorio_server_args: tuple[str, ...]): super(FactorioContext, self).__init__(server_address, password) self.send_index: int = 0 self.rcon_client = None @@ -82,6 +97,10 @@ class FactorioContext(CommonContext): self.filter_item_sends: bool = filter_item_sends self.multiplayer: bool = False # whether multiple different players have connected self.bridge_chat_out: bool = bridge_chat_out + self.rcon_port: int = rcon_port + self.rcon_password: str = rcon_password + self.server_settings_path: str = server_settings_path + self.additional_factorio_server_args = factorio_server_args @property def energylink_key(self) -> str: @@ -126,6 +145,18 @@ class FactorioContext(CommonContext): self.rcon_client.send_command(f"/ap-print [font=default-large-bold]Archipelago:[/font] " f"{text}") + @property + def server_args(self) -> tuple[str, ...]: + if self.server_settings_path: + return ( + "--rcon-port", str(self.rcon_port), + "--rcon-password", self.rcon_password, + "--server-settings", self.server_settings_path, + *self.additional_factorio_server_args) + else: + return ("--rcon-port", str(self.rcon_port), "--rcon-password", self.rcon_password, + *self.additional_factorio_server_args) + @property def energy_link_status(self) -> str: if not self.energy_link_increment: @@ -224,7 +255,13 @@ async def game_watcher(ctx: FactorioContext): if ctx.rcon_client and time.perf_counter() > next_bridge: next_bridge = time.perf_counter() + 1 ctx.awaiting_bridge = False - data = json.loads(ctx.rcon_client.send_command("/ap-sync")) + try: + data = json.loads(ctx.rcon_client.send_command("/ap-sync")) + except factorio_rcon.RCONNotConnected: + continue + except factorio_rcon.RCONNetworkError: + bridge_logger.warning("RCON Client has unexpectedly lost connection. Please issue /rcon_reconnect.") + continue if not ctx.auth: pass # auth failed, wait for new attempt elif data["slot_name"] != ctx.auth: @@ -276,9 +313,13 @@ async def game_watcher(ctx: FactorioContext): "cmd": "Set", "key": ctx.energylink_key, "operations": [{"operation": "add", "value": value}] }])) - ctx.rcon_client.send_command( - f"/ap-energylink -{value}") - logger.debug(f"EnergyLink: Sent {format_SI_prefix(value)}J") + try: + ctx.rcon_client.send_command( + f"/ap-energylink -{value}") + except factorio_rcon.RCONNetworkError: + bridge_logger.warning("RCON Client has unexpectedly lost connection. Please issue /rcon_reconnect.") + else: + logger.debug(f"EnergyLink: Sent {format_SI_prefix(value)}J") await asyncio.sleep(0.1) @@ -311,7 +352,7 @@ async def factorio_server_watcher(ctx: FactorioContext): executable, "--create", savegame_name, "--preset", "archipelago" )) factorio_process = subprocess.Popen((executable, "--start-server", savegame_name, - *(str(elem) for elem in server_args)), + *ctx.server_args), stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.DEVNULL, @@ -331,7 +372,7 @@ async def factorio_server_watcher(ctx: FactorioContext): factorio_queue.task_done() if not ctx.rcon_client and "Starting RCON interface at IP ADDR:" in msg: - ctx.rcon_client = factorio_rcon.RCONClient("localhost", rcon_port, rcon_password, + ctx.rcon_client = factorio_rcon.RCONClient("localhost", ctx.rcon_port, ctx.rcon_password, timeout=5) if not ctx.server: logger.info("Established bridge to Factorio Server. " @@ -422,7 +463,7 @@ async def factorio_spinup_server(ctx: FactorioContext) -> bool: executable, "--create", savegame_name )) factorio_process = subprocess.Popen( - (executable, "--start-server", savegame_name, *(str(elem) for elem in server_args)), + (executable, "--start-server", savegame_name, *ctx.server_args), stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.DEVNULL, @@ -451,7 +492,7 @@ async def factorio_spinup_server(ctx: FactorioContext) -> bool: "or a Factorio sharing data directories is already running. " "Server could not start up.") if not rcon_client and "Starting RCON interface at IP ADDR:" in msg: - rcon_client = factorio_rcon.RCONClient("localhost", rcon_port, rcon_password) + rcon_client = factorio_rcon.RCONClient("localhost", ctx.rcon_port, ctx.rcon_password) if ctx.mod_version == ctx.__class__.mod_version: raise Exception("No Archipelago mod was loaded. Aborting.") await get_info(ctx, rcon_client) @@ -474,9 +515,8 @@ async def factorio_spinup_server(ctx: FactorioContext) -> bool: return False -async def main(args, filter_item_sends: bool, filter_bridge_chat_out: bool): - ctx = FactorioContext(args.connect, args.password, filter_item_sends, filter_bridge_chat_out) - +async def main(make_context): + ctx = make_context() ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop") if gui_enabled: @@ -509,38 +549,42 @@ class FactorioJSONtoTextParser(JSONtoTextParser): return self._handle_text(node) -parser = get_base_parser(description="Optional arguments to FactorioClient follow. " - "Remaining arguments get passed into bound Factorio instance." - "Refer to Factorio --help for those.") -parser.add_argument('--rcon-port', default='24242', type=int, help='Port to use to communicate with Factorio') -parser.add_argument('--rcon-password', help='Password to authenticate with RCON.') -parser.add_argument('--server-settings', help='Factorio server settings configuration file.') - -args, rest = parser.parse_known_args() -rcon_port = args.rcon_port -rcon_password = args.rcon_password if args.rcon_password else ''.join( - random.choice(string.ascii_letters) for x in range(32)) factorio_server_logger = logging.getLogger("FactorioServer") settings: FactorioSettings = get_settings().factorio_options if os.path.samefile(settings.executable, sys.executable): selected_executable = settings.executable settings.executable = FactorioSettings.executable # reset to default - raise Exception(f"FactorioClient was set to run itself {selected_executable}, aborting process bomb.") + raise Exception(f"Factorio Client was set to run itself {selected_executable}, aborting process bomb.") executable = settings.executable -server_settings = args.server_settings if args.server_settings \ - else getattr(settings, "server_settings", None) -server_args = ("--rcon-port", rcon_port, "--rcon-password", rcon_password) - -def launch(): +def launch(*new_args: str): import colorama - global executable, server_settings, server_args + global executable colorama.just_fix_windows_console() + # args handling + parser = get_base_parser(description="Optional arguments to Factorio Client follow. " + "Remaining arguments get passed into bound Factorio instance." + "Refer to Factorio --help for those.") + parser.add_argument('--rcon-port', default='24242', type=int, help='Port to use to communicate with Factorio') + parser.add_argument('--rcon-password', help='Password to authenticate with RCON.') + parser.add_argument('--server-settings', help='Factorio server settings configuration file.') + + args, rest = parser.parse_known_args(args=new_args) + rcon_port = args.rcon_port + rcon_password = args.rcon_password if args.rcon_password else ''.join( + random.choice(string.ascii_letters) for _ in range(32)) + + server_settings = args.server_settings if args.server_settings \ + else getattr(settings, "server_settings", None) + if server_settings: server_settings = os.path.abspath(server_settings) + if not os.path.isfile(server_settings): + raise FileNotFoundError(f"Could not find file {server_settings} for server_settings. Aborting.") + initial_filter_item_sends = bool(settings.filter_item_sends) initial_bridge_chat_out = bool(settings.bridge_chat_out) @@ -554,14 +598,9 @@ def launch(): else: raise FileNotFoundError(f"Path {executable} is not an executable file.") - if server_settings and os.path.isfile(server_settings): - server_args = ( - "--rcon-port", rcon_port, - "--rcon-password", rcon_password, - "--server-settings", server_settings, - *rest) - else: - server_args = ("--rcon-port", rcon_port, "--rcon-password", rcon_password, *rest) - - asyncio.run(main(args, initial_filter_item_sends, initial_bridge_chat_out)) + asyncio.run(main(lambda: FactorioContext( + args.connect, args.password, + initial_filter_item_sends, initial_bridge_chat_out, + rcon_port, rcon_password, server_settings, rest + ))) colorama.deinit() diff --git a/worlds/factorio/Mod.py b/worlds/factorio/Mod.py index 8ea0b24c3d..3cc156112d 100644 --- a/worlds/factorio/Mod.py +++ b/worlds/factorio/Mod.py @@ -63,10 +63,11 @@ recipe_time_ranges = { } -class FactorioModFile(worlds.Files.APContainer): +class FactorioModFile(worlds.Files.APPlayerContainer): game = "Factorio" compression_method = zipfile.ZIP_DEFLATED # Factorio can't load LZMA archives writing_tasks: List[Callable[[], Tuple[str, Union[str, bytes]]]] + patch_file_ending = ".zip" def __init__(self, *args: Any, **kwargs: Any): super().__init__(*args, **kwargs) diff --git a/worlds/factorio/Options.py b/worlds/factorio/Options.py index 12fc90c1fd..0a789669d5 100644 --- a/worlds/factorio/Options.py +++ b/worlds/factorio/Options.py @@ -321,7 +321,7 @@ class InventorySpillTrapCount(TrapCount): class FactorioWorldGen(OptionDict): """World Generation settings. Overview of options at https://wiki.factorio.com/Map_generator, - with in-depth documentation at https://lua-api.factorio.com/latest/Concepts.html#MapGenSettings""" + with in-depth documentation at https://lua-api.factorio.com/latest/concepts/MapGenSettings.html""" display_name = "World Generation" # FIXME: do we want default be a rando-optimized default or in-game DS? value: dict[str, dict[str, typing.Any]] diff --git a/worlds/factorio/__init__.py b/worlds/factorio/__init__.py index bfa6ceb894..8dc654099b 100644 --- a/worlds/factorio/__init__.py +++ b/worlds/factorio/__init__.py @@ -22,9 +22,9 @@ from .Technologies import base_tech_table, recipe_sources, base_technology_table from .settings import FactorioSettings -def launch_client(): +def launch_client(*args: str): from .Client import launch - launch_component(launch, name="FactorioClient") + launch_component(launch, name="Factorio Client", args=args) components.append(Component("Factorio Client", func=launch_client, component_type=Type.CLIENT)) diff --git a/worlds/ff1/Client.py b/worlds/ff1/Client.py new file mode 100644 index 0000000000..a4279afd3a --- /dev/null +++ b/worlds/ff1/Client.py @@ -0,0 +1,332 @@ +import logging +from collections import deque +from typing import TYPE_CHECKING + +from NetUtils import ClientStatus + +import worlds._bizhawk as bizhawk +from worlds._bizhawk.client import BizHawkClient + +if TYPE_CHECKING: + from worlds._bizhawk.context import BizHawkClientContext + + +base_id = 7000 +logger = logging.getLogger("Client") + + +rom_name_location = 0x07FFE3 +locations_array_start = 0x200 +locations_array_length = 0x100 +items_obtained = 0x03 +gp_location_low = 0x1C +gp_location_middle = 0x1D +gp_location_high = 0x1E +weapons_arrays_starts = [0x118, 0x158, 0x198, 0x1D8] +armors_arrays_starts = [0x11C, 0x15C, 0x19C, 0x1DC] +status_a_location = 0x102 +status_b_location = 0x0FC +status_c_location = 0x0A3 + +key_items = ["Lute", "Crown", "Crystal", "Herb", "Key", "Tnt", "Adamant", "Slab", "Ruby", "Rod", + "Floater", "Chime", "Tail", "Cube", "Bottle", "Oxyale", "EarthOrb", "FireOrb", "WaterOrb", "AirOrb"] + +consumables = ["Shard", "Tent", "Cabin", "House", "Heal", "Pure", "Soft"] + +weapons = ["WoodenNunchucks", "SmallKnife", "WoodenRod", "Rapier", "IronHammer", "ShortSword", "HandAxe", "Scimitar", + "IronNunchucks", "LargeKnife", "IronStaff", "Sabre", "LongSword", "GreatAxe", "Falchon", "SilverKnife", + "SilverSword", "SilverHammer", "SilverAxe", "FlameSword", "IceSword", "DragonSword", "GiantSword", + "SunSword", "CoralSword", "WereSword", "RuneSword", "PowerRod", "LightAxe", "HealRod", "MageRod", "Defense", + "WizardRod", "Vorpal", "CatClaw", "ThorHammer", "BaneSword", "Katana", "Xcalber", "Masamune"] + +armor = ["Cloth", "WoodenArmor", "ChainArmor", "IronArmor", "SteelArmor", "SilverArmor", "FlameArmor", "IceArmor", + "OpalArmor", "DragonArmor", "Copper", "Silver", "Gold", "Opal", "WhiteShirt", "BlackShirt", "WoodenShield", + "IronShield", "SilverShield", "FlameShield", "IceShield", "OpalShield", "AegisShield", "Buckler", "ProCape", + "Cap", "WoodenHelm", "IronHelm", "SilverHelm", "OpalHelm", "HealHelm", "Ribbon", "Gloves", "CopperGauntlets", + "IronGauntlets", "SilverGauntlets", "ZeusGauntlets", "PowerGauntlets", "OpalGauntlets", "ProRing"] + +gold_items = ["Gold10", "Gold20", "Gold25", "Gold30", "Gold55", "Gold70", "Gold85", "Gold110", "Gold135", "Gold155", + "Gold160", "Gold180", "Gold240", "Gold255", "Gold260", "Gold295", "Gold300", "Gold315", "Gold330", + "Gold350", "Gold385", "Gold400", "Gold450", "Gold500", "Gold530", "Gold575", "Gold620", "Gold680", + "Gold750", "Gold795", "Gold880", "Gold1020", "Gold1250", "Gold1455", "Gold1520", "Gold1760", "Gold1975", + "Gold2000", "Gold2750", "Gold3400", "Gold4150", "Gold5000", "Gold5450", "Gold6400", "Gold6720", + "Gold7340", "Gold7690", "Gold7900", "Gold8135", "Gold9000", "Gold9300", "Gold9500", "Gold9900", + "Gold10000", "Gold12350", "Gold13000", "Gold13450", "Gold14050", "Gold14720", "Gold15000", "Gold17490", + "Gold18010", "Gold19990", "Gold20000", "Gold20010", "Gold26000", "Gold45000", "Gold65000"] + +extended_consumables = ["FullCure", "Phoenix", "Blast", "Smoke", + "Refresh", "Flare", "Black", "Guard", + "Quick", "HighPotion", "Wizard", "Cloak"] + +ext_consumables_lookup = {"FullCure": "Ext1", "Phoenix": "Ext2", "Blast": "Ext3", "Smoke": "Ext4", + "Refresh": "Ext1", "Flare": "Ext2", "Black": "Ext3", "Guard": "Ext4", + "Quick": "Ext1", "HighPotion": "Ext2", "Wizard": "Ext3", "Cloak": "Ext4"} + +ext_consumables_locations = {"Ext1": 0x3C, "Ext2": 0x3D, "Ext3": 0x3E, "Ext4": 0x3F} + + +movement_items = ["Ship", "Bridge", "Canal", "Canoe"] + +no_overworld_items = ["Sigil", "Mark"] + + +class FF1Client(BizHawkClient): + game = "Final Fantasy" + system = "NES" + + weapons_queue: deque[int] + armor_queue: deque[int] + consumable_stack_amounts: dict[str, int] | None + + def __init__(self) -> None: + self.wram = "RAM" + self.sram = "WRAM" + self.rom = "PRG ROM" + self.consumable_stack_amounts = None + self.weapons_queue = deque() + self.armor_queue = deque() + self.guard_character = 0x00 + + async def validate_rom(self, ctx: "BizHawkClientContext") -> bool: + try: + if (await bizhawk.get_memory_size(ctx.bizhawk_ctx, self.rom)) < rom_name_location + 0x0D: + return False # ROM is not large enough to be a Final Fantasy 1 ROM + # Check ROM name/patch version + rom_name = ((await bizhawk.read(ctx.bizhawk_ctx, [(rom_name_location, 0x0D, self.rom)]))[0]) + rom_name = rom_name.decode("ascii") + if rom_name != "FINAL FANTASY": + return False # Not a Final Fantasy 1 ROM + except UnicodeDecodeError: + return False # rom_name returned invalid text + except bizhawk.RequestFailedError: + return False # Not able to get a response, say no for now + + ctx.game = self.game + ctx.items_handling = 0b111 + ctx.want_slot_data = True + # Resetting these in case of switching ROMs + self.consumable_stack_amounts = None + self.weapons_queue = deque() + self.armor_queue = deque() + + return True + + async def game_watcher(self, ctx: "BizHawkClientContext") -> None: + if ctx.server is None: + return + + if ctx.slot is None: + return + try: + self.guard_character = await self.read_sram_value(ctx, status_a_location) + # If the first character's name starts with a 0 value, we're at the title screen/character creation. + # In that case, don't allow any read/writes. + # We do this by setting the guard to 1 because that's neither a valid character nor the initial value. + if self.guard_character == 0: + self.guard_character = 0x01 + + if self.consumable_stack_amounts is None: + self.consumable_stack_amounts = {} + self.consumable_stack_amounts["Shard"] = 1 + other_consumable_amounts = await self.read_rom(ctx, 0x47400, 10) + self.consumable_stack_amounts["Tent"] = other_consumable_amounts[0] + 1 + self.consumable_stack_amounts["Cabin"] = other_consumable_amounts[1] + 1 + self.consumable_stack_amounts["House"] = other_consumable_amounts[2] + 1 + self.consumable_stack_amounts["Heal"] = other_consumable_amounts[3] + 1 + self.consumable_stack_amounts["Pure"] = other_consumable_amounts[4] + 1 + self.consumable_stack_amounts["Soft"] = other_consumable_amounts[5] + 1 + self.consumable_stack_amounts["Ext1"] = other_consumable_amounts[6] + 1 + self.consumable_stack_amounts["Ext2"] = other_consumable_amounts[7] + 1 + self.consumable_stack_amounts["Ext3"] = other_consumable_amounts[8] + 1 + self.consumable_stack_amounts["Ext4"] = other_consumable_amounts[9] + 1 + + await self.location_check(ctx) + await self.received_items_check(ctx) + await self.process_weapons_queue(ctx) + await self.process_armor_queue(ctx) + + except bizhawk.RequestFailedError: + # The connector didn't respond. Exit handler and return to main loop to reconnect + pass + + async def location_check(self, ctx: "BizHawkClientContext"): + locations_data = await self.read_sram_values_guarded(ctx, locations_array_start, locations_array_length) + if locations_data is None: + return + locations_checked = [] + if len(locations_data) > 0xFE and locations_data[0xFE] & 0x02 != 0 and not ctx.finished_game: + await ctx.send_msgs([ + {"cmd": "StatusUpdate", + "status": ClientStatus.CLIENT_GOAL} + ]) + ctx.finished_game = True + for location in ctx.missing_locations: + # index will be - 0x100 or 0x200 + index = location + if location < 0x200: + # Location is a chest + index -= 0x100 + flag = 0x04 + else: + # Location is an NPC + index -= 0x200 + flag = 0x02 + if locations_data[index] & flag != 0: + locations_checked.append(location) + + found_locations = await ctx.check_locations(locations_checked) + for location in found_locations: + ctx.locations_checked.add(location) + location_name = ctx.location_names.lookup_in_game(location) + logger.info( + f'New Check: {location_name} ({len(ctx.locations_checked)}/' + f'{len(ctx.missing_locations) + len(ctx.checked_locations)})') + + + async def received_items_check(self, ctx: "BizHawkClientContext") -> None: + assert self.consumable_stack_amounts, "shouldn't call this function without reading consumable_stack_amounts" + write_list: list[tuple[int, list[int], str]] = [] + items_received_count = await self.read_sram_value_guarded(ctx, items_obtained) + if items_received_count is None: + return + if items_received_count < len(ctx.items_received): + current_item = ctx.items_received[items_received_count] + current_item_id = current_item.item + current_item_name = ctx.item_names.lookup_in_game(current_item_id, ctx.game) + if current_item_name in key_items: + location = current_item_id - 0xE0 + write_list.append((location, [1], self.sram)) + elif current_item_name in movement_items: + location = current_item_id - 0x1E0 + if current_item_name != "Canal": + write_list.append((location, [1], self.sram)) + else: + write_list.append((location, [0], self.sram)) + elif current_item_name in no_overworld_items: + if current_item_name == "Sigil": + location = 0x28 + else: + location = 0x12 + write_list.append((location, [1], self.sram)) + elif current_item_name in gold_items: + gold_amount = int(current_item_name[4:]) + current_gold_value = await self.read_sram_values_guarded(ctx, gp_location_low, 3) + if current_gold_value is None: + return + current_gold = int.from_bytes(current_gold_value, "little") + new_gold = min(gold_amount + current_gold, 999999) + lower_byte = new_gold % (2 ** 8) + middle_byte = (new_gold // (2 ** 8)) % (2 ** 8) + upper_byte = new_gold // (2 ** 16) + write_list.append((gp_location_low, [lower_byte], self.sram)) + write_list.append((gp_location_middle, [middle_byte], self.sram)) + write_list.append((gp_location_high, [upper_byte], self.sram)) + elif current_item_name in consumables: + location = current_item_id - 0xE0 + current_value = await self.read_sram_value_guarded(ctx, location) + if current_value is None: + return + amount_to_add = self.consumable_stack_amounts[current_item_name] + new_value = min(current_value + amount_to_add, 99) + write_list.append((location, [new_value], self.sram)) + elif current_item_name in extended_consumables: + ext_name = ext_consumables_lookup[current_item_name] + location = ext_consumables_locations[ext_name] + current_value = await self.read_sram_value_guarded(ctx, location) + if current_value is None: + return + amount_to_add = self.consumable_stack_amounts[ext_name] + new_value = min(current_value + amount_to_add, 99) + write_list.append((location, [new_value], self.sram)) + elif current_item_name in weapons: + self.weapons_queue.appendleft(current_item_id - 0x11B) + elif current_item_name in armor: + self.armor_queue.appendleft(current_item_id - 0x143) + write_list.append((items_obtained, [items_received_count + 1], self.sram)) + write_successful = await self.write_sram_values_guarded(ctx, write_list) + if write_successful: + await bizhawk.display_message(ctx.bizhawk_ctx, f"Received {current_item_name}") + + async def process_weapons_queue(self, ctx: "BizHawkClientContext"): + empty_slots = deque() + char1_slots = await self.read_sram_values_guarded(ctx, weapons_arrays_starts[0], 4) + char2_slots = await self.read_sram_values_guarded(ctx, weapons_arrays_starts[1], 4) + char3_slots = await self.read_sram_values_guarded(ctx, weapons_arrays_starts[2], 4) + char4_slots = await self.read_sram_values_guarded(ctx, weapons_arrays_starts[3], 4) + if char1_slots is None or char2_slots is None or char3_slots is None or char4_slots is None: + return + for i, slot in enumerate(char1_slots): + if slot == 0: + empty_slots.appendleft(weapons_arrays_starts[0] + i) + for i, slot in enumerate(char2_slots): + if slot == 0: + empty_slots.appendleft(weapons_arrays_starts[1] + i) + for i, slot in enumerate(char3_slots): + if slot == 0: + empty_slots.appendleft(weapons_arrays_starts[2] + i) + for i, slot in enumerate(char4_slots): + if slot == 0: + empty_slots.appendleft(weapons_arrays_starts[3] + i) + while len(empty_slots) > 0 and len(self.weapons_queue) > 0: + current_slot = empty_slots.pop() + current_weapon = self.weapons_queue.pop() + await self.write_sram_guarded(ctx, current_slot, current_weapon) + + async def process_armor_queue(self, ctx: "BizHawkClientContext"): + empty_slots = deque() + char1_slots = await self.read_sram_values_guarded(ctx, armors_arrays_starts[0], 4) + char2_slots = await self.read_sram_values_guarded(ctx, armors_arrays_starts[1], 4) + char3_slots = await self.read_sram_values_guarded(ctx, armors_arrays_starts[2], 4) + char4_slots = await self.read_sram_values_guarded(ctx, armors_arrays_starts[3], 4) + if char1_slots is None or char2_slots is None or char3_slots is None or char4_slots is None: + return + for i, slot in enumerate(char1_slots): + if slot == 0: + empty_slots.appendleft(armors_arrays_starts[0] + i) + for i, slot in enumerate(char2_slots): + if slot == 0: + empty_slots.appendleft(armors_arrays_starts[1] + i) + for i, slot in enumerate(char3_slots): + if slot == 0: + empty_slots.appendleft(armors_arrays_starts[2] + i) + for i, slot in enumerate(char4_slots): + if slot == 0: + empty_slots.appendleft(armors_arrays_starts[3] + i) + while len(empty_slots) > 0 and len(self.armor_queue) > 0: + current_slot = empty_slots.pop() + current_armor = self.armor_queue.pop() + await self.write_sram_guarded(ctx, current_slot, current_armor) + + + async def read_sram_value(self, ctx: "BizHawkClientContext", location: int): + value = ((await bizhawk.read(ctx.bizhawk_ctx, [(location, 1, self.sram)]))[0]) + return int.from_bytes(value, "little") + + async def read_sram_values_guarded(self, ctx: "BizHawkClientContext", location: int, size: int): + value = await bizhawk.guarded_read(ctx.bizhawk_ctx, + [(location, size, self.sram)], + [(status_a_location, [self.guard_character], self.sram)]) + if value is None: + return None + return value[0] + + async def read_sram_value_guarded(self, ctx: "BizHawkClientContext", location: int): + value = await bizhawk.guarded_read(ctx.bizhawk_ctx, + [(location, 1, self.sram)], + [(status_a_location, [self.guard_character], self.sram)]) + if value is None: + return None + return int.from_bytes(value[0], "little") + + async def read_rom(self, ctx: "BizHawkClientContext", location: int, size: int): + return (await bizhawk.read(ctx.bizhawk_ctx, [(location, size, self.rom)]))[0] + + async def write_sram_guarded(self, ctx: "BizHawkClientContext", location: int, value: int): + return await bizhawk.guarded_write(ctx.bizhawk_ctx, + [(location, [value], self.sram)], + [(status_a_location, [self.guard_character], self.sram)]) + + async def write_sram_values_guarded(self, ctx: "BizHawkClientContext", write_list): + return await bizhawk.guarded_write(ctx.bizhawk_ctx, + write_list, + [(status_a_location, [self.guard_character], self.sram)]) diff --git a/worlds/ff1/Items.py b/worlds/ff1/Items.py index 469cf6f051..5d674a17b3 100644 --- a/worlds/ff1/Items.py +++ b/worlds/ff1/Items.py @@ -1,5 +1,5 @@ import json -from pathlib import Path +import pkgutil from typing import Dict, Set, NamedTuple, List from BaseClasses import Item, ItemClassification @@ -37,15 +37,13 @@ class FF1Items: _item_table_lookup: Dict[str, ItemData] = {} def _populate_item_table_from_data(self): - base_path = Path(__file__).parent - file_path = (base_path / "data/items.json").resolve() - with open(file_path) as file: - items = json.load(file) - # Hardcode progression and categories for now - self._item_table = [ItemData(name, code, "FF1Item", ItemClassification.progression if name in - FF1_PROGRESSION_LIST else ItemClassification.useful if name in FF1_USEFUL_LIST else - ItemClassification.filler) for name, code in items.items()] - self._item_table_lookup = {item.name: item for item in self._item_table} + file = pkgutil.get_data(__name__, "data/items.json").decode("utf-8") + items = json.loads(file) + # Hardcode progression and categories for now + self._item_table = [ItemData(name, code, "FF1Item", ItemClassification.progression if name in + FF1_PROGRESSION_LIST else ItemClassification.useful if name in FF1_USEFUL_LIST else + ItemClassification.filler) for name, code in items.items()] + self._item_table_lookup = {item.name: item for item in self._item_table} def _get_item_table(self) -> List[ItemData]: if not self._item_table or not self._item_table_lookup: diff --git a/worlds/ff1/Locations.py b/worlds/ff1/Locations.py index b0353f94fb..47facad985 100644 --- a/worlds/ff1/Locations.py +++ b/worlds/ff1/Locations.py @@ -1,5 +1,5 @@ import json -from pathlib import Path +import pkgutil from typing import Dict, NamedTuple, List, Optional from BaseClasses import Region, Location, MultiWorld @@ -18,13 +18,11 @@ class FF1Locations: _location_table_lookup: Dict[str, LocationData] = {} def _populate_item_table_from_data(self): - base_path = Path(__file__).parent - file_path = (base_path / "data/locations.json").resolve() - with open(file_path) as file: - locations = json.load(file) - # Hardcode progression and categories for now - self._location_table = [LocationData(name, code) for name, code in locations.items()] - self._location_table_lookup = {item.name: item for item in self._location_table} + file = pkgutil.get_data(__name__, "data/locations.json") + locations = json.loads(file) + # Hardcode progression and categories for now + self._location_table = [LocationData(name, code) for name, code in locations.items()] + self._location_table_lookup = {item.name: item for item in self._location_table} def _get_location_table(self) -> List[LocationData]: if not self._location_table or not self._location_table_lookup: diff --git a/worlds/ff1/__init__.py b/worlds/ff1/__init__.py index 3a50475068..39df9020e5 100644 --- a/worlds/ff1/__init__.py +++ b/worlds/ff1/__init__.py @@ -7,6 +7,7 @@ from .Items import ItemData, FF1Items, FF1_STARTER_ITEMS, FF1_PROGRESSION_LIST, from .Locations import EventId, FF1Locations, generate_rule, CHAOS_TERMINATED_EVENT from .Options import FF1Options from ..AutoWorld import World, WebWorld +from .Client import FF1Client class FF1Settings(settings.Group): diff --git a/worlds/ff1/docs/en_Final Fantasy.md b/worlds/ff1/docs/en_Final Fantasy.md index 889bb46e0c..a05aef63bc 100644 --- a/worlds/ff1/docs/en_Final Fantasy.md +++ b/worlds/ff1/docs/en_Final Fantasy.md @@ -22,11 +22,6 @@ All items can appear in other players worlds, including consumables, shards, wea ## What does another world's item look like in Final Fantasy -All local and remote items appear the same. Final Fantasy will say that you received an item, then BOTH the client log and the -emulator will display what was found external to the in-game text box. +All local and remote items appear the same. Final Fantasy will say that you received an item, then the client log will +display what was found external to the in-game text box. -## Unique Local Commands -The following commands are only available when using the FF1Client for the Final Fantasy Randomizer. - -- `/nes` Shows the current status of the NES connection. -- `/toggle_msgs` Toggle displaying messages in EmuHawk diff --git a/worlds/ff1/docs/multiworld_en.md b/worlds/ff1/docs/multiworld_en.md index d3dc457f01..1f1147bb31 100644 --- a/worlds/ff1/docs/multiworld_en.md +++ b/worlds/ff1/docs/multiworld_en.md @@ -2,10 +2,10 @@ ## Required Software -- The FF1Client - - Bundled with Archipelago: [Archipelago Releases Page](https://github.com/ArchipelagoMW/Archipelago/releases) -- The BizHawk emulator. Versions 2.3.1 and higher are supported. Version 2.7 is recommended - - [BizHawk at TASVideos](https://tasvideos.org/BizHawk) +- BizHawk: [BizHawk Releases from TASVideos](https://tasvideos.org/BizHawk/ReleaseHistory) + - Detailed installation instructions for BizHawk can be found at the above link. + - Windows users must run the prerequisite installer first, which can also be found at the above link. +- The built-in BizHawk client, which can be installed [here](https://github.com/ArchipelagoMW/Archipelago/releases) - Your legally obtained Final Fantasy (USA Edition) ROM file, probably named `Final Fantasy (USA).nes`. Neither Archipelago.gg nor the Final Fantasy Randomizer Community can supply you with this. @@ -13,7 +13,7 @@ 1. Download and install the latest version of Archipelago. 1. On Windows, download Setup.Archipelago..exe and run it -2. Assign EmuHawk version 2.3.1 or higher as your default program for launching `.nes` files. +2. Assign EmuHawk as your default program for launching `.nes` files. 1. Extract your BizHawk folder to your Desktop, or somewhere you will remember. Below are optional additional steps for loading ROMs more conveniently 1. Right-click on a ROM file and select **Open with...** @@ -46,7 +46,7 @@ please refer to the [game agnostic setup guide](/tutorial/Archipelago/setup/en). Once the Archipelago server has been hosted: -1. Navigate to your Archipelago install folder and run `ArchipelagoFF1Client.exe` +1. Navigate to your Archipelago install folder and run `ArchipelagoBizhawkClient.exe` 2. Notice the `/connect command` on the server hosting page (It should look like `/connect archipelago.gg:*****` where ***** are numbers) 3. Type the connect command into the client OR add the port to the pre-populated address on the top bar (it should @@ -54,16 +54,11 @@ Once the Archipelago server has been hosted: ### Running Your Game and Connecting to the Client Program -1. Open EmuHawk 2.3.1 or higher and load your ROM OR click your ROM file if it is already associated with the +1. Open EmuHawk and load your ROM OR click your ROM file if it is already associated with the extension `*.nes` -2. Navigate to where you installed Archipelago, then to `data/lua`, and drag+drop the `connector_ff1.lua` script onto - the main EmuHawk window. - 1. You could instead open the Lua Console manually, click `Script` 〉 `Open Script`, and navigate to - `connector_ff1.lua` with the file picker. - 2. If it gives a `NLua.Exceptions.LuaScriptException: .\socket.lua:13: module 'socket.core' not found:` exception - close your emulator entirely, restart it and re-run these steps - 3. If it says `Must use a version of BizHawk 2.3.1 or higher`, double-check your BizHawk version by clicking ** - Help** -> **About** +2. Navigate to where you installed Archipelago, then to `data/lua`, and drag+drop the `connector_bizhawk_generic.lua` +script onto the main EmuHawk window. You can also instead open the Lua Console manually, click `Script` 〉 `Open Script`, +and navigate to `connector_bizhawk_generic.lua` with the file picker. ## Play the game diff --git a/worlds/generic/__init__.py b/worlds/generic/__init__.py index 29f808b202..fa53f31f7c 100644 --- a/worlds/generic/__init__.py +++ b/worlds/generic/__init__.py @@ -3,7 +3,7 @@ import logging from BaseClasses import Item, Tutorial, ItemClassification -from ..AutoWorld import World, WebWorld +from ..AutoWorld import InvalidItemError, World, WebWorld from NetUtils import SlotType @@ -47,7 +47,7 @@ class GenericWorld(World): def create_item(self, name: str) -> Item: if name == "Nothing": return Item(name, ItemClassification.filler, -1, self.player) - raise KeyError(name) + raise InvalidItemError(name) class PlandoItem(NamedTuple): diff --git a/worlds/generic/docs/advanced_settings_en.md b/worlds/generic/docs/advanced_settings_en.md index 6f0520febc..bc8754b9c6 100644 --- a/worlds/generic/docs/advanced_settings_en.md +++ b/worlds/generic/docs/advanced_settings_en.md @@ -81,7 +81,8 @@ are `description`, `name`, `game`, `requires`, and the name of the games you wan * `requires` details different requirements from the generator for the YAML to work as you expect it to. Generally this is good for detailing the version of Archipelago this YAML was prepared for. If it is rolled on an older version, options may be missing and as such it will not work as expected. If any plando is used in the file then requiring it - here to ensure it will be used is good practice. + here to ensure it will be used is good practice. Specific versions of custom worlds can also be required, ensuring + that the generator is using a compatible version. ## Game Options @@ -165,7 +166,9 @@ game: A Link to the Past: 10 Timespinner: 10 requires: - version: 0.4.1 + version: 0.6.4 + game: + A Link to the Past: 0.6.4 A Link to the Past: accessibility: minimal progression_balancing: 50 @@ -214,12 +217,13 @@ Timespinner: progression_balancing: 50 item_links: # Share part of your item pool with other players. - name: TSAll - item_pool: + item_pool: - Everything local_items: - Twin Pyramid Key - Timespinner Wheel replacement_item: null + skip_if_solo: true ``` #### This is a fully functional yaml file that will do all the following things: @@ -228,7 +232,7 @@ Timespinner: * `name` is `Example Player` and this will be used in the server console when sending and receiving items. * `game` has an equal chance of being either `A Link to the Past` or `Timespinner` with a 10/20 chance for each. This is because each game has a weight of 10 and the total of all weights is 20. -* `requires` is set to required release version 0.3.2 or higher. +* `requires` is set to require Archipelago release version 0.6.4 or higher, as well as A Link to the Past version 0.6.4. * `accessibility` for both games is set to `minimal` which will set this seed to beatable only, so some locations and items may be completely inaccessible but the seed will still be completable. * `progression_balancing` for both games is set to 50, the default value, meaning we will likely receive important items @@ -262,7 +266,7 @@ Timespinner: * For `Timespinner` all players in the `TSAll` item link group will share their entire item pool and the `Twin Pyramid Key` and `Timespinner Wheel` will be forced among the worlds of those in the group. The `null` replacement item will, instead of forcing a specific chosen item, allow the generator to randomly pick a filler item to replace the - player items. + player items. This item link will only be created if there are at least two players in the group. * `triggers` allows us to define a trigger such that if our `smallkey_shuffle` option happens to roll the `any_world` result it will also ensure that `bigkey_shuffle`, `map_shuffle`, and `compass_shuffle` are also forced to the `any_world` result. More information on triggers can be found in the @@ -288,7 +292,7 @@ world and the beginning of another world. You can also combine multiple files by ### Example ```yaml -description: Example of generating multiple worlds. World 1 of 3 +description: Example of generating multiple worlds. World 1 of 2 name: Mario game: Super Mario 64 requires: @@ -310,31 +314,6 @@ Super Mario 64: --- -description: Example of generating multiple worlds. World 2 of 3 -name: Minecraft -game: Minecraft -Minecraft: - progression_balancing: 50 - accessibility: items - advancement_goal: 40 - combat_difficulty: hard - include_hard_advancements: false - include_unreasonable_advancements: false - include_postgame_advancements: false - shuffle_structures: true - structure_compasses: true - send_defeated_mobs: true - bee_traps: 15 - egg_shards_required: 7 - egg_shards_available: 10 - required_bosses: - none: 0 - ender_dragon: 1 - wither: 0 - both: 0 - ---- - description: Example of generating multiple worlds. World 2 of 2 name: ExampleFinder game: ChecksFinder @@ -344,6 +323,6 @@ ChecksFinder: accessibility: items ``` -The above example will generate 3 worlds - one Super Mario 64, one Minecraft, and one ChecksFinder. +The above example will generate 2 worlds - one Super Mario 64 and one ChecksFinder. diff --git a/worlds/generic/docs/mac_en.md b/worlds/generic/docs/mac_en.md index 38fd3cd940..b06593f501 100644 --- a/worlds/generic/docs/mac_en.md +++ b/worlds/generic/docs/mac_en.md @@ -2,8 +2,8 @@ Archipelago does not have a compiled release on macOS. However, it is possible to run from source code on macOS. This guide expects you to have some experience with running software from the terminal. ## Prerequisite Software Here is a list of software to install and source code to download. -1. Python 3.10 "universal2" or newer from the [macOS Python downloads page](https://www.python.org/downloads/macos/). - **Python 3.13 is not supported yet.** +1. Python 3.11 "universal2" or newer from the [macOS Python downloads page](https://www.python.org/downloads/macos/). + **Python 3.14 is not supported yet.** 2. Xcode from the [macOS App Store](https://apps.apple.com/us/app/xcode/id497799835). 3. The source code from the [Archipelago releases page](https://github.com/ArchipelagoMW/Archipelago/releases). 4. The asset with darwin in the name from the [SNI Github releases page](https://github.com/alttpo/sni/releases). diff --git a/worlds/generic/docs/plando_en.md b/worlds/generic/docs/plando_en.md index 9469624762..69f59c739e 100644 --- a/worlds/generic/docs/plando_en.md +++ b/worlds/generic/docs/plando_en.md @@ -27,73 +27,176 @@ requires: plando: bosses, items, texts, connections ``` +For a basic understanding of YAML files, refer to +[YAML Formatting](/tutorial/Archipelago/advanced_settings/en#yaml-formatting) +in Advanced Settings. + ## Item Plando -Item plando allows a player to place an item in a specific location or specific locations, or place multiple items into a -list of specific locations both in their own game or in another player's game. -* The options for item plando are `from_pool`, `world`, `percentage`, `force`, `count`, and either `item` and - `location`, or `items` and `locations`. - * `from_pool` determines if the item should be taken *from* the item pool or *added* to it. This can be true or - false and defaults to true if omitted. - * `world` is the target world to place the item in. - * It gets ignored if only one world is generated. - * Can be a number, name, true, false, null, or a list. False is the default. - * If a number is used, it targets that slot or player number in the multiworld. - * If a name is used, it will target the world with that player name. - * If set to true, it will be any player's world besides your own. - * If set to false, it will target your own world. - * If set to null, it will target a random world in the multiworld. - * If a list of names is used, it will target the games with the player names specified. - * `force` determines whether the generator will fail if the item can't be placed in the location. Can be true, false, - or silent. Silent is the default. - * If set to true, the item must be placed and the generator will throw an error if it is unable to do so. - * If set to false, the generator will log a warning if the placement can't be done but will still generate. - * If set to silent and the placement fails, it will be ignored entirely. - * `percentage` is the percentage chance for the relevant block to trigger. This can be any value from 0 to 100 and - if omitted will default to 100. - * Single Placement is when you use a plando block to place a single item at a single location. - * `item` is the item you would like to place and `location` is the location to place it. - * Multi Placement uses a plando block to place multiple items in multiple locations until either list is exhausted. - * `items` defines the items to use, each with a number for the amount. Using `true` instead of a number uses however many of that item are in your item pool. - * `locations` is a list of possible locations those items can be placed in. - * Some special location group names can be specified: - * `early_locations` will add all sphere 1 locations (locations logically reachable only with your starting inventory) - * `non_early_locations` will add all locations beyond sphere 1 (locations that require finding at least one item before they become logically reachable) - * Using the multi placement method, placements are picked randomly. +Item Plando allows a player to place an item in a specific location or locations, or place multiple items into a list +of specific locations in their own game and/or in another player's game. - * `count` can be used to set the maximum number of items placed from the block. The default is 1 if using `item` and False if using `items` - * If a number is used, it will try to place this number of items. - * If set to false, it will try to place as many items from the block as it can. - * If `min` and `max` are defined, it will try to place a number of items between these two numbers at random. +To add item plando to your player yaml, you add them under the `plando_items` block. You should start with `item` if you +want to do Single Placement, or `items` if you want to do Multi Placement. A list of items can still be defined under +`item` but only one of them will be chosen at random to be used. +After you define `item/items`, you would define `location` or `locations`, depending on if you want to fill one +location or many. Note that both `location` and `locations` are optional. A list of locations can still be defined under +`location` but only one of them will be chosen at random to be used. + +You may do any combination of `item/items` and `location/locations` in a plando block, but the block only places items +in locations **until the shorter of the two lists is used up.** + +Once you are satisfied with your first block, you may continue to define ones under the same `plando_items` parent. +Each block can have several different options to tailor it the way you like. + +* The `items` section defines the items to use. Each item name can be followed by a colon and a value. + * A numerical value indicates the amount of that item. + * A `true` value uses all copies of that item that are in your item pool. + +* The `item` section defines a list of items to use, from which one will be chosen at random. Each item name can be + followed by a colon and a value. The value indicates the weight of that item being chosen. + +* The `locations` section defines possible locations those items can be placed in. Two special location groups exist: + * `early_locations` will add all sphere 1 locations (locations logically reachable only with your starting + inventory). + * `non_early_locations` will add all locations beyond sphere 1 (locations that require finding at least one item + before they become logically reachable). + +* `from_pool` determines if the item should be taken *from* the item pool or *created* from scratch. + * `false`: Create a new item with the same name (the world will determine its properties e.g. classification). + * `true`: Take the existing item, if it exists, from the item pool. If it does not exist, one will be created from + scratch. **(Default)** + +* `world` is the target world to place the item in. It gets ignored if only one world is generated. + * **A number:** Use this slot or player number in the multiworld. + * **A name:** Use the world with that player name. + * **A list of names:** Use the worlds with the player names specified. + * `true`: Locations will be in any player's world besides your own. + * `false`: Locations will be in your own world. **(Default)** + * `null`: Locations will be in a random world in the multiworld. + +* `force` determines whether the generator will fail if the plando block cannot be fulfilled. + * `true`: The generator will throw an error if it is unable to place an item. + * `false`: The generator will log a warning if it is unable to place an item, but it will still generate. + * `silent`: If the placement fails, it will be ignored entirely. **(Default)** + +* `percentage` is the percentage chance for the block to trigger. This can be any integer from 0 to 100. + **(Default: 100)** + +* `count` sets the number of items placed from the list. + * **Default: 1 if using `item` or `location`, and `false` otherwise.** + * **A number:** It will place this number of items. + * `false`: It will place as many items from the list as it can. + * **If `min` is defined,** it will place at least `min` many items (can be combined with `max`). + * **If `max` is defined,** it will place at most `max` many items (can be combined with `min`). ### Available Items and Locations -A list of all available items and locations can be found in the [website's datapackage](/datapackage). The items and locations will be in the `"item_name_to_id"` and `"location_name_to_id"` sections of the relevant game. You do not need the quotes but the name must be entered in the same as it appears on that page and is case-sensitive. +A list of all available items and locations can be found in the [website's datapackage](/datapackage). The items and +locations will be in the `"item_name_to_id"` and `"location_name_to_id"` sections of the relevant game. Names are +case-sensitive. You can also use item groups and location groups that are defined in the datapackage. -### Examples +## Item Plando Examples +```yaml + plando_items: + # Example block - Pokémon Red and Blue + - items: + Potion: 3 + locations: + - "Route 1 - Free Sample Man" + - "Mt Moon 1F - West Item" + - "Mt Moon 1F - South Item" +``` +This block will lock 3 Potion items on the Route 1 Pokémart employee and 2 Mt Moon items. Note these are all +Potions in the vanilla game. The world value has not been specified, so these locations must be in this player's own +world by default. ```yaml plando_items: - # example block 1 - Timespinner + # Example block - A Link to the Past + - items: + Progressive Sword: 4 + world: + - BobsWitness + - BobsRogueLegacy + count: + min: 1 + max: 4 +``` +This block will attempt to place a random number, between 1 and 4, of Progressive Swords into any locations within the +game slots named "BobsWitness" and "BobsRogueLegacy." + +```yaml + plando_items: + # Example block - Secret of Evermore + - items: + Levitate: 1 + Revealer: 1 + Energize: 1 + locations: + - Master Sword Pedestal + - Desert Discard + world: true + count: 2 +``` +This block will choose 2 from the Levitate, Revealer, and Energize items at random and attempt to put them into the +locations named "Master Sword Pedestal" and "Desert Discard". Because the world value is `true`, these locations +must be in other players' worlds. + +```yaml + plando_items: + # Example block - Timespinner - item: Empire Orb: 1 - Radiant Orb: 1 + Radiant Orb: 3 location: Starter Chest 1 - from_pool: true + from_pool: false world: true percentage: 50 - - # example block 2 - Ocarina of Time +``` +This block will place a single item, either the Empire Orb or Radiant Orb, on the location "Starter Chest 1". There is +a 25% chance it is Empire Orb, and 75% chance it is Radiant Orb (1 to 3 odds). The world value is `true`, so this +location must be in another player's world. Because the from_pool value is `false`, a copy of these items is added to +these locations, while the originals remain in the item pool to be shuffled. Unlike the previous examples, which will +always trigger, this block only has a 50% chance to trigger. + +```yaml + plando_items: + # Example block - Factorio + - items: + progressive-electric-energy-distribution: 2 + electric-energy-accumulators: 1 + progressive-turret: 2 + locations: + - AP-1-001 + - AP-1-002 + - AP-1-003 + - AP-1-004 + percentage: 80 + force: true + from_pool: true + world: false +``` +This block lists 5 items but only 4 locations, so it will place all but 1 of the items randomly among the locations +chosen here. This block has an 80% chance of occurring. Because force is `true`, the Generator will fail if it cannot +place one of the selected items (not including the fifth item). From_pool and World have been set to their default +values here, but they can be omitted and have the same result: items will be removed from the pool, and the locations +are in this player's own world. + +**NOTE:** Factorio's locations are dynamically generated, so the locations listed above may not exist in your game, +they are here for demonstration only. + +```yaml + plando_items: + # Example block - Ocarina of Time - items: - Kokiri Sword: 1 Biggoron Sword: 1 Bow: 1 Magic Meter: 1 Progressive Strength Upgrade: 3 Progressive Hookshot: 2 locations: - - Deku Tree Slingshot Chest - Dodongos Cavern Bomb Bag Chest - Jabu Jabus Belly Boomerang Chest - Bottom of the Well Lens of Truth Chest @@ -102,53 +205,16 @@ A list of all available items and locations can be found in the [website's datap - Water Temple Longshot Chest - Shadow Temple Hover Boots Chest - Spirit Temple Silver Gauntlets Chest - world: false - - # example block 3 - Factorio - - items: - progressive-electric-energy-distribution: 2 - electric-energy-accumulators: 1 - progressive-turret: 2 - locations: - - military - - gun-turret - - logistic-science-pack - - steel-processing - percentage: 80 - force: true - - # example block 4 - Secret of Evermore - - items: - Levitate: 1 - Revealer: 1 - Energize: 1 - locations: - - Master Sword Pedestal - - Boss Relic 1 - world: true - count: 2 - - # example block 5 - A Link to the Past - - items: - Progressive Sword: 4 - world: - - BobsSlaytheSpire - - BobsRogueLegacy - count: - min: 1 - max: 4 + from_pool: false + + - item: Kokiri Sword + location: Deku Tree Slingshot Chest + from_pool: false ``` -1. This block has a 50% chance to occur, and if it does, it will place either the Empire Orb or Radiant Orb on another -player's Starter Chest 1 and removes the chosen item from the item pool. -2. This block will always trigger and will place the player's swords, bow, magic meter, strength upgrades, and hookshots -in their own dungeon major item chests. -3. This block has an 80% chance of occurring, and when it does, it will place all but 1 of the items randomly among the -four locations chosen here. -4. This block will always trigger and will attempt to place a random 2 of Levitate, Revealer and Energize into -other players' Master Sword Pedestals or Boss Relic 1 locations. -5. This block will always trigger and will attempt to place a random number, between 1 and 4, of progressive swords -into any locations within the game slots named BobsSlaytheSpire and BobsRogueLegacy. - +The first block will place the player's Biggoron Sword, Bow, Magic Meter, strength upgrades, and hookshots in the +dungeon major item chests. Because the from_pool value is `false`, a copy of these items is added to these locations, +while the originals remain in the item pool to be shuffled. The second block will place the Kokiri Sword in the Deku +Tree Slingshot Chest, again not from the pool. ## Boss Plando @@ -194,7 +260,7 @@ relevant guide: [A Link to the Past Plando Guide](/tutorial/A%20Link%20to%20the% ## Connection Plando -This is currently only supported by a few games, including A Link to the Past, Minecraft, and Ocarina of Time. As the way that these games interact with their +This is currently only supported by a few games, including A Link to the Past and Ocarina of Time. As the way that these games interact with their connections is different, only the basics are explained here. More specific information for connection plando in A Link to the Past can be found in its [plando guide](/tutorial/A%20Link%20to%20the%20Past/plando/en#connections). @@ -207,7 +273,6 @@ its [plando guide](/tutorial/A%20Link%20to%20the%20Past/plando/en#connections). [A Link to the Past connections](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/alttp/EntranceShuffle.py#L3852) -[Minecraft connections](https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/minecraft/data/regions.json#L18****) ### Examples @@ -223,19 +288,10 @@ its [plando guide](/tutorial/A%20Link%20to%20the%20Past/plando/en#connections). - entrance: Agahnims Tower exit: Old Man Cave Exit (West) direction: exit - - # example block 2 - Minecraft - - entrance: Overworld Structure 1 - exit: Nether Fortress - direction: both - - entrance: Overworld Structure 2 - exit: Village - direction: both + ``` 1. These connections are decoupled, so going into the Lake Hylia Cave Shop will take you to the inside of Cave 45, and when you leave the interior, you will exit to the Cave 45 ledge. Going into the Cave 45 entrance will then take you to the Lake Hylia Cave Shop. Walking into the entrance for the Old Man Cave and Agahnim's Tower entrance will both take you to their locations as normal, but leaving Old Man Cave will exit at Agahnim's Tower. -2. This will force a Nether fortress and a village to be the Overworld structures for your game. Note that for the - Minecraft connection plando to work structure shuffle must be enabled. diff --git a/worlds/heretic/docs/setup_en.md b/worlds/heretic/docs/setup_en.md index 5985dbb099..5475a00f90 100644 --- a/worlds/heretic/docs/setup_en.md +++ b/worlds/heretic/docs/setup_en.md @@ -2,7 +2,7 @@ ## Required Software -- [Heretic (e.g. Steam version)](https://store.steampowered.com/app/2390/Heretic_Shadow_of_the_Serpent_Riders/) +- [Heretic (e.g. Steam version)](https://store.steampowered.com/app/3286930/Heretic__Hexen/) - [Archipelago Crispy DOOM](https://github.com/Daivuk/apdoom/releases) (Same download for DOOM 1993, DOOM II and Heretic) ## Optional Software diff --git a/worlds/hk/__init__.py b/worlds/hk/__init__.py index 4a0da109fa..317d29334b 100644 --- a/worlds/hk/__init__.py +++ b/worlds/hk/__init__.py @@ -154,7 +154,17 @@ class HKWeb(WebWorld): ["JoaoVictor-FA"] ) - tutorials = [setup_en, setup_pt_br] + setup_es = Tutorial( + setup_en.tutorial_name, + setup_en.description, + "Español", + "setup_es.md", + "setup/es", + ["GreenMarco", "Panto UwUr"] + ) + + tutorials = [setup_en, setup_pt_br, setup_es] + game_info_languages = ["en", "es"] bug_report_page = "https://github.com/Ijwu/Archipelago.HollowKnight/issues/new?assignees=&labels=bug%2C+needs+investigation&template=bug_report.md&title=" @@ -218,6 +228,11 @@ class HKWorld(World): wp = self.options.WhitePalace if wp <= WhitePalace.option_nopathofpain: exclusions.update(path_of_pain_locations) + exclusions.update(( + "Soul_Totem-Path_of_Pain", + "Lore_Tablet-Path_of_Pain_Entrance", + "Journal_Entry-Seal_of_Binding", + )) if wp <= WhitePalace.option_kingfragment: exclusions.update(white_palace_checks) if wp == WhitePalace.option_exclude: @@ -226,6 +241,9 @@ class HKWorld(World): # If charms are randomized, this will be junk-filled -- so transitions and events are not progression exclusions.update(white_palace_transitions) exclusions.update(white_palace_events) + exclusions.update(item_name_groups["PalaceJournal"]) + exclusions.update(item_name_groups["PalaceLore"]) + exclusions.update(item_name_groups["PalaceTotem"]) return exclusions def create_regions(self): diff --git a/worlds/hk/docs/es_Hollow Knight.md b/worlds/hk/docs/es_Hollow Knight.md new file mode 100644 index 0000000000..1a086086ad --- /dev/null +++ b/worlds/hk/docs/es_Hollow Knight.md @@ -0,0 +1,25 @@ +# Hollow Knight + +## ¿Dónde está la página de opciones? + +La [página de opciones de jugador para este juego](../player-options) contiene todas las opciones que necesitas para +configurar y exportar un archivo de configuración. + +## ¿Qué se randomiza en este juego? + +El randomizer cambia la ubicación de los objetos. Los objetos que se intercambian se eligen dentro de tu YAML. +Los costes de las tiendas son aleatorios. Los objetos que podrían ser aleatorios, pero no lo son, permanecerán sin +modificar en sus ubicaciones habituales. En particular, cuando los ítems con el PadreLarva y la Vidente están +parcialmente randomizados, los ítems randomizados se obtendrán de un cofre en la habitación, mientras que los ítems no +randomizados serán dados por el NPC de forma normal. + +## ¿Qué objetos de Hollow Knight pueden aparecer en los mundos de otros jugadores? + +Esto depende enteramente de tus opciones YAML. Algunos ejemplos son: amuletos, larvas, capullos de saviavida, geo, etc. + +## ¿Qué aspecto tienen los objetos de otro mundo en Hollow Knight? + +Cuando el jugador de Hollow Knight recoja un objeto de un lugar y sea un objeto para otro juego, aparecerá en la +pantalla de objetos recientes de ese jugador como un objeto enviado a otro jugador. Si el objeto es para otro jugador +de Hollow Knight entonces el sprite será el del sprite original del objeto. Si el objeto pertenece a un jugador que no +está jugando a Hollow Knight, el sprite será el logo del Archipiélago. \ No newline at end of file diff --git a/worlds/hk/docs/setup_en.md b/worlds/hk/docs/setup_en.md index 0375867d40..d49a4002e4 100644 --- a/worlds/hk/docs/setup_en.md +++ b/worlds/hk/docs/setup_en.md @@ -42,7 +42,7 @@ See the [basic multiworld setup guide](/tutorial/Archipelago/setup/en) here on t You can use the [game options page for Hollow Knight](/games/Hollow%20Knight/player-options) here on the Archipelago website to generate a YAML using a graphical interface. -### Joining an Archipelago Game in Hollow Knight +## Joining an Archipelago Game in Hollow Knight 1. Start the game after installing all necessary mods. 2. Create a **new save game.** 3. Select the **Archipelago** game mode from the mode selection screen. diff --git a/worlds/hk/docs/setup_es.md b/worlds/hk/docs/setup_es.md new file mode 100644 index 0000000000..13628c4019 --- /dev/null +++ b/worlds/hk/docs/setup_es.md @@ -0,0 +1,64 @@ +# Hollow Knight Archipelago + +## Software requerido +* Descarga y descomprime Lumafly Mod manager desde el [sitio web de Lumafly](https://themulhima.github.io/Lumafly/) +* Tener una copia legal de Hollow Knight. + * Las versiones de Steam, GOG y Xbox Game Pass son compatibles + * Las versiones de Windows, Mac y Linux (Incluyendo Steam Deck) son compatibles + +## Instalación del mod de Archipelago con Lumafly +1. Ejecuta Lumafly y asegurate de localizar la carpeta de instalación de Hollow Knight +2. Instala el mod de Archipiélago haciendo click en cualquiera de los siguientes: + * Haz clic en uno de los enlaces de abajo para permitir Lumafly para instalar los mods. Lumafly pedirá + confirmación. + * [Archipiélago y dependencias solamente](https://themulhima.github.io/Lumafly/commands/download/?mods=Archipelago) + * [Archipelago con rando essentials](https://themulhima.github.io/Lumafly/commands/download/?mods=Archipelago/Archipelago%20Map%20Mod/RecentItemsDisplay/DebugMod/RandoStats/Additional%20Timelines/CompassAlwaysOn/AdditionalMaps/) + (incluye Archipelago Map Mod, RecentItemsDisplay, DebugMod, RandoStats, AdditionalTimelines, CompassAlwaysOn, + y AdditionalMaps). + * Haz clic en el botón "Instalar" situado junto a la entrada del mod "Archipiélago". Si lo deseas, instala también + "Archipelago Map Mod" para utilizarlo como rastreador en el juego. + Si lo requieres (Y recomiendo hacerlo) busca e instala Archipelago Map Mod para usar un tracker in-game +3. Ejecuta el juego desde el apartado de inicio haciendo click en el botón Launch with Mods + +## Que hago si Lumafly no encontro la ruta de instalación de mi juego? +1. Busca el directorio manualmente + * En Xbox Game pass: + 1. Entra a la Xbox App y dirigete sobre el icono de Hollow Knight que esta a la izquierda. + 2. Haz click en los 3 puntitos y elige el apartado Administrar + 3. Dirigete al apartado Archivos Locales y haz click en Buscar + 4. Abre en Hollow Knight, luego Content y copia la ruta de archivos que esta en la barra de navegación. + * En Steam: + 1. Si instalaste Hollow Knight en algún otro disco que no sea el predeterminado, ya sabrás donde se encuentra + el juego, ve a esa carpeta, abrela y copia la ruta de archivos que se encuentra en la barra de navegación. + * En Windows, la ruta predeterminada suele ser:`C:\Program Files (x86)\Steam\steamapps\common\Hollow Knight` + * En linux/Steam Deck suele ser: ~/.local/share/Steam/steamapps/common/Hollow Knight + * En Mac suele ser: ~/Library/Application Support/Steam/steamapps/common/Hollow Knight/hollow_knight.app +2. Ejecuta Lumafly como administrador y, cuando te pregunte por la ruta de instalación, pega la ruta que copeaste + anteriormente. + +## Configuración de tu fichero YAML +### ¿Qué es un YAML y por qué necesito uno? +Un archivo YAML es la forma en la que proporcionas tus opciones de jugador a Archipelago. +Mira la [guía básica de configuración multiworld](/tutorial/Archipelago/setup/en) aquí en la web de Archipelago para +aprender más, (solo se encuentra en Inglés). + +### ¿Dónde consigo un YAML? +Puedes usar la [página de opciones de juego para Hollow Knight](/games/Hollow%20Knight/player-options) aquí en la web +de Archipelago para generar un YAML usando una interfaz gráfica. + +## Unete a una partida de Archipelago en Hollow Knight +1. Inicia el juego con los mods necesarios indicados anteriormente. +2. Crea una **nueva partida.** +3. Elige el modo **Archipelago** en la selección de modos de partida. +4. Introduce la configuración correcta para tu servidor de Archipelago. +5. Pulsa **Iniciar** para iniciar la partida. El juego se quedará con la pantalla en negro unos segundos mientras + coloca todos los objetos. +6. El juego debera comenzar y ya estaras dentro del servidor. + * Si estas esperando a que termine un contador/timer, procura presionar el boton Start cuando el contador/timer + termine. + * Otra manera es pausar el juego y esperar a que el contador/timer termine cuando ingreses a la partida. + +## Consejos y otros comandos +Mientras juegas en un multiworld, puedes interactuar con el servidor usando varios comandos listados en la +[guía de comandos](/tutorial/Archipelago/commands/en). Puedes usar el Cliente de Texto Archipelago para hacer esto, +que está incluido en la última versión del [software de Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases/latest). \ No newline at end of file diff --git a/worlds/hk/docs/setup_pt_br.md b/worlds/hk/docs/setup_pt_br.md index 511ee0d552..14e54db131 100644 --- a/worlds/hk/docs/setup_pt_br.md +++ b/worlds/hk/docs/setup_pt_br.md @@ -36,7 +36,7 @@ Olhe o [guia de configuração básica de um multiworld](/tutorial/Archipelago/s Você pode usar a [página de configurações do jogador para Hollow Knight](/games/Hollow%20Knight/player-options) aqui no site do Archipelago para gerar o YAML usando a interface gráfica. -### Entrando numa partida de Archipelago no Hollow Knight +## Entrando numa partida de Archipelago no Hollow Knight 1. Começe o jogo depois de instalar todos os mods necessários. 2. Crie um **novo jogo salvo.** 3. Selecione o modo de jogo **Archipelago** do menu de seleção. diff --git a/worlds/hylics2/Options.py b/worlds/hylics2/Options.py index db9c316a7b..51072edcbd 100644 --- a/worlds/hylics2/Options.py +++ b/worlds/hylics2/Options.py @@ -57,13 +57,8 @@ class ExtraLogic(DefaultOnToggle): class Hylics2DeathLink(DeathLink): - """ - When you die, everyone dies. The reverse is also true. - - Note that this also includes death by using the PERISH gesture. - - Can be toggled via in-game console command "/deathlink". - """ + __doc__ = (DeathLink.__doc__ + "\n\n Note that this also includes death by using the PERISH gesture." + + "\n\n Can be toggled via in-game console command \"/deathlink\".") @dataclass diff --git a/worlds/jakanddaxter/__init__.py b/worlds/jakanddaxter/__init__.py new file mode 100644 index 0000000000..9a2cb30293 --- /dev/null +++ b/worlds/jakanddaxter/__init__.py @@ -0,0 +1,512 @@ +# Python standard libraries +from collections import defaultdict +from math import ceil +from typing import Any, ClassVar, Callable, Union, cast + +# Archipelago imports +import settings +from worlds.AutoWorld import World, WebWorld +from worlds.LauncherComponents import components, Component, launch_subprocess, Type, icon_paths +from BaseClasses import (Item, + ItemClassification as ItemClass, + Tutorial, + CollectionState) +from Options import OptionGroup + +# Jak imports +from . import options +from .game_id import jak1_id, jak1_name, jak1_max +from .items import (JakAndDaxterItem, + OrbAssoc, + item_table, + cell_item_table, + scout_item_table, + special_item_table, + move_item_table, + orb_item_table, + trap_item_table) +from .levels import level_table, level_table_with_global +from .locations import (JakAndDaxterLocation, + location_table, + cell_location_table, + scout_location_table, + special_location_table, + cache_location_table, + orb_location_table) +from .regions import create_regions +from .rules import (enforce_mp_absolute_limits, + enforce_mp_friendly_limits, + enforce_sp_limits, + set_orb_trade_rule) +from .locs import (cell_locations as cells, + scout_locations as scouts, + special_locations as specials, + orb_cache_locations as caches, + orb_locations as orbs) +from .regs.region_base import JakAndDaxterRegion + + +def launch_client(): + from . import client + launch_subprocess(client.launch, name="JakAndDaxterClient") + + +components.append(Component("Jak and Daxter Client", + func=launch_client, + component_type=Type.CLIENT, + icon="precursor_orb")) + +icon_paths["precursor_orb"] = f"ap:{__name__}/icons/precursor_orb.png" + + +class JakAndDaxterSettings(settings.Group): + class RootDirectory(settings.UserFolderPath): + """Path to folder containing the ArchipelaGOAL mod executables (gk.exe and goalc.exe). + Ensure this path contains forward slashes (/) only. This setting only applies if + Auto Detect Root Directory is set to false.""" + description = "ArchipelaGOAL Root Directory" + + class AutoDetectRootDirectory(settings.Bool): + """Attempt to find the OpenGOAL installation and the mod executables (gk.exe and goalc.exe) + automatically. If set to true, the ArchipelaGOAL Root Directory setting is ignored.""" + description = "ArchipelaGOAL Auto Detect Root Directory" + + class EnforceFriendlyOptions(settings.Bool): + """Enforce friendly player options in both single and multiplayer seeds. Disabling this allows for + more disruptive and challenging options, but may impact seed generation. Use at your own risk!""" + description = "ArchipelaGOAL Enforce Friendly Options" + + root_directory: RootDirectory = RootDirectory( + "%programfiles%/OpenGOAL-Launcher/features/jak1/mods/JakMods/archipelagoal") + # Don't ever change these type hints again. + auto_detect_root_directory: Union[AutoDetectRootDirectory, bool] = True + enforce_friendly_options: Union[EnforceFriendlyOptions, bool] = True + + +class JakAndDaxterWebWorld(WebWorld): + setup_en = Tutorial( + "Multiworld Setup Guide", + "A guide to setting up ArchipelaGOAL (Archipelago on OpenGOAL).", + "English", + "setup_en.md", + "setup/en", + ["markustulliuscicero"] + ) + + tutorials = [setup_en] + bug_report_page = "https://github.com/ArchipelaGOAL/Archipelago/issues" + + option_groups = [ + OptionGroup("Orbsanity", [ + options.EnableOrbsanity, + options.GlobalOrbsanityBundleSize, + options.PerLevelOrbsanityBundleSize, + ]), + OptionGroup("Power Cell Counts", [ + options.EnableOrderedCellCounts, + options.FireCanyonCellCount, + options.MountainPassCellCount, + options.LavaTubeCellCount, + ]), + OptionGroup("Orb Trade Counts", [ + options.CitizenOrbTradeAmount, + options.OracleOrbTradeAmount, + ]), + OptionGroup("Traps", [ + options.FillerPowerCellsReplacedWithTraps, + options.FillerOrbBundlesReplacedWithTraps, + options.TrapEffectDuration, + options.TrapWeights, + ]), + ] + + +class JakAndDaxterWorld(World): + """ + Jak and Daxter: The Precursor Legacy is a 2001 action platformer developed by Naughty Dog + for the PlayStation 2. The game follows the eponymous protagonists, a young boy named Jak + and his friend Daxter, who has been transformed into an ottsel. With the help of Samos + the Sage of Green Eco and his daughter Keira, the pair travel north in search of a cure for Daxter, + discovering artifacts created by an ancient race known as the Precursors along the way. When the + rogue sages Gol and Maia Acheron plan to flood the world with Dark Eco, they must stop their evil plan + and save the world. + """ + # ID, name, version + game = jak1_name + required_client_version = (0, 5, 0) + + # Options + settings: ClassVar[JakAndDaxterSettings] + options_dataclass = options.JakAndDaxterOptions + options: options.JakAndDaxterOptions + + # Web world + web = JakAndDaxterWebWorld() + + # Stored as {ID: Name} pairs, these must now be swapped to {Name: ID} pairs. + # Remember, the game ID and various offsets for each item type have already been calculated. + item_name_to_id = {name: k for k, name in item_table.items()} + location_name_to_id = {name: k for k, name in location_table.items()} + item_name_groups = { + "Power Cells": set(cell_item_table.values()), + "Scout Flies": set(scout_item_table.values()), + "Specials": set(special_item_table.values()), + "Moves": set(move_item_table.values()), + "Precursor Orbs": set(orb_item_table.values()), + "Traps": set(trap_item_table.values()), + } + location_name_groups = { + "Power Cells": set(cell_location_table.values()), + "Power Cells - GR": set(cells.locGR_cellTable.values()), + "Power Cells - SV": set(cells.locSV_cellTable.values()), + "Power Cells - FJ": set(cells.locFJ_cellTable.values()), + "Power Cells - SB": set(cells.locSB_cellTable.values()), + "Power Cells - MI": set(cells.locMI_cellTable.values()), + "Power Cells - FC": set(cells.locFC_cellTable.values()), + "Power Cells - RV": set(cells.locRV_cellTable.values()), + "Power Cells - PB": set(cells.locPB_cellTable.values()), + "Power Cells - LPC": set(cells.locLPC_cellTable.values()), + "Power Cells - BS": set(cells.locBS_cellTable.values()), + "Power Cells - MP": set(cells.locMP_cellTable.values()), + "Power Cells - VC": set(cells.locVC_cellTable.values()), + "Power Cells - SC": set(cells.locSC_cellTable.values()), + "Power Cells - SM": set(cells.locSM_cellTable.values()), + "Power Cells - LT": set(cells.locLT_cellTable.values()), + "Power Cells - GMC": set(cells.locGMC_cellTable.values()), + "Scout Flies": set(scout_location_table.values()), + "Scout Flies - GR": set(scouts.locGR_scoutTable.values()), + "Scout Flies - SV": set(scouts.locSV_scoutTable.values()), + "Scout Flies - FJ": set(scouts.locFJ_scoutTable.values()), + "Scout Flies - SB": set(scouts.locSB_scoutTable.values()), + "Scout Flies - MI": set(scouts.locMI_scoutTable.values()), + "Scout Flies - FC": set(scouts.locFC_scoutTable.values()), + "Scout Flies - RV": set(scouts.locRV_scoutTable.values()), + "Scout Flies - PB": set(scouts.locPB_scoutTable.values()), + "Scout Flies - LPC": set(scouts.locLPC_scoutTable.values()), + "Scout Flies - BS": set(scouts.locBS_scoutTable.values()), + "Scout Flies - MP": set(scouts.locMP_scoutTable.values()), + "Scout Flies - VC": set(scouts.locVC_scoutTable.values()), + "Scout Flies - SC": set(scouts.locSC_scoutTable.values()), + "Scout Flies - SM": set(scouts.locSM_scoutTable.values()), + "Scout Flies - LT": set(scouts.locLT_scoutTable.values()), + "Scout Flies - GMC": set(scouts.locGMC_scoutTable.values()), + "Specials": set(special_location_table.values()), + "Orb Caches": set(cache_location_table.values()), + "Precursor Orbs": set(orb_location_table.values()), + "Precursor Orbs - GR": set(orbs.locGR_orbBundleTable.values()), + "Precursor Orbs - SV": set(orbs.locSV_orbBundleTable.values()), + "Precursor Orbs - FJ": set(orbs.locFJ_orbBundleTable.values()), + "Precursor Orbs - SB": set(orbs.locSB_orbBundleTable.values()), + "Precursor Orbs - MI": set(orbs.locMI_orbBundleTable.values()), + "Precursor Orbs - FC": set(orbs.locFC_orbBundleTable.values()), + "Precursor Orbs - RV": set(orbs.locRV_orbBundleTable.values()), + "Precursor Orbs - PB": set(orbs.locPB_orbBundleTable.values()), + "Precursor Orbs - LPC": set(orbs.locLPC_orbBundleTable.values()), + "Precursor Orbs - BS": set(orbs.locBS_orbBundleTable.values()), + "Precursor Orbs - MP": set(orbs.locMP_orbBundleTable.values()), + "Precursor Orbs - VC": set(orbs.locVC_orbBundleTable.values()), + "Precursor Orbs - SC": set(orbs.locSC_orbBundleTable.values()), + "Precursor Orbs - SM": set(orbs.locSM_orbBundleTable.values()), + "Precursor Orbs - LT": set(orbs.locLT_orbBundleTable.values()), + "Precursor Orbs - GMC": set(orbs.locGMC_orbBundleTable.values()), + "Trades": {location_table[cells.to_ap_id(k)] for k in + {11, 12, 31, 32, 33, 96, 97, 98, 99, 13, 14, 34, 35, 100, 101}}, + "'Free 7 Scout Flies' Power Cells": set(cells.loc7SF_cellTable.values()), + } + + # These functions and variables are Options-driven, keep them as instance variables here so that we don't clog up + # the seed generation routines with options checking. So we set these once, and then just use them as needed. + can_trade: Callable[[CollectionState, int, int | None], bool] + total_orbs: int = 2000 + orb_bundle_item_name: str = "" + orb_bundle_size: int = 0 + total_trade_orbs: int = 0 + total_prog_orb_bundles: int = 0 + total_trap_orb_bundles: int = 0 + total_filler_orb_bundles: int = 0 + total_power_cells: int = 101 + total_prog_cells: int = 0 + total_trap_cells: int = 0 + total_filler_cells: int = 0 + power_cell_thresholds: list[int] + power_cell_thresholds_minus_one: list[int] + trap_weights: tuple[list[str], list[int]] + + # Store these dictionaries for speed improvements. + level_to_regions: dict[str, list[JakAndDaxterRegion]] # Contains all levels and regions. + level_to_orb_regions: dict[str, list[JakAndDaxterRegion]] # Contains only regions which contain orbs. + + # Handles various options validation, rules enforcement, and caching of important information. + def generate_early(self) -> None: + + # Initialize the level-region dictionary. + self.level_to_regions = defaultdict(list) + self.level_to_orb_regions = defaultdict(list) + + # Cache the power cell threshold values for quicker reference. + self.power_cell_thresholds = [ + self.options.fire_canyon_cell_count.value, + self.options.mountain_pass_cell_count.value, + self.options.lava_tube_cell_count.value, + 100, # The 100 Power Cell Door. + ] + + # Order the thresholds ascending and set the options values to the new order. + if self.options.enable_ordered_cell_counts: + self.power_cell_thresholds.sort() + self.options.fire_canyon_cell_count.value = self.power_cell_thresholds[0] + self.options.mountain_pass_cell_count.value = self.power_cell_thresholds[1] + self.options.lava_tube_cell_count.value = self.power_cell_thresholds[2] + + # We would have done this earlier, but we needed to sort the power cell thresholds first. Don't worry, we'll + # come back to them. + enforce_friendly_options = self.settings.enforce_friendly_options + if self.multiworld.players == 1: + # For singleplayer games, always enforce/clamp the cell counts to valid values. + enforce_sp_limits(self) + else: + if enforce_friendly_options: + # For multiplayer games, we have a host setting to make options fair/sane for other players. + # If this setting is enabled, enforce/clamp some friendly limitations on our options. + enforce_mp_friendly_limits(self) + else: + # Even if the setting is disabled, some values must be clamped to avoid generation errors. + enforce_mp_absolute_limits(self) + + # That's right, set the collection of thresholds again. Don't just clamp the values without updating this list! + self.power_cell_thresholds = [ + self.options.fire_canyon_cell_count.value, + self.options.mountain_pass_cell_count.value, + self.options.lava_tube_cell_count.value, + 100, # The 100 Power Cell Door. + ] + + # Now that the threshold list is finalized, store this for the remove function. + self.power_cell_thresholds_minus_one = [x - 1 for x in self.power_cell_thresholds] + + # Calculate the number of power cells needed for full region access, the number being replaced by traps, + # and the number of remaining filler. + if self.options.jak_completion_condition == options.CompletionCondition.option_open_100_cell_door: + self.total_prog_cells = 100 + else: + self.total_prog_cells = max(self.power_cell_thresholds[:3]) + non_prog_cells = self.total_power_cells - self.total_prog_cells + self.total_trap_cells = min(self.options.filler_power_cells_replaced_with_traps.value, non_prog_cells) + self.options.filler_power_cells_replaced_with_traps.value = self.total_trap_cells + self.total_filler_cells = non_prog_cells - self.total_trap_cells + + # Cache the orb bundle size and item name for quicker reference. + if self.options.enable_orbsanity == options.EnableOrbsanity.option_per_level: + self.orb_bundle_size = self.options.level_orbsanity_bundle_size.value + self.orb_bundle_item_name = orb_item_table[self.orb_bundle_size] + elif self.options.enable_orbsanity == options.EnableOrbsanity.option_global: + self.orb_bundle_size = self.options.global_orbsanity_bundle_size.value + self.orb_bundle_item_name = orb_item_table[self.orb_bundle_size] + else: + self.orb_bundle_size = 0 + self.orb_bundle_item_name = "" + + # Calculate the number of orb bundles needed for trades, the number being replaced by traps, + # and the number of remaining filler. If Orbsanity is off, default values of 0 will prevail for all. + if self.orb_bundle_size > 0: + total_orb_bundles = self.total_orbs // self.orb_bundle_size + self.total_prog_orb_bundles = ceil(self.total_trade_orbs / self.orb_bundle_size) + non_prog_orb_bundles = total_orb_bundles - self.total_prog_orb_bundles + self.total_trap_orb_bundles = min(self.options.filler_orb_bundles_replaced_with_traps.value, + non_prog_orb_bundles) + self.options.filler_orb_bundles_replaced_with_traps.value = self.total_trap_orb_bundles + self.total_filler_orb_bundles = non_prog_orb_bundles - self.total_trap_orb_bundles + else: + self.options.filler_orb_bundles_replaced_with_traps.value = 0 + + self.trap_weights = self.options.trap_weights.weights_pair + + # Options drive which trade rules to use, so they need to be setup before we create_regions. + set_orb_trade_rule(self) + + # This will also set Locations, Location access rules, Region access rules, etc. + def create_regions(self) -> None: + create_regions(self) + + # Don't forget to add the created regions to the multiworld! + for level in self.level_to_regions: + self.multiworld.regions.extend(self.level_to_regions[level]) + + # As a lazy measure, let's also fill level_to_orb_regions here. + # This should help speed up orbsanity calculations. + self.level_to_orb_regions[level] = [reg for reg in self.level_to_regions[level] if reg.orb_count > 0] + + # from Utils import visualize_regions + # visualize_regions(self.multiworld.get_region("Menu", self.player), "jakanddaxter.puml") + + def item_data_helper(self, item: int) -> list[tuple[int, ItemClass, OrbAssoc, int]]: + """ + Helper function to reuse some nasty if/else trees. This outputs a list of pairs of item count and class. + For instance, not all 101 power cells need to be marked progression if you only need 72 to beat the game. + So we will have 72 Progression Power Cells, and 29 Filler Power Cells. + """ + data: list[tuple[int, ItemClass, OrbAssoc, int]] = [] + + # Make N Power Cells. We only want AP's Progression Fill routine to handle the amount of cells we need + # to reach the furthest possible region. Even for early completion goals, all areas in the game must be + # reachable or generation will fail. TODO - Option-driven region creation would be an enormous refactor. + if item in range(jak1_id, jak1_id + scouts.fly_offset): + data.append((self.total_prog_cells, ItemClass.progression_skip_balancing, OrbAssoc.IS_POWER_CELL, 0)) + data.append((self.total_filler_cells, ItemClass.filler, OrbAssoc.IS_POWER_CELL, 0)) + + # Make 7 Scout Flies per level. + elif item in range(jak1_id + scouts.fly_offset, jak1_id + specials.special_offset): + data.append((7, ItemClass.progression_skip_balancing, OrbAssoc.NEVER_UNLOCKS_ORBS, 0)) + + # Make only 1 of each Special Item. + elif item in range(jak1_id + specials.special_offset, jak1_id + caches.orb_cache_offset): + data.append((1, ItemClass.progression | ItemClass.useful, OrbAssoc.ALWAYS_UNLOCKS_ORBS, 0)) + + # Make only 1 of each Move Item. + elif item in range(jak1_id + caches.orb_cache_offset, jak1_id + orbs.orb_offset): + data.append((1, ItemClass.progression | ItemClass.useful, OrbAssoc.ALWAYS_UNLOCKS_ORBS, 0)) + + # Make N Precursor Orb bundles. Like Power Cells, only a fraction of these will be marked as Progression + # with the remainder as Filler, but they are still entirely fungible. See collect function for why these + # are OrbAssoc.NEVER_UNLOCKS_ORBS. + elif item in range(jak1_id + orbs.orb_offset, jak1_max - max(trap_item_table)): + data.append((self.total_prog_orb_bundles, ItemClass.progression_skip_balancing, + OrbAssoc.NEVER_UNLOCKS_ORBS, self.orb_bundle_size)) + data.append((self.total_filler_orb_bundles, ItemClass.filler, + OrbAssoc.NEVER_UNLOCKS_ORBS, self.orb_bundle_size)) + + # We will manually create trap items as needed. + elif item in range(jak1_max - max(trap_item_table), jak1_max): + data.append((0, ItemClass.trap, OrbAssoc.NEVER_UNLOCKS_ORBS, 0)) + + # We will manually create filler items as needed. + elif item == jak1_max: + data.append((0, ItemClass.filler, OrbAssoc.NEVER_UNLOCKS_ORBS, 0)) + + # If we try to make items with ID's higher than we've defined, something has gone wrong. + else: + raise KeyError(f"Tried to fill item pool with unknown ID {item}.") + + return data + + def create_items(self) -> None: + items_made: int = 0 + for item_name in self.item_name_to_id: + item_id = self.item_name_to_id[item_name] + + # Handle Move Randomizer option. + # If it is OFF, put all moves in your starting inventory instead of the item pool, + # then fill the item pool with a corresponding amount of filler items. + if item_name in self.item_name_groups["Moves"] and not self.options.enable_move_randomizer: + self.multiworld.push_precollected(self.create_item(item_name)) + self.multiworld.itempool.append(self.create_filler()) + items_made += 1 + continue + + # Handle Orbsanity option. + # If it is OFF, don't add any orb bundles to the item pool, period. + # If it is ON, don't add any orb bundles that don't match the chosen option. + if (item_name in self.item_name_groups["Precursor Orbs"] + and (self.options.enable_orbsanity == options.EnableOrbsanity.option_off + or item_name != self.orb_bundle_item_name)): + continue + + # Skip Traps for now. + if item_name in self.item_name_groups["Traps"]: + continue + + # In almost every other scenario, do this. Not all items with the same name will have the same item class. + data = self.item_data_helper(item_id) + for (count, classification, orb_assoc, orb_amount) in data: + self.multiworld.itempool += [JakAndDaxterItem(item_name, classification, item_id, + self.player, orb_assoc, orb_amount) + for _ in range(count)] + items_made += count + + # Handle Traps (for real). + # Manually fill the item pool with a weighted assortment of trap items, equal to the sum of + # total_trap_cells + total_trap_orb_bundles. Only do this if one or more traps have weights > 0. + names, weights = self.trap_weights + if sum(weights): + total_traps = self.total_trap_cells + self.total_trap_orb_bundles + trap_list = self.random.choices(names, weights=weights, k=total_traps) + self.multiworld.itempool += [self.create_item(trap_name) for trap_name in trap_list] + items_made += total_traps + + # Handle Unfilled Locations. + # Add an amount of filler items equal to the number of locations yet to be filled. + # This is the final set of items we will add to the pool. + all_regions = self.multiworld.get_regions(self.player) + total_locations = sum(reg.location_count for reg in cast(list[JakAndDaxterRegion], all_regions)) + total_filler = total_locations - items_made + self.multiworld.itempool += [self.create_filler() for _ in range(total_filler)] + + def create_item(self, name: str) -> Item: + item_id = self.item_name_to_id[name] + + # Use first tuple (will likely be the most important). + _, classification, orb_assoc, orb_amount = self.item_data_helper(item_id)[0] + return JakAndDaxterItem(name, classification, item_id, self.player, orb_assoc, orb_amount) + + def get_filler_item_name(self) -> str: + return "Green Eco Pill" + + def collect(self, state: CollectionState, item: JakAndDaxterItem) -> bool: + change = super().collect(state, item) + if change: + # Orbsanity as an option is no-factor to these conditions. Matching the item name implies Orbsanity is ON, + # so we don't need to check the option. When Orbsanity is OFF, there won't even be any orb bundle items + # to collect. + + # Orb items do not intrinsically unlock anything that contains more Reachable Orbs, so they do not need to + # set the cache to stale. They just change how many orbs you have to trade with. + if item.orb_amount > 0: + state.prog_items[self.player]["Tradeable Orbs"] += self.orb_bundle_size # Give a bundle of Trade Orbs + + # Power Cells DO unlock new regions that contain more Reachable Orbs - the connector levels and new + # hub levels - BUT they only do that when you have a number of them equal to one of the threshold values. + elif (item.orb_assoc == OrbAssoc.ALWAYS_UNLOCKS_ORBS + or (item.orb_assoc == OrbAssoc.IS_POWER_CELL + and state.count("Power Cell", self.player) in self.power_cell_thresholds)): + state.prog_items[self.player]["Reachable Orbs Fresh"] = False + + # However, every other item that does not have an appropriate OrbAssoc that changes the CollectionState + # should NOT set the cache to stale, because they did not make it possible to reach more orb locations + # (level unlocks, region unlocks, etc.). + return change + + def remove(self, state: CollectionState, item: JakAndDaxterItem) -> bool: + change = super().remove(state, item) + if change: + + # Do the same thing we did in collect, except subtract trade orbs instead of add. + if item.orb_amount > 0: + state.prog_items[self.player]["Tradeable Orbs"] -= self.orb_bundle_size # Take a bundle of Trade Orbs + + # Ditto Power Cells, but check thresholds - 1, because we potentially crossed the threshold in the opposite + # direction. E.g. we've removed the 20th power cell, our count is now 19, so we should stale the cache. + elif (item.orb_assoc == OrbAssoc.ALWAYS_UNLOCKS_ORBS + or (item.orb_assoc == OrbAssoc.IS_POWER_CELL + and state.count("Power Cell", self.player) in self.power_cell_thresholds_minus_one)): + state.prog_items[self.player]["Reachable Orbs Fresh"] = False + + return change + + def fill_slot_data(self) -> dict[str, Any]: + options_dict = self.options.as_dict("enable_move_randomizer", + "enable_orbsanity", + "global_orbsanity_bundle_size", + "level_orbsanity_bundle_size", + "fire_canyon_cell_count", + "mountain_pass_cell_count", + "lava_tube_cell_count", + "citizen_orb_trade_amount", + "oracle_orb_trade_amount", + "filler_power_cells_replaced_with_traps", + "filler_orb_bundles_replaced_with_traps", + "trap_effect_duration", + "trap_weights", + "jak_completion_condition", + "require_punch_for_klaww", + ) + return options_dict diff --git a/worlds/jakanddaxter/agents/__init__.py b/worlds/jakanddaxter/agents/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/jakanddaxter/agents/memory_reader.py b/worlds/jakanddaxter/agents/memory_reader.py new file mode 100644 index 0000000000..01035c4a2e --- /dev/null +++ b/worlds/jakanddaxter/agents/memory_reader.py @@ -0,0 +1,489 @@ +import logging +import random +import struct +from typing import ByteString, Callable +import json +import pymem +from pymem import pattern +from pymem.exception import ProcessNotFound, ProcessError, MemoryReadError, WinAPIError +from dataclasses import dataclass + +from ..locs import (orb_locations as orbs, + cell_locations as cells, + scout_locations as flies, + special_locations as specials, + orb_cache_locations as caches) + + +logger = logging.getLogger("MemoryReader") + + +# Some helpful constants. +sizeof_uint64 = 8 +sizeof_uint32 = 4 +sizeof_uint8 = 1 +sizeof_float = 4 + + +# ***************************************************************************** +# **** This number must match (-> *ap-info-jak1* version) in ap-struct.gc! **** +# ***************************************************************************** +expected_memory_version = 5 + + +# IMPORTANT: OpenGOAL memory structures are particular about the alignment, in memory, of member elements according to +# their size in bits. The address for an N-bit field must be divisible by N. Use this class to define the memory offsets +# of important values in the struct. It will also do the byte alignment properly for you. +# See https://opengoal.dev/docs/reference/type_system/#arrays +@dataclass +class OffsetFactory: + current_offset: int = 0 + + def define(self, size: int, length: int = 1) -> int: + + # If necessary, align current_offset to the current size first. + bytes_to_alignment = self.current_offset % size + if bytes_to_alignment != 0: + self.current_offset += (size - bytes_to_alignment) + + # Increment current_offset so the next definition can be made. + offset_to_use = self.current_offset + self.current_offset += (size * length) + return offset_to_use + + +# Start defining important memory address offsets here. They must be in the same order, have the same sizes, and have +# the same lengths, as defined in `ap-info-jak1`. +offsets = OffsetFactory() + +# Cell, Buzzer, and Special information. +next_cell_index_offset = offsets.define(sizeof_uint64) +next_buzzer_index_offset = offsets.define(sizeof_uint64) +next_special_index_offset = offsets.define(sizeof_uint64) + +cells_checked_offset = offsets.define(sizeof_uint32, 101) +buzzers_checked_offset = offsets.define(sizeof_uint32, 112) +specials_checked_offset = offsets.define(sizeof_uint32, 32) + +buzzers_received_offset = offsets.define(sizeof_uint8, 16) +specials_received_offset = offsets.define(sizeof_uint8, 32) + +# Deathlink information. +death_count_offset = offsets.define(sizeof_uint32) +death_cause_offset = offsets.define(sizeof_uint8) +deathlink_enabled_offset = offsets.define(sizeof_uint8) + +# Move Rando information. +next_orb_cache_index_offset = offsets.define(sizeof_uint64) +orb_caches_checked_offset = offsets.define(sizeof_uint32, 16) +moves_received_offset = offsets.define(sizeof_uint8, 16) +moverando_enabled_offset = offsets.define(sizeof_uint8) + +# Orbsanity information. +orbsanity_option_offset = offsets.define(sizeof_uint8) +orbsanity_bundle_offset = offsets.define(sizeof_uint32) +collected_bundle_offset = offsets.define(sizeof_uint32, 17) + +# Progression and Completion information. +fire_canyon_unlock_offset = offsets.define(sizeof_float) +mountain_pass_unlock_offset = offsets.define(sizeof_float) +lava_tube_unlock_offset = offsets.define(sizeof_float) +citizen_orb_amount_offset = offsets.define(sizeof_float) +oracle_orb_amount_offset = offsets.define(sizeof_float) +completion_goal_offset = offsets.define(sizeof_uint8) +completed_offset = offsets.define(sizeof_uint8) + +# Text to display in the HUD (32 char max per string). +their_item_name_offset = offsets.define(sizeof_uint8, 32) +their_item_owner_offset = offsets.define(sizeof_uint8, 32) +my_item_name_offset = offsets.define(sizeof_uint8, 32) +my_item_finder_offset = offsets.define(sizeof_uint8, 32) + +# Version of the memory struct, to cut down on mod/apworld version mismatches. +memory_version_offset = offsets.define(sizeof_uint32) + +# Connection status to AP server (not the game!) +server_connection_offset = offsets.define(sizeof_uint8) +slot_name_offset = offsets.define(sizeof_uint8, 16) +slot_seed_offset = offsets.define(sizeof_uint8, 8) + +# Trap information. +trap_duration_offset = offsets.define(sizeof_float) + +# The End. +end_marker_offset = offsets.define(sizeof_uint8, 4) + + +# Can't believe this is easier to do in GOAL than Python but that's how it be sometimes. +def as_float(value: int) -> int: + return int(struct.unpack('f', value.to_bytes(sizeof_float, "little"))[0]) + + +# "Jak" to be replaced by player name in the Client. +def autopsy(cause: int) -> str: + if cause in [1, 2, 3, 4]: + return random.choice(["Jak said goodnight.", + "Jak stepped into the light.", + "Jak gave Daxter his insect collection.", + "Jak did not follow Step 1."]) + if cause == 5: + return "Jak fell into an endless pit." + if cause == 6: + return "Jak drowned in the spicy water." + if cause == 7: + return "Jak tried to tackle a Lurker Shark." + if cause == 8: + return "Jak hit 500 degrees." + if cause == 9: + return "Jak took a bath in a pool of dark eco." + if cause == 10: + return "Jak got bombarded with flaming 30-ton boulders." + if cause == 11: + return "Jak hit 800 degrees." + if cause == 12: + return "Jak ceased to be." + if cause == 13: + return "Jak got eaten by the dark eco plant." + if cause == 14: + return "Jak burned up." + if cause == 15: + return "Jak hit the ground hard." + if cause == 16: + return "Jak crashed the zoomer." + if cause == 17: + return "Jak got Flut Flut hurt." + if cause == 18: + return "Jak poisoned the whole darn catch." + if cause == 19: + return "Jak collided with too many obstacles." + return "Jak died." + + +class JakAndDaxterMemoryReader: + marker: ByteString + goal_address: int | None = None + connected: bool = False + initiated_connect: bool = False + + # The memory reader just needs the game running. + gk_process: pymem.process = None + + location_outbox: list[int] = [] + outbox_index: int = 0 + finished_game: bool = False + + # Deathlink handling + deathlink_enabled: bool = False + send_deathlink: bool = False + cause_of_death: str = "" + death_count: int = 0 + + # Orbsanity handling + orbsanity_enabled: bool = False + orbs_paid: int = 0 + + # Game-related callbacks (inform the AP server of changes to game state) + inform_checked_location: Callable + inform_finished_game: Callable + inform_died: Callable + inform_toggled_deathlink: Callable + inform_traded_orbs: Callable + + # Logging callbacks + # These will write to the provided logger, as well as the Client GUI with color markup. + log_error: Callable # Red + log_warn: Callable # Orange + log_success: Callable # Green + log_info: Callable # White (default) + + def __init__(self, + location_check_callback: Callable, + finish_game_callback: Callable, + send_deathlink_callback: Callable, + toggle_deathlink_callback: Callable, + orb_trade_callback: Callable, + log_error_callback: Callable, + log_warn_callback: Callable, + log_success_callback: Callable, + log_info_callback: Callable, + marker: ByteString = b'UnLiStEdStRaTs_JaK1\x00'): + self.marker = marker + + self.inform_checked_location = location_check_callback + self.inform_finished_game = finish_game_callback + self.inform_died = send_deathlink_callback + self.inform_toggled_deathlink = toggle_deathlink_callback + self.inform_traded_orbs = orb_trade_callback + + self.log_error = log_error_callback + self.log_warn = log_warn_callback + self.log_success = log_success_callback + self.log_info = log_info_callback + + async def main_tick(self): + if self.initiated_connect: + await self.connect() + self.initiated_connect = False + + if self.connected: + try: + self.gk_process.read_bool(self.gk_process.base_address) # Ping to see if it's alive. + except (ProcessError, MemoryReadError, WinAPIError): + msg = (f"Error reading game memory! (Did the game crash?)\n" + f"Please close all open windows and reopen the Jak and Daxter Client " + f"from the Archipelago Launcher.\n" + f"If the game and compiler do not restart automatically, please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Play in Debug Mode.\n" + f" Then click Advanced > Open REPL.\n" + f" Then close and reopen the Jak and Daxter Client from the Archipelago Launcher.") + self.log_error(logger, msg) + self.connected = False + else: + return + + if self.connected: + + # Save some state variables temporarily. + old_deathlink_enabled = self.deathlink_enabled + + # Read the memory address to check the state of the game. + self.read_memory() + + # Checked Locations in game. Handle the entire outbox every tick until we're up to speed. + if len(self.location_outbox) > self.outbox_index: + self.inform_checked_location(self.location_outbox) + self.save_data() + self.outbox_index += 1 + + if self.finished_game: + self.inform_finished_game() + + if old_deathlink_enabled != self.deathlink_enabled: + self.inform_toggled_deathlink() + logger.debug("Toggled DeathLink " + ("ON" if self.deathlink_enabled else "OFF")) + + if self.send_deathlink: + self.inform_died() + + if self.orbs_paid > 0: + self.inform_traded_orbs(self.orbs_paid) + self.orbs_paid = 0 + + async def connect(self): + try: + self.gk_process = pymem.Pymem("gk.exe") # The GOAL Kernel + logger.debug("Found the gk process: " + str(self.gk_process.process_id)) + except ProcessNotFound: + self.log_error(logger, "Could not find the game process.") + self.connected = False + return + + # If we don't find the marker in the first loaded module, we've failed. + modules = list(self.gk_process.list_modules()) + marker_address = pattern.pattern_scan_module(self.gk_process.process_handle, modules[0], self.marker) + if marker_address: + # At this address is another address that contains the struct we're looking for: the game's state. + # From here we need to add the length in bytes for the marker and 4 bytes of padding, + # and the struct address is 8 bytes long (it's an uint64). + goal_pointer = marker_address + len(self.marker) + 4 + self.goal_address = int.from_bytes(self.gk_process.read_bytes(goal_pointer, sizeof_uint64), + byteorder="little", + signed=False) + logger.debug("Found the archipelago memory address: " + str(self.goal_address)) + await self.verify_memory_version() + else: + self.log_error(logger, "Could not find the Archipelago marker address!") + self.connected = False + + async def verify_memory_version(self): + if self.goal_address is None: + self.log_error(logger, "Could not find the Archipelago memory address!") + self.connected = False + return + + memory_version: int | None = None + try: + memory_version = self.read_goal_address(memory_version_offset, sizeof_uint32) + if memory_version == expected_memory_version: + self.log_success(logger, "The Memory Reader is ready!") + self.connected = True + else: + raise MemoryReadError(memory_version_offset, sizeof_uint32) + except (ProcessError, MemoryReadError, WinAPIError): + if memory_version is None: + msg = (f"Could not find a version number in the OpenGOAL memory structure!\n" + f" Expected Version: {str(expected_memory_version)}\n" + f" Found Version: {str(memory_version)}\n" + f"Please follow these steps:\n" + f" If the game is running, try entering '/memr connect' in the client.\n" + f" You should see 'The Memory Reader is ready!'\n" + f" If that did not work, or the game is not running, run the OpenGOAL Launcher.\n" + f" Click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Play in Debug Mode.\n" + f" Try entering '/memr connect' in the client again.") + else: + msg = (f"The OpenGOAL memory structure is incompatible with the current Archipelago client!\n" + f" Expected Version: {str(expected_memory_version)}\n" + f" Found Version: {str(memory_version)}\n" + f"Please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Click Update (if one is available).\n" + f" Click Advanced > Compile. When this is done, click Continue.\n" + f" Click Versions and verify the latest version is marked 'Active'.\n" + f" Close all launchers, games, clients, and console windows, then restart Archipelago.") + self.log_error(logger, msg) + self.connected = False + + async def print_status(self): + proc_id = str(self.gk_process.process_id) if self.gk_process else "None" + last_loc = str(self.location_outbox[self.outbox_index - 1] if self.outbox_index else "None") + msg = (f"Memory Reader Status:\n" + f" Game process ID: {proc_id}\n" + f" Game state memory address: {str(self.goal_address)}\n" + f" Last location checked: {last_loc}") + await self.verify_memory_version() + self.log_info(logger, msg) + + def read_memory(self) -> list[int]: + try: + # Need to grab these first and convert to floats, see below. + citizen_orb_amount = self.read_goal_address(citizen_orb_amount_offset, sizeof_float) + oracle_orb_amount = self.read_goal_address(oracle_orb_amount_offset, sizeof_float) + + next_cell_index = self.read_goal_address(next_cell_index_offset, sizeof_uint64) + for k in range(0, next_cell_index): + next_cell = self.read_goal_address(cells_checked_offset + (k * sizeof_uint32), sizeof_uint32) + cell_ap_id = cells.to_ap_id(next_cell) + if cell_ap_id not in self.location_outbox: + self.location_outbox.append(cell_ap_id) + logger.debug("Checked power cell: " + str(next_cell)) + + # If orbsanity is ON and next_cell is one of the traders or oracles, then run a callback + # to add their amount to the DataStorage value holding our current orb trade total. + if next_cell in {11, 12, 31, 32, 33, 96, 97, 98, 99}: + citizen_orb_amount = as_float(citizen_orb_amount) + self.orbs_paid += citizen_orb_amount + logger.debug(f"Traded {citizen_orb_amount} orbs!") + + if next_cell in {13, 14, 34, 35, 100, 101}: + oracle_orb_amount = as_float(oracle_orb_amount) + self.orbs_paid += oracle_orb_amount + logger.debug(f"Traded {oracle_orb_amount} orbs!") + + next_buzzer_index = self.read_goal_address(next_buzzer_index_offset, sizeof_uint64) + for k in range(0, next_buzzer_index): + next_buzzer = self.read_goal_address(buzzers_checked_offset + (k * sizeof_uint32), sizeof_uint32) + buzzer_ap_id = flies.to_ap_id(next_buzzer) + if buzzer_ap_id not in self.location_outbox: + self.location_outbox.append(buzzer_ap_id) + logger.debug("Checked scout fly: " + str(next_buzzer)) + + next_special_index = self.read_goal_address(next_special_index_offset, sizeof_uint64) + for k in range(0, next_special_index): + next_special = self.read_goal_address(specials_checked_offset + (k * sizeof_uint32), sizeof_uint32) + special_ap_id = specials.to_ap_id(next_special) + if special_ap_id not in self.location_outbox: + self.location_outbox.append(special_ap_id) + logger.debug("Checked special: " + str(next_special)) + + death_count = self.read_goal_address(death_count_offset, sizeof_uint32) + death_cause = self.read_goal_address(death_cause_offset, sizeof_uint8) + if death_count > self.death_count: + self.cause_of_death = autopsy(death_cause) # The way he names his variables? Wack! + self.send_deathlink = True + self.death_count += 1 + + # Listen for any changes to this setting. + deathlink_flag = self.read_goal_address(deathlink_enabled_offset, sizeof_uint8) + self.deathlink_enabled = bool(deathlink_flag) + + next_cache_index = self.read_goal_address(next_orb_cache_index_offset, sizeof_uint64) + for k in range(0, next_cache_index): + next_cache = self.read_goal_address(orb_caches_checked_offset + (k * sizeof_uint32), sizeof_uint32) + cache_ap_id = caches.to_ap_id(next_cache) + if cache_ap_id not in self.location_outbox: + self.location_outbox.append(cache_ap_id) + logger.debug("Checked orb cache: " + str(next_cache)) + + # Listen for any changes to this setting. + # moverando_flag = self.read_goal_address(moverando_enabled_offset, sizeof_uint8) + # self.moverando_enabled = bool(moverando_flag) + + orbsanity_option = self.read_goal_address(orbsanity_option_offset, sizeof_uint8) + bundle_size = self.read_goal_address(orbsanity_bundle_offset, sizeof_uint32) + self.orbsanity_enabled = orbsanity_option > 0 + + # Per Level Orbsanity option. Only need to do this loop if we chose this setting. + if orbsanity_option == 1: + for level in range(0, 16): + collected_bundles = self.read_goal_address(collected_bundle_offset + (level * sizeof_uint32), + sizeof_uint32) + + # Count up from the first bundle, by bundle size, until you reach the latest collected bundle. + # e.g. {25, 50, 75, 100, 125...} + if collected_bundles > 0: + for bundle in range(bundle_size, + bundle_size + collected_bundles, # Range max is non-inclusive. + bundle_size): + + bundle_ap_id = orbs.to_ap_id(orbs.find_address(level, bundle, bundle_size)) + if bundle_ap_id not in self.location_outbox: + self.location_outbox.append(bundle_ap_id) + logger.debug(f"Checked orb bundle: L{level} {bundle}") + + # Global Orbsanity option. Index 16 refers to all orbs found regardless of level. + if orbsanity_option == 2: + collected_bundles = self.read_goal_address(collected_bundle_offset + (16 * sizeof_uint32), + sizeof_uint32) + if collected_bundles > 0: + for bundle in range(bundle_size, + bundle_size + collected_bundles, # Range max is non-inclusive. + bundle_size): + + bundle_ap_id = orbs.to_ap_id(orbs.find_address(16, bundle, bundle_size)) + if bundle_ap_id not in self.location_outbox: + self.location_outbox.append(bundle_ap_id) + logger.debug(f"Checked orb bundle: G {bundle}") + + completed = self.read_goal_address(completed_offset, sizeof_uint8) + if completed > 0 and not self.finished_game: + self.finished_game = True + self.log_success(logger, "Congratulations! You finished the game!") + + except (ProcessError, MemoryReadError, WinAPIError): + msg = (f"Error reading game memory! (Did the game crash?)\n" + f"Please close all open windows and reopen the Jak and Daxter Client " + f"from the Archipelago Launcher.\n" + f"If the game and compiler do not restart automatically, please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Play in Debug Mode.\n" + f" Then click Advanced > Open REPL.\n" + f" Then close and reopen the Jak and Daxter Client from the Archipelago Launcher.") + self.log_error(logger, msg) + self.connected = False + + return self.location_outbox + + def read_goal_address(self, offset: int, length: int) -> int: + return int.from_bytes( + self.gk_process.read_bytes(self.goal_address + offset, length), + byteorder="little", + signed=False) + + def save_data(self): + with open("jakanddaxter_location_outbox.json", "w+") as f: + dump = { + "outbox_index": self.outbox_index, + "location_outbox": self.location_outbox + } + json.dump(dump, f, indent=4) + + def load_data(self): + try: + with open("jakanddaxter_location_outbox.json", "r") as f: + load = json.load(f) + self.outbox_index = load["outbox_index"] + self.location_outbox = load["location_outbox"] + except FileNotFoundError: + pass diff --git a/worlds/jakanddaxter/agents/repl_client.py b/worlds/jakanddaxter/agents/repl_client.py new file mode 100644 index 0000000000..b207bba281 --- /dev/null +++ b/worlds/jakanddaxter/agents/repl_client.py @@ -0,0 +1,527 @@ +import json +import logging +import queue +import time +import struct +import random +from dataclasses import dataclass +from queue import Queue +from typing import Callable + +import pymem +from pymem.exception import ProcessNotFound, ProcessError + +import asyncio +from asyncio import StreamReader, StreamWriter, Lock + +from NetUtils import NetworkItem +from ..game_id import jak1_id, jak1_max +from ..items import item_table, trap_item_table +from ..locs import ( + orb_locations as orbs, + cell_locations as cells, + scout_locations as flies, + special_locations as specials, + orb_cache_locations as caches) + + +logger = logging.getLogger("ReplClient") + + +@dataclass +class JsonMessageData: + my_item_name: str | None = None + my_item_finder: str | None = None + their_item_name: str | None = None + their_item_owner: str | None = None + + +ALLOWED_CHARACTERS = frozenset({ + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", + "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", + "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", + "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", + "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", + "y", "z", " ", "!", ":", ",", ".", "/", "?", "-", + "=", "+", "'", "(", ")", "\"" +}) + + +class JakAndDaxterReplClient: + ip: str + port: int + reader: StreamReader + writer: StreamWriter + lock: Lock + connected: bool = False + initiated_connect: bool = False # Signals when user tells us to try reconnecting. + received_deathlink: bool = False + balanced_orbs: bool = False + + # Variables to handle the title screen and initial game connection. + initial_item_count = -1 # Brand new games have 0 items, so initialize this to -1. + received_initial_items = False + processed_initial_items = False + + # The REPL client needs the REPL/compiler process running, but that process + # also needs the game running. Therefore, the REPL client needs both running. + gk_process: pymem.process = None + goalc_process: pymem.process = None + + item_inbox: dict[int, NetworkItem] = {} + inbox_index = 0 + json_message_queue: Queue[JsonMessageData] = queue.Queue() + + # Logging callbacks + # These will write to the provided logger, as well as the Client GUI with color markup. + log_error: Callable # Red + log_warn: Callable # Orange + log_success: Callable # Green + log_info: Callable # White (default) + + def __init__(self, + log_error_callback: Callable, + log_warn_callback: Callable, + log_success_callback: Callable, + log_info_callback: Callable, + ip: str = "127.0.0.1", + port: int = 8181): + self.ip = ip + self.port = port + self.lock = asyncio.Lock() + self.log_error = log_error_callback + self.log_warn = log_warn_callback + self.log_success = log_success_callback + self.log_info = log_info_callback + + async def main_tick(self): + if self.initiated_connect: + await self.connect() + self.initiated_connect = False + + if self.connected: + try: + self.gk_process.read_bool(self.gk_process.base_address) # Ping to see if it's alive. + except ProcessError: + msg = (f"Error reading game memory! (Did the game crash?)\n" + f"Please close all open windows and reopen the Jak and Daxter Client " + f"from the Archipelago Launcher.\n" + f"If the game and compiler do not restart automatically, please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Play in Debug Mode.\n" + f" Then click Advanced > Open REPL.\n" + f" Then close and reopen the Jak and Daxter Client from the Archipelago Launcher.") + self.log_error(logger, msg) + self.connected = False + try: + self.goalc_process.read_bool(self.goalc_process.base_address) # Ping to see if it's alive. + except ProcessError: + msg = (f"Error sending data to compiler! (Did the compiler crash?)\n" + f"Please close all open windows and reopen the Jak and Daxter Client " + f"from the Archipelago Launcher.\n" + f"If the game and compiler do not restart automatically, please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Play in Debug Mode.\n" + f" Then click Advanced > Open REPL.\n" + f" Then close and reopen the Jak and Daxter Client from the Archipelago Launcher.") + self.log_error(logger, msg) + self.connected = False + else: + return + + # When connecting the game to the AP server on the title screen, we may be processing items from starting + # inventory or items received in an async game. Once we have caught up to the initial count, tell the player + # that we are ready to start. New items may even come in during the title screen, so if we go over the count, + # we should still send the ready signal. + if not self.processed_initial_items: + if self.inbox_index >= self.initial_item_count >= 0: + self.processed_initial_items = True + await self.send_connection_status("ready") + + # Receive Items from AP. Handle 1 item per tick. + if len(self.item_inbox) > self.inbox_index: + await self.receive_item() + await self.save_data() + self.inbox_index += 1 + + if self.received_deathlink: + await self.receive_deathlink() + self.received_deathlink = False + + # Progressively empty the queue during each tick + # if text messages happen to be too slow we could pool dequeuing here, + # but it'd slow down the ItemReceived message during release + if not self.json_message_queue.empty(): + json_txt_data = self.json_message_queue.get_nowait() + await self.write_game_text(json_txt_data) + + # This helper function formats and sends `form` as a command to the REPL. + # ALL commands to the REPL should be sent using this function. + async def send_form(self, form: str, print_ok: bool = True) -> bool: + header = struct.pack(" str: + result = "".join([c if c in ALLOWED_CHARACTERS else "?" for c in text[:32]]).upper() + result = result.replace("'", "\\c12") + return f"\"{result}\"" + + # Like sanitize_game_text, but the settings file will NOT allow any whitespace in the slot_name or slot_seed data. + # And don't replace any chars with "?" for good measure. + @staticmethod + def sanitize_file_text(text: str) -> str: + allowed_chars_no_extras = ALLOWED_CHARACTERS - {" ", "'", "(", ")", "\""} + result = "".join([c if c in allowed_chars_no_extras else "" for c in text[:16]]).upper() + return f"\"{result}\"" + + # Pushes a JsonMessageData object to the json message queue to be processed during the repl main_tick + def queue_game_text(self, my_item_name, my_item_finder, their_item_name, their_item_owner): + self.json_message_queue.put(JsonMessageData(my_item_name, my_item_finder, their_item_name, their_item_owner)) + + # OpenGOAL can handle both its own string datatype and C-like character pointers (charp). + async def write_game_text(self, data: JsonMessageData): + logger.debug(f"Sending info to the in-game messenger!") + body = "" + if data.my_item_name and data.my_item_finder: + body += (f" (append-messages (-> *ap-messenger* 0) \'recv " + f" {self.sanitize_game_text(data.my_item_name)} " + f" {self.sanitize_game_text(data.my_item_finder)})") + if data.their_item_name and data.their_item_owner: + body += (f" (append-messages (-> *ap-messenger* 0) \'sent " + f" {self.sanitize_game_text(data.their_item_name)} " + f" {self.sanitize_game_text(data.their_item_owner)})") + await self.send_form(f"(begin {body} (none))", print_ok=False) + + async def receive_item(self): + ap_id = getattr(self.item_inbox[self.inbox_index], "item") + + # Determine the type of item to receive. + if ap_id in range(jak1_id, jak1_id + flies.fly_offset): + await self.receive_power_cell(ap_id) + elif ap_id in range(jak1_id + flies.fly_offset, jak1_id + specials.special_offset): + await self.receive_scout_fly(ap_id) + elif ap_id in range(jak1_id + specials.special_offset, jak1_id + caches.orb_cache_offset): + await self.receive_special(ap_id) + elif ap_id in range(jak1_id + caches.orb_cache_offset, jak1_id + orbs.orb_offset): + await self.receive_move(ap_id) + elif ap_id in range(jak1_id + orbs.orb_offset, jak1_max - max(trap_item_table)): + await self.receive_precursor_orb(ap_id) # Ponder the orbs. + elif ap_id in range(jak1_max - max(trap_item_table), jak1_max): + await self.receive_trap(ap_id) + elif ap_id == jak1_max: + await self.receive_green_eco() # Ponder why I chose to do ID's this way. + else: + self.log_error(logger, f"Tried to receive item with unknown AP ID {ap_id}!") + + async def receive_power_cell(self, ap_id: int) -> bool: + cell_id = cells.to_game_id(ap_id) + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type fuel-cell) " + "(the float " + str(cell_id) + "))") + if ok: + logger.debug(f"Received a Power Cell!") + else: + self.log_error(logger, f"Unable to receive a Power Cell!") + return ok + + async def receive_scout_fly(self, ap_id: int) -> bool: + fly_id = flies.to_game_id(ap_id) + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type buzzer) " + "(the float " + str(fly_id) + "))") + if ok: + logger.debug(f"Received a {item_table[ap_id]}!") + else: + self.log_error(logger, f"Unable to receive a {item_table[ap_id]}!") + return ok + + async def receive_special(self, ap_id: int) -> bool: + special_id = specials.to_game_id(ap_id) + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type ap-special) " + "(the float " + str(special_id) + "))") + if ok: + logger.debug(f"Received special unlock {item_table[ap_id]}!") + else: + self.log_error(logger, f"Unable to receive special unlock {item_table[ap_id]}!") + return ok + + async def receive_move(self, ap_id: int) -> bool: + move_id = caches.to_game_id(ap_id) + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type ap-move) " + "(the float " + str(move_id) + "))") + if ok: + logger.debug(f"Received the ability to {item_table[ap_id]}!") + else: + self.log_error(logger, f"Unable to receive the ability to {item_table[ap_id]}!") + return ok + + async def receive_precursor_orb(self, ap_id: int) -> bool: + orb_amount = orbs.to_game_id(ap_id) + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type money) " + "(the float " + str(orb_amount) + "))") + if ok: + logger.debug(f"Received {orb_amount} Precursor orbs!") + else: + self.log_error(logger, f"Unable to receive {orb_amount} Precursor orbs!") + return ok + + async def receive_trap(self, ap_id: int) -> bool: + trap_id = jak1_max - ap_id + ok = await self.send_form("(send-event " + "*target* \'get-archipelago " + "(pickup-type ap-trap) " + "(the float " + str(trap_id) + "))") + if ok: + logger.debug(f"Received a {item_table[ap_id]}!") + else: + self.log_error(logger, f"Unable to receive a {item_table[ap_id]}!") + return ok + + # Green eco pills are our filler item. Use the get-pickup event instead to handle being full health. + async def receive_green_eco(self) -> bool: + ok = await self.send_form("(send-event *target* \'get-pickup (pickup-type eco-pill) (the float 1))") + if ok: + logger.debug(f"Received a green eco pill!") + else: + self.log_error(logger, f"Unable to receive a green eco pill!") + return ok + + async def receive_deathlink(self) -> bool: + + # Because it should at least be funny sometimes. + death_types = ["\'death", + "\'death", + "\'death", + "\'death", + "\'endlessfall", + "\'drown-death", + "\'melt", + "\'dark-eco-pool"] + chosen_death = random.choice(death_types) + + ok = await self.send_form("(ap-deathlink-received! " + chosen_death + ")") + if ok: + logger.debug(f"Received deathlink signal!") + else: + self.log_error(logger, f"Unable to receive deathlink signal!") + return ok + + async def subtract_traded_orbs(self, orb_count: int) -> bool: + + # To protect against momentary server disconnects, + # this should only be done once per client session. + if not self.balanced_orbs: + self.balanced_orbs = True + + ok = await self.send_form(f"(-! (-> *game-info* money) (the float {orb_count}))") + if ok: + logger.debug(f"Subtracting {orb_count} traded orbs!") + else: + self.log_error(logger, f"Unable to subtract {orb_count} traded orbs!") + return ok + + return True + + # OpenGOAL has a limit of 8 parameters per function. We've already hit this limit. So, define a new datatype + # in OpenGOAL that holds all these options, instantiate the type here, and have ap-setup-options! function take + # that instance as input. + async def setup_options(self, + os_option: int, os_bundle: int, + fc_count: int, mp_count: int, + lt_count: int, ct_amount: int, + ot_amount: int, trap_time: int, + goal_id: int, slot_name: str, + slot_seed: str) -> bool: + sanitized_name = self.sanitize_file_text(slot_name) + sanitized_seed = self.sanitize_file_text(slot_seed) + + # I didn't want to have to do this with floats but GOAL's compile-time vs runtime types leave me no choice. + ok = await self.send_form(f"(ap-setup-options! (new 'static 'ap-seed-options " + f":orbsanity-option {os_option} " + f":orbsanity-bundle {os_bundle} " + f":fire-canyon-unlock {fc_count}.0 " + f":mountain-pass-unlock {mp_count}.0 " + f":lava-tube-unlock {lt_count}.0 " + f":citizen-orb-amount {ct_amount}.0 " + f":oracle-orb-amount {ot_amount}.0 " + f":trap-duration {trap_time}.0 " + f":completion-goal {goal_id} " + f":slot-name {sanitized_name} " + f":slot-seed {sanitized_seed} ))") + message = (f"Setting options: \n" + f" orbsanity Option {os_option}, orbsanity Bundle {os_bundle}, \n" + f" FC Cell Count {fc_count}, MP Cell Count {mp_count}, \n" + f" LT Cell Count {lt_count}, Citizen Orb Amt {ct_amount}, \n" + f" Oracle Orb Amt {ot_amount}, Trap Duration {trap_time}, \n" + f" Completion GOAL {goal_id}, Slot Name {sanitized_name}, \n" + f" Slot Seed {sanitized_seed}... ") + if ok: + logger.debug(message + "Success!") + else: + self.log_error(logger, message + "Failed!") + + return ok + + async def send_connection_status(self, status: str) -> bool: + ok = await self.send_form(f"(ap-set-connection-status! (connection-status {status}))") + if ok: + logger.debug(f"Connection Status {status} set!") + else: + self.log_error(logger, f"Connection Status {status} failed to set!") + + return ok + + async def save_data(self): + with open("jakanddaxter_item_inbox.json", "w+") as f: + dump = { + "inbox_index": self.inbox_index, + "item_inbox": [{ + "item": self.item_inbox[k].item, + "location": self.item_inbox[k].location, + "player": self.item_inbox[k].player, + "flags": self.item_inbox[k].flags + } for k in self.item_inbox + ] + } + json.dump(dump, f, indent=4) + + def load_data(self): + try: + with open("jakanddaxter_item_inbox.json", "r") as f: + load = json.load(f) + self.inbox_index = load["inbox_index"] + self.item_inbox = {k: NetworkItem( + item=load["item_inbox"][k]["item"], + location=load["item_inbox"][k]["location"], + player=load["item_inbox"][k]["player"], + flags=load["item_inbox"][k]["flags"] + ) for k in range(0, len(load["item_inbox"])) + } + except FileNotFoundError: + pass diff --git a/worlds/jakanddaxter/archipelago.json b/worlds/jakanddaxter/archipelago.json new file mode 100644 index 0000000000..8b0adcd105 --- /dev/null +++ b/worlds/jakanddaxter/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Jak and Daxter: The Precursor Legacy", + "world_version": "1.0.0", + "minimum_ap_version": "0.6.2", + "authors": ["markustulliuscicero"] +} diff --git a/worlds/jakanddaxter/client.py b/worlds/jakanddaxter/client.py new file mode 100644 index 0000000000..fa2aea5495 --- /dev/null +++ b/worlds/jakanddaxter/client.py @@ -0,0 +1,639 @@ +# Python standard libraries +import asyncio +import json +import logging +import os +import subprocess +import sys + +from asyncio import Task +from datetime import datetime +from logging import Logger +from typing import Awaitable + +# Misc imports +import colorama +import pymem + +from pymem.exception import ProcessNotFound + +# Archipelago imports +import ModuleUpdate +import Utils + +from CommonClient import ClientCommandProcessor, CommonContext, server_loop, gui_enabled +from NetUtils import ClientStatus + +# Jak imports +from .game_id import jak1_name +from .options import EnableOrbsanity +from .agents.memory_reader import JakAndDaxterMemoryReader +from .agents.repl_client import JakAndDaxterReplClient +from . import JakAndDaxterWorld + + +ModuleUpdate.update() +logger = logging.getLogger("JakClient") +all_tasks: set[Task] = set() + + +def create_task_log_exception(awaitable: Awaitable) -> asyncio.Task: + async def _log_exception(a): + try: + return await a + except Exception as e: + logger.exception(e) + finally: + all_tasks.remove(task) + task = asyncio.create_task(_log_exception(awaitable)) + all_tasks.add(task) + return task + + +class JakAndDaxterClientCommandProcessor(ClientCommandProcessor): + ctx: "JakAndDaxterContext" + + # The command processor is not async so long-running operations like the /repl connect command + # (which takes 10-15 seconds to compile the game) have to be requested with user-initiated flags. + # The flags are checked by the agents every main_tick. + def _cmd_repl(self, *arguments: str): + """Sends a command to the OpenGOAL REPL. Arguments: + - connect : connect the client to the REPL (goalc). + - status : check internal status of the REPL.""" + if arguments: + if arguments[0] == "connect": + self.ctx.on_log_info(logger, "This may take a bit... Wait for the success audio cue before continuing!") + self.ctx.repl.initiated_connect = True + if arguments[0] == "status": + create_task_log_exception(self.ctx.repl.print_status()) + + def _cmd_memr(self, *arguments: str): + """Sends a command to the Memory Reader. Arguments: + - connect : connect the memory reader to the game process (gk). + - status : check the internal status of the Memory Reader.""" + if arguments: + if arguments[0] == "connect": + self.ctx.memr.initiated_connect = True + if arguments[0] == "status": + create_task_log_exception(self.ctx.memr.print_status()) + + +class JakAndDaxterContext(CommonContext): + game = jak1_name + items_handling = 0b111 # Full item handling + command_processor = JakAndDaxterClientCommandProcessor + + # We'll need two agents working in tandem to handle two-way communication with the game. + # The REPL Client will handle the server->game direction by issuing commands directly to the running game. + # But the REPL cannot send information back to us, it only ingests information we send it. + # Luckily OpenGOAL sets up memory addresses to write to, that AutoSplit can read from, for speedrunning. + # We'll piggyback off this system with a Memory Reader, and that will handle the game->server direction. + repl: JakAndDaxterReplClient + memr: JakAndDaxterMemoryReader + + # And two associated tasks, so we have handles on them. + repl_task: asyncio.Task + memr_task: asyncio.Task + + # Storing some information for writing save slot identifiers. + slot_seed: str + + def __init__(self, server_address: str | None, password: str | None) -> None: + self.repl = JakAndDaxterReplClient(self.on_log_error, + self.on_log_warn, + self.on_log_success, + self.on_log_info) + self.memr = JakAndDaxterMemoryReader(self.on_location_check, + self.on_finish_check, + self.on_deathlink_check, + self.on_deathlink_toggle, + self.on_orb_trade, + self.on_log_error, + self.on_log_warn, + self.on_log_success, + self.on_log_info) + # self.repl.load_data() + # self.memr.load_data() + super().__init__(server_address, password) + + def run_gui(self): + from kvui import GameManager + + class JakAndDaxterManager(GameManager): + logging_pairs = [ + ("Client", "Archipelago") + ] + base_title = "Jak and Daxter ArchipelaGOAL Client" + + self.ui = JakAndDaxterManager(self) + self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI") + + async def server_auth(self, password_requested: bool = False): + if password_requested and not self.password: + await super(JakAndDaxterContext, self).server_auth(password_requested) + await self.get_username() + self.tags = set() + await self.send_connect() + + async def disconnect(self, allow_autoreconnect: bool = False): + self.locations_checked = set() # Clear this set to gracefully handle server disconnects. + await super(JakAndDaxterContext, self).disconnect(allow_autoreconnect) + + def on_package(self, cmd: str, args: dict): + + if cmd == "RoomInfo": + self.slot_seed = args["seed_name"] + + if cmd == "Connected": + slot_data = args["slot_data"] + orbsanity_option = slot_data["enable_orbsanity"] + if orbsanity_option == EnableOrbsanity.option_per_level: + orbsanity_bundle = slot_data["level_orbsanity_bundle_size"] + elif orbsanity_option == EnableOrbsanity.option_global: + orbsanity_bundle = slot_data["global_orbsanity_bundle_size"] + else: + orbsanity_bundle = 1 + + # Connected packet is unaware of starting inventory or if player is returning to an existing game. + # Set initial_item_count to 0, see below comments for more info. + if not self.repl.received_initial_items and self.repl.initial_item_count < 0: + self.repl.initial_item_count = 0 + + create_task_log_exception( + self.repl.setup_options(orbsanity_option, + orbsanity_bundle, + slot_data["fire_canyon_cell_count"], + slot_data["mountain_pass_cell_count"], + slot_data["lava_tube_cell_count"], + slot_data["citizen_orb_trade_amount"], + slot_data["oracle_orb_trade_amount"], + slot_data["trap_effect_duration"], + slot_data["jak_completion_condition"], + self.auth[:16], # The slot name + self.slot_seed[:8])) + + # Because Orbsanity and the orb traders in the game are intrinsically linked, we need the server + # to track our trades at all times to support async play. "Retrieved" will tell us the orbs we lost, + # while "ReceivedItems" will tell us the orbs we gained. This will give us the correct balance. + if orbsanity_option in [EnableOrbsanity.option_per_level, EnableOrbsanity.option_global]: + async def get_orb_balance(): + await self.send_msgs([{"cmd": "Get", "keys": [f"jakanddaxter_{self.auth}_orbs_paid"]}]) + + create_task_log_exception(get_orb_balance()) + + # If there were any locations checked while the client wasn't connected, we want to make sure the server + # knows about them. To do that, replay the whole location_outbox (no duplicates will be sent). + self.memr.outbox_index = 0 + + # Tell the server if Deathlink is enabled or disabled in the in-game options. + # This allows us to "remember" the user's choice. + self.on_deathlink_toggle() + + if cmd == "Retrieved": + if f"jakanddaxter_{self.auth}_orbs_paid" in args["keys"]: + orbs_traded = args["keys"][f"jakanddaxter_{self.auth}_orbs_paid"] + orbs_traded = orbs_traded if orbs_traded is not None else 0 + create_task_log_exception(self.repl.subtract_traded_orbs(orbs_traded)) + + if cmd == "ReceivedItems": + + # If you have a starting inventory or are returning to a game where you have items, a ReceivedItems will be + # in the same network packet as Connected. This guarantees it is the first of any ReceivedItems we process. + # In this case, we should set the initial_item_count to > 0, even if already set to 0 by Connected, as well + # as the received_initial_items flag. Finally, use send_connection_status to tell the player to wait while + # we process the initial items. However, we will skip all this if there was no initial ReceivedItems and + # the REPL indicates it already handled any initial items (0 or otherwise). + if not self.repl.received_initial_items and not self.repl.processed_initial_items: + self.repl.received_initial_items = True + self.repl.initial_item_count = len(args["items"]) + create_task_log_exception(self.repl.send_connection_status("wait")) + + # This enumeration should run on every ReceivedItems packet, + # regardless of it being on initial connection or midway through a game. + for index, item in enumerate(args["items"], start=args["index"]): + logger.debug(f"index: {str(index)}, item: {str(item)}") + self.repl.item_inbox[index] = item + + async def json_to_game_text(self, args: dict): + if "type" in args and args["type"] in {"ItemSend"}: + my_item_name: str | None = None + my_item_finder: str | None = None + their_item_name: str | None = None + their_item_owner: str | None = None + + item = args["item"] + recipient = args["receiving"] + + # Receiving an item from the server. + if self.slot_concerns_self(recipient): + my_item_name = self.item_names.lookup_in_game(item.item) + + # Did we find it, or did someone else? + if self.slot_concerns_self(item.player): + my_item_finder = "MYSELF" + else: + my_item_finder = self.player_names[item.player] + + # Sending an item to the server. + if self.slot_concerns_self(item.player): + their_item_name = self.item_names.lookup_in_slot(item.item, recipient) + + # Does it belong to us, or to someone else? + if self.slot_concerns_self(recipient): + their_item_owner = "MYSELF" + else: + their_item_owner = self.player_names[recipient] + + # Write to game display. + self.repl.queue_game_text(my_item_name, my_item_finder, their_item_name, their_item_owner) + + # Even though N items come in as 1 ReceivedItems packet, there are still N PrintJson packets to process, + # and they all arrive before the ReceivedItems packet does. Defer processing of these packets as + # async tasks to speed up large releases of items. + def on_print_json(self, args: dict) -> None: + create_task_log_exception(self.json_to_game_text(args)) + super(JakAndDaxterContext, self).on_print_json(args) + + # We need to do a little more than just use CommonClient's on_deathlink. + def on_deathlink(self, data: dict): + if self.memr.deathlink_enabled: + self.repl.received_deathlink = True + super().on_deathlink(data) + + # We don't need an ap_inform function because check_locations solves that need. + def on_location_check(self, location_ids: list[int]): + self.locations_checked.update(location_ids) # Populate this set to gracefully handle server disconnects. + create_task_log_exception(self.check_locations(location_ids)) + + # CommonClient has no finished_game function, so we will have to craft our own. TODO - Update if that changes. + async def ap_inform_finished_game(self): + if not self.finished_game and self.memr.finished_game: + message = [{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}] + await self.send_msgs(message) + self.finished_game = True + + def on_finish_check(self): + create_task_log_exception(self.ap_inform_finished_game()) + + # We need to do a little more than just use CommonClient's send_death. + async def ap_inform_deathlink(self): + if self.memr.deathlink_enabled: + player = self.player_names[self.slot] if self.slot is not None else "Jak" + death_text = self.memr.cause_of_death.replace("Jak", player) + await self.send_death(death_text) + self.on_log_warn(logger, death_text) + + # Reset all flags, but leave the death count alone. + self.memr.send_deathlink = False + self.memr.cause_of_death = "" + + def on_deathlink_check(self): + create_task_log_exception(self.ap_inform_deathlink()) + + # We don't need an ap_inform function because update_death_link solves that need. + def on_deathlink_toggle(self): + create_task_log_exception(self.update_death_link(self.memr.deathlink_enabled)) + + # Orb trades are situations unique to Jak, so we have to craft our own function. + async def ap_inform_orb_trade(self, orbs_changed: int): + if self.memr.orbsanity_enabled: + await self.send_msgs([{"cmd": "Set", + "key": f"jakanddaxter_{self.auth}_orbs_paid", + "default": 0, + "want_reply": False, + "operations": [{"operation": "add", "value": orbs_changed}] + }]) + + def on_orb_trade(self, orbs_changed: int): + create_task_log_exception(self.ap_inform_orb_trade(orbs_changed)) + + def _markup_panels(self, msg: str, c: str = None): + color = self.jsontotextparser.color_codes[c] if c else None + message = f"[color={color}]{msg}[/color]" if c else msg + + self.ui.log_panels["Archipelago"].on_message_markup(message) + self.ui.log_panels["All"].on_message_markup(message) + + def on_log_error(self, lg: Logger, message: str): + lg.error(message) + if self.ui: + self._markup_panels(message, "red") + + def on_log_warn(self, lg: Logger, message: str): + lg.warning(message) + if self.ui: + self._markup_panels(message, "orange") + + def on_log_success(self, lg: Logger, message: str): + lg.info(message) + if self.ui: + self._markup_panels(message, "green") + + def on_log_info(self, lg: Logger, message: str): + lg.info(message) + if self.ui: + self._markup_panels(message) + + async def run_repl_loop(self): + while True: + await self.repl.main_tick() + await asyncio.sleep(0.1) + + async def run_memr_loop(self): + while True: + await self.memr.main_tick() + await asyncio.sleep(0.1) + + +def find_root_directory(ctx: JakAndDaxterContext): + + # The path to this file is platform-dependent. + if Utils.is_windows: + appdata = os.getenv("APPDATA") + settings_path = os.path.normpath(f"{appdata}/OpenGOAL-Launcher/settings.json") + elif Utils.is_linux: + home = os.path.expanduser("~") + settings_path = os.path.normpath(f"{home}/.config/OpenGOAL-Launcher/settings.json") + elif Utils.is_macos: + home = os.path.expanduser("~") + settings_path = os.path.normpath(f"{home}/Library/Application Support/OpenGOAL-Launcher/settings.json") + else: + ctx.on_log_error(logger, f"Unknown operating system: {sys.platform}!") + return + + # Boilerplate messages that all error messages in this function should have. + err_title = "Unable to locate the ArchipelaGOAL install directory" + alt_instructions = (f"Please verify that OpenGOAL and ArchipelaGOAL are installed properly. " + f"If the problem persists, follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Features > Mods > ArchipelaGOAL.\n" + f" Then click Advanced > Open Game Data Folder.\n" + f" Go up one folder, then copy this path.\n" + f" Run the Archipelago Launcher, click Open host.yaml.\n" + f" Set the value of 'jakanddaxter_options > root_directory' to this path.\n" + f" Replace all backslashes in the path with forward slashes.\n" + f" Set the value of 'jakanddaxter_options > auto_detect_root_directory' to false, " + f"then save and close the host.yaml file.\n" + f" Close all launchers, games, clients, and console windows, then restart Archipelago.") + + if not os.path.exists(settings_path): + msg = (f"{err_title}: The OpenGOAL settings file does not exist.\n" + f"{alt_instructions}") + ctx.on_log_error(logger, msg) + return + + with open(settings_path, "r") as f: + load = json.load(f) + + # This settings file has changed format once before, and may do so again in the future. + # Guard against future incompatibilities by checking the file version first, and use that to determine + # what JSON keys to look for next. + try: + settings_version = load["version"] + logger.debug(f"OpenGOAL settings file version: {settings_version}") + except KeyError: + msg = (f"{err_title}: The OpenGOAL settings file has no version number!\n" + f"{alt_instructions}") + ctx.on_log_error(logger, msg) + return + + try: + if settings_version == "2.0": + jak1_installed = load["games"]["Jak 1"]["isInstalled"] + mod_sources = load["games"]["Jak 1"]["modsInstalledVersion"] + + elif settings_version == "3.0": + jak1_installed = load["games"]["jak1"]["isInstalled"] + mod_sources = load["games"]["jak1"]["mods"] + + else: + msg = (f"{err_title}: The OpenGOAL settings file has an unknown version number ({settings_version}).\n" + f"{alt_instructions}") + ctx.on_log_error(logger, msg) + return + except KeyError as e: + msg = (f"{err_title}: The OpenGOAL settings file does not contain key entry {e}!\n" + f"{alt_instructions}") + ctx.on_log_error(logger, msg) + return + + if not jak1_installed: + msg = (f"{err_title}: The OpenGOAL Launcher is missing a normal install of Jak 1!\n" + f"{alt_instructions}") + ctx.on_log_error(logger, msg) + return + + if mod_sources is None: + msg = (f"{err_title}: No mod sources have been configured in the OpenGOAL Launcher!\n" + f"{alt_instructions}") + ctx.on_log_error(logger, msg) + return + + # Mods can come from multiple user-defined sources. + # Make no assumptions about where ArchipelaGOAL comes from, we should find it ourselves. + archipelagoal_source = None + for src in mod_sources: + for mod in mod_sources[src].keys(): + if mod == "archipelagoal": + archipelagoal_source = src + # Using this file, we could verify the right version is installed, but we don't need to. + if archipelagoal_source is None: + msg = (f"{err_title}: The ArchipelaGOAL mod is not installed in the OpenGOAL Launcher!\n" + f"{alt_instructions}") + ctx.on_log_error(logger, msg) + return + + # This is just the base OpenGOAL directory, we need to go deeper. + base_path = load["installationDir"] + mod_relative_path = f"features/jak1/mods/{archipelagoal_source}/archipelagoal" + mod_path = os.path.normpath( + os.path.join( + os.path.normpath(base_path), + os.path.normpath(mod_relative_path))) + + return mod_path + + +async def run_game(ctx: JakAndDaxterContext): + + # These may already be running. If they are not running, try to start them. + # TODO - Support other OS's. 1: Pymem is Windows-only. 2: on Linux, there's no ".exe." + gk_running = False + try: + pymem.Pymem("gk.exe") # The GOAL Kernel + gk_running = True + except ProcessNotFound: + ctx.on_log_warn(logger, "Game not running, attempting to start.") + + goalc_running = False + try: + pymem.Pymem("goalc.exe") # The GOAL Compiler and REPL + goalc_running = True + except ProcessNotFound: + ctx.on_log_warn(logger, "Compiler not running, attempting to start.") + + try: + auto_detect_root_directory = JakAndDaxterWorld.settings.auto_detect_root_directory + if auto_detect_root_directory: + root_path = find_root_directory(ctx) + else: + root_path = JakAndDaxterWorld.settings.root_directory + + # Always trust your instincts... the user may not have entered their root_directory properly. + # We don't have to do this check if the root directory was auto-detected. + if "/" not in root_path: + msg = (f"The ArchipelaGOAL root directory contains no path. (Are you missing forward slashes?)\n" + f"Please check your host.yaml file.\n" + f"Verify the value of 'jakanddaxter_options > root_directory' is a valid existing path, " + f"and all backslashes have been replaced with forward slashes.") + ctx.on_log_error(logger, msg) + return + + # Start by checking the existence of the root directory provided in the host.yaml file (or found automatically). + root_path = os.path.normpath(root_path) + if not os.path.exists(root_path): + msg = (f"The ArchipelaGOAL root directory does not exist, unable to locate the Game and Compiler.\n" + f"Please check your host.yaml file.\n" + f"If the value of 'jakanddaxter_options > auto_detect_root_directory' is true, verify that OpenGOAL " + f"is installed properly.\n" + f"If it is false, check the value of 'jakanddaxter_options > root_directory'. " + f"Verify it is a valid existing path, and all backslashes have been replaced with forward slashes.") + ctx.on_log_error(logger, msg) + return + + # Now double-check the existence of the two executables we need. + gk_path = os.path.join(root_path, "gk.exe") + goalc_path = os.path.join(root_path, "goalc.exe") + if not os.path.exists(gk_path) or not os.path.exists(goalc_path): + msg = (f"The Game and Compiler could not be found in the ArchipelaGOAL root directory.\n" + f"Please check your host.yaml file.\n" + f"If the value of 'jakanddaxter_options > auto_detect_root_directory' is true, verify that OpenGOAL " + f"is installed properly.\n" + f"If it is false, check the value of 'jakanddaxter_options > root_directory'. " + f"Verify it is a valid existing path, and all backslashes have been replaced with forward slashes.") + ctx.on_log_error(logger, msg) + return + + # Now we can FINALLY attempt to start the programs. + if not gk_running: + # Per-mod saves and settings are stored outside the ArchipelaGOAL root folder, so we have to traverse + # a relative path, normalize it, and pass it in as an argument to gk. This folder will be created if + # it does not exist. + config_relative_path = "../_settings/archipelagoal" + config_path = os.path.normpath( + os.path.join( + root_path, + os.path.normpath(config_relative_path))) + + # The game freezes if text is inadvertently selected in the stdout/stderr data streams. Let's pipe those + # streams to a file, and let's not clutter the screen with another console window. + timestamp = datetime.now().strftime("%Y_%m_%d_%H_%M_%S") + log_path = os.path.join(Utils.user_path("logs"), f"JakAndDaxterGame_{timestamp}.txt") + log_path = os.path.normpath(log_path) + with open(log_path, "w") as log_file: + gk_process = subprocess.Popen( + [gk_path, "--game", "jak1", + "--config-path", config_path, + "--", "-v", "-boot", "-fakeiso", "-debug"], + stdout=log_file, + stderr=log_file, + creationflags=subprocess.CREATE_NO_WINDOW) + + if not goalc_running: + # For the OpenGOAL Compiler, the existence of the "data" subfolder indicates you are running it from + # a built package. This subfolder is treated as its proj_path. + proj_path = os.path.join(root_path, "data") + if os.path.exists(proj_path): + + # Look for "iso_data" path to automate away an oft-forgotten manual step of mod updates. + # All relative paths should start from root_path and end with "jak1". + goalc_args = [] + possible_relative_paths = { + "../../../../../active/jak1/data/iso_data/jak1", + "./data/iso_data/jak1", + } + + for iso_relative_path in possible_relative_paths: + iso_path = os.path.normpath( + os.path.join( + root_path, + os.path.normpath(iso_relative_path))) + + if os.path.exists(iso_path): + goalc_args = [goalc_path, "--game", "jak1", "--proj-path", proj_path, "--iso-path", iso_path] + logger.debug(f"iso_data folder found: {iso_path}") + break + else: + logger.debug(f"iso_data folder not found, continuing: {iso_path}") + + if not goalc_args: + msg = (f"The iso_data folder could not be found.\n" + f"Please follow these steps:\n" + f" Run the OpenGOAL Launcher, click Jak and Daxter > Advanced > Open Game Data Folder.\n" + f" Copy the iso_data folder from this location.\n" + f" Click Jak and Daxter > Features > Mods > ArchipelaGOAL > Advanced > " + f"Open Game Data Folder.\n" + f" Paste the iso_data folder in this location.\n" + f" Click Advanced > Compile. When this is done, click Continue.\n" + f" Close all launchers, games, clients, and console windows, then restart Archipelago.\n" + f"(See Setup Guide for more details.)") + ctx.on_log_error(logger, msg) + return + + # The non-existence of the "data" subfolder indicates you are running it from source, as a developer. + # The compiler will traverse upward to find the project path on its own. It will also assume your + # "iso_data" folder is at the root of your repository. Therefore, we don't need any of those arguments. + else: + goalc_args = [goalc_path, "--game", "jak1"] + + # This needs to be a new console. The REPL console cannot share a window with any other process. + goalc_process = subprocess.Popen(goalc_args, creationflags=subprocess.CREATE_NEW_CONSOLE) + + except AttributeError as e: + if " " in e.args[0]: + # YAML keys in Host.yaml ought to contain no spaces, which means this is a much more important error. + ctx.on_log_error(logger, e.args[0]) + else: + ctx.on_log_error(logger, + f"Host.yaml does not contain {e.args[0]}, unable to locate game executables.") + return + except FileNotFoundError as e: + msg = (f"The following path could not be found: {e.filename}\n" + f"Please check your host.yaml file.\n" + f"If the value of 'jakanddaxter_options > auto_detect_root_directory' is true, verify that OpenGOAL " + f"is installed properly.\n" + f"If it is false, check the value of 'jakanddaxter_options > root_directory'." + f"Verify it is a valid existing path, and all backslashes have been replaced with forward slashes.") + ctx.on_log_error(logger, msg) + return + + # Auto connect the repl and memr agents. Sleep 5 because goalc takes just a little bit of time to load, + # and it's not something we can await. + ctx.on_log_info(logger, "This may take a bit... Wait for the game's title sequence before continuing!") + await asyncio.sleep(5) + ctx.repl.initiated_connect = True + ctx.memr.initiated_connect = True + + +async def main(): + Utils.init_logging("JakAndDaxterClient", exception_logger="Client") + + ctx = JakAndDaxterContext(None, None) + ctx.server_task = asyncio.create_task(server_loop(ctx), name="server loop") + ctx.repl_task = create_task_log_exception(ctx.run_repl_loop()) + ctx.memr_task = create_task_log_exception(ctx.run_memr_loop()) + + if gui_enabled: + ctx.run_gui() + ctx.run_cli() + + # Find and run the game (gk) and compiler/repl (goalc). + create_task_log_exception(run_game(ctx)) + await ctx.exit_event.wait() + await ctx.shutdown() + + +def launch(): + # use colorama to display colored text highlighting + colorama.just_fix_windows_console() + asyncio.run(main()) + colorama.deinit() diff --git a/worlds/jakanddaxter/docs/en_Jak and Daxter The Precursor Legacy.md b/worlds/jakanddaxter/docs/en_Jak and Daxter The Precursor Legacy.md new file mode 100644 index 0000000000..77fbd514cb --- /dev/null +++ b/worlds/jakanddaxter/docs/en_Jak and Daxter The Precursor Legacy.md @@ -0,0 +1,261 @@ +# Jak And Daxter (ArchipelaGOAL) + +## FAQ +- [Where is the Options page?](#where-is-the-options-page) +- [What does randomization do to this game?](#what-does-randomization-do-to-this-game) +- [What are the Special Checks and how do I check them?](#what-are-the-special-checks-and-how-do-i-check-them) +- [What are the Special Items and what do they unlock?](#what-are-the-special-items-and-what-do-they-unlock) +- [How do I know which Special Items I have?](#how-do-i-know-which-special-items-i-have) +- [What is the goal of the game once randomized?](#what-is-the-goal-of-the-game-once-randomized) +- [What happens when I pick up or receive a Power Cell?](#what-happens-when-i-pick-up-or-receive-a-power-cell) +- [What happens when I pick up or receive a Scout Fly?](#what-happens-when-i-pick-up-or-receive-a-scout-fly) +- [How do I check the 'Free 7 Scout Flies' Power Cell?](#how-do-i-check-the-free-7-scout-flies-power-cell) +- [What does Death Link do?](#what-does-death-link-do) +- [What does Move Randomizer do?](#what-does-move-randomizer-do) +- [What are the movement options in Move Randomizer?](#what-are-the-movement-options-in-move-randomizer) +- [How do I know which moves I have?](#how-do-i-know-which-moves-i-have) +- [What does Orbsanity do?](#what-does-orbsanity-do) +- [What do Traps do?](#what-do-traps-do) +- [What kind of Traps are there?](#what-kind-of-traps-are-there) +- [I got soft-locked and cannot leave, how do I get out of here?](#i-got-soft-locked-and-cannot-leave-how-do-i-get-out-of-here) +- [How do I generate seeds with 1 Orb Orbsanity and other extreme options?](#how-do-i-generate-seeds-with-1-orb-orbsanity-and-other-extreme-options) +- [How do I check my player options in-game?](#how-do-i-check-my-player-options-in-game) +- [How does the HUD work?](#how-does-the-hud-work) +- [I think I found a bug, where should I report it?](#i-think-i-found-a-bug-where-should-i-report-it) + +## Where is the options page + +The [Player Options Page](../player-options) for this game contains all the options you need to configure and export +a config file. + +At this time, there are several caveats and restrictions: +- Power Cells and Scout Flies are **always** randomized. +- **All** the traders in the game become in-logic checks **if and only if** you have enough Orbs to pay all of them at once. + - This is to prevent hard locks, where an item required for progression is locked behind a trade you can't afford because you spent the orbs elsewhere. + - By default, that total is 1530. + +## What does randomization do to this game +The game now contains the following Location checks: +- All 101 Power Cells +- All 112 Scout Flies +- All 14 Orb Caches (collect every orb in the cache and let it close) + +These may contain Items for different games, as well as different Items from within Jak and Daxter. +Additionally, several special checks and corresponding items have been added that are required to complete the game. + +## What are the special checks and how do I check them +| Check Name | How To Check | +|------------------------|------------------------------------------------------------------------------| +| Fisherman's Boat | Complete the fishing minigame in Forbidden Jungle | +| Jungle Elevator | Collect the power cell at the top of the temple in Forbidden Jungle | +| Blue Eco Switch | Collect the power cell on the blue vent switch in Forbidden Jungle | +| Flut Flut | Push the egg off the cliff in Sentinel Beach and talk to the bird lady | +| Warrior's Pontoons | Talk to the Warrior in Rock Village once (you do NOT have to trade with him) | +| Snowy Mountain Gondola | Approach the gondola in Volcanic Crater | +| Yellow Eco Switch | Collect the power cell on the yellow vent switch in Snowy Mountain | +| Snowy Fort Gate | Ride the Flut Flut in Snowy Mountain and press the fort gate switch | +| Freed The Blue Sage | Free the Blue Sage in Gol and Maia's Citadel | +| Freed The Red Sage | Free the Red Sage in Gol and Maia's Citadel | +| Freed The Yellow Sage | Free the Yellow Sage in Gol and Maia's Citadel | +| Freed The Green Sage | Free the Green Sage in Gol and Maia's Citadel | + +## What are the special items and what do they unlock +| Item Name | What it Unlocks | +|--------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| +| Fisherman's Boat | Misty Island | +| Jungle Elevator | The blue vent switch inside the temple in Forbidden Jungle | +| Blue Eco Switch | The plant boss inside the temple in Forbidden Jungle
The cannon tower in Sentinel Beach | +| Flut Flut | The upper platforms in Boggy Swamp
The fort gate switch in Snowy Mountain | +| Warrior's Pontoons | Boggy Swamp and Mountain Pass | +| Snowy Mountain Gondola | Snowy Mountain | +| Yellow Eco Switch | The frozen box in Snowy Mountain
The shortcut in Mountain Pass | +| Snowy Fort Gate | The fort in Snowy Mountain | +| Freed The Blue Sage
Freed The Red Sage
Freed The Yellow Sage | The final staircase in Gol and Maia's Citadel | +| Freed The Green Sage | The final elevator in Gol and Maia's Citadel | + +## How do I know which special items I have +Open the game's menu, navigate to `Options`, then `Archipelago Options`, then `Item Tracker`. +This will show you a list of all the special items in the game, ones not normally tracked as power cells or scout flies. +Gray items indicate you do not possess that item, light blue items indicate you possess that item. + +## What is the goal of the game once randomized +By default, to complete the game you must defeat the Gol and Maia and stop them from opening the Dark Eco silo. In order +to reach them, you will need at least 72 Power Cells to cross the Lava Tube, as well as the four special items for +freeing the Red, Blue, Yellow, and Green Sages. + +Alternatively, you can choose from a handful of other completion conditions like defeating a particular boss, crossing +a particular connector level, or opening the 100 Power Cell door after defeating the final boss. You can also customize +the thresholds for connector levels and orb trades. These options allow you to tailor the expected length and difficulty +of your run as you see fit. + +## What happens when I pick up or receive a power cell +When you pick up a power cell, Jak and Daxter will perform their victory animation. Your power cell count will +NOT change. The pause menu will say "Task Completed" below the picked-up Power Cell. If your power cell was related +to one of the special checks listed above, you will automatically check that location as well - a 2 for 1 deal! +Finally, your text client will inform you what you found and who it belongs to. + +When you receive a power cell, your power cell count will tick up by 1. Gameplay will otherwise continue as normal. +Finally, your text client will inform you where you received the power cell from. + +## What happens when I pick up or receive a scout fly +When you pick up a scout fly, your scout fly count will NOT change. The pause menu will show you the number of +scout flies you picked up per-region, and this number will have ticked up by 1 for the region that scout fly belongs to. +Finally, your text client will inform you what you found and who it belongs to. + +When you receive a scout fly, your total scout fly count will tick up by 1. The pause menu will show you the number of +scout flies you received per-region, and this number will have ticked up by 1 for the region that scout fly belongs to. +Finally, your text client will inform you where you received the scout fly from, and which one it is. + +## How do I check the Free 7 Scout Flies power cell +You will automatically check this power cell when you _receive_ your 7th scout fly, NOT when you _pick up_ your 7th +scout fly. So in short: + +- When you _pick up_ your 7th fly, the normal rules apply. +- When you _receive_ your 7th fly, 2 things will happen in quick succession. + - First, you will receive that scout fly, as normal. + - Second, you will immediately complete the "Free 7 Scout Flies" check, which will send out another item. + +## What does Death Link do +If you enable Death Link, all the other players in your Multiworld who also have it enabled will be linked by death. +That means when Jak dies in your game, the players in with Death Link also die. Likewise, if any of the other +players with Death Link die, Jak will also die in a random, possibly spectacular fashion. + +You can turn off Death Link at any time in the game by opening the game's menu and navigating to `Options`, +then `Archipelago Options`, then `Deathlink`. + +## What does Move Randomizer do +If you enable Move Randomizer, most of Jak's movement set will be added to the randomized item pool, and you will need +to receive the move in order to use it (i.e. you must find it, or another player must send it to you). Some moves have +prerequisite moves that you must also have in order to use them (e.g. Crouch Jump is dependent on Crouch). Jak will only +be able to run, swim (including underwater), perform single jumps, and shoot yellow eco from his goggles ("firing from +the hip" requires Punch). Note that Flut Flut and the Zoomer will have access to their full movement sets at all times. + +You can turn off Move Rando at any time in the game by opening the game's menu, navigate to `Options`, +then `Archipelago Options`, then `Move Randomizer`. This will give you access to the full movement set again. + +## What are the movement options in Move Randomizer +| Move Name | Prerequisite Moves | +|-----------------|--------------------| +| Crouch | | +| Crouch Jump | Crouch | +| Crouch Uppercut | Crouch | +| Roll | | +| Roll Jump | Roll | +| Double Jump | | +| Jump Dive | | +| Jump Kick | | +| Punch | | +| Punch Uppercut | Punch | +| Kick | | + +## How do I know which moves I have +Open the game's menu, navigate to `Options`, then `Archipelago Options`, then `Move Tracker`. +This will show you a list of all the moves in the game. +- Gray items indicate you do not possess that move. +- Yellow items indicate you possess that move, but you are missing its prerequisites. +- Light blue items indicate you possess that move, as well as its prerequisites. + +## What does Orbsanity do +If you enable Orbsanity, bundles of Precursor Orbs will be turned into checks. Every time you collect the chosen number +of orbs, i.e. a "bundle," you will trigger another check. Likewise, the orbs will be added to the random item pool. +There are several options to change the difficulty of this challenge. + +- "Per Level" Orbsanity means the bundles are for each level in the game. (Geyser Rock, Sandover Village, etc.) +- "Global" Orbsanity means orbs collected from any level count toward the next bundle. +- The options with "Bundle Size" in the name indicate how many orbs are in a bundle. This adds a number of Items + and Locations to the pool inversely proportional to the size of the bundle. + - For example, if your bundle size is 20 orbs, you will add 100 items to the pool. If your bundle size is 250 orbs, + you will add 8 items to the pool. + +## What do Traps do +When creating your player YAML, you can choose to replace some of the game's extraneous Power Cells and Precursor Orbs +with traps. You can choose which traps you want to generate in your seed and how long they last. A random assortment +will then be chosen to populate the item pool. + +When you receive one, you will hear a buzzer and some kind of negative effect will occur in game. These effects may be +challenging, maddening, or entertaining. When the trap duration ends, the game should return to its previous state. +Multiple traps can be active at the same time, and they may interact with each other in strange ways. If they become +too frustrating, you can lower their duration by navigating to `Options`, then `Archipelago Options`, then +`Seed Options`, then `Trap Duration`. Lowering this number to zero will disable traps entirely. + +## What kind of Traps are there +| Trap Name | Effect | +|-----------------|--------------------------------------------------------------------------------| +| Trip Trap | Jak trips and falls | +| Slippery Trap | The world gains the physical properties of Snowy Mountain's ice lake | +| Gravity Trap | Jak falls to the ground faster and takes fall damage more easily | +| Camera Trap | The camera remains fixed in place no matter how far away Jak moves | +| Darkness Trap | The world gains the lighting properties of Dark Cave | +| Earthquake Trap | The world and camera shake | +| Teleport Trap | Jak immediately teleports to Samos's Hut | +| Despair Trap | The Warrior sobs profusely | +| Pacifism Trap | Jak's attacks have no effect on enemies, crates, or buttons | +| Ecoless Trap | Jak's eco is drained and he cannot collect new eco | +| Health Trap | Jak's health is set to 0 - not dead yet, but he will die to any attack or bonk | +| Ledge Trap | Jak cannot grab onto ledges | +| Zoomer Trap | Jak mounts an invisible zoomer (model loads properly depending on level) | +| Mirror Trap | The world is mirrored | + +## I got soft-locked and cannot leave how do I get out of here +Open the game's menu, navigate to `Options`, then `Archipelago Options`, then `Warp To Home`. +Selecting this option will ask if you want to be teleported to Geyser Rock. From there, you can teleport back +to the nearest sage's hut to continue your journey. + +## How do I generate seeds with 1 orb orbsanity and other extreme options? +Depending on your player YAML, Jak and Daxter can have a lot of items, which can sometimes be overwhelming or +disruptive to multiworld games. There are also options that are mutually incompatible with each other, even in a solo +game. To prevent the game from disrupting multiworlds, or generating an impossible solo seed, some options have +"friendly limits" that prevent you from choosing more extreme values. + +You can override **some**, not all, of those limits by editing the `host.yaml`. In the Archipelago Launcher, click +`Open host.yaml`, then search for `jakanddaxter_options`, then search for `enforce_friendly_options`, then change this +value from `true` to `false`. You can then generate a seed locally, and upload that to the Archipelago website to host +for you (or host it yourself). + +**Remember:** disabling this setting allows for more disruptive and challenging options, but it may cause seed +generation to fail. **Use at your own risk!** + +## How do I check my player options in-game +When you connect your text client to the Archipelago Server, the server will tell the game what options were chosen +for this seed, and the game will apply those settings automatically. + +You can verify these options by navigating to `Options`, then `Archipelago Options`, then `Seed Options`. **You can open +each option to verify them, but you should NOT alter them during a run.** This may cause you to miss important +progression items and prevent you (and others) from completing the run. + +## How does the HUD work +The game's normal HUD shows you how many power cells, precursor orbs, and scout flies you currently have. But if you +hold `L2 or R2` and press a direction on the D-Pad, the HUD will show you alternate modes. Here is how the HUD works: + +| HUD Mode | Button Combo | What the HUD Shows | Text Messages | +|---------------|------------------------------|-----------------------------------|---------------------------------------| +| Per-Level | `L2 or R2` + `Down` | Locations Checked (in this level) | `SENT {Other Item} TO {Other Player}` | +| Global | `L2 or R2` + `Up` | Locations Checked (in the game) | `GOT {Your Item} FROM {Other Player}` | +| Normal | `L2 or R2` + `Left or Right` | Items Received | Both Sent and Got Messages | +| | | | | +| (In Any Mode) | | (If you sent an Item to Yourself) | `FOUND {Your Item}` | + +In all modes, the last 3 sent/received items and the player who sent/received it will be displayed in the +bottom left corner. This will help you quickly reference information about newly received or sent items. Items in blue +are Progression (or non-Jak items), in green are Filler, and in red are Traps. You can turn this off by navigating +to `Options`, then `Archipelago Options`, then set `Item Messages` to `Off`. + +## I think I found a bug where should I report it +Depending on the nature of the bug, there are a couple of different options. + +* If you found a logical error in the randomizer, please create a new Issue +[here](https://github.com/ArchipelaGOAL/Archipelago/issues). Use this page if: + * An item required for progression is unreachable. + * The randomizer did not respect one of the Options you chose. + * You see a mistake, typo, etc. on this webpage. + * You see an error or stack trace appear on the text client. + +* If you encountered an error in OpenGOAL, please create a new Issue +[here](https://github.com/ArchipelaGOAL/ArchipelaGOAL/issues). Use this page if: + * You encounter a crash, freeze, reset, etc. in the game. + * You fail to send Items you find in the game to the Archipelago server. + * You fail to receive Items the server sends to you. + * Your game disconnects from the server and cannot reconnect. + * You go looking for a game item that has already disappeared before you could reach it. + +* Please upload your config file, spoiler log file, and any other generated logs in the Issue, so we can troubleshoot the problem. \ No newline at end of file diff --git a/worlds/jakanddaxter/docs/setup_en.md b/worlds/jakanddaxter/docs/setup_en.md new file mode 100644 index 0000000000..9cd892a9b2 --- /dev/null +++ b/worlds/jakanddaxter/docs/setup_en.md @@ -0,0 +1,181 @@ +# Jak And Daxter (ArchipelaGOAL) Setup Guide + +## Required Software + +- A legally purchased copy of *Jak And Daxter: The Precursor Legacy.* +- [The OpenGOAL Launcher](https://opengoal.dev/) + +At this time, this method of setup works on Windows only, but Linux support is a strong likelihood in the near future as OpenGOAL itself supports Linux. + +## Installation via OpenGOAL Launcher + +**You must set up a vanilla installation of Jak and Daxter before you can install mods for it.** + +- Follow the installation process for the official OpenGOAL Launcher. See [here](https://opengoal.dev/docs/usage/installation). +- Follow the setup process for adding mods to the OpenGOAL Launcher. See [here](https://jakmods.dev/). +- Run the OpenGOAL Launcher (if you had it open before, close it and reopen it). +- Click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`. +- Under `Available Mods`, click `ArchipelaGOAL`. The mod should begin installing. When it is done, click `Continue` in the bottom right corner. +- **DO NOT PLAY AN ARCHIPELAGO GAME THROUGH THE OPENGOAL LAUNCHER.** The Archipelago Client should handle everything for you. + +### For NTSC versions of the game, follow these steps. + +- Run the OpenGOAL Launcher (if you had it open before, close it and reopen it). +- Click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`, then under `Installed Mods`, click `ArchipelaGOAL`. +- In the bottom right corner, click `Advanced`, then click `Compile`. + +### For PAL versions of the game, follow these steps. + +PAL versions of the game seem to require additional troubleshooting/setup in order to work properly. +Below are some instructions that may help. +If you see `-- Compilation Error! --` after pressing `Compile` or Launching the ArchipelaGOAL mod, try these steps. + +- Remove these folders if you have them: + - `/iso_data` + - `/iso_data` + - `/data/iso_data` +- Place your Jak1 ISO in `` and rename it to `JakAndDaxter.iso` +- Type `cmd` in Windows search, right click `Command Prompt`, and pick `Run as Administrator` +- Run `cd ` +- Then run `.\extractor.exe --extract --extract-path .\data\iso_data "JakAndDaxter.iso"` + - This command should end by saying `Uses Decompiler Config Version - ntsc_v1` or `... - pal`. Take note of this message. +- If you saw `ntsc_v1`: + - In cmd, run `.\decompiler.exe data\decompiler\config\jak1\jak1_config.jsonc --version "ntsc_v1" data\iso_data data\decompiler_out` +- If you saw `pal`: + - Rename `\data\iso_data\jak1` to `jak1_pal` + - Back in cmd, run `.\decompiler.exe data\decompiler\config\jak1\jak1_config.jsonc --version "pal" data\iso_data data\decompiler_out` + - Rename `\data\iso_data\jak1_pal` back to `jak1` + - Rename `\data\decompiler_out\jak1_pal` back to `jak1` +- Open a **brand new** console window and launch the compiler: + - `cd ` + - `.\goalc.exe --user-auto --game jak1` + - From the compiler (in the same window): `(mi)`. This should compile the game. **Note that the parentheses are important.** + - **Don't close this first terminal, you will need it at the end.** +- Then, open **another brand new** console window and execute the game: + - `cd ` + - `.\gk.exe -v --game jak1 -- -boot -fakeiso -debug` +- Finally, **from the first console still in the GOALC compiler**, connect to the game: `(lt)`. + +## Updates and New Releases via OpenGOAL Launcher + +If you are in the middle of an async game, and you do not want to update the mod, you do not need to do this step. The mod will only update when you tell it to. + +- Run the OpenGOAL Launcher (if you had it open before, close it and reopen it). +- Click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`, then under `Installed Mods`, click `ArchipelaGOAL`. +- Click `Update` to download and install any new updates that have been released. +- You can verify your version by clicking `Versions`. The version you are using will say `(Active)` next to it. +- **Then you must click `Advanced`, then click `Compile` to make the update take effect.** + +## Starting a Game + +### New Game + +- Run the Archipelago Launcher. +- From the client list, find and click `Jak and Daxter Client`. +- 3 new windows should appear: + - The OpenGOAL compiler will launch and compile the game. They should take about 30 seconds to compile. + - You should hear a musical cue to indicate the compilation was a success. If you do not, see the Troubleshooting section. + - You can **MINIMIZE** the Compiler window, **BUT DO NOT CLOSE IT.** It is required for Archipelago and the game to communicate with each other. + - The game window itself will launch, and Jak will be standing outside Samos's Hut. + - Once compilation is complete, the title sequence will start. + - Finally, the Archipelago text client will open. + - If you see **BOTH** `The REPL is ready!` and `The Memory Reader is ready!` then that should indicate a successful startup. If you do not, see the Troubleshooting section. +- Once you see `CONNECT TO ARCHIPELAGO NOW` on the title screen, use the text client to connect to the Archipelago server. This will communicate your current settings and slot info to the game. +- If you see `RECEIVING ITEMS, PLEASE WAIT...`, the game is busy receiving items from your starting inventory, assuming you have some. +- Once you see `READY! PRESS START TO CONTINUE` on the title screen, you can press Start. +- Choose `New Game`, choose a save file, and play through the opening cutscenes. +- Once you reach Geyser Rock, the game has begun! + - You can leave Geyser Rock immediately if you so choose - just step on the warp gate button. + +### Returning / Async Game +The same steps as New Game apply, with some exceptions: + +- Once you reach the title screen, connect to the Archipelago server **BEFORE** you load your save file. + - This is to allow AP to give the game your current settings and all the items you had previously. + - **THESE SETTINGS AFFECT LOADING AND SAVING OF SAVE FILES, SO IT IS IMPORTANT TO DO THIS FIRST.** +- Once you see `READY! PRESS START TO CONTINUE` on the title screen, you can press Start. +- Instead of choosing `New Game` in the title menu, choose `Load Game`, then choose the save file **THAT HAS YOUR CURRENT SLOT NAME.** + - To help you find the correct save file, highlighting a save will show you that save's slot name and the first 8 digits of the multiworld seed number. + +## Troubleshooting + +### The Text Client Says "Unable to locate the OpenGOAL install directory" + +Normally, the Archipelago client should be able to find your OpenGOAL installation automatically. + +If it cannot, you may have to tell it yourself. Follow these instructions. + +- Run the OpenGOAL Launcher (if you had it open before, close it and reopen it). +- Click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`, then under `Installed Mods`, click `ArchipelaGOAL`. +- Click `Advanced` in the bottom right corner, then click `Open Game Data Folder`. You should see a new File Explorer open to that directory. +- In the File Explorer, go to the parent directory called `archipelagoal`, and you should see the `gk.exe` and `goalc.exe` executables. Copy this path. +- Run the Archipelago Launcher, then click on `Open host.yaml`. You should see a new text editor open that file. +- Search for `jakanddaxter_options`, and you will need to make 2 changes here. +- First, find the `root_directory` entry. Paste the path you noted earlier (the one containing gk.exe and goalc.exe) inside the double quotes. +- **MAKE SURE YOU CHANGE ALL BACKSLASHES `\ ` TO FORWARD SLASHES `/`.** + +```yaml + root_directory: "%programfiles%/OpenGOAL-Launcher/features/jak1/mods/JakMods/archipelagoal" +``` + +- Second, find the `root_directory` entry. Change this to `false`. You do not need to use double quotes. + +```yaml + auto_detect_root_directory: true +``` + +- Save the file and close it. + +### The Game Fails To Load The Title Screen + +You may start the game via the Text Client, but it never loads in the title screen. Check the Compiler window: you may see red and yellow errors like this. + +``` +-- Compilation Error! -- +``` + +If this happens, follow these instructions. If you are using a PAL version of the game, you should skip these instructions and follow the `Special PAL Instructions` above. + +- Run the OpenGOAL Launcher (if you had it open before, close it and reopen it). +- Click the Jak and Daxter logo on the left sidebar, then click `Advanced`, then click `Open Game Data Folder`. Copy the `iso_data` folder from this directory. +- Back in the OpenGOAL Launcher, click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`, then under `Installed Mods`, click `ArchipelaGOAL`. +- In the bottom right corner, click `Advanced`, then click `Open Game Data Folder`. +- Paste the `iso_data` folder you copied earlier. +- Back in the OpenGOAL Launcher, click the Jak and Daxter logo on the left sidebar. +- Click `Features` in the bottom right corner, then click `Mods`, then under `Installed Mods`, click `ArchipelaGOAL`. +- In the bottom right corner, click `Advanced`, then click `Compile`. + +### The Text Client Says "Error reading game memory!" or "Error sending data to compiler" + +If at any point the text client says this, you will need to restart the **all** of these applications. + +- Close all open windows: the client, the compiler, and the game. +- Run the OpenGOAL Launcher, then click `Features`, then click `Mods`, then click `ArchipelaGOAL`. +- Click `Advanced`, then click `Play in Debug Mode`. +- Click `Advanced`, then click `Open REPL`. +- Then close and reopen the Jak and Daxter Client from the Archipelago Launcher. +- Once these are done, you can enter `/repl status` and `/memr status` in the text client to verify. + +### The Client Cannot Open A REPL Connection + +If the client cannot open a REPL connection to the game, you may need to check the following steps: + +- Ensure you are not hosting anything on ports `8181` and `8112`. Those are for the REPL (goalc) and the game (gk) respectively. +- Ensure that Windows Defender and Windows Firewall are not blocking those programs from hosting or listening on those ports. +- You can use Windows Resource Monitor to verify those ports are open when the programs are running. +- Ensure that you only opened those ports for your local network, not the wider internet. + +## Known Issues + +- The game needs to boot in debug mode in order to allow the compiler to connect to it. **Clicking "Play" on the mod page in the OpenGOAL Launcher will not work.** +- The Compiler console window is orphaned once you close the game - you will have to kill it manually when you stop playing. +- The console windows cannot be run as background processes due to how the REPL works, so the best we can do is minimize them. +- Orbsanity checks may show up out of order in the text client. +- Large item releases may take up to several minutes for the game to process them all. Item Messages will usually take longer to appear than Items themselves. +- In Lost Precursor City, if you die in the Color Platforms room, the game may crash after you respawn. The cause is unknown. +- Darkness Trap may cause some visual glitches on certain levels. This is temporary, and terrain and object collision are unaffected. diff --git a/worlds/jakanddaxter/game_id.py b/worlds/jakanddaxter/game_id.py new file mode 100644 index 0000000000..d596a6cc82 --- /dev/null +++ b/worlds/jakanddaxter/game_id.py @@ -0,0 +1,8 @@ +# All Jak And Daxter Archipelago IDs must be offset by this number. +jak1_id = 741000000 + +# This is maximum ID we will allow. +jak1_max = jak1_id + 999999 + +# The name of the game. +jak1_name = "Jak and Daxter: The Precursor Legacy" diff --git a/worlds/jakanddaxter/icons/precursor_orb.ico b/worlds/jakanddaxter/icons/precursor_orb.ico new file mode 100644 index 0000000000..f0cd1a0eec Binary files /dev/null and b/worlds/jakanddaxter/icons/precursor_orb.ico differ diff --git a/worlds/jakanddaxter/icons/precursor_orb.png b/worlds/jakanddaxter/icons/precursor_orb.png new file mode 100644 index 0000000000..8089170e2f Binary files /dev/null and b/worlds/jakanddaxter/icons/precursor_orb.png differ diff --git a/worlds/jakanddaxter/items.py b/worlds/jakanddaxter/items.py new file mode 100644 index 0000000000..e15f28ae32 --- /dev/null +++ b/worlds/jakanddaxter/items.py @@ -0,0 +1,156 @@ +from enum import IntEnum +from BaseClasses import Item, ItemClassification +from .game_id import jak1_name, jak1_max +from .locs import (orb_locations as orbs, + cell_locations as cells, + scout_locations as scouts, + special_locations as specials, + orb_cache_locations as caches) + + +class OrbAssoc(IntEnum): + """ + Identifies an item's association to unlocking new sources of Precursor Orbs. For example, Double Jump will unlock + new orbs, but Freed the Green Sage will not. Power Cells conditionally unlock new orbs if they get you across + connector levels. + """ + NEVER_UNLOCKS_ORBS = 0 + ALWAYS_UNLOCKS_ORBS = 1 + IS_POWER_CELL = 2 + + +class JakAndDaxterItem(Item): + game: str = jak1_name + orb_assoc: OrbAssoc + orb_amount: int # Only non-zero for Orb Bundle items. + + def __init__(self, name: str, + classification: ItemClassification, + code: int | None, + player: int, + orb_assoc: OrbAssoc = OrbAssoc.NEVER_UNLOCKS_ORBS, + orb_amount: int = 0): + super().__init__(name, classification, code, player) + self.orb_assoc = orb_assoc + self.orb_amount = orb_amount + + +# Power Cells are generic, fungible, interchangeable items. Every cell is indistinguishable from every other. +cell_item_table = { + 0: "Power Cell", +} + +# Scout flies are interchangeable within their respective sets of 7. Notice the level name after each item. +# Also, notice that their Item ID equals their respective Power Cell's Location ID. This is necessary for +# game<->archipelago communication. +scout_item_table = { + 95: "Scout Fly - Geyser Rock", + 75: "Scout Fly - Sandover Village", + 7: "Scout Fly - Forbidden Jungle", + 20: "Scout Fly - Sentinel Beach", + 28: "Scout Fly - Misty Island", + 68: "Scout Fly - Fire Canyon", + 76: "Scout Fly - Rock Village", + 57: "Scout Fly - Precursor Basin", + 49: "Scout Fly - Lost Precursor City", + 43: "Scout Fly - Boggy Swamp", + 88: "Scout Fly - Mountain Pass", + 77: "Scout Fly - Volcanic Crater", + 85: "Scout Fly - Spider Cave", + 65: "Scout Fly - Snowy Mountain", + 90: "Scout Fly - Lava Tube", + 91: "Scout Fly - Citadel", # Had to shorten, it was >32 characters. +} + +# Orbs are also generic and interchangeable. +# These items are only used by Orbsanity, and only one of these +# items will be used corresponding to the chosen bundle size. +orb_item_table = { + 1: "1 Precursor Orb", + 2: "2 Precursor Orbs", + 4: "4 Precursor Orbs", + 5: "5 Precursor Orbs", + 8: "8 Precursor Orbs", + 10: "10 Precursor Orbs", + 16: "16 Precursor Orbs", + 20: "20 Precursor Orbs", + 25: "25 Precursor Orbs", + 40: "40 Precursor Orbs", + 50: "50 Precursor Orbs", + 80: "80 Precursor Orbs", + 100: "100 Precursor Orbs", + 125: "125 Precursor Orbs", + 200: "200 Precursor Orbs", + 250: "250 Precursor Orbs", + 400: "400 Precursor Orbs", + 500: "500 Precursor Orbs", + 1000: "1000 Precursor Orbs", + 2000: "2000 Precursor Orbs", +} + +# These are special items representing unique unlocks in the world. Notice that their Item ID equals their +# respective Location ID. Like scout flies, this is necessary for game<->archipelago communication. +special_item_table = { + 5: "Fisherman's Boat", # Unlocks Misty Island + 4: "Jungle Elevator", # Unlocks the Forbidden Jungle Temple + 2: "Blue Eco Switch", # Unlocks Blue Eco Vents + 17: "Flut Flut", # Unlocks Flut Flut sections in Boggy Swamp and Snowy Mountain + 33: "Warrior's Pontoons", # Unlocks Boggy Swamp and everything post-Rock Village + 105: "Snowy Mountain Gondola", # Unlocks Snowy Mountain + 60: "Yellow Eco Switch", # Unlocks Yellow Eco Vents + 63: "Snowy Fort Gate", # Unlocks the Snowy Mountain Fort + 71: "Freed The Blue Sage", # 1 of 3 unlocks for the final staircase in Citadel + 72: "Freed The Red Sage", # 1 of 3 unlocks for the final staircase in Citadel + 73: "Freed The Yellow Sage", # 1 of 3 unlocks for the final staircase in Citadel + 70: "Freed The Green Sage", # Unlocks the final boss elevator in Citadel +} + +# These are the move items for move randomizer. Notice that their Item ID equals some of the Orb Cache Location ID's. +# This was 100% arbitrary. There's no reason to tie moves to orb caches except that I need a place to put them. ;_; +move_item_table = { + 10344: "Crouch", + 10369: "Crouch Jump", + 11072: "Crouch Uppercut", + 12634: "Roll", + 12635: "Roll Jump", + 10945: "Double Jump", + 14507: "Jump Dive", + 14838: "Jump Kick", + 23348: "Punch", + 23349: "Punch Uppercut", + 23350: "Kick", + # 24038: "Orb Cache at End of Blast Furnace", # Hold onto these ID's for future use. + # 24039: "Orb Cache at End of Launch Pad Room", + # 24040: "Orb Cache at Start of Launch Pad Room", +} + +# These are trap items. Their Item ID is to be subtracted from the base game ID. They do not have corresponding +# game locations because they are intended to replace other items that have been marked as filler. +trap_item_table = { + 1: "Trip Trap", + 2: "Slippery Trap", + 3: "Gravity Trap", + 4: "Camera Trap", + 5: "Darkness Trap", + 6: "Earthquake Trap", + 7: "Teleport Trap", + 8: "Despair Trap", + 9: "Pacifism Trap", + 10: "Ecoless Trap", + 11: "Health Trap", + 12: "Ledge Trap", + 13: "Zoomer Trap", + 14: "Mirror Trap", +} + +# All Items +# While we're here, do all the ID conversions needed. +item_table = { + **{cells.to_ap_id(k): name for k, name in cell_item_table.items()}, + **{scouts.to_ap_id(k): name for k, name in scout_item_table.items()}, + **{specials.to_ap_id(k): name for k, name in special_item_table.items()}, + **{caches.to_ap_id(k): name for k, name in move_item_table.items()}, + **{orbs.to_ap_id(k): name for k, name in orb_item_table.items()}, + **{jak1_max - k: name for k, name in trap_item_table.items()}, + jak1_max: "Green Eco Pill" # Filler item. +} diff --git a/worlds/jakanddaxter/levels.py b/worlds/jakanddaxter/levels.py new file mode 100644 index 0000000000..2deb2d2087 --- /dev/null +++ b/worlds/jakanddaxter/levels.py @@ -0,0 +1,76 @@ +# This contains the list of levels in Jak and Daxter. +# Not to be confused with Regions - there can be multiple Regions in every Level. +level_table = { + "Geyser Rock": { + "level_index": 0, + "orbs": 50 + }, + "Sandover Village": { + "level_index": 1, + "orbs": 50 + }, + "Sentinel Beach": { + "level_index": 2, + "orbs": 150 + }, + "Forbidden Jungle": { + "level_index": 3, + "orbs": 150 + }, + "Misty Island": { + "level_index": 4, + "orbs": 150 + }, + "Fire Canyon": { + "level_index": 5, + "orbs": 50 + }, + "Rock Village": { + "level_index": 6, + "orbs": 50 + }, + "Lost Precursor City": { + "level_index": 7, + "orbs": 200 + }, + "Boggy Swamp": { + "level_index": 8, + "orbs": 200 + }, + "Precursor Basin": { + "level_index": 9, + "orbs": 200 + }, + "Mountain Pass": { + "level_index": 10, + "orbs": 50 + }, + "Volcanic Crater": { + "level_index": 11, + "orbs": 50 + }, + "Snowy Mountain": { + "level_index": 12, + "orbs": 200 + }, + "Spider Cave": { + "level_index": 13, + "orbs": 200 + }, + "Lava Tube": { + "level_index": 14, + "orbs": 50 + }, + "Gol and Maia's Citadel": { + "level_index": 15, + "orbs": 200 + } +} + +level_table_with_global = { + **level_table, + "": { + "level_index": 16, # Global + "orbs": 2000 + } +} diff --git a/worlds/jakanddaxter/locations.py b/worlds/jakanddaxter/locations.py new file mode 100644 index 0000000000..901c9811db --- /dev/null +++ b/worlds/jakanddaxter/locations.py @@ -0,0 +1,66 @@ +from BaseClasses import Location +from .game_id import jak1_name +from .locs import (orb_locations as orbs, + cell_locations as cells, + scout_locations as scouts, + special_locations as specials, + orb_cache_locations as caches) + + +class JakAndDaxterLocation(Location): + game: str = jak1_name + + +# Different tables for location groups. +# Each Item ID == its corresponding Location ID. While we're here, do all the ID conversions needed. +cell_location_table = { + **{cells.to_ap_id(k): name for k, name in cells.loc7SF_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locGR_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locSV_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locFJ_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locSB_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locMI_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locFC_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locRV_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locPB_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locLPC_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locBS_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locMP_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locVC_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locSC_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locSM_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locLT_cellTable.items()}, + **{cells.to_ap_id(k): name for k, name in cells.locGMC_cellTable.items()}, +} + +scout_location_table = { + **{scouts.to_ap_id(k): name for k, name in scouts.locGR_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locSV_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locFJ_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locSB_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locMI_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locFC_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locRV_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locPB_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locLPC_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locBS_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locMP_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locVC_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locSC_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locSM_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locLT_scoutTable.items()}, + **{scouts.to_ap_id(k): name for k, name in scouts.locGMC_scoutTable.items()}, +} + +special_location_table = {specials.to_ap_id(k): name for k, name in specials.loc_specialTable.items()} +cache_location_table = {caches.to_ap_id(k): name for k, name in caches.loc_orbCacheTable.items()} +orb_location_table = {orbs.to_ap_id(k): name for k, name in orbs.loc_orbBundleTable.items()} + +# All Locations +location_table = { + **cell_location_table, + **scout_location_table, + **special_location_table, + **cache_location_table, + **orb_location_table +} diff --git a/worlds/jakanddaxter/locs/__init__.py b/worlds/jakanddaxter/locs/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/jakanddaxter/locs/cell_locations.py b/worlds/jakanddaxter/locs/cell_locations.py new file mode 100644 index 0000000000..62f63e07df --- /dev/null +++ b/worlds/jakanddaxter/locs/cell_locations.py @@ -0,0 +1,194 @@ +from ..game_id import jak1_id + +# Power Cells are given ID's between 0 and 116 by the game. + +# The game tracks all game-tasks as integers. +# 101 of these ID's correspond directly to power cells, but they are not +# necessarily ordered, nor are they the first 101 in the task list. +# The remaining ones are cutscenes and other events. + + +# These helper functions do all the math required to get information about each +# power cell and translate its ID between AP and OpenGOAL. +def to_ap_id(game_id: int) -> int: + if game_id >= jak1_id: + raise ValueError(f"Attempted to convert {game_id} to an AP ID, but it already is one.") + return jak1_id + game_id + + +def to_game_id(ap_id: int) -> int: + if ap_id < jak1_id: + raise ValueError(f"Attempted to convert {ap_id} to a Jak 1 ID, but it already is one.") + return ap_id - jak1_id + + +# The ID's you see below correspond directly to that cell's game-task ID. + +# The "Free 7 Scout Flies" Power Cells will be unlocked separately from their respective levels. +loc7SF_cellTable = { + 95: "GR: Free 7 Scout Flies", + 75: "SV: Free 7 Scout Flies", + 7: "FJ: Free 7 Scout Flies", + 20: "SB: Free 7 Scout Flies", + 28: "MI: Free 7 Scout Flies", + 68: "FC: Free 7 Scout Flies", + 76: "RV: Free 7 Scout Flies", + 57: "PB: Free 7 Scout Flies", + 49: "LPC: Free 7 Scout Flies", + 43: "BS: Free 7 Scout Flies", + 88: "MP: Free 7 Scout Flies", + 77: "VC: Free 7 Scout Flies", + 85: "SC: Free 7 Scout Flies", + 65: "SM: Free 7 Scout Flies", + 90: "LT: Free 7 Scout Flies", + 91: "GMC: Free 7 Scout Flies", +} + +# Geyser Rock +locGR_cellTable = { + 92: "GR: Find The Cell On The Path", + 93: "GR: Open The Precursor Door", + 94: "GR: Climb Up The Cliff", +} + +# Sandover Village +locSV_cellTable = { + 11: "SV: Bring 90 Orbs To The Mayor", + 12: "SV: Bring 90 Orbs to Your Uncle", + 10: "SV: Herd The Yakows Into The Pen", + 13: "SV: Bring 120 Orbs To The Oracle (1)", + 14: "SV: Bring 120 Orbs To The Oracle (2)", +} + +# Forbidden Jungle +locFJ_cellTable = { + 3: "FJ: Connect The Eco Beams", + 4: "FJ: Get To The Top Of The Temple", + 2: "FJ: Find The Blue Vent Switch", + 6: "FJ: Defeat The Dark Eco Plant", + 5: "FJ: Catch 200 Pounds Of Fish", + 8: "FJ: Follow The Canyon To The Sea", + 9: "FJ: Open The Locked Temple Door", +} + +# Sentinel Beach +locSB_cellTable = { + 15: "SB: Unblock The Eco Harvesters", + 17: "SB: Push The Flut Flut Egg Off The Cliff", + 16: "SB: Get The Power Cell From The Pelican", + 18: "SB: Chase The Seagulls", + 19: "SB: Launch Up To The Cannon Tower", + 21: "SB: Explore The Beach", + 22: "SB: Climb The Sentinel", +} + +# Misty Island +locMI_cellTable = { + 23: "MI: Catch The Sculptor's Muse", + 24: "MI: Climb The Lurker Ship", + 26: "MI: Stop The Cannon", + 25: "MI: Return To The Dark Eco Pool", + 27: "MI: Destroy the Balloon Lurkers", + 29: "MI: Use Zoomer To Reach Power Cell", + 30: "MI: Use Blue Eco To Reach Power Cell", +} + +# Fire Canyon +locFC_cellTable = { + 69: "FC: Reach The End Of Fire Canyon", +} + +# Rock Village +locRV_cellTable = { + 31: "RV: Bring 90 Orbs To The Gambler", + 32: "RV: Bring 90 Orbs To The Geologist", + 33: "RV: Bring 90 Orbs To The Warrior", + 34: "RV: Bring 120 Orbs To The Oracle (1)", + 35: "RV: Bring 120 Orbs To The Oracle (2)", +} + +# Precursor Basin +locPB_cellTable = { + 54: "PB: Herd The Moles Into Their Hole", + 53: "PB: Catch The Flying Lurkers", + 52: "PB: Beat Record Time On The Gorge", + 56: "PB: Get The Power Cell Over The Lake", + 55: "PB: Cure Dark Eco Infected Plants", + 58: "PB: Navigate The Purple Precursor Rings", + 59: "PB: Navigate The Blue Precursor Rings", +} + +# Lost Precursor City +locLPC_cellTable = { + 47: "LPC: Raise The Chamber", + 45: "LPC: Follow The Colored Pipes", + 46: "LPC: Reach The Bottom Of The City", + 48: "LPC: Quickly Cross The Dangerous Pool", + 44: "LPC: Match The Platform Colors", + 50: "LPC: Climb The Slide Tube", + 51: "LPC: Reach The Center Of The Complex", +} + +# Boggy Swamp +locBS_cellTable = { + 37: "BS: Ride The Flut Flut", + 36: "BS: Protect Farthy's Snacks", + 38: "BS: Defeat The Lurker Ambush", + 39: "BS: Break The Tethers To The Zeppelin (1)", + 40: "BS: Break The Tethers To The Zeppelin (2)", + 41: "BS: Break The Tethers To The Zeppelin (3)", + 42: "BS: Break The Tethers To The Zeppelin (4)", +} + +# Mountain Pass +locMP_cellTable = { + 86: "MP: Defeat Klaww", + 87: "MP: Reach The End Of The Mountain Pass", + 110: "MP: Find The Hidden Power Cell", +} + +# Volcanic Crater +locVC_cellTable = { + 96: "VC: Bring 90 Orbs To The Miners (1)", + 97: "VC: Bring 90 Orbs To The Miners (2)", + 98: "VC: Bring 90 Orbs To The Miners (3)", + 99: "VC: Bring 90 Orbs To The Miners (4)", + 100: "VC: Bring 120 Orbs To The Oracle (1)", + 101: "VC: Bring 120 Orbs To The Oracle (2)", + 74: "VC: Find The Hidden Power Cell", +} + +# Spider Cave +locSC_cellTable = { + 78: "SC: Use Your Goggles To Shoot The Gnawing Lurkers", + 79: "SC: Destroy The Dark Eco Crystals", + 80: "SC: Explore The Dark Cave", + 81: "SC: Climb The Giant Robot", + 82: "SC: Launch To The Poles", + 83: "SC: Navigate The Spider Tunnel", + 84: "SC: Climb the Precursor Platforms", +} + +# Snowy Mountain +locSM_cellTable = { + 60: "SM: Find The Yellow Vent Switch", + 61: "SM: Stop The 3 Lurker Glacier Troops", + 66: "SM: Deactivate The Precursor Blockers", + 67: "SM: Open The Frozen Crate", + 63: "SM: Open The Lurker Fort Gate", + 62: "SM: Get Through The Lurker Fort", + 64: "SM: Survive The Lurker Infested Cave", +} + +# Lava Tube +locLT_cellTable = { + 89: "LT: Cross The Lava Tube", +} + +# Gol and Maias Citadel +locGMC_cellTable = { + 71: "GMC: Free The Blue Sage", + 72: "GMC: Free The Red Sage", + 73: "GMC: Free The Yellow Sage", + 70: "GMC: Free The Green Sage", +} diff --git a/worlds/jakanddaxter/locs/orb_cache_locations.py b/worlds/jakanddaxter/locs/orb_cache_locations.py new file mode 100644 index 0000000000..b0ed6c1c97 --- /dev/null +++ b/worlds/jakanddaxter/locs/orb_cache_locations.py @@ -0,0 +1,52 @@ +from ..game_id import jak1_id + +# These are the locations of Orb Caches throughout the game, unlockable only with blue eco. +# They are not game collectables and thus don't have the same kinds of game ID's. They do, however, have actor ID's. +# There are a total of 14 in the game. + +# When these are opened, we can execute a hook in the mod that might be able to tell us which orb cache we opened, +# by ID, and that will allow us to map a Location object to it. We'll be using these for Move Randomizer, +# where each move is "mapped" to an Orb Cache being unlocked. Obviously, they will then be randomized, but with moves +# not being considered Items by the game, we need to conjure SOME kind of Location for them, and Orb Caches is the best +# we can do. + +# We can use 2^12 to offset these from special checks, just like we offset those from scout flies +# by 2^11. Special checks don't exceed an ID of (jak1_id + 2153). +orb_cache_offset = 4096 + + +# These helper functions do all the math required to get information about each +# special check and translate its ID between AP and OpenGOAL. Similar to Scout Flies, these large numbers are not +# necessary, and we can flatten out the range in which these numbers lie. +def to_ap_id(game_id: int) -> int: + if game_id >= jak1_id: + raise ValueError(f"Attempted to convert {game_id} to an AP ID, but it already is one.") + uncompressed_id = jak1_id + orb_cache_offset + game_id # Add the offsets and the orb cache Actor ID. + return uncompressed_id - 10344 # Subtract the smallest Actor ID. + + +def to_game_id(ap_id: int) -> int: + if ap_id < jak1_id: + raise ValueError(f"Attempted to convert {ap_id} to a Jak 1 ID, but it already is one.") + uncompressed_id = ap_id + 10344 # Reverse process, add back the smallest Actor ID. + return uncompressed_id - jak1_id - orb_cache_offset # Subtract the offsets. + + +# The ID's you see below correlate to the Actor ID of each Orb Cache. + +loc_orbCacheTable = { + 10344: "Orb Cache in Sandover Village", + 10369: "Orb Cache in Forbidden Jungle", + 11072: "Orb Cache on Misty Island", + 12634: "Orb Cache near Flut Flut Egg", + 12635: "Orb Cache near Pelican's Nest", + 10945: "Orb Cache in Rock Village", + 14507: "Orb Cache in First Sunken Chamber", + 14838: "Orb Cache in Second Sunken Chamber", + 23348: "Orb Cache in Snowy Fort (1)", + 23349: "Orb Cache in Snowy Fort (2)", + 23350: "Orb Cache in Snowy Fort (3)", + 24038: "Orb Cache at End of Blast Furnace", + 24039: "Orb Cache at End of Launch Pad Room", + 24040: "Orb Cache at Start of Launch Pad Room", +} diff --git a/worlds/jakanddaxter/locs/orb_locations.py b/worlds/jakanddaxter/locs/orb_locations.py new file mode 100644 index 0000000000..2b69465a98 --- /dev/null +++ b/worlds/jakanddaxter/locs/orb_locations.py @@ -0,0 +1,123 @@ +from ..game_id import jak1_id +from ..levels import level_table_with_global + +# Precursor Orbs are not necessarily given ID's by the game. + +# Of the 2000 orbs (or "money") you can pick up, only 1233 are standalone ones you find in the overworld. +# We can identify them by Actor ID's, which run from 549 to 24433. Other actors reside in this range, +# so like Power Cells these are not ordered, nor contiguous, nor exclusively orbs. + +# In fact, other ID's in this range belong to actors that spawn orbs when they are activated or when they die, +# like steel crates, orb caches, Spider Cave gnawers, or jumping on the Plant Boss's head. These orbs that spawn +# from parent actors DON'T have an Actor ID themselves - the parent object keeps track of how many of its orbs +# have been picked up. + +# In order to deal with this mess, we're creating 2 extra functions that will create and identify Orb Locations for us. +# These will be compatible with both Global Orbsanity and Per-Level Orbsanity, allowing us to create any +# number of Locations depending on the bundle size chosen, while also guaranteeing that each has a unique address. + +# We can use 2^15 to offset them from Orb Caches, because Orb Cache ID's max out at (jak1_id + 17792). +orb_offset = 32768 + + +# These helper functions do all the math required to get information about each +# precursor orb and translate its ID between AP and OpenGOAL. +def to_ap_id(game_id: int) -> int: + if game_id >= jak1_id: + raise ValueError(f"Attempted to convert {game_id} to an AP ID, but it already is one.") + return jak1_id + orb_offset + game_id # Add the offsets and the orb Actor ID. + + +def to_game_id(ap_id: int) -> int: + if ap_id < jak1_id: + raise ValueError(f"Attempted to convert {ap_id} to a Jak 1 ID, but it already is one.") + return ap_id - jak1_id - orb_offset # Reverse process, subtract the offsets. + + +# Use this when the Memory Reader learns that you checked a specific bundle. +# Offset each level by 200 orbs (max number in any level), {200, 400, ...} +# then divide orb count by bundle size, {201, 202, ...} +# then subtract 1. {200, 201, ...} +def find_address(level_index: int, orb_count: int, bundle_size: int) -> int: + result = (level_index * 200) + (orb_count // bundle_size) - 1 + return result + + +# Use this when assigning addresses during region generation. +def create_address(level_index: int, bundle_index: int) -> int: + result = (level_index * 200) + bundle_index + return result + + +# What follows is our methods of generating all the name/ID pairs for location_name_to_id. +# Remember that not every bundle will be used in the actual seed, we just need a static map of strings to ints. +locGR_orbBundleTable = {create_address(level_table_with_global["Geyser Rock"]["level_index"], index): + f"Geyser Rock Orb Bundle {index + 1}" + for index in range(level_table_with_global["Geyser Rock"]["orbs"])} +locSV_orbBundleTable = {create_address(level_table_with_global["Sandover Village"]["level_index"], index): + f"Sandover Village Orb Bundle {index + 1}" + for index in range(level_table_with_global["Sandover Village"]["orbs"])} +locFJ_orbBundleTable = {create_address(level_table_with_global["Forbidden Jungle"]["level_index"], index): + f"Forbidden Jungle Orb Bundle {index + 1}" + for index in range(level_table_with_global["Forbidden Jungle"]["orbs"])} +locSB_orbBundleTable = {create_address(level_table_with_global["Sentinel Beach"]["level_index"], index): + f"Sentinel Beach Orb Bundle {index + 1}" + for index in range(level_table_with_global["Sentinel Beach"]["orbs"])} +locMI_orbBundleTable = {create_address(level_table_with_global["Misty Island"]["level_index"], index): + f"Misty Island Orb Bundle {index + 1}" + for index in range(level_table_with_global["Misty Island"]["orbs"])} +locFC_orbBundleTable = {create_address(level_table_with_global["Fire Canyon"]["level_index"], index): + f"Fire Canyon Orb Bundle {index + 1}" + for index in range(level_table_with_global["Fire Canyon"]["orbs"])} +locRV_orbBundleTable = {create_address(level_table_with_global["Rock Village"]["level_index"], index): + f"Rock Village Orb Bundle {index + 1}" + for index in range(level_table_with_global["Rock Village"]["orbs"])} +locLPC_orbBundleTable = {create_address(level_table_with_global["Lost Precursor City"]["level_index"], index): + f"Lost Precursor City Orb Bundle {index + 1}" + for index in range(level_table_with_global["Lost Precursor City"]["orbs"])} +locBS_orbBundleTable = {create_address(level_table_with_global["Boggy Swamp"]["level_index"], index): + f"Boggy Swamp Orb Bundle {index + 1}" + for index in range(level_table_with_global["Boggy Swamp"]["orbs"])} +locPB_orbBundleTable = {create_address(level_table_with_global["Precursor Basin"]["level_index"], index): + f"Precursor Basin Orb Bundle {index + 1}" + for index in range(level_table_with_global["Precursor Basin"]["orbs"])} +locMP_orbBundleTable = {create_address(level_table_with_global["Mountain Pass"]["level_index"], index): + f"Mountain Pass Orb Bundle {index + 1}" + for index in range(level_table_with_global["Mountain Pass"]["orbs"])} +locVC_orbBundleTable = {create_address(level_table_with_global["Volcanic Crater"]["level_index"], index): + f"Volcanic Crater Orb Bundle {index + 1}" + for index in range(level_table_with_global["Volcanic Crater"]["orbs"])} +locSM_orbBundleTable = {create_address(level_table_with_global["Snowy Mountain"]["level_index"], index): + f"Snowy Mountain Orb Bundle {index + 1}" + for index in range(level_table_with_global["Snowy Mountain"]["orbs"])} +locSC_orbBundleTable = {create_address(level_table_with_global["Spider Cave"]["level_index"], index): + f"Spider Cave Orb Bundle {index + 1}" + for index in range(level_table_with_global["Spider Cave"]["orbs"])} +locLT_orbBundleTable = {create_address(level_table_with_global["Lava Tube"]["level_index"], index): + f"Lava Tube Orb Bundle {index + 1}" + for index in range(level_table_with_global["Lava Tube"]["orbs"])} +locGMC_orbBundleTable = {create_address(level_table_with_global["Gol and Maia's Citadel"]["level_index"], index): + f"Gol and Maia's Citadel Orb Bundle {index + 1}" + for index in range(level_table_with_global["Gol and Maia's Citadel"]["orbs"])} +locGlobal_orbBundleTable = {create_address(level_table_with_global[""]["level_index"], index): + f"Orb Bundle {index + 1}" + for index in range(level_table_with_global[""]["orbs"])} +loc_orbBundleTable = { + **locGR_orbBundleTable, + **locSV_orbBundleTable, + **locSB_orbBundleTable, + **locFJ_orbBundleTable, + **locMI_orbBundleTable, + **locFC_orbBundleTable, + **locRV_orbBundleTable, + **locLPC_orbBundleTable, + **locBS_orbBundleTable, + **locPB_orbBundleTable, + **locMP_orbBundleTable, + **locVC_orbBundleTable, + **locSM_orbBundleTable, + **locSC_orbBundleTable, + **locLT_orbBundleTable, + **locGMC_orbBundleTable, + **locGlobal_orbBundleTable +} diff --git a/worlds/jakanddaxter/locs/scout_locations.py b/worlds/jakanddaxter/locs/scout_locations.py new file mode 100644 index 0000000000..892bb973e0 --- /dev/null +++ b/worlds/jakanddaxter/locs/scout_locations.py @@ -0,0 +1,230 @@ +from ..game_id import jak1_id + +# Scout Flies are given ID's between 0 and 393311 by the game, explanation below. + +# Each fly (or "buzzer") is given a unique 32-bit number broken into two 16-bit numbers. +# The lower 16 bits are the game-task ID of the power cell the fly corresponds to. +# The higher 16 bits are the index of the fly itself, from 000 (0) to 110 (6). + +# Ex: The final scout fly on Geyser Rock +# 0000000000000110 0000000001011111 +# ( Index: 6 ) ( Cell: 95 ) + +# Because flies are indexed from 0, each 0th fly's full ID == the power cell's ID. +# So we need to offset all of their ID's in order for Archipelago to separate them +# from their power cells. We can use 1024 (2^10) for this purpose, because scout flies +# only ever need 10 bits to identify themselves (3 for the index, 7 for the cell ID). + +# We're also going to compress the ID by bit-shifting the fly index down to lower bits, +# keeping the scout fly ID range to a smaller set of numbers (1000 -> 2000, instead of 1 -> 400000). +fly_offset = 1024 + + +# These helper functions do all the math required to get information about each +# scout fly and translate its ID between AP and OpenGOAL. +def to_ap_id(game_id: int) -> int: + if game_id >= jak1_id: + raise ValueError(f"Attempted to convert {game_id} to an AP ID, but it already is one.") + cell_id = get_cell_id(game_id) # Get the power cell ID from the lowest 7 bits. + buzzer_index = (game_id - cell_id) >> 9 # Get the index, bit shift it down 9 places. + compressed_id = fly_offset + buzzer_index + cell_id # Add the offset, the bit-shifted index, and the cell ID. + return jak1_id + compressed_id # Last thing: add the game's ID. + + +def to_game_id(ap_id: int) -> int: + if ap_id < jak1_id: + raise ValueError(f"Attempted to convert {ap_id} to a Jak 1 ID, but it already is one.") + compressed_id = ap_id - jak1_id # Reverse process. First thing: subtract the game's ID. + cell_id = get_cell_id(compressed_id) # Get the power cell ID from the lowest 7 bits. + buzzer_index = compressed_id - fly_offset - cell_id # Get the bit-shifted index. + return (buzzer_index << 9) + cell_id # Return the index to its normal place, re-add the cell ID. + + +# Get the power cell ID from the lowest 7 bits. +# Make sure to use this function ONLY when the input argument does NOT include jak1_id, +# because that number may flip some of the bottom 7 bits, and that will throw off this bit mask. +def get_cell_id(buzzer_id: int) -> int: + if buzzer_id >= jak1_id: + raise ValueError(f"Attempted to bit mask {buzzer_id}, but it is polluted by the game's ID {jak1_id}.") + return buzzer_id & 0b1111111 + + +# The ID's you see below correspond directly to that fly's 32-bit ID in the game. +# I used the decompiled entity JSON's and Jak's X/Y coordinates in Debug Mode +# to determine which box ID is which location. + +# Geyser Rock +locGR_scoutTable = { + 95: "GR: Scout Fly On Ground, Front", + 327775: "GR: Scout Fly On Ground, Back", + 393311: "GR: Scout Fly On Left Ledge", + 65631: "GR: Scout Fly On Right Ledge", + 262239: "GR: Scout Fly On Middle Ledge, Left", + 131167: "GR: Scout Fly On Middle Ledge, Right", + 196703: "GR: Scout Fly On Top Ledge" +} + +# Sandover Village +locSV_scoutTable = { + 262219: "SV: Scout Fly In Fisherman's House", + 327755: "SV: Scout Fly In Mayor's House", + 131147: "SV: Scout Fly Under Bridge", + 65611: "SV: Scout Fly Behind Sculptor's House", + 75: "SV: Scout Fly Overlooking Farmer's House", + 393291: "SV: Scout Fly Near Oracle", + 196683: "SV: Scout Fly In Farmer's House" +} + +# Forbidden Jungle +locFJ_scoutTable = { + 393223: "FJ: Scout Fly At End Of Path", + 262151: "FJ: Scout Fly On Spiral Of Stumps", + 7: "FJ: Scout Fly Near Dark Eco Boxes", + 196615: "FJ: Scout Fly At End Of River", + 131079: "FJ: Scout Fly Behind Lurker Machine", + 327687: "FJ: Scout Fly Around Temple Spire", + 65543: "FJ: Scout Fly On Top Of Temple" +} + +# Sentinel Beach +locSB_scoutTable = { + 327700: "SB: Scout Fly At Entrance", + 20: "SB: Scout Fly Overlooking Locked Boxes", + 65556: "SB: Scout Fly On Path To Flut Flut", + 262164: "SB: Scout Fly Under Wood Pillars", + 196628: "SB: Scout Fly Overlooking Blue Eco Vent", + 131092: "SB: Scout Fly Overlooking Green Eco Vents", + 393236: "SB: Scout Fly On Sentinel" +} + +# Misty Island +locMI_scoutTable = { + 327708: "MI: Scout Fly Overlooking Entrance", + 65564: "MI: Scout Fly On Ledge Near Arena Entrance", + 262172: "MI: Scout Fly Near Arena Door", + 28: "MI: Scout Fly On Ledge Near Arena Exit", + 131100: "MI: Scout Fly On Ship", + 196636: "MI: Scout Fly On Barrel Ramps", + 393244: "MI: Scout Fly On Zoomer Ramps" +} + +# Fire Canyon +locFC_scoutTable = { + 393284: "FC: Scout Fly 1", + 68: "FC: Scout Fly 2", + 65604: "FC: Scout Fly 3", + 196676: "FC: Scout Fly 4", + 131140: "FC: Scout Fly 5", + 262212: "FC: Scout Fly 6", + 327748: "FC: Scout Fly 7" +} + +# Rock Village +locRV_scoutTable = { + 76: "RV: Scout Fly Behind Sage's Hut", + 131148: "RV: Scout Fly Near Waterfall", + 196684: "RV: Scout Fly Behind Geologist", + 262220: "RV: Scout Fly Behind Fiery Boulder", + 65612: "RV: Scout Fly On Dock", + 327756: "RV: Scout Fly At Pontoon Bridge", + 393292: "RV: Scout Fly At Boggy Swamp Entrance" +} + +# Precursor Basin +locPB_scoutTable = { + 196665: "PB: Scout Fly Overlooking Entrance", + 393273: "PB: Scout Fly Near Mole Hole", + 131129: "PB: Scout Fly At Purple Ring Start", + 65593: "PB: Scout Fly Near Dark Eco Plant, Above", + 57: "PB: Scout Fly At Blue Ring Start", + 262201: "PB: Scout Fly Before Big Jump", + 327737: "PB: Scout Fly Near Dark Eco Plant, Below" +} + +# Lost Precursor City +locLPC_scoutTable = { + 262193: "LPC: Scout Fly First Room", + 131121: "LPC: Scout Fly Before Second Room", + 393265: "LPC: Scout Fly Second Room, Near Orb Vent", + 196657: "LPC: Scout Fly Second Room, On Path To Cell", + 49: "LPC: Scout Fly Second Room, Green Pipe", # Sunken Pipe Game, special cases. See `got-buzzer?` + 65585: "LPC: Scout Fly Second Room, Blue Pipe", # Sunken Pipe Game, special cases. See `got-buzzer?` + 327729: "LPC: Scout Fly Across Steam Vents" +} + +# Boggy Swamp +locBS_scoutTable = { + 43: "BS: Scout Fly Near Entrance", + 393259: "BS: Scout Fly Over First Jump Pad", + 65579: "BS: Scout Fly Over Second Jump Pad", + 262187: "BS: Scout Fly Across Black Swamp", + 327723: "BS: Scout Fly Overlooking Flut Flut", + 131115: "BS: Scout Fly On Flut Flut Platforms", + 196651: "BS: Scout Fly In Field Of Boxes" +} + +# Mountain Pass +locMP_scoutTable = { + 88: "MP: Scout Fly 1", + 65624: "MP: Scout Fly 2", + 131160: "MP: Scout Fly 3", + 196696: "MP: Scout Fly 4", + 262232: "MP: Scout Fly 5", + 327768: "MP: Scout Fly 6", + 393304: "MP: Scout Fly 7" +} + +# Volcanic Crater +locVC_scoutTable = { + 262221: "VC: Scout Fly In Miner's Cave", + 393293: "VC: Scout Fly Near Oracle", + 196685: "VC: Scout Fly On Stone Platforms", + 131149: "VC: Scout Fly Near Lava Tube", + 77: "VC: Scout Fly At Minecart Junction", + 65613: "VC: Scout Fly Near Spider Cave", + 327757: "VC: Scout Fly Near Mountain Pass" +} + +# Spider Cave +locSC_scoutTable = { + 327765: "SC: Scout Fly Near Dark Cave Entrance", + 262229: "SC: Scout Fly In Dark Cave", + 393301: "SC: Scout Fly Main Cave, Overlooking Entrance", + 196693: "SC: Scout Fly Main Cave, Near Dark Crystal", + 131157: "SC: Scout Fly Main Cave, Near Robot Cave Entrance", + 85: "SC: Scout Fly Robot Cave, At Bottom Level", + 65621: "SC: Scout Fly Robot Cave, At Top Level", +} + +# Snowy Mountain +locSM_scoutTable = { + 65: "SM: Scout Fly Near Entrance", + 327745: "SM: Scout Fly Near Frozen Box", + 65601: "SM: Scout Fly Near Yellow Eco Switch", + 131137: "SM: Scout Fly On Cliff near Flut Flut", + 393281: "SM: Scout Fly Under Bridge To Fort", + 196673: "SM: Scout Fly On Top Of Fort Tower", + 262209: "SM: Scout Fly On Top Of Fort" +} + +# Lava Tube +locLT_scoutTable = { + 90: "LT: Scout Fly 1", + 65626: "LT: Scout Fly 2", + 327770: "LT: Scout Fly 3", + 262234: "LT: Scout Fly 4", + 131162: "LT: Scout Fly 5", + 196698: "LT: Scout Fly 6", + 393306: "LT: Scout Fly 7" +} + +# Gol and Maias Citadel +locGMC_scoutTable = { + 91: "GMC: Scout Fly At Entrance", + 65627: "GMC: Scout Fly Main Room, Left of Robot", + 196699: "GMC: Scout Fly Main Room, Right of Robot", + 262235: "GMC: Scout Fly Before Jumping Lurkers", + 393307: "GMC: Scout Fly At Blast Furnace", + 131163: "GMC: Scout Fly At Launch Pad Room", + 327771: "GMC: Scout Fly Top Of Rotating Tower" +} diff --git a/worlds/jakanddaxter/locs/special_locations.py b/worlds/jakanddaxter/locs/special_locations.py new file mode 100644 index 0000000000..95081eb2e3 --- /dev/null +++ b/worlds/jakanddaxter/locs/special_locations.py @@ -0,0 +1,51 @@ +from ..game_id import jak1_id + +# These are special checks that the game normally does not track. They are not game entities and thus +# don't have game ID's. + +# Normally, for example, completing the fishing minigame is what gives you access to the +# fisherman's boat to get to Misty Island. The game treats completion of the fishing minigame as well as the +# power cell you receive as one and the same. The fisherman only gives you one item, a power cell. + +# We're significantly altering the game logic here to decouple these concepts. First, completing the fishing minigame +# now counts as 2 Location checks. Second, the fisherman should give you a power cell (a generic item) as well as +# the "keys" to his boat (a special item). It is the "keys" that we are defining in this file, and the respective +# Item representing those keys will be defined in Items.py. These aren't real in the sense that +# they have a model and texture, they are just the logical representation of the boat unlock. + +# We can use 2^11 to offset these from scout flies, just like we offset scout flies from power cells +# by 2^10. Even with the high-16 reminder bits, scout flies don't exceed an ID of (jak1_id + 1887). +special_offset = 2048 + + +# These helper functions do all the math required to get information about each +# special check and translate its ID between AP and OpenGOAL. +def to_ap_id(game_id: int) -> int: + if game_id >= jak1_id: + raise ValueError(f"Attempted to convert {game_id} to an AP ID, but it already is one.") + return jak1_id + special_offset + game_id # Add the offsets and the orb Actor ID. + + +def to_game_id(ap_id: int) -> int: + if ap_id < jak1_id: + raise ValueError(f"Attempted to convert {ap_id} to a Jak 1 ID, but it already is one.") + return ap_id - jak1_id - special_offset # Reverse process, subtract the offsets. + + +# The ID's you see below correlate to each of their respective game-tasks, even though they are separate. +# This makes it easier for the new game logic to know what relates to what. I hope. God I hope. + +loc_specialTable = { + 5: "Fisherman's Boat", + 4: "Jungle Elevator", + 2: "Blue Eco Switch", + 17: "Flut Flut", + 33: "Warrior's Pontoons", + 105: "Snowy Mountain Gondola", + 60: "Yellow Eco Switch", + 63: "Snowy Fort Gate", + 71: "Freed The Blue Sage", + 72: "Freed The Red Sage", + 73: "Freed The Yellow Sage", + 70: "Freed The Green Sage", +} diff --git a/worlds/jakanddaxter/options.py b/worlds/jakanddaxter/options.py new file mode 100644 index 0000000000..d36303b075 --- /dev/null +++ b/worlds/jakanddaxter/options.py @@ -0,0 +1,352 @@ +from dataclasses import dataclass +from functools import cached_property +from Options import PerGameCommonOptions, StartInventoryPool, Toggle, Choice, Range, DefaultOnToggle, OptionCounter, \ + AssembleOptions +from .items import trap_item_table + + +class readonly_classproperty: + """This decorator is used for getting friendly or unfriendly range_end values for options like FireCanyonCellCount + and CitizenOrbTradeAmount. We only need to provide a getter as we will only be setting a single int to one of two + values.""" + def __init__(self, getter): + self.getter = getter + + def __get__(self, instance, owner): + return self.getter(owner) + + +@readonly_classproperty +def determine_range_end(cls) -> int: + from . import JakAndDaxterWorld # Avoid circular imports. + friendly = JakAndDaxterWorld.settings.enforce_friendly_options + return cls.friendly_maximum if friendly else cls.absolute_maximum + + +class classproperty: + """This decorator (?) is used for getting and setting friendly or unfriendly option values for the Orbsanity + options.""" + def __init__(self, getter, setter): + self.getter = getter + self.setter = setter + + def __get__(self, obj, value): + return self.getter(obj) + + def __set__(self, obj, value): + self.setter(obj, value) + + +class AllowedChoiceMeta(AssembleOptions): + """This metaclass overrides AssembleOptions and provides inheriting classes a way to filter out "disallowed" values + by way of implementing get_disallowed_options. This function is used by Jak and Daxter to check host.yaml settings + without circular imports or breaking the settings API.""" + _name_lookup: dict[int, str] + _options: dict[str, int] + + def __new__(mcs, name, bases, attrs): + ret = super().__new__(mcs, name, bases, attrs) + ret._name_lookup = attrs["name_lookup"] + ret._options = attrs["options"] + return ret + + def set_name_lookup(cls, value : dict[int, str]): + cls._name_lookup = value + + def get_name_lookup(cls) -> dict[int, str]: + cls._name_lookup = {k: v for k, v in cls._name_lookup.items() if k not in cls.get_disallowed_options()} + return cls._name_lookup + + def set_options(cls, value: dict[str, int]): + cls._options = value + + def get_options(cls) -> dict[str, int]: + cls._options = {k: v for k, v in cls._options.items() if v not in cls.get_disallowed_options()} + return cls._options + + def get_disallowed_options(cls): + return {} + + name_lookup = classproperty(get_name_lookup, set_name_lookup) + options = classproperty(get_options, set_options) + + +class AllowedChoice(Choice, metaclass=AllowedChoiceMeta): + pass + + +class EnableMoveRandomizer(Toggle): + """Include movement options as items in the randomizer. Until you find his other moves, Jak is limited to + running, swimming, single-jumping, and shooting yellow eco through his goggles. + + This adds 11 items to the pool.""" + display_name = "Enable Move Randomizer" + + +class EnableOrbsanity(Choice): + """Include bundles of Precursor Orbs as checks. Every time you collect the chosen number of orbs, you will trigger + another check. + + Per Level: bundles are for each level in the game. + Global: bundles carry over level to level. + + This adds a number of Items and Locations to the pool inversely proportional to the size of the bundle. + For example, if your bundle size is 20 orbs, you will add 100 items to the pool. If your bundle size is 250 orbs, + you will add 8 items to the pool.""" + display_name = "Enable Orbsanity" + option_off = 0 + option_per_level = 1 + option_global = 2 + default = 0 + + +class GlobalOrbsanityBundleSize(AllowedChoice): + """The orb bundle size for Global Orbsanity. This only applies if "Enable Orbsanity" is set to "Global." + There are 2000 orbs in the game, so your bundle size must be a factor of 2000. + + This value is restricted to safe minimum and maximum values to ensure valid singleplayer games and + non-disruptive multiplayer games, but the host can remove this restriction by turning off enforce_friendly_options + in host.yaml.""" + display_name = "Global Orbsanity Bundle Size" + option_1_orb = 1 + option_2_orbs = 2 + option_4_orbs = 4 + option_5_orbs = 5 + option_8_orbs = 8 + option_10_orbs = 10 + option_16_orbs = 16 + option_20_orbs = 20 + option_25_orbs = 25 + option_40_orbs = 40 + option_50_orbs = 50 + option_80_orbs = 80 + option_100_orbs = 100 + option_125_orbs = 125 + option_200_orbs = 200 + option_250_orbs = 250 + option_400_orbs = 400 + option_500_orbs = 500 + option_1000_orbs = 1000 + option_2000_orbs = 2000 + friendly_minimum = 10 + friendly_maximum = 200 + default = 20 + + @classmethod + def get_disallowed_options(cls) -> set[int]: + try: + from . import JakAndDaxterWorld + if JakAndDaxterWorld.settings.enforce_friendly_options: + return {cls.option_1_orb, + cls.option_2_orbs, + cls.option_4_orbs, + cls.option_5_orbs, + cls.option_8_orbs, + cls.option_250_orbs, + cls.option_400_orbs, + cls.option_500_orbs, + cls.option_1000_orbs, + cls.option_2000_orbs} + except ImportError: + pass + return set() + + +class PerLevelOrbsanityBundleSize(AllowedChoice): + """The orb bundle size for Per Level Orbsanity. This only applies if "Enable Orbsanity" is set to "Per Level." + There are 50, 150, or 200 orbs per level, so your bundle size must be a factor of 50. + + This value is restricted to safe minimum and maximum values to ensure valid singleplayer games and + non-disruptive multiplayer games, but the host can remove this restriction by turning off enforce_friendly_options + in host.yaml.""" + display_name = "Per Level Orbsanity Bundle Size" + option_1_orb = 1 + option_2_orbs = 2 + option_5_orbs = 5 + option_10_orbs = 10 + option_25_orbs = 25 + option_50_orbs = 50 + friendly_minimum = 10 + default = 25 + + @classmethod + def get_disallowed_options(cls) -> set[int]: + try: + from . import JakAndDaxterWorld + if JakAndDaxterWorld.settings.enforce_friendly_options: + return {cls.option_1_orb, + cls.option_2_orbs, + cls.option_5_orbs} + except ImportError: + pass + return set() + + +class FireCanyonCellCount(Range): + """The number of power cells you need to cross Fire Canyon. This value is restricted to a safe maximum value to + ensure valid singleplayer games and non-disruptive multiplayer games, but the host can remove this restriction by + turning off enforce_friendly_options in host.yaml.""" + display_name = "Fire Canyon Cell Count" + friendly_maximum = 30 + absolute_maximum = 100 + range_start = 0 + range_end = determine_range_end + default = 20 + + +class MountainPassCellCount(Range): + """The number of power cells you need to reach Klaww and cross Mountain Pass. This value is restricted to a safe + maximum value to ensure valid singleplayer games and non-disruptive multiplayer games, but the host can + remove this restriction by turning off enforce_friendly_options in host.yaml.""" + display_name = "Mountain Pass Cell Count" + friendly_maximum = 60 + absolute_maximum = 100 + range_start = 0 + range_end = determine_range_end + default = 45 + + +class LavaTubeCellCount(Range): + """The number of power cells you need to cross Lava Tube. This value is restricted to a safe maximum value to + ensure valid singleplayer games and non-disruptive multiplayer games, but the host can remove this restriction by + turning off enforce_friendly_options in host.yaml.""" + display_name = "Lava Tube Cell Count" + friendly_maximum = 90 + absolute_maximum = 100 + range_start = 0 + range_end = determine_range_end + default = 72 + + +class EnableOrderedCellCounts(DefaultOnToggle): + """Reorder the Cell Count requirements for vehicle sections to be in ascending order. + + For example, if Fire Canyon Cell Count, Mountain Pass Cell Count, and Lava Tube Cell Count are 60, 30, and 40 + respectively, they will be reordered to 30, 40, and 60.""" + display_name = "Enable Ordered Cell Counts" + + +class RequirePunchForKlaww(DefaultOnToggle): + """Force the Punch move to come before Klaww. Disabling this setting may require Jak to fight Klaww + and Gol and Maia by shooting yellow eco through his goggles. This only applies if "Enable Move Randomizer" is ON.""" + display_name = "Require Punch For Klaww" + + +# 222 is the absolute maximum because there are 9 citizen trades and 2000 orbs to trade (2000/9 = 222). +class CitizenOrbTradeAmount(Range): + """The number of orbs you need to trade to citizens for a power cell (Mayor, Uncle, etc.). + + Along with Oracle Orb Trade Amount, this setting cannot exceed the total number of orbs in the game (2000). + The equation to determine the total number of trade orbs is (9 * Citizen Trades) + (6 * Oracle Trades). + + This value is restricted to a safe maximum value to ensure valid singleplayer games and non-disruptive + multiplayer games, but the host can remove this restriction by turning off enforce_friendly_options in host.yaml.""" + display_name = "Citizen Orb Trade Amount" + friendly_maximum = 120 + absolute_maximum = 222 + range_start = 0 + range_end = determine_range_end + default = 90 + + +# 333 is the absolute maximum because there are 6 oracle trades and 2000 orbs to trade (2000/6 = 333). +class OracleOrbTradeAmount(Range): + """The number of orbs you need to trade to the Oracles for a power cell. + + Along with Citizen Orb Trade Amount, this setting cannot exceed the total number of orbs in the game (2000). + The equation to determine the total number of trade orbs is (9 * Citizen Trades) + (6 * Oracle Trades). + + This value is restricted to a safe maximum value to ensure valid singleplayer games and non-disruptive + multiplayer games, but the host can remove this restriction by turning off enforce_friendly_options in host.yaml.""" + display_name = "Oracle Orb Trade Amount" + friendly_maximum = 150 + absolute_maximum = 333 + range_start = 0 + range_end = determine_range_end + default = 120 + + +class FillerPowerCellsReplacedWithTraps(Range): + """ + The number of filler power cells that will be replaced with traps. This does not affect the number of progression + power cells. + + If this value is greater than the number of filler power cells, then they will all be replaced with traps. + """ + display_name = "Filler Power Cells Replaced With Traps" + range_start = 0 + range_end = 100 + default = 0 + + +class FillerOrbBundlesReplacedWithTraps(Range): + """ + The number of filler orb bundles that will be replaced with traps. This does not affect the number of progression + orb bundles. This only applies if "Enable Orbsanity" is set to "Per Level" or "Global." + + If this value is greater than the number of filler orb bundles, then they will all be replaced with traps. + """ + display_name = "Filler Orb Bundles Replaced With Traps" + range_start = 0 + range_end = 2000 + default = 0 + + +class TrapEffectDuration(Range): + """ + The length of time, in seconds, that a trap effect lasts. + """ + display_name = "Trap Effect Duration" + range_start = 5 + range_end = 60 + default = 30 + + +class TrapWeights(OptionCounter): + """ + The list of traps and corresponding weights that will be randomly added to the item pool. A trap with weight 10 is + twice as likely to appear as a trap with weight 5. Set a weight to 0 to prevent that trap from appearing altogether. + If all weights are 0, no traps are created, overriding the values of "Filler * Replaced With Traps." + """ + display_name = "Trap Weights" + min = 0 + default = {trap: 1 for trap in trap_item_table.values()} + valid_keys = sorted({trap for trap in trap_item_table.values()}) + + @cached_property + def weights_pair(self) -> tuple[list[str], list[int]]: + return list(self.value.keys()), list(self.value.values()) + + +class CompletionCondition(Choice): + """Set the goal for completing the game.""" + display_name = "Completion Condition" + option_cross_fire_canyon = 69 + option_cross_mountain_pass = 87 + option_cross_lava_tube = 89 + # option_defeat_dark_eco_plant = 6 + option_defeat_klaww = 86 + option_defeat_gol_and_maia = 112 + option_open_100_cell_door = 116 + default = 112 + + +@dataclass +class JakAndDaxterOptions(PerGameCommonOptions): + enable_move_randomizer: EnableMoveRandomizer + enable_orbsanity: EnableOrbsanity + global_orbsanity_bundle_size: GlobalOrbsanityBundleSize + level_orbsanity_bundle_size: PerLevelOrbsanityBundleSize + fire_canyon_cell_count: FireCanyonCellCount + mountain_pass_cell_count: MountainPassCellCount + lava_tube_cell_count: LavaTubeCellCount + enable_ordered_cell_counts: EnableOrderedCellCounts + require_punch_for_klaww: RequirePunchForKlaww + citizen_orb_trade_amount: CitizenOrbTradeAmount + oracle_orb_trade_amount: OracleOrbTradeAmount + filler_power_cells_replaced_with_traps: FillerPowerCellsReplacedWithTraps + filler_orb_bundles_replaced_with_traps: FillerOrbBundlesReplacedWithTraps + trap_effect_duration: TrapEffectDuration + trap_weights: TrapWeights + jak_completion_condition: CompletionCondition + start_inventory_from_pool: StartInventoryPool diff --git a/worlds/jakanddaxter/regions.py b/worlds/jakanddaxter/regions.py new file mode 100644 index 0000000000..87186c3a02 --- /dev/null +++ b/worlds/jakanddaxter/regions.py @@ -0,0 +1,132 @@ +import typing +from Options import OptionError +from .items import item_table +from .options import EnableOrbsanity, CompletionCondition +from .rules import can_reach_orbs_global +from .locs import cell_locations as cells, scout_locations as scouts +from .regs import (geyser_rock_regions as geyser_rock, + sandover_village_regions as sandover_village, + forbidden_jungle_regions as forbidden_jungle, + sentinel_beach_regions as sentinel_beach, + misty_island_regions as misty_island, + fire_canyon_regions as fire_canyon, + rock_village_regions as rock_village, + precursor_basin_regions as precursor_basin, + lost_precursor_city_regions as lost_precursor_city, + boggy_swamp_regions as boggy_swamp, + mountain_pass_regions as mountain_pass, + volcanic_crater_regions as volcanic_crater, + spider_cave_regions as spider_cave, + snowy_mountain_regions as snowy_mountain, + lava_tube_regions as lava_tube, + gol_and_maias_citadel_regions as gol_and_maias_citadel) +from .regs.region_base import JakAndDaxterRegion + +if typing.TYPE_CHECKING: + from . import JakAndDaxterWorld + + +def create_regions(world: "JakAndDaxterWorld"): + multiworld = world.multiworld + options = world.options + player = world.player + + # Always start with Menu. + menu = JakAndDaxterRegion("Menu", player, multiworld) + multiworld.regions.append(menu) + + # Build the special "Free 7 Scout Flies" Region. This is a virtual region always accessible to Menu. + # The Locations within are automatically checked when you receive the 7th scout fly for the corresponding cell. + free7 = JakAndDaxterRegion("'Free 7 Scout Flies' Power Cells", player, multiworld) + free7.add_cell_locations(cells.loc7SF_cellTable.keys()) + for scout_fly_cell in free7.locations: + + # Translate from Cell AP ID to Scout AP ID using game ID as an intermediary. + scout_fly_id = scouts.to_ap_id(cells.to_game_id(typing.cast(int, scout_fly_cell.address))) + scout_fly_cell.access_rule = lambda state, flies=scout_fly_id: state.has(item_table[flies], player, 7) + multiworld.regions.append(free7) + menu.connect(free7) + + # If Global Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Menu. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_global: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld) + + bundle_count = 2000 // world.orb_bundle_size + for bundle_index in range(bundle_count): + + # Unlike Per-Level Orbsanity, Global Orbsanity Locations always have a level_index of 16. + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(16, + bundle_index, + access_rule=lambda state, orb_amount=amount: + can_reach_orbs_global(state, player, world, orb_amount)) + multiworld.regions.append(orbs) + menu.connect(orbs) + + # Build all regions. Include their intra-connecting Rules, their Locations, and their Location access rules. + gr = geyser_rock.build_regions("Geyser Rock", world) + sv = sandover_village.build_regions("Sandover Village", world) + fj, fjp = forbidden_jungle.build_regions("Forbidden Jungle", world) + sb = sentinel_beach.build_regions("Sentinel Beach", world) + mi = misty_island.build_regions("Misty Island", world) + fc = fire_canyon.build_regions("Fire Canyon", world) + rv, rvp, rvc = rock_village.build_regions("Rock Village", world) + pb = precursor_basin.build_regions("Precursor Basin", world) + lpc = lost_precursor_city.build_regions("Lost Precursor City", world) + bs = boggy_swamp.build_regions("Boggy Swamp", world) + mp, mpr = mountain_pass.build_regions("Mountain Pass", world) + vc = volcanic_crater.build_regions("Volcanic Crater", world) + sc = spider_cave.build_regions("Spider Cave", world) + sm = snowy_mountain.build_regions("Snowy Mountain", world) + lt = lava_tube.build_regions("Lava Tube", world) + gmc, fb, fd = gol_and_maias_citadel.build_regions("Gol and Maia's Citadel", world) + + # Configurable counts of cells for connector levels. + fc_count = options.fire_canyon_cell_count.value + mp_count = options.mountain_pass_cell_count.value + lt_count = options.lava_tube_cell_count.value + + # Define the interconnecting rules. + menu.connect(gr) + gr.connect(sv) # Geyser Rock modified to let you leave at any time. + sv.connect(fj) + sv.connect(sb) + sv.connect(mi, rule=lambda state: state.has("Fisherman's Boat", player)) + sv.connect(fc, rule=lambda state: state.has("Power Cell", player, fc_count)) # Normally 20. + fc.connect(rv) + rv.connect(pb) + rv.connect(lpc) + rvp.connect(bs) # rv->rvp/rvc connections defined internally by RockVillageRegions. + rvc.connect(mp, rule=lambda state: state.has("Power Cell", player, mp_count)) # Normally 45. + mpr.connect(vc) # mp->mpr connection defined internally by MountainPassRegions. + vc.connect(sc) + vc.connect(sm, rule=lambda state: state.has("Snowy Mountain Gondola", player)) + vc.connect(lt, rule=lambda state: state.has("Power Cell", player, lt_count)) # Normally 72. + lt.connect(gmc) # gmc->fb connection defined internally by GolAndMaiasCitadelRegions. + + # Set the completion condition. + if options.jak_completion_condition == CompletionCondition.option_cross_fire_canyon: + multiworld.completion_condition[player] = lambda state: state.can_reach(rv, "Region", player) + + elif options.jak_completion_condition == CompletionCondition.option_cross_mountain_pass: + multiworld.completion_condition[player] = lambda state: state.can_reach(vc, "Region", player) + + elif options.jak_completion_condition == CompletionCondition.option_cross_lava_tube: + multiworld.completion_condition[player] = lambda state: state.can_reach(gmc, "Region", player) + + # elif options.jak_completion_condition == CompletionCondition.option_defeat_dark_eco_plant: + # multiworld.completion_condition[player] = lambda state: state.can_reach(fjp, "Region", player) + + elif options.jak_completion_condition == CompletionCondition.option_defeat_klaww: + multiworld.completion_condition[player] = lambda state: state.can_reach(mp, "Region", player) + + elif options.jak_completion_condition == CompletionCondition.option_defeat_gol_and_maia: + multiworld.completion_condition[player] = lambda state: state.can_reach(fb, "Region", player) + + elif options.jak_completion_condition == CompletionCondition.option_open_100_cell_door: + multiworld.completion_condition[player] = lambda state: state.can_reach(fd, "Region", player) + + else: + raise OptionError(f"{world.player_name}: Unknown completion goal ID " + f"({options.jak_completion_condition.value}).") diff --git a/worlds/jakanddaxter/regs/__init__.py b/worlds/jakanddaxter/regs/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/jakanddaxter/regs/boggy_swamp_regions.py b/worlds/jakanddaxter/regs/boggy_swamp_regions.py new file mode 100644 index 0000000000..a548f2e410 --- /dev/null +++ b/worlds/jakanddaxter/regs/boggy_swamp_regions.py @@ -0,0 +1,174 @@ +from BaseClasses import CollectionState +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + # This level is full of short-medium gaps that cannot be crossed by single jump alone. + # These helper functions list out the moves that can cross all these gaps (painting with a broad brush but...) + def can_jump_farther(state: CollectionState, p: int) -> bool: + return (state.has_any(("Double Jump", "Jump Kick"), p) + or state.has_all(("Punch", "Punch Uppercut"), p)) + + def can_jump_higher(state: CollectionState, p: int) -> bool: + return (state.has("Double Jump", p) + or state.has_all(("Crouch", "Crouch Jump"), p) + or state.has_all(("Crouch", "Crouch Uppercut"), p) + or state.has_all(("Punch", "Punch Uppercut"), p)) + + # Orb crates and fly box in this area can be gotten with yellow eco and goggles. + # Start with the first yellow eco cluster near first_bats and work your way backward toward the entrance. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 23) + main_area.add_fly_locations([43]) + + # Includes 4 orbs collectable with the blue eco vent. + first_bats = JakAndDaxterRegion("First Bats Area", player, multiworld, level_name, 4) + + first_jump_pad = JakAndDaxterRegion("First Jump Pad", player, multiworld, level_name, 0) + first_jump_pad.add_fly_locations([393259]) + + # The tethers in this level are all out of order... a casual playthrough has the following order for the cell ID's: + # 42, 39, 40, 41. So that is the order we're calling "first, second, third, fourth". + + # First tether cell is collectable with yellow eco and goggles. + first_tether = JakAndDaxterRegion("First Tether", player, multiworld, level_name, 7) + first_tether.add_cell_locations([42]) + + # This rat colony has 3 orbs on top of it, requires special movement. + first_tether_rat_colony = JakAndDaxterRegion("First Tether Rat Colony", player, multiworld, level_name, 3) + + # If quick enough, combat not required. + second_jump_pad = JakAndDaxterRegion("Second Jump Pad", player, multiworld, level_name, 0) + second_jump_pad.add_fly_locations([65579]) + + first_pole_course = JakAndDaxterRegion("First Pole Course", player, multiworld, level_name, 28) + + # You can break this tether with a yellow eco vent and goggles, + # but you can't reach the platform unless you can jump high. + second_tether = JakAndDaxterRegion("Second Tether", player, multiworld, level_name, 0) + second_tether.add_cell_locations([39], access_rule=lambda state: can_jump_higher(state, player)) + + # Fly and orbs are collectable with nearby blue eco cluster. + second_bats = JakAndDaxterRegion("Second Bats Area", player, multiworld, level_name, 27) + second_bats.add_fly_locations([262187], access_rule=lambda state: can_jump_farther(state, player)) + + third_jump_pad = JakAndDaxterRegion("Third Jump Pad (Arena)", player, multiworld, level_name, 0) + third_jump_pad.add_cell_locations([38], access_rule=lambda state: can_fight(state, player)) + + # The platform for the third tether might look high, but you can get a boost from the yellow eco vent. + fourth_jump_pad = JakAndDaxterRegion("Fourth Jump Pad (Third Tether)", player, multiworld, level_name, 9) + fourth_jump_pad.add_cell_locations([40]) + + # Orbs collectable here with yellow eco and goggles. + flut_flut_pad = JakAndDaxterRegion("Flut Flut Pad", player, multiworld, level_name, 36) + + flut_flut_course = JakAndDaxterRegion("Flut Flut Course", player, multiworld, level_name, 23) + flut_flut_course.add_cell_locations([37]) + flut_flut_course.add_fly_locations([327723, 131115]) + + # Includes some orbs on the way to the cabin, blue+yellow eco to collect. + farthy_snacks = JakAndDaxterRegion("Farthy's Snacks", player, multiworld, level_name, 7) + farthy_snacks.add_cell_locations([36]) + + # Scout fly in this field can be broken with yellow eco. + box_field = JakAndDaxterRegion("Field of Boxes", player, multiworld, level_name, 10) + box_field.add_fly_locations([196651]) + + last_tar_pit = JakAndDaxterRegion("Last Tar Pit", player, multiworld, level_name, 12) + + fourth_tether = JakAndDaxterRegion("Fourth Tether", player, multiworld, level_name, 11) + fourth_tether.add_cell_locations([41], access_rule=lambda state: can_jump_higher(state, player)) + + main_area.connect(first_bats, rule=lambda state: can_jump_farther(state, player)) + + first_bats.connect(main_area) + first_bats.connect(first_jump_pad) + first_bats.connect(first_tether) + + first_jump_pad.connect(first_bats) + + first_tether.connect(first_bats) + first_tether.connect(first_tether_rat_colony, rule=lambda state: + (state.has_all(("Roll", "Roll Jump"), player) + or state.has_all(("Double Jump", "Jump Kick"), player))) + first_tether.connect(second_jump_pad) + first_tether.connect(first_pole_course) + + first_tether_rat_colony.connect(first_tether) + + second_jump_pad.connect(first_tether) + + first_pole_course.connect(first_tether) + first_pole_course.connect(second_tether) + + second_tether.connect(first_pole_course, rule=lambda state: can_jump_higher(state, player)) + second_tether.connect(second_bats) + + second_bats.connect(second_tether) + second_bats.connect(third_jump_pad) + second_bats.connect(fourth_jump_pad) + second_bats.connect(flut_flut_pad) + + third_jump_pad.connect(second_bats) + fourth_jump_pad.connect(second_bats) + + flut_flut_pad.connect(second_bats) + flut_flut_pad.connect(flut_flut_course, rule=lambda state: state.has("Flut Flut", player)) # Naturally. + flut_flut_pad.connect(farthy_snacks) + + flut_flut_course.connect(flut_flut_pad) + + farthy_snacks.connect(flut_flut_pad) + farthy_snacks.connect(box_field, rule=lambda state: can_jump_higher(state, player)) + + box_field.connect(farthy_snacks, rule=lambda state: can_jump_higher(state, player)) + box_field.connect(last_tar_pit, rule=lambda state: can_jump_farther(state, player)) + + last_tar_pit.connect(box_field, rule=lambda state: can_jump_farther(state, player)) + last_tar_pit.connect(fourth_tether, rule=lambda state: can_jump_farther(state, player)) + + fourth_tether.connect(last_tar_pit, rule=lambda state: can_jump_farther(state, player)) + fourth_tether.connect(main_area) # Fall down. + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(first_bats) + world.level_to_regions[level_name].append(first_jump_pad) + world.level_to_regions[level_name].append(first_tether) + world.level_to_regions[level_name].append(first_tether_rat_colony) + world.level_to_regions[level_name].append(second_jump_pad) + world.level_to_regions[level_name].append(first_pole_course) + world.level_to_regions[level_name].append(second_tether) + world.level_to_regions[level_name].append(second_bats) + world.level_to_regions[level_name].append(third_jump_pad) + world.level_to_regions[level_name].append(fourth_jump_pad) + world.level_to_regions[level_name].append(flut_flut_pad) + world.level_to_regions[level_name].append(flut_flut_course) + world.level_to_regions[level_name].append(farthy_snacks) + world.level_to_regions[level_name].append(box_field) + world.level_to_regions[level_name].append(last_tar_pit) + world.level_to_regions[level_name].append(fourth_tether) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(8, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/fire_canyon_regions.py b/worlds/jakanddaxter/regs/fire_canyon_regions.py new file mode 100644 index 0000000000..9ce0f5dae2 --- /dev/null +++ b/worlds/jakanddaxter/regs/fire_canyon_regions.py @@ -0,0 +1,38 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_reach_orbs_level +from ..locs import cell_locations as cells, scout_locations as scouts + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 50) + + # Everything is accessible by making contact with the zoomer. + main_area.add_cell_locations(cells.locFC_cellTable.keys()) + main_area.add_fly_locations(scouts.locFC_scoutTable.keys()) + + world.level_to_regions[level_name].append(main_area) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(5, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/forbidden_jungle_regions.py b/worlds/jakanddaxter/regs/forbidden_jungle_regions.py new file mode 100644 index 0000000000..601a802e55 --- /dev/null +++ b/worlds/jakanddaxter/regs/forbidden_jungle_regions.py @@ -0,0 +1,103 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> tuple[JakAndDaxterRegion, ...]: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 25) + + # You can get this scout fly by running from the blue eco vent across the temple bridge, + # falling onto the river, collecting the 3 blue clusters, using the jump pad, and running straight to the box. + main_area.add_fly_locations([393223]) + + lurker_machine = JakAndDaxterRegion("Lurker Machine", player, multiworld, level_name, 5) + lurker_machine.add_cell_locations([3], access_rule=lambda state: can_fight(state, player)) + + # This cell and this scout fly can both be gotten with the blue eco clusters near the jump pad. + lurker_machine.add_cell_locations([9]) + lurker_machine.add_fly_locations([131079]) + + river = JakAndDaxterRegion("River", player, multiworld, level_name, 42) + + # All of these can be gotten with blue eco, hitting the dark eco boxes, or by running. + river.add_cell_locations([5, 8]) + river.add_fly_locations([7, 196615]) + river.add_special_locations([5]) + river.add_cache_locations([10369]) + + temple_exit = JakAndDaxterRegion("Temple Exit", player, multiworld, level_name, 12) + + # This fly is too far from accessible blue eco sources. + temple_exit.add_fly_locations([262151], access_rule=lambda state: can_free_scout_flies(state, player)) + + temple_exterior = JakAndDaxterRegion("Temple Exterior", player, multiworld, level_name, 10) + + # All of these can be gotten with blue eco and running. + temple_exterior.add_cell_locations([4]) + temple_exterior.add_fly_locations([327687, 65543]) + temple_exterior.add_special_locations([4]) + + temple_int_pre_blue = JakAndDaxterRegion("Temple Interior (Pre Blue Eco)", player, multiworld, level_name, 17) + temple_int_pre_blue.add_cell_locations([2]) + temple_int_pre_blue.add_special_locations([2]) + + temple_int_post_blue = JakAndDaxterRegion("Temple Interior (Post Blue Eco)", player, multiworld, level_name, 39) + temple_int_post_blue.add_cell_locations([6], access_rule=lambda state: can_fight(state, player)) + + main_area.connect(lurker_machine) # Run and jump (tree stump platforms). + main_area.connect(river) # Jump down. + main_area.connect(temple_exit) # Run and jump (bridges). + + lurker_machine.connect(main_area) # Jump down. + lurker_machine.connect(river) # Jump down. + lurker_machine.connect(temple_exterior) # Jump down (ledge). + + river.connect(main_area) # Jump up (ledges near fisherman). + river.connect(lurker_machine) # Jump pad (aim toward machine). + river.connect(temple_exit) # Run and jump (trampolines). + river.connect(temple_exterior) # Jump pad (aim toward temple door). + + temple_exit.connect(main_area) # Run and jump (bridges). + temple_exit.connect(river) # Jump down. + temple_exit.connect(temple_exterior) # Run and jump (bridges, dodge spikes). + + # Requires Jungle Elevator. + temple_exterior.connect(temple_int_pre_blue, rule=lambda state: state.has("Jungle Elevator", player)) + + # Requires Blue Eco Switch. + temple_int_pre_blue.connect(temple_int_post_blue, rule=lambda state: state.has("Blue Eco Switch", player)) + + # Requires defeating the plant boss (combat). + temple_int_post_blue.connect(temple_exit, rule=lambda state: can_fight(state, player)) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(lurker_machine) + world.level_to_regions[level_name].append(river) + world.level_to_regions[level_name].append(temple_exit) + world.level_to_regions[level_name].append(temple_exterior) + world.level_to_regions[level_name].append(temple_int_pre_blue) + world.level_to_regions[level_name].append(temple_int_post_blue) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 150 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(3, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area, temple_int_post_blue diff --git a/worlds/jakanddaxter/regs/geyser_rock_regions.py b/worlds/jakanddaxter/regs/geyser_rock_regions.py new file mode 100644 index 0000000000..10783067c3 --- /dev/null +++ b/worlds/jakanddaxter/regs/geyser_rock_regions.py @@ -0,0 +1,48 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_reach_orbs_level +from ..locs import scout_locations as scouts + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 48) + main_area.add_cell_locations([92, 93]) + main_area.add_fly_locations(scouts.locGR_scoutTable.keys()) # All Flies here are accessible with blue eco. + + # The last 2 orbs are barely gettable with the blue eco vent, but it's pushing accessibility. So I moved them here. + cliff = JakAndDaxterRegion("Cliff", player, multiworld, level_name, 2) + cliff.add_cell_locations([94]) + + main_area.connect(cliff, rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or state.has_all(("Crouch", "Crouch Uppercut"), player)) + + cliff.connect(main_area) # Jump down or ride blue eco elevator. + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(cliff) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(0, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/gol_and_maias_citadel_regions.py b/worlds/jakanddaxter/regs/gol_and_maias_citadel_regions.py new file mode 100644 index 0000000000..83d2d51f1d --- /dev/null +++ b/worlds/jakanddaxter/regs/gol_and_maias_citadel_regions.py @@ -0,0 +1,137 @@ +from BaseClasses import CollectionState +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity, CompletionCondition +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +# God help me... here we go. +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> tuple[JakAndDaxterRegion | None, ...]: + multiworld = world.multiworld + options = world.options + player = world.player + + # This level is full of short-medium gaps that cannot be crossed by single jump alone. + # These helper functions list out the moves that can cross all these gaps (painting with a broad brush but...) + def can_jump_farther(state: CollectionState, p: int) -> bool: + return (state.has_any(("Double Jump", "Jump Kick"), p) + or state.has_all(("Punch", "Punch Uppercut"), p)) + + def can_triple_jump(state: CollectionState, p: int) -> bool: + return state.has_all(("Double Jump", "Jump Kick"), p) + + def can_jump_stairs(state: CollectionState, p: int) -> bool: + return (state.has("Double Jump", p) + or state.has("Jump Dive", p) + or state.has_all(("Crouch", "Crouch Jump"), p) + or state.has_all(("Crouch", "Crouch Uppercut"), p)) + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 0) + main_area.add_fly_locations([91], access_rule=lambda state: can_free_scout_flies(state, player)) + + robot_scaffolding = JakAndDaxterRegion("Scaffolding Around Robot", player, multiworld, level_name, 8) + robot_scaffolding.add_fly_locations([196699], access_rule=lambda state: can_free_scout_flies(state, player)) + + jump_pad_room = JakAndDaxterRegion("Jump Pad Chamber", player, multiworld, level_name, 88) + jump_pad_room.add_cell_locations([73], access_rule=lambda state: can_fight(state, player)) + jump_pad_room.add_special_locations([73], access_rule=lambda state: can_fight(state, player)) + jump_pad_room.add_fly_locations([131163]) # Blue eco vent is right next to it. + jump_pad_room.add_fly_locations([65627], access_rule=lambda state: + can_free_scout_flies(state, player) and can_jump_farther(state, player)) + jump_pad_room.add_cache_locations([24039, 24040]) # First, blue eco vent, second, blue eco cluster near sage. + + blast_furnace = JakAndDaxterRegion("Blast Furnace", player, multiworld, level_name, 39) + blast_furnace.add_cell_locations([71], access_rule=lambda state: can_fight(state, player)) + blast_furnace.add_special_locations([71], access_rule=lambda state: can_fight(state, player)) + blast_furnace.add_fly_locations([393307]) # Blue eco vent nearby. + blast_furnace.add_cache_locations([24038]) # Blue eco cluster near sage. + + bunny_room = JakAndDaxterRegion("Bunny Chamber", player, multiworld, level_name, 45) + bunny_room.add_cell_locations([72], access_rule=lambda state: can_fight(state, player)) + bunny_room.add_special_locations([72], access_rule=lambda state: can_fight(state, player)) + bunny_room.add_fly_locations([262235], access_rule=lambda state: can_free_scout_flies(state, player)) + + rotating_tower = JakAndDaxterRegion("Rotating Tower", player, multiworld, level_name, 20) + rotating_tower.add_cell_locations([70], access_rule=lambda state: can_fight(state, player)) + rotating_tower.add_special_locations([70], access_rule=lambda state: can_fight(state, player)) + rotating_tower.add_fly_locations([327771], access_rule=lambda state: can_free_scout_flies(state, player)) + + final_boss = JakAndDaxterRegion("Final Boss", player, multiworld, level_name, 0) + + # Jump Dive required for a lot of buttons, prepare yourself. + main_area.connect(robot_scaffolding, rule=lambda state: + state.has("Jump Dive", player) or state.has_all(("Roll", "Roll Jump"), player)) + main_area.connect(jump_pad_room) + + robot_scaffolding.connect(main_area, rule=lambda state: state.has("Jump Dive", player)) + robot_scaffolding.connect(blast_furnace, rule=lambda state: + state.has("Jump Dive", player) + and can_jump_farther(state, player) + and (can_triple_jump(state, player) or state.has_all(("Roll", "Roll Jump"), player))) + robot_scaffolding.connect(bunny_room, rule=lambda state: + state.has("Jump Dive", player) + and can_jump_farther(state, player) + and (can_triple_jump(state, player) or state.has_all(("Roll", "Roll Jump"), player))) + + jump_pad_room.connect(main_area) + jump_pad_room.connect(robot_scaffolding, rule=lambda state: + state.has("Jump Dive", player) + and (can_triple_jump(state, player) or state.has_all(("Roll", "Roll Jump"), player))) + + blast_furnace.connect(robot_scaffolding) # Blue eco elevator takes you right back. + + bunny_room.connect(robot_scaffolding, rule=lambda state: + state.has("Jump Dive", player) + and (can_jump_farther(state, player) or state.has_all(("Roll", "Roll Jump"), player))) + + # Final climb. + robot_scaffolding.connect(rotating_tower, rule=lambda state: + can_jump_stairs(state, player) + and state.has_all(("Freed The Blue Sage", + "Freed The Red Sage", + "Freed The Yellow Sage"), player)) + + rotating_tower.connect(main_area) # Take stairs back down. + + # Final elevator. Need to break boxes at summit to get blue eco for platform. + rotating_tower.connect(final_boss, rule=lambda state: + can_fight(state, player) + and state.has("Freed The Green Sage", player)) + + final_boss.connect(rotating_tower) # Take elevator back down. + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(robot_scaffolding) + world.level_to_regions[level_name].append(jump_pad_room) + world.level_to_regions[level_name].append(blast_furnace) + world.level_to_regions[level_name].append(bunny_room) + world.level_to_regions[level_name].append(rotating_tower) + world.level_to_regions[level_name].append(final_boss) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(15, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + # Final door. Need 100 power cells. + if options.jak_completion_condition == CompletionCondition.option_open_100_cell_door: + final_door = JakAndDaxterRegion("Final Door", player, multiworld, level_name, 0) + final_boss.connect(final_door, rule=lambda state: state.has("Power Cell", player, 100)) + + world.level_to_regions[level_name].append(final_door) + + return main_area, final_boss, final_door + else: + return main_area, final_boss, None diff --git a/worlds/jakanddaxter/regs/lava_tube_regions.py b/worlds/jakanddaxter/regs/lava_tube_regions.py new file mode 100644 index 0000000000..c3a4c5b24d --- /dev/null +++ b/worlds/jakanddaxter/regs/lava_tube_regions.py @@ -0,0 +1,38 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_reach_orbs_level +from ..locs import cell_locations as cells, scout_locations as scouts + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 50) + + # Everything is accessible by making contact with the zoomer. + main_area.add_cell_locations(cells.locLT_cellTable.keys()) + main_area.add_fly_locations(scouts.locLT_scoutTable.keys()) + + world.level_to_regions[level_name].append(main_area) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(14, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/lost_precursor_city_regions.py b/worlds/jakanddaxter/regs/lost_precursor_city_regions.py new file mode 100644 index 0000000000..f4a2ed6b51 --- /dev/null +++ b/worlds/jakanddaxter/regs/lost_precursor_city_regions.py @@ -0,0 +1,155 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + # Just the starting area. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 4) + + first_room_upper = JakAndDaxterRegion("First Chamber (Upper)", player, multiworld, level_name, 21) + + first_room_lower = JakAndDaxterRegion("First Chamber (Lower)", player, multiworld, level_name, 0) + first_room_lower.add_fly_locations([262193], access_rule=lambda state: can_free_scout_flies(state, player)) + + first_room_orb_cache = JakAndDaxterRegion("First Chamber Orb Cache", player, multiworld, level_name, 22) + + # Need jump dive to activate button, double jump to reach blue eco to unlock cache. + first_room_orb_cache.add_cache_locations([14507], access_rule=lambda state: + state.has_all(("Jump Dive", "Double Jump"), player)) + + first_hallway = JakAndDaxterRegion("First Hallway", player, multiworld, level_name, 10) + first_hallway.add_fly_locations([131121], access_rule=lambda state: can_free_scout_flies(state, player)) + + # This entire room is accessible with floating platforms and single jump. + second_room = JakAndDaxterRegion("Second Chamber", player, multiworld, level_name, 28) + + # These items can only be gotten with jump dive to activate a button. + second_room.add_cell_locations([45], access_rule=lambda state: state.has("Jump Dive", player)) + second_room.add_fly_locations([49, 65585], access_rule=lambda state: state.has("Jump Dive", player)) + + # This is the scout fly on the way to the pipe cell, requires normal breaking moves. + second_room.add_fly_locations([196657], access_rule=lambda state: can_free_scout_flies(state, player)) + + # This orb vent and scout fly are right next to each other, can be gotten with blue eco and the floating platforms. + second_room.add_fly_locations([393265]) + second_room.add_cache_locations([14838]) + + # Named after the cell, includes the armored lurker room. + center_complex = JakAndDaxterRegion("Center of the Complex", player, multiworld, level_name, 17) + center_complex.add_cell_locations([51]) + + color_platforms = JakAndDaxterRegion("Color Platforms", player, multiworld, level_name, 6) + color_platforms.add_cell_locations([44], access_rule=lambda state: can_fight(state, player)) + + quick_platforms = JakAndDaxterRegion("Quick Platforms", player, multiworld, level_name, 3) + + # Jump dive to activate button. + quick_platforms.add_cell_locations([48], access_rule=lambda state: state.has("Jump Dive", player)) + + first_slide = JakAndDaxterRegion("First Slide", player, multiworld, level_name, 22) + + # Raised chamber room, includes vent room with scout fly prior to second slide. + capsule_room = JakAndDaxterRegion("Capsule Chamber", player, multiworld, level_name, 6) + + # Use jump dive to activate button inside the capsule. Blue eco vent can ready the chamber and get the scout fly. + capsule_room.add_cell_locations([47], access_rule=lambda state: + state.has("Jump Dive", player) + and (state.has_any(("Double Jump", "Jump Kick"), player) + or state.has_all(("Punch", "Punch Uppercut"), player))) + capsule_room.add_fly_locations([327729]) + + # You can slide to the bottom of the city, but if you spawn down there, you have no momentum from the slide. + # So you need some kind of jump to reach this cell. + second_slide = JakAndDaxterRegion("Second Slide", player, multiworld, level_name, 31) + second_slide.add_cell_locations([46], access_rule=lambda state: + state.has_any(("Double Jump", "Jump Kick"), player) + or state.has_all(("Punch", "Punch Uppercut"), player)) + + # If you can enter the helix room, you can jump or fight your way to the top. But you need some kind of movement + # to enter it in the first place. + helix_room = JakAndDaxterRegion("Helix Chamber", player, multiworld, level_name, 30) + helix_room.add_cell_locations([50], access_rule=lambda state: + state.has("Double Jump", player) + or can_fight(state, player)) + + main_area.connect(first_room_upper) # Run. + + first_room_upper.connect(main_area) # Run. + first_room_upper.connect(first_hallway) # Run and jump (floating platforms). + first_room_upper.connect(first_room_lower) # Run and jump down. + + first_room_lower.connect(first_room_upper) # Run and jump (floating platforms). + + # Needs some movement to reach these orbs and orb cache. + first_room_lower.connect(first_room_orb_cache, rule=lambda state: + state.has_all(("Jump Dive", "Double Jump"), player)) + first_room_orb_cache.connect(first_room_lower, rule=lambda state: + state.has_all(("Jump Dive", "Double Jump"), player)) + + first_hallway.connect(first_room_upper) # Run and jump down. + first_hallway.connect(second_room) # Run and jump (floating platforms). + + second_room.connect(first_hallway) # Run and jump. + second_room.connect(center_complex) # Run and jump down. + + center_complex.connect(second_room) # Run and jump (swim). + center_complex.connect(color_platforms) # Run and jump (swim). + center_complex.connect(quick_platforms) # Run and jump (swim). + + color_platforms.connect(center_complex) # Run and jump (swim). + + quick_platforms.connect(center_complex) # Run and jump (swim). + quick_platforms.connect(first_slide) # Slide. + + first_slide.connect(capsule_room) # Slide. + + capsule_room.connect(second_slide) # Slide. + capsule_room.connect(main_area, rule=lambda state: # Chamber goes back to surface. + state.has("Jump Dive", player)) # (Assume one-way for sanity.) + + second_slide.connect(helix_room, rule=lambda state: # As stated above, you need to jump + state.has_any(("Double Jump", "Jump Kick"), player) # across the dark eco pool before + or state.has_all(("Punch", "Punch Uppercut"), player)) # you can climb the helix room. + + helix_room.connect(quick_platforms, rule=lambda state: # Escape to get back to here. + state.has("Double Jump", player) # Capsule is a convenient exit to the level. + or can_fight(state, player)) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(first_room_upper) + world.level_to_regions[level_name].append(first_room_lower) + world.level_to_regions[level_name].append(first_room_orb_cache) + world.level_to_regions[level_name].append(first_hallway) + world.level_to_regions[level_name].append(second_room) + world.level_to_regions[level_name].append(center_complex) + world.level_to_regions[level_name].append(color_platforms) + world.level_to_regions[level_name].append(quick_platforms) + world.level_to_regions[level_name].append(first_slide) + world.level_to_regions[level_name].append(capsule_room) + world.level_to_regions[level_name].append(second_slide) + world.level_to_regions[level_name].append(helix_room) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(7, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/misty_island_regions.py b/worlds/jakanddaxter/regs/misty_island_regions.py new file mode 100644 index 0000000000..a6ae612247 --- /dev/null +++ b/worlds/jakanddaxter/regs/misty_island_regions.py @@ -0,0 +1,131 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 9) + + muse_course = JakAndDaxterRegion("Muse Course", player, multiworld, level_name, 21) + muse_course.add_cell_locations([23]) + muse_course.add_fly_locations([327708], access_rule=lambda state: can_free_scout_flies(state, player)) + + zoomer = JakAndDaxterRegion("Zoomer", player, multiworld, level_name, 32) + zoomer.add_cell_locations([27, 29]) + zoomer.add_fly_locations([393244]) + + ship = JakAndDaxterRegion("Ship", player, multiworld, level_name, 10) + ship.add_cell_locations([24]) + ship.add_fly_locations([131100], access_rule=lambda state: can_free_scout_flies(state, player)) + + far_side = JakAndDaxterRegion("Far Side", player, multiworld, level_name, 16) + + # In order to even reach this fly, you must use the seesaw or crouch jump. + far_side_cliff = JakAndDaxterRegion("Far Side Cliff", player, multiworld, level_name, 5) + far_side_cliff.add_fly_locations([28], access_rule=lambda state: can_free_scout_flies(state, player)) + + # To carry the blue eco fast enough to open this cache, you need to break the bone bridges along the way. + far_side_cache = JakAndDaxterRegion("Far Side Orb Cache", player, multiworld, level_name, 15) + far_side_cache.add_cache_locations([11072], access_rule=lambda state: can_fight(state, player)) + + barrel_course = JakAndDaxterRegion("Barrel Course", player, multiworld, level_name, 10) + barrel_course.add_fly_locations([196636], access_rule=lambda state: can_free_scout_flies(state, player)) + + # 14 orbs for the boxes you can only break with the cannon. + cannon = JakAndDaxterRegion("Cannon", player, multiworld, level_name, 14) + cannon.add_cell_locations([26], access_rule=lambda state: can_fight(state, player)) + + upper_approach = JakAndDaxterRegion("Upper Arena Approach", player, multiworld, level_name, 6) + upper_approach.add_fly_locations([65564, 262172], access_rule=lambda state: + can_free_scout_flies(state, player)) + + lower_approach = JakAndDaxterRegion("Lower Arena Approach", player, multiworld, level_name, 7) + lower_approach.add_cell_locations([30]) + + arena = JakAndDaxterRegion("Arena", player, multiworld, level_name, 5) + arena.add_cell_locations([25], access_rule=lambda state: can_fight(state, player)) + + main_area.connect(muse_course) # TODO - What do you need to chase the muse the whole way around? + main_area.connect(zoomer) # Run and jump down. + main_area.connect(ship) # Run and jump. + main_area.connect(lower_approach) # Run and jump. + + # Need to break the bone bridge to access. + main_area.connect(upper_approach, rule=lambda state: can_fight(state, player)) + + muse_course.connect(main_area) # Run and jump down. + + # The zoomer pad is low enough that it requires Crouch Jump specifically. + zoomer.connect(main_area, rule=lambda state: state.has_all(("Crouch", "Crouch Jump"), player)) + + ship.connect(main_area) # Run and jump down. + ship.connect(far_side) # Run and jump down. + ship.connect(barrel_course) # Run and jump (dodge barrels). + + far_side.connect(ship) # Run and jump. + far_side.connect(arena) # Run and jump. + + # Only if you can use the seesaw or Crouch Jump from the seesaw's edge. + far_side.connect(far_side_cliff, rule=lambda state: + state.has("Jump Dive", player) + or state.has_all(("Crouch", "Crouch Jump"), player)) + + # Only if you can break the bone bridges to carry blue eco over the mud pit. + far_side.connect(far_side_cache, rule=lambda state: can_fight(state, player)) + + far_side_cliff.connect(far_side) # Run and jump down. + + barrel_course.connect(cannon) # Run and jump (dodge barrels). + + cannon.connect(barrel_course) # Run and jump (dodge barrels). + cannon.connect(arena) # Run and jump down. + cannon.connect(upper_approach) # Run and jump down. + + upper_approach.connect(lower_approach) # Jump down. + upper_approach.connect(arena) # Jump down. + + # One cliff is accessible, but only via Crouch Jump. + lower_approach.connect(upper_approach, rule=lambda state: state.has_all(("Crouch", "Crouch Jump"), player)) + + # Requires breaking bone bridges. + lower_approach.connect(arena, rule=lambda state: can_fight(state, player)) + + arena.connect(lower_approach) # Run. + arena.connect(far_side) # Run. + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(muse_course) + world.level_to_regions[level_name].append(zoomer) + world.level_to_regions[level_name].append(ship) + world.level_to_regions[level_name].append(far_side) + world.level_to_regions[level_name].append(far_side_cliff) + world.level_to_regions[level_name].append(far_side_cache) + world.level_to_regions[level_name].append(barrel_course) + world.level_to_regions[level_name].append(cannon) + world.level_to_regions[level_name].append(upper_approach) + world.level_to_regions[level_name].append(lower_approach) + world.level_to_regions[level_name].append(arena) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 150 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(4, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/mountain_pass_regions.py b/worlds/jakanddaxter/regs/mountain_pass_regions.py new file mode 100644 index 0000000000..bd26be8dd2 --- /dev/null +++ b/worlds/jakanddaxter/regs/mountain_pass_regions.py @@ -0,0 +1,67 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_reach_orbs_level +from ..locs import scout_locations as scouts +from worlds.generic.Rules import add_rule + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> tuple[JakAndDaxterRegion, ...]: + multiworld = world.multiworld + options = world.options + player = world.player + + # This is basically just Klaww. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 0) + main_area.add_cell_locations([86]) + + # Some folks prefer firing Yellow Eco from the hip, so optionally put this rule before Klaww. Klaww is the only + # location in main_area, so he's at index 0. + if world.options.require_punch_for_klaww: + add_rule(main_area.locations[0], lambda state: state.has("Punch", player)) + + race = JakAndDaxterRegion("Race", player, multiworld, level_name, 50) + race.add_cell_locations([87]) + + # All scout flies can be broken with the zoomer. + race.add_fly_locations(scouts.locMP_scoutTable.keys()) + + shortcut = JakAndDaxterRegion("Shortcut", player, multiworld, level_name, 0) + shortcut.add_cell_locations([110]) + + # Of course, in order to make it to the race region, you must defeat Klaww. He's not optional. + # So we need to set up this inter-region rule as well (or make it free if the setting is off). + if world.options.require_punch_for_klaww: + main_area.connect(race, rule=lambda state: state.has("Punch", player)) + else: + main_area.connect(race) + + # You actually can go backwards from the race back to Klaww's area. + race.connect(main_area) + race.connect(shortcut, rule=lambda state: state.has("Yellow Eco Switch", player)) + + shortcut.connect(race) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(race) + world.level_to_regions[level_name].append(shortcut) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(10, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + # Return race required for inter-level connections. + return main_area, race diff --git a/worlds/jakanddaxter/regs/precursor_basin_regions.py b/worlds/jakanddaxter/regs/precursor_basin_regions.py new file mode 100644 index 0000000000..25a109155b --- /dev/null +++ b/worlds/jakanddaxter/regs/precursor_basin_regions.py @@ -0,0 +1,38 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_reach_orbs_level +from ..locs import cell_locations as cells, scout_locations as scouts + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 200) + + # Everything is accessible by making contact with the zoomer. + main_area.add_cell_locations(cells.locPB_cellTable.keys()) + main_area.add_fly_locations(scouts.locPB_scoutTable.keys()) + + world.level_to_regions[level_name].append(main_area) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(9, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/region_base.py b/worlds/jakanddaxter/regs/region_base.py new file mode 100644 index 0000000000..cb1005aa7a --- /dev/null +++ b/worlds/jakanddaxter/regs/region_base.py @@ -0,0 +1,91 @@ +from typing import Iterable +from BaseClasses import MultiWorld, Region +from ..game_id import jak1_name +from ..locations import JakAndDaxterLocation, location_table +from ..locs import (orb_locations as orbs, + cell_locations as cells, + scout_locations as scouts, + special_locations as specials, + orb_cache_locations as caches) +from worlds.generic.Rules import CollectionRule + + +class JakAndDaxterRegion(Region): + """ + Holds region information such as name, level name, number of orbs available, etc. + We especially need orb counts to be tracked because we need to know when you can + afford the Citizen and Oracle orb payments for more checks. + """ + game: str = jak1_name + level_name: str + orb_count: int + location_count: int = 0 + + def __init__(self, name: str, player: int, multiworld: MultiWorld, level_name: str = "", orb_count: int = 0): + formatted_name = f"{level_name} {name}".strip() + super().__init__(formatted_name, player, multiworld) + self.level_name = level_name + self.orb_count = orb_count + + def add_cell_locations(self, locations: Iterable[int], access_rule: CollectionRule | None = None) -> None: + """ + Adds a Power Cell Location to this region with the given access rule. + Converts Game ID's to AP ID's for you. + """ + for loc in locations: + ap_id = cells.to_ap_id(loc) + self.add_jak_location(ap_id, location_table[ap_id], access_rule) + + def add_fly_locations(self, locations: Iterable[int], access_rule: CollectionRule | None = None) -> None: + """ + Adds a Scout Fly Location to this region with the given access rule. + Converts Game ID's to AP ID's for you. + """ + for loc in locations: + ap_id = scouts.to_ap_id(loc) + self.add_jak_location(ap_id, location_table[ap_id], access_rule) + + def add_special_locations(self, locations: Iterable[int], access_rule: CollectionRule | None = None) -> None: + """ + Adds a Special Location to this region with the given access rule. + Converts Game ID's to AP ID's for you. + Special Locations should be matched alongside their respective + Power Cell Locations, so you get 2 unlocks for these rather than 1. + """ + for loc in locations: + ap_id = specials.to_ap_id(loc) + self.add_jak_location(ap_id, location_table[ap_id], access_rule) + + def add_cache_locations(self, locations: Iterable[int], access_rule: CollectionRule | None = None) -> None: + """ + Adds an Orb Cache Location to this region with the given access rule. + Converts Game ID's to AP ID's for you. + """ + for loc in locations: + ap_id = caches.to_ap_id(loc) + self.add_jak_location(ap_id, location_table[ap_id], access_rule) + + def add_orb_locations(self, level_index: int, bundle_index: int, access_rule: CollectionRule | None = None) -> None: + """ + Adds Orb Bundle Locations to this region equal to `bundle_count`. Used only when Per-Level Orbsanity is enabled. + The orb factory class will handle AP ID enumeration. + """ + bundle_address = orbs.create_address(level_index, bundle_index) + location = JakAndDaxterLocation(self.player, + f"{self.level_name} Orb Bundle {bundle_index + 1}".strip(), + orbs.to_ap_id(bundle_address), + self) + if access_rule: + location.access_rule = access_rule + self.locations.append(location) + self.location_count += 1 + + def add_jak_location(self, ap_id: int, name: str, access_rule: CollectionRule | None = None) -> None: + """ + Helper function to add Locations. Not to be used directly. + """ + location = JakAndDaxterLocation(self.player, name, ap_id, self) + if access_rule: + location.access_rule = access_rule + self.locations.append(location) + self.location_count += 1 diff --git a/worlds/jakanddaxter/regs/rock_village_regions.py b/worlds/jakanddaxter/regs/rock_village_regions.py new file mode 100644 index 0000000000..2138eb1194 --- /dev/null +++ b/worlds/jakanddaxter/regs/rock_village_regions.py @@ -0,0 +1,75 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> tuple[JakAndDaxterRegion, ...]: + multiworld = world.multiworld + options = world.options + player = world.player + + # This includes most of the area surrounding LPC as well, for orb_count purposes. You can swim and single jump. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 23) + main_area.add_cell_locations([31], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([32], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([33], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([34], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([35], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, 34)) + + # These 2 scout fly boxes can be broken by running with nearby blue eco. + main_area.add_fly_locations([196684, 262220]) + main_area.add_fly_locations([76, 131148, 65612, 327756], access_rule=lambda state: + can_free_scout_flies(state, player)) + + # Warrior Pontoon check. You just talk to him and get his introduction. + main_area.add_special_locations([33]) + + orb_cache = JakAndDaxterRegion("Orb Cache", player, multiworld, level_name, 20) + + # You need roll jump to be able to reach this before the blue eco runs out. + orb_cache.add_cache_locations([10945], access_rule=lambda state: state.has_all(("Roll", "Roll Jump"), player)) + + # Fly here can be gotten with Yellow Eco from Boggy, goggles, and no extra movement options (see fly ID 43). + pontoon_bridge = JakAndDaxterRegion("Pontoon Bridge", player, multiworld, level_name, 7) + pontoon_bridge.add_fly_locations([393292]) + + klaww_cliff = JakAndDaxterRegion("Klaww's Cliff", player, multiworld, level_name, 0) + + main_area.connect(orb_cache, rule=lambda state: state.has_all(("Roll", "Roll Jump"), player)) + main_area.connect(pontoon_bridge, rule=lambda state: state.has("Warrior's Pontoons", player)) + + orb_cache.connect(main_area) + + pontoon_bridge.connect(main_area, rule=lambda state: state.has("Warrior's Pontoons", player)) + pontoon_bridge.connect(klaww_cliff, rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or state.has_all(("Crouch", "Crouch Uppercut", "Jump Kick"), player)) + + klaww_cliff.connect(pontoon_bridge) # Just jump back down. + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(orb_cache) + world.level_to_regions[level_name].append(pontoon_bridge) + world.level_to_regions[level_name].append(klaww_cliff) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(6, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + # Return klaww_cliff required for inter-level connections. + return main_area, pontoon_bridge, klaww_cliff diff --git a/worlds/jakanddaxter/regs/sandover_village_regions.py b/worlds/jakanddaxter/regs/sandover_village_regions.py new file mode 100644 index 0000000000..3969cdb41a --- /dev/null +++ b/worlds/jakanddaxter/regs/sandover_village_regions.py @@ -0,0 +1,83 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 26) + + # Yakows requires no combat. + main_area.add_cell_locations([10]) + main_area.add_cell_locations([11], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([12], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + + # These 4 scout fly boxes can be broken by running with all the blue eco from Sentinel Beach. + main_area.add_fly_locations([262219, 327755, 131147, 65611]) + + # The farmer's scout fly. You can either get the Orb Cache Cliff blue eco, or break it normally. + main_area.add_fly_locations([196683], access_rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or can_free_scout_flies(state, player)) + + orb_cache_cliff = JakAndDaxterRegion("Orb Cache Cliff", player, multiworld, level_name, 15) + orb_cache_cliff.add_cache_locations([10344]) + + yakow_cliff = JakAndDaxterRegion("Yakow Cliff", player, multiworld, level_name, 3) + yakow_cliff.add_fly_locations([75], access_rule=lambda state: can_free_scout_flies(state, player)) + + oracle_platforms = JakAndDaxterRegion("Oracle Platforms", player, multiworld, level_name, 6) + oracle_platforms.add_cell_locations([13], access_rule=lambda state: + world.can_trade(state, world.total_trade_orbs, None)) + oracle_platforms.add_cell_locations([14], access_rule=lambda state: + world.can_trade(state, world.total_trade_orbs, 13)) + oracle_platforms.add_fly_locations([393291], access_rule=lambda state: + can_free_scout_flies(state, player)) + + main_area.connect(orb_cache_cliff, rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or state.has_all(("Crouch", "Crouch Uppercut", "Jump Kick"), player)) + + main_area.connect(yakow_cliff, rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or state.has_all(("Crouch", "Crouch Uppercut", "Jump Kick"), player)) + + main_area.connect(oracle_platforms, rule=lambda state: + state.has_all(("Roll", "Roll Jump"), player) + or state.has_all(("Double Jump", "Jump Kick"), player)) + + # All these can go back to main_area immediately. + orb_cache_cliff.connect(main_area) + yakow_cliff.connect(main_area) + oracle_platforms.connect(main_area) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(orb_cache_cliff) + world.level_to_regions[level_name].append(yakow_cliff) + world.level_to_regions[level_name].append(oracle_platforms) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(1, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/sentinel_beach_regions.py b/worlds/jakanddaxter/regs/sentinel_beach_regions.py new file mode 100644 index 0000000000..293215ea82 --- /dev/null +++ b/worlds/jakanddaxter/regs/sentinel_beach_regions.py @@ -0,0 +1,108 @@ +from BaseClasses import CollectionState +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 128) + main_area.add_cell_locations([18, 21, 22]) + + # These scout fly boxes can be broken by running with freely accessible blue eco. + # The 3 clusters by the Flut Flut egg can go surprisingly far. + main_area.add_fly_locations([327700, 20, 65556, 262164]) + + # This scout fly box can be broken with the locked blue eco vent, or by normal combat tricks. + main_area.add_fly_locations([393236], access_rule=lambda state: + state.has("Blue Eco Switch", player) + or can_free_scout_flies(state, player)) + + # No need for the blue eco vent for either of the orb caches. + main_area.add_cache_locations([12634, 12635]) + + pelican = JakAndDaxterRegion("Pelican", player, multiworld, level_name, 0) + pelican.add_cell_locations([16], access_rule=lambda state: can_fight(state, player)) + + # Only these specific attacks can push the flut flut egg off the cliff. + flut_flut_egg = JakAndDaxterRegion("Flut Flut Egg", player, multiworld, level_name, 0) + flut_flut_egg.add_cell_locations([17], access_rule=lambda state: + state.has_any(("Punch", "Kick", "Jump Kick"), player)) + flut_flut_egg.add_special_locations([17], access_rule=lambda state: + state.has_any(("Punch", "Kick", "Jump Kick"), player)) + + eco_harvesters = JakAndDaxterRegion("Eco Harvesters", player, multiworld, level_name, 0) + eco_harvesters.add_cell_locations([15], access_rule=lambda state: can_fight(state, player)) + + green_ridge = JakAndDaxterRegion("Ridge Near Green Vents", player, multiworld, level_name, 5) + green_ridge.add_fly_locations([131092], access_rule=lambda state: can_free_scout_flies(state, player)) + + blue_ridge = JakAndDaxterRegion("Ridge Near Blue Vent", player, multiworld, level_name, 5) + blue_ridge.add_fly_locations([196628], access_rule=lambda state: + state.has("Blue Eco Switch", player) + or can_free_scout_flies(state, player)) + + cannon_tower = JakAndDaxterRegion("Cannon Tower", player, multiworld, level_name, 12) + cannon_tower.add_cell_locations([19], access_rule=lambda state: can_fight(state, player)) + + main_area.connect(pelican) # Swim and jump. + main_area.connect(flut_flut_egg) # Run and jump. + main_area.connect(eco_harvesters) # Run. + + # We need a helper function for the uppercut logs. + def can_uppercut_and_jump_logs(state: CollectionState, p: int) -> bool: + return (state.has_any(("Double Jump", "Jump Kick"), p) + and (state.has_all(("Crouch", "Crouch Uppercut"), p) + or state.has_all(("Punch", "Punch Uppercut"), p))) + + # If you have double jump or crouch jump, you don't need the logs to reach this place. + main_area.connect(green_ridge, rule=lambda state: + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player) + or can_uppercut_and_jump_logs(state, player)) + + # If you have the blue eco jump pad, you don't need the logs to reach this place. + main_area.connect(blue_ridge, rule=lambda state: + state.has("Blue Eco Switch", player) + or can_uppercut_and_jump_logs(state, player)) + + main_area.connect(cannon_tower, rule=lambda state: state.has("Blue Eco Switch", player)) + + # All these can go back to main_area immediately. + pelican.connect(main_area) + flut_flut_egg.connect(main_area) + eco_harvesters.connect(main_area) + green_ridge.connect(main_area) + blue_ridge.connect(main_area) + cannon_tower.connect(main_area) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(pelican) + world.level_to_regions[level_name].append(flut_flut_egg) + world.level_to_regions[level_name].append(eco_harvesters) + world.level_to_regions[level_name].append(green_ridge) + world.level_to_regions[level_name].append(blue_ridge) + world.level_to_regions[level_name].append(cannon_tower) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 150 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(2, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/snowy_mountain_regions.py b/worlds/jakanddaxter/regs/snowy_mountain_regions.py new file mode 100644 index 0000000000..5adc3e9d22 --- /dev/null +++ b/worlds/jakanddaxter/regs/snowy_mountain_regions.py @@ -0,0 +1,203 @@ +from BaseClasses import CollectionState +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +# God help me... here we go. +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + # We need a few helper functions. + def can_cross_long_gap(state: CollectionState, p: int) -> bool: + return (state.has_all(("Roll", "Roll Jump"), p) + or state.has_all(("Double Jump", "Jump Kick"), p)) + + def can_jump_blockers(state: CollectionState, p: int) -> bool: + return (state.has_any(("Double Jump", "Jump Kick"), p) + or state.has_all(("Crouch", "Crouch Jump"), p) + or state.has_all(("Punch", "Punch Uppercut"), p)) + + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 0) + main_area.add_fly_locations([65], access_rule=lambda state: can_free_scout_flies(state, player)) + + # We need a few virtual regions like we had for Dark Crystals in Spider Cave. + # First, a virtual region for the glacier lurkers. + glacier_lurkers = JakAndDaxterRegion("Glacier Lurkers", player, multiworld, level_name, 0) + + # Need to fight all the troops. + # Troop in snowball_canyon: cross main_area. + # Troop in ice_skating_rink: cross main_area and fort_exterior. + # Troop in fort_exterior: cross main_area and fort_exterior. + glacier_lurkers.add_cell_locations([61], access_rule=lambda state: + can_fight(state, player) + and can_cross_long_gap(state, player)) + + # Second, a virtual region for the precursor blockers. Unlike the others, this contains orbs: + # the total number of orbs that sit on top of the blockers. Yes, there are only 8. + blockers = JakAndDaxterRegion("Precursor Blockers", player, multiworld, level_name, 8) + + # 1 in main_area + # 2 in snowball_canyon + # 4 in ice_skating_rink + # 3 in fort_exterior + # 3 in bunny_cave_start + blockers.add_cell_locations([66], access_rule=lambda state: + can_fight(state, player) + and can_cross_long_gap(state, player)) + + snowball_canyon = JakAndDaxterRegion("Snowball Canyon", player, multiworld, level_name, 28) + + # The scout fly box *can* be broken without YES, so leave it in this region. + frozen_box_cave = JakAndDaxterRegion("Frozen Box Cave", player, multiworld, level_name, 12) + frozen_box_cave.add_fly_locations([327745], access_rule=lambda state: + state.has("Yellow Eco Switch", player) + or can_free_scout_flies(state, player)) + + # This region has crates that can *only* be broken with YES. + frozen_box_cave_crates = JakAndDaxterRegion("Frozen Box Cave Orb Crates", player, multiworld, level_name, 8) + frozen_box_cave_crates.add_cell_locations([67], access_rule=lambda state: + state.has("Yellow Eco Switch", player)) + + # Include 6 orbs on the twin elevator ice ramp. + ice_skating_rink = JakAndDaxterRegion("Ice Skating Rink", player, multiworld, level_name, 20) + ice_skating_rink.add_fly_locations([131137], access_rule=lambda state: can_free_scout_flies(state, player)) + + flut_flut_course = JakAndDaxterRegion("Flut Flut Course", player, multiworld, level_name, 15) + flut_flut_course.add_cell_locations([63], access_rule=lambda state: state.has("Flut Flut", player)) + flut_flut_course.add_special_locations([63], access_rule=lambda state: state.has("Flut Flut", player)) + + # Includes the bridge from snowball_canyon, the area beneath that bridge, and the areas around the fort. + fort_exterior = JakAndDaxterRegion("Fort Exterior", player, multiworld, level_name, 20) + fort_exterior.add_fly_locations([65601, 393281], access_rule=lambda state: + can_free_scout_flies(state, player)) + + # Includes the icy island and bridge outside the cave entrance. + bunny_cave_start = JakAndDaxterRegion("Bunny Cave (Start)", player, multiworld, level_name, 10) + + # Includes the cell and 3 orbs at the exit. + bunny_cave_end = JakAndDaxterRegion("Bunny Cave (End)", player, multiworld, level_name, 3) + bunny_cave_end.add_cell_locations([64]) + + switch_cave = JakAndDaxterRegion("Yellow Eco Switch Cave", player, multiworld, level_name, 4) + switch_cave.add_cell_locations([60]) + switch_cave.add_special_locations([60]) + + # Only what can be covered by single jump. + fort_interior = JakAndDaxterRegion("Fort Interior (Main)", player, multiworld, level_name, 19) + + # Reaching the top of the watch tower, getting the fly with the blue eco, and falling down to get the caches. + fort_interior_caches = JakAndDaxterRegion("Fort Interior (Caches)", player, multiworld, level_name, 51) + fort_interior_caches.add_fly_locations([196673]) + fort_interior_caches.add_cache_locations([23348, 23349, 23350]) + + # Need higher jump. + fort_interior_base = JakAndDaxterRegion("Fort Interior (Base)", player, multiworld, level_name, 0) + fort_interior_base.add_fly_locations([262209], access_rule=lambda state: + can_free_scout_flies(state, player)) + + # Need farther jump. + fort_interior_course_end = JakAndDaxterRegion("Fort Interior (Course End)", player, multiworld, level_name, 2) + fort_interior_course_end.add_cell_locations([62]) + + # Wire up the virtual regions first. + main_area.connect(blockers, rule=lambda state: can_jump_blockers(state, player)) + main_area.connect(glacier_lurkers, rule=lambda state: can_fight(state, player)) + + # Yes, the only way into the rest of the level requires advanced movement. + main_area.connect(snowball_canyon, rule=lambda state: can_cross_long_gap(state, player)) + + snowball_canyon.connect(main_area) # But you can just jump down and run up the ramp. + snowball_canyon.connect(bunny_cave_start) # Jump down from the glacier troop cliff. + snowball_canyon.connect(fort_exterior) # Jump down, to the left of frozen box cave. + snowball_canyon.connect(frozen_box_cave, rule=lambda state: # More advanced movement. + can_cross_long_gap(state, player)) + + frozen_box_cave.connect(snowball_canyon, rule=lambda state: # Same movement to go back. + can_cross_long_gap(state, player)) + frozen_box_cave.connect(frozen_box_cave_crates, rule=lambda state: # YES to get these crates. + state.has("Yellow Eco Switch", player)) + frozen_box_cave.connect(ice_skating_rink, rule=lambda state: # Same movement to go forward. + can_cross_long_gap(state, player)) + + frozen_box_cave_crates.connect(frozen_box_cave) # Semi-virtual region, no moves req'd. + + ice_skating_rink.connect(frozen_box_cave, rule=lambda state: # Same movement to go back. + can_cross_long_gap(state, player)) + ice_skating_rink.connect(flut_flut_course, rule=lambda state: # Duh. + state.has("Flut Flut", player)) + ice_skating_rink.connect(fort_exterior) # Just slide down the elevator ramp. + + fort_exterior.connect(ice_skating_rink, rule=lambda state: # Twin elevators OR scout fly ledge. + can_cross_long_gap(state, player)) # Both doable with main_gap logic. + fort_exterior.connect(snowball_canyon) # Run across bridge. + fort_exterior.connect(fort_interior, rule=lambda state: # Duh. + state.has("Snowy Fort Gate", player)) + fort_exterior.connect(bunny_cave_start) # Run across bridge. + fort_exterior.connect(switch_cave, rule=lambda state: # Yes, blocker jumps work here. + can_jump_blockers(state, player)) + + fort_interior.connect(fort_interior_caches, rule=lambda state: # Just need a little height. + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player)) + fort_interior.connect(fort_interior_base, rule=lambda state: # Just need a little height. + state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player)) + fort_interior.connect(fort_interior_course_end, rule=lambda state: # Just need a little distance. + state.has_any(("Double Jump", "Jump Kick"), player) + or state.has_all(("Punch", "Punch Uppercut"), player)) + + flut_flut_course.connect(fort_exterior) # Ride the elevator. + + # Must fight way through cave, but there is also a grab-less ledge we must jump over. + bunny_cave_start.connect(bunny_cave_end, rule=lambda state: + can_fight(state, player) + and (state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player))) + + # All jump down. + fort_interior_caches.connect(fort_interior) + fort_interior_base.connect(fort_interior) + fort_interior_course_end.connect(fort_interior) + switch_cave.connect(fort_exterior) + bunny_cave_end.connect(fort_exterior) + + # I really hope that is everything. + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(glacier_lurkers) + world.level_to_regions[level_name].append(blockers) + world.level_to_regions[level_name].append(snowball_canyon) + world.level_to_regions[level_name].append(frozen_box_cave) + world.level_to_regions[level_name].append(frozen_box_cave_crates) + world.level_to_regions[level_name].append(ice_skating_rink) + world.level_to_regions[level_name].append(flut_flut_course) + world.level_to_regions[level_name].append(fort_exterior) + world.level_to_regions[level_name].append(bunny_cave_start) + world.level_to_regions[level_name].append(bunny_cave_end) + world.level_to_regions[level_name].append(switch_cave) + world.level_to_regions[level_name].append(fort_interior) + world.level_to_regions[level_name].append(fort_interior_caches) + world.level_to_regions[level_name].append(fort_interior_base) + world.level_to_regions[level_name].append(fort_interior_course_end) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(12, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/spider_cave_regions.py b/worlds/jakanddaxter/regs/spider_cave_regions.py new file mode 100644 index 0000000000..6069bbb80c --- /dev/null +++ b/worlds/jakanddaxter/regs/spider_cave_regions.py @@ -0,0 +1,127 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_fight, can_reach_orbs_level + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + # A large amount of this area can be covered by single jump, floating platforms, web trampolines, and goggles. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 63) + main_area.add_cell_locations([78, 84]) + main_area.add_fly_locations([327765, 393301, 196693, 131157]) + + # This is a virtual region describing what you need to DO to get the Dark Crystal power cell, + # rather than describing where each of the crystals ARE, because you can destroy them in any order, + # and you need to destroy ALL of them to get the cell. + dark_crystals = JakAndDaxterRegion("Dark Crystals", player, multiworld, level_name, 0) + + # can_fight = The underwater crystal in dark cave. + # Roll Jump = The underwater crystal across a long dark eco pool. + # The rest of the crystals can be destroyed with yellow eco in main_area. + dark_crystals.add_cell_locations([79], access_rule=lambda state: + can_fight(state, player) + and state.has_all(("Roll", "Roll Jump"), player)) + + dark_cave = JakAndDaxterRegion("Dark Cave", player, multiworld, level_name, 5) + dark_cave.add_cell_locations([80]) + dark_cave.add_fly_locations([262229], access_rule=lambda state: can_free_scout_flies(state, player)) + + robot_cave = JakAndDaxterRegion("Robot Cave", player, multiworld, level_name, 0) + + # Need double jump for orbs. + scaffolding_level_zero = JakAndDaxterRegion("Robot Scaffolding Level 0", player, multiworld, level_name, 12) + + scaffolding_level_one = JakAndDaxterRegion("Robot Scaffolding Level 1", player, multiworld, level_name, 53) + scaffolding_level_one.add_fly_locations([85]) # Shootable. + + scaffolding_level_two = JakAndDaxterRegion("Robot Scaffolding Level 2", player, multiworld, level_name, 4) + + # Using the blue eco from the pole course, you can single jump to the scout fly up here. + scaffolding_level_three = JakAndDaxterRegion("Robot Scaffolding Level 3", player, multiworld, level_name, 29) + scaffolding_level_three.add_cell_locations([81]) + scaffolding_level_three.add_fly_locations([65621]) + + pole_course = JakAndDaxterRegion("Pole Course", player, multiworld, level_name, 18) + pole_course.add_cell_locations([82]) + + # You only need combat to fight through the spiders, but to collect the orb crates, + # you will need the yellow eco vent unlocked. + spider_tunnel = JakAndDaxterRegion("Spider Tunnel", player, multiworld, level_name, 4) + spider_tunnel.add_cell_locations([83]) + + spider_tunnel_crates = JakAndDaxterRegion("Spider Tunnel Orb Crates", player, multiworld, level_name, 12) + + main_area.connect(dark_crystals) + main_area.connect(robot_cave) + main_area.connect(dark_cave, rule=lambda state: + can_fight(state, player) + and (state.has("Double Jump", player) + or state.has_all(("Crouch", "Crouch Jump"), player))) + + robot_cave.connect(main_area) + robot_cave.connect(pole_course) # Nothing special required. + robot_cave.connect(scaffolding_level_one) # Ramps lead to level 1. + robot_cave.connect(spider_tunnel) # Web trampolines (bounce twice on each to gain momentum). + + pole_course.connect(robot_cave) # Blue eco platform down. + + scaffolding_level_one.connect(robot_cave) # All scaffolding (level 1+) connects back by jumping down. + + # Elevator, but the orbs need double jump or jump kick. + scaffolding_level_one.connect(scaffolding_level_zero, rule=lambda state: + state.has_any(("Double Jump", "Jump Kick"), player)) + + # Narrow enough that enemies are unavoidable. + scaffolding_level_one.connect(scaffolding_level_two, rule=lambda state: can_fight(state, player)) + + scaffolding_level_zero.connect(scaffolding_level_one) # Elevator. + + scaffolding_level_two.connect(robot_cave) # Jump down. + scaffolding_level_two.connect(scaffolding_level_one) # Elevator. + + # Elevator, but narrow enough that enemies are unavoidable. + scaffolding_level_two.connect(scaffolding_level_three, rule=lambda state: can_fight(state, player)) + + scaffolding_level_three.connect(robot_cave) # Jump down. + scaffolding_level_three.connect(scaffolding_level_two) # Elevator. + + spider_tunnel.connect(robot_cave) # Back to web trampolines. + spider_tunnel.connect(main_area) # Escape with jump pad. + + # Requires yellow eco switch. + spider_tunnel.connect(spider_tunnel_crates, rule=lambda state: state.has("Yellow Eco Switch", player)) + + world.level_to_regions[level_name].append(main_area) + world.level_to_regions[level_name].append(dark_crystals) + world.level_to_regions[level_name].append(dark_cave) + world.level_to_regions[level_name].append(robot_cave) + world.level_to_regions[level_name].append(scaffolding_level_zero) + world.level_to_regions[level_name].append(scaffolding_level_one) + world.level_to_regions[level_name].append(scaffolding_level_two) + world.level_to_regions[level_name].append(scaffolding_level_three) + world.level_to_regions[level_name].append(pole_course) + world.level_to_regions[level_name].append(spider_tunnel) + world.level_to_regions[level_name].append(spider_tunnel_crates) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 200 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(13, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/regs/volcanic_crater_regions.py b/worlds/jakanddaxter/regs/volcanic_crater_regions.py new file mode 100644 index 0000000000..47bfccfd2b --- /dev/null +++ b/worlds/jakanddaxter/regs/volcanic_crater_regions.py @@ -0,0 +1,52 @@ +from .region_base import JakAndDaxterRegion +from ..options import EnableOrbsanity +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from .. import JakAndDaxterWorld +from ..rules import can_free_scout_flies, can_reach_orbs_level +from ..locs import scout_locations as scouts + + +def build_regions(level_name: str, world: "JakAndDaxterWorld") -> JakAndDaxterRegion: + multiworld = world.multiworld + options = world.options + player = world.player + + # No area is inaccessible in VC even with only running and jumping. + main_area = JakAndDaxterRegion("Main Area", player, multiworld, level_name, 50) + main_area.add_cell_locations([96], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([97], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, 96)) + main_area.add_cell_locations([98], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, 97)) + main_area.add_cell_locations([99], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, 98)) + main_area.add_cell_locations([100], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, None)) + main_area.add_cell_locations([101], access_rule=lambda state: world.can_trade(state, world.total_trade_orbs, 100)) + + # Hidden Power Cell: you can carry yellow eco from Spider Cave just by running and jumping + # and using your Goggles to shoot the box (you do not need Punch to shoot from FP mode). + main_area.add_cell_locations([74]) + + # No blue eco sources in this area, all boxes must be broken by hand (yellow eco can't be carried far enough). + main_area.add_fly_locations(scouts.locVC_scoutTable.keys(), access_rule=lambda state: + can_free_scout_flies(state, player)) + + # Approach the gondola to get this check. + main_area.add_special_locations([105]) + + world.level_to_regions[level_name].append(main_area) + + # If Per-Level Orbsanity is enabled, build the special Orbsanity Region. This is a virtual region always + # accessible to Main Area. The Locations within are automatically checked when you collect enough orbs. + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + orbs = JakAndDaxterRegion("Orbsanity", player, multiworld, level_name) + + bundle_count = 50 // world.orb_bundle_size + for bundle_index in range(bundle_count): + amount = world.orb_bundle_size * (bundle_index + 1) + orbs.add_orb_locations(11, + bundle_index, + access_rule=lambda state, level=level_name, orb_amount=amount: + can_reach_orbs_level(state, player, world, level, orb_amount)) + multiworld.regions.append(orbs) + main_area.connect(orbs) + + return main_area diff --git a/worlds/jakanddaxter/requirements.txt b/worlds/jakanddaxter/requirements.txt new file mode 100644 index 0000000000..ca36764fbf --- /dev/null +++ b/worlds/jakanddaxter/requirements.txt @@ -0,0 +1 @@ +Pymem>=1.13.0 diff --git a/worlds/jakanddaxter/rules.py b/worlds/jakanddaxter/rules.py new file mode 100644 index 0000000000..25a8323f4d --- /dev/null +++ b/worlds/jakanddaxter/rules.py @@ -0,0 +1,270 @@ +import logging +import math +import typing +from BaseClasses import CollectionState +from Options import OptionError +from .options import (EnableOrbsanity, + GlobalOrbsanityBundleSize, + PerLevelOrbsanityBundleSize, + FireCanyonCellCount, + MountainPassCellCount, + LavaTubeCellCount, + CitizenOrbTradeAmount, + OracleOrbTradeAmount) +from .locs import cell_locations as cells +from .locations import location_table +from .levels import level_table + +if typing.TYPE_CHECKING: + from . import JakAndDaxterWorld + + +def set_orb_trade_rule(world: "JakAndDaxterWorld"): + options = world.options + player = world.player + + if options.enable_orbsanity == EnableOrbsanity.option_off: + world.can_trade = lambda state, required_orbs, required_previous_trade: ( + can_trade_vanilla(state, player, world, required_orbs, required_previous_trade)) + else: + world.can_trade = lambda state, required_orbs, required_previous_trade: ( + can_trade_orbsanity(state, player, world, required_orbs, required_previous_trade)) + + +def recalculate_reachable_orbs(state: CollectionState, player: int, world: "JakAndDaxterWorld") -> None: + + # Recalculate every level, every time the cache is stale, because you don't know + # when a specific bundle of orbs in one level may unlock access to another. + accessible_total_orbs = 0 + for level in level_table: + accessible_level_orbs = count_reachable_orbs_level(state, world, level) + accessible_total_orbs += accessible_level_orbs + state.prog_items[player][f"{level} Reachable Orbs".lstrip()] = accessible_level_orbs + + # Also recalculate the global count, still used even when Orbsanity is Off. + state.prog_items[player]["Reachable Orbs"] = accessible_total_orbs + state.prog_items[player]["Reachable Orbs Fresh"] = True + + +def count_reachable_orbs_global(state: CollectionState, + world: "JakAndDaxterWorld") -> int: + + accessible_orbs = 0 + for level_regions in world.level_to_orb_regions.values(): + for region in level_regions: + if region.can_reach(state): + accessible_orbs += region.orb_count + return accessible_orbs + + +def count_reachable_orbs_level(state: CollectionState, + world: "JakAndDaxterWorld", + level_name: str = "") -> int: + + accessible_orbs = 0 + for region in world.level_to_orb_regions[level_name]: + if region.can_reach(state): + accessible_orbs += region.orb_count + return accessible_orbs + + +def can_reach_orbs_global(state: CollectionState, + player: int, + world: "JakAndDaxterWorld", + orb_amount: int) -> bool: + + if not state.prog_items[player]["Reachable Orbs Fresh"]: + recalculate_reachable_orbs(state, player, world) + + return state.has("Reachable Orbs", player, orb_amount) + + +def can_reach_orbs_level(state: CollectionState, + player: int, + world: "JakAndDaxterWorld", + level_name: str, + orb_amount: int) -> bool: + + if not state.prog_items[player]["Reachable Orbs Fresh"]: + recalculate_reachable_orbs(state, player, world) + + return state.has(f"{level_name} Reachable Orbs", player, orb_amount) + + +def can_trade_vanilla(state: CollectionState, + player: int, + world: "JakAndDaxterWorld", + required_orbs: int, + required_previous_trade: typing.Optional[int] = None) -> bool: + + # With Orbsanity Off, Reachable Orbs are in fact Tradeable Orbs. + if not state.prog_items[player]["Reachable Orbs Fresh"]: + recalculate_reachable_orbs(state, player, world) + + if required_previous_trade: + name_of_previous_trade = location_table[cells.to_ap_id(required_previous_trade)] + return (state.has("Reachable Orbs", player, required_orbs) + and state.can_reach_location(name_of_previous_trade, player=player)) + return state.has("Reachable Orbs", player, required_orbs) + + +def can_trade_orbsanity(state: CollectionState, + player: int, + world: "JakAndDaxterWorld", + required_orbs: int, + required_previous_trade: typing.Optional[int] = None) -> bool: + + # Yes, even Orbsanity trades may unlock access to new Reachable Orbs. + if not state.prog_items[player]["Reachable Orbs Fresh"]: + recalculate_reachable_orbs(state, player, world) + + if required_previous_trade: + name_of_previous_trade = location_table[cells.to_ap_id(required_previous_trade)] + return (state.has("Tradeable Orbs", player, required_orbs) + and state.can_reach_location(name_of_previous_trade, player=player)) + return state.has("Tradeable Orbs", player, required_orbs) + + +def can_free_scout_flies(state: CollectionState, player: int) -> bool: + return state.has("Jump Dive", player) or state.has_all({"Crouch", "Crouch Uppercut"}, player) + + +def can_fight(state: CollectionState, player: int) -> bool: + return state.has_any(("Jump Dive", "Jump Kick", "Punch", "Kick"), player) + + +def clamp_cell_limits(world: "JakAndDaxterWorld") -> str: + options = world.options + friendly_message = "" + + if options.fire_canyon_cell_count.value > FireCanyonCellCount.friendly_maximum: + old_value = options.fire_canyon_cell_count.value + options.fire_canyon_cell_count.value = FireCanyonCellCount.friendly_maximum + friendly_message += (f" " + f"{options.fire_canyon_cell_count.display_name} must be no greater than " + f"{FireCanyonCellCount.friendly_maximum} (was {old_value}), " + f"changed option to appropriate value.\n") + + if options.mountain_pass_cell_count.value > MountainPassCellCount.friendly_maximum: + old_value = options.mountain_pass_cell_count.value + options.mountain_pass_cell_count.value = MountainPassCellCount.friendly_maximum + friendly_message += (f" " + f"{options.mountain_pass_cell_count.display_name} must be no greater than " + f"{MountainPassCellCount.friendly_maximum} (was {old_value}), " + f"changed option to appropriate value.\n") + + if options.lava_tube_cell_count.value > LavaTubeCellCount.friendly_maximum: + old_value = options.lava_tube_cell_count.value + options.lava_tube_cell_count.value = LavaTubeCellCount.friendly_maximum + friendly_message += (f" " + f"{options.lava_tube_cell_count.display_name} must be no greater than " + f"{LavaTubeCellCount.friendly_maximum} (was {old_value}), " + f"changed option to appropriate value.\n") + + return friendly_message + + +def clamp_trade_total_limits(world: "JakAndDaxterWorld"): + """Check if we need to recalculate the 2 trade orb options so the total fits under 2000. If so let's keep them + proportional relative to each other. Then we'll recalculate total_trade_orbs. Remember this situation is + only possible if both values are greater than 0, otherwise the absolute maximums would keep them under 2000.""" + options = world.options + friendly_message = "" + + world.total_trade_orbs = (9 * options.citizen_orb_trade_amount) + (6 * options.oracle_orb_trade_amount) + if world.total_trade_orbs > 2000: + old_total = world.total_trade_orbs + old_citizen_value = options.citizen_orb_trade_amount.value + old_oracle_value = options.oracle_orb_trade_amount.value + + coefficient = old_oracle_value / old_citizen_value + + options.citizen_orb_trade_amount.value = math.floor(2000 / (9 + (6 * coefficient))) + options.oracle_orb_trade_amount.value = math.floor(coefficient * options.citizen_orb_trade_amount.value) + world.total_trade_orbs = (9 * options.citizen_orb_trade_amount) + (6 * options.oracle_orb_trade_amount) + + friendly_message += (f" " + f"Required number of orbs ({old_total}) must be no greater than total orbs in the game " + f"(2000). Reduced the value of {world.options.citizen_orb_trade_amount.display_name} " + f"from {old_citizen_value} to {options.citizen_orb_trade_amount.value} and " + f"{world.options.oracle_orb_trade_amount.display_name} from {old_oracle_value} to " + f"{options.oracle_orb_trade_amount.value}.\n") + + return friendly_message + + +def enforce_mp_friendly_limits(world: "JakAndDaxterWorld"): + options = world.options + friendly_message = "" + + if options.enable_orbsanity == EnableOrbsanity.option_global: + if options.global_orbsanity_bundle_size.value < GlobalOrbsanityBundleSize.friendly_minimum: + old_value = options.global_orbsanity_bundle_size.value + options.global_orbsanity_bundle_size.value = GlobalOrbsanityBundleSize.friendly_minimum + friendly_message += (f" " + f"{options.global_orbsanity_bundle_size.display_name} must be no less than " + f"{GlobalOrbsanityBundleSize.friendly_minimum} (was {old_value}), " + f"changed option to appropriate value.\n") + + if options.global_orbsanity_bundle_size.value > GlobalOrbsanityBundleSize.friendly_maximum: + old_value = options.global_orbsanity_bundle_size.value + options.global_orbsanity_bundle_size.value = GlobalOrbsanityBundleSize.friendly_maximum + friendly_message += (f" " + f"{options.global_orbsanity_bundle_size.display_name} must be no greater than " + f"{GlobalOrbsanityBundleSize.friendly_maximum} (was {old_value}), " + f"changed option to appropriate value.\n") + + if options.enable_orbsanity == EnableOrbsanity.option_per_level: + if options.level_orbsanity_bundle_size.value < PerLevelOrbsanityBundleSize.friendly_minimum: + old_value = options.level_orbsanity_bundle_size.value + options.level_orbsanity_bundle_size.value = PerLevelOrbsanityBundleSize.friendly_minimum + friendly_message += (f" " + f"{options.level_orbsanity_bundle_size.display_name} must be no less than " + f"{PerLevelOrbsanityBundleSize.friendly_minimum} (was {old_value}), " + f"changed option to appropriate value.\n") + + if options.citizen_orb_trade_amount.value > CitizenOrbTradeAmount.friendly_maximum: + old_value = options.citizen_orb_trade_amount.value + options.citizen_orb_trade_amount.value = CitizenOrbTradeAmount.friendly_maximum + friendly_message += (f" " + f"{options.citizen_orb_trade_amount.display_name} must be no greater than " + f"{CitizenOrbTradeAmount.friendly_maximum} (was {old_value}), " + f"changed option to appropriate value.\n") + + if options.oracle_orb_trade_amount.value > OracleOrbTradeAmount.friendly_maximum: + old_value = options.oracle_orb_trade_amount.value + options.oracle_orb_trade_amount.value = OracleOrbTradeAmount.friendly_maximum + friendly_message += (f" " + f"{options.oracle_orb_trade_amount.display_name} must be no greater than " + f"{OracleOrbTradeAmount.friendly_maximum} (was {old_value}), " + f"changed option to appropriate value.\n") + + friendly_message += clamp_cell_limits(world) + friendly_message += clamp_trade_total_limits(world) + + if friendly_message != "": + logging.warning(f"{world.player_name}: Your options have been modified to avoid disrupting the multiworld.\n" + f"{friendly_message}" + f"You can access more advanced options by setting 'enforce_friendly_options' in the seed " + f"generator's host.yaml to false and generating locally. (Use at your own risk!)") + + +def enforce_mp_absolute_limits(world: "JakAndDaxterWorld"): + friendly_message = "" + + friendly_message += clamp_trade_total_limits(world) + + if friendly_message != "": + logging.warning(f"{world.player_name}: Your options have been modified to avoid seed generation failures.\n" + f"{friendly_message}") + + +def enforce_sp_limits(world: "JakAndDaxterWorld"): + friendly_message = "" + + friendly_message += clamp_cell_limits(world) + friendly_message += clamp_trade_total_limits(world) + + if friendly_message != "": + logging.warning(f"{world.player_name}: Your options have been modified to avoid seed generation failures.\n" + f"{friendly_message}") diff --git a/worlds/jakanddaxter/test/__init__.py b/worlds/jakanddaxter/test/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/jakanddaxter/test/bases.py b/worlds/jakanddaxter/test/bases.py new file mode 100644 index 0000000000..73d18b80bf --- /dev/null +++ b/worlds/jakanddaxter/test/bases.py @@ -0,0 +1,107 @@ +from worlds.jakanddaxter import JakAndDaxterWorld +from ..game_id import jak1_name +from test.bases import WorldTestBase + + +class JakAndDaxterTestBase(WorldTestBase): + game = jak1_name + world: JakAndDaxterWorld + + level_info = { + "Geyser Rock": { + "cells": 4, + "flies": 7, + "orbs": 50, + "caches": 0, + }, + "Sandover Village": { + "cells": 6, + "flies": 7, + "orbs": 50, + "caches": 1, + }, + "Forbidden Jungle": { + "cells": 8, + "flies": 7, + "orbs": 150, + "caches": 1, + }, + "Sentinel Beach": { + "cells": 8, + "flies": 7, + "orbs": 150, + "caches": 2, + }, + "Misty Island": { + "cells": 8, + "flies": 7, + "orbs": 150, + "caches": 1, + }, + "Fire Canyon": { + "cells": 2, + "flies": 7, + "orbs": 50, + "caches": 0, + }, + "Rock Village": { + "cells": 6, + "flies": 7, + "orbs": 50, + "caches": 1, + }, + "Precursor Basin": { + "cells": 8, + "flies": 7, + "orbs": 200, + "caches": 0, + }, + "Lost Precursor City": { + "cells": 8, + "flies": 7, + "orbs": 200, + "caches": 2, + }, + "Boggy Swamp": { + "cells": 8, + "flies": 7, + "orbs": 200, + "caches": 0, + }, + "Mountain Pass": { + "cells": 4, + "flies": 7, + "orbs": 50, + "caches": 0, + }, + "Volcanic Crater": { + "cells": 8, + "flies": 7, + "orbs": 50, + "caches": 0, + }, + "Spider Cave": { + "cells": 8, + "flies": 7, + "orbs": 200, + "caches": 0, + }, + "Snowy Mountain": { + "cells": 8, + "flies": 7, + "orbs": 200, + "caches": 3, + }, + "Lava Tube": { + "cells": 2, + "flies": 7, + "orbs": 50, + "caches": 0, + }, + "Gol and Maia's Citadel": { + "cells": 5, + "flies": 7, + "orbs": 200, + "caches": 3, + }, + } diff --git a/worlds/jakanddaxter/test/test_locations.py b/worlds/jakanddaxter/test/test_locations.py new file mode 100644 index 0000000000..1d47066b93 --- /dev/null +++ b/worlds/jakanddaxter/test/test_locations.py @@ -0,0 +1,52 @@ +import typing + +from .bases import JakAndDaxterTestBase +from ..game_id import jak1_id +from ..regs.region_base import JakAndDaxterRegion +from ..locs import (scout_locations as scouts, + special_locations as specials, + orb_cache_locations as caches, + orb_locations as orbs) + + +class LocationsTest(JakAndDaxterTestBase): + + def get_regions(self): + return [typing.cast(JakAndDaxterRegion, reg) for reg in self.multiworld.get_regions(self.player)] + + def test_count_cells(self): + + for level in self.level_info: + cell_count = 0 + sublevels = [reg for reg in self.get_regions() if reg.level_name == level] + for sl in sublevels: + for loc in sl.locations: + if loc.address in range(jak1_id, jak1_id + scouts.fly_offset): + cell_count += 1 + self.assertEqual(self.level_info[level]["cells"] - 1, cell_count, level) # Don't count the Free 7 Cells. + + def test_count_flies(self): + for level in self.level_info: + fly_count = 0 + sublevels = [reg for reg in self.get_regions() if reg.level_name == level] + for sl in sublevels: + for loc in sl.locations: + if loc.address in range(jak1_id + scouts.fly_offset, jak1_id + specials.special_offset): + fly_count += 1 + self.assertEqual(self.level_info[level]["flies"], fly_count, level) + + def test_count_orbs(self): + for level in self.level_info: + sublevels = [reg for reg in self.get_regions() if reg.level_name == level] + orb_count = sum([reg.orb_count for reg in sublevels]) + self.assertEqual(self.level_info[level]["orbs"], orb_count, level) + + def test_count_caches(self): + for level in self.level_info: + cache_count = 0 + sublevels = [reg for reg in self.get_regions() if reg.level_name == level] + for sl in sublevels: + for loc in sl.locations: + if loc.address in range(jak1_id + caches.orb_cache_offset, jak1_id + orbs.orb_offset): + cache_count += 1 + self.assertEqual(self.level_info[level]["caches"], cache_count, level) diff --git a/worlds/jakanddaxter/test/test_moverando.py b/worlds/jakanddaxter/test/test_moverando.py new file mode 100644 index 0000000000..d912d43af8 --- /dev/null +++ b/worlds/jakanddaxter/test/test_moverando.py @@ -0,0 +1,32 @@ +from .bases import JakAndDaxterTestBase +from ..items import move_item_table + + +class MoveRandoTest(JakAndDaxterTestBase): + options = { + "enable_move_randomizer": True + } + + def test_move_items_in_pool(self): + for move in move_item_table: + self.assertIn(move_item_table[move], {item.name for item in self.multiworld.itempool}) + self.assertNotIn(move_item_table[move], + {item.name for item in self.multiworld.precollected_items[self.player]}) + + def test_cannot_reach_without_move(self): + self.assertAccessDependency( + ["GR: Climb Up The Cliff"], + [["Double Jump"], ["Crouch"]], + only_check_listed=True) + + +class NoMoveRandoTest(JakAndDaxterTestBase): + options = { + "enable_move_randomizer": False + } + + def test_move_items_in_inventory(self): + for move in move_item_table: + self.assertNotIn(move_item_table[move], {item.name for item in self.multiworld.itempool}) + self.assertIn(move_item_table[move], + {item.name for item in self.multiworld.precollected_items[self.player]}) diff --git a/worlds/jakanddaxter/test/test_orbsanity.py b/worlds/jakanddaxter/test/test_orbsanity.py new file mode 100644 index 0000000000..5f871c8552 --- /dev/null +++ b/worlds/jakanddaxter/test/test_orbsanity.py @@ -0,0 +1,61 @@ +from .bases import JakAndDaxterTestBase +from ..items import orb_item_table + + +class NoOrbsanityTest(JakAndDaxterTestBase): + options = { + "enable_orbsanity": 0, # Off + "level_orbsanity_bundle_size": 25, + "global_orbsanity_bundle_size": 16 + } + + def test_orb_bundles_not_exist_in_pool(self): + for bundle in orb_item_table: + self.assertNotIn(orb_item_table[bundle], {item.name for item in self.multiworld.itempool}) + + def test_orb_bundle_count(self): + bundle_name = orb_item_table[self.options["level_orbsanity_bundle_size"]] + count = len([item.name for item in self.multiworld.itempool if item.name == bundle_name]) + self.assertEqual(0, count) + + bundle_name = orb_item_table[self.options["global_orbsanity_bundle_size"]] + count = len([item.name for item in self.multiworld.itempool if item.name == bundle_name]) + self.assertEqual(0, count) + + +class PerLevelOrbsanityTest(JakAndDaxterTestBase): + options = { + "enable_orbsanity": 1, # Per Level + "level_orbsanity_bundle_size": 25 + } + + def test_orb_bundles_exist_in_pool(self): + for bundle in orb_item_table: + if bundle == self.options["level_orbsanity_bundle_size"]: + self.assertIn(orb_item_table[bundle], {item.name for item in self.multiworld.itempool}) + else: + self.assertNotIn(orb_item_table[bundle], {item.name for item in self.multiworld.itempool}) + + def test_orb_bundle_count(self): + bundle_name = orb_item_table[self.options["level_orbsanity_bundle_size"]] + count = len([item.name for item in self.multiworld.itempool if item.name == bundle_name]) + self.assertEqual(80, count) + + +class GlobalOrbsanityTest(JakAndDaxterTestBase): + options = { + "enable_orbsanity": 2, # Global + "global_orbsanity_bundle_size": 16 + } + + def test_orb_bundles_exist_in_pool(self): + for bundle in orb_item_table: + if bundle == self.options["global_orbsanity_bundle_size"]: + self.assertIn(orb_item_table[bundle], {item.name for item in self.multiworld.itempool}) + else: + self.assertNotIn(orb_item_table[bundle], {item.name for item in self.multiworld.itempool}) + + def test_orb_bundle_count(self): + bundle_name = orb_item_table[self.options["global_orbsanity_bundle_size"]] + count = len([item.name for item in self.multiworld.itempool if item.name == bundle_name]) + self.assertEqual(125, count) diff --git a/worlds/jakanddaxter/test/test_orderedcellcounts.py b/worlds/jakanddaxter/test/test_orderedcellcounts.py new file mode 100644 index 0000000000..7ad0d76ca5 --- /dev/null +++ b/worlds/jakanddaxter/test/test_orderedcellcounts.py @@ -0,0 +1,29 @@ +from .bases import JakAndDaxterTestBase + + +class ReorderedCellCountsTest(JakAndDaxterTestBase): + options = { + "enable_ordered_cell_counts": True, + "fire_canyon_cell_count": 20, + "mountain_pass_cell_count": 15, + "lava_tube_cell_count": 10, + } + + def test_reordered_cell_counts(self): + self.world.generate_early() + self.assertLessEqual(self.world.options.fire_canyon_cell_count, self.world.options.mountain_pass_cell_count) + self.assertLessEqual(self.world.options.mountain_pass_cell_count, self.world.options.lava_tube_cell_count) + + +class UnorderedCellCountsTest(JakAndDaxterTestBase): + options = { + "enable_ordered_cell_counts": False, + "fire_canyon_cell_count": 20, + "mountain_pass_cell_count": 15, + "lava_tube_cell_count": 10, + } + + def test_unordered_cell_counts(self): + self.world.generate_early() + self.assertGreaterEqual(self.world.options.fire_canyon_cell_count, self.world.options.mountain_pass_cell_count) + self.assertGreaterEqual(self.world.options.mountain_pass_cell_count, self.world.options.lava_tube_cell_count) diff --git a/worlds/jakanddaxter/test/test_trades.py b/worlds/jakanddaxter/test/test_trades.py new file mode 100644 index 0000000000..92552f9d0e --- /dev/null +++ b/worlds/jakanddaxter/test/test_trades.py @@ -0,0 +1,41 @@ +from .bases import JakAndDaxterTestBase + + +class TradesCostNothingTest(JakAndDaxterTestBase): + options = { + "enable_orbsanity": 2, + "global_orbsanity_bundle_size": 10, + "citizen_orb_trade_amount": 0, + "oracle_orb_trade_amount": 0, + "start_inventory": {"Power Cell": 100}, + } + + def test_orb_items_are_filler(self): + self.collect_all_but("") + self.assertNotIn("10 Precursor Orbs", self.multiworld.state.prog_items) + + def test_trades_are_accessible(self): + self.assertTrue(self.multiworld + .get_location("SV: Bring 90 Orbs To The Mayor", self.player) + .can_reach(self.multiworld.state)) + + +class TradesCostEverythingTest(JakAndDaxterTestBase): + options = { + "enable_orbsanity": 2, + "global_orbsanity_bundle_size": 10, + "citizen_orb_trade_amount": 120, + "oracle_orb_trade_amount": 150, + "start_inventory": {"Power Cell": 100}, + } + + def test_orb_items_are_progression(self): + self.collect_all_but("") + self.assertIn("10 Precursor Orbs", self.multiworld.state.prog_items[self.player]) + self.assertEqual(198, self.multiworld.state.prog_items[self.player]["10 Precursor Orbs"]) + + def test_trades_are_accessible(self): + self.collect_all_but("") + self.assertTrue(self.multiworld + .get_location("SV: Bring 90 Orbs To The Mayor", self.player) + .can_reach(self.multiworld.state)) diff --git a/worlds/jakanddaxter/test/test_traps.py b/worlds/jakanddaxter/test/test_traps.py new file mode 100644 index 0000000000..841997798b --- /dev/null +++ b/worlds/jakanddaxter/test/test_traps.py @@ -0,0 +1,80 @@ +from BaseClasses import ItemClassification +from .bases import JakAndDaxterTestBase + + +class NoTrapsTest(JakAndDaxterTestBase): + options = { + "filler_power_cells_replaced_with_traps": 0, + "filler_orb_bundles_replaced_with_traps": 0, + "trap_weights": {"Trip Trap": 1}, + } + + def test_trap_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Trip Trap" + and item.classification == ItemClassification.trap]) + self.assertEqual(0, count) + + def test_prog_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.progression_skip_balancing]) + self.assertEqual(72, count) + + def test_fill_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.filler]) + self.assertEqual(29, count) + + +class SomeTrapsTest(JakAndDaxterTestBase): + options = { + "filler_power_cells_replaced_with_traps": 10, + "filler_orb_bundles_replaced_with_traps": 10, + "trap_weights": {"Trip Trap": 1}, + } + + def test_trap_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Trip Trap" + and item.classification == ItemClassification.trap]) + self.assertEqual(10, count) + + def test_prog_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.progression_skip_balancing]) + self.assertEqual(72, count) + + def test_fill_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.filler]) + self.assertEqual(19, count) + + +class MaximumTrapsTest(JakAndDaxterTestBase): + options = { + "filler_power_cells_replaced_with_traps": 100, + "filler_orb_bundles_replaced_with_traps": 100, + "trap_weights": {"Trip Trap": 1}, + } + + def test_trap_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Trip Trap" + and item.classification == ItemClassification.trap]) + self.assertEqual(29, count) + + def test_prog_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.progression_skip_balancing]) + self.assertEqual(72, count) + + def test_fill_power_cells_count(self): + count = len([item.name for item in self.multiworld.itempool + if item.name == "Power Cell" + and item.classification == ItemClassification.filler]) + self.assertEqual(0, count) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index 1b5acbe97a..7642ec2313 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -303,9 +303,6 @@ class KDL3World(World): def generate_basic(self) -> None: self.stage_shuffle_enabled = self.options.stage_shuffle > 0 - goal = self.options.goal.value - goal_location = self.multiworld.get_location(location_name.goals[goal], self.player) - goal_location.place_locked_item(KDL3Item("Love-Love Rod", ItemClassification.progression, None, self.player)) for level in range(1, 6): self.multiworld.get_location(f"Level {level} Boss - Defeated", self.player) \ .place_locked_item( @@ -313,7 +310,6 @@ class KDL3World(World): self.multiworld.get_location(f"Level {level} Boss - Purified", self.player) \ .place_locked_item( KDL3Item(f"Level {level} Boss Purified", ItemClassification.progression, None, self.player)) - self.multiworld.completion_condition[self.player] = lambda state: state.has("Love-Love Rod", self.player) # this can technically be done at any point before generate_output if self.options.allow_bb: if self.options.allow_bb == self.options.allow_bb.option_enforced: diff --git a/worlds/kdl3/client.py b/worlds/kdl3/client.py index 97bf68cbd9..78a43239b4 100644 --- a/worlds/kdl3/client.py +++ b/worlds/kdl3/client.py @@ -90,7 +90,7 @@ def cmd_gift(self: "SNIClientCommandProcessor") -> None: async_start(update_object(self.ctx, f"Giftboxes;{self.ctx.team}", { f"{self.ctx.slot}": { - "IsOpen": handler.gifting, + "is_open": handler.gifting, **kdl3_gifting_options } })) @@ -175,11 +175,11 @@ class KDL3SNIClient(SNIClient): key, gift = ctx.stored_data[self.giftbox_key].popitem() await pop_object(ctx, self.giftbox_key, key) # first, special cases - traits = [trait["Trait"] for trait in gift["Traits"]] + traits = [trait["trait"] for trait in gift["traits"]] if "Candy" in traits or "Invincible" in traits: # apply invincibility candy self.item_queue.append(0x43) - elif "Tomato" in traits or "tomato" in gift["ItemName"].lower(): + elif "Tomato" in traits or "tomato" in gift["item_name"].lower(): # apply maxim tomato # only want tomatos here, no other vegetable is that good self.item_queue.append(0x42) @@ -187,7 +187,7 @@ class KDL3SNIClient(SNIClient): # Apply 1-Up self.item_queue.append(0x41) elif "Currency" in traits or "Star" in traits: - value = gift["ItemValue"] + value = gift.get("item_value", 1) if value >= 50000: self.item_queue.append(0x46) elif value >= 30000: @@ -210,8 +210,8 @@ class KDL3SNIClient(SNIClient): # check if it's tasty if any(x in traits for x in ["Consumable", "Food", "Drink", "Heal", "Health"]): # it's tasty!, use quality to decide how much to heal - quality = max((trait["Quality"] for trait in gift["Traits"] - if trait["Trait"] in ["Consumable", "Food", "Drink", "Heal", "Health"])) + quality = max((trait.get("quality", 1.0) for trait in gift["traits"] + if trait["trait"] in ["Consumable", "Food", "Drink", "Heal", "Health"])) quality = min(10, quality * 2) else: # it's not really edible, but he'll eat it anyway @@ -236,23 +236,23 @@ class KDL3SNIClient(SNIClient): for slot, info in ctx.stored_data[self.motherbox_key].items(): if int(slot) == ctx.slot and len(ctx.stored_data[self.motherbox_key]) > 1: continue - desire = len(set(info["DesiredTraits"]).intersection([trait["Trait"] for trait in gift_base["Traits"]])) + desire = len(set(info["desired_traits"]).intersection([trait["trait"] for trait in gift_base["traits"]])) if desire > most_applicable: most_applicable = desire most_applicable_slot = int(slot) - elif most_applicable_slot != ctx.slot and most_applicable == -1 and info["AcceptsAnyGift"]: + elif most_applicable_slot == ctx.slot and most_applicable == -1 and info["accepts_any_gift"]: # only send to ourselves if no one else will take it most_applicable_slot = int(slot) # print(most_applicable, most_applicable_slot) item_uuid = uuid.uuid4().hex item = { **gift_base, - "ID": item_uuid, - "Sender": ctx.player_names[ctx.slot], - "Receiver": ctx.player_names[most_applicable_slot], - "SenderTeam": ctx.team, - "ReceiverTeam": ctx.team, # for the moment - "IsRefund": False + "id": item_uuid, + "sender_slot": ctx.slot, + "receiver_slot": most_applicable_slot, + "sender_team": ctx.team, + "receiver_team": ctx.team, # for the moment + "is_refund": False } # print(item) await update_object(ctx, f"Giftbox;{ctx.team};{most_applicable_slot}", { @@ -276,8 +276,9 @@ class KDL3SNIClient(SNIClient): if not self.initialize_gifting: self.giftbox_key = f"Giftbox;{ctx.team};{ctx.slot}" self.motherbox_key = f"Giftboxes;{ctx.team}" - enable_gifting = await snes_read(ctx, KDL3_GIFTING_FLAG, 0x01) - await initialize_giftboxes(ctx, self.giftbox_key, self.motherbox_key, bool(enable_gifting[0])) + enable_gifting = await snes_read(ctx, KDL3_GIFTING_FLAG, 0x02) + await initialize_giftboxes(ctx, self.giftbox_key, self.motherbox_key, + bool(int.from_bytes(enable_gifting, "little"))) self.initialize_gifting = True # can't check debug anymore, without going and copying the value. might be important later. if not self.levels: @@ -350,19 +351,19 @@ class KDL3SNIClient(SNIClient): self.item_queue.append(item_idx | 0x80) # handle gifts here - gifting_status = await snes_read(ctx, KDL3_GIFTING_FLAG, 0x01) - if hasattr(ctx, "gifting") and ctx.gifting: - if gifting_status[0]: + gifting_status = int.from_bytes(await snes_read(ctx, KDL3_GIFTING_FLAG, 0x02), "little") + if hasattr(self, "gifting") and self.gifting: + if gifting_status: gift = await snes_read(ctx, KDL3_GIFTING_SEND, 0x01) if gift[0]: # we have a gift to send await self.pick_gift_recipient(ctx, gift[0]) snes_buffered_write(ctx, KDL3_GIFTING_SEND, bytes([0x00])) else: - snes_buffered_write(ctx, KDL3_GIFTING_FLAG, bytes([0x01])) + snes_buffered_write(ctx, KDL3_GIFTING_FLAG, bytes([0x01, 0x00])) else: - if gifting_status[0]: - snes_buffered_write(ctx, KDL3_GIFTING_FLAG, bytes([0x00])) + if gifting_status: + snes_buffered_write(ctx, KDL3_GIFTING_FLAG, bytes([0x00, 0x00])) await snes_flush_writes(ctx) diff --git a/worlds/kdl3/gifting.py b/worlds/kdl3/gifting.py index e162609100..de15514874 100644 --- a/worlds/kdl3/gifting.py +++ b/worlds/kdl3/gifting.py @@ -37,157 +37,158 @@ async def initialize_giftboxes(ctx: "SNIContext", giftbox_key: str, motherbox_ke ctx.set_notify(motherbox_key, giftbox_key) await update_object(ctx, f"Giftboxes;{ctx.team}", {f"{ctx.slot}": { - "IsOpen": is_open, + "is_open": is_open, **kdl3_gifting_options }}) + await update_object(ctx, f"Giftbox;{ctx.team};{ctx.slot}", {}) ctx.client_handler.gifting = is_open kdl3_gifting_options = { - "AcceptsAnyGift": True, - "DesiredTraits": [ + "accepts_any_gift": True, + "desired_traits": [ "Consumable", "Food", "Drink", "Candy", "Tomato", "Invincible", "Life", "Heal", "Health", "Trap", "Goo", "Gel", "Slow", "Slowness", "Eject", "Removal" ], - "MinimumGiftVersion": 2, + "minimum_gift_version": 3, } kdl3_gifts = { 1: { - "ItemName": "1-Up", - "Amount": 1, - "ItemValue": 400000, - "Traits": [ + "item_name": "1-Up", + "amount": 1, + "item_value": 400000, + "traits": [ { - "Trait": "Consumable", - "Quality": 1, - "Duration": 1, + "trait": "Consumable", + "quality": 1, + "duration": 1, }, { - "Trait": "Life", - "Quality": 1, - "Duration": 1 + "trait": "Life", + "quality": 1, + "duration": 1 } ] }, 2: { - "ItemName": "Maxim Tomato", - "Amount": 1, - "ItemValue": 500000, - "Traits": [ + "item_name": "Maxim Tomato", + "amount": 1, + "item_value": 500000, + "traits": [ { - "Trait": "Consumable", - "Quality": 5, - "Duration": 1, + "trait": "Consumable", + "quality": 5, + "duration": 1, }, { - "Trait": "Heal", - "Quality": 5, - "Duration": 1, + "trait": "Heal", + "quality": 5, + "duration": 1, }, { - "Trait": "Food", - "Quality": 5, - "Duration": 1, + "trait": "Food", + "quality": 5, + "duration": 1, }, { - "Trait": "Tomato", - "Quality": 5, - "Duration": 1, + "trait": "Tomato", + "quality": 5, + "duration": 1, }, { - "Trait": "Vegetable", - "Quality": 5, - "Duration": 1, + "trait": "Vegetable", + "quality": 5, + "duration": 1, } ] }, 3: { - "ItemName": "Energy Drink", - "Amount": 1, - "ItemValue": 100000, - "Traits": [ + "item_name": "Energy Drink", + "amount": 1, + "item_value": 100000, + "traits": [ { - "Trait": "Consumable", - "Quality": 1, - "Duration": 1, + "trait": "Consumable", + "quality": 1, + "duration": 1, }, { - "Trait": "Heal", - "Quality": 1, - "Duration": 1, + "trait": "Heal", + "quality": 1, + "duration": 1, }, { - "Trait": "Drink", - "Quality": 1, - "Duration": 1, + "trait": "Drink", + "quality": 1, + "duration": 1, }, ] }, 5: { - "ItemName": "Small Star Piece", - "Amount": 1, - "ItemValue": 10000, - "Traits": [ + "item_name": "Small Star Piece", + "amount": 1, + "item_value": 10000, + "traits": [ { - "Trait": "Currency", - "Quality": 1, - "Duration": 1, + "trait": "Currency", + "quality": 1, + "duration": 1, }, { - "Trait": "Money", - "Quality": 1, - "Duration": 1, + "trait": "Money", + "quality": 1, + "duration": 1, }, { - "Trait": "Star", - "Quality": 1, - "Duration": 1 + "trait": "Star", + "quality": 1, + "duration": 1 } ] }, 6: { - "ItemName": "Medium Star Piece", - "Amount": 1, - "ItemValue": 30000, - "Traits": [ + "item_name": "Medium Star Piece", + "amount": 1, + "item_value": 30000, + "traits": [ { - "Trait": "Currency", - "Quality": 3, - "Duration": 1, + "trait": "Currency", + "quality": 3, + "duration": 1, }, { - "Trait": "Money", - "Quality": 3, - "Duration": 1, + "trait": "Money", + "quality": 3, + "duration": 1, }, { - "Trait": "Star", - "Quality": 3, - "Duration": 1 + "trait": "Star", + "quality": 3, + "duration": 1 } ] }, 7: { - "ItemName": "Large Star Piece", - "Amount": 1, - "ItemValue": 50000, - "Traits": [ + "item_name": "Large Star Piece", + "amount": 1, + "item_value": 50000, + "traits": [ { - "Trait": "Currency", - "Quality": 5, - "Duration": 1, + "trait": "Currency", + "quality": 5, + "duration": 1, }, { - "Trait": "Money", - "Quality": 5, - "Duration": 1, + "trait": "Money", + "quality": 5, + "duration": 1, }, { - "Trait": "Star", - "Quality": 5, - "Duration": 1 + "trait": "Star", + "quality": 5, + "duration": 1 } ] }, @@ -195,90 +196,90 @@ kdl3_gifts = { kdl3_trap_gifts = { 0: { - "ItemName": "Gooey Bag", - "Amount": 1, - "ItemValue": 10000, - "Traits": [ + "item_name": "Gooey Bag", + "amount": 1, + "item_value": 10000, + "traits": [ { - "Trait": "Trap", - "Quality": 1, - "Duration": 1, + "trait": "Trap", + "quality": 1, + "duration": 1, }, { - "Trait": "Goo", - "Quality": 1, - "Duration": 1, + "trait": "Goo", + "quality": 1, + "duration": 1, }, { - "Trait": "Gel", - "Quality": 1, - "Duration": 1 + "trait": "Gel", + "quality": 1, + "duration": 1 } ] }, 1: { - "ItemName": "Slowness", - "Amount": 1, - "ItemValue": 10000, - "Traits": [ + "item_name": "Slowness", + "amount": 1, + "item_value": 10000, + "traits": [ { - "Trait": "Trap", - "Quality": 1, - "Duration": 1, + "trait": "Trap", + "quality": 1, + "duration": 1, }, { - "Trait": "Slow", - "Quality": 1, - "Duration": 1, + "trait": "Slow", + "quality": 1, + "duration": 1, }, { - "Trait": "Slowness", - "Quality": 1, - "Duration": 1 + "trait": "Slowness", + "quality": 1, + "duration": 1 } ] }, 2: { - "ItemName": "Eject Ability", - "Amount": 1, - "ItemValue": 10000, - "Traits": [ + "item_name": "Eject Ability", + "amount": 1, + "item_value": 10000, + "traits": [ { - "Trait": "Trap", - "Quality": 1, - "Duration": 1, + "trait": "Trap", + "quality": 1, + "duration": 1, }, { - "Trait": "Eject", - "Quality": 1, - "Duration": 1, + "trait": "Eject", + "quality": 1, + "duration": 1, }, { - "Trait": "Removal", - "Quality": 1, - "Duration": 1 + "trait": "Removal", + "quality": 1, + "duration": 1 } ] }, 3: { - "ItemName": "Bad Meal", - "Amount": 1, - "ItemValue": 10000, - "Traits": [ + "item_name": "Bad Meal", + "amount": 1, + "item_value": 10000, + "traits": [ { - "Trait": "Trap", - "Quality": 1, - "Duration": 1, + "trait": "Trap", + "quality": 1, + "duration": 1, }, { - "Trait": "Damage", - "Quality": 1, - "Duration": 1, + "trait": "Damage", + "quality": 1, + "duration": 1, }, { - "Trait": "Food", - "Quality": 1, - "Duration": 1 + "trait": "Food", + "quality": 1, + "duration": 1 } ] }, diff --git a/worlds/kdl3/options.py b/worlds/kdl3/options.py index b9163794ad..77095bfec6 100644 --- a/worlds/kdl3/options.py +++ b/worlds/kdl3/options.py @@ -289,7 +289,7 @@ class KirbyFlavorPreset(Choice): option_lime = 12 option_lavender = 13 option_miku = 14 - option_custom = 15 + option_custom = -1 default = 0 @classmethod @@ -297,7 +297,7 @@ class KirbyFlavorPreset(Choice): text = text.lower() if text == "random": choice_list = list(cls.name_lookup) - choice_list.remove(14) + choice_list.remove(-1) return cls(random.choice(choice_list)) return super().from_text(text) @@ -347,7 +347,7 @@ class GooeyFlavorPreset(Choice): option_orange = 11 option_lime = 12 option_lavender = 13 - option_custom = 14 + option_custom = -1 default = 0 @classmethod @@ -355,7 +355,7 @@ class GooeyFlavorPreset(Choice): text = text.lower() if text == "random": choice_list = list(cls.name_lookup) - choice_list.remove(14) + choice_list.remove(-1) return cls(random.choice(choice_list)) return super().from_text(text) diff --git a/worlds/kdl3/rom.py b/worlds/kdl3/rom.py index 741ea00830..5f986bc4be 100644 --- a/worlds/kdl3/rom.py +++ b/worlds/kdl3/rom.py @@ -7,7 +7,6 @@ import hashlib import os import struct -import settings from worlds.Files import APProcedurePatch, APTokenMixin, APTokenTypes, APPatchExtension from .aesthetics import get_palette_bytes, kirby_target_palettes, get_kirby_palette, gooey_target_palettes, \ get_gooey_palette @@ -475,8 +474,7 @@ def patch_rom(world: "KDL3World", patch: KDL3ProcedurePatch) -> None: patch.write_token(APTokenTypes.WRITE, 0x3D016, world.options.ow_boss_requirement.value.to_bytes(2, "little")) patch.write_token(APTokenTypes.WRITE, 0x3D018, world.options.consumables.value.to_bytes(2, "little")) patch.write_token(APTokenTypes.WRITE, 0x3D01A, world.options.starsanity.value.to_bytes(2, "little")) - patch.write_token(APTokenTypes.WRITE, 0x3D01C, world.options.gifting.value.to_bytes(2, "little") - if world.multiworld.players > 1 else bytes([0, 0])) + patch.write_token(APTokenTypes.WRITE, 0x3D01C, world.options.gifting.value.to_bytes(2, "little")) patch.write_token(APTokenTypes.WRITE, 0x3D01E, world.options.strict_bosses.value.to_bytes(2, "little")) # don't write gifting for solo game, since there's no one to send anything to @@ -594,9 +592,9 @@ def get_base_rom_bytes() -> bytes: def get_base_rom_path(file_name: str = "") -> str: - options: settings.Settings = settings.get_settings() + from . import KDL3World if not file_name: - file_name = options["kdl3_options"]["rom_file"] + file_name = KDL3World.settings.rom_file if not os.path.exists(file_name): file_name = Utils.user_path(file_name) return file_name diff --git a/worlds/kdl3/rules.py b/worlds/kdl3/rules.py index 828740859e..0be4784175 100644 --- a/worlds/kdl3/rules.py +++ b/worlds/kdl3/rules.py @@ -1,6 +1,8 @@ +from BaseClasses import ItemClassification from worlds.generic.Rules import set_rule, add_rule -from .names import location_name, enemy_abilities, animal_friend_spawns +from .items import KDL3Item from .locations import location_table +from .names import location_name, enemy_abilities, animal_friend_spawns from .options import GoalSpeed import typing @@ -111,6 +113,11 @@ def can_fix_angel_wings(state: "CollectionState", player: int, copy_abilities: t def set_rules(world: "KDL3World") -> None: + goal = world.options.goal.value + goal_location = world.multiworld.get_location(location_name.goals[goal], world.player) + goal_location.place_locked_item(KDL3Item("Love-Love Rod", ItemClassification.progression, None, world.player)) + world.multiworld.completion_condition[world.player] = lambda state: state.has("Love-Love Rod", world.player) + # Level 1 set_rule(world.multiworld.get_location(location_name.grass_land_muchi, world.player), lambda state: can_reach_chuchu(state, world.player)) diff --git a/worlds/kdl3/test/__init__.py b/worlds/kdl3/test/__init__.py index 92f1d7261f..46f78aadaa 100644 --- a/worlds/kdl3/test/__init__.py +++ b/worlds/kdl3/test/__init__.py @@ -26,13 +26,13 @@ class KDL3TestBase(WorldTestBase): self.multiworld.game[1] = self.game self.multiworld.player_name = {1: "Tester"} self.multiworld.set_seed(seed) - self.multiworld.state = CollectionState(self.multiworld) args = Namespace() for name, option in AutoWorld.AutoWorldRegister.world_types[self.game].options_dataclass.type_hints.items(): setattr(args, name, { 1: option.from_any(self.options.get(name, getattr(option, "default"))) }) self.multiworld.set_options(args) + self.multiworld.state = CollectionState(self.multiworld) self.multiworld.plando_options = PlandoOptions.connections for step in gen_steps: call_all(self.multiworld, step) diff --git a/worlds/kh1/Client.py b/worlds/kh1/Client.py index b98f215312..9d3889d6ce 100644 --- a/worlds/kh1/Client.py +++ b/worlds/kh1/Client.py @@ -13,8 +13,6 @@ import ModuleUpdate ModuleUpdate.update() import Utils -death_link = False -item_num = 1 logger = logging.getLogger("Client") @@ -34,62 +32,57 @@ class KH1ClientCommandProcessor(ClientCommandProcessor): def __init__(self, ctx): super().__init__(ctx) + def _cmd_slot_data(self): + """Prints slot data settings for the connected seed""" + for key in self.ctx.slot_data.keys(): + if key not in ["remote_location_ids", "synthesis_item_name_byte_arrays"]: + self.output(str(key) + ": " + str(self.ctx.slot_data[key])) + def _cmd_deathlink(self): - """Toggles Deathlink""" - global death_link - if death_link: - death_link = False - self.output(f"Death Link turned off") - else: - death_link = True - self.output(f"Death Link turned on") - - def _cmd_goal(self): - """Prints goal setting""" - if "goal" in self.ctx.slot_data.keys(): - self.output(str(self.ctx.slot_data["goal"])) - else: - self.output("Unknown") - - def _cmd_eotw_unlock(self): - """Prints End of the World Unlock setting""" - if "required_reports_door" in self.ctx.slot_data.keys(): - if self.ctx.slot_data["required_reports_door"] > 13: - self.output("Item") + """If your Death Link setting is set to "Toggle", use this command to turn Death Link on and off.""" + if "death_link" in self.ctx.slot_data.keys(): + if self.ctx.slot_data["death_link"] == "toggle": + if self.ctx.death_link: + self.ctx.death_link = False + self.output(f"Death Link turned off") + else: + self.ctx.death_link = True + self.output(f"Death Link turned on") else: - self.output(str(self.ctx.slot_data["required_reports_eotw"]) + " reports") + self.output(f"'death_link' is not set to 'toggle' for this seed.") + self.output(f"'death_link' = " + str(self.ctx.slot_data["death_link"])) else: - self.output("Unknown") + self.output(f"No 'death_link' in slot_data keys. You probably aren't connected or are playing an older seed.") - def _cmd_door_unlock(self): - """Prints Final Rest Door Unlock setting""" - if "door" in self.ctx.slot_data.keys(): - if self.ctx.slot_data["door"] == "reports": - self.output(str(self.ctx.slot_data["required_reports_door"]) + " reports") - else: - self.output(str(self.ctx.slot_data["door"])) + def _cmd_communication_path(self): + """Opens a file browser to allow Linux users to manually set their %LOCALAPPDATA% path""" + directory = Utils.open_directory("Select %LOCALAPPDATA% dir", "~/.local/share/Steam/steamapps/compatdata/2552430/pfx/drive_c/users/steamuser/AppData/Local") + if directory: + directory += "/KH1FM" + if not os.path.exists(directory): + os.makedirs(directory) + self.ctx.game_communication_path = directory else: - self.output("Unknown") - - def _cmd_advanced_logic(self): - """Prints advanced logic setting""" - if "advanced_logic" in self.ctx.slot_data.keys(): - self.output(str(self.ctx.slot_data["advanced_logic"])) - else: - self.output("Unknown") + self.output(self.ctx.game_communication_path) class KH1Context(CommonContext): command_processor: int = KH1ClientCommandProcessor game = "Kingdom Hearts" - items_handling = 0b111 # full remote + items_handling = 0b011 # full remote except start inventory def __init__(self, server_address, password): super(KH1Context, self).__init__(server_address, password) self.send_index: int = 0 self.syncing = False self.awaiting_bridge = False - self.hinted_synth_location_ids = False - self.slot_data = {} + self.hinted_location_ids: list[int] = [] + self.slot_data: dict = {} + + # Moved globals into instance attributes + self.death_link: bool = False + self.item_num: int = 1 + self.remote_location_ids: list[int] = [] + # self.game_communication_path: files go in this path to pass data between us and the actual game if "localappdata" in os.environ: self.game_communication_path = os.path.expandvars(r"%localappdata%/KH1FM") @@ -103,6 +96,10 @@ class KH1Context(CommonContext): os.remove(root+"/"+file) async def server_auth(self, password_requested: bool = False): + for root, dirs, files in os.walk(self.game_communication_path): + for file in files: + if file.find("obtain") <= -1: + os.remove(root+"/"+file) if password_requested and not self.password: await super(KH1Context, self).server_auth(password_requested) await self.get_username() @@ -114,8 +111,7 @@ class KH1Context(CommonContext): for file in files: if file.find("obtain") <= -1: os.remove(root + "/" + file) - global item_num - item_num = 1 + self.item_num = 1 @property def endpoints(self): @@ -130,8 +126,7 @@ class KH1Context(CommonContext): for file in files: if file.find("obtain") <= -1: os.remove(root+"/"+file) - global item_num - item_num = 1 + self.item_num = 1 def on_package(self, cmd: str, args: dict): if cmd in {"Connected"}: @@ -142,38 +137,34 @@ class KH1Context(CommonContext): with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.close() - #Handle Slot Data + # Handle Slot Data self.slot_data = args['slot_data'] for key in list(args['slot_data'].keys()): with open(os.path.join(self.game_communication_path, key + ".cfg"), 'w') as f: f.write(str(args['slot_data'][key])) f.close() - - ###Support Legacy Games - if "Required Reports" in list(args['slot_data'].keys()) and "required_reports_eotw" not in list(args['slot_data'].keys()): - reports_required = args['slot_data']["Required Reports"] - with open(os.path.join(self.game_communication_path, "required_reports.cfg"), 'w') as f: - f.write(str(reports_required)) - f.close() - ###End Support Legacy Games - - #End Handle Slot Data + if key == "remote_location_ids": + self.remote_location_ids = args['slot_data'][key] + if key == "death_link": + if args['slot_data']["death_link"] != "off": + self.death_link = True + # End Handle Slot Data if cmd in {"ReceivedItems"}: start_index = args["index"] if start_index != len(self.items_received): - global item_num for item in args['items']: found = False - item_filename = f"AP_{str(item_num)}.item" + item_filename = f"AP_{str(self.item_num)}.item" for filename in os.listdir(self.game_communication_path): if filename == item_filename: found = True if not found: - with open(os.path.join(self.game_communication_path, item_filename), 'w') as f: - f.write(str(NetworkItem(*item).item) + "\n" + str(NetworkItem(*item).location) + "\n" + str(NetworkItem(*item).player)) - f.close() - item_num = item_num + 1 + if (NetworkItem(*item).player == self.slot and (NetworkItem(*item).location in self.remote_location_ids) or (NetworkItem(*item).location < 0)) or NetworkItem(*item).player != self.slot: + with open(os.path.join(self.game_communication_path, item_filename), 'w') as f: + f.write(str(NetworkItem(*item).item) + "\n" + str(NetworkItem(*item).location) + "\n" + str(NetworkItem(*item).player)) + f.close() + self.item_num += 1 if cmd in {"RoomUpdate"}: if "checked_locations" in args: @@ -186,21 +177,39 @@ class KH1Context(CommonContext): if args["type"] == "ItemSend": item = args["item"] networkItem = NetworkItem(*item) - recieverID = args["receiving"] + receiverID = args["receiving"] senderID = networkItem.player locationID = networkItem.location - if recieverID != self.slot and senderID == self.slot: - itemName = self.item_names.lookup_in_slot(networkItem.item, recieverID) + if receiverID == self.slot or senderID == self.slot: + itemName = self.item_names.lookup_in_slot(networkItem.item, receiverID)[:20] itemCategory = networkItem.flags - recieverName = self.player_names[recieverID] - filename = "sent" - with open(os.path.join(self.game_communication_path, filename), 'w') as f: - f.write( - re.sub('[^A-Za-z0-9 ]+', '',str(itemName))[:15] + "\n" - + re.sub('[^A-Za-z0-9 ]+', '',str(recieverName))[:6] + "\n" - + str(itemCategory) + "\n" - + str(locationID)) - f.close() + receiverName = self.player_names[receiverID][:20] + senderName = self.player_names[senderID][:20] + message = "" + if receiverID == self.slot and receiverID != senderID: # Item received from someone else + message = "From " + senderName + "\n" + itemName + elif senderID == self.slot and receiverID != senderID: # Item sent to someone else + message = itemName + "\nTo " + receiverName + elif locationID in self.remote_location_ids: # Found a remote item + message = itemName + filename = "msg" + if message != "": + if not os.path.exists(self.game_communication_path + "/" + filename): + with open(os.path.join(self.game_communication_path, filename), 'w') as f: + f.write(message) + f.close() + if args["type"] == "ItemCheat": + item = args["item"] + networkItem = NetworkItem(*item) + receiverID = args["receiving"] + if receiverID == self.slot: + itemName = self.item_names.lookup_in_slot(networkItem.item, receiverID)[:20] + filename = "msg" + message = "Received " + itemName + "\nfrom server" + if not os.path.exists(self.game_communication_path + "/" + filename): + with open(os.path.join(self.game_communication_path, filename), 'w') as f: + f.write(message) + f.close() def on_deathlink(self, data: dict[str, object]): self.last_death_link = max(data["time"], self.last_death_link) @@ -230,12 +239,11 @@ class KH1Context(CommonContext): async def game_watcher(ctx: KH1Context): from .Locations import lookup_id_to_name while not ctx.exit_event.is_set(): - global death_link - if death_link and "DeathLink" not in ctx.tags: - await ctx.update_death_link(death_link) - if not death_link and "DeathLink" in ctx.tags: - await ctx.update_death_link(death_link) - if ctx.syncing == True: + if ctx.death_link and "DeathLink" not in ctx.tags: + await ctx.update_death_link(ctx.death_link) + if not ctx.death_link and "DeathLink" in ctx.tags: + await ctx.update_death_link(ctx.death_link) + if ctx.syncing is True: sync_msg = [{'cmd': 'Sync'}] if ctx.locations_checked: sync_msg.append({"cmd": "LocationChecks", "locations": list(ctx.locations_checked)}) @@ -256,17 +264,17 @@ async def game_watcher(ctx: KH1Context): if st != "nil": if timegm(time.strptime(st, '%Y%m%d%H%M%S')) > ctx.last_death_link and int(time.time()) % int(timegm(time.strptime(st, '%Y%m%d%H%M%S'))) < 10: await ctx.send_death(death_text = "Sora was defeated!") - if file.find("insynthshop") > -1: - if not ctx.hinted_synth_location_ids: + if file.find("hint") > -1: + hint_location_id = int(file.split("hint", -1)[1]) + if hint_location_id not in ctx.hinted_location_ids: await ctx.send_msgs([{ "cmd": "LocationScouts", - "locations": [2656401,2656402,2656403,2656404,2656405,2656406], + "locations": [hint_location_id], "create_as_hint": 2 }]) - ctx.hinted_synth_location_ids = True + ctx.hinted_location_ids.append(hint_location_id) ctx.locations_checked = sending - message = [{"cmd": 'LocationChecks', "locations": sending}] - await ctx.send_msgs(message) + await ctx.check_locations(sending) if not ctx.finished_game and victory: await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) ctx.finished_game = True diff --git a/worlds/kh1/Data.py b/worlds/kh1/Data.py new file mode 100644 index 0000000000..19227c035b --- /dev/null +++ b/worlds/kh1/Data.py @@ -0,0 +1,202 @@ +VANILLA_KEYBLADE_STATS = [ + {"STR": 3, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Kingdom Key + {"STR": 1, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Dream Sword + {"STR": 1, "CRR": 0, "CRB": 0, "REC": 60, "MP": 0}, # Dream Shield + {"STR": 1, "CRR": 10, "CRB": 0, "REC": 30, "MP": 0}, # Dream Rod + {"STR": 0, "CRR": 20, "CRB": 0, "REC": 30, "MP": 0}, # Wooden Sword + {"STR": 5, "CRR": 10, "CRB": 0, "REC": 1, "MP": 0}, # Jungle King + {"STR": 6, "CRR": 20, "CRB": 0, "REC": 60, "MP": 0}, # Three Wishes + {"STR": 8, "CRR": 10, "CRB": 2, "REC": 30, "MP": 1}, # Fairy Harp + {"STR": 7, "CRR": 40, "CRB": 0, "REC": 1, "MP": 0}, # Pumpkinhead + {"STR": 6, "CRR": 20, "CRB": 0, "REC": 30, "MP": 1}, # Crabclaw + {"STR": 13, "CRR": 40, "CRB": 0, "REC": 60, "MP": 0}, # Divine Rose + {"STR": 4, "CRR": 20, "CRB": 0, "REC": 30, "MP": 2}, # Spellbinder + {"STR": 10, "CRR": 20, "CRB": 2, "REC": 90, "MP": 0}, # Olympia + {"STR": 10, "CRR": 20, "CRB": 0, "REC": 30, "MP": 1}, # Lionheart + {"STR": 9, "CRR": 2, "CRB": 0, "REC": 90, "MP": -1}, # Metal Chocobo + {"STR": 9, "CRR": 40, "CRB": 0, "REC": 1, "MP": 1}, # Oathkeeper + {"STR": 11, "CRR": 20, "CRB": 2, "REC": 30, "MP": -1}, # Oblivion + {"STR": 7, "CRR": 20, "CRB": 0, "REC": 1, "MP": 2}, # Lady Luck + {"STR": 5, "CRR": 200, "CRB": 2, "REC": 1, "MP": 0}, # Wishing Star + {"STR": 14, "CRR": 40, "CRB": 2, "REC": 90, "MP": 2}, # Ultima Weapon + {"STR": 3, "CRR": 20, "CRB": 0, "REC": 1, "MP": 3}, # Diamond Dust + {"STR": 8, "CRR": 10, "CRB": 16, "REC": 90, "MP": -2}, # One-Winged Angel + ] +VANILLA_PUPPY_LOCATIONS = [ + "Traverse Town Mystical House Glide Chest", + "Traverse Town Alleyway Behind Crates Chest", + "Traverse Town Item Workshop Left Chest", + "Traverse Town Secret Waterway Near Stairs Chest", + "Wonderland Queen's Castle Hedge Right Blue Chest", + "Wonderland Lotus Forest Nut Chest", + "Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest", + "Olympus Coliseum Coliseum Gates Right Blue Trinity Chest", + "Deep Jungle Hippo's Lagoon Center Chest", + "Deep Jungle Vines 2 Chest", + "Deep Jungle Waterfall Cavern Middle Chest", + "Deep Jungle Camp Blue Trinity Chest", + "Agrabah Cave of Wonders Treasure Room Across Platforms Chest", + "Halloween Town Oogie's Manor Hollow Chest", + "Neverland Pirate Ship Deck White Trinity Chest", + "Agrabah Cave of Wonders Hidden Room Left Chest", + "Agrabah Cave of Wonders Entrance Tall Tower Chest", + "Agrabah Palace Gates High Opposite Palace Chest", + "Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest", + "Wonderland Lotus Forest Through the Painting Thunder Plant Chest", + "Hollow Bastion Grand Hall Left of Gate Chest", + "Halloween Town Cemetery By Cat Shape Chest", + "Halloween Town Moonlight Hill White Trinity Chest", + "Halloween Town Guillotine Square Pumpkin Structure Right Chest", + "Monstro Mouth High Platform Across from Boat Chest", + "Monstro Chamber 6 Low Chest", + "Monstro Chamber 5 Atop Barrel Chest", + "Neverland Hold Flight 1st Chest", + "Neverland Hold Yellow Trinity Green Chest", + "Neverland Captain's Cabin Chest", + "Hollow Bastion Rising Falls Floating Platform Near Save Chest", + "Hollow Bastion Castle Gates Gravity Chest", + "Hollow Bastion Lift Stop Outside Library Gravity Chest" + ] +CHAR_TO_KH = { + " ": 0x01, + "0": 0x21, + "1": 0x22, + "2": 0x23, + "3": 0x24, + "4": 0x25, + "5": 0x26, + "6": 0x27, + "7": 0x28, + "8": 0x29, + "9": 0x2A, + "A": 0x2B, + "B": 0x2C, + "C": 0x2D, + "D": 0x2E, + "E": 0x2F, + "F": 0x30, + "G": 0x31, + "H": 0x32, + "I": 0x33, + "J": 0x34, + "K": 0x35, + "L": 0x36, + "M": 0x37, + "N": 0x38, + "O": 0x39, + "P": 0x3A, + "Q": 0x3B, + "R": 0x3C, + "S": 0x3D, + "T": 0x3E, + "U": 0x3F, + "V": 0x40, + "W": 0x41, + "X": 0x42, + "Y": 0x43, + "Z": 0x44, + "a": 0x45, + "b": 0x46, + "c": 0x47, + "d": 0x48, + "e": 0x49, + "f": 0x4A, + "g": 0x4B, + "h": 0x4C, + "i": 0x4D, + "j": 0x4E, + "k": 0x4F, + "l": 0x50, + "m": 0x51, + "n": 0x52, + "o": 0x53, + "p": 0x54, + "q": 0x55, + "r": 0x56, + "s": 0x57, + "t": 0x58, + "u": 0x59, + "v": 0x5A, + "w": 0x5B, + "x": 0x5C, + "y": 0x5D, + "z": 0x5E + } +VANILLA_ABILITY_AP_COSTS = [ + {"Ability Name": "Treasure Magnet", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Combo Plus", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Air Combo Plus", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Critical Plus", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Second Wind", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Scan", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Sonic Blade", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ars Arcanum", "AP Cost": 4, "Randomize": True}, + {"Ability Name": "Strike Raid", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ragnarok", "AP Cost": 4, "Randomize": True}, + {"Ability Name": "Trinity Limit", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Cheer", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Vortex", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Aerial Sweep", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Counter Attack", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Blitz", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Guard", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Dodge Roll", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "MP Haste", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "MP Rage", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Second Chance", "AP Cost": 5, "Randomize": True}, + {"Ability Name": "Berserk", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Jackpot", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Lucky Strike", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Charge", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Rocket", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Tornado", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "MP Gift", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Raging Boar", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Asp's Bite", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Healing Herb", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Wind Armor", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Crescent", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Sandstorm", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Applause!", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Blazing Fury", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Icy Terror", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Bolts of Sorrow", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ghostly Scream", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Hummingbird", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Time-Out", "AP Cost": 4, "Randomize": True}, + {"Ability Name": "Storm´s Eye", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Ferocious Lunge", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Furious Bellow", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Spiral Wave", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Thunder Potion", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Cure Potion", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Aero Potion", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Slapshot", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Sliding Dash", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Hurricane Blast", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Ripple Drive", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "Stun Impact", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Gravity Break", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Zantetsuken", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Tech Boost", "AP Cost": 2, "Randomize": True}, + {"Ability Name": "Encounter Plus", "AP Cost": 1, "Randomize": True}, + {"Ability Name": "Leaf Bracer", "AP Cost": 5, "Randomize": True}, + {"Ability Name": "Evolution", "AP Cost": 3, "Randomize": True}, + {"Ability Name": "EXP Zero", "AP Cost": 0, "Randomize": True}, + {"Ability Name": "Combo Master", "AP Cost": 3, "Randomize": True} + ] + +WORLD_KEY_ITEMS = { + "Footprints": "Wonderland", + "Entry Pass": "Olympus Coliseum", + "Slides": "Deep Jungle", + "Crystal Trident": "Atlantica", + "Forget-Me-Not": "Halloween Town", + "Jack-In-The-Box": "Halloween Town", + "Theon Vol. 6": "Hollow Bastion" +} + +LOGIC_BEGINNER = 0 +LOGIC_NORMAL = 5 +LOGIC_PROUD = 10 +LOGIC_MINIMAL = 15 \ No newline at end of file diff --git a/worlds/kh1/GenerateJSON.py b/worlds/kh1/GenerateJSON.py new file mode 100644 index 0000000000..fdd8f215d0 --- /dev/null +++ b/worlds/kh1/GenerateJSON.py @@ -0,0 +1,67 @@ +import logging + +import yaml +import os +import io +from typing import TYPE_CHECKING, Dict, List, Optional, cast +import Utils +import zipfile +import json + +from .Locations import KH1Location, location_table + +from worlds.Files import APPlayerContainer + + + +class KH1Container(APPlayerContainer): + game: str = 'Kingdom Hearts' + patch_file_ending = ".zip" + + def __init__(self, patch_data: Dict[str, str] | io.BytesIO, base_path: str = "", output_directory: str = "", + player: Optional[int] = None, player_name: str = "", server: str = ""): + self.patch_data = patch_data + self.file_path = base_path + container_path = os.path.join(output_directory, base_path + ".zip") + super().__init__(container_path, player, player_name, server) + + def write_contents(self, opened_zipfile: zipfile.ZipFile) -> None: + for filename, text in self.patch_data.items(): + opened_zipfile.writestr(filename, text) + super().write_contents(opened_zipfile) + + +def generate_json(world, output_directory): + mod_name = f"AP-{world.multiworld.seed_name}-P{world.player}-{world.multiworld.get_file_safe_player_name(world.player)}" + mod_dir = os.path.join(output_directory, mod_name + "_" + Utils.__version__) + + item_location_map = get_item_location_map(world) + settings = get_settings(world) + + files = { + "item_location_map.json": json.dumps(item_location_map), + "keyblade_stats.json": json.dumps(world.get_keyblade_stats()), + "settings.json": json.dumps(settings), + "ap_costs.json": json.dumps(world.get_ap_costs()) + } + + mod = KH1Container(files, mod_dir, output_directory, world.player, + world.multiworld.get_file_safe_player_name(world.player)) + mod.write() + +def get_item_location_map(world): + location_item_map = {} + for location in world.multiworld.get_filled_locations(world.player): + if location.name != "Final Ansem": + if world.player != location.item.player or (world.player == location.item.player and world.options.remote_items.current_key == "full" and (location_table[location.name].code < 2656800 or location_table[location.name].code > 2656814)): + item_id = 2641230 + else: + item_id = location.item.code + location_data = location_table[location.name] + location_id = location_data.code + location_item_map[location_id] = item_id + return location_item_map + +def get_settings(world): + settings = world.fill_slot_data() + return settings \ No newline at end of file diff --git a/worlds/kh1/Items.py b/worlds/kh1/Items.py index bac98a9b32..c453d9042f 100644 --- a/worlds/kh1/Items.py +++ b/worlds/kh1/Items.py @@ -10,518 +10,341 @@ class KH1Item(Item): class KH1ItemData(NamedTuple): category: str code: int + type: str classification: ItemClassification = ItemClassification.filler max_quantity: int = 1 weight: int = 1 def get_items_by_category(category: str) -> Dict[str, KH1ItemData]: - item_dict: Dict[str, KH1ItemData] = {} - for name, data in item_table.items(): - if data.category == category: - item_dict.setdefault(name, data) - - return item_dict - + return {name: data for name, data in item_table.items() if data.category == category} item_table: Dict[str, KH1ItemData] = { - "Victory": KH1ItemData("VIC", code = 264_0000, classification = ItemClassification.progression, ), - "Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, ), - "Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, ), - "Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, ), - "Elixir": KH1ItemData("Item", code = 264_1004, classification = ItemClassification.filler, ), - #"B05": KH1ItemData("Item", code = 264_1005, classification = ItemClassification.filler, ), - "Mega-Potion": KH1ItemData("Item", code = 264_1006, classification = ItemClassification.filler, ), - "Mega-Ether": KH1ItemData("Item", code = 264_1007, classification = ItemClassification.filler, ), - "Megalixir": KH1ItemData("Item", code = 264_1008, classification = ItemClassification.filler, ), - #"Fury Stone": KH1ItemData("Synthesis", code = 264_1009, classification = ItemClassification.filler, ), - #"Power Stone": KH1ItemData("Synthesis", code = 264_1010, classification = ItemClassification.filler, ), - #"Energy Stone": KH1ItemData("Synthesis", code = 264_1011, classification = ItemClassification.filler, ), - #"Blazing Stone": KH1ItemData("Synthesis", code = 264_1012, classification = ItemClassification.filler, ), - #"Frost Stone": KH1ItemData("Synthesis", code = 264_1013, classification = ItemClassification.filler, ), - #"Lightning Stone": KH1ItemData("Synthesis", code = 264_1014, classification = ItemClassification.filler, ), - #"Dazzling Stone": KH1ItemData("Synthesis", code = 264_1015, classification = ItemClassification.filler, ), - #"Stormy Stone": KH1ItemData("Synthesis", code = 264_1016, classification = ItemClassification.filler, ), - "Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.useful, ), - "Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.useful, ), - "Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.useful, ), - "Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.useful, ), - "Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.useful, ), - "Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.useful, ), - "Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.useful, ), - "Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.useful, ), - "Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.useful, ), - "Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.useful, ), - "Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.useful, ), - "Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.useful, ), - "Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.useful, ), - "Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.useful, ), - "Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.useful, ), - "Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.useful, ), - "Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.useful, ), - "Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.useful, ), - "Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.useful, ), - "Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.useful, ), - "Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.useful, ), - "Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.useful, ), - "Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.useful, ), - "Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.useful, ), - "Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.useful, ), - "Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.useful, ), - "Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.useful, ), - "Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.useful, ), - "Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.useful, ), - "Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.useful, ), - "Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.useful, ), - "Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.useful, ), - "Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.useful, ), - "Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.useful, ), - "White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.useful, ), - "Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.useful, ), - "Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.useful, ), - "Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.useful, ), - "Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.useful, ), - "EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.useful, ), - #"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.useful, ), - "EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.useful, ), - "EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.useful, ), - "EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.useful, ), - "Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.useful, ), - "Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.useful, ), - "Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.useful, ), - "Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.useful, ), - "Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.useful, ), - "Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.useful, ), - "Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.useful, ), - "Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.useful, ), - "Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.useful, ), - "Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.useful, ), - "Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.useful, ), - #"A56": KH1ItemData("Accessory", code = 264_1072, classification = ItemClassification.filler, ), - #"A57": KH1ItemData("Accessory", code = 264_1073, classification = ItemClassification.filler, ), - #"A58": KH1ItemData("Accessory", code = 264_1074, classification = ItemClassification.filler, ), - #"A59": KH1ItemData("Accessory", code = 264_1075, classification = ItemClassification.filler, ), - #"A60": KH1ItemData("Accessory", code = 264_1076, classification = ItemClassification.filler, ), - #"A61": KH1ItemData("Accessory", code = 264_1077, classification = ItemClassification.filler, ), - #"A62": KH1ItemData("Accessory", code = 264_1078, classification = ItemClassification.filler, ), - #"A63": KH1ItemData("Accessory", code = 264_1079, classification = ItemClassification.filler, ), - #"A64": KH1ItemData("Accessory", code = 264_1080, classification = ItemClassification.filler, ), - #"Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, ), - #"Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, ), - #"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, ), - #"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, ), - "Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, ), - "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.progression, ), - "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.progression, ), - "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.progression, ), - "Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.progression, ), - "Crabclaw": KH1ItemData("Keyblades", code = 264_1090, classification = ItemClassification.useful, ), - "Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.progression, ), - "Spellbinder": KH1ItemData("Keyblades", code = 264_1092, classification = ItemClassification.useful, ), - "Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.progression, ), - "Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.progression, ), - "Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, ), - "Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.progression, ), - "Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.progression, ), - "Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.progression, ), - "Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.progression, ), - "Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, ), - "Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, ), - "One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, ), - #"Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, ), - "Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.useful, ), - "Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.useful, ), - "Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.useful, ), - "Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.useful, ), - "Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.useful, ), - "Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.useful, ), - "Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.useful, ), - "Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.useful, ), - "Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.useful, ), - "Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.useful, ), - "Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.useful, ), - "Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.useful, ), - "Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.useful, ), - "Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.useful, ), - #"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, ), - #"Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, ), - "Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.useful, ), - "Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.useful, ), - "Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.useful, ), - "Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.useful, ), - "Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.useful, ), - "Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.useful, ), - "Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.useful, ), - "Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.useful, ), - "Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.useful, ), - "Dream Shield (Goofy)": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, ), - "Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.useful, ), - "Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.useful, ), - "Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.useful, ), - "Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.useful, ), - #"Unused (Goofy)": KH1ItemData("Weapons", code = 264_1134, classification = ItemClassification.filler, ), - #"Spear": KH1ItemData("Weapons", code = 264_1135, classification = ItemClassification.filler, ), - #"No Weapon": KH1ItemData("Weapons", code = 264_1136, classification = ItemClassification.filler, ), - #"Genie": KH1ItemData("Weapons", code = 264_1137, classification = ItemClassification.filler, ), - #"No Weapon": KH1ItemData("Weapons", code = 264_1138, classification = ItemClassification.filler, ), - #"No Weapon": KH1ItemData("Weapons", code = 264_1139, classification = ItemClassification.filler, ), - #"Tinker Bell": KH1ItemData("Weapons", code = 264_1140, classification = ItemClassification.filler, ), - #"Claws": KH1ItemData("Weapons", code = 264_1141, classification = ItemClassification.filler, ), - "Tent": KH1ItemData("Camping", code = 264_1142, classification = ItemClassification.filler, ), - "Camping Set": KH1ItemData("Camping", code = 264_1143, classification = ItemClassification.filler, ), - "Cottage": KH1ItemData("Camping", code = 264_1144, classification = ItemClassification.filler, ), - #"C04": KH1ItemData("Camping", code = 264_1145, classification = ItemClassification.filler, ), - #"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, ), - #"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, ), - #"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, ), - "Ansem's Report 11": KH1ItemData("Reports", code = 264_1149, classification = ItemClassification.progression, ), - "Ansem's Report 12": KH1ItemData("Reports", code = 264_1150, classification = ItemClassification.progression, ), - "Ansem's Report 13": KH1ItemData("Reports", code = 264_1151, classification = ItemClassification.progression, ), - "Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, ), - "Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, ), - "AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, ), - #"Serenity Power": KH1ItemData("Synthesis", code = 264_1155, classification = ItemClassification.filler, ), - #"Dark Matter": KH1ItemData("Synthesis", code = 264_1156, classification = ItemClassification.filler, ), - #"Mythril Stone": KH1ItemData("Synthesis", code = 264_1157, classification = ItemClassification.filler, ), - "Fire Arts": KH1ItemData("Key", code = 264_1158, classification = ItemClassification.progression, ), - "Blizzard Arts": KH1ItemData("Key", code = 264_1159, classification = ItemClassification.progression, ), - "Thunder Arts": KH1ItemData("Key", code = 264_1160, classification = ItemClassification.progression, ), - "Cure Arts": KH1ItemData("Key", code = 264_1161, classification = ItemClassification.progression, ), - "Gravity Arts": KH1ItemData("Key", code = 264_1162, classification = ItemClassification.progression, ), - "Stop Arts": KH1ItemData("Key", code = 264_1163, classification = ItemClassification.progression, ), - "Aero Arts": KH1ItemData("Key", code = 264_1164, classification = ItemClassification.progression, ), - #"Shiitank Rank": KH1ItemData("Synthesis", code = 264_1165, classification = ItemClassification.filler, ), - #"Matsutake Rank": KH1ItemData("Synthesis", code = 264_1166, classification = ItemClassification.filler, ), - #"Mystery Mold": KH1ItemData("Synthesis", code = 264_1167, classification = ItemClassification.filler, ), - "Ansem's Report 1": KH1ItemData("Reports", code = 264_1168, classification = ItemClassification.progression, ), - "Ansem's Report 2": KH1ItemData("Reports", code = 264_1169, classification = ItemClassification.progression, ), - "Ansem's Report 3": KH1ItemData("Reports", code = 264_1170, classification = ItemClassification.progression, ), - "Ansem's Report 4": KH1ItemData("Reports", code = 264_1171, classification = ItemClassification.progression, ), - "Ansem's Report 5": KH1ItemData("Reports", code = 264_1172, classification = ItemClassification.progression, ), - "Ansem's Report 6": KH1ItemData("Reports", code = 264_1173, classification = ItemClassification.progression, ), - "Ansem's Report 7": KH1ItemData("Reports", code = 264_1174, classification = ItemClassification.progression, ), - "Ansem's Report 8": KH1ItemData("Reports", code = 264_1175, classification = ItemClassification.progression, ), - "Ansem's Report 9": KH1ItemData("Reports", code = 264_1176, classification = ItemClassification.progression, ), - "Ansem's Report 10": KH1ItemData("Reports", code = 264_1177, classification = ItemClassification.progression, ), - #"Khama Vol. 8": KH1ItemData("Key", code = 264_1178, classification = ItemClassification.progression, ), - #"Salegg Vol. 6": KH1ItemData("Key", code = 264_1179, classification = ItemClassification.progression, ), - #"Azal Vol. 3": KH1ItemData("Key", code = 264_1180, classification = ItemClassification.progression, ), - #"Mava Vol. 3": KH1ItemData("Key", code = 264_1181, classification = ItemClassification.progression, ), - #"Mava Vol. 6": KH1ItemData("Key", code = 264_1182, classification = ItemClassification.progression, ), - "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, ), - #"Nahara Vol. 5": KH1ItemData("Key", code = 264_1184, classification = ItemClassification.progression, ), - #"Hafet Vol. 4": KH1ItemData("Key", code = 264_1185, classification = ItemClassification.progression, ), - "Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, max_quantity = 6 ), - #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, ), - "Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, ), - "Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, ), - "Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, ), - "Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, ), - #"Log": KH1ItemData("Key", code = 264_1192, classification = ItemClassification.progression, ), - #"Cloth": KH1ItemData("Key", code = 264_1193, classification = ItemClassification.progression, ), - #"Rope": KH1ItemData("Key", code = 264_1194, classification = ItemClassification.progression, ), - #"Seagull Egg": KH1ItemData("Key", code = 264_1195, classification = ItemClassification.progression, ), - #"Fish": KH1ItemData("Key", code = 264_1196, classification = ItemClassification.progression, ), - #"Mushroom": KH1ItemData("Key", code = 264_1197, classification = ItemClassification.progression, ), - #"Coconut": KH1ItemData("Key", code = 264_1198, classification = ItemClassification.progression, ), - #"Drinking Water": KH1ItemData("Key", code = 264_1199, classification = ItemClassification.progression, ), - #"Navi-G Piece 1": KH1ItemData("Key", code = 264_1200, classification = ItemClassification.progression, ), - #"Navi-G Piece 2": KH1ItemData("Key", code = 264_1201, classification = ItemClassification.progression, ), - #"Navi-Gummi Unused": KH1ItemData("Key", code = 264_1202, classification = ItemClassification.progression, ), - #"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, ), - #"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, ), - #"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, ), - #"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, ), - #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, ), - #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, ), - #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, ), - "Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, ), - "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, max_quantity = 10), - "Torn Page 1": KH1ItemData("Torn Pages", code = 264_1212, classification = ItemClassification.progression, ), - "Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, ), - "Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, ), - "Torn Page 4": KH1ItemData("Torn Pages", code = 264_1215, classification = ItemClassification.progression, ), - "Torn Page 5": KH1ItemData("Torn Pages", code = 264_1216, classification = ItemClassification.progression, ), - "Slides": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, ), - #"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, ), - #"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, ), - #"Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, ), - #"Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, ), - #"Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, ), - "Footprints": KH1ItemData("Key", code = 264_1223, classification = ItemClassification.progression, ), - #"Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, ), - #"Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, ), - #"Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, ), - "Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, ), - "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, ), - "Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, ), - #"Hero License": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, ), - #"Pretty Stone": KH1ItemData("Synthesis", code = 264_1231, classification = ItemClassification.filler, ), - #"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, ), - #"Lucid Shard": KH1ItemData("Synthesis", code = 264_1233, classification = ItemClassification.filler, ), - #"Lucid Gem": KH1ItemData("Synthesis", code = 264_1234, classification = ItemClassification.filler, ), - #"Lucid Crystal": KH1ItemData("Synthesis", code = 264_1235, classification = ItemClassification.filler, ), - #"Spirit Shard": KH1ItemData("Synthesis", code = 264_1236, classification = ItemClassification.filler, ), - #"Spirit Gem": KH1ItemData("Synthesis", code = 264_1237, classification = ItemClassification.filler, ), - #"Power Shard": KH1ItemData("Synthesis", code = 264_1238, classification = ItemClassification.filler, ), - #"Power Gem": KH1ItemData("Synthesis", code = 264_1239, classification = ItemClassification.filler, ), - #"Power Crystal": KH1ItemData("Synthesis", code = 264_1240, classification = ItemClassification.filler, ), - #"Blaze Shard": KH1ItemData("Synthesis", code = 264_1241, classification = ItemClassification.filler, ), - #"Blaze Gem": KH1ItemData("Synthesis", code = 264_1242, classification = ItemClassification.filler, ), - #"Frost Shard": KH1ItemData("Synthesis", code = 264_1243, classification = ItemClassification.filler, ), - #"Frost Gem": KH1ItemData("Synthesis", code = 264_1244, classification = ItemClassification.filler, ), - #"Thunder Shard": KH1ItemData("Synthesis", code = 264_1245, classification = ItemClassification.filler, ), - #"Thunder Gem": KH1ItemData("Synthesis", code = 264_1246, classification = ItemClassification.filler, ), - #"Shiny Crystal": KH1ItemData("Synthesis", code = 264_1247, classification = ItemClassification.filler, ), - #"Bright Shard": KH1ItemData("Synthesis", code = 264_1248, classification = ItemClassification.filler, ), - #"Bright Gem": KH1ItemData("Synthesis", code = 264_1249, classification = ItemClassification.filler, ), - #"Bright Crystal": KH1ItemData("Synthesis", code = 264_1250, classification = ItemClassification.filler, ), - #"Mystery Goo": KH1ItemData("Synthesis", code = 264_1251, classification = ItemClassification.filler, ), - #"Gale": KH1ItemData("Synthesis", code = 264_1252, classification = ItemClassification.filler, ), - #"Mythril Shard": KH1ItemData("Synthesis", code = 264_1253, classification = ItemClassification.filler, ), - #"Mythril": KH1ItemData("Synthesis", code = 264_1254, classification = ItemClassification.filler, ), - #"Orichalcum": KH1ItemData("Synthesis", code = 264_1255, classification = ItemClassification.filler, ), - "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, ), - "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, ), - "Progressive Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, max_quantity = 2 ), - #"Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, ), - "Puppy 01": KH1ItemData("Puppies", code = 264_2101, classification = ItemClassification.progression, ), - "Puppy 02": KH1ItemData("Puppies", code = 264_2102, classification = ItemClassification.progression, ), - "Puppy 03": KH1ItemData("Puppies", code = 264_2103, classification = ItemClassification.progression, ), - "Puppy 04": KH1ItemData("Puppies", code = 264_2104, classification = ItemClassification.progression, ), - "Puppy 05": KH1ItemData("Puppies", code = 264_2105, classification = ItemClassification.progression, ), - "Puppy 06": KH1ItemData("Puppies", code = 264_2106, classification = ItemClassification.progression, ), - "Puppy 07": KH1ItemData("Puppies", code = 264_2107, classification = ItemClassification.progression, ), - "Puppy 08": KH1ItemData("Puppies", code = 264_2108, classification = ItemClassification.progression, ), - "Puppy 09": KH1ItemData("Puppies", code = 264_2109, classification = ItemClassification.progression, ), - "Puppy 10": KH1ItemData("Puppies", code = 264_2110, classification = ItemClassification.progression, ), - "Puppy 11": KH1ItemData("Puppies", code = 264_2111, classification = ItemClassification.progression, ), - "Puppy 12": KH1ItemData("Puppies", code = 264_2112, classification = ItemClassification.progression, ), - "Puppy 13": KH1ItemData("Puppies", code = 264_2113, classification = ItemClassification.progression, ), - "Puppy 14": KH1ItemData("Puppies", code = 264_2114, classification = ItemClassification.progression, ), - "Puppy 15": KH1ItemData("Puppies", code = 264_2115, classification = ItemClassification.progression, ), - "Puppy 16": KH1ItemData("Puppies", code = 264_2116, classification = ItemClassification.progression, ), - "Puppy 17": KH1ItemData("Puppies", code = 264_2117, classification = ItemClassification.progression, ), - "Puppy 18": KH1ItemData("Puppies", code = 264_2118, classification = ItemClassification.progression, ), - "Puppy 19": KH1ItemData("Puppies", code = 264_2119, classification = ItemClassification.progression, ), - "Puppy 20": KH1ItemData("Puppies", code = 264_2120, classification = ItemClassification.progression, ), - "Puppy 21": KH1ItemData("Puppies", code = 264_2121, classification = ItemClassification.progression, ), - "Puppy 22": KH1ItemData("Puppies", code = 264_2122, classification = ItemClassification.progression, ), - "Puppy 23": KH1ItemData("Puppies", code = 264_2123, classification = ItemClassification.progression, ), - "Puppy 24": KH1ItemData("Puppies", code = 264_2124, classification = ItemClassification.progression, ), - "Puppy 25": KH1ItemData("Puppies", code = 264_2125, classification = ItemClassification.progression, ), - "Puppy 26": KH1ItemData("Puppies", code = 264_2126, classification = ItemClassification.progression, ), - "Puppy 27": KH1ItemData("Puppies", code = 264_2127, classification = ItemClassification.progression, ), - "Puppy 28": KH1ItemData("Puppies", code = 264_2128, classification = ItemClassification.progression, ), - "Puppy 29": KH1ItemData("Puppies", code = 264_2129, classification = ItemClassification.progression, ), - "Puppy 30": KH1ItemData("Puppies", code = 264_2130, classification = ItemClassification.progression, ), - "Puppy 31": KH1ItemData("Puppies", code = 264_2131, classification = ItemClassification.progression, ), - "Puppy 32": KH1ItemData("Puppies", code = 264_2132, classification = ItemClassification.progression, ), - "Puppy 33": KH1ItemData("Puppies", code = 264_2133, classification = ItemClassification.progression, ), - "Puppy 34": KH1ItemData("Puppies", code = 264_2134, classification = ItemClassification.progression, ), - "Puppy 35": KH1ItemData("Puppies", code = 264_2135, classification = ItemClassification.progression, ), - "Puppy 36": KH1ItemData("Puppies", code = 264_2136, classification = ItemClassification.progression, ), - "Puppy 37": KH1ItemData("Puppies", code = 264_2137, classification = ItemClassification.progression, ), - "Puppy 38": KH1ItemData("Puppies", code = 264_2138, classification = ItemClassification.progression, ), - "Puppy 39": KH1ItemData("Puppies", code = 264_2139, classification = ItemClassification.progression, ), - "Puppy 40": KH1ItemData("Puppies", code = 264_2140, classification = ItemClassification.progression, ), - "Puppy 41": KH1ItemData("Puppies", code = 264_2141, classification = ItemClassification.progression, ), - "Puppy 42": KH1ItemData("Puppies", code = 264_2142, classification = ItemClassification.progression, ), - "Puppy 43": KH1ItemData("Puppies", code = 264_2143, classification = ItemClassification.progression, ), - "Puppy 44": KH1ItemData("Puppies", code = 264_2144, classification = ItemClassification.progression, ), - "Puppy 45": KH1ItemData("Puppies", code = 264_2145, classification = ItemClassification.progression, ), - "Puppy 46": KH1ItemData("Puppies", code = 264_2146, classification = ItemClassification.progression, ), - "Puppy 47": KH1ItemData("Puppies", code = 264_2147, classification = ItemClassification.progression, ), - "Puppy 48": KH1ItemData("Puppies", code = 264_2148, classification = ItemClassification.progression, ), - "Puppy 49": KH1ItemData("Puppies", code = 264_2149, classification = ItemClassification.progression, ), - "Puppy 50": KH1ItemData("Puppies", code = 264_2150, classification = ItemClassification.progression, ), - "Puppy 51": KH1ItemData("Puppies", code = 264_2151, classification = ItemClassification.progression, ), - "Puppy 52": KH1ItemData("Puppies", code = 264_2152, classification = ItemClassification.progression, ), - "Puppy 53": KH1ItemData("Puppies", code = 264_2153, classification = ItemClassification.progression, ), - "Puppy 54": KH1ItemData("Puppies", code = 264_2154, classification = ItemClassification.progression, ), - "Puppy 55": KH1ItemData("Puppies", code = 264_2155, classification = ItemClassification.progression, ), - "Puppy 56": KH1ItemData("Puppies", code = 264_2156, classification = ItemClassification.progression, ), - "Puppy 57": KH1ItemData("Puppies", code = 264_2157, classification = ItemClassification.progression, ), - "Puppy 58": KH1ItemData("Puppies", code = 264_2158, classification = ItemClassification.progression, ), - "Puppy 59": KH1ItemData("Puppies", code = 264_2159, classification = ItemClassification.progression, ), - "Puppy 60": KH1ItemData("Puppies", code = 264_2160, classification = ItemClassification.progression, ), - "Puppy 61": KH1ItemData("Puppies", code = 264_2161, classification = ItemClassification.progression, ), - "Puppy 62": KH1ItemData("Puppies", code = 264_2162, classification = ItemClassification.progression, ), - "Puppy 63": KH1ItemData("Puppies", code = 264_2163, classification = ItemClassification.progression, ), - "Puppy 64": KH1ItemData("Puppies", code = 264_2164, classification = ItemClassification.progression, ), - "Puppy 65": KH1ItemData("Puppies", code = 264_2165, classification = ItemClassification.progression, ), - "Puppy 66": KH1ItemData("Puppies", code = 264_2166, classification = ItemClassification.progression, ), - "Puppy 67": KH1ItemData("Puppies", code = 264_2167, classification = ItemClassification.progression, ), - "Puppy 68": KH1ItemData("Puppies", code = 264_2168, classification = ItemClassification.progression, ), - "Puppy 69": KH1ItemData("Puppies", code = 264_2169, classification = ItemClassification.progression, ), - "Puppy 70": KH1ItemData("Puppies", code = 264_2170, classification = ItemClassification.progression, ), - "Puppy 71": KH1ItemData("Puppies", code = 264_2171, classification = ItemClassification.progression, ), - "Puppy 72": KH1ItemData("Puppies", code = 264_2172, classification = ItemClassification.progression, ), - "Puppy 73": KH1ItemData("Puppies", code = 264_2173, classification = ItemClassification.progression, ), - "Puppy 74": KH1ItemData("Puppies", code = 264_2174, classification = ItemClassification.progression, ), - "Puppy 75": KH1ItemData("Puppies", code = 264_2175, classification = ItemClassification.progression, ), - "Puppy 76": KH1ItemData("Puppies", code = 264_2176, classification = ItemClassification.progression, ), - "Puppy 77": KH1ItemData("Puppies", code = 264_2177, classification = ItemClassification.progression, ), - "Puppy 78": KH1ItemData("Puppies", code = 264_2178, classification = ItemClassification.progression, ), - "Puppy 79": KH1ItemData("Puppies", code = 264_2179, classification = ItemClassification.progression, ), - "Puppy 80": KH1ItemData("Puppies", code = 264_2180, classification = ItemClassification.progression, ), - "Puppy 81": KH1ItemData("Puppies", code = 264_2181, classification = ItemClassification.progression, ), - "Puppy 82": KH1ItemData("Puppies", code = 264_2182, classification = ItemClassification.progression, ), - "Puppy 83": KH1ItemData("Puppies", code = 264_2183, classification = ItemClassification.progression, ), - "Puppy 84": KH1ItemData("Puppies", code = 264_2184, classification = ItemClassification.progression, ), - "Puppy 85": KH1ItemData("Puppies", code = 264_2185, classification = ItemClassification.progression, ), - "Puppy 86": KH1ItemData("Puppies", code = 264_2186, classification = ItemClassification.progression, ), - "Puppy 87": KH1ItemData("Puppies", code = 264_2187, classification = ItemClassification.progression, ), - "Puppy 88": KH1ItemData("Puppies", code = 264_2188, classification = ItemClassification.progression, ), - "Puppy 89": KH1ItemData("Puppies", code = 264_2189, classification = ItemClassification.progression, ), - "Puppy 90": KH1ItemData("Puppies", code = 264_2190, classification = ItemClassification.progression, ), - "Puppy 91": KH1ItemData("Puppies", code = 264_2191, classification = ItemClassification.progression, ), - "Puppy 92": KH1ItemData("Puppies", code = 264_2192, classification = ItemClassification.progression, ), - "Puppy 93": KH1ItemData("Puppies", code = 264_2193, classification = ItemClassification.progression, ), - "Puppy 94": KH1ItemData("Puppies", code = 264_2194, classification = ItemClassification.progression, ), - "Puppy 95": KH1ItemData("Puppies", code = 264_2195, classification = ItemClassification.progression, ), - "Puppy 96": KH1ItemData("Puppies", code = 264_2196, classification = ItemClassification.progression, ), - "Puppy 97": KH1ItemData("Puppies", code = 264_2197, classification = ItemClassification.progression, ), - "Puppy 98": KH1ItemData("Puppies", code = 264_2198, classification = ItemClassification.progression, ), - "Puppy 99": KH1ItemData("Puppies", code = 264_2199, classification = ItemClassification.progression, ), - "Puppies 01-03": KH1ItemData("Puppies", code = 264_2201, classification = ItemClassification.progression, ), - "Puppies 04-06": KH1ItemData("Puppies", code = 264_2202, classification = ItemClassification.progression, ), - "Puppies 07-09": KH1ItemData("Puppies", code = 264_2203, classification = ItemClassification.progression, ), - "Puppies 10-12": KH1ItemData("Puppies", code = 264_2204, classification = ItemClassification.progression, ), - "Puppies 13-15": KH1ItemData("Puppies", code = 264_2205, classification = ItemClassification.progression, ), - "Puppies 16-18": KH1ItemData("Puppies", code = 264_2206, classification = ItemClassification.progression, ), - "Puppies 19-21": KH1ItemData("Puppies", code = 264_2207, classification = ItemClassification.progression, ), - "Puppies 22-24": KH1ItemData("Puppies", code = 264_2208, classification = ItemClassification.progression, ), - "Puppies 25-27": KH1ItemData("Puppies", code = 264_2209, classification = ItemClassification.progression, ), - "Puppies 28-30": KH1ItemData("Puppies", code = 264_2210, classification = ItemClassification.progression, ), - "Puppies 31-33": KH1ItemData("Puppies", code = 264_2211, classification = ItemClassification.progression, ), - "Puppies 34-36": KH1ItemData("Puppies", code = 264_2212, classification = ItemClassification.progression, ), - "Puppies 37-39": KH1ItemData("Puppies", code = 264_2213, classification = ItemClassification.progression, ), - "Puppies 40-42": KH1ItemData("Puppies", code = 264_2214, classification = ItemClassification.progression, ), - "Puppies 43-45": KH1ItemData("Puppies", code = 264_2215, classification = ItemClassification.progression, ), - "Puppies 46-48": KH1ItemData("Puppies", code = 264_2216, classification = ItemClassification.progression, ), - "Puppies 49-51": KH1ItemData("Puppies", code = 264_2217, classification = ItemClassification.progression, ), - "Puppies 52-54": KH1ItemData("Puppies", code = 264_2218, classification = ItemClassification.progression, ), - "Puppies 55-57": KH1ItemData("Puppies", code = 264_2219, classification = ItemClassification.progression, ), - "Puppies 58-60": KH1ItemData("Puppies", code = 264_2220, classification = ItemClassification.progression, ), - "Puppies 61-63": KH1ItemData("Puppies", code = 264_2221, classification = ItemClassification.progression, ), - "Puppies 64-66": KH1ItemData("Puppies", code = 264_2222, classification = ItemClassification.progression, ), - "Puppies 67-69": KH1ItemData("Puppies", code = 264_2223, classification = ItemClassification.progression, ), - "Puppies 70-72": KH1ItemData("Puppies", code = 264_2224, classification = ItemClassification.progression, ), - "Puppies 73-75": KH1ItemData("Puppies", code = 264_2225, classification = ItemClassification.progression, ), - "Puppies 76-78": KH1ItemData("Puppies", code = 264_2226, classification = ItemClassification.progression, ), - "Puppies 79-81": KH1ItemData("Puppies", code = 264_2227, classification = ItemClassification.progression, ), - "Puppies 82-84": KH1ItemData("Puppies", code = 264_2228, classification = ItemClassification.progression, ), - "Puppies 85-87": KH1ItemData("Puppies", code = 264_2229, classification = ItemClassification.progression, ), - "Puppies 88-90": KH1ItemData("Puppies", code = 264_2230, classification = ItemClassification.progression, ), - "Puppies 91-93": KH1ItemData("Puppies", code = 264_2231, classification = ItemClassification.progression, ), - "Puppies 94-96": KH1ItemData("Puppies", code = 264_2232, classification = ItemClassification.progression, ), - "Puppies 97-99": KH1ItemData("Puppies", code = 264_2233, classification = ItemClassification.progression, ), - "All Puppies": KH1ItemData("Puppies", code = 264_2240, classification = ItemClassification.progression, ), - "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, max_quantity = 2 ), - "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, max_quantity = 4 ), - "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.useful, max_quantity = 2 ), - "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, max_quantity = 3 ), - #"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, ), - "Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, ), - "Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.useful, ), - "Ars Arcanum": KH1ItemData("Abilities", code = 264_3012, classification = ItemClassification.useful, ), - "Strike Raid": KH1ItemData("Abilities", code = 264_3013, classification = ItemClassification.useful, ), - "Ragnarok": KH1ItemData("Abilities", code = 264_3014, classification = ItemClassification.useful, ), - "Trinity Limit": KH1ItemData("Abilities", code = 264_3015, classification = ItemClassification.useful, ), - "Cheer": KH1ItemData("Abilities", code = 264_3016, classification = ItemClassification.useful, ), - "Vortex": KH1ItemData("Abilities", code = 264_3017, classification = ItemClassification.useful, ), - "Aerial Sweep": KH1ItemData("Abilities", code = 264_3018, classification = ItemClassification.useful, ), - "Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.useful, ), - "Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, ), - "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.progression, ), - "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.progression, ), - "MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, ), - "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.progression, ), - "Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.progression, ), - "Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, ), - "Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, ), - "Lucky Strike": KH1ItemData("Abilities", code = 264_3028, classification = ItemClassification.useful, ), - #"Charge": KH1ItemData("Abilities", code = 264_3029, classification = ItemClassification.useful, ), - #"Rocket": KH1ItemData("Abilities", code = 264_3030, classification = ItemClassification.useful, ), - #"Tornado": KH1ItemData("Abilities", code = 264_3031, classification = ItemClassification.useful, ), - #"MP Gift": KH1ItemData("Abilities", code = 264_3032, classification = ItemClassification.useful, ), - #"Raging Boar": KH1ItemData("Abilities", code = 264_3033, classification = ItemClassification.useful, ), - #"Asp's Bite": KH1ItemData("Abilities", code = 264_3034, classification = ItemClassification.useful, ), - #"Healing Herb": KH1ItemData("Abilities", code = 264_3035, classification = ItemClassification.useful, ), - #"Wind Armor": KH1ItemData("Abilities", code = 264_3036, classification = ItemClassification.useful, ), - #"Crescent": KH1ItemData("Abilities", code = 264_3037, classification = ItemClassification.useful, ), - #"Sandstorm": KH1ItemData("Abilities", code = 264_3038, classification = ItemClassification.useful, ), - #"Applause!": KH1ItemData("Abilities", code = 264_3039, classification = ItemClassification.useful, ), - #"Blazing Fury": KH1ItemData("Abilities", code = 264_3040, classification = ItemClassification.useful, ), - #"Icy Terror": KH1ItemData("Abilities", code = 264_3041, classification = ItemClassification.useful, ), - #"Bolts of Sorrow": KH1ItemData("Abilities", code = 264_3042, classification = ItemClassification.useful, ), - #"Ghostly Scream": KH1ItemData("Abilities", code = 264_3043, classification = ItemClassification.useful, ), - #"Humming Bird": KH1ItemData("Abilities", code = 264_3044, classification = ItemClassification.useful, ), - #"Time-Out": KH1ItemData("Abilities", code = 264_3045, classification = ItemClassification.useful, ), - #"Storm's Eye": KH1ItemData("Abilities", code = 264_3046, classification = ItemClassification.useful, ), - #"Ferocious Lunge": KH1ItemData("Abilities", code = 264_3047, classification = ItemClassification.useful, ), - #"Furious Bellow": KH1ItemData("Abilities", code = 264_3048, classification = ItemClassification.useful, ), - #"Spiral Wave": KH1ItemData("Abilities", code = 264_3049, classification = ItemClassification.useful, ), - #"Thunder Potion": KH1ItemData("Abilities", code = 264_3050, classification = ItemClassification.useful, ), - #"Cure Potion": KH1ItemData("Abilities", code = 264_3051, classification = ItemClassification.useful, ), - #"Aero Potion": KH1ItemData("Abilities", code = 264_3052, classification = ItemClassification.useful, ), - "Slapshot": KH1ItemData("Abilities", code = 264_3053, classification = ItemClassification.useful, ), - "Sliding Dash": KH1ItemData("Abilities", code = 264_3054, classification = ItemClassification.useful, ), - "Hurricane Blast": KH1ItemData("Abilities", code = 264_3055, classification = ItemClassification.useful, ), - "Ripple Drive": KH1ItemData("Abilities", code = 264_3056, classification = ItemClassification.useful, ), - "Stun Impact": KH1ItemData("Abilities", code = 264_3057, classification = ItemClassification.useful, ), - "Gravity Break": KH1ItemData("Abilities", code = 264_3058, classification = ItemClassification.useful, ), - "Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, ), - "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, max_quantity = 4 ), - "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, ), - "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.progression, ), - #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, ), - "EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, ), - "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.progression, ), - "Max HP Increase": KH1ItemData("Level Up", code = 264_4001, classification = ItemClassification.useful, max_quantity = 15), - "Max MP Increase": KH1ItemData("Level Up", code = 264_4002, classification = ItemClassification.useful, max_quantity = 15), - "Max AP Increase": KH1ItemData("Level Up", code = 264_4003, classification = ItemClassification.useful, max_quantity = 15), - "Strength Increase": KH1ItemData("Level Up", code = 264_4004, classification = ItemClassification.useful, max_quantity = 15), - "Defense Increase": KH1ItemData("Level Up", code = 264_4005, classification = ItemClassification.useful, max_quantity = 15), - "Accessory Slot Increase": KH1ItemData("Limited Level Up", code = 264_4006, classification = ItemClassification.useful, max_quantity = 15), - "Item Slot Increase": KH1ItemData("Limited Level Up", code = 264_4007, classification = ItemClassification.useful, max_quantity = 15), - "Dumbo": KH1ItemData("Summons", code = 264_5000, classification = ItemClassification.progression, ), - "Bambi": KH1ItemData("Summons", code = 264_5001, classification = ItemClassification.progression, ), - "Genie": KH1ItemData("Summons", code = 264_5002, classification = ItemClassification.progression, ), - "Tinker Bell": KH1ItemData("Summons", code = 264_5003, classification = ItemClassification.progression, ), - "Mushu": KH1ItemData("Summons", code = 264_5004, classification = ItemClassification.progression, ), - "Simba": KH1ItemData("Summons", code = 264_5005, classification = ItemClassification.progression, ), - "Progressive Fire": KH1ItemData("Magic", code = 264_6001, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Blizzard": KH1ItemData("Magic", code = 264_6002, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Thunder": KH1ItemData("Magic", code = 264_6003, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Cure": KH1ItemData("Magic", code = 264_6004, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Gravity": KH1ItemData("Magic", code = 264_6005, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Stop": KH1ItemData("Magic", code = 264_6006, classification = ItemClassification.progression, max_quantity = 3 ), - "Progressive Aero": KH1ItemData("Magic", code = 264_6007, classification = ItemClassification.progression, max_quantity = 3 ), - #"Traverse Town": KH1ItemData("Worlds", code = 264_7001, classification = ItemClassification.progression, ), - "Wonderland": KH1ItemData("Worlds", code = 264_7002, classification = ItemClassification.progression, ), - "Olympus Coliseum": KH1ItemData("Worlds", code = 264_7003, classification = ItemClassification.progression, ), - "Deep Jungle": KH1ItemData("Worlds", code = 264_7004, classification = ItemClassification.progression, ), - "Agrabah": KH1ItemData("Worlds", code = 264_7005, classification = ItemClassification.progression, ), - "Halloween Town": KH1ItemData("Worlds", code = 264_7006, classification = ItemClassification.progression, ), - "Atlantica": KH1ItemData("Worlds", code = 264_7007, classification = ItemClassification.progression, ), - "Neverland": KH1ItemData("Worlds", code = 264_7008, classification = ItemClassification.progression, ), - "Hollow Bastion": KH1ItemData("Worlds", code = 264_7009, classification = ItemClassification.progression, ), - "End of the World": KH1ItemData("Worlds", code = 264_7010, classification = ItemClassification.progression, ), - "Monstro": KH1ItemData("Worlds", code = 264_7011, classification = ItemClassification.progression, ), - "Blue Trinity": KH1ItemData("Trinities", code = 264_8001, classification = ItemClassification.progression, ), - "Red Trinity": KH1ItemData("Trinities", code = 264_8002, classification = ItemClassification.progression, ), - "Green Trinity": KH1ItemData("Trinities", code = 264_8003, classification = ItemClassification.progression, ), - "Yellow Trinity": KH1ItemData("Trinities", code = 264_8004, classification = ItemClassification.progression, ), - "White Trinity": KH1ItemData("Trinities", code = 264_8005, classification = ItemClassification.progression, ), - "Phil Cup": KH1ItemData("Cups", code = 264_9001, classification = ItemClassification.progression, ), - "Pegasus Cup": KH1ItemData("Cups", code = 264_9002, classification = ItemClassification.progression, ), - "Hercules Cup": KH1ItemData("Cups", code = 264_9003, classification = ItemClassification.progression, ), - #"Hades Cup": KH1ItemData("Cups", code = 264_9004, classification = ItemClassification.progression, ), + "Potion": KH1ItemData("Item", code = 264_1001, classification = ItemClassification.filler, type = "Item", ), + "Hi-Potion": KH1ItemData("Item", code = 264_1002, classification = ItemClassification.filler, type = "Item", ), + "Ether": KH1ItemData("Item", code = 264_1003, classification = ItemClassification.filler, type = "Item", ), + "Elixir": KH1ItemData("Item", code = 264_1004, classification = ItemClassification.filler, type = "Item", ), + #"B05": KH1ItemData("Item", code = 264_1005, classification = ItemClassification.filler, type = "Item", ), + "Mega-Potion": KH1ItemData("Item", code = 264_1006, classification = ItemClassification.filler, type = "Item", ), + "Mega-Ether": KH1ItemData("Item", code = 264_1007, classification = ItemClassification.filler, type = "Item", ), + "Megalixir": KH1ItemData("Item", code = 264_1008, classification = ItemClassification.filler, type = "Item", ), + "Torn Page": KH1ItemData("Torn Pages", code = 264_1009, classification = ItemClassification.progression, type = "Item", max_quantity = 5 ), + "Final Door Key": KH1ItemData("Key", code = 264_1010, classification = ItemClassification.progression, type = "Item", ), + "Destiny Islands": KH1ItemData("Worlds", code = 264_1011, classification = ItemClassification.progression, type = "Item", ), + "Raft Materials": KH1ItemData("Key", code = 264_1012, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ), + #"Frost Stone": KH1ItemData("Synthesis", code = 264_1013, classification = ItemClassification.filler, type = "Item", ), + #"Lightning Stone": KH1ItemData("Synthesis", code = 264_1014, classification = ItemClassification.filler, type = "Item", ), + #"Dazzling Stone": KH1ItemData("Synthesis", code = 264_1015, classification = ItemClassification.filler, type = "Item", ), + #"Stormy Stone": KH1ItemData("Synthesis", code = 264_1016, classification = ItemClassification.filler, type = "Item", ), + "Protect Chain": KH1ItemData("Accessory", code = 264_1017, classification = ItemClassification.useful, type = "Item", ), + "Protera Chain": KH1ItemData("Accessory", code = 264_1018, classification = ItemClassification.useful, type = "Item", ), + "Protega Chain": KH1ItemData("Accessory", code = 264_1019, classification = ItemClassification.useful, type = "Item", ), + "Fire Ring": KH1ItemData("Accessory", code = 264_1020, classification = ItemClassification.useful, type = "Item", ), + "Fira Ring": KH1ItemData("Accessory", code = 264_1021, classification = ItemClassification.useful, type = "Item", ), + "Firaga Ring": KH1ItemData("Accessory", code = 264_1022, classification = ItemClassification.useful, type = "Item", ), + "Blizzard Ring": KH1ItemData("Accessory", code = 264_1023, classification = ItemClassification.useful, type = "Item", ), + "Blizzara Ring": KH1ItemData("Accessory", code = 264_1024, classification = ItemClassification.useful, type = "Item", ), + "Blizzaga Ring": KH1ItemData("Accessory", code = 264_1025, classification = ItemClassification.useful, type = "Item", ), + "Thunder Ring": KH1ItemData("Accessory", code = 264_1026, classification = ItemClassification.useful, type = "Item", ), + "Thundara Ring": KH1ItemData("Accessory", code = 264_1027, classification = ItemClassification.useful, type = "Item", ), + "Thundaga Ring": KH1ItemData("Accessory", code = 264_1028, classification = ItemClassification.useful, type = "Item", ), + "Ability Stud": KH1ItemData("Accessory", code = 264_1029, classification = ItemClassification.useful, type = "Item", ), + "Guard Earring": KH1ItemData("Accessory", code = 264_1030, classification = ItemClassification.useful, type = "Item", ), + "Master Earring": KH1ItemData("Accessory", code = 264_1031, classification = ItemClassification.useful, type = "Item", ), + "Chaos Ring": KH1ItemData("Accessory", code = 264_1032, classification = ItemClassification.useful, type = "Item", ), + "Dark Ring": KH1ItemData("Accessory", code = 264_1033, classification = ItemClassification.useful, type = "Item", ), + "Element Ring": KH1ItemData("Accessory", code = 264_1034, classification = ItemClassification.useful, type = "Item", ), + "Three Stars": KH1ItemData("Accessory", code = 264_1035, classification = ItemClassification.useful, type = "Item", ), + "Power Chain": KH1ItemData("Accessory", code = 264_1036, classification = ItemClassification.useful, type = "Item", ), + "Golem Chain": KH1ItemData("Accessory", code = 264_1037, classification = ItemClassification.useful, type = "Item", ), + "Titan Chain": KH1ItemData("Accessory", code = 264_1038, classification = ItemClassification.useful, type = "Item", ), + "Energy Bangle": KH1ItemData("Accessory", code = 264_1039, classification = ItemClassification.useful, type = "Item", ), + "Angel Bangle": KH1ItemData("Accessory", code = 264_1040, classification = ItemClassification.useful, type = "Item", ), + "Gaia Bangle": KH1ItemData("Accessory", code = 264_1041, classification = ItemClassification.useful, type = "Item", ), + "Magic Armlet": KH1ItemData("Accessory", code = 264_1042, classification = ItemClassification.useful, type = "Item", ), + "Rune Armlet": KH1ItemData("Accessory", code = 264_1043, classification = ItemClassification.useful, type = "Item", ), + "Atlas Armlet": KH1ItemData("Accessory", code = 264_1044, classification = ItemClassification.useful, type = "Item", ), + "Heartguard": KH1ItemData("Accessory", code = 264_1045, classification = ItemClassification.useful, type = "Item", ), + "Ribbon": KH1ItemData("Accessory", code = 264_1046, classification = ItemClassification.useful, type = "Item", ), + "Crystal Crown": KH1ItemData("Accessory", code = 264_1047, classification = ItemClassification.useful, type = "Item", ), + "Brave Warrior": KH1ItemData("Accessory", code = 264_1048, classification = ItemClassification.useful, type = "Item", ), + "Ifrit's Horn": KH1ItemData("Accessory", code = 264_1049, classification = ItemClassification.useful, type = "Item", ), + "Inferno Band": KH1ItemData("Accessory", code = 264_1050, classification = ItemClassification.useful, type = "Item", ), + "White Fang": KH1ItemData("Accessory", code = 264_1051, classification = ItemClassification.useful, type = "Item", ), + "Ray of Light": KH1ItemData("Accessory", code = 264_1052, classification = ItemClassification.useful, type = "Item", ), + "Holy Circlet": KH1ItemData("Accessory", code = 264_1053, classification = ItemClassification.useful, type = "Item", ), + "Raven's Claw": KH1ItemData("Accessory", code = 264_1054, classification = ItemClassification.useful, type = "Item", ), + "Omega Arts": KH1ItemData("Accessory", code = 264_1055, classification = ItemClassification.useful, type = "Item", ), + "EXP Earring": KH1ItemData("Accessory", code = 264_1056, classification = ItemClassification.useful, type = "Item", ), + #"A41": KH1ItemData("Accessory", code = 264_1057, classification = ItemClassification.useful, type = "Item", ), + "EXP Ring": KH1ItemData("Accessory", code = 264_1058, classification = ItemClassification.useful, type = "Item", ), + "EXP Bracelet": KH1ItemData("Accessory", code = 264_1059, classification = ItemClassification.useful, type = "Item", ), + "EXP Necklace": KH1ItemData("Accessory", code = 264_1060, classification = ItemClassification.useful, type = "Item", ), + "Firagun Band": KH1ItemData("Accessory", code = 264_1061, classification = ItemClassification.useful, type = "Item", ), + "Blizzagun Band": KH1ItemData("Accessory", code = 264_1062, classification = ItemClassification.useful, type = "Item", ), + "Thundagun Band": KH1ItemData("Accessory", code = 264_1063, classification = ItemClassification.useful, type = "Item", ), + "Ifrit Belt": KH1ItemData("Accessory", code = 264_1064, classification = ItemClassification.useful, type = "Item", ), + "Shiva Belt": KH1ItemData("Accessory", code = 264_1065, classification = ItemClassification.useful, type = "Item", ), + "Ramuh Belt": KH1ItemData("Accessory", code = 264_1066, classification = ItemClassification.useful, type = "Item", ), + "Moogle Badge": KH1ItemData("Accessory", code = 264_1067, classification = ItemClassification.useful, type = "Item", ), + "Cosmic Arts": KH1ItemData("Accessory", code = 264_1068, classification = ItemClassification.useful, type = "Item", ), + "Royal Crown": KH1ItemData("Accessory", code = 264_1069, classification = ItemClassification.useful, type = "Item", ), + "Prime Cap": KH1ItemData("Accessory", code = 264_1070, classification = ItemClassification.useful, type = "Item", ), + "Obsidian Ring": KH1ItemData("Accessory", code = 264_1071, classification = ItemClassification.useful, type = "Item", ), + #"A56": KH1ItemData("Accessory", code = 264_1072, classification = ItemClassification.filler, type = "Item", ), + #"A57": KH1ItemData("Accessory", code = 264_1073, classification = ItemClassification.filler, type = "Item", ), + #"A58": KH1ItemData("Accessory", code = 264_1074, classification = ItemClassification.filler, type = "Item", ), + #"A59": KH1ItemData("Accessory", code = 264_1075, classification = ItemClassification.filler, type = "Item", ), + #"A60": KH1ItemData("Accessory", code = 264_1076, classification = ItemClassification.filler, type = "Item", ), + #"A61": KH1ItemData("Accessory", code = 264_1077, classification = ItemClassification.filler, type = "Item", ), + #"A62": KH1ItemData("Accessory", code = 264_1078, classification = ItemClassification.filler, type = "Item", ), + #"A63": KH1ItemData("Accessory", code = 264_1079, classification = ItemClassification.filler, type = "Item", ), + #"A64": KH1ItemData("Accessory", code = 264_1080, classification = ItemClassification.filler, type = "Item", ), + #"Kingdom Key": KH1ItemData("Keyblades", code = 264_1081, classification = ItemClassification.useful, type = "Item", ), + #"Dream Sword": KH1ItemData("Keyblades", code = 264_1082, classification = ItemClassification.useful, type = "Item", ), + #"Dream Shield": KH1ItemData("Keyblades", code = 264_1083, classification = ItemClassification.useful, type = "Item", ), + #"Dream Rod": KH1ItemData("Keyblades", code = 264_1084, classification = ItemClassification.useful, type = "Item", ), + #"Wooden Sword": KH1ItemData("Keyblades", code = 264_1085, classification = ItemClassification.useful, type = "Item", ), + "Jungle King": KH1ItemData("Keyblades", code = 264_1086, classification = ItemClassification.progression, type = "Item", ), + "Three Wishes": KH1ItemData("Keyblades", code = 264_1087, classification = ItemClassification.progression, type = "Item", ), + "Fairy Harp": KH1ItemData("Keyblades", code = 264_1088, classification = ItemClassification.progression, type = "Item", ), + "Pumpkinhead": KH1ItemData("Keyblades", code = 264_1089, classification = ItemClassification.progression, type = "Item", ), + "Crabclaw": KH1ItemData("Keyblades", code = 264_1090, classification = ItemClassification.progression, type = "Item", ), + "Divine Rose": KH1ItemData("Keyblades", code = 264_1091, classification = ItemClassification.progression, type = "Item", ), + "Spellbinder": KH1ItemData("Keyblades", code = 264_1092, classification = ItemClassification.progression, type = "Item", ), + "Olympia": KH1ItemData("Keyblades", code = 264_1093, classification = ItemClassification.progression, type = "Item", ), + "Lionheart": KH1ItemData("Keyblades", code = 264_1094, classification = ItemClassification.progression, type = "Item", ), + "Metal Chocobo": KH1ItemData("Keyblades", code = 264_1095, classification = ItemClassification.useful, type = "Item", ), + "Oathkeeper": KH1ItemData("Keyblades", code = 264_1096, classification = ItemClassification.progression, type = "Item", ), + "Oblivion": KH1ItemData("Keyblades", code = 264_1097, classification = ItemClassification.progression, type = "Item", ), + "Lady Luck": KH1ItemData("Keyblades", code = 264_1098, classification = ItemClassification.progression, type = "Item", ), + "Wishing Star": KH1ItemData("Keyblades", code = 264_1099, classification = ItemClassification.progression, type = "Item", ), + "Ultima Weapon": KH1ItemData("Keyblades", code = 264_1100, classification = ItemClassification.useful, type = "Item", ), + "Diamond Dust": KH1ItemData("Keyblades", code = 264_1101, classification = ItemClassification.useful, type = "Item", ), + "One-Winged Angel": KH1ItemData("Keyblades", code = 264_1102, classification = ItemClassification.useful, type = "Item", ), + #"Mage's Staff": KH1ItemData("Weapons", code = 264_1103, classification = ItemClassification.filler, type = "Item", ), + "Morning Star": KH1ItemData("Weapons", code = 264_1104, classification = ItemClassification.useful, type = "Item", ), + "Shooting Star": KH1ItemData("Weapons", code = 264_1105, classification = ItemClassification.useful, type = "Item", ), + "Magus Staff": KH1ItemData("Weapons", code = 264_1106, classification = ItemClassification.useful, type = "Item", ), + "Wisdom Staff": KH1ItemData("Weapons", code = 264_1107, classification = ItemClassification.useful, type = "Item", ), + "Warhammer": KH1ItemData("Weapons", code = 264_1108, classification = ItemClassification.useful, type = "Item", ), + "Silver Mallet": KH1ItemData("Weapons", code = 264_1109, classification = ItemClassification.useful, type = "Item", ), + "Grand Mallet": KH1ItemData("Weapons", code = 264_1110, classification = ItemClassification.useful, type = "Item", ), + "Lord Fortune": KH1ItemData("Weapons", code = 264_1111, classification = ItemClassification.useful, type = "Item", ), + "Violetta": KH1ItemData("Weapons", code = 264_1112, classification = ItemClassification.useful, type = "Item", ), + "Dream Rod (Donald)": KH1ItemData("Weapons", code = 264_1113, classification = ItemClassification.useful, type = "Item", ), + "Save the Queen": KH1ItemData("Weapons", code = 264_1114, classification = ItemClassification.useful, type = "Item", ), + "Wizard's Relic": KH1ItemData("Weapons", code = 264_1115, classification = ItemClassification.useful, type = "Item", ), + "Meteor Strike": KH1ItemData("Weapons", code = 264_1116, classification = ItemClassification.useful, type = "Item", ), + "Fantasista": KH1ItemData("Weapons", code = 264_1117, classification = ItemClassification.useful, type = "Item", ), + #"Unused (Donald)": KH1ItemData("Weapons", code = 264_1118, classification = ItemClassification.filler, type = "Item", ), + #"Knight's Shield": KH1ItemData("Weapons", code = 264_1119, classification = ItemClassification.filler, type = "Item", ), + "Mythril Shield": KH1ItemData("Weapons", code = 264_1120, classification = ItemClassification.useful, type = "Item", ), + "Onyx Shield": KH1ItemData("Weapons", code = 264_1121, classification = ItemClassification.useful, type = "Item", ), + "Stout Shield": KH1ItemData("Weapons", code = 264_1122, classification = ItemClassification.useful, type = "Item", ), + "Golem Shield": KH1ItemData("Weapons", code = 264_1123, classification = ItemClassification.useful, type = "Item", ), + "Adamant Shield": KH1ItemData("Weapons", code = 264_1124, classification = ItemClassification.useful, type = "Item", ), + "Smasher": KH1ItemData("Weapons", code = 264_1125, classification = ItemClassification.useful, type = "Item", ), + "Gigas Fist": KH1ItemData("Weapons", code = 264_1126, classification = ItemClassification.useful, type = "Item", ), + "Genji Shield": KH1ItemData("Weapons", code = 264_1127, classification = ItemClassification.useful, type = "Item", ), + "Herc's Shield": KH1ItemData("Weapons", code = 264_1128, classification = ItemClassification.useful, type = "Item", ), + "Dream Shield (Goofy)": KH1ItemData("Weapons", code = 264_1129, classification = ItemClassification.useful, type = "Item", ), + "Save the King": KH1ItemData("Weapons", code = 264_1130, classification = ItemClassification.useful, type = "Item", ), + "Defender": KH1ItemData("Weapons", code = 264_1131, classification = ItemClassification.useful, type = "Item", ), + "Mighty Shield": KH1ItemData("Weapons", code = 264_1132, classification = ItemClassification.useful, type = "Item", ), + "Seven Elements": KH1ItemData("Weapons", code = 264_1133, classification = ItemClassification.useful, type = "Item", ), + #"Unused (Goofy)": KH1ItemData("Weapons", code = 264_1134, classification = ItemClassification.filler, type = "Item", ), + #"Spear": KH1ItemData("Weapons", code = 264_1135, classification = ItemClassification.filler, type = "Item", ), + #"No Weapon": KH1ItemData("Weapons", code = 264_1136, classification = ItemClassification.filler, type = "Item", ), + #"Genie": KH1ItemData("Weapons", code = 264_1137, classification = ItemClassification.filler, type = "Item", ), + #"No Weapon": KH1ItemData("Weapons", code = 264_1138, classification = ItemClassification.filler, type = "Item", ), + #"No Weapon": KH1ItemData("Weapons", code = 264_1139, classification = ItemClassification.filler, type = "Item", ), + #"Dagger": KH1ItemData("Weapons", code = 264_1140, classification = ItemClassification.filler, type = "Item", ), + #"Claws": KH1ItemData("Weapons", code = 264_1141, classification = ItemClassification.filler, type = "Item", ), + "Tent": KH1ItemData("Camping", code = 264_1142, classification = ItemClassification.filler, type = "Item", ), + "Camping Set": KH1ItemData("Camping", code = 264_1143, classification = ItemClassification.filler, type = "Item", ), + "Cottage": KH1ItemData("Camping", code = 264_1144, classification = ItemClassification.filler, type = "Item", ), + #"C04": KH1ItemData("Camping", code = 264_1145, classification = ItemClassification.filler, type = "Item", ), + #"C05": KH1ItemData("Camping", code = 264_1146, classification = ItemClassification.filler, type = "Item", ), + #"C06": KH1ItemData("Camping", code = 264_1147, classification = ItemClassification.filler, type = "Item", ), + #"C07": KH1ItemData("Camping", code = 264_1148, classification = ItemClassification.filler, type = "Item", ), + "Wonderland": KH1ItemData("Worlds", code = 264_1149, classification = ItemClassification.progression, type = "Item", ), + "Olympus Coliseum": KH1ItemData("Worlds", code = 264_1150, classification = ItemClassification.progression, type = "Item", ), + "Deep Jungle": KH1ItemData("Worlds", code = 264_1151, classification = ItemClassification.progression, type = "Item", ), + "Power Up": KH1ItemData("Stat Ups", code = 264_1152, classification = ItemClassification.filler, type = "Item", ), + "Defense Up": KH1ItemData("Stat Ups", code = 264_1153, classification = ItemClassification.filler, type = "Item", ), + "AP Up": KH1ItemData("Stat Ups", code = 264_1154, classification = ItemClassification.filler, type = "Item", ), + "Agrabah": KH1ItemData("Worlds", code = 264_1155, classification = ItemClassification.progression, type = "Item", ), + "Monstro": KH1ItemData("Worlds", code = 264_1156, classification = ItemClassification.progression, type = "Item", ), + "Atlantica": KH1ItemData("Worlds", code = 264_1157, classification = ItemClassification.progression, type = "Item", ), + "Fire Arts": KH1ItemData("Key", code = 264_1158, classification = ItemClassification.progression, type = "Item", ), + "Blizzard Arts": KH1ItemData("Key", code = 264_1159, classification = ItemClassification.progression, type = "Item", ), + "Thunder Arts": KH1ItemData("Key", code = 264_1160, classification = ItemClassification.progression, type = "Item", ), + "Cure Arts": KH1ItemData("Key", code = 264_1161, classification = ItemClassification.progression, type = "Item", ), + "Gravity Arts": KH1ItemData("Key", code = 264_1162, classification = ItemClassification.progression, type = "Item", ), + "Stop Arts": KH1ItemData("Key", code = 264_1163, classification = ItemClassification.progression, type = "Item", ), + "Aero Arts": KH1ItemData("Key", code = 264_1164, classification = ItemClassification.progression, type = "Item", ), + "Neverland": KH1ItemData("Worlds", code = 264_1165, classification = ItemClassification.progression, type = "Item", ), + "Halloween Town": KH1ItemData("Worlds", code = 264_1166, classification = ItemClassification.progression, type = "Item", ), + "Puppy": KH1ItemData("Key", code = 264_1167, classification = ItemClassification.progression, type = "Item", ), + "Hollow Bastion": KH1ItemData("Worlds", code = 264_1168, classification = ItemClassification.progression, type = "Item", ), + "End of the World": KH1ItemData("Worlds", code = 264_1169, classification = ItemClassification.progression, type = "Item", ), + "Blue Trinity": KH1ItemData("Trinities", code = 264_1170, classification = ItemClassification.progression, type = "Item", ), + "Red Trinity": KH1ItemData("Trinities", code = 264_1171, classification = ItemClassification.progression, type = "Item", ), + "Green Trinity": KH1ItemData("Trinities", code = 264_1172, classification = ItemClassification.progression, type = "Item", ), + "Yellow Trinity": KH1ItemData("Trinities", code = 264_1173, classification = ItemClassification.progression, type = "Item", ), + "White Trinity": KH1ItemData("Trinities", code = 264_1174, classification = ItemClassification.progression, type = "Item", ), + "Progressive Fire": KH1ItemData("Magic", code = 264_1175, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Blizzard": KH1ItemData("Magic", code = 264_1176, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Thunder": KH1ItemData("Magic", code = 264_1177, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Cure": KH1ItemData("Magic", code = 264_1178, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Gravity": KH1ItemData("Magic", code = 264_1179, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Stop": KH1ItemData("Magic", code = 264_1180, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Progressive Aero": KH1ItemData("Magic", code = 264_1181, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + "Phil Cup": KH1ItemData("Cups", code = 264_1182, classification = ItemClassification.progression, type = "Item", ), + "Theon Vol. 6": KH1ItemData("Key", code = 264_1183, classification = ItemClassification.progression, type = "Item", ), + "Pegasus Cup": KH1ItemData("Cups", code = 264_1184, classification = ItemClassification.progression, type = "Item", ), + "Hercules Cup": KH1ItemData("Cups", code = 264_1185, classification = ItemClassification.progression, type = "Item", ), + #"Empty Bottle": KH1ItemData("Key", code = 264_1186, classification = ItemClassification.progression, type = "Item", max_quantity = 6 ), + #"Old Book": KH1ItemData("Key", code = 264_1187, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Flame)": KH1ItemData("Key", code = 264_1188, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Chest)": KH1ItemData("Key", code = 264_1189, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Statue)": KH1ItemData("Key", code = 264_1190, classification = ItemClassification.progression, type = "Item", ), + "Emblem Piece (Fountain)": KH1ItemData("Key", code = 264_1191, classification = ItemClassification.progression, type = "Item", ), + #"Log": KH1ItemData("DI", code = 264_1192, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ), + #"Cloth": KH1ItemData("DI", code = 264_1193, classification = ItemClassification.progression, type = "Item", ), + #"Rope": KH1ItemData("DI", code = 264_1194, classification = ItemClassification.progression, type = "Item", ), + #"Seagull Egg": KH1ItemData("DI", code = 264_1195, classification = ItemClassification.progression, type = "Item", ), + #"Fish": KH1ItemData("DI", code = 264_1196, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + #"Mushroom": KH1ItemData("DI", code = 264_1197, classification = ItemClassification.progression, type = "Item", max_quantity = 3 ), + #"Coconut": KH1ItemData("DI", code = 264_1198, classification = ItemClassification.progression, type = "Item", max_quantity = 2 ), + #"Drinking Water": KH1ItemData("DI", code = 264_1199, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 1": KH1ItemData("Key", code = 264_1200, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 2": KH1ItemData("Key", code = 264_1201, classification = ItemClassification.progression, type = "Item", ), + #"Navi-Gummi Unused": KH1ItemData("Key", code = 264_1202, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 3": KH1ItemData("Key", code = 264_1203, classification = ItemClassification.progression, type = "Item", ), + #"Navi-G Piece 4": KH1ItemData("Key", code = 264_1204, classification = ItemClassification.progression, type = "Item", ), + #"Navi-Gummi": KH1ItemData("Key", code = 264_1205, classification = ItemClassification.progression, type = "Item", ), + #"Watergleam": KH1ItemData("Key", code = 264_1206, classification = ItemClassification.progression, type = "Item", ), + #"Naturespark": KH1ItemData("Key", code = 264_1207, classification = ItemClassification.progression, type = "Item", ), + #"Fireglow": KH1ItemData("Key", code = 264_1208, classification = ItemClassification.progression, type = "Item", ), + #"Earthshine": KH1ItemData("Key", code = 264_1209, classification = ItemClassification.progression, type = "Item", ), + "Crystal Trident": KH1ItemData("Key", code = 264_1210, classification = ItemClassification.progression, type = "Item", ), + "Postcard": KH1ItemData("Key", code = 264_1211, classification = ItemClassification.progression, type = "Item", max_quantity = 10), + #"Torn Page 1": KH1ItemData("Torn Pages", code = 264_1212, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 2": KH1ItemData("Torn Pages", code = 264_1213, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 3": KH1ItemData("Torn Pages", code = 264_1214, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 4": KH1ItemData("Torn Pages", code = 264_1215, classification = ItemClassification.progression, type = "Item", ), + #"Torn Page 5": KH1ItemData("Torn Pages", code = 264_1216, classification = ItemClassification.progression, type = "Item", ), + "Slides": KH1ItemData("Key", code = 264_1217, classification = ItemClassification.progression, type = "Item", ), + #"Slide 2": KH1ItemData("Key", code = 264_1218, classification = ItemClassification.progression, type = "Item", ), + #"Slide 3": KH1ItemData("Key", code = 264_1219, classification = ItemClassification.progression, type = "Item", ), + #"Slide 4": KH1ItemData("Key", code = 264_1220, classification = ItemClassification.progression, type = "Item", ), + #"Slide 5": KH1ItemData("Key", code = 264_1221, classification = ItemClassification.progression, type = "Item", ), + #"Slide 6": KH1ItemData("Key", code = 264_1222, classification = ItemClassification.progression, type = "Item", ), + "Footprints": KH1ItemData("Key", code = 264_1223, classification = ItemClassification.progression, type = "Item", ), + #"Claw Marks": KH1ItemData("Key", code = 264_1224, classification = ItemClassification.progression, type = "Item", ), + #"Stench": KH1ItemData("Key", code = 264_1225, classification = ItemClassification.progression, type = "Item", ), + #"Antenna": KH1ItemData("Key", code = 264_1226, classification = ItemClassification.progression, type = "Item", ), + "Forget-Me-Not": KH1ItemData("Key", code = 264_1227, classification = ItemClassification.progression, type = "Item", ), + "Jack-In-The-Box": KH1ItemData("Key", code = 264_1228, classification = ItemClassification.progression, type = "Item", ), + "Entry Pass": KH1ItemData("Key", code = 264_1229, classification = ItemClassification.progression, type = "Item", ), + #"AP Item": KH1ItemData("Key", code = 264_1230, classification = ItemClassification.progression, type = "Item", ), + "Dumbo": KH1ItemData("Summons", code = 264_1231, classification = ItemClassification.progression, type = "Item", ), + #"N41": KH1ItemData("Synthesis", code = 264_1232, classification = ItemClassification.filler, type = "Item", ), + "Bambi": KH1ItemData("Summons", code = 264_1233, classification = ItemClassification.progression, type = "Item", ), + "Genie": KH1ItemData("Summons", code = 264_1234, classification = ItemClassification.progression, type = "Item", ), + "Tinker Bell": KH1ItemData("Summons", code = 264_1235, classification = ItemClassification.progression, type = "Item", ), + "Mushu": KH1ItemData("Summons", code = 264_1236, classification = ItemClassification.progression, type = "Item", ), + "Simba": KH1ItemData("Summons", code = 264_1237, classification = ItemClassification.progression, type = "Item", ), + "Lucky Emblem": KH1ItemData("Key", code = 264_1238, classification = ItemClassification.progression, type = "Item", ), + "Max HP Increase": KH1ItemData("Level Up", code = 264_1239, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Max MP Increase": KH1ItemData("Level Up", code = 264_1240, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Max AP Increase": KH1ItemData("Level Up", code = 264_1241, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Strength Increase": KH1ItemData("Level Up", code = 264_1242, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Defense Increase": KH1ItemData("Level Up", code = 264_1243, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Item Slot Increase": KH1ItemData("Limited Level Up", code = 264_1244, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + "Accessory Slot Increase": KH1ItemData("Limited Level Up", code = 264_1245, classification = ItemClassification.useful, type = "Item", max_quantity = 15), + #"Thunder Gem": KH1ItemData("Synthesis", code = 264_1246, classification = ItemClassification.filler, type = "Item", ), + #"Shiny Crystal": KH1ItemData("Synthesis", code = 264_1247, classification = ItemClassification.filler, type = "Item", ), + #"Bright Shard": KH1ItemData("Synthesis", code = 264_1248, classification = ItemClassification.filler, type = "Item", ), + #"Bright Gem": KH1ItemData("Synthesis", code = 264_1249, classification = ItemClassification.filler, type = "Item", ), + #"Bright Crystal": KH1ItemData("Synthesis", code = 264_1250, classification = ItemClassification.filler, type = "Item", ), + #"Mystery Goo": KH1ItemData("Synthesis", code = 264_1251, classification = ItemClassification.filler, type = "Item", ), + #"Gale": KH1ItemData("Synthesis", code = 264_1252, classification = ItemClassification.filler, type = "Item", ), + #"Mythril Shard": KH1ItemData("Synthesis", code = 264_1253, classification = ItemClassification.filler, type = "Item", ), + "Mythril": KH1ItemData("Key", code = 264_1254, classification = ItemClassification.progression, type = "Item", max_quantity = 16), + "Orichalcum": KH1ItemData("Key", code = 264_1255, classification = ItemClassification.progression, type = "Item", max_quantity = 17), + "High Jump": KH1ItemData("Shared Abilities", code = 264_2001, classification = ItemClassification.progression, type = "Shared Ability", ), + "Mermaid Kick": KH1ItemData("Shared Abilities", code = 264_2002, classification = ItemClassification.progression, type = "Shared Ability", ), + "Progressive Glide": KH1ItemData("Shared Abilities", code = 264_2003, classification = ItemClassification.progression, type = "Shared Ability", max_quantity = 2 ), + #"Superglide": KH1ItemData("Shared Abilities", code = 264_2004, classification = ItemClassification.progression, type = "Ability", ), + "Treasure Magnet": KH1ItemData("Abilities", code = 264_3005, classification = ItemClassification.useful, type = "Ability", max_quantity = 2 ), + "Combo Plus": KH1ItemData("Abilities", code = 264_3006, classification = ItemClassification.useful, type = "Ability", max_quantity = 4 ), + "Air Combo Plus": KH1ItemData("Abilities", code = 264_3007, classification = ItemClassification.progression, type = "Ability", max_quantity = 2 ), + "Critical Plus": KH1ItemData("Abilities", code = 264_3008, classification = ItemClassification.useful, type = "Ability", max_quantity = 3 ), + #"Second Wind": KH1ItemData("Abilities", code = 264_3009, classification = ItemClassification.useful, type = "Ability", ), + "Scan": KH1ItemData("Abilities", code = 264_3010, classification = ItemClassification.useful, type = "Ability", ), + "Sonic Blade": KH1ItemData("Abilities", code = 264_3011, classification = ItemClassification.progression, type = "Ability", ), + "Ars Arcanum": KH1ItemData("Abilities", code = 264_3012, classification = ItemClassification.useful, type = "Ability", ), + "Strike Raid": KH1ItemData("Abilities", code = 264_3013, classification = ItemClassification.progression, type = "Ability", ), + "Ragnarok": KH1ItemData("Abilities", code = 264_3014, classification = ItemClassification.useful, type = "Ability", ), + "Trinity Limit": KH1ItemData("Abilities", code = 264_3015, classification = ItemClassification.useful, type = "Ability", ), + "Cheer": KH1ItemData("Abilities", code = 264_3016, classification = ItemClassification.useful, type = "Ability", ), + "Vortex": KH1ItemData("Abilities", code = 264_3017, classification = ItemClassification.useful, type = "Ability", ), + "Aerial Sweep": KH1ItemData("Abilities", code = 264_3018, classification = ItemClassification.useful, type = "Ability", ), + "Counterattack": KH1ItemData("Abilities", code = 264_3019, classification = ItemClassification.progression, type = "Ability", ), + "Blitz": KH1ItemData("Abilities", code = 264_3020, classification = ItemClassification.useful, type = "Ability", ), + "Guard": KH1ItemData("Abilities", code = 264_3021, classification = ItemClassification.progression, type = "Ability", ), + "Dodge Roll": KH1ItemData("Abilities", code = 264_3022, classification = ItemClassification.progression, type = "Ability", ), + "MP Haste": KH1ItemData("Abilities", code = 264_3023, classification = ItemClassification.useful, type = "Ability", ), + "MP Rage": KH1ItemData("Abilities", code = 264_3024, classification = ItemClassification.progression, type = "Ability", ), + "Second Chance": KH1ItemData("Abilities", code = 264_3025, classification = ItemClassification.progression, type = "Ability", ), + "Berserk": KH1ItemData("Abilities", code = 264_3026, classification = ItemClassification.useful, type = "Ability", ), + "Jackpot": KH1ItemData("Abilities", code = 264_3027, classification = ItemClassification.useful, type = "Ability", ), + "Lucky Strike": KH1ItemData("Abilities", code = 264_3028, classification = ItemClassification.useful, type = "Ability", ), + #"Charge": KH1ItemData("Abilities", code = 264_3029, classification = ItemClassification.useful, type = "Ability", ), + #"Rocket": KH1ItemData("Abilities", code = 264_3030, classification = ItemClassification.useful, type = "Ability", ), + #"Tornado": KH1ItemData("Abilities", code = 264_3031, classification = ItemClassification.useful, type = "Ability", ), + #"MP Gift": KH1ItemData("Abilities", code = 264_3032, classification = ItemClassification.useful, type = "Ability", ), + #"Raging Boar": KH1ItemData("Abilities", code = 264_3033, classification = ItemClassification.useful, type = "Ability", ), + #"Asp's Bite": KH1ItemData("Abilities", code = 264_3034, classification = ItemClassification.useful, type = "Ability", ), + #"Healing Herb": KH1ItemData("Abilities", code = 264_3035, classification = ItemClassification.useful, type = "Ability", ), + #"Wind Armor": KH1ItemData("Abilities", code = 264_3036, classification = ItemClassification.useful, type = "Ability", ), + #"Crescent": KH1ItemData("Abilities", code = 264_3037, classification = ItemClassification.useful, type = "Ability", ), + #"Sandstorm": KH1ItemData("Abilities", code = 264_3038, classification = ItemClassification.useful, type = "Ability", ), + #"Applause!": KH1ItemData("Abilities", code = 264_3039, classification = ItemClassification.useful, type = "Ability", ), + #"Blazing Fury": KH1ItemData("Abilities", code = 264_3040, classification = ItemClassification.useful, type = "Ability", ), + #"Icy Terror": KH1ItemData("Abilities", code = 264_3041, classification = ItemClassification.useful, type = "Ability", ), + #"Bolts of Sorrow": KH1ItemData("Abilities", code = 264_3042, classification = ItemClassification.useful, type = "Ability", ), + #"Ghostly Scream": KH1ItemData("Abilities", code = 264_3043, classification = ItemClassification.useful, type = "Ability", ), + #"Humming Bird": KH1ItemData("Abilities", code = 264_3044, classification = ItemClassification.useful, type = "Ability", ), + #"Time-Out": KH1ItemData("Abilities", code = 264_3045, classification = ItemClassification.useful, type = "Ability", ), + #"Storm's Eye": KH1ItemData("Abilities", code = 264_3046, classification = ItemClassification.useful, type = "Ability", ), + #"Ferocious Lunge": KH1ItemData("Abilities", code = 264_3047, classification = ItemClassification.useful, type = "Ability", ), + #"Furious Bellow": KH1ItemData("Abilities", code = 264_3048, classification = ItemClassification.useful, type = "Ability", ), + #"Spiral Wave": KH1ItemData("Abilities", code = 264_3049, classification = ItemClassification.useful, type = "Ability", ), + #"Thunder Potion": KH1ItemData("Abilities", code = 264_3050, classification = ItemClassification.useful, type = "Ability", ), + #"Cure Potion": KH1ItemData("Abilities", code = 264_3051, classification = ItemClassification.useful, type = "Ability", ), + #"Aero Potion": KH1ItemData("Abilities", code = 264_3052, classification = ItemClassification.useful, type = "Ability", ), + "Slapshot": KH1ItemData("Abilities", code = 264_3053, classification = ItemClassification.useful, type = "Ability", ), + "Sliding Dash": KH1ItemData("Abilities", code = 264_3054, classification = ItemClassification.useful, type = "Ability", ), + "Hurricane Blast": KH1ItemData("Abilities", code = 264_3055, classification = ItemClassification.useful, type = "Ability", ), + "Ripple Drive": KH1ItemData("Abilities", code = 264_3056, classification = ItemClassification.useful, type = "Ability", ), + "Stun Impact": KH1ItemData("Abilities", code = 264_3057, classification = ItemClassification.useful, type = "Ability", ), + "Gravity Break": KH1ItemData("Abilities", code = 264_3058, classification = ItemClassification.useful, type = "Ability", ), + "Zantetsuken": KH1ItemData("Abilities", code = 264_3059, classification = ItemClassification.useful, type = "Ability", ), + "Tech Boost": KH1ItemData("Abilities", code = 264_3060, classification = ItemClassification.useful, type = "Ability", max_quantity = 4 ), + "Encounter Plus": KH1ItemData("Abilities", code = 264_3061, classification = ItemClassification.useful, type = "Ability", ), + "Leaf Bracer": KH1ItemData("Abilities", code = 264_3062, classification = ItemClassification.progression, type = "Ability", ), + #"Evolution": KH1ItemData("Abilities", code = 264_3063, classification = ItemClassification.useful, type = "Ability", ), + "EXP Zero": KH1ItemData("Abilities", code = 264_3064, classification = ItemClassification.useful, type = "Ability", ), + "Combo Master": KH1ItemData("Abilities", code = 264_3065, classification = ItemClassification.progression, type = "Ability", ) } -event_item_table: Dict[str, KH1ItemData] = {} +event_item_table: Dict[str, KH1ItemData] = { + "Victory": KH1ItemData("Event", code = None, classification = ItemClassification.progression, type = "Event") +} #Make item categories item_name_groups: Dict[str, Set[str]] = {} diff --git a/worlds/kh1/Locations.py b/worlds/kh1/Locations.py index a82be70f09..582d69a8a2 100644 --- a/worlds/kh1/Locations.py +++ b/worlds/kh1/Locations.py @@ -11,572 +11,758 @@ class KH1Location(Location): class KH1LocationData(NamedTuple): category: str - code: int + code: Optional[int] = None + type: Optional[str] = None + behind_boss: Optional[bool] = False - -def get_locations_by_category(category: str) -> Dict[str, KH1LocationData]: - location_dict: Dict[str, KH1LocationData] = {} - for name, data in location_table.items(): - if data.category == category: - location_dict.setdefault(name, data) - - return location_dict +def get_locations_by_type(type: str) -> Dict[str, KH1LocationData]: + return {name: data for name, data in location_table.items() if data.type == type} location_table: Dict[str, KH1LocationData] = { - #"Destiny Islands Chest": KH1LocationData("Destiny Islands", 265_0011), missable - "Traverse Town 1st District Candle Puzzle Chest": KH1LocationData("Traverse Town", 265_0211), - "Traverse Town 1st District Accessory Shop Roof Chest": KH1LocationData("Traverse Town", 265_0212), - "Traverse Town 2nd District Boots and Shoes Awning Chest": KH1LocationData("Traverse Town", 265_0213), - "Traverse Town 2nd District Rooftop Chest": KH1LocationData("Traverse Town", 265_0214), - "Traverse Town 2nd District Gizmo Shop Facade Chest": KH1LocationData("Traverse Town", 265_0251), - "Traverse Town Alleyway Balcony Chest": KH1LocationData("Traverse Town", 265_0252), - "Traverse Town Alleyway Blue Room Awning Chest": KH1LocationData("Traverse Town", 265_0253), - "Traverse Town Alleyway Corner Chest": KH1LocationData("Traverse Town", 265_0254), - "Traverse Town Green Room Clock Puzzle Chest": KH1LocationData("Traverse Town", 265_0292), - "Traverse Town Green Room Table Chest": KH1LocationData("Traverse Town", 265_0293), - "Traverse Town Red Room Chest": KH1LocationData("Traverse Town", 265_0294), - "Traverse Town Mystical House Yellow Trinity Chest": KH1LocationData("Traverse Town", 265_0331), - "Traverse Town Accessory Shop Chest": KH1LocationData("Traverse Town", 265_0332), - "Traverse Town Secret Waterway White Trinity Chest": KH1LocationData("Traverse Town", 265_0333), - "Traverse Town Geppetto's House Chest": KH1LocationData("Traverse Town", 265_0334), - "Traverse Town Item Workshop Right Chest": KH1LocationData("Traverse Town", 265_0371), - "Traverse Town 1st District Blue Trinity Balcony Chest": KH1LocationData("Traverse Town", 265_0411), - "Traverse Town Mystical House Glide Chest": KH1LocationData("Traverse Town", 265_0891), - "Traverse Town Alleyway Behind Crates Chest": KH1LocationData("Traverse Town", 265_0892), - "Traverse Town Item Workshop Left Chest": KH1LocationData("Traverse Town", 265_0893), - "Traverse Town Secret Waterway Near Stairs Chest": KH1LocationData("Traverse Town", 265_0894), - "Wonderland Rabbit Hole Green Trinity Chest": KH1LocationData("Wonderland", 265_0931), - "Wonderland Rabbit Hole Defeat Heartless 1 Chest": KH1LocationData("Wonderland", 265_0932), - "Wonderland Rabbit Hole Defeat Heartless 2 Chest": KH1LocationData("Wonderland", 265_0933), - "Wonderland Rabbit Hole Defeat Heartless 3 Chest": KH1LocationData("Wonderland", 265_0934), - "Wonderland Bizarre Room Green Trinity Chest": KH1LocationData("Wonderland", 265_0971), - "Wonderland Queen's Castle Hedge Left Red Chest": KH1LocationData("Wonderland", 265_1011), - "Wonderland Queen's Castle Hedge Right Blue Chest": KH1LocationData("Wonderland", 265_1012), - "Wonderland Queen's Castle Hedge Right Red Chest": KH1LocationData("Wonderland", 265_1013), - "Wonderland Lotus Forest Thunder Plant Chest": KH1LocationData("Wonderland", 265_1014), - "Wonderland Lotus Forest Through the Painting Thunder Plant Chest": KH1LocationData("Wonderland", 265_1051), - "Wonderland Lotus Forest Glide Chest": KH1LocationData("Wonderland", 265_1052), - "Wonderland Lotus Forest Nut Chest": KH1LocationData("Wonderland", 265_1053), - "Wonderland Lotus Forest Corner Chest": KH1LocationData("Wonderland", 265_1054), - "Wonderland Bizarre Room Lamp Chest": KH1LocationData("Wonderland", 265_1091), - "Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest": KH1LocationData("Wonderland", 265_1093), - "Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest": KH1LocationData("Wonderland", 265_1094), - "Wonderland Tea Party Garden Bear and Clock Puzzle Chest": KH1LocationData("Wonderland", 265_1131), - "Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest": KH1LocationData("Wonderland", 265_1132), - "Wonderland Lotus Forest Through the Painting White Trinity Chest": KH1LocationData("Wonderland", 265_1133), - "Deep Jungle Tree House Beneath Tree House Chest": KH1LocationData("Deep Jungle", 265_1213), - "Deep Jungle Tree House Rooftop Chest": KH1LocationData("Deep Jungle", 265_1214), - "Deep Jungle Hippo's Lagoon Center Chest": KH1LocationData("Deep Jungle", 265_1251), - "Deep Jungle Hippo's Lagoon Left Chest": KH1LocationData("Deep Jungle", 265_1252), - "Deep Jungle Hippo's Lagoon Right Chest": KH1LocationData("Deep Jungle", 265_1253), - "Deep Jungle Vines Chest": KH1LocationData("Deep Jungle", 265_1291), - "Deep Jungle Vines 2 Chest": KH1LocationData("Deep Jungle", 265_1292), - "Deep Jungle Climbing Trees Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1293), - "Deep Jungle Tunnel Chest": KH1LocationData("Deep Jungle", 265_1331), - "Deep Jungle Cavern of Hearts White Trinity Chest": KH1LocationData("Deep Jungle", 265_1332), - "Deep Jungle Camp Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1333), - "Deep Jungle Tent Chest": KH1LocationData("Deep Jungle", 265_1334), - "Deep Jungle Waterfall Cavern Low Chest": KH1LocationData("Deep Jungle", 265_1371), - "Deep Jungle Waterfall Cavern Middle Chest": KH1LocationData("Deep Jungle", 265_1372), - "Deep Jungle Waterfall Cavern High Wall Chest": KH1LocationData("Deep Jungle", 265_1373), - "Deep Jungle Waterfall Cavern High Middle Chest": KH1LocationData("Deep Jungle", 265_1374), - "Deep Jungle Cliff Right Cliff Left Chest": KH1LocationData("Deep Jungle", 265_1411), - "Deep Jungle Cliff Right Cliff Right Chest": KH1LocationData("Deep Jungle", 265_1412), - "Deep Jungle Tree House Suspended Boat Chest": KH1LocationData("Deep Jungle", 265_1413), - "100 Acre Wood Meadow Inside Log Chest": KH1LocationData("100 Acre Wood", 265_1654), - "100 Acre Wood Bouncing Spot Left Cliff Chest": KH1LocationData("100 Acre Wood", 265_1691), - "100 Acre Wood Bouncing Spot Right Tree Alcove Chest": KH1LocationData("100 Acre Wood", 265_1692), - "100 Acre Wood Bouncing Spot Under Giant Pot Chest": KH1LocationData("100 Acre Wood", 265_1693), - "Agrabah Plaza By Storage Chest": KH1LocationData("Agrabah", 265_1972), - "Agrabah Plaza Raised Terrace Chest": KH1LocationData("Agrabah", 265_1973), - "Agrabah Plaza Top Corner Chest": KH1LocationData("Agrabah", 265_1974), - "Agrabah Alley Chest": KH1LocationData("Agrabah", 265_2011), - "Agrabah Bazaar Across Windows Chest": KH1LocationData("Agrabah", 265_2012), - "Agrabah Bazaar High Corner Chest": KH1LocationData("Agrabah", 265_2013), - "Agrabah Main Street Right Palace Entrance Chest": KH1LocationData("Agrabah", 265_2014), - "Agrabah Main Street High Above Alley Entrance Chest": KH1LocationData("Agrabah", 265_2051), - "Agrabah Main Street High Above Palace Gates Entrance Chest": KH1LocationData("Agrabah", 265_2052), - "Agrabah Palace Gates Low Chest": KH1LocationData("Agrabah", 265_2053), - "Agrabah Palace Gates High Opposite Palace Chest": KH1LocationData("Agrabah", 265_2054), - "Agrabah Palace Gates High Close to Palace Chest": KH1LocationData("Agrabah", 265_2091), - "Agrabah Storage Green Trinity Chest": KH1LocationData("Agrabah", 265_2092), - "Agrabah Storage Behind Barrel Chest": KH1LocationData("Agrabah", 265_2093), - "Agrabah Cave of Wonders Entrance Left Chest": KH1LocationData("Agrabah", 265_2094), - "Agrabah Cave of Wonders Entrance Tall Tower Chest": KH1LocationData("Agrabah", 265_2131), - "Agrabah Cave of Wonders Hall High Left Chest": KH1LocationData("Agrabah", 265_2132), - "Agrabah Cave of Wonders Hall Near Bottomless Hall Chest": KH1LocationData("Agrabah", 265_2133), - "Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest": KH1LocationData("Agrabah", 265_2134), - "Agrabah Cave of Wonders Bottomless Hall Pillar Chest": KH1LocationData("Agrabah", 265_2171), - "Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest": KH1LocationData("Agrabah", 265_2172), - "Agrabah Cave of Wonders Treasure Room Across Platforms Chest": KH1LocationData("Agrabah", 265_2173), - "Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest": KH1LocationData("Agrabah", 265_2174), - "Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest": KH1LocationData("Agrabah", 265_2211), - "Agrabah Cave of Wonders Treasure Room Above Fire Chest": KH1LocationData("Agrabah", 265_2212), - "Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest": KH1LocationData("Agrabah", 265_2213), - "Agrabah Cave of Wonders Relic Chamber Stairs Chest": KH1LocationData("Agrabah", 265_2214), - "Agrabah Cave of Wonders Dark Chamber Abu Gem Chest": KH1LocationData("Agrabah", 265_2251), - "Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest": KH1LocationData("Agrabah", 265_2252), - "Agrabah Cave of Wonders Dark Chamber Bridge Chest": KH1LocationData("Agrabah", 265_2253), - "Agrabah Cave of Wonders Dark Chamber Near Save Chest": KH1LocationData("Agrabah", 265_2254), - "Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest": KH1LocationData("Agrabah", 265_2291), - "Agrabah Cave of Wonders Hidden Room Right Chest": KH1LocationData("Agrabah", 265_2292), - "Agrabah Cave of Wonders Hidden Room Left Chest": KH1LocationData("Agrabah", 265_2293), - "Agrabah Aladdin's House Main Street Entrance Chest": KH1LocationData("Agrabah", 265_2294), - "Agrabah Aladdin's House Plaza Entrance Chest": KH1LocationData("Agrabah", 265_2331), - "Agrabah Cave of Wonders Entrance White Trinity Chest": KH1LocationData("Agrabah", 265_2332), - "Monstro Chamber 6 Other Platform Chest": KH1LocationData("Monstro", 265_2413), - "Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest": KH1LocationData("Monstro", 265_2414), - "Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest": KH1LocationData("Monstro", 265_2451), - "Monstro Chamber 6 Low Chest": KH1LocationData("Monstro", 265_2452), - "Atlantica Sunken Ship In Flipped Boat Chest": KH1LocationData("Atlantica", 265_2531), - "Atlantica Sunken Ship Seabed Chest": KH1LocationData("Atlantica", 265_2532), - "Atlantica Sunken Ship Inside Ship Chest": KH1LocationData("Atlantica", 265_2533), - "Atlantica Ariel's Grotto High Chest": KH1LocationData("Atlantica", 265_2534), - "Atlantica Ariel's Grotto Middle Chest": KH1LocationData("Atlantica", 265_2571), - "Atlantica Ariel's Grotto Low Chest": KH1LocationData("Atlantica", 265_2572), - "Atlantica Ursula's Lair Use Fire on Urchin Chest": KH1LocationData("Atlantica", 265_2573), - "Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest": KH1LocationData("Atlantica", 265_2574), - "Atlantica Triton's Palace White Trinity Chest": KH1LocationData("Atlantica", 265_2611), - "Halloween Town Moonlight Hill White Trinity Chest": KH1LocationData("Halloween Town", 265_3014), - "Halloween Town Bridge Under Bridge": KH1LocationData("Halloween Town", 265_3051), - "Halloween Town Boneyard Tombstone Puzzle Chest": KH1LocationData("Halloween Town", 265_3052), - "Halloween Town Bridge Right of Gate Chest": KH1LocationData("Halloween Town", 265_3053), - "Halloween Town Cemetery Behind Grave Chest": KH1LocationData("Halloween Town", 265_3054), - "Halloween Town Cemetery By Cat Shape Chest": KH1LocationData("Halloween Town", 265_3091), - "Halloween Town Cemetery Between Graves Chest": KH1LocationData("Halloween Town", 265_3092), - "Halloween Town Oogie's Manor Lower Iron Cage Chest": KH1LocationData("Halloween Town", 265_3093), - "Halloween Town Oogie's Manor Upper Iron Cage Chest": KH1LocationData("Halloween Town", 265_3094), - "Halloween Town Oogie's Manor Hollow Chest": KH1LocationData("Halloween Town", 265_3131), - "Halloween Town Oogie's Manor Grounds Red Trinity Chest": KH1LocationData("Halloween Town", 265_3132), - "Halloween Town Guillotine Square High Tower Chest": KH1LocationData("Halloween Town", 265_3133), - "Halloween Town Guillotine Square Pumpkin Structure Left Chest": KH1LocationData("Halloween Town", 265_3134), - "Halloween Town Oogie's Manor Entrance Steps Chest": KH1LocationData("Halloween Town", 265_3171), - "Halloween Town Oogie's Manor Inside Entrance Chest": KH1LocationData("Halloween Town", 265_3172), - "Halloween Town Bridge Left of Gate Chest": KH1LocationData("Halloween Town", 265_3291), - "Halloween Town Cemetery By Striped Grave Chest": KH1LocationData("Halloween Town", 265_3292), - "Halloween Town Guillotine Square Under Jack's House Stairs Chest": KH1LocationData("Halloween Town", 265_3293), - "Halloween Town Guillotine Square Pumpkin Structure Right Chest": KH1LocationData("Halloween Town", 265_3294), - "Olympus Coliseum Coliseum Gates Left Behind Columns Chest": KH1LocationData("Olympus Coliseum", 265_3332), - "Olympus Coliseum Coliseum Gates Right Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3333), - "Olympus Coliseum Coliseum Gates Left Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3334), - "Olympus Coliseum Coliseum Gates White Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3371), - "Olympus Coliseum Coliseum Gates Blizzara Chest": KH1LocationData("Olympus Coliseum", 265_3372), - "Olympus Coliseum Coliseum Gates Blizzaga Chest": KH1LocationData("Olympus Coliseum", 265_3373), - "Monstro Mouth Boat Deck Chest": KH1LocationData("Monstro", 265_3454), - "Monstro Mouth High Platform Boat Side Chest": KH1LocationData("Monstro", 265_3491), - "Monstro Mouth High Platform Across from Boat Chest": KH1LocationData("Monstro", 265_3492), - "Monstro Mouth Near Ship Chest": KH1LocationData("Monstro", 265_3493), - "Monstro Mouth Green Trinity Top of Boat Chest": KH1LocationData("Monstro", 265_3494), - "Monstro Chamber 2 Ground Chest": KH1LocationData("Monstro", 265_3534), - "Monstro Chamber 2 Platform Chest": KH1LocationData("Monstro", 265_3571), - "Monstro Chamber 5 Platform Chest": KH1LocationData("Monstro", 265_3613), - "Monstro Chamber 3 Ground Chest": KH1LocationData("Monstro", 265_3614), - "Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest": KH1LocationData("Monstro", 265_3651), - "Monstro Chamber 3 Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3652), - "Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3653), - "Monstro Mouth High Platform Near Teeth Chest": KH1LocationData("Monstro", 265_3732), - "Monstro Chamber 5 Atop Barrel Chest": KH1LocationData("Monstro", 265_3733), - "Monstro Chamber 5 Low 2nd Chest": KH1LocationData("Monstro", 265_3734), - "Monstro Chamber 5 Low 1st Chest": KH1LocationData("Monstro", 265_3771), - "Neverland Pirate Ship Deck White Trinity Chest": KH1LocationData("Neverland", 265_3772), - "Neverland Pirate Ship Crows Nest Chest": KH1LocationData("Neverland", 265_3773), - "Neverland Hold Yellow Trinity Right Blue Chest": KH1LocationData("Neverland", 265_3774), - "Neverland Hold Yellow Trinity Left Blue Chest": KH1LocationData("Neverland", 265_3811), - "Neverland Galley Chest": KH1LocationData("Neverland", 265_3812), - "Neverland Cabin Chest": KH1LocationData("Neverland", 265_3813), - "Neverland Hold Flight 1st Chest": KH1LocationData("Neverland", 265_3814), - "Neverland Clock Tower Chest": KH1LocationData("Neverland", 265_4014), - "Neverland Hold Flight 2nd Chest": KH1LocationData("Neverland", 265_4051), - "Neverland Hold Yellow Trinity Green Chest": KH1LocationData("Neverland", 265_4052), - "Neverland Captain's Cabin Chest": KH1LocationData("Neverland", 265_4053), - "Hollow Bastion Rising Falls Water's Surface Chest": KH1LocationData("Hollow Bastion", 265_4054), - "Hollow Bastion Rising Falls Under Water 1st Chest": KH1LocationData("Hollow Bastion", 265_4091), - "Hollow Bastion Rising Falls Under Water 2nd Chest": KH1LocationData("Hollow Bastion", 265_4092), - "Hollow Bastion Rising Falls Floating Platform Near Save Chest": KH1LocationData("Hollow Bastion", 265_4093), - "Hollow Bastion Rising Falls Floating Platform Near Bubble Chest": KH1LocationData("Hollow Bastion", 265_4094), - "Hollow Bastion Rising Falls High Platform Chest": KH1LocationData("Hollow Bastion", 265_4131), - "Hollow Bastion Castle Gates Gravity Chest": KH1LocationData("Hollow Bastion", 265_4132), - "Hollow Bastion Castle Gates Freestanding Pillar Chest": KH1LocationData("Hollow Bastion", 265_4133), - "Hollow Bastion Castle Gates High Pillar Chest": KH1LocationData("Hollow Bastion", 265_4134), - "Hollow Bastion Great Crest Lower Chest": KH1LocationData("Hollow Bastion", 265_4171), - "Hollow Bastion Great Crest After Battle Platform Chest": KH1LocationData("Hollow Bastion", 265_4172), - "Hollow Bastion High Tower 2nd Gravity Chest": KH1LocationData("Hollow Bastion", 265_4173), - "Hollow Bastion High Tower 1st Gravity Chest": KH1LocationData("Hollow Bastion", 265_4174), - "Hollow Bastion High Tower Above Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4211), - "Hollow Bastion Library Top of Bookshelf Chest": KH1LocationData("Hollow Bastion", 265_4213), - "Hollow Bastion Library 1st Floor Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4214), - "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4251), - "Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest": KH1LocationData("Hollow Bastion", 265_4252), - "Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest": KH1LocationData("Hollow Bastion", 265_4253), - "Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest": KH1LocationData("Hollow Bastion", 265_4254), - "Hollow Bastion Lift Stop Library Node Gravity Chest": KH1LocationData("Hollow Bastion", 265_4291), - "Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4292), - "Hollow Bastion Lift Stop Outside Library Gravity Chest": KH1LocationData("Hollow Bastion", 265_4293), - "Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest": KH1LocationData("Hollow Bastion", 265_4294), - "Hollow Bastion Base Level Bubble Under the Wall Platform Chest": KH1LocationData("Hollow Bastion", 265_4331), - "Hollow Bastion Base Level Platform Near Entrance Chest": KH1LocationData("Hollow Bastion", 265_4332), - "Hollow Bastion Base Level Near Crystal Switch Chest": KH1LocationData("Hollow Bastion", 265_4333), - "Hollow Bastion Waterway Near Save Chest": KH1LocationData("Hollow Bastion", 265_4334), - "Hollow Bastion Waterway Blizzard on Bubble Chest": KH1LocationData("Hollow Bastion", 265_4371), - "Hollow Bastion Waterway Unlock Passage from Base Level Chest": KH1LocationData("Hollow Bastion", 265_4372), - "Hollow Bastion Dungeon By Candles Chest": KH1LocationData("Hollow Bastion", 265_4373), - "Hollow Bastion Dungeon Corner Chest": KH1LocationData("Hollow Bastion", 265_4374), - "Hollow Bastion Grand Hall Steps Right Side Chest": KH1LocationData("Hollow Bastion", 265_4454), - "Hollow Bastion Grand Hall Oblivion Chest": KH1LocationData("Hollow Bastion", 265_4491), - "Hollow Bastion Grand Hall Left of Gate Chest": KH1LocationData("Hollow Bastion", 265_4492), - #"Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Hollow Bastion", 265_4493), --handled later - "Hollow Bastion Entrance Hall Left of Emblem Door Chest": KH1LocationData("Hollow Bastion", 265_4212), - "Hollow Bastion Rising Falls White Trinity Chest": KH1LocationData("Hollow Bastion", 265_4494), - "End of the World Final Dimension 1st Chest": KH1LocationData("End of the World", 265_4531), - "End of the World Final Dimension 2nd Chest": KH1LocationData("End of the World", 265_4532), - "End of the World Final Dimension 3rd Chest": KH1LocationData("End of the World", 265_4533), - "End of the World Final Dimension 4th Chest": KH1LocationData("End of the World", 265_4534), - "End of the World Final Dimension 5th Chest": KH1LocationData("End of the World", 265_4571), - "End of the World Final Dimension 6th Chest": KH1LocationData("End of the World", 265_4572), - "End of the World Final Dimension 10th Chest": KH1LocationData("End of the World", 265_4573), - "End of the World Final Dimension 9th Chest": KH1LocationData("End of the World", 265_4574), - "End of the World Final Dimension 8th Chest": KH1LocationData("End of the World", 265_4611), - "End of the World Final Dimension 7th Chest": KH1LocationData("End of the World", 265_4612), - "End of the World Giant Crevasse 3rd Chest": KH1LocationData("End of the World", 265_4613), - "End of the World Giant Crevasse 5th Chest": KH1LocationData("End of the World", 265_4614), - "End of the World Giant Crevasse 1st Chest": KH1LocationData("End of the World", 265_4651), - "End of the World Giant Crevasse 4th Chest": KH1LocationData("End of the World", 265_4652), - "End of the World Giant Crevasse 2nd Chest": KH1LocationData("End of the World", 265_4653), - "End of the World World Terminus Traverse Town Chest": KH1LocationData("End of the World", 265_4654), - "End of the World World Terminus Wonderland Chest": KH1LocationData("End of the World", 265_4691), - "End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("End of the World", 265_4692), - "End of the World World Terminus Deep Jungle Chest": KH1LocationData("End of the World", 265_4693), - "End of the World World Terminus Agrabah Chest": KH1LocationData("End of the World", 265_4694), - "End of the World World Terminus Atlantica Chest": KH1LocationData("End of the World", 265_4731), - "End of the World World Terminus Halloween Town Chest": KH1LocationData("End of the World", 265_4732), - "End of the World World Terminus Neverland Chest": KH1LocationData("End of the World", 265_4733), - "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("End of the World", 265_4734), - #"End of the World World Terminus Hollow Bastion Chest": KH1LocationData("End of the World", 265_4771), - "End of the World Final Rest Chest": KH1LocationData("End of the World", 265_4772), - "Monstro Chamber 6 White Trinity Chest": KH1LocationData("End of the World", 265_5092), - #"Awakening Chest": KH1LocationData("Awakening", 265_5093), missable + "Destiny Islands Chest": KH1LocationData("Destiny Islands", 265_0011, "Chest"), + "Traverse Town 1st District Candle Puzzle Chest": KH1LocationData("Traverse Town", 265_0211, "Chest"), + "Traverse Town 1st District Accessory Shop Roof Chest": KH1LocationData("Traverse Town", 265_0212, "Chest"), + "Traverse Town 2nd District Boots and Shoes Awning Chest": KH1LocationData("Traverse Town", 265_0213, "Chest"), + "Traverse Town 2nd District Rooftop Chest": KH1LocationData("Traverse Town", 265_0214, "Chest"), + "Traverse Town 2nd District Gizmo Shop Facade Chest": KH1LocationData("Traverse Town", 265_0251, "Chest"), + "Traverse Town Alleyway Balcony Chest": KH1LocationData("Traverse Town", 265_0252, "Chest"), + "Traverse Town Alleyway Blue Room Awning Chest": KH1LocationData("Traverse Town", 265_0253, "Chest"), + "Traverse Town Alleyway Corner Chest": KH1LocationData("Traverse Town", 265_0254, "Chest"), + "Traverse Town Green Room Clock Puzzle Chest": KH1LocationData("Traverse Town", 265_0292, "Chest"), + "Traverse Town Green Room Table Chest": KH1LocationData("Traverse Town", 265_0293, "Chest"), + "Traverse Town Red Room Chest": KH1LocationData("Traverse Town", 265_0294, "Chest"), + "Traverse Town Mystical House Yellow Trinity Chest": KH1LocationData("Traverse Town", 265_0331, "Chest"), + "Traverse Town Accessory Shop Chest": KH1LocationData("Traverse Town", 265_0332, "Chest"), + "Traverse Town Secret Waterway White Trinity Chest": KH1LocationData("Traverse Town", 265_0333, "Chest"), + "Traverse Town Geppetto's House Chest": KH1LocationData("Traverse Town", 265_0334, "Chest", True), + "Traverse Town Item Workshop Right Chest": KH1LocationData("Traverse Town", 265_0371, "Chest"), + "Traverse Town 1st District Blue Trinity Balcony Chest": KH1LocationData("Traverse Town", 265_0411, "Chest"), + "Traverse Town Mystical House Glide Chest": KH1LocationData("Traverse Town", 265_0891, "Chest"), + "Traverse Town Alleyway Behind Crates Chest": KH1LocationData("Traverse Town", 265_0892, "Chest"), + "Traverse Town Item Workshop Left Chest": KH1LocationData("Traverse Town", 265_0893, "Chest"), + "Traverse Town Secret Waterway Near Stairs Chest": KH1LocationData("Traverse Town", 265_0894, "Chest"), + "Wonderland Rabbit Hole Green Trinity Chest": KH1LocationData("Wonderland", 265_0931, "Chest"), + "Wonderland Rabbit Hole Defeat Heartless 1 Chest": KH1LocationData("Wonderland", 265_0932, "Chest"), + "Wonderland Rabbit Hole Defeat Heartless 2 Chest": KH1LocationData("Wonderland", 265_0933, "Chest"), + "Wonderland Rabbit Hole Defeat Heartless 3 Chest": KH1LocationData("Wonderland", 265_0934, "Chest"), + "Wonderland Bizarre Room Green Trinity Chest": KH1LocationData("Wonderland", 265_0971, "Chest"), + "Wonderland Queen's Castle Hedge Left Red Chest": KH1LocationData("Wonderland", 265_1011, "Chest"), + "Wonderland Queen's Castle Hedge Right Blue Chest": KH1LocationData("Wonderland", 265_1012, "Chest"), + "Wonderland Queen's Castle Hedge Right Red Chest": KH1LocationData("Wonderland", 265_1013, "Chest"), + "Wonderland Lotus Forest Thunder Plant Chest": KH1LocationData("Wonderland", 265_1014, "Chest"), + "Wonderland Lotus Forest Through the Painting Thunder Plant Chest": KH1LocationData("Wonderland", 265_1051, "Chest"), + "Wonderland Lotus Forest Glide Chest": KH1LocationData("Wonderland", 265_1052, "Chest"), + "Wonderland Lotus Forest Nut Chest": KH1LocationData("Wonderland", 265_1053, "Chest"), + "Wonderland Lotus Forest Corner Chest": KH1LocationData("Wonderland", 265_1054, "Chest"), + "Wonderland Bizarre Room Lamp Chest": KH1LocationData("Wonderland", 265_1091, "Chest"), + "Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest": KH1LocationData("Wonderland", 265_1093, "Chest"), + "Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest": KH1LocationData("Wonderland", 265_1094, "Chest"), + "Wonderland Tea Party Garden Bear and Clock Puzzle Chest": KH1LocationData("Wonderland", 265_1131, "Chest"), + "Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest": KH1LocationData("Wonderland", 265_1132, "Chest"), + "Wonderland Lotus Forest Through the Painting White Trinity Chest": KH1LocationData("Wonderland", 265_1133, "Chest"), + "Deep Jungle Tree House Beneath Tree House Chest": KH1LocationData("Deep Jungle", 265_1213, "Chest"), + "Deep Jungle Tree House Rooftop Chest": KH1LocationData("Deep Jungle", 265_1214, "Chest"), + "Deep Jungle Hippo's Lagoon Center Chest": KH1LocationData("Deep Jungle", 265_1251, "Chest"), + "Deep Jungle Hippo's Lagoon Left Chest": KH1LocationData("Deep Jungle", 265_1252, "Chest"), + "Deep Jungle Hippo's Lagoon Right Chest": KH1LocationData("Deep Jungle", 265_1253, "Chest"), + "Deep Jungle Vines Chest": KH1LocationData("Deep Jungle", 265_1291, "Chest"), + "Deep Jungle Vines 2 Chest": KH1LocationData("Deep Jungle", 265_1292, "Chest"), + "Deep Jungle Climbing Trees Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1293, "Chest"), + "Deep Jungle Tunnel Chest": KH1LocationData("Deep Jungle", 265_1331, "Chest"), + "Deep Jungle Cavern of Hearts White Trinity Chest": KH1LocationData("Deep Jungle", 265_1332, "Chest", True), + "Deep Jungle Camp Blue Trinity Chest": KH1LocationData("Deep Jungle", 265_1333, "Chest"), + "Deep Jungle Tent Chest": KH1LocationData("Deep Jungle", 265_1334, "Chest"), + "Deep Jungle Waterfall Cavern Low Chest": KH1LocationData("Deep Jungle", 265_1371, "Chest", True), + "Deep Jungle Waterfall Cavern Middle Chest": KH1LocationData("Deep Jungle", 265_1372, "Chest", True), + "Deep Jungle Waterfall Cavern High Wall Chest": KH1LocationData("Deep Jungle", 265_1373, "Chest", True), + "Deep Jungle Waterfall Cavern High Middle Chest": KH1LocationData("Deep Jungle", 265_1374, "Chest", True), + "Deep Jungle Cliff Right Cliff Left Chest": KH1LocationData("Deep Jungle", 265_1411, "Chest"), + "Deep Jungle Cliff Right Cliff Right Chest": KH1LocationData("Deep Jungle", 265_1412, "Chest"), + "Deep Jungle Tree House Suspended Boat Chest": KH1LocationData("Deep Jungle", 265_1413, "Chest"), + "100 Acre Wood Meadow Inside Log Chest": KH1LocationData("100 Acre Wood", 265_1654, "Chest"), + "100 Acre Wood Bouncing Spot Left Cliff Chest": KH1LocationData("100 Acre Wood", 265_1691, "Chest"), + "100 Acre Wood Bouncing Spot Right Tree Alcove Chest": KH1LocationData("100 Acre Wood", 265_1692, "Chest"), + "100 Acre Wood Bouncing Spot Under Giant Pot Chest": KH1LocationData("100 Acre Wood", 265_1693, "Chest"), + "Agrabah Plaza By Storage Chest": KH1LocationData("Agrabah", 265_1972, "Chest"), + "Agrabah Plaza Raised Terrace Chest": KH1LocationData("Agrabah", 265_1973, "Chest"), + "Agrabah Plaza Top Corner Chest": KH1LocationData("Agrabah", 265_1974, "Chest"), + "Agrabah Alley Chest": KH1LocationData("Agrabah", 265_2011, "Chest"), + "Agrabah Bazaar Across Windows Chest": KH1LocationData("Agrabah", 265_2012, "Chest"), + "Agrabah Bazaar High Corner Chest": KH1LocationData("Agrabah", 265_2013, "Chest"), + "Agrabah Main Street Right Palace Entrance Chest": KH1LocationData("Agrabah", 265_2014, "Chest"), + "Agrabah Main Street High Above Alley Entrance Chest": KH1LocationData("Agrabah", 265_2051, "Chest"), + "Agrabah Main Street High Above Palace Gates Entrance Chest": KH1LocationData("Agrabah", 265_2052, "Chest"), + "Agrabah Palace Gates Low Chest": KH1LocationData("Agrabah", 265_2053, "Chest", True), + "Agrabah Palace Gates High Opposite Palace Chest": KH1LocationData("Agrabah", 265_2054, "Chest", True), + "Agrabah Palace Gates High Close to Palace Chest": KH1LocationData("Agrabah", 265_2091, "Chest", True), + "Agrabah Storage Green Trinity Chest": KH1LocationData("Agrabah", 265_2092, "Chest"), + "Agrabah Storage Behind Barrel Chest": KH1LocationData("Agrabah", 265_2093, "Chest"), + "Agrabah Cave of Wonders Entrance Left Chest": KH1LocationData("Agrabah", 265_2094, "Chest", True), + "Agrabah Cave of Wonders Entrance Tall Tower Chest": KH1LocationData("Agrabah", 265_2131, "Chest", True), + "Agrabah Cave of Wonders Hall High Left Chest": KH1LocationData("Agrabah", 265_2132, "Chest", True), + "Agrabah Cave of Wonders Hall Near Bottomless Hall Chest": KH1LocationData("Agrabah", 265_2133, "Chest", True), + "Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest": KH1LocationData("Agrabah", 265_2134, "Chest", True), + "Agrabah Cave of Wonders Bottomless Hall Pillar Chest": KH1LocationData("Agrabah", 265_2171, "Chest", True), + "Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest": KH1LocationData("Agrabah", 265_2172, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Across Platforms Chest": KH1LocationData("Agrabah", 265_2173, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest": KH1LocationData("Agrabah", 265_2174, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest": KH1LocationData("Agrabah", 265_2211, "Chest", True), + "Agrabah Cave of Wonders Treasure Room Above Fire Chest": KH1LocationData("Agrabah", 265_2212, "Chest", True), + "Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest": KH1LocationData("Agrabah", 265_2213, "Chest", True), + "Agrabah Cave of Wonders Relic Chamber Stairs Chest": KH1LocationData("Agrabah", 265_2214, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Abu Gem Chest": KH1LocationData("Agrabah", 265_2251, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest": KH1LocationData("Agrabah", 265_2252, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Bridge Chest": KH1LocationData("Agrabah", 265_2253, "Chest", True), + "Agrabah Cave of Wonders Dark Chamber Near Save Chest": KH1LocationData("Agrabah", 265_2254, "Chest", True), + "Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest": KH1LocationData("Agrabah", 265_2291, "Chest", True), + "Agrabah Cave of Wonders Hidden Room Right Chest": KH1LocationData("Agrabah", 265_2292, "Chest", True), + "Agrabah Cave of Wonders Hidden Room Left Chest": KH1LocationData("Agrabah", 265_2293, "Chest", True), + "Agrabah Aladdin's House Main Street Entrance Chest": KH1LocationData("Agrabah", 265_2294, "Chest"), + "Agrabah Aladdin's House Plaza Entrance Chest": KH1LocationData("Agrabah", 265_2331, "Chest"), + "Agrabah Cave of Wonders Entrance White Trinity Chest": KH1LocationData("Agrabah", 265_2332, "Chest", True), + "Monstro Chamber 6 Other Platform Chest": KH1LocationData("Monstro", 265_2413, "Chest"), + "Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest": KH1LocationData("Monstro", 265_2414, "Chest"), + "Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest": KH1LocationData("Monstro", 265_2451, "Chest"), + "Monstro Chamber 6 Low Chest": KH1LocationData("Monstro", 265_2452, "Chest"), + "Atlantica Sunken Ship In Flipped Boat Chest": KH1LocationData("Atlantica", 265_2531, "Static"), + "Atlantica Sunken Ship Seabed Chest": KH1LocationData("Atlantica", 265_2532, "Static"), + "Atlantica Sunken Ship Inside Ship Chest": KH1LocationData("Atlantica", 265_2533, "Static"), + "Atlantica Ariel's Grotto High Chest": KH1LocationData("Atlantica", 265_2534, "Static"), + "Atlantica Ariel's Grotto Middle Chest": KH1LocationData("Atlantica", 265_2571, "Static"), + "Atlantica Ariel's Grotto Low Chest": KH1LocationData("Atlantica", 265_2572, "Static"), + "Atlantica Ursula's Lair Use Fire on Urchin Chest": KH1LocationData("Atlantica", 265_2573, "Static", True), + "Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest": KH1LocationData("Atlantica", 265_2574, "Static"), + "Atlantica Triton's Palace White Trinity Chest": KH1LocationData("Atlantica", 265_2611, "Static"), + "Halloween Town Moonlight Hill White Trinity Chest": KH1LocationData("Halloween Town", 265_3014, "Chest"), + "Halloween Town Bridge Under Bridge": KH1LocationData("Halloween Town", 265_3051, "Chest"), + "Halloween Town Boneyard Tombstone Puzzle Chest": KH1LocationData("Halloween Town", 265_3052, "Chest"), + "Halloween Town Bridge Right of Gate Chest": KH1LocationData("Halloween Town", 265_3053, "Chest"), + "Halloween Town Cemetery Behind Grave Chest": KH1LocationData("Halloween Town", 265_3054, "Chest", True), + "Halloween Town Cemetery By Cat Shape Chest": KH1LocationData("Halloween Town", 265_3091, "Chest", True), + "Halloween Town Cemetery Between Graves Chest": KH1LocationData("Halloween Town", 265_3092, "Chest", True), + "Halloween Town Oogie's Manor Lower Iron Cage Chest": KH1LocationData("Halloween Town", 265_3093, "Chest"), + "Halloween Town Oogie's Manor Upper Iron Cage Chest": KH1LocationData("Halloween Town", 265_3094, "Chest"), + "Halloween Town Oogie's Manor Hollow Chest": KH1LocationData("Halloween Town", 265_3131, "Chest", True), + "Halloween Town Oogie's Manor Grounds Red Trinity Chest": KH1LocationData("Halloween Town", 265_3132, "Chest"), + "Halloween Town Guillotine Square High Tower Chest": KH1LocationData("Halloween Town", 265_3133, "Chest"), + "Halloween Town Guillotine Square Pumpkin Structure Left Chest": KH1LocationData("Halloween Town", 265_3134, "Chest"), + "Halloween Town Oogie's Manor Entrance Steps Chest": KH1LocationData("Halloween Town", 265_3171, "Chest"), + "Halloween Town Oogie's Manor Inside Entrance Chest": KH1LocationData("Halloween Town", 265_3172, "Chest"), + "Halloween Town Bridge Left of Gate Chest": KH1LocationData("Halloween Town", 265_3291, "Chest"), + "Halloween Town Cemetery By Striped Grave Chest": KH1LocationData("Halloween Town", 265_3292, "Chest", True), + "Halloween Town Guillotine Square Under Jack's House Stairs Chest": KH1LocationData("Halloween Town", 265_3293, "Chest"), + "Halloween Town Guillotine Square Pumpkin Structure Right Chest": KH1LocationData("Halloween Town", 265_3294, "Chest"), + "Olympus Coliseum Coliseum Gates Left Behind Columns Chest": KH1LocationData("Olympus Coliseum", 265_3332, "Chest"), + "Olympus Coliseum Coliseum Gates Right Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3333, "Chest"), + "Olympus Coliseum Coliseum Gates Left Blue Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3334, "Chest"), + "Olympus Coliseum Coliseum Gates White Trinity Chest": KH1LocationData("Olympus Coliseum", 265_3371, "Chest"), + "Olympus Coliseum Coliseum Gates Blizzara Chest": KH1LocationData("Olympus Coliseum", 265_3372, "Chest"), + "Olympus Coliseum Coliseum Gates Blizzaga Chest": KH1LocationData("Olympus Coliseum", 265_3373, "Chest"), + "Monstro Mouth Boat Deck Chest": KH1LocationData("Monstro", 265_3454, "Chest", True), + "Monstro Mouth High Platform Boat Side Chest": KH1LocationData("Monstro", 265_3491, "Chest"), + "Monstro Mouth High Platform Across from Boat Chest": KH1LocationData("Monstro", 265_3492, "Chest"), + "Monstro Mouth Near Ship Chest": KH1LocationData("Monstro", 265_3493, "Chest"), + "Monstro Mouth Green Trinity Top of Boat Chest": KH1LocationData("Monstro", 265_3494, "Chest", True), + "Monstro Chamber 2 Ground Chest": KH1LocationData("Monstro", 265_3534, "Chest"), + "Monstro Chamber 2 Platform Chest": KH1LocationData("Monstro", 265_3571, "Chest"), + "Monstro Chamber 5 Platform Chest": KH1LocationData("Monstro", 265_3613, "Chest"), + "Monstro Chamber 3 Ground Chest": KH1LocationData("Monstro", 265_3614, "Chest"), + "Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest": KH1LocationData("Monstro", 265_3651, "Chest"), + "Monstro Chamber 3 Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3652, "Chest"), + "Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest": KH1LocationData("Monstro", 265_3653, "Chest"), + "Monstro Mouth High Platform Near Teeth Chest": KH1LocationData("Monstro", 265_3732, "Chest", True), + "Monstro Chamber 5 Atop Barrel Chest": KH1LocationData("Monstro", 265_3733, "Chest"), + "Monstro Chamber 5 Low 2nd Chest": KH1LocationData("Monstro", 265_3734, "Chest"), + "Monstro Chamber 5 Low 1st Chest": KH1LocationData("Monstro", 265_3771, "Chest"), + "Neverland Pirate Ship Deck White Trinity Chest": KH1LocationData("Neverland", 265_3772, "Chest", True), + "Neverland Pirate Ship Crows Nest Chest": KH1LocationData("Neverland", 265_3773, "Chest", True), + "Neverland Hold Yellow Trinity Right Blue Chest": KH1LocationData("Neverland", 265_3774, "Chest"), + "Neverland Hold Yellow Trinity Left Blue Chest": KH1LocationData("Neverland", 265_3811, "Chest"), + "Neverland Galley Chest": KH1LocationData("Neverland", 265_3812, "Chest"), + "Neverland Cabin Chest": KH1LocationData("Neverland", 265_3813, "Chest", True), + "Neverland Hold Flight 1st Chest": KH1LocationData("Neverland", 265_3814, "Chest", True), + "Neverland Clock Tower Chest": KH1LocationData("Neverland", 265_4014, "Chest", True), + "Neverland Hold Flight 2nd Chest": KH1LocationData("Neverland", 265_4051, "Chest", True), + "Neverland Hold Yellow Trinity Green Chest": KH1LocationData("Neverland", 265_4052, "Chest"), + "Neverland Captain's Cabin Chest": KH1LocationData("Neverland", 265_4053, "Chest", True), + "Hollow Bastion Rising Falls Water's Surface Chest": KH1LocationData("Hollow Bastion", 265_4054, "Chest"), + "Hollow Bastion Rising Falls Under Water 1st Chest": KH1LocationData("Hollow Bastion", 265_4091, "Chest"), + "Hollow Bastion Rising Falls Under Water 2nd Chest": KH1LocationData("Hollow Bastion", 265_4092, "Chest", True), + "Hollow Bastion Rising Falls Floating Platform Near Save Chest": KH1LocationData("Hollow Bastion", 265_4093, "Chest"), + "Hollow Bastion Rising Falls Floating Platform Near Bubble Chest": KH1LocationData("Hollow Bastion", 265_4094, "Chest"), + "Hollow Bastion Rising Falls High Platform Chest": KH1LocationData("Hollow Bastion", 265_4131, "Chest"), + "Hollow Bastion Castle Gates Gravity Chest": KH1LocationData("Hollow Bastion", 265_4132, "Chest"), + "Hollow Bastion Castle Gates Freestanding Pillar Chest": KH1LocationData("Hollow Bastion", 265_4133, "Chest"), + "Hollow Bastion Castle Gates High Pillar Chest": KH1LocationData("Hollow Bastion", 265_4134, "Chest"), + "Hollow Bastion Great Crest Lower Chest": KH1LocationData("Hollow Bastion", 265_4171, "Chest", True), + "Hollow Bastion Great Crest After Battle Platform Chest": KH1LocationData("Hollow Bastion", 265_4172, "Chest", True), + "Hollow Bastion High Tower 2nd Gravity Chest": KH1LocationData("Hollow Bastion", 265_4173, "Chest", True), + "Hollow Bastion High Tower 1st Gravity Chest": KH1LocationData("Hollow Bastion", 265_4174, "Chest", True), + "Hollow Bastion High Tower Above Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4211, "Chest", True), + "Hollow Bastion Library Top of Bookshelf Chest": KH1LocationData("Hollow Bastion", 265_4213, "Chest", True), + "Hollow Bastion Library 1st Floor Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4214, "Static", True), + "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest": KH1LocationData("Hollow Bastion", 265_4251, "Static", True), + "Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest": KH1LocationData("Hollow Bastion", 265_4252, "Static", True), + "Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest": KH1LocationData("Hollow Bastion", 265_4253, "Static", True), + "Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest": KH1LocationData("Hollow Bastion", 265_4254, "Chest", True), + "Hollow Bastion Lift Stop Library Node Gravity Chest": KH1LocationData("Hollow Bastion", 265_4291, "Chest", True), + "Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest": KH1LocationData("Hollow Bastion", 265_4292, "Chest", True), + "Hollow Bastion Lift Stop Outside Library Gravity Chest": KH1LocationData("Hollow Bastion", 265_4293, "Chest", True), + "Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest": KH1LocationData("Hollow Bastion", 265_4294, "Chest", True), + "Hollow Bastion Base Level Bubble Under the Wall Platform Chest": KH1LocationData("Hollow Bastion", 265_4331, "Chest"), + "Hollow Bastion Base Level Platform Near Entrance Chest": KH1LocationData("Hollow Bastion", 265_4332, "Chest"), + "Hollow Bastion Base Level Near Crystal Switch Chest": KH1LocationData("Hollow Bastion", 265_4333, "Chest"), + "Hollow Bastion Waterway Near Save Chest": KH1LocationData("Hollow Bastion", 265_4334, "Chest"), + "Hollow Bastion Waterway Blizzard on Bubble Chest": KH1LocationData("Hollow Bastion", 265_4371, "Chest"), + "Hollow Bastion Waterway Unlock Passage from Base Level Chest": KH1LocationData("Hollow Bastion", 265_4372, "Chest"), + "Hollow Bastion Dungeon By Candles Chest": KH1LocationData("Hollow Bastion", 265_4373, "Chest"), + "Hollow Bastion Dungeon Corner Chest": KH1LocationData("Hollow Bastion", 265_4374, "Chest"), + "Hollow Bastion Grand Hall Steps Right Side Chest": KH1LocationData("Hollow Bastion", 265_4454, "Chest", True), + "Hollow Bastion Grand Hall Oblivion Chest": KH1LocationData("Hollow Bastion", 265_4491, "Chest", True), + "Hollow Bastion Grand Hall Left of Gate Chest": KH1LocationData("Hollow Bastion", 265_4492, "Chest", True), + #"Hollow Bastion Entrance Hall Push the Statue Chest": KH1LocationData("Hollow Bastion", 265_4493, "Static"), --handled later + "Hollow Bastion Entrance Hall Left of Emblem Door Chest": KH1LocationData("Hollow Bastion", 265_4212, "Chest", True), + "Hollow Bastion Rising Falls White Trinity Chest": KH1LocationData("Hollow Bastion", 265_4494, "Chest", True), + "End of the World Final Dimension 1st Chest": KH1LocationData("End of the World", 265_4531, "Chest", True), + "End of the World Final Dimension 2nd Chest": KH1LocationData("End of the World", 265_4532, "Chest", True), + "End of the World Final Dimension 3rd Chest": KH1LocationData("End of the World", 265_4533, "Chest", True), + "End of the World Final Dimension 4th Chest": KH1LocationData("End of the World", 265_4534, "Chest", True), + "End of the World Final Dimension 5th Chest": KH1LocationData("End of the World", 265_4571, "Chest", True), + "End of the World Final Dimension 6th Chest": KH1LocationData("End of the World", 265_4572, "Chest", True), + "End of the World Final Dimension 10th Chest": KH1LocationData("End of the World", 265_4573, "Chest", True), + "End of the World Final Dimension 9th Chest": KH1LocationData("End of the World", 265_4574, "Chest", True), + "End of the World Final Dimension 8th Chest": KH1LocationData("End of the World", 265_4611, "Chest", True), + "End of the World Final Dimension 7th Chest": KH1LocationData("End of the World", 265_4612, "Chest", True), + "End of the World Giant Crevasse 3rd Chest": KH1LocationData("End of the World", 265_4613, "Chest", True), + "End of the World Giant Crevasse 5th Chest": KH1LocationData("End of the World", 265_4614, "Chest", True), + "End of the World Giant Crevasse 1st Chest": KH1LocationData("End of the World", 265_4651, "Chest", True), + "End of the World Giant Crevasse 4th Chest": KH1LocationData("End of the World", 265_4652, "Chest", True), + "End of the World Giant Crevasse 2nd Chest": KH1LocationData("End of the World", 265_4653, "Chest", True), + "End of the World World Terminus Traverse Town Chest": KH1LocationData("End of the World", 265_4654, "Chest", True), + "End of the World World Terminus Wonderland Chest": KH1LocationData("End of the World", 265_4691, "Chest", True), + "End of the World World Terminus Olympus Coliseum Chest": KH1LocationData("End of the World", 265_4692, "Chest", True), + "End of the World World Terminus Deep Jungle Chest": KH1LocationData("End of the World", 265_4693, "Chest", True), + "End of the World World Terminus Agrabah Chest": KH1LocationData("End of the World", 265_4694, "Chest", True), + "End of the World World Terminus Atlantica Chest": KH1LocationData("End of the World", 265_4731, "Static", True), + "End of the World World Terminus Halloween Town Chest": KH1LocationData("End of the World", 265_4732, "Chest", True), + "End of the World World Terminus Neverland Chest": KH1LocationData("End of the World", 265_4733, "Chest", True), + "End of the World World Terminus 100 Acre Wood Chest": KH1LocationData("End of the World", 265_4734, "Chest", True), + "End of the World World Terminus Hollow Bastion Chest": KH1LocationData("End of the World", 265_4771, "Chest", True), + "End of the World Final Rest Chest": KH1LocationData("End of the World", 265_4772, "Chest", True), + "Monstro Chamber 6 White Trinity Chest": KH1LocationData("Monstro", 265_5092, "Chest", True), + #"Awakening Chest": KH1LocationData("Awakening", 265_5093, "Chest"), missable - "Traverse Town Defeat Guard Armor Dodge Roll Event": KH1LocationData("Traverse Town", 265_6011), - "Traverse Town Defeat Guard Armor Fire Event": KH1LocationData("Traverse Town", 265_6012), - "Traverse Town Defeat Guard Armor Blue Trinity Event": KH1LocationData("Traverse Town", 265_6013), - "Traverse Town Leon Secret Waterway Earthshine Event": KH1LocationData("Traverse Town", 265_6014), - "Traverse Town Kairi Secret Waterway Oathkeeper Event": KH1LocationData("Traverse Town", 265_6015), - "Traverse Town Defeat Guard Armor Brave Warrior Event": KH1LocationData("Traverse Town", 265_6016), - "Deep Jungle Defeat Sabor White Fang Event": KH1LocationData("Deep Jungle", 265_6021), - "Deep Jungle Defeat Clayton Cure Event": KH1LocationData("Deep Jungle", 265_6022), - "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Deep Jungle", 265_6023), - "Deep Jungle Seal Keyhole Red Trinity Event": KH1LocationData("Deep Jungle", 265_6024), - "Olympus Coliseum Clear Phil's Training Thunder Event": KH1LocationData("Olympus Coliseum", 265_6031), - "Olympus Coliseum Defeat Cerberus Inferno Band Event": KH1LocationData("Olympus Coliseum", 265_6033), - "Wonderland Defeat Trickmaster Blizzard Event": KH1LocationData("Wonderland", 265_6041), - "Wonderland Defeat Trickmaster Ifrit's Horn Event": KH1LocationData("Wonderland", 265_6042), - "Agrabah Defeat Pot Centipede Ray of Light Event": KH1LocationData("Agrabah", 265_6051), - "Agrabah Defeat Jafar Blizzard Event": KH1LocationData("Agrabah", 265_6052), - "Agrabah Defeat Jafar Genie Fire Event": KH1LocationData("Agrabah", 265_6053), - "Agrabah Seal Keyhole Genie Event": KH1LocationData("Agrabah", 265_6054), - "Agrabah Seal Keyhole Three Wishes Event": KH1LocationData("Agrabah", 265_6055), - "Agrabah Seal Keyhole Green Trinity Event": KH1LocationData("Agrabah", 265_6056), - "Monstro Defeat Parasite Cage I Goofy Cheer Event": KH1LocationData("Monstro", 265_6061), - "Monstro Defeat Parasite Cage II Stop Event": KH1LocationData("Monstro", 265_6062), - "Atlantica Defeat Ursula I Mermaid Kick Event": KH1LocationData("Atlantica", 265_6071), - "Atlantica Defeat Ursula II Thunder Event": KH1LocationData("Atlantica", 265_6072), - "Atlantica Seal Keyhole Crabclaw Event": KH1LocationData("Atlantica", 265_6073), - "Halloween Town Defeat Oogie Boogie Holy Circlet Event": KH1LocationData("Halloween Town", 265_6081), - "Halloween Town Defeat Oogie's Manor Gravity Event": KH1LocationData("Halloween Town", 265_6082), - "Halloween Town Seal Keyhole Pumpkinhead Event": KH1LocationData("Halloween Town", 265_6083), - "Neverland Defeat Anti Sora Raven's Claw Event": KH1LocationData("Neverland", 265_6091), - "Neverland Encounter Hook Cure Event": KH1LocationData("Neverland", 265_6092), - "Neverland Seal Keyhole Fairy Harp Event": KH1LocationData("Neverland", 265_6093), - "Neverland Seal Keyhole Tinker Bell Event": KH1LocationData("Neverland", 265_6094), - "Neverland Seal Keyhole Glide Event": KH1LocationData("Neverland", 265_6095), - "Neverland Defeat Phantom Stop Event": KH1LocationData("Neverland", 265_6096), - "Neverland Defeat Captain Hook Ars Arcanum Event": KH1LocationData("Neverland", 265_6097), - "Hollow Bastion Defeat Riku I White Trinity Event": KH1LocationData("Hollow Bastion", 265_6101), - "Hollow Bastion Defeat Maleficent Donald Cheer Event": KH1LocationData("Hollow Bastion", 265_6102), - "Hollow Bastion Defeat Dragon Maleficent Fireglow Event": KH1LocationData("Hollow Bastion", 265_6103), - "Hollow Bastion Defeat Riku II Ragnarok Event": KH1LocationData("Hollow Bastion", 265_6104), - "Hollow Bastion Defeat Behemoth Omega Arts Event": KH1LocationData("Hollow Bastion", 265_6105), - "Hollow Bastion Speak to Princesses Fire Event": KH1LocationData("Hollow Bastion", 265_6106), - "End of the World Defeat Chernabog Superglide Event": KH1LocationData("End of the World", 265_6111), + "Traverse Town Defeat Guard Armor Dodge Roll Event": KH1LocationData("Traverse Town", 265_6011, "Reward"), + "Traverse Town Defeat Guard Armor Fire Event": KH1LocationData("Traverse Town", 265_6012, "Static"), + "Traverse Town Defeat Guard Armor Blue Trinity Event": KH1LocationData("Traverse Town", 265_6013, "Static"), + "Traverse Town Leon Secret Waterway Earthshine Event": KH1LocationData("Traverse Town", 265_6014, "Reward"), + "Traverse Town Kairi Secret Waterway Oathkeeper Event": KH1LocationData("Traverse Town", 265_6015, "Reward", True), + "Traverse Town Defeat Guard Armor Brave Warrior Event": KH1LocationData("Traverse Town", 265_6016, "Reward"), + "Deep Jungle Defeat Sabor White Fang Event": KH1LocationData("Deep Jungle", 265_6021, "Reward", True), + "Deep Jungle Defeat Clayton Cure Event": KH1LocationData("Deep Jungle", 265_6022, "Static", True), + "Deep Jungle Seal Keyhole Jungle King Event": KH1LocationData("Deep Jungle", 265_6023, "Reward", True), + "Deep Jungle Seal Keyhole Red Trinity Event": KH1LocationData("Deep Jungle", 265_6024, "Static", True), + "Olympus Coliseum Clear Phil's Training Thunder Event": KH1LocationData("Olympus Coliseum", 265_6031, "Static"), + "Olympus Coliseum Defeat Cerberus Inferno Band Event": KH1LocationData("Olympus Coliseum", 265_6033, "Reward", True), + "Wonderland Defeat Trickmaster Blizzard Event": KH1LocationData("Wonderland", 265_6041, "Static", True), + "Wonderland Defeat Trickmaster Ifrit's Horn Event": KH1LocationData("Wonderland", 265_6042, "Reward", True), + "Agrabah Defeat Pot Centipede Ray of Light Event": KH1LocationData("Agrabah", 265_6051, "Reward", True), + "Agrabah Defeat Jafar Blizzard Event": KH1LocationData("Agrabah", 265_6052, "Static", True), + "Agrabah Defeat Jafar Genie Fire Event": KH1LocationData("Agrabah", 265_6053, "Static", True), + "Agrabah Seal Keyhole Genie Event": KH1LocationData("Agrabah", 265_6054, "Static", True), + "Agrabah Seal Keyhole Three Wishes Event": KH1LocationData("Agrabah", 265_6055, "Reward", True), + "Agrabah Seal Keyhole Green Trinity Event": KH1LocationData("Agrabah", 265_6056, "Static", True), + "Monstro Defeat Parasite Cage I Goofy Cheer Event": KH1LocationData("Monstro", 265_6061, "Reward", True), + "Monstro Defeat Parasite Cage II Stop Event": KH1LocationData("Monstro", 265_6062, "Static", True), + "Atlantica Defeat Ursula I Mermaid Kick Event": KH1LocationData("Atlantica", 265_6071, "Reward", True), + "Atlantica Defeat Ursula II Thunder Event": KH1LocationData("Atlantica", 265_6072, "Static", True), + "Atlantica Seal Keyhole Crabclaw Event": KH1LocationData("Atlantica", 265_6073, "Reward", True), + "Halloween Town Defeat Oogie Boogie Holy Circlet Event": KH1LocationData("Halloween Town", 265_6081, "Reward", True), + "Halloween Town Defeat Oogie's Manor Gravity Event": KH1LocationData("Halloween Town", 265_6082, "Static", True), + "Halloween Town Seal Keyhole Pumpkinhead Event": KH1LocationData("Halloween Town", 265_6083, "Reward", True), + "Neverland Defeat Anti Sora Raven's Claw Event": KH1LocationData("Neverland", 265_6091, "Reward", True), + "Neverland Encounter Hook Cure Event": KH1LocationData("Neverland", 265_6092, "Static", True), + "Neverland Seal Keyhole Fairy Harp Event": KH1LocationData("Neverland", 265_6093, "Reward", True), + "Neverland Seal Keyhole Tinker Bell Event": KH1LocationData("Neverland", 265_6094, "Static", True), + "Neverland Seal Keyhole Glide Event": KH1LocationData("Neverland", 265_6095, "Reward", True), + "Neverland Defeat Phantom Stop Event": KH1LocationData("Neverland", 265_6096, "Static", True), + "Neverland Defeat Captain Hook Ars Arcanum Event": KH1LocationData("Neverland", 265_6097, "Reward", True), + "Hollow Bastion Defeat Riku I White Trinity Event": KH1LocationData("Hollow Bastion", 265_6101, "Static", True), + "Hollow Bastion Defeat Maleficent Donald Cheer Event": KH1LocationData("Hollow Bastion", 265_6102, "Reward", True), + "Hollow Bastion Defeat Dragon Maleficent Fireglow Event": KH1LocationData("Hollow Bastion", 265_6103, "Reward", True), + "Hollow Bastion Defeat Riku II Ragnarok Event": KH1LocationData("Hollow Bastion", 265_6104, "Reward", True), + "Hollow Bastion Defeat Behemoth Omega Arts Event": KH1LocationData("Hollow Bastion", 265_6105, "Reward", True), + "Hollow Bastion Speak to Princesses Fire Event": KH1LocationData("Hollow Bastion", 265_6106, "Static", True), + "End of the World Defeat Chernabog Superglide Event": KH1LocationData("End of the World", 265_6111, "Reward", True), + "Neverland Seal Keyhole Navi-G Piece Event": KH1LocationData("Neverland", 265_6112, "Static", True), + "Traverse Town Secret Waterway Navi Gummi Event": KH1LocationData("Traverse Town", 265_6113, "Static", True), - "Traverse Town Mail Postcard 01 Event": KH1LocationData("Traverse Town", 265_6120), - "Traverse Town Mail Postcard 02 Event": KH1LocationData("Traverse Town", 265_6121), - "Traverse Town Mail Postcard 03 Event": KH1LocationData("Traverse Town", 265_6122), - "Traverse Town Mail Postcard 04 Event": KH1LocationData("Traverse Town", 265_6123), - "Traverse Town Mail Postcard 05 Event": KH1LocationData("Traverse Town", 265_6124), - "Traverse Town Mail Postcard 06 Event": KH1LocationData("Traverse Town", 265_6125), - "Traverse Town Mail Postcard 07 Event": KH1LocationData("Traverse Town", 265_6126), - "Traverse Town Mail Postcard 08 Event": KH1LocationData("Traverse Town", 265_6127), - "Traverse Town Mail Postcard 09 Event": KH1LocationData("Traverse Town", 265_6128), - "Traverse Town Mail Postcard 10 Event": KH1LocationData("Traverse Town", 265_6129), + "Traverse Town Mail Postcard 01 Event": KH1LocationData("Traverse Town", 265_6120, "Reward"), + "Traverse Town Mail Postcard 02 Event": KH1LocationData("Traverse Town", 265_6121, "Reward"), + "Traverse Town Mail Postcard 03 Event": KH1LocationData("Traverse Town", 265_6122, "Reward"), + "Traverse Town Mail Postcard 04 Event": KH1LocationData("Traverse Town", 265_6123, "Reward"), + "Traverse Town Mail Postcard 05 Event": KH1LocationData("Traverse Town", 265_6124, "Reward"), + "Traverse Town Mail Postcard 06 Event": KH1LocationData("Traverse Town", 265_6125, "Reward"), + "Traverse Town Mail Postcard 07 Event": KH1LocationData("Traverse Town", 265_6126, "Reward"), + "Traverse Town Mail Postcard 08 Event": KH1LocationData("Traverse Town", 265_6127, "Reward"), + "Traverse Town Mail Postcard 09 Event": KH1LocationData("Traverse Town", 265_6128, "Reward"), + "Traverse Town Mail Postcard 10 Event": KH1LocationData("Traverse Town", 265_6129, "Reward"), - "Traverse Town Defeat Opposite Armor Aero Event": KH1LocationData("Traverse Town", 265_6131), + "Traverse Town Defeat Opposite Armor Aero Event": KH1LocationData("Traverse Town", 265_6131, "Static", True), + "Traverse Town Defeat Opposite Armor Navi-G Piece Event": KH1LocationData("Traverse Town", 265_6132, "Static", True), - "Atlantica Undersea Gorge Blizzard Clam": KH1LocationData("Atlantica", 265_6201), - "Atlantica Undersea Gorge Ocean Floor Clam": KH1LocationData("Atlantica", 265_6202), - "Atlantica Undersea Valley Higher Cave Clam": KH1LocationData("Atlantica", 265_6203), - "Atlantica Undersea Valley Lower Cave Clam": KH1LocationData("Atlantica", 265_6204), - "Atlantica Undersea Valley Fire Clam": KH1LocationData("Atlantica", 265_6205), - "Atlantica Undersea Valley Wall Clam": KH1LocationData("Atlantica", 265_6206), - "Atlantica Undersea Valley Pillar Clam": KH1LocationData("Atlantica", 265_6207), - "Atlantica Undersea Valley Ocean Floor Clam": KH1LocationData("Atlantica", 265_6208), - "Atlantica Triton's Palace Thunder Clam": KH1LocationData("Atlantica", 265_6209), - "Atlantica Triton's Palace Wall Right Clam": KH1LocationData("Atlantica", 265_6210), - "Atlantica Triton's Palace Near Path Clam": KH1LocationData("Atlantica", 265_6211), - "Atlantica Triton's Palace Wall Left Clam": KH1LocationData("Atlantica", 265_6212), - "Atlantica Cavern Nook Clam": KH1LocationData("Atlantica", 265_6213), - "Atlantica Below Deck Clam": KH1LocationData("Atlantica", 265_6214), - "Atlantica Undersea Garden Clam": KH1LocationData("Atlantica", 265_6215), - "Atlantica Undersea Cave Clam": KH1LocationData("Atlantica", 265_6216), + "Atlantica Undersea Gorge Blizzard Clam": KH1LocationData("Atlantica", 265_6201, "Static"), + "Atlantica Undersea Gorge Ocean Floor Clam": KH1LocationData("Atlantica", 265_6202, "Static"), + "Atlantica Undersea Valley Higher Cave Clam": KH1LocationData("Atlantica", 265_6203, "Static"), + "Atlantica Undersea Valley Lower Cave Clam": KH1LocationData("Atlantica", 265_6204, "Static"), + "Atlantica Undersea Valley Fire Clam": KH1LocationData("Atlantica", 265_6205, "Static"), + "Atlantica Undersea Valley Wall Clam": KH1LocationData("Atlantica", 265_6206, "Static"), + "Atlantica Undersea Valley Pillar Clam": KH1LocationData("Atlantica", 265_6207, "Static"), + "Atlantica Undersea Valley Ocean Floor Clam": KH1LocationData("Atlantica", 265_6208, "Static"), + "Atlantica Triton's Palace Thunder Clam": KH1LocationData("Atlantica", 265_6209, "Static"), + "Atlantica Triton's Palace Wall Right Clam": KH1LocationData("Atlantica", 265_6210, "Static"), + "Atlantica Triton's Palace Near Path Clam": KH1LocationData("Atlantica", 265_6211, "Static"), + "Atlantica Triton's Palace Wall Left Clam": KH1LocationData("Atlantica", 265_6212, "Static"), + "Atlantica Cavern Nook Clam": KH1LocationData("Atlantica", 265_6213, "Static"), + "Atlantica Below Deck Clam": KH1LocationData("Atlantica", 265_6214, "Static"), + "Atlantica Undersea Garden Clam": KH1LocationData("Atlantica", 265_6215, "Static"), + "Atlantica Undersea Cave Clam": KH1LocationData("Atlantica", 265_6216, "Static"), - #"Traverse Town Magician's Study Turn in Naturespark": KH1LocationData("Traverse Town", 265_6300), - #"Traverse Town Magician's Study Turn in Watergleam": KH1LocationData("Traverse Town", 265_6301), - #"Traverse Town Magician's Study Turn in Fireglow": KH1LocationData("Traverse Town", 265_6302), - #"Traverse Town Magician's Study Turn in all Summon Gems": KH1LocationData("Traverse Town", 265_6303), - "Traverse Town Geppetto's House Geppetto Reward 1": KH1LocationData("Traverse Town", 265_6304), - "Traverse Town Geppetto's House Geppetto Reward 2": KH1LocationData("Traverse Town", 265_6305), - "Traverse Town Geppetto's House Geppetto Reward 3": KH1LocationData("Traverse Town", 265_6306), - "Traverse Town Geppetto's House Geppetto Reward 4": KH1LocationData("Traverse Town", 265_6307), - "Traverse Town Geppetto's House Geppetto Reward 5": KH1LocationData("Traverse Town", 265_6308), - "Traverse Town Geppetto's House Geppetto All Summons Reward": KH1LocationData("Traverse Town", 265_6309), - "Traverse Town Geppetto's House Talk to Pinocchio": KH1LocationData("Traverse Town", 265_6310), - "Traverse Town Magician's Study Obtained All Arts Items": KH1LocationData("Traverse Town", 265_6311), - "Traverse Town Magician's Study Obtained All LV1 Magic": KH1LocationData("Traverse Town", 265_6312), - "Traverse Town Magician's Study Obtained All LV3 Magic": KH1LocationData("Traverse Town", 265_6313), - "Traverse Town Piano Room Return 10 Puppies": KH1LocationData("Traverse Town", 265_6314), - "Traverse Town Piano Room Return 20 Puppies": KH1LocationData("Traverse Town", 265_6315), - "Traverse Town Piano Room Return 30 Puppies": KH1LocationData("Traverse Town", 265_6316), - "Traverse Town Piano Room Return 40 Puppies": KH1LocationData("Traverse Town", 265_6317), - "Traverse Town Piano Room Return 50 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6318), - "Traverse Town Piano Room Return 50 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6319), - "Traverse Town Piano Room Return 60 Puppies": KH1LocationData("Traverse Town", 265_6320), - "Traverse Town Piano Room Return 70 Puppies": KH1LocationData("Traverse Town", 265_6321), - "Traverse Town Piano Room Return 80 Puppies": KH1LocationData("Traverse Town", 265_6322), - "Traverse Town Piano Room Return 90 Puppies": KH1LocationData("Traverse Town", 265_6324), - "Traverse Town Piano Room Return 99 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6326), - "Traverse Town Piano Room Return 99 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6327), - "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Olympus Coliseum", 265_6032), #Had to change the way we send this check, not changing location_id - "Olympus Coliseum Defeat Sephiroth One-Winged Angel Event": KH1LocationData("Olympus Coliseum", 265_6328), - "Olympus Coliseum Defeat Ice Titan Diamond Dust Event": KH1LocationData("Olympus Coliseum", 265_6329), - "Olympus Coliseum Gates Purple Jar After Defeating Hades": KH1LocationData("Olympus Coliseum", 265_6330), - "Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times": KH1LocationData("Halloween Town", 265_6331), - #"Neverland Clock Tower 01:00 Door": KH1LocationData("Neverland", 265_6332), - #"Neverland Clock Tower 02:00 Door": KH1LocationData("Neverland", 265_6333), - #"Neverland Clock Tower 03:00 Door": KH1LocationData("Neverland", 265_6334), - #"Neverland Clock Tower 04:00 Door": KH1LocationData("Neverland", 265_6335), - #"Neverland Clock Tower 05:00 Door": KH1LocationData("Neverland", 265_6336), - #"Neverland Clock Tower 06:00 Door": KH1LocationData("Neverland", 265_6337), - #"Neverland Clock Tower 07:00 Door": KH1LocationData("Neverland", 265_6338), - #"Neverland Clock Tower 08:00 Door": KH1LocationData("Neverland", 265_6339), - #"Neverland Clock Tower 09:00 Door": KH1LocationData("Neverland", 265_6340), - #"Neverland Clock Tower 10:00 Door": KH1LocationData("Neverland", 265_6341), - #"Neverland Clock Tower 11:00 Door": KH1LocationData("Neverland", 265_6342), - #"Neverland Clock Tower 12:00 Door": KH1LocationData("Neverland", 265_6343), - "Neverland Hold Aero Chest": KH1LocationData("Neverland", 265_6344), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 1": KH1LocationData("100 Acre Wood", 265_6345), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 2": KH1LocationData("100 Acre Wood", 265_6346), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 3": KH1LocationData("100 Acre Wood", 265_6347), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 4": KH1LocationData("100 Acre Wood", 265_6348), - "100 Acre Wood Bouncing Spot Turn in Rare Nut 5": KH1LocationData("100 Acre Wood", 265_6349), - "100 Acre Wood Pooh's House Owl Cheer": KH1LocationData("100 Acre Wood", 265_6350), - "100 Acre Wood Convert Torn Page 1": KH1LocationData("100 Acre Wood", 265_6351), - "100 Acre Wood Convert Torn Page 2": KH1LocationData("100 Acre Wood", 265_6352), - "100 Acre Wood Convert Torn Page 3": KH1LocationData("100 Acre Wood", 265_6353), - "100 Acre Wood Convert Torn Page 4": KH1LocationData("100 Acre Wood", 265_6354), - "100 Acre Wood Convert Torn Page 5": KH1LocationData("100 Acre Wood", 265_6355), - "100 Acre Wood Pooh's House Start Fire": KH1LocationData("100 Acre Wood", 265_6356), - "100 Acre Wood Pooh's Room Cabinet": KH1LocationData("100 Acre Wood", 265_6357), - "100 Acre Wood Pooh's Room Chimney": KH1LocationData("100 Acre Wood", 265_6358), - "100 Acre Wood Bouncing Spot Break Log": KH1LocationData("100 Acre Wood", 265_6359), - "100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh": KH1LocationData("100 Acre Wood", 265_6360), - "Deep Jungle Camp Hi-Potion Experiment": KH1LocationData("Deep Jungle", 265_6361), - "Deep Jungle Camp Ether Experiment": KH1LocationData("Deep Jungle", 265_6362), - "Deep Jungle Camp Replication Experiment": KH1LocationData("Deep Jungle", 265_6363), - "Deep Jungle Cliff Save Gorillas": KH1LocationData("Deep Jungle", 265_6364), - "Deep Jungle Tree House Save Gorillas": KH1LocationData("Deep Jungle", 265_6365), - "Deep Jungle Camp Save Gorillas": KH1LocationData("Deep Jungle", 265_6366), - "Deep Jungle Bamboo Thicket Save Gorillas": KH1LocationData("Deep Jungle", 265_6367), - "Deep Jungle Climbing Trees Save Gorillas": KH1LocationData("Deep Jungle", 265_6368), - "Olympus Coliseum Olympia Chest": KH1LocationData("Olympus Coliseum", 265_6369), - "Deep Jungle Jungle Slider 10 Fruits": KH1LocationData("Deep Jungle", 265_6370), - "Deep Jungle Jungle Slider 20 Fruits": KH1LocationData("Deep Jungle", 265_6371), - "Deep Jungle Jungle Slider 30 Fruits": KH1LocationData("Deep Jungle", 265_6372), - "Deep Jungle Jungle Slider 40 Fruits": KH1LocationData("Deep Jungle", 265_6373), - "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Deep Jungle", 265_6374), - "Traverse Town 1st District Speak with Cid Event": KH1LocationData("Traverse Town", 265_6375), - "Wonderland Bizarre Room Read Book": KH1LocationData("Wonderland", 265_6376), - "Olympus Coliseum Coliseum Gates Green Trinity": KH1LocationData("Olympus Coliseum", 265_6377), - "Agrabah Defeat Kurt Zisa Zantetsuken Event": KH1LocationData("Agrabah", 265_6378), - "Hollow Bastion Defeat Unknown EXP Necklace Event": KH1LocationData("Hollow Bastion", 265_6379), - "Olympus Coliseum Coliseum Gates Hero's License Event": KH1LocationData("Olympus Coliseum", 265_6380), - "Atlantica Sunken Ship Crystal Trident Event": KH1LocationData("Atlantica", 265_6381), - "Halloween Town Graveyard Forget-Me-Not Event": KH1LocationData("Halloween Town", 265_6382), - "Deep Jungle Tent Protect-G Event": KH1LocationData("Deep Jungle", 265_6383), - "Deep Jungle Cavern of Hearts Navi-G Piece Event": KH1LocationData("Deep Jungle", 265_6384), - "Wonderland Bizarre Room Navi-G Piece Event": KH1LocationData("Wonderland", 265_6385), - "Olympus Coliseum Coliseum Gates Entry Pass Event": KH1LocationData("Olympus Coliseum", 265_6386), + #"Traverse Town Magician's Study Turn in Naturespark": KH1LocationData("Traverse Town", 265_6300, "Static"), + #"Traverse Town Magician's Study Turn in Watergleam": KH1LocationData("Traverse Town", 265_6301, "Static"), + #"Traverse Town Magician's Study Turn in Fireglow": KH1LocationData("Traverse Town", 265_6302, "Static"), + #"Traverse Town Magician's Study Turn in all Summon Gems": KH1LocationData("Traverse Town", 265_6303, "Reward"), + "Traverse Town Geppetto's House Geppetto Reward 1": KH1LocationData("Traverse Town", 265_6304, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 4": KH1LocationData("Traverse Town", 265_6305, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 3": KH1LocationData("Traverse Town", 265_6306, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 5": KH1LocationData("Traverse Town", 265_6307, "Static", True), + "Traverse Town Geppetto's House Geppetto Reward 2": KH1LocationData("Traverse Town", 265_6308, "Static", True), + "Traverse Town Geppetto's House Geppetto All Summons Reward": KH1LocationData("Traverse Town", 265_6309, "Static", True), + "Traverse Town Geppetto's House Talk to Pinocchio": KH1LocationData("Traverse Town", 265_6310, "Static", True), + "Traverse Town Magician's Study Obtained All Arts Items": KH1LocationData("Traverse Town", 265_6311, "Reward"), + "Traverse Town Magician's Study Obtained All LV1 Magic": KH1LocationData("Traverse Town", 265_6312, "Reward"), + "Traverse Town Magician's Study Obtained All LV3 Magic": KH1LocationData("Traverse Town", 265_6313, "Reward"), + "Traverse Town Piano Room Return 10 Puppies": KH1LocationData("Traverse Town", 265_6314, "Static"), + "Traverse Town Piano Room Return 20 Puppies": KH1LocationData("Traverse Town", 265_6315, "Static"), + "Traverse Town Piano Room Return 30 Puppies": KH1LocationData("Traverse Town", 265_6316, "Static"), + "Traverse Town Piano Room Return 40 Puppies": KH1LocationData("Traverse Town", 265_6317, "Reward"), + "Traverse Town Piano Room Return 50 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6318, "Static"), + "Traverse Town Piano Room Return 50 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6319, "Reward"), + "Traverse Town Piano Room Return 60 Puppies": KH1LocationData("Traverse Town", 265_6320, "Reward"), + "Traverse Town Piano Room Return 70 Puppies": KH1LocationData("Traverse Town", 265_6321, "Reward"), + "Traverse Town Piano Room Return 80 Puppies": KH1LocationData("Traverse Town", 265_6322, "Static"), + "Traverse Town Piano Room Return 90 Puppies": KH1LocationData("Traverse Town", 265_6324, "Reward"), + "Traverse Town Piano Room Return 99 Puppies Reward 1": KH1LocationData("Traverse Town", 265_6326, "Static"), + "Traverse Town Piano Room Return 99 Puppies Reward 2": KH1LocationData("Traverse Town", 265_6327, "Static"), + "Olympus Coliseum Cloud Sonic Blade Event": KH1LocationData("Olympus Coliseum", 265_6032, "Reward", True), #Had to change the way we send this check, not changing location_id + "Olympus Coliseum Defeat Sephiroth One-Winged Angel Event": KH1LocationData("Olympus Coliseum", 265_6328, "Reward", True), + "Olympus Coliseum Defeat Ice Titan Diamond Dust Event": KH1LocationData("Olympus Coliseum", 265_6329, "Reward", True), + "Olympus Coliseum Gates Purple Jar After Defeating Hades": KH1LocationData("Olympus Coliseum", 265_6330, "Static", True), + "Halloween Town Guillotine Square Ring Jack's Doorbell 3 Times": KH1LocationData("Halloween Town", 265_6331, "Static"), + "Neverland Clock Tower 01:00 Door": KH1LocationData("Neverland", 265_6332, "Static", True), + "Neverland Clock Tower 02:00 Door": KH1LocationData("Neverland", 265_6333, "Static", True), + "Neverland Clock Tower 03:00 Door": KH1LocationData("Neverland", 265_6334, "Static", True), + "Neverland Clock Tower 04:00 Door": KH1LocationData("Neverland", 265_6335, "Static", True), + "Neverland Clock Tower 05:00 Door": KH1LocationData("Neverland", 265_6336, "Static", True), + "Neverland Clock Tower 06:00 Door": KH1LocationData("Neverland", 265_6337, "Static", True), + "Neverland Clock Tower 07:00 Door": KH1LocationData("Neverland", 265_6338, "Static", True), + "Neverland Clock Tower 08:00 Door": KH1LocationData("Neverland", 265_6339, "Static", True), + "Neverland Clock Tower 09:00 Door": KH1LocationData("Neverland", 265_6340, "Static", True), + "Neverland Clock Tower 10:00 Door": KH1LocationData("Neverland", 265_6341, "Static", True), + "Neverland Clock Tower 11:00 Door": KH1LocationData("Neverland", 265_6342, "Static", True), + "Neverland Clock Tower 12:00 Door": KH1LocationData("Neverland", 265_6343, "Static", True), + "Neverland Hold Aero Chest": KH1LocationData("Neverland", 265_6344, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 1": KH1LocationData("100 Acre Wood", 265_6345, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 2": KH1LocationData("100 Acre Wood", 265_6346, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 3": KH1LocationData("100 Acre Wood", 265_6347, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 4": KH1LocationData("100 Acre Wood", 265_6348, "Static"), + "100 Acre Wood Bouncing Spot Turn in Rare Nut 5": KH1LocationData("100 Acre Wood", 265_6349, "Static"), + "100 Acre Wood Pooh's House Owl Cheer": KH1LocationData("100 Acre Wood", 265_6350, "Reward"), + "100 Acre Wood Convert Torn Page 1": KH1LocationData("100 Acre Wood", 265_6351, "Reward"), + "100 Acre Wood Convert Torn Page 2": KH1LocationData("100 Acre Wood", 265_6352, "Reward"), + "100 Acre Wood Convert Torn Page 3": KH1LocationData("100 Acre Wood", 265_6353, "Static"), + "100 Acre Wood Convert Torn Page 4": KH1LocationData("100 Acre Wood", 265_6354, "Reward"), + "100 Acre Wood Convert Torn Page 5": KH1LocationData("100 Acre Wood", 265_6355, "Reward"), + "100 Acre Wood Pooh's House Start Fire": KH1LocationData("100 Acre Wood", 265_6356, "Static"), + "100 Acre Wood Pooh's Room Cabinet": KH1LocationData("100 Acre Wood", 265_6357, "Static"), + "100 Acre Wood Pooh's Room Chimney": KH1LocationData("100 Acre Wood", 265_6358, "Static"), + "100 Acre Wood Bouncing Spot Break Log": KH1LocationData("100 Acre Wood", 265_6359, "Static"), + "100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh": KH1LocationData("100 Acre Wood", 265_6360, "Static"), + "Deep Jungle Camp Hi-Potion Experiment": KH1LocationData("Deep Jungle", 265_6361, "Static"), + "Deep Jungle Camp Ether Experiment": KH1LocationData("Deep Jungle", 265_6362, "Static"), + "Deep Jungle Camp Replication Experiment": KH1LocationData("Deep Jungle", 265_6363, "Static"), + "Deep Jungle Cliff Save Gorillas": KH1LocationData("Deep Jungle", 265_6364, "Static"), + "Deep Jungle Tree House Save Gorillas": KH1LocationData("Deep Jungle", 265_6365, "Static"), + "Deep Jungle Camp Save Gorillas": KH1LocationData("Deep Jungle", 265_6366, "Static"), + "Deep Jungle Bamboo Thicket Save Gorillas": KH1LocationData("Deep Jungle", 265_6367, "Static"), + "Deep Jungle Climbing Trees Save Gorillas": KH1LocationData("Deep Jungle", 265_6368, "Static"), + "Olympus Coliseum Olympia Chest": KH1LocationData("Olympus Coliseum", 265_6369, "Reward", True), + "Deep Jungle Jungle Slider 10 Fruits": KH1LocationData("Deep Jungle", 265_6370, "Reward", True), + "Deep Jungle Jungle Slider 20 Fruits": KH1LocationData("Deep Jungle", 265_6371, "Reward", True), + "Deep Jungle Jungle Slider 30 Fruits": KH1LocationData("Deep Jungle", 265_6372, "Reward", True), + "Deep Jungle Jungle Slider 40 Fruits": KH1LocationData("Deep Jungle", 265_6373, "Reward", True), + "Deep Jungle Jungle Slider 50 Fruits": KH1LocationData("Deep Jungle", 265_6374, "Reward", True), + #"Traverse Town 1st District Speak with Cid Event": KH1LocationData("Traverse Town", 265_6375, "Static"), + "Wonderland Bizarre Room Read Book": KH1LocationData("Wonderland", 265_6376, "Static"), + "Olympus Coliseum Coliseum Gates Green Trinity": KH1LocationData("Olympus Coliseum", 265_6377, "Static"), + "Agrabah Defeat Kurt Zisa Zantetsuken Event": KH1LocationData("Agrabah", 265_6378, "Reward", True), + "Hollow Bastion Defeat Unknown EXP Necklace Event": KH1LocationData("Hollow Bastion", 265_6379, "Reward", True), + "Olympus Coliseum Coliseum Gates Hero's License Event": KH1LocationData("Olympus Coliseum", 265_6380, "Static", True), + "Atlantica Sunken Ship Crystal Trident Event": KH1LocationData("Atlantica", 265_6381, "Static"), + "Halloween Town Graveyard Forget-Me-Not Event": KH1LocationData("Halloween Town", 265_6382, "Static"), + "Deep Jungle Tent Protect-G Event": KH1LocationData("Deep Jungle", 265_6383, "Static"), + "Deep Jungle Cavern of Hearts Navi-G Piece Event": KH1LocationData("Deep Jungle", 265_6384, "Static", True), + "Wonderland Bizarre Room Navi-G Piece Event": KH1LocationData("Wonderland", 265_6385, "Static", True), + "Olympus Coliseum Coliseum Gates Entry Pass Event": KH1LocationData("Olympus Coliseum", 265_6386, "Static"), - "Traverse Town Synth Log": KH1LocationData("Traverse Town", 265_6401), - "Traverse Town Synth Cloth": KH1LocationData("Traverse Town", 265_6402), - "Traverse Town Synth Rope": KH1LocationData("Traverse Town", 265_6403), - "Traverse Town Synth Seagull Egg": KH1LocationData("Traverse Town", 265_6404), - "Traverse Town Synth Fish": KH1LocationData("Traverse Town", 265_6405), - "Traverse Town Synth Mushroom": KH1LocationData("Traverse Town", 265_6406), + "Traverse Town Synth 15 Items": KH1LocationData("Traverse Town", 265_6400, "Reward"), + "Traverse Town Synth Item 01": KH1LocationData("Traverse Town", 265_6401, "Synth"), + "Traverse Town Synth Item 02": KH1LocationData("Traverse Town", 265_6402, "Synth"), + "Traverse Town Synth Item 03": KH1LocationData("Traverse Town", 265_6403, "Synth"), + "Traverse Town Synth Item 04": KH1LocationData("Traverse Town", 265_6404, "Synth"), + "Traverse Town Synth Item 05": KH1LocationData("Traverse Town", 265_6405, "Synth"), + "Traverse Town Synth Item 06": KH1LocationData("Traverse Town", 265_6406, "Synth"), + "Traverse Town Synth Item 06": KH1LocationData("Traverse Town", 265_6406, "Synth"), + "Traverse Town Synth Item 07": KH1LocationData("Traverse Town", 265_6407, "Synth"), + "Traverse Town Synth Item 08": KH1LocationData("Traverse Town", 265_6408, "Synth"), + "Traverse Town Synth Item 09": KH1LocationData("Traverse Town", 265_6409, "Synth"), + "Traverse Town Synth Item 10": KH1LocationData("Traverse Town", 265_6410, "Synth"), + "Traverse Town Synth Item 11": KH1LocationData("Traverse Town", 265_6411, "Synth"), + "Traverse Town Synth Item 12": KH1LocationData("Traverse Town", 265_6412, "Synth"), + "Traverse Town Synth Item 13": KH1LocationData("Traverse Town", 265_6413, "Synth"), + "Traverse Town Synth Item 14": KH1LocationData("Traverse Town", 265_6414, "Synth"), + "Traverse Town Synth Item 15": KH1LocationData("Traverse Town", 265_6415, "Synth"), + "Traverse Town Synth Item 16": KH1LocationData("Traverse Town", 265_6416, "Synth"), + "Traverse Town Synth Item 17": KH1LocationData("Traverse Town", 265_6417, "Synth"), + "Traverse Town Synth Item 18": KH1LocationData("Traverse Town", 265_6418, "Synth"), + "Traverse Town Synth Item 19": KH1LocationData("Traverse Town", 265_6419, "Synth"), + "Traverse Town Synth Item 20": KH1LocationData("Traverse Town", 265_6420, "Synth"), + "Traverse Town Synth Item 21": KH1LocationData("Traverse Town", 265_6421, "Synth"), + "Traverse Town Synth Item 22": KH1LocationData("Traverse Town", 265_6422, "Synth"), + "Traverse Town Synth Item 23": KH1LocationData("Traverse Town", 265_6423, "Synth"), + "Traverse Town Synth Item 24": KH1LocationData("Traverse Town", 265_6424, "Synth"), + "Traverse Town Synth Item 25": KH1LocationData("Traverse Town", 265_6425, "Synth"), + "Traverse Town Synth Item 26": KH1LocationData("Traverse Town", 265_6426, "Synth"), + "Traverse Town Synth Item 27": KH1LocationData("Traverse Town", 265_6427, "Synth"), + "Traverse Town Synth Item 28": KH1LocationData("Traverse Town", 265_6428, "Synth"), + "Traverse Town Synth Item 29": KH1LocationData("Traverse Town", 265_6429, "Synth"), + "Traverse Town Synth Item 30": KH1LocationData("Traverse Town", 265_6430, "Synth"), + "Traverse Town Synth Item 31": KH1LocationData("Traverse Town", 265_6431, "Synth"), + "Traverse Town Synth Item 32": KH1LocationData("Traverse Town", 265_6432, "Synth"), + "Traverse Town Synth Item 33": KH1LocationData("Traverse Town", 265_6433, "Synth"), - "Traverse Town Item Shop Postcard": KH1LocationData("Traverse Town", 265_6500), - "Traverse Town 1st District Safe Postcard": KH1LocationData("Traverse Town", 265_6501), - "Traverse Town Gizmo Shop Postcard 1": KH1LocationData("Traverse Town", 265_6502), - "Traverse Town Gizmo Shop Postcard 2": KH1LocationData("Traverse Town", 265_6503), - "Traverse Town Item Workshop Postcard": KH1LocationData("Traverse Town", 265_6504), - "Traverse Town 3rd District Balcony Postcard": KH1LocationData("Traverse Town", 265_6505), - "Traverse Town Geppetto's House Postcard": KH1LocationData("Traverse Town", 265_6506), - "Halloween Town Lab Torn Page": KH1LocationData("Halloween Town", 265_6508), - "Hollow Bastion Entrance Hall Emblem Piece (Flame)": KH1LocationData("Hollow Bastion", 265_6516), - "Hollow Bastion Entrance Hall Emblem Piece (Chest)": KH1LocationData("Hollow Bastion", 265_6517), - "Hollow Bastion Entrance Hall Emblem Piece (Statue)": KH1LocationData("Hollow Bastion", 265_6518), - "Hollow Bastion Entrance Hall Emblem Piece (Fountain)": KH1LocationData("Hollow Bastion", 265_6519), - #"Traverse Town 1st District Leon Gift": KH1LocationData("Traverse Town", 265_6520), - #"Traverse Town 1st District Aerith Gift": KH1LocationData("Traverse Town", 265_6521), - "Hollow Bastion Library Speak to Belle Divine Rose": KH1LocationData("Hollow Bastion", 265_6522), - "Hollow Bastion Library Speak to Aerith Cure": KH1LocationData("Hollow Bastion", 265_6523), + "Traverse Town Item Shop Postcard": KH1LocationData("Traverse Town", 265_6500, "Static"), + "Traverse Town 1st District Safe Postcard": KH1LocationData("Traverse Town", 265_6501, "Static"), + "Traverse Town Gizmo Shop Postcard 1": KH1LocationData("Traverse Town", 265_6502, "Static"), + "Traverse Town Gizmo Shop Postcard 2": KH1LocationData("Traverse Town", 265_6503, "Static"), + "Traverse Town Item Workshop Postcard": KH1LocationData("Traverse Town", 265_6504, "Static"), + "Traverse Town 3rd District Balcony Postcard": KH1LocationData("Traverse Town", 265_6505, "Static"), + "Traverse Town Geppetto's House Postcard": KH1LocationData("Traverse Town", 265_6506, "Static", True), + "Halloween Town Lab Torn Page": KH1LocationData("Halloween Town", 265_6508, "Static"), + "Hollow Bastion Entrance Hall Emblem Piece (Flame)": KH1LocationData("Hollow Bastion", 265_6516, "Static", True), + "Hollow Bastion Entrance Hall Emblem Piece (Chest)": KH1LocationData("Hollow Bastion", 265_6517, "Static", True), + "Hollow Bastion Entrance Hall Emblem Piece (Statue)": KH1LocationData("Hollow Bastion", 265_6518, "Static", True), + "Hollow Bastion Entrance Hall Emblem Piece (Fountain)": KH1LocationData("Hollow Bastion", 265_6519, "Static", True), + "Traverse Town 1st District Leon Gift": KH1LocationData("Traverse Town", 265_6520, "Reward"), + #"Traverse Town 1st District Aerith Gift": KH1LocationData("Traverse Town", 265_6521, "Reward"), + "Hollow Bastion Library Speak to Belle Divine Rose": KH1LocationData("Hollow Bastion", 265_6522, "Reward", True), + "Hollow Bastion Library Speak to Aerith Cure": KH1LocationData("Hollow Bastion", 265_6523, "Static", True), - "Agrabah Defeat Jafar Genie Ansem's Report 1": KH1LocationData("Agrabah", 265_7018), - "Hollow Bastion Speak with Aerith Ansem's Report 2": KH1LocationData("Hollow Bastion", 265_7017), - "Atlantica Defeat Ursula II Ansem's Report 3": KH1LocationData("Atlantica", 265_7016), - "Hollow Bastion Speak with Aerith Ansem's Report 4": KH1LocationData("Hollow Bastion", 265_7015), - "Hollow Bastion Defeat Maleficent Ansem's Report 5": KH1LocationData("Hollow Bastion", 265_7014), - "Hollow Bastion Speak with Aerith Ansem's Report 6": KH1LocationData("Hollow Bastion", 265_7013), - "Halloween Town Defeat Oogie Boogie Ansem's Report 7": KH1LocationData("Halloween Town", 265_7012), - "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Olympus Coliseum", 265_7011), - "Neverland Defeat Hook Ansem's Report 9": KH1LocationData("Neverland", 265_7028), - "Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Hollow Bastion", 265_7027), - "Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Agrabah", 265_7026), - "Olympus Coliseum Defeat Sephiroth Ansem's Report 12": KH1LocationData("Olympus Coliseum", 265_7025), - "Hollow Bastion Defeat Unknown Ansem's Report 13": KH1LocationData("Hollow Bastion", 265_7024), - "Level 001": KH1LocationData("Levels", 265_8001), - "Level 002": KH1LocationData("Levels", 265_8002), - "Level 003": KH1LocationData("Levels", 265_8003), - "Level 004": KH1LocationData("Levels", 265_8004), - "Level 005": KH1LocationData("Levels", 265_8005), - "Level 006": KH1LocationData("Levels", 265_8006), - "Level 007": KH1LocationData("Levels", 265_8007), - "Level 008": KH1LocationData("Levels", 265_8008), - "Level 009": KH1LocationData("Levels", 265_8009), - "Level 010": KH1LocationData("Levels", 265_8010), - "Level 011": KH1LocationData("Levels", 265_8011), - "Level 012": KH1LocationData("Levels", 265_8012), - "Level 013": KH1LocationData("Levels", 265_8013), - "Level 014": KH1LocationData("Levels", 265_8014), - "Level 015": KH1LocationData("Levels", 265_8015), - "Level 016": KH1LocationData("Levels", 265_8016), - "Level 017": KH1LocationData("Levels", 265_8017), - "Level 018": KH1LocationData("Levels", 265_8018), - "Level 019": KH1LocationData("Levels", 265_8019), - "Level 020": KH1LocationData("Levels", 265_8020), - "Level 021": KH1LocationData("Levels", 265_8021), - "Level 022": KH1LocationData("Levels", 265_8022), - "Level 023": KH1LocationData("Levels", 265_8023), - "Level 024": KH1LocationData("Levels", 265_8024), - "Level 025": KH1LocationData("Levels", 265_8025), - "Level 026": KH1LocationData("Levels", 265_8026), - "Level 027": KH1LocationData("Levels", 265_8027), - "Level 028": KH1LocationData("Levels", 265_8028), - "Level 029": KH1LocationData("Levels", 265_8029), - "Level 030": KH1LocationData("Levels", 265_8030), - "Level 031": KH1LocationData("Levels", 265_8031), - "Level 032": KH1LocationData("Levels", 265_8032), - "Level 033": KH1LocationData("Levels", 265_8033), - "Level 034": KH1LocationData("Levels", 265_8034), - "Level 035": KH1LocationData("Levels", 265_8035), - "Level 036": KH1LocationData("Levels", 265_8036), - "Level 037": KH1LocationData("Levels", 265_8037), - "Level 038": KH1LocationData("Levels", 265_8038), - "Level 039": KH1LocationData("Levels", 265_8039), - "Level 040": KH1LocationData("Levels", 265_8040), - "Level 041": KH1LocationData("Levels", 265_8041), - "Level 042": KH1LocationData("Levels", 265_8042), - "Level 043": KH1LocationData("Levels", 265_8043), - "Level 044": KH1LocationData("Levels", 265_8044), - "Level 045": KH1LocationData("Levels", 265_8045), - "Level 046": KH1LocationData("Levels", 265_8046), - "Level 047": KH1LocationData("Levels", 265_8047), - "Level 048": KH1LocationData("Levels", 265_8048), - "Level 049": KH1LocationData("Levels", 265_8049), - "Level 050": KH1LocationData("Levels", 265_8050), - "Level 051": KH1LocationData("Levels", 265_8051), - "Level 052": KH1LocationData("Levels", 265_8052), - "Level 053": KH1LocationData("Levels", 265_8053), - "Level 054": KH1LocationData("Levels", 265_8054), - "Level 055": KH1LocationData("Levels", 265_8055), - "Level 056": KH1LocationData("Levels", 265_8056), - "Level 057": KH1LocationData("Levels", 265_8057), - "Level 058": KH1LocationData("Levels", 265_8058), - "Level 059": KH1LocationData("Levels", 265_8059), - "Level 060": KH1LocationData("Levels", 265_8060), - "Level 061": KH1LocationData("Levels", 265_8061), - "Level 062": KH1LocationData("Levels", 265_8062), - "Level 063": KH1LocationData("Levels", 265_8063), - "Level 064": KH1LocationData("Levels", 265_8064), - "Level 065": KH1LocationData("Levels", 265_8065), - "Level 066": KH1LocationData("Levels", 265_8066), - "Level 067": KH1LocationData("Levels", 265_8067), - "Level 068": KH1LocationData("Levels", 265_8068), - "Level 069": KH1LocationData("Levels", 265_8069), - "Level 070": KH1LocationData("Levels", 265_8070), - "Level 071": KH1LocationData("Levels", 265_8071), - "Level 072": KH1LocationData("Levels", 265_8072), - "Level 073": KH1LocationData("Levels", 265_8073), - "Level 074": KH1LocationData("Levels", 265_8074), - "Level 075": KH1LocationData("Levels", 265_8075), - "Level 076": KH1LocationData("Levels", 265_8076), - "Level 077": KH1LocationData("Levels", 265_8077), - "Level 078": KH1LocationData("Levels", 265_8078), - "Level 079": KH1LocationData("Levels", 265_8079), - "Level 080": KH1LocationData("Levels", 265_8080), - "Level 081": KH1LocationData("Levels", 265_8081), - "Level 082": KH1LocationData("Levels", 265_8082), - "Level 083": KH1LocationData("Levels", 265_8083), - "Level 084": KH1LocationData("Levels", 265_8084), - "Level 085": KH1LocationData("Levels", 265_8085), - "Level 086": KH1LocationData("Levels", 265_8086), - "Level 087": KH1LocationData("Levels", 265_8087), - "Level 088": KH1LocationData("Levels", 265_8088), - "Level 089": KH1LocationData("Levels", 265_8089), - "Level 090": KH1LocationData("Levels", 265_8090), - "Level 091": KH1LocationData("Levels", 265_8091), - "Level 092": KH1LocationData("Levels", 265_8092), - "Level 093": KH1LocationData("Levels", 265_8093), - "Level 094": KH1LocationData("Levels", 265_8094), - "Level 095": KH1LocationData("Levels", 265_8095), - "Level 096": KH1LocationData("Levels", 265_8096), - "Level 097": KH1LocationData("Levels", 265_8097), - "Level 098": KH1LocationData("Levels", 265_8098), - "Level 099": KH1LocationData("Levels", 265_8099), - "Level 100": KH1LocationData("Levels", 265_8100), - "Complete Phil Cup": KH1LocationData("Olympus Coliseum", 265_9001), - "Complete Phil Cup Solo": KH1LocationData("Olympus Coliseum", 265_9002), - "Complete Phil Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9003), - "Complete Pegasus Cup": KH1LocationData("Olympus Coliseum", 265_9004), - "Complete Pegasus Cup Solo": KH1LocationData("Olympus Coliseum", 265_9005), - "Complete Pegasus Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9006), - "Complete Hercules Cup": KH1LocationData("Olympus Coliseum", 265_9007), - "Complete Hercules Cup Solo": KH1LocationData("Olympus Coliseum", 265_9008), - "Complete Hercules Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9009), - "Complete Hades Cup": KH1LocationData("Olympus Coliseum", 265_9010), - "Complete Hades Cup Solo": KH1LocationData("Olympus Coliseum", 265_9011), - "Complete Hades Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9012), - "Hades Cup Defeat Cloud and Leon Event": KH1LocationData("Olympus Coliseum", 265_9013), - "Hades Cup Defeat Yuffie Event": KH1LocationData("Olympus Coliseum", 265_9014), - "Hades Cup Defeat Cerberus Event": KH1LocationData("Olympus Coliseum", 265_9015), - "Hades Cup Defeat Behemoth Event": KH1LocationData("Olympus Coliseum", 265_9016), - "Hades Cup Defeat Hades Event": KH1LocationData("Olympus Coliseum", 265_9017), - "Hercules Cup Defeat Cloud Event": KH1LocationData("Olympus Coliseum", 265_9018), - "Hercules Cup Yellow Trinity Event": KH1LocationData("Olympus Coliseum", 265_9019), - "Final Ansem": KH1LocationData("Final", 265_9999) + "Traverse Town 1st District Blue Trinity by Exit Door": KH1LocationData("Traverse Town", 265_6600, "Prize"), + "Traverse Town 3rd District Blue Trinity": KH1LocationData("Traverse Town", 265_6601, "Prize"), + "Traverse Town Magician's Study Blue Trinity": KH1LocationData("Traverse Town", 265_6602, "Prize"), + "Wonderland Lotus Forest Blue Trinity in Alcove": KH1LocationData("Wonderland", 265_6603, "Prize"), + "Wonderland Lotus Forest Blue Trinity by Moving Boulder": KH1LocationData("Wonderland", 265_6604, "Prize"), + "Agrabah Bazaar Blue Trinity": KH1LocationData("Agrabah", 265_6605, "Prize"), + "Monstro Mouth Blue Trinity": KH1LocationData("Monstro", 265_6606, "Prize", True), + "Monstro Chamber 5 Blue Trinity": KH1LocationData("Monstro", 265_6607, "Prize"), + "Hollow Bastion Great Crest Blue Trinity": KH1LocationData("Hollow Bastion", 265_6608, "Prize", True), + "Hollow Bastion Dungeon Blue Trinity": KH1LocationData("Hollow Bastion", 265_6609, "Prize", True), + "Deep Jungle Treetop Green Trinity": KH1LocationData("Deep Jungle", 265_6610, "Prize"), + "Agrabah Cave of Wonders Treasure Room Red Trinity": KH1LocationData("Agrabah", 265_6611, "Prize", True), + "Monstro Throat Blue Trinity": KH1LocationData("Monstro", 265_6612, "Prize", True), + "Wonderland Bizarre Room Examine Flower Pot": KH1LocationData("Wonderland", 265_6613, "Prize"), + "Wonderland Lotus Forest Red Flowers on the Main Path": KH1LocationData("Wonderland", 265_6614, "Prize"), + "Wonderland Lotus Forest Yellow Flowers in Middle Clearing and Through Painting": KH1LocationData("Wonderland", 265_6615, "Prize"), + "Wonderland Lotus Forest Yellow Elixir Flower Through Painting": KH1LocationData("Wonderland", 265_6616, "Prize"), + "Wonderland Lotus Forest Red Flower Raise Lily Pads": KH1LocationData("Wonderland", 265_6617, "Prize"), + "Wonderland Tea Party Garden Left Cushioned Chair": KH1LocationData("Wonderland", 265_6618, "Prize"), + "Wonderland Tea Party Garden Left Pink Chair": KH1LocationData("Wonderland", 265_6619, "Prize"), + "Wonderland Tea Party Garden Right Yellow Chair": KH1LocationData("Wonderland", 265_6620, "Prize"), + "Wonderland Tea Party Garden Left Gray Chair": KH1LocationData("Wonderland", 265_6621, "Prize"), + "Wonderland Tea Party Garden Right Brown Chair": KH1LocationData("Wonderland", 265_6622, "Prize"), + "Hollow Bastion Lift Stop from Waterway Examine Node": KH1LocationData("Hollow Bastion", 265_6623, "Prize", True), + + "Destiny Islands Seashore Capture Fish 1 (Day 2)": KH1LocationData("Destiny Islands", 265_6700, "Static"), + "Destiny Islands Seashore Capture Fish 2 (Day 2)": KH1LocationData("Destiny Islands", 265_6701, "Static"), + "Destiny Islands Seashore Capture Fish 3 (Day 2)": KH1LocationData("Destiny Islands", 265_6702, "Static"), + "Destiny Islands Seashore Gather Seagull Egg (Day 2)": KH1LocationData("Destiny Islands", 265_6703, "Static"), + "Destiny Islands Seashore Log on Riku's Island (Day 1)": KH1LocationData("Destiny Islands", 265_6704, "Static"), + "Destiny Islands Seashore Log under Bridge (Day 1)": KH1LocationData("Destiny Islands", 265_6705, "Static"), + "Destiny Islands Seashore Gather Cloth (Day 1)": KH1LocationData("Destiny Islands", 265_6706, "Static"), + "Destiny Islands Seashore Gather Rope (Day 1)": KH1LocationData("Destiny Islands", 265_6707, "Static"), + #"Destiny Islands Seashore Deliver Kairi Items (Day 1)": KH1LocationData("Destiny Islands", 265_6710, "Static"), + "Destiny Islands Secret Place Gather Mushroom (Day 2)": KH1LocationData("Destiny Islands", 265_6711, "Static"), + "Destiny Islands Cove Gather Mushroom Near Zip Line (Day 2)": KH1LocationData("Destiny Islands", 265_6712, "Static"), + "Destiny Islands Cove Gather Mushroom in Small Cave (Day 2)": KH1LocationData("Destiny Islands", 265_6713, "Static"), + "Destiny Islands Cove Talk to Kairi (Day 2)": KH1LocationData("Destiny Islands", 265_6714, "Static"), + "Destiny Islands Gather Drinking Water (Day 2)": KH1LocationData("Destiny Islands", 265_6715, "Static"), + #"Destiny Islands Cove Deliver Kairi Items (Day 2)": KH1LocationData("Destiny Islands", 265_6716, "Static"), + + "Donald Starting Accessory 1": KH1LocationData("Traverse Town", 265_6800, "Starting Accessory"), + "Donald Starting Accessory 2": KH1LocationData("Traverse Town", 265_6801, "Starting Accessory"), + "Goofy Starting Accessory 1": KH1LocationData("Traverse Town", 265_6802, "Starting Accessory"), + "Goofy Starting Accessory 2": KH1LocationData("Traverse Town", 265_6803, "Starting Accessory"), + "Tarzan Starting Accessory 1": KH1LocationData("Deep Jungle", 265_6804, "Starting Accessory"), + "Aladdin Starting Accessory 1": KH1LocationData("Agrabah", 265_6805, "Starting Accessory"), + "Aladdin Starting Accessory 2": KH1LocationData("Agrabah", 265_6806, "Starting Accessory"), + "Ariel Starting Accessory 1": KH1LocationData("Atlantica", 265_6807, "Starting Accessory"), + "Ariel Starting Accessory 2": KH1LocationData("Atlantica", 265_6808, "Starting Accessory"), + "Ariel Starting Accessory 3": KH1LocationData("Atlantica", 265_6809, "Starting Accessory"), + "Jack Starting Accessory 1": KH1LocationData("Halloween Town", 265_6810, "Starting Accessory"), + "Jack Starting Accessory 2": KH1LocationData("Halloween Town", 265_6811, "Starting Accessory"), + "Peter Pan Starting Accessory 1": KH1LocationData("Neverland", 265_6812, "Starting Accessory"), + "Peter Pan Starting Accessory 2": KH1LocationData("Neverland", 265_6813, "Starting Accessory"), + "Beast Starting Accessory 1": KH1LocationData("Hollow Bastion", 265_6814, "Starting Accessory"), + + "Agrabah Defeat Jafar Genie Ansem's Report 1": KH1LocationData("Agrabah", 265_7018, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 2": KH1LocationData("Hollow Bastion", 265_7017, "Static", True), + "Atlantica Defeat Ursula II Ansem's Report 3": KH1LocationData("Atlantica", 265_7016, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 4": KH1LocationData("Hollow Bastion", 265_7015, "Static", True), + "Hollow Bastion Defeat Maleficent Ansem's Report 5": KH1LocationData("Hollow Bastion", 265_7014, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 6": KH1LocationData("Hollow Bastion", 265_7013, "Static", True), + "Halloween Town Defeat Oogie Boogie Ansem's Report 7": KH1LocationData("Halloween Town", 265_7012, "Static", True), + "Olympus Coliseum Defeat Hades Ansem's Report 8": KH1LocationData("Olympus Coliseum", 265_7011, "Static", True), + "Neverland Defeat Hook Ansem's Report 9": KH1LocationData("Neverland", 265_7028, "Static", True), + "Hollow Bastion Speak with Aerith Ansem's Report 10": KH1LocationData("Hollow Bastion", 265_7027, "Static", True), + "Agrabah Defeat Kurt Zisa Ansem's Report 11": KH1LocationData("Agrabah", 265_7026, "Static", True), + "Olympus Coliseum Defeat Sephiroth Ansem's Report 12": KH1LocationData("Olympus Coliseum", 265_7025, "Static", True), + "Hollow Bastion Defeat Unknown Ansem's Report 13": KH1LocationData("Hollow Bastion", 265_7024, "Static", True), + #"Level 001 (Slot 1)": KH1LocationData("Levels", 265_8001, "Level Slot 1"), + "Level 002 (Slot 1)": KH1LocationData("Levels", 265_8002, "Level Slot 1"), + "Level 003 (Slot 1)": KH1LocationData("Levels", 265_8003, "Level Slot 1"), + "Level 004 (Slot 1)": KH1LocationData("Levels", 265_8004, "Level Slot 1"), + "Level 005 (Slot 1)": KH1LocationData("Levels", 265_8005, "Level Slot 1"), + "Level 006 (Slot 1)": KH1LocationData("Levels", 265_8006, "Level Slot 1"), + "Level 007 (Slot 1)": KH1LocationData("Levels", 265_8007, "Level Slot 1"), + "Level 008 (Slot 1)": KH1LocationData("Levels", 265_8008, "Level Slot 1"), + "Level 009 (Slot 1)": KH1LocationData("Levels", 265_8009, "Level Slot 1"), + "Level 010 (Slot 1)": KH1LocationData("Levels", 265_8010, "Level Slot 1"), + "Level 011 (Slot 1)": KH1LocationData("Levels", 265_8011, "Level Slot 1"), + "Level 012 (Slot 1)": KH1LocationData("Levels", 265_8012, "Level Slot 1"), + "Level 013 (Slot 1)": KH1LocationData("Levels", 265_8013, "Level Slot 1"), + "Level 014 (Slot 1)": KH1LocationData("Levels", 265_8014, "Level Slot 1"), + "Level 015 (Slot 1)": KH1LocationData("Levels", 265_8015, "Level Slot 1"), + "Level 016 (Slot 1)": KH1LocationData("Levels", 265_8016, "Level Slot 1"), + "Level 017 (Slot 1)": KH1LocationData("Levels", 265_8017, "Level Slot 1"), + "Level 018 (Slot 1)": KH1LocationData("Levels", 265_8018, "Level Slot 1"), + "Level 019 (Slot 1)": KH1LocationData("Levels", 265_8019, "Level Slot 1"), + "Level 020 (Slot 1)": KH1LocationData("Levels", 265_8020, "Level Slot 1"), + "Level 021 (Slot 1)": KH1LocationData("Levels", 265_8021, "Level Slot 1"), + "Level 022 (Slot 1)": KH1LocationData("Levels", 265_8022, "Level Slot 1"), + "Level 023 (Slot 1)": KH1LocationData("Levels", 265_8023, "Level Slot 1"), + "Level 024 (Slot 1)": KH1LocationData("Levels", 265_8024, "Level Slot 1"), + "Level 025 (Slot 1)": KH1LocationData("Levels", 265_8025, "Level Slot 1"), + "Level 026 (Slot 1)": KH1LocationData("Levels", 265_8026, "Level Slot 1"), + "Level 027 (Slot 1)": KH1LocationData("Levels", 265_8027, "Level Slot 1"), + "Level 028 (Slot 1)": KH1LocationData("Levels", 265_8028, "Level Slot 1"), + "Level 029 (Slot 1)": KH1LocationData("Levels", 265_8029, "Level Slot 1"), + "Level 030 (Slot 1)": KH1LocationData("Levels", 265_8030, "Level Slot 1"), + "Level 031 (Slot 1)": KH1LocationData("Levels", 265_8031, "Level Slot 1"), + "Level 032 (Slot 1)": KH1LocationData("Levels", 265_8032, "Level Slot 1"), + "Level 033 (Slot 1)": KH1LocationData("Levels", 265_8033, "Level Slot 1"), + "Level 034 (Slot 1)": KH1LocationData("Levels", 265_8034, "Level Slot 1"), + "Level 035 (Slot 1)": KH1LocationData("Levels", 265_8035, "Level Slot 1"), + "Level 036 (Slot 1)": KH1LocationData("Levels", 265_8036, "Level Slot 1"), + "Level 037 (Slot 1)": KH1LocationData("Levels", 265_8037, "Level Slot 1"), + "Level 038 (Slot 1)": KH1LocationData("Levels", 265_8038, "Level Slot 1"), + "Level 039 (Slot 1)": KH1LocationData("Levels", 265_8039, "Level Slot 1"), + "Level 040 (Slot 1)": KH1LocationData("Levels", 265_8040, "Level Slot 1"), + "Level 041 (Slot 1)": KH1LocationData("Levels", 265_8041, "Level Slot 1"), + "Level 042 (Slot 1)": KH1LocationData("Levels", 265_8042, "Level Slot 1"), + "Level 043 (Slot 1)": KH1LocationData("Levels", 265_8043, "Level Slot 1"), + "Level 044 (Slot 1)": KH1LocationData("Levels", 265_8044, "Level Slot 1"), + "Level 045 (Slot 1)": KH1LocationData("Levels", 265_8045, "Level Slot 1"), + "Level 046 (Slot 1)": KH1LocationData("Levels", 265_8046, "Level Slot 1"), + "Level 047 (Slot 1)": KH1LocationData("Levels", 265_8047, "Level Slot 1"), + "Level 048 (Slot 1)": KH1LocationData("Levels", 265_8048, "Level Slot 1"), + "Level 049 (Slot 1)": KH1LocationData("Levels", 265_8049, "Level Slot 1"), + "Level 050 (Slot 1)": KH1LocationData("Levels", 265_8050, "Level Slot 1"), + "Level 051 (Slot 1)": KH1LocationData("Levels", 265_8051, "Level Slot 1"), + "Level 052 (Slot 1)": KH1LocationData("Levels", 265_8052, "Level Slot 1"), + "Level 053 (Slot 1)": KH1LocationData("Levels", 265_8053, "Level Slot 1"), + "Level 054 (Slot 1)": KH1LocationData("Levels", 265_8054, "Level Slot 1"), + "Level 055 (Slot 1)": KH1LocationData("Levels", 265_8055, "Level Slot 1"), + "Level 056 (Slot 1)": KH1LocationData("Levels", 265_8056, "Level Slot 1"), + "Level 057 (Slot 1)": KH1LocationData("Levels", 265_8057, "Level Slot 1"), + "Level 058 (Slot 1)": KH1LocationData("Levels", 265_8058, "Level Slot 1"), + "Level 059 (Slot 1)": KH1LocationData("Levels", 265_8059, "Level Slot 1"), + "Level 060 (Slot 1)": KH1LocationData("Levels", 265_8060, "Level Slot 1"), + "Level 061 (Slot 1)": KH1LocationData("Levels", 265_8061, "Level Slot 1"), + "Level 062 (Slot 1)": KH1LocationData("Levels", 265_8062, "Level Slot 1"), + "Level 063 (Slot 1)": KH1LocationData("Levels", 265_8063, "Level Slot 1"), + "Level 064 (Slot 1)": KH1LocationData("Levels", 265_8064, "Level Slot 1"), + "Level 065 (Slot 1)": KH1LocationData("Levels", 265_8065, "Level Slot 1"), + "Level 066 (Slot 1)": KH1LocationData("Levels", 265_8066, "Level Slot 1"), + "Level 067 (Slot 1)": KH1LocationData("Levels", 265_8067, "Level Slot 1"), + "Level 068 (Slot 1)": KH1LocationData("Levels", 265_8068, "Level Slot 1"), + "Level 069 (Slot 1)": KH1LocationData("Levels", 265_8069, "Level Slot 1"), + "Level 070 (Slot 1)": KH1LocationData("Levels", 265_8070, "Level Slot 1"), + "Level 071 (Slot 1)": KH1LocationData("Levels", 265_8071, "Level Slot 1"), + "Level 072 (Slot 1)": KH1LocationData("Levels", 265_8072, "Level Slot 1"), + "Level 073 (Slot 1)": KH1LocationData("Levels", 265_8073, "Level Slot 1"), + "Level 074 (Slot 1)": KH1LocationData("Levels", 265_8074, "Level Slot 1"), + "Level 075 (Slot 1)": KH1LocationData("Levels", 265_8075, "Level Slot 1"), + "Level 076 (Slot 1)": KH1LocationData("Levels", 265_8076, "Level Slot 1"), + "Level 077 (Slot 1)": KH1LocationData("Levels", 265_8077, "Level Slot 1"), + "Level 078 (Slot 1)": KH1LocationData("Levels", 265_8078, "Level Slot 1"), + "Level 079 (Slot 1)": KH1LocationData("Levels", 265_8079, "Level Slot 1"), + "Level 080 (Slot 1)": KH1LocationData("Levels", 265_8080, "Level Slot 1"), + "Level 081 (Slot 1)": KH1LocationData("Levels", 265_8081, "Level Slot 1"), + "Level 082 (Slot 1)": KH1LocationData("Levels", 265_8082, "Level Slot 1"), + "Level 083 (Slot 1)": KH1LocationData("Levels", 265_8083, "Level Slot 1"), + "Level 084 (Slot 1)": KH1LocationData("Levels", 265_8084, "Level Slot 1"), + "Level 085 (Slot 1)": KH1LocationData("Levels", 265_8085, "Level Slot 1"), + "Level 086 (Slot 1)": KH1LocationData("Levels", 265_8086, "Level Slot 1"), + "Level 087 (Slot 1)": KH1LocationData("Levels", 265_8087, "Level Slot 1"), + "Level 088 (Slot 1)": KH1LocationData("Levels", 265_8088, "Level Slot 1"), + "Level 089 (Slot 1)": KH1LocationData("Levels", 265_8089, "Level Slot 1"), + "Level 090 (Slot 1)": KH1LocationData("Levels", 265_8090, "Level Slot 1"), + "Level 091 (Slot 1)": KH1LocationData("Levels", 265_8091, "Level Slot 1"), + "Level 092 (Slot 1)": KH1LocationData("Levels", 265_8092, "Level Slot 1"), + "Level 093 (Slot 1)": KH1LocationData("Levels", 265_8093, "Level Slot 1"), + "Level 094 (Slot 1)": KH1LocationData("Levels", 265_8094, "Level Slot 1"), + "Level 095 (Slot 1)": KH1LocationData("Levels", 265_8095, "Level Slot 1"), + "Level 096 (Slot 1)": KH1LocationData("Levels", 265_8096, "Level Slot 1"), + "Level 097 (Slot 1)": KH1LocationData("Levels", 265_8097, "Level Slot 1"), + "Level 098 (Slot 1)": KH1LocationData("Levels", 265_8098, "Level Slot 1"), + "Level 099 (Slot 1)": KH1LocationData("Levels", 265_8099, "Level Slot 1"), + "Level 100 (Slot 1)": KH1LocationData("Levels", 265_8100, "Level Slot 1"), + #"Level 001 (Slot 2)": KH1LocationData("Levels", 265_8101, "Level Slot 2"), + "Level 002 (Slot 2)": KH1LocationData("Levels", 265_8102, "Level Slot 2"), + "Level 003 (Slot 2)": KH1LocationData("Levels", 265_8103, "Level Slot 2"), + "Level 004 (Slot 2)": KH1LocationData("Levels", 265_8104, "Level Slot 2"), + "Level 005 (Slot 2)": KH1LocationData("Levels", 265_8105, "Level Slot 2"), + "Level 006 (Slot 2)": KH1LocationData("Levels", 265_8106, "Level Slot 2"), + "Level 007 (Slot 2)": KH1LocationData("Levels", 265_8107, "Level Slot 2"), + "Level 008 (Slot 2)": KH1LocationData("Levels", 265_8108, "Level Slot 2"), + "Level 009 (Slot 2)": KH1LocationData("Levels", 265_8109, "Level Slot 2"), + "Level 010 (Slot 2)": KH1LocationData("Levels", 265_8110, "Level Slot 2"), + "Level 011 (Slot 2)": KH1LocationData("Levels", 265_8111, "Level Slot 2"), + "Level 012 (Slot 2)": KH1LocationData("Levels", 265_8112, "Level Slot 2"), + "Level 013 (Slot 2)": KH1LocationData("Levels", 265_8113, "Level Slot 2"), + "Level 014 (Slot 2)": KH1LocationData("Levels", 265_8114, "Level Slot 2"), + "Level 015 (Slot 2)": KH1LocationData("Levels", 265_8115, "Level Slot 2"), + "Level 016 (Slot 2)": KH1LocationData("Levels", 265_8116, "Level Slot 2"), + "Level 017 (Slot 2)": KH1LocationData("Levels", 265_8117, "Level Slot 2"), + "Level 018 (Slot 2)": KH1LocationData("Levels", 265_8118, "Level Slot 2"), + "Level 019 (Slot 2)": KH1LocationData("Levels", 265_8119, "Level Slot 2"), + "Level 020 (Slot 2)": KH1LocationData("Levels", 265_8120, "Level Slot 2"), + "Level 021 (Slot 2)": KH1LocationData("Levels", 265_8121, "Level Slot 2"), + "Level 022 (Slot 2)": KH1LocationData("Levels", 265_8122, "Level Slot 2"), + "Level 023 (Slot 2)": KH1LocationData("Levels", 265_8123, "Level Slot 2"), + "Level 024 (Slot 2)": KH1LocationData("Levels", 265_8124, "Level Slot 2"), + "Level 025 (Slot 2)": KH1LocationData("Levels", 265_8125, "Level Slot 2"), + "Level 026 (Slot 2)": KH1LocationData("Levels", 265_8126, "Level Slot 2"), + "Level 027 (Slot 2)": KH1LocationData("Levels", 265_8127, "Level Slot 2"), + "Level 028 (Slot 2)": KH1LocationData("Levels", 265_8128, "Level Slot 2"), + "Level 029 (Slot 2)": KH1LocationData("Levels", 265_8129, "Level Slot 2"), + "Level 030 (Slot 2)": KH1LocationData("Levels", 265_8130, "Level Slot 2"), + "Level 031 (Slot 2)": KH1LocationData("Levels", 265_8131, "Level Slot 2"), + "Level 032 (Slot 2)": KH1LocationData("Levels", 265_8132, "Level Slot 2"), + "Level 033 (Slot 2)": KH1LocationData("Levels", 265_8133, "Level Slot 2"), + "Level 034 (Slot 2)": KH1LocationData("Levels", 265_8134, "Level Slot 2"), + "Level 035 (Slot 2)": KH1LocationData("Levels", 265_8135, "Level Slot 2"), + "Level 036 (Slot 2)": KH1LocationData("Levels", 265_8136, "Level Slot 2"), + "Level 037 (Slot 2)": KH1LocationData("Levels", 265_8137, "Level Slot 2"), + "Level 038 (Slot 2)": KH1LocationData("Levels", 265_8138, "Level Slot 2"), + "Level 039 (Slot 2)": KH1LocationData("Levels", 265_8139, "Level Slot 2"), + "Level 040 (Slot 2)": KH1LocationData("Levels", 265_8140, "Level Slot 2"), + "Level 041 (Slot 2)": KH1LocationData("Levels", 265_8141, "Level Slot 2"), + "Level 042 (Slot 2)": KH1LocationData("Levels", 265_8142, "Level Slot 2"), + "Level 043 (Slot 2)": KH1LocationData("Levels", 265_8143, "Level Slot 2"), + "Level 044 (Slot 2)": KH1LocationData("Levels", 265_8144, "Level Slot 2"), + "Level 045 (Slot 2)": KH1LocationData("Levels", 265_8145, "Level Slot 2"), + "Level 046 (Slot 2)": KH1LocationData("Levels", 265_8146, "Level Slot 2"), + "Level 047 (Slot 2)": KH1LocationData("Levels", 265_8147, "Level Slot 2"), + "Level 048 (Slot 2)": KH1LocationData("Levels", 265_8148, "Level Slot 2"), + "Level 049 (Slot 2)": KH1LocationData("Levels", 265_8149, "Level Slot 2"), + "Level 050 (Slot 2)": KH1LocationData("Levels", 265_8150, "Level Slot 2"), + "Level 051 (Slot 2)": KH1LocationData("Levels", 265_8151, "Level Slot 2"), + "Level 052 (Slot 2)": KH1LocationData("Levels", 265_8152, "Level Slot 2"), + "Level 053 (Slot 2)": KH1LocationData("Levels", 265_8153, "Level Slot 2"), + "Level 054 (Slot 2)": KH1LocationData("Levels", 265_8154, "Level Slot 2"), + "Level 055 (Slot 2)": KH1LocationData("Levels", 265_8155, "Level Slot 2"), + "Level 056 (Slot 2)": KH1LocationData("Levels", 265_8156, "Level Slot 2"), + "Level 057 (Slot 2)": KH1LocationData("Levels", 265_8157, "Level Slot 2"), + "Level 058 (Slot 2)": KH1LocationData("Levels", 265_8158, "Level Slot 2"), + "Level 059 (Slot 2)": KH1LocationData("Levels", 265_8159, "Level Slot 2"), + "Level 060 (Slot 2)": KH1LocationData("Levels", 265_8160, "Level Slot 2"), + "Level 061 (Slot 2)": KH1LocationData("Levels", 265_8161, "Level Slot 2"), + "Level 062 (Slot 2)": KH1LocationData("Levels", 265_8162, "Level Slot 2"), + "Level 063 (Slot 2)": KH1LocationData("Levels", 265_8163, "Level Slot 2"), + "Level 064 (Slot 2)": KH1LocationData("Levels", 265_8164, "Level Slot 2"), + "Level 065 (Slot 2)": KH1LocationData("Levels", 265_8165, "Level Slot 2"), + "Level 066 (Slot 2)": KH1LocationData("Levels", 265_8166, "Level Slot 2"), + "Level 067 (Slot 2)": KH1LocationData("Levels", 265_8167, "Level Slot 2"), + "Level 068 (Slot 2)": KH1LocationData("Levels", 265_8168, "Level Slot 2"), + "Level 069 (Slot 2)": KH1LocationData("Levels", 265_8169, "Level Slot 2"), + "Level 070 (Slot 2)": KH1LocationData("Levels", 265_8170, "Level Slot 2"), + "Level 071 (Slot 2)": KH1LocationData("Levels", 265_8171, "Level Slot 2"), + "Level 072 (Slot 2)": KH1LocationData("Levels", 265_8172, "Level Slot 2"), + "Level 073 (Slot 2)": KH1LocationData("Levels", 265_8173, "Level Slot 2"), + "Level 074 (Slot 2)": KH1LocationData("Levels", 265_8174, "Level Slot 2"), + "Level 075 (Slot 2)": KH1LocationData("Levels", 265_8175, "Level Slot 2"), + "Level 076 (Slot 2)": KH1LocationData("Levels", 265_8176, "Level Slot 2"), + "Level 077 (Slot 2)": KH1LocationData("Levels", 265_8177, "Level Slot 2"), + "Level 078 (Slot 2)": KH1LocationData("Levels", 265_8178, "Level Slot 2"), + "Level 079 (Slot 2)": KH1LocationData("Levels", 265_8179, "Level Slot 2"), + "Level 080 (Slot 2)": KH1LocationData("Levels", 265_8180, "Level Slot 2"), + "Level 081 (Slot 2)": KH1LocationData("Levels", 265_8181, "Level Slot 2"), + "Level 082 (Slot 2)": KH1LocationData("Levels", 265_8182, "Level Slot 2"), + "Level 083 (Slot 2)": KH1LocationData("Levels", 265_8183, "Level Slot 2"), + "Level 084 (Slot 2)": KH1LocationData("Levels", 265_8184, "Level Slot 2"), + "Level 085 (Slot 2)": KH1LocationData("Levels", 265_8185, "Level Slot 2"), + "Level 086 (Slot 2)": KH1LocationData("Levels", 265_8186, "Level Slot 2"), + "Level 087 (Slot 2)": KH1LocationData("Levels", 265_8187, "Level Slot 2"), + "Level 088 (Slot 2)": KH1LocationData("Levels", 265_8188, "Level Slot 2"), + "Level 089 (Slot 2)": KH1LocationData("Levels", 265_8189, "Level Slot 2"), + "Level 090 (Slot 2)": KH1LocationData("Levels", 265_8190, "Level Slot 2"), + "Level 091 (Slot 2)": KH1LocationData("Levels", 265_8191, "Level Slot 2"), + "Level 092 (Slot 2)": KH1LocationData("Levels", 265_8192, "Level Slot 2"), + "Level 093 (Slot 2)": KH1LocationData("Levels", 265_8193, "Level Slot 2"), + "Level 094 (Slot 2)": KH1LocationData("Levels", 265_8194, "Level Slot 2"), + "Level 095 (Slot 2)": KH1LocationData("Levels", 265_8195, "Level Slot 2"), + "Level 096 (Slot 2)": KH1LocationData("Levels", 265_8196, "Level Slot 2"), + "Level 097 (Slot 2)": KH1LocationData("Levels", 265_8197, "Level Slot 2"), + "Level 098 (Slot 2)": KH1LocationData("Levels", 265_8198, "Level Slot 2"), + "Level 099 (Slot 2)": KH1LocationData("Levels", 265_8199, "Level Slot 2"), + "Level 100 (Slot 2)": KH1LocationData("Levels", 265_8200, "Level Slot 2"), + "Complete Phil Cup": KH1LocationData("Olympus Coliseum", 265_9001, "Static", True), + "Complete Phil Cup Solo": KH1LocationData("Olympus Coliseum", 265_9002, "Reward", True), + "Complete Phil Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9003, "Reward", True), + "Complete Pegasus Cup": KH1LocationData("Olympus Coliseum", 265_9004, "Reward", True), + "Complete Pegasus Cup Solo": KH1LocationData("Olympus Coliseum", 265_9005, "Reward", True), + "Complete Pegasus Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9006, "Reward", True), + "Complete Hercules Cup": KH1LocationData("Olympus Coliseum", 265_9007, "Reward", True), + "Complete Hercules Cup Solo": KH1LocationData("Olympus Coliseum", 265_9008, "Reward", True), + "Complete Hercules Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9009, "Reward", True), + "Complete Hades Cup": KH1LocationData("Olympus Coliseum", 265_9010, "Reward", True), + "Complete Hades Cup Solo": KH1LocationData("Olympus Coliseum", 265_9011, "Reward", True), + "Complete Hades Cup Time Trial": KH1LocationData("Olympus Coliseum", 265_9012, "Reward", True), + "Hades Cup Defeat Cloud and Leon Event": KH1LocationData("Olympus Coliseum", 265_9013, "Reward", True), + "Hades Cup Defeat Yuffie Event": KH1LocationData("Olympus Coliseum", 265_9014, "Reward", True), + "Hades Cup Defeat Cerberus Event": KH1LocationData("Olympus Coliseum", 265_9015, "Static", True), + "Hades Cup Defeat Behemoth Event": KH1LocationData("Olympus Coliseum", 265_9016, "Static", True), + "Hades Cup Defeat Hades Event": KH1LocationData("Olympus Coliseum", 265_9017, "Static", True), + "Hercules Cup Defeat Cloud Event": KH1LocationData("Olympus Coliseum", 265_9018, "Reward", True), + "Hercules Cup Yellow Trinity Event": KH1LocationData("Olympus Coliseum", 265_9019, "Static", True) } -event_location_table: Dict[str, KH1LocationData] = {} +event_location_table: Dict[str, KH1LocationData] = { + "Final Ansem": KH1LocationData("Homecoming", 265_9999, "None", True) +} lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in location_table.items() if data.code} diff --git a/worlds/kh1/Options.py b/worlds/kh1/Options.py index 63732f61b2..879ea4c331 100644 --- a/worlds/kh1/Options.py +++ b/worlds/kh1/Options.py @@ -6,8 +6,9 @@ class StrengthIncrease(Range): """ Determines the number of Strength Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "STR Increases" range_start = 0 @@ -18,8 +19,9 @@ class DefenseIncrease(Range): """ Determines the number of Defense Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "DEF Increases" range_start = 0 @@ -30,8 +32,9 @@ class HPIncrease(Range): """ Determines the number of HP Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "HP Increases" range_start = 0 @@ -42,8 +45,9 @@ class APIncrease(Range): """ Determines the number of AP Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "AP Increases" range_start = 0 @@ -54,8 +58,9 @@ class MPIncrease(Range): """ Determines the number of MP Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "MP Increases" range_start = 0 @@ -66,8 +71,9 @@ class AccessorySlotIncrease(Range): """ Determines the number of Accessory Slot Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "Accessory Slot Increases" range_start = 0 @@ -78,8 +84,9 @@ class ItemSlotIncrease(Range): """ Determines the number of Item Slot Increases to add to the multiworld. - The randomizer will add all stat ups defined here into a pool and choose up to 100 to add to the multiworld. - Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 100 total) are chosen at random. + The randomizer will add all stat ups defined here into a pool and choose up to 99 to add to the multiworld. + + Accessory Slot Increases and Item Slot Increases are prioritized first, then the remaining items (up to 99 total) are chosen at random. """ display_name = "Item Slot Increases" range_start = 0 @@ -104,29 +111,45 @@ class SuperBosses(Toggle): """ display_name = "Super Bosses" -class Cups(Toggle): +class Cups(Choice): """ - Toggle whether to include checks behind completing Phil, Pegasus, Hercules, or Hades cups. - Please note that the cup items will still appear in the multiworld even if toggled off, as they are required to challenge Sephiroth. + Determines which cups have their locations added to the multiworld. + + Please note that the cup items will still appear in the multiworld even if set to off, as they are required to challenge Sephiroth. + + Off: All cup locations are removed + + Cups: Phil, Pegasus, and Hercules cups are included + + Hades Cup: Hades Cup is included in addition to Phil, Pegasus, and Hercules cups. If Super Bosses are enabled, then Ice Titan is included """ display_name = "Cups" + option_off = 0 + option_cups = 1 + option_hades_cup = 2 + default = 0 -class Goal(Choice): +class FinalRestDoorKey(Choice): """ - Determines when victory is achieved in your playthrough. + Determines what grants the player the Final Rest Door Key. Sephiroth: Defeat Sephiroth + Unknown: Defeat Unknown - Postcards: Turn in all 10 postcards in Traverse Town + + Postcards: Turn in an amount of postcards in Traverse Town + Final Ansem: Enter End of the World and defeat Ansem as normal - Puppies: Rescue and return all 99 puppies in Traverse Town + + Puppies: Rescue and return an amount of puppies in Traverse Town + Final Rest: Open the chest in End of the World Final Rest """ - display_name = "Goal" + display_name = "Final Rest Door Key" option_sephiroth = 0 option_unknown = 1 option_postcards = 2 - option_final_ansem = 3 + option_lucky_emblems = 3 option_puppies = 4 option_final_rest = 5 default = 3 @@ -135,89 +158,115 @@ class EndoftheWorldUnlock(Choice): """Determines how End of the World is unlocked. Item: You can receive an item called "End of the World" which unlocks the world - Reports: A certain amount of reports are required to unlock End of the World, which is defined in your options""" + + Lucky Emblems: A certain amount of lucky emblems are required to unlock End of the World, which is defined in your options""" display_name = "End of the World Unlock" option_item = 0 - option_reports = 1 + option_lucky_emblems = 1 default = 1 -class FinalRestDoor(Choice): - """Determines what conditions need to be met to manifest the door in Final Rest, allowing the player to challenge Ansem. +class RequiredPostcards(Range): + """ + If "Final Rest Door Key" is set to "Postcards", defines how many postcards are required. + """ + display_name = "Required Postcards" + default = 8 + range_start = 1 + range_end = 10 + +class RequiredPuppies(Choice): + """ + If "Final Rest Door Key" is set to "Puppies", defines how many puppies are required. + """ + display_name = "Required Puppies" + default = 80 + option_10 = 10 + option_20 = 20 + option_30 = 30 + option_40 = 40 + option_50 = 50 + option_60 = 60 + option_70 = 70 + option_80 = 80 + option_90 = 90 + option_99 = 99 + +class PuppyValue(Range): + """ + Determines how many dalmatian puppies are given when a puppy item is found. + """ + display_name = "Puppy Value" + default = 3 + range_start = 1 + range_end = 99 + +class RandomizePuppies(DefaultOnToggle): + """ + If OFF, the "Puppy" item is worth 3 puppies and puppies are placed in vanilla locations. - Reports: A certain number of Ansem's Reports are required, determined by the "Reports to Open Final Rest Door" option - Puppies: Having all 99 puppies is required - Postcards: Turning in all 10 postcards is required - Superbosses: Defeating Sephiroth, Unknown, Kurt Zisa, and Phantom are required + If ON, the "Puppy" item is worth an amount of puppies defined by "Puppy Value", and are shuffled randomly. """ - display_name = "Final Rest Door" - option_reports = 0 - option_puppies = 1 - option_postcards = 2 - option_superbosses = 3 - -class Puppies(Choice): - """ - Determines how dalmatian puppies are shuffled into the pool. - Full: All puppies are in one location - Triplets: Puppies are found in triplets just as they are in the base game - Individual: One puppy can be found per location - """ - display_name = "Puppies" - option_full = 0 - option_triplets = 1 - option_individual = 2 - default = 1 + display_name = "Randomize Puppies" class EXPMultiplier(NamedRange): """ Determines the multiplier to apply to EXP gained. """ display_name = "EXP Multiplier" - default = 16 - range_start = default // 4 + default = 16 * 4 + range_start = 16 // 4 range_end = 128 special_range_names = { - "0.25x": int(default // 4), - "0.5x": int(default // 2), - "1x": default, - "2x": default * 2, - "3x": default * 3, - "4x": default * 4, - "8x": default * 8, + "0.25x": int(16 // 4), + "0.5x": int(16 // 2), + "1x": 16, + "2x": 16 * 2, + "3x": 16 * 3, + "4x": 16 * 4, + "8x": 16 * 8, } -class RequiredReportsEotW(Range): +class RequiredLuckyEmblemsEotW(Range): """ - If End of the World Unlock is set to "Reports", determines the number of Ansem's Reports required to open End of the World. + If End of the World Unlock is set to "Lucky Emblems", determines the number of Lucky Emblems required. """ - display_name = "Reports to Open End of the World" - default = 4 + display_name = "Lucky Emblems to Open End of the World" + default = 7 range_start = 0 - range_end = 13 + range_end = 20 -class RequiredReportsDoor(Range): +class RequiredLuckyEmblemsDoor(Range): """ - If Final Rest Door is set to "Reports", determines the number of Ansem's Reports required to manifest the door in Final Rest to challenge Ansem. + If Final Rest Door Key is set to "Lucky Emblems", determines the number of Lucky Emblems required. """ - display_name = "Reports to Open Final Rest Door" - default = 4 + display_name = "Lucky Emblems to Open Final Rest Door" + default = 10 range_start = 0 - range_end = 13 + range_end = 20 -class ReportsInPool(Range): +class LuckyEmblemsInPool(Range): """ - Determines the number of Ansem's Reports in the item pool. + Determines the number of Lucky Emblems in the item pool. """ - display_name = "Reports in Pool" - default = 4 + display_name = "Lucky Emblems in Pool" + default = 13 range_start = 0 - range_end = 13 + range_end = 20 -class RandomizeKeybladeStats(DefaultOnToggle): +class KeybladeStats(Choice): """ Determines whether Keyblade stats should be randomized. + + Randomize: Randomly generates stats for each keyblade between the defined minimums and maximums. + + Shuffle: Shuffles the stats of the vanilla keyblades amongst each other. + + Vanilla: Keyblade stats are unchanged. """ - display_name = "Randomize Keyblade Stats" + display_name = "Keyblade Stats" + option_randomize = 0 + option_shuffle = 1 + option_vanilla = 2 class KeybladeMinStrength(Range): """ @@ -237,6 +286,60 @@ class KeybladeMaxStrength(Range): range_start = 0 range_end = 20 +class KeybladeMinCritRateBonus(Range): + """ + Determines the minimum Crit Rate bonus a keyblade can have. + """ + display_name = "Keyblade Minimum Crit Rate Bonus" + default = 0 + range_start = 0 + range_end = 200 + +class KeybladeMaxCritRateBonus(Range): + """ + Determines the maximum Crit Rate bonus a keyblade can have. + """ + display_name = "Keyblade Maximum Crit Rate Bonus" + default = 200 + range_start = 0 + range_end = 200 + +class KeybladeMinCritSTRBonus(Range): + """ + Determines the minimum Crit STR bonus a keyblade can have. + """ + display_name = "Keyblade Minimum Crit Rate Bonus" + default = 0 + range_start = 0 + range_end = 16 + +class KeybladeMaxCritSTRBonus(Range): + """ + Determines the maximum Crit STR bonus a keyblade can have. + """ + display_name = "Keyblade Maximum Crit Rate Bonus" + default = 16 + range_start = 0 + range_end = 16 + +class KeybladeMinRecoil(Range): + """ + Determines the minimum recoil a keyblade can have. + """ + display_name = "Keyblade Minimum Recoil" + default = 1 + range_start = 1 + range_end = 90 + +class KeybladeMaxRecoil(Range): + """ + Determines the maximum recoil a keyblade can have. + """ + display_name = "Keyblade Maximum Recoil" + default = 90 + range_start = 1 + range_end = 90 + class KeybladeMinMP(Range): """ Determines the minimum MP bonus a keyblade can have. @@ -260,75 +363,113 @@ class LevelChecks(Range): Determines the maximum level for which checks can be obtained. """ display_name = "Level Checks" - default = 100 + default = 99 range_start = 0 - range_end = 100 + range_end = 99 class ForceStatsOnLevels(NamedRange): """ If this value is less than the value for Level Checks, this determines the minimum level from which only stat ups are obtained at level up locations. - For example, if you want to be able to find any multiworld item from levels 1-50, then just stat ups for levels 51-100, set this value to 51. + + For example, if you want to be able to find any multiworld item from levels 2-50, then just stat ups for levels 51-100, set this value to 51. """ display_name = "Force Stats on Level Starting From" - default = 1 - range_start = 1 + default = 2 + range_start = 2 range_end = 101 special_range_names = { "none": 101, "multiworld-to-level-50": 51, - "all": 1 + "all": 2 } class BadStartingWeapons(Toggle): """ - Forces Kingdom Key, Dream Sword, Dream Shield, and Dream Staff to have bad stats. + Forces Kingdom Key, Dream Sword, Dream Shield, and Dream Staff to have vanilla stats. """ display_name = "Bad Starting Weapons" +class DeathLink(Choice): + """ + If Sora is KO'ed, the other players with "Death Link" on will also be KO'ed. + The opposite is also true. + """ + display_name = "Death Link" + option_off = 0 + option_toggle = 1 + option_on = 2 + default = 0 + class DonaldDeathLink(Toggle): """ - If Donald is KO'ed, so is Sora. If Death Link is toggled on in your client, this will send a death to everyone. + If Donald is KO'ed, so is Sora. If Death Link is toggled on in your client, this will send a death to everyone who enabled death link. """ display_name = "Donald Death Link" class GoofyDeathLink(Toggle): """ - If Goofy is KO'ed, so is Sora. If Death Link is toggled on in your client, this will send a death to everyone. + If Goofy is KO'ed, so is Sora. If Death Link is toggled on in your client, this will send a death to everyone who enabled death link. """ display_name = "Goofy Death Link" class KeybladesUnlockChests(Toggle): """ If toggled on, the player is required to have a certain keyblade to open chests in certain worlds. + TT - Lionheart + WL - Lady Luck + OC - Olympia + DJ - Jungle King + AG - Three Wishes + MS - Wishing Star + HT - Pumpkinhead + NL - Fairy Harp + HB - Divine Rose + EotW - Oblivion - HAW - Oathkeeper + + HAW - Spellbinder + + DI - Oathkeeper Note: Does not apply to Atlantica, the emblem and carousel chests in Hollow Bastion, or the Aero chest in Neverland currently. """ display_name = "Keyblades Unlock Chests" -class InteractInBattle(Toggle): +class InteractInBattle(DefaultOnToggle): """ Allow Sora to talk to people, examine objects, and open chests in battle. """ display_name = "Interact in Battle" -class AdvancedLogic(Toggle): +class LogicDifficulty(Choice): """ - If on, logic may expect you to do advanced skips like using Combo Master, Dumbo, and other unusual methods to reach locations. - """ - display_name = "Advanced Logic" + Determines what the randomizer logic may expect you to do to reach certain locations. -class ExtraSharedAbilities(Toggle): + Beginner: Logic only expects what would be the natural solution in vanilla gameplay or similar, as well as a guarantee of tools for boss fights. + + Normal: Logic expects some clever use of abilities, exploration of options, and competent combat ability; generally does not require advanced knowledge. + + Proud: Logic expects advanced knowledge of tricks and obscure interactions, such as using Combo Master, Dumbo, and other unusual methods to reach locations. + + Minimal: Logic expects the bare minimum to get to locations; may require extensive grinding, beating fights with no tools, and performing very difficult or tedious tricks. + """ + display_name = "Logic Difficulty" + option_beginner = 0 + option_normal = 5 + option_proud = 10 + option_minimal = 15 + default = 5 + +class ExtraSharedAbilities(DefaultOnToggle): """ If on, adds extra shared abilities to the pool. These can stack, so multiple high jumps make you jump higher and multiple glides make you superglide faster. """ @@ -340,51 +481,361 @@ class EXPZeroInPool(Toggle): """ display_name = "EXP Zero in Pool" -class VanillaEmblemPieces(DefaultOnToggle): +class RandomizeEmblemPieces(Toggle): """ - If on, the Hollow Bastion emblem pieces are in their vanilla locations. + If off, the Hollow Bastion emblem pieces are in their vanilla locations. """ - display_name = "Vanilla Emblem Pieces" + display_name = "Randomize Emblem Pieces" + +class RandomizePostcards(Choice): + """ + Determines how Postcards are randomized + + All: All Postcards are randomized + + Chests: Only the 3 Postcards in chests are randomized + + Vanilla: Postcards are in their original location + """ + display_name = "Randomize Postcards" + option_all = 0 + option_chests = 1 + option_vanilla = 2 + +class JungleSlider(Toggle): + """ + Determines whether checks are behind the Jungle Slider minigame. + """ + display_name = "Jungle Slider" class StartingWorlds(Range): """ - Number of random worlds to start with in addition to Traverse Town, which is always available. Will only consider Atlantica if toggled, and will only consider End of the World if its unlock is set to "Item". + Number of random worlds to start with in addition to Traverse Town, which is always available. + + Will only consider Atlantica if toggled, and will only consider End of the World if its unlock is set to "Item". + + These are given by the server, and are received after connection. """ display_name = "Starting Worlds" - default = 0 + default = 4 range_start = 0 range_end = 10 + +class StartingTools(DefaultOnToggle): + """ + Determines whether you start with Scan and Dodge Roll. + + These are given by the server, and are received after connection. + """ + display_name = "Starting Tools" + +class RemoteItems(Choice): + """ + Determines if items can be placed on locations in your own world in such a way that will force them to be remote items. + + Off: When your items are placed in your world, they can only be placed in locations that they can be acquired without server connection (stats on levels, items in chests, etc). + + Allow: When your items are placed in your world, items that normally can't be placed in a location in-game are simply made remote (abilities on static events, etc). + + Full: All items are remote. Use this when doing something like a co-op seed. + """ + display_name = "Remote Items" + option_off = 0 + option_allow = 1 + option_full = 2 + default = 0 + +class Slot2LevelChecks(Range): + """ + Determines how many levels have an additional item. + + If Remote Items is OFF, these checks will only contain abilities or items for other players. + """ + display_name = "Slot 2 Level Checks" + default = 0 + range_start = 0 + range_end = 33 + +class ShortenGoMode(DefaultOnToggle): + """ + If on, the player warps to the final cutscene after defeating Ansem 1 > Darkside > Ansem 2, skipping World of Chaos. + """ + display_name = "Shorten Go Mode" + +class DestinyIslands(Toggle): + """ + If on, Adds a Destiny Islands item and a number of Raft Materials items to the pool. + + When "Destiny Islands" is found, Traverse Town will have an additional place to land - Seashore. + + "Raft Materials" allow progress into Day 2 and to Homecoming. The amount is defined in Day 2 Materials and Homecoming Materials. + """ + display_name = "Destiny Islands" + +class MythrilInPool(Range): + """ + Determines how much Mythril, one of the two synthesis items, is in the item pool. + + You need 16 to synth every recipe that requires it. + """ + display_name = "Mythril In Pool" + default = 20 + range_start = 16 + range_end = 30 + +class OrichalcumInPool(Range): + """ + Determines how much Orichalcum, one of the two synthesis items, is in the item pool. + + You need 17 to synth every recipe that requires it. + """ + display_name = "Mythril In Pool" + default = 20 + range_start = 17 + range_end = 30 + +class MythrilPrice(Range): + """ + Determines the cost of Mythril in each shop. + """ + display_name = "Mythril Price" + default = 500 + range_start = 100 + range_end = 5000 + +class OrichalcumPrice(Range): + """ + Determines the cost of Orichalcum in each shop. + """ + display_name = "Orichalcum Price" + default = 500 + range_start = 100 + range_end = 5000 + +class OneHP(Toggle): + """ + If on, forces Sora's max HP to 1 and removes the low health warning sound. + """ + display_name = "One HP" + +class FourByThree(Toggle): + """ + If on, changes the aspect ratio to 4 by 3. + """ + display_name = "4 by 3" + +class AutoAttack(Toggle): + """ + If on, you can combo by holding confirm. + """ + display_name = "Auto Attack" + +class BeepHack(Toggle): + """ + If on, removes low health warning sound. Works up to max health of 41. + """ + display_name = "Beep Hack" + +class ConsistentFinishers(Toggle): + """ + If on, 30% chance finishers are now 100% chance. + """ + display_name = "Consistent Finishers" + +class EarlySkip(DefaultOnToggle): + """ + If on, allows skipping cutscenes immediately that normally take time to be able to skip. + """ + display_name = "Early Skip" + +class FastCamera(Toggle): + """ + If on, speeds up camera movement and camera centering. + """ + display_name = "Fast Camera" + +class FasterAnimations(DefaultOnToggle): + """ + If on, speeds up animations during which you can't play. + """ + display_name = "Faster Animations" + +class Unlock0Volume(Toggle): + """ + If on, volume 1 mutes the audio channel. + """ + display_name = "Unlock 0 Volume" + +class Unskippable(DefaultOnToggle): + """ + If on, makes unskippable cutscenes skippable. + """ + display_name = "Unskippable" + +class AutoSave(DefaultOnToggle): + """ + If on, enables auto saving. + + Press L1+L2+R1+R2+D-Pad Left to instantly load continue state. + + Press L1+L2+R1+R2+D-Pad Right to instantly load autosave. + """ + display_name = "AutoSave" + +class WarpAnywhere(Toggle): + """ + If on, enables the player to warp at any time, even when not at a save point. + + Press L1+L2+R2+Select to open the Save/Warp menu at any time. + """ + display_name = "WarpAnywhere" + +class RandomizePartyMemberStartingAccessories(DefaultOnToggle): + """ + If on, the 10 accessories that some party members (Aladdin, Ariel, Jack, Peter Pan, Beast) start with are randomized. + + 10 random accessories will be distributed amongst any party member aside from Sora in their starting equipment. + """ + display_name = "Randomize Party Member Starting Accessories" + +class MaxLevelForSlot2LevelChecks(Range): + """ + Determines the max level for slot 2 level checks. + """ + display_name = "Max Level for Slot 2 Level Checks" + default = 50 + range_start = 2 + range_end = 100 + +class RandomizeAPCosts(Choice): + """ + Off: No randomization + Shuffle: Ability AP Costs will be shuffled amongst themselves. + + Randomize: Ability AP Costs will be randomized to the specified max and min. + + Distribute: Ability AP Costs will totalled and re-distributed randomly between the specified max and min. + """ + display_name = "Randomize AP Costs" + option_off = 0 + option_shuffle = 1 + option_randomize = 2 + option_distribute = 3 + default = 0 + +class MaxAPCost(Range): + """ + If Randomize AP Costs is set to Randomize or Distribute, this defined the max AP cost an ability can have. + """ + display_name = "Max AP Cost" + default = 5 + range_start = 4 + range_end = 9 + +class MinAPCost(Range): + """ + If Randomize AP Costs is set to Randomize or Distribute, this defined the min AP cost an ability can have. + """ + display_name = "Min AP Cost" + default = 0 + range_start = 0 + range_end = 2 + +class Day2Materials(Range): + """ + The amount of Raft Materials required to access Day 2. + """ + display_name = "Day 2 Materials" + default = 4 + range_start = 0 + range_end = 20 + +class HomecomingMaterials(Range): + """ + The amount of Raft Materials required to access Homecoming. + """ + display_name = "Homecoming Materials" + default = 10 + range_start = 0 + range_end = 20 + +class MaterialsInPool(Range): + """ + The amount of Raft Materials required to access Homecoming. + """ + display_name = "Materials in Pool" + default = 16 + range_start = 0 + range_end = 20 + +class StackingWorldItems(DefaultOnToggle): + """ + Multiple world items give you the world's associated key item. + + WL - Footprints + + OC - Entry Pass + + DJ - Slides + + HT - Forget-Me-Not and Jack-In-The-Box + + HB - Theon Vol. 6 + + Adds an extra world to the pool for each that has a key item (WL, OC, DJ, HT, HB). + + Forces Halloween Town Key Item Bundle ON. + """ + display_name = "Stacking World Items" + +class HalloweenTownKeyItemBundle(DefaultOnToggle): + """ + Obtaining the Forget-Me-Not automatically gives Jack-in-the-Box as well. + + Removes Jack-in-the-Box from the pool. + """ + display_name = "Halloween Town Key Item Bundle" @dataclass class KH1Options(PerGameCommonOptions): - goal: Goal + final_rest_door_key: FinalRestDoorKey end_of_the_world_unlock: EndoftheWorldUnlock - final_rest_door: FinalRestDoor - required_reports_eotw: RequiredReportsEotW - required_reports_door: RequiredReportsDoor - reports_in_pool: ReportsInPool + required_lucky_emblems_eotw: RequiredLuckyEmblemsEotW + required_lucky_emblems_door: RequiredLuckyEmblemsDoor + lucky_emblems_in_pool: LuckyEmblemsInPool + required_postcards: RequiredPostcards + required_puppies: RequiredPuppies super_bosses: SuperBosses atlantica: Atlantica hundred_acre_wood: HundredAcreWood cups: Cups - puppies: Puppies + randomize_puppies: RandomizePuppies + puppy_value: PuppyValue starting_worlds: StartingWorlds keyblades_unlock_chests: KeybladesUnlockChests interact_in_battle: InteractInBattle exp_multiplier: EXPMultiplier - advanced_logic: AdvancedLogic + logic_difficulty: LogicDifficulty extra_shared_abilities: ExtraSharedAbilities exp_zero_in_pool: EXPZeroInPool - vanilla_emblem_pieces: VanillaEmblemPieces + randomize_emblem_pieces: RandomizeEmblemPieces + randomize_postcards: RandomizePostcards donald_death_link: DonaldDeathLink goofy_death_link: GoofyDeathLink - randomize_keyblade_stats: RandomizeKeybladeStats + keyblade_stats: KeybladeStats bad_starting_weapons: BadStartingWeapons keyblade_min_str: KeybladeMinStrength keyblade_max_str: KeybladeMaxStrength + keyblade_min_crit_rate: KeybladeMinCritRateBonus + keyblade_max_crit_rate: KeybladeMaxCritRateBonus + keyblade_min_crit_str: KeybladeMinCritSTRBonus + keyblade_max_crit_str: KeybladeMaxCritSTRBonus + keyblade_min_recoil: KeybladeMinRecoil + keyblade_max_recoil: KeybladeMaxRecoil keyblade_min_mp: KeybladeMinMP keyblade_max_mp: KeybladeMaxMP level_checks: LevelChecks + slot_2_level_checks: Slot2LevelChecks force_stats_on_levels: ForceStatsOnLevels strength_increase: StrengthIncrease defense_increase: DefenseIncrease @@ -394,26 +845,68 @@ class KH1Options(PerGameCommonOptions): accessory_slot_increase: AccessorySlotIncrease item_slot_increase: ItemSlotIncrease start_inventory_from_pool: StartInventoryPool + jungle_slider: JungleSlider + starting_tools: StartingTools + remote_items: RemoteItems + shorten_go_mode: ShortenGoMode + death_link: DeathLink + destiny_islands: DestinyIslands + orichalcum_in_pool: OrichalcumInPool + orichalcum_price: OrichalcumPrice + mythril_in_pool: MythrilInPool + mythril_price: MythrilPrice + one_hp: OneHP + four_by_three: FourByThree + auto_attack: AutoAttack + beep_hack: BeepHack + consistent_finishers: ConsistentFinishers + early_skip: EarlySkip + fast_camera: FastCamera + faster_animations: FasterAnimations + unlock_0_volume: Unlock0Volume + unskippable: Unskippable + auto_save: AutoSave + warp_anywhere: WarpAnywhere + randomize_party_member_starting_accessories: RandomizePartyMemberStartingAccessories + max_level_for_slot_2_level_checks: MaxLevelForSlot2LevelChecks + randomize_ap_costs: RandomizeAPCosts + max_ap_cost: MaxAPCost + min_ap_cost: MinAPCost + day_2_materials: Day2Materials + homecoming_materials: HomecomingMaterials + materials_in_pool: MaterialsInPool + stacking_world_items: StackingWorldItems + halloween_town_key_item_bundle: HalloweenTownKeyItemBundle + kh1_option_groups = [ OptionGroup("Goal", [ - Goal, + FinalRestDoorKey, EndoftheWorldUnlock, - FinalRestDoor, - RequiredReportsDoor, - RequiredReportsEotW, - ReportsInPool, + RequiredLuckyEmblemsDoor, + RequiredLuckyEmblemsEotW, + LuckyEmblemsInPool, + RequiredPostcards, + RequiredPuppies, + DestinyIslands, + Day2Materials, + HomecomingMaterials, + MaterialsInPool, ]), OptionGroup("Locations", [ SuperBosses, Atlantica, Cups, HundredAcreWood, - VanillaEmblemPieces, + JungleSlider, + RandomizeEmblemPieces, + RandomizePostcards, ]), OptionGroup("Levels", [ EXPMultiplier, LevelChecks, + Slot2LevelChecks, + MaxLevelForSlot2LevelChecks, ForceStatsOnLevels, StrengthIncrease, DefenseIncrease, @@ -425,21 +918,58 @@ kh1_option_groups = [ ]), OptionGroup("Keyblades", [ KeybladesUnlockChests, - RandomizeKeybladeStats, + KeybladeStats, BadStartingWeapons, - KeybladeMaxStrength, KeybladeMinStrength, - KeybladeMaxMP, + KeybladeMaxStrength, + KeybladeMinCritRateBonus, + KeybladeMaxCritRateBonus, + KeybladeMinCritSTRBonus, + KeybladeMaxCritSTRBonus, + KeybladeMinRecoil, + KeybladeMaxRecoil, KeybladeMinMP, + KeybladeMaxMP, + ]), + OptionGroup("Synth", [ + OrichalcumInPool, + OrichalcumPrice, + MythrilInPool, + MythrilPrice, + ]), + OptionGroup("AP Costs", [ + RandomizeAPCosts, + MaxAPCost, + MinAPCost ]), OptionGroup("Misc", [ StartingWorlds, - Puppies, + StartingTools, + RandomizePuppies, + PuppyValue, InteractInBattle, - AdvancedLogic, + LogicDifficulty, ExtraSharedAbilities, + StackingWorldItems, + HalloweenTownKeyItemBundle, EXPZeroInPool, + RandomizePartyMemberStartingAccessories, + DeathLink, DonaldDeathLink, GoofyDeathLink, + RemoteItems, + ShortenGoMode, + OneHP, + FourByThree, + AutoAttack, + BeepHack, + ConsistentFinishers, + EarlySkip, + FastCamera, + FasterAnimations, + Unlock0Volume, + Unskippable, + AutoSave, + WarpAnywhere ]) ] diff --git a/worlds/kh1/Presets.py b/worlds/kh1/Presets.py index 77b43b7624..33949a24e0 100644 --- a/worlds/kh1/Presets.py +++ b/worlds/kh1/Presets.py @@ -3,24 +3,33 @@ from typing import Any, Dict from .Options import * kh1_option_presets: Dict[str, Dict[str, Any]] = { - # Standard playthrough where your goal is to defeat Ansem, reaching him by acquiring enough reports. + # Standard playthrough where your goal is to defeat Ansem, reaching him by acquiring enough lucky emblems. "Final Ansem": { - "goal": Goal.option_final_ansem, - "end_of_the_world_unlock": EndoftheWorldUnlock.option_reports, - "final_rest_door": FinalRestDoor.option_reports, - "required_reports_eotw": 7, - "required_reports_door": 10, - "reports_in_pool": 13, + "final_rest_door_key": FinalRestDoorKey.option_lucky_emblems, + "end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems, + "required_lucky_emblems_eotw": 7, + "required_lucky_emblems_door": 10, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": True, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": False, "atlantica": False, "hundred_acre_wood": False, - "cups": False, - "vanilla_emblem_pieces": True, + "cups": Cups.option_off, + "jungle_slider": False, + "randomize_emblem_pieces": False, + "randomize_postcards": RandomizePostcards.option_all, - "exp_multiplier": 48, - "level_checks": 100, - "force_stats_on_levels": 1, + "exp_multiplier": 64, + "level_checks": 99, + "slot_2_level_checks": 33, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 24, "defense_increase": 24, "hp_increase": 23, @@ -30,40 +39,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 3, "keyblades_unlock_chests": False, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": False, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_triplets, - "starting_worlds": 0, - "interact_in_battle": False, - "advanced_logic": False, - "extra_shared_abilities": False, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 3, + "starting_worlds": 4, + "starting_tools": True, + "interact_in_battle": True, + "logic_difficulty": LogicDifficulty.option_normal, + "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": False, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": False, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False }, # Puppies are found individually, and the goal is to return them all. "Puppy Hunt": { - "goal": Goal.option_puppies, + "final_rest_door_key": FinalRestDoorKey.option_puppies, "end_of_the_world_unlock": EndoftheWorldUnlock.option_item, - "final_rest_door": FinalRestDoor.option_puppies, - "required_reports_eotw": 13, - "required_reports_door": 13, - "reports_in_pool": 13, + "required_lucky_emblems_eotw": 13, + "required_lucky_emblems_door": 13, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": False, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": False, "atlantica": False, "hundred_acre_wood": False, - "cups": False, - "vanilla_emblem_pieces": True, + "cups": Cups.option_off, + "jungle_slider": False, + "randomize_emblem_pieces": False, + "randomize_postcards": RandomizePostcards.option_all, - "exp_multiplier": 48, - "level_checks": 100, - "force_stats_on_levels": 1, + "exp_multiplier": 64, + "level_checks": 99, + "slot_2_level_checks": 33, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 24, "defense_increase": 24, "hp_increase": 23, @@ -73,40 +125,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 3, "keyblades_unlock_chests": False, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": False, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_individual, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 1, "starting_worlds": 0, - "interact_in_battle": False, - "advanced_logic": False, - "extra_shared_abilities": False, + "starting_tools": True, + "interact_in_battle": True, + "logic_difficulty": LogicDifficulty.option_normal, + "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": False, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": False, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False }, # Advanced playthrough with most settings on. "Advanced": { - "goal": Goal.option_final_ansem, - "end_of_the_world_unlock": EndoftheWorldUnlock.option_reports, - "final_rest_door": FinalRestDoor.option_reports, - "required_reports_eotw": 7, - "required_reports_door": 10, - "reports_in_pool": 13, + "final_rest_door_key": FinalRestDoorKey.option_lucky_emblems, + "end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems, + "required_lucky_emblems_eotw": 7, + "required_lucky_emblems_door": 10, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": True, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": True, "atlantica": True, "hundred_acre_wood": True, - "cups": True, - "vanilla_emblem_pieces": False, + "cups": Cups.option_off, + "jungle_slider": True, + "randomize_emblem_pieces": True, + "randomize_postcards": RandomizePostcards.option_all, - "exp_multiplier": 48, - "level_checks": 100, - "force_stats_on_levels": 1, + "exp_multiplier": 64, + "level_checks": 99, + "slot_2_level_checks": 33, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 24, "defense_increase": 24, "hp_increase": 23, @@ -116,40 +211,83 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 3, "keyblades_unlock_chests": True, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": True, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_triplets, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 3, "starting_worlds": 0, + "starting_tools": True, "interact_in_battle": True, - "advanced_logic": True, + "logic_difficulty": LogicDifficulty.option_proud, "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": True, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": False, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False }, # Playthrough meant to enhance the level 1 experience. "Level 1": { - "goal": Goal.option_final_ansem, - "end_of_the_world_unlock": EndoftheWorldUnlock.option_reports, - "final_rest_door": FinalRestDoor.option_reports, - "required_reports_eotw": 7, - "required_reports_door": 10, - "reports_in_pool": 13, + "final_rest_door_key": FinalRestDoorKey.option_lucky_emblems, + "end_of_the_world_unlock": EndoftheWorldUnlock.option_lucky_emblems, + "required_lucky_emblems_eotw": 7, + "required_lucky_emblems_door": 10, + "lucky_emblems_in_pool": 13, + "required_postcards": 10, + "required_puppies": 99, + "destiny_islands": True, + "day_2_materials": 4, + "homecoming_materials": 10, + "materials_in_pool": 13, "super_bosses": False, "atlantica": False, "hundred_acre_wood": False, - "cups": False, - "vanilla_emblem_pieces": True, + "cups": Cups.option_off, + "jungle_slider": False, + "randomize_emblem_pieces": False, + "randomize_postcards": RandomizePostcards.option_all, "exp_multiplier": 16, "level_checks": 0, - "force_stats_on_levels": 101, + "slot_2_level_checks": 0, + "max_level_for_slot_2_level_checks": 50, + "force_stats_on_levels": 2, "strength_increase": 0, "defense_increase": 0, "hp_increase": 0, @@ -158,20 +296,54 @@ kh1_option_presets: Dict[str, Dict[str, Any]] = { "item_slot_increase": 5, "keyblades_unlock_chests": False, - "randomize_keyblade_stats": True, + "keyblade_stats": KeybladeStats.option_shuffle, "bad_starting_weapons": False, "keyblade_max_str": 14, "keyblade_min_str": 3, + "keyblade_max_crit_rate": 200, + "keyblade_min_crit_rate": 0, + "keyblade_max_crit_str": 16, + "keyblade_min_crit_str": 0, + "keyblade_max_recoil": 90, + "keyblade_min_recoil": 1, "keyblade_max_mp": 3, "keyblade_min_mp": -2, - "puppies": Puppies.option_triplets, + "orichalcum_in_pool": 20, + "orichalcum_price": 500, + "mythril_in_pool": 20, + "mythril_price": 500, + + "randomize_ap_costs": RandomizeAPCosts.option_off, + "max_ap_cost": 5, + "min_ap_cost": 0, + + "randomize_puppies": True, + "puppy_value": 3, "starting_worlds": 0, - "interact_in_battle": False, - "advanced_logic": False, - "extra_shared_abilities": False, + "starting_tools": True, + "interact_in_battle": True, + "logic_difficulty": LogicDifficulty.option_normal, + "extra_shared_abilities": True, + "stacking_world_items": True, + "halloween_town_key_item_bundle": True, "exp_zero_in_pool": False, + "randomize_party_member_starting_accessories": True, + "death_link": False, "donald_death_link": False, - "goofy_death_link": False + "goofy_death_link": False, + "remote_items": RemoteItems.option_off, + "shorten_go_mode": True, + "one_hp": False, + "four_by_three": False, + "beep_hack": False, + "consistent_finishers": True, + "early_skip": True, + "fast_camera": False, + "faster_animations": True, + "unlock_0_volume": False, + "unskippable": True, + "auto_save": True, + "warp_anywhere": False } } diff --git a/worlds/kh1/Regions.py b/worlds/kh1/Regions.py index 6189adf207..ac622ce081 100644 --- a/worlds/kh1/Regions.py +++ b/worlds/kh1/Regions.py @@ -9,12 +9,16 @@ class KH1RegionData(NamedTuple): region_exits: Optional[List[str]] -def create_regions(multiworld: MultiWorld, player: int, options): +def create_regions(kh1world): + multiworld = kh1world.multiworld + player = kh1world.player + options = kh1world.options + regions: Dict[str, KH1RegionData] = { - "Menu": KH1RegionData([], ["Awakening", "Levels"]), - "Awakening": KH1RegionData([], ["Destiny Islands"]), - "Destiny Islands": KH1RegionData([], ["Traverse Town"]), - "Traverse Town": KH1RegionData([], ["World Map"]), + "Menu": KH1RegionData([], ["Awakening", "Levels", "World Map"]), + "Awakening": KH1RegionData([], []), + "Destiny Islands": KH1RegionData([], []), + "Traverse Town": KH1RegionData([], []), "Wonderland": KH1RegionData([], []), "Olympus Coliseum": KH1RegionData([], []), "Deep Jungle": KH1RegionData([], []), @@ -27,17 +31,27 @@ def create_regions(multiworld: MultiWorld, player: int, options): "End of the World": KH1RegionData([], []), "100 Acre Wood": KH1RegionData([], []), "Levels": KH1RegionData([], []), - "World Map": KH1RegionData([], ["Wonderland", "Olympus Coliseum", "Deep Jungle", + "Homecoming": KH1RegionData([], []), + "World Map": KH1RegionData([], ["Destiny Islands", "Traverse Town", + "Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Atlantica", "Halloween Town", "Neverland", "Hollow Bastion", - "End of the World", "100 Acre Wood"]) + "End of the World", "100 Acre Wood", "Homecoming"]) } + + if not options.atlantica: + del regions["Atlantica"] + regions["World Map"].region_exits.remove("Atlantica") + if not options.destiny_islands: + del regions["Destiny Islands"] + regions["World Map"].region_exits.remove("Destiny Islands") # Set up locations regions["Agrabah"].locations.append("Agrabah Aladdin's House Main Street Entrance Chest") regions["Agrabah"].locations.append("Agrabah Aladdin's House Plaza Entrance Chest") regions["Agrabah"].locations.append("Agrabah Alley Chest") regions["Agrabah"].locations.append("Agrabah Bazaar Across Windows Chest") + regions["Agrabah"].locations.append("Agrabah Bazaar Blue Trinity") regions["Agrabah"].locations.append("Agrabah Bazaar High Corner Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Bottomless Hall Pillar Chest") @@ -59,6 +73,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Above Fire Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Across Platforms Chest") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest") + regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Red Trinity") regions["Agrabah"].locations.append("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest") regions["Agrabah"].locations.append("Agrabah Defeat Jafar Blizzard Event") regions["Agrabah"].locations.append("Agrabah Defeat Jafar Genie Ansem's Report 1") @@ -96,15 +111,11 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Center Chest") regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Left Chest") regions["Deep Jungle"].locations.append("Deep Jungle Hippo's Lagoon Right Chest") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 10 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 20 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 30 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 40 Fruits") - regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 50 Fruits") regions["Deep Jungle"].locations.append("Deep Jungle Seal Keyhole Jungle King Event") regions["Deep Jungle"].locations.append("Deep Jungle Seal Keyhole Red Trinity Event") regions["Deep Jungle"].locations.append("Deep Jungle Tent Chest") regions["Deep Jungle"].locations.append("Deep Jungle Tent Protect-G Event") + regions["Deep Jungle"].locations.append("Deep Jungle Treetop Green Trinity") regions["Deep Jungle"].locations.append("Deep Jungle Tree House Beneath Tree House Chest") regions["Deep Jungle"].locations.append("Deep Jungle Tree House Rooftop Chest") regions["Deep Jungle"].locations.append("Deep Jungle Tree House Save Gorillas") @@ -138,7 +149,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["End of the World"].locations.append("End of the World World Terminus Atlantica Chest") regions["End of the World"].locations.append("End of the World World Terminus Deep Jungle Chest") regions["End of the World"].locations.append("End of the World World Terminus Halloween Town Chest") - #regions["End of the World"].locations.append("End of the World World Terminus Hollow Bastion Chest") + regions["End of the World"].locations.append("End of the World World Terminus Hollow Bastion Chest") regions["End of the World"].locations.append("End of the World World Terminus Neverland Chest") regions["End of the World"].locations.append("End of the World World Terminus Olympus Coliseum Chest") regions["End of the World"].locations.append("End of the World World Terminus Traverse Town Chest") @@ -181,6 +192,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Maleficent Donald Cheer Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku I White Trinity Event") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Riku II Ragnarok Event") + regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon Blue Trinity") regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon By Candles Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Dungeon Corner Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Entrance Hall Emblem Piece (Chest)") @@ -192,6 +204,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Oblivion Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Grand Hall Steps Right Side Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest After Battle Platform Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest Blue Trinity") regions["Hollow Bastion"].locations.append("Hollow Bastion Great Crest Lower Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 1st Gravity Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion High Tower 2nd Gravity Chest") @@ -203,6 +216,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Hollow Bastion"].locations.append("Hollow Bastion Library Speak to Belle Divine Rose") regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest") + regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop from Waterway Examine Node") regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest") regions["Hollow Bastion"].locations.append("Hollow Bastion Lift Stop Library Node Gravity Chest") @@ -230,6 +244,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Monstro"].locations.append("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest") regions["Monstro"].locations.append("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest") regions["Monstro"].locations.append("Monstro Chamber 5 Atop Barrel Chest") + regions["Monstro"].locations.append("Monstro Chamber 5 Blue Trinity") regions["Monstro"].locations.append("Monstro Chamber 5 Low 1st Chest") regions["Monstro"].locations.append("Monstro Chamber 5 Low 2nd Chest") regions["Monstro"].locations.append("Monstro Chamber 5 Platform Chest") @@ -240,26 +255,28 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Monstro"].locations.append("Monstro Chamber 6 White Trinity Chest") regions["Monstro"].locations.append("Monstro Defeat Parasite Cage I Goofy Cheer Event") regions["Monstro"].locations.append("Monstro Defeat Parasite Cage II Stop Event") + regions["Monstro"].locations.append("Monstro Mouth Blue Trinity") regions["Monstro"].locations.append("Monstro Mouth Boat Deck Chest") regions["Monstro"].locations.append("Monstro Mouth Green Trinity Top of Boat Chest") regions["Monstro"].locations.append("Monstro Mouth High Platform Across from Boat Chest") regions["Monstro"].locations.append("Monstro Mouth High Platform Boat Side Chest") regions["Monstro"].locations.append("Monstro Mouth High Platform Near Teeth Chest") regions["Monstro"].locations.append("Monstro Mouth Near Ship Chest") + regions["Monstro"].locations.append("Monstro Throat Blue Trinity") regions["Neverland"].locations.append("Neverland Cabin Chest") regions["Neverland"].locations.append("Neverland Captain's Cabin Chest") - #regions["Neverland"].locations.append("Neverland Clock Tower 01:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 02:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 03:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 04:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 05:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 06:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 07:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 08:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 09:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 10:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 11:00 Door") - #regions["Neverland"].locations.append("Neverland Clock Tower 12:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 01:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 02:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 03:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 04:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 05:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 06:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 07:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 08:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 09:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 10:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 11:00 Door") + regions["Neverland"].locations.append("Neverland Clock Tower 12:00 Door") regions["Neverland"].locations.append("Neverland Clock Tower Chest") regions["Neverland"].locations.append("Neverland Defeat Anti Sora Raven's Claw Event") regions["Neverland"].locations.append("Neverland Defeat Captain Hook Ars Arcanum Event") @@ -276,6 +293,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Neverland"].locations.append("Neverland Pirate Ship Deck White Trinity Chest") regions["Neverland"].locations.append("Neverland Seal Keyhole Fairy Harp Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Glide Event") + regions["Neverland"].locations.append("Neverland Seal Keyhole Navi-G Piece Event") regions["Neverland"].locations.append("Neverland Seal Keyhole Tinker Bell Event") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Clear Phil's Training Thunder Event") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Cloud Sonic Blade Event") @@ -292,14 +310,16 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town 1st District Accessory Shop Roof Chest") #regions["Traverse Town"].locations.append("Traverse Town 1st District Aerith Gift") regions["Traverse Town"].locations.append("Traverse Town 1st District Blue Trinity Balcony Chest") + regions["Traverse Town"].locations.append("Traverse Town 1st District Blue Trinity by Exit Door") regions["Traverse Town"].locations.append("Traverse Town 1st District Candle Puzzle Chest") - #regions["Traverse Town"].locations.append("Traverse Town 1st District Leon Gift") + regions["Traverse Town"].locations.append("Traverse Town 1st District Leon Gift") regions["Traverse Town"].locations.append("Traverse Town 1st District Safe Postcard") - regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") + #regions["Traverse Town"].locations.append("Traverse Town 1st District Speak with Cid Event") regions["Traverse Town"].locations.append("Traverse Town 2nd District Boots and Shoes Awning Chest") regions["Traverse Town"].locations.append("Traverse Town 2nd District Gizmo Shop Facade Chest") regions["Traverse Town"].locations.append("Traverse Town 2nd District Rooftop Chest") regions["Traverse Town"].locations.append("Traverse Town 3rd District Balcony Postcard") + regions["Traverse Town"].locations.append("Traverse Town 3rd District Blue Trinity") regions["Traverse Town"].locations.append("Traverse Town Accessory Shop Chest") regions["Traverse Town"].locations.append("Traverse Town Alleyway Balcony Chest") regions["Traverse Town"].locations.append("Traverse Town Alleyway Behind Crates Chest") @@ -310,6 +330,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Dodge Roll Event") regions["Traverse Town"].locations.append("Traverse Town Defeat Guard Armor Fire Event") regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Aero Event") + regions["Traverse Town"].locations.append("Traverse Town Defeat Opposite Armor Navi-G Piece Event") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Chest") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto All Summons Reward") regions["Traverse Town"].locations.append("Traverse Town Geppetto's House Geppetto Reward 1") @@ -329,6 +350,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Item Workshop Right Chest") regions["Traverse Town"].locations.append("Traverse Town Kairi Secret Waterway Oathkeeper Event") regions["Traverse Town"].locations.append("Traverse Town Leon Secret Waterway Earthshine Event") + regions["Traverse Town"].locations.append("Traverse Town Magician's Study Blue Trinity") regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All Arts Items") regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All LV1 Magic") regions["Traverse Town"].locations.append("Traverse Town Magician's Study Obtained All LV3 Magic") @@ -357,26 +379,62 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 99 Puppies Reward 1") regions["Traverse Town"].locations.append("Traverse Town Piano Room Return 99 Puppies Reward 2") regions["Traverse Town"].locations.append("Traverse Town Red Room Chest") + regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Navi Gummi Event") regions["Traverse Town"].locations.append("Traverse Town Secret Waterway Near Stairs Chest") regions["Traverse Town"].locations.append("Traverse Town Secret Waterway White Trinity Chest") - regions["Traverse Town"].locations.append("Traverse Town Synth Cloth") - regions["Traverse Town"].locations.append("Traverse Town Synth Fish") - regions["Traverse Town"].locations.append("Traverse Town Synth Log") - regions["Traverse Town"].locations.append("Traverse Town Synth Mushroom") - regions["Traverse Town"].locations.append("Traverse Town Synth Rope") - regions["Traverse Town"].locations.append("Traverse Town Synth Seagull Egg") + regions["Traverse Town"].locations.append("Traverse Town Synth 15 Items") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 01") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 02") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 03") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 04") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 05") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 06") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 07") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 08") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 09") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 10") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 11") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 12") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 13") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 14") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 15") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 16") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 17") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 18") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 19") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 20") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 21") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 22") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 23") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 24") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 25") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 26") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 27") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 28") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 29") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 30") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 31") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 32") + regions["Traverse Town"].locations.append("Traverse Town Synth Item 33") + regions["Wonderland"].locations.append("Wonderland Bizarre Room Examine Flower Pot") regions["Wonderland"].locations.append("Wonderland Bizarre Room Green Trinity Chest") regions["Wonderland"].locations.append("Wonderland Bizarre Room Lamp Chest") regions["Wonderland"].locations.append("Wonderland Bizarre Room Navi-G Piece Event") regions["Wonderland"].locations.append("Wonderland Bizarre Room Read Book") regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Blizzard Event") regions["Wonderland"].locations.append("Wonderland Defeat Trickmaster Ifrit's Horn Event") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Blue Trinity in Alcove") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Blue Trinity by Moving Boulder") regions["Wonderland"].locations.append("Wonderland Lotus Forest Corner Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Glide Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Nut Chest") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Red Flower Raise Lily Pads") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Red Flowers on the Main Path") regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting Thunder Plant Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Through the Painting White Trinity Chest") regions["Wonderland"].locations.append("Wonderland Lotus Forest Thunder Plant Chest") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Yellow Elixir Flower Through Painting") + regions["Wonderland"].locations.append("Wonderland Lotus Forest Yellow Flowers in Middle Clearing and Through Painting") regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Left Red Chest") regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Right Blue Chest") regions["Wonderland"].locations.append("Wonderland Queen's Castle Hedge Right Red Chest") @@ -388,6 +446,11 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Wonderland"].locations.append("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest") regions["Wonderland"].locations.append("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest") regions["Wonderland"].locations.append("Wonderland Tea Party Garden Bear and Clock Puzzle Chest") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Cushioned Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Gray Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Left Pink Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Right Brown Chair") + regions["Wonderland"].locations.append("Wonderland Tea Party Garden Right Yellow Chair") if options.hundred_acre_wood: regions["100 Acre Wood"].locations.append("100 Acre Wood Meadow Inside Log Chest") regions["100 Acre Wood"].locations.append("100 Acre Wood Bouncing Spot Left Cliff Chest") @@ -440,7 +503,7 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Atlantica"].locations.append("Atlantica Undersea Cave Clam") regions["Atlantica"].locations.append("Atlantica Sunken Ship Crystal Trident Event") regions["Atlantica"].locations.append("Atlantica Defeat Ursula II Ansem's Report 3") - if options.cups: + if options.cups.current_key != "off": regions["Olympus Coliseum"].locations.append("Complete Phil Cup") regions["Olympus Coliseum"].locations.append("Complete Phil Cup Solo") regions["Olympus Coliseum"].locations.append("Complete Phil Cup Time Trial") @@ -450,50 +513,84 @@ def create_regions(multiworld: MultiWorld, player: int, options): regions["Olympus Coliseum"].locations.append("Complete Hercules Cup") regions["Olympus Coliseum"].locations.append("Complete Hercules Cup Solo") regions["Olympus Coliseum"].locations.append("Complete Hercules Cup Time Trial") - regions["Olympus Coliseum"].locations.append("Complete Hades Cup") - regions["Olympus Coliseum"].locations.append("Complete Hades Cup Solo") - regions["Olympus Coliseum"].locations.append("Complete Hades Cup Time Trial") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cloud and Leon Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Yuffie Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cerberus Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Behemoth Event") - regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Hades Event") regions["Olympus Coliseum"].locations.append("Hercules Cup Defeat Cloud Event") regions["Olympus Coliseum"].locations.append("Hercules Cup Yellow Trinity Event") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Olympia Chest") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Ice Titan Diamond Dust Event") - regions["Olympus Coliseum"].locations.append("Olympus Coliseum Gates Purple Jar After Defeating Hades") + if options.cups.current_key == "hades_cup": + regions["Olympus Coliseum"].locations.append("Complete Hades Cup") + regions["Olympus Coliseum"].locations.append("Complete Hades Cup Solo") + regions["Olympus Coliseum"].locations.append("Complete Hades Cup Time Trial") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cloud and Leon Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Yuffie Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Cerberus Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Behemoth Event") + regions["Olympus Coliseum"].locations.append("Hades Cup Defeat Hades Event") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Hades Ansem's Report 8") + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Gates Purple Jar After Defeating Hades") + if options.cups.current_key == "hades_cup" and options.super_bosses: + regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Ice Titan Diamond Dust Event") if options.super_bosses: regions["Neverland"].locations.append("Neverland Defeat Phantom Stop Event") regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Zantetsuken Event") regions["Agrabah"].locations.append("Agrabah Defeat Kurt Zisa Ansem's Report 11") - if options.super_bosses or options.goal.current_key == "sephiroth": + if options.super_bosses or options.final_rest_door_key.current_key == "sephiroth": regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth Ansem's Report 12") regions["Olympus Coliseum"].locations.append("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event") - if options.super_bosses or options.goal.current_key == "unknown": + if options.super_bosses or options.final_rest_door_key.current_key == "unknown": regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown Ansem's Report 13") regions["Hollow Bastion"].locations.append("Hollow Bastion Defeat Unknown EXP Necklace Event") - for i in range(options.level_checks): - regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0')) - if options.goal.current_key == "final_ansem": - regions["End of the World"].locations.append("Final Ansem") + if options.jungle_slider: + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 10 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 20 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 30 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 40 Fruits") + regions["Deep Jungle"].locations.append("Deep Jungle Jungle Slider 50 Fruits") + for i in range(1,options.level_checks+1): + regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0') + " (Slot 1)") + if i+1 in kh1world.get_slot_2_levels(): + regions["Levels"].locations.append("Level " + str(i+1).rjust(3, '0') + " (Slot 2)") + if options.destiny_islands: + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 1 (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 2 (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Capture Fish 3 (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Seagull Egg (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Log on Riku's Island (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Log under Bridge (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Cloth (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Seashore Gather Rope (Day 1)") + #regions["Destiny Islands"].locations.append("Destiny Islands Seashore Deliver Kairi Items (Day 1)") + regions["Destiny Islands"].locations.append("Destiny Islands Secret Place Gather Mushroom (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Cove Gather Mushroom Near Zip Line (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Cove Gather Mushroom in Small Cave (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Cove Talk to Kairi (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Gather Drinking Water (Day 2)") + #regions["Destiny Islands"].locations.append("Destiny Islands Cove Deliver Kairi Items (Day 2)") + regions["Destiny Islands"].locations.append("Destiny Islands Chest") + regions["Homecoming"].locations.append("Final Ansem") + + for location in kh1world.get_starting_accessory_locations(): + regions[location_table[location].category].locations.append(location) # Set up the regions correctly. for name, data in regions.items(): multiworld.regions.append(create_region(multiworld, player, name, data)) - -def connect_entrances(multiworld: MultiWorld, player: int): +def connect_entrances(kh1world): + multiworld = kh1world.multiworld + player = kh1world.player + options = kh1world.options + multiworld.get_entrance("Awakening", player).connect(multiworld.get_region("Awakening", player)) - multiworld.get_entrance("Destiny Islands", player).connect(multiworld.get_region("Destiny Islands", player)) + if options.destiny_islands: + multiworld.get_entrance("Destiny Islands", player).connect(multiworld.get_region("Destiny Islands", player)) multiworld.get_entrance("Traverse Town", player).connect(multiworld.get_region("Traverse Town", player)) multiworld.get_entrance("Wonderland", player).connect(multiworld.get_region("Wonderland", player)) multiworld.get_entrance("Olympus Coliseum", player).connect(multiworld.get_region("Olympus Coliseum", player)) multiworld.get_entrance("Deep Jungle", player).connect(multiworld.get_region("Deep Jungle", player)) multiworld.get_entrance("Agrabah", player).connect(multiworld.get_region("Agrabah", player)) multiworld.get_entrance("Monstro", player).connect(multiworld.get_region("Monstro", player)) - multiworld.get_entrance("Atlantica", player).connect(multiworld.get_region("Atlantica", player)) + if options.atlantica: + multiworld.get_entrance("Atlantica", player).connect(multiworld.get_region("Atlantica", player)) multiworld.get_entrance("Halloween Town", player).connect(multiworld.get_region("Halloween Town", player)) multiworld.get_entrance("Neverland", player).connect(multiworld.get_region("Neverland", player)) multiworld.get_entrance("Hollow Bastion", player).connect(multiworld.get_region("Hollow Bastion", player)) @@ -501,7 +598,7 @@ def connect_entrances(multiworld: MultiWorld, player: int): multiworld.get_entrance("100 Acre Wood", player).connect(multiworld.get_region("100 Acre Wood", player)) multiworld.get_entrance("World Map", player).connect(multiworld.get_region("World Map", player)) multiworld.get_entrance("Levels", player).connect(multiworld.get_region("Levels", player)) - + multiworld.get_entrance("Homecoming", player).connect(multiworld.get_region("Homecoming", player)) def create_region(multiworld: MultiWorld, player: int, name: str, data: KH1RegionData): region = Region(name, player, multiworld) diff --git a/worlds/kh1/Rules.py b/worlds/kh1/Rules.py index 130238e504..54a94326e4 100644 --- a/worlds/kh1/Rules.py +++ b/worlds/kh1/Rules.py @@ -1,41 +1,69 @@ from BaseClasses import CollectionState -from worlds.generic.Rules import add_rule +from worlds.generic.Rules import add_rule, add_item_rule from math import ceil +from BaseClasses import ItemClassification +from .Data import WORLD_KEY_ITEMS, LOGIC_BEGINNER, LOGIC_NORMAL, LOGIC_PROUD, LOGIC_MINIMAL -SINGLE_PUPPIES = ["Puppy " + str(i).rjust(2,"0") for i in range(1,100)] -TRIPLE_PUPPIES = ["Puppies " + str(3*(i-1)+1).rjust(2, "0") + "-" + str(3*(i-1)+3).rjust(2, "0") for i in range(1,34)] -TORN_PAGES = ["Torn Page " + str(i) for i in range(1,6)] -WORLDS = ["Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Atlantica", "Halloween Town", "Neverland", "Hollow Bastion", "End of the World"] -KEYBLADES = ["Lady Luck", "Olympia", "Jungle King", "Three Wishes", "Wishing Star", "Crabclaw", "Pumpkinhead", "Fairy Harp", "Divine Rose", "Oblivion"] +from .Locations import KH1Location, location_table +from .Items import KH1Item, item_table -def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keyblades_unlock_chests: bool) -> bool: - worlds_acquired = 0.0 - for i in range(len(WORLDS)): - if state.has(WORLDS[i], player): - worlds_acquired = worlds_acquired + 0.5 - if (state.has(WORLDS[i], player) and (not keyblades_unlock_chests or state.has(KEYBLADES[i], player))) or (state.has(WORLDS[i], player) and WORLDS[i] == "Atlantica"): - worlds_acquired = worlds_acquired + 0.5 - return worlds_acquired >= num_of_worlds +WORLDS = ["Destiny Islands", "Traverse Town", "Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Atlantica", "Halloween Town", "Neverland", "Hollow Bastion", "End of the World", "100 Acre Wood"] +KEYBLADES = ["Oathkeeper", "Lionheart", "Lady Luck", "Olympia", "Jungle King", "Three Wishes", "Wishing Star", "Crabclaw", "Pumpkinhead", "Fairy Harp", "Divine Rose", "Oblivion", "Spellbinder"] +BROKEN_KEYBLADE_LOCKING_LOCATIONS = [ + "End of the World Final Dimension 2nd Chest", + "End of the World Final Dimension 4th Chest", + "End of the World Final Dimension 7th Chest", + "End of the World Final Dimension 8th Chest", + "End of the World Final Dimension 10th Chest", + "Neverland Hold Aero Chest", + "Hollow Bastion Library 1st Floor Turn the Carousel Chest", + "Hollow Bastion Library Top of Bookshelf Turn the Carousel Chest", + "Hollow Bastion Library 2nd Floor Turn the Carousel 1st Chest", + "Hollow Bastion Library 2nd Floor Turn the Carousel 2nd Chest", + "Hollow Bastion Entrance Hall Emblem Piece (Chest)", + "Atlantica Sunken Ship In Flipped Boat Chest", + "Atlantica Sunken Ship Seabed Chest", + "Atlantica Sunken Ship Inside Ship Chest", + "Atlantica Ariel's Grotto High Chest", + "Atlantica Ariel's Grotto Middle Chest", + "Atlantica Ariel's Grotto Low Chest", + "Atlantica Ursula's Lair Use Fire on Urchin Chest", + "Atlantica Undersea Gorge Jammed by Ariel's Grotto Chest", + "Atlantica Triton's Palace White Trinity Chest", + "Atlantica Sunken Ship Crystal Trident Event" +] -def has_emblems(state: CollectionState, player: int, keyblades_unlock_chests: bool) -> bool: +def has_x_worlds(state: CollectionState, player: int, num_of_worlds: int, keyblades_unlock_chests: bool, logic_difficulty: int, hundred_acre_wood: bool) -> bool: + if logic_difficulty >= LOGIC_MINIMAL: + return True + else: + worlds_acquired = 0.0 + for i in range(len(WORLDS)): + if WORLDS[i] == "Traverse Town": + worlds_acquired = worlds_acquired + 0.5 + if not keyblades_unlock_chests or state.has(KEYBLADES[i], player): + worlds_acquired = worlds_acquired + 0.5 + elif WORLDS[i] == "100 Acre Wood" and hundred_acre_wood: + if state.has("Progressive Fire", player): + worlds_acquired = worlds_acquired + 0.5 + if not keyblades_unlock_chests or state.has(KEYBLADES[i], player): + worlds_acquired = worlds_acquired + 0.5 + elif state.has(WORLDS[i], player): + worlds_acquired = worlds_acquired + 0.5 + if not keyblades_unlock_chests or state.has(KEYBLADES[i], player): + worlds_acquired = worlds_acquired + 0.5 + return worlds_acquired >= num_of_worlds + +def has_emblems(state: CollectionState, player: int, keyblades_unlock_chests: bool, logic_difficulty: int, hundred_acre_wood: bool) -> bool: return state.has_all({ "Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Statue)", "Emblem Piece (Fountain)", - "Hollow Bastion"}, player) and has_x_worlds(state, player, 5, keyblades_unlock_chests) + "Hollow Bastion"}, player) and has_x_worlds(state, player, 6, keyblades_unlock_chests, logic_difficulty, hundred_acre_wood) -def has_puppies_all(state: CollectionState, player: int, puppies_required: int) -> bool: - return state.has("All Puppies", player) - -def has_puppies_triplets(state: CollectionState, player: int, puppies_required: int) -> bool: - return state.has_from_list_unique(TRIPLE_PUPPIES, player, ceil(puppies_required / 3)) - -def has_puppies_individual(state: CollectionState, player: int, puppies_required: int) -> bool: - return state.has_from_list_unique(SINGLE_PUPPIES, player, puppies_required) - -def has_torn_pages(state: CollectionState, player: int, pages_required: int) -> bool: - return state.count_from_list_unique(TORN_PAGES, player) >= pages_required +def has_puppies(state: CollectionState, player: int, puppies_required: int, puppy_value: int) -> bool: + return (state.count("Puppy", player) * puppy_value) >= puppies_required def has_all_arts(state: CollectionState, player: int) -> bool: return state.has_all({"Fire Arts", "Blizzard Arts", "Thunder Arts", "Cure Arts", "Gravity Arts", "Stop Arts", "Aero Arts"}, player) @@ -53,198 +81,248 @@ def has_all_magic_lvx(state: CollectionState, player: int, level) -> bool: "Progressive Aero": level, "Progressive Stop": level}, player) -def has_offensive_magic(state: CollectionState, player: int) -> bool: - return state.has_any({"Progressive Fire", "Progressive Blizzard", "Progressive Thunder", "Progressive Gravity", "Progressive Stop"}, player) - -def has_reports(state: CollectionState, player: int, eotw_required_reports: int) -> bool: - return state.has_group_unique("Reports", player, eotw_required_reports) - -def has_final_rest_door(state: CollectionState, player: int, final_rest_door_requirement: str, final_rest_door_required_reports: int, keyblades_unlock_chests: bool, puppies_choice: str): - if final_rest_door_requirement == "reports": - return state.has_group_unique("Reports", player, final_rest_door_required_reports) - if final_rest_door_requirement == "puppies": - if puppies_choice == "individual": - return has_puppies_individual(state, player, 99) - if puppies_choice == "triplets": - return has_puppies_triplets(state, player, 99) - return has_puppies_all(state, player, 99) - if final_rest_door_requirement == "postcards": - return state.has("Postcard", player, 10) - if final_rest_door_requirement == "superbosses": - return ( - state.has_all({"Olympus Coliseum", "Neverland", "Agrabah", "Hollow Bastion", "Green Trinity", "Phil Cup", "Pegasus Cup", "Hercules Cup", "Entry Pass"}, player) - and has_emblems(state, player, keyblades_unlock_chests) - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_x_worlds(state, player, 7, keyblades_unlock_chests) - ) - -def has_defensive_tools(state: CollectionState, player: int) -> bool: +def has_offensive_magic(state: CollectionState, player: int, logic_difficulty: int) -> bool: return ( + state.has_any({"Progressive Fire", "Progressive Blizzard"}, player) + or (logic_difficulty > LOGIC_NORMAL and state.has_any({"Progressive Thunder", "Progressive Gravity"}, player)) + or (logic_difficulty > LOGIC_PROUD and state.has("Progressive Stop", player)) + ) + +def has_lucky_emblems(state: CollectionState, player: int, required_amt: int) -> bool: + return state.has("Lucky Emblem", player, required_amt) + +def has_final_rest_door(state: CollectionState, player: int, final_rest_door_requirement: str, final_rest_door_required_lucky_emblems: int): + if final_rest_door_requirement == "lucky_emblems": + return state.has("Lucky Emblem", player, final_rest_door_required_lucky_emblems) + else: + return state.has("Final Door Key", player) + +def has_defensive_tools(state: CollectionState, player: int, logic_difficulty: int) -> bool: + if logic_difficulty >= LOGIC_MINIMAL: + return True + else: + return ( state.has_all_counts({"Progressive Cure": 2, "Leaf Bracer": 1, "Dodge Roll": 1}, player) and state.has_any_count({"Second Chance": 1, "MP Rage": 1, "Progressive Aero": 2}, player) ) +def has_basic_tools(state: CollectionState, player: int) -> bool: + return ( + state.has_all({"Dodge Roll", "Progressive Cure"}, player) + and state.has_any({"Combo Master", "Strike Raid", "Sonic Blade", "Counterattack"}, player) + and state.has_any({"Leaf Bracer", "Second Chance", "Guard"}, player) + and has_offensive_magic(state, player, 6) + ) + def can_dumbo_skip(state: CollectionState, player: int) -> bool: return ( state.has("Dumbo", player) and state.has_group("Magic", player) ) -def has_oogie_manor(state: CollectionState, player: int, advanced_logic: bool) -> bool: +def has_oogie_manor(state: CollectionState, player: int, logic_difficulty: int) -> bool: return ( - state.has("Progressive Fire", player) - or (advanced_logic and state.has("High Jump", player, 2)) - or (advanced_logic and state.has("High Jump", player) and state.has("Progressive Glide", player)) + state.has("Progressive Fire", player) + or (logic_difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (logic_difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2) or (state.has_all({"High Jump", "Progressive Glide"}, player))) + or (logic_difficulty > LOGIC_PROUD and state.has_any({"High Jump", "Progressive Glide"}, player)) ) +def has_item_workshop(state: CollectionState, player: int, logic_difficulty: int) -> bool: + return ( + state.has("Green Trinity", player) + or (logic_difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) + ) + +def has_parasite_cage(state: CollectionState, player: int, logic_difficulty: int, worlds: bool) -> bool: + return ( + state.has("Monstro", player) + and + ( + state.has("High Jump", player) + or (logic_difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + ) + and worlds + ) + +def has_key_item(state: CollectionState, player: int, key_item: str, stacking_world_items: bool, halloween_town_key_item_bundle: bool, difficulty: int, keyblades_unlock_chests: bool): + return ( + ( + state.has(key_item, player) + or (stacking_world_items and state.has(WORLD_KEY_ITEMS[key_item], player, 2)) + or (key_item == "Jack-In-The-Box" and state.has("Forget-Me-Not", player) and halloween_town_key_item_bundle) + ) + # Adding this to make sure that if a beginner logic player is playing with keyblade locking, + # anything that would require the Crystal Trident should expect the player to be able to + # open the Crystal Trident chest. + and (key_item != "Crystal Trident" or difficulty > LOGIC_BEGINNER or not keyblades_unlock_chests or state.has("Crabclaw", player)) + ) + def set_rules(kh1world): - multiworld = kh1world.multiworld - player = kh1world.player - options = kh1world.options - eotw_required_reports = kh1world.determine_reports_required_to_open_end_of_the_world() - final_rest_door_required_reports = kh1world.determine_reports_required_to_open_final_rest_door() - final_rest_door_requirement = kh1world.options.final_rest_door.current_key - - has_puppies = has_puppies_individual - if kh1world.options.puppies == "triplets": - has_puppies = has_puppies_triplets - elif kh1world.options.puppies == "full": - has_puppies = has_puppies_all + multiworld = kh1world.multiworld + player = kh1world.player + options = kh1world.options + eotw_required_lucky_emblems = kh1world.determine_lucky_emblems_required_to_open_end_of_the_world() + final_rest_door_required_lucky_emblems = kh1world.determine_lucky_emblems_required_to_open_final_rest_door() + final_rest_door_requirement = kh1world.options.final_rest_door_key.current_key + day_2_materials = kh1world.options.day_2_materials.value + homecoming_materials = kh1world.options.homecoming_materials.value + difficulty = kh1world.options.logic_difficulty.value # difficulty > 0 is Normal or higher; difficulty > 5 is Proud or higher; difficulty > 10 is Minimal and higher; others are for if another difficulty is added + stacking_world_items = kh1world.options.stacking_world_items.value + halloween_town_key_item_bundle = kh1world.options.halloween_town_key_item_bundle.value + end_of_the_world_unlock = kh1world.options.end_of_the_world_unlock.current_key + hundred_acre_wood = kh1world.options.hundred_acre_wood + add_rule(kh1world.get_location("Traverse Town 1st District Candle Puzzle Chest"), lambda state: state.has("Progressive Blizzard", player)) + add_rule(kh1world.get_location("Traverse Town 1st District Accessory Shop Roof Chest"), # this check could justifiably require high jump for Beginners + lambda state: state.has("High Jump", player)) or difficulty > LOGIC_BEGINNER add_rule(kh1world.get_location("Traverse Town Mystical House Yellow Trinity Chest"), lambda state: ( state.has("Progressive Fire", player) and ( state.has("Yellow Trinity", player) - or (options.advanced_logic and state.has("High Jump", player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player)) ) )) add_rule(kh1world.get_location("Traverse Town Secret Waterway White Trinity Chest"), lambda state: state.has("White Trinity", player)) add_rule(kh1world.get_location("Traverse Town Geppetto's House Chest"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: (has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)))) add_rule(kh1world.get_location("Traverse Town Item Workshop Right Chest"), - lambda state: ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - )) + lambda state: (has_item_workshop(state, player, difficulty))) + add_rule(kh1world.get_location("Traverse Town Item Workshop Left Chest"), + lambda state: (has_item_workshop(state, player, difficulty))) add_rule(kh1world.get_location("Traverse Town 1st District Blue Trinity Balcony Chest"), lambda state: ( (state.has("Blue Trinity", player) and state.has("Progressive Glide", player)) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Traverse Town Mystical House Glide Chest"), lambda state: ( + state.has("Progressive Fire", player) + and ( state.has("Progressive Glide", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and ( - (state.has("High Jump", player) and state.has("Yellow Trinity", player)) - or state.has("High Jump", player, 2) + state.has("High Jump", player, 3) + or + ( + state.has("Combo Master", player) + and + ( + state.has("High Jump", player, 2) + or + ( + state.has("High Jump", player) + and state.has("Air Combo Plus", player, 2) + #or state.has("Yellow Trinity", player) + ) + ) + ) ) - and state.has("Combo Master", player) ) or ( - options.advanced_logic - and state.has("Mermaid Kick", player) + difficulty > LOGIC_PROUD + and + ( + state.has("Mermaid Kick", player) + or state.has("Combo Master", player) and (state.has("High Jump", player) or state.has("Air Combo Plus", player, 2)) + ) ) ) - and state.has("Progressive Fire", player) )) add_rule(kh1world.get_location("Traverse Town Alleyway Behind Crates Chest"), lambda state: state.has("Red Trinity", player)) - add_rule(kh1world.get_location("Traverse Town Item Workshop Left Chest"), - lambda state: ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - )) add_rule(kh1world.get_location("Wonderland Rabbit Hole Green Trinity Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest"), - lambda state: has_x_worlds(state, player, 5, options.keyblades_unlock_chests)) + lambda state: ( + has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_NORMAL and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + or difficulty > LOGIC_PROUD + )) + add_rule(kh1world.get_location("Wonderland Bizarre Room Green Trinity Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Left Red Chest"), lambda state: ( - state.has("Footprints", player) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) or state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Blue Chest"), lambda state: ( - state.has("Footprints", player) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) or state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Red Chest"), lambda state: ( - state.has("Footprints", player) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) or state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Thunder Plant Chest"), lambda state: ( - state.has_all({ - "Progressive Thunder", - "Footprints"}, player) + state.has("Progressive Thunder", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest"), lambda state: ( - state.has_all({ - "Progressive Thunder", - "Footprints"}, player) + state.has("Progressive Thunder", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Glide Chest"), lambda state: ( state.has("Progressive Glide", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and (state.has("High Jump", player) or can_dumbo_skip(state, player)) - and state.has("Footprints", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Corner Chest"), lambda state: ( - ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - ) - or options.advanced_logic + state.has_all({"High Jump", "Progressive Glide"}, player) + or difficulty > LOGIC_BEGINNER and state.has_any({"High Jump","Progressive Glide"}, player) + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Wonderland Bizarre Room Lamp Chest"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest"), lambda state: ( state.has("Progressive Glide", player) or ( - state.has("High Jump", player, 2) - and state.has("Footprints", player) + difficulty > LOGIC_BEGINNER + and state.has("High Jump", player, 2) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) ) or ( - options.advanced_logic - and state.has_all({ - "High Jump", - "Footprints"}, player) + difficulty > LOGIC_NORMAL + and (state.has("High Jump", player) or can_dumbo_skip(state, player)) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest"), @@ -252,289 +330,330 @@ def set_rules(kh1world): state.has("Progressive Glide", player) or ( - state.has("High Jump", player, 2) - and state.has("Footprints", player) + difficulty > LOGIC_BEGINNER + and state.has("High Jump", player, 2) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) ) or ( - options.advanced_logic - and state.has_all({ - "High Jump", - "Footprints"}, player) + difficulty > LOGIC_NORMAL + and (state.has("High Jump", player) or can_dumbo_skip(state, player)) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest"), lambda state: ( - - state.has("Footprints", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) )) add_rule(kh1world.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest"), lambda state: ( state.has("Progressive Glide", player) or ( - state.has("High Jump", player, 3) - and state.has("Footprints", player) + difficulty > LOGIC_BEGINNER + and state.has("High Jump", player, 3) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) ) or ( - options.advanced_logic - and state.has_all({ - "High Jump", - "Footprints", - "Combo Master"}, player) + difficulty > LOGIC_NORMAL + and + ( + ( + state.has_all({"High Jump", "Combo Master"}, player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + ) + or (state.has("High Jump", player, 2) and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + ) + ) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) ) )) add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest"), lambda state: ( - state.has_all({ - "White Trinity", - "Footprints"}, player) + state.has("White Trinity", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Right Chest"), lambda state: ( - - state.has("High Jump", player) - or state.has("Progressive Glide", player) - or options.advanced_logic + state.has_all({"High Jump", "Progressive Glide"}, player) + or + ( + difficulty > LOGIC_BEGINNER + and (state.has("High Jump", player) + or state.has("Progressive Glide", player)) + ) + or + difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Deep Jungle Climbing Trees Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Deep Jungle Cavern of Hearts White Trinity Chest"), lambda state: ( - state.has_all({ - "White Trinity", - "Slides"}, player) + state.has("White Trinity", player) + and has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Deep Jungle Camp Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Low Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Middle Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Wall Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Middle Chest"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Tree House Rooftop Chest"), + lambda state: ( + state.has("High Jump", player) + or difficulty > LOGIC_NORMAL + )) add_rule(kh1world.get_location("Deep Jungle Tree House Suspended Boat Chest"), lambda state: ( state.has("Progressive Glide", player) - or options.advanced_logic + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest"), lambda state: ( state.has("High Jump", player) - or state.has("Progressive Glide", player) - or (options.advanced_logic and can_dumbo_skip(state, player)) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) )) add_rule(kh1world.get_location("Agrabah Palace Gates High Opposite Palace Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) + or difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Agrabah Palace Gates High Close to Palace Chest"), lambda state: ( + state.has_all({"High Jump", "Progressive Glide"}, player) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or ( - state.has_all({ - "High Jump", - "Progressive Glide"}, player) - or + difficulty > LOGIC_NORMAL + and ( - options.advanced_logic - and - ( - state.has("Combo Master", player) - or can_dumbo_skip(state, player) - ) + state.has("High Jump", player, 2) + or state.has("Progressive Glide", player) + or state.has_all({"High Jump", "Combo Master"}, player) ) ) - or state.has("High Jump", player, 3) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has("Combo Master", player)) # can_dumbo_skip(state, player) )) add_rule(kh1world.get_location("Agrabah Storage Green Trinity Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest"), lambda state: ( state.has("Progressive Glide", player) - or (options.advanced_logic and state.has("Combo Master", player)) - or (options.advanced_logic and can_dumbo_skip(state, player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or + ( + difficulty > LOGIC_NORMAL + and + ( + state.has("Combo Master", player) + or can_dumbo_skip(state, player) + or state.has("High Jump", player) + ) + ) + or difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest"), lambda state: ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) - or options.advanced_logic + state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Right Chest"), lambda state: ( state.has("Yellow Trinity", player) - or state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Left Chest"), lambda state: ( state.has("Yellow Trinity", player) - or state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or (difficulty > LOGIC_NORMAL and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest"), lambda state: state.has("White Trinity", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Other Platform Chest"), - lambda state: ( - state.has_all(("High Jump", "Progressive Glide"), player) - or (options.advanced_logic and state.has("Combo Master", player)) - )) add_rule(kh1world.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_NORMAL + )) + add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest"), + lambda state: state.has_any({"High Jump", "Progressive Glide"}, player) or difficulty > LOGIC_BEGINNER) + add_rule(kh1world.get_location("Monstro Chamber 6 Other Platform Chest"), + lambda state: ( + state.has_all({"High Jump","Progressive Glide"}, player) + or + ( + difficulty > LOGIC_NORMAL + and + ( + state.has("Combo Master", player) + or state.has("High Jump", player) + or state.has("Progressive Glide", player) + ) + ) + or + difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), lambda state: ( - state.has_all(("High Jump", "Progressive Glide"), player) - or (options.advanced_logic and state.has("Combo Master", player)) + state.has_all({"High Jump","Progressive Glide"}, player) + or + ( + difficulty > LOGIC_NORMAL + and + ( + state.has("Combo Master", player) + or state.has("High Jump", player) + or state.has("Progressive Glide", player) + ) + ) + or + difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Halloween Town Moonlight Hill White Trinity Chest"), lambda state: ( - state.has_all({ - "White Trinity", - "Forget-Me-Not"}, player) + state.has("White Trinity", player) + and has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Halloween Town Bridge Under Bridge"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Halloween Town Boneyard Tombstone Puzzle Chest"), - lambda state: state.has("Forget-Me-Not", player)) + lambda state: has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Halloween Town Bridge Right of Gate Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and ( state.has("Progressive Glide", player) - or options.advanced_logic + or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player)) + or difficulty > LOGIC_PROUD ) )) add_rule(kh1world.get_location("Halloween Town Cemetery Behind Grave Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Cemetery By Cat Shape Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Cemetery Between Graves Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or has_basic_tools or state.has("Progressive Glide", player)) + # difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2) + # difficulty > LOGIC_NORMAL and state.has("Combo Master", player) or state.has("High Jump", player) + # difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or has_basic_tools or state.has_all({"High Jump", "Progressive Glide"})) )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Hollow Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not", - "Red Trinity"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and state.has("Red Trinity", player) )) add_rule(kh1world.get_location("Halloween Town Guillotine Square High Tower Chest"), lambda state: ( - state.has("High Jump", player) - or (options.advanced_logic and can_dumbo_skip(state, player)) - or (options.advanced_logic and state.has("Progressive Glide", player)) + state.has_all({"High Jump", "Progressive Glide"}, player) + or (difficulty > LOGIC_BEGINNER and (state.has("High Jump", player) or state.has("Progressive Glide", player))) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) )) add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest"), lambda state: ( ( state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) ) and ( state.has("Progressive Glide", player) - or (options.advanced_logic and state.has("Combo Master", player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("Combo Master", player)) ) )) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Entrance Steps Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - )) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Inside Entrance Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - )) - add_rule(kh1world.get_location("Halloween Town Bridge Left of Gate Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and - ( - state.has("Progressive Glide", player) - or state.has("High Jump", player) - or options.advanced_logic - ) - )) - add_rule(kh1world.get_location("Halloween Town Cemetery By Striped Grave Chest"), - lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) - )) add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest"), lambda state: ( ( state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player)) ) and ( state.has("Progressive Glide", player) - or (options.advanced_logic and state.has("Combo Master", player)) - or state.has("High Jump", player, 2) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 2)) + or (difficulty > LOGIC_NORMAL and state.has("Combo Master", player)) ) )) + add_rule(kh1world.get_location("Halloween Town Oogie's Manor Entrance Steps Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + )) + add_rule(kh1world.get_location("Halloween Town Oogie's Manor Inside Entrance Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + )) + add_rule(kh1world.get_location("Halloween Town Bridge Left of Gate Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and + ( + state.has("Progressive Glide", player) + or state.has("High Jump", player) + or difficulty > LOGIC_NORMAL + ) + )) + add_rule(kh1world.get_location("Halloween Town Cemetery By Striped Grave Chest"), + lambda state: ( + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) + )) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest"), lambda state: state.has("Blue Trinity", player)) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest"), @@ -548,37 +667,47 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Monstro Mouth High Platform Boat Side Chest"), lambda state: ( state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Monstro Mouth High Platform Across from Boat Chest"), lambda state: ( state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Monstro Mouth Green Trinity Top of Boat Chest"), lambda state: ( ( state.has("High Jump", player) - or state.has("Progressive Glide", player) + or (difficulty > LOGIC_BEGINNER and state.has("Progressive Glide", player)) ) and state.has("Green Trinity", player) )) + add_rule(kh1world.get_location("Monstro Mouth Near Ship Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"High Jump","Progressive Glide"}, player) or has_basic_tools)) + add_rule(kh1world.get_location("Monstro Chamber 2 Platform Chest"), + lambda state: ( + state.has_any({"High Jump","Progressive Glide"}, player) + or difficulty > LOGIC_BEGINNER + )) add_rule(kh1world.get_location("Monstro Chamber 5 Platform Chest"), - lambda state: state.has("High Jump", player)) + lambda state: ( + state.has("High Jump", player) + or difficulty > LOGIC_NORMAL + )) add_rule(kh1world.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_BEGINNER )) add_rule(kh1world.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_BEGINNER )) add_rule(kh1world.get_location("Monstro Chamber 5 Atop Barrel Chest"), lambda state: ( state.has("High Jump", player) - or options.advanced_logic + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("Neverland Pirate Ship Deck White Trinity Chest"), lambda state: ( @@ -598,27 +727,23 @@ def set_rules(kh1world): lambda state: ( state.has("Green Trinity", player) or state.has("Progressive Glide", player) - or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) )) add_rule(kh1world.get_location("Neverland Clock Tower Chest"), - lambda state: ( - state.has("Green Trinity", player) - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - )) + lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Neverland Hold Flight 2nd Chest"), lambda state: ( state.has("Green Trinity", player) or state.has("Progressive Glide", player) - or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) )) add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Green Chest"), lambda state: state.has("Yellow Trinity", player)) add_rule(kh1world.get_location("Neverland Captain's Cabin Chest"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest"), + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest"), #might be possible with CM and 2ACP lambda state: ( state.has("High Jump", player) or state.has("Progressive Glide", player) @@ -633,87 +758,99 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Hollow Bastion Rising Falls High Platform Chest"), lambda state: ( state.has("Progressive Glide", player) - or (state.has("Progressive Blizzard", player) and has_emblems(state, player, options.keyblades_unlock_chests)) - or (options.advanced_logic and state.has("Combo Master", player)) + or (state.has("Progressive Blizzard", player) and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player) or state.has("Combo Master", player))) + or difficulty > LOGIC_PROUD )) add_rule(kh1world.get_location("Hollow Bastion Castle Gates Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) and ( - has_emblems(state, player, options.keyblades_unlock_chests) - or (options.advanced_logic and state.has("High Jump", player, 2) and state.has("Progressive Glide", player)) - or (options.advanced_logic and can_dumbo_skip(state, player) and state.has("Progressive Glide", player)) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player)) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) ) )) add_rule(kh1world.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - or state.has("High Jump", player, 2) - or (options.advanced_logic and can_dumbo_skip(state, player)) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player))) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) )) add_rule(kh1world.get_location("Hollow Bastion Castle Gates High Pillar Chest"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - or state.has("High Jump", player, 2) - or (options.advanced_logic and can_dumbo_skip(state, player)) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player))) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) )) + add_rule(kh1world.get_location("Hollow Bastion Base Level Platform Near Entrance Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"Progressive Glide", "High Jump"}, player))) add_rule(kh1world.get_location("Hollow Bastion Great Crest Lower Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Great Crest After Battle Platform Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion High Tower 2nd Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hollow Bastion High Tower 1st Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest"), lambda state: state.has("Progressive Gravity", player)) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and state.has_all({ - "Progressive Glide", - "Progressive Gravity"}, player) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and state.has("Progressive Gravity", player) + and (difficulty > LOGIC_BEGINNER or state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest"), lambda state: state.has("Progressive Gravity", player)) add_rule(kh1world.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest"), lambda state: ( state.has("Progressive Gravity", player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and + ( + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player)) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) + ) )) add_rule(kh1world.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest"), lambda state: ( (state.has("Progressive Blizzard", player) and state.has("High Jump", player)) - or state.has("High Jump", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) )) add_rule(kh1world.get_location("Hollow Bastion Grand Hall Steps Right Side Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Grand Hall Oblivion Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Grand Hall Left of Gate Chest"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest"), lambda state: ( state.has("High Jump", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) ) )) add_rule(kh1world.get_location("Hollow Bastion Rising Falls White Trinity Chest"), @@ -721,84 +858,87 @@ def set_rules(kh1world): add_rule(kh1world.get_location("End of the World Giant Crevasse 5th Chest"), lambda state: ( state.has("Progressive Glide", player) + or difficulty > LOGIC_NORMAL )) add_rule(kh1world.get_location("End of the World Giant Crevasse 1st Chest"), lambda state: ( state.has("High Jump", player) or state.has("Progressive Glide", player) + or difficulty > LOGIC_PROUD )) + add_rule(kh1world.get_location("End of the World Giant Crevasse 2nd Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"High Jump", "Progressive Glide"}, player))) + add_rule(kh1world.get_location("End of the World Giant Crevasse 3rd Chest"), + lambda state: (difficulty > LOGIC_BEGINNER or state.has_any({"High Jump", "Progressive Glide"}, player))) add_rule(kh1world.get_location("End of the World Giant Crevasse 4th Chest"), lambda state: ( + state.has("Progressive Glide", player) + or ( - options.advanced_logic - and state.has("High Jump", player) - and state.has("Combo Master", player) + difficulty > LOGIC_NORMAL + and + ( + state.has_all({"High Jump", "Combo Master"}, player) + or state.has("High Jump", player, 2) + ) ) - or state.has("Progressive Glide", player) )) add_rule(kh1world.get_location("End of the World World Terminus Agrabah Chest"), lambda state: ( state.has("High Jump", player) or ( - options.advanced_logic + difficulty > LOGIC_NORMAL and can_dumbo_skip(state, player) and state.has("Progressive Glide", player) - ) + ) #difficulty > LOGIC_PROUD and (can_dumbo_skip(state, player) or state.has("Progressive Glide", player)) )) add_rule(kh1world.get_location("Monstro Chamber 6 White Trinity Chest"), lambda state: state.has("White Trinity", player)) add_rule(kh1world.get_location("Traverse Town Kairi Secret Waterway Oathkeeper Event"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) and state.has("Hollow Bastion", player) - and has_x_worlds(state, player, 5, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) + add_rule(kh1world.get_location("Traverse Town Secret Waterway Navi Gummi Event"), + lambda state: ( + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and state.has("Hollow Bastion", player) + and has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Deep Jungle Defeat Sabor White Fang Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Defeat Clayton Cure Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Seal Keyhole Jungle King Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Seal Keyhole Red Trinity Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Olympus Coliseum Defeat Cerberus Inferno Band Event"), - lambda state: state.has("Entry Pass", player)) + lambda state: has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Olympus Coliseum Cloud Sonic Blade Event"), - lambda state: state.has("Entry Pass", player)) + lambda state: has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Defeat Trickmaster Blizzard Event"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Defeat Trickmaster Ifrit's Horn Event"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Monstro Defeat Parasite Cage II Stop Event"), - lambda state: ( - state.has("High Jump", player) - or - ( - options.advanced_logic - and state.has("Progressive Glide", player) - ) - )) + lambda state: (has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)))) add_rule(kh1world.get_location("Halloween Town Defeat Oogie Boogie Holy Circlet Event"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Defeat Oogie's Manor Gravity Event"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Halloween Town Seal Keyhole Pumpkinhead Event"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not"}, player) - and has_oogie_manor(state, player, options.advanced_logic) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Neverland Defeat Anti Sora Raven's Claw Event"), lambda state: state.has("Green Trinity", player)) @@ -810,18 +950,20 @@ def set_rules(kh1world): lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Neverland Seal Keyhole Glide Event"), lambda state: state.has("Green Trinity", player)) + add_rule(kh1world.get_location("Neverland Seal Keyhole Navi-G Piece Event"), + lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Neverland Defeat Captain Hook Ars Arcanum Event"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Defeat Maleficent Donald Cheer Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Dragon Maleficent Fireglow Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Riku II Ragnarok Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Behemoth Omega Arts Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Speak to Princesses Fire Event"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Traverse Town Mail Postcard 01 Event"), lambda state: state.has("Postcard", player)) add_rule(kh1world.get_location("Traverse Town Mail Postcard 02 Event"), @@ -844,130 +986,76 @@ def set_rules(kh1world): lambda state: state.has("Postcard", player, 10)) add_rule(kh1world.get_location("Traverse Town Defeat Opposite Armor Aero Event"), lambda state: state.has("Red Trinity", player)) + add_rule(kh1world.get_location("Traverse Town Defeat Opposite Armor Navi-G Piece Event"), + lambda state: state.has("Red Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 2"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 4"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Defeat Maleficent Ansem's Report 5"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 6"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Halloween Town Defeat Oogie Boogie Ansem's Report 7"), lambda state: ( - state.has_all({ - "Jack-In-The-Box", - "Forget-Me-Not", - "Progressive Fire"}, player) + has_key_item(state, player, "Forget-Me-Not", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) and has_key_item(state, player, "Jack-In-The-Box", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_oogie_manor(state, player, difficulty) )) add_rule(kh1world.get_location("Neverland Defeat Hook Ansem's Report 9"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Hollow Bastion Speak with Aerith Ansem's Report 10"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 1"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 2"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 3"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 4"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto Reward 5"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Geppetto All Summons Reward"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) + lambda state: + has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) and has_all_summons(state, player) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Traverse Town Geppetto's House Talk to Pinocchio"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Traverse Town Magician's Study Obtained All Arts Items"), lambda state: ( has_all_magic_lvx(state, player, 1) and has_all_arts(state, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, 0, hundred_acre_wood) #due to the softlock potential, I'm forcing it to logic normally instead of allowing the bypass )) add_rule(kh1world.get_location("Traverse Town Magician's Study Obtained All LV1 Magic"), lambda state: has_all_magic_lvx(state, player, 1)) add_rule(kh1world.get_location("Traverse Town Magician's Study Obtained All LV3 Magic"), lambda state: has_all_magic_lvx(state, player, 3)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 10 Puppies"), - lambda state: has_puppies(state, player, 10)) + lambda state: has_puppies(state, player, 10, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 20 Puppies"), - lambda state: has_puppies(state, player, 20)) + lambda state: has_puppies(state, player, 20, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 30 Puppies"), - lambda state: has_puppies(state, player, 30)) + lambda state: has_puppies(state, player, 30, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 40 Puppies"), - lambda state: has_puppies(state, player, 40)) + lambda state: has_puppies(state, player, 40, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 50 Puppies Reward 1"), - lambda state: has_puppies(state, player, 50)) + lambda state: has_puppies(state, player, 50, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 50 Puppies Reward 2"), - lambda state: has_puppies(state, player, 50)) + lambda state: has_puppies(state, player, 50, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 60 Puppies"), - lambda state: has_puppies(state, player, 60)) + lambda state: has_puppies(state, player, 60, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 70 Puppies"), - lambda state: has_puppies(state, player, 70)) + lambda state: has_puppies(state, player, 70, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 80 Puppies"), - lambda state: has_puppies(state, player, 80)) + lambda state: has_puppies(state, player, 80, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 90 Puppies"), - lambda state: has_puppies(state, player, 90)) + lambda state: has_puppies(state, player, 90, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 99 Puppies Reward 1"), - lambda state: has_puppies(state, player, 99)) + lambda state: has_puppies(state, player, 99, options.puppy_value.value)) add_rule(kh1world.get_location("Traverse Town Piano Room Return 99 Puppies Reward 2"), - lambda state: has_puppies(state, player, 99)) + lambda state: has_puppies(state, player, 99, options.puppy_value.value)) add_rule(kh1world.get_location("Neverland Hold Aero Chest"), lambda state: state.has("Yellow Trinity", player)) add_rule(kh1world.get_location("Deep Jungle Camp Hi-Potion Experiment"), @@ -977,258 +1065,312 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Deep Jungle Camp Replication Experiment"), lambda state: state.has("Progressive Blizzard", player)) add_rule(kh1world.get_location("Deep Jungle Cliff Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Tree House Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Camp Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Bamboo Thicket Save Gorillas"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Climbing Trees Save Gorillas"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 10 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 20 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 30 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 40 Fruits"), - lambda state: state.has("Slides", player)) - add_rule(kh1world.get_location("Deep Jungle Jungle Slider 50 Fruits"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Bizarre Room Read Book"), - lambda state: state.has("Footprints", player)) + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Green Trinity"), lambda state: state.has("Green Trinity", player)) add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Hero's License Event"), - lambda state: state.has("Entry Pass", player)) + lambda state: has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Deep Jungle Cavern of Hearts Navi-G Piece Event"), - lambda state: state.has("Slides", player)) + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Wonderland Bizarre Room Navi-G Piece Event"), - lambda state: state.has("Footprints", player)) - add_rule(kh1world.get_location("Traverse Town Synth Log"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Traverse Town Synth 15 Items"), lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Cloth"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Rope"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Seagull Egg"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Fish"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) - )) - add_rule(kh1world.get_location("Traverse Town Synth Mushroom"), - lambda state: ( - state.has("Empty Bottle", player, 6) - and - ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - ) + min(state.count("Orichalcum", player),9) + min(state.count("Mythril", player),9) >= 15 + and has_item_workshop(state, player, difficulty) )) + for i in range(33): + add_rule(kh1world.get_location("Traverse Town Synth Item " + str(i+1).rjust(2,'0')), + lambda state: ( + state.has("Orichalcum", player, 17) + and state.has("Mythril", player, 16) + and has_item_workshop(state, player, difficulty) + )) + add_item_rule(kh1world.get_location("Traverse Town Synth Item " + str(i+1).rjust(2,'0')), + lambda i: (i.player != player or i.name not in ["Orichalcum", "Mythril"])) add_rule(kh1world.get_location("Traverse Town Gizmo Shop Postcard 1"), lambda state: state.has("Progressive Thunder", player)) add_rule(kh1world.get_location("Traverse Town Gizmo Shop Postcard 2"), lambda state: state.has("Progressive Thunder", player)) add_rule(kh1world.get_location("Traverse Town Item Workshop Postcard"), - lambda state: ( - state.has("Green Trinity", player) - or state.has("High Jump", player, 3) - )) + lambda state: (has_item_workshop(state, player, difficulty))) add_rule(kh1world.get_location("Traverse Town Geppetto's House Postcard"), - lambda state: ( - state.has("Monstro", player) - and - ( - state.has("High Jump", player) - or (options.advanced_logic and state.has("Progressive Glide", player)) - ) - and has_x_worlds(state, player, 2, options.keyblades_unlock_chests) - )) + lambda state: has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood))) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)"), lambda state: ( ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) ) and state.has("Progressive Fire", player) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has("Progressive Glide", player) or state.has("Progressive Thunder", player) - or options.advanced_logic + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player)) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)"), lambda state: ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) )) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)"), lambda state: ( ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) ) and state.has("Red Trinity", player) )) add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)"), lambda state: ( - state.has("Theon Vol. 6", player) - or state.has("High Jump", player, 3) - or has_emblems(state, player, options.keyblades_unlock_chests) + has_key_item(state, player, "Theon Vol. 6", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3)) + or (difficulty > LOGIC_NORMAL and state.has("High Jump", player, 2)) )) add_rule(kh1world.get_location("Hollow Bastion Library Speak to Belle Divine Rose"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_location("Hollow Bastion Library Speak to Aerith Cure"), - lambda state: has_emblems(state, player, options.keyblades_unlock_chests)) + lambda state: has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + add_rule(kh1world.get_location("Traverse Town 1st District Blue Trinity by Exit Door"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Traverse Town 3rd District Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Traverse Town Magician's Study Blue Trinity"), + lambda state: ( + state.has_all({ + "Blue Trinity", + "Progressive Fire"}, player) + )) + add_rule(kh1world.get_location("Wonderland Lotus Forest Blue Trinity in Alcove"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Wonderland Lotus Forest Blue Trinity by Moving Boulder"), + lambda state: ( + state.has("Blue Trinity", player) + and has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + )) + add_rule(kh1world.get_location("Agrabah Bazaar Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Monstro Mouth Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Monstro Throat Blue Trinity"), + lambda state: ( + state.has("Blue Trinity", player) + and has_parasite_cage(state, player, difficulty, has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) + )) + add_rule(kh1world.get_location("Monstro Chamber 5 Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Hollow Bastion Great Crest Blue Trinity"), + lambda state: ( + state.has("Blue Trinity", player) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) + add_rule(kh1world.get_location("Hollow Bastion Dungeon Blue Trinity"), + lambda state: state.has("Blue Trinity", player)) + add_rule(kh1world.get_location("Deep Jungle Treetop Green Trinity"), + lambda state: state.has("Green Trinity", player)) + add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Red Trinity"), + lambda state: state.has("Red Trinity", player)) + add_rule(kh1world.get_location("Wonderland Bizarre Room Examine Flower Pot"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Wonderland Lotus Forest Yellow Elixir Flower Through Painting"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Wonderland Lotus Forest Red Flower Raise Lily Pads"), + lambda state: has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Left Cushioned Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Left Pink Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Right Yellow Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Left Gray Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Wonderland Tea Party Garden Right Brown Chair"), + lambda state: ( + has_key_item(state, player, "Footprints", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + or state.has("Progressive Glide", player) + or + ( + difficulty > LOGIC_PROUD + and state.has_all_counts({"Combo Master": 1, "High Jump": 3, "Air Combo Plus": 2}, player) + ) + )) + add_rule(kh1world.get_location("Hollow Bastion Lift Stop from Waterway Examine Node"), + lambda state: ( + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + or (difficulty > LOGIC_BEGINNER and state.has("High Jump", player, 3) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_NORMAL and (state.has("High Jump", player, 2) or can_dumbo_skip(state, player)) and state.has("Progressive Glide", player)) + or (difficulty > LOGIC_PROUD and state.has_all({"High Jump", "Progressive Glide"},player)) + )) + for i in range(1,13): + add_rule(kh1world.get_location("Neverland Clock Tower " + str(i).rjust(2, "0") + ":00 Door"), + lambda state: state.has("Green Trinity", player)) if options.hundred_acre_wood: add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 1"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 2"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 3"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 4"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Turn in Rare Nut 5"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or (difficulty > LOGIC_PROUD and state.has("Combo Master", player)) ) )) add_rule(kh1world.get_location("100 Acre Wood Pooh's House Owl Cheer"), - lambda state: has_torn_pages(state, player, 5)) + lambda state: state.has("Torn Page", player, 5)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 1"), - lambda state: has_torn_pages(state, player, 1)) + lambda state: state.has("Torn Page", player, 1)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 2"), - lambda state: has_torn_pages(state, player, 2)) + lambda state: state.has("Torn Page", player, 2)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 3"), - lambda state: has_torn_pages(state, player, 3)) + lambda state: state.has("Torn Page", player, 3)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 4"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Convert Torn Page 5"), - lambda state: has_torn_pages(state, player, 5)) + lambda state: state.has("Torn Page", player, 5)) add_rule(kh1world.get_location("100 Acre Wood Pooh's House Start Fire"), - lambda state: has_torn_pages(state, player, 3)) + lambda state: state.has("Torn Page", player, 3)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Break Log"), - lambda state: has_torn_pages(state, player, 4)) + lambda state: state.has("Torn Page", player, 4)) add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Fall Through Top of Tree Next to Pooh"), lambda state: ( - has_torn_pages(state, player, 4) + state.has("Torn Page", player, 4) and ( - state.has("High Jump", player) - or state.has("Progressive Glide", player) + state.has_all({"High Jump", "Progressive Glide"},player) + or (difficulty > LOGIC_BEGINNER and (state.has("Progressive Glide", player) or state.has("High Jump", player))) + or difficulty > LOGIC_NORMAL ) )) if options.atlantica: add_rule(kh1world.get_location("Atlantica Ursula's Lair Use Fire on Urchin Chest"), lambda state: ( - state.has_all({ - "Progressive Fire", - "Crystal Trident"}, player) + state.has("Progressive Fire", player) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Triton's Palace White Trinity Chest"), lambda state: state.has("White Trinity", player)) add_rule(kh1world.get_location("Atlantica Defeat Ursula I Mermaid Kick Event"), lambda state: ( - has_offensive_magic(state, player) - and state.has("Crystal Trident", player) + has_offensive_magic(state, player, difficulty) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Defeat Ursula II Thunder Event"), lambda state: ( state.has("Mermaid Kick", player) - and has_offensive_magic(state, player) - and state.has("Crystal Trident", player) + and has_offensive_magic(state, player, difficulty) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Seal Keyhole Crabclaw Event"), lambda state: ( state.has("Mermaid Kick", player) - and has_offensive_magic(state, player) - and state.has("Crystal Trident", player) + and has_offensive_magic(state, player, difficulty) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Atlantica Undersea Gorge Blizzard Clam"), lambda state: state.has("Progressive Blizzard", player)) @@ -1237,721 +1379,411 @@ def set_rules(kh1world): add_rule(kh1world.get_location("Atlantica Triton's Palace Thunder Clam"), lambda state: state.has("Progressive Thunder", player)) add_rule(kh1world.get_location("Atlantica Cavern Nook Clam"), - lambda state: state.has("Crystal Trident", player)) + lambda state: has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) add_rule(kh1world.get_location("Atlantica Defeat Ursula II Ansem's Report 3"), lambda state: ( - state.has_all({ - "Mermaid Kick", - "Crystal Trident"}, player) - and has_offensive_magic(state, player) - )) - if options.cups: - add_rule(kh1world.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + state.has("Mermaid Kick", player) + and has_key_item(state, player, "Crystal Trident", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_offensive_magic(state, player, difficulty) )) + if options.cups.current_key != "off": + if options.cups.current_key == "hades_cup": + add_rule(kh1world.get_location("Olympus Coliseum Defeat Hades Ansem's Report 8"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) add_rule(kh1world.get_location("Complete Phil Cup"), lambda state: ( - state.has_all({ - "Phil Cup", - "Entry Pass"}, player) + state.has("Phil Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Phil Cup Solo"), lambda state: ( - state.has_all({ - "Phil Cup", - "Entry Pass"}, player) + state.has("Phil Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Phil Cup Time Trial"), lambda state: ( - state.has_all({ - "Phil Cup", - "Entry Pass"}, player) + state.has("Phil Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Pegasus Cup"), lambda state: ( - state.has_all({ - "Pegasus Cup", - "Entry Pass"}, player) + state.has("Pegasus Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Pegasus Cup Solo"), lambda state: ( - state.has_all({ - "Pegasus Cup", - "Entry Pass"}, player) + state.has("Pegasus Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Pegasus Cup Time Trial"), lambda state: ( - state.has_all({ - "Pegasus Cup", - "Entry Pass"}, player) + state.has("Pegasus Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) )) add_rule(kh1world.get_location("Complete Hercules Cup"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Complete Hercules Cup Solo"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Complete Hercules Cup Time Trial"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - )) - add_rule(kh1world.get_location("Complete Hades Cup"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Complete Hades Cup Solo"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Complete Hades Cup Time Trial"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Cloud and Leon Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Yuffie Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Cerberus Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Behemoth Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Hades Cup Defeat Hades Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hercules Cup Defeat Cloud Event"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) add_rule(kh1world.get_location("Hercules Cup Yellow Trinity Event"), lambda state: ( - state.has_all({ - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - )) - add_rule(kh1world.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass", - "Guard"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - )) - add_rule(kh1world.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades"), - lambda state: ( - state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + state.has("Hercules Cup", player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) + if options.cups.current_key == "hades_cup": + add_rule(kh1world.get_location("Complete Hades Cup"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Complete Hades Cup Solo"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Complete Hades Cup Time Trial"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Cloud and Leon Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Yuffie Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Cerberus Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Behemoth Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Hades Cup Defeat Hades Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + add_rule(kh1world.get_location("Olympus Coliseum Gates Purple Jar After Defeating Hades"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) + if options.cups.current_key == "hades_cup" and options.super_bosses: + add_rule(kh1world.get_location("Olympus Coliseum Defeat Ice Titan Diamond Dust Event"), + lambda state: ( + state.has_all({ + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and (state.has("Guard", player) or difficulty > LOGIC_PROUD) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + )) add_rule(kh1world.get_location("Olympus Coliseum Olympia Chest"), lambda state: ( state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 4, options.keyblades_unlock_chests) - )) + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) if options.super_bosses: add_rule(kh1world.get_location("Neverland Defeat Phantom Stop Event"), lambda state: ( state.has("Green Trinity", player) - and has_all_magic_lvx(state, player, 2) - and has_defensive_tools(state, player) - and has_emblems(state, player, options.keyblades_unlock_chests) + and has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and + ( + has_all_magic_lvx(state, player, 3) + or (difficulty > LOGIC_BEGINNER and has_all_magic_lvx(state, player, 2)) + or (difficulty > LOGIC_NORMAL and state.has_all({"Progressive Fire", "Progressive Blizzard", "Progressive Thunder", "Progressive Stop"}, player)) + or + ( + difficulty > LOGIC_PROUD + and state.has_any({"Progressive Fire","Progressive Blizzard"}, player) + and state.has_any({"Progressive Fire","Progressive Thunder"}, player) + and state.has_any({"Progressive Thunder","Progressive Blizzard"}, player) + and state.has("Progressive Stop", player) + ) + ) + and (state.has("Leaf Bracer", player) or difficulty > LOGIC_NORMAL) )) add_rule(kh1world.get_location("Agrabah Defeat Kurt Zisa Ansem's Report 11"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) - and state.has("Progressive Blizzard", player, 3) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and + ( + state.has("Progressive Blizzard", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has_any_count({"Progressive Blizzard": 2, "Progressive Fire": 3,"Progressive Thunder": 3, "Progressive Gravity": 3}, player)) + or (difficulty > LOGIC_NORMAL and (state.has_any_count({"Progressive Blizzard": 1, "Progressive Fire": 2, "Progressive Thunder": 2, "Progressive Gravity": 2}, player))) + or (difficulty > LOGIC_PROUD and (state.has_any({"Progressive Fire", "Progressive Thunder", "Progressive Gravity"}, player) or (state.has_group("Magic", player) and state.has_all({"Mushu", "Genie", "Dumbo"}, player)))) + ) )) add_rule(kh1world.get_location("Agrabah Defeat Kurt Zisa Zantetsuken Event"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and has_defensive_tools(state, player) and state.has("Progressive Blizzard", player, 3) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and + ( + state.has("Progressive Blizzard", player, 3) + or (difficulty > LOGIC_BEGINNER and state.has_any_count({"Progressive Blizzard": 2, "Progressive Fire": 3,"Progressive Thunder": 3, "Progressive Gravity": 3}, player)) + or (difficulty > LOGIC_NORMAL and (state.has_any_count({"Progressive Blizzard": 1, "Progressive Fire": 2, "Progressive Thunder": 2, "Progressive Gravity": 2}, player))) + or (difficulty > LOGIC_PROUD and (state.has_any({"Progressive Fire", "Progressive Thunder", "Progressive Gravity"}, player) or (state.has_group("Magic", player) and state.has_all({"Mushu", "Genie", "Dumbo"}, player)))) + ) )) - if options.super_bosses or options.goal.current_key == "sephiroth": + if options.super_bosses or options.final_rest_door_key.current_key == "sephiroth": add_rule(kh1world.get_location("Olympus Coliseum Defeat Sephiroth Ansem's Report 12"), lambda state: ( state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) )) add_rule(kh1world.get_location("Olympus Coliseum Defeat Sephiroth One-Winged Angel Event"), lambda state: ( state.has_all({ - "Phil Cup", - "Pegasus Cup", - "Hercules Cup", - "Entry Pass"}, player) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + "Phil Cup", + "Pegasus Cup", + "Hercules Cup"}, player) + and has_key_item(state, player, "Entry Pass", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) )) - if options.super_bosses or options.goal.current_key == "unknown": + if options.super_bosses or options.final_rest_door_key.current_key == "unknown": add_rule(kh1world.get_location("Hollow Bastion Defeat Unknown Ansem's Report 13"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) - and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or state.has("Progressive Gravity", player)) )) add_rule(kh1world.get_location("Hollow Bastion Defeat Unknown EXP Necklace Event"), lambda state: ( - has_emblems(state, player, options.keyblades_unlock_chests) and has_x_worlds(state, player, 7, options.keyblades_unlock_chests) - and has_defensive_tools(state, player) + has_emblems(state, player, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + and has_defensive_tools(state, player, difficulty) + and (difficulty > LOGIC_BEGINNER or state.has("Progressive Gravity", player)) )) - for i in range(options.level_checks): - add_rule(kh1world.get_location("Level " + str(i+1).rjust(3,'0')), + if options.jungle_slider: + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 10 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 20 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 30 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 40 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + add_rule(kh1world.get_location("Deep Jungle Jungle Slider 50 Fruits"), + lambda state: has_key_item(state, player, "Slides", stacking_world_items, halloween_town_key_item_bundle, difficulty, options.keyblades_unlock_chests)) + if options.destiny_islands: + add_rule(kh1world.get_location("Destiny Islands Seashore Capture Fish 1 (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Seashore Capture Fish 2 (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Seashore Capture Fish 3 (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Seashore Gather Seagull Egg (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Secret Place Gather Mushroom (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Cove Gather Mushroom Near Zip Line (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Cove Gather Mushroom in Small Cave (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + #add_rule(kh1world.get_location("Destiny Islands Seashore Deliver Kairi Items (Day 1)"), + # lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Secret Place Gather Mushroom (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Cove Talk to Kairi (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Gather Drinking Water (Day 2)"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + add_rule(kh1world.get_location("Destiny Islands Chest"), + lambda state: state.has("Raft Materials", player, day_2_materials)) + #add_rule(kh1world.get_location("Destiny Islands Cove Deliver Kairi Items (Day 2)"), + # lambda state: state.has("Raft Materials", player, homecoming_materials)) + for i in range(1,options.level_checks+1): + add_rule(kh1world.get_location("Level " + str(i+1).rjust(3,'0') + " (Slot 1)"), lambda state, level_num=i: ( - has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests) + has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests, difficulty, hundred_acre_wood) )) - if options.goal.current_key == "final_ansem": - add_rule(kh1world.get_location("Final Ansem"), - lambda state: ( - has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_reports, options.keyblades_unlock_chests, options.puppies) - )) - if options.keyblades_unlock_chests: - add_rule(kh1world.get_location("Traverse Town 1st District Candle Puzzle Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 1st District Accessory Shop Roof Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 2nd District Rooftop Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 2nd District Gizmo Shop Facade Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Balcony Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Blue Room Awning Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Corner Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Green Room Clock Puzzle Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Green Room Table Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Red Room Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Mystical House Yellow Trinity Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Accessory Shop Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Secret Waterway White Trinity Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Geppetto's House Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Item Workshop Right Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town 1st District Blue Trinity Balcony Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Mystical House Glide Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Alleyway Behind Crates Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Item Workshop Left Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Traverse Town Secret Waterway Near Stairs Chest"), - lambda state: state.has("Lionheart", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Green Trinity Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 1 Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 2 Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Rabbit Hole Defeat Heartless 3 Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Bizarre Room Green Trinity Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Left Red Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Blue Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Queen's Castle Hedge Right Red Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Thunder Plant Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting Thunder Plant Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Glide Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Nut Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Corner Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Bizarre Room Lamp Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 2nd Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Above Lotus Forest Entrance 1st Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Bear and Clock Puzzle Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Tea Party Garden Across From Bizarre Room Entrance Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Wonderland Lotus Forest Through the Painting White Trinity Chest"), - lambda state: state.has("Lady Luck", player)) - add_rule(kh1world.get_location("Deep Jungle Tree House Beneath Tree House Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tree House Rooftop Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Center Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Left Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Hippo's Lagoon Right Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Vines Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Vines 2 Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Climbing Trees Blue Trinity Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tunnel Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Cavern of Hearts White Trinity Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Camp Blue Trinity Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tent Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Low Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern Middle Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Wall Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Waterfall Cavern High Middle Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Cliff Right Cliff Left Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Cliff Right Cliff Right Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Deep Jungle Tree House Suspended Boat Chest"), - lambda state: state.has("Jungle King", player)) - add_rule(kh1world.get_location("Agrabah Plaza By Storage Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Plaza Raised Terrace Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Plaza Top Corner Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Alley Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Bazaar Across Windows Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Bazaar High Corner Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Main Street Right Palace Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Main Street High Above Alley Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Main Street High Above Palace Gates Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Palace Gates Low Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Palace Gates High Opposite Palace Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Palace Gates High Close to Palace Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Storage Green Trinity Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Storage Behind Barrel Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance Left Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance Tall Tower Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hall High Left Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hall Near Bottomless Hall Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Raised Platform Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Pillar Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Bottomless Hall Across Chasm Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Across Platforms Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Small Treasure Pile Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Large Treasure Pile Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Treasure Room Above Fire Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Relic Chamber Jump from Stairs Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Relic Chamber Stairs Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Abu Gem Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Across from Relic Chamber Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Bridge Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Dark Chamber Near Save Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Silent Chamber Blue Trinity Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Right Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Hidden Room Left Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Aladdin's House Main Street Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Aladdin's House Plaza Entrance Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Agrabah Cave of Wonders Entrance White Trinity Chest"), - lambda state: state.has("Three Wishes", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Other Platform Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Platform Near Chamber 5 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Raised Area Near Chamber 1 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 Low Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Halloween Town Moonlight Hill White Trinity Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Bridge Under Bridge"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Boneyard Tombstone Puzzle Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Bridge Right of Gate Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery Behind Grave Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery By Cat Shape Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery Between Graves Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Lower Iron Cage Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Upper Iron Cage Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Hollow Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Grounds Red Trinity Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square High Tower Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Left Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Entrance Steps Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Oogie's Manor Inside Entrance Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Bridge Left of Gate Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Cemetery By Striped Grave Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square Under Jack's House Stairs Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Halloween Town Guillotine Square Pumpkin Structure Right Chest"), - lambda state: state.has("Pumpkinhead", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Left Behind Columns Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Right Blue Trinity Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Left Blue Trinity Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates White Trinity Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Blizzara Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Olympus Coliseum Coliseum Gates Blizzaga Chest"), - lambda state: state.has("Olympia", player)) - add_rule(kh1world.get_location("Monstro Mouth Boat Deck Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth High Platform Boat Side Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth High Platform Across from Boat Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth Near Ship Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth Green Trinity Top of Boat Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 2 Ground Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 2 Platform Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Platform Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Ground Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Platform Above Chamber 2 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Near Chamber 6 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 3 Platform Near Chamber 6 Entrance Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Mouth High Platform Near Teeth Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Atop Barrel Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Low 2nd Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Monstro Chamber 5 Low 1st Chest"), - lambda state: state.has("Wishing Star", player)) - add_rule(kh1world.get_location("Neverland Pirate Ship Deck White Trinity Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Pirate Ship Crows Nest Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Right Blue Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Left Blue Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Galley Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Cabin Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Flight 1st Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Clock Tower Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Flight 2nd Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Hold Yellow Trinity Green Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Neverland Captain's Cabin Chest"), - lambda state: state.has("Fairy Harp", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Water's Surface Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Under Water 1st Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Under Water 2nd Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Save Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls Floating Platform Near Bubble Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls High Platform Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Castle Gates Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Castle Gates Freestanding Pillar Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Castle Gates High Pillar Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Great Crest Lower Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Great Crest After Battle Platform Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion High Tower 2nd Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion High Tower 1st Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion High Tower Above Sliding Blocks Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Library Top of Bookshelf Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node After High Tower Switch Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Library Node Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Under High Tower Sliding Blocks Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Outside Library Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Lift Stop Heartless Sigil Door Gravity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Base Level Bubble Under the Wall Platform Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Base Level Platform Near Entrance Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Base Level Near Crystal Switch Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Waterway Near Save Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Waterway Blizzard on Bubble Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Waterway Unlock Passage from Base Level Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Dungeon By Candles Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Dungeon Corner Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Grand Hall Steps Right Side Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Grand Hall Oblivion Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Grand Hall Left of Gate Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Entrance Hall Left of Emblem Door Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("Hollow Bastion Rising Falls White Trinity Chest"), - lambda state: state.has("Divine Rose", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 1st Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 2nd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 3rd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 4th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 5th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 6th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 10th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 9th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 8th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Dimension 7th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 3rd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 5th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 1st Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 4th Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Giant Crevasse 2nd Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Traverse Town Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Wonderland Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Olympus Coliseum Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Deep Jungle Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Agrabah Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Halloween Town Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus Neverland Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World World Terminus 100 Acre Wood Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("End of the World Final Rest Chest"), - lambda state: state.has("Oblivion", player)) - add_rule(kh1world.get_location("Monstro Chamber 6 White Trinity Chest"), - lambda state: state.has("Oblivion", player)) - if options.hundred_acre_wood: - add_rule(kh1world.get_location("100 Acre Wood Meadow Inside Log Chest"), - lambda state: state.has("Oathkeeper", player)) - add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Left Cliff Chest"), - lambda state: state.has("Oathkeeper", player)) - add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Right Tree Alcove Chest"), - lambda state: state.has("Oathkeeper", player)) - add_rule(kh1world.get_location("100 Acre Wood Bouncing Spot Under Giant Pot Chest"), - lambda state: state.has("Oathkeeper", player)) - + if i+1 in kh1world.get_slot_2_levels(): + add_rule(kh1world.get_location("Level " + str(i+1).rjust(3,'0') + " (Slot 2)"), + lambda state, level_num=i: ( + has_x_worlds(state, player, min(((level_num//10)*2), 8), options.keyblades_unlock_chests, difficulty, hundred_acre_wood) + )) + add_rule(kh1world.get_location("Final Ansem"), + lambda state: ( + has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) # In logic, player is strong enough + and + ( + ( # Can DI Finish + state.has("Destiny Islands", player) + and state.has("Raft Materials", player, homecoming_materials) + ) + or + ( + ( # Has access to EotW + ( + has_lucky_emblems(state, player, eotw_required_lucky_emblems) + and end_of_the_world_unlock == "lucky_emblems" + ) + or state.has("End of the World", player) + ) + and has_final_rest_door(state, player, final_rest_door_requirement, final_rest_door_required_lucky_emblems) # Can open the Door + ) + ) + and has_defensive_tools(state, player, difficulty) + )) + for location in location_table.keys(): + try: + kh1world.get_location(location) + except KeyError: + continue + if difficulty == LOGIC_BEGINNER and location_table[location].behind_boss: + add_rule(kh1world.get_location(location), + lambda state: has_basic_tools(state, player)) + if options.remote_items.current_key == "off": + if location_table[location].type == "Static": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or item_table[i.name].type == "Item")) + if location_table[location].type == "Level Slot 1": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or item_table[i.name].category in ["Level Up", "Limited Level Up"])) + if location_table[location].type == "Level Slot 2": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or (item_table[i.name].category in ["Level Up", "Limited Level Up"] or item_table[i.name].type == "Ability"))) + if location_table[location].type == "Synth": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or (item_table[i.name].type == "Item"))) + if location_table[location].type == "Prize": + add_item_rule(kh1world.get_location(location), + lambda i: (i.player != player or (item_table[i.name].type == "Item"))) + if options.keyblades_unlock_chests: + if location_table[location].type == "Chest" or location in BROKEN_KEYBLADE_LOCKING_LOCATIONS: + location_world = location_table[location].category + location_required_keyblade = KEYBLADES[WORLDS.index(location_world)] + if location not in BROKEN_KEYBLADE_LOCKING_LOCATIONS: + add_rule(kh1world.get_location(location), + lambda state, location_required_keyblade = location_required_keyblade: state.has(location_required_keyblade, player)) + else: + add_rule(kh1world.get_location(location), + lambda state, location_required_keyblade = location_required_keyblade: state.has(location_required_keyblade, player) or difficulty > LOGIC_BEGINNER) + + if options.destiny_islands: + add_rule(kh1world.get_entrance("Destiny Islands"), + lambda state: state.has("Destiny Islands", player)) add_rule(kh1world.get_entrance("Wonderland"), - lambda state: state.has("Wonderland", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Wonderland", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Olympus Coliseum"), - lambda state: state.has("Olympus Coliseum", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Olympus Coliseum", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Deep Jungle"), - lambda state: state.has("Deep Jungle", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Deep Jungle", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Agrabah"), - lambda state: state.has("Agrabah", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Agrabah", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Monstro"), - lambda state: state.has("Monstro", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Monstro", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) if options.atlantica: add_rule(kh1world.get_entrance("Atlantica"), - lambda state: state.has("Atlantica", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Atlantica", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Halloween Town"), - lambda state: state.has("Halloween Town", player) and has_x_worlds(state, player, 2, options.keyblades_unlock_chests)) + lambda state: state.has("Halloween Town", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Neverland"), - lambda state: state.has("Neverland", player) and has_x_worlds(state, player, 3, options.keyblades_unlock_chests)) + lambda state: state.has("Neverland", player) and has_x_worlds(state, player, 4, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("Hollow Bastion"), - lambda state: state.has("Hollow Bastion", player) and has_x_worlds(state, player, 5, options.keyblades_unlock_chests)) + lambda state: state.has("Hollow Bastion", player) and has_x_worlds(state, player, 6, options.keyblades_unlock_chests, difficulty, hundred_acre_wood)) add_rule(kh1world.get_entrance("End of the World"), - lambda state: has_x_worlds(state, player, 7, options.keyblades_unlock_chests) and (has_reports(state, player, eotw_required_reports) or state.has("End of the World", player))) + lambda state: has_x_worlds(state, player, 8, options.keyblades_unlock_chests, difficulty, hundred_acre_wood) and ((has_lucky_emblems(state, player, eotw_required_lucky_emblems) and end_of_the_world_unlock == "lucky_emblems") or state.has("End of the World", player))) add_rule(kh1world.get_entrance("100 Acre Wood"), lambda state: state.has("Progressive Fire", player)) diff --git a/worlds/kh1/__init__.py b/worlds/kh1/__init__.py index ac0afca501..fbdc99206a 100644 --- a/worlds/kh1/__init__.py +++ b/worlds/kh1/__init__.py @@ -1,23 +1,29 @@ import logging +import re from typing import List +from math import ceil from BaseClasses import Tutorial from worlds.AutoWorld import WebWorld, World from .Items import KH1Item, KH1ItemData, event_item_table, get_items_by_category, item_table, item_name_groups -from .Locations import KH1Location, location_table, get_locations_by_category, location_name_groups +from .Locations import KH1Location, location_table, get_locations_by_type, location_name_groups from .Options import KH1Options, kh1_option_groups from .Regions import connect_entrances, create_regions from .Rules import set_rules from .Presets import kh1_option_presets -from worlds.LauncherComponents import Component, components, Type, launch as launch_component - +from worlds.LauncherComponents import Component, components, Type, launch as launch_component, icon_paths +from .GenerateJSON import generate_json +from .Data import VANILLA_KEYBLADE_STATS, VANILLA_PUPPY_LOCATIONS, CHAR_TO_KH, VANILLA_ABILITY_AP_COSTS, WORLD_KEY_ITEMS +from worlds.LauncherComponents import Component, components, Type, launch_subprocess def launch_client(): from .Client import launch launch_component(launch, name="KH1 Client") -components.append(Component("KH1 Client", "KH1Client", func=launch_client, component_type=Type.CLIENT)) +components.append(Component("KH1 Client", func=launch_client, component_type=Type.CLIENT, icon="kh1_heart")) + +icon_paths["kh1_heart"] = f"ap:{__name__}/icons/kh1_heart.png" class KH1Web(WebWorld): @@ -54,6 +60,19 @@ class KH1World(World): fillers.update(get_items_by_category("Item")) fillers.update(get_items_by_category("Camping")) fillers.update(get_items_by_category("Stat Ups")) + slot_2_levels: list[int] + keyblade_stats: list[dict[str, int]] + starting_accessory_locations: list[str] + starting_accessories: list[str] + ap_costs: list[dict[str, str | int | bool]] + + def __init__(self, multiworld, player): + super(KH1World, self).__init__(multiworld, player) + self.slot_2_levels = None + self.keyblade_stats = None + self.starting_accessory_locations = None + self.starting_accessories = None + self.ap_costs = None def create_items(self): self.place_predetermined_items() @@ -63,12 +82,29 @@ class KH1World(World): possible_starting_worlds = ["Wonderland", "Olympus Coliseum", "Deep Jungle", "Agrabah", "Monstro", "Halloween Town", "Neverland", "Hollow Bastion"] if self.options.atlantica: possible_starting_worlds.append("Atlantica") + if self.options.destiny_islands: + possible_starting_worlds.append("Destiny Islands") if self.options.end_of_the_world_unlock == "item": possible_starting_worlds.append("End of the World") starting_worlds = self.random.sample(possible_starting_worlds, min(self.options.starting_worlds.value, len(possible_starting_worlds))) for starting_world in starting_worlds: self.multiworld.push_precollected(self.create_item(starting_world)) + # Handle starting tools + starting_tools = [] + if self.options.starting_tools: + starting_tools = ["Scan", "Dodge Roll"] + self.multiworld.push_precollected(self.create_item("Scan")) + self.multiworld.push_precollected(self.create_item("Dodge Roll")) + + # Handle starting party member accessories + starting_party_member_accessories = [] + starting_party_member_locations = [] + starting_party_member_locations = self.get_starting_accessory_locations() + starting_party_member_accessories = self.get_starting_accessories() + for i in range(len(starting_party_member_locations)): + self.get_location(self.starting_accessory_locations[i]).place_locked_item(self.create_item(self.starting_accessories[i])) + item_pool: List[KH1Item] = [] possible_level_up_item_pool = [] level_up_item_pool = [] @@ -94,19 +130,26 @@ class KH1World(World): # Fill remaining pool with items from other pool self.random.shuffle(possible_level_up_item_pool) - level_up_item_pool = level_up_item_pool + possible_level_up_item_pool[:(100 - len(level_up_item_pool))] - - level_up_locations = list(get_locations_by_category("Levels").keys()) + level_up_item_pool = level_up_item_pool + possible_level_up_item_pool[:(99 - len(level_up_item_pool))] + + level_up_locations = list(get_locations_by_type("Level Slot 1").keys()) self.random.shuffle(level_up_item_pool) - current_level_for_placing_stats = self.options.force_stats_on_levels.value - while len(level_up_item_pool) > 0 and current_level_for_placing_stats <= self.options.level_checks: - self.get_location(level_up_locations[current_level_for_placing_stats - 1]).place_locked_item(self.create_item(level_up_item_pool.pop())) - current_level_for_placing_stats += 1 + current_level_index_for_placing_stats = self.options.force_stats_on_levels.value - 2 # Level 2 is index 0, Level 3 is index 1, etc + if self.options.remote_items.current_key == "off" and self.options.force_stats_on_levels.value != 2: + logging.info(f"{self.player_name}'s value {self.options.force_stats_on_levels.value} for force_stats_on_levels was changed\n" + f"Set to 2 as remote_items if \"off\"") + self.options.force_stats_on_levels.value = 2 + current_level_index_for_placing_stats = 0 + while len(level_up_item_pool) > 0 and current_level_index_for_placing_stats < self.options.level_checks: # With all levels in location pool, 99 level ups so need to go index 0-98 + self.get_location(level_up_locations[current_level_index_for_placing_stats]).place_locked_item(self.create_item(level_up_item_pool.pop())) + current_level_index_for_placing_stats += 1 + + # Calculate prefilled locations and items - prefilled_items = [] - if self.options.vanilla_emblem_pieces: - prefilled_items = prefilled_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"] + exclude_items = ["Final Door Key", "Lucky Emblem"] + if not self.options.randomize_emblem_pieces: + exclude_items = exclude_items + ["Emblem Piece (Flame)", "Emblem Piece (Chest)", "Emblem Piece (Fountain)", "Emblem Piece (Statue)"] total_locations = len(self.multiworld.get_unfilled_locations(self.player)) @@ -117,27 +160,29 @@ class KH1World(World): quantity = data.max_quantity if data.category not in non_filler_item_categories: continue - if name in starting_worlds: + if name in starting_worlds or name in starting_tools or name in starting_party_member_accessories: continue - if data.category == "Puppies": - if self.options.puppies == "triplets" and "-" in name: - item_pool += [self.create_item(name) for _ in range(quantity)] - if self.options.puppies == "individual" and "Puppy" in name: - item_pool += [self.create_item(name) for _ in range(0, quantity)] - if self.options.puppies == "full" and name == "All Puppies": - item_pool += [self.create_item(name) for _ in range(0, quantity)] + if self.options.stacking_world_items and name in WORLD_KEY_ITEMS.keys() and name not in ("Crystal Trident", "Jack-In-The-Box"): # Handling these special cases separately + item_pool += [self.create_item(WORLD_KEY_ITEMS[name]) for _ in range(0, 1)] + elif self.options.halloween_town_key_item_bundle and name == "Jack-In-The-Box": + continue + elif name == "Puppy": + if self.options.randomize_puppies: + item_pool += [self.create_item(name) for _ in range(ceil(99/self.options.puppy_value.value))] elif name == "Atlantica": if self.options.atlantica: item_pool += [self.create_item(name) for _ in range(0, quantity)] elif name == "Mermaid Kick": - if self.options.atlantica: - if self.options.extra_shared_abilities: - item_pool += [self.create_item(name) for _ in range(0, 2)] - else: - item_pool += [self.create_item(name) for _ in range(0, quantity)] + if self.options.atlantica and self.options.extra_shared_abilities: + item_pool += [self.create_item(name) for _ in range(0, 2)] + else: + item_pool += [self.create_item(name) for _ in range(0, quantity)] elif name == "Crystal Trident": if self.options.atlantica: - item_pool += [self.create_item(name) for _ in range(0, quantity)] + if self.options.stacking_world_items: + item_pool += [self.create_item(WORLD_KEY_ITEMS[name]) for _ in range(0, 1)] + else: + item_pool += [self.create_item(name) for _ in range(0, quantity)] elif name == "High Jump": if self.options.extra_shared_abilities: item_pool += [self.create_item(name) for _ in range(0, 3)] @@ -154,11 +199,26 @@ class KH1World(World): elif name == "EXP Zero": if self.options.exp_zero_in_pool: item_pool += [self.create_item(name) for _ in range(0, quantity)] - elif name not in prefilled_items: + elif name == "Postcard": + if self.options.randomize_postcards.current_key == "chests": + item_pool += [self.create_item(name) for _ in range(0, 3)] + if self.options.randomize_postcards.current_key == "all": + item_pool += [self.create_item(name) for _ in range(0, quantity)] + elif name == "Orichalcum": + item_pool += [self.create_item(name) for _ in range(0, self.options.orichalcum_in_pool.value)] + elif name == "Mythril": + item_pool += [self.create_item(name) for _ in range(0, self.options.mythril_in_pool.value)] + elif name == "Destiny Islands": + if self.options.destiny_islands: + item_pool += [self.create_item(name) for _ in range(0, quantity)] + elif name == "Raft Materials": + if self.options.destiny_islands: + item_pool += [self.create_item(name) for _ in range(0, self.options.materials_in_pool.value)] + elif name not in exclude_items: item_pool += [self.create_item(name) for _ in range(0, quantity)] - for i in range(self.determine_reports_in_pool()): - item_pool += [self.create_item("Ansem's Report " + str(i+1))] + for i in range(self.determine_lucky_emblems_in_pool()): + item_pool += [self.create_item("Lucky Emblem")] while len(item_pool) < total_locations and len(level_up_item_pool) > 0: item_pool += [self.create_item(level_up_item_pool.pop())] @@ -170,63 +230,117 @@ class KH1World(World): self.multiworld.itempool += item_pool def place_predetermined_items(self) -> None: - goal_dict = { - "sephiroth": "Olympus Coliseum Defeat Sephiroth Ansem's Report 12", - "unknown": "Hollow Bastion Defeat Unknown Ansem's Report 13", - "postcards": "Traverse Town Mail Postcard 10 Event", - "final_ansem": "Final Ansem", - "puppies": "Traverse Town Piano Room Return 99 Puppies Reward 2", - "final_rest": "End of the World Final Rest Chest" - } - self.get_location(goal_dict[self.options.goal.current_key]).place_locked_item(self.create_item("Victory")) - if self.options.vanilla_emblem_pieces: + if self.options.final_rest_door_key.current_key not in ["puppies", "postcards", "lucky_emblems"]: + goal_dict = { + "sephiroth": "Olympus Coliseum Defeat Sephiroth Ansem's Report 12", + "unknown": "Hollow Bastion Defeat Unknown Ansem's Report 13", + "final_rest": "End of the World Final Rest Chest" + } + goal_location_name = goal_dict[self.options.final_rest_door_key.current_key] + elif self.options.final_rest_door_key.current_key == "postcards": + lpad_number = str(self.options.required_postcards).rjust(2, "0") + goal_location_name = "Traverse Town Mail Postcard " + lpad_number + " Event" + elif self.options.final_rest_door_key.current_key == "puppies": + required_puppies = self.options.required_puppies.value + goal_location_name = "Traverse Town Piano Room Return " + str(required_puppies) + " Puppies" + if required_puppies == 50 or required_puppies == 99: + goal_location_name = goal_location_name + " Reward 2" + if self.options.final_rest_door_key.current_key != "lucky_emblems": + self.get_location(goal_location_name).place_locked_item(self.create_item("Final Door Key")) + self.get_location("Final Ansem").place_locked_item(self.create_event("Victory")) + + if not self.options.randomize_emblem_pieces: self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Flame)").place_locked_item(self.create_item("Emblem Piece (Flame)")) self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Statue)").place_locked_item(self.create_item("Emblem Piece (Statue)")) self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Fountain)").place_locked_item(self.create_item("Emblem Piece (Fountain)")) self.get_location("Hollow Bastion Entrance Hall Emblem Piece (Chest)").place_locked_item(self.create_item("Emblem Piece (Chest)")) + if self.options.randomize_postcards != "all": + self.get_location("Traverse Town Item Shop Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 1st District Safe Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Gizmo Shop Postcard 1").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Gizmo Shop Postcard 2").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Item Workshop Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 3rd District Balcony Postcard").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town Geppetto's House Postcard").place_locked_item(self.create_item("Postcard")) + if self.options.randomize_postcards.current_key == "vanilla": + self.get_location("Traverse Town 1st District Accessory Shop Roof Chest").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 2nd District Boots and Shoes Awning Chest").place_locked_item(self.create_item("Postcard")) + self.get_location("Traverse Town 1st District Blue Trinity Balcony Chest").place_locked_item(self.create_item("Postcard")) + if not self.options.randomize_puppies: + if self.options.puppy_value.value != 3: + self.options.puppy_value.value = 3 + logging.info(f"{self.player_name}'s value of {self.options.puppy_value.value} for puppy value was changed to 3 as Randomize Puppies is OFF") + for i, location in enumerate(VANILLA_PUPPY_LOCATIONS): + self.get_location(location).place_locked_item(self.create_item("Puppy")) def get_filler_item_name(self) -> str: weights = [data.weight for data in self.fillers.values()] return self.random.choices([filler for filler in self.fillers.keys()], weights)[0] def fill_slot_data(self) -> dict: - slot_data = {"xpmult": int(self.options.exp_multiplier)/16, - "required_reports_eotw": self.determine_reports_required_to_open_end_of_the_world(), - "required_reports_door": self.determine_reports_required_to_open_final_rest_door(), - "door": self.options.final_rest_door.current_key, - "seed": self.multiworld.seed_name, - "advanced_logic": bool(self.options.advanced_logic), - "hundred_acre_wood": bool(self.options.hundred_acre_wood), + slot_data = { "atlantica": bool(self.options.atlantica), - "goal": str(self.options.goal.current_key)} - if self.options.randomize_keyblade_stats: - min_str_bonus = min(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) - max_str_bonus = max(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) - self.options.keyblade_min_str.value = min_str_bonus - self.options.keyblade_max_str.value = max_str_bonus - min_mp_bonus = min(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) - max_mp_bonus = max(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) - self.options.keyblade_min_mp.value = min_mp_bonus - self.options.keyblade_max_mp.value = max_mp_bonus - slot_data["keyblade_stats"] = "" - for i in range(22): - if i < 4 and self.options.bad_starting_weapons: - slot_data["keyblade_stats"] = slot_data["keyblade_stats"] + "1,0," - else: - str_bonus = int(self.random.randint(min_str_bonus, max_str_bonus)) - mp_bonus = int(self.random.randint(min_mp_bonus, max_mp_bonus)) - slot_data["keyblade_stats"] = slot_data["keyblade_stats"] + str(str_bonus) + "," + str(mp_bonus) + "," - slot_data["keyblade_stats"] = slot_data["keyblade_stats"][:-1] - if self.options.donald_death_link: - slot_data["donalddl"] = "" - if self.options.goofy_death_link: - slot_data["goofydl"] = "" - if self.options.keyblades_unlock_chests: - slot_data["chestslocked"] = "" - else: - slot_data["chestsunlocked"] = "" - if self.options.interact_in_battle: - slot_data["interactinbattle"] = "" + "auto_attack": bool(self.options.auto_attack), + "auto_save": bool(self.options.auto_save), + "bad_starting_weapons": bool(self.options.bad_starting_weapons), + "beep_hack": bool(self.options.beep_hack), + "consistent_finishers": bool(self.options.consistent_finishers), + "cups": str(self.options.cups.current_key), + "day_2_materials": int(self.options.day_2_materials.value), + "death_link": str(self.options.death_link.current_key), + "destiny_islands": bool(self.options.destiny_islands), + "donald_death_link": bool(self.options.donald_death_link), + "early_skip": bool(self.options.early_skip), + "end_of_the_world_unlock": str(self.options.end_of_the_world_unlock.current_key), + "exp_multiplier": int(self.options.exp_multiplier.value)/16, + "exp_zero_in_pool": bool(self.options.exp_zero_in_pool), + "extra_shared_abilities": bool(self.options.extra_shared_abilities), + "fast_camera": bool(self.options.fast_camera), + "faster_animations": bool(self.options.faster_animations), + "final_rest_door_key": str(self.options.final_rest_door_key.current_key), + "force_stats_on_levels": int(self.options.force_stats_on_levels.value), + "four_by_three": bool(self.options.four_by_three), + "goofy_death_link": bool(self.options.goofy_death_link), + "halloween_town_key_item_bundle": bool(self.options.halloween_town_key_item_bundle), + "homecoming_materials": int(self.options.homecoming_materials.value), + "hundred_acre_wood": bool(self.options.hundred_acre_wood), + "interact_in_battle": bool(self.options.interact_in_battle), + "jungle_slider": bool(self.options.jungle_slider), + "keyblades_unlock_chests": bool(self.options.keyblades_unlock_chests), + "level_checks": int(self.options.level_checks.value), + "logic_difficulty": str(self.options.logic_difficulty.current_key), + "materials_in_pool": int(self.options.materials_in_pool.value), + "max_ap_cost": int(self.options.max_ap_cost.value), + "min_ap_cost": int(self.options.min_ap_cost.value), + "mythril_in_pool": int(self.options.mythril_in_pool.value), + "mythril_price": int(self.options.mythril_price.value), + "one_hp": bool(self.options.one_hp), + "orichalcum_in_pool": int(self.options.orichalcum_in_pool.value), + "orichalcum_price": int(self.options.orichalcum_price.value), + "puppy_value": int(self.options.puppy_value.value), + "randomize_ap_costs": str(self.options.randomize_ap_costs.current_key), + "randomize_emblem_pieces": bool(self.options.exp_zero_in_pool), + "randomize_party_member_starting_accessories": bool(self.options.randomize_party_member_starting_accessories), + "randomize_postcards": str(self.options.randomize_postcards.current_key), + "randomize_puppies": str(self.options.randomize_puppies.current_key), + "remote_items": str(self.options.remote_items.current_key), + "remote_location_ids": self.get_remote_location_ids(), + "required_lucky_emblems_door": self.determine_lucky_emblems_required_to_open_final_rest_door(), + "required_lucky_emblems_eotw": self.determine_lucky_emblems_required_to_open_end_of_the_world(), + "required_postcards": int(self.options.required_postcards.value), + "required_puppies": int(self.options.required_puppies.value), + "seed": self.multiworld.seed_name, + "shorten_go_mode": bool(self.options.shorten_go_mode), + "slot_2_level_checks": int(self.options.slot_2_level_checks.value), + "stacking_world_items": bool(self.options.stacking_world_items), + "starting_items": [item.code for item in self.multiworld.precollected_items[self.player]], + "starting_tools": bool(self.options.starting_tools), + "super_bosses": bool(self.options.super_bosses), + "synthesis_item_name_byte_arrays": self.get_synthesis_item_name_byte_arrays(), + "unlock_0_volume": bool(self.options.unlock_0_volume), + "unskippable": bool(self.options.unskippable), + "warp_anywhere": bool(self.options.warp_anywhere) + } return slot_data def create_item(self, name: str) -> KH1Item: @@ -241,45 +355,260 @@ class KH1World(World): set_rules(self) def create_regions(self): - create_regions(self.multiworld, self.player, self.options) - + create_regions(self) + def connect_entrances(self): - connect_entrances(self.multiworld, self.player) + connect_entrances(self) + + def generate_output(self, output_directory: str): + """ + Generates the json file for use with mod generator. + """ + generate_json(self, output_directory) def generate_early(self): - value_names = ["Reports to Open End of the World", "Reports to Open Final Rest Door", "Reports in Pool"] - initial_report_settings = [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value] - self.change_numbers_of_reports_to_consider() - new_report_settings = [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value] + self.determine_level_checks() + + value_names = ["Lucky Emblems to Open End of the World", "Lucky Emblems to Open Final Rest Door", "Lucky Emblems in Pool"] + initial_lucky_emblem_settings = [self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value] + self.change_numbers_of_lucky_emblems_to_consider() + new_lucky_emblem_settings = [self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value] for i in range(3): - if initial_report_settings[i] != new_report_settings[i]: - logging.info(f"{self.player_name}'s value {initial_report_settings[i]} for \"{value_names[i]}\" was invalid\n" - f"Setting \"{value_names[i]}\" value to {new_report_settings[i]}") + if initial_lucky_emblem_settings[i] != new_lucky_emblem_settings[i]: + logging.info(f"{self.player_name}'s value {initial_lucky_emblem_settings[i]} for \"{value_names[i]}\" was invalid\n" + f"Setting \"{value_names[i]}\" value to {new_lucky_emblem_settings[i]}") + + value_names = ["Day 2 Materials", "Homecoming Materials", "Materials in Pool"] + initial_materials_settings = [self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value] + self.change_numbers_of_materials_to_consider() + new_materials_settings = [self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value] + for i in range(3): + if initial_materials_settings[i] != new_materials_settings[i]: + logging.info(f"{self.player_name}'s value {initial_materials_settings[i]} for \"{value_names[i]}\" was invalid\n" + f"Setting \"{value_names[i]}\" value to {new_materials_settings[i]}") + + if self.options.stacking_world_items.value and not self.options.halloween_town_key_item_bundle.value: + logging.info(f"{self.player_name}'s value {self.options.halloween_town_key_item_bundle.value} for Halloween Town Key Item Bundle must be TRUE when Stacking World Items is on. Setting to TRUE") + self.options.halloween_town_key_item_bundle.value = True - def change_numbers_of_reports_to_consider(self) -> None: - if self.options.end_of_the_world_unlock == "reports" and self.options.final_rest_door == "reports": - self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value = sorted( - [self.options.required_reports_eotw.value, self.options.required_reports_door.value, self.options.reports_in_pool.value]) + def change_numbers_of_lucky_emblems_to_consider(self) -> None: + if self.options.end_of_the_world_unlock == "lucky_emblems" and self.options.final_rest_door_key == "lucky_emblems": + self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value = sorted( + [self.options.required_lucky_emblems_eotw.value, self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value]) - elif self.options.end_of_the_world_unlock == "reports": - self.options.required_reports_eotw.value, self.options.reports_in_pool.value = sorted( - [self.options.required_reports_eotw.value, self.options.reports_in_pool.value]) + elif self.options.end_of_the_world_unlock == "lucky_emblems": + self.options.required_lucky_emblems_eotw.value, self.options.lucky_emblems_in_pool.value = sorted( + [self.options.required_lucky_emblems_eotw.value, self.options.lucky_emblems_in_pool.value]) - elif self.options.final_rest_door == "reports": - self.options.required_reports_door.value, self.options.reports_in_pool.value = sorted( - [self.options.required_reports_door.value, self.options.reports_in_pool.value]) + elif self.options.final_rest_door_key == "lucky_emblems": + self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value = sorted( + [self.options.required_lucky_emblems_door.value, self.options.lucky_emblems_in_pool.value]) - def determine_reports_in_pool(self) -> int: - if self.options.end_of_the_world_unlock == "reports" or self.options.final_rest_door == "reports": - return self.options.reports_in_pool.value + def determine_lucky_emblems_in_pool(self) -> int: + if self.options.end_of_the_world_unlock == "lucky_emblems" or self.options.final_rest_door_key == "lucky_emblems": + return self.options.lucky_emblems_in_pool.value return 0 - def determine_reports_required_to_open_end_of_the_world(self) -> int: - if self.options.end_of_the_world_unlock == "reports": - return self.options.required_reports_eotw.value - return 14 + def determine_lucky_emblems_required_to_open_end_of_the_world(self) -> int: + if self.options.end_of_the_world_unlock == "lucky_emblems": + return self.options.required_lucky_emblems_eotw.value + return -1 - def determine_reports_required_to_open_final_rest_door(self) -> int: - if self.options.final_rest_door == "reports": - return self.options.required_reports_door.value - return 14 + def determine_lucky_emblems_required_to_open_final_rest_door(self) -> int: + if self.options.final_rest_door_key == "lucky_emblems": + return self.options.required_lucky_emblems_door.value + return -1 + + def change_numbers_of_materials_to_consider(self) -> None: + if self.options.destiny_islands: + self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value = sorted( + [self.options.day_2_materials.value, self.options.homecoming_materials.value, self.options.materials_in_pool.value]) + + def get_remote_location_ids(self): + remote_location_ids = [] + for location in self.multiworld.get_filled_locations(self.player): + if location.name != "Final Ansem": + location_data = location_table[location.name] + if self.options.remote_items.current_key == "full": + if location_data.type != "Starting Accessory": + remote_location_ids.append(location_data.code) + elif self.player == location.item.player and location.item.name != "Victory": + item_data = item_table[location.item.name] + if location_data.type == "Chest": + if item_data.type in ["Stats"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Reward": + if item_data.type in ["Stats"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Static": + if item_data.type not in ["Item"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Level Slot 1": + if item_data.category not in ["Level Up", "Limited Level Up"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Level Slot 2": + if item_data.category not in ["Level Up", "Limited Level Up", "Abilities"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Synth": + if item_data.type not in ["Item"]: + remote_location_ids.append(location_data.code) + if location_data.type == "Prize": + if item_data.type not in ["Item"]: + remote_location_ids.append(location_data.code) + return remote_location_ids + + def get_slot_2_levels(self): + if self.slot_2_levels is None: + self.slot_2_levels = [] + if self.options.max_level_for_slot_2_level_checks - 1 > self.options.level_checks.value: + logging.info(f"{self.player_name}'s value of {self.options.max_level_for_slot_2_level_checks.value} for max level for slot 2 level checks is invalid as it exceeds their value of {self.options.level_checks.value} for Level Checks\n" + f"Setting max level for slot 2 level checks's value to {self.options.level_checks.value + 1}") + self.options.max_level_for_slot_2_level_checks.value = self.options.level_checks.value + 1 + if self.options.slot_2_level_checks.value > self.options.level_checks.value: + logging.info(f"{self.player_name}'s value of {self.options.slot_2_level_checks.value} for slot 2 level checks is invalid as it exceeds their value of {self.options.level_checks.value} for Level Checks\n" + f"Setting slot 2 level check's value to {self.options.level_checks.value}") + self.options.slot_2_level_checks.value = self.options.level_checks.value + if self.options.slot_2_level_checks > self.options.max_level_for_slot_2_level_checks - 1: + logging.info(f"{self.player_name}'s value of {self.options.slot_2_level_checks.value} for slot 2 level checks is invalid as it exceeds their value of {self.options.max_level_for_slot_2_level_checks.value} for Max Level for Slot 2 Level Checks\n" + f"Setting slot 2 level check's value to {self.options.max_level_for_slot_2_level_checks.value - 1}") + self.options.slot_2_level_checks.value = self.options.max_level_for_slot_2_level_checks.value - 1 + # Range is exclusive of the top, so if max_level_for_slot_2_level_checks is 2 then the top end of the range needs to be 3 as the only level it can choose is 2. + self.slot_2_levels = self.random.sample(range(2,self.options.max_level_for_slot_2_level_checks.value + 1), self.options.slot_2_level_checks.value) + return self.slot_2_levels + + def get_keyblade_stats(self): + # Create keyblade stat array from vanilla + keyblade_stats = [x.copy() for x in VANILLA_KEYBLADE_STATS] + # Handle shuffling keyblade stats + if self.options.keyblade_stats != "vanilla": + if self.options.keyblade_stats == "randomize": + # Fix any minimum and max values from settings + min_str_bonus = min(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) + max_str_bonus = max(self.options.keyblade_min_str.value, self.options.keyblade_max_str.value) + self.options.keyblade_min_str.value = min_str_bonus + self.options.keyblade_max_str.value = max_str_bonus + min_crit_rate = min(self.options.keyblade_min_crit_rate.value, self.options.keyblade_max_crit_rate.value) + max_crit_rate = max(self.options.keyblade_min_crit_rate.value, self.options.keyblade_max_crit_rate.value) + self.options.keyblade_min_crit_rate.value = min_crit_rate + self.options.keyblade_max_crit_rate.value = max_crit_rate + min_crit_str = min(self.options.keyblade_min_crit_str.value, self.options.keyblade_max_crit_str.value) + max_crit_str = max(self.options.keyblade_min_crit_str.value, self.options.keyblade_max_crit_str.value) + self.options.keyblade_min_crit_str.value = min_crit_str + self.options.keyblade_max_crit_str.value = max_crit_str + min_recoil = min(self.options.keyblade_min_recoil.value, self.options.keyblade_max_recoil.value) + max_recoil = max(self.options.keyblade_min_recoil.value, self.options.keyblade_max_recoil.value) + self.options.keyblade_min_recoil.value = min_recoil + self.options.keyblade_max_recoil.value = max_recoil + min_mp_bonus = min(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) + max_mp_bonus = max(self.options.keyblade_min_mp.value, self.options.keyblade_max_mp.value) + self.options.keyblade_min_mp.value = min_mp_bonus + self.options.keyblade_max_mp.value = max_mp_bonus + if self.options.bad_starting_weapons: + starting_weapons = keyblade_stats[:4] + other_weapons = keyblade_stats[4:] + else: + starting_weapons = [] + other_weapons = keyblade_stats + for keyblade in other_weapons: + keyblade["STR"] = self.random.randint(min_str_bonus, max_str_bonus) + keyblade["CRR"] = self.random.randint(min_crit_rate, max_crit_rate) + keyblade["CRB"] = self.random.randint(min_crit_str, max_crit_str) + keyblade["REC"] = self.random.randint(min_recoil, max_recoil) + keyblade["MP"] = self.random.randint(min_mp_bonus, max_mp_bonus) + keyblade_stats = starting_weapons + other_weapons + elif self.options.keyblade_stats == "shuffle": + if self.options.bad_starting_weapons: + starting_weapons = keyblade_stats[:4] + other_weapons = keyblade_stats[4:] + self.random.shuffle(other_weapons) + keyblade_stats = starting_weapons + other_weapons + else: + self.random.shuffle(keyblade_stats) + return keyblade_stats + + def determine_level_checks(self): + # Handle if remote_items is off and level_checks > number of stats items + total_level_up_items = min(99, + self.options.strength_increase.value +\ + self.options.defense_increase.value +\ + self.options.hp_increase.value +\ + self.options.mp_increase.value +\ + self.options.ap_increase.value +\ + self.options.accessory_slot_increase.value +\ + self.options.item_slot_increase.value) + if self.options.level_checks.value > total_level_up_items and self.options.remote_items.current_key == "off": + logging.info(f"{self.player_name}'s value {self.options.level_checks.value} for level_checks was changed.\n" + f"This value cannot be more than the number of stat items in the pool when \"remote_items\" is \"off\".\n" + f"Set to be equal to number of stat items in pool, {total_level_up_items}.") + self.options.level_checks.value = total_level_up_items + + def get_synthesis_item_name_byte_arrays(self): + # Get synth item names to show in synthesis menu + synthesis_byte_arrays = [] + for location in self.multiworld.get_filled_locations(self.player): + if location.name != "Final Ansem": + location_data = location_table[location.name] + if location_data.type == "Synth": + item_name = re.sub('[^A-Za-z0-9 ]+', '',str(location.item.name.replace("Progressive", "Prog")))[:14] + byte_array = [] + for character in item_name: + byte_array.append(CHAR_TO_KH[character]) + synthesis_byte_arrays.append(byte_array) + return synthesis_byte_arrays + + def get_starting_accessory_locations(self): + if self.starting_accessory_locations is None: + if self.options.randomize_party_member_starting_accessories: + self.starting_accessory_locations = list(get_locations_by_type("Starting Accessory").keys()) + if not self.options.atlantica: + self.starting_accessory_locations.remove("Ariel Starting Accessory 1") + self.starting_accessory_locations.remove("Ariel Starting Accessory 2") + self.starting_accessory_locations.remove("Ariel Starting Accessory 3") + self.starting_accessory_locations = self.random.sample(self.starting_accessory_locations, 10) + else: + self.starting_accessory_locations = [] + return self.starting_accessory_locations + + def get_starting_accessories(self): + if self.starting_accessories is None: + if self.options.randomize_party_member_starting_accessories: + self.starting_accessories = list(get_items_by_category("Accessory").keys()) + self.starting_accessories = self.random.sample(self.starting_accessories, 10) + else: + self.starting_accessories = [] + return self.starting_accessories + + def get_ap_costs(self): + if self.ap_costs is None: + ap_costs = VANILLA_ABILITY_AP_COSTS.copy() + if self.options.randomize_ap_costs.current_key == "shuffle": + possible_costs = [] + for ap_cost in VANILLA_ABILITY_AP_COSTS: + if ap_cost["Randomize"]: + possible_costs.append(ap_cost["AP Cost"]) + self.random.shuffle(possible_costs) + for ap_cost in ap_costs: + if ap_cost["Randomize"]: + ap_cost["AP Cost"] = possible_costs.pop(0) + elif self.options.randomize_ap_costs.current_key == "randomize": + for ap_cost in ap_costs: + if ap_cost["Randomize"]: + ap_cost["AP Cost"] = self.random.randint(self.options.min_ap_cost.value, self.options.max_ap_cost.value) + elif self.options.randomize_ap_costs.current_key == "distribute": + total_ap_value = 0 + for ap_cost in VANILLA_ABILITY_AP_COSTS: + if ap_cost["Randomize"]: + total_ap_value = total_ap_value + ap_cost["AP Cost"] + for ap_cost in ap_costs: + if ap_cost["Randomize"]: + total_ap_value = total_ap_value - self.options.min_ap_cost.value + ap_cost["AP Cost"] = self.options.min_ap_cost.value + while total_ap_value > 0: + ap_cost = self.random.choice(ap_costs) + if ap_cost["Randomize"]: + if ap_cost["AP Cost"] < self.options.max_ap_cost.value: + amount_to_add = self.random.randint(1, min(self.options.max_ap_cost.value - ap_cost["AP Cost"], total_ap_value)) + ap_cost["AP Cost"] = ap_cost["AP Cost"] + amount_to_add + total_ap_value = total_ap_value - amount_to_add + self.ap_costs = ap_costs + return self.ap_costs diff --git a/worlds/kh1/docs/en_Kingdom Hearts.md b/worlds/kh1/docs/en_Kingdom Hearts.md index 5167505efb..f086267264 100644 --- a/worlds/kh1/docs/en_Kingdom Hearts.md +++ b/worlds/kh1/docs/en_Kingdom Hearts.md @@ -7,7 +7,7 @@ configure and export a config file. ## What does randomization do to this game? -The Kingdom Hearts AP Randomizer randomizes most rewards in the game and adds several items which are used to unlock worlds, Olympus Coliseum cups, and world progression. +The Kingdom Hearts AP Randomizer randomizes rewards in the game and adds several items which are used to unlock worlds, Olympus Coliseum cups, and world progression. Worlds can only be accessed by finding the corresponding item. For example, you need to find the `Monstro` item to enter Monstro. @@ -21,49 +21,26 @@ Any weapon, accessory, spell, trinity, summon, world, key item, stat up, consuma ### Locations -Locations the player can find items include chests, event rewards, Atlantica clams, level up rewards, 101 Dalmatian rewards, and postcard rewards. +Locations the player can find items include: +- Chests +- Rewards +- Static Events +- Map Prizes from things such as Trinities, Wonderland flowers and chairs, etc. +- Level ups ## Which items can be in another player's world? Any of the items which can be shuffled may also be placed into another player's world. It is possible to choose to limit certain items to your own world. + ## When the player receives an item, what happens? -When the player receives an item, your client will display a message displaying the item you have obtained. You will also see a notification in the "LEVEL UP" box. +When the player receives an item, your client will display a message displaying the item you have obtained. You will also see a notification in the "INFORMATION" box. ## What do I do if I encounter a bug with the game? Please reach out to Gicu#7034 on Discord. -## How do I progress in a certain world? - -### The evidence boxes aren't spawning in Wonderland. - -Find `Footprints` in the multiworld. - -### I can't enter any cups in Olympus Coliseum. - -Firstly, find `Entry Pass` in the multiworld. Additionally, `Phil Cup`, `Pegasus Cup`, and `Hercules Cup` are all multiworld items. Finding all 3 grant you access to the Hades Cup and the Platinum Match. Clearing all cups lets you challenge Ice Titan. - -### The slides aren't spawning in Deep Jungle. - -Find `Slides` in the multiworld. - -### I can't progress in Atlantica. -Find `Crystal Trident` in the multiworld. - -### I can't progress in Halloween Town. - -Find `Forget-Me-Not` and `Jack-in-the-Box` in the multiworld. - -### The Hollow Bastion Library is missing a book. - -Find `Theon Vol. 6` in the multiworld. - -## How do I enter the End of the World? - -You can enter End of the World by obtaining a number of Ansem's Reports or by finding `End of the World` in the multiworld, depending on your options. - ## Credits This is a collaborative effort from several individuals in the Kingdom Hearts community, but most of all, denhonator. diff --git a/worlds/kh1/docs/kh1_en.md b/worlds/kh1/docs/kh1_en.md index 522da20b0d..f6b6a64067 100644 --- a/worlds/kh1/docs/kh1_en.md +++ b/worlds/kh1/docs/kh1_en.md @@ -1,54 +1,99 @@ -# Kingdom Hearts Randomizer Setup Guide +# Kingdom Hearts Archipelago Randomizer Setup Guide -## Setting up the required mods +

Required software

-BEFORE MODDING, PLEASE INSTALL AND RUN KH1 AT LEAST ONCE. +- KINGDOM HEARTS -HD 1.5+2.5 ReMIX- from the [Epic Games Store](https://store.epicgames.com/en-US/discover/kingdom-hearts) or [Steam](https://store.steampowered.com/app/2552430/KINGDOM_HEARTS_HD_1525_ReMIX/) -1. Install OpenKH and the LUA Backend +- The latest release of [OpenKH](https://github.com/OpenKH/OpenKh/releases) - Download the [latest release of OpenKH](https://github.com/OpenKH/OpenKh/releases/tag/latest) - - Extract the files to a directory of your choosing. - - Open `OpenKh.Tools.ModsManager.exe` and run first time set up - - When prompted for game edition, choose `PC Release`, select which platform you're using (EGS or Steam), navigate to your `Kingdom Hearts I.5 + II.5` installation folder in the path box and click `Next` - - When prompted, install Panacea, then click `Next` - - When prompted, check KH1 plus any other AP game you play and click `Install and configure LUA backend`, then click `Next` - - Extracting game data for KH1 is unnecessary, but you may want to extract data for KH2 if you plan on playing KH2 AP - - Click `Finish` - -2. Open `OpenKh.Tools.ModsManager.exe` +- The latest release of the [Kingdom Hearts 1FM Randomizer Software](https://github.com/gaithern/KH1FM-RANDOMIZER/releases) -3. Click the drop-down menu at the top-right and choose `Kingdom Hearts 1` +- The latest release of [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) for the ArchipelagoKH1Client.exe -4. Click `Mods>Install a New Mod` +

Setting up the required software

-5. In `Add a new mod from GitHub` paste `gaithern/KH-1FM-AP-LUA` +

OpenKH

-6. Click `Install` +- Extract the OpenKH files to a directory of your choosing. +- When prompted for game edition, choose PC Release, select which platform you're using (EGS or Steam), navigate to your `Kingdom Hearts I.5 + II.5` installation folder in the path box and click `Next`. +- When prompted, install Panacea, then click `Next`. +- When prompted, check KH1 plus any other AP game you want to play, and click `Install and configure Lua backend`, then click `Next`. +- Extract the data for KH1. +- Click `Finish` -7. Navigate to Mod Loader and click `Build and Run` +

Kingdom Hearts 1FM Randomizer Software

+- Extract the Kingdom Hearts 1FM Randomizer Software files in a directory of your choosing. -## Configuring your YAML file +

Obtaining and using the seed zip

-### What is a YAML file and why do I need one? +- When you generate a game you will see a download link for a KH1 .zip seed on the room page. +- After downloading this zip, open `mod_generator.exe` in your Kingdom Hearts 1FM Randomizer Software folder. +- Direct `mod_generator.exe` to both your seed zip and your KH1 data folder extracted during your OpenKH set up. +- Click `start`. +- After some time, you will find a file in your `Output` folder called `mod_YYYYMMDDHHMMSS.zip` +- Open `OpenKh.Tools.ModsManager.exe` and ensure that the dropdown in the top right is set to `Kingdom Hearts 1` +- Click the green plus, choose `Select and install Mod Archive or Lua Script`, and direct the prompt to your new mod zip. +- You should now see a mod on your list called `KH1 Randomizer Seed XYZ` where XYZ is your seed hex value. +- Ensure this mod is checked, then, if you want to play right away, click `Mod Loader` at the top. +- Click `Build and Run`. Your modded game should now open. -Your YAML file contains a set of configuration options which provide the generator with information about how it should -generate your game. Each player of a multiworld will provide their own YAML file. This setup allows each player to enjoy -an experience customized for their taste, and different players in the same multiworld can all have different options. +

Connecting to your multiworld via the KH1 Client

-### Where do I get a YAML file? +- Once your game is being hosted, open `ArchipelagoLauncher.exe`. +- Find `KH1 Client` and open it. +- At the top, in the `Server:` bar, type in the host address and port. +- Click the `Connect` button in the top right. +- If connection to the server was successful, you'll be prompted to type in your slot named in the `Command:` bar at the bottom. +- After typing your slot name, press enter. +- If all is well, you are now connected. -you can customize your settings by visiting the [Kingdom Hearts Options Page](/games/Kingdom%20Hearts/player-options). +

FAQ

-## Connect to the MultiWorld +

The client did not confirm connection to the game, is that normal?

-For first-time players, it is recommended to open your KH1 Client first before opening the game. +Yes, the game and client communicate via a game communication path set up in your in your `%AppData%` folder, and therefore don't need to establish a socket connection. -On the title screen, open your KH1 Client and connect to your multiworld. +

I am not sending or receiving items.

+ +Check out this [troubleshooting guide](https://docs.google.com/document/d/1oAXxJWrNeqSL-tkB_01bLR0eT0urxz2FBo4URpq3VbM/edit?usp=sharing) + +

Why aren't the evidence boxes spawning in Wonderland?

+ +You'll need to find `Footprints` in your multiworld. + +

Why won't Phil let me start the Prelims?

+ +You'll need to find `Entry Pass` in the multiworld. + +

Why aren't the slides spawning in Deep Jungle?

+ +You'll need to find `Slides` in the multiworld. + +

Why can't I make progress in Atlantica?

+ +You'll need to find `Crystal Trident` in the multiworld. + +

Why won't the doctor let me progress in Halloween Town?

+ +You'll need to find either `Forget-Me-Not` or `Jack-in-the-Box` in the multiworld. + +

Why is there a book missing in the Hollow Bastion library?

+ +You'll need to find `Theon Vol. 6` in the multiworld. + +

How do I unlock End of the World?

+ +Depending on your settings, your options are either finding a specified amount of `Lucky Emblems` or finding the item `End of the World`. + +

How do I enter Destiny Islands?

+ +After obtaining the item `Destiny Islands`, you can land there as an additional option in Traverse Town. + +

How do I progress to Destiny Islands Day 2 and 3?

+ +In order to access Day 2 and 3, you need to collect an amount of `Raft Materials` specified in your settings. When you start Day 3, you'll be immediately warped to Homecoming. + +

Why can't I use the summon I obtained?

+ +You need at least one magic spell before you can use summons. diff --git a/worlds/kh1/icons/kh1_heart.ico b/worlds/kh1/icons/kh1_heart.ico new file mode 100644 index 0000000000..3c1bf320f6 Binary files /dev/null and b/worlds/kh1/icons/kh1_heart.ico differ diff --git a/worlds/kh1/icons/kh1_heart.png b/worlds/kh1/icons/kh1_heart.png new file mode 100644 index 0000000000..512dc03c18 Binary files /dev/null and b/worlds/kh1/icons/kh1_heart.png differ diff --git a/worlds/kh1/test/test_goal.py b/worlds/kh1/test/test_goal.py index 6b501404fe..b788be2fc1 100644 --- a/worlds/kh1/test/test_goal.py +++ b/worlds/kh1/test/test_goal.py @@ -5,29 +5,29 @@ class TestDefault(KH1TestBase): class TestSephiroth(KH1TestBase): options = { - "Goal": 0, + "Final Rest Door Key": 0, } class TestUnknown(KH1TestBase): options = { - "Goal": 1, + "Final Rest Door Key": 1, } class TestPostcards(KH1TestBase): options = { - "Goal": 2, + "Final Rest Door Key": 2, } -class TestFinalAnsem(KH1TestBase): +class TestLuckyEmblems(KH1TestBase): options = { - "Goal": 3, + "Final Rest Door Key": 3, } class TestPuppies(KH1TestBase): options = { - "Goal": 4, + "Final Rest Door Key": 4, } class TestFinalRest(KH1TestBase): options = { - "Goal": 5, + "Final Rest Door Key": 5, } diff --git a/worlds/kh2/Client.py b/worlds/kh2/Client.py index 96b406c72f..5a26231c0c 100644 --- a/worlds/kh2/Client.py +++ b/worlds/kh2/Client.py @@ -34,7 +34,7 @@ class KH2Context(CommonContext): self.growthlevel = None self.kh2connected = False self.kh2_finished_game = False - self.serverconneced = False + self.serverconnected = False self.item_name_to_data = {name: data for name, data, in item_dictionary_table.items()} self.location_name_to_data = {name: data for name, data, in all_locations.items()} self.kh2_data_package = {} @@ -47,6 +47,8 @@ class KH2Context(CommonContext): self.location_name_to_worlddata = {name: data for name, data, in all_world_locations.items()} self.sending = [] + self.slot_name = None + self.disconnect_from_server = False # list used to keep track of locations+items player has. Used for disoneccting self.kh2_seed_save_cache = { "itemIndex": -1, @@ -185,11 +187,20 @@ class KH2Context(CommonContext): if password_requested and not self.password: await super(KH2Context, self).server_auth(password_requested) await self.get_username() - await self.send_connect() + # if slot name != first time login or previous name + # and seed name is none or saved seed name + if not self.slot_name and not self.kh2seedname: + await self.send_connect() + elif self.slot_name == self.auth and self.kh2seedname: + await self.send_connect() + else: + logger.info(f"You are trying to connect with data still cached in the client. Close client or connect to the correct slot: {self.slot_name}") + self.serverconnected = False + self.disconnect_from_server = True async def connection_closed(self): self.kh2connected = False - self.serverconneced = False + self.serverconnected = False if self.kh2seedname is not None and self.auth is not None: with open(self.kh2_seed_save_path_join, 'w') as f: f.write(json.dumps(self.kh2_seed_save, indent=4)) @@ -197,7 +208,8 @@ class KH2Context(CommonContext): async def disconnect(self, allow_autoreconnect: bool = False): self.kh2connected = False - self.serverconneced = False + self.serverconnected = False + self.locations_checked = [] if self.kh2seedname not in {None} and self.auth not in {None}: with open(self.kh2_seed_save_path_join, 'w') as f: f.write(json.dumps(self.kh2_seed_save, indent=4)) @@ -239,7 +251,15 @@ class KH2Context(CommonContext): def on_package(self, cmd: str, args: dict): if cmd == "RoomInfo": - self.kh2seedname = args['seed_name'] + if not self.kh2seedname: + self.kh2seedname = args['seed_name'] + elif self.kh2seedname != args['seed_name']: + self.disconnect_from_server = True + self.serverconnected = False + self.kh2connected = False + logger.info("Connection to the wrong seed, connect to the correct seed or close the client.") + return + self.kh2_seed_save_path = f"kh2save2{self.kh2seedname}{self.auth}.json" self.kh2_seed_save_path_join = os.path.join(self.game_communication_path, self.kh2_seed_save_path) @@ -338,7 +358,7 @@ class KH2Context(CommonContext): }, }, } - if start_index > self.kh2_seed_save_cache["itemIndex"] and self.serverconneced: + if start_index > self.kh2_seed_save_cache["itemIndex"] and self.serverconnected: self.kh2_seed_save_cache["itemIndex"] = start_index for item in args['items']: asyncio.create_task(self.give_item(item.item, item.location)) @@ -370,12 +390,14 @@ class KH2Context(CommonContext): if not self.kh2: self.kh2 = pymem.Pymem(process_name="KINGDOM HEARTS II FINAL MIX") self.get_addresses() - +# except Exception as e: if self.kh2connected: self.kh2connected = False logger.info("Game is not open.") - self.serverconneced = True + + self.serverconnected = True + self.slot_name = self.auth def data_package_kh2_cache(self, loc_to_id, item_to_id): self.kh2_loc_name_to_id = loc_to_id @@ -493,23 +515,38 @@ class KH2Context(CommonContext): async def give_item(self, item, location): try: - # todo: ripout all the itemtype stuff and just have one dictionary. the only thing that needs to be tracked from the server/local is abilites - #sleep so we can get the datapackage and not miss any items that were sent to us while we didnt have our item id dicts + # sleep so we can get the datapackage and not miss any items that were sent to us while we didnt have our item id dicts while not self.lookup_id_to_item: await asyncio.sleep(0.5) itemname = self.lookup_id_to_item[item] itemdata = self.item_name_to_data[itemname] - # itemcode = self.kh2_item_name_to_id[itemname] if itemdata.ability: if location in self.all_weapon_location_id: return + # growth have reserved ability slots because of how the goa handles them if itemname in {"High Jump", "Quick Run", "Dodge Roll", "Aerial Dodge", "Glide"}: self.kh2_seed_save_cache["AmountInvo"]["Growth"][itemname] += 1 return if itemname not in self.kh2_seed_save_cache["AmountInvo"]["Ability"]: self.kh2_seed_save_cache["AmountInvo"]["Ability"][itemname] = [] - # appending the slot that the ability should be in + # appending the slot that the ability should be in + # abilities have a limit amount of slots. + # we start from the back going down to not mess with stuff. + # Front of Invo + # Sora: Save+24F0+0x54 : 0x2546 + # Donald: Save+2604+0x54 : 0x2658 + # Goofy: Save+2718+0x54 : 0x276C + # Back of Invo. Sora has 6 ability slots that are reserved + # Sora: Save+24F0+0x54+0x92 : 0x25D8 + # Donald: Save+2604+0x54+0x9C : 0x26F4 + # Goofy: Save+2718+0x54+0x9C : 0x2808 + # seed has 2 scans in sora's abilities + # recieved second scan + # if len(seed_save(Scan:[ability slot 52]) < (2)amount of that ability they should have from slot data + # ability_slot = back of inventory that isnt taken + # add ability_slot to seed_save(Scan[]) so now its Scan:[ability slot 52,50] + # decrease back of inventory since its ability_slot is already taken if len(self.kh2_seed_save_cache["AmountInvo"]["Ability"][itemname]) < \ self.AbilityQuantityDict[itemname]: if itemname in self.sora_ability_set: @@ -528,18 +565,21 @@ class KH2Context(CommonContext): if ability_slot in self.front_ability_slots: self.front_ability_slots.remove(ability_slot) + # if itemdata in {bitmask} all the forms,summons and a few other things are bitmasks elif itemdata.memaddr in {0x36C4, 0x36C5, 0x36C6, 0x36C0, 0x36CA}: # if memaddr is in a bitmask location in memory if itemname not in self.kh2_seed_save_cache["AmountInvo"]["Bitmask"]: self.kh2_seed_save_cache["AmountInvo"]["Bitmask"].append(itemname) + # if itemdata in {magic} elif itemdata.memaddr in {0x3594, 0x3595, 0x3596, 0x3597, 0x35CF, 0x35D0}: - # if memaddr is in magic addresses self.kh2_seed_save_cache["AmountInvo"]["Magic"][itemname] += 1 + # equipment is a list instead of dict because you can only have 1 currently elif itemname in self.all_equipment: self.kh2_seed_save_cache["AmountInvo"]["Equipment"].append(itemname) + # weapons are done differently since you can only have one and has to check it differently elif itemname in self.all_weapons: if itemname in self.keyblade_set: self.kh2_seed_save_cache["AmountInvo"]["Weapon"]["Sora"].append(itemname) @@ -548,9 +588,11 @@ class KH2Context(CommonContext): else: self.kh2_seed_save_cache["AmountInvo"]["Weapon"]["Goofy"].append(itemname) + # TODO: this can just be removed and put into the else below it elif itemname in self.stat_increase_set: self.kh2_seed_save_cache["AmountInvo"]["StatIncrease"][itemname] += 1 else: + # "normal" items. They have a unique byte reserved for how many they have if itemname in self.kh2_seed_save_cache["AmountInvo"]["Amount"]: self.kh2_seed_save_cache["AmountInvo"]["Amount"][itemname] += 1 else: @@ -930,7 +972,7 @@ def finishedGame(ctx: KH2Context): async def kh2_watcher(ctx: KH2Context): while not ctx.exit_event.is_set(): try: - if ctx.kh2connected and ctx.serverconneced: + if ctx.kh2connected and ctx.serverconnected: ctx.sending = [] await asyncio.create_task(ctx.checkWorldLocations()) await asyncio.create_task(ctx.checkLevels()) @@ -944,13 +986,19 @@ async def kh2_watcher(ctx: KH2Context): if ctx.sending: message = [{"cmd": 'LocationChecks', "locations": ctx.sending}] await ctx.send_msgs(message) - elif not ctx.kh2connected and ctx.serverconneced: - logger.info("Game Connection lost. waiting 15 seconds until trying to reconnect.") + elif not ctx.kh2connected and ctx.serverconnected: + logger.info("Game Connection lost. trying to reconnect.") ctx.kh2 = None - while not ctx.kh2connected and ctx.serverconneced: - await asyncio.sleep(15) - ctx.kh2 = pymem.Pymem(process_name="KINGDOM HEARTS II FINAL MIX") - ctx.get_addresses() + while not ctx.kh2connected and ctx.serverconnected: + try: + ctx.kh2 = pymem.Pymem(process_name="KINGDOM HEARTS II FINAL MIX") + ctx.get_addresses() + logger.info("Game Connection Established.") + except Exception as e: + await asyncio.sleep(5) + if ctx.disconnect_from_server: + ctx.disconnect_from_server = False + await ctx.disconnect() except Exception as e: if ctx.kh2connected: ctx.kh2connected = False diff --git a/worlds/kh2/OpenKH.py b/worlds/kh2/OpenKH.py index 7226525d0c..7c67fc07de 100644 --- a/worlds/kh2/OpenKH.py +++ b/worlds/kh2/OpenKH.py @@ -8,11 +8,12 @@ import zipfile from .Items import item_dictionary_table from .Locations import all_locations, SoraLevels, exclusion_table from .XPValues import lvlStats, formExp, soraExp -from worlds.Files import APContainer +from worlds.Files import APPlayerContainer -class KH2Container(APContainer): +class KH2Container(APPlayerContainer): game: str = 'Kingdom Hearts 2' + patch_file_ending = ".zip" def __init__(self, patch_data: dict, base_path: str, output_directory: str, player=None, player_name: str = "", server: str = ""): diff --git a/worlds/kh2/__init__.py b/worlds/kh2/__init__.py index defb285d50..3068e7bb56 100644 --- a/worlds/kh2/__init__.py +++ b/worlds/kh2/__init__.py @@ -20,7 +20,7 @@ def launch_client(): launch_component(launch, name="KH2Client") -components.append(Component("KH2 Client", "KH2Client", func=launch_client, component_type=Type.CLIENT)) +components.append(Component("KH2 Client", func=launch_client, component_type=Type.CLIENT)) class KingdomHearts2Web(WebWorld): @@ -277,9 +277,7 @@ class KH2World(World): if self.options.FillerItemsLocal: for item in filler_items: self.options.local_items.value.add(item) - # By imitating remote this doesn't have to be plandoded filler anymore - # for location in {LocationName.JunkMedal, LocationName.JunkMedal}: - # self.plando_locations[location] = random_stt_item + if not self.options.SummonLevelLocationToggle: self.total_locations -= 6 @@ -400,6 +398,8 @@ class KH2World(World): # plando goofy get bonuses goofy_get_bonus_location_pool = [self.multiworld.get_location(location, self.player) for location in Goofy_Checks.keys() if Goofy_Checks[location].yml != "Keyblade"] + if len(goofy_get_bonus_location_pool) > len(self.goofy_get_bonus_abilities): + raise Exception(f"Too little abilities to fill goofy get bonus locations for player {self.player_name}.") for location in goofy_get_bonus_location_pool: self.random.choice(self.goofy_get_bonus_abilities) random_ability = self.random.choice(self.goofy_get_bonus_abilities) @@ -416,11 +416,12 @@ class KH2World(World): random_ability = self.random.choice(self.donald_weapon_abilities) location.place_locked_item(random_ability) self.donald_weapon_abilities.remove(random_ability) - + # if option is turned off if not self.options.DonaldGoofyStatsanity: - # plando goofy get bonuses donald_get_bonus_location_pool = [self.multiworld.get_location(location, self.player) for location in Donald_Checks.keys() if Donald_Checks[location].yml != "Keyblade"] + if len(donald_get_bonus_location_pool) > len(self.donald_get_bonus_abilities): + raise Exception(f"Too little abilities to fill donald get bonus locations for player {self.player_name}.") for location in donald_get_bonus_location_pool: random_ability = self.random.choice(self.donald_get_bonus_abilities) location.place_locked_item(random_ability) diff --git a/worlds/kh2/docs/en_Kingdom Hearts 2.md b/worlds/kh2/docs/en_Kingdom Hearts 2.md index 5aae7ad3a7..6924800e6c 100644 --- a/worlds/kh2/docs/en_Kingdom Hearts 2.md +++ b/worlds/kh2/docs/en_Kingdom Hearts 2.md @@ -1,15 +1,15 @@ # Kingdom Hearts 2 -

Changes from the vanilla game

+## Changes from the vanilla game This randomizer creates a more dynamic play experience by randomizing the locations of most items in Kingdom Hearts 2. Currently all items within Chests, Popups, Get Bonuses, Form Levels, and Sora's Levels are randomized. This allows abilities that Sora would normally have to be placed on Keyblades with random stats. Additionally, there are several options for ways to finish the game, allowing for different goals beyond beating the final boss. -

Where is the options page

+## Where is the options page The [player options page for this game](../player-options) contains all the options you need to configure and export a config file. -

What is randomized in this game?

+## What is randomized in this game? - Chests @@ -21,27 +21,27 @@ The [player options page for this game](../player-options) contains all the opti - Keyblade Stats - Keyblade Abilities -

What Kingdom Hearts 2 items can appear in other players' worlds?

+## What Kingdom Hearts 2 items can appear in other players' worlds? Every item in the game except for abilities on weapons. -

What is The Garden of Assemblage "GoA"?

+## What is The Garden of Assemblage "GoA"? The Garden of Assemblage Mod made by Sonicshadowsilver2 and Num turns the Garden of Assemblage into a “World Hub” where each portal takes you to one of the game worlds (as opposed to having a world map). This allows you to enter worlds at any time, and world progression is maintained for each world individually. -

What does another world's item look like in Kingdom Hearts 2?

+## What does another world's item look like in Kingdom Hearts 2? In Kingdom Hearts 2, items which need to be sent to other worlds appear in any location that has a item in the vanilla game. They are represented by the Archipelago icon, and must be "picked up" as if it were a normal item. Upon obtaining the item, it will be sent to its home world. -

When the player receives an item, what happens?

+## When the player receives an item, what happens? It is added to your inventory. If you obtain magic, you will need to pause your game to have it show up in your inventory, then enter a new room for it to become properly usable. -

What Happens if I die before Room Saving?

+## What Happens if I die before Room Saving? When you die in vanilla Kingdom Hearts 2, you are reverted to the last non-boss room you entered and your status is reverted to what it was at that time. However, in archipelago, any item that you have sent/received will not be taken away from the player, any chest you have opened will remain open, and you will keep your level, but lose the experience. @@ -49,7 +49,7 @@ When you die in vanilla Kingdom Hearts 2, you are reverted to the last non-boss For example, if you are fighting Roxas, receive Reflect Element, then die mid-fight, you will keep that Reflect Element. You will still need to pause your game to have it show up in your inventory, then enter a new room for it to become properly usable. -

Customization options:

+## Customization options: - Choose a goal from the list below (with an additional option to Kill Final Xemnas alongside your goal). @@ -64,11 +64,11 @@ For example, if you are fighting Roxas, receive Reflect Element, then die mid-fi - Customize the amount and level of progressive movement (Growth Abilities) you start with. - Customize start inventory, i.e., begin every run with certain items or spells of your choice. -

What are Lucky Emblems?

+## What are Lucky Emblems? Lucky Emblems are items that are required to beat the game if your goal is "Lucky Emblem Hunt".
You can think of these as requiring X number of Proofs of Nonexistence to open the final door. -

What is Hitlist/Bounties?

+## What is Hitlist/Bounties? The Hitlist goal adds "bounty" items to select late-game fights and locations, and you need to collect X number of them to win.
The list of possible locations that can contain a bounty: @@ -82,7 +82,7 @@ The list of possible locations that can contain a bounty: - Transport to Remembrance - Godess of Fate cup and Hades Paradox cup -

Quality of life:

+## Quality of life: With the help of Shananas, Num, and ZakTheRobot we have many QoL features such are: diff --git a/worlds/kh2/docs/setup_en.md b/worlds/kh2/docs/setup_en.md index a1248d1095..db0f6c86b9 100644 --- a/worlds/kh2/docs/setup_en.md +++ b/worlds/kh2/docs/setup_en.md @@ -1,11 +1,11 @@ # Kingdom Hearts 2 Archipelago Setup Guide -

Quick Links

+## Quick Links - [Game Info Page](../../../../games/Kingdom%20Hearts%202/info/en) - [Player Options Page](../../../../games/Kingdom%20Hearts%202/player-options) -

Required Software:

+## Required Software: Kingdom Hearts II Final Mix from the [Epic Games Store](https://store.epicgames.com/en-US/discover/kingdom-hearts) or [Steam](https://store.steampowered.com/app/2552430/KINGDOM_HEARTS_HD_1525_ReMIX/) @@ -23,39 +23,39 @@ Kingdom Hearts II Final Mix from the [Epic Games Store](https://store.epicgames. 1. Optionally Install the Archipelago Quality Of Life mod from `JaredWeakStrike/AP_QOL` using OpenKH Mod Manager 2. Optionally Install the Quality Of Life mod from `shananas/BearSkip` using OpenKH Mod Manager -

Required: Archipelago Companion Mod

+### Required: Archipelago Companion Mod Load this mod just like the GoA ROM you did during the KH2 Rando setup. `JaredWeakStrike/APCompanion`
Have this mod second-highest priority below the .zip seed.
This mod is based upon Num's Garden of Assemblage Mod and requires it to work. Without Num this could not be possible. -

Required: Auto Save Mod and KH2 Lua Library

+### Required: Auto Save Mod and KH2 Lua Library -Load these mods just like you loaded the GoA ROM mod during the KH2 Rando setup. `KH2FM-Mods-equations19/auto-save` and `KH2FM-Mods-equations19/KH2-Lua-Library` Location doesn't matter, required in case of crashes. See [Best Practices](en#best-practices) on how to load the auto save +Load these mods just like you loaded the GoA ROM mod during the KH2 Rando setup. `KH2FM-Mods-equations19/auto-save` and `KH2FM-Mods-equations19/KH2-Lua-Library` Location doesn't matter, required in case of crashes. See [Best Practices](#best-practices) on how to load the auto save -

Optional QoL Mods: AP QoL and Bear Skip

+### Optional QoL Mods: AP QoL and Bear Skip `JaredWeakStrike/AP_QOL` Makes the urns minigames much faster, makes Cavern of Remembrance orbs drop significantly more drive orbs for refilling drive/leveling master form, skips the animation when using the bulky vendor RC, skips carpet escape auto-scroller in Agrabah 2, and prevents the wardrobe in the Beasts Castle wardrobe push minigame from waking up while being pushed. `shananas/BearSkip` Skips all minigames in 100 Acre Woods except the Spooky Cave minigame since there are chests in Spooky Cave you can only get during the minigame. For Spooky Cave, Pooh is moved to the other side of the invisible wall that prevents you from using his RC to finish the minigame. -

Installing A Seed

+### Installing A Seed When you generate a game you will see a download link for a KH2 .zip seed on the room page. Download the seed then open OpenKH Mod Manager and click the green plus and "Select and install Mod Archive".
Make sure the seed is on the top of the list (Highest Priority)
After Installing the seed click "Mod Loader -> Build/Build and Run". Every slot is a unique mod to install and will be needed be repatched for different slots/rooms. -

Optional Software:

+## Optional Software: - [Kingdom Hearts 2 AP Tracker](https://github.com/palex00/kh2-ap-tracker/releases/latest/), for use with [PopTracker](https://github.com/black-sliver/PopTracker/releases) -

What the Mod Manager Should Look Like.

+## What the Mod Manager Should Look Like. ![image](https://i.imgur.com/N0WJ8Qn.png) -

Using the KH2 Client

+## Using the KH2 Client Start the game through OpenKH Mod Manager. If starting a new run, enter the Garden of Assemblage from a new save. If returning to a run, load the save and enter the Garden of Assemblage. Then run the [ArchipelagoKH2Client.exe](https://github.com/ArchipelagoMW/Archipelago/releases).
When you successfully connect to the server the client will automatically hook into the game to send/receive checks.
@@ -67,13 +67,13 @@ Most checks will be sent to you anywhere outside a load or cutscene.
If you obtain magic, you will need to pause your game to have it show up in your inventory, then enter a new room for it to become properly usable. -

KH2 Client should look like this:

+## KH2 Client should look like this: ![image](https://i.imgur.com/qP6CmV8.png) Enter The room's port number into the top box where the x's are and press "Connect". Follow the prompts there and you should be connected -

Common Pitfalls

+## Common Pitfalls - Having an old GOA Lua Script in your `C:\Users\*YourName*\Documents\KINGDOM HEARTS HD 1.5+2.5 ReMIX\scripts\kh2` folder. - Pressing F2 while in game should look like this. ![image](https://i.imgur.com/ABSdtPC.png) @@ -86,7 +86,7 @@ Enter The room's port number into the top box where the x's are and pres - Using a seed from the standalone KH2 Randomizer Seed Generator. - The Archipelago version of the KH2 Randomizer does not use this Seed Generator; refer to the [Archipelago Setup](https://archipelago.gg/tutorial/Archipelago/setup/en) to learn how to generate and play a seed through Archipelago. -

Best Practices

+## Best Practices - Make a save at the start of the GoA before opening anything. This will be the file to select when loading an autosave if/when your game crashes. - If you don't want to have a save in the GoA. Disconnect the client, load the auto save, and then reconnect the client after it loads the auto save. @@ -94,13 +94,13 @@ Enter The room's port number into the top box where the x's are and pres - Run the game in windows/borderless windowed mode. Fullscreen is stable but the game can crash if you alt-tab out. - Make sure to save in a different save slot when playing in an async or disconnecting from the server to play a different seed -

Logic Sheet & PopTracker Autotracking

+## Logic Sheet & PopTracker Autotracking Have any questions on what's in logic? This spreadsheet made by Bulcon has the answer [Requirements/logic sheet](https://docs.google.com/spreadsheets/d/1nNi8ohEs1fv-sDQQRaP45o6NoRcMlLJsGckBonweDMY/edit?usp=sharing) Alternatively you can use the Kingdom Hearts 2 PopTracker Pack that is based off of the logic sheet above and does all the work for you. -

PopTracker Pack

+### PopTracker Pack 1. Download [Kingdom Hearts 2 AP Tracker](https://github.com/palex00/kh2-ap-tracker/releases/latest/) and [PopTracker](https://github.com/black-sliver/PopTracker/releases). @@ -112,7 +112,7 @@ Alternatively you can use the Kingdom Hearts 2 PopTracker Pack that is based off This pack will handle logic, received items, checked locations and autotabbing for you! -

F.A.Q.

+## F.A.Q. - Why is my Client giving me a "Cannot Open Process: " error? - Due to how the client reads kingdom hearts 2 memory some people's computer flags it as a virus. Run the client as admin. diff --git a/worlds/ladx/LADXR/generator.py b/worlds/ladx/LADXR/generator.py index 413bf89c06..f4023469d7 100644 --- a/worlds/ladx/LADXR/generator.py +++ b/worlds/ladx/LADXR/generator.py @@ -2,13 +2,15 @@ import binascii import importlib.util import importlib.machinery import os -import pkgutil +import random +import pickle +import Utils +import settings from collections import defaultdict -from typing import TYPE_CHECKING +from typing import Dict from .romTables import ROMWithTables from . import assembler -from . import mapgen from . import patches from .patches import overworld as _ from .patches import dungeon as _ @@ -57,27 +59,20 @@ from .patches import tradeSequence as _ from . import hints from .patches import bank34 -from .utils import formatText from .roomEditor import RoomEditor, Object from .patches.aesthetics import rgb_to_bin, bin_to_rgb -from .locations.keyLocation import KeyLocation - -from BaseClasses import ItemClassification -from ..Locations import LinksAwakeningLocation -from ..Options import TrendyGame, Palette, MusicChangeCondition, Warps - -if TYPE_CHECKING: - from .. import LinksAwakeningWorld - +from .. import Options # Function to generate a final rom, this patches the rom with all required patches -def generateRom(args, world: "LinksAwakeningWorld"): +def generateRom(base_rom: bytes, args, patch_data: Dict): + random.seed(patch_data["seed"] + patch_data["player"]) + multi_key = binascii.unhexlify(patch_data["multi_key"].encode()) + item_list = pickle.loads(binascii.unhexlify(patch_data["item_list"].encode())) + options = patch_data["options"] rom_patches = [] - player_names = list(world.multiworld.player_name.values()) - - rom = ROMWithTables(args.input_filename, rom_patches) - rom.player_names = player_names + rom = ROMWithTables(base_rom, rom_patches) + rom.player_names = patch_data["other_player_names"] pymods = [] if args.pymod: for pymod in args.pymod: @@ -88,10 +83,13 @@ def generateRom(args, world: "LinksAwakeningWorld"): for pymod in pymods: pymod.prePatch(rom) - if world.ladxr_settings.gfxmod: - patches.aesthetics.gfxMod(rom, os.path.join("data", "sprites", "ladx", world.ladxr_settings.gfxmod)) - - item_list = [item for item in world.ladxr_logic.iteminfo_list if not isinstance(item, KeyLocation)] + if options["gfxmod"]: + user_settings = settings.get_settings() + try: + gfx_mod_file = user_settings["ladx_options"]["gfx_mod_file"] + patches.aesthetics.gfxMod(rom, gfx_mod_file) + except FileNotFoundError: + pass # if user just doesnt provide gfxmod file, let patching continue assembler.resetConsts() assembler.const("INV_SIZE", 16) @@ -121,7 +119,7 @@ def generateRom(args, world: "LinksAwakeningWorld"): assembler.const("wLinkSpawnDelay", 0xDE13) #assembler.const("HARDWARE_LINK", 1) - assembler.const("HARD_MODE", 1 if world.ladxr_settings.hardmode != "none" else 0) + assembler.const("HARD_MODE", 1 if options["hard_mode"] else 0) patches.core.cleanup(rom) patches.save.singleSaveSlot(rom) @@ -135,7 +133,7 @@ def generateRom(args, world: "LinksAwakeningWorld"): patches.core.easyColorDungeonAccess(rom) patches.owl.removeOwlEvents(rom) patches.enemies.fixArmosKnightAsMiniboss(rom) - patches.bank3e.addBank3E(rom, world.multi_key, world.player, player_names) + patches.bank3e.addBank3E(rom, multi_key, patch_data["player"], patch_data["other_player_names"]) patches.bank3f.addBank3F(rom) patches.bank34.addBank34(rom, item_list) patches.core.removeGhost(rom) @@ -144,19 +142,17 @@ def generateRom(args, world: "LinksAwakeningWorld"): patches.core.alwaysAllowSecretBook(rom) patches.core.injectMainLoop(rom) - from ..Options import ShuffleSmallKeys, ShuffleNightmareKeys - - if world.options.shuffle_small_keys != ShuffleSmallKeys.option_original_dungeon or\ - world.options.shuffle_nightmare_keys != ShuffleNightmareKeys.option_original_dungeon: + if options["shuffle_small_keys"] != Options.ShuffleSmallKeys.option_original_dungeon or\ + options["shuffle_nightmare_keys"] != Options.ShuffleNightmareKeys.option_original_dungeon: patches.inventory.advancedInventorySubscreen(rom) patches.inventory.moreSlots(rom) - if world.ladxr_settings.witch: - patches.witch.updateWitch(rom) + # if ladxr_settings["witch"]: + patches.witch.updateWitch(rom) patches.softlock.fixAll(rom) - if not world.ladxr_settings.rooster: + if not options["rooster"]: patches.maptweaks.tweakMap(rom) patches.maptweaks.tweakBirdKeyRoom(rom) - if world.ladxr_settings.overworld == "openmabe": + if options["overworld"] == Options.Overworld.option_open_mabe: patches.maptweaks.openMabe(rom) patches.chest.fixChests(rom) patches.shop.fixShop(rom) @@ -168,10 +164,10 @@ def generateRom(args, world: "LinksAwakeningWorld"): patches.tarin.updateTarin(rom) patches.fishingMinigame.updateFinishingMinigame(rom) patches.health.upgradeHealthContainers(rom) - if world.ladxr_settings.owlstatues in ("dungeon", "both"): - patches.owl.upgradeDungeonOwlStatues(rom) - if world.ladxr_settings.owlstatues in ("overworld", "both"): - patches.owl.upgradeOverworldOwlStatues(rom) + # if ladxr_settings["owlstatues"] in ("dungeon", "both"): + # patches.owl.upgradeDungeonOwlStatues(rom) + # if ladxr_settings["owlstatues"] in ("overworld", "both"): + # patches.owl.upgradeOverworldOwlStatues(rom) patches.goldenLeaf.fixGoldenLeaf(rom) patches.heartPiece.fixHeartPiece(rom) patches.seashell.fixSeashell(rom) @@ -180,170 +176,121 @@ def generateRom(args, world: "LinksAwakeningWorld"): patches.songs.upgradeMarin(rom) patches.songs.upgradeManbo(rom) patches.songs.upgradeMamu(rom) - patches.tradeSequence.patchTradeSequence(rom, world.ladxr_settings) - patches.bowwow.fixBowwow(rom, everywhere=world.ladxr_settings.bowwow != 'normal') - if world.ladxr_settings.bowwow != 'normal': - patches.bowwow.bowwowMapPatches(rom) + + patches.tradeSequence.patchTradeSequence(rom, options) + patches.bowwow.fixBowwow(rom, everywhere=False) + # if ladxr_settings["bowwow"] != 'normal': + # patches.bowwow.bowwowMapPatches(rom) patches.desert.desertAccess(rom) - if world.ladxr_settings.overworld == 'dungeondive': - patches.overworld.patchOverworldTilesets(rom) - patches.overworld.createDungeonOnlyOverworld(rom) - elif world.ladxr_settings.overworld == 'nodungeons': - patches.dungeon.patchNoDungeons(rom) - elif world.ladxr_settings.overworld == 'random': - patches.overworld.patchOverworldTilesets(rom) - mapgen.store_map(rom, world.ladxr_logic.world.map) + # if ladxr_settings["overworld"] == 'dungeondive': + # patches.overworld.patchOverworldTilesets(rom) + # patches.overworld.createDungeonOnlyOverworld(rom) + # elif ladxr_settings["overworld"] == 'nodungeons': + # patches.dungeon.patchNoDungeons(rom) + #elif world.ladxr_settings["overworld"] == 'random': + # patches.overworld.patchOverworldTilesets(rom) + # mapgen.store_map(rom, world.ladxr_logic.world.map) #if settings.dungeon_items == 'keysy': # patches.dungeon.removeKeyDoors(rom) # patches.reduceRNG.slowdownThreeOfAKind(rom) patches.reduceRNG.fixHorseHeads(rom) patches.bomb.onlyDropBombsWhenHaveBombs(rom) - if world.options.music_change_condition == MusicChangeCondition.option_always: + if options["music_change_condition"] == Options.MusicChangeCondition.option_always: patches.aesthetics.noSwordMusic(rom) - patches.aesthetics.reduceMessageLengths(rom, world.random) + patches.aesthetics.reduceMessageLengths(rom, random) patches.aesthetics.allowColorDungeonSpritesEverywhere(rom) - if world.ladxr_settings.music == 'random': - patches.music.randomizeMusic(rom, world.random) - elif world.ladxr_settings.music == 'off': + if options["music"] == Options.Music.option_shuffled: + patches.music.randomizeMusic(rom, random) + elif options["music"] == Options.Music.option_off: patches.music.noMusic(rom) - if world.ladxr_settings.noflash: + if options["no_flash"]: patches.aesthetics.removeFlashingLights(rom) - if world.ladxr_settings.hardmode == "oracle": + if options["hard_mode"] == Options.HardMode.option_oracle: patches.hardMode.oracleMode(rom) - elif world.ladxr_settings.hardmode == "hero": + elif options["hard_mode"] == Options.HardMode.option_hero: patches.hardMode.heroMode(rom) - elif world.ladxr_settings.hardmode == "ohko": + elif options["hard_mode"] == Options.HardMode.option_ohko: patches.hardMode.oneHitKO(rom) - if world.ladxr_settings.superweapons: - patches.weapons.patchSuperWeapons(rom) - if world.ladxr_settings.textmode == 'fast': + #if ladxr_settings["superweapons"]: + # patches.weapons.patchSuperWeapons(rom) + if options["text_mode"] == Options.TextMode.option_fast: patches.aesthetics.fastText(rom) - if world.ladxr_settings.textmode == 'none': - patches.aesthetics.fastText(rom) - patches.aesthetics.noText(rom) - if not world.ladxr_settings.nagmessages: + #if ladxr_settings["textmode"] == 'none': + # patches.aesthetics.fastText(rom) + # patches.aesthetics.noText(rom) + if not options["nag_messages"]: patches.aesthetics.removeNagMessages(rom) - if world.ladxr_settings.lowhpbeep == 'slow': + if options["low_hp_beep"] == Options.LowHpBeep.option_slow: patches.aesthetics.slowLowHPBeep(rom) - if world.ladxr_settings.lowhpbeep == 'none': + if options["low_hp_beep"] == Options.LowHpBeep.option_none: patches.aesthetics.removeLowHPBeep(rom) - if 0 <= int(world.ladxr_settings.linkspalette): - patches.aesthetics.forceLinksPalette(rom, int(world.ladxr_settings.linkspalette)) + if 0 <= options["link_palette"]: + patches.aesthetics.forceLinksPalette(rom, options["link_palette"]) if args.romdebugmode: # The default rom has this build in, just need to set a flag and we get this save. rom.patch(0, 0x0003, "00", "01") # Patch the sword check on the shopkeeper turning around. - if world.ladxr_settings.steal == 'never': - rom.patch(4, 0x36F9, "FA4EDB", "3E0000") - elif world.ladxr_settings.steal == 'always': - rom.patch(4, 0x36F9, "FA4EDB", "3E0100") + #if ladxr_settings["steal"] == 'never': + # rom.patch(4, 0x36F9, "FA4EDB", "3E0000") + #elif ladxr_settings["steal"] == 'always': + # rom.patch(4, 0x36F9, "FA4EDB", "3E0100") - if world.ladxr_settings.hpmode == 'inverted': - patches.health.setStartHealth(rom, 9) - elif world.ladxr_settings.hpmode == '1': - patches.health.setStartHealth(rom, 1) + #if ladxr_settings["hpmode"] == 'inverted': + # patches.health.setStartHealth(rom, 9) + #elif ladxr_settings["hpmode"] == '1': + # patches.health.setStartHealth(rom, 1) patches.inventory.songSelectAfterOcarinaSelect(rom) - if world.ladxr_settings.quickswap == 'a': + if options["quickswap"] == Options.Quickswap.option_a: patches.core.quickswap(rom, 1) - elif world.ladxr_settings.quickswap == 'b': + elif options["quickswap"] == Options.Quickswap.option_b: patches.core.quickswap(rom, 0) - patches.core.addBootsControls(rom, world.options.boots_controls) + patches.core.addBootsControls(rom, options["boots_controls"]) + random.seed(patch_data["seed"] + patch_data["player"]) + hints.addHints(rom, random, patch_data["hint_texts"]) - world_setup = world.ladxr_logic.world_setup - - JUNK_HINT = 0.33 - RANDOM_HINT= 0.66 - # USEFUL_HINT = 1.0 - # TODO: filter events, filter unshuffled keys - all_items = world.multiworld.get_items() - our_items = [item for item in all_items - if item.player == world.player - and item.location - and item.code is not None - and item.location.show_in_spoiler] - our_useful_items = [item for item in our_items if ItemClassification.progression in item.classification] - - def gen_hint(): - if not world.options.in_game_hints: - return 'Hints are disabled!' - chance = world.random.uniform(0, 1) - if chance < JUNK_HINT: - return None - elif chance < RANDOM_HINT: - location = world.random.choice(our_items).location - else: # USEFUL_HINT - location = world.random.choice(our_useful_items).location - - if location.item.player == world.player: - name = "Your" - else: - name = f"{world.multiworld.player_name[location.item.player]}'s" - # filter out { and } since they cause issues with string.format later on - name = name.replace("{", "").replace("}", "") - - if isinstance(location, LinksAwakeningLocation): - location_name = location.ladxr_item.metadata.name - else: - location_name = location.name - - hint = f"{name} {location.item.name} is at {location_name}" - if location.player != world.player: - # filter out { and } since they cause issues with string.format later on - player_name = world.multiworld.player_name[location.player].replace("{", "").replace("}", "") - hint += f" in {player_name}'s world" - - # Cap hint size at 85 - # Realistically we could go bigger but let's be safe instead - hint = hint[:85] - - return hint - - hints.addHints(rom, world.random, gen_hint) - - if world_setup.goal == "raft": + if patch_data["world_setup"]["goal"] == "raft": patches.goal.setRaftGoal(rom) - elif world_setup.goal in ("bingo", "bingo-full"): - patches.bingo.setBingoGoal(rom, world_setup.bingo_goals, world_setup.goal) - elif world_setup.goal == "seashells": + elif patch_data["world_setup"]["goal"] in ("bingo", "bingo-full"): + patches.bingo.setBingoGoal(rom, patch_data["world_setup"]["bingo_goals"], patch_data["world_setup"]["goal"]) + elif patch_data["world_setup"]["goal"] == "seashells": patches.goal.setSeashellGoal(rom, 20) else: - patches.goal.setRequiredInstrumentCount(rom, world_setup.goal) + patches.goal.setRequiredInstrumentCount(rom, patch_data["world_setup"]["goal"]) # Patch the generated logic into the rom - patches.chest.setMultiChest(rom, world_setup.multichest) - if world.ladxr_settings.overworld not in {"dungeondive", "random"}: - patches.entrances.changeEntrances(rom, world_setup.entrance_mapping) + patches.chest.setMultiChest(rom, patch_data["world_setup"]["multichest"]) + #if ladxr_settings["overworld"] not in {"dungeondive", "random"}: + patches.entrances.changeEntrances(rom, patch_data["world_setup"]["entrance_mapping"]) for spot in item_list: if spot.item and spot.item.startswith("*"): spot.item = spot.item[1:] mw = None if spot.item_owner != spot.location_owner: mw = spot.item_owner - if mw > 100: + if mw > 101: # There are only 101 player name slots (99 + "The Server" + "another world"), so don't use more than that - mw = 100 + mw = 101 spot.patch(rom, spot.item, multiworld=mw) - patches.enemies.changeBosses(rom, world_setup.boss_mapping) - patches.enemies.changeMiniBosses(rom, world_setup.miniboss_mapping) + patches.enemies.changeBosses(rom, patch_data["world_setup"]["boss_mapping"]) + patches.enemies.changeMiniBosses(rom, patch_data["world_setup"]["miniboss_mapping"]) if not args.romdebugmode: patches.core.addFrameCounter(rom, len(item_list)) patches.core.warpHome(rom) # Needs to be done after setting the start location. - patches.titleScreen.setRomInfo(rom, world.multi_key, world.multiworld.seed_name, world.ladxr_settings, - world.player_name, world.player) - if world.options.ap_title_screen: + patches.titleScreen.setRomInfo(rom, patch_data) + if options["ap_title_screen"]: patches.titleScreen.setTitleGraphics(rom) patches.endscreen.updateEndScreen(rom) patches.aesthetics.updateSpriteData(rom) if args.doubletrouble: patches.enemies.doubleTrouble(rom) - if world.options.text_shuffle: + if options["text_shuffle"]: excluded_ids = [ # Overworld owl statues 0x1B6, 0x1B7, 0x1B8, 0x1B9, 0x1BA, 0x1BB, 0x1BC, 0x1BD, 0x1BE, 0x22D, @@ -388,6 +335,7 @@ def generateRom(args, world: "LinksAwakeningWorld"): excluded_texts = [ rom.texts[excluded_id] for excluded_id in excluded_ids] buckets = defaultdict(list) # For each ROM bank, shuffle text within the bank + random.seed(patch_data["seed"] + patch_data["player"]) for n, data in enumerate(rom.texts._PointerTable__data): # Don't muck up which text boxes are questions and which are statements if type(data) != int and data and data != b'\xFF' and data not in excluded_texts: @@ -395,20 +343,20 @@ def generateRom(args, world: "LinksAwakeningWorld"): for bucket in buckets.values(): # For each bucket, make a copy and shuffle shuffled = bucket.copy() - world.random.shuffle(shuffled) + random.shuffle(shuffled) # Then put new text in for bucket_idx, (orig_idx, data) in enumerate(bucket): rom.texts[shuffled[bucket_idx][0]] = data - if world.options.trendy_game != TrendyGame.option_normal: + if options["trendy_game"] != Options.TrendyGame.option_normal: # TODO: if 0 or 4, 5, remove inaccurate conveyor tiles room_editor = RoomEditor(rom, 0x2A0) - if world.options.trendy_game == TrendyGame.option_easy: + if options["trendy_game"] == Options.TrendyGame.option_easy: # Set physics flag on all objects for i in range(0, 6): rom.banks[0x4][0x6F1E + i -0x4000] = 0x4 @@ -419,7 +367,7 @@ def generateRom(args, world: "LinksAwakeningWorld"): # Add new conveyor to "push" yoshi (it's only a visual) room_editor.objects.append(Object(5, 3, 0xD0)) - if world.options.trendy_game >= TrendyGame.option_harder: + if options["trendy_game"] >= Options.TrendyGame.option_harder: """ Data_004_76A0:: db $FC, $00, $04, $00, $00 @@ -428,17 +376,18 @@ def generateRom(args, world: "LinksAwakeningWorld"): db $00, $04, $00, $FC, $00 """ speeds = { - TrendyGame.option_harder: (3, 8), - TrendyGame.option_hardest: (3, 8), - TrendyGame.option_impossible: (3, 16), + Options.TrendyGame.option_harder: (3, 8), + Options.TrendyGame.option_hardest: (3, 8), + Options.TrendyGame.option_impossible: (3, 16), } def speed(): - return world.random.randint(*speeds[world.options.trendy_game]) + random.seed(patch_data["seed"] + patch_data["player"]) + return random.randint(*speeds[options["trendy_game"]]) rom.banks[0x4][0x76A0-0x4000] = 0xFF - speed() rom.banks[0x4][0x76A2-0x4000] = speed() rom.banks[0x4][0x76A6-0x4000] = speed() rom.banks[0x4][0x76A8-0x4000] = 0xFF - speed() - if world.options.trendy_game >= TrendyGame.option_hardest: + if options["trendy_game"] >= Options.TrendyGame.option_hardest: rom.banks[0x4][0x76A1-0x4000] = 0xFF - speed() rom.banks[0x4][0x76A3-0x4000] = speed() rom.banks[0x4][0x76A5-0x4000] = speed() @@ -462,11 +411,11 @@ def generateRom(args, world: "LinksAwakeningWorld"): for channel in range(3): color[channel] = color[channel] * 31 // 0xbc - if world.options.warps != Warps.option_vanilla: - patches.core.addWarpImprovements(rom, world.options.warps == Warps.option_improved_additional) + if options["warps"] != Options.Warps.option_vanilla: + patches.core.addWarpImprovements(rom, options["warps"] == Options.Warps.option_improved_additional) - palette = world.options.palette - if palette != Palette.option_normal: + palette = options["palette"] + if palette != Options.Palette.option_normal: ranges = { # Object palettes # Overworld palettes @@ -496,22 +445,22 @@ def generateRom(args, world: "LinksAwakeningWorld"): r,g,b = bin_to_rgb(packed) # 1 bit - if palette == Palette.option_1bit: + if palette == Options.Palette.option_1bit: r &= 0b10000 g &= 0b10000 b &= 0b10000 # 2 bit - elif palette == Palette.option_1bit: + elif palette == Options.Palette.option_1bit: r &= 0b11000 g &= 0b11000 b &= 0b11000 # Invert - elif palette == Palette.option_inverted: + elif palette == Options.Palette.option_inverted: r = 31 - r g = 31 - g b = 31 - b # Pink - elif palette == Palette.option_pink: + elif palette == Options.Palette.option_pink: r = r // 2 r += 16 r = int(r) @@ -520,7 +469,7 @@ def generateRom(args, world: "LinksAwakeningWorld"): b += 16 b = int(b) b = clamp(b, 0, 0x1F) - elif palette == Palette.option_greyscale: + elif palette == Options.Palette.option_greyscale: # gray=int(0.299*r+0.587*g+0.114*b) gray = (r + g + b) // 3 r = g = b = gray @@ -531,10 +480,10 @@ def generateRom(args, world: "LinksAwakeningWorld"): SEED_LOCATION = 0x0134 # Patch over the title - assert(len(world.multi_key) == 12) - rom.patch(0x00, SEED_LOCATION, None, binascii.hexlify(world.multi_key)) + assert(len(multi_key) == 12) + rom.patch(0x00, SEED_LOCATION, None, binascii.hexlify(multi_key)) for pymod in pymods: pymod.postPatch(rom) - return rom + return rom.save() diff --git a/worlds/ladx/LADXR/hints.py b/worlds/ladx/LADXR/hints.py index aa7854889b..6f9f3e60f4 100644 --- a/worlds/ladx/LADXR/hints.py +++ b/worlds/ladx/LADXR/hints.py @@ -1,5 +1,7 @@ from .locations.items import * from .utils import formatText +from BaseClasses import ItemClassification +from ..Locations import LinksAwakeningLocation hint_text_ids = [ @@ -49,14 +51,64 @@ useless_hint = [ ] -def addHints(rom, rnd, hint_generator): +def addHints(rom, rnd, hint_texts): + hint_texts_copy = hint_texts.copy() text_ids = hint_text_ids.copy() rnd.shuffle(text_ids) for text_id in text_ids: - hint = hint_generator() + hint = hint_texts_copy.pop() if not hint: hint = rnd.choice(hints).format(*rnd.choice(useless_hint)) rom.texts[text_id] = formatText(hint) for text_id in range(0x200, 0x20C, 2): rom.texts[text_id] = formatText("Read this book?", ask="YES NO") + + +def generate_hint_texts(world): + JUNK_HINT = 0.33 + RANDOM_HINT= 0.66 + # USEFUL_HINT = 1.0 + # TODO: filter events, filter unshuffled keys + all_items = world.multiworld.get_items() + our_items = [item for item in all_items + if item.player == world.player + and item.location + and item.code is not None + and item.location.show_in_spoiler] + our_useful_items = [item for item in our_items if ItemClassification.progression in item.classification] + hint_texts = [] + def gen_hint(): + chance = world.random.uniform(0, 1) + if chance < JUNK_HINT: + return None + elif chance < RANDOM_HINT: + location = world.random.choice(our_items).location + else: # USEFUL_HINT + location = world.random.choice(our_useful_items).location + + if location.item.player == world.player: + name = "Your" + else: + name = f"{world.multiworld.player_name[location.item.player]}'s" + # filter out { and } since they cause issues with string.format later on + name = name.replace("{", "").replace("}", "") + + if isinstance(location, LinksAwakeningLocation): + location_name = location.ladxr_item.metadata.name + else: + location_name = location.name + + hint = f"{name} {location.item} is at {location_name}" + if location.player != world.player: + # filter out { and } since they cause issues with string.format later on + player_name = world.multiworld.player_name[location.player].replace("{", "").replace("}", "") + hint += f" in {player_name}'s world" + + # Cap hint size at 85 + # Realistically we could go bigger but let's be safe instead + hint = hint[:85] + return hint + for _ in hint_text_ids: + hint_texts.append(gen_hint()) + return hint_texts diff --git a/worlds/ladx/LADXR/locations/beachSword.py b/worlds/ladx/LADXR/locations/beachSword.py index 51fc4388e3..0835672cf7 100644 --- a/worlds/ladx/LADXR/locations/beachSword.py +++ b/worlds/ladx/LADXR/locations/beachSword.py @@ -11,19 +11,18 @@ class BeachSword(DroppedKey): super().__init__(0x0F2) def patch(self, rom: ROM, option: str, *, multiworld: Optional[int] = None) -> None: - if option != SWORD or multiworld is not None: - # Set the heart piece data - super().patch(rom, option, multiworld=multiworld) + # Set the heart piece data + super().patch(rom, option, multiworld=multiworld) - # Patch the room to contain a heart piece instead of the sword on the beach - re = RoomEditor(rom, 0x0F2) - re.removeEntities(0x31) # remove sword - re.addEntity(5, 5, 0x35) # add heart piece - re.store(rom) + # Patch the room to contain a heart piece instead of the sword on the beach + re = RoomEditor(rom, 0x0F2) + re.removeEntities(0x31) # remove sword + re.addEntity(5, 5, 0x35) # add heart piece + re.store(rom) - # Prevent shield drops from the like-like from turning into swords. - rom.patch(0x03, 0x1B9C, ASM("ld a, [$DB4E]"), ASM("ld a, $01"), fill_nop=True) - rom.patch(0x03, 0x244D, ASM("ld a, [$DB4E]"), ASM("ld a, $01"), fill_nop=True) + # Prevent shield drops from the like-like from turning into swords. + rom.patch(0x03, 0x1B9C, ASM("ld a, [$DB4E]"), ASM("ld a, $01"), fill_nop=True) + rom.patch(0x03, 0x244D, ASM("ld a, [$DB4E]"), ASM("ld a, $01"), fill_nop=True) def read(self, rom: ROM) -> str: re = RoomEditor(rom, 0x0F2) diff --git a/worlds/ladx/LADXR/patches/aesthetics.py b/worlds/ladx/LADXR/patches/aesthetics.py index 6ca7d3d973..2c9c818687 100644 --- a/worlds/ladx/LADXR/patches/aesthetics.py +++ b/worlds/ladx/LADXR/patches/aesthetics.py @@ -180,9 +180,10 @@ def noText(rom): def reduceMessageLengths(rom, rnd): # Into text from Marin. Got to go fast, so less text. (This intro text is very long) - lines = pkgutil.get_data(__name__, "marin.txt").decode("unicode_escape").splitlines() - lines = [l for l in lines if l.strip()] - rom.texts[0x01] = formatText(rnd.choice(lines).strip()) + lines = pkgutil.get_data(__name__, "marin.txt").splitlines(keepends=True) + while lines and lines[-1].strip() == b'': + lines.pop(-1) + rom.texts[0x01] = formatText(rnd.choice(lines).strip().decode("unicode_escape")) # Reduce length of a bunch of common texts rom.texts[0xEA] = formatText("You've got a Guardian Acorn!") diff --git a/worlds/ladx/LADXR/patches/core.py b/worlds/ladx/LADXR/patches/core.py index d9fcd62e30..10e85f9dc5 100644 --- a/worlds/ladx/LADXR/patches/core.py +++ b/worlds/ladx/LADXR/patches/core.py @@ -541,7 +541,7 @@ OAMData: rom.banks[0x38][0x1400+n*0x20:0x1410+n*0x20] = utils.createTileData(gfx_high) rom.banks[0x38][0x1410+n*0x20:0x1420+n*0x20] = utils.createTileData(gfx_low) -def addBootsControls(rom, boots_controls: BootsControls): +def addBootsControls(rom, boots_controls: int): if boots_controls == BootsControls.option_vanilla: return consts = { @@ -578,7 +578,7 @@ def addBootsControls(rom, boots_controls: BootsControls): jr z, .yesBoots ld a, [hl] """ - }[boots_controls.value] + }[boots_controls] # The new code fits exactly within Nintendo's poorly space optimzied code while having more features boots_code = assembler.ASM(""" diff --git a/worlds/ladx/LADXR/patches/enemies.py b/worlds/ladx/LADXR/patches/enemies.py index f5e1df1313..29322918f2 100644 --- a/worlds/ladx/LADXR/patches/enemies.py +++ b/worlds/ladx/LADXR/patches/enemies.py @@ -42,7 +42,7 @@ MINIBOSS_ENTITIES = { "ARMOS_KNIGHT": [(4, 3, 0x88)], } MINIBOSS_ROOMS = { - 0: 0x111, 1: 0x128, 2: 0x145, 3: 0x164, 4: 0x193, 5: 0x1C5, 6: 0x228, 7: 0x23F, + "0": 0x111, "1": 0x128, "2": 0x145, "3": 0x164, "4": 0x193, "5": 0x1C5, "6": 0x228, "7": 0x23F, "c1": 0x30C, "c2": 0x303, "moblin_cave": 0x2E1, "armos_temple": 0x27F, diff --git a/worlds/ladx/LADXR/patches/marin.txt b/worlds/ladx/LADXR/patches/marin.txt index 3634014afe..e287833a51 100644 --- a/worlds/ladx/LADXR/patches/marin.txt +++ b/worlds/ladx/LADXR/patches/marin.txt @@ -220,7 +220,6 @@ To this day I still don't know if we inconvenienced the Mad Batter or not. Oh, hi ##### People forgot I was playable in Hyrule Warriors Join our Discord. Or else. -Also try Minecraft! I see you're finally awake... OwO This is Todd Howard, and today I'm pleased to announce... The Elder Scrolls V: Skyrim for the Nintendo Game Boy Color! @@ -256,7 +255,6 @@ Try Bumper Stickers! Try Castlevania 64! Try Celeste 64! Try ChecksFinder! -Try Clique! Try Dark Souls III! Try DLCQuest! Try Donkey Kong Country 3! @@ -269,6 +267,7 @@ Try A Hat in Time! Try Heretic! Try Hollow Knight! Try Hylics 2! +Try Jak and Daxter: The Precursor Legacy! Try Kingdom Hearts 2! Try Kirby's Dream Land 3! Try Landstalker - The Treasures of King Nole! @@ -281,7 +280,6 @@ Try Mario & Luigi Superstar Saga! Try MegaMan Battle Network 3! Try Meritous! Try The Messenger! -Try Minecraft! Try Muse Dash! Try Noita! Try Ocarina of Time! @@ -290,11 +288,10 @@ Try Pokemon Emerald! Try Pokemon Red and Blue! Try Raft! Try Risk of Rain 2! -Try Rogue Legacy! Try Secret of Evermore! +Try shapez! Try Shivers! Try A Short Hike! -Try Slay the Spire! Try SMZ3! Try Sonic Adventure 2 Battle! Try Starcraft 2! @@ -302,6 +299,7 @@ Try Stardew Valley! Try Subnautica! Try Sudoku! Try Super Mario 64! +Try Super Mario Land 2: 6 Golden Coins! Try Super Mario World! Try Super Metroid! Try Terraria! @@ -314,7 +312,6 @@ Try The Witness! Try Yoshi's Island! Try Yu-Gi-Oh! 2006! Try Zillion! -Try Zork Grand Inquisitor! Try Old School Runescape! Try Kingdom Hearts! Try Mega Man 2! @@ -371,7 +368,6 @@ Have they added Among Us to AP yet? Every copy of LADX is personalized, David. Looks like you're going on A Short Hike. Bring back feathers please? Functioning Brain is at...\nWait. This isn't Witness. Wrong game, sorry. -Don't forget to check your Clique!\nIf, y'know, you have one. No pressure... :3 Sorry ######, but your progression item is in another world. &newgames\n&oldgames @@ -428,7 +424,6 @@ Oh, look at that. Link's Awakened.\nYou did it, you beat the game. Excellent armaments, #####. Please return - \nCOVERED IN BLOOD -\n...safe and sound. Pray return to the Link's Awakening Sands. This Marin dialogue was inspired by The Witness's audiologs. -You're awake!\n....\nYou were warned.\nI'm now going to say every word beginning with Z!\nZA\nZABAGLIONE\nZABAGLIONES\nZABAIONE\nZABAIONES\nZABAJONE\nZABAJONES\nZABETA\nZABETAS\nZABRA\nZABRAS\nZABTIEH\nZABTIEHS\nZACATON\nZACATONS\nZACK\nZACKS\nZADDICK\nZADDIK\nZADDIKIM\nZADDIKS\nZAFFAR\nzAFFARS\nZAFFER\nZAFFERS\nZAFFIR\n....\n....\n....\nI'll let you off easy.\nThis time. Leave me alone, I'm Marinating. praise be to the tungsten cube If you play multiple seeds in a row, you can pretend that each run is the dream you awaken from in the next. diff --git a/worlds/ladx/LADXR/patches/titleScreen.py b/worlds/ladx/LADXR/patches/titleScreen.py index 3a4dade218..d986a570ef 100644 --- a/worlds/ladx/LADXR/patches/titleScreen.py +++ b/worlds/ladx/LADXR/patches/titleScreen.py @@ -1,7 +1,6 @@ from ..backgroundEditor import BackgroundEditor from .aesthetics import rgb_to_bin, bin_to_rgb, prepatch import copy -import pkgutil CHAR_MAP = {'z': 0x3E, '-': 0x3F, '.': 0x39, ':': 0x42, '?': 0x3C, '!': 0x3D} def _encode(s): @@ -18,17 +17,18 @@ def _encode(s): return result -def setRomInfo(rom, seed, seed_name, settings, player_name, player_id): +def setRomInfo(rom, patch_data): + seed_name = patch_data["seed_name"] try: - seednr = int(seed, 16) + seednr = int(patch_data["seed"], 16) except: import hashlib - seednr = int(hashlib.md5(seed).hexdigest(), 16) + seednr = int(hashlib.md5(str(patch_data["seed"]).encode()).hexdigest(), 16) - if settings.race: + if patch_data["is_race"]: seed_name = "Race" - if isinstance(settings.race, str): - seed_name += " " + settings.race + if isinstance(patch_data["is_race"], str): + seed_name += " " + patch_data["is_race"] rom.patch(0x00, 0x07, "00", "01") else: rom.patch(0x00, 0x07, "00", "52") @@ -37,7 +37,7 @@ def setRomInfo(rom, seed, seed_name, settings, player_name, player_id): #line_2_hex = _encode(seed[16:]) BASE_DRAWING_AREA = 0x98a0 LINE_WIDTH = 0x20 - player_id_text = f"Player {player_id}:" + player_id_text = f"Player {patch_data['player']}:" for n in (3, 4): be = BackgroundEditor(rom, n) ba = BackgroundEditor(rom, n, attributes=True) @@ -45,9 +45,9 @@ def setRomInfo(rom, seed, seed_name, settings, player_name, player_id): for n, v in enumerate(_encode(player_id_text)): be.tiles[BASE_DRAWING_AREA + LINE_WIDTH * 5 + 2 + n] = v ba.tiles[BASE_DRAWING_AREA + LINE_WIDTH * 5 + 2 + n] = 0x00 - for n, v in enumerate(_encode(player_name)): - be.tiles[BASE_DRAWING_AREA + LINE_WIDTH * 6 + 0x13 - len(player_name) + n] = v - ba.tiles[BASE_DRAWING_AREA + LINE_WIDTH * 6 + 0x13 - len(player_name) + n] = 0x00 + for n, v in enumerate(_encode(patch_data['player_name'])): + be.tiles[BASE_DRAWING_AREA + LINE_WIDTH * 6 + 0x13 - len(patch_data['player_name']) + n] = v + ba.tiles[BASE_DRAWING_AREA + LINE_WIDTH * 6 + 0x13 - len(patch_data['player_name']) + n] = 0x00 for n, v in enumerate(line_1_hex): be.tiles[0x9a20 + n] = v ba.tiles[0x9a20 + n] = 0x00 diff --git a/worlds/ladx/LADXR/patches/tradeSequence.py b/worlds/ladx/LADXR/patches/tradeSequence.py index 0eb46ae23a..ef6f635d45 100644 --- a/worlds/ladx/LADXR/patches/tradeSequence.py +++ b/worlds/ladx/LADXR/patches/tradeSequence.py @@ -387,7 +387,7 @@ def patchVarious(rom, settings): # Boomerang trade guy # if settings.boomerang not in {'trade', 'gift'} or settings.overworld in {'normal', 'nodungeons'}: - if settings.tradequest: + if settings["tradequest"]: # Update magnifier checks rom.patch(0x19, 0x05EC, ASM("ld a, [wTradeSequenceItem]\ncp $0E\njp nz, $7E61"), ASM("ld a, [wTradeSequenceItem2]\nand $20\njp z, $7E61")) # show the guy rom.patch(0x00, 0x3199, ASM("ld a, [wTradeSequenceItem]\ncp $0E\njr nz, $06"), ASM("ld a, [wTradeSequenceItem2]\nand $20\njr z, $06")) # load the proper room layout diff --git a/worlds/ladx/LADXR/rom.py b/worlds/ladx/LADXR/rom.py index 21969f4ab4..54d8f02916 100644 --- a/worlds/ladx/LADXR/rom.py +++ b/worlds/ladx/LADXR/rom.py @@ -7,9 +7,7 @@ h2b = binascii.unhexlify class ROM: - def __init__(self, filename, patches=None): - data = open(Utils.user_path(filename), "rb").read() - + def __init__(self, data, patches=None): if patches: for patch in patches: data = bsdiff4.patch(data, patch) @@ -64,18 +62,10 @@ class ROM: self.banks[0][0x14E] = checksum >> 8 self.banks[0][0x14F] = checksum & 0xFF - def save(self, file, *, name=None): + def save(self): # don't pass the name to fixHeader self.fixHeader() - if isinstance(file, str): - f = open(file, "wb") - for bank in self.banks: - f.write(bank) - f.close() - print("Saved:", file) - else: - for bank in self.banks: - file.write(bank) + return b"".join(self.banks) def readHexSeed(self): return self.banks[0x3E][0x2F00:0x2F10].hex().upper() diff --git a/worlds/ladx/LADXR/romTables.py b/worlds/ladx/LADXR/romTables.py index 3192443685..51acacc31c 100644 --- a/worlds/ladx/LADXR/romTables.py +++ b/worlds/ladx/LADXR/romTables.py @@ -181,8 +181,8 @@ class IndoorRoomSpriteData(PointerTable): class ROMWithTables(ROM): - def __init__(self, filename, patches=None): - super().__init__(filename, patches) + def __init__(self, data, patches=None): + super().__init__(data, patches) # Ability to patch any text in the game with different text self.texts = Texts(self) @@ -203,7 +203,7 @@ class ROMWithTables(ROM): self.itemNames = {} - def save(self, filename, *, name=None): + def save(self): # Assert special handling of bank 9 expansion is fine for i in range(0x3d42, 0x4000): assert self.banks[9][i] == 0, self.banks[9][i] @@ -221,4 +221,4 @@ class ROMWithTables(ROM): self.room_sprite_data_indoor.store(self) self.background_tiles.store(self) self.background_attributes.store(self) - super().save(filename, name=name) + return super().save() diff --git a/worlds/ladx/Options.py b/worlds/ladx/Options.py index 7ea7df3659..2352e0fb91 100644 --- a/worlds/ladx/Options.py +++ b/worlds/ladx/Options.py @@ -23,11 +23,24 @@ class LADXROption: class Logic(Choice, LADXROption): """ Affects where items are allowed to be placed. - [Normal] Playable without using any tricks or glitches. Can require knowledge from a vanilla playthrough, such as how to open Color Dungeon. - [Hard] More advanced techniques may be required, but glitches are not. Examples include tricky jumps, killing enemies with only pots. - [Glitched] Advanced glitches and techniques may be required, but extremely difficult or tedious tricks are not required. Examples include Bomb Triggers, Super Jumps and Jesus Jumps. - [Hell] Obscure knowledge and hard techniques may be required. Examples include featherless jumping with boots and/or hookshot, sequential pit buffers and unclipped superjumps. Things in here can be extremely hard to do or very time consuming.""" + + **Normal:** Playable without using any tricks or glitches. Can require + knowledge from a vanilla playthrough, such as how to open Color Dungeon. + + **Hard:** More advanced techniques may be required, but glitches are not. + Examples include tricky jumps, killing enemies with only pots. + + **Glitched:** Advanced glitches and techniques may be required, but + extremely difficult or tedious tricks are not required. Examples include + Bomb Triggers, Super Jumps and Jesus Jumps. + + **Hell:** Obscure knowledge and hard techniques may be required. Examples + include featherless jumping with boots and/or hookshot, sequential pit + buffers and unclipped superjumps. Things in here can be extremely hard to do + or very time consuming. + """ display_name = "Logic" + rich_text_doc = True ladxr_name = "logic" # option_casual = 0 option_normal = 1 @@ -40,8 +53,8 @@ class Logic(Choice, LADXROption): class TradeQuest(DefaultOffToggle, LADXROption): """ - [On] adds the trade items to the pool (the trade locations will always be local items) - [Off] (default) doesn't add them + Trade quest items are randomized. Each NPC takes its normal trade quest + item and gives a randomized item in return. """ display_name = "Trade Quest" ladxr_name = "tradequest" @@ -49,40 +62,32 @@ class TradeQuest(DefaultOffToggle, LADXROption): class TextShuffle(DefaultOffToggle): """ - [On] Shuffles all the text in the game - [Off] (default) doesn't shuffle them. + Shuffles all text in the game. """ display_name = "Text Shuffle" class Rooster(DefaultOnToggle, LADXROption): """ - [On] Adds the rooster to the item pool. - [Off] The rooster spot is still a check giving an item. But you will never find the rooster. In that case, any rooster spot is accessible without rooster by other means. + Adds the rooster to the item pool. If disabled, the overworld will be + modified so that any location requiring the rooster is accessible by other + means. """ display_name = "Rooster" ladxr_name = "rooster" -class Boomerang(Choice): - """ - [Normal] requires Magnifying Lens to get the boomerang. - [Gift] The boomerang salesman will give you a random item, and the boomerang is shuffled. - """ - display_name = "Boomerang" - - normal = 0 - gift = 1 - default = gift - - class EntranceShuffle(Choice, LADXROption): """ - [WARNING] Experimental, may fail to fill - Randomizes where overworld entrances lead to. - [Simple] Single-entrance caves/houses that have items are shuffled amongst each other. - If random start location and/or dungeon shuffle is enabled, then these will be shuffled with all the non-connector entrance pool. - Note, some entrances can lead into water, use the warp-to-home from the save&quit menu to escape this.""" + Randomizes where overworld entrances lead. + + **Simple:** Single-entrance caves/houses that have items are shuffled + amongst each other. + + If *Dungeon Shuffle* is enabled, then dungeons will be shuffled with all the + non-connector entrances in the pool. Note, some entrances can lead into water, use + the warp-to-home from the save&quit menu to escape this. + """ # [Advanced] Simple, but two-way connector caves are shuffled in their own pool as well. # [Expert] Advanced, but caves/houses without items are also shuffled into the Simple entrance pool. @@ -94,22 +99,22 @@ class EntranceShuffle(Choice, LADXROption): # option_expert = 3 # option_insanity = 4 default = option_none - display_name = "Experimental Entrance Shuffle" + display_name = "Entrance Shuffle" ladxr_name = "entranceshuffle" + rich_text_doc = True class DungeonShuffle(DefaultOffToggle, LADXROption): """ - [WARNING] Experimental, may fail to fill - Randomizes dungeon entrances within eachother + Randomizes dungeon entrances with each other. """ - display_name = "Experimental Dungeon Shuffle" + display_name = "Dungeon Shuffle" ladxr_name = "dungeonshuffle" class APTitleScreen(DefaultOnToggle): """ - Enables AP specific title screen and disables the intro cutscene + Enables AP specific title screen and disables the intro cutscene. """ display_name = "AP Title Screen" @@ -124,6 +129,7 @@ class BossShuffle(Choice): class DungeonItemShuffle(Choice): display_name = "Dungeon Item Shuffle" + rich_text_doc = True option_original_dungeon = 0 option_own_dungeons = 1 option_own_world = 2 @@ -138,12 +144,15 @@ class DungeonItemShuffle(Choice): class ShuffleNightmareKeys(DungeonItemShuffle): """ - Shuffle Nightmare Keys - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. """ display_name = "Shuffle Nightmare Keys" ladxr_item = "NIGHTMARE_KEY" @@ -151,12 +160,15 @@ class ShuffleNightmareKeys(DungeonItemShuffle): class ShuffleSmallKeys(DungeonItemShuffle): """ - Shuffle Small Keys - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. """ display_name = "Shuffle Small Keys" ladxr_item = "KEY" @@ -164,12 +176,15 @@ class ShuffleSmallKeys(DungeonItemShuffle): class ShuffleMaps(DungeonItemShuffle): """ - Shuffle Dungeon Maps - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. """ display_name = "Shuffle Maps" ladxr_item = "MAP" @@ -177,12 +192,15 @@ class ShuffleMaps(DungeonItemShuffle): class ShuffleCompasses(DungeonItemShuffle): """ - Shuffle Dungeon Compasses - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. """ display_name = "Shuffle Compasses" ladxr_item = "COMPASS" @@ -190,12 +208,15 @@ class ShuffleCompasses(DungeonItemShuffle): class ShuffleStoneBeaks(DungeonItemShuffle): """ - Shuffle Owl Beaks - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. """ display_name = "Shuffle Stone Beaks" ladxr_item = "STONE_BEAK" @@ -203,13 +224,17 @@ class ShuffleStoneBeaks(DungeonItemShuffle): class ShuffleInstruments(DungeonItemShuffle): """ - Shuffle Instruments - [Original Dungeon] The item will be within its original dungeon - [Own Dungeons] The item will be within a dungeon in your world - [Own World] The item will be somewhere in your world - [Any World] The item could be anywhere - [Different World] The item will be somewhere in another world - [Vanilla] The item will be in its vanilla location in your world + **Original Dungeon:** The item will be within its original dungeon. + + **Own Dungeons:** The item will be within a dungeon in your world. + + **Own World:** The item will be somewhere in your world. + + **Any World:** The item could be anywhere. + + **Different World:** The item will be somewhere in another world. + + **Vanilla:** The item will be in its vanilla location in your world. """ display_name = "Shuffle Instruments" ladxr_item = "INSTRUMENT" @@ -220,12 +245,18 @@ class ShuffleInstruments(DungeonItemShuffle): class Goal(Choice, LADXROption): """ - The Goal of the game - [Instruments] The Wind Fish's Egg will only open if you have the required number of Instruments of the Sirens, and play the Ballad of the Wind Fish. - [Seashells] The Egg will open when you bring 20 seashells. The Ballad and Ocarina are not needed. - [Open] The Egg will start pre-opened. + The Goal of the game. + + **Instruments:** The Wind Fish's Egg will only open if you have the required + number of Instruments of the Sirens, and play the Ballad of the Wind Fish. + + **Seashells:** The Egg will open when you bring 20 seashells. The Ballad and + Ocarina are not needed. + + **Open:** The Egg will start pre-opened. """ display_name = "Goal" + rich_text_doc = True ladxr_name = "goal" option_instruments = 1 option_seashells = 2 @@ -242,7 +273,7 @@ class Goal(Choice, LADXROption): class InstrumentCount(Range, LADXROption): """ - Sets the number of instruments required to open the Egg + Sets the number of instruments required to open the Egg. """ display_name = "Instrument Count" ladxr_name = None @@ -253,7 +284,8 @@ class InstrumentCount(Range, LADXROption): class NagMessages(DefaultOffToggle, LADXROption): """ - Controls if nag messages are shown when rocks and crystals are touched. Useful for glitches, annoying for everyone else. + Controls if nag messages are shown when rocks and crystals are touched. + Useful for glitches, annoying for everything else. """ display_name = "Nag Messages" ladxr_name = "nagmessages" @@ -262,31 +294,30 @@ class NagMessages(DefaultOffToggle, LADXROption): class MusicChangeCondition(Choice): """ Controls how the music changes. - [Sword] When you pick up a sword, the music changes - [Always] You always have the post-sword music + + **Sword:** When you pick up a sword, the music changes. + + **Always:** You always have the post-sword music. """ display_name = "Music Change Condition" + rich_text_doc = True option_sword = 0 option_always = 1 default = option_always -# Setting('hpmode', 'Gameplay', 'm', 'Health mode', options=[('default', '', 'Normal'), ('inverted', 'i', 'Inverted'), ('1', '1', 'Start with 1 heart'), ('low', 'l', 'Low max')], default='default', -# description=""" -# [Normal} health works as you would expect. -# [Inverted] you start with 9 heart containers, but killing a boss will take a heartcontainer instead of giving one. -# [Start with 1] normal game, you just start with 1 heart instead of 3. -# [Low max] replace heart containers with heart pieces."""), - - class HardMode(Choice, LADXROption): """ - [Oracle] Less iframes and health from drops. Bombs damage yourself. Water damages you without flippers. No piece of power or acorn. - [Hero] Switch version hero mode, double damage, no heart/fairy drops. - [One hit KO] You die on a single hit, always. + **Oracle:** Less iframes and health from drops. Bombs damage yourself. Water + damages you without flippers. No pieces of power or acorns. + + **Hero:** Switch version hero mode, double damage, no heart/fairy drops. + + **OHKO:** You die on a single hit, always. """ display_name = "Hard Mode" ladxr_name = "hardmode" + rich_text_doc = True option_none = 0 option_oracle = 1 option_hero = 2 @@ -294,44 +325,26 @@ class HardMode(Choice, LADXROption): default = option_none -# Setting('steal', 'Gameplay', 't', 'Stealing from the shop', -# options=[('always', 'a', 'Always'), ('never', 'n', 'Never'), ('default', '', 'Normal')], default='default', -# description="""Effects when you can steal from the shop. Stealing is bad and never in logic. -# [Normal] requires the sword before you can steal. -# [Always] you can always steal from the shop -# [Never] you can never steal from the shop."""), -class Bowwow(Choice): - """Allows BowWow to be taken into any area. Certain enemies and bosses are given a new weakness to BowWow. - [Normal] BowWow is in the item pool, but can be logically expected as a damage source. - [Swordless] The progressive swords are removed from the item pool. - """ - display_name = "BowWow" - normal = 0 - swordless = 1 - default = normal - - class Overworld(Choice, LADXROption): """ - [Open Mabe] Replaces rock on the east side of Mabe Village with bushes, allowing access to Ukuku Prairie without Power Bracelet. + **Open Mabe:** Replaces rock on the east side of Mabe Village with bushes, + allowing access to Ukuku Prairie without Power Bracelet. """ display_name = "Overworld" ladxr_name = "overworld" + rich_text_doc = True option_normal = 0 option_open_mabe = 1 default = option_normal -# Setting('superweapons', 'Special', 'q', 'Enable super weapons', default=False, -# description='All items will be more powerful, faster, harder, bigger stronger. You name it.'), - - class Quickswap(Choice, LADXROption): """ - Adds that the SELECT button swaps with either A or B. The item is swapped with the top inventory slot. The map is not available when quickswap is enabled. + Instead of opening the map, the *SELECT* button swaps the top item of your inventory on to your *A* or *B* button. """ display_name = "Quickswap" ladxr_name = "quickswap" + rich_text_doc = True option_none = 0 option_a = 1 option_b = 2 @@ -340,10 +353,11 @@ class Quickswap(Choice, LADXROption): class TextMode(Choice, LADXROption): """ - [Fast] Makes text appear twice as fast + **Fast:** Makes text appear twice as fast. """ display_name = "Text Mode" ladxr_name = "textmode" + rich_text_doc = True option_normal = 0 option_fast = 1 default = option_fast @@ -363,7 +377,8 @@ class LowHpBeep(Choice, LADXROption): class NoFlash(DefaultOnToggle, LADXROption): """ - Remove the flashing light effects from Mamu, shopkeeper and MadBatter. Useful for capture cards and people that are sensitive to these things. + Remove the flashing light effects from Mamu, shopkeeper and MadBatter. + Useful for capture cards and people that are sensitive to these things. """ display_name = "No Flash" ladxr_name = "noflash" @@ -371,23 +386,34 @@ class NoFlash(DefaultOnToggle, LADXROption): class BootsControls(Choice): """ - Adds additional button to activate Pegasus Boots (does nothing if you haven't picked up your boots!) - [Vanilla] Nothing changes, you have to equip the boots to use them - [Bracelet] Holding down the button for the bracelet also activates boots (somewhat like Link to the Past) - [Press A] Holding down A activates boots - [Press B] Holding down B activates boots + Adds an additional button to activate Pegasus Boots (does nothing if you + haven't picked up your boots!) + + **Vanilla:** Nothing changes, you have to equip the boots to use them. + + **Bracelet:** Holding down the button for the bracelet also activates boots + (somewhat like Link to the Past). + + **Press A:** Holding down A activates boots. + + **Press B:** Holding down B activates boots. """ display_name = "Boots Controls" + rich_text_doc = True option_vanilla = 0 option_bracelet = 1 option_press_a = 2 + alias_a = 2 option_press_b = 3 + alias_b = 3 class LinkPalette(Choice, LADXROption): """ - Sets link's palette - A-D are color palettes usually used during the damage animation and can change based on where you are. + Sets Link's palette. + + A-D are color palettes usually used during the damage animation and can + change based on where you are. """ display_name = "Link's Palette" ladxr_name = "linkspalette" @@ -408,14 +434,21 @@ class LinkPalette(Choice, LADXROption): class TrendyGame(Choice): """ - [Easy] All of the items hold still for you - [Normal] The vanilla behavior - [Hard] The trade item also moves - [Harder] The items move faster - [Hardest] The items move diagonally - [Impossible] The items move impossibly fast, may scroll on and off the screen + **Easy:** All of the items hold still for you. + + **Normal:** The vanilla behavior. + + **Hard:** The trade item also moves. + + **Harder:** The items move faster. + + **Hardest:** The items move diagonally. + + **Impossible:** The items move impossibly fast, may scroll on and off the + screen. """ display_name = "Trendy Game" + rich_text_doc = True option_easy = 0 option_normal = 1 option_hard = 2 @@ -425,60 +458,34 @@ class TrendyGame(Choice): default = option_normal -class GfxMod(FreeText, LADXROption): +class GfxMod(DefaultOffToggle): """ - Sets the sprite for link, among other things - The option should be the same name as a with sprite (and optional name) file in data/sprites/ladx + If enabled, the patcher will prompt the user for a modification file to change sprites in the game and optionally some text. """ display_name = "GFX Modification" - ladxr_name = "gfxmod" - normal = '' - default = 'Link' - - __spriteDir: str = Utils.local_path(os.path.join('data', 'sprites', 'ladx')) - __spriteFiles: typing.DefaultDict[str, typing.List[str]] = defaultdict(list) - - extensions = [".bin", ".bdiff", ".png", ".bmp"] - - for file in os.listdir(__spriteDir): - name, extension = os.path.splitext(file) - if extension in extensions: - __spriteFiles[name].append(file) - - def __init__(self, value: str): - super().__init__(value) - - def verify(self, world, player_name: str, plando_options) -> None: - if self.value == "Link" or self.value in GfxMod.__spriteFiles: - return - raise Exception( - f"LADX Sprite '{self.value}' not found. Possible sprites are: {['Link'] + list(GfxMod.__spriteFiles.keys())}") - - def to_ladxr_option(self, all_options): - if self.value == -1 or self.value == "Link": - return None, None - - assert self.value in GfxMod.__spriteFiles - - if len(GfxMod.__spriteFiles[self.value]) > 1: - logger.warning( - f"{self.value} does not uniquely identify a file. Possible matches: {GfxMod.__spriteFiles[self.value]}. Using {GfxMod.__spriteFiles[self.value][0]}") - - return self.ladxr_name, self.__spriteDir + "/" + GfxMod.__spriteFiles[self.value][0] class Palette(Choice): """ Sets the palette for the game. - Note: A few places aren't patched, such as the menu and a few color dungeon tiles. - [Normal] The vanilla palette - [1-Bit] One bit of color per channel - [2-Bit] Two bits of color per channel - [Greyscale] Shades of grey - [Pink] Aesthetic - [Inverted] Inverted + + Note: A few places aren't patched, such as the menu and a few color dungeon + tiles. + + **Normal:** The vanilla palette. + + **1-Bit:** One bit of color per channel. + + **2-Bit:** Two bits of color per channel. + + **Greyscale:** Shades of grey. + + **Pink:** Aesthetic. + + **Inverted:** Inverted. """ display_name = "Palette" + rich_text_doc = True option_normal = 0 option_1bit = 1 option_2bit = 2 @@ -489,12 +496,15 @@ class Palette(Choice): class Music(Choice, LADXROption): """ - [Vanilla] Regular Music - [Shuffled] Shuffled Music - [Off] No music + **Vanilla:** Regular Music + + **Shuffled:** Shuffled Music + + **Off:** No music """ display_name = "Music" ladxr_name = "music" + rich_text_doc = True option_vanilla = 0 option_shuffled = 1 option_off = 2 @@ -510,10 +520,14 @@ class Music(Choice, LADXROption): class Warps(Choice): """ - [Improved] Adds remake style warp screen to the game. Choose your warp destination on the map after jumping in a portal and press B to select. - [Improved Additional] Improved warps, and adds a warp point at Crazy Tracy's house (the Mambo teleport spot) and Eagle's Tower. + **Improved:** Adds remake style warp screen to the game. Choose your warp + destination on the map after jumping in a portal and press *B* to select. + + **Improved Additional:** Improved warps, and adds a warp point at Crazy + Tracy's house (the Mambo teleport spot) and Eagle's Tower. """ display_name = "Warps" + rich_text_doc = True option_vanilla = 0 option_improved = 1 option_improved_additional = 2 @@ -522,19 +536,24 @@ class Warps(Choice): class InGameHints(DefaultOnToggle): """ - When enabled, owl statues and library books may indicate the location of your items in the multiworld. + When enabled, owl statues and library books may indicate the location of + your items in the multiworld. """ display_name = "In-game Hints" class TarinsGift(Choice): """ - [Local Progression] Forces Tarin's gift to be an item that immediately opens up local checks. - Has little effect in single player games, and isn't always necessary with randomized entrances. - [Bush Breaker] Forces Tarin's gift to be an item that can destroy bushes. - [Any Item] Tarin's gift can be any item for any world + **Local Progression:** Forces Tarin's gift to be an item that immediately + opens up local checks. Has little effect in single player games, and isn't + always necessary with randomized entrances. + + **Bush Breaker:** Forces Tarin's gift to be an item that can destroy bushes. + + **Any Item:** Tarin's gift can be any item for any world """ display_name = "Tarin's Gift" + rich_text_doc = True option_local_progression = 0 option_bush_breaker = 1 option_any_item = 2 @@ -543,67 +562,69 @@ class TarinsGift(Choice): class StabilizeItemPool(DefaultOffToggle): """ - By default, rupees in the item pool may be randomly swapped with bombs, arrows, powders, or capacity upgrades. This option disables that swapping, which is useful for plando. + By default, some rupees in the item pool are randomly swapped with bombs, + arrows, powders, or capacity upgrades. This set of items is also used as + filler. This option disables that swapping and makes *Nothing* the filler + item. """ display_name = "Stabilize Item Pool" + rich_text_doc = True class ForeignItemIcons(Choice): """ Choose how to display foreign items. - [Guess By Name] Foreign items can look like any Link's Awakening item. - [Indicate Progression] Foreign items are either a Piece of Power (progression) or Guardian Acorn (non-progression). + + **Guess By Name:** Foreign items can look like any Link's Awakening item. + + **Indicate Progression:** Foreign items are either a Piece of Power + (progression) or Guardian Acorn (non-progression). """ display_name = "Foreign Item Icons" + rich_text_doc = True option_guess_by_name = 0 option_indicate_progression = 1 default = option_guess_by_name ladx_option_groups = [ - OptionGroup("Goal Options", [ - Goal, - InstrumentCount, + OptionGroup("Gameplay Adjustments", [ + InGameHints, + TarinsGift, + HardMode, + TrendyGame, ]), - OptionGroup("Shuffles", [ + OptionGroup("World Layout", [ + Overworld, + Warps, + DungeonShuffle, + EntranceShuffle, + ]), + OptionGroup("Item Pool", [ ShuffleInstruments, ShuffleNightmareKeys, ShuffleSmallKeys, ShuffleMaps, ShuffleCompasses, - ShuffleStoneBeaks - ]), - OptionGroup("Warp Points", [ - Warps, - ]), - OptionGroup("Miscellaneous", [ + ShuffleStoneBeaks, TradeQuest, Rooster, - TarinsGift, - Overworld, - TrendyGame, - InGameHints, - NagMessages, StabilizeItemPool, + ]), + OptionGroup("Quality of Life & Aesthetic", [ + NagMessages, Quickswap, - HardMode, - BootsControls - ]), - OptionGroup("Experimental", [ - DungeonShuffle, - EntranceShuffle - ]), - OptionGroup("Visuals & Sound", [ + BootsControls, + ForeignItemIcons, + GfxMod, LinkPalette, Palette, - TextShuffle, - ForeignItemIcons, APTitleScreen, - GfxMod, + TextShuffle, + TextMode, Music, MusicChangeCondition, LowHpBeep, - TextMode, NoFlash, ]) ] @@ -611,24 +632,12 @@ ladx_option_groups = [ @dataclass class LinksAwakeningOptions(PerGameCommonOptions): logic: Logic - # 'heartpiece': DefaultOnToggle, # description='Includes heart pieces in the item pool'), - # 'seashells': DefaultOnToggle, # description='Randomizes the secret sea shells hiding in the ground/trees. (chest are always randomized)'), - # 'heartcontainers': DefaultOnToggle, # description='Includes boss heart container drops in the item pool'), - # 'instruments': DefaultOffToggle, # description='Instruments are placed on random locations, dungeon goal will just contain a random item.'), - tradequest: TradeQuest # description='Trade quest items are randomized, each NPC takes its normal trade quest item, but gives a random item'), - # 'witch': DefaultOnToggle, # description='Adds both the toadstool and the reward for giving the toadstool to the witch to the item pool'), - rooster: Rooster # description='Adds the rooster to the item pool. Without this option, the rooster spot is still a check giving an item. But you will never find the rooster. Any rooster spot is accessible without rooster by other means.'), - # 'boomerang': Boomerang, - # 'randomstartlocation': DefaultOffToggle, # 'Randomize where your starting house is located'), - experimental_dungeon_shuffle: DungeonShuffle # 'Randomizes the dungeon that each dungeon entrance leads to'), + tradequest: TradeQuest + rooster: Rooster + experimental_dungeon_shuffle: DungeonShuffle experimental_entrance_shuffle: EntranceShuffle - # 'bossshuffle': BossShuffle, - # 'minibossshuffle': BossShuffle, goal: Goal instrument_count: InstrumentCount - # 'itempool': ItemPool, - # 'bowwow': Bowwow, - # 'overworld': Overworld, link_palette: LinkPalette warps: Warps trendy_game: TrendyGame diff --git a/worlds/ladx/Rom.py b/worlds/ladx/Rom.py index 8ae1fac0fa..969215a5e4 100644 --- a/worlds/ladx/Rom.py +++ b/worlds/ladx/Rom.py @@ -3,19 +3,112 @@ import worlds.Files import hashlib import Utils import os +import json +import pkgutil +import bsdiff4 +import binascii +import pickle +from typing import TYPE_CHECKING +from .Common import * +from .LADXR import generator +from .LADXR.main import get_parser +from .LADXR.hints import generate_hint_texts +from .LADXR.locations.keyLocation import KeyLocation LADX_HASH = "07c211479386825042efb4ad31bb525f" -class LADXDeltaPatch(worlds.Files.APDeltaPatch): +if TYPE_CHECKING: + from . import LinksAwakeningWorld + + +class LADXPatchExtensions(worlds.Files.APPatchExtension): + game = LINKS_AWAKENING + + @staticmethod + def generate_rom(caller: worlds.Files.APProcedurePatch, rom: bytes, data_file: str) -> bytes: + patch_data = json.loads(caller.get_file(data_file).decode("utf-8")) + # TODO local option overrides + rom_name = get_base_rom_path() + out_name = f"{patch_data['out_base']}{caller.result_file_ending}" + parser = get_parser() + args = parser.parse_args([rom_name, "-o", out_name, "--dump"]) + return generator.generateRom(rom, args, patch_data) + + @staticmethod + def patch_title_screen(caller: worlds.Files.APProcedurePatch, rom: bytes, data_file: str) -> bytes: + patch_data = json.loads(caller.get_file(data_file).decode("utf-8")) + if patch_data["options"]["ap_title_screen"]: + return bsdiff4.patch(rom, pkgutil.get_data(__name__, "LADXR/patches/title_screen.bdiff4")) + return rom + +class LADXProcedurePatch(worlds.Files.APProcedurePatch): hash = LADX_HASH - game = "Links Awakening DX" - patch_file_ending = ".apladx" + game = LINKS_AWAKENING + patch_file_ending: str = ".apladx" result_file_ending: str = ".gbc" + procedure = [ + ("generate_rom", ["data.json"]), + ("patch_title_screen", ["data.json"]) + ] + @classmethod def get_source_data(cls) -> bytes: return get_base_rom_bytes() +def write_patch_data(world: "LinksAwakeningWorld", patch: LADXProcedurePatch): + item_list = pickle.dumps([item for item in world.ladxr_logic.iteminfo_list if not isinstance(item, KeyLocation)]) + data_dict = { + "out_base": world.multiworld.get_out_file_name_base(patch.player), + "is_race": world.multiworld.is_race, + "seed": world.multiworld.seed, + "seed_name": world.multiworld.seed_name, + "multi_key": binascii.hexlify(world.multi_key).decode(), + "player": patch.player, + "player_name": patch.player_name, + "other_player_names": list(world.multiworld.player_name.values()), + "item_list": binascii.hexlify(item_list).decode(), + "hint_texts": generate_hint_texts(world), + "world_setup": { + "goal": world.ladxr_logic.world_setup.goal, + "bingo_goals": world.ladxr_logic.world_setup.bingo_goals, + "multichest": world.ladxr_logic.world_setup.multichest, + "entrance_mapping": world.ladxr_logic.world_setup.entrance_mapping, + "boss_mapping": world.ladxr_logic.world_setup.boss_mapping, + "miniboss_mapping": world.ladxr_logic.world_setup.miniboss_mapping, + }, + "options": world.options.as_dict( + "tradequest", + "rooster", + "experimental_dungeon_shuffle", + "experimental_entrance_shuffle", + "goal", + "instrument_count", + "link_palette", + "warps", + "trendy_game", + "gfxmod", + "palette", + "text_shuffle", + "shuffle_nightmare_keys", + "shuffle_small_keys", + "music", + "music_change_condition", + "nag_messages", + "ap_title_screen", + "boots_controls", + # "stealing", + "quickswap", + "hard_mode", + "low_hp_beep", + "text_mode", + "no_flash", + "overworld", + ), + } + patch.write_file("data.json", json.dumps(data_dict).encode('utf-8')) + + def get_base_rom_bytes(file_name: str = "") -> bytes: base_rom_bytes = getattr(get_base_rom_bytes, "base_rom_bytes", None) if not base_rom_bytes: diff --git a/worlds/ladx/__init__.py b/worlds/ladx/__init__.py index 78ae1ce8ad..58d6c1681f 100644 --- a/worlds/ladx/__init__.py +++ b/worlds/ladx/__init__.py @@ -1,16 +1,12 @@ import binascii import dataclasses import os -import pkgutil -import tempfile import typing import logging import re -import bsdiff4 - import settings -from BaseClasses import CollectionState, Entrance, Item, ItemClassification, Location, Tutorial, MultiWorld +from BaseClasses import CollectionState, Entrance, Item, ItemClassification, Location, Tutorial from Fill import fill_restrictive from worlds.AutoWorld import WebWorld, World from .Common import * @@ -18,19 +14,17 @@ from . import ItemIconGuessing from .Items import (DungeonItemData, DungeonItemType, ItemName, LinksAwakeningItem, TradeItemData, ladxr_item_to_la_item_name, links_awakening_items, links_awakening_items_by_name, links_awakening_item_name_groups) -from .LADXR import generator from .LADXR.itempool import ItemPool as LADXRItemPool from .LADXR.locations.constants import CHEST_ITEMS from .LADXR.locations.instrument import Instrument from .LADXR.logic import Logic as LADXRLogic -from .LADXR.main import get_parser from .LADXR.settings import Settings as LADXRSettings from .LADXR.worldSetup import WorldSetup as LADXRWorldSetup from .Locations import (LinksAwakeningLocation, LinksAwakeningRegion, create_regions_from_ladxr, get_locations_to_id, links_awakening_location_name_groups) from .Options import DungeonItemShuffle, ShuffleInstruments, LinksAwakeningOptions, ladx_option_groups -from .Rom import LADXDeltaPatch, get_base_rom_path +from .Rom import LADXProcedurePatch, write_patch_data DEVELOPER_MODE = False @@ -40,7 +34,7 @@ class LinksAwakeningSettings(settings.Group): """File name of the Link's Awakening DX rom""" copy_to = "Legend of Zelda, The - Link's Awakening DX (USA, Europe) (SGB Enhanced).gbc" description = "LADX ROM File" - md5s = [LADXDeltaPatch.hash] + md5s = [LADXProcedurePatch.hash] class RomStart(str): """ @@ -57,8 +51,16 @@ class LinksAwakeningSettings(settings.Group): class DisplayMsgs(settings.Bool): """Display message inside of Bizhawk""" + class GfxModFile(settings.FilePath): + """ + Gfxmod file, get it from upstream: https://github.com/daid/LADXR/tree/master/gfx + Only .bin or .bdiff files + The same directory will be checked for a matching text modification file + """ + rom_file: RomFile = RomFile(RomFile.copy_to) rom_start: typing.Union[RomStart, bool] = True + gfx_mod_file: GfxModFile = GfxModFile() class LinksAwakeningWebWorld(WebWorld): tutorials = [Tutorial( @@ -69,7 +71,7 @@ class LinksAwakeningWebWorld(WebWorld): "setup/en", ["zig"] )] - theme = "dirt" + theme = "ocean" option_groups = ladx_option_groups options_presets: typing.Dict[str, typing.Dict[str, typing.Any]] = { "Keysanity": { @@ -179,10 +181,10 @@ class LinksAwakeningWorld(World): assert(start) - menu_region = LinksAwakeningRegion("Menu", None, "Menu", self.player, self.multiworld) + menu_region = LinksAwakeningRegion("Menu", None, "Menu", self.player, self.multiworld) menu_region.exits = [Entrance(self.player, "Start Game", menu_region)] menu_region.exits[0].connect(start) - + self.multiworld.regions.append(menu_region) # Place RAFT, other access events @@ -190,14 +192,14 @@ class LinksAwakeningWorld(World): for loc in region.locations: if loc.address is None: loc.place_locked_item(self.create_event(loc.ladxr_item.event)) - + # Connect Windfish -> Victory windfish = self.multiworld.get_region("Windfish", self.player) l = Location(self.player, "Windfish", parent=windfish) windfish.locations = [l] - + l.place_locked_item(self.create_event("An Alarm Clock")) - + self.multiworld.completion_condition[self.player] = lambda state: state.has("An Alarm Clock", player=self.player) def create_item(self, item_name: str): @@ -279,8 +281,8 @@ class LinksAwakeningWorld(World): event_location = Location(self.player, "Can Play Trendy Game", parent=trendy_region) trendy_region.locations.insert(0, event_location) event_location.place_locked_item(self.create_event("Can Play Trendy Game")) - - self.dungeon_locations_by_dungeon = [[], [], [], [], [], [], [], [], []] + + self.dungeon_locations_by_dungeon = [[], [], [], [], [], [], [], [], []] for r in self.multiworld.get_regions(self.player): # Set aside dungeon locations if r.dungeon_index: @@ -335,7 +337,9 @@ class LinksAwakeningWorld(World): start_item = next((item for item in start_items if opens_new_regions(item)), None) if start_item: - itempool.remove(start_item) + # Make sure we're removing the same copy of the item that we're placing + # (.remove checks __eq__, which could be a different copy, so we find the first index and use .pop) + start_item = itempool.pop(itempool.index(start_item)) start_loc.place_locked_item(start_item) else: logging.getLogger("Link's Awakening Logger").warning(f"No {self.options.tarins_gift.current_option_name} available for Tarin's Gift.") @@ -352,7 +356,7 @@ class LinksAwakeningWorld(World): # set containing the list of all possible dungeon locations for the player all_dungeon_locs = set() - + # Do dungeon specific things for dungeon_index in range(0, 9): # set up allow-list for dungeon specific items @@ -365,7 +369,7 @@ class LinksAwakeningWorld(World): # ...also set the rules for the dungeon for location in locs: orig_rule = location.item_rule - # If an item is about to be placed on a dungeon location, it can go there iff + # If an item is about to be placed on a dungeon location, it can go there iff # 1. it fits the general rules for that location (probably 'return True' for most places) # 2. Either # 2a. it's not a restricted dungeon item @@ -419,7 +423,7 @@ class LinksAwakeningWorld(World): partial_all_state.sweep_for_advancements() fill_restrictive(self.multiworld, partial_all_state, all_dungeon_locs_to_fill, all_dungeon_items_to_fill, lock=True, single_player_placement=True, allow_partial=False) - + name_cache = {} # Tries to associate an icon from another game with an icon we have @@ -456,22 +460,16 @@ class LinksAwakeningWorld(World): for name in possibles: if name in self.name_cache: return self.name_cache[name] - + return "TRADING_ITEM_LETTER" - @classmethod - def stage_assert_generate(cls, multiworld: MultiWorld): - rom_file = get_base_rom_path() - if not os.path.exists(rom_file): - raise FileNotFoundError(rom_file) - def generate_output(self, output_directory: str): # copy items back to locations for r in self.multiworld.get_regions(self.player): for loc in r.locations: if isinstance(loc, LinksAwakeningLocation): assert(loc.item) - + # If we're a links awakening item, just use the item if isinstance(loc.item, LinksAwakeningItem): loc.ladxr_item.item = loc.item.item_data.ladxr_id @@ -497,31 +495,13 @@ class LinksAwakeningWorld(World): # Kind of kludge, make it possible for the location to differentiate between local and remote items loc.ladxr_item.location_owner = self.player - rom_name = Rom.get_base_rom_path() - out_name = f"AP-{self.multiworld.seed_name}-P{self.player}-{self.player_name}.gbc" - out_path = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}.gbc") + + patch = LADXProcedurePatch(player=self.player, player_name=self.player_name) + write_patch_data(self, patch) + out_path = os.path.join(output_directory, f"{self.multiworld.get_out_file_name_base(self.player)}" + f"{patch.patch_file_ending}") - parser = get_parser() - args = parser.parse_args([rom_name, "-o", out_name, "--dump"]) - - rom = generator.generateRom(args, self) - - with open(out_path, "wb") as handle: - rom.save(handle, name="LADXR") - - # Write title screen after everything else is done - full gfxmods may stomp over the egg tiles - if self.options.ap_title_screen: - with tempfile.NamedTemporaryFile(delete=False) as title_patch: - title_patch.write(pkgutil.get_data(__name__, "LADXR/patches/title_screen.bdiff4")) - - bsdiff4.file_patch_inplace(out_path, title_patch.name) - os.unlink(title_patch.name) - - patch = LADXDeltaPatch(os.path.splitext(out_path)[0]+LADXDeltaPatch.patch_file_ending, player=self.player, - player_name=self.player_name, patched_path=out_path) - patch.write() - if not DEVELOPER_MODE: - os.unlink(out_path) + patch.write(out_path) def generate_multi_key(self): return bytearray(self.random.getrandbits(8) for _ in range(10)) + self.player.to_bytes(2, 'big') diff --git a/worlds/ladx/docs/en_Links Awakening DX.md b/worlds/ladx/docs/en_Links Awakening DX.md index 91a34107c1..ad691008ec 100644 --- a/worlds/ladx/docs/en_Links Awakening DX.md +++ b/worlds/ladx/docs/en_Links Awakening DX.md @@ -34,62 +34,75 @@ business! ## I don't know what to do! -That's not a question - but I'd suggest clicking the crow icon on your client, which will load an AP compatible autotracker for LADXR. +That's not a question - but I'd suggest clicking the **Open Tracker** button in your client, which will load an AP compatible autotracker for LADXR. ## What is this randomizer based on? -This randomizer is based on (forked from) the wonderful work daid did on LADXR - https://github.com/daid/LADXR +This randomizer is based on (forked from) the wonderful work daid did on [LADXR](https://github.com/daid/LADXR) -The autotracker code for communication with magpie tracker is directly copied from kbranch's repo - https://github.com/kbranch/Magpie/tree/master/autotracking +The autotracker code for communication with magpie tracker is directly copied from [kbranch's repo](https://github.com/kbranch/Magpie) ### Graphics The following sprite sheets have been included with permission of their respective authors: -* by Madam Materia (https://www.twitch.tv/isabelle_zephyr) +* by [Madam Materia](https://www.twitch.tv/isabelle_zephyr) * Matty_LA -* by Linker (https://twitter.com/BenjaminMaksym) - * Bowwow - * Bunny - * Luigi - * Mario - * Richard - * Tarin -Title screen graphics by toomanyteeth✨ (https://instagram.com/toomanyyyteeth) +Title screen graphics by [toomanyteeth✨](https://instagram.com/toomanyyyteeth) ## Some tips from LADXR... -

Locations

-

All chests and dungeon keys are always randomized. Also, the 3 songs (Marin, Mambo, and Manu) give a you an item if you present them the Ocarina. The seashell mansion 20 shells reward is also shuffled, but the 5 and 10 shell reward is not, as those can be missed.

-

The moblin cave with Bowwow contains a chest instead. The color dungeon gives 2 items at the end instead of a choice of tunic. Other item locations are: The toadstool, the reward for delivering the toadstool, hidden seashells, heart pieces, heart containers, golden leaves, the Mad Batters (capacity upgrades), the shovel/bow in the shop, the rooster's grave, and all of the keys' (tail,slime,angler,face,bird) locations.

-

Finally, new players often forget the following locations: the heart piece hidden in the water at the castle, the heart piece hidden in the bomb cave (screen before the honey), bonk seashells (run with pegasus boots against the tree in at the Tail Cave, and the tree right of Mabe Village, next to the phone booth), and the hookshop drop from Master Stalfos in D5.

+### Locations -

Color Dungeon

-

The Color Dungeon is part of the item shuffle, and the red/blue tunics are shuffled in the item pool. Which means the fairy at the end of the color dungeon gives out two random items.

-

To access the color dungeon, you need the power bracelet, and you need to push the gravestones in the right order: "down, left, up, right, up", going from the lower right gravestone, to the one left of it, above it, and then to the right.

+All chests and dungeon keys are always randomized. Also, the 3 songs (Marin, Mambo, and Manu) give a you an item if you present them the Ocarina. The seashell mansion 20 shells reward is also shuffled, but the 5 and 10 shell reward is not, as those can be missed. -

Bowwow

-

Bowwow is in a chest, somewhere. After you find him, he will always be in the swamp with you, but not anywhere else.

+The moblin cave with Bowwow contains a chest instead. The color dungeon gives 2 items at the end instead of a choice of tunic. Other item locations are: The toadstool, the reward for delivering the toadstool, hidden seashells, heart pieces, heart containers, golden leaves, the Mad Batters (capacity upgrades), the shovel/bow in the shop, the rooster's grave, and all of the keys' (tail,slime,angler,face,bird) locations. -

Added things

-

In your save and quit menu, there is a 3rd option to return to your home. This has two main uses: it speeds up the game, and prevents softlocks (common in entrance rando).

-

If you have weapons that require ammunition (bombs, powder, arrows), a ghost will show up inside Marin's house. He will refill you up to 10 ammunition, so you do not run out.

-

The flying rooster is (optionally) available as an item.

-

You can access the Bird Key cave item with the L2 Power Bracelet.

-

Boomerang cave is now a random item gift by default (available post-bombs), and boomerang is in the item pool.

-

Your inventory has been increased by four, to accommodate these items now coexisting with eachother.

+Finally, new players often forget the following locations: the heart piece hidden in the water at the castle, the heart piece hidden in the bomb cave (screen before the honey), bonk seashells (run with pegasus boots against the tree in at the Tail Cave, and the tree right of Mabe Village, next to the phone booth), and the hookshop drop from Master Stalfos in D5. -

Removed things

-

The ghost mini-quest after D4 never shows up, his seashell reward is always available.

-

The walrus is moved a bit, so that you can access the desert without taking Marin on a date.

+### Color Dungeon -

Logic

-

Depending on your options, you can only steal after you find the sword, always, or never.

-

Do not forget that there are two items in the rafting ride. You can access this with just Hookshot or Flippers.

-

Killing enemies with bombs is in normal logic. You can switch to casual logic if you do not want this.

-

D7 confuses some people, but by dropping down pits on the 2nd floor you can access almost all of this dungeon, even without feather and power bracelet.

+The Color Dungeon is part of the item shuffle, and the red/blue tunics are shuffled in the item pool. Which means the fairy at the end of the color dungeon gives out two random items. -

Tech

-

The toadstool and magic powder used to be the same type of item. LADXR turns this into two items that you can have a the same time. 4 extra item slots in your inventory were added to support this extra item, and have the ability to own the boomerang.

-

The glitch where the slime key is effectively a 6th golden leaf is fixed, and golden leaves can be collected fine next to the slime key.

+To access the color dungeon, you need the power bracelet, and you need to push the gravestones in the right order: "down, left, up, right, up", going from the lower right gravestone, to the one left of it, above it, and then to the right. + +### Bowwow + +Bowwow is in a chest, somewhere. After you find him, he will always be in the swamp with you, but not anywhere else. + +### Added things + +In your save and quit menu, there is a 3rd option to return to your home. This has two main uses: it speeds up the game, and prevents softlocks (common in entrance rando). + +If you have weapons that require ammunition (bombs, powder, arrows), a ghost will show up inside Marin's house. He will refill you up to 10 ammunition, so you do not run out. + +The flying rooster is (optionally) available as an item. + +If the rooster is disabled, you can access the Bird Key cave item with the L2 Power Bracelet. + +Boomerang cave is now a random item gift by default (available post-bombs), and boomerang is in the item pool. + +Your inventory has been increased by four, to accommodate these items now coexisting with eachother. + +### Removed things + +The ghost mini-quest after D4 never shows up, his seashell reward is always available. + +The walrus is moved a bit, so that you can access the desert without taking Marin on a date. + +### Logic + +You can only steal after you find the sword. + +Do not forget that there are two items in the rafting ride. You can access this with just Hookshot or Flippers. + +Killing enemies with bombs is in logic. + +D7 confuses some people, but by dropping down pits on the 2nd floor you can access almost all of this dungeon, even without feather and power bracelet. + +### Tech + +The toadstool and magic powder used to be the same type of item. LADXR turns this into two items that you can have a the same time. 4 extra item slots in your inventory were added to support this extra item, and have the ability to own the boomerang. + +The glitch where the slime key is effectively a 6th golden leaf is fixed, and golden leaves can be collected fine next to the slime key. diff --git a/worlds/lingo/data/LL1.yaml b/worlds/lingo/data/LL1.yaml index 6410ffea3b..4c41f3236f 100644 --- a/worlds/lingo/data/LL1.yaml +++ b/worlds/lingo/data/LL1.yaml @@ -4956,10 +4956,16 @@ Outside The Initiated: room: Art Gallery door: Exit - The Bearer (East): True - The Bearer (North): True - The Bearer (South): True - The Bearer (West): True + The Bearer (East): + static_painting: True + The Bearer (North): + static_painting: True + The Bearer (South): + static_painting: True + The Bearer (West): + - static_painting: True + - room: The Bearer (West) + door: Side Area Shortcut Roof: True panels: Achievement: @@ -5053,7 +5059,8 @@ - MIDDLE The Bearer (East): entrances: - Cross Tower (East): True + Cross Tower (East): + static_painting: True Bearer Side Area: door: Side Area Access Roof: True @@ -5084,7 +5091,8 @@ panel: SPACE The Bearer (North): entrances: - Cross Tower (East): True + Cross Tower (North): + static_painting: True Roof: True panels: SILENT (1): @@ -5128,7 +5136,8 @@ panel: POTS The Bearer (South): entrances: - Cross Tower (North): True + Cross Tower (South): + static_painting: True Bearer Side Area: door: Side Area Shortcut Roof: True @@ -5162,7 +5171,10 @@ panel: SILENT (1) The Bearer (West): entrances: - Cross Tower (West): True + Cross Tower (West): + static_painting: True + The Bearer: + door: Side Area Shortcut Bearer Side Area: door: Side Area Shortcut Roof: True @@ -5235,6 +5247,7 @@ The Bearer: room: The Bearer door: East Entrance + static_painting: True Roof: True panels: WINTER: @@ -5250,6 +5263,7 @@ The Bearer (East): room: The Bearer (East) door: North Entrance + static_painting: True Roof: True panels: NORTH: @@ -5270,6 +5284,7 @@ The Bearer (North): room: The Bearer (North) door: South Entrance + static_painting: True panels: FIRE: id: Cross Room/Panel_fire_fire @@ -5284,6 +5299,7 @@ Bearer Side Area: room: Bearer Side Area door: West Entrance + static_painting: True Roof: True panels: DIAMONDS: @@ -7108,6 +7124,8 @@ entrances: Orange Tower Third Floor: warp: True + Art Gallery (First Floor): + warp: True Art Gallery (Second Floor): warp: True Art Gallery (Third Floor): @@ -7125,22 +7143,6 @@ required_door: room: Number Hunt door: Eights - EON: - id: Painting Room/Panel_eon_one - colors: yellow - tag: midyellow - TRUSTWORTHY: - id: Painting Room/Panel_to_two - colors: red - tag: midred - FREE: - id: Painting Room/Panel_free_three - colors: purple - tag: midpurp - OUR: - id: Painting Room/Panel_our_four - colors: blue - tag: midblue ORDER: id: Painting Room/Panel_order_onepathmanyturns tag: forbid @@ -7159,15 +7161,8 @@ - scenery_painting_2c skip_location: True panels: - - EON - First Floor Puzzles: - skip_item: True - location_name: Art Gallery - First Floor Puzzles - panels: - - EON - - TRUSTWORTHY - - FREE - - OUR + - room: Art Gallery (First Floor) + panel: EON Third Floor: painting_id: - scenery_painting_3b @@ -7227,11 +7222,42 @@ - Third Floor - Fourth Floor - Fifth Floor + Art Gallery (First Floor): + entrances: + Art Gallery: + static_painting: True + panels: + EON: + id: Painting Room/Panel_eon_one + colors: yellow + tag: midyellow + TRUSTWORTHY: + id: Painting Room/Panel_to_two + colors: red + tag: midred + FREE: + id: Painting Room/Panel_free_three + colors: purple + tag: midpurp + OUR: + id: Painting Room/Panel_our_four + colors: blue + tag: midblue + doors: + Puzzles: + skip_item: True + location_name: Art Gallery - First Floor Puzzles + panels: + - EON + - TRUSTWORTHY + - FREE + - OUR Art Gallery (Second Floor): entrances: Art Gallery: room: Art Gallery door: Second Floor + static_painting: True panels: HOUSE: id: Painting Room/Panel_house_neighborhood @@ -7263,6 +7289,7 @@ Art Gallery: room: Art Gallery door: Third Floor + static_painting: True panels: AN: id: Painting Room/Panel_an_many @@ -7294,6 +7321,7 @@ Art Gallery: room: Art Gallery door: Fourth Floor + static_painting: True panels: URNS: id: Painting Room/Panel_urns_turns diff --git a/worlds/lingo/data/generated.dat b/worlds/lingo/data/generated.dat index 14f5570db1..f5eb3e0699 100644 Binary files a/worlds/lingo/data/generated.dat and b/worlds/lingo/data/generated.dat differ diff --git a/worlds/lingo/data/ids.yaml b/worlds/lingo/data/ids.yaml index 0a43592d3f..c30a21e6c8 100644 --- a/worlds/lingo/data/ids.yaml +++ b/worlds/lingo/data/ids.yaml @@ -727,11 +727,12 @@ panels: WANDER: 444975 Art Gallery: EIGHT: 444976 + ORDER: 444981 + Art Gallery (First Floor): EON: 444977 TRUSTWORTHY: 444978 FREE: 444979 OUR: 444980 - ORDER: 444981 Art Gallery (Second Floor): HOUSE: 444982 PATH: 444983 @@ -1382,8 +1383,6 @@ doors: Art Gallery: Second Floor: item: 444558 - First Floor Puzzles: - location: 445256 Third Floor: item: 444559 Fourth Floor: @@ -1393,6 +1392,9 @@ doors: Exit: item: 444562 location: 444981 + Art Gallery (First Floor): + Puzzles: + location: 445256 Art Gallery (Second Floor): Puzzles: location: 445257 diff --git a/worlds/lingo/datatypes.py b/worlds/lingo/datatypes.py index 9521422ab1..961f922202 100644 --- a/worlds/lingo/datatypes.py +++ b/worlds/lingo/datatypes.py @@ -23,6 +23,7 @@ class EntranceType(Flag): SUNWARP = auto() WARP = auto() CROSSROADS_ROOF_ACCESS = auto() + STATIC_PAINTING = auto() class RoomEntrance(NamedTuple): diff --git a/worlds/lingo/player_logic.py b/worlds/lingo/player_logic.py index 9363dfedb6..b76f12a916 100644 --- a/worlds/lingo/player_logic.py +++ b/worlds/lingo/player_logic.py @@ -394,7 +394,7 @@ class LingoPlayerLogic: or painting.room in required_painting_rooms: return False - if world.options.shuffle_doors == ShuffleDoors.option_none: + if world.options.shuffle_doors != ShuffleDoors.option_doors: if painting.req_blocked_when_no_doors: return False diff --git a/worlds/lingo/regions.py b/worlds/lingo/regions.py index 9773f22d91..e029513a33 100644 --- a/worlds/lingo/regions.py +++ b/worlds/lingo/regions.py @@ -30,7 +30,7 @@ def is_acceptable_pilgrimage_entrance(entrance_type: EntranceType, world: "Lingo allowed_entrance_types = EntranceType.NORMAL if world.options.pilgrimage_allows_paintings: - allowed_entrance_types |= EntranceType.PAINTING + allowed_entrance_types |= EntranceType.PAINTING | EntranceType.STATIC_PAINTING if world.options.pilgrimage_allows_roof_access: allowed_entrance_types |= EntranceType.CROSSROADS_ROOF_ACCESS @@ -105,7 +105,8 @@ def create_regions(world: "LingoWorld") -> None: regions[pilgrimage_region_name] = Region(pilgrimage_region_name, world.player, world.multiworld) # Connect all created regions now that they exist. - allowed_entrance_types = EntranceType.NORMAL | EntranceType.WARP | EntranceType.CROSSROADS_ROOF_ACCESS + allowed_entrance_types = EntranceType.NORMAL | EntranceType.WARP | EntranceType.CROSSROADS_ROOF_ACCESS | \ + EntranceType.STATIC_PAINTING if not painting_shuffle: # Don't use the vanilla painting connections if we are shuffling paintings. @@ -156,11 +157,11 @@ def create_regions(world: "LingoWorld") -> None: regions[from_room].connect(regions[to_room], f"Pilgrimage Part {i+1}") else: connect_entrance(regions, regions["Starting Room"], regions["Pilgrim Antechamber"], "Sun Painting", - RoomAndDoor("Pilgrim Antechamber", "Sun Painting"), EntranceType.PAINTING, False, world) + RoomAndDoor("Pilgrim Antechamber", "Sun Painting"), EntranceType.STATIC_PAINTING, False, world) if early_color_hallways: connect_entrance(regions, regions["Starting Room"], regions["Color Hallways"], "Early Color Hallways", - None, EntranceType.PAINTING, False, world) + None, EntranceType.STATIC_PAINTING, False, world) if painting_shuffle: for warp_enter, warp_exit in world.player_logic.painting_mapping.items(): diff --git a/worlds/lingo/utils/pickle_static_data.py b/worlds/lingo/utils/pickle_static_data.py index 740e129bcb..7f39b79836 100644 --- a/worlds/lingo/utils/pickle_static_data.py +++ b/worlds/lingo/utils/pickle_static_data.py @@ -138,6 +138,8 @@ def process_single_entrance(source_room: str, room_name: str, door_obj) -> RoomE entrance_type = EntranceType.WARP elif source_room == "Crossroads" and room_name == "Roof": entrance_type = EntranceType.CROSSROADS_ROOF_ACCESS + elif "static_painting" in door_obj and door_obj["static_painting"]: + entrance_type = EntranceType.STATIC_PAINTING if "painting" in door_obj and door_obj["painting"]: PAINTING_EXIT_ROOMS.add(room_name) diff --git a/worlds/lingo/utils/validate_config.rb b/worlds/lingo/utils/validate_config.rb index 2a765fbcad..e270422684 100644 --- a/worlds/lingo/utils/validate_config.rb +++ b/worlds/lingo/utils/validate_config.rb @@ -2,7 +2,7 @@ # the file are consistent. It also checks that the panel and door IDs mentioned # all exist in the map file. # -# Usage: validate_config.rb [config file] [map file] +# Usage: validate_config.rb [config file] [ids path] [map file] require 'set' require 'yaml' diff --git a/worlds/lufia2ac/test/__init__.py b/worlds/lufia2ac/test/__init__.py index 306ffa7716..e69de29bb2 100644 --- a/worlds/lufia2ac/test/__init__.py +++ b/worlds/lufia2ac/test/__init__.py @@ -1,5 +0,0 @@ -from test.bases import WorldTestBase - - -class L2ACTestBase(WorldTestBase): - game = "Lufia II Ancient Cave" diff --git a/worlds/lufia2ac/test/bases.py b/worlds/lufia2ac/test/bases.py new file mode 100644 index 0000000000..306ffa7716 --- /dev/null +++ b/worlds/lufia2ac/test/bases.py @@ -0,0 +1,5 @@ +from test.bases import WorldTestBase + + +class L2ACTestBase(WorldTestBase): + game = "Lufia II Ancient Cave" diff --git a/worlds/lufia2ac/test/TestCustomItemPool.py b/worlds/lufia2ac/test/test_custom_item_pool.py similarity index 98% rename from worlds/lufia2ac/test/TestCustomItemPool.py rename to worlds/lufia2ac/test/test_custom_item_pool.py index 33f72273da..2244b03f29 100644 --- a/worlds/lufia2ac/test/TestCustomItemPool.py +++ b/worlds/lufia2ac/test/test_custom_item_pool.py @@ -2,7 +2,7 @@ from argparse import Namespace from BaseClasses import PlandoOptions from Generate import handle_option -from . import L2ACTestBase +from .bases import L2ACTestBase from ..Options import CustomItemPool diff --git a/worlds/lufia2ac/test/TestGoal.py b/worlds/lufia2ac/test/test_goal.py similarity index 98% rename from worlds/lufia2ac/test/TestGoal.py rename to worlds/lufia2ac/test/test_goal.py index 1eaf5a1515..deb98ccac9 100644 --- a/worlds/lufia2ac/test/TestGoal.py +++ b/worlds/lufia2ac/test/test_goal.py @@ -1,4 +1,4 @@ -from . import L2ACTestBase +from .bases import L2ACTestBase class TestDefault(L2ACTestBase): diff --git a/worlds/marioland2/LICENSE b/worlds/marioland2/LICENSE new file mode 100644 index 0000000000..7ac515f432 --- /dev/null +++ b/worlds/marioland2/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022-2023 Alex "Alchav" Avery + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/worlds/marioland2/__init__.py b/worlds/marioland2/__init__.py new file mode 100644 index 0000000000..ea1354db6e --- /dev/null +++ b/worlds/marioland2/__init__.py @@ -0,0 +1,449 @@ +import base64 +import Utils +import settings +from copy import deepcopy + +from worlds.AutoWorld import World, WebWorld +from BaseClasses import Region, Location, Item, ItemClassification, Tutorial + +from . import client +from .rom import generate_output, SuperMarioLand2ProcedurePatch +from .options import SML2Options +from .locations import (locations, location_name_to_id, level_name_to_id, level_id_to_name, START_IDS, coins_coords, + auto_scroll_max) +from .items import items +from .sprites import level_sprites +from .sprite_randomizer import randomize_enemies, randomize_platforms +from .logic import has_pipe_up, has_pipe_down, has_pipe_left, has_pipe_right, has_level_progression, is_auto_scroll +from . import logic + + +class MarioLand2Settings(settings.Group): + class SML2RomFile(settings.UserFilePath): + """File name of the Super Mario Land 2 1.0 ROM""" + description = "Super Mario Land 2 - 6 Golden Coins (USA, Europe) 1.0 ROM File" + copy_to = "Super Mario Land 2 - 6 Golden Coins (USA, Europe).gb" + md5s = [SuperMarioLand2ProcedurePatch.hash] + + rom_file: SML2RomFile = SML2RomFile(SML2RomFile.copy_to) + + +class MarioLand2WebWorld(WebWorld): + setup_en = Tutorial( + "Multiworld Setup Guide", + "A guide to playing Super Mario Land 2 with Archipelago.", + "English", + "setup_en.md", + "setup/en", + ["Alchav"] + ) + + tutorials = [setup_en] + + +class MarioLand2World(World): + """Super Mario Land 2 is a classic platformer that follows Mario on a quest to reclaim his castle from the + villainous Wario. This iconic game features 32 levels, unique power-ups, and introduces Wario as Mario's + arch-rival.""" # -ChatGPT + + game = "Super Mario Land 2" + + settings_key = "sml2_options" + settings: MarioLand2Settings + + location_name_to_id = location_name_to_id + item_name_to_id = {item_name: ID for ID, item_name in enumerate(items, START_IDS)} + + web = MarioLand2WebWorld() + + item_name_groups = { + "Level Progression": { + item_name for item_name in items if item_name.endswith(("Progression", "Secret", "Secret 1", "Secret 2")) + and "Auto Scroll" not in item_name + }, + "Bells": {item_name for item_name in items if "Bell" in item_name}, + "Golden Coins": {"Mario Coin", "Macro Coin", "Space Coin", "Tree Coin", "Turtle Coin", "Pumpkin Coin"}, + "Coins": {"1 Coin", *{f"{i} Coins" for i in range(2, 169)}}, + "Powerups": {"Mushroom", "Fire Flower", "Carrot"}, + "Difficulties": {"Easy Mode", "Normal Mode"}, + "Auto Scroll Traps": {item_name for item_name in items + if "Auto Scroll" in item_name and "Cancel" not in item_name}, + "Cancel Auto Scrolls": {item_name for item_name in items if "Cancel Auto Scroll" in item_name}, + } + + location_name_groups = { + "Bosses": { + "Tree Zone 5 - Boss", "Space Zone 2 - Boss", "Macro Zone 4 - Boss", + "Pumpkin Zone 4 - Boss", "Mario Zone 4 - Boss", "Turtle Zone 3 - Boss" + }, + "Normal Exits": {location for location in locations if locations[location]["type"] == "level"}, + "Secret Exits": {location for location in locations if locations[location]["type"] == "secret"}, + "Bells": {location for location in locations if locations[location]["type"] == "bell"}, + "Coins": {location for location in location_name_to_id if "Coin" in location} + } + + options_dataclass = SML2Options + options: SML2Options + + generate_output = generate_output + + def __init__(self, world, player: int): + super().__init__(world, player) + self.auto_scroll_levels = [] + self.num_coin_locations = [] + self.max_coin_locations = {} + self.sprite_data = {} + self.coin_fragments_required = 0 + + def generate_early(self): + self.sprite_data = deepcopy(level_sprites) + if self.options.randomize_enemies: + randomize_enemies(self.sprite_data, self.random) + if self.options.randomize_platforms: + randomize_platforms(self.sprite_data, self.random) + + if self.options.marios_castle_midway_bell: + self.sprite_data["Mario's Castle"][35]["sprite"] = "Midway Bell" + + if self.options.auto_scroll_chances == "vanilla": + self.auto_scroll_levels = [int(i in [19, 25, 30]) for i in range(32)] + else: + self.auto_scroll_levels = [int(self.random.randint(1, 100) <= self.options.auto_scroll_chances) + for _ in range(32)] + + self.auto_scroll_levels[level_name_to_id["Mario's Castle"]] = 0 + unbeatable_scroll_levels = ["Tree Zone 3", "Macro Zone 2", "Space Zone 1", "Turtle Zone 2", "Pumpkin Zone 2"] + if not self.options.shuffle_midway_bells: + unbeatable_scroll_levels.append("Pumpkin Zone 1") + for level, i in enumerate(self.auto_scroll_levels): + if i == 1: + if self.options.auto_scroll_mode in ("global_cancel_item", "level_cancel_items"): + self.auto_scroll_levels[level] = 2 + elif self.options.auto_scroll_mode == "chaos": + if (self.options.accessibility == "full" + and level_id_to_name[level] in unbeatable_scroll_levels): + self.auto_scroll_levels[level] = 2 + else: + self.auto_scroll_levels[level] = self.random.randint(1, 3) + elif (self.options.accessibility == "full" + and level_id_to_name[level] in unbeatable_scroll_levels): + self.auto_scroll_levels[level] = 0 + if self.auto_scroll_levels[level] == 1 and "trap" in self.options.auto_scroll_mode.current_key: + self.auto_scroll_levels[level] = 3 + + def create_regions(self): + menu_region = Region("Menu", self.player, self.multiworld) + self.multiworld.regions.append(menu_region) + created_regions = [] + for location_name, data in locations.items(): + region_name = location_name.split(" -")[0] + if region_name in created_regions: + region = self.multiworld.get_region(region_name, self.player) + else: + region = Region(region_name, self.player, self.multiworld) + if region_name == "Tree Zone Secret Course": + region_to_connect = self.multiworld.get_region("Tree Zone 2", self.player) + elif region_name == "Space Zone Secret Course": + region_to_connect = self.multiworld.get_region("Space Zone 1", self.player) + elif region_name == "Macro Zone Secret Course": + region_to_connect = self.multiworld.get_region("Macro Zone 1", self.player) + elif region_name == "Pumpkin Zone Secret Course 1": + region_to_connect = self.multiworld.get_region("Pumpkin Zone 2", self.player) + elif region_name == "Pumpkin Zone Secret Course 2": + region_to_connect = self.multiworld.get_region("Pumpkin Zone 3", self.player) + elif region_name == "Turtle Zone Secret Course": + region_to_connect = self.multiworld.get_region("Turtle Zone 2", self.player) + elif region_name.split(" ")[-1].isdigit() and int(region_name.split(" ")[-1]) > 1: + region_to_connect = self.multiworld.get_region(" ".join(region_name.split(" ")[:2]) + + f" {int(region_name.split(' ')[2]) - 1}", + self.player) + else: + region_to_connect = menu_region + region_to_connect.connect(region) + self.multiworld.regions.append(region) + created_regions.append(region_name) + + if location_name == "Mario's Castle - Midway Bell" and not self.options.marios_castle_midway_bell: + continue + region.locations.append(MarioLand2Location(self.player, location_name, + self.location_name_to_id[location_name], region)) + self.multiworld.get_region("Macro Zone Secret Course", self.player).connect( + self.multiworld.get_region("Macro Zone 4", self.player)) + self.multiworld.get_region("Macro Zone 4", self.player).connect( + self.multiworld.get_region("Macro Zone Secret Course", self.player)) + + castle = self.multiworld.get_region("Mario's Castle", self.player) + wario = MarioLand2Location(self.player, "Mario's Castle - Wario", parent=castle) + castle.locations.append(wario) + wario.place_locked_item(MarioLand2Item("Wario Defeated", ItemClassification.progression, None, self.player)) + + if self.options.coinsanity: + coinsanity_checks = self.options.coinsanity_checks.value + self.num_coin_locations = [[region, 1] for region in created_regions if region != "Mario's Castle"] + self.max_coin_locations = {region: len(coins_coords[region]) for region in created_regions + if region != "Mario's Castle"} + if self.options.accessibility == "full" or self.options.auto_scroll_mode == "always": + for level in self.max_coin_locations: + if level in auto_scroll_max and self.auto_scroll_levels[level_name_to_id[level]] in (1, 3): + if isinstance(auto_scroll_max[level], tuple): + self.max_coin_locations[level] = min( + auto_scroll_max[level][int(self.options.shuffle_midway_bells.value)], + self.max_coin_locations[level]) + else: + self.max_coin_locations[level] = min(auto_scroll_max[level], self.max_coin_locations[level]) + coinsanity_checks = min(sum(self.max_coin_locations.values()), coinsanity_checks) + for i in range(coinsanity_checks - 31): + self.num_coin_locations.sort(key=lambda region: self.max_coin_locations[region[0]] / region[1]) + self.num_coin_locations[-1][1] += 1 + coin_locations = [] + for level, coins in self.num_coin_locations: + if self.max_coin_locations[level]: + coin_thresholds = self.random.sample(range(1, self.max_coin_locations[level] + 1), coins) + coin_locations += [f"{level} - {i} Coin{'s' if i > 1 else ''}" for i in coin_thresholds] + for location_name in coin_locations: + region = self.multiworld.get_region(location_name.split(" -")[0], self.player) + region.locations.append(MarioLand2Location(self.player, location_name, + self.location_name_to_id[location_name], parent=region)) + + def set_rules(self): + entrance_rules = { + "Menu -> Space Zone 1": lambda state: state.has("Hippo Bubble", self.player) + or (state.has("Carrot", self.player) + and not is_auto_scroll(state, self.player, "Hippo Zone")), + "Space Zone 1 -> Space Zone Secret Course": lambda state: state.has("Space Zone Secret", self.player), + "Space Zone 1 -> Space Zone 2": lambda state: has_level_progression(state, "Space Zone Progression", self.player), + "Tree Zone 1 -> Tree Zone 2": lambda state: has_level_progression(state, "Tree Zone Progression", self.player), + "Tree Zone 2 -> Tree Zone Secret Course": lambda state: state.has("Tree Zone Secret", self.player), + "Tree Zone 2 -> Tree Zone 3": lambda state: has_level_progression(state, "Tree Zone Progression", self.player, 2), + "Tree Zone 4 -> Tree Zone 5": lambda state: has_level_progression(state, "Tree Zone Progression", self.player, 3), + "Macro Zone 1 -> Macro Zone Secret Course": lambda state: state.has("Macro Zone Secret 1", self.player), + "Macro Zone Secret Course -> Macro Zone 4": lambda state: state.has("Macro Zone Secret 2", self.player), + "Macro Zone 1 -> Macro Zone 2": lambda state: has_level_progression(state, "Macro Zone Progression", self.player), + "Macro Zone 2 -> Macro Zone 3": lambda state: has_level_progression(state, "Macro Zone Progression", self.player, 2), + "Macro Zone 3 -> Macro Zone 4": lambda state: has_level_progression(state, "Macro Zone Progression", self.player, 3), + "Macro Zone 4 -> Macro Zone Secret Course": lambda state: state.has("Macro Zone Secret 2", self.player), + "Pumpkin Zone 1 -> Pumpkin Zone 2": lambda state: has_level_progression(state, "Pumpkin Zone Progression", self.player), + "Pumpkin Zone 2 -> Pumpkin Zone Secret Course 1": lambda state: state.has("Pumpkin Zone Secret 1", self.player), + "Pumpkin Zone 2 -> Pumpkin Zone 3": lambda state: has_level_progression(state, "Pumpkin Zone Progression", self.player, 2), + "Pumpkin Zone 3 -> Pumpkin Zone Secret Course 2": lambda state: state.has("Pumpkin Zone Secret 2", self.player), + "Pumpkin Zone 3 -> Pumpkin Zone 4": lambda state: has_level_progression(state, "Pumpkin Zone Progression", self.player, 3), + "Mario Zone 1 -> Mario Zone 2": lambda state: has_level_progression(state, "Mario Zone Progression", self.player), + "Mario Zone 2 -> Mario Zone 3": lambda state: has_level_progression(state, "Mario Zone Progression", self.player, 2), + "Mario Zone 3 -> Mario Zone 4": lambda state: has_level_progression(state, "Mario Zone Progression", self.player, 3), + "Turtle Zone 1 -> Turtle Zone 2": lambda state: has_level_progression(state, "Turtle Zone Progression", self.player), + "Turtle Zone 2 -> Turtle Zone Secret Course": lambda state: state.has("Turtle Zone Secret", self.player), + "Turtle Zone 2 -> Turtle Zone 3": lambda state: has_level_progression(state, "Turtle Zone Progression", self.player, 2), + } + + if self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + # Require the other coins just to ensure they are being added to start inventory properly, + # and so they show up in Playthrough as required + entrance_rules["Menu -> Mario's Castle"] = lambda state: (state.has_all( + ["Tree Coin", "Space Coin", "Macro Coin", "Pumpkin Coin", "Turtle Coin"], self.player) + and state.has("Mario Coin Fragment", self.player, self.coin_fragments_required)) + else: + entrance_rules["Menu -> Mario's Castle"] = lambda state: state.has_from_list_unique([ + "Tree Coin", "Space Coin", "Macro Coin", "Pumpkin Coin", "Mario Coin", "Turtle Coin" + ], self.player, self.options.required_golden_coins) + + + for entrance, rule in entrance_rules.items(): + self.multiworld.get_entrance(entrance, self.player).access_rule = rule + + for location in self.multiworld.get_locations(self.player): + if location.name.endswith(("Coins", "Coin")): + rule = getattr(logic, location.parent_region.name.lower().replace(" ", "_") + "_coins", None) + if rule: + coins = int(location.name.split(" ")[-2]) + location.access_rule = lambda state, coin_rule=rule, num_coins=coins: \ + coin_rule(state, self.player, num_coins) + else: + rule = getattr(logic, location.name.lower().replace( + " - ", "_").replace(" ", "_").replace("'", ""), None) + if rule: + location.access_rule = lambda state, loc_rule=rule: loc_rule(state, self.player) + self.multiworld.completion_condition[self.player] = lambda state: state.has("Wario Defeated", self.player) + + def create_items(self): + item_counts = { + "Space Zone Progression": 1, + "Space Zone Secret": 1, + "Tree Zone Progression": 3, + "Tree Zone Secret": 1, + "Macro Zone Progression": 3, + "Macro Zone Secret 1": 1, + "Macro Zone Secret 2": 1, + "Pumpkin Zone Progression": 3, + "Pumpkin Zone Secret 1": 1, + "Pumpkin Zone Secret 2": 1, + "Mario Zone Progression": 3, + "Turtle Zone Progression": 2, + "Turtle Zone Secret": 1, + "Mushroom": 1, + "Fire Flower": 1, + "Carrot": 1, + "Space Physics": 1, + "Hippo Bubble": 1, + "Water Physics": 1, + "Super Star Duration Increase": 2, + "Mario Coin Fragment": 0, + } + + if self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + # There are 5 Zone Progression items that can be condensed. + item_counts["Mario Coin Fragment"] = 1 + ((5 * self.options.mario_coin_fragment_percentage) // 100) + + if self.options.coinsanity: + coin_count = sum([level[1] for level in self.num_coin_locations]) + max_coins = sum(self.max_coin_locations.values()) + if self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + removed_coins = (coin_count * self.options.mario_coin_fragment_percentage) // 100 + coin_count -= removed_coins + item_counts["Mario Coin Fragment"] += removed_coins + # Randomly remove some coin items for variety + coin_count -= (coin_count // self.random.randint(100, max(100, coin_count))) + + if coin_count: + coin_bundle_sizes = [max_coins // coin_count] * coin_count + remainder = max_coins - sum(coin_bundle_sizes) + for i in range(remainder): + coin_bundle_sizes[i] += 1 + for a, b in zip(range(1, len(coin_bundle_sizes), 2), range(2, len(coin_bundle_sizes), 2)): + split = self.random.randint(1, coin_bundle_sizes[a] + coin_bundle_sizes[b] - 1) + coin_bundle_sizes[a], coin_bundle_sizes[b] = split, coin_bundle_sizes[a] + coin_bundle_sizes[b] - split + for coin_bundle_size in coin_bundle_sizes: + item_name = f"{coin_bundle_size} Coin{'s' if coin_bundle_size > 1 else ''}" + if item_name in item_counts: + item_counts[item_name] += 1 + else: + item_counts[item_name] = 1 + + if self.options.shuffle_golden_coins == "shuffle": + for item in self.item_name_groups["Golden Coins"]: + item_counts[item] = 1 + elif self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + for item in ("Tree Coin", "Space Coin", "Macro Coin", "Pumpkin Coin", "Turtle Coin"): + self.multiworld.push_precollected(self.create_item(item)) + else: + for item, location_name in ( + ("Mario Coin", "Mario Zone 4 - Boss"), + ("Tree Coin", "Tree Zone 5 - Boss"), + ("Space Coin", "Space Zone 2 - Boss"), + ("Macro Coin", "Macro Zone 4 - Boss"), + ("Pumpkin Coin", "Pumpkin Zone 4 - Boss"), + ("Turtle Coin", "Turtle Zone 3 - Boss") + ): + location = self.multiworld.get_location(location_name, self.player) + location.place_locked_item(self.create_item(item)) + location.address = None + location.item.code = None + + if self.options.shuffle_midway_bells: + for item in [item for item in items if "Midway Bell" in item]: + if item != "Mario's Castle Midway Bell" or self.options.marios_castle_midway_bell: + item_counts[item] = 1 + + if self.options.difficulty_mode == "easy_to_normal": + item_counts["Normal Mode"] = 1 + elif self.options.difficulty_mode == "normal_to_easy": + item_counts["Easy Mode"] = 1 + + if self.options.shuffle_pipe_traversal == "single": + item_counts["Pipe Traversal"] = 1 + elif self.options.shuffle_pipe_traversal == "split": + item_counts["Pipe Traversal - Right"] = 1 + item_counts["Pipe Traversal - Left"] = 1 + item_counts["Pipe Traversal - Up"] = 1 + item_counts["Pipe Traversal - Down"] = 1 + else: + self.multiworld.push_precollected(self.create_item("Pipe Traversal")) + + if any(self.auto_scroll_levels): + if self.options.auto_scroll_mode == "global_trap_item": + item_counts["Auto Scroll"] = 1 + elif self.options.auto_scroll_mode == "global_cancel_item": + item_counts["Cancel Auto Scroll"] = 1 + else: + for level, i in enumerate(self.auto_scroll_levels): + if i == 3: + item_counts[f"Auto Scroll - {level_id_to_name[level]}"] = 1 + elif i == 2: + item_counts[f"Cancel Auto Scroll - {level_id_to_name[level]}"] = 1 + + for item in self.multiworld.precollected_items[self.player]: + if item.name in item_counts and item_counts[item.name] > 0: + item_counts[item.name] -= 1 + + location_count = len(self.multiworld.get_unfilled_locations(self.player)) + items_to_add = location_count - sum(item_counts.values()) + if items_to_add > 0: + mario_coin_frags = 0 + if self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + mario_coin_frags = (items_to_add * self.options.mario_coin_fragment_percentage) // 100 + item_counts["Mario Coin Fragment"] += mario_coin_frags + item_counts["Super Star Duration Increase"] += items_to_add - mario_coin_frags + elif items_to_add < 0: + if self.options.coinsanity: + for i in range(1, 168): + coin_name = f"{i} Coin{'s' if i > 1 else ''}" + if coin_name in item_counts: + amount_to_remove = min(-items_to_add, item_counts[coin_name]) + item_counts[coin_name] -= amount_to_remove + items_to_add += amount_to_remove + if items_to_add >= 0: + break + + double_progression_items = ["Tree Zone Progression", "Macro Zone Progression", "Pumpkin Zone Progression", + "Mario Zone Progression", "Turtle Zone Progression"] + self.random.shuffle(double_progression_items) + while sum(item_counts.values()) > location_count: + if double_progression_items: + double_progression_item = double_progression_items.pop() + item_counts[double_progression_item] -= 2 + item_counts[double_progression_item + " x2"] = 1 + continue + if self.options.auto_scroll_mode in ("level_trap_items", "level_cancel_items", + "chaos"): + auto_scroll_item = self.random.choice([item for item in item_counts if "Auto Scroll" in item]) + level = auto_scroll_item.split("- ")[1] + self.auto_scroll_levels[level_name_to_id[level]] = 0 + del item_counts[auto_scroll_item] + continue + raise Exception(f"Too many items in the item pool for Super Mario Land 2 player {self.player_name}") + # item = self.random.choice(list(item_counts)) + # item_counts[item] -= 1 + # if item_counts[item] == 0: + # del item_counts[item] + # self.multiworld.push_precollected(self.create_item(item)) + + self.coin_fragments_required = max((item_counts["Mario Coin Fragment"] + * self.options.mario_coin_fragments_required_percentage) // 100, 1) + + for item_name, count in item_counts.items(): + self.multiworld.itempool += [self.create_item(item_name) for _ in range(count)] + + def fill_slot_data(self): + return { + "energy_link": self.options.energy_link.value + } + + def create_item(self, name: str) -> Item: + return MarioLand2Item(name, items[name], self.item_name_to_id[name], self.player) + + def get_filler_item_name(self): + return "1 Coin" + + def modify_multidata(self, multidata: dict): + rom_name = bytearray(f'AP{Utils.__version__.replace(".", "")[0:3]}_{self.player}_{self.multiworld.seed:11}\0', + 'utf8')[:21] + rom_name.extend([0] * (21 - len(rom_name))) + new_name = base64.b64encode(bytes(rom_name)).decode() + multidata["connect_names"][new_name] = multidata["connect_names"][self.player_name] + + +class MarioLand2Location(Location): + game = "Super Mario Land 2" + + +class MarioLand2Item(Item): + game = "Super Mario Land 2" diff --git a/worlds/marioland2/basepatch.bsdiff4 b/worlds/marioland2/basepatch.bsdiff4 new file mode 100644 index 0000000000..a8818419a6 Binary files /dev/null and b/worlds/marioland2/basepatch.bsdiff4 differ diff --git a/worlds/marioland2/client.py b/worlds/marioland2/client.py new file mode 100644 index 0000000000..41e6468f93 --- /dev/null +++ b/worlds/marioland2/client.py @@ -0,0 +1,250 @@ +import base64 +import logging + +from NetUtils import ClientStatus +from worlds._bizhawk.client import BizHawkClient +from worlds._bizhawk import read, write, guarded_write + +from .rom_addresses import rom_addresses + +logger = logging.getLogger("Client") + +BANK_EXCHANGE_RATE = 20000000000 + +overworld_music = (0x05, 0x06, 0x0D, 0x0E, 0x10, 0x12, 0x1B, 0x1C, 0x1E) + +class MarioLand2Client(BizHawkClient): + system = ("GB", "SGB") + patch_suffix = ".apsml2" + game = "Super Mario Land 2" + + def __init__(self): + super().__init__() + self.locations_array = [] + self.previous_level = None + + async def validate_rom(self, ctx): + game_name = await read(ctx.bizhawk_ctx, [(0x134, 10, "ROM")]) + game_name = game_name[0].decode("ascii") + if game_name == "MARIOLAND2": + ctx.game = self.game + ctx.items_handling = 0b111 + return True + return False + + async def set_auth(self, ctx): + auth_name = await read(ctx.bizhawk_ctx, [(0x77777, 21, "ROM")]) + auth_name = base64.b64encode(auth_name[0]).decode() + ctx.auth = auth_name + + async def game_watcher(self, ctx): + from . import START_IDS + from .items import items + from .locations import locations, level_id_to_name, coins_coords, location_name_to_id + + (game_loaded_check, level_data, music, auto_scroll_levels, current_level, + midway_point, bcd_lives, num_items_received, coins, options) = \ + await read(ctx.bizhawk_ctx, [(0x0046, 10, "CartRAM"), (0x0848, 42, "CartRAM"), (0x0469, 1, "CartRAM"), + (rom_addresses["Auto_Scroll_Levels_B"], 32, "ROM"), + (0x0269, 1, "CartRAM"), (0x02A0, 1, "CartRAM"), (0x022C, 1, "CartRAM"), + (0x00F0, 2, "CartRAM"), (0x0262, 2, "CartRAM"), + (rom_addresses["Coins_Required"], 8, "ROM")]) + + coins_required = int.from_bytes(options[:2], "big") + difficulty_mode = options[2] + star_count = int.from_bytes(options[3:5], "big") + midway_bells = options[5] + energy_link = options[6] + coin_mode = options[7] + + current_level = int.from_bytes(current_level, "big") + auto_scroll_levels = list(auto_scroll_levels) + midway_point = int.from_bytes(midway_point, "big") + music = int.from_bytes(music, "big") + level_data = list(level_data) + lives = bcd_lives.hex() + num_items_received = int.from_bytes(num_items_received, "big") + if num_items_received == 0xFFFF: + num_items_received = 0 + + items_received = [list(items.keys())[item.item - START_IDS] for item in ctx.items_received] + write_num_items_received = len(items_received).to_bytes(2, "big") + + level_progression = { + "Space Zone Progression", + "Tree Zone Progression", + "Macro Zone Progression", + "Pumpkin Zone Progression", + "Mario Zone Progression", + "Turtle Zone Progression", + } + for level_item in level_progression: + for _ in range(items_received.count(level_item + " x2")): + items_received += ([level_item] * 2) + + if "Pipe Traversal" in items_received: + items_received += ["Pipe Traversal - Left", "Pipe Traversal - Right", + "Pipe Traversal - Up", "Pipe Traversal - Down"] + + if coin_mode == 2 and items_received.count("Mario Coin Fragment") >= coins_required: + items_received.append("Mario Coin") + + if current_level == 255 and self.previous_level != 255: + if coin_mode < 2: + logger.info(f"Golden Coins required: {coins_required}") + else: + logger.info(f"Mario Coin Fragments required: {coins_required}. " + f"You have {items_received.count('Mario Coin Fragment')}") + self.previous_level = current_level + + # There is no music in the title screen demos, this is how we guard against anything in the demos registering. + # There is also no music at the door to Mario's Castle, which is why the above is before this check. + if game_loaded_check != b'\x124Vx\xff\xff\xff\xff\xff\xff' or music == 0: + return + + locations_checked = [] + if current_level in level_id_to_name: + level_name = level_id_to_name[current_level] + coin_tile_data = await read(ctx.bizhawk_ctx, [(0xB000 + ((coords[1] * 256) + coords[0]), 1, "System Bus") + for coords in coins_coords[level_name]]) + num_coins = len([tile[0] for tile in coin_tile_data if tile[0] in (0x7f, 0x60, 0x07)]) + locations_checked = [location_name_to_id[f"{level_name} - {i} Coin{'s' if i > 1 else ''}"] + for i in range(1, num_coins + 1)] + + new_lives = int(lives) + energy_link_add = None + if energy_link: + if new_lives == 0: + if (f"EnergyLink{ctx.team}" in ctx.stored_data + and ctx.stored_data[f"EnergyLink{ctx.team}"] + and ctx.stored_data[f"EnergyLink{ctx.team}"] >= BANK_EXCHANGE_RATE): + new_lives = 1 + energy_link_add = -BANK_EXCHANGE_RATE + elif new_lives > 1: + energy_link_add = BANK_EXCHANGE_RATE * (new_lives - 1) + new_lives = 1 + # Convert back to binary-coded-decimal + new_lives = int(str(new_lives), 16) + + new_coins = coins.hex() + new_coins = int(new_coins[2:] + new_coins[:2]) + for item in items_received[num_items_received:]: + if item.endswith("Coins") or item == "1 Coin": + new_coins += int(item.split(" ")[0]) + # Limit to 999 and convert back to binary-coded-decimal + new_coins = int(str(min(new_coins, 999)), 16).to_bytes(2, "little") + + modified_level_data = level_data.copy() + for ID, (location, data) in enumerate(locations.items(), START_IDS): + if "clear_condition" in data: + if items_received.count(data["clear_condition"][0]) >= data["clear_condition"][1]: + modified_level_data[data["ram_index"]] |= (0x08 if data["type"] == "bell" + else 0x01 if data["type"] == "secret" else 0x80) + + if data["type"] == "level" and level_data[data["ram_index"]] & 0x40: + locations_checked.append(ID) + if data["type"] == "secret" and level_data[data["ram_index"]] & 0x02: + locations_checked.append(ID) + elif data["type"] == "bell" and data["id"] == current_level and midway_point == 0xFF: + locations_checked.append(ID) + + invincibility_length = int((832.0 / (star_count + 1)) + * (items_received.count("Super Star Duration Increase") + 1)) + + if "Easy Mode" in items_received: + difficulty_mode = 1 + elif "Normal Mode" in items_received: + difficulty_mode = 0 + + data_writes = [ + (rom_addresses["Space_Physics"], [0x7e] if "Space Physics" in items_received else [0xaf], "ROM"), + (rom_addresses["Get_Hurt_To_Big_Mario"], [1] if "Mushroom" in items_received else [0], "ROM"), + (rom_addresses["Get_Mushroom_A"], [0xea, 0x16, 0xa2] if "Mushroom" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Mushroom_B"], [0xea, 0x16, 0xa2] if "Mushroom" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Mushroom_C"], [00] if "Mushroom" in items_received else [0xd8], "ROM"), + (rom_addresses["Get_Carrot_A"], [0xea, 0x16, 0xa2] if "Carrot" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Carrot_B"], [0xea, 0x16, 0xa2] if "Carrot" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Carrot_C"], [00] if "Carrot" in items_received else [0xc8], "ROM"), + (rom_addresses["Get_Fire_Flower_A"], [0xea, 0x16, 0xa2] if "Fire Flower" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Fire_Flower_B"], [0xea, 0x16, 0xa2] if "Fire Flower" in items_received else [0, 0, 0], "ROM"), + (rom_addresses["Get_Fire_Flower_C"], [00] if "Fire Flower" in items_received else [0xc8], "ROM"), + (rom_addresses["Invincibility_Star_A"], [(invincibility_length >> 8) + 1], "ROM"), + (rom_addresses["Invincibility_Star_B"], [invincibility_length & 0xFF], "ROM"), + (rom_addresses["Enable_Bubble"], [0xcb, 0xd7] if "Hippo Bubble" in items_received else [0, 0], "ROM"), + (rom_addresses["Enable_Swim"], [0xcb, 0xcf] if "Water Physics" in items_received else [0, 0], "ROM"), + (rom_addresses["Pipe_Traversal_A"], [16] if "Pipe Traversal - Down" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_B"], [32] if "Pipe Traversal - Up" in items_received else [10], "ROM"), + (rom_addresses["Pipe_Traversal_C"], [48] if "Pipe Traversal - Right" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_D"], [64] if "Pipe Traversal - Left" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_SFX_A"], [5] if "Pipe Traversal - Down" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_SFX_B"], [5] if "Pipe Traversal - Up" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_SFX_C"], [5] if "Pipe Traversal - Right" in items_received else [0], "ROM"), + (rom_addresses["Pipe_Traversal_SFX_D"], [5] if "Pipe Traversal - Left" in items_received else [0], "ROM"), + (0x022c, [new_lives], "CartRAM"), + (0x02E4, [difficulty_mode], "CartRAM"), + (0x0848, modified_level_data, "CartRAM"), + (0x0262, new_coins, "CartRAM"), + ] + + if items_received: + data_writes.append((0x00F0, write_num_items_received, "CartRAM")) + + if midway_point == 0xFF and (midway_bells or music in overworld_music): + # after registering the check for the midway bell, clear the value just for safety. + data_writes.append((0x02A0, [0], "CartRAM")) + + for i in range(32): + if auto_scroll_levels[i] == 3: + if "Auto Scroll" in items_received or f"Auto Scroll - {level_id_to_name[i]}" in items_received: + auto_scroll_levels[i] = 1 + if i == current_level: + data_writes.append((0x02C8, [0x01], "CartRAM")) + else: + auto_scroll_levels[i] = 0 + elif auto_scroll_levels[i] == 2: + if ("Cancel Auto Scroll" in items_received + or f"Cancel Auto Scroll - {level_id_to_name[i]}" in items_received): + auto_scroll_levels[i] = 0 + if i == current_level: + data_writes.append((0x02C8, [0x00], "CartRAM")) + else: + auto_scroll_levels[i] = 1 + data_writes.append((rom_addresses["Auto_Scroll_Levels"], auto_scroll_levels, "ROM")) + + success = await guarded_write(ctx.bizhawk_ctx, data_writes, [(0x0848, level_data, "CartRAM"), + (0x022C, [int.from_bytes(bcd_lives, "big")], + "CartRAM"), + [0x0262, coins, "CartRAM"]]) + + if success and energy_link_add is not None: + await ctx.send_msgs([{ + "cmd": "Set", "key": f"EnergyLink{ctx.team}", "operations": + [{"operation": "add", "value": energy_link_add}, + {"operation": "max", "value": 0}], + }]) + + if not ctx.server or not ctx.server.socket.open or ctx.server.socket.closed: + return + + if locations_checked and locations_checked != self.locations_array: + self.locations_array = locations_checked + await ctx.send_msgs([{"cmd": "LocationChecks", "locations": locations_checked}]) + + if music == 0x18: + await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) + ctx.finished_game = True + + def on_package(self, ctx, cmd: str, args: dict): + super().on_package(ctx, cmd, args) + if cmd == 'Connected': + if ctx.slot_data["energy_link"]: + ctx.set_notify(f"EnergyLink{ctx.team}") + if ctx.ui: + ctx.ui.enable_energy_link() + ctx.ui.energy_link_label.text = "Lives: Standby" + elif cmd == "SetReply" and args["key"].startswith("EnergyLink"): + if ctx.ui: + ctx.ui.energy_link_label.text = f"Lives: {int(args['value'] / BANK_EXCHANGE_RATE)}" + elif cmd == "Retrieved": + if f"EnergyLink{ctx.team}" in args["keys"] and args['keys'][f'EnergyLink{ctx.team}'] and ctx.ui: + ctx.ui.energy_link_label.text = f"Lives: {int(args['keys'][f'EnergyLink{ctx.team}'] / BANK_EXCHANGE_RATE)}" diff --git a/worlds/marioland2/docs/en_Super Mario Land 2.md b/worlds/marioland2/docs/en_Super Mario Land 2.md new file mode 100644 index 0000000000..7be02a2a28 --- /dev/null +++ b/worlds/marioland2/docs/en_Super Mario Land 2.md @@ -0,0 +1,64 @@ +# Super Mario Land 2: 6 Golden Coins + +## Where is the options page? + +The [player options page for this game](../player-options) contains all the options you need to configure and export a +config file. + +## What items and locations get shuffled? + +Completing a level's exits results in a location check instead of automatically bringing you to the next level. +Where there are secret exits, the secret exit will be a separate location check. There is one exception, Hippo Zone, +that does not have a separate check for its secret exit. The Hippo Zone secret exit will still bring you to the Space +Zone. + +Ringing the Midway Bells in each level that has one will register a location check. If the "Shuffle Midway Bells" option +is turned on, then ringing the bell will not grant the checkpoint, and instead you must obtain the Midway Bell item from +the item pool to gain the checkpoint for that level. Holding SELECT while loading into a level where you have unlocked +the Midway Bell checkpoint will start you at the beginning of the level. + +Unlocking paths to new levels requires finding or receiving Zone Progression items. For example, receiving the first +"Turtle Zone Progression" will unlock the path from Turtle Zone 1 to Turtle Zone 2. Paths to secret levels are separate +items, so Turtle Zone Secret will open the path from Turtle Zone 2 to the Turtle Zone Secret Course. + +Depending on settings, there may be some "Zone Progression x2" items that open two paths at once. + +The path from Tree Zone 2 to the branch to Tree Zone 3 and 4 is one unlock, so both levels will open at this point. + +Besides the zone progression unlocks, the following items are always shuffled: +- Mushroom: required to become Big Mario. If you are Fire or Bunny Mario and take damage, and have not obtained the +Mushroom, you will drop straight down to Small Mario. +- Fire Flower: required to become Fire Mario. +- Carrot: required to become Bunny Mario. +- Hippo Bubble: required to use the bubbles in Hippo Zone to fly. +- Water Physics: Mario will fall through water as though it is air until this is obtained. +- Space Physics: the Space Zone levels will have normal gravity until this is obtained. +- Super Star Duration Increase: you begin with a drastically lowered invincibility star duration, and these items will +increase it. + +Additionally, the following items can be shuffled depending on your YAML options: +- The 6 Golden Coins: note that the game will still show you the coin being sent to the castle when defeating a boss +regardless of whether the coin is actually obtained in that location. +- Mario Coin Fragments: As an alternative to shuffling the 6 Golden Coins, you can shuffle Mario Coin Fragments, +a chosen percentage of which are needed to assemble the Mario Coin. You will start with the other 5 coins. +- Normal Mode/Easy Mode: you can start the game in Normal Mode with an Easy Mode "upgrade" in the item pool, or start in +Easy Mode with a Normal Mode "trap" item, swapping the difficulty. +- Auto Scroll: auto-scrolling levels can be set to not auto scroll until this trap item is received. +- Pipe Traversal: required to enter pipes. Can also be split into 4 items, each enabling pipe entry from a different +direction. +- Coins: if Coinsanity is enabled, coins will be shuffled into the item pool. A number of checks will be added to each +level for obtaining a specific number of coins within a single playthrough of the level. + + +## When the player receives an item, what happens? + +There is no in-game indication that an item has been received. You will need to watch the client or web tracker to be +sure you're aware of the items you've received. + +## Special Thanks to: + +- [froggestspirit](https://github.com/froggestspirit) for his Super Mario Land 2 disassembly. While very incomplete, it +had enough memory values mapped out to make my work significantly easier. +- [slashinfty](https://github.com/slashinfty), the author of the +[Super Mario Land 2 Randomizer](https://sml2r.download/) for permitting me to port features such as Randomize Enemies +and Randomize Platforms directly from it. \ No newline at end of file diff --git a/worlds/marioland2/docs/setup_en.md b/worlds/marioland2/docs/setup_en.md new file mode 100644 index 0000000000..581d36e786 --- /dev/null +++ b/worlds/marioland2/docs/setup_en.md @@ -0,0 +1,75 @@ +# Setup Guide for Super Mario Land 2: 6 Golden Coins + +## Important + +As we are using BizHawk, this guide is only applicable to Windows and Linux systems. + +## Required Software + +- BizHawk: [BizHawk Releases from TASVideos](https://tasvideos.org/BizHawk/ReleaseHistory) + - Version 2.9.1 is recommended. + - Detailed installation instructions for BizHawk can be found at the above link. + - Windows users must run the prereq installer first, which can also be found at the above link. +- The built-in Archipelago client, which can be installed [here](https://github.com/ArchipelagoMW/Archipelago/releases) +- A Super Mario Land 2: 6 Golden Coins version 1.0 ROM file. The Archipelago community cannot provide this. + +## Configuring BizHawk + +Once BizHawk has been installed, open EmuHawk and change the following settings: + +- Under Config > Customize > Advanced, make sure the box for AutoSaveRAM is checked, and click the 5s button. + This reduces the possibility of losing save data in emulator crashes. +- Under Config > Customize, check the "Run in background" box. This will prevent disconnecting from the client while +EmuHawk is running in the background. + +It is strongly recommended to associate Game Boy ROM extensions (\*.gb) to the EmuHawk we've just installed. +To do so, we simply have to search any Game Boy ROM we happened to own, right click and select "Open with...", unfold +the list that appears and select the bottom option "Look for another application", then browse to the BizHawk folder +and select EmuHawk.exe. + +## Configuring your YAML file + +### What is a YAML file and why do I need one? + +Your YAML file contains a set of configuration options which provide the generator with information about how it should +generate your game. Each player of a multiworld will provide their own YAML file. This setup allows each player to enjoy +an experience customized for their taste, and different players in the same multiworld can all have different options. + +### Where do I get a YAML file? + +You can generate a yaml or download a template by visiting the [Super Mario Land 2 Player Options Page](/games/Super%20Mario%20Land%202/player-options) + +## Joining a MultiWorld Game + +### Generating and Patching a Game + +1. Create your options file (YAML). +2. Follow the general Archipelago instructions for [generating a game](../../Archipelago/setup/en#generating-a-game). +This will generate an output file for you. Your patch file will have a `.apsml2` file extension. +3. Open `ArchipelagoLauncher.exe` +4. Select "Open Patch" on the left side and select your patch file. +5. If this is your first time patching, you will be prompted to locate your vanilla ROM. +6. A patched `.gb` file will be created in the same place as the patch file. +7. On your first time opening a patch with BizHawk Client, you will also be asked to locate `EmuHawk.exe` in your +BizHawk install. + +You must connect Super Mario Land 2 to a server, even for a single player game, or progress cannot be made. + +### Connect to the Multiserver + +By default, opening a patch file will do steps 1-5 below for you automatically. Even so, keep them in your memory just +in case you have to close and reopen a window mid-game for some reason. + +1. Super Mario Land 2 uses Archipelago's BizHawk Client. If the client isn't still open from when you patched your +game, you can re-open it from the launcher. +2. Ensure EmuHawk is running the patched ROM. +3. In EmuHawk, go to `Tools > Lua Console`. This window must stay open while playing. +4. In the Lua Console window, go to `Script > Open Script…`. +5. Navigate to your Archipelago install folder and open `data/lua/connector_bizhawk_generic.lua`. +6. The emulator may freeze every few seconds until it manages to connect to the client. This is expected. The BizHawk +Client window should indicate that it connected and recognized Super Mario Land 2. +7. To connect the client to the server, enter your room's address and port (e.g. `archipelago.gg:38281`) into the +top text field of the client and click Connect. + +To connect the client to the multiserver simply put `
:` on the textfield on top and press enter (if the +server uses password, type in the bottom textfield `/connect
: [password]`) \ No newline at end of file diff --git a/worlds/marioland2/items.py b/worlds/marioland2/items.py new file mode 100644 index 0000000000..041ffe99f9 --- /dev/null +++ b/worlds/marioland2/items.py @@ -0,0 +1,79 @@ +from BaseClasses import ItemClassification +from .locations import level_name_to_id +from .options import CoinsanityChecks + +items = { + "Space Zone Progression": ItemClassification.progression, + "Space Zone Secret": ItemClassification.progression, + "Tree Zone Progression": ItemClassification.progression, + "Tree Zone Progression x2": ItemClassification.progression, + "Tree Zone Secret": ItemClassification.progression, + "Macro Zone Progression": ItemClassification.progression, + "Macro Zone Progression x2": ItemClassification.progression, + "Macro Zone Secret 1": ItemClassification.progression, + "Macro Zone Secret 2": ItemClassification.progression_skip_balancing, + "Pumpkin Zone Progression": ItemClassification.progression, + "Pumpkin Zone Progression x2": ItemClassification.progression, + "Pumpkin Zone Secret 1": ItemClassification.progression, + "Pumpkin Zone Secret 2": ItemClassification.progression, + "Mario Zone Progression": ItemClassification.progression, + "Mario Zone Progression x2": ItemClassification.progression, + "Turtle Zone Progression": ItemClassification.progression, + "Turtle Zone Progression x2": ItemClassification.progression, + "Turtle Zone Secret": ItemClassification.progression, + "Tree Coin": ItemClassification.progression_skip_balancing, + "Space Coin": ItemClassification.progression_skip_balancing, + "Macro Coin": ItemClassification.progression_skip_balancing, + "Pumpkin Coin": ItemClassification.progression_skip_balancing, + "Mario Coin": ItemClassification.progression_skip_balancing, + "Turtle Coin": ItemClassification.progression_skip_balancing, + "Mario Coin Fragment": ItemClassification.progression_skip_balancing, + "Mushroom": ItemClassification.progression, + "Fire Flower": ItemClassification.progression, + "Carrot": ItemClassification.progression, + "Space Physics": ItemClassification.progression_skip_balancing, + "Hippo Bubble": ItemClassification.progression_skip_balancing, + "Water Physics": ItemClassification.progression, + "Pipe Traversal": ItemClassification.progression, + "Pipe Traversal - Down": ItemClassification.progression, + "Pipe Traversal - Up": ItemClassification.progression, + "Pipe Traversal - Right": ItemClassification.progression, + "Pipe Traversal - Left": ItemClassification.progression_skip_balancing, + "Super Star Duration Increase": ItemClassification.filler, + "Easy Mode": ItemClassification.useful, + "Normal Mode": ItemClassification.trap, + "Auto Scroll": ItemClassification.trap, + **{f"Auto Scroll - {level}": ItemClassification.trap for level in level_name_to_id if level != "Wario's Castle"}, + "Cancel Auto Scroll": ItemClassification.progression, + **{f"Cancel Auto Scroll - {level}": ItemClassification.progression for level in level_name_to_id + if level != "Wario's Castle"}, + "Mushroom Zone Midway Bell": ItemClassification.filler, + "Tree Zone 1 Midway Bell": ItemClassification.filler, + "Tree Zone 2 Midway Bell": ItemClassification.progression_skip_balancing, + "Tree Zone 4 Midway Bell": ItemClassification.progression_skip_balancing, + "Tree Zone 5 Midway Bell": ItemClassification.filler, + "Space Zone 1 Midway Bell": ItemClassification.filler, + "Space Zone 2 Midway Bell": ItemClassification.progression_skip_balancing, + "Macro Zone 1 Midway Bell": ItemClassification.progression_skip_balancing, + "Macro Zone 2 Midway Bell": ItemClassification.progression_skip_balancing, + "Macro Zone 3 Midway Bell": ItemClassification.progression_skip_balancing, + "Macro Zone 4 Midway Bell": ItemClassification.filler, + "Pumpkin Zone 1 Midway Bell": ItemClassification.progression_skip_balancing, + "Pumpkin Zone 2 Midway Bell": ItemClassification.filler, + "Pumpkin Zone 3 Midway Bell": ItemClassification.filler, + "Pumpkin Zone 4 Midway Bell": ItemClassification.filler, + "Mario Zone 1 Midway Bell": ItemClassification.progression_skip_balancing, + "Mario Zone 2 Midway Bell": ItemClassification.filler, + "Mario Zone 3 Midway Bell": ItemClassification.filler, + "Mario Zone 4 Midway Bell": ItemClassification.filler, + "Turtle Zone 1 Midway Bell": ItemClassification.filler, + "Turtle Zone 2 Midway Bell": ItemClassification.progression_skip_balancing, + "Turtle Zone 3 Midway Bell": ItemClassification.filler, + "Mario's Castle Midway Bell": ItemClassification.progression_skip_balancing, + "1 Coin": ItemClassification.filler, + **{f"{i} Coins": ItemClassification.filler for i in range(2, CoinsanityChecks.range_end + 1)} +} + +for level in {"Turtle Zone Secret Course", "Macro Zone Secret Course", "Turtle Zone 3", "Scenic Course", + "Mario Zone 2"}: + items[f"Cancel Auto Scroll - {level}"] = ItemClassification.useful diff --git a/worlds/marioland2/locations.py b/worlds/marioland2/locations.py new file mode 100644 index 0000000000..8908b8d3be --- /dev/null +++ b/worlds/marioland2/locations.py @@ -0,0 +1,498 @@ +START_IDS = 1 + +locations = { + "Mushroom Zone - Normal Exit": {"id": 0x00, "ram_index": 0, "type": "level"}, + "Mushroom Zone - Midway Bell": {"id": 0x00, "ram_index": 0, "clear_condition": ("Mushroom Zone Midway Bell", 1), "type": "bell"}, + "Scenic Course - Normal Exit": {"id": 0x19, "ram_index": 40, "type": "level"}, + "Tree Zone 1 - Normal Exit": {"id": 0x01, "ram_index": 1, "clear_condition": ("Tree Zone Progression", 1), "type": "level"}, + "Tree Zone 1 - Midway Bell": {"id": 0x01, "ram_index": 1, "clear_condition": ("Tree Zone 1 Midway Bell", 1), "type": "bell"}, + "Tree Zone 2 - Normal Exit": {"id": 0x02, "ram_index": 2, "clear_condition": ("Tree Zone Progression", 2), "type": "level"}, + "Tree Zone 2 - Secret Exit": {"id": 0x02, "ram_index": 2, "clear_condition": ("Tree Zone Secret", 1), "type": "secret"}, + "Tree Zone 2 - Midway Bell": {"id": 0x02, "ram_index": 2, "clear_condition": ("Tree Zone 2 Midway Bell", 1), "type": "bell"}, + "Tree Zone 3 - Normal Exit": {"id": 0x04, "ram_index": 4, "clear_condition": ("Tree Zone Progression", 3), "type": "level"}, + "Tree Zone 4 - Normal Exit": {"id": 0x03, "ram_index": 3, "clear_condition": ("Tree Zone Progression", 3), "type": "level"}, + "Tree Zone 4 - Midway Bell": {"id": 0x03, "ram_index": 3, "clear_condition": ("Tree Zone 4 Midway Bell", 1), "type": "bell"}, + "Tree Zone 5 - Boss": {"id": 0x05, "ram_index": 5, "clear_condition": ("Tree Coin", 1), "type": "level"}, + "Tree Zone 5 - Midway Bell": {"id": 0x05, "ram_index": 5, "clear_condition": ("Tree Zone 5 Midway Bell", 1), "type": "bell"}, + "Tree Zone Secret Course - Normal Exit": {"id": 0x1D, "ram_index": 36, "type": "level"}, + "Hippo Zone - Normal or Secret Exit": {"id": 0x11, "ram_index": 31, "type": "level"}, + "Space Zone 1 - Normal Exit": {"id": 0x12, "ram_index": 16, "clear_condition": ("Space Zone Progression", 1), "type": "level"}, + "Space Zone 1 - Secret Exit": {"id": 0x12, "ram_index": 16, "clear_condition": ("Space Zone Secret", 1), "type": "secret"}, + "Space Zone 1 - Midway Bell": {"id": 0x12, "ram_index": 16, "clear_condition": ("Space Zone 1 Midway Bell", 1), "type": "bell"}, + "Space Zone Secret Course - Normal Exit": {"id": 0x1C, "ram_index": 41, "type": "level"}, + "Space Zone 2 - Boss": {"id": 0x13, "ram_index": 17, "clear_condition": ("Space Coin", 1), "type": "level"}, + "Space Zone 2 - Midway Bell": {"id": 0x13, "ram_index": 17, "clear_condition": ("Space Zone 2 Midway Bell", 1), "type": "bell"}, + "Macro Zone 1 - Normal Exit": {"id": 0x14, "ram_index": 11, "clear_condition": ("Macro Zone Progression", 1), "type": "level"}, + "Macro Zone 1 - Secret Exit": {"id": 0x14, "ram_index": 11, "clear_condition": ("Macro Zone Secret 1", 1), "type": "secret"}, + "Macro Zone 1 - Midway Bell": {"id": 0x14, "ram_index": 11, "clear_condition": ("Macro Zone 1 Midway Bell", 1), "type": "bell"}, + "Macro Zone 2 - Normal Exit": {"id": 0x15, "ram_index": 12, "clear_condition": ("Macro Zone Progression", 2), "type": "level"}, + "Macro Zone 2 - Midway Bell": {"id": 0x15, "ram_index": 12, "clear_condition": ("Macro Zone 2 Midway Bell", 1), "type": "bell"}, + "Macro Zone 3 - Normal Exit": {"id": 0x16, "ram_index": 13, "clear_condition": ("Macro Zone Progression", 3), "type": "level"}, + "Macro Zone 3 - Midway Bell": {"id": 0x16, "ram_index": 13, "clear_condition": ("Macro Zone 3 Midway Bell", 1), "type": "bell"}, + "Macro Zone 4 - Boss": {"id": 0x17, "ram_index": 14, "clear_condition": ("Macro Coin", 1), "type": "level"}, + "Macro Zone 4 - Midway Bell": {"id": 0x17, "ram_index": 14, "clear_condition": ("Macro Zone 4 Midway Bell", 1), "type": "bell"}, + "Macro Zone Secret Course - Normal Exit": {"id": 0x1E, "ram_index": 35, "clear_condition": ("Macro Zone Secret 2", 1), "type": "level"}, + "Pumpkin Zone 1 - Normal Exit": {"id": 0x06, "ram_index": 6, "clear_condition": ("Pumpkin Zone Progression", 1), "type": "level"}, + "Pumpkin Zone 1 - Midway Bell": {"id": 0x06, "ram_index": 6, "clear_condition": ("Pumpkin Zone 1 Midway Bell", 1), "type": "bell"}, + "Pumpkin Zone 2 - Normal Exit": {"id": 0x07, "ram_index": 7, "clear_condition": ("Pumpkin Zone Progression", 2), "type": "level"}, + "Pumpkin Zone 2 - Secret Exit": {"id": 0x07, "ram_index": 7, "clear_condition": ("Pumpkin Zone Secret 1", 1), "type": "secret"}, + "Pumpkin Zone 2 - Midway Bell": {"id": 0x07, "ram_index": 7, "clear_condition": ("Pumpkin Zone 2 Midway Bell", 2), "type": "bell"}, + "Pumpkin Zone 3 - Normal Exit": {"id": 0x08, "ram_index": 8, "clear_condition": ("Pumpkin Zone Progression", 3), "type": "level"}, + "Pumpkin Zone 3 - Secret Exit": {"id": 0x08, "ram_index": 8, "clear_condition": ("Pumpkin Zone Secret 2", 1), "type": "secret"}, + "Pumpkin Zone 3 - Midway Bell": {"id": 0x08, "ram_index": 8, "clear_condition": ("Pumpkin Zone 3 Midway Bell", 3), "type": "bell"}, + "Pumpkin Zone 4 - Boss": {"id": 0x09, "ram_index": 9, "clear_condition": ("Pumpkin Coin", 1), "type": "level"}, + "Pumpkin Zone 4 - Midway Bell": {"id": 0x09, "ram_index": 9, "clear_condition": ("Pumpkin Zone 4 Midway Bell", 1), "type": "bell"}, + "Pumpkin Zone Secret Course 1 - Normal Exit": {"id": 0x1B, "ram_index": 38, "type": "level"}, + "Pumpkin Zone Secret Course 2 - Normal Exit": {"id": 0x1F, "ram_index": 39, "type": "level"}, + "Mario Zone 1 - Normal Exit": {"id": 0x0A, "ram_index": 26, "clear_condition": ("Mario Zone Progression", 1), "type": "level"}, + "Mario Zone 1 - Midway Bell": {"id": 0x0A, "ram_index": 26, "clear_condition": ("Mario Zone 1 Midway Bell", 1), "type": "bell"}, + "Mario Zone 2 - Normal Exit": {"id": 0x0B, "ram_index": 27, "clear_condition": ("Mario Zone Progression", 2), "type": "level"}, + "Mario Zone 2 - Midway Bell": {"id": 0x0B, "ram_index": 27, "clear_condition": ("Mario Zone 2 Midway Bell", 1), "type": "bell"}, + "Mario Zone 3 - Normal Exit": {"id": 0x0C, "ram_index": 28, "clear_condition": ("Mario Zone Progression", 3), "type": "level"}, + "Mario Zone 3 - Midway Bell": {"id": 0x0C, "ram_index": 28, "clear_condition": ("Mario Zone 3 Midway Bell", 1), "type": "bell"}, + "Mario Zone 4 - Boss": {"id": 0x0D, "ram_index": 29, "clear_condition": ("Mario Coin", 1), "type": "level"}, + "Mario Zone 4 - Midway Bell": {"id": 0x0D, "ram_index": 29, "clear_condition": ("Mario Zone 4 Midway Bell", 1), "type": "bell"}, + "Turtle Zone 1 - Normal Exit": {"id": 0x0E, "ram_index": 21, "clear_condition": ("Turtle Zone Progression", 1), "type": "level"}, + "Turtle Zone 1 - Midway Bell": {"id": 0x0E, "ram_index": 21, "clear_condition": ("Turtle Zone 1 Midway Bell", 1), "type": "bell"}, + "Turtle Zone 2 - Normal Exit": {"id": 0x0F, "ram_index": 22, "clear_condition": ("Turtle Zone Progression", 2), "type": "level"}, + "Turtle Zone 2 - Secret Exit": {"id": 0x0F, "ram_index": 22, "clear_condition": ("Turtle Zone Secret", 1), "type": "secret"}, + "Turtle Zone 2 - Midway Bell": {"id": 0x0F, "ram_index": 22, "clear_condition": ("Turtle Zone 2 Midway Bell", 1), "type": "bell"}, + "Turtle Zone 3 - Boss": {"id": 0x10, "ram_index": 23, "clear_condition": ("Turtle Coin", 1), "type": "level"}, + "Turtle Zone 3 - Midway Bell": {"id": 0x10, "ram_index": 23, "clear_condition": ("Turtle Zone 3 Midway Bell", 1), "type": "bell"}, + "Turtle Zone Secret Course - Normal Exit": {"id": 0x1A, "ram_index": 37, "type": "level"}, + "Mario's Castle - Midway Bell": {"id": 24, "ram_index": 24, "clear_condition": ("Mario's Castle Midway Bell", 1), "type": "bell"}, +} + + +coins_coords = { + "Mushroom Zone": + [(22, 28), (24, 28), (42, 28), (43, 28), (74, 36), (74, 37), (74, 38), (76, 36), (76, 37), + (76, 38), (78, 36), (78, 37), (78, 38), (80, 36), (80, 37), (80, 38), (82, 36), (82, 37), + (82, 38), (83, 25), (84, 25), (84, 36), (84, 37), (84, 38), (85, 25), (86, 25), (86, 36), + (86, 37), (86, 38), (87, 25), (88, 36), (88, 37), (88, 38), (116, 24), (117, 24), (118, 24), + (151, 28), (152, 28), (180, 28), (181, 24), (181, 28), (182, 24), (182, 28), (183, 24), (183, 28), + (184, 24), (184, 28), (185, 24), (185, 28), (186, 24), (186, 28), (187, 24), (187, 28), (188, 24), + (188, 28), (189, 28), (211, 25), (212, 25), (212, 36), (212, 37), (212, 38), (212, 39), (213, 25), + (213, 36), (213, 37), (213, 38), (213, 39), (214, 25), (214, 36), (214, 37), (214, 38), (214, 39), + (215, 25), (216, 25), (217, 25), (217, 36), (217, 37), (217, 38), (217, 39), (218, 25), (218, 36), + (218, 37), (218, 38), (218, 39), (219, 25), (219, 36), (219, 37), (219, 38), (219, 39), (220, 25), + (231, 24), (232, 24)], + "Tree Zone 1": + [(27, 30), (28, 30), (29, 30), (33, 27), (34, 27), (35, 27), (40, 30), (41, 30), (42, 30), (47, 27), + (48, 27), (49, 27), (56, 30), (57, 30), (58, 30), (64, 30), (65, 30), (66, 30), (88, 30), (89, 30), + (90, 30), (94, 30), (95, 30), (96, 30), (100, 30), (101, 30), (102, 30), (106, 27), (107, 27), + (108, 27), (112, 30), (113, 30), (114, 30), (119, 28), (138, 30), (139, 30), (140, 30), (150, 28), + (151, 20), (151, 28), (152, 20), (152, 26), (152, 28), (153, 26), (153, 28), (154, 26), (154, 28), + (155, 26), (155, 28), (156, 26), (156, 28), (157, 20), (157, 26), (157, 28), (158, 20), (158, 26), + (158, 28), (159, 26), (159, 28), (160, 28), (161, 28), (176, 13), (177, 13), (177, 29), (178, 13), + (178, 29), (179, 13), (179, 29), (180, 13), (181, 13), (182, 13), (183, 13), (184, 13), (185, 13), + (186, 13), (187, 13), (187, 29), (188, 13), (188, 29), (189, 13), (189, 29), (190, 13), (191, 13), + (192, 13), (193, 13), (194, 13), (195, 13), (196, 13), (197, 13), (197, 29), (198, 13), (198, 29), + (199, 13), (199, 29), (200, 13), (201, 13), (202, 13), (203, 13), (204, 13), (205, 13), (206, 13), + (207, 27), (208, 13), (208, 27), (209, 14), (209, 27), (210, 10), (210, 11), (210, 12), (210, 13), + (210, 14), (210, 15), (211, 14), (212, 13), (219, 30), (220, 30), (221, 30), (229, 27), (230, 27), + (231, 27)], + "Tree Zone 2": + [(27, 11), (28, 11), (42, 10), (43, 10), (44, 10), (51, 28), (61, 9), (65, 26), (66, 26), (67, 26), + (70, 24), (71, 24), (72, 10), (72, 24), (73, 10), (73, 24), (75, 10), (76, 10), (76, 26), (77, 26), + (78, 10), (78, 26), (79, 10), (80, 24), (81, 10), (81, 24), (82, 10), (82, 24), (83, 24), (127, 7), + (128, 7), (129, 7), (130, 7), (136, 43), (138, 9), (138, 10), (138, 11), (139, 41), (140, 41), + (141, 41), (142, 9), (142, 10), (142, 11), (144, 41), (145, 41), (146, 9), (146, 10), (146, 11), + (146, 41), (149, 41), (150, 41), (151, 41), (154, 41), (155, 41), (156, 41), (159, 41), (160, 41), + (161, 41), (164, 41), (165, 41), (166, 41), (169, 41), (170, 41), (171, 41), (174, 41), (175, 41), + (176, 41), (182, 3), (188, 42), (188, 43), (188, 44), (189, 42), (189, 43), (189, 44), (190, 42), + (190, 43), (190, 44), (191, 42), (191, 43), (191, 44), (192, 42), (192, 43), (192, 44), (193, 42), + (193, 43), (193, 44), (213, 8), (213, 9), (213, 10), (213, 11), (213, 12), (213, 13), (213, 14), + (213, 15), (213, 16), (213, 17), (213, 18), (213, 19), (213, 20), (213, 21), (213, 22), (213, 23), + (213, 24), (213, 25)], + "Tree Zone Secret Course": + [(10, 24), (11, 24), (12, 24), (17, 23), (39, 24), (40, 24), (41, 24), (42, 24), (45, 24), + (46, 24), (47, 24), (48, 24), (51, 25), (52, 25), (53, 25), (54, 25), (58, 26), (59, 26), + (60, 26), (61, 24), (61, 25), (62, 24), (62, 25), (63, 24), (63, 25), (64, 24), (64, 25), + (67, 25), (68, 26), (69, 27), (70, 27), (73, 26), (74, 27), (75, 27), (76, 27), (80, 23), + (80, 24), (81, 23), (81, 24), (82, 23), (82, 24), (83, 23), (83, 24), (87, 25), (88, 24), + (89, 24), (90, 25), (91, 26), (100, 23), (114, 27), (114, 28), (115, 27), (115, 28), (116, 27), + (116, 28), (117, 27), (117, 28), (118, 27), (118, 28), (119, 27), (119, 28), (120, 27), + (120, 28), (121, 27), (121, 28), (128, 27), (128, 28), (131, 27), (131, 28), (134, 27), + (134, 28), (137, 27), (137, 28), (138, 27), (138, 28), (143, 27), (143, 28), (159, 23)], + "Tree Zone 4": + [(22, 10), (24, 12), (26, 10), (28, 27), (29, 11), (30, 11), (31, 11), (32, 11), (33, 11), (34, 11), + (35, 11), (37, 10), (38, 12), (41, 11), (43, 12), (61, 11), (70, 11), (79, 11), (89, 11), (103, 22), + (103, 25), (103, 28), (105, 22), (105, 25), (105, 28), (107, 22), (107, 25), (107, 28), (109, 22), + (109, 25), (109, 28), (111, 22), (111, 25), (111, 28), (113, 22), (113, 25), (113, 28), (115, 22), + (115, 25), (115, 28), (117, 22), (117, 25), (117, 28), (122, 22), (122, 25), (122, 28), (124, 22), + (124, 25), (124, 28), (126, 22), (126, 25), (126, 28), (128, 22), (128, 25), (128, 28), (130, 22), + (130, 25), (130, 28), (132, 22), (132, 25), (132, 28), (134, 22), (134, 25), (134, 28), (136, 22), + (136, 25), (136, 28), (171, 10), (196, 26), (196, 29), (197, 26), (197, 29), (198, 26), (198, 29), + (199, 26), (199, 29), (200, 26), (200, 29)], + "Tree Zone 3": + [(18, 11), (18, 12), (19, 11), (19, 12), (20, 11), (20, 12), (21, 11), (21, 12), (22, 11), (22, 12), + (26, 40), (27, 11), (27, 12), (28, 11), (28, 12), (29, 11), (29, 12), (30, 11), (30, 12), (31, 11), + (31, 12), (48, 41), (49, 41), (50, 41), (51, 41), (61, 25), (77, 24)], + "Tree Zone 5": + [(23, 41), (84, 39), (85, 39), (116, 42), (123, 39), (132, 39), (134, 36), (134, 39), (134, 43), + (134, 44), (135, 43), (135, 44), (136, 36), (136, 39), (136, 43), (136, 44), (137, 43), (137, 44), + (138, 36), (138, 39), (138, 43), (138, 44), (139, 43), (139, 44), (140, 36), (140, 39), (140, 43), + (140, 44), (141, 43), (141, 44), (142, 36), (142, 39), (142, 43), (142, 44), (144, 36), (144, 39), + (146, 36), (146, 39)], + "Scenic Course": + [(24, 28), (39, 28), (54, 28), (72, 28), (87, 28), (103, 28), (117, 28)], + "Hippo Zone": + [(2, 20), (3, 3), (15, 26), (16, 26), (17, 26), (28, 4), (28, 7), (28, 10), (28, 13), (29, 4), + (29, 7), (29, 10), (29, 13), (29, 21), (30, 4), (30, 7), (30, 10), (30, 13), (32, 15), (33, 15), + (34, 15), (35, 15), (36, 15), (37, 15), (41, 12), (41, 13), (42, 11), (43, 10), (44, 10), (45, 10), + (46, 11), (47, 12), (47, 13), (48, 14), (49, 15), (50, 15), (51, 15), (52, 14), (53, 12), (53, 13), + (54, 11), (55, 10), (56, 10), (57, 10), (58, 11), (59, 12), (59, 13), (60, 14), (61, 15), (62, 15), + (63, 15), (64, 14), (65, 12), (65, 13), (66, 11), (67, 10), (68, 10), (69, 10), (70, 11), (71, 12), + (71, 13), (72, 14), (73, 15), (74, 15), (75, 15), (76, 14), (77, 12), (77, 13), (84, 11), (85, 11), + (85, 22), (86, 22), (91, 6), (92, 6), (92, 11), (93, 6), (93, 11), (94, 11), (95, 16), (96, 12), + (96, 16), (97, 8), (97, 12), (97, 16), (98, 8), (98, 12), (99, 8), (112, 6), (112, 7), (112, 12), + (112, 13), (113, 2), (113, 5), (113, 8), (113, 11), (113, 14), (113, 17), (114, 2), (114, 5), + (114, 8), (114, 11), (114, 14), (114, 17), (115, 3), (115, 4), (115, 9), (115, 10), (115, 15), + (115, 16), (124, 3), (124, 4), (124, 9), (124, 10), (124, 15), (124, 16), (125, 2), (125, 5), + (125, 8), (125, 11), (125, 14), (125, 17), (126, 2), (126, 5), (126, 8), (126, 11), (126, 14), + (126, 17), (127, 6), (127, 7), (127, 12), (127, 13), (129, 13), (130, 13), (131, 13), (132, 13), + (132, 22), (133, 13), (134, 13), (135, 13), (136, 13), (136, 21), (137, 13), (138, 13), (139, 13), + (139, 22), (140, 13), (141, 13), (142, 13), (154, 7), (155, 7), (156, 7), (157, 10), (158, 10), + (159, 10), (162, 15), (162, 16), (162, 17), (164, 15), (164, 16), (164, 17), (166, 15), (166, 16), + (166, 17), (168, 15), (168, 16), (168, 17), (170, 15), (170, 16), (170, 17), (172, 15), (172, 16), + (172, 17), (174, 15), (174, 16), (174, 17), (176, 15), (176, 16), (176, 17)], + "Space Zone 1": + [(38, 26), (45, 25), (46, 25), (47, 25), (57, 24), (58, 24), (59, 24), (60, 19), (60, 23), (61, 23), + (62, 23), (63, 23), (75, 24), (89, 16), (89, 17), (89, 18), (89, 19), (90, 16), (90, 17), (90, 18), + (90, 19), (91, 16), (91, 17), (91, 18), (91, 19), (92, 16), (92, 17), (92, 18), (92, 19), (93, 16), + (93, 17), (93, 18), (93, 19), (104, 22), (105, 22), (114, 22), (115, 22), (125, 10), (126, 9), + (127, 8), (128, 8), (129, 8), (130, 8), (131, 8), (132, 9), (133, 10), (136, 10), (137, 9), + (138, 8), (139, 8), (140, 8), (141, 8), (142, 8), (143, 9), (144, 10), (147, 10), (148, 9), + (149, 8), (150, 8), (151, 8), (152, 8), (153, 8), (154, 9), (155, 10), (155, 18), (155, 19), + (155, 20), (156, 17), (156, 18), (156, 19), (156, 20), (156, 21), (157, 16), (157, 17), (157, 18), + (157, 19), (157, 20), (157, 21), (157, 22), (158, 10), (158, 16), (158, 17), (158, 18), (158, 19), + (158, 20), (158, 21), (158, 22), (159, 9), (159, 16), (159, 17), (159, 18), (159, 19), (159, 20), + (159, 21), (159, 22), (160, 8), (160, 16), (160, 17), (160, 18), (160, 19), (160, 20), (160, 21), + (160, 22), (161, 8), (161, 16), (161, 17), (161, 18), (161, 19), (161, 20), (161, 21), (161, 22), + (162, 8), (162, 17), (162, 18), (162, 19), (162, 20), (162, 21), (163, 8), (163, 18), (163, 19), + (163, 20), (164, 8), (165, 9), (166, 10), (168, 10), (169, 9), (170, 8), (171, 8), (172, 8), + (173, 8), (174, 8), (175, 9), (176, 10)], + "Space Zone Secret Course": + [(16, 22), (16, 23), (16, 24), (18, 21), (18, 22), (18, 23), (20, 21), (20, 22), (20, 23), + (22, 20), (22, 21), (22, 22), (24, 19), (24, 20), (24, 21), (26, 18), (26, 19), (26, 20), + (28, 18), (28, 19), (28, 20), (30, 17), (30, 18), (30, 19), (36, 15), (36, 16), (36, 17), + (38, 14), (38, 15), (38, 16), (40, 13), (40, 14), (40, 15), (40, 24), (41, 24), (42, 13), + (42, 14), (42, 15), (44, 12), (44, 13), (44, 14), (46, 12), (46, 13), (46, 14), (48, 12), + (48, 13), (48, 14), (50, 11), (50, 12), (50, 13), (50, 27), (51, 27), (52, 10), (52, 11), + (52, 12), (52, 27), (53, 27), (54, 27), (58, 11), (58, 12), (58, 13), (60, 12), (60, 13), + (60, 14), (62, 12), (62, 13), (62, 14), (64, 12), (64, 13), (64, 14), (66, 13), (66, 14), + (66, 15), (68, 13), (68, 14), (68, 15), (70, 14), (70, 15), (70, 16), (72, 15), (72, 16), + (72, 17), (74, 16), (74, 17), (74, 18), (80, 18), (80, 19), (80, 20), (82, 19), (82, 20), + (82, 21), (84, 19), (84, 20), (84, 21), (86, 20), (86, 21), (86, 22), (88, 21), (88, 22), + (88, 23)], + "Space Zone 2": + [(11, 13), (12, 13), (13, 13), (20, 8), (21, 8), (22, 8), (25, 5), (26, 5), (27, 5), (33, 6), + (34, 6), (35, 6), (36, 10), (37, 10), (38, 10), (45, 7), (46, 7), (47, 7), (59, 5), (60, 5), + (61, 5), (64, 3), (93, 8), (94, 8), (95, 8), (96, 11), (97, 11), (98, 11), (100, 6), (101, 6), + (102, 6), (102, 8), (120, 5), (124, 12), (124, 13), (125, 12), (125, 13), (126, 12), (126, 13), + (127, 3), (127, 12), (127, 13), (128, 3), (128, 7), (129, 3), (129, 7), (130, 7), (148, 6), + (148, 7), (148, 8), (149, 5), (149, 6), (149, 7), (149, 8), (149, 9), (150, 5), (150, 6), (150, 7), + (150, 8), (150, 9), (151, 5), (151, 6), (151, 7), (151, 8), (151, 9), (152, 5), (152, 6), (152, 7), + (152, 8), (152, 9), (153, 6), (153, 7), (153, 8), (165, 7), (165, 8), (166, 7), (166, 8), (167, 7), + (167, 8), (168, 7), (168, 8), (169, 7), (169, 8), (170, 7), (170, 8), (171, 7), (171, 8), (181, 9), + (185, 4), (200, 3), (200, 6), (200, 9), (201, 3), (201, 6), (201, 9), (202, 3), (202, 6), (202, 9), + (203, 3), (203, 6), (203, 9), (204, 3), (204, 6), (204, 9), (205, 3), (205, 6), (205, 9), (206, 3), + (206, 6), (206, 9), (207, 3), (207, 6), (207, 9), (208, 3), (208, 6), (208, 9), (209, 3), (209, 6), + (209, 9), (210, 3), (210, 6), (210, 9), (230, 12), (231, 12), (232, 12), (236, 2), (236, 3), + (236, 4), (236, 5), (237, 2), (237, 3), (237, 4), (237, 5), (238, 2), (238, 3), (238, 4), (238, 5), + (248, 10)], + "Turtle Zone 1": + [(22, 34), (27, 37), (28, 37), (29, 37), (30, 37), (31, 37), (32, 37), (33, 37), (34, 37), + (35, 37), (36, 37), (46, 32), (46, 33), (47, 32), (47, 33), (50, 32), (50, 33), (51, 32), + (51, 33), (54, 32), (54, 33), (55, 32), (55, 33), (56, 33), (57, 33), (58, 32), (58, 33), + (59, 32), (59, 33), (62, 32), (62, 33), (63, 32), (63, 33), (66, 32), (66, 33), (67, 32), + (67, 33), (73, 43), (74, 43), (75, 43), (77, 41), (78, 41), (79, 41), (81, 40), (82, 40), + (83, 40), (85, 41), (86, 41), (87, 41), (122, 36), (123, 36), (124, 36), (125, 36), (126, 36), + (127, 36), (130, 36), (131, 36), (132, 36), (133, 36), (134, 36), (135, 36), (136, 36), (137, 36), + (138, 36), (139, 36), (140, 36), (141, 36), (143, 34), (163, 36), (164, 36), (166, 36), (167, 36), + (169, 36), (170, 36), (180, 37), (181, 37), (182, 37), (183, 37), (184, 37), (185, 37), (188, 44), + (189, 44)], + "Turtle Zone 2": + [(6, 34), (11, 34), (15, 43), (48, 36), (51, 28), (56, 35), (57, 35), (59, 42), (61, 20), (62, 20), + (62, 35), (63, 20), (63, 35), (64, 20), (65, 20), (67, 35), (68, 35), (72, 39), (79, 34), + (82, 35), (87, 42), (96, 43), (105, 43), (107, 43), (109, 43), (118, 28), (121, 28), (139, 39), + (142, 39)], + "Turtle Zone Secret Course": + [(19, 27), (39, 27), (39, 28), (40, 26), (40, 27), (41, 25), (41, 27), (42, 25), (42, 27), + (43, 26), (43, 27), (44, 27), (44, 28), (48, 25), (48, 26), (48, 27), (48, 28), (49, 25), + (49, 27), (50, 25), (50, 27), (51, 25), (51, 27), (52, 26), (52, 28), (53, 27), (61, 25), + (61, 28), (62, 25), (62, 26), (62, 27), (62, 28), (63, 25), (63, 28), (64, 26), (73, 26), + (73, 27), (74, 25), (74, 28), (75, 25), (75, 28), (76, 25), (76, 28), (77, 26), (77, 27), + (82, 25), (82, 26), (82, 27), (82, 28), (83, 28), (84, 28), (85, 28), (87, 27), (89, 27), + (89, 28), (90, 26), (90, 27), (91, 25), (91, 27), (92, 25), (92, 27), (93, 26), (93, 27), + (94, 27), (94, 28), (98, 24), (98, 25), (98, 26), (98, 27), (99, 25), (100, 26), (101, 27), + (102, 24), (102, 25), (102, 26), (102, 27), (108, 24), (108, 25), (108, 26), (108, 27), + (109, 24), (109, 27), (110, 24), (110, 27), (111, 24), (111, 27), (112, 25), (112, 26), + (116, 24), (116, 27), (117, 23), (117, 26), (117, 27), (118, 23), (118, 25), (118, 27), + (119, 23), (119, 25), (119, 27), (120, 24), (120, 27), (121, 28), (122, 28), (123, 28)], + "Turtle Zone 3": + [(16, 25), (17, 25), (18, 25), (19, 25), (20, 25), (21, 25), (22, 25), (23, 25), (24, 25), + (35, 24), (36, 24), (37, 24), (38, 24), (39, 24), (40, 24), (41, 24), (42, 24), (43, 24), + (75, 28), (75, 29), (76, 28), (76, 29), (81, 28), (81, 29), (82, 28), (82, 29), (92, 26), + (93, 26), (94, 26), (98, 26), (99, 26), (100, 26), (123, 26), (124, 26), (126, 26), (127, 26), + (129, 26), (130, 26), (146, 22), (146, 29), (147, 22), (147, 29), (148, 22), (150, 22), (151, 22), + (152, 23), (152, 29), (153, 29), (154, 22), (155, 22), (156, 22), (158, 29), (159, 29), (161, 22), + (162, 22), (163, 22), (165, 22), (166, 22), (167, 22), (169, 22), (170, 22), (171, 22)], + "Mario Zone 1": + [(18, 44), (47, 36), (47, 37), (47, 38), (47, 39), (49, 36), (49, 37), (49, 38), (50, 36), (50, 37), + (50, 38), (52, 36), (52, 37), (52, 38), (53, 36), (53, 37), (53, 38), (60, 35), (60, 36), (60, 37), + (61, 35), (61, 36), (61, 37), (64, 35), (64, 36), (64, 37), (65, 35), (65, 36), (65, 37), (71, 36), + (78, 36), (78, 37), (78, 38), (98, 38), (145, 42), (146, 22), (146, 23), (146, 25), (146, 26), + (146, 42), (147, 22), (147, 23), (147, 25), (147, 26), (147, 30), (147, 31), (147, 32), (147, 42), + (148, 22), (148, 23), (148, 25), (148, 30), (148, 31), (148, 32), (148, 42), (149, 21), (149, 22), + (149, 23), (149, 24), (149, 30), (149, 31), (149, 42), (150, 21), (150, 22), (150, 23), (150, 24), + (150, 26), (150, 27), (150, 28), (150, 30), (150, 31), (150, 42), (151, 27), (151, 28), (151, 30), + (151, 31), (151, 42), (152, 27), (152, 29), (152, 30), (152, 31), (152, 42), (153, 27), (153, 29), + (153, 30), (153, 42), (154, 27), (154, 29), (154, 30), (164, 20), (167, 21), (167, 26), (167, 34), + (168, 21), (168, 25), (168, 27), (168, 33), (168, 35), (169, 20), (169, 24), (169, 28), (169, 33), + (169, 35), (170, 20), (170, 23), (170, 29), (170, 32), (170, 35), (171, 20), (171, 23), (171, 29), + (171, 32), (171, 36), (171, 37), (172, 21), (172, 22), (172, 30), (172, 31)], + "Mario Zone 2": + [(25, 24), (25, 27), (26, 24), (26, 27), (27, 24), (27, 27), (81, 27), (112, 24), (113, 24), + (114, 24), (115, 24), (116, 24), (117, 24), (118, 24), (121, 24), (122, 24), (123, 24), (124, 24), + (125, 24), (126, 24), (127, 24), (138, 26), (139, 26), (140, 24), (140, 28), (141, 24), (141, 28), + (144, 26), (145, 26), (146, 24), (146, 28), (147, 28), (151, 26), (152, 24), (152, 28), (153, 24), + (153, 28), (156, 26), (157, 26), (158, 24), (158, 28), (159, 24), (159, 28), (162, 26), (163, 26), + (164, 28), (165, 28)], + "Mario Zone 3": + [(8, 28), (11, 28), (14, 28), (17, 28), (20, 28), (23, 28), (54, 25), (100, 27), (109, 18), + (109, 19), (110, 18), (110, 19), (111, 17), (111, 18), (111, 19), (112, 17), (112, 18), (112, 19), + (127, 17), (127, 18), (127, 19), (128, 17), (128, 18), (128, 19), (129, 18), (129, 19), (130, 18), + (130, 19), (130, 20), (131, 18), (131, 19), (131, 20), (132, 18), (132, 19), (132, 20), (133, 18), + (133, 19), (133, 20), (133, 27), (134, 18), (134, 19), (134, 20), (157, 28), (158, 28), (159, 28), + (160, 28), (161, 28), (168, 28), (169, 28), (170, 28), (171, 28), (172, 28), (189, 44), (199, 28), + (200, 28), (201, 28), (202, 28), (203, 28), (214, 27), (217, 27), (220, 27), (223, 27)], + "Mario Zone 4": + [(20, 25), (114, 24), (114, 25), (114, 26), (115, 24), (115, 25), (115, 26), (115, 27), (115, 28), + (115, 29), (116, 24), (116, 25), (116, 26), (116, 27), (116, 29), (117, 24), (117, 25), (117, 26), + (117, 27), (117, 28), (117, 29), (118, 24), (118, 25), (118, 26), (118, 27), (118, 28), (118, 29), + (119, 24), (119, 25), (119, 27), (119, 28), (119, 29), (120, 24), (120, 25), (120, 26), (120, 27), + (120, 28), (120, 29), (121, 24), (121, 25), (121, 26), (121, 27), (121, 28), (121, 29), (122, 12), + (122, 24), (122, 25), (122, 26), (122, 27), (122, 29), (123, 12), (123, 24), (123, 25), (123, 26), + (123, 27), (123, 28), (123, 29), (124, 12), (124, 24), (124, 25), (124, 26), (124, 27), (124, 28), + (124, 29), (125, 12), (179, 12)], + "Pumpkin Zone 1": + [(23, 12), (55, 24), (55, 26), (56, 27), (57, 24), (57, 26), (63, 24), (63, 26), (64, 27), + (65, 24), (65, 26), (71, 24), (71, 26), (72, 27), (73, 24), (73, 26), (79, 24), (79, 26), + (80, 27), (81, 24), (81, 26), (86, 25), (86, 27), (92, 4), (93, 27), (95, 25), (95, 27), (98, 4), + (102, 26), (102, 28), (104, 4), (104, 26), (104, 28), (165, 14), (166, 15), (171, 20), (172, 21), + (173, 22), (175, 24), (176, 25), (177, 26), (179, 28), (180, 29), (189, 6)], + "Pumpkin Zone 2": + [(34, 26), (40, 21), (41, 21), (42, 21), (43, 21), (48, 20), (49, 20), (50, 20), (50, 41), + (51, 20), (51, 41), (52, 41), (53, 41), (54, 41), (56, 21), (57, 21), (58, 21), (59, 21), + (61, 41), (62, 41), (64, 20), (65, 20), (66, 20), (67, 20), (114, 36), (115, 35), (115, 36), + (116, 34), (116, 35), (116, 36), (132, 20), (132, 21), (132, 22), (132, 23), (132, 24), + (144, 23), (169, 27)], + "Pumpkin Zone 3": + [(18, 26), (20, 26), (22, 26), (24, 26), (26, 26), (31, 18), (32, 18), (33, 18), (34, 18), + (35, 18), (36, 18), (37, 18), (38, 18), (39, 18), (40, 18), (41, 18), (42, 18), (48, 24), + (52, 20), (52, 24), (56, 24), (87, 27), (88, 27), (89, 27), (90, 27), (94, 27), (95, 27), + (96, 27), (97, 27), (101, 27), (102, 27), (103, 27), (104, 27), (104, 42), (108, 27), (109, 27), + (110, 27), (111, 27), (115, 27), (116, 27), (117, 27), (118, 27), (134, 35), (134, 41), + (135, 35), (135, 41), (136, 35), (136, 41), (137, 35), (137, 41), (138, 35), (138, 41), + (139, 35), (139, 41), (140, 41), (225, 38), (226, 37), (227, 36), (227, 37), (227, 38), + (227, 39), (227, 40), (227, 41), (228, 37), (229, 38)], + "Pumpkin Zone Secret Course 1": + [(14, 15), (16, 9), (16, 10), (16, 11), (16, 12), (16, 13), (16, 14), (16, 15), (16, 16), + (17, 9), (17, 10), (17, 11), (17, 12), (17, 13), (17, 14), (17, 15), (17, 16), (18, 9), + (18, 10), (18, 11), (18, 12), (18, 13), (18, 14), (18, 15), (18, 16), (19, 9), (19, 10), + (19, 11), (19, 12), (19, 13), (19, 14), (19, 15), (19, 16), (20, 9), (20, 10), (20, 11), + (20, 12), (20, 13), (20, 14), (20, 15), (20, 16), (21, 9), (21, 10), (21, 11), (21, 12), + (21, 13), (21, 14), (21, 15), (21, 16), (22, 9), (22, 10), (22, 11), (22, 12), (22, 13), + (22, 14), (22, 15), (22, 16), (23, 9), (23, 10), (23, 11), (23, 12), (23, 13), (23, 14), + (23, 15), (23, 16), (24, 9), (24, 10), (24, 11), (24, 12), (24, 13), (24, 14), (24, 15), + (24, 16), (25, 9), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15), (25, 16), + (26, 9), (26, 10), (26, 11), (26, 12), (26, 13), (26, 14), (26, 15), (27, 16), (28, 9), + (28, 10), (28, 11), (28, 12), (28, 13), (28, 14), (28, 15), (28, 16), (29, 9), (29, 10), + (29, 11), (29, 12), (29, 13), (29, 14), (29, 15), (29, 16), (30, 9), (30, 10), (30, 11), + (30, 12), (30, 13), (30, 14), (30, 15), (30, 16), (31, 9), (31, 10), (31, 11), (31, 12), + (31, 13), (31, 14), (31, 15), (31, 16), (32, 9), (32, 10), (32, 11), (32, 12), (32, 13), + (32, 14), (32, 15), (32, 16), (33, 9), (33, 10), (33, 11), (33, 12), (33, 13), (33, 14), + (33, 15), (33, 16), (34, 9), (34, 10), (34, 11), (34, 12), (34, 13), (34, 14), (34, 15), + (34, 16), (35, 9), (35, 10), (35, 11), (35, 12), (35, 13), (35, 14), (35, 15), (35, 16), + (36, 9), (36, 10), (36, 11), (36, 12), (36, 13), (36, 14), (36, 15), (36, 16), (37, 9), + (37, 10), (37, 11), (37, 12), (37, 13), (37, 14), (37, 15), (37, 16), (39, 16), (40, 9), + (40, 10), (40, 11), (40, 12), (40, 13), (40, 14), (40, 15), (40, 16), (41, 9), (41, 10), + (41, 11), (41, 12), (41, 13), (41, 14), (41, 15), (41, 16), (42, 9), (42, 10), (42, 11), + (42, 12), (42, 13), (42, 14), (42, 15), (42, 16), (43, 9), (43, 10), (43, 11), (43, 12), + (43, 13), (43, 14), (43, 15), (43, 16), (44, 9), (44, 10), (44, 11), (44, 12), (44, 13), + (44, 14), (44, 15), (44, 16), (45, 9), (45, 10), (45, 11), (45, 12), (45, 13), (45, 14), + (45, 15), (45, 16), (46, 9), (46, 10), (46, 11), (46, 12), (46, 13), (46, 14), (46, 15), + (46, 16), (47, 9), (47, 10), (47, 11), (47, 12), (47, 13), (47, 14), (47, 15), (47, 16), + (48, 9), (48, 10), (48, 11), (48, 12), (48, 13), (48, 14), (48, 15), (48, 16), (49, 9), + (49, 10), (49, 11), (49, 12), (49, 13), (49, 14), (49, 15), (49, 16), (52, 9), (52, 10), + (52, 11), (52, 12), (52, 13), (52, 14), (52, 15), (52, 16), (53, 9), (53, 10), (53, 11), + (53, 12), (53, 13), (53, 14), (53, 15), (53, 16), (54, 9), (54, 10), (54, 11), (54, 12), + (54, 13), (54, 14), (54, 15), (54, 16), (55, 9), (55, 10), (55, 11), (55, 12), (55, 13), + (55, 14), (55, 15), (55, 16), (56, 9), (56, 10), (56, 11), (56, 12), (56, 13), (56, 14), + (56, 15), (56, 16), (57, 9), (57, 10), (57, 11), (57, 12), (57, 13), (57, 14), (57, 15), + (57, 16), (58, 9), (58, 10), (58, 11), (58, 12), (58, 13), (58, 14), (58, 15), (58, 16), + (59, 9), (59, 10), (59, 11), (59, 12), (59, 13), (59, 14), (59, 15), (59, 16), (60, 9), + (60, 10), (60, 11), (60, 12), (60, 13), (60, 14), (60, 15), (60, 16), (61, 9), (61, 10), + (61, 11), (61, 12), (61, 13), (61, 14), (61, 15), (61, 16), (64, 9), (64, 10), (64, 11), + (64, 12), (64, 13), (64, 14), (64, 15), (64, 16), (65, 9), (65, 10), (65, 11), (65, 12), + (65, 13), (65, 14), (65, 15), (65, 16), (66, 9), (66, 10), (66, 11), (66, 12), (66, 13), + (66, 14), (66, 15), (66, 16), (67, 9), (67, 10), (67, 11), (67, 12), (67, 13), (67, 14), + (67, 15), (67, 16), (68, 9), (68, 10), (68, 11), (68, 12), (68, 13), (68, 14), (68, 15), + (68, 16), (69, 9), (69, 10), (69, 11), (69, 12), (69, 13), (69, 14), (69, 15), (69, 16), + (70, 9), (70, 10), (70, 11), (70, 12), (70, 13), (70, 14), (70, 15), (70, 16), (71, 9), + (71, 10), (71, 11), (71, 12), (71, 13), (71, 14), (71, 15), (71, 16), (72, 9), (72, 10), + (72, 11), (72, 12), (72, 13), (72, 14), (72, 15), (72, 16), (73, 9), (73, 10), (73, 11), + (73, 12), (73, 13), (73, 14), (73, 15), (73, 16)], + "Pumpkin Zone Secret Course 2": + [(12, 6), (72, 7), (73, 7), (80, 7), (81, 7), (85, 8), (90, 10), (91, 10), (94, 10), + (95, 10), (98, 9), (99, 9), (102, 9), (103, 9)], + "Pumpkin Zone 4": + [(18, 28), (19, 28), (20, 28), (21, 28), (83, 37), (83, 38), (84, 37), (84, 38), (85, 37), + (85, 38), (85, 39), (86, 37), (87, 37), (87, 40), (88, 37), (88, 38), (88, 39), (88, 40), + (89, 37), (89, 38), (89, 39), (89, 40), (90, 37), (90, 38), (91, 37), (91, 38), (92, 37), + (92, 38), (92, 39), (92, 40), (93, 23), (93, 37), (93, 40), (94, 23), (94, 37), (94, 40), + (103, 23), (104, 23), (113, 23), (114, 23), (169, 30), (170, 28), (170, 30), (171, 26), + (171, 28), (171, 30), (172, 24), (172, 26), (172, 28), (172, 30), (173, 24), (173, 26), + (173, 28), (173, 30), (174, 26), (174, 28), (174, 30), (175, 28), (175, 30), (176, 30), + (198, 37), (198, 38), (199, 37), (199, 38), (204, 37), (204, 38), (205, 37), (205, 38), + (210, 37), (210, 38), (211, 37), (211, 38), (216, 37), (216, 38), (217, 37), (217, 38)], + "Macro Zone 1": + [(22, 32), (22, 33), (22, 34), (23, 20), (23, 21), (23, 22), (23, 38), (23, 39), (23, 40), (24, 26), + (24, 27), (24, 28), (39, 42), (40, 41), (41, 40), (42, 39), (49, 43), (62, 42), (62, 43), (62, 44), + (68, 42), (68, 43), (68, 44), (75, 42), (75, 43), (75, 44), (84, 40), (84, 41), (84, 42), (87, 39), + (89, 42), (89, 43), (89, 44), (107, 42), (108, 42), (109, 42), (118, 42), (119, 42), (120, 42), + (121, 42), (122, 42), (128, 42), (128, 43), (130, 42), (130, 43), (134, 42), (134, 43), (140, 42), + (141, 42), (142, 42), (143, 42), (144, 42), (154, 42), (155, 42), (156, 42), (163, 22), (163, 23), + (164, 21), (164, 22), (164, 23), (165, 22), (165, 23), (166, 21), (166, 22), (166, 23), (167, 22), + (167, 23), (168, 21), (168, 22), (168, 23), (169, 22), (169, 23), (170, 21), (170, 22), (170, 23), + (171, 22), (171, 23), (177, 40), (182, 40), (189, 41), (189, 42), (189, 43), (189, 44), (189, 45), + (205, 46), (206, 46), (208, 37), (209, 37), (212, 41), (213, 41), (214, 41), (215, 41), (216, 41), + (220, 37), (221, 37), (224, 46), (225, 46), (234, 43), (246, 38), (246, 39), (246, 40), (246, 41), + (246, 42), (246, 43)], + "Macro Zone 2": + [(18, 28), (19, 27), (22, 28), (23, 27), (25, 26), (27, 27), (28, 27), (31, 27), (32, 27), (41, 29), + (42, 29), (43, 29), (55, 29), (57, 29), (60, 29), (62, 29), (69, 27), (70, 27), (71, 27), (74, 27), + (75, 27), (76, 27), (79, 27), (80, 27), (81, 27), (84, 27), (85, 27), (86, 27), (99, 40), + (137, 37), (180, 40), (181, 8), (182, 8), (183, 8), (184, 8), (185, 8), (186, 8), (187, 8), + (188, 8), (189, 8), (190, 8), (191, 8), (192, 8), (193, 8), (194, 8), (195, 8), (196, 8), (197, 8), + (198, 8), (199, 8), (200, 8), (201, 8), (202, 8), (204, 8), (205, 8), (206, 8), (207, 8), (208, 8), + (209, 8), (210, 8), (211, 8), (212, 8), (213, 8), (215, 8), (216, 8), (217, 8), (217, 11), + (218, 8), (218, 9), (218, 10), (218, 11), (218, 12), (219, 11)], + "Macro Zone 3": + [(24, 23), (37, 28), (38, 28), (39, 28), (40, 28), (57, 30), (58, 30), (59, 30), (65, 17), (65, 18), + (65, 19), (66, 17), (66, 18), (66, 19), (67, 17), (67, 18), (67, 19), (68, 17), (68, 18), (68, 19), + (69, 17), (69, 18), (69, 19), (70, 17), (70, 18), (70, 19), (73, 17), (73, 18), (73, 19), (74, 17), + (74, 18), (74, 19), (75, 17), (75, 18), (75, 19), (76, 17), (76, 18), (76, 19), (77, 17), (77, 18), + (77, 19), (78, 17), (78, 18), (78, 19), (85, 43), (95, 17), (95, 18), (95, 19), (95, 20), (96, 17), + (96, 18), (96, 19), (96, 20), (97, 17), (97, 18), (97, 19), (97, 20), (98, 17), (98, 18), (98, 19), + (98, 20), (100, 17), (100, 18), (100, 19), (100, 20), (101, 17), (101, 18), (101, 19), (101, 20), + (103, 42), (104, 42), (105, 42), (106, 42), (107, 42), (116, 42), (117, 42), (118, 42), (119, 42), + (120, 42), (121, 42), (122, 42), (129, 19), (131, 42), (132, 42), (133, 42), (134, 42), (135, 42), + (136, 42), (165, 21), (165, 22), (166, 21), (166, 22), (171, 21), (171, 22), (172, 21), (172, 22), + (176, 20), (176, 21), (176, 22), (179, 20), (179, 21), (179, 22), (183, 21), (183, 22), (184, 21), + (184, 22), (194, 27), (194, 28), (197, 27), (197, 28), (200, 27), (200, 28), (203, 25), (203, 27), + (203, 28), (205, 18), (205, 19), (206, 18), (206, 19)], + "Macro Zone 4": + [(16, 28), (34, 28), (39, 28), (39, 29), (39, 30), (40, 28), (40, 29), (40, 30), (41, 28), (41, 29), + (41, 30), (62, 29), (63, 29), (64, 29), (65, 29), (66, 29), (67, 29), (68, 29), (69, 29), (81, 17), + (81, 18), (82, 17), (82, 18), (83, 17), (83, 18), (84, 17), (84, 18), (85, 17), (85, 18), (86, 17), + (86, 18), (87, 17), (87, 18), (87, 28), (88, 17), (88, 18), (114, 28), (144, 22), (146, 27), + (146, 28), (147, 27), (147, 28), (148, 27), (148, 28), (149, 27), (149, 28), (150, 27), (150, 28), + (151, 27), (151, 28), (152, 27), (152, 28), (153, 27), (153, 28), (154, 27), (154, 28), (155, 27), + (155, 28), (156, 27), (156, 28), (157, 27), (157, 28), (158, 27), (158, 28)], + "Macro Zone Secret Course": + [(21, 24), (70, 27), (70, 28), (71, 27), (71, 28), (72, 27), (72, 28), (73, 27), (73, 28), + (74, 27), (74, 28), (75, 27), (75, 28), (76, 24), (76, 25), (76, 26), (76, 27), (76, 28), + (77, 24), (77, 25), (77, 26), (77, 27), (77, 28), (78, 24), (78, 25), (78, 26), (78, 27), + (78, 28), (79, 24), (79, 25), (79, 26), (79, 27), (80, 25), (80, 26), (81, 25), (81, 26), + (88, 25), (108, 30)], + "Mario's Castle": + [(7, 25), (160, 44), (167, 28), (247, 26)], +} +powerup_coords = { + "Mushroom Zone": [(42, 28), (151, 28), (152, 28), (188, 28)], + "Scenic Course": [(39, 28), (72, 28), (117, 28)], + "Tree Zone 1": [(119, 28), (152, 28)], + "Tree Zone 2": [(43, 10), (61, 9), (51, 28), (130, 7), (182, 3), (136, 43)], + "Tree Zone Secret Course": [(17, 23), (100, 23), (159, 23)], + "Tree Zone 3": [(26, 40), (77, 24)], + "Tree Zone 4": [(28, 27), (105, 25), (136, 22), (171, 10)], + "Tree Zone 5": [(23, 41), (116, 42), (123, 39), (138, 39), (146, 36)], + "Pumpkin Zone 1": [(23, 12), (72, 27), (98, 4), (189, 6)], + "Pumpkin Zone 2": [(144, 23)], + "Pumpkin Zone Secret Course 1": [(14, 15)], + "Pumpkin Zone 3": [(52, 20), (104, 42), (139, 35), (140, 41)], + "Pumpkin Zone Secret Course 2": [(12, 6), (85, 8)], + "Pumpkin Zone 4": [(83, 38), (94, 40), (104, 23)], + "Mario Zone 1": [(18, 44), (98, 38), (145, 42), (164, 20)], + "Mario Zone 2": [(81, 27)], + "Mario Zone 3": [(54, 25), (100, 27), (134, 18), (189, 44), (214, 27)], + "Mario Zone 4": [(20, 25), (124, 12), (179, 12)], + "Turtle Zone 1": [(22, 34), (56, 33), (57, 33), (143, 34), (189, 44)], + "Turtle Zone 2": [(82, 35), (139, 39), ], + "Turtle Zone Secret Course": [(19, 27), (53, 27), (64, 26), (87, 27), (121, 28), (122, 28), (123, 28)], + "Turtle Zone 3": [(39, 24), (94, 26), (152, 23)], + "Hippo Zone": [(3, 3), (2, 20), (15, 26), (16, 26), (29, 21), (86, 22), (137, 13)], + "Space Zone 1": [(75, 24), (114, 22)], + # "Space Zone Secret Course": [], + "Space Zone 2": [(64, 3), (102, 8), (120, 5), (207, 6), (210, 9), (248, 10)], + "Macro Zone 1": [(49, 43), (87, 39), (177, 40), (164, 21), (166, 21), (170, 21), (234, 43)], + "Macro Zone 2": [(25, 26), (99, 40), (137, 37), (180, 40)], + "Macro Zone 3": [(24, 23), (85, 43), (129, 19), (203, 25)], + "Macro Zone 4": [(16, 28), (87, 28), (144, 22)], + "Macro Zone Secret Course": [(21, 24), (88, 25), (108, 30)], + "Mario's Castle": [(7, 25), (160, 44), (167, 28), (247, 26)] +} +for zone, coords_list in powerup_coords.items(): + for coords in coords_list: + coins_coords[zone].remove(coords) + +location_name_to_id = {location_name: ID for ID, location_name in enumerate(locations, START_IDS)} +loc_id = START_IDS + len(locations) +for level, coin_coords in coins_coords.items(): + for i in range(1, len(coin_coords) + 1): + location_name_to_id[f"{level} - {i} Coin{'s' if i > 1 else ''}"] = loc_id + loc_id += 1 + +# eligible_levels = [0, 1, 2, 3, 5, 8, 9, 11, 13, 14, 16, 19, 20, 22, 23, 25, 30, 31] + +level_id_to_name = { + 0: "Mushroom Zone", 25: "Scenic Course", 1: "Tree Zone 1", 2: "Tree Zone 2", 4: "Tree Zone 3", 3: "Tree Zone 4", + 5: "Tree Zone 5", 29: "Tree Zone Secret Course", 17: "Hippo Zone", 18: "Space Zone 1", + 28: "Space Zone Secret Course", 19: "Space Zone 2", 20: "Macro Zone 1", 21: "Macro Zone 2", 22: "Macro Zone 3", + 23: "Macro Zone 4", 30: "Macro Zone Secret Course", 6: "Pumpkin Zone 1", 7: "Pumpkin Zone 2", + 8: "Pumpkin Zone 3", 9: "Pumpkin Zone 4", 27: "Pumpkin Zone Secret Course 1", 31: "Pumpkin Zone Secret Course 2", + 10: "Mario Zone 1", 11: "Mario Zone 2", 12: "Mario Zone 3", 13: "Mario Zone 4", 14: "Turtle Zone 1", + 15: "Turtle Zone 2", 16: "Turtle Zone 3", 26: "Turtle Zone Secret Course", 24: "Mario's Castle" +} + +level_name_to_id = {name: level_id for level_id, name in level_id_to_name.items()} + +auto_scroll_max = { + "Mushroom Zone": 84, + "Hippo Zone": 160, + "Tree Zone 1": 87, + "Tree Zone 2": 68, + "Tree Zone 3": 4, + "Tree Zone 4": 28, + "Tree Zone 5": 22, + "Space Zone 1": 72, + "Space Zone 2": 113, + "Space Zone Secret Course": 96, + "Macro Zone 1": 74, + "Macro Zone 2": 27, + "Macro Zone 3": 63, + "Macro Zone 4": 59, + "Pumpkin Zone 1": (0, 12), + "Pumpkin Zone 2": 23, + "Pumpkin Zone 3": 50, + "Pumpkin Zone 4": 45, + "Pumpkin Zone Secret Course 1": 172, + "Mario Zone 1": 68, + "Mario Zone 3": 29, + "Mario Zone 4": 60, + "Turtle Zone 1": 66, + "Turtle Zone 2": 8, +} diff --git a/worlds/marioland2/logic.py b/worlds/marioland2/logic.py new file mode 100644 index 0000000000..5405e82877 --- /dev/null +++ b/worlds/marioland2/logic.py @@ -0,0 +1,604 @@ +from .locations import level_name_to_id + + +def is_auto_scroll(state, player, level): + level_id = level_name_to_id[level] + if state.has_any(["Cancel Auto Scroll", f"Cancel Auto Scroll - {level}"], player): + return False + return state.multiworld.worlds[player].auto_scroll_levels[level_id] > 0 + + +def has_pipe_right(state, player): + return state.has_any(["Pipe Traversal - Right", "Pipe Traversal"], player) + + +def has_pipe_left(state, player): + return state.has_any(["Pipe Traversal - Left", "Pipe Traversal"], player) + + +def has_pipe_down(state, player): + return state.has_any(["Pipe Traversal - Down", "Pipe Traversal"], player) + + +def has_pipe_up(state, player): + return state.has_any(["Pipe Traversal - Up", "Pipe Traversal"], player) + + +def has_level_progression(state, item, player, count=1): + return state.count(item, player) + (state.count(item + " x2", player) * 2) >= count + + +def mushroom_zone_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Mushroom Zone") + reachable_coins = 38 + if state.has_any(["Mushroom", "Fire Flower"], player) or not auto_scroll: + # Was able to get all but 1, being lenient. + reachable_coins += 2 + if has_pipe_down(state, player): + # There's 24 in each of the underground sections. + # The first one requires missing some question mark blocks if auto scrolling (the last +4). + # If you go in the second without pipe up, you can get everything except the last 5 plus the ones in the first + # underground section. + reachable_coins += 19 + if has_pipe_up(state, player) or not auto_scroll: + reachable_coins += 5 + if has_pipe_up(state, player): + reachable_coins += 20 + if not auto_scroll: + reachable_coins += 4 + return coins <= reachable_coins + + +def tree_zone_1_coins(state, player, coins): + return coins <= 87 or not is_auto_scroll(state, player, "Tree Zone 1") + + +def tree_zone_2_normal_exit(state, player): + return has_pipe_right(state, player) or state.has("Tree Zone 2 Midway Bell", player) + + +def tree_zone_2_secret_exit(state, player): + return has_pipe_right(state, player) and state.has("Carrot", player) + + +def tree_zone_2_midway_bell(state, player): + return has_pipe_right(state, player) or state.has("Tree Zone 2 Midway Bell", player) + + +def tree_zone_2_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Tree Zone 2") + reachable_coins = 18 + if has_pipe_right(state, player): + reachable_coins += 38 + if state.has("Carrot", player): + reachable_coins += 12 + if not auto_scroll: + reachable_coins += 30 + elif state.has("Tree Zone 2 Midway Bell", player): + reachable_coins = 30 + if not auto_scroll: + reachable_coins += 8 + return coins <= reachable_coins + + +def tree_zone_3_normal_exit(state, player): + return not is_auto_scroll(state, player, "Tree Zone 3") + + +def tree_zone_3_coins(state, player, coins): + if is_auto_scroll(state, player, "Tree Zone 3"): + return coins <= 4 + if coins <= 19: + return True + elif state.has_any(["Mushroom", "Fire Flower"], player) and coins <= 21: + return True + return state.has("Carrot", player) + + +def tree_zone_4_normal_exit(state, player): + return has_pipe_down(state, player) and tree_zone_4_midway_bell(state, player) + + +def tree_zone_4_midway_bell(state, player): + return ((has_pipe_right(state, player) and has_pipe_up(state, player)) + or state.has("Tree Zone 4 Midway Bell", player)) + + +def tree_zone_4_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Tree Zone 4") + reachable_coins = 0 + if has_pipe_up(state, player): + reachable_coins += 14 + if has_pipe_right(state, player): + reachable_coins += 4 + if has_pipe_down(state, player): + reachable_coins += 10 + if not auto_scroll: + reachable_coins += 46 + elif state.has("Tree Zone 4 Midway Bell", player): + if not auto_scroll: + if has_pipe_left(state, player): + reachable_coins += 18 + if has_pipe_down(state, player): + reachable_coins += 10 + if has_pipe_up(state, player): + reachable_coins += 46 + elif has_pipe_down(state, player): + reachable_coins += 10 + return coins <= reachable_coins + + +def tree_zone_5_boss(state, player): + return has_pipe_right(state, player) and (has_pipe_up(state, player) or state.has("Carrot", player)) + + +def tree_zone_5_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Tree Zone 5") + reachable_coins = 0 + if state.has_any(["Mushroom", "Fire Flower"], player): + reachable_coins += 2 + if state.has("Carrot", player): + reachable_coins += 18 + if has_pipe_up(state, player) and not auto_scroll: + reachable_coins += 13 + elif has_pipe_up(state, player): + reachable_coins += 13 + return coins <= reachable_coins + + +def pumpkin_zone_1_normal_exit(state, player): + return pumpkin_zone_1_midway_bell(state, player) + + +def pumpkin_zone_1_midway_bell(state, player): + return ((has_pipe_down(state, player) and not is_auto_scroll(state, player, "Pumpkin Zone 1")) + or state.has("Pumpkin Zone 1 Midway Bell", player)) + + +def pumpkin_zone_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Pumpkin Zone 1") + if auto_scroll: + return coins <= 12 and state.has("Pumpkin Zone 1 Midway Bell", player) + reachable_coins = 0 + if state.has("Pumpkin Zone 1 Midway Bell", player) or has_pipe_down(state, player): + reachable_coins += 38 + if has_pipe_up(state, player): + reachable_coins += 2 + return coins <= reachable_coins + + +def pumpkin_zone_2_normal_exit(state, player): + return has_pipe_down(state, player) and has_pipe_up(state, player) and has_pipe_right(state, player) and state.has( + "Water Physics", player) and not is_auto_scroll(state, player, "Pumpkin Zone 2") + + +def pumpkin_zone_2_secret_exit(state, player): + return pumpkin_zone_2_normal_exit(state, player) and state.has_any(["Mushroom", "Fire Flower"], player) + + +def pumpkin_zone_2_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Pumpkin Zone 2") + reachable_coins = 17 + if has_pipe_down(state, player): + if not auto_scroll: + reachable_coins += 7 + if (has_pipe_up(state, player) or auto_scroll) and state.has("Water Physics", player): + reachable_coins += 6 + if has_pipe_right(state, player) and not auto_scroll: + reachable_coins += 1 + if state.has_any(["Mushroom", "Fire Flower"], player): + reachable_coins += 5 + return coins <= reachable_coins + + +def pumpkin_zone_secret_course_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Pumpkin Zone Secret Course 1") + # We'll be a bit forgiving. I was able to reach 43 while small. + if coins <= 40: + return True + if state.has("Carrot", player): + if auto_scroll: + return coins <= 172 + return True + return False + + +def pumpkin_zone_3_secret_exit(state, player): + return state.has("Carrot", player) + + +def pumpkin_zone_3_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Pumpkin Zone 3") + reachable_coins = 38 + if has_pipe_up(state, player) and ((not auto_scroll) or has_pipe_down(state, player)): + reachable_coins += 12 + if has_pipe_down(state, player) and not auto_scroll: + reachable_coins += 11 + return coins <= reachable_coins + + +def pumpkin_zone_4_boss(state, player): + return has_pipe_right(state, player) + + +def pumpkin_zone_4_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Pumpkin Zone 4") + reachable_coins = 29 + if has_pipe_down(state, player): + if auto_scroll: + if has_pipe_up(state, player): + reachable_coins += 16 + else: + reachable_coins += 4 + else: + reachable_coins += 28 + # both sets of coins are down, but you need pipe up to return to go down to the next set in one playthrough + if has_pipe_up(state, player): + reachable_coins += 16 + return coins <= reachable_coins + + +def mario_zone_1_normal_exit(state, player): + if has_pipe_right(state, player): + if state.has_any(["Mushroom", "Fire Flower", "Carrot", "Mario Zone 1 Midway Bell"], player): + return True + if is_auto_scroll(state, player, "Mario Zone 1"): + return True + return False + + +def mario_zone_1_midway_bell(state, player): + # It is possible to get as small mario, but it is a very precise jump and you will die afterward. + return ((state.has_any(["Mushroom", "Fire Flower", "Carrot"], player) and has_pipe_right(state, player)) + or state.has("Mario Zone 1 Midway Bell", player)) + + +def mario_zone_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Mario Zone 1") + reachable_coins = 0 + if has_pipe_right(state, player) or (has_pipe_left(state, player) + and state.has("Mario Zone 1 Midway Bell", player) and not auto_scroll): + reachable_coins += 32 + if has_pipe_right(state, player) and (state.has_any(["Mushroom", "Fire Flower", "Carrot"], player) + or not auto_scroll): + reachable_coins += 8 + # coins from end section. I was able to get 13 as small mario, giving some leniency + if state.has("Carrot", player): + reachable_coins += 28 + else: + reachable_coins += 12 + if state.has("Fire Flower", player) and not auto_scroll: + reachable_coins += 46 + return coins <= reachable_coins + + +def mario_zone_3_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Mario Zone 3") + reachable_coins = 10 + if state.has("Carrot", player): + reachable_spike_coins = 15 + else: + sprites = state.multiworld.worlds[player].sprite_data["Mario Zone 3"] + reachable_spike_coins = min(3, len({sprites[i]["sprite"] == "Claw Grabber" for i in (17, 18, 25)}) + + state.has("Mushroom", player) + state.has("Fire Flower", player)) * 5 + reachable_coins += reachable_spike_coins + if not auto_scroll: + reachable_coins += 10 + if state.has("Fire Flower", player): + reachable_coins += 22 + if auto_scroll: + reachable_coins -= 3 + reachable_spike_coins + return coins <= reachable_coins + + +def mario_zone_4_boss(state, player): + return has_pipe_right(state, player) + + +def mario_zone_4_coins(state, player, coins): + return coins <= 60 or not is_auto_scroll(state, player, "Mario Zone 4") + + +def not_blocked_by_sharks(state, player): + sharks = [state.multiworld.worlds[player].sprite_data["Turtle Zone 1"][i]["sprite"] + for i in (27, 28)].count("Shark") + if state.has("Carrot", player) or not sharks: + return True + if sharks == 2: + return state.has_all(["Mushroom", "Fire Flower"], player) + if sharks == 1: + return state.has_any(["Mushroom", "Fire Flower"], player) + return False + + +def turtle_zone_1_normal_exit(state, player): + return not_blocked_by_sharks(state, player) + + +def turtle_zone_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Turtle Zone 1") + reachable_coins = 30 + if not_blocked_by_sharks(state, player): + reachable_coins += 13 + if auto_scroll: + reachable_coins -= 1 + if state.has("Water Physics", player) or state.has("Carrot", player): + reachable_coins += 10 + if state.has("Carrot", player): + reachable_coins += 24 + if auto_scroll: + reachable_coins -= 10 + return coins <= reachable_coins + + +def turtle_zone_2_normal_exit(state, player): + return (has_pipe_up(state, player) and has_pipe_down(state, player) and has_pipe_right(state, player) and + has_pipe_left(state, player) and state.has("Water Physics", player) + and not is_auto_scroll(state, player, "Turtle Zone 2")) + + +def turtle_zone_2_secret_exit(state, player): + return (has_pipe_up(state, player) and state.has("Water Physics", player) + and not is_auto_scroll(state, player, "Turtle Zone 2")) + + +def turtle_zone_2_midway_bell(state, player): + return ((state.has("Water Physics", player) and not is_auto_scroll(state, player, "Turtle Zone 2")) + or state.has("Turtle Zone 2 Midway Bell", player)) + + +def turtle_zone_2_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Turtle Zone 2") + reachable_coins = 2 + if auto_scroll: + if state.has("Water Physics", player): + reachable_coins += 6 + else: + reachable_coins += 2 + if state.has("Water Physics", player): + reachable_coins += 20 + elif state.has("Turtle Zone 2 Midway Bell", player): + reachable_coins += 4 + if (has_pipe_right(state, player) and has_pipe_down(state, player) + and state.has_any(["Water Physics", "Turtle Zone 2 Midway Bell"], player)): + reachable_coins += 1 + if has_pipe_left(state, player) and has_pipe_up(state, player): + reachable_coins += 1 + if state.has("Water Physics", player): + reachable_coins += 1 + return coins <= reachable_coins + + +def turtle_zone_secret_course_normal_exit(state, player): + return state.has_any(["Fire Flower", "Carrot"], player) + + +def turtle_zone_secret_course_coins(state, player, coins): + reachable_coins = 53 + if state.has("Carrot", player): + reachable_coins += 44 + elif state.has("Fire Flower", player): + reachable_coins += 36 # was able to get 38, some leniency + return coins <= reachable_coins + + +def turtle_zone_3_boss(state, player): + return has_pipe_right(state, player) + + +def turtle_zone_3_coins(state, player, coins): + return state.has_any(["Water Physics", "Mushroom", "Fire Flower", "Carrot"], player) or coins <= 51 + + +def hippo_zone_normal_or_secret_exit(state, player): + return (state.has_any(["Hippo Bubble", "Water Physics"], player) + or (state.has("Carrot", player) + and not is_auto_scroll(state, player, "Hippo Zone"))) + + +def hippo_zone_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Hippo Zone") + # This is all somewhat forgiving. + reachable_coins = 4 + if auto_scroll: + if state.has("Hippo Bubble", player): + reachable_coins = 160 + elif state.has("Carrot", player): + reachable_coins = 90 + elif state.has("Water Physics", player): + reachable_coins = 28 + else: + if state.has_any(["Water Physics", "Hippo Bubble", "Carrot"], player): + reachable_coins += 108 + if state.has_any(["Mushroom", "Fire Flower", "Hippo Bubble"], player): + reachable_coins += 6 + if state.has_all(["Fire Flower", "Water Physics"], player): + reachable_coins += 1 + if state.has("Hippo Bubble", player): + reachable_coins += 52 + return coins <= reachable_coins + + +def space_zone_1_normal_exit(state, player): + # It is possible, however tricky, to beat the Moon Stage without Carrot or Space Physics. + # However, it requires somewhat precisely jumping off enemies. Enemy shuffle may make this impossible. + # Instead, I will just always make one or the other required, since it is difficult without them anyway. + return state.has_any(["Space Physics", "Carrot"], player) + + +def space_zone_1_secret_exit(state, player): + # One or the other is actually necessary for the secret exit. + return state.has_any(["Space Physics", "Carrot"], player) and not is_auto_scroll(state, player, "Space Zone 1") + + +def space_zone_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Space Zone 1") + if auto_scroll: + reachable_coins = 12 + if state.has_any(["Carrot", "Space Physics"], player): + reachable_coins += 20 + # If you have Space Physics, you can't make it up to the upper section. We have to assume you might have it, + # so the coins up there must be out of logic if there is auto scrolling. + if state.has("Space Physics", player): + reachable_coins += 40 + return coins <= reachable_coins + return (coins <= 21 or (coins <= 50 and state.has_any(["Mushroom", "Fire Flower"], player)) + or state.has_any(["Carrot", "Space Physics"], player)) + + +def space_zone_2_midway_bell(state, player): + return state.has_any(["Space Physics", "Space Zone 2 Midway Bell", "Mushroom", "Fire Flower", "Carrot"], player) + + +def space_zone_2_boss(state, player): + if has_pipe_right(state, player): + if state.has("Space Physics", player): + return True + if (state.has("Space Zone 2 Midway Bell", player) + or not state.multiworld.worlds[player].options.shuffle_midway_bells): + # Reaching the midway bell without space physics requires taking damage once. Reaching the end pipe from the + # midway bell also requires taking damage once. + if state.has_any(["Mushroom", "Fire Flower", "Carrot"], player): + return True + else: + # With no midway bell, you'll have to be able to take damage twice. + if state.has("Mushroom", player) and state.has_any(["Fire Flower", "Carrot"], player): + return True + return False + + +def space_zone_2_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Space Zone 2") + reachable_coins = 12 + if state.has_any(["Mushroom", "Fire Flower", "Carrot", "Space Physics"], player): + reachable_coins += 15 + if state.has("Space Physics", player) or not auto_scroll: + reachable_coins += 4 # last few bottom row question mark blocks that are hard to get when auto scrolling. + if (state.has("Space Physics", player) or ( + state.has("Mushroom", player) and state.has_any(["Fire Flower", "Carrot"], player))): + reachable_coins += 3 + if state.has("Space Physics", player): + reachable_coins += 79 + if not auto_scroll: + reachable_coins += 21 + return coins <= reachable_coins + + +def space_zone_secret_course_coins(state, player, coins): + return coins <= 96 or not is_auto_scroll(state, player, "Space Zone Secret Course") + + +def macro_zone_1_normal_exit(state, player): + return has_pipe_down(state, player) or state.has("Macro Zone 1 Midway Bell", player) + + +def macro_zone_1_secret_exit(state, player): + return state.has("Fire Flower", player) and has_pipe_up(state, player) and macro_zone_1_midway_bell(state, player) + + +def macro_zone_1_midway_bell(state, player): + return has_pipe_down(state, player) or state.has("Macro Zone 1 Midway Bell", player) + + +def macro_zone_1_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Macro Zone 1") + reachable_coins = 0 + if has_pipe_down(state, player): + reachable_coins += 69 + if auto_scroll: + if state.has_any(["Mushroom", "Fire Flower"], player): + reachable_coins += 5 + else: + reachable_coins += 9 + if state.has("Fire Flower", player): + reachable_coins += 19 + elif state.has("Macro Zone 1 Midway Bell", player): + if auto_scroll: + reachable_coins += 16 + if state.has_any(["Mushroom", "Fire Flower"], player): + reachable_coins += 5 + else: + reachable_coins += 67 + return coins <= reachable_coins + + +def macro_zone_secret_course_coins(state, player, coins): + return state.has_any(["Mushroom", "Fire Flower"], player) + + +def macro_zone_2_normal_exit(state, player): + return (has_pipe_down(state, player) or state.has("Macro Zone 2 Midway Bell", player)) and state.has( + "Water Physics", player) and has_pipe_up(state, player) and not is_auto_scroll(state, player, "Macro Zone 2") + + +def macro_zone_2_midway_bell(state, player): + return ((has_pipe_down(state, player) and state.has("Water Physics", player)) + or state.has("Macro Zone 2 Midway Bell", player)) + + +def macro_zone_2_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Macro Zone 2") + if coins <= 27: + return True + if has_pipe_up(state, player) and state.has("Water Physics", player) and not auto_scroll: + if has_pipe_down(state, player): + return True + if state.has("Macro Zone 2 Midway Bell", player): + # Cannot return to the first section from the bell + return coins <= 42 + return False + + +def macro_zone_3_normal_exit(state, player): + return ((has_pipe_down(state, player) and has_pipe_up(state, player)) + or state.has("Macro Zone 3 Midway Bell", player)) + + +def macro_zone_3_midway_bell(state, player): + return macro_zone_3_normal_exit(state, player) + + +def macro_zone_3_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Macro Zone 3") + reachable_coins = 7 + if not auto_scroll: + reachable_coins += 17 + if has_pipe_up(state, player) and has_pipe_down(state, player): + if auto_scroll: + reachable_coins += 56 + else: + return True + elif has_pipe_up(state, player): + if auto_scroll: + reachable_coins += 12 + else: + reachable_coins += 36 + elif has_pipe_down(state, player): + reachable_coins += 18 + if state.has("Macro Zone 3 - Midway Bell", player): + reachable_coins = max(reachable_coins, 30) + return coins <= reachable_coins + + +def macro_zone_4_boss(state, player): + return has_pipe_right(state, player) + + +def macro_zone_4_coins(state, player, coins): + auto_scroll = is_auto_scroll(state, player, "Macro Zone 4") + reachable_coins = 61 + if auto_scroll: + reachable_coins -= 8 + if state.has("Carrot", player): + reachable_coins += 6 + return coins <= reachable_coins + + +def marios_castle_wario(state, player): + return ((has_pipe_right(state, player) and has_pipe_left(state, player)) + or state.has("Mario's Castle Midway Bell", player)) + + +def marios_castle_midway_bell(state, player): + return ((has_pipe_right(state, player) and has_pipe_left(state, player)) + or state.has("Mario's Castle Midway Bell", player)) diff --git a/worlds/marioland2/options.py b/worlds/marioland2/options.py new file mode 100644 index 0000000000..dfe5d6a6b6 --- /dev/null +++ b/worlds/marioland2/options.py @@ -0,0 +1,198 @@ +from Options import Toggle, Choice, NamedRange, Range, PerGameCommonOptions, ItemsAccessibility +from dataclasses import dataclass + + +class ShuffleGoldenCoins(Choice): + """ + Vanilla: Golden Coins are received when defeating bosses. + Shuffle: Shuffle the Golden Coins into the item pool and make bosses location checks. + Mario Coin Fragment Hunt: You start with all Golden Coins except the Mario Coin, which has been fragmented into many pieces. + You will see a Golden Coin being received when defeating bosses regardless of whether you are actually getting a coin. + """ + display_name = "Shuffle Golden Coins" + default = 0 + option_vanilla = 0 + option_shuffle = 1 + option_mario_coin_fragment_hunt = 2 + + +class GoldenCoinsRequired(Range): + """ + Number of Golden Coins required to enter Mario's Castle. Ignored on Mario Coin Fragment Hunt. + """ + display_name = "Golden Coins Required" + range_start = 0 + range_end = 6 + default = 6 + + +class MarioCoinFragmentPercentage(Range): + """ + Percentage of filler items to be replaced with Mario Coin Fragments. Note that the Coinsanity and Coinsanity + Checks options will greatly impact the number of replaceable filler items. + """ + display_name = "Mario Coin Fragment Percentage" + range_start = 1 + range_end = 50 + default = 20 + + +class MarioCoinFragmentsRequiredPercentage(Range): + """ + Percentage of the Mario Coins in the item pool that are required to put the Mario Coin together. + """ + display_name = "Mario Coin Fragments Required Percentage" + range_start = 1 + range_end = 100 + default = 75 + + +class ShuffleMidwayBells(Toggle): + """ + Shuffle Midway Bells into the item pool. You can always start at the beginning of a level after obtaining the + Midway Bell by holding SELECT while entering the level (until you load into the level). + The Midway Bells in levels will trigger location checks whether this option is on or not, but they will only + set the checkpoint if this is off, otherwise you must obtain the Midway Bell item from the item pool. + """ + display_name = "Shuffle Midway Bells" + + +class MariosCastleMidwayBell(Toggle): + """ + Adds a Midway Bell to the final stage, just before the Wario fight. + """ + display_name = "Mario's Castle Midway Bell" + + +class Coinsanity(Toggle): + """ + Shuffles the singular coins found freestanding and in question mark blocks into the item pool, and adds location + checks made by obtaining a sufficient number of coins in particular levels within a single playthrough. + """ + display_name = "Coinsanity" + + +class CoinsanityChecks(Range): + """ + Number of Coinsanity checks. + A higher number means more checks, and smaller coin amounts per coin item in the item pool. + If Accessibility is set to Full, auto-scroll levels may have a lower maximum count, which may lead to this + value being limited. + """ + display_name = "Coinsanity Checks" + range_start = 31 + range_end = 2597 + default = 150 + + +class DifficultyMode(Choice): + """ + Play in normal or easy mode. You can also start in Normal Mode with an "upgrade" to Easy Mode in the item pool, + or start in Easy Mode with a Normal Mode "trap" in the item pool. + """ + display_name = "Difficulty Mode" + option_normal = 0 + option_easy = 1 + option_normal_to_easy = 2 + option_easy_to_normal = 3 + default = 0 + + +class ShufflePipeTraversal(Choice): + """ + Single: Shuffle a Pipe Traversal item into the item pool, which is required to enter any pipes. + Split: Shuffle 4 Pipe Traversal items, one required for entering pipes from each direction. + Note that being unable to enter pipes is very limiting and affects nearly half of all levels. + """ + display_name = "Shuffle Pipe Traversal" + option_off = 0 + option_single = 1 + option_split = 2 + default = 0 + + +class RandomizeEnemies(Toggle): + """ + Randomize enemies throughout levels. + """ + display_name = "Randomize Enemies" + + +class RandomizePlatforms(Toggle): + """ + Randomize platforms throughout levels. + """ + display_name = "Randomize Platforms" + + +class AutoScrollChances(NamedRange): + """ + Chance per eligible level to be made into an auto scroll level. Can also set to Vanilla to leave them unchanged. + """ + display_name = "Auto Scroll Chance" + range_start = 0 + range_end = 100 + special_range_names = {"vanilla": -1, "none": 0, "all": 100} + default = -1 + + +class AutoScrollMode(Choice): + """ + Always: Any auto scroll levels will always auto-scroll. + Global Trap Item: Auto scroll levels will only auto-scroll after obtaining the Auto Scroll trap item. + Level Trap Items: As with Trap Item, but there is a separate trap item for each auto scroll level. + Global Cancel Item: Auto Scroll levels will stop auto-scrolling after obtaining the Auto Scroll Cancel item. + Level Cancel Items: As with Cancel Item, but there is a separate cancel item for each auto scroll level. + Chaos: Each level will randomly always auto scroll, have an Auto Scroll Trap, or have an Auto Scroll Cancel item. + The effects of Trap and Cancel items are permanent! If Accessibility is not set to Full, + Traps may cause locations to become permanently unreachable. + With individual level items, the number of auto scroll levels may be limited by the available space in the item + pool. + """ + display_name = "Auto Scroll Mode" + option_always = 0 + option_global_trap_item = 1 + option_level_trap_items = 2 + option_global_cancel_item = 3 + option_level_cancel_items = 4 + option_chaos = 5 + default = 0 + + +class RandomizeMusic(Toggle): + """ + Randomize the music that plays in levels and overworld areas. + """ + display_name = "Randomize Music" + + +class EnergyLink(Toggle): + """ + All extra lives beyond 1 are transferred into the server's shared EnergyLink storage. If you drop to 0, + 1 will be replenished if there is sufficient energy stored. + """ + display_name = "Energy Link" + default = 1 + + + + +@dataclass +class SML2Options(PerGameCommonOptions): + accessibility: ItemsAccessibility + shuffle_golden_coins: ShuffleGoldenCoins + required_golden_coins: GoldenCoinsRequired + mario_coin_fragment_percentage: MarioCoinFragmentPercentage + mario_coin_fragments_required_percentage: MarioCoinFragmentsRequiredPercentage + coinsanity: Coinsanity + coinsanity_checks: CoinsanityChecks + shuffle_midway_bells: ShuffleMidwayBells + marios_castle_midway_bell: MariosCastleMidwayBell + shuffle_pipe_traversal: ShufflePipeTraversal + auto_scroll_mode: AutoScrollMode + auto_scroll_chances: AutoScrollChances + difficulty_mode: DifficultyMode + randomize_enemies: RandomizeEnemies + randomize_platforms: RandomizePlatforms + randomize_music: RandomizeMusic + energy_link: EnergyLink diff --git a/worlds/marioland2/rom.py b/worlds/marioland2/rom.py new file mode 100644 index 0000000000..2a19a9cb8c --- /dev/null +++ b/worlds/marioland2/rom.py @@ -0,0 +1,146 @@ +import hashlib +import os +import pkgutil + +import Utils + +from worlds.Files import APProcedurePatch, APTokenMixin, APTokenTypes +from settings import get_settings + +from .rom_addresses import rom_addresses +from .sprites import sprite_name_to_id + + +def randomize_music(patch, random): + # overworld + overworld_music_tracks = [0x05, 0x06, 0x0D, 0x0E, 0x10, 0x12, 0x1B, 0x1C, 0x1E] + random.shuffle(overworld_music_tracks) + for i, track in zip([0x3004F, 0x3EA9B, 0x3D186, 0x3D52B, 0x3D401, 0x3D297, 0x3D840, 0x3D694, 0x3D758], + overworld_music_tracks): + patch.write_bytes(i, track) + # levels + for i in range(0x5619, 0x5899, 0x14): + patch.write_bytes(i, random.choice([0x01, 0x0B, 0x11, 0x13, 0x14, 0x17, 0x1D, 0x1F, 0x28])) + + +def generate_output(self, output_directory: str): + + patch = SuperMarioLand2ProcedurePatch(player=self.player, player_name=self.player_name) + + patch.write_file("basepatch.bsdiff4", pkgutil.get_data(__name__, "basepatch.bsdiff4")) + random = self.random + + if self.options.marios_castle_midway_bell: + # Remove Question Mark Block + patch.write_bytes(0x4F012, 0x5D) + # Fix level pointer to read midway bell flag + patch.write_bytes(0x3E569, 0x18) + patch.write_bytes(0x3E56A, 0x18) + # Position and screen coordinates + patch.write_bytes(0x383B, [0xD4, 0x01, 0x4D, 0x0A, 0xC0, 0x01, 0x50, 0x0A]) + + if self.options.coinsanity: + # Add platform to return to start of Pumpkin Zone Secret Course 1 + patch.write_bytes(0x258B6, 0x3B) + patch.write_bytes(0x258F8, 0x7a) + patch.write_bytes(0x2594D, 0x67) + patch.write_bytes(0x259A8, 0x68) + patch.write_bytes(0x259A9, 0x60) + + i = 0xe077 + for level, sprites in self.sprite_data.items(): + for sprite_data in sprites: + sprite_id = sprite_name_to_id[sprite_data["sprite"]] + data = [((sprite_id & 0b01000000) >> 2) | ((sprite_id & 0b00111000) << 2) | sprite_data["screen"], + ((sprite_id & 0b00000111) << 5) | sprite_data["x"], + sprite_data["misc"] | sprite_data["y"]] + patch.write_bytes(i, data) + i += 3 + patch.write_bytes(i, 255) + i += 1 + + if self.options.randomize_music: + randomize_music(patch, random) + + if self.options.shuffle_golden_coins: + patch.write_bytes(rom_addresses["Coin_Shuffle"], 0x40) + if self.options.shuffle_midway_bells: + patch.write_bytes(rom_addresses["Disable_Midway_Bell"], 0xC9) + + if self.options.coinsanity: + for section in ("A", "B"): + for i in range(0, 30): + patch.write_bytes(rom_addresses[f"Coinsanity_{section}"] + i, 0x00) + + star_count = max(len([loc for loc in self.multiworld.get_filled_locations() if loc.item.player == self.player + and loc.item.name == "Super Star Duration Increase"]), 1) + patch.write_bytes(rom_addresses["Star_Count"], star_count // 256) + patch.write_bytes(rom_addresses["Star_Count"] + 1, star_count - (star_count // 256)) + if self.options.shuffle_golden_coins == "mario_coin_fragment_hunt": + patch.write_bytes(rom_addresses["Coins_Required"], self.coin_fragments_required // 256) + patch.write_bytes(rom_addresses["Coins_Required"] + 1, self.coin_fragments_required % 256) + patch.write_bytes(rom_addresses["Required_Golden_Coins"], 6) + else: + patch.write_bytes(rom_addresses["Coins_Required"] + 1, self.options.required_golden_coins.value) + patch.write_bytes(rom_addresses["Required_Golden_Coins"], self.options.required_golden_coins.value) + patch.write_bytes(rom_addresses["Midway_Bells"], self.options.shuffle_midway_bells.value) + patch.write_bytes(rom_addresses["Energy_Link"], self.options.energy_link.value) + patch.write_bytes(rom_addresses["Difficulty_Mode"], self.options.difficulty_mode.value) + patch.write_bytes(rom_addresses["Coin_Mode"], self.options.shuffle_golden_coins.value) + + for level, i in enumerate(self.auto_scroll_levels): + # We set 0 if no auto scroll or auto scroll trap, so it defaults to no auto scroll. 1 if always or cancel items. + patch.write_bytes(rom_addresses["Auto_Scroll_Levels"] + level, max(0, i - 1)) + patch.write_bytes(rom_addresses["Auto_Scroll_Levels_B"] + level, i) + + if self.options.energy_link: + # start with 1 life if Energy Link is on so that you don't deposit lives at the start of the game. + patch.write_bytes(rom_addresses["Starting_Lives"], 1) + + rom_name = bytearray(f'AP{Utils.__version__.replace(".", "")[0:3]}_{self.player}_{self.multiworld.seed:11}\0', + 'utf8')[:21] + rom_name.extend([0] * (21 - len(rom_name))) + patch.write_bytes(0x77777, rom_name) + patch.write_file("tokens.bin", patch.get_token_binary()) + patch.write(os.path.join(output_directory, + f"{self.multiworld.get_out_file_name_base(self.player)}{patch.patch_file_ending}")) + + +class SuperMarioLand2ProcedurePatch(APProcedurePatch, APTokenMixin): + hash = "a8413347d5df8c9d14f97f0330d67bce" + patch_file_ending = ".apsml2" + game = "Super Mario Land 2" + result_file_ending = ".gb" + procedure = [ + ("apply_bsdiff4", ["basepatch.bsdiff4"]), + ("apply_tokens", ["tokens.bin"]), + ] + + @classmethod + def get_source_data(cls) -> bytes: + return get_base_rom_bytes() + + def write_bytes(self, offset, value): + if isinstance(value, int): + value = [value] + self.write_token(APTokenTypes.WRITE, offset, bytes(value)) + + +def get_base_rom_bytes(): + file_name = get_base_rom_path() + with open(file_name, "rb") as file: + base_rom_bytes = bytes(file.read()) + + basemd5 = hashlib.md5() + basemd5.update(base_rom_bytes) + if SuperMarioLand2ProcedurePatch.hash != basemd5.hexdigest(): + raise Exception("Supplied Base Rom does not match known MD5 for Super Mario Land 1.0. " + "Get the correct game and version, then dump it") + return base_rom_bytes + + +def get_base_rom_path(): + file_name = get_settings()["sml2_options"]["rom_file"] + if not os.path.exists(file_name): + file_name = Utils.user_path(file_name) + return file_name \ No newline at end of file diff --git a/worlds/marioland2/rom_addresses.py b/worlds/marioland2/rom_addresses.py new file mode 100644 index 0000000000..e4b4f69cd7 --- /dev/null +++ b/worlds/marioland2/rom_addresses.py @@ -0,0 +1,39 @@ +rom_addresses = { + "Space_Physics": 0x4e7, + "Pipe_Traversal_A": 0x11a4, + "Pipe_Traversal_SFX_A": 0x11a9, + "Pipe_Traversal_B": 0x11d6, + "Pipe_Traversal_SFX_B": 0x11e7, + "Pipe_Traversal_C": 0x1226, + "Pipe_Traversal_SFX_C": 0x123f, + "Pipe_Traversal_D": 0x1256, + "Pipe_Traversal_SFX_D": 0x125b, + "Enable_Swim": 0x1d17, + "Coinsanity_B": 0x1d86, + "Auto_Scroll_Levels": 0x1f71, + "Starting_Lives": 0x2920, + "Get_Hurt_To_Big_Mario": 0x31c7, + "Get_Mushroom_A": 0x345c, + "Get_Fire_Flower_A": 0x346d, + "Get_Carrot_A": 0x347e, + "Invincibility_Star_A": 0x349e, + "Invincibility_Star_B": 0x34a3, + "Enable_Bubble": 0x34e5, + "Coinsanity_A": 0x591f, + "Coin_Shuffle": 0x304ce, + "Required_Golden_Coins": 0x306e9, + "Disable_Midway_Bell": 0x3ef1e, + "Get_Carrot_C": 0x6092f, + "Get_Mushroom_C": 0x60930, + "Get_Fire_Flower_C": 0x60933, + "Get_Mushroom_B": 0x60ddb, + "Get_Carrot_B": 0x60de7, + "Get_Fire_Flower_B": 0x60df3, + "Coins_Required": 0x80139, + "Difficulty_Mode": 0x8013b, + "Star_Count": 0x8013c, + "Midway_Bells": 0x8013e, + "Energy_Link": 0x8013f, + "Coin_Mode": 0x80140, + "Auto_Scroll_Levels_B": 0x80141, +} diff --git a/worlds/marioland2/sprite_randomizer.py b/worlds/marioland2/sprite_randomizer.py new file mode 100644 index 0000000000..8440da2b37 --- /dev/null +++ b/worlds/marioland2/sprite_randomizer.py @@ -0,0 +1,131 @@ +# Based on SML2R enemy and platform randomizer +# # https://github.com/slashinfty/sml2r-node/blob/862128c73d336d6cbfbf6290c09f3eff103688e8/src/index.ts#L284 + +def randomize_enemies(sprite_data, random): + for level, level_sprite_data in sprite_data.items(): + shuffle = () + if level in ("Mushroom Zone", "Macro Zone 4"): + shuffle = ("Koopa Troopa", "Goomba", "Paragoomba (Vertical)", "Paragoomba (Diagonal)") + elif level in ("Scenic Course", "Pumpkin Zone Secret Course 1"): + shuffle = ("Goomba", "Paragoomba (Vertical)", "Paragoomba (Diagonal)") + elif level == "Tree Zone 1": + shuffle = ("Money Bag/Bopping Toady", "Ragumo/Aqua Kuribo", "Pencil/Spikey", "Kyotonbo") + elif level == "Tree Zone 2": + shuffle = ("Noko Bombette/Bear", "No 48/Mogyo") + elif level == "Tree Zone 3": + shuffle = ("Battle Beetle", "Be", "Ant") + elif level == "Tree Zone 5": + shuffle = ("Paragoomba (Diagonal)", "Dondon", "Paragoomba (Vertical)") + elif level == "Pumpkin Zone 2": + shuffle = ("Boo/Bomubomu", "Kyororo", "Honebon/F Boy", "Karakara", "Star (Vertical)/Blurp (Horizontal)", + "Star (Horizontal)/Blurp (Vertical)") + elif level == "Pumpkin Zone 3": + shuffle = ("Boo/Bomubomu", "Unibo/Terekuribo") + elif level == "Mario Zone 1": + shuffle = ("Koopa Troopa", "Neiji/Buichi", "Tatenoko") + elif level == "Mario Zone 2": + shuffle = ("Paragoomba (Diagonal)", "Goomba", "Paragoomba (Vertical)", "Noko Bombette/Bear", + "Boo/Bomubomu") + elif level == "Turtle Zone 1": + shuffle = ("Horizontal Blurp", "Shark", "Cheep Cheep (Vertical)", "Paragoomba (Diagonal)", "Goomba", + "Spiny Cheep Cheep", "Paragoomba (Vertical)", + "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)") + elif level == "Hippo Zone": + shuffle = ("Horizontal Blurp", "Dondon", "Unibo/Terekuribo", "Toriuo") + elif level == "Space Zone 2": + shuffle = ("Tosenbo/Pikku", "Star (Vertical)/Blurp (Horizontal)", "Star (Horizontal)/Blurp (Vertical)") + elif level == "Macro Zone 1": + shuffle = ("Kyotonbo", "Goronto", "Dokanto", "Chikunto") + elif level == "Macro Zone 2": + shuffle = ("Cheep Cheep (Vertical)", "Battle Beetle", "Be", + "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "Ant") + elif level == "Macro Zone 3": + shuffle = ("Koopa Troopa", "Paragoomba (Diagonal)", "Goomba", "Be", "Paragoomba (Vertical)", + "Honebon/F Boy") + elif level == "Pumpkin Zone Secret Course 2": + shuffle = ("Koopa Troopa", "Goomba") + for sprite in level_sprite_data: + if level == "Pumpkin Zone 1": + if sprite["sprite"] == "Falling Spike": + shuffle = ("Boo/Bomubomu", "Falling Spike", "Kurokyura/Jack-in-the-Box", "Masked Ghoul/Bullet Bill") + elif sprite["sprite"] == "Falling Spike on Chain": + shuffle = ("Boo/Bomubomu", "Falling Spike on Chain", "Kurokyura/Jack-in-the-Box", + "Masked Ghoul/Bullet Bill") + else: + shuffle = ("Boo/Bomubomu", "Kurokyura/Jack-in-the-Box", "Masked Ghoul/Bullet Bill") + elif level == "Pumpkin Zone 4": + if sprite["sprite"] == "Falling Spike on Chain": + shuffle = ("Boo/Bomubomu", "Falling Spike on Chain", "Masked Ghoul/Bullet Bill", "Rerere/Poro", + "Tosenbo/Pikku") + else: + shuffle = ("Boo/Bomubomu", "Masked Ghoul/Bullet Bill", "Rerere/Poro", "Tosenbo/Pikku") + elif level == "Mario Zone 3": + if sprite["sprite"] == "Claw Grabber": + shuffle = ("Koopa Troopa", "Diagonal Ball on Chain", "Kiddokatto", "Claw Grabber", + "Masked Ghoul/Bullet Bill") + elif sprite["sprite"] in ("Koopa Troopa", "Diagonal Ball on Chain", "Kiddokatto"): + shuffle = ("Koopa Troopa", "Diagonal Ball on Chain", "Kiddokatto", "Masked Ghoul/Bullet Bill") + else: + shuffle = () + elif level == "Mario Zone 4": + if sprite["sprite"] == "Spinning Spike/Tamara": + shuffle = ("Goomba", "Spinning Spike/Tamara", "Boo/Bomubomu", "Masked Ghoul/Bullet Bill") + elif sprite["sprite"] == "Moving Saw (Floor)": + shuffle = ("Goomba", "Moving Saw (Floor)", "Boo/Bomubomu", "Masked Ghoul/Bullet Bill") + else: + shuffle = ("Goomba", "Boo/Bomubomu", "Masked Ghoul/Bullet Bill") + elif level == "Turtle Zone 3": + if sprite["sprite"] == "Pencil/Spikey": + shuffle = ("Koopa Troopa", "Paragoomba (Diagonal)", "Ragumo/Aqua Kuribo", "Pencil/Spikey", + "Paragoomba (Vertical)", "Honebon/F Boy") + else: + shuffle = ("Koopa Troopa", "Paragoomba (Diagonal)", "Ragumo/Aqua Kuribo", + "Paragoomba (Vertical)", "Honebon/F Boy") + elif level == "Space Zone 1": + if sprite["sprite"] == "Boo/Bomubomu": + shuffle = ("Boo/Bomubomu", "No 48/Mogyo") + else: + shuffle = ("Boo/Bomubomu", "No 48/Mogyo", "Rerere/Poro") + elif level == "Mario's Castle": + if sprite["sprite"] in ("Fire Pakkun Zo (Large)", "Fire Pakkun Zo (Left)"): + shuffle = ("Fire Pakkun Zo (Large)", "Fire Pakkun Zo (Left)") + else: + shuffle = ("Spike Ball (Large)", "Spike Ball (Small)") + elif level == "Tree Zone 4": + # Deviation from SML2R: No Buichis placed into non-Buichi locations, as they can place under the + # underground question mark blocks. Potentially could make a list of which ones are allowed to become + # Buichis? + if sprite["sprite"] in ("Runaway Heart Block/Bibi", "Piranha Plant (Downward)/Grubby", + "Spinning Platform (Horizontal)/Skeleton Bee", + "Spinning Spike (Horizontal)/Unera"): + shuffle = ("Runaway Heart Block/Bibi", "Piranha Plant (Downward)/Grubby", + "Spinning Platform (Horizontal)/Skeleton Bee", "Spinning Spike (Horizontal)/Unera") + elif sprite["sprite"] == "Neiji/Buichi": + shuffle = ("Runaway Heart Block/Bibi", "Neiji/Buichi", "Piranha Plant (Downward)/Grubby", + "Spinning Platform (Horizontal)/Skeleton Bee", "Spinning Spike (Horizontal)/Unera") + else: + shuffle = () + if sprite["sprite"] in ("Piranha Plant", "Fire Piranha Plant"): + if level not in ("Pumpkin Zone 2", "Pumpkin Zone 4", "Macro Zone 3"): + shuffle = ("Piranha Plant", "Fire Piranha Plant") + if sprite["sprite"] in shuffle: + sprite["sprite"] = random.choice(shuffle) + elif level == "Mario's Castle" and sprite["sprite"] == "Karamenbo" and not random.randint(0, 9): + sprite["y"] += 1 + + +def randomize_platforms(sprite_data, random): + shuffle = ("Moving Platform (Small, Vertical)", "Moving Platform (Large, Vertical)", + "Moving Platform (Small, Horizontal)", "Moving Platform (Large, Horizontal)", + "Moving Platform (Large, Diagonal)", "Falling Platform") + for sprite in sprite_data["Tree Zone 3"]: + if sprite["sprite"] in shuffle: + sprite["sprite"] = random.choice(shuffle) + shuffle = ("Cloud Platform (Horizontal)", "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)") + for sprite in sprite_data["Tree Zone 5"]: + if sprite["sprite"] in shuffle: + sprite["sprite"] = random.choice(shuffle) + shuffle = ("Falling Bone Platform", "Rising Bone Platform", "Skull Platform") + for sprite in sprite_data["Mario's Castle"]: + if sprite["sprite"] in shuffle: + sprite["sprite"] = random.choice(shuffle) diff --git a/worlds/marioland2/sprites.py b/worlds/marioland2/sprites.py new file mode 100644 index 0000000000..33a1473129 --- /dev/null +++ b/worlds/marioland2/sprites.py @@ -0,0 +1,1016 @@ +sprite_name_to_id = { + "Ant": 93, "Ragumo/Aqua Kuribo": 32, "Battle Beetle": 51, "Be": 52, "Noko Bombette/Bear": 68, + "Runaway Heart Block/Bibi": 53, "Star (Vertical)/Blurp (Horizontal)": 94, + "Star (Horizontal)/Blurp (Vertical)": 95, "Boo/Bomubomu": 77, + "Money Bag/Bopping Toady": 31, "Neiji/Buichi": 64, "Masked Ghoul/Bullet Bill": 83, + "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)": 61, "Cheep Cheep (Vertical)": 7, + "Chikunto": 39, "Dokanto": 37, "Dondon": 57, "Honebon/F Boy": 85, "Fire Pakkun Zo (Large)": 104, + "Fire Pakkun Zo (Left)": 105, "Fire Pakkun Zo (Right)": 106, "Fire Piranha Plant": 13, "Floating Face": 100, + "Genkottsu (1.5 Tiles)": 99, "Genkottsu (2 Tiles)": 98, "Goomba": 9, "Goronto": 35, + "Piranha Plant (Downward)/Grubby": 66, "Kurokyura/Jack-in-the-Box": 81, + "Karakara": 86, "Karamenbo": 102, "Kiddokatto": 72, "Koopa Troopa": 1, "Kyororo": 84, "Kyotonbo": 34, + "No 48/Mogyo": 88, "Paragoomba (Diagonal)": 8, "Paragoomba (Vertical)": 58, "Tosenbo/Pikku": 92, + "Piranha Plant": 12, "Rerere/Poro": 90, "Shark": 6, + "Spinning Platform (Horizontal)/Skeleton Bee": 62, "Pencil/Spikey": 33, + "Spiny Cheep Cheep": 11, "Spinning Spike/Tamara": 67, "Tatenoko": 75, "Unibo/Terekuribo": 87, + "Toriuo": 91, "Spinning Spike (Horizontal)/Unera": 65, "Claw Grabber": 73, + "Diagonal Ball on Chain": 71, "Falling Spike": 78, "Falling Spike on Chain": 79, "Spinning Spike (Vertical)": 80, + "Spike Ball (Large)": 110, "Spike Ball (Small)": 111, "Moving Saw (Ceiling)": 74, "Moving Saw (Floor)": 76, + "Moving Platform (Small, Vertical)": 40, "Moving Platform (Large, Vertical)": 41, + "Moving Platform (Small, Horizontal)": 42, "Moving Platform (Large, Horizontal)": 43, + "Moving Platform (Large, Diagonal)": 45, "Falling Platform": 46, "Rising Platform": 47, + "Rotating Platform (Small)": 48, "Owl Platform (Vertical)": 55, "Cloud Platform (Horizontal)": 56, + "Spinning Platform (Vertical)": 63, "Falling Bone Platform": 96, "Rising Bone Platform": 97, "Skull Platform": 103, + "Propeller Platform": 107, "Heart": 15, "Mushroom": 27, "Flower": 28, "Carrot": 29, "Star": 30, + "Mushroom Block": 17, "Flower Block": 18, "Carrot Block": 19, "Star Block": 20, "Heart Block": 21, + "Money Bag Block": 25, "Bubble": 24, "Midway Bell": 23, "Bonus Bell": 22, "Horizontal Blurp": 5, + "Big Diagonal Moving Platform": 44} + +sprite_id_to_name = {a: b for b, a in sprite_name_to_id.items()} + +level_sprites = { + "Mushroom Zone": [ + {"screen": 1, "sprite": "Goomba", "x": 27, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 9, "y": 24, "misc": 32}, + {"screen": 2, "sprite": "Mushroom Block", "x": 21, "y": 23, "misc": 32}, + {"screen": 4, "sprite": "Goomba", "x": 7, "y": 26, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 11, "y": 18, "misc": 32}, + {"screen": 6, "sprite": "Paragoomba (Diagonal)", "x": 19, "y": 22, "misc": 160}, + {"screen": 8, "sprite": "Piranha Plant", "x": 6, "y": 30, "misc": 160}, + {"screen": 8, "sprite": "Piranha Plant", "x": 22, "y": 30, "misc": 160}, + {"screen": 9, "sprite": "Heart Block", "x": 15, "y": 23, "misc": 32}, + {"screen": 9, "sprite": "Star Block", "x": 17, "y": 23, "misc": 32}, + {"screen": 10, "sprite": "Goomba", "x": 5, "y": 30, "misc": 32}, + {"screen": 10, "sprite": "Goomba", "x": 17, "y": 30, "misc": 32}, + {"screen": 10, "sprite": "Midway Bell", "x": 29, "y": 20, "misc": 32}, + {"screen": 11, "sprite": "Goomba", "x": 1, "y": 30, "misc": 32}, + {"screen": 11, "sprite": "Koopa Troopa", "x": 13, "y": 24, "misc": 32}, + {"screen": 11, "sprite": "Koopa Troopa", "x": 20, "y": 24, "misc": 32}, + {"screen": 11, "sprite": "Flower Block", "x": 25, "y": 23, "misc": 32}, + {"screen": 12, "sprite": "Heart", "x": 15, "y": 30, "misc": 32}, + {"screen": 13, "sprite": "Goomba", "x": 3, "y": 30, "misc": 32}, + {"screen": 13, "sprite": "Piranha Plant", "x": 16, "y": 30, "misc": 32}, + {"screen": 14, "sprite": "Goomba", "x": 11, "y": 22, "misc": 32}, + {"screen": 14, "sprite": "Koopa Troopa", "x": 20, "y": 22, "misc": 160}, + {"screen": 15, "sprite": "Bonus Bell", "x": 21, "y": 13, "misc": 32}], + "Tree Zone 1": [ + {"screen": 1, "sprite": "Star Block", "x": 17, "y": 21, "misc": 32}, + {"screen": 2, "sprite": "Ragumo/Aqua Kuribo", "x": 5, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Heart", "x": 19, "y": 30, "misc": 0}, + {"screen": 2, "sprite": "Ragumo/Aqua Kuribo", "x": 23, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Money Bag/Bopping Toady", "x": 1, "y": 30, "misc": 160}, + {"screen": 3, "sprite": "Money Bag/Bopping Toady", "x": 20, "y": 24, "misc": 160}, + {"screen": 4, "sprite": "Money Bag/Bopping Toady", "x": 9, "y": 24, "misc": 32}, + {"screen": 4, "sprite": "Heart", "x": 13, "y": 30, "misc": 0}, + {"screen": 4, "sprite": "Money Bag/Bopping Toady", "x": 31, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Pencil/Spikey", "x": 3, "y": 24, "misc": 160}, + {"screen": 5, "sprite": "Kyotonbo", "x": 21, "y": 22, "misc": 160}, + {"screen": 6, "sprite": "Money Bag/Bopping Toady", "x": 11, "y": 24, "misc": 160}, + {"screen": 6, "sprite": "Money Bag/Bopping Toady", "x": 23, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Mushroom Block", "x": 15, "y": 23, "misc": 32}, + {"screen": 7, "sprite": "Pencil/Spikey", "x": 28, "y": 24, "misc": 160}, + {"screen": 7, "sprite": "Heart Block", "x": 29, "y": 5, "misc": 32}, + {"screen": 8, "sprite": "Midway Bell", "x": 13, "y": 22, "misc": 32}, + {"screen": 8, "sprite": "Money Bag/Bopping Toady", "x": 29, "y": 24, "misc": 32}, + {"screen": 9, "sprite": "Ragumo/Aqua Kuribo", "x": 10, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Kyotonbo", "x": 15, "y": 10, "misc": 160}, + {"screen": 9, "sprite": "Mushroom Block", "x": 17, "y": 23, "misc": 32}, + {"screen": 10, "sprite": "Kyotonbo", "x": 3, "y": 10, "misc": 160}, + {"screen": 10, "sprite": "Pencil/Spikey", "x": 19, "y": 24, "misc": 160}, + {"screen": 10, "sprite": "Star Block", "x": 25, "y": 21, "misc": 32}, + {"screen": 11, "sprite": "Money Bag/Bopping Toady", "x": 7, "y": 24, "misc": 32}, + {"screen": 11, "sprite": "Money Bag/Bopping Toady", "x": 27, "y": 24, "misc": 32}, + {"screen": 11, "sprite": "Money Bag/Bopping Toady", "x": 31, "y": 24, "misc": 32}, + {"screen": 12, "sprite": "Money Bag/Bopping Toady", "x": 15, "y": 24, "misc": 32}, + {"screen": 13, "sprite": "Ragumo/Aqua Kuribo", "x": 3, "y": 30, "misc": 32}, + {"screen": 13, "sprite": "Money Bag/Bopping Toady", "x": 23, "y": 24, "misc": 32}, + {"screen": 14, "sprite": "Money Bag/Bopping Toady", "x": 15, "y": 30, "misc": 160}, + {"screen": 14, "sprite": "Kyotonbo", "x": 31, "y": 24, "misc": 160}, + {"screen": 15, "sprite": "Bonus Bell", "x": 19, "y": 13, "misc": 32}, + {"screen": 15, "sprite": "Heart Block", "x": 25, "y": 15, "misc": 32}], + "Tree Zone 2": [ + {"screen": 2, "sprite": "No 48/Mogyo", "x": 9, "y": 30, "misc": 0}, + {"screen": 2, "sprite": "Mushroom Block", "x": 23, "y": 19, "misc": 0}, + {"screen": 2, "sprite": "No 48/Mogyo", "x": 27, "y": 30, "misc": 0}, + {"screen": 3, "sprite": "Mushroom Block", "x": 7, "y": 23, "misc": 32}, + {"screen": 3, "sprite": "No 48/Mogyo", "x": 15, "y": 28, "misc": 160}, + {"screen": 3, "sprite": "Heart Block", "x": 27, "y": 17, "misc": 0}, + {"screen": 4, "sprite": "No 48/Mogyo", "x": 3, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "No 48/Mogyo", "x": 17, "y": 28, "misc": 160}, + {"screen": 5, "sprite": "Noko Bombette/Bear", "x": 1, "y": 30, "misc": 128}, + {"screen": 5, "sprite": "No 48/Mogyo", "x": 7, "y": 28, "misc": 32}, + {"screen": 6, "sprite": "Falling Platform", "x": 22, "y": 22, "misc": 0}, + {"screen": 7, "sprite": "Midway Bell", "x": 3, "y": 14, "misc": 0}, + {"screen": 7, "sprite": "No 48/Mogyo", "x": 15, "y": 30, "misc": 0}, + {"screen": 7, "sprite": "No 48/Mogyo", "x": 17, "y": 8, "misc": 32}, + {"screen": 7, "sprite": "Money Bag Block", "x": 19, "y": 19, "misc": 32}, + {"screen": 7, "sprite": "No 48/Mogyo", "x": 19, "y": 0, "misc": 32}, + {"screen": 8, "sprite": "Mushroom Block", "x": 5, "y": 13, "misc": 0}, + {"screen": 8, "sprite": "Noko Bombette/Bear", "x": 11, "y": 24, "misc": 0}, + {"screen": 8, "sprite": "Carrot Block", "x": 17, "y": 21, "misc": 64}, + {"screen": 9, "sprite": "Noko Bombette/Bear", "x": 3, "y": 30, "misc": 64}, + {"screen": 9, "sprite": "Noko Bombette/Bear", "x": 23, "y": 30, "misc": 64}, + {"screen": 10, "sprite": "Noko Bombette/Bear", "x": 11, "y": 30, "misc": 64}, + {"screen": 10, "sprite": "Noko Bombette/Bear", "x": 31, "y": 30, "misc": 64}, + {"screen": 11, "sprite": "Money Bag Block", "x": 5, "y": 19, "misc": 0}, + {"screen": 11, "sprite": "Mushroom Block", "x": 13, "y": 5, "misc": 0}, + {"screen": 11, "sprite": "Heart", "x": 19, "y": 24, "misc": 64}, + {"screen": 13, "sprite": "Noko Bombette/Bear", "x": 3, "y": 28, "misc": 192}, + {"screen": 13, "sprite": "Noko Bombette/Bear", "x": 5, "y": 16, "misc": 0}, + {"screen": 13, "sprite": "Noko Bombette/Bear", "x": 13, "y": 28, "misc": 192}, + {"screen": 13, "sprite": "Heart", "x": 27, "y": 8, "misc": 32}, + {"screen": 14, "sprite": "Bonus Bell", "x": 21, "y": 15, "misc": 32}], + "Tree Zone 4": [ + {"screen": 1, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 11, "y": 26, "misc": 160}, + {"screen": 1, "sprite": "Runaway Heart Block/Bibi", "x": 20, "y": 24, "misc": 0}, + {"screen": 1, "sprite": "Flower Block", "x": 25, "y": 21, "misc": 32}, + {"screen": 2, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 16, "y": 24, "misc": 128}, + {"screen": 3, "sprite": "Neiji/Buichi", "x": 18, "y": 18, "misc": 0}, + {"screen": 3, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 28, "y": 30, "misc": 0}, + {"screen": 4, "sprite": "Neiji/Buichi", "x": 4, "y": 18, "misc": 0}, + {"screen": 4, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 12, "y": 30, "misc": 0}, + {"screen": 4, "sprite": "Neiji/Buichi", "x": 22, "y": 18, "misc": 0}, + {"screen": 4, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 28, "y": 30, "misc": 0}, + {"screen": 5, "sprite": "Neiji/Buichi", "x": 8, "y": 18, "misc": 128}, + {"screen": 6, "sprite": "Runaway Heart Block/Bibi", "x": 12, "y": 24, "misc": 0}, + {"screen": 6, "sprite": "Piranha Plant (Downward)/Grubby", "x": 13, "y": 12, "misc": 160}, + {"screen": 6, "sprite": "Mushroom Block", "x": 19, "y": 17, "misc": 32}, + {"screen": 6, "sprite": "Piranha Plant (Downward)/Grubby", "x": 23, "y": 28, "misc": 128}, + {"screen": 6, "sprite": "Piranha Plant (Downward)/Grubby", "x": 25, "y": 18, "misc": 160}, + {"screen": 6, "sprite": "Piranha Plant (Downward)/Grubby", "x": 31, "y": 24, "misc": 160}, + {"screen": 7, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 2, "y": 24, "misc": 0}, + {"screen": 7, "sprite": "Runaway Heart Block/Bibi", "x": 28, "y": 24, "misc": 128}, + {"screen": 8, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 1, "y": 12, "misc": 32}, + {"screen": 8, "sprite": "Piranha Plant (Downward)/Grubby", "x": 5, "y": 28, "misc": 0}, + {"screen": 8, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 5, "y": 18, "misc": 32}, + {"screen": 8, "sprite": "Runaway Heart Block/Bibi", "x": 14, "y": 24, "misc": 0}, + {"screen": 8, "sprite": "Star Block", "x": 17, "y": 11, "misc": 32}, + {"screen": 8, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 19, "y": 24, "misc": 32}, + {"screen": 9, "sprite": "Star Block", "x": 17, "y": 19, "misc": 0}, + {"screen": 9, "sprite": "Piranha Plant (Downward)/Grubby", "x": 21, "y": 20, "misc": 0}, + {"screen": 9, "sprite": "Spinning Spike/Tamara", "x": 23, "y": 27, "misc": 0}, + {"screen": 10, "sprite": "Midway Bell", "x": 0, "y": 18, "misc": 0}, + {"screen": 10, "sprite": "Spinning Spike/Tamara", "x": 5, "y": 27, "misc": 0}, + {"screen": 10, "sprite": "Piranha Plant (Downward)/Grubby", "x": 11, "y": 20, "misc": 0}, + {"screen": 10, "sprite": "Spinning Spike/Tamara", "x": 17, "y": 27, "misc": 0}, + {"screen": 10, "sprite": "Mushroom Block", "x": 23, "y": 19, "misc": 0}, + {"screen": 12, "sprite": "Runaway Heart Block/Bibi", "x": 2, "y": 24, "misc": 32}, + {"screen": 12, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 28, "y": 24, "misc": 32}, + {"screen": 13, "sprite": "Bonus Bell", "x": 21, "y": 17, "misc": 32}], + "Tree Zone 3": [ + {"screen": 0, "sprite": "Moving Platform (Large, Vertical)", "x": 19, "y": 10, "misc": 32}, + {"screen": 0, "sprite": "Carrot Block", "x": 25, "y": 25, "misc": 0}, + {"screen": 0, "sprite": "Ant", "x": 28, "y": 18, "misc": 32}, + {"screen": 1, "sprite": "Ant", "x": 0, "y": 22, "misc": 64}, + {"screen": 1, "sprite": "Battle Beetle", "x": 10, "y": 24, "misc": 64}, + {"screen": 1, "sprite": "Moving Platform (Large, Diagonal)", "x": 11, "y": 22, "misc": 32}, + {"screen": 1, "sprite": "Fire Piranha Plant", "x": 18, "y": 20, "misc": 128}, + {"screen": 1, "sprite": "Cheep Cheep (Vertical)", "x": 18, "y": 21, "misc": 0}, + {"screen": 1, "sprite": "Mushroom Block", "x": 21, "y": 15, "misc": 64}, + {"screen": 1, "sprite": "Heart Block", "x": 21, "y": 7, "misc": 64}, + {"screen": 1, "sprite": "Be", "x": 30, "y": 26, "misc": 32}, + {"screen": 2, "sprite": "Piranha Plant", "x": 4, "y": 24, "misc": 192}, + {"screen": 2, "sprite": "Be", "x": 14, "y": 26, "misc": 32}, + {"screen": 2, "sprite": "Fire Piranha Plant", "x": 20, "y": 24, "misc": 192}, + {"screen": 2, "sprite": "Falling Platform", "x": 24, "y": 27, "misc": 0}, + {"screen": 2, "sprite": "Heart Block", "x": 25, "y": 19, "misc": 0}, + {"screen": 3, "sprite": "Falling Platform", "x": 0, "y": 25, "misc": 0}, + {"screen": 3, "sprite": "Falling Platform", "x": 0, "y": 31, "misc": 32}, + {"screen": 3, "sprite": "Cheep Cheep (Vertical)", "x": 4, "y": 15, "misc": 64}, + {"screen": 3, "sprite": "Falling Platform", "x": 8, "y": 31, "misc": 32}, + {"screen": 3, "sprite": "Ant", "x": 20, "y": 30, "misc": 0}, + {"screen": 3, "sprite": "Heart Block", "x": 27, "y": 17, "misc": 32}, + {"screen": 3, "sprite": "Heart Block", "x": 29, "y": 5, "misc": 32}, + {"screen": 4, "sprite": "Fire Piranha Plant", "x": 4, "y": 22, "misc": 192}, + {"screen": 4, "sprite": "Moving Platform (Small, Horizontal)", "x": 8, "y": 19, "misc": 0}, + {"screen": 4, "sprite": "Ant", "x": 12, "y": 20, "misc": 64}, + {"screen": 4, "sprite": "Moving Platform (Small, Vertical)", "x": 14, "y": 2, "misc": 64}, + {"screen": 4, "sprite": "Bonus Bell", "x": 21, "y": 17, "misc": 0}, + {"screen": 4, "sprite": "Money Bag Block", "x": 27, "y": 15, "misc": 32}, + {"screen": 4, "sprite": "Heart Block", "x": 27, "y": 17, "misc": 64}], + "Tree Zone 5": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 15, "y": 17, "misc": 64}, + {"screen": 1, "sprite": "Rotating Platform (Small)", "x": 15, "y": 19, "misc": 64}, + {"screen": 2, "sprite": "Paragoomba (Vertical)", "x": 2, "y": 26, "misc": 192}, + {"screen": 2, "sprite": "Paragoomba (Vertical)", "x": 16, "y": 26, "misc": 192}, + {"screen": 2, "sprite": "Heart Block", "x": 17, "y": 13, "misc": 64}, + {"screen": 2, "sprite": "Paragoomba (Vertical)", "x": 26, "y": 26, "misc": 192}, + {"screen": 3, "sprite": "Paragoomba (Vertical)", "x": 6, "y": 22, "misc": 192}, + {"screen": 3, "sprite": "Owl Platform (Vertical)", "x": 23, "y": 28, "misc": 64}, + {"screen": 4, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 11, "y": 19, "misc": 64}, + {"screen": 5, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 1, "y": 21, "misc": 64}, + {"screen": 5, "sprite": "Cloud Platform (Horizontal)", "x": 18, "y": 20, "misc": 64}, + {"screen": 5, "sprite": "Cloud Platform (Horizontal)", "x": 26, "y": 26, "misc": 64}, + {"screen": 6, "sprite": "Cloud Platform (Horizontal)", "x": 2, "y": 20, "misc": 64}, + {"screen": 6, "sprite": "Midway Bell", "x": 18, "y": 20, "misc": 64}, + {"screen": 6, "sprite": "Heart Block", "x": 23, "y": 21, "misc": 64}, + {"screen": 6, "sprite": "Dondon", "x": 30, "y": 14, "misc": 64}, + {"screen": 7, "sprite": "Carrot Block", "x": 9, "y": 19, "misc": 64}, + {"screen": 7, "sprite": "Rotating Platform (Small)", "x": 9, "y": 21, "misc": 64}, + {"screen": 7, "sprite": "Heart Block", "x": 23, "y": 13, "misc": 64}, + {"screen": 7, "sprite": "Rotating Platform (Small)", "x": 23, "y": 23, "misc": 64}, + {"screen": 8, "sprite": "Mushroom Block", "x": 21, "y": 13, "misc": 64}, + {"screen": 9, "sprite": "Star Block", "x": 5, "y": 7, "misc": 64}, + {"screen": 9, "sprite": "Paragoomba (Vertical)", "x": 7, "y": 14, "misc": 64}, + {"screen": 9, "sprite": "Paragoomba (Vertical)", "x": 27, "y": 20, "misc": 64}, + {"screen": 9, "sprite": "Paragoomba (Vertical)", "x": 31, "y": 16, "misc": 64}, + {"screen": 10, "sprite": "Cloud Platform (Horizontal)", "x": 20, "y": 22, "misc": 64}, + {"screen": 10, "sprite": "Paragoomba (Vertical)", "x": 31, "y": 18, "misc": 64}, + {"screen": 11, "sprite": "Cloud Platform (Horizontal)", "x": 8, "y": 22, "misc": 64}, + {"screen": 11, "sprite": "Paragoomba (Vertical)", "x": 16, "y": 25, "misc": 64}], + "Pumpkin Zone 1": [ + {"screen": 1, "sprite": "Falling Spike on Chain", "x": 9, "y": 14, "misc": 160}, + {"screen": 1, "sprite": "Mushroom Block", "x": 15, "y": 23, "misc": 0}, + {"screen": 1, "sprite": "Masked Ghoul/Bullet Bill", "x": 19, "y": 30, "misc": 0}, + {"screen": 1, "sprite": "Falling Spike on Chain", "x": 27, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Falling Spike on Chain", "x": 17, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Falling Spike on Chain", "x": 23, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Falling Spike on Chain", "x": 29, "y": 22, "misc": 32}, + {"screen": 3, "sprite": "Masked Ghoul/Bullet Bill", "x": 1, "y": 30, "misc": 160}, + {"screen": 3, "sprite": "Masked Ghoul/Bullet Bill", "x": 21, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Masked Ghoul/Bullet Bill", "x": 5, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Carrot Block", "x": 17, "y": 21, "misc": 32}, + {"screen": 4, "sprite": "Masked Ghoul/Bullet Bill", "x": 21, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Falling Spike", "x": 27, "y": 20, "misc": 32}, + {"screen": 6, "sprite": "Boo/Bomubomu", "x": 1, "y": 28, "misc": 0}, + {"screen": 6, "sprite": "Masked Ghoul/Bullet Bill", "x": 2, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Heart Block", "x": 5, "y": 7, "misc": 0}, + {"screen": 6, "sprite": "Boo/Bomubomu", "x": 9, "y": 28, "misc": 128}, + {"screen": 6, "sprite": "Fire Piranha Plant", "x": 16, "y": 2, "misc": 192}, + {"screen": 6, "sprite": "Midway Bell", "x": 24, "y": 22, "misc": 32}, + {"screen": 7, "sprite": "Falling Spike", "x": 1, "y": 20, "misc": 32}, + {"screen": 7, "sprite": "Masked Ghoul/Bullet Bill", "x": 9, "y": 30, "misc": 160}, + {"screen": 7, "sprite": "Falling Spike", "x": 27, "y": 20, "misc": 32}, + {"screen": 7, "sprite": "Masked Ghoul/Bullet Bill", "x": 31, "y": 30, "misc": 160}, + {"screen": 8, "sprite": "Piranha Plant", "x": 16, "y": 28, "misc": 32}, + {"screen": 8, "sprite": "Masked Ghoul/Bullet Bill", "x": 17, "y": 24, "misc": 160}, + {"screen": 8, "sprite": "Fire Piranha Plant", "x": 24, "y": 30, "misc": 160}, + {"screen": 9, "sprite": "Masked Ghoul/Bullet Bill", "x": 7, "y": 22, "misc": 160}, + {"screen": 9, "sprite": "Falling Spike on Chain", "x": 11, "y": 10, "misc": 160}, + {"screen": 9, "sprite": "Piranha Plant", "x": 20, "y": 14, "misc": 32}, + {"screen": 9, "sprite": "Falling Spike on Chain", "x": 23, "y": 30, "misc": 128}, + {"screen": 10, "sprite": "Cheep Cheep (Vertical)", "x": 30, "y": 11, "misc": 160}, + {"screen": 11, "sprite": "Cheep Cheep (Vertical)", "x": 6, "y": 19, "misc": 32}, + {"screen": 11, "sprite": "Kurokyura/Jack-in-the-Box", "x": 11, "y": 30, "misc": 0}, + {"screen": 11, "sprite": "Bonus Bell", "x": 21, "y": 3, "misc": 32}, + {"screen": 11, "sprite": "Heart Block", "x": 27, "y": 11, "misc": 0}], + "Pumpkin Zone 2": [ + {"screen": 1, "sprite": "Karakara", "x": 7, "y": 30, "misc": 160}, + {"screen": 1, "sprite": "Karakara", "x": 15, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Karakara", "x": 23, "y": 30, "misc": 160}, + {"screen": 2, "sprite": "Piranha Plant", "x": 20, "y": 30, "misc": 160}, + {"screen": 3, "sprite": "Honebon/F Boy", "x": 4, "y": 11, "misc": 160}, + {"screen": 3, "sprite": "Cheep Cheep (Vertical)", "x": 4, "y": 23, "misc": 32}, + {"screen": 3, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 13, "y": 28, "misc": 192}, + {"screen": 3, "sprite": "Mushroom Block", "x": 17, "y": 21, "misc": 64}, + {"screen": 4, "sprite": "Kyororo", "x": 29, "y": 30, "misc": 160}, + {"screen": 5, "sprite": "Honebon/F Boy", "x": 6, "y": 24, "misc": 32}, + {"screen": 5, "sprite": "Kyororo", "x": 13, "y": 30, "misc": 160}, + {"screen": 5, "sprite": "Kyororo", "x": 29, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Midway Bell", "x": 1, "y": 16, "misc": 32}, + {"screen": 6, "sprite": "Star (Horizontal)/Blurp (Vertical)", "x": 21, "y": 30, "misc": 192}, + {"screen": 6, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 28, "y": 25, "misc": 64}, + {"screen": 7, "sprite": "Mushroom", "x": 3, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Boo/Bomubomu", "x": 9, "y": 13, "misc": 160}, + {"screen": 7, "sprite": "Boo/Bomubomu", "x": 13, "y": 21, "misc": 160}, + {"screen": 7, "sprite": "Heart", "x": 29, "y": 14, "misc": 32}, + {"screen": 8, "sprite": "Carrot", "x": 7, "y": 22, "misc": 32}, + {"screen": 8, "sprite": "Flower", "x": 13, "y": 14, "misc": 32}, + {"screen": 8, "sprite": "Heart", "x": 19, "y": 20, "misc": 32}, + {"screen": 9, "sprite": "Star Block", "x": 1, "y": 13, "misc": 32}, + {"screen": 9, "sprite": "Kyororo", "x": 19, "y": 30, "misc": 64}, + {"screen": 9, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 20, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Kyororo", "x": 21, "y": 16, "misc": 32}, + {"screen": 10, "sprite": "Kyororo", "x": 5, "y": 14, "misc": 32}, + {"screen": 10, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 7, "y": 28, "misc": 32}, + {"screen": 10, "sprite": "Kyororo", "x": 22, "y": 14, "misc": 32}, + {"screen": 11, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 0, "y": 26, "misc": 192}, + {"screen": 11, "sprite": "Falling Spike", "x": 5, "y": 24, "misc": 64}, + {"screen": 11, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 7, "y": 30, "misc": 32}, + {"screen": 11, "sprite": "Kyororo", "x": 10, "y": 16, "misc": 32}, + {"screen": 11, "sprite": "Falling Spike", "x": 15, "y": 24, "misc": 64}, + {"screen": 11, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 19, "y": 28, "misc": 192}, + {"screen": 12, "sprite": "Karakara", "x": 9, "y": 30, "misc": 32}, + {"screen": 12, "sprite": "Karakara", "x": 17, "y": 30, "misc": 32}, + {"screen": 12, "sprite": "Karakara", "x": 25, "y": 30, "misc": 32}, + {"screen": 13, "sprite": "Karakara", "x": 19, "y": 30, "misc": 32}, + {"screen": 13, "sprite": "Bonus Bell", "x": 21, "y": 11, "misc": 32}], + "Pumpkin Zone 3": [ + {"screen": 1, "sprite": "Unibo/Terekuribo", "x": 21, "y": 26, "misc": 160}, + {"screen": 2, "sprite": "Unibo/Terekuribo", "x": 21, "y": 20, "misc": 160}, + {"screen": 3, "sprite": "Carrot Block", "x": 9, "y": 7, "misc": 32}, + {"screen": 3, "sprite": "Boo/Bomubomu", "x": 19, "y": 23, "misc": 32}, + {"screen": 4, "sprite": "Boo/Bomubomu", "x": 1, "y": 21, "misc": 32}, + {"screen": 4, "sprite": "Boo/Bomubomu", "x": 19, "y": 14, "misc": 160}, + {"screen": 6, "sprite": "Moving Platform (Small, Horizontal)", "x": 0, "y": 8, "misc": 64}, + {"screen": 6, "sprite": "Moving Platform (Small, Horizontal)", "x": 0, "y": 14, "misc": 64}, + {"screen": 6, "sprite": "Flower Block", "x": 17, "y": 19, "misc": 64}, + {"screen": 7, "sprite": "Unibo/Terekuribo", "x": 1, "y": 26, "misc": 32}, + {"screen": 7, "sprite": "Boo/Bomubomu", "x": 17, "y": 18, "misc": 64}, + {"screen": 8, "sprite": "Fire Piranha Plant", "x": 16, "y": 28, "misc": 32}, + {"screen": 8, "sprite": "Heart Block", "x": 23, "y": 5, "misc": 64}, + {"screen": 8, "sprite": "Flower Block", "x": 25, "y": 17, "misc": 64}, + {"screen": 9, "sprite": "Midway Bell", "x": 5, "y": 22, "misc": 32}, + {"screen": 9, "sprite": "Boo/Bomubomu", "x": 19, "y": 22, "misc": 160}, + {"screen": 10, "sprite": "Boo/Bomubomu", "x": 2, "y": 27, "misc": 32}, + {"screen": 10, "sprite": "Boo/Bomubomu", "x": 25, "y": 14, "misc": 160}, + {"screen": 11, "sprite": "Carrot Block", "x": 7, "y": 13, "misc": 32}, + {"screen": 11, "sprite": "Boo/Bomubomu", "x": 23, "y": 18, "misc": 160}, + {"screen": 13, "sprite": "Boo/Bomubomu", "x": 3, "y": 28, "misc": 32}, + {"screen": 13, "sprite": "Boo/Bomubomu", "x": 12, "y": 5, "misc": 64}, + {"screen": 14, "sprite": "Unibo/Terekuribo", "x": 3, "y": 28, "misc": 160}, + {"screen": 14, "sprite": "Boo/Bomubomu", "x": 5, "y": 18, "misc": 192}, + {"screen": 14, "sprite": "Unibo/Terekuribo", "x": 14, "y": 24, "misc": 32}, + {"screen": 14, "sprite": "Bonus Bell", "x": 21, "y": 13, "misc": 64}], + "Pumpkin Zone 4": [ + {"screen": 1, "sprite": "Tosenbo/Pikku", "x": 19, "y": 30, "misc": 160}, + {"screen": 1, "sprite": "Piranha Plant", "x": 24, "y": 0, "misc": 64}, + {"screen": 2, "sprite": "Boo/Bomubomu", "x": 9, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Boo/Bomubomu", "x": 24, "y": 21, "misc": 160}, + {"screen": 3, "sprite": "Boo/Bomubomu", "x": 23, "y": 26, "misc": 160}, + {"screen": 3, "sprite": "Falling Spike on Chain", "x": 29, "y": 22, "misc": 32}, + {"screen": 4, "sprite": "Falling Spike on Chain", "x": 3, "y": 22, "misc": 32}, + {"screen": 4, "sprite": "Falling Spike on Chain", "x": 9, "y": 22, "misc": 32}, + {"screen": 4, "sprite": "Tosenbo/Pikku", "x": 28, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Mushroom Block", "x": 7, "y": 11, "misc": 64}, + {"screen": 5, "sprite": "Boo/Bomubomu", "x": 17, "y": 26, "misc": 192}, + {"screen": 5, "sprite": "Heart Block", "x": 29, "y": 15, "misc": 64}, + {"screen": 6, "sprite": "Carrot Block", "x": 17, "y": 13, "misc": 32}, + {"screen": 7, "sprite": "Midway Bell", "x": 15, "y": 24, "misc": 32}, + {"screen": 8, "sprite": "Falling Spike on Chain", "x": 3, "y": 22, "misc": 32}, + {"screen": 8, "sprite": "Rerere/Poro", "x": 10, "y": 30, "misc": 160}, + {"screen": 8, "sprite": "Falling Spike on Chain", "x": 17, "y": 22, "misc": 160}, + {"screen": 8, "sprite": "Falling Spike on Chain", "x": 27, "y": 22, "misc": 160}, + {"screen": 9, "sprite": "Rerere/Poro", "x": 3, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Falling Spike on Chain", "x": 9, "y": 22, "misc": 160}, + {"screen": 10, "sprite": "Masked Ghoul/Bullet Bill", "x": 19, "y": 30, "misc": 32}, + {"screen": 10, "sprite": "Masked Ghoul/Bullet Bill", "x": 25, "y": 26, "misc": 160}, + {"screen": 10, "sprite": "Masked Ghoul/Bullet Bill", "x": 31, "y": 22, "misc": 32}, + {"screen": 11, "sprite": "Masked Ghoul/Bullet Bill", "x": 5, "y": 18, "misc": 32}, + {"screen": 12, "sprite": "Masked Ghoul/Bullet Bill", "x": 14, "y": 16, "misc": 192}, + {"screen": 12, "sprite": "Masked Ghoul/Bullet Bill", "x": 25, "y": 16, "misc": 192}, + {"screen": 13, "sprite": "Masked Ghoul/Bullet Bill", "x": 6, "y": 16, "misc": 192}, + {"screen": 13, "sprite": "Flower Block", "x": 13, "y": 23, "misc": 32}, + {"screen": 13, "sprite": "Masked Ghoul/Bullet Bill", "x": 18, "y": 16, "misc": 192}, + {"screen": 13, "sprite": "Money Bag Block", "x": 25, "y": 23, "misc": 32}, + {"screen": 14, "sprite": "Boo/Bomubomu", "x": 13, "y": 30, "misc": 160}], + "Mario Zone 1": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 5, "y": 23, "misc": 64}, + {"screen": 1, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 7, "y": 9, "misc": 64}, + {"screen": 1, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 13, "y": 13, "misc": 32}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 13, "y": 30, "misc": 192}, + {"screen": 1, "sprite": "Spinning Spike (Vertical)", "x": 19, "y": 22, "misc": 0}, + {"screen": 1, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 19, "y": 15, "misc": 32}, + {"screen": 2, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 13, "y": 27, "misc": 64}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 25, "y": 18, "misc": 64}, + {"screen": 3, "sprite": "Spinning Platform (Vertical)", "x": 1, "y": 18, "misc": 64}, + {"screen": 3, "sprite": "Spinning Platform (Vertical)", "x": 7, "y": 18, "misc": 64}, + {"screen": 3, "sprite": "Koopa Troopa", "x": 19, "y": 26, "misc": 192}, + {"screen": 3, "sprite": "Koopa Troopa", "x": 31, "y": 14, "misc": 192}, + {"screen": 4, "sprite": "Spinning Platform (Vertical)", "x": 23, "y": 20, "misc": 64}, + {"screen": 4, "sprite": "Tatenoko", "x": 26, "y": 15, "misc": 192}, + {"screen": 4, "sprite": "Spinning Platform (Vertical)", "x": 29, "y": 20, "misc": 64}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 11, "y": 16, "misc": 192}, + {"screen": 5, "sprite": "Spinning Platform (Vertical)", "x": 19, "y": 22, "misc": 64}, + {"screen": 5, "sprite": "Spinning Platform (Vertical)", "x": 23, "y": 22, "misc": 64}, + {"screen": 6, "sprite": "Carrot Block", "x": 5, "y": 11, "misc": 64}, + {"screen": 6, "sprite": "Midway Bell", "x": 16, "y": 12, "misc": 64}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 19, "y": 20, "misc": 64}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 21, "y": 24, "misc": 192}, + {"screen": 8, "sprite": "Spinning Spike (Horizontal)/Unera", "x": 12, "y": 30, "misc": 64}, + {"screen": 8, "sprite": "Heart Block", "x": 13, "y": 17, "misc": 64}, + {"screen": 9, "sprite": "Mushroom Block", "x": 3, "y": 19, "misc": 64}, + {"screen": 9, "sprite": "Neiji/Buichi", "x": 3, "y": 0, "misc": 96}, + {"screen": 9, "sprite": "Neiji/Buichi", "x": 11, "y": 0, "misc": 224}, + {"screen": 9, "sprite": "Neiji/Buichi", "x": 19, "y": 0, "misc": 224}, + {"screen": 9, "sprite": "Heart Block", "x": 27, "y": 7, "misc": 32}, + {"screen": 9, "sprite": "Spinning Platform (Vertical)", "x": 29, "y": 30, "misc": 32}, + {"screen": 10, "sprite": "Tatenoko", "x": 4, "y": 13, "misc": 32}, + {"screen": 10, "sprite": "Spinning Platform (Horizontal)/Skeleton Bee", "x": 7, "y": 21, "misc": 64}, + {"screen": 10, "sprite": "Carrot Block", "x": 9, "y": 7, "misc": 32}, + {"screen": 10, "sprite": "Spinning Platform (Vertical)", "x": 9, "y": 18, "misc": 32}, + {"screen": 10, "sprite": "Bonus Bell", "x": 19, "y": 17, "misc": 64}], + "Mario Zone 2": [ + {"screen": 1, "sprite": "Boo/Bomubomu", "x": 9, "y": 28, "misc": 32}, + {"screen": 1, "sprite": "Boo/Bomubomu", "x": 31, "y": 22, "misc": 160}, + {"screen": 3, "sprite": "Paragoomba (Vertical)", "x": 6, "y": 18, "misc": 160}, + {"screen": 3, "sprite": "Paragoomba (Vertical)", "x": 15, "y": 21, "misc": 160}, + {"screen": 4, "sprite": "Paragoomba (Vertical)", "x": 3, "y": 20, "misc": 160}, + {"screen": 4, "sprite": "Paragoomba (Vertical)", "x": 12, "y": 18, "misc": 160}, + {"screen": 4, "sprite": "Paragoomba (Vertical)", "x": 28, "y": 21, "misc": 32}, + {"screen": 5, "sprite": "Mushroom Block", "x": 3, "y": 21, "misc": 32}, + {"screen": 5, "sprite": "Heart", "x": 8, "y": 28, "misc": 32}, + {"screen": 5, "sprite": "Goomba", "x": 9, "y": 20, "misc": 192}, + {"screen": 5, "sprite": "Carrot Block", "x": 17, "y": 11, "misc": 64}, + {"screen": 5, "sprite": "Goomba", "x": 25, "y": 26, "misc": 192}, + {"screen": 5, "sprite": "Money Bag Block", "x": 27, "y": 19, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 3, "y": 26, "misc": 64}, + {"screen": 6, "sprite": "Star Block", "x": 7, "y": 11, "misc": 64}, + {"screen": 7, "sprite": "Noko Bombette/Bear", "x": 6, "y": 28, "misc": 32}, + {"screen": 8, "sprite": "Midway Bell", "x": 5, "y": 18, "misc": 32}, + {"screen": 8, "sprite": "Boo/Bomubomu", "x": 21, "y": 28, "misc": 160}, + {"screen": 8, "sprite": "Boo/Bomubomu", "x": 31, "y": 16, "misc": 32}, + {"screen": 9, "sprite": "Mushroom Block", "x": 11, "y": 15, "misc": 32}, + {"screen": 9, "sprite": "Boo/Bomubomu", "x": 19, "y": 20, "misc": 160}, + {"screen": 10, "sprite": "Boo/Bomubomu", "x": 5, "y": 24, "misc": 32}, + {"screen": 11, "sprite": "Mushroom", "x": 1, "y": 14, "misc": 32}, + {"screen": 11, "sprite": "Goomba", "x": 9, "y": 14, "misc": 32}, + {"screen": 11, "sprite": "Flower", "x": 17, "y": 14, "misc": 32}, + {"screen": 11, "sprite": "Carrot", "x": 25, "y": 14, "misc": 32}, + {"screen": 12, "sprite": "Boo/Bomubomu", "x": 12, "y": 16, "misc": 32}, + {"screen": 12, "sprite": "Boo/Bomubomu", "x": 24, "y": 20, "misc": 160}, + {"screen": 13, "sprite": "Noko Bombette/Bear", "x": 16, "y": 28, "misc": 32}, + {"screen": 14, "sprite": "Noko Bombette/Bear", "x": 12, "y": 28, "misc": 32}, + {"screen": 14, "sprite": "Bonus Bell", "x": 21, "y": 17, "misc": 32}], + "Mario Zone 3": [ + {"screen": 1, "sprite": "Kurokyura/Jack-in-the-Box", "x": 15, "y": 23, "misc": 160}, + {"screen": 1, "sprite": "Kiddokatto", "x": 21, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Masked Ghoul/Bullet Bill", "x": 4, "y": 26, "misc": 160}, + {"screen": 2, "sprite": "Diagonal Ball on Chain", "x": 9, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Diagonal Ball on Chain", "x": 1, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Mushroom Block", "x": 13, "y": 17, "misc": 32}, + {"screen": 3, "sprite": "Diagonal Ball on Chain", "x": 25, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Masked Ghoul/Bullet Bill", "x": 14, "y": 24, "misc": 160}, + {"screen": 4, "sprite": "Diagonal Ball on Chain", "x": 27, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Masked Ghoul/Bullet Bill", "x": 14, "y": 24, "misc": 160}, + {"screen": 6, "sprite": "Carrot Block", "x": 9, "y": 21, "misc": 32}, + {"screen": 6, "sprite": "Kiddokatto", "x": 25, "y": 30, "misc": 160}, + {"screen": 7, "sprite": "Masked Ghoul/Bullet Bill", "x": 26, "y": 28, "misc": 32}, + {"screen": 7, "sprite": "Midway Bell", "x": 27, "y": 22, "misc": 32}, + {"screen": 8, "sprite": "Kurokyura/Jack-in-the-Box", "x": 11, "y": 21, "misc": 32}, + {"screen": 8, "sprite": "Heart Block", "x": 13, "y": 3, "misc": 32}, + {"screen": 8, "sprite": "Kiddokatto", "x": 31, "y": 30, "misc": 160}, + {"screen": 9, "sprite": "Claw Grabber", "x": 23, "y": 28, "misc": 32}, + {"screen": 10, "sprite": "Claw Grabber", "x": 13, "y": 28, "misc": 32}, + {"screen": 11, "sprite": "Masked Ghoul/Bullet Bill", "x": 4, "y": 28, "misc": 64}, + {"screen": 11, "sprite": "Koopa Troopa", "x": 5, "y": 20, "misc": 160}, + {"screen": 11, "sprite": "Masked Ghoul/Bullet Bill", "x": 8, "y": 12, "misc": 192}, + {"screen": 11, "sprite": "Kiddokatto", "x": 26, "y": 20, "misc": 32}, + {"screen": 11, "sprite": "Heart Block", "x": 27, "y": 23, "misc": 64}, + {"screen": 11, "sprite": "Masked Ghoul/Bullet Bill", "x": 28, "y": 18, "misc": 192}, + {"screen": 12, "sprite": "Claw Grabber", "x": 11, "y": 28, "misc": 32}, + {"screen": 12, "sprite": "Kiddokatto", "x": 21, "y": 20, "misc": 32}, + {"screen": 13, "sprite": "Mushroom Block", "x": 13, "y": 21, "misc": 32}, + {"screen": 13, "sprite": "Masked Ghoul/Bullet Bill", "x": 18, "y": 28, "misc": 160}, + {"screen": 13, "sprite": "Kurokyura/Jack-in-the-Box", "x": 25, "y": 21, "misc": 32}, + {"screen": 14, "sprite": "Diagonal Ball on Chain", "x": 9, "y": 30, "misc": 32}, + {"screen": 14, "sprite": "Masked Ghoul/Bullet Bill", "x": 26, "y": 24, "misc": 160}, + {"screen": 15, "sprite": "Claw Grabber", "x": 3, "y": 18, "misc": 32}, + {"screen": 15, "sprite": "Bonus Bell", "x": 21, "y": 17, "misc": 32}], + "Mario Zone 4": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 9, "y": 17, "misc": 32}, + {"screen": 1, "sprite": "Spinning Spike/Tamara", "x": 9, "y": 25, "misc": 160}, + {"screen": 1, "sprite": "Spinning Spike/Tamara", "x": 29, "y": 25, "misc": 32}, + {"screen": 2, "sprite": "Masked Ghoul/Bullet Bill", "x": 12, "y": 26, "misc": 160}, + {"screen": 2, "sprite": "Spinning Spike/Tamara", "x": 29, "y": 21, "misc": 160}, + {"screen": 3, "sprite": "Spinning Spike/Tamara", "x": 15, "y": 21, "misc": 32}, + {"screen": 4, "sprite": "Masked Ghoul/Bullet Bill", "x": 14, "y": 26, "misc": 160}, + {"screen": 4, "sprite": "Masked Ghoul/Bullet Bill", "x": 24, "y": 21, "misc": 32}, + {"screen": 5, "sprite": "Masked Ghoul/Bullet Bill", "x": 2, "y": 26, "misc": 32}, + {"screen": 5, "sprite": "Goomba", "x": 22, "y": 20, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 2, "y": 14, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 14, "y": 8, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 26, "y": 2, "misc": 32}, + {"screen": 7, "sprite": "Spinning Spike/Tamara", "x": 9, "y": 25, "misc": 160}, + {"screen": 7, "sprite": "Spinning Spike/Tamara", "x": 15, "y": 21, "misc": 32}, + {"screen": 7, "sprite": "Spinning Spike/Tamara", "x": 21, "y": 25, "misc": 160}, + {"screen": 7, "sprite": "Mushroom Block", "x": 25, "y": 23, "misc": 0}, + {"screen": 8, "sprite": "Boo/Bomubomu", "x": 17, "y": 26, "misc": 128}, + {"screen": 8, "sprite": "Masked Ghoul/Bullet Bill", "x": 30, "y": 24, "misc": 0}, + {"screen": 9, "sprite": "Boo/Bomubomu", "x": 11, "y": 30, "misc": 128}, + {"screen": 9, "sprite": "Midway Bell", "x": 16, "y": 24, "misc": 0}, + {"screen": 9, "sprite": "Goomba", "x": 26, "y": 30, "misc": 0}, + {"screen": 10, "sprite": "Moving Saw (Ceiling)", "x": 17, "y": 26, "misc": 0}, + {"screen": 10, "sprite": "Moving Saw (Floor)", "x": 19, "y": 22, "misc": 128}, + {"screen": 11, "sprite": "Mushroom Block", "x": 7, "y": 23, "misc": 0}, + {"screen": 11, "sprite": "Moving Saw (Ceiling)", "x": 25, "y": 26, "misc": 128}, + {"screen": 11, "sprite": "Moving Saw (Floor)", "x": 27, "y": 22, "misc": 0}, + {"screen": 11, "sprite": "Money Bag/Bopping Toady", "x": 29, "y": 30, "misc": 0}, + {"screen": 13, "sprite": "Moving Saw (Floor)", "x": 9, "y": 28, "misc": 128}, + {"screen": 13, "sprite": "Moving Saw (Floor)", "x": 19, "y": 28, "misc": 0}, + {"screen": 14, "sprite": "Spinning Spike/Tamara", "x": 13, "y": 25, "misc": 0}, + {"screen": 14, "sprite": "Goomba", "x": 21, "y": 30, "misc": 128}], + "Turtle Zone 1": [ + {"screen": 1, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 2, "y": 16, "misc": 192}, + {"screen": 1, "sprite": "Horizontal Blurp", "x": 12, "y": 21, "misc": 64}, + {"screen": 1, "sprite": "Mushroom Block", "x": 13, "y": 3, "misc": 64}, + {"screen": 2, "sprite": "Horizontal Blurp", "x": 1, "y": 18, "misc": 64}, + {"screen": 2, "sprite": "Spiny Cheep Cheep", "x": 11, "y": 26, "misc": 64}, + {"screen": 2, "sprite": "Cheep Cheep (Vertical)", "x": 26, "y": 28, "misc": 192}, + {"screen": 3, "sprite": "Goomba", "x": 3, "y": 8, "misc": 64}, + {"screen": 3, "sprite": "Goomba", "x": 17, "y": 8, "misc": 64}, + {"screen": 3, "sprite": "Star Block", "x": 17, "y": 1, "misc": 64}, + {"screen": 3, "sprite": "Cheep Cheep (Vertical)", "x": 18, "y": 28, "misc": 192}, + {"screen": 3, "sprite": "Heart Block", "x": 19, "y": 1, "misc": 64}, + {"screen": 3, "sprite": "Shark", "x": 27, "y": 26, "misc": 192}, + {"screen": 4, "sprite": "Paragoomba (Diagonal)", "x": 1, "y": 4, "misc": 64}, + {"screen": 4, "sprite": "Goomba", "x": 10, "y": 8, "misc": 64}, + {"screen": 5, "sprite": "Horizontal Blurp", "x": 1, "y": 16, "misc": 64}, + {"screen": 5, "sprite": "Horizontal Blurp", "x": 9, "y": 22, "misc": 192}, + {"screen": 5, "sprite": "Horizontal Blurp", "x": 16, "y": 26, "misc": 64}, + {"screen": 6, "sprite": "Shark", "x": 12, "y": 21, "misc": 64}, + {"screen": 6, "sprite": "Midway Bell", "x": 21, "y": 18, "misc": 64}, + {"screen": 6, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 25, "y": 16, "misc": 64}, + {"screen": 7, "sprite": "Spiny Cheep Cheep", "x": 21, "y": 17, "misc": 64}, + {"screen": 7, "sprite": "Horizontal Blurp", "x": 25, "y": 26, "misc": 64}, + {"screen": 8, "sprite": "Cheep Cheep (Vertical)", "x": 7, "y": 20, "misc": 64}, + {"screen": 8, "sprite": "Shark", "x": 15, "y": 14, "misc": 192}, + {"screen": 8, "sprite": "Spiny Cheep Cheep", "x": 25, "y": 24, "misc": 192}, + {"screen": 8, "sprite": "Mushroom Block", "x": 31, "y": 3, "misc": 64}, + {"screen": 9, "sprite": "Cheep Cheep (Vertical)", "x": 15, "y": 24, "misc": 64}, + {"screen": 9, "sprite": "Cheep Cheep (Vertical)", "x": 23, "y": 20, "misc": 192}, + {"screen": 9, "sprite": "Cheep Cheep (Vertical)", "x": 29, "y": 26, "misc": 192}, + {"screen": 10, "sprite": "Shark", "x": 10, "y": 18, "misc": 192}, + {"screen": 10, "sprite": "Money Bag Block", "x": 11, "y": 31, "misc": 32}, + {"screen": 11, "sprite": "Shark", "x": 5, "y": 22, "misc": 64}, + {"screen": 11, "sprite": "Horizontal Blurp", "x": 16, "y": 28, "misc": 192}, + {"screen": 11, "sprite": "Bonus Bell", "x": 21, "y": 9, "misc": 64}, + {"screen": 11, "sprite": "Heart Block", "x": 27, "y": 23, "misc": 64}], + "Turtle Zone 2": [ + {"screen": 0, "sprite": "Shark", "x": 17, "y": 12, "misc": 192}, + {"screen": 0, "sprite": "Carrot Block", "x": 21, "y": 19, "misc": 64}, + {"screen": 0, "sprite": "Masked Ghoul/Bullet Bill", "x": 22, "y": 28, "misc": 192}, + {"screen": 1, "sprite": "Honebon/F Boy", "x": 13, "y": 12, "misc": 192}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 19, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Karakara", "x": 28, "y": 27, "misc": 64}, + {"screen": 2, "sprite": "Shark", "x": 7, "y": 10, "misc": 64}, + {"screen": 2, "sprite": "Karakara", "x": 17, "y": 27, "misc": 64}, + {"screen": 2, "sprite": "Karakara", "x": 23, "y": 22, "misc": 64}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 25, "y": 14, "misc": 32}, + {"screen": 3, "sprite": "Karakara", "x": 2, "y": 1, "misc": 64}, + {"screen": 3, "sprite": "Karakara", "x": 6, "y": 14, "misc": 192}, + {"screen": 3, "sprite": "Masked Ghoul/Bullet Bill", "x": 14, "y": 24, "misc": 192}, + {"screen": 3, "sprite": "Flower Block", "x": 21, "y": 11, "misc": 64}, + {"screen": 4, "sprite": "Pencil/Spikey", "x": 7, "y": 26, "misc": 192}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 10, "y": 14, "misc": 160}, + {"screen": 4, "sprite": "Pencil/Spikey", "x": 11, "y": 26, "misc": 192}, + {"screen": 4, "sprite": "Karakara", "x": 21, "y": 22, "misc": 64}, + {"screen": 4, "sprite": "Karakara", "x": 28, "y": 12, "misc": 192}, + {"screen": 5, "sprite": "Pencil/Spikey", "x": 1, "y": 24, "misc": 192}, + {"screen": 5, "sprite": "Star Block", "x": 5, "y": 5, "misc": 64}, + {"screen": 5, "sprite": "Masked Ghoul/Bullet Bill", "x": 26, "y": 24, "misc": 192}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 30, "y": 10, "misc": 32}, + {"screen": 6, "sprite": "Masked Ghoul/Bullet Bill", "x": 6, "y": 28, "misc": 64}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 10, "y": 22, "misc": 32}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 14, "y": 26, "misc": 32}, + {"screen": 6, "sprite": "Midway Bell", "x": 15, "y": 4, "misc": 32}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 18, "y": 10, "misc": 64}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 26, "y": 2, "misc": 64}, + {"screen": 7, "sprite": "Karakara", "x": 8, "y": 14, "misc": 160}, + {"screen": 7, "sprite": "Karakara", "x": 19, "y": 27, "misc": 192}, + {"screen": 8, "sprite": "Flower", "x": 5, "y": 4, "misc": 64}, + {"screen": 8, "sprite": "Heart Block", "x": 7, "y": 3, "misc": 64}, + {"screen": 8, "sprite": "Pencil/Spikey", "x": 11, "y": 24, "misc": 32}, + {"screen": 8, "sprite": "Money Bag Block", "x": 23, "y": 13, "misc": 64}, + {"screen": 9, "sprite": "Pencil/Spikey", "x": 9, "y": 24, "misc": 192}, + {"screen": 9, "sprite": "Pencil/Spikey", "x": 19, "y": 24, "misc": 64}, + {"screen": 10, "sprite": "Rising Platform", "x": 4, "y": 22, "misc": 64}, + {"screen": 10, "sprite": "Rising Platform", "x": 10, "y": 16, "misc": 64}, + {"screen": 10, "sprite": "Bonus Bell", "x": 21, "y": 9, "misc": 64}, + {"screen": 12, "sprite": "Pencil/Spikey", "x": 5, "y": 24, "misc": 192}, + {"screen": 12, "sprite": "Pencil/Spikey", "x": 9, "y": 24, "misc": 192}, + {"screen": 12, "sprite": "Karakara", "x": 19, "y": 24, "misc": 64}, + {"screen": 12, "sprite": "Karakara", "x": 26, "y": 28, "misc": 192}, + {"screen": 13, "sprite": "Karakara", "x": 1, "y": 26, "misc": 192}, + {"screen": 13, "sprite": "Pencil/Spikey", "x": 15, "y": 24, "misc": 64}, + {"screen": 13, "sprite": "Honebon/F Boy", "x": 24, "y": 28, "misc": 192}, + {"screen": 14, "sprite": "Pencil/Spikey", "x": 1, "y": 24, "misc": 192}, + {"screen": 14, "sprite": "Shark", "x": 14, "y": 26, "misc": 64}], + "Turtle Zone 3": [ + {"screen": 1, "sprite": "Ragumo/Aqua Kuribo", "x": 1, "y": 26, "misc": 160}, + {"screen": 1, "sprite": "Ragumo/Aqua Kuribo", "x": 31, "y": 22, "misc": 160}, + {"screen": 2, "sprite": "Carrot Block", "x": 15, "y": 15, "misc": 32}, + {"screen": 2, "sprite": "Pencil/Spikey", "x": 29, "y": 14, "misc": 160}, + {"screen": 3, "sprite": "Pencil/Spikey", "x": 13, "y": 22, "misc": 160}, + {"screen": 3, "sprite": "Pencil/Spikey", "x": 21, "y": 26, "misc": 32}, + {"screen": 4, "sprite": "Ragumo/Aqua Kuribo", "x": 5, "y": 24, "misc": 32}, + {"screen": 5, "sprite": "Paragoomba (Vertical)", "x": 0, "y": 24, "misc": 160}, + {"screen": 5, "sprite": "Midway Bell", "x": 12, "y": 18, "misc": 32}, + {"screen": 5, "sprite": "Ragumo/Aqua Kuribo", "x": 27, "y": 20, "misc": 32}, + {"screen": 5, "sprite": "Mushroom Block", "x": 29, "y": 19, "misc": 32}, + {"screen": 6, "sprite": "Honebon/F Boy", "x": 1, "y": 30, "misc": 160}, + {"screen": 6, "sprite": "Ragumo/Aqua Kuribo", "x": 7, "y": 20, "misc": 160}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 24, "y": 20, "misc": 160}, + {"screen": 7, "sprite": "Ragumo/Aqua Kuribo", "x": 6, "y": 28, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 27, "y": 28, "misc": 160}, + {"screen": 8, "sprite": "Ragumo/Aqua Kuribo", "x": 7, "y": 28, "misc": 160}, + {"screen": 8, "sprite": "Ragumo/Aqua Kuribo", "x": 19, "y": 28, "misc": 32}, + {"screen": 9, "sprite": "Mushroom Block", "x": 17, "y": 13, "misc": 32}, + {"screen": 9, "sprite": "Honebon/F Boy", "x": 27, "y": 22, "misc": 160}, + {"screen": 9, "sprite": "Money Bag Block", "x": 29, "y": 11, "misc": 32}, + {"screen": 11, "sprite": "Paragoomba (Diagonal)", "x": 13, "y": 24, "misc": 160}, + {"screen": 11, "sprite": "Koopa Troopa", "x": 19, "y": 30, "misc": 160}], + "Hippo Zone": [ + {"screen": 0, "sprite": "Money Bag Block", "x": 5, "y": 7, "misc": 32}, + {"screen": 0, "sprite": "Heart Block", "x": 7, "y": 5, "misc": 0}, + {"screen": 0, "sprite": "Heart Block", "x": 31, "y": 19, "misc": 32}, + {"screen": 1, "sprite": "Heart Block", "x": 1, "y": 19, "misc": 32}, + {"screen": 1, "sprite": "Bubble", "x": 6, "y": 24, "misc": 0}, + {"screen": 1, "sprite": "Mushroom Block", "x": 27, "y": 9, "misc": 32}, + {"screen": 2, "sprite": "Toriuo", "x": 11, "y": 8, "misc": 160}, + {"screen": 2, "sprite": "Unibo/Terekuribo", "x": 25, "y": 26, "misc": 128}, + {"screen": 2, "sprite": "Toriuo", "x": 29, "y": 8, "misc": 160}, + {"screen": 3, "sprite": "Toriuo", "x": 11, "y": 8, "misc": 32}, + {"screen": 3, "sprite": "Unibo/Terekuribo", "x": 17, "y": 26, "misc": 128}, + {"screen": 3, "sprite": "Heart Block", "x": 17, "y": 25, "misc": 0}, + {"screen": 4, "sprite": "Toriuo", "x": 3, "y": 8, "misc": 160}, + {"screen": 4, "sprite": "Unibo/Terekuribo", "x": 9, "y": 26, "misc": 128}, + {"screen": 4, "sprite": "Toriuo", "x": 21, "y": 8, "misc": 32}, + {"screen": 5, "sprite": "Horizontal Blurp", "x": 6, "y": 10, "misc": 160}, + {"screen": 5, "sprite": "Mushroom Block", "x": 13, "y": 11, "misc": 32}, + {"screen": 5, "sprite": "Horizontal Blurp", "x": 19, "y": 12, "misc": 32}, + {"screen": 5, "sprite": "Unibo/Terekuribo", "x": 25, "y": 10, "misc": 128}, + {"screen": 5, "sprite": "Unibo/Terekuribo", "x": 27, "y": 18, "misc": 0}, + {"screen": 6, "sprite": "Unibo/Terekuribo", "x": 7, "y": 22, "misc": 128}, + {"screen": 6, "sprite": "Unibo/Terekuribo", "x": 11, "y": 12, "misc": 128}, + {"screen": 6, "sprite": "Horizontal Blurp", "x": 13, "y": 14, "misc": 160}, + {"screen": 6, "sprite": "Bubble", "x": 14, "y": 30, "misc": 0}, + {"screen": 7, "sprite": "Dondon", "x": 13, "y": 10, "misc": 128}, + {"screen": 7, "sprite": "Dondon", "x": 15, "y": 18, "misc": 128}, + {"screen": 7, "sprite": "Dondon", "x": 17, "y": 26, "misc": 0}, + {"screen": 7, "sprite": "Toriuo", "x": 25, "y": 8, "misc": 160}, + {"screen": 8, "sprite": "Toriuo", "x": 5, "y": 8, "misc": 160}, + {"screen": 8, "sprite": "Flower Block", "x": 19, "y": 25, "misc": 0}, + {"screen": 8, "sprite": "Toriuo", "x": 21, "y": 8, "misc": 160}, + {"screen": 8, "sprite": "Toriuo", "x": 31, "y": 8, "misc": 32}, + {"screen": 9, "sprite": "Money Bag Block", "x": 11, "y": 5, "misc": 0}, + {"screen": 9, "sprite": "Horizontal Blurp", "x": 15, "y": 12, "misc": 160}, + {"screen": 9, "sprite": "Horizontal Blurp", "x": 27, "y": 10, "misc": 160}, + {"screen": 10, "sprite": "Dondon", "x": 9, "y": 14, "misc": 0}, + {"screen": 10, "sprite": "Dondon", "x": 13, "y": 24, "misc": 0}, + {"screen": 10, "sprite": "Toriuo", "x": 19, "y": 8, "misc": 32}, + {"screen": 11, "sprite": "Bonus Bell", "x": 21, "y": 5, "misc": 0}], + "Space Zone 1": [ + {"screen": 1, "sprite": "Boo/Bomubomu", "x": 19, "y": 26, "misc": 160}, + {"screen": 2, "sprite": "Boo/Bomubomu", "x": 3, "y": 26, "misc": 160}, + {"screen": 3, "sprite": "Boo/Bomubomu", "x": 5, "y": 26, "misc": 160}, + {"screen": 3, "sprite": "Rerere/Poro", "x": 25, "y": 5, "misc": 160}, + {"screen": 4, "sprite": "Money Bag Block", "x": 9, "y": 21, "misc": 0}, + {"screen": 4, "sprite": "Money Bag Block", "x": 11, "y": 29, "misc": 0}, + {"screen": 4, "sprite": "Heart", "x": 13, "y": 6, "misc": 32}, + {"screen": 4, "sprite": "Mushroom Block", "x": 23, "y": 15, "misc": 32}, + {"screen": 5, "sprite": "No 48/Mogyo", "x": 1, "y": 21, "misc": 32}, + {"screen": 5, "sprite": "Heart", "x": 5, "y": 16, "misc": 0}, + {"screen": 5, "sprite": "Boo/Bomubomu", "x": 23, "y": 28, "misc": 160}, + {"screen": 6, "sprite": "Rerere/Poro", "x": 18, "y": 20, "misc": 32}, + {"screen": 7, "sprite": "Flower Block", "x": 5, "y": 11, "misc": 32}, + {"screen": 7, "sprite": "Rerere/Poro", "x": 6, "y": 20, "misc": 160}, + {"screen": 7, "sprite": "Midway Bell", "x": 15, "y": 22, "misc": 32}, + {"screen": 7, "sprite": "Rerere/Poro", "x": 19, "y": 13, "misc": 32}, + {"screen": 8, "sprite": "Boo/Bomubomu", "x": 1, "y": 28, "misc": 32}, + {"screen": 8, "sprite": "Money Bag Block", "x": 7, "y": 21, "misc": 32}, + {"screen": 8, "sprite": "Boo/Bomubomu", "x": 17, "y": 28, "misc": 32}, + {"screen": 9, "sprite": "Heart Block", "x": 3, "y": 15, "misc": 0}, + {"screen": 9, "sprite": "Boo/Bomubomu", "x": 8, "y": 24, "misc": 32}, + {"screen": 9, "sprite": "Rerere/Poro", "x": 31, "y": 15, "misc": 160}, + {"screen": 10, "sprite": "Boo/Bomubomu", "x": 31, "y": 20, "misc": 32}, + {"screen": 11, "sprite": "Boo/Bomubomu", "x": 3, "y": 28, "misc": 32}, + {"screen": 11, "sprite": "Bonus Bell", "x": 21, "y": 11, "misc": 32}], + "Space Zone 2": [ + {"screen": 2, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 5, "y": 22, "misc": 128}, + {"screen": 2, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 25, "y": 16, "misc": 128}, + {"screen": 2, "sprite": "Star (Horizontal)/Blurp (Vertical)", "x": 27, "y": 30, "misc": 128}, + {"screen": 3, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 11, "y": 10, "misc": 128}, + {"screen": 4, "sprite": "Mushroom", "x": 1, "y": 6, "misc": 0}, + {"screen": 4, "sprite": "Star (Horizontal)/Blurp (Vertical)", "x": 3, "y": 30, "misc": 128}, + {"screen": 4, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 23, "y": 26, "misc": 128}, + {"screen": 5, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 1, "y": 22, "misc": 128}, + {"screen": 5, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 9, "y": 26, "misc": 128}, + {"screen": 5, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 27, "y": 14, "misc": 0}, + {"screen": 6, "sprite": "Mushroom Block", "x": 13, "y": 15, "misc": 0}, + {"screen": 6, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 19, "y": 18, "misc": 128}, + {"screen": 7, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 13, "y": 22, "misc": 128}, + {"screen": 7, "sprite": "Mushroom Block", "x": 17, "y": 9, "misc": 0}, + {"screen": 7, "sprite": "Tosenbo/Pikku", "x": 27, "y": 24, "misc": 128}, + {"screen": 8, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 3, "y": 16, "misc": 128}, + {"screen": 9, "sprite": "Tosenbo/Pikku", "x": 3, "y": 16, "misc": 0}, + {"screen": 9, "sprite": "Tosenbo/Pikku", "x": 25, "y": 16, "misc": 0}, + {"screen": 10, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 13, "y": 16, "misc": 128}, + {"screen": 10, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 25, "y": 16, "misc": 128}, + {"screen": 11, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 15, "y": 20, "misc": 128}, + {"screen": 11, "sprite": "Star (Horizontal)/Blurp (Vertical)", "x": 25, "y": 22, "misc": 0}, + {"screen": 12, "sprite": "Star (Vertical)/Blurp (Horizontal)", "x": 5, "y": 16, "misc": 128}, + {"screen": 12, "sprite": "Mushroom Block", "x": 31, "y": 11, "misc": 0}, + {"screen": 13, "sprite": "Star Block", "x": 5, "y": 17, "misc": 0}, + {"screen": 13, "sprite": "Tosenbo/Pikku", "x": 7, "y": 17, "misc": 128}, + {"screen": 13, "sprite": "Midway Bell", "x": 19, "y": 20, "misc": 0}, + {"screen": 13, "sprite": "Mushroom", "x": 31, "y": 6, "misc": 0}, + {"screen": 15, "sprite": "Tosenbo/Pikku", "x": 1, "y": 26, "misc": 128}, + {"screen": 15, "sprite": "Mushroom Block", "x": 17, "y": 19, "misc": 0}], + "Macro Zone 1": [ + {"screen": 1, "sprite": "Kyotonbo", "x": 1, "y": 22, "misc": 0}, + {"screen": 1, "sprite": "Goronto", "x": 23, "y": 26, "misc": 128}, + {"screen": 2, "sprite": "Moving Platform (Large, Horizontal)", "x": 20, "y": 31, + "misc": 64}, {"screen": 3, "sprite": "Chikunto", "x": 1, "y": 16, "misc": 64}, + {"screen": 3, "sprite": "Mushroom Block", "x": 3, "y": 21, "misc": 64}, + {"screen": 4, "sprite": "Chikunto", "x": 19, "y": 28, "misc": 192}, + {"screen": 5, "sprite": "Big Diagonal Moving Platform", "x": 12, "y": 23, + "misc": 64}, + {"screen": 5, "sprite": "Moving Platform (Large, Horizontal)", "x": 14, "y": 31, + "misc": 64}, + {"screen": 5, "sprite": "Carrot Block", "x": 15, "y": 13, "misc": 64}, + {"screen": 6, "sprite": "Dokanto", "x": 25, "y": 28, "misc": 64}, + {"screen": 6, "sprite": "Carrot Block", "x": 31, "y": 27, "misc": 64}, + {"screen": 7, "sprite": "Kyotonbo", "x": 27, "y": 28, "misc": 64}, + {"screen": 8, "sprite": "Flower Block", "x": 1, "y": 27, "misc": 64}, + {"screen": 8, "sprite": "Chikunto", "x": 9, "y": 28, "misc": 64}, + {"screen": 9, "sprite": "Heart Block", "x": 11, "y": 27, "misc": 64}, + {"screen": 9, "sprite": "Chikunto", "x": 19, "y": 28, "misc": 192}, + {"screen": 9, "sprite": "Money Bag Block", "x": 25, "y": 27, "misc": 64}, + {"screen": 9, "sprite": "Goronto", "x": 29, "y": 28, "misc": 64}, + {"screen": 10, "sprite": "Heart Block", "x": 9, "y": 9, "misc": 32}, + {"screen": 10, "sprite": "Heart Block", "x": 13, "y": 9, "misc": 32}, + {"screen": 10, "sprite": "Midway Bell", "x": 15, "y": 26, "misc": 64}, + {"screen": 10, "sprite": "Heart Block", "x": 21, "y": 9, "misc": 32}, + {"screen": 10, "sprite": "Moving Platform (Large, Horizontal)", "x": 30, "y": 31, + "misc": 64}, + {"screen": 11, "sprite": "Carrot Block", "x": 3, "y": 15, "misc": 64}, + {"screen": 11, "sprite": "Falling Platform", "x": 26, "y": 17, "misc": 64}, + {"screen": 12, "sprite": "Moving Platform (Large, Horizontal)", "x": 28, "y": 31, + "misc": 64}, {"screen": 13, "sprite": "Kyotonbo", "x": 3, "y": 18, "misc": 192}, + {"screen": 13, "sprite": "Chikunto", "x": 17, "y": 28, "misc": 64}, + {"screen": 13, "sprite": "Dokanto", "x": 25, "y": 18, "misc": 64}, + {"screen": 14, "sprite": "Kyotonbo", "x": 0, "y": 28, "misc": 32}, + {"screen": 14, "sprite": "Moving Platform (Large, Horizontal)", "x": 0, "y": 31, + "misc": 64}, {"screen": 14, "sprite": "Goronto", "x": 12, "y": 26, "misc": 32}, + {"screen": 14, "sprite": "Dokanto", "x": 19, "y": 28, "misc": 192}, + {"screen": 14, "sprite": "Flower Block", "x": 21, "y": 21, "misc": 64}, + {"screen": 15, "sprite": "Big Diagonal Moving Platform", "x": 13, "y": 21, + "misc": 64}, + {"screen": 15, "sprite": "Bonus Bell", "x": 21, "y": 11, "misc": 64}], + "Macro Zone 2": [ + {"screen": 1, "sprite": "Ant", "x": 10, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Mushroom Block", "x": 19, "y": 19, "misc": 32}, + {"screen": 1, "sprite": "Piranha Plant", "x": 28, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Ant", "x": 21, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Battle Beetle", "x": 23, "y": 24, "misc": 32}, + {"screen": 3, "sprite": "Ant", "x": 5, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Fire Piranha Plant", "x": 22, "y": 2, "misc": 192}, + {"screen": 4, "sprite": "Ant", "x": 8, "y": 26, "misc": 160}, + {"screen": 4, "sprite": "Fire Piranha Plant", "x": 18, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Piranha Plant", "x": 6, "y": 30, "misc": 160}, + {"screen": 5, "sprite": "Battle Beetle", "x": 16, "y": 26, "misc": 32}, + {"screen": 6, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 5, "y": 26, "misc": 192}, + {"screen": 6, "sprite": "Carrot Block", "x": 7, "y": 15, "misc": 64}, + {"screen": 6, "sprite": "Ant", "x": 16, "y": 18, "misc": 64}, + {"screen": 7, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 0, "y": 23, "misc": 192}, + {"screen": 7, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 11, "y": 28, "misc": 64}, + {"screen": 7, "sprite": "Fire Piranha Plant", "x": 30, "y": 20, "misc": 192}, + {"screen": 8, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 15, "y": 28, "misc": 64}, + {"screen": 8, "sprite": "Star Block", "x": 19, "y": 9, "misc": 64}, + {"screen": 8, "sprite": "Piranha Plant", "x": 30, "y": 22, "misc": 64}, + {"screen": 9, "sprite": "Cheep Cheep (Vertical)", "x": 11, "y": 28, "misc": 64}, + {"screen": 9, "sprite": "Cheep Cheep (Vertical)", "x": 17, "y": 28, "misc": 64}, + {"screen": 9, "sprite": "Midway Bell", "x": 31, "y": 14, "misc": 64}, + {"screen": 10, "sprite": "Ant", "x": 1, "y": 18, "misc": 64}, + {"screen": 10, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 31, "y": 28, "misc": 64}, + {"screen": 11, "sprite": "Ant", "x": 3, "y": 16, "misc": 64}, + {"screen": 11, "sprite": "Star Block", "x": 9, "y": 15, "misc": 64}, + {"screen": 11, "sprite": "Owl Platform (Horizontal)/Cheep Cheep (Horizontal)", "x": 19, "y": 15, "misc": 160}, + {"screen": 11, "sprite": "Cheep Cheep (Vertical)", "x": 21, "y": 29, "misc": 64}, + {"screen": 12, "sprite": "Be", "x": 9, "y": 14, "misc": 32}, + {"screen": 12, "sprite": "Be", "x": 21, "y": 24, "misc": 32}, + {"screen": 12, "sprite": "Be", "x": 27, "y": 24, "misc": 32}, + {"screen": 13, "sprite": "Mushroom Block", "x": 7, "y": 23, "misc": 32}, + {"screen": 13, "sprite": "Bonus Bell", "x": 21, "y": 15, "misc": 32}], + "Macro Zone 3": [ + {"screen": 1, "sprite": "Koopa Troopa", "x": 0, "y": 26, "misc": 32}, + {"screen": 1, "sprite": "Goomba", "x": 9, "y": 22, "misc": 32}, + {"screen": 1, "sprite": "Carrot Block", "x": 17, "y": 13, "misc": 32}, + {"screen": 1, "sprite": "Goomba", "x": 23, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Goomba", "x": 4, "y": 26, "misc": 32}, + {"screen": 2, "sprite": "Goomba", "x": 29, "y": 26, "misc": 32}, + {"screen": 3, "sprite": "Piranha Plant", "x": 28, "y": 2, "misc": 64}, + {"screen": 4, "sprite": "Piranha Plant (Downward)/Grubby", "x": 4, "y": 25, "misc": 160}, + {"screen": 4, "sprite": "Goomba", "x": 14, "y": 30, "misc": 160}, + {"screen": 4, "sprite": "Goomba", "x": 30, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Piranha Plant (Downward)/Grubby", "x": 8, "y": 25, "misc": 32}, + {"screen": 5, "sprite": "Money Bag Block", "x": 11, "y": 21, "misc": 64}, + {"screen": 5, "sprite": "Honebon/F Boy", "x": 11, "y": 30, "misc": 64}, + {"screen": 5, "sprite": "Paragoomba (Diagonal)", "x": 23, "y": 28, "misc": 32}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 15, "y": 26, "misc": 64}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 23, "y": 26, "misc": 64}, + {"screen": 7, "sprite": "Mushroom Block", "x": 1, "y": 23, "misc": 64}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 11, "y": 26, "misc": 64}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 21, "y": 26, "misc": 64}, + {"screen": 8, "sprite": "Heart Block", "x": 3, "y": 5, "misc": 32}, + {"screen": 8, "sprite": "Koopa Troopa", "x": 7, "y": 26, "misc": 64}, + {"screen": 8, "sprite": "Koopa Troopa", "x": 17, "y": 26, "misc": 64}, + {"screen": 8, "sprite": "Star Block", "x": 29, "y": 23, "misc": 64}, + {"screen": 8, "sprite": "Midway Bell", "x": 31, "y": 22, "misc": 32}, + {"screen": 9, "sprite": "Be", "x": 31, "y": 18, "misc": 32}, + {"screen": 10, "sprite": "Be", "x": 11, "y": 18, "misc": 32}, + {"screen": 11, "sprite": "Piranha Plant", "x": 16, "y": 24, "misc": 160}, + {"screen": 12, "sprite": "Carrot Block", "x": 23, "y": 17, "misc": 32}, + {"screen": 13, "sprite": "Koopa Troopa", "x": 7, "y": 4, "misc": 160}, + {"screen": 13, "sprite": "Paragoomba (Vertical)", "x": 15, "y": 24, "misc": 128}, + {"screen": 13, "sprite": "Bonus Bell", "x": 23, "y": 5, "misc": 0}], + "Macro Zone 4": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 1, "y": 23, "misc": 32}, + {"screen": 1, "sprite": "Goomba", "x": 7, "y": 28, "misc": 160}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 17, "y": 24, "misc": 32}, + {"screen": 2, "sprite": "Runaway Heart Block/Bibi", "x": 5, "y": 23, "misc": 32}, + {"screen": 3, "sprite": "Goomba", "x": 11, "y": 24, "misc": 32}, + {"screen": 3, "sprite": "Goomba", "x": 21, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Piranha Plant", "x": 6, "y": 24, "misc": 32}, + {"screen": 5, "sprite": "Piranha Plant (Downward)/Grubby", "x": 4, "y": 25, "misc": 32}, + {"screen": 5, "sprite": "Money Bag Block", "x": 11, "y": 7, "misc": 32}, + {"screen": 5, "sprite": "Carrot Block", "x": 15, "y": 23, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 19, "y": 30, "misc": 160}, + {"screen": 6, "sprite": "Goomba", "x": 7, "y": 30, "misc": 160}, + {"screen": 6, "sprite": "Goomba", "x": 11, "y": 18, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 25, "y": 30, "misc": 160}, + {"screen": 7, "sprite": "Runaway Heart Block/Bibi", "x": 5, "y": 23, "misc": 32}, + {"screen": 7, "sprite": "Fire Piranha Plant", "x": 24, "y": 30, "misc": 160}, + {"screen": 8, "sprite": "Midway Bell", "x": 3, "y": 20, "misc": 32}, + {"screen": 8, "sprite": "Piranha Plant", "x": 8, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Goomba", "x": 26, "y": 24, "misc": 32}, + {"screen": 9, "sprite": "Mushroom Block", "x": 1, "y": 11, "misc": 32}, + {"screen": 9, "sprite": "Goomba", "x": 1, "y": 20, "misc": 32}, + {"screen": 9, "sprite": "Paragoomba (Diagonal)", "x": 13, "y": 16, "misc": 160}, + {"screen": 10, "sprite": "Paragoomba (Diagonal)", "x": 29, "y": 26, "misc": 160}, + {"screen": 11, "sprite": "Paragoomba (Diagonal)", "x": 13, "y": 26, "misc": 32}], + "Mario's Castle": [ + {"screen": 0, "sprite": "Mushroom Block", "x": 15, "y": 17, "misc": 32}, + {"screen": 1, "sprite": "Falling Bone Platform", "x": 14, "y": 27, "misc": 32}, + {"screen": 1, "sprite": "Falling Bone Platform", "x": 22, "y": 27, "misc": 32}, + {"screen": 1, "sprite": "Skull Platform", "x": 25, "y": 30, "misc": 64}, + {"screen": 1, "sprite": "Rising Bone Platform", "x": 30, "y": 28, "misc": 32}, + {"screen": 2, "sprite": "Skull Platform", "x": 5, "y": 30, "misc": 64}, + {"screen": 2, "sprite": "Falling Bone Platform", "x": 16, "y": 27, "misc": 32}, + {"screen": 2, "sprite": "Falling Bone Platform", "x": 24, "y": 27, "misc": 32}, + {"screen": 2, "sprite": "Skull Platform", "x": 29, "y": 30, "misc": 64}, + {"screen": 3, "sprite": "Rising Bone Platform", "x": 0, "y": 28, "misc": 32}, + {"screen": 3, "sprite": "Skull Platform", "x": 3, "y": 30, "misc": 64}, + {"screen": 3, "sprite": "Rising Bone Platform", "x": 18, "y": 28, "misc": 32}, + {"screen": 3, "sprite": "Skull Platform", "x": 25, "y": 30, "misc": 64}, + {"screen": 3, "sprite": "Falling Bone Platform", "x": 26, "y": 27, "misc": 32}, + {"screen": 3, "sprite": "Skull Platform", "x": 27, "y": 30, "misc": 64}, + {"screen": 4, "sprite": "Rising Bone Platform", "x": 2, "y": 28, "misc": 32}, + {"screen": 4, "sprite": "Genkottsu (1.5 Tiles)", "x": 22, "y": 31, "misc": 64}, + {"screen": 5, "sprite": "Genkottsu (2 Tiles)", "x": 6, "y": 31, "misc": 64}, + {"screen": 5, "sprite": "Karamenbo", "x": 14, "y": 20, "misc": 32}, + {"screen": 5, "sprite": "Karamenbo", "x": 20, "y": 20, "misc": 32}, + {"screen": 5, "sprite": "Genkottsu (2 Tiles)", "x": 22, "y": 31, "misc": 64}, + {"screen": 6, "sprite": "Karamenbo", "x": 1, "y": 20, "misc": 32}, + {"screen": 6, "sprite": "Karamenbo", "x": 8, "y": 20, "misc": 32}, + {"screen": 6, "sprite": "Karamenbo", "x": 21, "y": 20, "misc": 32}, + {"screen": 7, "sprite": "Propeller Platform", "x": 4, "y": 30, "misc": 64}, + {"screen": 7, "sprite": "Propeller Platform", "x": 16, "y": 30, "misc": 64}, + {"screen": 7, "sprite": "Floating Face", "x": 19, "y": 26, "misc": 32}, + {"screen": 8, "sprite": "Propeller Platform", "x": 4, "y": 30, "misc": 64}, + {"screen": 8, "sprite": "Floating Face", "x": 17, "y": 29, "misc": 32}, + {"screen": 8, "sprite": "Floating Face", "x": 17, "y": 23, "misc": 32}, + {"screen": 8, "sprite": "Propeller Platform", "x": 18, "y": 30, "misc": 64}, + {"screen": 9, "sprite": "Floating Face", "x": 15, "y": 28, "misc": 32}, + {"screen": 9, "sprite": "Floating Face", "x": 16, "y": 22, "misc": 32}, + {"screen": 10, "sprite": "Mushroom Block", "x": 1, "y": 23, "misc": 64}, + {"screen": 10, "sprite": "Spike Ball (Large)", "x": 11, "y": 28, "misc": 64}, + {"screen": 10, "sprite": "Mushroom Block", "x": 15, "y": 23, "misc": 32}, + {"screen": 10, "sprite": "Spike Ball (Small)", "x": 29, "y": 30, "misc": 64}, + {"screen": 11, "sprite": "Fire Pakkun Zo (Left)", "x": 8, "y": 28, "misc": 192}, + {"screen": 11, "sprite": "Fire Pakkun Zo (Left)", "x": 14, "y": 26, "misc": 64}, + {"screen": 11, "sprite": "Spike Ball (Large)", "x": 31, "y": 30, "misc": 192}, + {"screen": 12, "sprite": "Fire Pakkun Zo (Large)", "x": 15, "y": 26, "misc": 64}, + {"screen": 12, "sprite": "Fire Pakkun Zo (Left)", "x": 24, "y": 28, "misc": 192}, + {"screen": 13, "sprite": "Fire Pakkun Zo (Left)", "x": 0, "y": 24, "misc": 64}, + {"screen": 13, "sprite": "Fire Pakkun Zo (Left)", "x": 8, "y": 24, "misc": 64}, + {"screen": 13, "sprite": "Spike Ball (Large)", "x": 29, "y": 30, "misc": 64}, + {"screen": 14, "sprite": "Spike Ball (Small)", "x": 12, "y": 26, "misc": 192}, + {"screen": 15, "sprite": "Fire Pakkun Zo (Right)", "x": 4, "y": 16, "misc": 64}, + {"screen": 15, "sprite": "Mushroom Block", "x": 15, "y": 19, "misc": 32}], + "Scenic Course": [ + {"screen": 1, "sprite": "Paragoomba (Diagonal)", "x": 1, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Goomba", "x": 11, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Paragoomba (Diagonal)", "x": 21, "y": 30, "misc": 32}, + {"screen": 1, "sprite": "Goomba", "x": 31, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Paragoomba (Diagonal)", "x": 9, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Mushroom Block", "x": 15, "y": 23, "misc": 32}, + {"screen": 2, "sprite": "Goomba", "x": 19, "y": 30, "misc": 32}, + {"screen": 2, "sprite": "Paragoomba (Diagonal)", "x": 29, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Paragoomba (Diagonal)", "x": 7, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Goomba", "x": 17, "y": 30, "misc": 32}, + {"screen": 3, "sprite": "Star Block", "x": 19, "y": 23, "misc": 32}, + {"screen": 3, "sprite": "Paragoomba (Diagonal)", "x": 27, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Goomba", "x": 5, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Goomba", "x": 15, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Mushroom Block", "x": 17, "y": 23, "misc": 32}, + {"screen": 4, "sprite": "Paragoomba (Diagonal)", "x": 25, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Paragoomba (Diagonal)", "x": 3, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Paragoomba (Diagonal)", "x": 13, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Goomba", "x": 17, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 1, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Paragoomba (Diagonal)", "x": 11, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 21, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Paragoomba (Diagonal)", "x": 31, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Paragoomba (Diagonal)", "x": 9, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Flower Block", "x": 11, "y": 23, "misc": 32}, + {"screen": 7, "sprite": "Paragoomba (Diagonal)", "x": 19, "y": 30, "misc": 32}], + "Turtle Zone Secret Course": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 7, "y": 21, "misc": 32}, + {"screen": 1, "sprite": "Heart Block", "x": 27, "y": 15, "misc": 32}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 29, "y": 28, "misc": 32}, + {"screen": 3, "sprite": "Flower Block", "x": 11, "y": 21, "misc": 32}, + {"screen": 4, "sprite": "Money Bag Block", "x": 1, "y": 19, "misc": 32}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 31, "y": 28, "misc": 32}, + {"screen": 5, "sprite": "Carrot Block", "x": 15, "y": 21, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 1, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Piranha Plant", "x": 6, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Mushroom Block", "x": 19, "y": 23, "misc": 32}, + {"screen": 7, "sprite": "Flower Block", "x": 21, "y": 23, "misc": 32}, + {"screen": 7, "sprite": "Carrot Block", "x": 23, "y": 23, "misc": 32}], + "Pumpkin Zone Secret Course 1": [ + {"screen": 0, "sprite": "Carrot Block", "x": 29, "y": 29, "misc": 0}, + {"screen": 1, "sprite": "Paragoomba (Vertical)", "x": 22, "y": 0, "misc": 32}, + {"screen": 2, "sprite": "Paragoomba (Vertical)", "x": 14, "y": 2, "misc": 32}, + {"screen": 3, "sprite": "Paragoomba (Vertical)", "x": 6, "y": 4, "misc": 32}, + {"screen": 3, "sprite": "Paragoomba (Vertical)", "x": 30, "y": 30, "misc": 0}, + {"screen": 4, "sprite": "Paragoomba (Vertical)", "x": 23, "y": 4, "misc": 32}, + {"screen": 5, "sprite": "Goomba", "x": 15, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Goomba", "x": 25, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 19, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Goomba", "x": 29, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Goomba", "x": 11, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Goomba", "x": 29, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Goomba", "x": 15, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Star", "x": 25, "y": 24, "misc": 32}], + "Space Zone Secret Course": [ + {"screen": 2, "sprite": "Rerere/Poro", "x": 2, "y": 2, "misc": 32}, + {"screen": 3, "sprite": "Rerere/Poro", "x": 14, "y": 20, "misc": 0}, + {"screen": 4, "sprite": "Heart", "x": 3, "y": 22, "misc": 32}, + {"screen": 4, "sprite": "Heart", "x": 5, "y": 22, "misc": 32}, + {"screen": 4, "sprite": "Rerere/Poro", "x": 26, "y": 2, "misc": 32}, + {"screen": 5, "sprite": "Heart Block", "x": 21, "y": 19, "misc": 0}], + "Tree Zone Secret Course": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 3, "y": 13, "misc": 32}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 9, "y": 24, "misc": 32}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 13, "y": 14, "misc": 32}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 25, "y": 16, "misc": 32}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 3, "y": 20, "misc": 32}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 19, "y": 22, "misc": 32}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 27, "y": 22, "misc": 32}, + {"screen": 3, "sprite": "Koopa Troopa", "x": 11, "y": 24, "misc": 32}, + {"screen": 3, "sprite": "Koopa Troopa", "x": 19, "y": 24, "misc": 32}, + {"screen": 3, "sprite": "Koopa Troopa", "x": 31, "y": 26, "misc": 32}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 9, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 17, "y": 30, "misc": 32}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 25, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 1, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 11, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 17, "y": 30, "misc": 32}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 29, "y": 30, "misc": 32}, + {"screen": 6, "sprite": "Heart Block", "x": 9, "y": 13, "misc": 32}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 17, "y": 26, "misc": 32}, + {"screen": 6, "sprite": "Koopa Troopa", "x": 27, "y": 26, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 1, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 11, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 21, "y": 30, "misc": 32}, + {"screen": 7, "sprite": "Koopa Troopa", "x": 31, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Koopa Troopa", "x": 7, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Koopa Troopa", "x": 17, "y": 30, "misc": 32}, + {"screen": 8, "sprite": "Koopa Troopa", "x": 27, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Koopa Troopa", "x": 5, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Koopa Troopa", "x": 13, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Koopa Troopa", "x": 21, "y": 30, "misc": 32}, + {"screen": 9, "sprite": "Heart Block", "x": 31, "y": 13, "misc": 32}], + "Macro Zone Secret Course": [ + {"screen": 1, "sprite": "Mushroom Block", "x": 11, "y": 15, "misc": 32}, + {"screen": 1, "sprite": "Falling Platform", "x": 28, "y": 26, "misc": 32}, + {"screen": 2, "sprite": "Falling Platform", "x": 12, "y": 26, "misc": 32}, + {"screen": 2, "sprite": "Falling Platform", "x": 18, "y": 26, "misc": 32}, + {"screen": 3, "sprite": "Heart Block", "x": 11, "y": 21, "misc": 32}, + {"screen": 5, "sprite": "Flower Block", "x": 17, "y": 17, "misc": 32}, + {"screen": 6, "sprite": "Heart Block", "x": 25, "y": 27, "misc": 32}], + "Pumpkin Zone Secret Course 2": [ + {"screen": 0, "sprite": "Flower Block", "x": 25, "y": 11, "misc": 0}, + {"screen": 1, "sprite": "Heart Block", "x": 9, "y": 17, "misc": 0}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 16, "y": 20, "misc": 0}, + {"screen": 1, "sprite": "Heart Block", "x": 23, "y": 15, "misc": 0}, + {"screen": 1, "sprite": "Koopa Troopa", "x": 29, "y": 20, "misc": 0}, + {"screen": 2, "sprite": "Heart Block", "x": 5, "y": 13, "misc": 0}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 13, "y": 20, "misc": 0}, + {"screen": 2, "sprite": "Goomba", "x": 21, "y": 20, "misc": 0}, + {"screen": 2, "sprite": "Koopa Troopa", "x": 31, "y": 20, "misc": 0}, + {"screen": 3, "sprite": "Heart Block", "x": 17, "y": 17, "misc": 0}, + {"screen": 3, "sprite": "Heart Block", "x": 25, "y": 13, "misc": 0}, + {"screen": 4, "sprite": "Koopa Troopa", "x": 1, "y": 20, "misc": 0}, + {"screen": 4, "sprite": "Falling Platform", "x": 18, "y": 24, "misc": 0}, + {"screen": 5, "sprite": "Falling Platform", "x": 2, "y": 22, "misc": 0}, + {"screen": 5, "sprite": "Koopa Troopa", "x": 10, "y": 22, "misc": 0}, + {"screen": 5, "sprite": "Mushroom Block", "x": 11, "y": 15, "misc": 0}, + {"screen": 5, "sprite": "Falling Platform", "x": 18, "y": 24, "misc": 0}, + {"screen": 5, "sprite": "Falling Platform", "x": 26, "y": 24, "misc": 0}, + {"screen": 6, "sprite": "Falling Platform", "x": 2, "y": 24, "misc": 0}, + {"screen": 6, "sprite": "Falling Platform", "x": 10, "y": 24, "misc": 0}, + {"screen": 6, "sprite": "Falling Platform", "x": 18, "y": 24, "misc": 0}, + {"screen": 7, "sprite": "Goomba", "x": 13, "y": 18, "misc": 0}, + {"screen": 7, "sprite": "Heart Block", "x": 15, "y": 17, "misc": 0}, + {"screen": 7, "sprite": "Goomba", "x": 29, "y": 18, "misc": 0}, + {"screen": 8, "sprite": "Heart Block", "x": 9, "y": 17, "misc": 0}, + {"screen": 8, "sprite": "Goomba", "x": 11, "y": 18, "misc": 0}, + {"screen": 8, "sprite": "Heart Block", "x": 23, "y": 17, "misc": 0}, + {"screen": 8, "sprite": "Goomba", "x": 25, "y": 18, "misc": 0}, + {"screen": 9, "sprite": "Falling Platform", "x": 12, "y": 20, "misc": 0}, + {"screen": 9, "sprite": "Heart", "x": 23, "y": 16, "misc": 0}, + {"screen": 10, "sprite": "Falling Platform", "x": 0, "y": 22, "misc": 0}, + {"screen": 10, "sprite": "Heart", "x": 17, "y": 14, "misc": 0}]} diff --git a/worlds/meritous/Items.py b/worlds/meritous/Items.py index 9f28c5d178..030c93ddec 100644 --- a/worlds/meritous/Items.py +++ b/worlds/meritous/Items.py @@ -6,7 +6,6 @@ import typing from BaseClasses import Item, ItemClassification -from worlds.alttp import ALTTPWorld class MeritousLttPText(typing.NamedTuple): @@ -206,9 +205,13 @@ item_groups = { "Crystals": ["Crystals x500", "Crystals x1000", "Crystals x2000"] } -ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" - for name, texts in LttPCreditsText.items()}) -ALTTPWorld.sickkid_credit_texts.update({item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) -ALTTPWorld.magicshop_credit_texts.update({item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) -ALTTPWorld.zora_credit_texts.update({item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) -ALTTPWorld.fluteboy_credit_texts.update({item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +try: + from worlds.alttp import ALTTPWorld + ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" + for name, texts in LttPCreditsText.items()}) + ALTTPWorld.sickkid_credit_texts.update({item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) + ALTTPWorld.magicshop_credit_texts.update({item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) + ALTTPWorld.zora_credit_texts.update({item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) + ALTTPWorld.fluteboy_credit_texts.update({item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +except ModuleNotFoundError: + pass diff --git a/worlds/meritous/archipelago.json b/worlds/meritous/archipelago.json new file mode 100644 index 0000000000..7b2c545726 --- /dev/null +++ b/worlds/meritous/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Meritous", + "authors": ["KewlioMZX"], + "world_version": "1.0.0", + "minimum_ap_version": "0.6.4" +} diff --git a/worlds/messenger/__init__.py b/worlds/messenger/__init__.py index 09911fd531..88a0cec2ca 100644 --- a/worlds/messenger/__init__.py +++ b/worlds/messenger/__init__.py @@ -6,12 +6,12 @@ from Options import Accessibility from Utils import output_path from settings import FilePath, Group from worlds.AutoWorld import WebWorld, World -from worlds.LauncherComponents import Component, Type, components +from worlds.LauncherComponents import Component, Type, components, icon_paths from .client_setup import launch_game from .connections import CONNECTIONS, RANDOMIZED_CONNECTIONS, TRANSITIONS from .constants import ALL_ITEMS, ALWAYS_LOCATIONS, BOSS_LOCATIONS, FILLER, NOTES, PHOBEKINS, PROG_ITEMS, TRAPS, \ USEFUL_ITEMS -from .options import AvailablePortals, Goal, Logic, MessengerOptions, NotesNeeded, ShuffleTransitions +from .options import AvailablePortals, Goal, Logic, MessengerOptions, NotesNeeded, option_groups, ShuffleTransitions from .portals import PORTALS, add_closed_portal_reqs, disconnect_portals, shuffle_portals, validate_portals from .regions import LEVELS, MEGA_SHARDS, LOCATIONS, REGION_CONNECTIONS from .rules import MessengerHardRules, MessengerOOBRules, MessengerRules @@ -20,9 +20,18 @@ from .subclasses import MessengerItem, MessengerRegion, MessengerShopLocation from .transitions import disconnect_entrances, shuffle_transitions components.append( - Component("The Messenger", component_type=Type.CLIENT, func=launch_game, game_name="The Messenger", supports_uri=True) + Component( + "The Messenger", + component_type=Type.CLIENT, + func=launch_game, + game_name="The Messenger", + supports_uri=True, + icon="The Messenger", + description="Launch The Messenger.\nInstalls and checks for updates for the randomizer.") ) +icon_paths["The Messenger"] = f"ap:{__name__}/assets/component_icon.png" + class MessengerSettings(Group): class GamePath(FilePath): @@ -35,6 +44,7 @@ class MessengerSettings(Group): class MessengerWeb(WebWorld): theme = "ocean" + rich_text_options_doc = True bug_report_page = "https://github.com/alwaysintreble/TheMessengerRandomizerModAP/issues" @@ -56,6 +66,7 @@ class MessengerWeb(WebWorld): ) tutorials = [tut_en, plando_en] + option_groups = option_groups class MessengerWorld(World): @@ -270,7 +281,7 @@ class MessengerWorld(World): disconnect_entrances(self) add_closed_portal_reqs(self) # i need portal shuffle to happen after rules exist so i can validate it - attempts = 5 + attempts = 20 if self.options.shuffle_portals: self.portal_mapping = [] self.spoiler_portal_mapping = {} @@ -426,13 +437,13 @@ class MessengerWorld(World): def collect(self, state: "CollectionState", item: "Item") -> bool: change = super().collect(state, item) if change and "Time Shard" in item.name: - state.prog_items[self.player]["Shards"] += int(item.name.strip("Time Shard ()")) + state.add_item("Shards", self.player, int(item.name.strip("Time Shard ()"))) return change def remove(self, state: "CollectionState", item: "Item") -> bool: change = super().remove(state, item) if change and "Time Shard" in item.name: - state.prog_items[self.player]["Shards"] -= int(item.name.strip("Time Shard ()")) + state.remove_item("Shards", self.player, int(item.name.strip("Time Shard ()"))) return change @classmethod diff --git a/worlds/messenger/assets/component_icon.png b/worlds/messenger/assets/component_icon.png new file mode 100644 index 0000000000..5ee91224ca Binary files /dev/null and b/worlds/messenger/assets/component_icon.png differ diff --git a/worlds/messenger/client_setup.py b/worlds/messenger/client_setup.py index 6b98a1b440..3ef1df75cc 100644 --- a/worlds/messenger/client_setup.py +++ b/worlds/messenger/client_setup.py @@ -2,35 +2,28 @@ import argparse import io import logging import os.path +import requests import subprocess import urllib.request from shutil import which -from typing import Any +from typing import Any, Callable, TYPE_CHECKING from zipfile import ZipFile -from Utils import open_file +from Utils import is_windows, messagebox, open_file, tuplize_version -import requests - -from Utils import is_windows, messagebox, tuplize_version +if TYPE_CHECKING: + from kvui import ButtonsPrompt MOD_URL = "https://api.github.com/repos/alwaysintreble/TheMessengerRandomizerModAP/releases/latest" -def ask_yes_no_cancel(title: str, text: str) -> bool | None: - """ - Wrapper for tkinter.messagebox.askyesnocancel, that creates a popup dialog box with yes, no, and cancel buttons. +def create_yes_no_popup(title: str, text: str, callback: Callable[[str], None]) -> "ButtonsPrompt": + from kvui import ButtonsPrompt + buttons = ["Yes", "No", "Cancel"] - :param title: Title to be displayed at the top of the message box. - :param text: Text to be displayed inside the message box. - :return: Returns True if yes, False if no, None if cancel. - """ - from tkinter import Tk, messagebox - root = Tk() - root.withdraw() - ret = messagebox.askyesnocancel(title, text) - root.update() - return ret + prompt = ButtonsPrompt(title, text, callback, *buttons) + prompt.open() + return prompt def launch_game(*args) -> None: @@ -151,6 +144,76 @@ def launch_game(*args) -> None: # one of the alpha builds return "alpha" in latest_version or tuplize_version(latest_version) > tuplize_version(installed_version) + def after_courier_install_popup(answer: str) -> None: + """Gets called if the user doesn't have courier installed. Handle the button they pressed.""" + nonlocal prompt + + prompt.dismiss() + if answer in ("No", "Cancel"): + return + logging.info("Installing Courier") + install_courier() + prompt = create_yes_no_popup("Install Mod", + "No randomizer mod detected. Would you like to install now?", + after_mod_install_popup) + + def after_mod_install_popup(answer: str) -> None: + """Gets called if the user has courier but mod isn't installed, or there's an available update.""" + nonlocal prompt + + prompt.dismiss() + if answer in ("No", "Cancel"): + return + logging.info("Installing Mod") + install_mod() + prompt = create_yes_no_popup("Launch Game", + "Courier and Game mod installed successfully. Launch game now?", + launch) + + def after_mod_update_popup(answer: str) -> None: + """Gets called if there's an available update.""" + nonlocal prompt + + prompt.dismiss() + if answer == "Cancel": + return + if answer == "Yes": + logging.info("Updating Mod") + install_mod() + prompt = create_yes_no_popup("Launch Game", + "Courier and Game mod installed successfully. Launch game now?", + launch) + else: + prompt = create_yes_no_popup("Launch Game", + "Game Mod not updated. Launch game now?", + launch) + + def launch(answer: str | None = None) -> None: + """Launch the game.""" + nonlocal args + + if prompt: + prompt.dismiss() + if answer and answer in ("No", "Cancel"): + return + + parser = argparse.ArgumentParser(description="Messenger Client Launcher") + parser.add_argument("url", type=str, nargs="?", help="Archipelago Webhost uri to auto connect to.") + args = parser.parse_args(args) + + if not is_windows: + if args.url: + open_file(f"steam://rungameid/764790//{args.url}/") + else: + open_file("steam://rungameid/764790") + else: + os.chdir(game_folder) + if args.url: + subprocess.Popen([MessengerWorld.settings.game_path, str(args.url)]) + else: + subprocess.Popen(MessengerWorld.settings.game_path) + os.chdir(working_directory) + from . import MessengerWorld try: game_folder = os.path.dirname(MessengerWorld.settings.game_path) @@ -172,49 +235,24 @@ def launch_game(*args) -> None: except ImportError: pass if not courier_installed(): - should_install = ask_yes_no_cancel("Install Courier", - "No Courier installation detected. Would you like to install now?") - if not should_install: - return - logging.info("Installing Courier") - install_courier() + prompt = create_yes_no_popup("Install Courier", + "No Courier installation detected. Would you like to install now?", + after_courier_install_popup) + return if not mod_installed(): - should_install = ask_yes_no_cancel("Install Mod", - "No randomizer mod detected. Would you like to install now?") - if not should_install: - return - logging.info("Installing Mod") - install_mod() + prompt = create_yes_no_popup("Install Mod", + "No randomizer mod detected. Would you like to install now?", + after_mod_install_popup) + return else: latest = request_data(MOD_URL)["tag_name"] if available_mod_update(latest): - should_update = ask_yes_no_cancel("Update Mod", - f"New mod version detected. Would you like to update to {latest} now?") - if should_update: - logging.info("Updating mod") - install_mod() - elif should_update is None: - return - - if not args: - should_launch = ask_yes_no_cancel("Launch Game", - "Mod installed and up to date. Would you like to launch the game now?") - if not should_launch: + prompt = create_yes_no_popup("Update Mod", + f"New mod version detected. Would you like to update to {latest} now?", + after_mod_update_popup) return - parser = argparse.ArgumentParser(description="Messenger Client Launcher") - parser.add_argument("url", type=str, nargs="?", help="Archipelago Webhost uri to auto connect to.") - args = parser.parse_args(args) - - if not is_windows: - if args.url: - open_file(f"steam://rungameid/764790//{args.url}/") - else: - open_file("steam://rungameid/764790") - else: - os.chdir(game_folder) - if args.url: - subprocess.Popen([MessengerWorld.settings.game_path, str(args.url)]) - else: - subprocess.Popen(MessengerWorld.settings.game_path) - os.chdir(working_directory) + if not args: + prompt = create_yes_no_popup("Launch Game", + "Mod installed and up to date. Would you like to launch the game now?", + launch) diff --git a/worlds/messenger/options.py b/worlds/messenger/options.py index 6b04118893..5010f40b4b 100644 --- a/worlds/messenger/options.py +++ b/worlds/messenger/options.py @@ -2,8 +2,11 @@ from dataclasses import dataclass from schema import And, Optional, Or, Schema -from Options import Choice, DeathLinkMixin, DefaultOnToggle, ItemsAccessibility, OptionDict, PerGameCommonOptions, \ - PlandoConnections, Range, StartInventoryPool, Toggle +from Options import ( + Choice, DeathLinkMixin, DefaultOnToggle, ItemsAccessibility, OptionDict, OptionGroup, + PerGameCommonOptions, + PlandoConnections, Range, StartInventoryPool, Toggle, +) from . import RANDOMIZED_CONNECTIONS from .portals import CHECKPOINTS, PORTALS, SHOP_POINTS @@ -48,8 +51,10 @@ class Logic(Choice): """ The level of logic to use when determining what locations in your world are accessible. - Normal: Can require damage boosts, but otherwise approachable for someone who has beaten the game. - Hard: Expects more knowledge and tighter execution. Has leashing, normal clips and much tighter d-boosting in logic. + **Normal:** Can require damage boosts, but otherwise approachable for someone who has beaten the game. + + **Hard:** Expects more knowledge and tighter execution. + Has leashing, normal clips and much tighter d-boosting in logic. """ display_name = "Logic Level" option_normal = 0 @@ -76,7 +81,10 @@ class EarlyMed(Toggle): class AvailablePortals(Range): - """Number of portals that are available from the start. Autumn Hills, Howling Grotto, and Glacial Peak are always available. If portal outputs are not randomized, Searing Crags will also be available.""" + """ + Number of portals that are available from the start. Autumn Hills, Howling Grotto, and Glacial Peak are always + available. If portal outputs are not randomized, Searing Crags will also be available. + """ display_name = "Available Starting Portals" range_start = 3 range_end = 6 @@ -89,10 +97,14 @@ class ShufflePortals(Choice): Entering a portal from its vanilla area will always lead to HQ, and will unlock it if relevant. Supports plando. - None: Portals will take you where they're supposed to. - Shops: Portals can lead to any area except Music Box and Elemental Skylands, with each portal output guaranteed to not overlap with another portal's. Will only put you at a portal or a shop. - Checkpoints: Like Shops except checkpoints without shops are also valid drop points. - Anywhere: Like Checkpoints except it's possible for multiple portals to output to the same map. + **None:** Portals will take you where they're supposed to. + + **Shops:** Portals can lead to any area except Music Box and Elemental Skylands, with each portal output guaranteed + to not overlap with another portal's. Will only put you at a portal or a shop. + + **Checkpoints:** Like Shops except checkpoints without shops are also valid drop points. + + **Anywhere:** Like Checkpoints except it's possible for multiple portals to output to the same map. """ display_name = "Shuffle Portal Outputs" option_none = 0 @@ -107,9 +119,11 @@ class ShuffleTransitions(Choice): Whether the transitions between the levels should be randomized. Supports plando. - None: Level transitions lead where they should. - Coupled: Returning through a transition will take you from whence you came. - Decoupled: Any level transition can take you to any other level transition. + **None:** Level transitions lead where they should. + + **Coupled:** Returning through a transition will take you from whence you came. + + **Decoupled:** Any level transition can take you to any other level transition. """ display_name = "Shuffle Level Transitions" option_none = 0 @@ -119,7 +133,10 @@ class ShuffleTransitions(Choice): class Goal(Choice): - """Requirement to finish the game. To win with the power seal hunt goal, you must enter the Music Box through the shop chest.""" + """ + Requirement to finish the game. + To win with the power seal hunt goal, you must enter the Music Box through the shop chest. + """ display_name = "Goal" option_open_music_box = 0 option_power_seal_hunt = 1 @@ -132,7 +149,8 @@ class MusicBox(DefaultOnToggle): class NotesNeeded(Range): """ - How many notes need to be found in order to access the Music Box. 6 are always needed to enter, so this places the others in your start inventory. + How many notes need to be found in order to access the Music Box. + 6 are always needed to enter, so this places the others in your start inventory. """ display_name = "Notes Needed" range_start = 1 @@ -240,3 +258,35 @@ class MessengerOptions(DeathLinkMixin, PerGameCommonOptions): shop_price_plan: PlannedShopPrices portal_plando: PortalPlando plando_connections: TransitionPlando + + +option_groups = [ + OptionGroup( + "Difficulty", + [ + EarlyMed, + Logic, + LimitedMovement, + ], + ), + OptionGroup( + "Goal", + [ + Goal, + MusicBox, + NotesNeeded, + AmountSeals, + RequiredSeals, + ], + ), + OptionGroup( + "Entrances", + [ + AvailablePortals, + ShufflePortals, + ShuffleTransitions, + PortalPlando, + TransitionPlando, + ], + ), +] diff --git a/worlds/minecraft/Constants.py b/worlds/minecraft/Constants.py deleted file mode 100644 index 1f7b6fa6ac..0000000000 --- a/worlds/minecraft/Constants.py +++ /dev/null @@ -1,26 +0,0 @@ -import os -import json -import pkgutil - -def load_data_file(*args) -> dict: - fname = "/".join(["data", *args]) - return json.loads(pkgutil.get_data(__name__, fname).decode()) - -# For historical reasons, these values are different. -# They remain different to ensure datapackage consistency. -# Do not separate other games' location and item IDs like this. -item_id_offset: int = 45000 -location_id_offset: int = 42000 - -item_info = load_data_file("items.json") -item_name_to_id = {name: item_id_offset + index \ - for index, name in enumerate(item_info["all_items"])} -item_name_to_id["Bee Trap"] = item_id_offset + 100 # historical reasons - -location_info = load_data_file("locations.json") -location_name_to_id = {name: location_id_offset + index \ - for index, name in enumerate(location_info["all_locations"])} - -exclusion_info = load_data_file("excluded_locations.json") - -region_info = load_data_file("regions.json") diff --git a/worlds/minecraft/ItemPool.py b/worlds/minecraft/ItemPool.py deleted file mode 100644 index 19bb70ed64..0000000000 --- a/worlds/minecraft/ItemPool.py +++ /dev/null @@ -1,55 +0,0 @@ -from math import ceil -from typing import List - -from BaseClasses import Item - -from . import Constants -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from . import MinecraftWorld - - -def get_junk_item_names(rand, k: int) -> str: - junk_weights = Constants.item_info["junk_weights"] - junk = rand.choices( - list(junk_weights.keys()), - weights=list(junk_weights.values()), - k=k) - return junk - -def build_item_pool(world: "MinecraftWorld") -> List[Item]: - multiworld = world.multiworld - player = world.player - - itempool = [] - total_location_count = len(multiworld.get_unfilled_locations(player)) - - required_pool = Constants.item_info["required_pool"] - - # Add required progression items - for item_name, num in required_pool.items(): - itempool += [world.create_item(item_name) for _ in range(num)] - - # Add structure compasses - if world.options.structure_compasses: - compasses = [name for name in world.item_name_to_id if "Structure Compass" in name] - for item_name in compasses: - itempool.append(world.create_item(item_name)) - - # Dragon egg shards - if world.options.egg_shards_required > 0: - num = world.options.egg_shards_available - itempool += [world.create_item("Dragon Egg Shard") for _ in range(num)] - - # Bee traps - bee_trap_percentage = world.options.bee_traps * 0.01 - if bee_trap_percentage > 0: - bee_trap_qty = ceil(bee_trap_percentage * (total_location_count - len(itempool))) - itempool += [world.create_item("Bee Trap") for _ in range(bee_trap_qty)] - - # Fill remaining itempool with randomly generated junk - junk = get_junk_item_names(world.random, total_location_count - len(itempool)) - itempool += [world.create_item(name) for name in junk] - - return itempool diff --git a/worlds/minecraft/Options.py b/worlds/minecraft/Options.py deleted file mode 100644 index 7d1377233e..0000000000 --- a/worlds/minecraft/Options.py +++ /dev/null @@ -1,143 +0,0 @@ -from Options import Choice, Toggle, DefaultOnToggle, Range, OptionList, DeathLink, PlandoConnections, \ - PerGameCommonOptions -from .Constants import region_info -from dataclasses import dataclass - - -class AdvancementGoal(Range): - """Number of advancements required to spawn bosses.""" - display_name = "Advancement Goal" - range_start = 0 - range_end = 114 - default = 40 - - -class EggShardsRequired(Range): - """Number of dragon egg shards to collect to spawn bosses.""" - display_name = "Egg Shards Required" - range_start = 0 - range_end = 50 - default = 0 - - -class EggShardsAvailable(Range): - """Number of dragon egg shards available to collect.""" - display_name = "Egg Shards Available" - range_start = 0 - range_end = 50 - default = 0 - - -class BossGoal(Choice): - """Bosses which must be defeated to finish the game.""" - display_name = "Required Bosses" - option_none = 0 - option_ender_dragon = 1 - option_wither = 2 - option_both = 3 - default = 1 - - @property - def dragon(self): - return self.value % 2 == 1 - - @property - def wither(self): - return self.value > 1 - - -class ShuffleStructures(DefaultOnToggle): - """Enables shuffling of villages, outposts, fortresses, bastions, and end cities.""" - display_name = "Shuffle Structures" - - -class StructureCompasses(DefaultOnToggle): - """Adds structure compasses to the item pool, which point to the nearest indicated structure.""" - display_name = "Structure Compasses" - - -class BeeTraps(Range): - """Replaces a percentage of junk items with bee traps, which spawn multiple angered bees around every player when - received.""" - display_name = "Bee Trap Percentage" - range_start = 0 - range_end = 100 - default = 0 - - -class CombatDifficulty(Choice): - """Modifies the level of items logically required for exploring dangerous areas and fighting bosses.""" - display_name = "Combat Difficulty" - option_easy = 0 - option_normal = 1 - option_hard = 2 - default = 1 - - -class HardAdvancements(Toggle): - """Enables certain RNG-reliant or tedious advancements.""" - display_name = "Include Hard Advancements" - - -class UnreasonableAdvancements(Toggle): - """Enables the extremely difficult advancements "How Did We Get Here?" and "Adventuring Time.\"""" - display_name = "Include Unreasonable Advancements" - - -class PostgameAdvancements(Toggle): - """Enables advancements that require spawning and defeating the required bosses.""" - display_name = "Include Postgame Advancements" - - -class SendDefeatedMobs(Toggle): - """Send killed mobs to other Minecraft worlds which have this option enabled.""" - display_name = "Send Defeated Mobs" - - -class StartingItems(OptionList): - """Start with these items. Each entry should be of this format: {item: "item_name", amount: #} - `item` can include components, and should be in an identical format to a `/give` command with - `"` escaped for json reasons. - - `amount` is optional and will default to 1 if omitted. - - example: - ``` - starting_items: [ - { "item": "minecraft:stick[minecraft:custom_name=\"{'text':'pointy stick'}\"]" }, - { "item": "minecraft:arrow[minecraft:rarity=epic]", amount: 64 } - ] - ``` - """ - display_name = "Starting Items" - - -class MCPlandoConnections(PlandoConnections): - entrances = set(connection[0] for connection in region_info["default_connections"]) - exits = set(connection[1] for connection in region_info["default_connections"]) - - @classmethod - def can_connect(cls, entrance, exit): - if exit in region_info["illegal_connections"] and entrance in region_info["illegal_connections"][exit]: - return False - return True - - -@dataclass -class MinecraftOptions(PerGameCommonOptions): - plando_connections: MCPlandoConnections - advancement_goal: AdvancementGoal - egg_shards_required: EggShardsRequired - egg_shards_available: EggShardsAvailable - required_bosses: BossGoal - shuffle_structures: ShuffleStructures - structure_compasses: StructureCompasses - - combat_difficulty: CombatDifficulty - include_hard_advancements: HardAdvancements - include_unreasonable_advancements: UnreasonableAdvancements - include_postgame_advancements: PostgameAdvancements - bee_traps: BeeTraps - send_defeated_mobs: SendDefeatedMobs - death_link: DeathLink - starting_items: StartingItems diff --git a/worlds/minecraft/Rules.py b/worlds/minecraft/Rules.py deleted file mode 100644 index 9a7be09a4a..0000000000 --- a/worlds/minecraft/Rules.py +++ /dev/null @@ -1,508 +0,0 @@ -from BaseClasses import CollectionState -from worlds.generic.Rules import exclusion_rules - -from . import Constants -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from . import MinecraftWorld - - -# Helper functions -# moved from logicmixin - -def has_iron_ingots(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Progressive Tools', player) and state.has('Progressive Resource Crafting', player) - - -def has_copper_ingots(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Progressive Tools', player) and state.has('Progressive Resource Crafting', player) - - -def has_gold_ingots(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return (state.has('Progressive Resource Crafting', player) - and ( - state.has('Progressive Tools', player, 2) - or state.can_reach_region('The Nether', player) - ) - ) - - -def has_diamond_pickaxe(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Progressive Tools', player, 3) and has_iron_ingots(world, state, player) - - -def craft_crossbow(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Archery', player) and has_iron_ingots(world, state, player) - - -def has_bottle(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Bottles', player) and state.has('Progressive Resource Crafting', player) - - -def has_spyglass(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return (has_copper_ingots(world, state, player) - and state.has('Spyglass', player) - and can_adventure(world, state, player) - ) - - -def can_enchant(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Enchanting', player) and has_diamond_pickaxe(world, state, player) # mine obsidian and lapis - - -def can_use_anvil(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return (state.has('Enchanting', player) - and state.has('Progressive Resource Crafting', player,2) - and has_iron_ingots(world, state, player) - ) - - -def fortress_loot(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: # saddles, blaze rods, wither skulls - return state.can_reach_region('Nether Fortress', player) and basic_combat(world, state, player) - - -def can_brew_potions(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Blaze Rods', player) and state.has('Brewing', player) and has_bottle(world, state, player) - - -def can_piglin_trade(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return (has_gold_ingots(world, state, player) - and ( - state.can_reach_region('The Nether', player) - or state.can_reach_region('Bastion Remnant', player) - )) - - -def overworld_villager(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - village_region = state.multiworld.get_region('Village', player).entrances[0].parent_region.name - if village_region == 'The Nether': # 2 options: cure zombie villager or build portal in village - return (state.can_reach_location('Zombie Doctor', player) - or ( - has_diamond_pickaxe(world, state, player) - and state.can_reach_region('Village', player) - )) - elif village_region == 'The End': - return state.can_reach_location('Zombie Doctor', player) - return state.can_reach_region('Village', player) - - -def enter_stronghold(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return state.has('Blaze Rods', player) and state.has('Brewing', player) and state.has('3 Ender Pearls', player) - - -# Difficulty-dependent functions -def combat_difficulty(world: "MinecraftWorld", state: CollectionState, player: int) -> str: - return world.options.combat_difficulty.current_key - - -def can_adventure(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - death_link_check = not world.options.death_link or state.has('Bed', player) - if combat_difficulty(world, state, player) == 'easy': - return state.has('Progressive Weapons', player, 2) and has_iron_ingots(world, state, player) and death_link_check - elif combat_difficulty(world, state, player) == 'hard': - return True - return (state.has('Progressive Weapons', player) and death_link_check and - (state.has('Progressive Resource Crafting', player) or state.has('Campfire', player))) - - -def basic_combat(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - if combat_difficulty(world, state, player) == 'easy': - return (state.has('Progressive Weapons', player, 2) - and state.has('Progressive Armor', player) - and state.has('Shield', player) - and has_iron_ingots(world, state, player) - ) - elif combat_difficulty(world, state, player) == 'hard': - return True - return (state.has('Progressive Weapons', player) - and ( - state.has('Progressive Armor', player) - or state.has('Shield', player) - ) - and has_iron_ingots(world, state, player) - ) - - -def complete_raid(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - reach_regions = (state.can_reach_region('Village', player) - and state.can_reach_region('Pillager Outpost', player)) - if combat_difficulty(world, state, player) == 'easy': - return (reach_regions - and state.has('Progressive Weapons', player, 3) - and state.has('Progressive Armor', player, 2) - and state.has('Shield', player) - and state.has('Archery', player) - and state.has('Progressive Tools', player, 2) - and has_iron_ingots(world, state, player) - ) - elif combat_difficulty(world, state, player) == 'hard': # might be too hard? - return (reach_regions - and state.has('Progressive Weapons', player, 2) - and has_iron_ingots(world, state, player) - and ( - state.has('Progressive Armor', player) - or state.has('Shield', player) - ) - ) - return (reach_regions - and state.has('Progressive Weapons', player, 2) - and has_iron_ingots(world, state, player) - and state.has('Progressive Armor', player) - and state.has('Shield', player) - ) - - -def can_kill_wither(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - normal_kill = (state.has("Progressive Weapons", player, 3) - and state.has("Progressive Armor", player, 2) - and can_brew_potions(world, state, player) - and can_enchant(world, state, player) - ) - if combat_difficulty(world, state, player) == 'easy': - return (fortress_loot(world, state, player) - and normal_kill - and state.has('Archery', player) - ) - elif combat_difficulty(world, state, player) == 'hard': # cheese kill using bedrock ceilings - return (fortress_loot(world, state, player) - and ( - normal_kill - or state.can_reach_region('The Nether', player) - or state.can_reach_region('The End', player) - ) - ) - - return fortress_loot(world, state, player) and normal_kill - - -def can_respawn_ender_dragon(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - return (state.can_reach_region('The Nether', player) - and state.can_reach_region('The End', player) - and state.has('Progressive Resource Crafting', player) # smelt sand into glass - ) - - -def can_kill_ender_dragon(world: "MinecraftWorld", state: CollectionState, player: int) -> bool: - if combat_difficulty(world, state, player) == 'easy': - return (state.has("Progressive Weapons", player, 3) - and state.has("Progressive Armor", player, 2) - and state.has('Archery', player) - and can_brew_potions(world, state, player) - and can_enchant(world, state, player) - ) - if combat_difficulty(world, state, player) == 'hard': - return ( - ( - state.has('Progressive Weapons', player, 2) - and state.has('Progressive Armor', player) - ) or ( - state.has('Progressive Weapons', player, 1) - and state.has('Bed', player) # who needs armor when you can respawn right outside the chamber - ) - ) - return (state.has('Progressive Weapons', player, 2) - and state.has('Progressive Armor', player) - and state.has('Archery', player) - ) - - -def has_structure_compass(world: "MinecraftWorld", state: CollectionState, entrance_name: str, player: int) -> bool: - if not world.options.structure_compasses: - return True - return state.has(f"Structure Compass ({state.multiworld.get_entrance(entrance_name, player).connected_region.name})", player) - - -def get_rules_lookup(world, player: int): - rules_lookup = { - "entrances": { - "Nether Portal": lambda state: state.has('Flint and Steel', player) - and ( - state.has('Bucket', player) - or state.has('Progressive Tools', player, 3) - ) - and has_iron_ingots(world, state, player), - "End Portal": lambda state: enter_stronghold(world, state, player) - and state.has('3 Ender Pearls', player, 4), - "Overworld Structure 1": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "Overworld Structure 1", player), - "Overworld Structure 2": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "Overworld Structure 2", player), - "Nether Structure 1": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "Nether Structure 1", player), - "Nether Structure 2": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "Nether Structure 2", player), - "The End Structure": lambda state: can_adventure(world, state, player) - and has_structure_compass(world, state, "The End Structure", player), - }, - "locations": { - "Ender Dragon": lambda state: can_respawn_ender_dragon(world, state, player) - and can_kill_ender_dragon(world, state, player), - "Wither": lambda state: can_kill_wither(world, state, player), - "Blaze Rods": lambda state: fortress_loot(world, state, player), - "Who is Cutting Onions?": lambda state: can_piglin_trade(world, state, player), - "Oh Shiny": lambda state: can_piglin_trade(world, state, player), - "Suit Up": lambda state: state.has("Progressive Armor", player) - and has_iron_ingots(world, state, player), - "Very Very Frightening": lambda state: state.has("Channeling Book", player) - and can_use_anvil(world, state, player) - and can_enchant(world, state, player) - and overworld_villager(world, state, player), - "Hot Stuff": lambda state: state.has("Bucket", player) - and has_iron_ingots(world, state, player), - "Free the End": lambda state: can_respawn_ender_dragon(world, state, player) - and can_kill_ender_dragon(world, state, player), - "A Furious Cocktail": lambda state: (can_brew_potions(world, state, player) - and state.has("Fishing Rod", player) # Water Breathing - and state.can_reach_region("The Nether", player) # Regeneration, Fire Resistance, gold nuggets - and state.can_reach_region("Village", player) # Night Vision, Invisibility - and state.can_reach_location("Bring Home the Beacon", player)), - # Resistance - "Bring Home the Beacon": lambda state: can_kill_wither(world, state, player) - and has_diamond_pickaxe(world, state, player) - and state.has("Progressive Resource Crafting", player, 2), - "Not Today, Thank You": lambda state: state.has("Shield", player) - and has_iron_ingots(world, state, player), - "Isn't It Iron Pick": lambda state: state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player), - "Local Brewery": lambda state: can_brew_potions(world, state, player), - "The Next Generation": lambda state: can_respawn_ender_dragon(world, state, player) - and can_kill_ender_dragon(world, state, player), - "Fishy Business": lambda state: state.has("Fishing Rod", player), - "This Boat Has Legs": lambda state: ( - fortress_loot(world, state, player) - or complete_raid(world, state, player) - ) - and state.has("Saddle", player) - and state.has("Fishing Rod", player), - "Sniper Duel": lambda state: state.has("Archery", player), - "Great View From Up Here": lambda state: basic_combat(world, state, player), - "How Did We Get Here?": lambda state: (can_brew_potions(world, state, player) - and has_gold_ingots(world, state, player) # Absorption - and state.can_reach_region('End City', player) # Levitation - and state.can_reach_region('The Nether', player) # potion ingredients - and state.has("Fishing Rod", player) # Pufferfish, Nautilus Shells; spectral arrows - and state.has("Archery", player) - and state.can_reach_location("Bring Home the Beacon", player) # Haste - and state.can_reach_location("Hero of the Village", player)), # Bad Omen, Hero of the Village - "Bullseye": lambda state: state.has("Archery", player) - and state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player), - "Spooky Scary Skeleton": lambda state: basic_combat(world, state, player), - "Two by Two": lambda state: has_iron_ingots(world, state, player) - and state.has("Bucket", player) - and can_adventure(world, state, player), - "Two Birds, One Arrow": lambda state: craft_crossbow(world, state, player) - and can_enchant(world, state, player), - "Who's the Pillager Now?": lambda state: craft_crossbow(world, state, player), - "Getting an Upgrade": lambda state: state.has("Progressive Tools", player), - "Tactical Fishing": lambda state: state.has("Bucket", player) - and has_iron_ingots(world, state, player), - "Zombie Doctor": lambda state: can_brew_potions(world, state, player) - and has_gold_ingots(world, state, player), - "Ice Bucket Challenge": lambda state: has_diamond_pickaxe(world, state, player), - "Into Fire": lambda state: basic_combat(world, state, player), - "War Pigs": lambda state: basic_combat(world, state, player), - "Take Aim": lambda state: state.has("Archery", player), - "Total Beelocation": lambda state: state.has("Silk Touch Book", player) - and can_use_anvil(world, state, player) - and can_enchant(world, state, player), - "Arbalistic": lambda state: (craft_crossbow(world, state, player) - and state.has("Piercing IV Book", player) - and can_use_anvil(world, state, player) - and can_enchant(world, state, player) - ), - "The End... Again...": lambda state: can_respawn_ender_dragon(world, state, player) - and can_kill_ender_dragon(world, state, player), - "Acquire Hardware": lambda state: has_iron_ingots(world, state, player), - "Not Quite \"Nine\" Lives": lambda state: can_piglin_trade(world, state, player) - and state.has("Progressive Resource Crafting", player, 2), - "Cover Me With Diamonds": lambda state: state.has("Progressive Armor", player, 2) - and state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player), - "Sky's the Limit": lambda state: basic_combat(world, state, player), - "Hired Help": lambda state: state.has("Progressive Resource Crafting", player, 2) - and has_iron_ingots(world, state, player), - "Sweet Dreams": lambda state: state.has("Bed", player) - or state.can_reach_region('Village', player), - "You Need a Mint": lambda state: can_respawn_ender_dragon(world, state, player) - and has_bottle(world, state, player), - "Monsters Hunted": lambda state: (can_respawn_ender_dragon(world, state, player) - and can_kill_ender_dragon(world, state, player) - and can_kill_wither(world, state, player) - and state.has("Fishing Rod", player)), - "Enchanter": lambda state: can_enchant(world, state, player), - "Voluntary Exile": lambda state: basic_combat(world, state, player), - "Eye Spy": lambda state: enter_stronghold(world, state, player), - "Serious Dedication": lambda state: (can_brew_potions(world, state, player) - and state.has("Bed", player) - and has_diamond_pickaxe(world, state, player) - and has_gold_ingots(world, state, player)), - "Postmortal": lambda state: complete_raid(world, state, player), - "Adventuring Time": lambda state: can_adventure(world, state, player), - "Hero of the Village": lambda state: complete_raid(world, state, player), - "Hidden in the Depths": lambda state: can_brew_potions(world, state, player) - and state.has("Bed", player) - and has_diamond_pickaxe(world, state, player), - "Beaconator": lambda state: (can_kill_wither(world, state, player) - and has_diamond_pickaxe(world, state, player) - and state.has("Progressive Resource Crafting", player, 2)), - "Withering Heights": lambda state: can_kill_wither(world, state, player), - "A Balanced Diet": lambda state: (has_bottle(world, state, player) - and has_gold_ingots(world, state, player) - and state.has("Progressive Resource Crafting", player, 2) - and state.can_reach_region('The End', player)), - # notch apple, chorus fruit - "Subspace Bubble": lambda state: has_diamond_pickaxe(world, state, player), - "Country Lode, Take Me Home": lambda state: state.can_reach_location("Hidden in the Depths", player) - and has_gold_ingots(world, state, player), - "Bee Our Guest": lambda state: state.has("Campfire", player) - and has_bottle(world, state, player), - "Uneasy Alliance": lambda state: has_diamond_pickaxe(world, state, player) - and state.has('Fishing Rod', player), - "Diamonds!": lambda state: state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player), - "A Throwaway Joke": lambda state: can_adventure(world, state, player), - "Sticky Situation": lambda state: state.has("Campfire", player) - and has_bottle(world, state, player), - "Ol' Betsy": lambda state: craft_crossbow(world, state, player), - "Cover Me in Debris": lambda state: state.has("Progressive Armor", player, 2) - and state.has("8 Netherite Scrap", player, 2) - and state.has("Progressive Resource Crafting", player) - and has_diamond_pickaxe(world, state, player) - and has_iron_ingots(world, state, player) - and can_brew_potions(world, state, player) - and state.has("Bed", player), - "Hot Topic": lambda state: state.has("Progressive Resource Crafting", player), - "The Lie": lambda state: has_iron_ingots(world, state, player) - and state.has("Bucket", player), - "On a Rail": lambda state: has_iron_ingots(world, state, player) - and state.has('Progressive Tools', player, 2), - "When Pigs Fly": lambda state: ( - fortress_loot(world, state, player) - or complete_raid(world, state, player) - ) - and state.has("Saddle", player) - and state.has("Fishing Rod", player) - and can_adventure(world, state, player), - "Overkill": lambda state: can_brew_potions(world, state, player) - and ( - state.has("Progressive Weapons", player) - or state.can_reach_region('The Nether', player) - ), - "Librarian": lambda state: state.has("Enchanting", player), - "Overpowered": lambda state: has_iron_ingots(world, state, player) - and state.has('Progressive Tools', player, 2) - and basic_combat(world, state, player), - "Wax On": lambda state: has_copper_ingots(world, state, player) - and state.has('Campfire', player) - and state.has('Progressive Resource Crafting', player, 2), - "Wax Off": lambda state: has_copper_ingots(world, state, player) - and state.has('Campfire', player) - and state.has('Progressive Resource Crafting', player, 2), - "The Cutest Predator": lambda state: has_iron_ingots(world, state, player) - and state.has('Bucket', player), - "The Healing Power of Friendship": lambda state: has_iron_ingots(world, state, player) - and state.has('Bucket', player), - "Is It a Bird?": lambda state: has_spyglass(world, state, player) - and can_adventure(world, state, player), - "Is It a Balloon?": lambda state: has_spyglass(world, state, player), - "Is It a Plane?": lambda state: has_spyglass(world, state, player) - and can_respawn_ender_dragon(world, state, player), - "Surge Protector": lambda state: state.has("Channeling Book", player) - and can_use_anvil(world, state, player) - and can_enchant(world, state, player) - and overworld_villager(world, state, player), - "Light as a Rabbit": lambda state: can_adventure(world, state, player) - and has_iron_ingots(world, state, player) - and state.has('Bucket', player), - "Glow and Behold!": lambda state: can_adventure(world, state, player), - "Whatever Floats Your Goat!": lambda state: can_adventure(world, state, player), - "Caves & Cliffs": lambda state: has_iron_ingots(world, state, player) - and state.has('Bucket', player) - and state.has('Progressive Tools', player, 2), - "Feels like home": lambda state: has_iron_ingots(world, state, player) - and state.has('Bucket', player) - and state.has('Fishing Rod', player) - and ( - fortress_loot(world, state, player) - or complete_raid(world, state, player) - ) - and state.has("Saddle", player), - "Sound of Music": lambda state: state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player) - and basic_combat(world, state, player), - "Star Trader": lambda state: has_iron_ingots(world, state, player) - and state.has('Bucket', player) - and ( - state.can_reach_region("The Nether", player) # soul sand in nether - or state.can_reach_region("Nether Fortress", player) # soul sand in fortress if not in nether for water elevator - or can_piglin_trade(world, state, player) # piglins give soul sand - ) - and overworld_villager(world, state, player), - "Birthday Song": lambda state: state.can_reach_location("The Lie", player) - and state.has("Progressive Tools", player, 2) - and has_iron_ingots(world, state, player), - "Bukkit Bukkit": lambda state: state.has("Bucket", player) - and has_iron_ingots(world, state, player) - and can_adventure(world, state, player), - "It Spreads": lambda state: can_adventure(world, state, player) - and has_iron_ingots(world, state, player) - and state.has("Progressive Tools", player, 2), - "Sneak 100": lambda state: can_adventure(world, state, player) - and has_iron_ingots(world, state, player) - and state.has("Progressive Tools", player, 2), - "When the Squad Hops into Town": lambda state: can_adventure(world, state, player) - and state.has("Lead", player), - "With Our Powers Combined!": lambda state: can_adventure(world, state, player) - and state.has("Lead", player), - } - } - return rules_lookup - - -def set_rules(self: "MinecraftWorld") -> None: - multiworld = self.multiworld - player = self.player - - rules_lookup = get_rules_lookup(self, player) - - # Set entrance rules - for entrance_name, rule in rules_lookup["entrances"].items(): - multiworld.get_entrance(entrance_name, player).access_rule = rule - - # Set location rules - for location_name, rule in rules_lookup["locations"].items(): - multiworld.get_location(location_name, player).access_rule = rule - - # Set rules surrounding completion - bosses = self.options.required_bosses - postgame_advancements = set() - if bosses.dragon: - postgame_advancements.update(Constants.exclusion_info["ender_dragon"]) - if bosses.wither: - postgame_advancements.update(Constants.exclusion_info["wither"]) - - def location_count(state: CollectionState) -> int: - return len([location for location in multiworld.get_locations(player) if - location.address is not None and - location.can_reach(state)]) - - def defeated_bosses(state: CollectionState) -> bool: - return ((not bosses.dragon or state.has("Ender Dragon", player)) - and (not bosses.wither or state.has("Wither", player))) - - egg_shards = min(self.options.egg_shards_required.value, self.options.egg_shards_available.value) - completion_requirements = lambda state: (location_count(state) >= self.options.advancement_goal - and state.has("Dragon Egg Shard", player, egg_shards)) - multiworld.completion_condition[player] = lambda state: completion_requirements(state) and defeated_bosses(state) - - # Set exclusions on hard/unreasonable/postgame - excluded_advancements = set() - if not self.options.include_hard_advancements: - excluded_advancements.update(Constants.exclusion_info["hard"]) - if not self.options.include_unreasonable_advancements: - excluded_advancements.update(Constants.exclusion_info["unreasonable"]) - if not self.options.include_postgame_advancements: - excluded_advancements.update(postgame_advancements) - exclusion_rules(multiworld, player, excluded_advancements) diff --git a/worlds/minecraft/Structures.py b/worlds/minecraft/Structures.py deleted file mode 100644 index d4f62f3498..0000000000 --- a/worlds/minecraft/Structures.py +++ /dev/null @@ -1,59 +0,0 @@ -from . import Constants -from typing import TYPE_CHECKING -if TYPE_CHECKING: - from . import MinecraftWorld - - -def shuffle_structures(self: "MinecraftWorld") -> None: - multiworld = self.multiworld - player = self.player - - default_connections = Constants.region_info["default_connections"] - illegal_connections = Constants.region_info["illegal_connections"] - - # Get all unpaired exits and all regions without entrances (except the Menu) - # This function is destructive on these lists. - exits = [exit.name for r in multiworld.regions if r.player == player for exit in r.exits if exit.connected_region is None] - structs = [r.name for r in multiworld.regions if r.player == player and r.entrances == [] and r.name != 'Menu'] - exits_spoiler = exits[:] # copy the original order for the spoiler log - - pairs = {} - - def set_pair(exit, struct): - if (exit in exits) and (struct in structs) and (exit not in illegal_connections.get(struct, [])): - pairs[exit] = struct - exits.remove(exit) - structs.remove(struct) - else: - raise Exception(f"Invalid connection: {exit} => {struct} for player {player} ({multiworld.player_name[player]})") - - # Connect plando structures first - if self.options.plando_connections: - for conn in self.options.plando_connections: - set_pair(conn.entrance, conn.exit) - - # The algorithm tries to place the most restrictive structures first. This algorithm always works on the - # relatively small set of restrictions here, but does not work on all possible inputs with valid configurations. - if self.options.shuffle_structures: - structs.sort(reverse=True, key=lambda s: len(illegal_connections.get(s, []))) - for struct in structs[:]: - try: - exit = self.random.choice([e for e in exits if e not in illegal_connections.get(struct, [])]) - except IndexError: - raise Exception(f"No valid structure placements remaining for player {player} ({self.player_name})") - set_pair(exit, struct) - else: # write remaining default connections - for (exit, struct) in default_connections: - if exit in exits: - set_pair(exit, struct) - - # Make sure we actually paired everything; might fail if plando - try: - assert len(exits) == len(structs) == 0 - except AssertionError: - raise Exception(f"Failed to connect all Minecraft structures for player {player} ({self.player_name})") - - for exit in exits_spoiler: - multiworld.get_entrance(exit, player).connect(multiworld.get_region(pairs[exit], player)) - if self.options.shuffle_structures or self.options.plando_connections: - multiworld.spoiler.set_entrance(exit, pairs[exit], 'entrance', player) diff --git a/worlds/minecraft/__init__.py b/worlds/minecraft/__init__.py deleted file mode 100644 index 75539fcf2e..0000000000 --- a/worlds/minecraft/__init__.py +++ /dev/null @@ -1,197 +0,0 @@ -import os -import json -import settings -import typing -from base64 import b64encode, b64decode -from typing import Dict, Any - -from BaseClasses import Region, Entrance, Item, Tutorial, ItemClassification, Location -from worlds.AutoWorld import World, WebWorld - -from . import Constants -from .Options import MinecraftOptions -from .Structures import shuffle_structures -from .ItemPool import build_item_pool, get_junk_item_names -from .Rules import set_rules - -client_version = 9 - - -class MinecraftSettings(settings.Group): - class ForgeDirectory(settings.OptionalUserFolderPath): - pass - - class ReleaseChannel(str): - """ - release channel, currently "release", or "beta" - any games played on the "beta" channel have a high likelihood of no longer working on the "release" channel. - """ - - forge_directory: ForgeDirectory = ForgeDirectory("Minecraft Forge server") - max_heap_size: str = "2G" - release_channel: ReleaseChannel = ReleaseChannel("release") - - -class MinecraftWebWorld(WebWorld): - theme = "jungle" - bug_report_page = "https://github.com/KonoTyran/Minecraft_AP_Randomizer/issues/new?assignees=&labels=bug&template=bug_report.yaml&title=%5BBug%5D%3A+Brief+Description+of+bug+here" - - setup = Tutorial( - "Multiworld Setup Guide", - "A guide to setting up the Archipelago Minecraft software on your computer. This guide covers" - "single-player, multiworld, and related software.", - "English", - "minecraft_en.md", - "minecraft/en", - ["Kono Tyran"] - ) - - setup_es = Tutorial( - setup.tutorial_name, - setup.description, - "Español", - "minecraft_es.md", - "minecraft/es", - ["Edos"] - ) - - setup_sv = Tutorial( - setup.tutorial_name, - setup.description, - "Swedish", - "minecraft_sv.md", - "minecraft/sv", - ["Albinum"] - ) - - setup_fr = Tutorial( - setup.tutorial_name, - setup.description, - "Français", - "minecraft_fr.md", - "minecraft/fr", - ["TheLynk"] - ) - - tutorials = [setup, setup_es, setup_sv, setup_fr] - - -class MinecraftWorld(World): - """ - Minecraft is a game about creativity. In a world made entirely of cubes, you explore, discover, mine, - craft, and try not to explode. Delve deep into the earth and discover abandoned mines, ancient - structures, and materials to create a portal to another world. Defeat the Ender Dragon, and claim - victory! - """ - game = "Minecraft" - options_dataclass = MinecraftOptions - options: MinecraftOptions - settings: typing.ClassVar[MinecraftSettings] - topology_present = True - web = MinecraftWebWorld() - - item_name_to_id = Constants.item_name_to_id - location_name_to_id = Constants.location_name_to_id - - def _get_mc_data(self) -> Dict[str, Any]: - exits = [connection[0] for connection in Constants.region_info["default_connections"]] - return { - 'world_seed': self.random.getrandbits(32), - 'seed_name': self.multiworld.seed_name, - 'player_name': self.player_name, - 'player_id': self.player, - 'client_version': client_version, - 'structures': {exit: self.multiworld.get_entrance(exit, self.player).connected_region.name for exit in exits}, - 'advancement_goal': self.options.advancement_goal.value, - 'egg_shards_required': min(self.options.egg_shards_required.value, - self.options.egg_shards_available.value), - 'egg_shards_available': self.options.egg_shards_available.value, - 'required_bosses': self.options.required_bosses.current_key, - 'MC35': bool(self.options.send_defeated_mobs.value), - 'death_link': bool(self.options.death_link.value), - 'starting_items': json.dumps(self.options.starting_items.value), - 'race': self.multiworld.is_race, - } - - def create_item(self, name: str) -> Item: - item_class = ItemClassification.filler - if name in Constants.item_info["progression_items"]: - item_class = ItemClassification.progression - elif name in Constants.item_info["useful_items"]: - item_class = ItemClassification.useful - elif name in Constants.item_info["trap_items"]: - item_class = ItemClassification.trap - - return MinecraftItem(name, item_class, self.item_name_to_id.get(name, None), self.player) - - def create_event(self, region_name: str, event_name: str) -> None: - region = self.multiworld.get_region(region_name, self.player) - loc = MinecraftLocation(self.player, event_name, None, region) - loc.place_locked_item(self.create_event_item(event_name)) - region.locations.append(loc) - - def create_event_item(self, name: str) -> Item: - item = self.create_item(name) - item.classification = ItemClassification.progression - return item - - def create_regions(self) -> None: - # Create regions - for region_name, exits in Constants.region_info["regions"]: - r = Region(region_name, self.player, self.multiworld) - for exit_name in exits: - r.exits.append(Entrance(self.player, exit_name, r)) - self.multiworld.regions.append(r) - - # Bind mandatory connections - for entr_name, region_name in Constants.region_info["mandatory_connections"]: - e = self.multiworld.get_entrance(entr_name, self.player) - r = self.multiworld.get_region(region_name, self.player) - e.connect(r) - - # Add locations - for region_name, locations in Constants.location_info["locations_by_region"].items(): - region = self.multiworld.get_region(region_name, self.player) - for loc_name in locations: - loc = MinecraftLocation(self.player, loc_name, - self.location_name_to_id.get(loc_name, None), region) - region.locations.append(loc) - - # Add events - self.create_event("Nether Fortress", "Blaze Rods") - self.create_event("The End", "Ender Dragon") - self.create_event("Nether Fortress", "Wither") - - # Shuffle the connections - shuffle_structures(self) - - def create_items(self) -> None: - self.multiworld.itempool += build_item_pool(self) - - set_rules = set_rules - - def generate_output(self, output_directory: str) -> None: - data = self._get_mc_data() - filename = f"{self.multiworld.get_out_file_name_base(self.player)}.apmc" - with open(os.path.join(output_directory, filename), 'wb') as f: - f.write(b64encode(bytes(json.dumps(data), 'utf-8'))) - - def fill_slot_data(self) -> dict: - return self._get_mc_data() - - def get_filler_item_name(self) -> str: - return get_junk_item_names(self.random, 1)[0] - - -class MinecraftLocation(Location): - game = "Minecraft" - -class MinecraftItem(Item): - game = "Minecraft" - - -def mc_update_output(raw_data, server, port): - data = json.loads(b64decode(raw_data)) - data['server'] = server - data['port'] = port - return b64encode(bytes(json.dumps(data), 'utf-8')) diff --git a/worlds/minecraft/data/excluded_locations.json b/worlds/minecraft/data/excluded_locations.json deleted file mode 100644 index 2f6fbbba6d..0000000000 --- a/worlds/minecraft/data/excluded_locations.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "hard": [ - "Very Very Frightening", - "A Furious Cocktail", - "Two by Two", - "Two Birds, One Arrow", - "Arbalistic", - "Monsters Hunted", - "Beaconator", - "A Balanced Diet", - "Uneasy Alliance", - "Cover Me in Debris", - "A Complete Catalogue", - "Surge Protector", - "Sound of Music", - "Star Trader", - "When the Squad Hops into Town", - "With Our Powers Combined!" - ], - "unreasonable": [ - "How Did We Get Here?", - "Adventuring Time" - ], - "ender_dragon": [ - "Free the End", - "The Next Generation", - "The End... Again...", - "You Need a Mint", - "Monsters Hunted", - "Is It a Plane?" - ], - "wither": [ - "Withering Heights", - "Bring Home the Beacon", - "Beaconator", - "A Furious Cocktail", - "How Did We Get Here?", - "Monsters Hunted" - ] -} \ No newline at end of file diff --git a/worlds/minecraft/data/items.json b/worlds/minecraft/data/items.json deleted file mode 100644 index 7d35d18aeb..0000000000 --- a/worlds/minecraft/data/items.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "all_items": [ - "Archery", - "Progressive Resource Crafting", - "Resource Blocks", - "Brewing", - "Enchanting", - "Bucket", - "Flint and Steel", - "Bed", - "Bottles", - "Shield", - "Fishing Rod", - "Campfire", - "Progressive Weapons", - "Progressive Tools", - "Progressive Armor", - "8 Netherite Scrap", - "8 Emeralds", - "4 Emeralds", - "Channeling Book", - "Silk Touch Book", - "Sharpness III Book", - "Piercing IV Book", - "Looting III Book", - "Infinity Book", - "4 Diamond Ore", - "16 Iron Ore", - "500 XP", - "100 XP", - "50 XP", - "3 Ender Pearls", - "4 Lapis Lazuli", - "16 Porkchops", - "8 Gold Ore", - "Rotten Flesh", - "Single Arrow", - "32 Arrows", - "Saddle", - "Structure Compass (Village)", - "Structure Compass (Pillager Outpost)", - "Structure Compass (Nether Fortress)", - "Structure Compass (Bastion Remnant)", - "Structure Compass (End City)", - "Shulker Box", - "Dragon Egg Shard", - "Spyglass", - "Lead", - "Bee Trap" - ], - "progression_items": [ - "Archery", - "Progressive Resource Crafting", - "Resource Blocks", - "Brewing", - "Enchanting", - "Bucket", - "Flint and Steel", - "Bed", - "Bottles", - "Shield", - "Fishing Rod", - "Campfire", - "Progressive Weapons", - "Progressive Tools", - "Progressive Armor", - "8 Netherite Scrap", - "Channeling Book", - "Silk Touch Book", - "Piercing IV Book", - "3 Ender Pearls", - "Saddle", - "Structure Compass (Village)", - "Structure Compass (Pillager Outpost)", - "Structure Compass (Nether Fortress)", - "Structure Compass (Bastion Remnant)", - "Structure Compass (End City)", - "Dragon Egg Shard", - "Spyglass", - "Lead" - ], - "useful_items": [ - "Sharpness III Book", - "Looting III Book", - "Infinity Book" - ], - "trap_items": [ - "Bee Trap" - ], - - "required_pool": { - "Archery": 1, - "Progressive Resource Crafting": 2, - "Brewing": 1, - "Enchanting": 1, - "Bucket": 1, - "Flint and Steel": 1, - "Bed": 1, - "Bottles": 1, - "Shield": 1, - "Fishing Rod": 1, - "Campfire": 1, - "Progressive Weapons": 3, - "Progressive Tools": 3, - "Progressive Armor": 2, - "8 Netherite Scrap": 2, - "Channeling Book": 1, - "Silk Touch Book": 1, - "Sharpness III Book": 1, - "Piercing IV Book": 1, - "Looting III Book": 1, - "Infinity Book": 1, - "3 Ender Pearls": 4, - "Saddle": 1, - "Spyglass": 1, - "Lead": 1 - }, - "junk_weights": { - "4 Emeralds": 2, - "4 Diamond Ore": 1, - "16 Iron Ore": 1, - "50 XP": 4, - "16 Porkchops": 2, - "8 Gold Ore": 1, - "Rotten Flesh": 1, - "32 Arrows": 1 - } -} \ No newline at end of file diff --git a/worlds/minecraft/data/locations.json b/worlds/minecraft/data/locations.json deleted file mode 100644 index 7cd00e5851..0000000000 --- a/worlds/minecraft/data/locations.json +++ /dev/null @@ -1,250 +0,0 @@ -{ - "all_locations": [ - "Who is Cutting Onions?", - "Oh Shiny", - "Suit Up", - "Very Very Frightening", - "Hot Stuff", - "Free the End", - "A Furious Cocktail", - "Best Friends Forever", - "Bring Home the Beacon", - "Not Today, Thank You", - "Isn't It Iron Pick", - "Local Brewery", - "The Next Generation", - "Fishy Business", - "Hot Tourist Destinations", - "This Boat Has Legs", - "Sniper Duel", - "Nether", - "Great View From Up Here", - "How Did We Get Here?", - "Bullseye", - "Spooky Scary Skeleton", - "Two by Two", - "Stone Age", - "Two Birds, One Arrow", - "We Need to Go Deeper", - "Who's the Pillager Now?", - "Getting an Upgrade", - "Tactical Fishing", - "Zombie Doctor", - "The City at the End of the Game", - "Ice Bucket Challenge", - "Remote Getaway", - "Into Fire", - "War Pigs", - "Take Aim", - "Total Beelocation", - "Arbalistic", - "The End... Again...", - "Acquire Hardware", - "Not Quite \"Nine\" Lives", - "Cover Me With Diamonds", - "Sky's the Limit", - "Hired Help", - "Return to Sender", - "Sweet Dreams", - "You Need a Mint", - "Adventure", - "Monsters Hunted", - "Enchanter", - "Voluntary Exile", - "Eye Spy", - "The End", - "Serious Dedication", - "Postmortal", - "Monster Hunter", - "Adventuring Time", - "A Seedy Place", - "Those Were the Days", - "Hero of the Village", - "Hidden in the Depths", - "Beaconator", - "Withering Heights", - "A Balanced Diet", - "Subspace Bubble", - "Husbandry", - "Country Lode, Take Me Home", - "Bee Our Guest", - "What a Deal!", - "Uneasy Alliance", - "Diamonds!", - "A Terrible Fortress", - "A Throwaway Joke", - "Minecraft", - "Sticky Situation", - "Ol' Betsy", - "Cover Me in Debris", - "The End?", - "The Parrots and the Bats", - "A Complete Catalogue", - "Getting Wood", - "Time to Mine!", - "Hot Topic", - "Bake Bread", - "The Lie", - "On a Rail", - "Time to Strike!", - "Cow Tipper", - "When Pigs Fly", - "Overkill", - "Librarian", - "Overpowered", - "Wax On", - "Wax Off", - "The Cutest Predator", - "The Healing Power of Friendship", - "Is It a Bird?", - "Is It a Balloon?", - "Is It a Plane?", - "Surge Protector", - "Light as a Rabbit", - "Glow and Behold!", - "Whatever Floats Your Goat!", - "Caves & Cliffs", - "Feels like home", - "Sound of Music", - "Star Trader", - "Birthday Song", - "Bukkit Bukkit", - "It Spreads", - "Sneak 100", - "When the Squad Hops into Town", - "With Our Powers Combined!", - "You've Got a Friend in Me" - ], - "locations_by_region": { - "Overworld": [ - "Who is Cutting Onions?", - "Oh Shiny", - "Suit Up", - "Very Very Frightening", - "Hot Stuff", - "Best Friends Forever", - "Not Today, Thank You", - "Isn't It Iron Pick", - "Fishy Business", - "Sniper Duel", - "Bullseye", - "Stone Age", - "Two Birds, One Arrow", - "Getting an Upgrade", - "Tactical Fishing", - "Zombie Doctor", - "Ice Bucket Challenge", - "Take Aim", - "Total Beelocation", - "Arbalistic", - "Acquire Hardware", - "Cover Me With Diamonds", - "Hired Help", - "Sweet Dreams", - "Adventure", - "Monsters Hunted", - "Enchanter", - "Eye Spy", - "Monster Hunter", - "Adventuring Time", - "A Seedy Place", - "Husbandry", - "Bee Our Guest", - "Diamonds!", - "A Throwaway Joke", - "Minecraft", - "Sticky Situation", - "Ol' Betsy", - "The Parrots and the Bats", - "Getting Wood", - "Time to Mine!", - "Hot Topic", - "Bake Bread", - "The Lie", - "On a Rail", - "Time to Strike!", - "Cow Tipper", - "When Pigs Fly", - "Librarian", - "Wax On", - "Wax Off", - "The Cutest Predator", - "The Healing Power of Friendship", - "Is It a Bird?", - "Surge Protector", - "Light as a Rabbit", - "Glow and Behold!", - "Whatever Floats Your Goat!", - "Caves & Cliffs", - "Sound of Music", - "Bukkit Bukkit", - "It Spreads", - "Sneak 100", - "When the Squad Hops into Town" - ], - "The Nether": [ - "Hot Tourist Destinations", - "This Boat Has Legs", - "Nether", - "Two by Two", - "We Need to Go Deeper", - "Not Quite \"Nine\" Lives", - "Return to Sender", - "Serious Dedication", - "Hidden in the Depths", - "Subspace Bubble", - "Country Lode, Take Me Home", - "Uneasy Alliance", - "Cover Me in Debris", - "Is It a Balloon?", - "Feels like home", - "With Our Powers Combined!" - ], - "The End": [ - "Free the End", - "The Next Generation", - "Remote Getaway", - "The End... Again...", - "You Need a Mint", - "The End", - "The End?", - "Is It a Plane?" - ], - "Village": [ - "Postmortal", - "Hero of the Village", - "A Balanced Diet", - "What a Deal!", - "A Complete Catalogue", - "Star Trader" - ], - "Nether Fortress": [ - "A Furious Cocktail", - "Bring Home the Beacon", - "Local Brewery", - "How Did We Get Here?", - "Spooky Scary Skeleton", - "Into Fire", - "Beaconator", - "Withering Heights", - "A Terrible Fortress", - "Overkill" - ], - "Pillager Outpost": [ - "Who's the Pillager Now?", - "Voluntary Exile", - "Birthday Song", - "You've Got a Friend in Me" - ], - "Bastion Remnant": [ - "War Pigs", - "Those Were the Days", - "Overpowered" - ], - "End City": [ - "Great View From Up Here", - "The City at the End of the Game", - "Sky's the Limit" - ] - } -} \ No newline at end of file diff --git a/worlds/minecraft/data/regions.json b/worlds/minecraft/data/regions.json deleted file mode 100644 index c9e51e4829..0000000000 --- a/worlds/minecraft/data/regions.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "regions": [ - ["Menu", ["New World"]], - ["Overworld", ["Nether Portal", "End Portal", "Overworld Structure 1", "Overworld Structure 2"]], - ["The Nether", ["Nether Structure 1", "Nether Structure 2"]], - ["The End", ["The End Structure"]], - ["Village", []], - ["Pillager Outpost", []], - ["Nether Fortress", []], - ["Bastion Remnant", []], - ["End City", []] - ], - "mandatory_connections": [ - ["New World", "Overworld"], - ["Nether Portal", "The Nether"], - ["End Portal", "The End"] - ], - "default_connections": [ - ["Overworld Structure 1", "Village"], - ["Overworld Structure 2", "Pillager Outpost"], - ["Nether Structure 1", "Nether Fortress"], - ["Nether Structure 2", "Bastion Remnant"], - ["The End Structure", "End City"] - ], - "illegal_connections": { - "Nether Fortress": ["The End Structure"] - } -} \ No newline at end of file diff --git a/worlds/minecraft/docs/en_Minecraft.md b/worlds/minecraft/docs/en_Minecraft.md deleted file mode 100644 index 3a69a7f59a..0000000000 --- a/worlds/minecraft/docs/en_Minecraft.md +++ /dev/null @@ -1,113 +0,0 @@ -# Minecraft - -## Where is the options page? - -The [player options page for this game](../player-options) contains all the options you need to configure and export a -config file. - -## What does randomization do to this game? - -Some recipes are locked from being able to be crafted and shuffled into the item pool. It can also optionally change which -structures appear in each dimension. Crafting recipes are re-learned when they are received from other players as item -checks, and occasionally when completing your own achievements. See below for which recipes are shuffled. - -## What is considered a location check in Minecraft? - -Location checks are completed when the player completes various Minecraft achievements. Opening the advancements menu -in-game by pressing "L" will display outstanding achievements. - -## When the player receives an item, what happens? - -When the player receives an item in Minecraft, it either unlocks crafting recipes or puts items into the player's -inventory directly. - -## What is the victory condition? - -Victory is achieved when the player kills the Ender Dragon, enters the portal in The End, and completes the credits -sequence either by skipping it or watching it play out. - -## Which recipes are locked? - -* Archery - * Bow - * Arrow - * Crossbow -* Brewing - * Blaze Powder - * Brewing Stand -* Enchanting - * Enchanting Table - * Bookshelf -* Bucket -* Flint & Steel -* All Beds -* Bottles -* Shield -* Fishing Rod - * Fishing Rod - * Carrot on a Stick - * Warped Fungus on a Stick -* Campfire - * Campfire - * Soul Campfire -* Spyglass -* Lead -* Progressive Weapons - * Tier I - * Stone Sword - * Stone Axe - * Tier II - * Iron Sword - * Iron Axe - * Tier III - * Diamond Sword - * Diamond Axe -* Progessive Tools - * Tier I - * Stone Pickaxe - * Stone Shovel - * Stone Hoe - * Tier II - * Iron Pickaxe - * Iron Shovel - * Iron Hoe - * Tier III - * Diamond Pickaxe - * Diamond Shovel - * Diamond Hoe - * Netherite Ingot -* Progressive Armor - * Tier I - * Iron Helmet - * Iron Chestplate - * Iron Leggings - * Iron Boots - * Tier II - * Diamond Helmet - * Diamond Chestplate - * Diamond Leggings - * Diamond Boots -* Progressive Resource Crafting - * Tier I - * Iron Ingot from Nuggets - * Iron Nugget - * Gold Ingot from Nuggets - * Gold Nugget - * Furnace - * Blast Furnace - * Tier II - * Redstone - * Redstone Block - * Glowstone - * Iron Ingot from Iron Block - * Iron Block - * Gold Ingot from Gold Block - * Gold Block - * Diamond - * Diamond Block - * Netherite Block - * Netherite Ingot from Netherite Block - * Anvil - * Emerald - * Emerald Block - * Copper Block diff --git a/worlds/minecraft/docs/minecraft_en.md b/worlds/minecraft/docs/minecraft_en.md deleted file mode 100644 index e0b5ae3b98..0000000000 --- a/worlds/minecraft/docs/minecraft_en.md +++ /dev/null @@ -1,74 +0,0 @@ -# Minecraft Randomizer Setup Guide - -## Required Software - -- Minecraft Java Edition from - the [Minecraft Java Edition Store Page](https://www.minecraft.net/en-us/store/minecraft-java-edition) -- Archipelago from the [Archipelago Releases Page](https://github.com/ArchipelagoMW/Archipelago/releases) - -## Configuring your YAML file - -### What is a YAML file and why do I need one? - -See the guide on setting up a basic YAML at the Archipelago setup -guide: [Basic Multiworld Setup Guide](/tutorial/Archipelago/setup/en) - -### Where do I get a YAML file? - -You can customize your options by visiting the [Minecraft Player Options Page](/games/Minecraft/player-options) - -## Joining a MultiWorld Game - -### Obtain Your Minecraft Data File - -**Only one yaml file needs to be submitted per minecraft world regardless of how many players play on it.** - -When you join a multiworld game, you will be asked to provide your YAML file to whoever is hosting. Once that is done, -the host will provide you with either a link to download your data file, or with a zip file containing everyone's data -files. Your data file should have a `.apmc` extension. - -Double-click on your `.apmc` file to have the Minecraft client auto-launch the installed forge server. Make sure to -leave this window open as this is your server console. - -### Connect to the MultiServer - -Open Minecraft, go to `Multiplayer > Direct Connection`, and join the `localhost` server address. - -If you are using the website to host the game then it should auto-connect to the AP server without the need to `/connect` - -otherwise once you are in game type `/connect (Port) (Password)` where `` is the address of the -Archipelago server. `(Port)` is only required if the Archipelago server is not using the default port of 38281. Note that there is no colon between `` and `(Port)`. -`(Password)` is only required if the Archipelago server you are using has a password set. - -### Play the game - -When the console tells you that you have joined the room, you're all set. Congratulations on successfully joining a -multiworld game! At this point any additional minecraft players may connect to your forge server. To start the game once -everyone is ready use the command `/start`. - -## Non-Windows Installation - -The Minecraft Client will install forge and the mod for other operating systems but Java has to be provided by the -user. Head to [minecraft_versions.json on the MC AP GitHub](https://raw.githubusercontent.com/KonoTyran/Minecraft_AP_Randomizer/master/versions/minecraft_versions.json) -to see which java version is required. New installations will default to the topmost "release" version. -- Install the matching Amazon Corretto JDK - - see [Manual Installation Software Links](#manual-installation-software-links) - - or package manager provided by your OS / distribution -- Open your `host.yaml` and add the path to your Java below the `minecraft_options` key - - ` java: "path/to/java-xx-amazon-corretto/bin/java"` -- Run the Minecraft Client and select your .apmc file - -## Full Manual Installation - -It is highly recommended to ues the Archipelago installer to handle the installation of the forge server for you. -Support will not be given for those wishing to manually install forge. For those of you who know how, and wish to do so, -the following links are the versions of the software we use. - -### Manual Installation Software Links - -- [Minecraft Forge Download Page](https://files.minecraftforge.net/net/minecraftforge/forge/) -- [Minecraft Archipelago Randomizer Mod Releases Page](https://github.com/KonoTyran/Minecraft_AP_Randomizer/releases) - - **DO NOT INSTALL THIS ON YOUR CLIENT** -- [Amazon Corretto](https://docs.aws.amazon.com/corretto/) - - pick the matching version and select "Downloads" on the left - diff --git a/worlds/minecraft/docs/minecraft_es.md b/worlds/minecraft/docs/minecraft_es.md deleted file mode 100644 index 4f48992122..0000000000 --- a/worlds/minecraft/docs/minecraft_es.md +++ /dev/null @@ -1,148 +0,0 @@ -# Guia instalación de Minecraft Randomizer - -# Instalacion automatica para el huesped de partida - -- descarga e instala [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) and activa el - modulo `Minecraft Client` - -## Software Requerido - -- [Minecraft Java Edition](https://www.minecraft.net/en-us/store/minecraft-java-edition) - -## Configura tu fichero YAML - -### Que es un fichero YAML y potque necesito uno? - -Tu fichero YAML contiene un numero de opciones que proveen al generador con informacion sobre como debe generar tu -juego. Cada jugador de un multiworld entregara u propio fichero YAML. Esto permite que cada jugador disfrute de una -experiencia personalizada a su gusto y diferentes jugadores dentro del mismo multiworld pueden tener diferentes opciones - -### Where do I get a YAML file? - -Un fichero basico yaml para minecraft tendra este aspecto. - -```yaml -description: Basic Minecraft Yaml -# Tu nombre en el juego. Espacios seran sustituidos por guinoes bajos y -# hay un limite de 16 caracteres -name: TuNombre -game: Minecraft - -# Opciones compartidas por todos los juegos: -accessibility: full -progression_balancing: 50 -# Opciones Especficicas para Minecraft - -Minecraft: - # Numero de logros requeridos (87 max) para que aparezca el Ender Dragon y completar el juego. - advancement_goal: 50 - - # Numero de trozos de huevo de dragon a obtener (30 max) antes de que el Ender Dragon aparezca. - egg_shards_required: 10 - - # Numero de huevos disponibles en la partida (30 max). - egg_shards_available: 15 - - # Modifica el nivel de objetos logicamente requeridos para - # explorar areas peligrosas y luchar contra jefes. - combat_difficulty: - easy: 0 - normal: 1 - hard: 0 - - # Si off, los logros que dependan de suerte o sean tediosos tendran objetos de apoyo, no necesarios para completar el juego. - include_hard_advancements: - on: 0 - off: 1 - - # Si off, los logros muy dificiles tendran objetos de apoyo, no necesarios para completar el juego. - # Solo afecta a How Did We Get Here? and Adventuring Time. - include_insane_advancements: - on: 0 - off: 1 - - # Algunos logros requieren derrotar al Ender Dragon; - # Si esto se queda en off, dichos logros no tendran objetos necesarios. - include_postgame_advancements: - on: 0 - off: 1 - - # Permite el mezclado de villas, puesto, fortalezas, bastiones y ciudades de END. - shuffle_structures: - on: 0 - off: 1 - - # Añade brujulas de estructura al juego, - # apuntaran a la estructura correspondiente mas cercana. - structure_compasses: - on: 0 - off: 1 - - # Reemplaza un porcentaje de objetos innecesarios por trampas abeja - # las cuales crearan multiples abejas agresivas alrededor de los jugadores cuando se reciba. - bee_traps: - 0: 1 - 25: 0 - 50: 0 - 75: 0 - 100: 0 -``` - -## Unirse a un juego MultiWorld - -### Obten tu ficheros de datos Minecraft - -**Solo un fichero yaml es necesario por mundo minecraft, sin importar el numero de jugadores que jueguen en el.** - -Cuando te unes a un juego multiworld, se te pedirá que entregues tu fichero YAML a quien sea que hospede el juego -multiworld (no confundir con hospedar el mundo minecraft). Una vez la generación acabe, el anfitrión te dará un enlace a -tu fichero de datos o un zip con los ficheros de todos. Tu fichero de datos tiene una extensión `.apmc`. - -Haz doble click en tu fichero `.apmc` para que se arranque el cliente de minecraft y el servidor forge se ejecute. - -### Conectar al multiserver - -Despues de poner tu fichero en el directorio `APData`, arranca el Forge server y asegurate que tienes el estado OP -tecleando `/op TuUsuarioMinecraft` en la consola del servidor y entonces conectate con tu cliente Minecraft. - -Una vez en juego introduce `/connect (Port) ()` donde `` es la dirección del -servidor. `(Port)` solo es requerido si el servidor Archipelago no esta usando el puerto por defecto 38281. -`()` -solo se necesita si el servidor Archipleago tiene un password activo. - -### Jugar al juego - -Cuando la consola te diga que te has unido a la sala, estas lista/o para empezar a jugar. Felicidades por unirte -exitosamente a un juego multiworld! Llegados a este punto cualquier jugador adicional puede conectarse a tu servidor -forge. - -## Procedimiento de instalación manual - -Solo es requerido si quieres usar una instalacion de forge por ti mismo, recomendamos usar el instalador de Archipelago - -### Software Requerido - -- [Minecraft Forge](https://files.minecraftforge.net/net/minecraftforge/forge/index_1.16.5.html) -- [Minecraft Archipelago Randomizer Mod](https://github.com/KonoTyran/Minecraft_AP_Randomizer/releases) - **NO INSTALES ESTO EN TU CLIENTE MINECRAFT** - -### Instalación de servidor dedicado - -Solo una persona ha de realizar este proceso y hospedar un servidor dedicado para que los demas jueguen conectandose a -él. - -1. Descarga el instalador de **Minecraft Forge** 1.16.5 desde el enlace proporcionado, siempre asegurandose de bajar la - version mas reciente. - -2. Ejecuta el fichero `forge-1.16.5-xx.x.x-installer.jar` y elije **install server**. - - En esta pagina elegiras ademas donde instalar el servidor, importante recordar esta localización en el siguiente - paso. - -3. Navega al directorio donde hayas instalado el servidor y abre `forge-1.16.5-xx.x.x.jar` - - La primera vez que lances el servidor se cerrara (o no aparecerá nada en absoluto), debería haber un fichero nuevo - en el directorio llamado `eula.txt`, el cual que contiene un enlace al EULA de minecraft, cambia la linea - a `eula=true` para aceptar el EULA y poder utilizar el software de servidor. - - Esto creara la estructura de directorios apropiada para el siguiente paso - -4. Coloca el fichero `aprandomizer-x.x.x.jar` del segundo enlace en el directorio `mods` - - Cuando se ejecute el servidor de nuevo, generara el directorio `APData` que se necesitara para jugar diff --git a/worlds/minecraft/docs/minecraft_fr.md b/worlds/minecraft/docs/minecraft_fr.md deleted file mode 100644 index 31c48151f4..0000000000 --- a/worlds/minecraft/docs/minecraft_fr.md +++ /dev/null @@ -1,74 +0,0 @@ -# Guide de configuration du randomiseur Minecraft - -## Logiciel requis - -- Minecraft Java Edition à partir de - la [page de la boutique Minecraft Java Edition](https://www.minecraft.net/en-us/store/minecraft-java-edition) -- Archipelago depuis la [page des versions d'Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) - - (sélectionnez `Minecraft Client` lors de l'installation.) - -## Configuration de votre fichier YAML - -### Qu'est-ce qu'un fichier YAML et pourquoi en ai-je besoin ? - -Voir le guide sur la configuration d'un YAML de base lors de la configuration d'Archipelago -guide : [Guide de configuration de base de Multiworld](/tutorial/Archipelago/setup/en) - -### Où puis-je obtenir un fichier YAML ? - -Vous pouvez personnaliser vos paramètres Minecraft en allant sur la [page des paramètres de joueur](/games/Minecraft/player-options) - -## Rejoindre une partie MultiWorld - -### Obtenez votre fichier de données Minecraft - -**Un seul fichier yaml doit être soumis par monde minecraft, quel que soit le nombre de joueurs qui y jouent.** - -Lorsque vous rejoignez un jeu multimonde, il vous sera demandé de fournir votre fichier YAML à l'hébergeur. Une fois cela fait, -l'hébergeur vous fournira soit un lien pour télécharger votre fichier de données, soit un fichier zip contenant les données de chacun -des dossiers. Votre fichier de données doit avoir une extension `.apmc`. - -Double-cliquez sur votre fichier `.apmc` pour que le client Minecraft lance automatiquement le serveur forge installé. Assurez-vous de -laissez cette fenêtre ouverte car il s'agit de votre console serveur. - -### Connectez-vous au multiserveur - -Ouvrez Minecraft, accédez à "Multijoueur> Connexion directe" et rejoignez l'adresse du serveur "localhost". - -Si vous utilisez le site Web pour héberger le jeu, il devrait se connecter automatiquement au serveur AP sans avoir besoin de `/connect` - -sinon, une fois que vous êtes dans le jeu, tapez `/connect (Port) (Password)` où `` est l'adresse du -Serveur Archipelago. `(Port)` n'est requis que si le serveur Archipelago n'utilise pas le port par défaut 38281. Notez qu'il n'y a pas de deux-points entre `` et `(Port)` mais un espace. -`(Mot de passe)` n'est requis que si le serveur Archipelago que vous utilisez a un mot de passe défini. - -### Jouer le jeu - -Lorsque la console vous indique que vous avez rejoint la salle, vous êtes prêt. Félicitations pour avoir rejoint avec succès un -jeu multimonde ! À ce stade, tous les joueurs minecraft supplémentaires peuvent se connecter à votre serveur forge. Pour commencer le jeu une fois -que tout le monde est prêt utilisez la commande `/start`. - -## Installation non Windows - -Le client Minecraft installera forge et le mod pour d'autres systèmes d'exploitation, mais Java doit être fourni par l' -utilisateur. Rendez-vous sur [minecraft_versions.json sur le MC AP GitHub](https://raw.githubusercontent.com/KonoTyran/Minecraft_AP_Randomizer/master/versions/minecraft_versions.json) -pour voir quelle version de Java est requise. Les nouvelles installations utiliseront par défaut la version "release" la plus élevée. -- Installez le JDK Amazon Corretto correspondant - - voir les [Liens d'installation manuelle du logiciel](#manual-installation-software-links) - - ou gestionnaire de paquets fourni par votre OS/distribution -- Ouvrez votre `host.yaml` et ajoutez le chemin vers votre Java sous la clé `minecraft_options` - - ` java : "chemin/vers/java-xx-amazon-corretto/bin/java"` -- Exécutez le client Minecraft et sélectionnez votre fichier .apmc - -## Installation manuelle complète - -Il est fortement recommandé d'utiliser le programme d'installation d'Archipelago pour gérer l'installation du serveur forge pour vous. -Le support ne sera pas fourni pour ceux qui souhaitent installer manuellement forge. Pour ceux d'entre vous qui savent comment faire et qui souhaitent le faire, -les liens suivants sont les versions des logiciels que nous utilisons. - -### Liens d'installation manuelle du logiciel - -- [Page de téléchargement de Minecraft Forge] (https://files.minecraftforge.net/net/minecraftforge/forge/) -- [Page des versions du mod Minecraft Archipelago Randomizer] (https://github.com/KonoTyran/Minecraft_AP_Randomizer/releases) - - **NE PAS INSTALLER CECI SUR VOTRE CLIENT** -- [Amazon Corretto](https://docs.aws.amazon.com/corretto/) - - choisissez la version correspondante et sélectionnez "Téléchargements" sur la gauche diff --git a/worlds/minecraft/docs/minecraft_sv.md b/worlds/minecraft/docs/minecraft_sv.md deleted file mode 100644 index ab8c1b5d8e..0000000000 --- a/worlds/minecraft/docs/minecraft_sv.md +++ /dev/null @@ -1,132 +0,0 @@ -# Minecraft Randomizer Uppsättningsguide - -## Nödvändig Mjukvara - -### Server Värd - -- [Minecraft Forge](https://files.minecraftforge.net/net/minecraftforge/forge/index_1.16.5.html) -- [Minecraft Archipelago Randomizer Mod](https://github.com/KonoTyran/Minecraft_AP_Randomizer/releases) - -### Spelare - -- [Minecraft Java Edition](https://www.minecraft.net/en-us/store/minecraft-java-edition) - -## Installationsprocedurer - -### Tillägnad - -Bara en person behöver göra denna uppsättning och vara värd för en server för alla andra spelare att koppla till. - -1. Ladda ner 1.16.5 **Minecraft Forge** installeraren från länken ovanför och se till att ladda ner den senaste - rekommenderade versionen. - -2. Kör `forge-1.16.5-xx.x.x-installer.jar` filen och välj **installera server**. - - På denna sida kommer du också välja vart du ska installera servern för att komma ihåg denna katalog. Detta är - viktigt för nästa steg. - -3. Navigera till vart du har installerat servern och öppna `forge-1.16.5-xx.x.x-installer.jar` - - Under första serverstart så kommer den att stängas ner och fråga dig att acceptera Minecrafts EULA. En ny fil - kommer skapas vid namn `eula.txt` som har en länk till Minecrafts EULA, och en linje som du behöver byta - till `eula=true` för att acceptera Minecrafts EULA. - - Detta kommer skapa de lämpliga katalogerna för dig att placera filerna i de följande steget. - -4. Placera `aprandomizer-x.x.x.jar` länken ovanför i `mods` mappen som ligger ovanför installationen av din forge - server. - - Kör servern igen. Den kommer ladda up och generera den nödvändiga katalogen `APData` för när du är redo att spela! - -### Grundläggande Spelaruppsättning - -- Köp och installera Minecraft från länken ovanför. - - **Du är klar**. - - Andra spelare behöver endast ha en 'Vanilla' omodifierad version av Minecraft för att kunna spela! - -### Avancerad Spelaruppsättning - -***Detta är inte nödvändigt för att spela ett slumpmässigt Minecraftspel.*** -Dock så är det rekommenderat eftersom det hjälper att göra upplevelsen mer trevligt. - -#### Rekommenderade Moddar - -- [JourneyMap](https://www.curseforge.com/minecraft/mc-mods/journeymap) (Minimap) - - -1. Installera och Kör Minecraft från länken ovanför minst en gång. -2. Kör `forge-1.16.5-xx.x.x-installer.jar` filen och välj **installera klient**. - - Starta Minecraft Forge minst en gång för att skapa katalogerna som behövs för de nästa stegen. -3. Navigera till din Minecraft installationskatalog och placera de önskade moddarna med `.jar` i `mods` -katalogen. - - Standardinstallationskatalogerna är som följande; - - Windows `%APPDATA%\.minecraft\mods` - - macOS `~/Library/Application Support/minecraft/mods` - - Linux `~/.minecraft/mods` - -## Konfigurera Din YAML-fil - -### Vad är en YAML-fil och varför behöver jag en? - -Din YAML-fil behåller en uppsättning av konfigurationsalternativ som ger generatorn med information om hur den borde -generera ditt spel. Varje spelare i en multivärld kommer behöva ge deras egen YAML-fil. Denna uppsättning tillåter varje -spelare att an njuta av en upplevelse anpassade för deras smaker, och olika spelare i samma multivärld kan ha helt olika -alternativ. - -### Vart kan jag få tag i en YAML-fil? - -En grundläggande Minecraft YAML kommer se ut så här. - -```yaml -description: Template Name -# Ditt spelnamn. Mellanslag kommer bli omplacerad med understräck och det är en 16-karaktärsgräns. -name: YourName -game: Minecraft -accessibility: full -progression_balancing: 0 -advancement_goal: - few: 0 - normal: 1 - many: 0 -combat_difficulty: - easy: 0 - normal: 1 - hard: 0 -include_hard_advancements: - on: 0 - off: 1 -include_insane_advancements: - on: 0 - off: 1 -include_postgame_advancements: - on: 0 - off: 1 -shuffle_structures: - on: 1 - off: 0 -``` - - -## Gå med i ett Multivärld-spel - -### Skaffa din Minecraft data-fil - -**Endast en YAML-fil behöver användats per Minecraft-värld oavsett hur många spelare det är som spelar.** - -När du går med it ett Multivärld spel så kommer du bli ombedd att lämna in din YAML-fil till personen som värdar. När -detta är klart så kommer värden att ge dig antingen en länk till att ladda ner din data-fil, eller mer en zip-fil som -innehåller allas data-filer. Din data-fil borde ha en `.apmc` -extension. - -Lägg din data-fil i dina forge-servrar `APData` -mapp. Se till att ta bort alla tidigare data-filer som var i där förut. - -### Koppla till Multiservern - -Efter du har placerat din data-fil i `APData` -mappen, starta forge-servern och se till att you har OP-status genom att -skriva `/op DittAnvändarnamn` i forger-serverns konsol innan du kopplar dig till din Minecraft klient. När du är inne i -spelet, skriv `/connect ()` där `` är addressen av -Archipelago-servern. `()` är endast nödvändigt om Archipelago-servern som du använder har ett tillsatt -lösenord. - -### Spela spelet - -När konsolen har informerat att du har gått med i rummet så är du redo att börja spela. Grattis att du har lykats med -att gått med i ett Multivärld-spel! Vid detta tillfälle, alla ytterligare Minecraft-spelare må koppla in till din -forge-server. - diff --git a/worlds/minecraft/requirements.txt b/worlds/minecraft/requirements.txt deleted file mode 100644 index 85fe230fe5..0000000000 --- a/worlds/minecraft/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -requests >= 2.28.1 # used by client diff --git a/worlds/minecraft/test/TestAdvancements.py b/worlds/minecraft/test/TestAdvancements.py deleted file mode 100644 index 321aef1af9..0000000000 --- a/worlds/minecraft/test/TestAdvancements.py +++ /dev/null @@ -1,1410 +0,0 @@ -from . import MCTestBase - - -# Format: -# [location, expected_result, given_items, [excluded_items]] -# Every advancement has its own test, named by its internal ID number. -class TestAdvancements(MCTestBase): - options = { - "shuffle_structures": False, - "structure_compasses": False - } - - def test_42000(self): - self.run_location_tests([ - ["Who is Cutting Onions?", False, []], - ["Who is Cutting Onions?", False, [], ['Progressive Resource Crafting']], - ["Who is Cutting Onions?", False, [], ['Flint and Steel']], - ["Who is Cutting Onions?", False, [], ['Progressive Tools']], - ["Who is Cutting Onions?", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Who is Cutting Onions?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket']], - ["Who is Cutting Onions?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools']], - ]) - - def test_42001(self): - self.run_location_tests([ - ["Oh Shiny", False, []], - ["Oh Shiny", False, [], ['Progressive Resource Crafting']], - ["Oh Shiny", False, [], ['Flint and Steel']], - ["Oh Shiny", False, [], ['Progressive Tools']], - ["Oh Shiny", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Oh Shiny", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket']], - ["Oh Shiny", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools']], - ]) - - def test_42002(self): - self.run_location_tests([ - ["Suit Up", False, []], - ["Suit Up", False, [], ["Progressive Armor"]], - ["Suit Up", False, [], ["Progressive Resource Crafting"]], - ["Suit Up", False, [], ["Progressive Tools"]], - ["Suit Up", True, ["Progressive Armor", "Progressive Resource Crafting", "Progressive Tools"]], - ]) - - def test_42003(self): - self.run_location_tests([ - ["Very Very Frightening", False, []], - ["Very Very Frightening", False, [], ['Channeling Book']], - ["Very Very Frightening", False, ['Progressive Resource Crafting'], ['Progressive Resource Crafting']], - ["Very Very Frightening", False, [], ['Enchanting']], - ["Very Very Frightening", False, [], ['Progressive Tools']], - ["Very Very Frightening", False, [], ['Progressive Weapons']], - ["Very Very Frightening", True, ['Progressive Weapons', 'Progressive Tools', 'Progressive Tools', 'Progressive Tools', - 'Enchanting', 'Progressive Resource Crafting', 'Progressive Resource Crafting', 'Channeling Book']], - ]) - - def test_42004(self): - self.run_location_tests([ - ["Hot Stuff", False, []], - ["Hot Stuff", False, [], ["Bucket"]], - ["Hot Stuff", False, [], ["Progressive Resource Crafting"]], - ["Hot Stuff", False, [], ["Progressive Tools"]], - ["Hot Stuff", True, ["Bucket", "Progressive Resource Crafting", "Progressive Tools"]], - ]) - - def test_42005(self): - self.run_location_tests([ - ["Free the End", False, []], - ["Free the End", False, [], ['Progressive Resource Crafting']], - ["Free the End", False, [], ['Flint and Steel']], - ["Free the End", False, [], ['Progressive Tools']], - ["Free the End", False, ['Progressive Weapons'], ['Progressive Weapons', 'Progressive Weapons']], - ["Free the End", False, [], ['Progressive Armor']], - ["Free the End", False, [], ['Brewing']], - ["Free the End", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Free the End", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["Free the End", False, [], ['Archery']], - ["Free the End", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Weapons', 'Archery', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["Free the End", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Weapons', 'Archery', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42006(self): - self.run_location_tests([ - ["A Furious Cocktail", False, []], - ["A Furious Cocktail", False, ['Progressive Resource Crafting'], ['Progressive Resource Crafting']], - ["A Furious Cocktail", False, [], ['Flint and Steel']], - ["A Furious Cocktail", False, [], ['Progressive Tools']], - ["A Furious Cocktail", False, [], ['Progressive Weapons']], - ["A Furious Cocktail", False, [], ['Progressive Armor', 'Shield']], - ["A Furious Cocktail", False, [], ['Brewing']], - ["A Furious Cocktail", False, [], ['Bottles']], - ["A Furious Cocktail", False, [], ['Fishing Rod']], - ["A Furious Cocktail", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["A Furious Cocktail", True, ['Progressive Resource Crafting', 'Progressive Resource Crafting', - 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Weapons', 'Progressive Weapons', - 'Progressive Armor', 'Progressive Armor', - 'Enchanting', 'Brewing', 'Bottles', 'Fishing Rod']], - ]) - - def test_42007(self): - self.run_location_tests([ - ["Best Friends Forever", True, []], - ]) - - def test_42008(self): - self.run_location_tests([ - ["Bring Home the Beacon", False, []], - ["Bring Home the Beacon", False, ['Progressive Resource Crafting'], ['Progressive Resource Crafting']], - ["Bring Home the Beacon", False, [], ['Flint and Steel']], - ["Bring Home the Beacon", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["Bring Home the Beacon", False, ['Progressive Weapons'], ['Progressive Weapons', 'Progressive Weapons']], - ["Bring Home the Beacon", False, ['Progressive Armor'], ['Progressive Armor']], - ["Bring Home the Beacon", False, [], ['Enchanting']], - ["Bring Home the Beacon", False, [], ['Brewing']], - ["Bring Home the Beacon", False, [], ['Bottles']], - ["Bring Home the Beacon", True, [], ['Bucket']], - ["Bring Home the Beacon", True, ['Progressive Resource Crafting', 'Progressive Resource Crafting', - 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Weapons', 'Progressive Weapons', - 'Progressive Armor', 'Progressive Armor', - 'Enchanting', 'Brewing', 'Bottles']], - ]) - - def test_42009(self): - self.run_location_tests([ - ["Not Today, Thank You", False, []], - ["Not Today, Thank You", False, [], ["Shield"]], - ["Not Today, Thank You", False, [], ["Progressive Resource Crafting"]], - ["Not Today, Thank You", False, [], ["Progressive Tools"]], - ["Not Today, Thank You", True, ["Shield", "Progressive Resource Crafting", "Progressive Tools"]], - ]) - - def test_42010(self): - self.run_location_tests([ - ["Isn't It Iron Pick", False, []], - ["Isn't It Iron Pick", True, ["Progressive Tools", "Progressive Tools"], ["Progressive Tools"]], - ["Isn't It Iron Pick", False, [], ["Progressive Tools", "Progressive Tools"]], - ["Isn't It Iron Pick", False, [], ["Progressive Resource Crafting"]], - ["Isn't It Iron Pick", False, ["Progressive Tools", "Progressive Resource Crafting"]], - ["Isn't It Iron Pick", True, ["Progressive Tools", "Progressive Tools", "Progressive Resource Crafting"]], - ]) - - def test_42011(self): - self.run_location_tests([ - ["Local Brewery", False, []], - ["Local Brewery", False, [], ['Progressive Resource Crafting']], - ["Local Brewery", False, [], ['Flint and Steel']], - ["Local Brewery", False, [], ['Progressive Tools']], - ["Local Brewery", False, [], ['Progressive Weapons']], - ["Local Brewery", False, [], ['Progressive Armor', 'Shield']], - ["Local Brewery", False, [], ['Brewing']], - ["Local Brewery", False, [], ['Bottles']], - ["Local Brewery", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Local Brewery", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles']], - ["Local Brewery", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles']], - ["Local Brewery", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', 'Brewing', 'Bottles']], - ["Local Brewery", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', 'Brewing', 'Bottles']], - ]) - - def test_42012(self): - self.run_location_tests([ - ["The Next Generation", False, []], - ["The Next Generation", False, [], ['Progressive Resource Crafting']], - ["The Next Generation", False, [], ['Flint and Steel']], - ["The Next Generation", False, [], ['Progressive Tools']], - ["The Next Generation", False, ['Progressive Weapons'], ['Progressive Weapons', 'Progressive Weapons']], - ["The Next Generation", False, [], ['Progressive Armor']], - ["The Next Generation", False, [], ['Brewing']], - ["The Next Generation", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["The Next Generation", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["The Next Generation", False, [], ['Archery']], - ["The Next Generation", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Weapons', 'Archery', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["The Next Generation", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Weapons', 'Archery', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42013(self): - self.run_location_tests([ - ["Fishy Business", False, []], - ["Fishy Business", False, [], ['Fishing Rod']], - ["Fishy Business", True, ['Fishing Rod']], - ]) - - def test_42014(self): - self.run_location_tests([ - ["Hot Tourist Destinations", False, []], - ["Hot Tourist Destinations", False, [], ['Progressive Resource Crafting']], - ["Hot Tourist Destinations", False, [], ['Flint and Steel']], - ["Hot Tourist Destinations", False, [], ['Progressive Tools']], - ["Hot Tourist Destinations", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Hot Tourist Destinations", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket']], - ["Hot Tourist Destinations", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools']], - ]) - - def test_42015(self): - self.run_location_tests([ - ["This Boat Has Legs", False, []], - ["This Boat Has Legs", False, [], ['Progressive Resource Crafting']], - ["This Boat Has Legs", False, [], ['Flint and Steel']], - ["This Boat Has Legs", False, [], ['Progressive Tools']], - ["This Boat Has Legs", False, [], ['Progressive Weapons']], - ["This Boat Has Legs", False, [], ['Progressive Armor', 'Shield']], - ["This Boat Has Legs", False, [], ['Fishing Rod']], - ["This Boat Has Legs", False, [], ['Saddle']], - ["This Boat Has Legs", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["This Boat Has Legs", True, ['Saddle', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Weapons', 'Progressive Armor', 'Flint and Steel', 'Bucket', 'Fishing Rod']], - ["This Boat Has Legs", True, ['Saddle', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Weapons', 'Progressive Armor', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Fishing Rod']], - ["This Boat Has Legs", True, ['Saddle', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Weapons', 'Shield', 'Flint and Steel', 'Bucket', 'Fishing Rod']], - ["This Boat Has Legs", True, ['Saddle', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Weapons', 'Shield', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Fishing Rod']], - ]) - - def test_42016(self): - self.run_location_tests([ - ["Sniper Duel", False, []], - ["Sniper Duel", False, [], ['Archery']], - ["Sniper Duel", True, ['Archery']], - ]) - - def test_42017(self): - self.run_location_tests([ - ["Nether", False, []], - ["Nether", False, [], ['Progressive Resource Crafting']], - ["Nether", False, [], ['Flint and Steel']], - ["Nether", False, [], ['Progressive Tools']], - ["Nether", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Nether", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket']], - ["Nether", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools']], - ]) - - def test_42018(self): - self.run_location_tests([ - ["Great View From Up Here", False, []], - ["Great View From Up Here", False, [], ['Progressive Resource Crafting']], - ["Great View From Up Here", False, [], ['Flint and Steel']], - ["Great View From Up Here", False, [], ['Progressive Tools']], - ["Great View From Up Here", False, [], ['Progressive Weapons']], - ["Great View From Up Here", False, [], ['Progressive Armor', 'Shield']], - ["Great View From Up Here", False, [], ['Brewing']], - ["Great View From Up Here", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Great View From Up Here", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["Great View From Up Here", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["Great View From Up Here", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["Great View From Up Here", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["Great View From Up Here", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42019(self): - self.run_location_tests([ - ["How Did We Get Here?", False, []], - ["How Did We Get Here?", False, ['Progressive Resource Crafting'], ['Progressive Resource Crafting']], - ["How Did We Get Here?", False, [], ['Flint and Steel']], - ["How Did We Get Here?", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["How Did We Get Here?", False, ['Progressive Weapons', 'Progressive Weapons'], ['Progressive Weapons']], - ["How Did We Get Here?", False, ['Progressive Armor'], ['Progressive Armor']], - ["How Did We Get Here?", False, [], ['Shield']], - ["How Did We Get Here?", False, [], ['Enchanting']], - ["How Did We Get Here?", False, [], ['Brewing']], - ["How Did We Get Here?", False, [], ['Bottles']], - ["How Did We Get Here?", False, [], ['Archery']], - ["How Did We Get Here?", False, [], ['Fishing Rod']], - ["How Did We Get Here?", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["How Did We Get Here?", True, ['Progressive Resource Crafting', 'Progressive Resource Crafting', 'Flint and Steel', - 'Progressive Tools', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Weapons', 'Progressive Weapons', - 'Progressive Armor', 'Progressive Armor', 'Shield', - 'Enchanting', 'Brewing', 'Archery', 'Bottles', 'Fishing Rod', - '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42020(self): - self.run_location_tests([ - ["Bullseye", False, []], - ["Bullseye", False, [], ['Archery']], - ["Bullseye", False, [], ['Progressive Resource Crafting']], - ["Bullseye", False, [], ['Progressive Tools']], - ["Bullseye", True, ['Progressive Tools', 'Progressive Tools', 'Progressive Resource Crafting', 'Archery']], - ]) - - def test_42021(self): - self.run_location_tests([ - ["Spooky Scary Skeleton", False, []], - ["Spooky Scary Skeleton", False, [], ['Progressive Resource Crafting']], - ["Spooky Scary Skeleton", False, [], ['Flint and Steel']], - ["Spooky Scary Skeleton", False, [], ['Progressive Tools']], - ["Spooky Scary Skeleton", False, [], ['Progressive Weapons']], - ["Spooky Scary Skeleton", False, [], ['Progressive Armor', 'Shield']], - ["Spooky Scary Skeleton", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Spooky Scary Skeleton", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Progressive Armor']], - ["Spooky Scary Skeleton", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons', 'Progressive Armor']], - ["Spooky Scary Skeleton", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Shield']], - ["Spooky Scary Skeleton", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons', 'Shield']], - ]) - - def test_42022(self): - self.run_location_tests([ - ["Two by Two", False, []], - ["Two by Two", False, [], ['Progressive Resource Crafting']], - ["Two by Two", False, [], ['Flint and Steel']], - ["Two by Two", False, [], ['Progressive Tools']], - ["Two by Two", False, [], ['Progressive Weapons']], - ["Two by Two", False, [], ['Bucket']], - ["Two by Two", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Two by Two", False, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons']], - ["Two by Two", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons']], - ]) - - def test_42023(self): - self.run_location_tests([ - ["Stone Age", True, []], - ]) - - def test_42024(self): - self.run_location_tests([ - ["Two Birds, One Arrow", False, []], - ["Two Birds, One Arrow", False, [], ['Archery']], - ["Two Birds, One Arrow", False, [], ['Progressive Resource Crafting']], - ["Two Birds, One Arrow", False, ['Progressive Tools'], ['Progressive Tools', 'Progressive Tools']], - ["Two Birds, One Arrow", False, [], ['Enchanting']], - ["Two Birds, One Arrow", True, ['Archery', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Progressive Tools', 'Enchanting']], - ]) - - def test_42025(self): - self.run_location_tests([ - ["We Need to Go Deeper", False, []], - ["We Need to Go Deeper", False, [], ['Progressive Resource Crafting']], - ["We Need to Go Deeper", False, [], ['Flint and Steel']], - ["We Need to Go Deeper", False, [], ['Progressive Tools']], - ["We Need to Go Deeper", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["We Need to Go Deeper", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket']], - ["We Need to Go Deeper", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools']], - ]) - - def test_42026(self): - self.run_location_tests([ - ["Who's the Pillager Now?", False, []], - ["Who's the Pillager Now?", False, [], ['Archery']], - ["Who's the Pillager Now?", False, [], ['Progressive Resource Crafting']], - ["Who's the Pillager Now?", False, [], ['Progressive Tools']], - ["Who's the Pillager Now?", False, [], ['Progressive Weapons']], - ["Who's the Pillager Now?", True, ['Archery', 'Progressive Tools', 'Progressive Weapons', 'Progressive Resource Crafting']], - ]) - - def test_42027(self): - self.run_location_tests([ - ["Getting an Upgrade", False, []], - ["Getting an Upgrade", True, ["Progressive Tools"]], - ]) - - def test_42028(self): - self.run_location_tests([ - ["Tactical Fishing", False, []], - ["Tactical Fishing", False, [], ['Progressive Resource Crafting']], - ["Tactical Fishing", False, [], ['Progressive Tools']], - ["Tactical Fishing", False, [], ['Bucket']], - ["Tactical Fishing", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Bucket']], - ]) - - def test_42029(self): - self.run_location_tests([ - ["Zombie Doctor", False, []], - ["Zombie Doctor", False, [], ['Progressive Resource Crafting']], - ["Zombie Doctor", False, [], ['Flint and Steel']], - ["Zombie Doctor", False, [], ['Progressive Tools']], - ["Zombie Doctor", False, [], ['Progressive Weapons']], - ["Zombie Doctor", False, [], ['Progressive Armor', 'Shield']], - ["Zombie Doctor", False, [], ['Brewing']], - ["Zombie Doctor", False, [], ['Bottles']], - ["Zombie Doctor", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Zombie Doctor", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles']], - ["Zombie Doctor", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles']], - ["Zombie Doctor", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', 'Brewing', 'Bottles']], - ["Zombie Doctor", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', 'Brewing', 'Bottles']], - ]) - - def test_42030(self): - self.run_location_tests([ - ["The City at the End of the Game", False, []], - ["The City at the End of the Game", False, [], ['Progressive Resource Crafting']], - ["The City at the End of the Game", False, [], ['Flint and Steel']], - ["The City at the End of the Game", False, [], ['Progressive Tools']], - ["The City at the End of the Game", False, [], ['Progressive Weapons']], - ["The City at the End of the Game", False, [], ['Progressive Armor', 'Shield']], - ["The City at the End of the Game", False, [], ['Brewing']], - ["The City at the End of the Game", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["The City at the End of the Game", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["The City at the End of the Game", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["The City at the End of the Game", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["The City at the End of the Game", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["The City at the End of the Game", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42031(self): - self.run_location_tests([ - ["Ice Bucket Challenge", False, []], - ["Ice Bucket Challenge", False, ["Progressive Tools", "Progressive Tools"], ["Progressive Tools"]], - ["Ice Bucket Challenge", False, [], ["Progressive Resource Crafting"]], - ["Ice Bucket Challenge", True, ["Progressive Tools", "Progressive Tools", "Progressive Tools", "Progressive Resource Crafting"]], - ]) - - def test_42032(self): - self.run_location_tests([ - ["Remote Getaway", False, []], - ["Remote Getaway", False, [], ['Progressive Resource Crafting']], - ["Remote Getaway", False, [], ['Flint and Steel']], - ["Remote Getaway", False, [], ['Progressive Tools']], - ["Remote Getaway", False, [], ['Progressive Weapons']], - ["Remote Getaway", False, [], ['Progressive Armor', 'Shield']], - ["Remote Getaway", False, [], ['Brewing']], - ["Remote Getaway", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Remote Getaway", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["Remote Getaway", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["Remote Getaway", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["Remote Getaway", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["Remote Getaway", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42033(self): - self.run_location_tests([ - ["Into Fire", False, []], - ["Into Fire", False, [], ['Progressive Resource Crafting']], - ["Into Fire", False, [], ['Flint and Steel']], - ["Into Fire", False, [], ['Progressive Tools']], - ["Into Fire", False, [], ['Progressive Weapons']], - ["Into Fire", False, [], ['Progressive Armor', 'Shield']], - ["Into Fire", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Into Fire", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Progressive Armor']], - ["Into Fire", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons', 'Progressive Armor']], - ["Into Fire", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Shield']], - ["Into Fire", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons', 'Shield']], - ]) - - def test_42034(self): - self.run_location_tests([ - ["War Pigs", False, []], - ["War Pigs", False, [], ['Progressive Resource Crafting']], - ["War Pigs", False, [], ['Flint and Steel']], - ["War Pigs", False, [], ['Progressive Tools']], - ["War Pigs", False, [], ['Progressive Weapons']], - ["War Pigs", False, [], ['Progressive Armor', 'Shield']], - ["War Pigs", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["War Pigs", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Shield']], - ["War Pigs", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons', 'Shield']], - ]) - - def test_42035(self): - self.run_location_tests([ - ["Take Aim", False, []], - ["Take Aim", False, [], ['Archery']], - ["Take Aim", True, ['Archery']], - ]) - - def test_42036(self): - self.run_location_tests([ - ["Total Beelocation", False, []], - ["Total Beelocation", False, [], ['Enchanting']], - ["Total Beelocation", False, [], ['Silk Touch Book']], - ["Total Beelocation", False, ['Progressive Resource Crafting'], ['Progressive Resource Crafting']], - ["Total Beelocation", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["Total Beelocation", True, ['Enchanting', 'Silk Touch Book', 'Progressive Resource Crafting', 'Progressive Resource Crafting', - 'Progressive Tools', 'Progressive Tools', 'Progressive Tools']], - ]) - - def test_42037(self): - self.run_location_tests([ - ["Arbalistic", False, []], - ["Arbalistic", False, [], ['Enchanting']], - ["Arbalistic", False, [], ['Piercing IV Book']], - ["Arbalistic", False, ['Progressive Resource Crafting'], ['Progressive Resource Crafting']], - ["Arbalistic", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["Arbalistic", False, [], ['Archery']], - ["Arbalistic", True, ['Enchanting', 'Piercing IV Book', 'Progressive Resource Crafting', 'Progressive Resource Crafting', - 'Progressive Tools', 'Progressive Tools', 'Progressive Tools', 'Archery']], - ]) - - def test_42038(self): - self.run_location_tests([ - ["The End... Again...", False, []], - ["The End... Again...", False, [], ['Progressive Resource Crafting']], - ["The End... Again...", False, [], ['Flint and Steel']], - ["The End... Again...", False, [], ['Progressive Tools']], - ["The End... Again...", False, ['Progressive Weapons'], ['Progressive Weapons', 'Progressive Weapons']], - ["The End... Again...", False, [], ['Progressive Armor']], - ["The End... Again...", False, [], ['Brewing']], - ["The End... Again...", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["The End... Again...", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["The End... Again...", False, [], ['Archery']], - ["The End... Again...", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Weapons', 'Archery', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["The End... Again...", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Weapons', 'Archery', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42039(self): - self.run_location_tests([ - ["Acquire Hardware", False, []], - ["Acquire Hardware", False, [], ["Progressive Tools"]], - ["Acquire Hardware", False, [], ["Progressive Resource Crafting"]], - ["Acquire Hardware", True, ["Progressive Tools", "Progressive Resource Crafting"]], - ]) - - def test_42040(self): - self.run_location_tests([ - ["Not Quite \"Nine\" Lives", False, []], - ["Not Quite \"Nine\" Lives", False, ['Progressive Resource Crafting'], ['Progressive Resource Crafting']], - ["Not Quite \"Nine\" Lives", False, [], ['Flint and Steel']], - ["Not Quite \"Nine\" Lives", False, [], ['Progressive Tools']], - ["Not Quite \"Nine\" Lives", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Not Quite \"Nine\" Lives", True, ['Progressive Resource Crafting', 'Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket']], - ["Not Quite \"Nine\" Lives", True, ['Progressive Resource Crafting', 'Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools']], - ]) - - def test_42041(self): - self.run_location_tests([ - ["Cover Me With Diamonds", False, []], - ["Cover Me With Diamonds", False, ['Progressive Armor'], ['Progressive Armor']], - ["Cover Me With Diamonds", False, ['Progressive Tools'], ['Progressive Tools', 'Progressive Tools']], - ["Cover Me With Diamonds", False, [], ['Progressive Resource Crafting']], - ["Cover Me With Diamonds", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Progressive Armor', 'Progressive Armor']], - ]) - - def test_42042(self): - self.run_location_tests([ - ["Sky's the Limit", False, []], - ["Sky's the Limit", False, [], ['Progressive Resource Crafting']], - ["Sky's the Limit", False, [], ['Flint and Steel']], - ["Sky's the Limit", False, [], ['Progressive Tools']], - ["Sky's the Limit", False, [], ['Progressive Weapons']], - ["Sky's the Limit", False, [], ['Progressive Armor', 'Shield']], - ["Sky's the Limit", False, [], ['Brewing']], - ["Sky's the Limit", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Sky's the Limit", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["Sky's the Limit", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["Sky's the Limit", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["Sky's the Limit", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["Sky's the Limit", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42043(self): - self.run_location_tests([ - ["Hired Help", False, []], - ["Hired Help", False, ['Progressive Resource Crafting'], ['Progressive Resource Crafting']], - ["Hired Help", False, [], ['Progressive Tools']], - ["Hired Help", True, ['Progressive Tools', 'Progressive Resource Crafting', 'Progressive Resource Crafting']], - ]) - - def test_42044(self): - self.run_location_tests([ - ["Return to Sender", False, []], - ["Return to Sender", False, [], ['Progressive Resource Crafting']], - ["Return to Sender", False, [], ['Flint and Steel']], - ["Return to Sender", False, [], ['Progressive Tools']], - ["Return to Sender", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Return to Sender", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket']], - ["Return to Sender", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools']], - ]) - - def test_42045(self): - self.run_location_tests([ - ["Sweet Dreams", False, []], - ["Sweet Dreams", True, ['Bed']], - ["Sweet Dreams", False, [], ['Bed', 'Progressive Weapons']], - ["Sweet Dreams", False, [], ['Bed', 'Progressive Resource Crafting', 'Campfire']], - ["Sweet Dreams", True, ['Progressive Weapons', 'Progressive Resource Crafting'], ['Bed', 'Campfire']], - ["Sweet Dreams", True, ['Progressive Weapons', 'Campfire'], ['Bed', 'Progressive Resource Crafting']], - ]) - - def test_42046(self): - self.run_location_tests([ - ["You Need a Mint", False, []], - ["You Need a Mint", False, [], ['Progressive Resource Crafting']], - ["You Need a Mint", False, [], ['Flint and Steel']], - ["You Need a Mint", False, [], ['Progressive Tools']], - ["You Need a Mint", False, [], ['Progressive Weapons']], - ["You Need a Mint", False, [], ['Progressive Armor', 'Shield']], - ["You Need a Mint", False, [], ['Brewing']], - ["You Need a Mint", False, [], ['Bottles']], - ["You Need a Mint", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["You Need a Mint", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["You Need a Mint", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', - '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', 'Bottles']], - ["You Need a Mint", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', - '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', 'Bottles']], - ["You Need a Mint", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', 'Brewing', - '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', 'Bottles']], - ["You Need a Mint", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', 'Brewing', - '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', 'Bottles']], - ]) - - def test_42047(self): - self.run_location_tests([ - ["Adventure", True, []], - ]) - - def test_42048(self): - self.run_location_tests([ - ["Monsters Hunted", False, []], - ["Monsters Hunted", False, [], ['Progressive Resource Crafting']], - ["Monsters Hunted", False, [], ['Flint and Steel']], - ["Monsters Hunted", False, [], ['Progressive Tools']], - ["Monsters Hunted", False, ['Progressive Weapons'], ['Progressive Weapons', 'Progressive Weapons']], - ["Monsters Hunted", False, [], ['Progressive Armor']], - ["Monsters Hunted", False, [], ['Brewing']], - ["Monsters Hunted", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Monsters Hunted", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["Monsters Hunted", False, [], ['Archery']], - ["Monsters Hunted", False, [], ['Enchanting']], - ["Monsters Hunted", False, [], ['Fishing Rod']], - ["Monsters Hunted", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Weapons', 'Progressive Weapons', 'Archery', - 'Progressive Armor', 'Progressive Armor', 'Enchanting', - 'Fishing Rod', 'Brewing', 'Bottles', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42049(self): - self.run_location_tests([ - ["Enchanter", False, []], - ["Enchanter", False, [], ['Enchanting']], - ["Enchanter", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["Enchanter", False, [], ['Progressive Resource Crafting']], - ["Enchanter", True, ['Progressive Tools', 'Progressive Tools', 'Progressive Tools', 'Enchanting', 'Progressive Resource Crafting']], - ]) - - def test_42050(self): - self.run_location_tests([ - ["Voluntary Exile", False, []], - ["Voluntary Exile", False, [], ['Progressive Weapons']], - ["Voluntary Exile", False, [], ['Progressive Armor', 'Shield']], - ["Voluntary Exile", False, [], ['Progressive Tools']], - ["Voluntary Exile", False, [], ['Progressive Resource Crafting']], - ["Voluntary Exile", True, ['Progressive Tools', 'Progressive Armor', 'Progressive Weapons', 'Progressive Resource Crafting']], - ["Voluntary Exile", True, ['Progressive Tools', 'Shield', 'Progressive Weapons', 'Progressive Resource Crafting']], - ]) - - def test_42051(self): - self.run_location_tests([ - ["Eye Spy", False, []], - ["Eye Spy", False, [], ['Progressive Resource Crafting']], - ["Eye Spy", False, [], ['Flint and Steel']], - ["Eye Spy", False, [], ['Progressive Tools']], - ["Eye Spy", False, [], ['Progressive Weapons']], - ["Eye Spy", False, [], ['Progressive Armor', 'Shield']], - ["Eye Spy", False, [], ['Brewing']], - ["Eye Spy", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Eye Spy", False, [], ['3 Ender Pearls']], - ["Eye Spy", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', '3 Ender Pearls']], - ["Eye Spy", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', '3 Ender Pearls']], - ["Eye Spy", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', 'Brewing', '3 Ender Pearls']], - ["Eye Spy", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', 'Brewing', '3 Ender Pearls']], - ]) - - def test_42052(self): - self.run_location_tests([ - ["The End", False, []], - ["The End", False, [], ['Progressive Resource Crafting']], - ["The End", False, [], ['Flint and Steel']], - ["The End", False, [], ['Progressive Tools']], - ["The End", False, [], ['Progressive Weapons']], - ["The End", False, [], ['Progressive Armor', 'Shield']], - ["The End", False, [], ['Brewing']], - ["The End", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["The End", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["The End", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["The End", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["The End", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["The End", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42053(self): - self.run_location_tests([ - ["Serious Dedication", False, []], - ["Serious Dedication", False, [], ['Progressive Resource Crafting']], - ["Serious Dedication", False, [], ['Flint and Steel']], - ["Serious Dedication", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["Serious Dedication", False, [], ['Progressive Weapons']], - ["Serious Dedication", False, [], ['Progressive Armor', 'Shield']], - ["Serious Dedication", False, [], ['Brewing']], - ["Serious Dedication", False, [], ['Bottles']], - ["Serious Dedication", False, [], ['Bed']], - ["Serious Dedication", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles', 'Bed']], - ["Serious Dedication", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', 'Brewing', 'Bottles', 'Bed']], - ]) - - def test_42054(self): - self.run_location_tests([ - ["Postmortal", False, []], - ["Postmortal", False, ['Progressive Weapons'], ['Progressive Weapons', 'Progressive Weapons']], - ["Postmortal", False, [], ['Progressive Armor']], - ["Postmortal", False, [], ['Shield']], - ["Postmortal", False, [], ['Progressive Resource Crafting']], - ["Postmortal", False, [], ['Progressive Tools']], - ["Postmortal", True, ['Progressive Weapons', 'Progressive Weapons', 'Progressive Armor', 'Shield', 'Progressive Resource Crafting', 'Progressive Tools']], - ]) - - def test_42055(self): - self.run_location_tests([ - ["Monster Hunter", True, []], - ]) - - def test_42056(self): - self.run_location_tests([ - ["Adventuring Time", False, []], - ["Adventuring Time", False, [], ['Progressive Weapons']], - ["Adventuring Time", False, [], ['Campfire', 'Progressive Resource Crafting']], - ["Adventuring Time", True, ['Progressive Weapons', 'Campfire']], - ["Adventuring Time", True, ['Progressive Weapons', 'Progressive Resource Crafting']], - ]) - - def test_42057(self): - self.run_location_tests([ - ["A Seedy Place", True, []], - ]) - - def test_42058(self): - self.run_location_tests([ - ["Those Were the Days", False, []], - ["Those Were the Days", False, [], ['Progressive Resource Crafting']], - ["Those Were the Days", False, [], ['Flint and Steel']], - ["Those Were the Days", False, [], ['Progressive Tools']], - ["Those Were the Days", False, [], ['Progressive Weapons']], - ["Those Were the Days", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Those Were the Days", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons']], - ["Those Were the Days", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons']], - ]) - - def test_42059(self): - self.run_location_tests([ - ["Hero of the Village", False, []], - ["Hero of the Village", False, ['Progressive Weapons'], ['Progressive Weapons', 'Progressive Weapons']], - ["Hero of the Village", False, [], ['Progressive Armor']], - ["Hero of the Village", False, [], ['Shield']], - ["Hero of the Village", False, [], ['Progressive Resource Crafting']], - ["Hero of the Village", False, [], ['Progressive Tools']], - ["Hero of the Village", True, ['Progressive Weapons', 'Progressive Weapons', 'Progressive Armor', 'Shield', 'Progressive Resource Crafting', 'Progressive Tools']], - ]) - - def test_42060(self): - self.run_location_tests([ - ["Hidden in the Depths", False, []], - ["Hidden in the Depths", False, [], ['Progressive Resource Crafting']], - ["Hidden in the Depths", False, [], ['Flint and Steel']], - ["Hidden in the Depths", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["Hidden in the Depths", False, [], ['Progressive Weapons']], - ["Hidden in the Depths", False, [], ['Progressive Armor', 'Shield']], - ["Hidden in the Depths", False, [], ['Brewing']], - ["Hidden in the Depths", False, [], ['Bottles']], - ["Hidden in the Depths", False, [], ['Bed']], - ["Hidden in the Depths", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles', 'Bed']], - ["Hidden in the Depths", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', 'Brewing', 'Bottles', 'Bed']], - ]) - - def test_42061(self): - self.run_location_tests([ - ["Beaconator", False, []], - ["Beaconator", False, ['Progressive Resource Crafting'], ['Progressive Resource Crafting']], - ["Beaconator", False, [], ['Flint and Steel']], - ["Beaconator", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["Beaconator", False, ['Progressive Weapons'], ['Progressive Weapons', 'Progressive Weapons']], - ["Beaconator", False, ['Progressive Armor'], ['Progressive Armor']], - ["Beaconator", False, [], ['Brewing']], - ["Beaconator", False, [], ['Bottles']], - ["Beaconator", False, [], ['Enchanting']], - ["Beaconator", True, [], ['Bucket']], - ["Beaconator", True, ['Progressive Resource Crafting', 'Progressive Resource Crafting', - 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Weapons', 'Progressive Weapons', 'Progressive Armor', 'Progressive Armor', - 'Brewing', 'Bottles', 'Enchanting']], - ]) - - def test_42062(self): - self.run_location_tests([ - ["Withering Heights", False, []], - ["Withering Heights", False, [], ['Progressive Resource Crafting']], - ["Withering Heights", False, [], ['Flint and Steel']], - ["Withering Heights", False, [], ['Progressive Tools']], - ["Withering Heights", False, ['Progressive Weapons'], ['Progressive Weapons', 'Progressive Weapons']], - ["Withering Heights", False, ['Progressive Armor'], ['Progressive Armor']], - ["Withering Heights", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Withering Heights", False, [], ['Brewing']], - ["Withering Heights", False, [], ['Bottles']], - ["Withering Heights", False, [], ['Enchanting']], - ["Withering Heights", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Weapons', 'Progressive Weapons', 'Progressive Armor', 'Progressive Armor', - 'Brewing', 'Bottles', 'Enchanting']], - ]) - - def test_42063(self): - self.run_location_tests([ - ["A Balanced Diet", False, []], - ["A Balanced Diet", False, [], ['Bottles']], - ["A Balanced Diet", False, ['Progressive Resource Crafting'], ['Progressive Resource Crafting']], - ["A Balanced Diet", False, [], ['Flint and Steel']], - ["A Balanced Diet", False, [], ['Progressive Tools']], - ["A Balanced Diet", False, [], ['Progressive Weapons']], - ["A Balanced Diet", False, [], ['Progressive Armor', 'Shield']], - ["A Balanced Diet", False, [], ['Brewing']], - ["A Balanced Diet", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["A Balanced Diet", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["A Balanced Diet", True, ['Progressive Resource Crafting', 'Progressive Resource Crafting', - 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', 'Bottles', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["A Balanced Diet", True, ['Progressive Resource Crafting', 'Progressive Resource Crafting', - 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', 'Bottles', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["A Balanced Diet", True, ['Progressive Resource Crafting', 'Progressive Resource Crafting', - 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', 'Bottles', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["A Balanced Diet", True, ['Progressive Resource Crafting', 'Progressive Resource Crafting', - 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', 'Bottles', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42064(self): - self.run_location_tests([ - ["Subspace Bubble", False, []], - ["Subspace Bubble", False, [], ['Progressive Resource Crafting']], - ["Subspace Bubble", False, [], ['Flint and Steel']], - ["Subspace Bubble", False, [], ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["Subspace Bubble", True, ['Progressive Tools', 'Progressive Tools', 'Progressive Tools', 'Flint and Steel', 'Progressive Resource Crafting']], - ]) - - def test_42065(self): - self.run_location_tests([ - ["Husbandry", True, []], - ]) - - def test_42066(self): - self.run_location_tests([ - ["Country Lode, Take Me Home", False, []], - ["Country Lode, Take Me Home", False, [], ['Progressive Resource Crafting']], - ["Country Lode, Take Me Home", False, [], ['Flint and Steel']], - ["Country Lode, Take Me Home", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["Country Lode, Take Me Home", False, [], ['Progressive Weapons']], - ["Country Lode, Take Me Home", False, [], ['Progressive Armor', 'Shield']], - ["Country Lode, Take Me Home", False, [], ['Brewing']], - ["Country Lode, Take Me Home", False, [], ['Bottles']], - ["Country Lode, Take Me Home", False, [], ['Bed']], - ["Country Lode, Take Me Home", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles', 'Bed']], - ["Country Lode, Take Me Home", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', 'Brewing', 'Bottles', 'Bed']], - ]) - - def test_42067(self): - self.run_location_tests([ - ["Bee Our Guest", False, []], - ["Bee Our Guest", False, [], ['Campfire']], - ["Bee Our Guest", False, [], ['Bottles']], - ["Bee Our Guest", False, [], ['Progressive Resource Crafting']], - ["Bee Our Guest", True, ['Campfire', 'Bottles', 'Progressive Resource Crafting']], - ]) - - def test_42068(self): - self.run_location_tests([ - ["What a Deal!", False, []], - ["What a Deal!", False, [], ['Progressive Weapons']], - ["What a Deal!", False, [], ['Campfire', 'Progressive Resource Crafting']], - ["What a Deal!", True, ['Progressive Weapons', 'Campfire']], - ["What a Deal!", True, ['Progressive Weapons', 'Progressive Resource Crafting']], - ]) - - def test_42069(self): - self.run_location_tests([ - ["Uneasy Alliance", False, []], - ["Uneasy Alliance", False, [], ['Progressive Resource Crafting']], - ["Uneasy Alliance", False, [], ['Flint and Steel']], - ["Uneasy Alliance", False, [], ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["Uneasy Alliance", False, [], ['Fishing Rod']], - ["Uneasy Alliance", True, ['Progressive Tools', 'Progressive Tools', 'Progressive Tools', 'Flint and Steel', 'Progressive Resource Crafting', 'Fishing Rod']], - ]) - - def test_42070(self): - self.run_location_tests([ - ["Diamonds!", False, []], - ["Diamonds!", True, ["Progressive Tools", "Progressive Tools"], ["Progressive Tools"]], - ["Diamonds!", False, [], ["Progressive Tools", "Progressive Tools"]], - ["Diamonds!", False, [], ["Progressive Resource Crafting"]], - ["Diamonds!", False, ["Progressive Tools", "Progressive Resource Crafting"]], - ["Diamonds!", True, ["Progressive Tools", "Progressive Tools", "Progressive Resource Crafting"]], - ]) - - def test_42071(self): - self.run_location_tests([ - ["A Terrible Fortress", False, []], - ["A Terrible Fortress", False, [], ['Progressive Resource Crafting']], - ["A Terrible Fortress", False, [], ['Flint and Steel']], - ["A Terrible Fortress", False, [], ['Progressive Tools']], - ["A Terrible Fortress", False, [], ['Progressive Weapons']], - ["A Terrible Fortress", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["A Terrible Fortress", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons']], - ["A Terrible Fortress", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons']], - ]) - - def test_42072(self): - self.run_location_tests([ - ["A Throwaway Joke", False, []], - ["A Throwaway Joke", False, [], ['Progressive Weapons']], - ["A Throwaway Joke", False, [], ['Campfire', 'Progressive Resource Crafting']], - ["A Throwaway Joke", True, ['Progressive Weapons', 'Campfire']], - ["A Throwaway Joke", True, ['Progressive Weapons', 'Progressive Resource Crafting']], - ]) - - def test_42073(self): - self.run_location_tests([ - ["Minecraft", True, []], - ]) - - def test_42074(self): - self.run_location_tests([ - ["Sticky Situation", False, []], - ["Sticky Situation", False, [], ['Bottles']], - ["Sticky Situation", False, [], ['Progressive Resource Crafting']], - ["Sticky Situation", False, [], ['Campfire']], - ["Sticky Situation", True, ['Bottles', 'Progressive Resource Crafting', 'Campfire']], - ]) - - def test_42075(self): - self.run_location_tests([ - ["Ol' Betsy", False, []], - ["Ol' Betsy", False, [], ['Archery']], - ["Ol' Betsy", False, [], ['Progressive Resource Crafting']], - ["Ol' Betsy", False, [], ['Progressive Tools']], - ["Ol' Betsy", True, ['Archery', 'Progressive Resource Crafting', 'Progressive Tools']], - ]) - - def test_42076(self): - self.run_location_tests([ - ["Cover Me in Debris", False, []], - ["Cover Me in Debris", False, [], ['Progressive Resource Crafting']], - ["Cover Me in Debris", False, [], ['Flint and Steel']], - ["Cover Me in Debris", False, ['Progressive Tools', 'Progressive Tools'], ['Progressive Tools']], - ["Cover Me in Debris", False, [], ['Progressive Weapons']], - ["Cover Me in Debris", False, ['Progressive Armor'], ['Progressive Armor']], - ["Cover Me in Debris", False, [], ['Brewing']], - ["Cover Me in Debris", False, [], ['Bottles']], - ["Cover Me in Debris", False, [], ['Bed']], - ["Cover Me in Debris", False, ['8 Netherite Scrap'], ['8 Netherite Scrap']], - ["Cover Me in Debris", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', 'Progressive Armor', - 'Brewing', 'Bottles', 'Bed', '8 Netherite Scrap', '8 Netherite Scrap']], - ]) - - def test_42077(self): - self.run_location_tests([ - ["The End?", False, []], - ["The End?", False, [], ['Progressive Resource Crafting']], - ["The End?", False, [], ['Flint and Steel']], - ["The End?", False, [], ['Progressive Tools']], - ["The End?", False, [], ['Progressive Weapons']], - ["The End?", False, [], ['Progressive Armor', 'Shield']], - ["The End?", False, [], ['Brewing']], - ["The End?", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["The End?", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["The End?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["The End?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["The End?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ["The End?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def test_42078(self): - self.run_location_tests([ - ["The Parrots and the Bats", True, []], - ]) - - def test_42079(self): - self.run_location_tests([ - ["A Complete Catalogue", False, []], - ["A Complete Catalogue", False, [], ['Progressive Weapons']], - ["A Complete Catalogue", False, [], ['Campfire', 'Progressive Resource Crafting']], - ["A Complete Catalogue", True, ['Progressive Weapons', 'Campfire']], - ["A Complete Catalogue", True, ['Progressive Weapons', 'Progressive Resource Crafting']], - ]) - - def test_42080(self): - self.run_location_tests([ - ["Getting Wood", True, []], - ]) - - def test_42081(self): - self.run_location_tests([ - ["Time to Mine!", True, []], - ]) - - def test_42082(self): - self.run_location_tests([ - ["Hot Topic", False, []], - ["Hot Topic", True, ['Progressive Resource Crafting']], - ]) - - def test_42083(self): - self.run_location_tests([ - ["Bake Bread", True, []], - ]) - - def test_42084(self): - self.run_location_tests([ - ["The Lie", False, []], - ["The Lie", False, [], ['Progressive Resource Crafting']], - ["The Lie", False, [], ['Bucket']], - ["The Lie", False, [], ['Progressive Tools']], - ["The Lie", True, ['Bucket', 'Progressive Resource Crafting', 'Progressive Tools']], - ]) - - def test_42085(self): - self.run_location_tests([ - ["On a Rail", False, []], - ["On a Rail", False, [], ['Progressive Resource Crafting']], - ["On a Rail", False, ['Progressive Tools'], ['Progressive Tools', 'Progressive Tools']], - ["On a Rail", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools']], - ]) - - def test_42086(self): - self.run_location_tests([ - ["Time to Strike!", True, []], - ]) - - def test_42087(self): - self.run_location_tests([ - ["Cow Tipper", True, []], - ]) - - def test_42088(self): - self.run_location_tests([ - ["When Pigs Fly", False, []], - ["When Pigs Fly", False, [], ['Progressive Resource Crafting']], - ["When Pigs Fly", False, [], ['Progressive Tools']], - ["When Pigs Fly", False, [], ['Progressive Weapons']], - ["When Pigs Fly", False, [], ['Progressive Armor', 'Shield']], - ["When Pigs Fly", False, [], ['Fishing Rod']], - ["When Pigs Fly", False, [], ['Saddle']], - ["When Pigs Fly", False, ['Progressive Weapons'], ['Flint and Steel', 'Progressive Weapons', 'Progressive Weapons']], - ["When Pigs Fly", False, ['Progressive Tools', 'Progressive Tools', 'Progressive Weapons'], ['Bucket', 'Progressive Tools', 'Progressive Weapons', 'Progressive Weapons']], - ["When Pigs Fly", True, ['Saddle', 'Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Progressive Armor', 'Fishing Rod']], - ["When Pigs Fly", True, ['Saddle', 'Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons', 'Progressive Armor', 'Fishing Rod']], - ["When Pigs Fly", True, ['Saddle', 'Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Shield', 'Fishing Rod']], - ["When Pigs Fly", True, ['Saddle', 'Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons', 'Shield', 'Fishing Rod']], - ["When Pigs Fly", True, ['Saddle', 'Progressive Weapons', 'Progressive Weapons', 'Progressive Armor', 'Shield', 'Progressive Resource Crafting', 'Progressive Tools', 'Fishing Rod']], - ]) - - def test_42089(self): - self.run_location_tests([ - ["Overkill", False, []], - ["Overkill", False, [], ['Progressive Resource Crafting']], - ["Overkill", False, [], ['Flint and Steel']], - ["Overkill", False, [], ['Progressive Tools']], - ["Overkill", False, [], ['Progressive Weapons']], - ["Overkill", False, [], ['Progressive Armor', 'Shield']], - ["Overkill", False, [], ['Brewing']], - ["Overkill", False, [], ['Bottles']], - ["Overkill", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Overkill", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles']], - ["Overkill", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', 'Bottles']], - ["Overkill", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', 'Brewing', 'Bottles']], - ["Overkill", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', 'Brewing', 'Bottles']], - ]) - - def test_42090(self): - self.run_location_tests([ - ["Librarian", False, []], - ["Librarian", True, ['Enchanting']], - ]) - - def test_42091(self): - self.run_location_tests([ - ["Overpowered", False, []], - ["Overpowered", False, [], ['Progressive Resource Crafting']], - ["Overpowered", False, [], ['Flint and Steel']], - ["Overpowered", False, ['Progressive Tools', 'Progressive Tools', 'Bucket', 'Flint and Steel']], - ["Overpowered", False, [], ['Progressive Weapons']], - ["Overpowered", False, [], ['Progressive Armor', 'Shield']], - ["Overpowered", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Weapons', 'Progressive Armor']], - ["Overpowered", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Progressive Armor']], - ["Overpowered", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Weapons', 'Shield']], - ["Overpowered", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Shield']], - ]) - - def test_42092(self): - self.run_location_tests([ - ["Wax On", False, []], - ["Wax On", False, [], ["Progressive Tools"]], - ["Wax On", False, [], ["Campfire"]], - ["Wax On", False, ["Progressive Resource Crafting"], ["Progressive Resource Crafting"]], - ["Wax On", True, ["Progressive Tools", "Progressive Resource Crafting", "Progressive Resource Crafting", "Campfire"]], - ]) - - def test_42093(self): - self.run_location_tests([ - ["Wax Off", False, []], - ["Wax Off", False, [], ["Progressive Tools"]], - ["Wax Off", False, [], ["Campfire"]], - ["Wax Off", False, ["Progressive Resource Crafting"], ["Progressive Resource Crafting"]], - ["Wax Off", True, ["Progressive Tools", "Progressive Resource Crafting", "Progressive Resource Crafting", "Campfire"]], - ]) - - def test_42094(self): - self.run_location_tests([ - ["The Cutest Predator", False, []], - ["The Cutest Predator", False, [], ["Progressive Tools"]], - ["The Cutest Predator", False, [], ["Progressive Resource Crafting"]], - ["The Cutest Predator", False, [], ["Bucket"]], - ["The Cutest Predator", True, ["Progressive Tools", "Progressive Resource Crafting", "Bucket"]], - ]) - - def test_42095(self): - self.run_location_tests([ - ["The Healing Power of Friendship", False, []], - ["The Healing Power of Friendship", False, [], ["Progressive Tools"]], - ["The Healing Power of Friendship", False, [], ["Progressive Resource Crafting"]], - ["The Healing Power of Friendship", False, [], ["Bucket"]], - ["The Healing Power of Friendship", True, ["Progressive Tools", "Progressive Resource Crafting", "Bucket"]], - ]) - - def test_42096(self): - self.run_location_tests([ - ["Is It a Bird?", False, []], - ["Is It a Bird?", False, [], ["Progressive Weapons"]], - ["Is It a Bird?", False, [], ["Progressive Tools"]], - ["Is It a Bird?", False, [], ["Progressive Resource Crafting"]], - ["Is It a Bird?", False, [], ["Spyglass"]], - ["Is It a Bird?", True, ["Progressive Weapons", "Progressive Tools", "Progressive Resource Crafting", "Spyglass"]], - ]) - - def test_42097(self): - self.run_location_tests([ - ["Is It a Balloon?", False, []], - ["Is It a Balloon?", False, [], ['Progressive Resource Crafting']], - ["Is It a Balloon?", False, [], ['Flint and Steel']], - ["Is It a Balloon?", False, [], ['Progressive Tools']], - ["Is It a Balloon?", False, [], ['Progressive Weapons']], - ["Is It a Balloon?", False, [], ['Spyglass']], - ["Is It a Balloon?", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Is It a Balloon?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Spyglass']], - ["Is It a Balloon?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons', 'Spyglass']], - ]) - - def test_42098(self): - self.run_location_tests([ - ["Is It a Plane?", False, []], - ["Is It a Plane?", False, [], ['Progressive Resource Crafting']], - ["Is It a Plane?", False, [], ['Flint and Steel']], - ["Is It a Plane?", False, [], ['Progressive Tools']], - ["Is It a Plane?", False, [], ['Progressive Weapons']], - ["Is It a Plane?", False, [], ['Progressive Armor', 'Shield']], - ["Is It a Plane?", False, [], ['Brewing']], - ["Is It a Plane?", False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ["Is It a Plane?", False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ["Is It a Plane?", False, [], ['Spyglass']], - ["Is It a Plane?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', - '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', 'Spyglass']], - ["Is It a Plane?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', 'Brewing', - '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', 'Spyglass']], - ["Is It a Plane?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', - 'Progressive Weapons', 'Shield', 'Brewing', - '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', 'Spyglass']], - ["Is It a Plane?", True, ['Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', 'Brewing', - '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', 'Spyglass']], - ]) - - def test_42099(self): - self.run_location_tests([ - ["Surge Protector", False, []], - ["Surge Protector", False, [], ['Channeling Book']], - ["Surge Protector", False, ['Progressive Resource Crafting'], ['Progressive Resource Crafting']], - ["Surge Protector", False, [], ['Enchanting']], - ["Surge Protector", False, [], ['Progressive Tools']], - ["Surge Protector", False, [], ['Progressive Weapons']], - ["Surge Protector", True, ['Progressive Weapons', 'Progressive Tools', 'Progressive Tools', 'Progressive Tools', - 'Enchanting', 'Progressive Resource Crafting', 'Progressive Resource Crafting', 'Channeling Book']], - ]) - - def test_42100(self): - self.run_location_tests([ - ["Light as a Rabbit", False, []], - ["Light as a Rabbit", False, [], ["Progressive Weapons"]], - ["Light as a Rabbit", False, [], ["Progressive Tools"]], - ["Light as a Rabbit", False, [], ["Progressive Resource Crafting"]], - ["Light as a Rabbit", False, [], ["Bucket"]], - ["Light as a Rabbit", True, ["Progressive Weapons", "Progressive Tools", "Progressive Resource Crafting", "Bucket"]], - ]) - - def test_42101(self): - self.run_location_tests([ - ["Glow and Behold!", False, []], - ["Glow and Behold!", False, [], ["Progressive Weapons"]], - ["Glow and Behold!", False, [], ["Progressive Resource Crafting", "Campfire"]], - ["Glow and Behold!", True, ["Progressive Weapons", "Progressive Resource Crafting"]], - ["Glow and Behold!", True, ["Progressive Weapons", "Campfire"]], - ]) - - def test_42102(self): - self.run_location_tests([ - ["Whatever Floats Your Goat!", False, []], - ["Whatever Floats Your Goat!", False, [], ["Progressive Weapons"]], - ["Whatever Floats Your Goat!", False, [], ["Progressive Resource Crafting", "Campfire"]], - ["Whatever Floats Your Goat!", True, ["Progressive Weapons", "Progressive Resource Crafting"]], - ["Whatever Floats Your Goat!", True, ["Progressive Weapons", "Campfire"]], - ]) - - # bucket, iron pick - def test_42103(self): - self.run_location_tests([ - ["Caves & Cliffs", False, []], - ["Caves & Cliffs", False, [], ["Bucket"]], - ["Caves & Cliffs", False, [], ["Progressive Tools"]], - ["Caves & Cliffs", False, [], ["Progressive Resource Crafting"]], - ["Caves & Cliffs", True, ["Progressive Resource Crafting", "Progressive Tools", "Progressive Tools", "Bucket"]], - ]) - - # bucket, fishing rod, saddle, combat - def test_42104(self): - self.run_location_tests([ - ["Feels like home", False, []], - ["Feels like home", False, [], ['Progressive Resource Crafting']], - ["Feels like home", False, [], ['Progressive Tools']], - ["Feels like home", False, [], ['Progressive Weapons']], - ["Feels like home", False, [], ['Progressive Armor', 'Shield']], - ["Feels like home", False, [], ['Fishing Rod']], - ["Feels like home", False, [], ['Saddle']], - ["Feels like home", False, [], ['Bucket']], - ["Feels like home", False, [], ['Flint and Steel']], - ["Feels like home", True, ['Saddle', 'Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Progressive Armor', 'Fishing Rod']], - ["Feels like home", True, ['Saddle', 'Progressive Resource Crafting', 'Progressive Tools', 'Flint and Steel', 'Bucket', 'Progressive Weapons', 'Shield', 'Fishing Rod']], - ]) - - # iron pick, combat - def test_42105(self): - self.run_location_tests([ - ["Sound of Music", False, []], - ["Sound of Music", False, [], ["Progressive Tools"]], - ["Sound of Music", False, [], ["Progressive Resource Crafting"]], - ["Sound of Music", False, [], ["Progressive Weapons"]], - ["Sound of Music", False, [], ["Progressive Armor", "Shield"]], - ["Sound of Music", True, ["Progressive Tools", "Progressive Tools", "Progressive Resource Crafting", "Progressive Weapons", "Progressive Armor"]], - ["Sound of Music", True, ["Progressive Tools", "Progressive Tools", "Progressive Resource Crafting", "Progressive Weapons", "Shield"]], - ]) - - # bucket, nether, villager - def test_42106(self): - self.run_location_tests([ - ["Star Trader", False, []], - ["Star Trader", False, [], ["Bucket"]], - ["Star Trader", False, [], ["Flint and Steel"]], - ["Star Trader", False, [], ["Progressive Tools"]], - ["Star Trader", False, [], ["Progressive Resource Crafting"]], - ["Star Trader", False, [], ["Progressive Weapons"]], - ["Star Trader", True, ["Bucket", "Flint and Steel", "Progressive Tools", "Progressive Resource Crafting", "Progressive Weapons"]], - ]) - - # bucket, redstone -> iron pick, pillager outpost -> adventure - def test_42107(self): - self.run_location_tests([ - ["Birthday Song", False, []], - ["Birthday Song", False, [], ["Bucket"]], - ["Birthday Song", False, [], ["Progressive Tools"]], - ["Birthday Song", False, [], ["Progressive Weapons"]], - ["Birthday Song", False, [], ["Progressive Resource Crafting"]], - ["Birthday Song", True, ["Progressive Resource Crafting", "Progressive Tools", "Progressive Tools", "Progressive Weapons", "Bucket"]], - ]) - - # bucket, adventure - def test_42108(self): - self.run_location_tests([ - ["Bukkit Bukkit", False, []], - ["Bukkit Bukkit", False, [], ["Bucket"]], - ["Bukkit Bukkit", False, [], ["Progressive Tools"]], - ["Bukkit Bukkit", False, [], ["Progressive Weapons"]], - ["Bukkit Bukkit", False, [], ["Progressive Resource Crafting"]], - ["Bukkit Bukkit", True, ["Bucket", "Progressive Tools", "Progressive Weapons", "Progressive Resource Crafting"]], - ]) - - # iron pick, adventure - def test_42109(self): - self.run_location_tests([ - ["It Spreads", False, []], - ["It Spreads", False, [], ["Progressive Tools"]], - ["It Spreads", False, [], ["Progressive Weapons"]], - ["It Spreads", False, [], ["Progressive Resource Crafting"]], - ["It Spreads", True, ["Progressive Tools", "Progressive Tools", "Progressive Weapons", "Progressive Resource Crafting"]], - ]) - - # iron pick, adventure - def test_42110(self): - self.run_location_tests([ - ["Sneak 100", False, []], - ["Sneak 100", False, [], ["Progressive Tools"]], - ["Sneak 100", False, [], ["Progressive Weapons"]], - ["Sneak 100", False, [], ["Progressive Resource Crafting"]], - ["Sneak 100", True, ["Progressive Tools", "Progressive Tools", "Progressive Weapons", "Progressive Resource Crafting"]], - ]) - - # adventure, lead - def test_42111(self): - self.run_location_tests([ - ["When the Squad Hops into Town", False, []], - ["When the Squad Hops into Town", False, [], ["Progressive Weapons"]], - ["When the Squad Hops into Town", False, [], ["Campfire", "Progressive Resource Crafting"]], - ["When the Squad Hops into Town", False, [], ["Lead"]], - ["When the Squad Hops into Town", True, ["Progressive Weapons", "Lead", "Campfire"]], - ["When the Squad Hops into Town", True, ["Progressive Weapons", "Lead", "Progressive Resource Crafting"]], - ]) - - # adventure, lead, nether - def test_42112(self): - self.run_location_tests([ - ["With Our Powers Combined!", False, []], - ["With Our Powers Combined!", False, [], ["Lead"]], - ["With Our Powers Combined!", False, [], ["Bucket", "Progressive Tools"]], - ["With Our Powers Combined!", False, [], ["Flint and Steel"]], - ["With Our Powers Combined!", False, [], ["Progressive Weapons"]], - ["With Our Powers Combined!", False, [], ["Progressive Resource Crafting"]], - ["With Our Powers Combined!", True, ["Lead", "Progressive Weapons", "Progressive Resource Crafting", "Flint and Steel", "Progressive Tools", "Bucket"]], - ["With Our Powers Combined!", True, ["Lead", "Progressive Weapons", "Progressive Resource Crafting", "Flint and Steel", "Progressive Tools", "Progressive Tools", "Progressive Tools"]], - ]) - - # pillager outpost -> adventure - def test_42113(self): - self.run_location_tests([ - ["You've Got a Friend in Me", False, []], - ["You've Got a Friend in Me", False, [], ["Progressive Weapons"]], - ["You've Got a Friend in Me", False, [], ["Campfire", "Progressive Resource Crafting"]], - ["You've Got a Friend in Me", True, ["Progressive Weapons", "Campfire"]], - ["You've Got a Friend in Me", True, ["Progressive Weapons", "Progressive Resource Crafting"]], - ]) diff --git a/worlds/minecraft/test/TestDataLoad.py b/worlds/minecraft/test/TestDataLoad.py deleted file mode 100644 index c14eef071b..0000000000 --- a/worlds/minecraft/test/TestDataLoad.py +++ /dev/null @@ -1,60 +0,0 @@ -import unittest - -from .. import Constants - -class TestDataLoad(unittest.TestCase): - - def test_item_data(self): - item_info = Constants.item_info - - # All items in sub-tables are in all_items - all_items: set = set(item_info['all_items']) - assert set(item_info['progression_items']) <= all_items - assert set(item_info['useful_items']) <= all_items - assert set(item_info['trap_items']) <= all_items - assert set(item_info['required_pool'].keys()) <= all_items - assert set(item_info['junk_weights'].keys()) <= all_items - - # No overlapping ids (because of bee trap stuff) - all_ids: set = set(Constants.item_name_to_id.values()) - assert len(all_items) == len(all_ids) - - def test_location_data(self): - location_info = Constants.location_info - exclusion_info = Constants.exclusion_info - - # Every location has a region and every region's locations are in all_locations - all_locations: set = set(location_info['all_locations']) - all_locs_2: set = set() - for v in location_info['locations_by_region'].values(): - all_locs_2.update(v) - assert all_locations == all_locs_2 - - # All exclusions are locations - for v in exclusion_info.values(): - assert set(v) <= all_locations - - def test_region_data(self): - region_info = Constants.region_info - - # Every entrance and region in mandatory/default/illegal connections is a real entrance and region - all_regions = set() - all_entrances = set() - for v in region_info['regions']: - assert isinstance(v[0], str) - assert isinstance(v[1], list) - all_regions.add(v[0]) - all_entrances.update(v[1]) - - for v in region_info['mandatory_connections']: - assert v[0] in all_entrances - assert v[1] in all_regions - - for v in region_info['default_connections']: - assert v[0] in all_entrances - assert v[1] in all_regions - - for k, v in region_info['illegal_connections'].items(): - assert k in all_regions - assert set(v) <= all_entrances - diff --git a/worlds/minecraft/test/TestEntrances.py b/worlds/minecraft/test/TestEntrances.py deleted file mode 100644 index 946eb23d63..0000000000 --- a/worlds/minecraft/test/TestEntrances.py +++ /dev/null @@ -1,97 +0,0 @@ -from . import MCTestBase - - -class TestEntrances(MCTestBase): - options = { - "shuffle_structures": False, - "structure_compasses": False - } - - def testPortals(self): - self.run_entrance_tests([ - ['Nether Portal', False, []], - ['Nether Portal', False, [], ['Flint and Steel']], - ['Nether Portal', False, [], ['Progressive Resource Crafting']], - ['Nether Portal', False, [], ['Progressive Tools']], - ['Nether Portal', False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ['Nether Portal', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Bucket']], - ['Nether Portal', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Progressive Tools']], - - ['End Portal', False, []], - ['End Portal', False, [], ['Brewing']], - ['End Portal', False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ['End Portal', False, [], ['Flint and Steel']], - ['End Portal', False, [], ['Progressive Resource Crafting']], - ['End Portal', False, [], ['Progressive Tools']], - ['End Portal', False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ['End Portal', False, [], ['Progressive Weapons']], - ['End Portal', False, [], ['Progressive Armor', 'Shield']], - ['End Portal', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ['End Portal', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Bucket', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ['End Portal', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ['End Portal', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ]) - - def testStructures(self): - self.run_entrance_tests([ # Structures 1 and 2 should be logically equivalent - ['Overworld Structure 1', False, []], - ['Overworld Structure 1', False, [], ['Progressive Weapons']], - ['Overworld Structure 1', False, [], ['Progressive Resource Crafting', 'Campfire']], - ['Overworld Structure 1', True, ['Progressive Weapons', 'Progressive Resource Crafting']], - ['Overworld Structure 1', True, ['Progressive Weapons', 'Campfire']], - - ['Overworld Structure 2', False, []], - ['Overworld Structure 2', False, [], ['Progressive Weapons']], - ['Overworld Structure 2', False, [], ['Progressive Resource Crafting', 'Campfire']], - ['Overworld Structure 2', True, ['Progressive Weapons', 'Progressive Resource Crafting']], - ['Overworld Structure 2', True, ['Progressive Weapons', 'Campfire']], - - ['Nether Structure 1', False, []], - ['Nether Structure 1', False, [], ['Flint and Steel']], - ['Nether Structure 1', False, [], ['Progressive Resource Crafting']], - ['Nether Structure 1', False, [], ['Progressive Tools']], - ['Nether Structure 1', False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ['Nether Structure 1', False, [], ['Progressive Weapons']], - ['Nether Structure 1', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Bucket', 'Progressive Weapons']], - ['Nether Structure 1', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons']], - - ['Nether Structure 2', False, []], - ['Nether Structure 2', False, [], ['Flint and Steel']], - ['Nether Structure 2', False, [], ['Progressive Resource Crafting']], - ['Nether Structure 2', False, [], ['Progressive Tools']], - ['Nether Structure 2', False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ['Nether Structure 2', False, [], ['Progressive Weapons']], - ['Nether Structure 2', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Bucket', 'Progressive Weapons']], - ['Nether Structure 2', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Progressive Tools', 'Progressive Weapons']], - - ['The End Structure', False, []], - ['The End Structure', False, [], ['Brewing']], - ['The End Structure', False, ['3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls'], ['3 Ender Pearls']], - ['The End Structure', False, [], ['Flint and Steel']], - ['The End Structure', False, [], ['Progressive Resource Crafting']], - ['The End Structure', False, [], ['Progressive Tools']], - ['The End Structure', False, ['Progressive Tools', 'Progressive Tools'], ['Bucket', 'Progressive Tools']], - ['The End Structure', False, [], ['Progressive Weapons']], - ['The End Structure', False, [], ['Progressive Armor', 'Shield']], - ['The End Structure', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Bucket', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ['The End Structure', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Bucket', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ['The End Structure', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Progressive Armor', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - ['The End Structure', True, ['Flint and Steel', 'Progressive Resource Crafting', 'Progressive Tools', 'Progressive Tools', 'Progressive Tools', - 'Progressive Weapons', 'Shield', - 'Brewing', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls', '3 Ender Pearls']], - - ]) \ No newline at end of file diff --git a/worlds/minecraft/test/TestOptions.py b/worlds/minecraft/test/TestOptions.py deleted file mode 100644 index c04a07054c..0000000000 --- a/worlds/minecraft/test/TestOptions.py +++ /dev/null @@ -1,49 +0,0 @@ -from . import MCTestBase -from ..Constants import region_info -from .. import Options - -from BaseClasses import ItemClassification - -class AdvancementTestBase(MCTestBase): - options = { - "advancement_goal": Options.AdvancementGoal.range_end - } - # beatability test implicit - -class ShardTestBase(MCTestBase): - options = { - "egg_shards_required": Options.EggShardsRequired.range_end, - "egg_shards_available": Options.EggShardsAvailable.range_end - } - - # check that itempool is not overfilled with shards - def test_itempool(self): - assert len(self.multiworld.get_unfilled_locations()) == len(self.multiworld.itempool) - -class CompassTestBase(MCTestBase): - def test_compasses_in_pool(self): - structures = [x[1] for x in region_info["default_connections"]] - itempool_str = {item.name for item in self.multiworld.itempool} - for struct in structures: - assert f"Structure Compass ({struct})" in itempool_str - -class NoBeeTestBase(MCTestBase): - options = { - "bee_traps": Options.BeeTraps.range_start - } - - # With no bees, there are no traps in the pool - def test_bees(self): - for item in self.multiworld.itempool: - assert item.classification != ItemClassification.trap - - -class AllBeeTestBase(MCTestBase): - options = { - "bee_traps": Options.BeeTraps.range_end - } - - # With max bees, there are no filler items, only bee traps - def test_bees(self): - for item in self.multiworld.itempool: - assert item.classification != ItemClassification.filler diff --git a/worlds/minecraft/test/__init__.py b/worlds/minecraft/test/__init__.py deleted file mode 100644 index 3d936fe9cb..0000000000 --- a/worlds/minecraft/test/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -from test.bases import TestBase, WorldTestBase -from .. import MinecraftWorld, MinecraftOptions - - -class MCTestBase(WorldTestBase, TestBase): - game = "Minecraft" - player: int = 1 - - def _create_items(self, items, player): - singleton = False - if isinstance(items, str): - items = [items] - singleton = True - ret = [self.multiworld.worlds[player].create_item(item) for item in items] - if singleton: - return ret[0] - return ret - - def _get_items(self, item_pool, all_except): - if all_except and len(all_except) > 0: - items = self.multiworld.itempool[:] - items = [item for item in items if item.name not in all_except] - items.extend(self._create_items(item_pool[0], 1)) - else: - items = self._create_items(item_pool[0], 1) - return self.get_state(items) - - def _get_items_partial(self, item_pool, missing_item): - new_items = item_pool[0].copy() - new_items.remove(missing_item) - items = self._create_items(new_items, 1) - return self.get_state(items) - diff --git a/worlds/mm2/__init__.py b/worlds/mm2/__init__.py index 4a43ee8df0..5389fc8af7 100644 --- a/worlds/mm2/__init__.py +++ b/worlds/mm2/__init__.py @@ -96,7 +96,6 @@ class MM2World(World): location_name_groups = location_groups web = MM2WebWorld() rom_name: bytearray - world_version: Tuple[int, int, int] = (0, 3, 2) wily_5_weapons: Dict[int, List[int]] def __init__(self, multiworld: MultiWorld, player: int): @@ -133,6 +132,9 @@ class MM2World(World): Consumables.option_all): stage.add_locations(energy_pickups[region], MM2Location) self.multiworld.regions.append(stage) + goal_location = self.get_location(dr_wily) + goal_location.place_locked_item(MM2Item("Victory", ItemClassification.progression, None, self.player)) + self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) def create_item(self, name: str) -> MM2Item: item = item_table[name] @@ -189,11 +191,6 @@ class MM2World(World): f"Incompatible starting Robot Master, changing to " f"{self.options.starting_robot_master.current_key.replace('_', ' ').title()}") - def generate_basic(self) -> None: - goal_location = self.get_location(dr_wily) - goal_location.place_locked_item(MM2Item("Victory", ItemClassification.progression, None, self.player)) - self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) - def fill_hook(self, progitempool: List["Item"], usefulitempool: List["Item"], diff --git a/worlds/mm2/archipelago.json b/worlds/mm2/archipelago.json new file mode 100644 index 0000000000..75c098fdf9 --- /dev/null +++ b/worlds/mm2/archipelago.json @@ -0,0 +1,5 @@ +{ + "game": "Mega Man 2", + "world_version": "0.3.2", + "minimum_ap_version": "0.6.4" +} diff --git a/worlds/mmbn3/Rom.py b/worlds/mmbn3/Rom.py index 79da50e534..347375c503 100644 --- a/worlds/mmbn3/Rom.py +++ b/worlds/mmbn3/Rom.py @@ -185,7 +185,7 @@ class TextArchive: # As far as I know, this should literally not be possible. # Every script I've looked at has dozens of unused indices, so finding 9 (8 plus one "ending" script) # should be no problem. We re-use these so we don't have to worry about an area getting tons of these - raise AssertionError("Error in generation -- not enough room for progressive undernet in archive "+self.startOffset) + raise AssertionError(f"Error in generation -- not enough room for progressive undernet in archive {self.startOffset} ({hex(self.startOffset)})") for i in range(9): # There are 8 progressive undernet ranks new_script_index = self.unused_indices[i] new_script = ArchiveScript(new_script_index, generate_progressive_undernet(i, self.unused_indices[i+1])) @@ -319,15 +319,16 @@ class MMBN3DeltaPatch(APDeltaPatch): def get_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() if not file_name: - bn3_options = options.get("mmbn3_options", None) + from worlds.mmbn3 import MMBN3World + bn3_options = MMBN3World.settings + if bn3_options is None: file_name = "Mega Man Battle Network 3 - Blue Version (USA).gba" else: file_name = bn3_options["rom_file"] if not os.path.exists(file_name): - file_name = Utils.local_path(file_name) + file_name = Utils.user_path(file_name) return file_name diff --git a/worlds/mmbn3/__init__.py b/worlds/mmbn3/__init__.py index 507ddbc21f..80716977d3 100644 --- a/worlds/mmbn3/__init__.py +++ b/worlds/mmbn3/__init__.py @@ -1,7 +1,6 @@ import os import settings import typing -import threading from BaseClasses import Item, MultiWorld, Tutorial, ItemClassification, Region, Entrance, \ LocationProgressType @@ -16,7 +15,7 @@ from .Options import MMBN3Options from .Regions import regions, RegionName from .Names.ItemName import ItemName from .Names.LocationName import LocationName -from worlds.generic.Rules import add_item_rule, add_rule +from worlds.generic.Rules import add_item_rule, add_rule, forbid_item class MMBN3Settings(settings.Group): @@ -26,8 +25,15 @@ class MMBN3Settings(settings.Group): description = "MMBN3 ROM File" md5s = [MMBN3DeltaPatch.hash] + class RomStart(str): + """ + Set this to false to never autostart a rom (such as after patching), + true for operating system default program + Alternatively, a path to a program to open the .gba file with + """ + rom_file: RomFile = RomFile(RomFile.copy_to) - rom_start: bool = True + rom_start: RomStart | bool = True class MMBN3Web(WebWorld): @@ -203,134 +209,134 @@ class MMBN3World(World): # Set WWW ID requirements def has_www_id(state): return state.has(ItemName.WWW_ID, self.player) - add_rule(self.multiworld.get_location(LocationName.ACDC_1_PMD, self.player), has_www_id) - add_rule(self.multiworld.get_location(LocationName.SciLab_1_WWW_BMD, self.player), has_www_id) - add_rule(self.multiworld.get_location(LocationName.Yoka_1_WWW_BMD, self.player), has_www_id) - add_rule(self.multiworld.get_location(LocationName.Undernet_1_WWW_BMD, self.player), has_www_id) + add_rule(self.get_location(LocationName.ACDC_1_PMD), has_www_id) + add_rule(self.get_location(LocationName.SciLab_1_WWW_BMD), has_www_id) + add_rule(self.get_location(LocationName.Yoka_1_WWW_BMD), has_www_id) + add_rule(self.get_location(LocationName.Undernet_1_WWW_BMD), has_www_id) # Set Press Program requirements def has_press(state): return state.has(ItemName.Press, self.player) - add_rule(self.multiworld.get_location(LocationName.Yoka_1_PMD, self.player), has_press) - add_rule(self.multiworld.get_location(LocationName.Yoka_2_Upper_BMD, self.player), has_press) - add_rule(self.multiworld.get_location(LocationName.Beach_2_East_BMD, self.player), has_press) - add_rule(self.multiworld.get_location(LocationName.Hades_South_BMD, self.player), has_press) - add_rule(self.multiworld.get_location(LocationName.Secret_3_BugFrag_BMD, self.player), has_press) - add_rule(self.multiworld.get_location(LocationName.Secret_3_Island_BMD, self.player), has_press) + add_rule(self.get_location(LocationName.Yoka_1_PMD), has_press) + add_rule(self.get_location(LocationName.Yoka_2_Upper_BMD), has_press) + add_rule(self.get_location(LocationName.Beach_2_East_BMD), has_press) + add_rule(self.get_location(LocationName.Hades_South_BMD), has_press) + add_rule(self.get_location(LocationName.Secret_3_BugFrag_BMD), has_press) + add_rule(self.get_location(LocationName.Secret_3_Island_BMD), has_press) # Set Purple Mystery Data Unlocker access def can_unlock(state): return state.can_reach_region(RegionName.SciLab_Overworld, self.player) or \ state.can_reach_region(RegionName.SciLab_Cyberworld, self.player) or \ state.can_reach_region(RegionName.Yoka_Cyberworld, self.player) or \ state.has(ItemName.Unlocker, self.player, 8) # There are 8 PMDs that aren't in one of the above areas - add_rule(self.multiworld.get_location(LocationName.ACDC_1_PMD, self.player), can_unlock) - add_rule(self.multiworld.get_location(LocationName.Yoka_1_PMD, self.player), can_unlock) - add_rule(self.multiworld.get_location(LocationName.Beach_1_PMD, self.player), can_unlock) - add_rule(self.multiworld.get_location(LocationName.Undernet_7_PMD, self.player), can_unlock) - add_rule(self.multiworld.get_location(LocationName.Mayls_HP_PMD, self.player), can_unlock) - add_rule(self.multiworld.get_location(LocationName.SciLab_Dads_Computer_PMD, self.player), can_unlock) - add_rule(self.multiworld.get_location(LocationName.Zoo_Panda_PMD, self.player), can_unlock) - add_rule(self.multiworld.get_location(LocationName.Beach_DNN_Security_Panel_PMD, self.player), can_unlock) - add_rule(self.multiworld.get_location(LocationName.Beach_DNN_Main_Console_PMD, self.player), can_unlock) - add_rule(self.multiworld.get_location(LocationName.Tamakos_HP_PMD, self.player), can_unlock) + add_rule(self.get_location(LocationName.ACDC_1_PMD), can_unlock) + add_rule(self.get_location(LocationName.Yoka_1_PMD), can_unlock) + add_rule(self.get_location(LocationName.Beach_1_PMD), can_unlock) + add_rule(self.get_location(LocationName.Undernet_7_PMD), can_unlock) + add_rule(self.get_location(LocationName.Mayls_HP_PMD), can_unlock) + add_rule(self.get_location(LocationName.SciLab_Dads_Computer_PMD), can_unlock) + add_rule(self.get_location(LocationName.Zoo_Panda_PMD), can_unlock) + add_rule(self.get_location(LocationName.Beach_DNN_Security_Panel_PMD), can_unlock) + add_rule(self.get_location(LocationName.Beach_DNN_Main_Console_PMD), can_unlock) + add_rule(self.get_location(LocationName.Tamakos_HP_PMD), can_unlock) # Set Job additional area access - self.multiworld.get_location(LocationName.Please_deliver_this, self.player).access_rule = \ + self.get_location(LocationName.Please_deliver_this).access_rule = \ lambda state: \ state.can_reach_region(RegionName.ACDC_Overworld, self.player) and \ state.can_reach_region(RegionName.ACDC_Cyberworld, self.player) - self.multiworld.get_location(LocationName.My_Navi_is_sick, self.player).access_rule =\ + self.get_location(LocationName.My_Navi_is_sick).access_rule =\ lambda state: \ state.has(ItemName.Recov30_star, self.player) - self.multiworld.get_location(LocationName.Help_me_with_my_son, self.player).access_rule =\ + self.get_location(LocationName.Help_me_with_my_son).access_rule =\ lambda state:\ state.can_reach_region(RegionName.Yoka_Overworld, self.player) and \ state.can_reach_region(RegionName.ACDC_Cyberworld, self.player) - self.multiworld.get_location(LocationName.Transmission_error, self.player).access_rule = \ + self.get_location(LocationName.Transmission_error).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Yoka_Overworld, self.player) - self.multiworld.get_location(LocationName.Chip_Prices, self.player).access_rule = \ + self.get_location(LocationName.Chip_Prices).access_rule = \ lambda state: \ state.can_reach_region(RegionName.ACDC_Cyberworld, self.player) and \ state.can_reach_region(RegionName.SciLab_Cyberworld, self.player) - self.multiworld.get_location(LocationName.Im_broke, self.player).access_rule = \ + self.get_location(LocationName.Im_broke).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Yoka_Overworld, self.player) and \ state.can_reach_region(RegionName.Yoka_Cyberworld, self.player) - self.multiworld.get_location(LocationName.Rare_chips_for_cheap, self.player).access_rule = \ + self.get_location(LocationName.Rare_chips_for_cheap).access_rule = \ lambda state: \ state.can_reach_region(RegionName.ACDC_Overworld, self.player) - self.multiworld.get_location(LocationName.Be_my_boyfriend, self.player).access_rule =\ + self.get_location(LocationName.Be_my_boyfriend).access_rule =\ lambda state: \ state.can_reach_region(RegionName.Beach_Cyberworld, self.player) - self.multiworld.get_location(LocationName.Will_you_deliver, self.player).access_rule=\ + self.get_location(LocationName.Will_you_deliver).access_rule=\ lambda state: \ state.can_reach_region(RegionName.Yoka_Overworld, self.player) and \ state.can_reach_region(RegionName.Beach_Overworld, self.player) and \ state.can_reach_region(RegionName.ACDC_Cyberworld, self.player) - self.multiworld.get_location(LocationName.Somebody_please_help, self.player).access_rule = \ + self.get_location(LocationName.Somebody_please_help).access_rule = \ lambda state: \ state.can_reach_region(RegionName.ACDC_Overworld, self.player) - self.multiworld.get_location(LocationName.Looking_for_condor, self.player).access_rule = \ + self.get_location(LocationName.Looking_for_condor).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Yoka_Overworld, self.player) and \ state.can_reach_region(RegionName.Beach_Overworld, self.player) and \ state.can_reach_region(RegionName.ACDC_Overworld, self.player) - self.multiworld.get_location(LocationName.Help_with_rehab, self.player).access_rule = \ + self.get_location(LocationName.Help_with_rehab).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Beach_Overworld, self.player) - self.multiworld.get_location(LocationName.Help_with_rehab_bonus, self.player).access_rule = \ + self.get_location(LocationName.Help_with_rehab_bonus).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Beach_Overworld, self.player) - self.multiworld.get_location(LocationName.Old_Master, self.player).access_rule = \ + self.get_location(LocationName.Old_Master).access_rule = \ lambda state: \ state.can_reach_region(RegionName.ACDC_Overworld, self.player) and \ state.can_reach_region(RegionName.Beach_Overworld, self.player) - self.multiworld.get_location(LocationName.Catching_gang_members, self.player).access_rule = \ + self.get_location(LocationName.Catching_gang_members).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Yoka_Cyberworld, self.player) and \ state.has(ItemName.Press, self.player) - self.multiworld.get_location(LocationName.Please_adopt_a_virus, self.player).access_rule = \ + self.get_location(LocationName.Please_adopt_a_virus).access_rule = \ lambda state: \ state.can_reach_region(RegionName.SciLab_Cyberworld, self.player) - self.multiworld.get_location(LocationName.Legendary_Tomes, self.player).access_rule = \ + self.get_location(LocationName.Legendary_Tomes).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Beach_Overworld, self.player) and \ state.can_reach_region(RegionName.Undernet, self.player) and \ state.can_reach_region(RegionName.Deep_Undernet, self.player) and \ state.has_all({ItemName.Press, ItemName.Magnum1_A}, self.player) - self.multiworld.get_location(LocationName.Legendary_Tomes_Treasure, self.player).access_rule = \ + self.get_location(LocationName.Legendary_Tomes_Treasure).access_rule = \ lambda state: \ state.can_reach_region(RegionName.ACDC_Overworld, self.player) and \ state.can_reach_location(LocationName.Legendary_Tomes, self.player) - self.multiworld.get_location(LocationName.Hide_and_seek_First_Child, self.player).access_rule = \ + self.get_location(LocationName.Hide_and_seek_First_Child).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Yoka_Overworld, self.player) - self.multiworld.get_location(LocationName.Hide_and_seek_Second_Child, self.player).access_rule = \ + self.get_location(LocationName.Hide_and_seek_Second_Child).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Yoka_Overworld, self.player) - self.multiworld.get_location(LocationName.Hide_and_seek_Third_Child, self.player).access_rule = \ + self.get_location(LocationName.Hide_and_seek_Third_Child).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Yoka_Overworld, self.player) - self.multiworld.get_location(LocationName.Hide_and_seek_Fourth_Child, self.player).access_rule = \ + self.get_location(LocationName.Hide_and_seek_Fourth_Child).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Yoka_Overworld, self.player) - self.multiworld.get_location(LocationName.Hide_and_seek_Completion, self.player).access_rule = \ + self.get_location(LocationName.Hide_and_seek_Completion).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Yoka_Overworld, self.player) - self.multiworld.get_location(LocationName.Finding_the_blue_Navi, self.player).access_rule = \ + self.get_location(LocationName.Finding_the_blue_Navi).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Undernet, self.player) - self.multiworld.get_location(LocationName.Give_your_support, self.player).access_rule = \ + self.get_location(LocationName.Give_your_support).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Beach_Overworld, self.player) - self.multiworld.get_location(LocationName.Stamp_collecting, self.player).access_rule = \ + self.get_location(LocationName.Stamp_collecting).access_rule = \ lambda state: \ state.can_reach_region(RegionName.Beach_Overworld, self.player) and \ state.can_reach_region(RegionName.ACDC_Cyberworld, self.player) and \ state.can_reach_region(RegionName.SciLab_Cyberworld, self.player) and \ state.can_reach_region(RegionName.Yoka_Cyberworld, self.player) and \ state.can_reach_region(RegionName.Beach_Cyberworld, self.player) - self.multiworld.get_location(LocationName.Help_with_a_will, self.player).access_rule = \ + self.get_location(LocationName.Help_with_a_will).access_rule = \ lambda state: \ state.can_reach_region(RegionName.ACDC_Overworld, self.player) and \ state.can_reach_region(RegionName.ACDC_Cyberworld, self.player) and \ @@ -340,100 +346,115 @@ class MMBN3World(World): state.can_reach_region(RegionName.Undernet, self.player) # Set Trade quests - self.multiworld.get_location(LocationName.ACDC_SonicWav_W_Trade, self.player).access_rule =\ + self.get_location(LocationName.ACDC_SonicWav_W_Trade).access_rule =\ lambda state: state.has(ItemName.SonicWav_W, self.player) - self.multiworld.get_location(LocationName.ACDC_Bubbler_C_Trade, self.player).access_rule =\ + self.get_location(LocationName.ACDC_Bubbler_C_Trade).access_rule =\ lambda state: state.has(ItemName.Bubbler_C, self.player) - self.multiworld.get_location(LocationName.ACDC_Recov120_S_Trade, self.player).access_rule =\ + self.get_location(LocationName.ACDC_Recov120_S_Trade).access_rule =\ lambda state: state.has(ItemName.Recov120_S, self.player) - self.multiworld.get_location(LocationName.SciLab_Shake1_S_Trade, self.player).access_rule =\ + self.get_location(LocationName.SciLab_Shake1_S_Trade).access_rule =\ lambda state: state.has(ItemName.Shake1_S, self.player) - self.multiworld.get_location(LocationName.Yoka_FireSwrd_P_Trade, self.player).access_rule =\ + self.get_location(LocationName.Yoka_FireSwrd_P_Trade).access_rule =\ lambda state: state.has(ItemName.FireSwrd_P, self.player) - self.multiworld.get_location(LocationName.Hospital_DynaWav_V_Trade, self.player).access_rule =\ + self.get_location(LocationName.Hospital_DynaWav_V_Trade).access_rule =\ lambda state: state.has(ItemName.DynaWave_V, self.player) - self.multiworld.get_location(LocationName.Beach_DNN_WideSwrd_C_Trade, self.player).access_rule =\ + self.get_location(LocationName.Beach_DNN_WideSwrd_C_Trade).access_rule =\ lambda state: state.has(ItemName.WideSwrd_C, self.player) - self.multiworld.get_location(LocationName.Beach_DNN_HoleMetr_H_Trade, self.player).access_rule =\ + self.get_location(LocationName.Beach_DNN_HoleMetr_H_Trade).access_rule =\ lambda state: state.has(ItemName.HoleMetr_H, self.player) - self.multiworld.get_location(LocationName.Beach_DNN_Shadow_J_Trade, self.player).access_rule =\ + self.get_location(LocationName.Beach_DNN_Shadow_J_Trade).access_rule =\ lambda state: state.has(ItemName.Shadow_J, self.player) - self.multiworld.get_location(LocationName.Hades_GrabBack_K_Trade, self.player).access_rule =\ + self.get_location(LocationName.Hades_GrabBack_K_Trade).access_rule =\ lambda state: state.has(ItemName.GrabBack_K, self.player) # Set Number Traders # The first 8 are considered cheap enough to grind for in ACDC. Protip: Try grinding in the tank - self.multiworld.get_location(LocationName.Numberman_Code_09, self.player).access_rule = \ + self.get_location(LocationName.Numberman_Code_09).access_rule = \ lambda state: self.explore_score(state) > 2 - self.multiworld.get_location(LocationName.Numberman_Code_10, self.player).access_rule = \ + self.get_location(LocationName.Numberman_Code_10).access_rule = \ lambda state: self.explore_score(state) > 2 - self.multiworld.get_location(LocationName.Numberman_Code_11, self.player).access_rule = \ + self.get_location(LocationName.Numberman_Code_11).access_rule = \ lambda state: self.explore_score(state) > 2 - self.multiworld.get_location(LocationName.Numberman_Code_12, self.player).access_rule = \ + self.get_location(LocationName.Numberman_Code_12).access_rule = \ lambda state: self.explore_score(state) > 2 - self.multiworld.get_location(LocationName.Numberman_Code_13, self.player).access_rule = \ + self.get_location(LocationName.Numberman_Code_13).access_rule = \ lambda state: self.explore_score(state) > 2 - self.multiworld.get_location(LocationName.Numberman_Code_14, self.player).access_rule = \ + self.get_location(LocationName.Numberman_Code_14).access_rule = \ lambda state: self.explore_score(state) > 2 - self.multiworld.get_location(LocationName.Numberman_Code_15, self.player).access_rule = \ + self.get_location(LocationName.Numberman_Code_15).access_rule = \ lambda state: self.explore_score(state) > 2 - self.multiworld.get_location(LocationName.Numberman_Code_16, self.player).access_rule = \ + self.get_location(LocationName.Numberman_Code_16).access_rule = \ lambda state: self.explore_score(state) > 2 - self.multiworld.get_location(LocationName.Numberman_Code_17, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_17).access_rule =\ lambda state: self.explore_score(state) > 4 - self.multiworld.get_location(LocationName.Numberman_Code_18, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_18).access_rule =\ lambda state: self.explore_score(state) > 4 - self.multiworld.get_location(LocationName.Numberman_Code_19, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_19).access_rule =\ lambda state: self.explore_score(state) > 4 - self.multiworld.get_location(LocationName.Numberman_Code_20, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_20).access_rule =\ lambda state: self.explore_score(state) > 4 - self.multiworld.get_location(LocationName.Numberman_Code_21, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_21).access_rule =\ lambda state: self.explore_score(state) > 4 - self.multiworld.get_location(LocationName.Numberman_Code_22, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_22).access_rule =\ lambda state: self.explore_score(state) > 4 - self.multiworld.get_location(LocationName.Numberman_Code_23, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_23).access_rule =\ lambda state: self.explore_score(state) > 4 - self.multiworld.get_location(LocationName.Numberman_Code_24, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_24).access_rule =\ lambda state: self.explore_score(state) > 4 - self.multiworld.get_location(LocationName.Numberman_Code_25, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_25).access_rule =\ lambda state: self.explore_score(state) > 8 - self.multiworld.get_location(LocationName.Numberman_Code_26, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_26).access_rule =\ lambda state: self.explore_score(state) > 8 - self.multiworld.get_location(LocationName.Numberman_Code_27, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_27).access_rule =\ lambda state: self.explore_score(state) > 8 - self.multiworld.get_location(LocationName.Numberman_Code_28, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_28).access_rule =\ lambda state: self.explore_score(state) > 8 - self.multiworld.get_location(LocationName.Numberman_Code_29, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_29).access_rule =\ lambda state: self.explore_score(state) > 10 - self.multiworld.get_location(LocationName.Numberman_Code_30, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_30).access_rule =\ lambda state: self.explore_score(state) > 10 - self.multiworld.get_location(LocationName.Numberman_Code_31, self.player).access_rule =\ + self.get_location(LocationName.Numberman_Code_31).access_rule =\ lambda state: self.explore_score(state) > 10 #miscellaneous locations with extra requirements - add_rule(self.multiworld.get_location(LocationName.Comedian, self.player), + add_rule(self.get_location(LocationName.Comedian), lambda state: state.has(ItemName.Humor, self.player)) - add_rule(self.multiworld.get_location(LocationName.Villain, self.player), + add_rule(self.get_location(LocationName.Villain), lambda state: state.has(ItemName.BlckMnd, self.player)) - def not_undernet(item): return item.code != item_table[ItemName.Progressive_Undernet_Rank].code or item.player != self.player - self.multiworld.get_location(LocationName.WWW_1_Central_BMD, self.player).item_rule = not_undernet - self.multiworld.get_location(LocationName.WWW_1_East_BMD, self.player).item_rule = not_undernet - self.multiworld.get_location(LocationName.WWW_2_East_BMD, self.player).item_rule = not_undernet - self.multiworld.get_location(LocationName.WWW_2_Northwest_BMD, self.player).item_rule = not_undernet - self.multiworld.get_location(LocationName.WWW_3_East_BMD, self.player).item_rule = not_undernet - self.multiworld.get_location(LocationName.WWW_3_North_BMD, self.player).item_rule = not_undernet - self.multiworld.get_location(LocationName.WWW_4_Northwest_BMD, self.player).item_rule = not_undernet - self.multiworld.get_location(LocationName.WWW_4_Central_BMD, self.player).item_rule = not_undernet - self.multiworld.get_location(LocationName.WWW_Wall_BMD, self.player).item_rule = not_undernet - self.multiworld.get_location(LocationName.WWW_Control_Room_1_Screen, self.player).item_rule = not_undernet - self.multiworld.get_location(LocationName.WWW_Wilys_Desk, self.player).item_rule = not_undernet + forbid_item(self.get_location(LocationName.WWW_1_Central_BMD), + ItemName.Progressive_Undernet_Rank, self.player) + forbid_item(self.get_location(LocationName.WWW_1_East_BMD), + ItemName.Progressive_Undernet_Rank, self.player) + forbid_item(self.get_location(LocationName.WWW_2_East_BMD), + ItemName.Progressive_Undernet_Rank, self.player) + forbid_item(self.get_location(LocationName.WWW_2_Northwest_BMD), + ItemName.Progressive_Undernet_Rank, self.player) + forbid_item(self.get_location(LocationName.WWW_3_East_BMD), + ItemName.Progressive_Undernet_Rank, self.player) + forbid_item(self.get_location(LocationName.WWW_3_North_BMD), + ItemName.Progressive_Undernet_Rank, self.player) + forbid_item(self.get_location(LocationName.WWW_4_Northwest_BMD), + ItemName.Progressive_Undernet_Rank, self.player) + forbid_item(self.get_location(LocationName.WWW_4_Central_BMD), + ItemName.Progressive_Undernet_Rank, self.player) + forbid_item(self.get_location(LocationName.WWW_Wall_BMD), + ItemName.Progressive_Undernet_Rank, self.player) + forbid_item(self.get_location(LocationName.WWW_Control_Room_1_Screen), + ItemName.Progressive_Undernet_Rank, self.player) + forbid_item(self.get_location(LocationName.WWW_Wilys_Desk), + ItemName.Progressive_Undernet_Rank, self.player) + + # I have no fuckin clue why this specific location shits the bed on a progressive undernet rank. + # If you ever figure it out I will buy you a pizza. + forbid_item(self.get_location(LocationName.Chocolate_Shop_07), + ItemName.Progressive_Undernet_Rank, self.player) # place "Victory" at "Final Boss" and set collection as win condition - self.multiworld.get_location(LocationName.Alpha_Defeated, self.player) \ + self.get_location(LocationName.Alpha_Defeated) \ .place_locked_item(self.create_event(ItemName.Victory)) self.multiworld.completion_condition[self.player] = \ lambda state: state.has(ItemName.Victory, self.player) diff --git a/worlds/mmbn3/data/bn3-ap-patch.bsdiff b/worlds/mmbn3/data/bn3-ap-patch.bsdiff index d55fecad80..43ace91bcd 100644 Binary files a/worlds/mmbn3/data/bn3-ap-patch.bsdiff and b/worlds/mmbn3/data/bn3-ap-patch.bsdiff differ diff --git a/worlds/musedash/MuseDashCollection.py b/worlds/musedash/MuseDashCollection.py index 96a506f2fa..2a9f56750e 100644 --- a/worlds/musedash/MuseDashCollection.py +++ b/worlds/musedash/MuseDashCollection.py @@ -36,6 +36,8 @@ class MuseDashCollections: "Yume Ou Mono Yo Secret", "Echo over you... Secret", "Tsukuyomi Ni Naru Replaced", + "Heart Message feat. Aoi Tokimori Secret", + "Meow Rock feat. Chun Ge, Yuan Shen", ] song_items = SONG_DATA diff --git a/worlds/musedash/MuseDashData.py b/worlds/musedash/MuseDashData.py index 71d69eecb5..f3a6becb6a 100644 --- a/worlds/musedash/MuseDashData.py +++ b/worlds/musedash/MuseDashData.py @@ -627,10 +627,48 @@ SONG_DATA: Dict[str, SongData] = { "Sharp Bubbles": SongData(2900751, "83-3", "Cosmic Radio 2024", True, 7, 9, 11), "Replay": SongData(2900752, "83-4", "Cosmic Radio 2024", True, 5, 7, 9), "Cosmic Dusty Girl": SongData(2900753, "83-5", "Cosmic Radio 2024", True, 5, 7, 9), - "Meow Rock feat. Chun Ge, Yuan Shen": SongData(2900754, "84-0", "Muse Dash Legend", True, None, None, None), - "Even if you make an old radio song with AI": SongData(2900755, "84-1", "Muse Dash Legend", False, 3, 6, 8), - "Unusual Sketchbook": SongData(2900756, "84-2", "Muse Dash Legend", True, 6, 8, 11), - "TransientTears": SongData(2900757, "84-3", "Muse Dash Legend", True, 6, 8, 11), - "SHOOTING*STAR": SongData(2900758, "84-4", "Muse Dash Legend", False, 5, 7, 9), - "But the Blue Bird is Already Dead": SongData(2900759, "84-5", "Muse Dash Legend", False, 6, 8, 10), + "Meow Rock feat. Chun Ge, Yuan Shen": SongData(2900754, "84-0", "Muse Dash・Legend", True, None, None, None), + "Even if you make an old radio song with AI": SongData(2900755, "84-1", "Muse Dash・Legend", False, 3, 6, 8), + "Unusual Sketchbook": SongData(2900756, "84-2", "Muse Dash・Legend", True, 6, 8, 11), + "TransientTears": SongData(2900757, "84-3", "Muse Dash・Legend", True, 6, 8, 11), + "SHOOTING*STAR": SongData(2900758, "84-4", "Muse Dash・Legend", False, 5, 7, 9), + "But the Blue Bird is Already Dead": SongData(2900759, "84-5", "Muse Dash・Legend", False, 6, 8, 10), + "Heart Message feat. Aoi Tokimori Secret": SongData(2900760, "0-57", "Default Music", True, None, 7, 10), + "Heart Message feat. Aoi Tokimori": SongData(2900761, "0-58", "Default Music", True, 1, 3, 6), + "Aventyr": SongData(2900762, "85-0", "Happy Otaku Pack Vol.20", True, 4, 7, 10), + "Raintain": SongData(2900763, "85-1", "Happy Otaku Pack Vol.20", False, 6, 8, 10), + "Piercing the Clouds and Waves": SongData(2900764, "85-2", "Happy Otaku Pack Vol.20", True, 3, 6, 8), + "Save Yourself": SongData(2900765, "85-3", "Happy Otaku Pack Vol.20", True, 5, 7, 10), + "Menace": SongData(2900766, "85-4", "Happy Otaku Pack Vol.20", True, 7, 9, 11), + "Dangling": SongData(2900767, "85-5", "Happy Otaku Pack Vol.20", True, 6, 8, 10), + "Inverted World": SongData(2900768, "86-0", "Aquaria Cruising Guide", True, 4, 6, 8), + "Suito": SongData(2900769, "86-1", "Aquaria Cruising Guide", True, 6, 8, 11), + "The Promised Land": SongData(2900770, "86-2", "Aquaria Cruising Guide", True, 4, 6, 9), + "Alfheim's faith": SongData(2900771, "86-3", "Aquaria Cruising Guide", True, 6, 8, 11), + "Heaven's Cage": SongData(2900772, "86-4", "Aquaria Cruising Guide", True, 5, 7, 10), + "Broomstick adventure!": SongData(2900773, "86-5", "Aquaria Cruising Guide", True, 7, 9, 11), + "Strong Nurse Buro-chan!": SongData(2900774, "43-61", "MD Plus Project", True, 5, 7, 9), + "Cubism": SongData(2900775, "43-62", "MD Plus Project", False, 5, 7, 9), + "Cubibibibism": SongData(2900776, "43-63", "MD Plus Project", False, 6, 8, 10), + "LET'S TOAST!!": SongData(2900777, "43-64", "MD Plus Project", False, 6, 8, 10), + "#YamiKawa": SongData(2900778, "43-65", "MD Plus Project", False, 5, 7, 10), + "Rainy Step": SongData(2900779, "43-66", "MD Plus Project", False, 2, 5, 8), + "OHOSHIKATSU": SongData(2900780, "43-67", "MD Plus Project", False, 5, 7, 10), + "Dreamy Day": SongData(2900781, "87-0", "Aim to Be a Rhythm Master!", False, 2, 5, 7), + "Futropolis": SongData(2900782, "87-1", "Aim to Be a Rhythm Master!", False, 4, 7, 9), + "Quo Vadis": SongData(2900783, "87-2", "Aim to Be a Rhythm Master!", False, 5, 7, 10), + "REANIMATE": SongData(2900784, "87-3", "Aim to Be a Rhythm Master!", False, 5, 7, 10), + "Ineffabilis": SongData(2900785, "87-4", "Aim to Be a Rhythm Master!", False, 3, 7, 10), + "DaJiaHao": SongData(2900786, "87-5", "Aim to Be a Rhythm Master!", False, 5, 7, 10), + "Echoes of SeraphiM": SongData(2900787, "87-6", "Aim to Be a Rhythm Master!", False, 5, 8, 10), + "Othello feat.Uiro": SongData(2900788, "88-0", "MUSE RADIO FM106", True, 3, 5, 7), + "Midnight Blue": SongData(2900789, "88-1", "MUSE RADIO FM106", True, 2, 5, 7), + "overwork feat.Woonoo": SongData(2900790, "88-2", "MUSE RADIO FM106", True, 2, 6, 8), + "SUPER CITYLIGHTS": SongData(2900791, "88-3", "MUSE RADIO FM106", True, 5, 7, 10), + "Flametide": SongData(2900792, "89-0", "Legendary Voyage, Mystic Treasure", True, 5, 7, 9), + "Embrace feat. Kiyon": SongData(2900793, "89-1", "Legendary Voyage, Mystic Treasure", True, 2, 5, 8), + "Magazines feat. Nia Suzune": SongData(2900794, "89-2", "Legendary Voyage, Mystic Treasure", True, 3, 6, 8), + "Temptation": SongData(2900795, "89-3", "Legendary Voyage, Mystic Treasure", False, 5, 8, 10), + "PwP": SongData(2900796, "89-4", "Legendary Voyage, Mystic Treasure", True, 3, 6, 9), + "I Can Show You": SongData(2900797, "89-5", "Legendary Voyage, Mystic Treasure", False, 5, 7, 9), } diff --git a/worlds/musedash/Options.py b/worlds/musedash/Options.py index 9f729c2d03..83e58274f0 100644 --- a/worlds/musedash/Options.py +++ b/worlds/musedash/Options.py @@ -175,6 +175,13 @@ class ExcludeSongs(SongSet): """ display_name = "Exclude Songs" +class GoalSong(SongSet): + """ + One of the selected songs will be guaranteed to show up as the final Goal Song. + - You must have the DLC enabled to play these songs. + - If no songs are chosen, then the song will be randomly chosen from the available songs. + """ + display_name = "Goal Song" md_option_groups = [ OptionGroup("Song Choice", [ @@ -182,6 +189,7 @@ md_option_groups = [ StreamerModeEnabled, IncludeSongs, ExcludeSongs, + GoalSong, ]), OptionGroup("Difficulty", [ GradeNeeded, @@ -214,6 +222,7 @@ class MuseDashOptions(PerGameCommonOptions): death_link: DeathLink include_songs: IncludeSongs exclude_songs: ExcludeSongs + goal_song: GoalSong # Removed allow_just_as_planned_dlc_songs: Removed diff --git a/worlds/musedash/__init__.py b/worlds/musedash/__init__.py index d793308a7c..239d640e68 100644 --- a/worlds/musedash/__init__.py +++ b/worlds/musedash/__init__.py @@ -2,7 +2,7 @@ from worlds.AutoWorld import World, WebWorld from BaseClasses import Region, Item, ItemClassification, Tutorial from typing import List, ClassVar, Type, Set from math import floor -from Options import PerGameCommonOptions +from Options import PerGameCommonOptions, OptionError from .Options import MuseDashOptions, md_option_groups from .Items import MuseDashSongItem, MuseDashFixedItem @@ -102,7 +102,8 @@ class MuseDashWorld(World): # If the above fails, we want to adjust the difficulty thresholds. # Easier first, then harder if lower_diff_threshold <= 1 and higher_diff_threshold >= 11: - raise Exception("Failed to find enough songs, even with maximum difficulty thresholds.") + raise OptionError("Failed to find enough songs, even with maximum difficulty thresholds. " + "Too many songs have been excluded or set to be starter songs.") elif lower_diff_threshold <= 1: higher_diff_threshold += 1 else: @@ -119,12 +120,24 @@ class MuseDashWorld(World): start_items = self.options.start_inventory.value.keys() include_songs = self.options.include_songs.value exclude_songs = self.options.exclude_songs.value + chosen_goal_songs = sorted(self.options.goal_song) self.starting_songs = [s for s in start_items if s in song_items] self.starting_songs = self.md_collection.filter_songs_to_dlc(self.starting_songs, dlc_songs) self.included_songs = [s for s in include_songs if s in song_items and s not in self.starting_songs] self.included_songs = self.md_collection.filter_songs_to_dlc(self.included_songs, dlc_songs) + # Making sure songs chosen for goal are allowed by DLC and remove the chosen from being added to the pool. + if chosen_goal_songs: + chosen_goal_songs = self.md_collection.filter_songs_to_dlc(chosen_goal_songs, dlc_songs) + if chosen_goal_songs: + self.random.shuffle(chosen_goal_songs) + self.victory_song_name = chosen_goal_songs.pop() + if self.victory_song_name in self.starting_songs: + self.starting_songs.remove(self.victory_song_name) + if self.victory_song_name in self.included_songs: + self.included_songs.remove(self.victory_song_name) + return [s for s in available_song_keys if s not in start_items and s not in include_songs and s not in exclude_songs] @@ -139,12 +152,13 @@ class MuseDashWorld(World): if included_song_count > additional_song_count: # If so, we want to thin the list, thus let's get the goal song and starter songs while we are at it. self.random.shuffle(self.included_songs) - self.victory_song_name = self.included_songs.pop() + if not self.victory_song_name: + self.victory_song_name = self.included_songs.pop() while len(self.included_songs) > additional_song_count: next_song = self.included_songs.pop() if len(self.starting_songs) < starting_song_count: self.starting_songs.append(next_song) - else: + elif not self.victory_song_name: # If not, choose a random victory song from the available songs chosen_song = self.random.randrange(0, len(available_song_keys) + included_song_count) if chosen_song < included_song_count: @@ -153,6 +167,8 @@ class MuseDashWorld(World): else: self.victory_song_name = available_song_keys[chosen_song - included_song_count] del available_song_keys[chosen_song - included_song_count] + elif self.victory_song_name in available_song_keys: + available_song_keys.remove(self.victory_song_name) # Next, make sure the starting songs are fulfilled if len(self.starting_songs) < starting_song_count: @@ -173,7 +189,7 @@ class MuseDashWorld(World): def create_item(self, name: str) -> Item: if name == self.md_collection.MUSIC_SHEET_NAME: - return MuseDashFixedItem(name, ItemClassification.progression_skip_balancing, + return MuseDashFixedItem(name, ItemClassification.progression_deprioritized_skip_balancing, self.md_collection.MUSIC_SHEET_CODE, self.player) filler = self.md_collection.filler_items.get(name) diff --git a/worlds/musedash/archipelago.json b/worlds/musedash/archipelago.json new file mode 100644 index 0000000000..d10e8369d6 --- /dev/null +++ b/worlds/musedash/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Muse Dash", + "authors": ["DeamonHunter"], + "world_version": "1.5.25", + "minimum_ap_version": "0.6.3" +} \ No newline at end of file diff --git a/worlds/noita/__init__.py b/worlds/noita/__init__.py index af2921768d..a0b94458c2 100644 --- a/worlds/noita/__init__.py +++ b/worlds/noita/__init__.py @@ -38,7 +38,7 @@ class NoitaWorld(World): web = NoitaWeb() def generate_early(self) -> None: - if not self.multiworld.get_player_name(self.player).isascii(): + if not self.player_name.isascii(): raise Exception("Noita yaml's slot name has invalid character(s).") # Returned items will be sent over to the client diff --git a/worlds/noita/archipelago.json b/worlds/noita/archipelago.json new file mode 100644 index 0000000000..3bda524508 --- /dev/null +++ b/worlds/noita/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Noita", + "authors": ["Heinermann", "ScipioWright"], + "minimum_ap_version": "0.6.4", + "world_version": "1.4.0" +} diff --git a/worlds/noita/events.py b/worlds/noita/events.py index 4ec04e98b4..2ae524d9ec 100644 --- a/worlds/noita/events.py +++ b/worlds/noita/events.py @@ -1,4 +1,4 @@ -from typing import Dict, TYPE_CHECKING +from typing import TYPE_CHECKING from BaseClasses import Item, ItemClassification, Location, Region from . import items, locations @@ -6,7 +6,7 @@ if TYPE_CHECKING: from . import NoitaWorld -def create_event(player: int, name: str) -> Item: +def create_event_item(player: int, name: str) -> Item: return items.NoitaItem(name, ItemClassification.progression, None, player) @@ -16,13 +16,13 @@ def create_location(player: int, name: str, region: Region) -> Location: def create_locked_location_event(player: int, region: Region, item: str) -> Location: new_location = create_location(player, item, region) - new_location.place_locked_item(create_event(player, item)) + new_location.place_locked_item(create_event_item(player, item)) region.locations.append(new_location) return new_location -def create_all_events(world: "NoitaWorld", created_regions: Dict[str, Region]) -> None: +def create_all_events(world: "NoitaWorld", created_regions: dict[str, Region]) -> None: for region_name, event in event_locks.items(): region = created_regions[region_name] create_locked_location_event(world.player, region, event) @@ -31,7 +31,7 @@ def create_all_events(world: "NoitaWorld", created_regions: Dict[str, Region]) - # Maps region names to event names -event_locks: Dict[str, str] = { +event_locks: dict[str, str] = { "The Work": "Victory", "Mines": "Portal to Holy Mountain 1", "Coal Pits": "Portal to Holy Mountain 2", diff --git a/worlds/noita/items.py b/worlds/noita/items.py index 20d9ff1930..4cd0b5ef87 100644 --- a/worlds/noita/items.py +++ b/worlds/noita/items.py @@ -1,6 +1,6 @@ import itertools from collections import Counter -from typing import Dict, List, NamedTuple, Set, TYPE_CHECKING +from typing import NamedTuple, TYPE_CHECKING from BaseClasses import Item, ItemClassification from .options import BossesAsChecks, VictoryCondition, ExtraOrbs @@ -27,12 +27,12 @@ def create_item(player: int, name: str) -> Item: return NoitaItem(name, item_data.classification, item_data.code, player) -def create_fixed_item_pool() -> List[str]: - required_items: Dict[str, int] = {name: data.required_num for name, data in item_table.items()} +def create_fixed_item_pool() -> list[str]: + required_items: dict[str, int] = {name: data.required_num for name, data in item_table.items()} return list(Counter(required_items).elements()) -def create_orb_items(victory_condition: VictoryCondition, extra_orbs: ExtraOrbs) -> List[str]: +def create_orb_items(victory_condition: VictoryCondition, extra_orbs: ExtraOrbs) -> list[str]: orb_count = extra_orbs.value if victory_condition == VictoryCondition.option_pure_ending: orb_count = orb_count + 11 @@ -41,15 +41,15 @@ def create_orb_items(victory_condition: VictoryCondition, extra_orbs: ExtraOrbs) return ["Orb" for _ in range(orb_count)] -def create_spatial_awareness_item(bosses_as_checks: BossesAsChecks) -> List[str]: +def create_spatial_awareness_item(bosses_as_checks: BossesAsChecks) -> list[str]: return ["Spatial Awareness Perk"] if bosses_as_checks.value >= BossesAsChecks.option_all_bosses else [] -def create_kantele(victory_condition: VictoryCondition) -> List[str]: +def create_kantele(victory_condition: VictoryCondition) -> list[str]: return ["Kantele"] if victory_condition.value >= VictoryCondition.option_pure_ending else [] -def create_random_items(world: NoitaWorld, weights: Dict[str, int], count: int) -> List[str]: +def create_random_items(world: NoitaWorld, weights: dict[str, int], count: int) -> list[str]: filler_pool = weights.copy() if not world.options.bad_effects: filler_pool["Trap"] = 0 @@ -87,7 +87,7 @@ def create_all_items(world: NoitaWorld) -> None: # 110000 - 110032 -item_table: Dict[str, ItemData] = { +item_table: dict[str, ItemData] = { "Trap": ItemData(110000, "Traps", ItemClassification.trap), "Extra Max HP": ItemData(110001, "Pickups", ItemClassification.useful), "Spell Refresher": ItemData(110002, "Pickups", ItemClassification.filler), @@ -122,7 +122,7 @@ item_table: Dict[str, ItemData] = { "Broken Wand": ItemData(110031, "Items", ItemClassification.filler), } -shop_only_filler_weights: Dict[str, int] = { +shop_only_filler_weights: dict[str, int] = { "Trap": 15, "Extra Max HP": 25, "Spell Refresher": 20, @@ -135,7 +135,7 @@ shop_only_filler_weights: Dict[str, int] = { "Extra Life Perk": 10, } -filler_weights: Dict[str, int] = { +filler_weights: dict[str, int] = { **shop_only_filler_weights, "Gold (200)": 15, "Gold (1000)": 6, @@ -152,22 +152,10 @@ filler_weights: Dict[str, int] = { } -# These helper functions make the comprehensions below more readable -def get_item_group(item_name: str) -> str: - return item_table[item_name].group +filler_items: list[str] = list(filter(lambda item: item_table[item].classification == ItemClassification.filler, + item_table.keys())) +item_name_to_id: dict[str, int] = {name: data.code for name, data in item_table.items()} - -def item_is_filler(item_name: str) -> bool: - return item_table[item_name].classification == ItemClassification.filler - - -def item_is_perk(item_name: str) -> bool: - return item_table[item_name].group == "Perks" - - -filler_items: List[str] = list(filter(item_is_filler, item_table.keys())) -item_name_to_id: Dict[str, int] = {name: data.code for name, data in item_table.items()} - -item_name_groups: Dict[str, Set[str]] = { - group: set(item_names) for group, item_names in itertools.groupby(item_table, get_item_group) +item_name_groups: dict[str, set[str]] = { + group: set(item_names) for group, item_names in itertools.groupby(item_table, lambda item: item_table[item].group) } diff --git a/worlds/noita/locations.py b/worlds/noita/locations.py index 5dd87b5b03..319955769a 100644 --- a/worlds/noita/locations.py +++ b/worlds/noita/locations.py @@ -1,6 +1,6 @@ # Locations are specific points that you would obtain an item at. from enum import IntEnum -from typing import Dict, NamedTuple, Optional, Set +from typing import NamedTuple from BaseClasses import Location @@ -27,7 +27,7 @@ class LocationFlag(IntEnum): # Only the first Hidden Chest and Pedestal are mapped here, the others are created in Regions. # ltype key: "Chest" = Hidden Chests, "Pedestal" = Pedestals, "Boss" = Boss, "Orb" = Orb. # 110000-110671 -location_region_mapping: Dict[str, Dict[str, LocationData]] = { +location_region_mapping: dict[str, dict[str, LocationData]] = { "Coal Pits Holy Mountain": { "Coal Pits Holy Mountain Shop Item 1": LocationData(110000), "Coal Pits Holy Mountain Shop Item 2": LocationData(110001), @@ -207,15 +207,15 @@ location_region_mapping: Dict[str, Dict[str, LocationData]] = { } -def make_location_range(location_name: str, base_id: int, amt: int) -> Dict[str, int]: +def make_location_range(location_name: str, base_id: int, amt: int) -> dict[str, int]: if amt == 1: return {location_name: base_id} return {f"{location_name} {i+1}": base_id + i for i in range(amt)} -location_name_groups: Dict[str, Set[str]] = {"Shop": set(), "Orb": set(), "Boss": set(), "Chest": set(), +location_name_groups: dict[str, set[str]] = {"Shop": set(), "Orb": set(), "Boss": set(), "Chest": set(), "Pedestal": set()} -location_name_to_id: Dict[str, int] = {} +location_name_to_id: dict[str, int] = {} for region_name, location_group in location_region_mapping.items(): diff --git a/worlds/noita/options.py b/worlds/noita/options.py index 8a973a0d72..6798cc8ccd 100644 --- a/worlds/noita/options.py +++ b/worlds/noita/options.py @@ -121,10 +121,8 @@ class ShopPrice(Choice): class NoitaDeathLink(DeathLink): - """ - When you die, everyone dies. Of course, the reverse is true too. - You can disable this in the in-game mod options. - """ + __doc__ = (DeathLink.__doc__ + "\n\n You can disable this or set it to give yourself a trap effect when " + + "another player dies in the in-game mod options.") @dataclass diff --git a/worlds/noita/regions.py b/worlds/noita/regions.py index 184cd96018..55a0ad1fc8 100644 --- a/worlds/noita/regions.py +++ b/worlds/noita/regions.py @@ -1,5 +1,5 @@ # Regions are areas in your game that you travel to. -from typing import Dict, List, TYPE_CHECKING +from typing import TYPE_CHECKING from BaseClasses import Entrance, Region from . import locations @@ -36,28 +36,21 @@ def create_region(world: "NoitaWorld", region_name: str) -> Region: return new_region -def create_regions(world: "NoitaWorld") -> Dict[str, Region]: +def create_regions(world: "NoitaWorld") -> dict[str, Region]: return {name: create_region(world, name) for name in noita_regions} -# An "Entrance" is really just a connection between two regions -def create_entrance(player: int, source: str, destination: str, regions: Dict[str, Region]) -> Entrance: - entrance = Entrance(player, f"From {source} To {destination}", regions[source]) - entrance.connect(regions[destination]) - return entrance - - # Creates connections based on our access mapping in `noita_connections`. -def create_connections(player: int, regions: Dict[str, Region]) -> None: +def create_connections(regions: dict[str, Region]) -> None: for source, destinations in noita_connections.items(): - new_entrances = [create_entrance(player, source, destination, regions) for destination in destinations] - regions[source].exits = new_entrances + for destination in destinations: + regions[source].connect(regions[destination]) # Creates all regions and connections. Called from NoitaWorld. def create_all_regions_and_connections(world: "NoitaWorld") -> None: created_regions = create_regions(world) - create_connections(world.player, created_regions) + create_connections(created_regions) create_all_events(world, created_regions) world.multiworld.regions += created_regions.values() @@ -75,7 +68,7 @@ def create_all_regions_and_connections(world: "NoitaWorld") -> None: # - Lake is connected to The Laboratory, since the bosses are hard without specific set-ups (which means late game) # - Snowy Depths connects to Lava Lake orb since you need digging for it, so fairly early is acceptable # - Ancient Laboratory is connected to the Coal Pits, so that Ylialkemisti isn't sphere 1 -noita_connections: Dict[str, List[str]] = { +noita_connections: dict[str, list[str]] = { "Menu": ["Forest"], "Forest": ["Mines", "Floating Island", "Desert", "Snowy Wasteland"], "Frozen Vault": ["The Vault"], @@ -117,4 +110,4 @@ noita_connections: Dict[str, List[str]] = { ### } -noita_regions: List[str] = sorted(set(noita_connections.keys()).union(*noita_connections.values())) +noita_regions: list[str] = sorted(set(noita_connections.keys()).union(*noita_connections.values())) diff --git a/worlds/noita/rules.py b/worlds/noita/rules.py index 65871a804e..c2c4832488 100644 --- a/worlds/noita/rules.py +++ b/worlds/noita/rules.py @@ -1,6 +1,5 @@ -from typing import List, NamedTuple, Set, TYPE_CHECKING +from typing import NamedTuple, TYPE_CHECKING -from BaseClasses import CollectionState from . import items, locations from .options import BossesAsChecks, VictoryCondition from worlds.generic import Rules as GenericRules @@ -16,7 +15,7 @@ class EntranceLock(NamedTuple): items_needed: int -entrance_locks: List[EntranceLock] = [ +entrance_locks: list[EntranceLock] = [ EntranceLock("Mines", "Coal Pits Holy Mountain", "Portal to Holy Mountain 1", 1), EntranceLock("Coal Pits", "Snowy Depths Holy Mountain", "Portal to Holy Mountain 2", 2), EntranceLock("Snowy Depths", "Hiisi Base Holy Mountain", "Portal to Holy Mountain 3", 3), @@ -27,7 +26,7 @@ entrance_locks: List[EntranceLock] = [ ] -holy_mountain_regions: List[str] = [ +holy_mountain_regions: list[str] = [ "Coal Pits Holy Mountain", "Snowy Depths Holy Mountain", "Hiisi Base Holy Mountain", @@ -38,7 +37,7 @@ holy_mountain_regions: List[str] = [ ] -wand_tiers: List[str] = [ +wand_tiers: list[str] = [ "Wand (Tier 1)", # Coal Pits "Wand (Tier 2)", # Snowy Depths "Wand (Tier 3)", # Hiisi Base @@ -48,29 +47,21 @@ wand_tiers: List[str] = [ ] -items_hidden_from_shops: Set[str] = {"Gold (200)", "Gold (1000)", "Potion", "Random Potion", "Secret Potion", +items_hidden_from_shops: set[str] = {"Gold (200)", "Gold (1000)", "Potion", "Random Potion", "Secret Potion", "Chaos Die", "Greed Die", "Kammi", "Refreshing Gourd", "Sädekivi", "Broken Wand", "Powder Pouch"} -perk_list: List[str] = list(filter(items.item_is_perk, items.item_table.keys())) +perk_list: list[str] = list(filter(lambda item: items.item_table[item].group == "Perks", items.item_table.keys())) # ---------------- -# Helper Functions +# Helper Function # ---------------- -def has_perk_count(state: CollectionState, player: int, amount: int) -> bool: - return sum(state.count(perk, player) for perk in perk_list) >= amount - - -def has_orb_count(state: CollectionState, player: int, amount: int) -> bool: - return state.count("Orb", player) >= amount - - -def forbid_items_at_locations(world: "NoitaWorld", shop_locations: Set[str], forbidden_items: Set[str]) -> None: +def forbid_items_at_locations(world: "NoitaWorld", shop_locations: set[str], forbidden_items: set[str]) -> None: for shop_location in shop_locations: - location = world.multiworld.get_location(shop_location, world.player) + location = world.get_location(shop_location) GenericRules.forbid_items_for_player(location, forbidden_items, world.player) @@ -104,38 +95,38 @@ def ban_early_high_tier_wands(world: "NoitaWorld") -> None: def lock_holy_mountains_into_spheres(world: "NoitaWorld") -> None: for lock in entrance_locks: - location = world.multiworld.get_entrance(f"From {lock.source} To {lock.destination}", world.player) + location = world.get_entrance(f"{lock.source} -> {lock.destination}") GenericRules.set_rule(location, lambda state, evt=lock.event: state.has(evt, world.player)) def holy_mountain_unlock_conditions(world: "NoitaWorld") -> None: victory_condition = world.options.victory_condition.value for lock in entrance_locks: - location = world.multiworld.get_location(lock.event, world.player) + location = world.get_location(lock.event) if victory_condition == VictoryCondition.option_greed_ending: location.access_rule = lambda state, items_needed=lock.items_needed: ( - has_perk_count(state, world.player, items_needed//2) + state.has_group_unique("Perks", world.player, items_needed // 2) ) elif victory_condition == VictoryCondition.option_pure_ending: location.access_rule = lambda state, items_needed=lock.items_needed: ( - has_perk_count(state, world.player, items_needed//2) and - has_orb_count(state, world.player, items_needed) + state.has_group_unique("Perks", world.player, items_needed // 2) and + state.has("Orb", world.player, items_needed) ) elif victory_condition == VictoryCondition.option_peaceful_ending: location.access_rule = lambda state, items_needed=lock.items_needed: ( - has_perk_count(state, world.player, items_needed//2) and - has_orb_count(state, world.player, items_needed * 3) + state.has_group_unique("Perks", world.player, items_needed // 2) and + state.has("Orb", world.player, items_needed * 3) ) def biome_unlock_conditions(world: "NoitaWorld") -> None: - lukki_entrances = world.multiworld.get_region("Lukki Lair", world.player).entrances - magical_entrances = world.multiworld.get_region("Magical Temple", world.player).entrances - wizard_entrances = world.multiworld.get_region("Wizards' Den", world.player).entrances + lukki_entrances = world.get_region("Lukki Lair").entrances + magical_entrances = world.get_region("Magical Temple").entrances + wizard_entrances = world.get_region("Wizards' Den").entrances for entrance in lukki_entrances: - entrance.access_rule = lambda state: state.has("Melee Immunity Perk", world.player) and\ - state.has("All-Seeing Eye Perk", world.player) + entrance.access_rule = lambda state: ( + state.has_all(("Melee Immunity Perk", "All-Seeing Eye Perk"), world.player)) for entrance in magical_entrances: entrance.access_rule = lambda state: state.has("All-Seeing Eye Perk", world.player) for entrance in wizard_entrances: @@ -144,12 +135,12 @@ def biome_unlock_conditions(world: "NoitaWorld") -> None: def victory_unlock_conditions(world: "NoitaWorld") -> None: victory_condition = world.options.victory_condition.value - victory_location = world.multiworld.get_location("Victory", world.player) + victory_location = world.get_location("Victory") if victory_condition == VictoryCondition.option_pure_ending: - victory_location.access_rule = lambda state: has_orb_count(state, world.player, 11) + victory_location.access_rule = lambda state: state.has("Orb", world.player, 11) elif victory_condition == VictoryCondition.option_peaceful_ending: - victory_location.access_rule = lambda state: has_orb_count(state, world.player, 33) + victory_location.access_rule = lambda state: state.has("Orb", world.player, 33) # ---------------- @@ -168,5 +159,5 @@ def create_all_rules(world: "NoitaWorld") -> None: # Prevent the Map perk (used to find Toveri) from being on Toveri (boss) if world.options.bosses_as_checks.value >= BossesAsChecks.option_all_bosses: - toveri = world.multiworld.get_location("Toveri", world.player) + toveri = world.get_location("Toveri") GenericRules.forbid_items_for_player(toveri, {"Spatial Awareness Perk"}, world.player) diff --git a/worlds/oot/Patches.py b/worlds/oot/Patches.py index cd940e052a..db7be3d4dd 100644 --- a/worlds/oot/Patches.py +++ b/worlds/oot/Patches.py @@ -38,6 +38,7 @@ AP_JUNK = 0xD5 class OoTContainer(APPatch): game: str = 'Ocarina of Time' + patch_file_ending = ".apz5" def __init__(self, patch_data: bytes, base_path: str, output_directory: str, player = None, player_name: str = "", server: str = ""): diff --git a/worlds/oot/__init__.py b/worlds/oot/__init__.py index 401c387d5e..d9465f1761 100644 --- a/worlds/oot/__init__.py +++ b/worlds/oot/__init__.py @@ -30,7 +30,6 @@ from .Patches import OoTContainer, patch_rom from .N64Patch import create_patch_file from .Cosmetics import patch_cosmetics -from settings import get_settings from BaseClasses import MultiWorld, CollectionState, Tutorial, LocationProgressType from Options import Range, Toggle, VerifyKeys, Accessibility, PlandoConnections, PlandoItems from Fill import fill_restrictive, fast_fill, FillError @@ -203,7 +202,8 @@ class OOTWorld(World): @classmethod def stage_assert_generate(cls, multiworld: MultiWorld): - rom = Rom(file=get_settings()['oot_options']['rom_file']) + oot_settings = OOTWorld.settings + rom = Rom(file=oot_settings.rom_file) # Option parsing, handling incompatible options, building useful-item table @@ -1089,7 +1089,8 @@ class OOTWorld(World): self.hint_rng = self.random outfile_name = self.multiworld.get_out_file_name_base(self.player) - rom = Rom(file=get_settings()['oot_options']['rom_file']) + oot_settings = OOTWorld.settings + rom = Rom(file=oot_settings.rom_file) try: if self.hints != 'none': buildWorldGossipHints(self) @@ -1323,10 +1324,20 @@ class OOTWorld(World): state.prog_items[self.player][alt_item_name] -= count if state.prog_items[self.player][alt_item_name] < 1: del (state.prog_items[self.player][alt_item_name]) + # invalidate caches, nothing can be trusted anymore now + state.child_reachable_regions[self.player] = set() + state.child_blocked_connections[self.player] = set() + state.adult_reachable_regions[self.player] = set() + state.adult_blocked_connections[self.player] = set() state._oot_stale[self.player] = True return True changed = super().remove(state, item) if changed: + # invalidate caches, nothing can be trusted anymore now + state.child_reachable_regions[self.player] = set() + state.child_blocked_connections[self.player] = set() + state.adult_reachable_regions[self.player] = set() + state.adult_blocked_connections[self.player] = set() state._oot_stale[self.player] = True return changed diff --git a/worlds/oot/docs/setup_de.md b/worlds/oot/docs/setup_de.md index 92c3150a7d..c35dd2769f 100644 --- a/worlds/oot/docs/setup_de.md +++ b/worlds/oot/docs/setup_de.md @@ -7,13 +7,13 @@ Da wir BizHawk benutzen, gilt diese Anleitung nur für Windows und Linux. ## Benötigte Software - BizHawk: [BizHawk Veröffentlichungen von TASVideos](https://tasvideos.org/BizHawk/ReleaseHistory) - - Version 2.3.1 und später werden unterstützt. Version 2.9 ist empfohlen. + - Version 2.3.1 und später werden unterstützt. Version 2.10 ist empfohlen. - Detailierte Installtionsanweisungen für BizHawk können über den obrigen Link gefunden werden. - Windows-Benutzer müssen die Prerequisiten installiert haben. Diese können ebenfalls über den obrigen Link gefunden werden. - Der integrierte Archipelago-Client, welcher [hier](https://github.com/ArchipelagoMW/Archipelago/releases) installiert werden kann. -- Eine `Ocarina of Time v1.0 US(?) ROM`. (Nicht aus Europa und keine Master-Quest oder Debug-Rom!) +- Eine `Ocarina of Time v1.0 US ROM`. (Nicht aus Europa und keine Master-Quest oder Debug-Rom!) ## Konfigurieren von BizHawk diff --git a/worlds/oot/docs/setup_en.md b/worlds/oot/docs/setup_en.md index 553f1820c3..31b7137bd8 100644 --- a/worlds/oot/docs/setup_en.md +++ b/worlds/oot/docs/setup_en.md @@ -7,11 +7,11 @@ As we are using BizHawk, this guide is only applicable to Windows and Linux syst ## Required Software - BizHawk: [BizHawk Releases from TASVideos](https://tasvideos.org/BizHawk/ReleaseHistory) - - Version 2.3.1 and later are supported. Version 2.7 is recommended for stability. + - Version 2.3.1 and later are supported. Version 2.10 is recommended for stability. - Detailed installation instructions for BizHawk can be found at the above link. - Windows users must run the prereq installer first, which can also be found at the above link. - The built-in Archipelago client, which can be installed [here](https://github.com/ArchipelagoMW/Archipelago/releases). -- An Ocarina of Time v1.0 ROM. +- A US Ocarina of Time v1.0 ROM. ## Configuring BizHawk diff --git a/worlds/oot/docs/setup_fr.md b/worlds/oot/docs/setup_fr.md index 40b0e8f571..eb2e97384a 100644 --- a/worlds/oot/docs/setup_fr.md +++ b/worlds/oot/docs/setup_fr.md @@ -7,12 +7,12 @@ Comme nous utilisons BizHawk, ce guide s'applique uniquement aux systèmes Windo ## Logiciel requis - BizHawk : [Sorties BizHawk de TASVideos](https://tasvideos.org/BizHawk/ReleaseHistory) - - Les versions 2.3.1 et ultérieures sont prises en charge. La version 2.7 est recommandée pour des raisons de stabilité. + - Les versions 2.3.1 et ultérieures sont prises en charge. La version 2.10 est recommandée pour des raisons de stabilité. - Des instructions d'installation détaillées pour BizHawk peuvent être trouvées sur le lien ci-dessus. - Les utilisateurs Windows doivent d'abord exécuter le programme d'installation des prérequis, qui peut également être trouvé sur le lien ci-dessus. - Le client Archipelago intégré, qui peut être installé [ici](https://github.com/ArchipelagoMW/Archipelago/releases) (sélectionnez « Ocarina of Time Client » lors de l'installation). -- Une ROM Ocarina of Time v1.0. +- Un fichier ROM v1.0 US d'Ocarina of Time. ## Configuration de BizHawk diff --git a/worlds/osrs/Locations.py b/worlds/osrs/Locations.py index b5827d60f2..324da86be4 100644 --- a/worlds/osrs/Locations.py +++ b/worlds/osrs/Locations.py @@ -3,6 +3,8 @@ import typing from BaseClasses import Location +task_types = ["prayer", "magic", "runecraft", "mining", "crafting", "smithing", "fishing", "cooking", "firemaking", "woodcutting", "combat"] + class SkillRequirement(typing.NamedTuple): skill: str level: int diff --git a/worlds/osrs/LogicCSV/LogicCSVToPython.py b/worlds/osrs/LogicCSV/LogicCSVToPython.py index b66f53cc9d..082bda7a08 100644 --- a/worlds/osrs/LogicCSV/LogicCSVToPython.py +++ b/worlds/osrs/LogicCSV/LogicCSVToPython.py @@ -8,7 +8,7 @@ import requests # The CSVs are updated at this repository to be shared between generator and client. data_repository_address = "https://raw.githubusercontent.com/digiholic/osrs-archipelago-logic/" # The Github tag of the CSVs this was generated with -data_csv_tag = "v2.0.4" +data_csv_tag = "v2.0.5" # If true, generate using file names in the repository debug = False diff --git a/worlds/osrs/LogicCSV/locations_generated.py b/worlds/osrs/LogicCSV/locations_generated.py index 4c1cd0bdd8..03156b1c71 100644 --- a/worlds/osrs/LogicCSV/locations_generated.py +++ b/worlds/osrs/LogicCSV/locations_generated.py @@ -77,7 +77,7 @@ location_rows = [ LocationRow('Bake a Redberry Pie', 'cooking', ['Redberry Bush', 'Wheat', 'Windmill', 'Pie Dish', ], [SkillRequirement('Cooking', 10), ], [], 0), LocationRow('Cook some Stew', 'cooking', ['Bowl', 'Meat', 'Potato', ], [SkillRequirement('Cooking', 25), ], [], 0), LocationRow('Bake an Apple Pie', 'cooking', ['Cooking Apple', 'Wheat', 'Windmill', 'Pie Dish', ], [SkillRequirement('Cooking', 32), ], [], 2), - LocationRow('Enter the Cook\'s Guild', 'cooking', ['Cook\'s Guild', ], [], [], 0), + LocationRow('Enter the Cook\'s Guild', 'cooking', ['Cook\'s Guild', ], [SkillRequirement('Cooking', 32), ], [], 0), LocationRow('Bake a Cake', 'cooking', ['Wheat', 'Windmill', 'Egg', 'Milk', 'Cake Tin', ], [SkillRequirement('Cooking', 40), ], [], 6), LocationRow('Bake a Meat Pizza', 'cooking', ['Wheat', 'Windmill', 'Cheese', 'Tomato', 'Meat', ], [SkillRequirement('Cooking', 45), ], [], 8), LocationRow('Burn a Log', 'firemaking', [], [SkillRequirement('Firemaking', 1), SkillRequirement('Woodcutting', 1), ], [], 0), diff --git a/worlds/osrs/Options.py b/worlds/osrs/Options.py index 55a040b095..cf0754a3c2 100644 --- a/worlds/osrs/Options.py +++ b/worlds/osrs/Options.py @@ -2,7 +2,7 @@ from dataclasses import dataclass from Options import Choice, Toggle, Range, PerGameCommonOptions -MAX_COMBAT_TASKS = 16 +MAX_COMBAT_TASKS = 17 MAX_PRAYER_TASKS = 5 MAX_MAGIC_TASKS = 7 diff --git a/worlds/osrs/Rules.py b/worlds/osrs/Rules.py index 7fd770f0f7..1cdaabe3e2 100644 --- a/worlds/osrs/Rules.py +++ b/worlds/osrs/Rules.py @@ -190,6 +190,8 @@ def get_firemaking_skill_rule(level, player, options) -> CollectionRule: def get_skill_rule(skill, level, player, options) -> CollectionRule: + if level <= 1: + return lambda state: True if skill.lower() == "fishing": return get_fishing_skill_rule(level, player, options) if skill.lower() == "mining": diff --git a/worlds/osrs/__init__.py b/worlds/osrs/__init__.py index 9e439fe52c..e0587daff3 100644 --- a/worlds/osrs/__init__.py +++ b/worlds/osrs/__init__.py @@ -1,11 +1,11 @@ import typing -from BaseClasses import Item, Tutorial, ItemClassification, Region, MultiWorld, CollectionState -from Fill import fill_restrictive, FillError +from BaseClasses import Item, Tutorial, ItemClassification, Region, MultiWorld from worlds.AutoWorld import WebWorld, World +from Options import OptionError from .Items import OSRSItem, starting_area_dict, chunksanity_starting_chunks, QP_Items, ItemRow, \ chunksanity_special_region_names -from .Locations import OSRSLocation, LocationRow +from .Locations import OSRSLocation, LocationRow, task_types from .Rules import * from .Options import OSRSOptions, StartingArea from .Names import LocationNames, ItemNames, RegionNames @@ -25,7 +25,7 @@ class OSRSWeb(WebWorld): "Multiworld Setup Guide", "A guide to setting up the Old School Runescape Randomizer connected to an Archipelago Multiworld", "English", - "docs/setup_en.md", + "setup_en.md", "setup/en", ["digiholic"] ) @@ -47,6 +47,7 @@ class OSRSWorld(World): base_id = 0x070000 data_version = 1 explicit_indirect_conditions = False + ut_can_gen_without_yaml = True item_name_to_id = {item_rows[i].name: 0x070000 + i for i in range(len(item_rows))} location_name_to_id = {location_rows[i].name: 0x070000 + i for i in range(len(location_rows))} @@ -105,6 +106,18 @@ class OSRSWorld(World): # Set Starting Chunk self.multiworld.push_precollected(self.create_item(self.starting_area_item)) + elif hasattr(self.multiworld,"re_gen_passthrough") and self.game in self.multiworld.re_gen_passthrough: + re_gen_passthrough = self.multiworld.re_gen_passthrough[self.game] # UT passthrough + if "starting_area" in re_gen_passthrough: + self.starting_area_item = re_gen_passthrough["starting_area"] + for task_type in task_types: + if f"max_{task_type}_level" in re_gen_passthrough: + getattr(self.options,f"max_{task_type}_level").value = re_gen_passthrough[f"max_{task_type}_level"] + max_count = getattr(self.options,f"max_{task_type}_tasks") + max_count.value = max_count.range_end + self.options.brutal_grinds.value = re_gen_passthrough["brutal_grinds"] + + """ This function pulls from LogicCSVToPython so that it sends the correct tag of the repository to the client. @@ -115,20 +128,13 @@ class OSRSWorld(World): data = self.options.as_dict("brutal_grinds") data["data_csv_tag"] = data_csv_tag data["starting_area"] = str(self.starting_area_item) #these aren't actually strings, they just play them on tv + for task_type in task_types: + data[f"max_{task_type}_level"] = getattr(self.options,f"max_{task_type}_level").value return data - def interpret_slot_data(self, slot_data: typing.Dict[str, typing.Any]) -> None: - if "starting_area" in slot_data: - self.starting_area_item = slot_data["starting_area"] - menu_region = self.multiworld.get_region("Menu",self.player) - menu_region.exits.clear() #prevent making extra exits if players just reconnect to a differnet slot - if self.starting_area_item in chunksanity_special_region_names: - starting_area_region = chunksanity_special_region_names[self.starting_area_item] - else: - starting_area_region = self.starting_area_item[6:] # len("Area: ") - starting_entrance = menu_region.create_exit(f"Start->{starting_area_region}") - starting_entrance.access_rule = lambda state: state.has(self.starting_area_item, self.player) - starting_entrance.connect(self.region_name_to_data[starting_area_region]) + @staticmethod + def interpret_slot_data(slot_data: typing.Dict[str, typing.Any]) -> typing.Dict[str, typing.Any]: + return slot_data def create_regions(self) -> None: """ @@ -195,6 +201,8 @@ class OSRSWorld(World): generation_is_fake = hasattr(self.multiworld, "generation_is_fake") # UT specific override locations_required = 0 for item_row in item_rows: + if item_row.name == self.starting_area_item: + continue #skip starting area # If it's a filler item, set it aside for later if item_row.progression == ItemClassification.filler: continue @@ -206,15 +214,18 @@ class OSRSWorld(World): locations_required += item_row.amount if self.options.enable_duds: locations_required += self.options.dud_count - locations_added = 1 # At this point we've already added the starting area, so we start at 1 instead of 0 - + locations_added = 0 # Keep track of the number of locations we add so we don't add more the number of items we're going to make # Quests are always added first, before anything else is rolled for i, location_row in enumerate(location_rows): - if location_row.category in {"quest", "points", "goal"}: + if location_row.category in {"quest"}: if self.task_within_skill_levels(location_row.skills): self.create_and_add_location(i) - if location_row.category == "quest": - locations_added += 1 + locations_added += 1 + elif location_row.category in {"goal"}: + if not self.task_within_skill_levels(location_row.skills): + raise OptionError(f"Goal location for {self.player_name} not allowed in skill levels") #it doesn't actually have any, but just in case for future + self.create_and_add_location(i) + # Build up the weighted Task Pool rnd = self.random @@ -225,18 +236,28 @@ class OSRSWorld(World): rnd.shuffle(general_tasks) else: general_tasks.reverse() - for i in range(self.options.minimum_general_tasks): + general_tasks_added = 0 + while general_tasks_added0: + task = general_tasks.pop() + if self.task_within_skill_levels(task.skills): + self.add_location(task) + locations_added += 1 + general_tasks_added += 1 + if general_tasks_added < self.options.minimum_general_tasks: + raise OptionError(f"{self.plyaer_name} doesn't have enough general tasks to create required minimum count"+ + f", raise maximum skill levels or lower minimum general tasks") - general_weight = self.options.general_task_weight if len(general_tasks) > 0 else 0 + general_weight = self.options.general_task_weight.value if len(general_tasks) > 0 else 0 tasks_per_task_type: typing.Dict[str, typing.List[LocationRow]] = {} weights_per_task_type: typing.Dict[str, int] = {} - - task_types = ["prayer", "magic", "runecraft", "mining", "crafting", - "smithing", "fishing", "cooking", "firemaking", "woodcutting", "combat"] + for task_type in task_types: max_amount_for_task_type = getattr(self.options, f"max_{task_type}_tasks") tasks_for_this_type = [task for task in self.locations_by_category[task_type] @@ -263,10 +284,13 @@ class OSRSWorld(World): all_weights.append(weights_per_task_type[task_type]) # Even after the initial forced generals, they can still be rolled randomly - if general_weight > 0: + if general_weight > 0 and len(general_tasks)>0: all_tasks.append(general_tasks) all_weights.append(general_weight) + if not generation_is_fake and locations_added > locations_required: #due to minimum general tasks we already have more than needed + raise OptionError(f"Too many locations created for {self.player_name}, lower the minimum general tasks") + while locations_added < locations_required or (generation_is_fake and len(all_tasks) > 0): if all_tasks: chosen_task = rnd.choices(all_tasks, all_weights)[0] @@ -282,9 +306,9 @@ class OSRSWorld(World): del all_tasks[index] del all_weights[index] - else: + else: # We can ignore general tasks in UT because they will have been cleared already if len(general_tasks) == 0: - raise Exception(f"There are not enough available tasks to fill the remaining pool for OSRS " + + raise OptionError(f"There are not enough available tasks to fill the remaining pool for OSRS " + f"Please adjust {self.player_name}'s settings to be less restrictive of tasks.") task = general_tasks.pop() self.add_location(task) @@ -296,7 +320,7 @@ class OSRSWorld(World): self.create_and_add_location(index) def create_items(self) -> None: - filler_items = [] + filler_items:list[ItemRow] = [] for item_row in item_rows: if item_row.name != self.starting_area_item: # If it's a filler item, set it aside for later @@ -321,7 +345,7 @@ class OSRSWorld(World): def get_filler_item_name(self) -> str: if self.options.enable_duds: - return self.random.choice([item for item in item_rows if item.progression == ItemClassification.filler]) + return self.random.choice([item.name for item in item_rows if item.progression == ItemClassification.filler]) else: return self.random.choice([ItemNames.Progressive_Weapons, ItemNames.Progressive_Magic, ItemNames.Progressive_Range_Weapon, ItemNames.Progressive_Armor, @@ -388,6 +412,12 @@ class OSRSWorld(World): # Set the access rule for the QP Location add_rule(qp_loc, lambda state, loc=q_loc: (loc.can_reach(state))) + qp = 0 + for qp_event in self.available_QP_locations: + qp += int(qp_event[0]) + if qp < self.location_rows_by_name[LocationNames.Q_Dragon_Slayer].qp: + raise OptionError(f"{self.player_name} doesn't have enough quests for reach goal, increase maximum skill levels") + # place "Victory" at "Dragon Slayer" and set collection as win condition self.multiworld.get_location(LocationNames.Q_Dragon_Slayer, self.player) \ .place_locked_item(self.create_event("Victory")) diff --git a/worlds/paint/__init__.py b/worlds/paint/__init__.py new file mode 100644 index 0000000000..8e501ff3dc --- /dev/null +++ b/worlds/paint/__init__.py @@ -0,0 +1,128 @@ +from typing import Dict, Any + +from BaseClasses import CollectionState, Item, MultiWorld, Tutorial, Region +from Options import OptionError +from worlds.AutoWorld import LogicMixin, World, WebWorld +from .items import item_table, PaintItem, item_data_table, traps, deathlink_traps +from .locations import location_table, PaintLocation, location_data_table +from .options import PaintOptions + + +class PaintWebWorld(WebWorld): + theme = "partyTime" + + setup_en = Tutorial( + tutorial_name="Start Guide", + description="A guide to playing Paint in Archipelago.", + language="English", + file_name="guide_en.md", + link="guide/en", + authors=["MarioManTAW"] + ) + + tutorials = [setup_en] + + +class PaintWorld(World): + """ + The classic Microsoft app, reimagined as an Archipelago game! Find your tools, expand your canvas, and paint the + greatest image the world has ever seen. + """ + game = "Paint" + options_dataclass = PaintOptions + options: PaintOptions + web = PaintWebWorld() + location_name_to_id = location_table + item_name_to_id = item_table + origin_region_name = "Canvas" + + def generate_early(self) -> None: + if self.options.canvas_size_increment < 50 and self.options.logic_percent <= 55: + if self.multiworld.players == 1: + raise OptionError("Logic Percent must be greater than 55 when generating a single-player world with " + "Canvas Size Increment below 50.") + + def get_filler_item_name(self) -> str: + if self.random.randint(0, 99) >= self.options.trap_count: + return "Additional Palette Color" + elif self.options.death_link: + return self.random.choice(deathlink_traps) + else: + return self.random.choice(traps) + + def create_item(self, name: str) -> PaintItem: + item = PaintItem(name, item_data_table[name].type, item_data_table[name].code, self.player) + return item + + def create_items(self) -> None: + starting_tools = ["Brush", "Pencil", "Eraser/Color Eraser", "Airbrush", "Line", "Rectangle", "Ellipse", + "Rounded Rectangle"] + self.push_precollected(self.create_item("Magnifier")) + self.push_precollected(self.create_item(starting_tools.pop(self.options.starting_tool))) + items_to_create = ["Free-Form Select", "Select", "Fill With Color", "Pick Color", "Text", "Curve", "Polygon"] + items_to_create += starting_tools + items_to_create += ["Progressive Canvas Width"] * (400 // self.options.canvas_size_increment) + items_to_create += ["Progressive Canvas Height"] * (300 // self.options.canvas_size_increment) + depth_items = ["Progressive Color Depth (Red)", "Progressive Color Depth (Green)", + "Progressive Color Depth (Blue)"] + for item in depth_items: + self.push_precollected(self.create_item(item)) + items_to_create += depth_items * 6 + pre_filled = len(items_to_create) + to_fill = len(self.get_region("Canvas").locations) + if pre_filled > to_fill: + raise OptionError(f"{self.player_name}'s Paint world has too few locations for its required items. " + "Consider adding more locations by raising logic percent or adding fractional checks. " + "Alternatively, increasing the canvas size increment will require fewer items.") + while len(items_to_create) < (to_fill - pre_filled) * (self.options.trap_count / 100) + pre_filled: + if self.options.death_link: + items_to_create += [self.random.choice(deathlink_traps)] + else: + items_to_create += [self.random.choice(traps)] + while len(items_to_create) < to_fill: + items_to_create += ["Additional Palette Color"] + self.multiworld.itempool += [self.create_item(item) for item in items_to_create] + + def create_regions(self) -> None: + canvas = Region("Canvas", self.player, self.multiworld) + canvas.locations += [PaintLocation(self.player, loc_name, loc_data.address, canvas) + for loc_name, loc_data in location_data_table.items() + if location_exists_with_options(self, loc_data.address)] + + self.multiworld.regions += [canvas] + + def set_rules(self) -> None: + from .rules import set_completion_rules + set_completion_rules(self, self.player) + + def fill_slot_data(self) -> Dict[str, Any]: + return dict(self.options.as_dict("logic_percent", "goal_percent", "goal_image", "death_link", + "canvas_size_increment"), version="0.5.2") + + def collect(self, state: CollectionState, item: Item) -> bool: + change = super().collect(state, item) + if change: + state.paint_percent_stale[self.player] = True + return change + + def remove(self, state: CollectionState, item: Item) -> bool: + change = super().remove(state, item) + if change: + state.paint_percent_stale[self.player] = True + return change + + +def location_exists_with_options(world: PaintWorld, location: int): + l = location % 198600 + return l <= world.options.logic_percent * 4 and (l % 4 == 0 or + (l > world.options.half_percent_checks * 4 and l % 2 == 0) or + l > world.options.quarter_percent_checks * 4) + + +class PaintState(LogicMixin): + paint_percent_available: dict[int, float] # per player + paint_percent_stale: dict[int, bool] + + def init_mixin(self, multiworld: MultiWorld) -> None: + self.paint_percent_available = {player: 0 for player in multiworld.get_game_players("Paint")} + self.paint_percent_stale = {player: True for player in multiworld.get_game_players("Paint")} diff --git a/worlds/paint/docs/en_Paint.md b/worlds/paint/docs/en_Paint.md new file mode 100644 index 0000000000..845c726848 --- /dev/null +++ b/worlds/paint/docs/en_Paint.md @@ -0,0 +1,35 @@ +# Paint + +## Where is the options page? + +You can read through all the options and generate a YAML [here](../player-options). + +## What does randomization do to this game? + +Most tools are locked from the start, leaving only the Magnifier and one drawing tool, specified in the game options. +Canvas size is locked and will only expand when the Progressive Canvas Width and Progressive Canvas Height items are +obtained. Additionally, color selection is limited, starting with only a few possible colors but gaining more options +when Progressive Color Depth items are obtained in each of the red, green, and blue components. + +Location checks are sent out based on similarity to a target image, measured as a percentage. Every percentage point up +to a maximum set in the game options will send a new check, and the game will be considered done when a certain target +percentage (also set in the game options) is reached. + +## What other changes are made to the game? + +This project is based on [JS Paint](https://jspaint.app), an open-source remake of Microsoft Paint. Most features will +work similarly to this version but some features have also been removed. Most notably, pasting functionality has been +completely removed to prevent cheating. + +With the addition of a second canvas to display the target image, there are some additional features that may not be +intuitive. There are two special functions in the Extras menu to help visualize how to improve your score. Similarity +Mode (shortcut Ctrl+Shift+M) shows the similarity of each portion of the image in grayscale, with white representing +perfect similarity and black representing no similarity. Conversely, Difference Mode (shortcut Ctrl+M) visualizes the +differences between what has been drawn and the target image in full color, showing the direction both hue and +lightness need to shift to match the target. Additionally, once unlocked, the Pick Color tool can be used on both the +main and target canvases. + +Custom colors have been streamlined for Archipelago play. The only starting palette options are black and white, but +additional palette slots can be unlocked as Archipelago items. Double-clicking on any palette slot will allow you to +edit the color in that slot directly and shift-clicking a palette slot will allow you to override the slot with your +currently selected color. diff --git a/worlds/paint/docs/guide_en.md b/worlds/paint/docs/guide_en.md new file mode 100644 index 0000000000..8571ad3d4d --- /dev/null +++ b/worlds/paint/docs/guide_en.md @@ -0,0 +1,8 @@ +# Paint Randomizer Start Guide + +After rolling your seed, go to the [Archipelago Paint](https://mariomantaw.github.io/jspaint/) site and enter the +server details, your slot name, and a room password if one is required. Then click "Connect". If desired, you may then +load a custom target image with File->Open Goal Image. If playing asynchronously, note that progress is saved using the +hash that will appear at the end of the URL so it is recommended to leave the tab open or save the URL with the hash to +avoid losing progress. + diff --git a/worlds/paint/items.py b/worlds/paint/items.py new file mode 100644 index 0000000000..c2ea2001b6 --- /dev/null +++ b/worlds/paint/items.py @@ -0,0 +1,48 @@ +from typing import NamedTuple, Dict + +from BaseClasses import Item, ItemClassification + + +class PaintItem(Item): + game = "Paint" + + +class PaintItemData(NamedTuple): + code: int + type: ItemClassification + + +item_data_table: Dict[str, PaintItemData] = { + "Progressive Canvas Width": PaintItemData(198501, ItemClassification.progression), + "Progressive Canvas Height": PaintItemData(198502, ItemClassification.progression), + "Progressive Color Depth (Red)": PaintItemData(198503, ItemClassification.progression), + "Progressive Color Depth (Green)": PaintItemData(198504, ItemClassification.progression), + "Progressive Color Depth (Blue)": PaintItemData(198505, ItemClassification.progression), + "Free-Form Select": PaintItemData(198506, ItemClassification.useful), + "Select": PaintItemData(198507, ItemClassification.useful), + "Eraser/Color Eraser": PaintItemData(198508, ItemClassification.useful), + "Fill With Color": PaintItemData(198509, ItemClassification.useful), + "Pick Color": PaintItemData(198510, ItemClassification.progression), + "Magnifier": PaintItemData(198511, ItemClassification.useful), + "Pencil": PaintItemData(198512, ItemClassification.useful), + "Brush": PaintItemData(198513, ItemClassification.useful), + "Airbrush": PaintItemData(198514, ItemClassification.useful), + "Text": PaintItemData(198515, ItemClassification.useful), + "Line": PaintItemData(198516, ItemClassification.useful), + "Curve": PaintItemData(198517, ItemClassification.useful), + "Rectangle": PaintItemData(198518, ItemClassification.useful), + "Polygon": PaintItemData(198519, ItemClassification.useful), + "Ellipse": PaintItemData(198520, ItemClassification.useful), + "Rounded Rectangle": PaintItemData(198521, ItemClassification.useful), + # "Change Background Color": PaintItemData(198522, ItemClassification.useful), + "Additional Palette Color": PaintItemData(198523, ItemClassification.filler), + "Undo Trap": PaintItemData(198524, ItemClassification.trap), + "Clear Image Trap": PaintItemData(198525, ItemClassification.trap), + "Invert Colors Trap": PaintItemData(198526, ItemClassification.trap), + "Flip Horizontal Trap": PaintItemData(198527, ItemClassification.trap), + "Flip Vertical Trap": PaintItemData(198528, ItemClassification.trap), +} + +item_table = {name: data.code for name, data in item_data_table.items()} +traps = ["Undo Trap", "Clear Image Trap", "Invert Colors Trap", "Flip Horizontal Trap", "Flip Vertical Trap"] +deathlink_traps = ["Invert Colors Trap", "Flip Horizontal Trap", "Flip Vertical Trap"] diff --git a/worlds/paint/locations.py b/worlds/paint/locations.py new file mode 100644 index 0000000000..ce227991ef --- /dev/null +++ b/worlds/paint/locations.py @@ -0,0 +1,24 @@ +from typing import NamedTuple, Dict + +from BaseClasses import CollectionState, Location + + +class PaintLocation(Location): + game = "Paint" + def access_rule(self, state: CollectionState): + from .rules import paint_percent_available + return paint_percent_available(state, state.multiworld.worlds[self.player], self.player) >=\ + (self.address % 198600) / 4 + + +class PaintLocationData(NamedTuple): + region: str + address: int + + +location_data_table: Dict[str, PaintLocationData] = { + # f"Similarity: {i}%": PaintLocationData("Canvas", 198500 + i) for i in range(1, 96) + f"Similarity: {i/4}%": PaintLocationData("Canvas", 198600 + i) for i in range(1, 381) +} + +location_table = {name: data.address for name, data in location_data_table.items()} diff --git a/worlds/paint/options.py b/worlds/paint/options.py new file mode 100644 index 0000000000..95dee7d8fd --- /dev/null +++ b/worlds/paint/options.py @@ -0,0 +1,107 @@ +from dataclasses import dataclass + +from Options import Range, PerGameCommonOptions, StartInventoryPool, Toggle, Choice, Visibility + + +class LogicPercent(Range): + """Sets the maximum percent similarity required for a check to be in logic. + Higher values are more difficult and items/locations will not be generated beyond this number.""" + display_name = "Logic Percent" + range_start = 50 + range_end = 95 + default = 80 + + +class GoalPercent(Range): + """Sets the percent similarity required to achieve your goal. + If this number is higher than the value for logic percent, + reaching goal will be in logic upon obtaining all progression items.""" + display_name = "Goal Percent" + range_start = 50 + range_end = 95 + default = 80 + + +class HalfPercentChecks(Range): + """Sets the lowest percent at which locations will be created for each 0.5% of similarity. + Below this number, there will be a check every 1%. + Above this number, there will be a check every 0.5%.""" + display_name = "Half Percent Checks" + range_start = 0 + range_end = 95 + default = 50 + + +class QuarterPercentChecks(Range): + """Sets the lowest percent at which locations will be created for each 0.25% of similarity. + This number will override Half Percent Checks if it is lower.""" + display_name = "Quarter Percent Checks" + range_start = 0 + range_end = 95 + default = 70 + + +class CanvasSizeIncrement(Choice): + """Sets the number of pixels the canvas will expand for each width/height item received. + Ensure an adequate number of locations are generated if setting this below 50.""" + display_name = "Canvas Size Increment" + # option_10 = 10 + # option_20 = 20 + option_25 = 25 + option_50 = 50 + option_100 = 100 + default = 100 + + +class GoalImage(Range): + """Sets the numbered image you will be required to match. + See https://github.com/MarioManTAW/jspaint/tree/master/images/archipelago + for a list of possible images or choose random. + This can also be overwritten client-side by using File->Open.""" + display_name = "Goal Image" + range_start = 1 + range_end = 1 + default = 1 + visibility = Visibility.none + + +class StartingTool(Choice): + """Sets which tool (other than Magnifier) you will be able to use from the start.""" + option_brush = 0 + option_pencil = 1 + option_eraser = 2 + option_airbrush = 3 + option_line = 4 + option_rectangle = 5 + option_ellipse = 6 + option_rounded_rectangle = 7 + default = 0 + + +class TrapCount(Range): + """Sets the percentage of filler items to be replaced by random traps.""" + display_name = "Trap Fill Percent" + range_start = 0 + range_end = 100 + default = 0 + + +class DeathLink(Toggle): + """If on, using the Undo or Clear Image functions will send a death to all other players with death link on. + Receiving a death will clear the image and reset the history. + This option also prevents Undo and Clear Image traps from being generated in the item pool.""" + display_name = "Death Link" + + +@dataclass +class PaintOptions(PerGameCommonOptions): + logic_percent: LogicPercent + goal_percent: GoalPercent + half_percent_checks: HalfPercentChecks + quarter_percent_checks: QuarterPercentChecks + canvas_size_increment: CanvasSizeIncrement + goal_image: GoalImage + starting_tool: StartingTool + trap_count: TrapCount + death_link: DeathLink + start_inventory_from_pool: StartInventoryPool diff --git a/worlds/paint/rules.py b/worlds/paint/rules.py new file mode 100644 index 0000000000..1c7844c129 --- /dev/null +++ b/worlds/paint/rules.py @@ -0,0 +1,40 @@ +from math import sqrt + +from BaseClasses import CollectionState +from . import PaintWorld + + +def paint_percent_available(state: CollectionState, world: PaintWorld, player: int) -> bool: + if state.paint_percent_stale[player]: + state.paint_percent_available[player] = calculate_paint_percent_available(state, world, player) + state.paint_percent_stale[player] = False + return state.paint_percent_available[player] + + +def calculate_paint_percent_available(state: CollectionState, world: PaintWorld, player: int) -> float: + p = state.has("Pick Color", player) + r = min(state.count("Progressive Color Depth (Red)", player), 7) + g = min(state.count("Progressive Color Depth (Green)", player), 7) + b = min(state.count("Progressive Color Depth (Blue)", player), 7) + if not p: + r = min(r, 2) + g = min(g, 2) + b = min(b, 2) + w = state.count("Progressive Canvas Width", player) + h = state.count("Progressive Canvas Height", player) + # This code looks a little messy but it's a mathematical formula derived from the similarity calculations in the + # client. The first line calculates the maximum score achievable for a single pixel with the current items in the + # worst possible case. This per-pixel score is then multiplied by the number of pixels currently available (the + # starting canvas is 400x300) over the total number of pixels with everything unlocked (800x600) to get the + # total score achievable assuming the worst possible target image. Finally, this is multiplied by the logic percent + # option which restricts the logic so as to not require pixel perfection. + return ((1 - ((sqrt(((2 ** (7 - r) - 1) ** 2 + (2 ** (7 - g) - 1) ** 2 + (2 ** (7 - b) - 1) ** 2) * 12)) / 765)) * + min(400 + w * world.options.canvas_size_increment, 800) * + min(300 + h * world.options.canvas_size_increment, 600) * + world.options.logic_percent / 480000) + + +def set_completion_rules(world: PaintWorld, player: int) -> None: + world.multiworld.completion_condition[player] = \ + lambda state: (paint_percent_available(state, world, player) >= + min(world.options.logic_percent, world.options.goal_percent)) diff --git a/worlds/pokemon_emerald/__init__.py b/worlds/pokemon_emerald/__init__.py index c1875710ef..4f2c2ef95c 100644 --- a/worlds/pokemon_emerald/__init__.py +++ b/worlds/pokemon_emerald/__init__.py @@ -26,9 +26,14 @@ from .options import (Goal, DarkCavesRequireFlash, HmRequirements, ItemPoolType, from .pokemon import (get_random_move, get_species_id_by_label, randomize_abilities, randomize_learnsets, randomize_legendary_encounters, randomize_misc_pokemon, randomize_starters, randomize_tm_hm_compatibility,randomize_types, randomize_wild_encounters) -from .rom import PokemonEmeraldProcedurePatch, write_tokens +from .rom import PokemonEmeraldProcedurePatch, write_tokens from .util import get_encounter_type_label +# Try adding the Pokemon Gen 3 Adjuster +try: + from worlds._pokemon_gen3_adjuster import __init__ +except: + pass class PokemonEmeraldWebWorld(WebWorld): """ @@ -53,7 +58,7 @@ class PokemonEmeraldWebWorld(WebWorld): "setup/es", ["nachocua"] ) - + setup_sv = Tutorial( "Multivärld Installations Guide", "En guide för att kunna spela Pokémon Emerald med Archipelago.", @@ -63,6 +68,16 @@ class PokemonEmeraldWebWorld(WebWorld): ["Tsukino"] ) + # Add this doc file when the adjuster is merged + adjuster_en = Tutorial( + "Usage Guide", + "A guide to use the Pokemon Gen 3 Adjuster with Pokemon Emerald.", + "English", + "adjuster_en.md", + "adjuster/en", + ["RhenaudTheLukark"] + ) + tutorials = [setup_en, setup_es, setup_sv] option_groups = OPTION_GROUPS diff --git a/worlds/pokemon_emerald/adjuster_constants.py b/worlds/pokemon_emerald/adjuster_constants.py new file mode 100644 index 0000000000..db3eac179d --- /dev/null +++ b/worlds/pokemon_emerald/adjuster_constants.py @@ -0,0 +1,240 @@ +from worlds._pokemon_gen3_adjuster.adjuster_constants import * +from .data import data + +EMERALD_PATCH_EXTENSIONS = ".apemerald" + +EMERALD_POKEMON_SPRITES = ["front_anim", "back", "icon", "footprint"] +EMERALD_POKEMON_MAIN_PALETTE_EXTRACTION_PRIORITY = ["front_anim", "back"] +EMERALD_POKEMON_SHINY_PALETTE_EXTRACTION_PRIORITY = ["sfront_anim", "sback"] +EMERALD_POKEMON_PALETTES = { + "palette": EMERALD_POKEMON_MAIN_PALETTE_EXTRACTION_PRIORITY, + "palette_shiny": EMERALD_POKEMON_SHINY_PALETTE_EXTRACTION_PRIORITY +} + +EMERALD_EGG_SPRITES = [*EMERALD_POKEMON_SPRITES, "hatch_anim"] +EMERALD_EGG_PALETTES = {**EMERALD_POKEMON_PALETTES, "palette_hatch": POKEMON_HATCH_PALETTE_EXTRACTION_PRIORITY} + +EMERALD_TRAINER_FOLDERS = ["Brendan", "May"] +EMERALD_TRAINER_SPRITES = ["walking_running", "acro_bike", "mach_bike", "surfing", "field_move", "underwater", + "fishing", "watering", "decorating", "battle_front", "battle_back"] +EMERALD_TRAINER_MAIN_PALETTE_EXTRACTION_PRIORITY = ["walking_running", "acro_bike", "mach_bike", "surfing", + "field_move", "fishing", "watering", "decorating"] +EMERALD_TRAINER_PALETTES = { + "palette": EMERALD_TRAINER_MAIN_PALETTE_EXTRACTION_PRIORITY, + "palette_reflection": TRAINER_REFLECTION_PALETTE_EXTRACTION_PRIORITY, + "palette_underwater": TRAINER_UNDERWATER_PALETTE_EXTRACTION_PRIORITY, + "palette_battle_back": TRAINER_BATTLE_BACK_PALETTE_EXTRACTION_PRIORITY, + "palette_battle_front": TRAINER_BATTLE_FRONT_PALETTE_EXTRACTION_PRIORITY +} + +EMERALD_SIMPLE_TRAINER_FOLDERS: list[str] = [] + +EMERALD_FOLDER_OBJECT_INFOS: list[dict[str, str | list[str] | dict[str, list[str]]]] = [ + { + "name": "Egg", + "key": "pokemon", + "folders": POKEMON_FOLDERS, + "sprites": EMERALD_EGG_SPRITES, + "palettes": EMERALD_EGG_PALETTES + }, + { + "key": "pokemon", + "folders": POKEMON_FOLDERS, + "sprites": EMERALD_POKEMON_SPRITES, + "palettes": EMERALD_POKEMON_PALETTES + }, + { + "key": "players", + "folders": EMERALD_TRAINER_FOLDERS, + "sprites": EMERALD_TRAINER_SPRITES, + "palettes": EMERALD_TRAINER_PALETTES + }, + { + "key": "trainer", + "folders": EMERALD_SIMPLE_TRAINER_FOLDERS, + "sprites": SIMPLE_TRAINER_SPRITES, + "palettes": SIMPLE_TRAINER_PALETTES + } +] + +EMERALD_INTERNAL_ID_TO_OBJECT_ADDRESS = { + "pokemon_front_anim": ("gMonFrontPicTable", 8, False), + "pokemon_back": ("gMonBackPicTable", 8, False), + "pokemon_icon": ("gMonIconTable", 4, False), + "pokemon_icon_index": ("gMonIconPaletteIndices", 1, False), + "pokemon_footprint": ("gMonFootprintTable", 4, False), + "pokemon_hatch_anim": ("sEggHatchTiles", 0, True), + "pokemon_palette": ("gMonPaletteTable", 8, False), + "pokemon_palette_shiny": ("gMonShinyPaletteTable", 8, False), + "pokemon_palette_hatch": ("sEggPalette", 0, True), + "pokemon_stats": ("gSpeciesInfo", 28, False), + "pokemon_move_pool": ("gLevelUpLearnsets", 4, False), + + "brendan_walking_running": ("gObjectEventGraphicsInfoPointers", 400, False), + "brendan_mach_bike": ("gObjectEventGraphicsInfoPointers", 404, False), + "brendan_acro_bike": ("gObjectEventGraphicsInfoPointers", 408, False), + "brendan_surfing": ("gObjectEventGraphicsInfoPointers", 412, False), + "brendan_field_move": ("gObjectEventGraphicsInfoPointers", 416, False), + "brendan_underwater": ("gObjectEventGraphicsInfoPointers", 444, False), + "brendan_fishing": ("gObjectEventGraphicsInfoPointers", 548, False), + "brendan_watering": ("gObjectEventGraphicsInfoPointers", 764, False), + "brendan_decorating": ("gObjectEventGraphicsInfoPointers", 772, False), + "brendan_battle_front": ("gTrainerFrontPicTable", 568, False), + "brendan_battle_back": ("gTrainerBackPicTable", 0, False), + "brendan_battle_back_throw": ("sTrainerBackSpriteTemplates", 0, False), + "brendan_palette": ("sObjectEventSpritePalettes", 64, False), + "brendan_palette_reflection": ("sObjectEventSpritePalettes", 72, False), + "brendan_palette_underwater": ("sObjectEventSpritePalettes", 88, False), + "brendan_palette_battle_back": ("gTrainerBackPicPaletteTable", 0, False), + "brendan_palette_battle_front": ("gTrainerFrontPicPaletteTable", 568, False), + + "may_walking_running": ("gObjectEventGraphicsInfoPointers", 420, False), + "may_mach_bike": ("gObjectEventGraphicsInfoPointers", 424, False), + "may_acro_bike": ("gObjectEventGraphicsInfoPointers", 428, False), + "may_surfing": ("gObjectEventGraphicsInfoPointers", 432, False), + "may_field_move": ("gObjectEventGraphicsInfoPointers", 436, False), + "may_underwater": ("gObjectEventGraphicsInfoPointers", 448, False), + "may_fishing": ("gObjectEventGraphicsInfoPointers", 552, False), + "may_watering": ("gObjectEventGraphicsInfoPointers", 768, False), + "may_decorating": ("gObjectEventGraphicsInfoPointers", 776, False), + "may_battle_front": ("gTrainerFrontPicTable", 576, False), + "may_battle_back": ("gTrainerBackPicTable", 8, False), + "may_battle_back_throw": ("sTrainerBackSpriteTemplates", 24, False), + "may_palette": ("sObjectEventSpritePalettes", 136, False), + "may_palette_reflection": ("sObjectEventSpritePalettes", 144, False), + "may_palette_underwater": ("sObjectEventSpritePalettes", 88, False), + "may_palette_battle_back": ("gTrainerBackPicPaletteTable", 8, False), + "may_palette_battle_front": ("gTrainerFrontPicPaletteTable", 576, False), + + "brendan_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 0, False), + "may_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 4, False), + "emerald_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 0, True), + "frlg_battle_throw_anim": ("gTrainerBackAnimsPtrTable", 8, True), +} + +EMERALD_OVERWORLD_SPRITE_ADDRESSES = { + "brendan_walking_running": [0, 400, 864], + "brendan_mach_bike": [4, 404], + "brendan_acro_bike": [252, 408], + "brendan_surfing": [8, 412], + "brendan_field_move": [12, 416], + "brendan_underwater": [444], + "brendan_fishing": [548], + "brendan_watering": [764], + "brendan_decorating": [772], + "may_walking_running": [356, 420, 868], + "may_mach_bike": [360, 424], + "may_acro_bike": [364, 428], + "may_surfing": [368, 432], + "may_field_move": [372, 436], + "may_underwater": [448], + "may_fishing": [552], + "may_watering": [768], + "may_decorating": [776], +} + +EMERALD_POINTER_REFERENCES = { + "overworld_palette_table": [("LoadObjectEventPalette", 40), ("PatchObjectPalette", 52), + ("FindObjectEventPaletteIndexByTag", 40)] +} + +EMERALD_OVERWORLD_PALETTE_IDS = { + "Brendan": 0x1100, + "May": 0x1110, + "Underwater": 0x1115 +} + +EMERALD_DATA_ADDRESSES_ORIGINAL = { + "LoadObjectEventPalette": 0x08e894, + "PatchObjectPalette": 0x08e91c, + "FindObjectEventPaletteIndexByTag": 0x08e980, + "gSpeciesInfo": 0x3203cc, + "gLevelUpLearnsets": 0x32937c, + "gMonFrontPicTable": 0x30a18c, + "gMonBackPicTable": 0x3028b8, + "gMonIconTable": 0x57bca8, + "gMonFootprintTable": 0x56e694, + "gMonPaletteTable": 0x303678, + "gMonShinyPaletteTable": 0x304438, + "gMonIconPaletteIndices": 0x57c388, + "sEggPalette": 0x32b70c, + "sEggHatchTiles": 0x32b72c, + "gObjectEventGraphicsInfoPointers": 0x505620, + "sObjectEventSpritePalettes": 0x50bbc8, + "gTrainerFrontPicTable": 0x305654, + "gTrainerFrontPicPaletteTable": 0x30593c, + "gTrainerBackPicTable": 0x305d4c, + "gTrainerBackPicPaletteTable": 0x305d8c, + "sTrainerBackSpriteTemplates": 0x329df8, + "gTrainerBackAnimsPtrTable": 0x305d0c, + "sBackAnims_Brendan": 0x305ccc, + "sBackAnims_Red": 0x305cdc, + "gObjectEventBaseOam_16x16": 0x5094fc, + "gObjectEventBaseOam_16x32": 0x509514, + "gObjectEventBaseOam_32x32": 0x50951c, + "sOamTables_16x16": 0x50954c, + "sOamTables_16x32": 0x5095a0, + "sOamTables_32x32": 0x5095f4, + "sEmpty6": 0xe3cf31 +} + +EMERALD_DATA_ADDRESS_BEGINNING = 0x00 +EMERALD_DATA_ADDRESS_END = 0xFFFFFF + +EMERALD_DATA_ADDRESS_INFOS: dict[str, int | dict[str, int]] = { + "Emerald": { + "crc32": 0x1f1c08fb, + "original_addresses": EMERALD_DATA_ADDRESSES_ORIGINAL, + "ap_addresses": data.rom_addresses, + "data_address_beginning": EMERALD_DATA_ADDRESS_BEGINNING, + "data_address_end": EMERALD_DATA_ADDRESS_END + } +} + +EMERALD_VALID_OVERWORLD_SPRITE_SIZES: list[dict[str, int | str]] = [ + {"width": 16, "height": 16, "data": "sOamTables_16x16", "distrib": "gObjectEventBaseOam_16x16"}, + {"width": 16, "height": 32, "data": "sOamTables_16x32", "distrib": "gObjectEventBaseOam_16x32"}, + {"width": 32, "height": 32, "data": "sOamTables_32x32", "distrib": "gObjectEventBaseOam_32x32"}, +] + +EMERALD_SPRITES_REQUIREMENTS: dict[str, dict[str, bool | int | list[int]]] = { + "pokemon_front_anim": {"frames": 2, "width": 64, "height": 64}, + "pokemon_back": {"frames": 1, "width": 64, "height": 64}, + "pokemon_icon": {"frames": 2, "width": 32, "height": 32, "palette": VALID_ICON_PALETTES}, + "pokemon_footprint": {"frames": 1, "width": 16, "height": 16, "palette_size": 2, + "palette": VALID_FOOTPRINT_PALETTE}, + "pokemon_hatch_anim": {"frames": 1, "width": 32, "height": 136}, + "players_walking_running": {"frames": 18, "width": 16, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_reflection": {"frames": 18, "width": 16, "height": 32, "palette": []}, + "players_mach_bike": {"frames": 9, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_acro_bike": {"frames": 27, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_surfing": {"frames": 12, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_field_move": {"frames": 5, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_underwater": {"frames": 9, "width": 32, "height": 32, + "palette": VALID_OVERWORLD_UNDERWATER_PALETTE}, + "players_fishing": {"frames": 12, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_watering": {"frames": 9, "width": 32, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_decorating": {"frames": 1, "width": 16, "height": 32, "palette": VALID_OVERWORLD_PALETTE}, + "players_battle_front": {"frames": 1, "width": 64, "height": 64}, + "players_battle_back": {"frames": [4, 5], "width": 64, "height": 64}, + "players_battle_back_throw": {"frames": [4, 5], "width": 64, "height": 64}, + "trainer_walking": {"frames": 9, "width": 16, "height": 32, "palette": VALID_WEAK_OVERWORLD_PALETTE}, + "trainer_battle_front": {"frames": 1, "width": 64, "height": 64}, +} + +EMERALD_SPRITES_REQUIREMENTS_EXCEPTIONS: dict[str, dict[str, dict[str, bool | int | list[int]]]] = { + "Castform": { + "pokemon_front_anim": {"frames": 4, "palette_size": 16, "palettes": 4, "palette_per_frame": True}, + "pokemon_back": {"frames": 4, "palette_size": 16, "palettes": 4, "palette_per_frame": True}, + }, + "Deoxys": { + "pokemon_back": {"frames": 2}, + "pokemon_icon": {"frames": 4}, + }, + "Unown A": { + "pokemon_front_anim": {"palette": VALID_UNOWN_PALETTE}, + "pokemon_back": {"palette": VALID_UNOWN_PALETTE}, + "pokemon_sfront_anim": {"palette": VALID_UNOWN_SHINY_PALETTE}, + "pokemon_sback": {"palette": VALID_UNOWN_SHINY_PALETTE}, + } +} \ No newline at end of file diff --git a/worlds/pokemon_emerald/archipelago.json b/worlds/pokemon_emerald/archipelago.json new file mode 100644 index 0000000000..ed11b8d8cc --- /dev/null +++ b/worlds/pokemon_emerald/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "Pokemon Emerald", + "world_version": "2.4.1", + "minimum_ap_version": "0.6.1", + "authors": ["Zunawe"] +} diff --git a/worlds/pokemon_emerald/data/extracted_data.json b/worlds/pokemon_emerald/data/extracted_data.json index f270637481..def6338bc9 100644 --- a/worlds/pokemon_emerald/data/extracted_data.json +++ b/worlds/pokemon_emerald/data/extracted_data.json @@ -1 +1 @@ -{"_comment":"DO NOT MODIFY. This file was auto-generated. Your changes will likely be overwritten.","_rom_name":"pokemon emerald version / AP 5","constants":{"ABILITIES_COUNT":78,"ABILITY_AIR_LOCK":77,"ABILITY_ARENA_TRAP":71,"ABILITY_BATTLE_ARMOR":4,"ABILITY_BLAZE":66,"ABILITY_CACOPHONY":76,"ABILITY_CHLOROPHYLL":34,"ABILITY_CLEAR_BODY":29,"ABILITY_CLOUD_NINE":13,"ABILITY_COLOR_CHANGE":16,"ABILITY_COMPOUND_EYES":14,"ABILITY_CUTE_CHARM":56,"ABILITY_DAMP":6,"ABILITY_DRIZZLE":2,"ABILITY_DROUGHT":70,"ABILITY_EARLY_BIRD":48,"ABILITY_EFFECT_SPORE":27,"ABILITY_FLAME_BODY":49,"ABILITY_FLASH_FIRE":18,"ABILITY_FORECAST":59,"ABILITY_GUTS":62,"ABILITY_HUGE_POWER":37,"ABILITY_HUSTLE":55,"ABILITY_HYPER_CUTTER":52,"ABILITY_ILLUMINATE":35,"ABILITY_IMMUNITY":17,"ABILITY_INNER_FOCUS":39,"ABILITY_INSOMNIA":15,"ABILITY_INTIMIDATE":22,"ABILITY_KEEN_EYE":51,"ABILITY_LEVITATE":26,"ABILITY_LIGHTNING_ROD":31,"ABILITY_LIMBER":7,"ABILITY_LIQUID_OOZE":64,"ABILITY_MAGMA_ARMOR":40,"ABILITY_MAGNET_PULL":42,"ABILITY_MARVEL_SCALE":63,"ABILITY_MINUS":58,"ABILITY_NATURAL_CURE":30,"ABILITY_NONE":0,"ABILITY_OBLIVIOUS":12,"ABILITY_OVERGROW":65,"ABILITY_OWN_TEMPO":20,"ABILITY_PICKUP":53,"ABILITY_PLUS":57,"ABILITY_POISON_POINT":38,"ABILITY_PRESSURE":46,"ABILITY_PURE_POWER":74,"ABILITY_RAIN_DISH":44,"ABILITY_ROCK_HEAD":69,"ABILITY_ROUGH_SKIN":24,"ABILITY_RUN_AWAY":50,"ABILITY_SAND_STREAM":45,"ABILITY_SAND_VEIL":8,"ABILITY_SERENE_GRACE":32,"ABILITY_SHADOW_TAG":23,"ABILITY_SHED_SKIN":61,"ABILITY_SHELL_ARMOR":75,"ABILITY_SHIELD_DUST":19,"ABILITY_SOUNDPROOF":43,"ABILITY_SPEED_BOOST":3,"ABILITY_STATIC":9,"ABILITY_STENCH":1,"ABILITY_STICKY_HOLD":60,"ABILITY_STURDY":5,"ABILITY_SUCTION_CUPS":21,"ABILITY_SWARM":68,"ABILITY_SWIFT_SWIM":33,"ABILITY_SYNCHRONIZE":28,"ABILITY_THICK_FAT":47,"ABILITY_TORRENT":67,"ABILITY_TRACE":36,"ABILITY_TRUANT":54,"ABILITY_VITAL_SPIRIT":72,"ABILITY_VOLT_ABSORB":10,"ABILITY_WATER_ABSORB":11,"ABILITY_WATER_VEIL":41,"ABILITY_WHITE_SMOKE":73,"ABILITY_WONDER_GUARD":25,"ACRO_BIKE":1,"BAG_ITEM_CAPACITY_DIGITS":2,"BERRY_CAPACITY_DIGITS":3,"BERRY_FIRMNESS_HARD":3,"BERRY_FIRMNESS_SOFT":2,"BERRY_FIRMNESS_SUPER_HARD":5,"BERRY_FIRMNESS_UNKNOWN":0,"BERRY_FIRMNESS_VERY_HARD":4,"BERRY_FIRMNESS_VERY_SOFT":1,"BERRY_NONE":0,"BERRY_STAGE_BERRIES":5,"BERRY_STAGE_FLOWERING":4,"BERRY_STAGE_NO_BERRY":0,"BERRY_STAGE_PLANTED":1,"BERRY_STAGE_SPARKLING":255,"BERRY_STAGE_SPROUTED":2,"BERRY_STAGE_TALLER":3,"BERRY_TREES_COUNT":128,"BERRY_TREE_ROUTE_102_ORAN":2,"BERRY_TREE_ROUTE_102_PECHA":1,"BERRY_TREE_ROUTE_103_CHERI_1":5,"BERRY_TREE_ROUTE_103_CHERI_2":7,"BERRY_TREE_ROUTE_103_LEPPA":6,"BERRY_TREE_ROUTE_104_CHERI_1":8,"BERRY_TREE_ROUTE_104_CHERI_2":76,"BERRY_TREE_ROUTE_104_LEPPA":10,"BERRY_TREE_ROUTE_104_ORAN_1":4,"BERRY_TREE_ROUTE_104_ORAN_2":11,"BERRY_TREE_ROUTE_104_PECHA":13,"BERRY_TREE_ROUTE_104_SOIL_1":3,"BERRY_TREE_ROUTE_104_SOIL_2":9,"BERRY_TREE_ROUTE_104_SOIL_3":12,"BERRY_TREE_ROUTE_104_SOIL_4":75,"BERRY_TREE_ROUTE_110_NANAB_1":16,"BERRY_TREE_ROUTE_110_NANAB_2":17,"BERRY_TREE_ROUTE_110_NANAB_3":18,"BERRY_TREE_ROUTE_111_ORAN_1":80,"BERRY_TREE_ROUTE_111_ORAN_2":81,"BERRY_TREE_ROUTE_111_RAZZ_1":19,"BERRY_TREE_ROUTE_111_RAZZ_2":20,"BERRY_TREE_ROUTE_112_PECHA_1":22,"BERRY_TREE_ROUTE_112_PECHA_2":23,"BERRY_TREE_ROUTE_112_RAWST_1":21,"BERRY_TREE_ROUTE_112_RAWST_2":24,"BERRY_TREE_ROUTE_114_PERSIM_1":68,"BERRY_TREE_ROUTE_114_PERSIM_2":77,"BERRY_TREE_ROUTE_114_PERSIM_3":78,"BERRY_TREE_ROUTE_115_BLUK_1":55,"BERRY_TREE_ROUTE_115_BLUK_2":56,"BERRY_TREE_ROUTE_115_KELPSY_1":69,"BERRY_TREE_ROUTE_115_KELPSY_2":70,"BERRY_TREE_ROUTE_115_KELPSY_3":71,"BERRY_TREE_ROUTE_116_CHESTO_1":26,"BERRY_TREE_ROUTE_116_CHESTO_2":66,"BERRY_TREE_ROUTE_116_PINAP_1":25,"BERRY_TREE_ROUTE_116_PINAP_2":67,"BERRY_TREE_ROUTE_117_WEPEAR_1":27,"BERRY_TREE_ROUTE_117_WEPEAR_2":28,"BERRY_TREE_ROUTE_117_WEPEAR_3":29,"BERRY_TREE_ROUTE_118_SITRUS_1":31,"BERRY_TREE_ROUTE_118_SITRUS_2":33,"BERRY_TREE_ROUTE_118_SOIL":32,"BERRY_TREE_ROUTE_119_HONDEW_1":83,"BERRY_TREE_ROUTE_119_HONDEW_2":84,"BERRY_TREE_ROUTE_119_LEPPA":86,"BERRY_TREE_ROUTE_119_POMEG_1":34,"BERRY_TREE_ROUTE_119_POMEG_2":35,"BERRY_TREE_ROUTE_119_POMEG_3":36,"BERRY_TREE_ROUTE_119_SITRUS":85,"BERRY_TREE_ROUTE_120_ASPEAR_1":37,"BERRY_TREE_ROUTE_120_ASPEAR_2":38,"BERRY_TREE_ROUTE_120_ASPEAR_3":39,"BERRY_TREE_ROUTE_120_NANAB":44,"BERRY_TREE_ROUTE_120_PECHA_1":40,"BERRY_TREE_ROUTE_120_PECHA_2":41,"BERRY_TREE_ROUTE_120_PECHA_3":42,"BERRY_TREE_ROUTE_120_PINAP":45,"BERRY_TREE_ROUTE_120_RAZZ":43,"BERRY_TREE_ROUTE_120_WEPEAR":46,"BERRY_TREE_ROUTE_121_ASPEAR":48,"BERRY_TREE_ROUTE_121_CHESTO":50,"BERRY_TREE_ROUTE_121_NANAB_1":52,"BERRY_TREE_ROUTE_121_NANAB_2":53,"BERRY_TREE_ROUTE_121_PERSIM":47,"BERRY_TREE_ROUTE_121_RAWST":49,"BERRY_TREE_ROUTE_121_SOIL_1":51,"BERRY_TREE_ROUTE_121_SOIL_2":54,"BERRY_TREE_ROUTE_123_GREPA_1":60,"BERRY_TREE_ROUTE_123_GREPA_2":61,"BERRY_TREE_ROUTE_123_GREPA_3":65,"BERRY_TREE_ROUTE_123_GREPA_4":72,"BERRY_TREE_ROUTE_123_LEPPA_1":62,"BERRY_TREE_ROUTE_123_LEPPA_2":64,"BERRY_TREE_ROUTE_123_PECHA":87,"BERRY_TREE_ROUTE_123_POMEG_1":15,"BERRY_TREE_ROUTE_123_POMEG_2":30,"BERRY_TREE_ROUTE_123_POMEG_3":58,"BERRY_TREE_ROUTE_123_POMEG_4":59,"BERRY_TREE_ROUTE_123_QUALOT_1":14,"BERRY_TREE_ROUTE_123_QUALOT_2":73,"BERRY_TREE_ROUTE_123_QUALOT_3":74,"BERRY_TREE_ROUTE_123_QUALOT_4":79,"BERRY_TREE_ROUTE_123_RAWST":57,"BERRY_TREE_ROUTE_123_SITRUS":88,"BERRY_TREE_ROUTE_123_SOIL":63,"BERRY_TREE_ROUTE_130_LIECHI":82,"DAILY_FLAGS_END":2399,"DAILY_FLAGS_START":2336,"FIRST_BALL":1,"FIRST_BERRY_INDEX":133,"FIRST_BERRY_MASTER_BERRY":153,"FIRST_BERRY_MASTER_WIFE_BERRY":133,"FIRST_KIRI_BERRY":153,"FIRST_MAIL_INDEX":121,"FIRST_ROUTE_114_MAN_BERRY":148,"FLAGS_COUNT":2400,"FLAG_ADDED_MATCH_CALL_TO_POKENAV":304,"FLAG_ADVENTURE_STARTED":116,"FLAG_ARRIVED_AT_MARINE_CAVE_EMERGE_SPOT":2265,"FLAG_ARRIVED_AT_NAVEL_ROCK":2273,"FLAG_ARRIVED_AT_TERRA_CAVE_ENTRANCE":2266,"FLAG_ARRIVED_ON_FARAWAY_ISLAND":2264,"FLAG_BADGE01_GET":2151,"FLAG_BADGE02_GET":2152,"FLAG_BADGE03_GET":2153,"FLAG_BADGE04_GET":2154,"FLAG_BADGE05_GET":2155,"FLAG_BADGE06_GET":2156,"FLAG_BADGE07_GET":2157,"FLAG_BADGE08_GET":2158,"FLAG_BATTLE_FRONTIER_TRADE_DONE":156,"FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS":313,"FLAG_BEAUTY_PAINTING_MADE":161,"FLAG_BERRY_MASTERS_WIFE":1197,"FLAG_BERRY_MASTER_RECEIVED_BERRY_1":1195,"FLAG_BERRY_MASTER_RECEIVED_BERRY_2":1196,"FLAG_BERRY_TREES_START":612,"FLAG_BERRY_TREE_01":612,"FLAG_BERRY_TREE_02":613,"FLAG_BERRY_TREE_03":614,"FLAG_BERRY_TREE_04":615,"FLAG_BERRY_TREE_05":616,"FLAG_BERRY_TREE_06":617,"FLAG_BERRY_TREE_07":618,"FLAG_BERRY_TREE_08":619,"FLAG_BERRY_TREE_09":620,"FLAG_BERRY_TREE_10":621,"FLAG_BERRY_TREE_11":622,"FLAG_BERRY_TREE_12":623,"FLAG_BERRY_TREE_13":624,"FLAG_BERRY_TREE_14":625,"FLAG_BERRY_TREE_15":626,"FLAG_BERRY_TREE_16":627,"FLAG_BERRY_TREE_17":628,"FLAG_BERRY_TREE_18":629,"FLAG_BERRY_TREE_19":630,"FLAG_BERRY_TREE_20":631,"FLAG_BERRY_TREE_21":632,"FLAG_BERRY_TREE_22":633,"FLAG_BERRY_TREE_23":634,"FLAG_BERRY_TREE_24":635,"FLAG_BERRY_TREE_25":636,"FLAG_BERRY_TREE_26":637,"FLAG_BERRY_TREE_27":638,"FLAG_BERRY_TREE_28":639,"FLAG_BERRY_TREE_29":640,"FLAG_BERRY_TREE_30":641,"FLAG_BERRY_TREE_31":642,"FLAG_BERRY_TREE_32":643,"FLAG_BERRY_TREE_33":644,"FLAG_BERRY_TREE_34":645,"FLAG_BERRY_TREE_35":646,"FLAG_BERRY_TREE_36":647,"FLAG_BERRY_TREE_37":648,"FLAG_BERRY_TREE_38":649,"FLAG_BERRY_TREE_39":650,"FLAG_BERRY_TREE_40":651,"FLAG_BERRY_TREE_41":652,"FLAG_BERRY_TREE_42":653,"FLAG_BERRY_TREE_43":654,"FLAG_BERRY_TREE_44":655,"FLAG_BERRY_TREE_45":656,"FLAG_BERRY_TREE_46":657,"FLAG_BERRY_TREE_47":658,"FLAG_BERRY_TREE_48":659,"FLAG_BERRY_TREE_49":660,"FLAG_BERRY_TREE_50":661,"FLAG_BERRY_TREE_51":662,"FLAG_BERRY_TREE_52":663,"FLAG_BERRY_TREE_53":664,"FLAG_BERRY_TREE_54":665,"FLAG_BERRY_TREE_55":666,"FLAG_BERRY_TREE_56":667,"FLAG_BERRY_TREE_57":668,"FLAG_BERRY_TREE_58":669,"FLAG_BERRY_TREE_59":670,"FLAG_BERRY_TREE_60":671,"FLAG_BERRY_TREE_61":672,"FLAG_BERRY_TREE_62":673,"FLAG_BERRY_TREE_63":674,"FLAG_BERRY_TREE_64":675,"FLAG_BERRY_TREE_65":676,"FLAG_BERRY_TREE_66":677,"FLAG_BERRY_TREE_67":678,"FLAG_BERRY_TREE_68":679,"FLAG_BERRY_TREE_69":680,"FLAG_BERRY_TREE_70":681,"FLAG_BERRY_TREE_71":682,"FLAG_BERRY_TREE_72":683,"FLAG_BERRY_TREE_73":684,"FLAG_BERRY_TREE_74":685,"FLAG_BERRY_TREE_75":686,"FLAG_BERRY_TREE_76":687,"FLAG_BERRY_TREE_77":688,"FLAG_BERRY_TREE_78":689,"FLAG_BERRY_TREE_79":690,"FLAG_BERRY_TREE_80":691,"FLAG_BERRY_TREE_81":692,"FLAG_BERRY_TREE_82":693,"FLAG_BERRY_TREE_83":694,"FLAG_BERRY_TREE_84":695,"FLAG_BERRY_TREE_85":696,"FLAG_BERRY_TREE_86":697,"FLAG_BERRY_TREE_87":698,"FLAG_BERRY_TREE_88":699,"FLAG_BETTER_SHOPS_ENABLED":206,"FLAG_BIRCH_AIDE_MET":88,"FLAG_CANCEL_BATTLE_ROOM_CHALLENGE":119,"FLAG_CAUGHT_DEOXYS":429,"FLAG_CAUGHT_GROUDON":480,"FLAG_CAUGHT_HO_OH":146,"FLAG_CAUGHT_KYOGRE":479,"FLAG_CAUGHT_LATIAS":457,"FLAG_CAUGHT_LATIOS":482,"FLAG_CAUGHT_LUGIA":145,"FLAG_CAUGHT_MEW":458,"FLAG_CAUGHT_RAYQUAZA":478,"FLAG_CAUGHT_REGICE":427,"FLAG_CAUGHT_REGIROCK":426,"FLAG_CAUGHT_REGISTEEL":483,"FLAG_CHOSEN_MULTI_BATTLE_NPC_PARTNER":338,"FLAG_CHOSE_CLAW_FOSSIL":336,"FLAG_CHOSE_ROOT_FOSSIL":335,"FLAG_COLLECTED_ALL_GOLD_SYMBOLS":466,"FLAG_COLLECTED_ALL_SILVER_SYMBOLS":92,"FLAG_CONTEST_SKETCH_CREATED":270,"FLAG_COOL_PAINTING_MADE":160,"FLAG_CUTE_PAINTING_MADE":162,"FLAG_DAILY_APPRENTICE_LEAVES":2356,"FLAG_DAILY_BERRY_MASTERS_WIFE":2353,"FLAG_DAILY_BERRY_MASTER_RECEIVED_BERRY":2349,"FLAG_DAILY_CONTEST_LOBBY_RECEIVED_BERRY":2337,"FLAG_DAILY_FLOWER_SHOP_RECEIVED_BERRY":2352,"FLAG_DAILY_LILYCOVE_RECEIVED_BERRY":2351,"FLAG_DAILY_PICKED_LOTO_TICKET":2346,"FLAG_DAILY_ROUTE_111_RECEIVED_BERRY":2348,"FLAG_DAILY_ROUTE_114_RECEIVED_BERRY":2347,"FLAG_DAILY_ROUTE_120_RECEIVED_BERRY":2350,"FLAG_DAILY_SECRET_BASE":2338,"FLAG_DAILY_SOOTOPOLIS_RECEIVED_BERRY":2354,"FLAG_DECLINED_BIKE":89,"FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE":286,"FLAG_DECLINED_WALLY_BATTLE_MAUVILLE":284,"FLAG_DECORATION_1":174,"FLAG_DECORATION_10":183,"FLAG_DECORATION_11":184,"FLAG_DECORATION_12":185,"FLAG_DECORATION_13":186,"FLAG_DECORATION_14":187,"FLAG_DECORATION_2":175,"FLAG_DECORATION_3":176,"FLAG_DECORATION_4":177,"FLAG_DECORATION_5":178,"FLAG_DECORATION_6":179,"FLAG_DECORATION_7":180,"FLAG_DECORATION_8":181,"FLAG_DECORATION_9":182,"FLAG_DEFEATED_DEOXYS":428,"FLAG_DEFEATED_DEWFORD_GYM":1265,"FLAG_DEFEATED_ELECTRODE_1_AQUA_HIDEOUT":452,"FLAG_DEFEATED_ELECTRODE_2_AQUA_HIDEOUT":453,"FLAG_DEFEATED_ELITE_4_DRAKE":1278,"FLAG_DEFEATED_ELITE_4_GLACIA":1277,"FLAG_DEFEATED_ELITE_4_PHOEBE":1276,"FLAG_DEFEATED_ELITE_4_SIDNEY":1275,"FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY":139,"FLAG_DEFEATED_FORTREE_GYM":1269,"FLAG_DEFEATED_GROUDON":447,"FLAG_DEFEATED_GRUNT_SPACE_CENTER_1F":191,"FLAG_DEFEATED_HO_OH":476,"FLAG_DEFEATED_KECLEON_1_ROUTE_119":989,"FLAG_DEFEATED_KECLEON_1_ROUTE_120":982,"FLAG_DEFEATED_KECLEON_2_ROUTE_119":990,"FLAG_DEFEATED_KECLEON_2_ROUTE_120":985,"FLAG_DEFEATED_KECLEON_3_ROUTE_120":986,"FLAG_DEFEATED_KECLEON_4_ROUTE_120":987,"FLAG_DEFEATED_KECLEON_5_ROUTE_120":988,"FLAG_DEFEATED_KEKLEON_ROUTE_120_BRIDGE":970,"FLAG_DEFEATED_KYOGRE":446,"FLAG_DEFEATED_LATIAS":456,"FLAG_DEFEATED_LATIOS":481,"FLAG_DEFEATED_LAVARIDGE_GYM":1267,"FLAG_DEFEATED_LUGIA":477,"FLAG_DEFEATED_MAGMA_SPACE_CENTER":117,"FLAG_DEFEATED_MAUVILLE_GYM":1266,"FLAG_DEFEATED_METEOR_FALLS_STEVEN":1272,"FLAG_DEFEATED_MEW":455,"FLAG_DEFEATED_MOSSDEEP_GYM":1270,"FLAG_DEFEATED_PETALBURG_GYM":1268,"FLAG_DEFEATED_RAYQUAZA":448,"FLAG_DEFEATED_REGICE":444,"FLAG_DEFEATED_REGIROCK":443,"FLAG_DEFEATED_REGISTEEL":445,"FLAG_DEFEATED_RIVAL_ROUTE103":130,"FLAG_DEFEATED_RIVAL_ROUTE_104":125,"FLAG_DEFEATED_RIVAL_RUSTBORO":211,"FLAG_DEFEATED_RUSTBORO_GYM":1264,"FLAG_DEFEATED_SEASHORE_HOUSE":141,"FLAG_DEFEATED_SOOTOPOLIS_GYM":1271,"FLAG_DEFEATED_SS_TIDAL_TRAINERS":247,"FLAG_DEFEATED_SUDOWOODO":454,"FLAG_DEFEATED_VOLTORB_1_NEW_MAUVILLE":449,"FLAG_DEFEATED_VOLTORB_2_NEW_MAUVILLE":450,"FLAG_DEFEATED_VOLTORB_3_NEW_MAUVILLE":451,"FLAG_DEFEATED_WALLY_MAUVILLE":190,"FLAG_DEFEATED_WALLY_VICTORY_ROAD":126,"FLAG_DELIVERED_DEVON_GOODS":149,"FLAG_DELIVERED_STEVEN_LETTER":189,"FLAG_DEOXYS_IS_RECOVERING":1258,"FLAG_DEOXYS_ROCK_COMPLETE":2260,"FLAG_DEVON_GOODS_STOLEN":142,"FLAG_DOCK_REJECTED_DEVON_GOODS":148,"FLAG_DONT_TRANSITION_MUSIC":16385,"FLAG_ENABLE_BRAWLY_MATCH_CALL":468,"FLAG_ENABLE_FIRST_WALLY_POKENAV_CALL":136,"FLAG_ENABLE_FLANNERY_MATCH_CALL":470,"FLAG_ENABLE_JUAN_MATCH_CALL":473,"FLAG_ENABLE_MOM_MATCH_CALL":216,"FLAG_ENABLE_MR_STONE_POKENAV":344,"FLAG_ENABLE_MULTI_CORRIDOR_DOOR":16386,"FLAG_ENABLE_NORMAN_MATCH_CALL":306,"FLAG_ENABLE_PROF_BIRCH_MATCH_CALL":281,"FLAG_ENABLE_RIVAL_MATCH_CALL":253,"FLAG_ENABLE_ROXANNE_FIRST_CALL":128,"FLAG_ENABLE_ROXANNE_MATCH_CALL":467,"FLAG_ENABLE_SCOTT_MATCH_CALL":215,"FLAG_ENABLE_SHIP_BIRTH_ISLAND":2261,"FLAG_ENABLE_SHIP_FARAWAY_ISLAND":2262,"FLAG_ENABLE_SHIP_NAVEL_ROCK":2272,"FLAG_ENABLE_SHIP_SOUTHERN_ISLAND":2227,"FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL":472,"FLAG_ENABLE_WALLY_MATCH_CALL":214,"FLAG_ENABLE_WATTSON_MATCH_CALL":469,"FLAG_ENABLE_WINONA_MATCH_CALL":471,"FLAG_ENTERED_CONTEST":341,"FLAG_ENTERED_ELITE_FOUR":263,"FLAG_ENTERED_MIRAGE_TOWER":2268,"FLAG_EVIL_LEADER_PLEASE_STOP":219,"FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE":271,"FLAG_EXCHANGED_SCANNER":294,"FLAG_FAN_CLUB_STRENGTH_SHARED":210,"FLAG_FLOWER_SHOP_RECEIVED_BERRY":1207,"FLAG_FORCE_MIRAGE_TOWER_VISIBLE":157,"FLAG_FORTREE_NPC_TRADE_COMPLETED":155,"FLAG_GOOD_LUCK_SAFARI_ZONE":93,"FLAG_GOT_BASEMENT_KEY_FROM_WATTSON":208,"FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON":209,"FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT":111,"FLAG_GROUDON_IS_RECOVERING":1274,"FLAG_HAS_MATCH_CALL":303,"FLAG_HIDDEN_ITEMS_START":500,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":531,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":532,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":533,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":534,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":601,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":604,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":603,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":602,"FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":528,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":548,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":549,"FLAG_HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":577,"FLAG_HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":576,"FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":500,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":527,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":575,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":543,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":578,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":529,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":580,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":579,"FLAG_HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":609,"FLAG_HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":595,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":561,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POTION":558,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":559,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":560,"FLAG_HIDDEN_ITEM_ROUTE_104_ANTIDOTE":585,"FLAG_HIDDEN_ITEM_ROUTE_104_HEART_SCALE":588,"FLAG_HIDDEN_ITEM_ROUTE_104_POKE_BALL":562,"FLAG_HIDDEN_ITEM_ROUTE_104_POTION":537,"FLAG_HIDDEN_ITEM_ROUTE_104_SUPER_POTION":544,"FLAG_HIDDEN_ITEM_ROUTE_105_BIG_PEARL":611,"FLAG_HIDDEN_ITEM_ROUTE_105_HEART_SCALE":589,"FLAG_HIDDEN_ITEM_ROUTE_106_HEART_SCALE":547,"FLAG_HIDDEN_ITEM_ROUTE_106_POKE_BALL":563,"FLAG_HIDDEN_ITEM_ROUTE_106_STARDUST":546,"FLAG_HIDDEN_ITEM_ROUTE_108_RARE_CANDY":586,"FLAG_HIDDEN_ITEM_ROUTE_109_ETHER":564,"FLAG_HIDDEN_ITEM_ROUTE_109_GREAT_BALL":551,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":552,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":590,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":591,"FLAG_HIDDEN_ITEM_ROUTE_109_REVIVE":550,"FLAG_HIDDEN_ITEM_ROUTE_110_FULL_HEAL":555,"FLAG_HIDDEN_ITEM_ROUTE_110_GREAT_BALL":553,"FLAG_HIDDEN_ITEM_ROUTE_110_POKE_BALL":565,"FLAG_HIDDEN_ITEM_ROUTE_110_REVIVE":554,"FLAG_HIDDEN_ITEM_ROUTE_111_PROTEIN":556,"FLAG_HIDDEN_ITEM_ROUTE_111_RARE_CANDY":557,"FLAG_HIDDEN_ITEM_ROUTE_111_STARDUST":502,"FLAG_HIDDEN_ITEM_ROUTE_113_ETHER":503,"FLAG_HIDDEN_ITEM_ROUTE_113_NUGGET":598,"FLAG_HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":530,"FLAG_HIDDEN_ITEM_ROUTE_114_CARBOS":504,"FLAG_HIDDEN_ITEM_ROUTE_114_REVIVE":542,"FLAG_HIDDEN_ITEM_ROUTE_115_HEART_SCALE":597,"FLAG_HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":596,"FLAG_HIDDEN_ITEM_ROUTE_116_SUPER_POTION":545,"FLAG_HIDDEN_ITEM_ROUTE_117_REPEL":572,"FLAG_HIDDEN_ITEM_ROUTE_118_HEART_SCALE":566,"FLAG_HIDDEN_ITEM_ROUTE_118_IRON":567,"FLAG_HIDDEN_ITEM_ROUTE_119_CALCIUM":505,"FLAG_HIDDEN_ITEM_ROUTE_119_FULL_HEAL":568,"FLAG_HIDDEN_ITEM_ROUTE_119_MAX_ETHER":587,"FLAG_HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":506,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":571,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":569,"FLAG_HIDDEN_ITEM_ROUTE_120_REVIVE":584,"FLAG_HIDDEN_ITEM_ROUTE_120_ZINC":570,"FLAG_HIDDEN_ITEM_ROUTE_121_FULL_HEAL":573,"FLAG_HIDDEN_ITEM_ROUTE_121_HP_UP":539,"FLAG_HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":600,"FLAG_HIDDEN_ITEM_ROUTE_121_NUGGET":540,"FLAG_HIDDEN_ITEM_ROUTE_123_HYPER_POTION":574,"FLAG_HIDDEN_ITEM_ROUTE_123_PP_UP":599,"FLAG_HIDDEN_ITEM_ROUTE_123_RARE_CANDY":610,"FLAG_HIDDEN_ITEM_ROUTE_123_REVIVE":541,"FLAG_HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":507,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":592,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":593,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":594,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":606,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":607,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":605,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":608,"FLAG_HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":535,"FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET":501,"FLAG_HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":511,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CALCIUM":536,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CARBOS":508,"FLAG_HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":509,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":513,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":538,"FLAG_HIDDEN_ITEM_UNDERWATER_124_PEARL":510,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":520,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":512,"FLAG_HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":514,"FLAG_HIDDEN_ITEM_UNDERWATER_126_IRON":519,"FLAG_HIDDEN_ITEM_UNDERWATER_126_PEARL":517,"FLAG_HIDDEN_ITEM_UNDERWATER_126_STARDUST":516,"FLAG_HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":515,"FLAG_HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":518,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":523,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HP_UP":522,"FLAG_HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":524,"FLAG_HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":521,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PEARL":526,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PROTEIN":525,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":581,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":582,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":583,"FLAG_HIDE_APPRENTICE":701,"FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNTS_BLOCKING_ENTRANCE":821,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_1":977,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_2":978,"FLAG_HIDE_AQUA_HIDEOUT_B2F_SUBMARINE_SHADOW":943,"FLAG_HIDE_AQUA_HIDEOUT_GRUNTS":924,"FLAG_HIDE_BATTLE_FRONTIER_RECEPTION_GATE_SCOTT":836,"FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO":842,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_1":711,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_2":712,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_3":713,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_4":714,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_5":715,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_6":716,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_1":864,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_2":865,"FLAG_HIDE_BATTLE_TOWER_OPPONENT":888,"FLAG_HIDE_BATTLE_TOWER_REPORTER":918,"FLAG_HIDE_BIRTH_ISLAND_DEOXYS_TRIANGLE":764,"FLAG_HIDE_BRINEYS_HOUSE_MR_BRINEY":739,"FLAG_HIDE_BRINEYS_HOUSE_PEEKO":881,"FLAG_HIDE_CAVE_OF_ORIGIN_B1F_WALLACE":820,"FLAG_HIDE_CHAMPIONS_ROOM_BIRCH":921,"FLAG_HIDE_CHAMPIONS_ROOM_RIVAL":920,"FLAG_HIDE_CONTEST_POKE_BALL":86,"FLAG_HIDE_DEOXYS":763,"FLAG_HIDE_DESERT_UNDERPASS_FOSSIL":874,"FLAG_HIDE_DEWFORD_HALL_SLUDGE_BOMB_MAN":940,"FLAG_HIDE_EVER_GRANDE_POKEMON_CENTER_1F_SCOTT":793,"FLAG_HIDE_FALLARBOR_AZURILL":907,"FLAG_HIDE_FALLARBOR_HOUSE_PROF_COZMO":928,"FLAG_HIDE_FALLARBOR_TOWN_BATTLE_TENT_SCOTT":767,"FLAG_HIDE_FALLORBOR_POKEMON_CENTER_LANETTE":871,"FLAG_HIDE_FANCLUB_BOY":790,"FLAG_HIDE_FANCLUB_LADY":792,"FLAG_HIDE_FANCLUB_LITTLE_BOY":791,"FLAG_HIDE_FANCLUB_OLD_LADY":789,"FLAG_HIDE_FORTREE_CITY_HOUSE_4_WINGULL":933,"FLAG_HIDE_FORTREE_CITY_KECLEON":969,"FLAG_HIDE_GRANITE_CAVE_STEVEN":833,"FLAG_HIDE_HO_OH":801,"FLAG_HIDE_JAGGED_PASS_MAGMA_GUARD":847,"FLAG_HIDE_LANETTES_HOUSE_LANETTE":870,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL":929,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL_ON_BIKE":930,"FLAG_HIDE_LILYCOVE_CITY_AQUA_GRUNTS":852,"FLAG_HIDE_LILYCOVE_CITY_RIVAL":971,"FLAG_HIDE_LILYCOVE_CITY_WAILMER":729,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER":832,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER_REPLACEMENT":873,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_1":774,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_2":895,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_REPORTER":802,"FLAG_HIDE_LILYCOVE_DEPARTMENT_STORE_ROOFTOP_SALE_WOMAN":962,"FLAG_HIDE_LILYCOVE_FAN_CLUB_INTERVIEWER":730,"FLAG_HIDE_LILYCOVE_HARBOR_EVENT_TICKET_TAKER":748,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_ATTENDANT":908,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_SAILOR":909,"FLAG_HIDE_LILYCOVE_HARBOR_SSTIDAL":861,"FLAG_HIDE_LILYCOVE_MOTEL_GAME_DESIGNERS":925,"FLAG_HIDE_LILYCOVE_MOTEL_SCOTT":787,"FLAG_HIDE_LILYCOVE_MUSEUM_CURATOR":775,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_1":776,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_2":777,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_3":778,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_4":779,"FLAG_HIDE_LILYCOVE_MUSEUM_TOURISTS":780,"FLAG_HIDE_LILYCOVE_POKEMON_CENTER_CONTEST_LADY_MON":993,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCH":795,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_BIRCH":721,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CHIKORITA":838,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CYNDAQUIL":811,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_TOTODILE":812,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_RIVAL":889,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_UNKNOWN_0x380":896,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_POKE_BALL":817,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_SWABLU_DOLL":815,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_BRENDAN":745,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_MOM":758,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_BEDROOM":760,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_MOM":784,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_SIBLING":735,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_TRUCK":761,"FLAG_HIDE_LITTLEROOT_TOWN_FAT_MAN":868,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_PICHU_DOLL":849,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_POKE_BALL":818,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MAY":746,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MOM":759,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_BEDROOM":722,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_MOM":785,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_SIBLING":736,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_TRUCK":762,"FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE":752,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_BEDROOM_MOM":757,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_1":754,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_2":755,"FLAG_HIDE_LITTLEROOT_TOWN_RIVAL":794,"FLAG_HIDE_LUGIA":800,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON":853,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON_ASLEEP":850,"FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS":857,"FLAG_HIDE_MAGMA_HIDEOUT_MAXIE":867,"FLAG_HIDE_MAP_NAME_POPUP":16384,"FLAG_HIDE_MARINE_CAVE_KYOGRE":782,"FLAG_HIDE_MAUVILLE_CITY_SCOTT":765,"FLAG_HIDE_MAUVILLE_CITY_WALLY":804,"FLAG_HIDE_MAUVILLE_CITY_WALLYS_UNCLE":805,"FLAG_HIDE_MAUVILLE_CITY_WATTSON":912,"FLAG_HIDE_MAUVILLE_GYM_WATTSON":913,"FLAG_HIDE_METEOR_FALLS_1F_1R_COZMO":942,"FLAG_HIDE_METEOR_FALLS_TEAM_AQUA":938,"FLAG_HIDE_METEOR_FALLS_TEAM_MAGMA":939,"FLAG_HIDE_MEW":718,"FLAG_HIDE_MIRAGE_TOWER_CLAW_FOSSIL":964,"FLAG_HIDE_MIRAGE_TOWER_ROOT_FOSSIL":963,"FLAG_HIDE_MOSSDEEP_CITY_HOUSE_2_WINGULL":934,"FLAG_HIDE_MOSSDEEP_CITY_SCOTT":788,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_STEVEN":753,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_TEAM_MAGMA":756,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_STEVEN":863,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA":862,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_MAGMA_NOTE":737,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_BELDUM_POKEBALL":968,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_INVISIBLE_NINJA_BOY":727,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN":967,"FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA":823,"FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN":743,"FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN":740,"FLAG_HIDE_MT_CHIMNEY_LAVA_COOKIE_LADY":994,"FLAG_HIDE_MT_CHIMNEY_TEAM_AQUA":926,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA":927,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA_BATTLEABLE":981,"FLAG_HIDE_MT_CHIMNEY_TRAINERS":877,"FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE":916,"FLAG_HIDE_MT_PYRE_SUMMIT_MAXIE":856,"FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA":917,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_1":974,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_2":975,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_3":976,"FLAG_HIDE_OLDALE_TOWN_RIVAL":979,"FLAG_HIDE_PETALBURG_CITY_SCOTT":995,"FLAG_HIDE_PETALBURG_CITY_WALLY":726,"FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD":830,"FLAG_HIDE_PETALBURG_CITY_WALLYS_MOM":728,"FLAG_HIDE_PETALBURG_GYM_GREETER":781,"FLAG_HIDE_PETALBURG_GYM_NORMAN":772,"FLAG_HIDE_PETALBURG_GYM_WALLY":866,"FLAG_HIDE_PETALBURG_GYM_WALLYS_DAD":824,"FLAG_HIDE_PETALBURG_WOODS_AQUA_GRUNT":725,"FLAG_HIDE_PETALBURG_WOODS_DEVON_EMPLOYEE":724,"FLAG_HIDE_PLAYERS_HOUSE_DAD":734,"FLAG_HIDE_POKEMON_CENTER_2F_MYSTERY_GIFT_MAN":702,"FLAG_HIDE_REGICE":936,"FLAG_HIDE_REGIROCK":935,"FLAG_HIDE_REGISTEEL":937,"FLAG_HIDE_ROUTE_101_BIRCH":897,"FLAG_HIDE_ROUTE_101_BIRCH_STARTERS_BAG":700,"FLAG_HIDE_ROUTE_101_BIRCH_ZIGZAGOON_BATTLE":720,"FLAG_HIDE_ROUTE_101_BOY":991,"FLAG_HIDE_ROUTE_101_ZIGZAGOON":750,"FLAG_HIDE_ROUTE_103_BIRCH":898,"FLAG_HIDE_ROUTE_103_RIVAL":723,"FLAG_HIDE_ROUTE_104_MR_BRINEY":738,"FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT":742,"FLAG_HIDE_ROUTE_104_RIVAL":719,"FLAG_HIDE_ROUTE_104_WHITE_HERB_FLORIST":906,"FLAG_HIDE_ROUTE_109_MR_BRINEY":741,"FLAG_HIDE_ROUTE_109_MR_BRINEY_BOAT":744,"FLAG_HIDE_ROUTE_110_BIRCH":837,"FLAG_HIDE_ROUTE_110_RIVAL":919,"FLAG_HIDE_ROUTE_110_RIVAL_ON_BIKE":922,"FLAG_HIDE_ROUTE_110_TEAM_AQUA":900,"FLAG_HIDE_ROUTE_111_DESERT_FOSSIL":876,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_1":796,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2":903,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3":799,"FLAG_HIDE_ROUTE_111_PLAYER_DESCENT":875,"FLAG_HIDE_ROUTE_111_ROCK_SMASH_TIP_GUY":843,"FLAG_HIDE_ROUTE_111_SECRET_POWER_MAN":960,"FLAG_HIDE_ROUTE_111_VICKY_WINSTRATE":771,"FLAG_HIDE_ROUTE_111_VICTORIA_WINSTRATE":769,"FLAG_HIDE_ROUTE_111_VICTOR_WINSTRATE":768,"FLAG_HIDE_ROUTE_111_VIVI_WINSTRATE":770,"FLAG_HIDE_ROUTE_112_TEAM_MAGMA":819,"FLAG_HIDE_ROUTE_115_BOULDERS":825,"FLAG_HIDE_ROUTE_116_DEVON_EMPLOYEE":947,"FLAG_HIDE_ROUTE_116_DROPPED_GLASSES_MAN":813,"FLAG_HIDE_ROUTE_116_MR_BRINEY":891,"FLAG_HIDE_ROUTE_116_WANDAS_BOYFRIEND":894,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_1":797,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2":901,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_3":904,"FLAG_HIDE_ROUTE_118_STEVEN":966,"FLAG_HIDE_ROUTE_119_RIVAL":851,"FLAG_HIDE_ROUTE_119_RIVAL_ON_BIKE":923,"FLAG_HIDE_ROUTE_119_SCOTT":786,"FLAG_HIDE_ROUTE_119_TEAM_AQUA":890,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_BRIDGE":822,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_SHELLY":915,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1":798,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2":902,"FLAG_HIDE_ROUTE_120_STEVEN":972,"FLAG_HIDE_ROUTE_121_TEAM_AQUA_GRUNTS":914,"FLAG_HIDE_ROUTE_128_ARCHIE":944,"FLAG_HIDE_ROUTE_128_MAXIE":945,"FLAG_HIDE_ROUTE_128_STEVEN":834,"FLAG_HIDE_RUSTBORO_CITY_AQUA_GRUNT":731,"FLAG_HIDE_RUSTBORO_CITY_DEVON_CORP_3F_EMPLOYEE":949,"FLAG_HIDE_RUSTBORO_CITY_DEVON_EMPLOYEE_1":732,"FLAG_HIDE_RUSTBORO_CITY_POKEMON_SCHOOL_SCOTT":999,"FLAG_HIDE_RUSTBORO_CITY_RIVAL":814,"FLAG_HIDE_RUSTBORO_CITY_SCIENTIST":844,"FLAG_HIDE_RUSTURF_TUNNEL_AQUA_GRUNT":878,"FLAG_HIDE_RUSTURF_TUNNEL_BRINEY":879,"FLAG_HIDE_RUSTURF_TUNNEL_PEEKO":880,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1":931,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2":932,"FLAG_HIDE_RUSTURF_TUNNEL_WANDA":983,"FLAG_HIDE_RUSTURF_TUNNEL_WANDAS_BOYFRIEND":807,"FLAG_HIDE_SAFARI_ZONE_SOUTH_CONSTRUCTION_WORKERS":717,"FLAG_HIDE_SAFARI_ZONE_SOUTH_EAST_EXPANSION":747,"FLAG_HIDE_SEAFLOOR_CAVERN_AQUA_GRUNTS":946,"FLAG_HIDE_SEAFLOOR_CAVERN_ENTRANCE_AQUA_GRUNT":941,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_ARCHIE":828,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE":859,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE_ASLEEP":733,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAGMA_GRUNTS":831,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAXIE":829,"FLAG_HIDE_SECRET_BASE_TRAINER":173,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA":773,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA_STILL":80,"FLAG_HIDE_SKY_PILLAR_WALLACE":855,"FLAG_HIDE_SLATEPORT_CITY_CAPTAIN_STERN":840,"FLAG_HIDE_SLATEPORT_CITY_CONTEST_REPORTER":803,"FLAG_HIDE_SLATEPORT_CITY_GABBY_AND_TY":835,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_AQUA_GRUNT":845,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_ARCHIE":846,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_CAPTAIN_STERN":841,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_PATRONS":905,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SS_TIDAL":860,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SUBMARINE_SHADOW":848,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_1":884,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_2":885,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_ARCHIE":886,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_CAPTAIN_STERN":887,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_AQUA_GRUNTS":883,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_FAMILIAR_AQUA_GRUNT":965,"FLAG_HIDE_SLATEPORT_CITY_SCOTT":749,"FLAG_HIDE_SLATEPORT_CITY_STERNS_SHIPYARD_MR_BRINEY":869,"FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA":882,"FLAG_HIDE_SLATEPORT_CITY_TM_SALESMAN":948,"FLAG_HIDE_SLATEPORT_MUSEUM_POPULATION":961,"FLAG_HIDE_SOOTOPOLIS_CITY_ARCHIE":826,"FLAG_HIDE_SOOTOPOLIS_CITY_GROUDON":998,"FLAG_HIDE_SOOTOPOLIS_CITY_KYOGRE":997,"FLAG_HIDE_SOOTOPOLIS_CITY_MAN_1":839,"FLAG_HIDE_SOOTOPOLIS_CITY_MAXIE":827,"FLAG_HIDE_SOOTOPOLIS_CITY_RAYQUAZA":996,"FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS":854,"FLAG_HIDE_SOOTOPOLIS_CITY_STEVEN":973,"FLAG_HIDE_SOOTOPOLIS_CITY_WALLACE":816,"FLAG_HIDE_SOUTHERN_ISLAND_EON_STONE":910,"FLAG_HIDE_SOUTHERN_ISLAND_UNCHOSEN_EON_DUO_MON":911,"FLAG_HIDE_SS_TIDAL_CORRIDOR_MR_BRINEY":950,"FLAG_HIDE_SS_TIDAL_CORRIDOR_SCOTT":810,"FLAG_HIDE_SS_TIDAL_ROOMS_SNATCH_GIVER":951,"FLAG_HIDE_TERRA_CAVE_GROUDON":783,"FLAG_HIDE_TRICK_HOUSE_END_MAN":899,"FLAG_HIDE_TRICK_HOUSE_ENTRANCE_MAN":872,"FLAG_HIDE_UNDERWATER_SEA_FLOOR_CAVERN_STOLEN_SUBMARINE":980,"FLAG_HIDE_UNION_ROOM_PLAYER_1":703,"FLAG_HIDE_UNION_ROOM_PLAYER_2":704,"FLAG_HIDE_UNION_ROOM_PLAYER_3":705,"FLAG_HIDE_UNION_ROOM_PLAYER_4":706,"FLAG_HIDE_UNION_ROOM_PLAYER_5":707,"FLAG_HIDE_UNION_ROOM_PLAYER_6":708,"FLAG_HIDE_UNION_ROOM_PLAYER_7":709,"FLAG_HIDE_UNION_ROOM_PLAYER_8":710,"FLAG_HIDE_VERDANTURF_TOWN_SCOTT":766,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLY":806,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLYS_UNCLE":809,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDA":984,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDAS_BOYFRIEND":808,"FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY":858,"FLAG_HIDE_VICTORY_ROAD_EXIT_WALLY":751,"FLAG_HIDE_WEATHER_INSTITUTE_1F_WORKERS":892,"FLAG_HIDE_WEATHER_INSTITUTE_2F_AQUA_GRUNT_M":992,"FLAG_HIDE_WEATHER_INSTITUTE_2F_WORKERS":893,"FLAG_HO_OH_IS_RECOVERING":1256,"FLAG_INTERACTED_WITH_DEVON_EMPLOYEE_GOODS_STOLEN":159,"FLAG_INTERACTED_WITH_STEVEN_SPACE_CENTER":205,"FLAG_IS_CHAMPION":2175,"FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":1100,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":1102,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":1078,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":1101,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":1077,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":1095,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":1099,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":1097,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":1096,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":1098,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":1124,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":1071,"FLAG_ITEM_AQUA_HIDEOUT_B1F_NUGGET":1132,"FLAG_ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":1072,"FLAG_ITEM_ARTISAN_CAVE_1F_CARBOS":1163,"FLAG_ITEM_ARTISAN_CAVE_B1F_HP_UP":1162,"FLAG_ITEM_FIERY_PATH_FIRE_STONE":1111,"FLAG_ITEM_FIERY_PATH_TM_TOXIC":1091,"FLAG_ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":1050,"FLAG_ITEM_GRANITE_CAVE_B1F_POKE_BALL":1051,"FLAG_ITEM_GRANITE_CAVE_B2F_RARE_CANDY":1054,"FLAG_ITEM_GRANITE_CAVE_B2F_REPEL":1053,"FLAG_ITEM_JAGGED_PASS_BURN_HEAL":1070,"FLAG_ITEM_LILYCOVE_CITY_MAX_REPEL":1042,"FLAG_ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":1151,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":1165,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":1164,"FLAG_ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":1166,"FLAG_ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":1167,"FLAG_ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":1059,"FLAG_ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":1168,"FLAG_ITEM_MAUVILLE_CITY_X_SPEED":1116,"FLAG_ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":1045,"FLAG_ITEM_METEOR_FALLS_1F_1R_MOON_STONE":1046,"FLAG_ITEM_METEOR_FALLS_1F_1R_PP_UP":1047,"FLAG_ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":1044,"FLAG_ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":1080,"FLAG_ITEM_MOSSDEEP_CITY_NET_BALL":1043,"FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_HM08":1133,"FLAG_ITEM_MT_PYRE_2F_ULTRA_BALL":1129,"FLAG_ITEM_MT_PYRE_3F_SUPER_REPEL":1120,"FLAG_ITEM_MT_PYRE_4F_SEA_INCENSE":1130,"FLAG_ITEM_MT_PYRE_5F_LAX_INCENSE":1052,"FLAG_ITEM_MT_PYRE_6F_TM_SHADOW_BALL":1089,"FLAG_ITEM_MT_PYRE_EXTERIOR_MAX_POTION":1073,"FLAG_ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":1074,"FLAG_ITEM_NEW_MAUVILLE_ESCAPE_ROPE":1076,"FLAG_ITEM_NEW_MAUVILLE_FULL_HEAL":1122,"FLAG_ITEM_NEW_MAUVILLE_PARALYZE_HEAL":1123,"FLAG_ITEM_NEW_MAUVILLE_THUNDER_STONE":1110,"FLAG_ITEM_NEW_MAUVILLE_ULTRA_BALL":1075,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MASTER_BALL":1125,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MAX_ELIXIR":1126,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B2F_NEST_BALL":1127,"FLAG_ITEM_PETALBURG_CITY_ETHER":1040,"FLAG_ITEM_PETALBURG_CITY_MAX_REVIVE":1039,"FLAG_ITEM_PETALBURG_WOODS_ETHER":1058,"FLAG_ITEM_PETALBURG_WOODS_GREAT_BALL":1056,"FLAG_ITEM_PETALBURG_WOODS_PARALYZE_HEAL":1117,"FLAG_ITEM_PETALBURG_WOODS_X_ATTACK":1055,"FLAG_ITEM_ROUTE_102_POTION":1000,"FLAG_ITEM_ROUTE_103_GUARD_SPEC":1114,"FLAG_ITEM_ROUTE_103_PP_UP":1137,"FLAG_ITEM_ROUTE_104_POKE_BALL":1057,"FLAG_ITEM_ROUTE_104_POTION":1135,"FLAG_ITEM_ROUTE_104_PP_UP":1002,"FLAG_ITEM_ROUTE_104_X_ACCURACY":1115,"FLAG_ITEM_ROUTE_105_IRON":1003,"FLAG_ITEM_ROUTE_106_PROTEIN":1004,"FLAG_ITEM_ROUTE_108_STAR_PIECE":1139,"FLAG_ITEM_ROUTE_109_POTION":1140,"FLAG_ITEM_ROUTE_109_PP_UP":1005,"FLAG_ITEM_ROUTE_110_DIRE_HIT":1007,"FLAG_ITEM_ROUTE_110_ELIXIR":1141,"FLAG_ITEM_ROUTE_110_RARE_CANDY":1006,"FLAG_ITEM_ROUTE_111_ELIXIR":1142,"FLAG_ITEM_ROUTE_111_HP_UP":1010,"FLAG_ITEM_ROUTE_111_STARDUST":1009,"FLAG_ITEM_ROUTE_111_TM_SANDSTORM":1008,"FLAG_ITEM_ROUTE_112_NUGGET":1011,"FLAG_ITEM_ROUTE_113_HYPER_POTION":1143,"FLAG_ITEM_ROUTE_113_MAX_ETHER":1012,"FLAG_ITEM_ROUTE_113_SUPER_REPEL":1013,"FLAG_ITEM_ROUTE_114_ENERGY_POWDER":1160,"FLAG_ITEM_ROUTE_114_PROTEIN":1015,"FLAG_ITEM_ROUTE_114_RARE_CANDY":1014,"FLAG_ITEM_ROUTE_115_GREAT_BALL":1118,"FLAG_ITEM_ROUTE_115_HEAL_POWDER":1144,"FLAG_ITEM_ROUTE_115_IRON":1018,"FLAG_ITEM_ROUTE_115_PP_UP":1161,"FLAG_ITEM_ROUTE_115_SUPER_POTION":1016,"FLAG_ITEM_ROUTE_115_TM_FOCUS_PUNCH":1017,"FLAG_ITEM_ROUTE_116_ETHER":1019,"FLAG_ITEM_ROUTE_116_HP_UP":1021,"FLAG_ITEM_ROUTE_116_POTION":1146,"FLAG_ITEM_ROUTE_116_REPEL":1020,"FLAG_ITEM_ROUTE_116_X_SPECIAL":1001,"FLAG_ITEM_ROUTE_117_GREAT_BALL":1022,"FLAG_ITEM_ROUTE_117_REVIVE":1023,"FLAG_ITEM_ROUTE_118_HYPER_POTION":1121,"FLAG_ITEM_ROUTE_119_ELIXIR_1":1026,"FLAG_ITEM_ROUTE_119_ELIXIR_2":1147,"FLAG_ITEM_ROUTE_119_HYPER_POTION_1":1029,"FLAG_ITEM_ROUTE_119_HYPER_POTION_2":1106,"FLAG_ITEM_ROUTE_119_LEAF_STONE":1027,"FLAG_ITEM_ROUTE_119_NUGGET":1134,"FLAG_ITEM_ROUTE_119_RARE_CANDY":1028,"FLAG_ITEM_ROUTE_119_SUPER_REPEL":1024,"FLAG_ITEM_ROUTE_119_ZINC":1025,"FLAG_ITEM_ROUTE_120_FULL_HEAL":1031,"FLAG_ITEM_ROUTE_120_HYPER_POTION":1107,"FLAG_ITEM_ROUTE_120_NEST_BALL":1108,"FLAG_ITEM_ROUTE_120_NUGGET":1030,"FLAG_ITEM_ROUTE_120_REVIVE":1148,"FLAG_ITEM_ROUTE_121_CARBOS":1103,"FLAG_ITEM_ROUTE_121_REVIVE":1149,"FLAG_ITEM_ROUTE_121_ZINC":1150,"FLAG_ITEM_ROUTE_123_CALCIUM":1032,"FLAG_ITEM_ROUTE_123_ELIXIR":1109,"FLAG_ITEM_ROUTE_123_PP_UP":1152,"FLAG_ITEM_ROUTE_123_REVIVAL_HERB":1153,"FLAG_ITEM_ROUTE_123_ULTRA_BALL":1104,"FLAG_ITEM_ROUTE_124_BLUE_SHARD":1093,"FLAG_ITEM_ROUTE_124_RED_SHARD":1092,"FLAG_ITEM_ROUTE_124_YELLOW_SHARD":1066,"FLAG_ITEM_ROUTE_125_BIG_PEARL":1154,"FLAG_ITEM_ROUTE_126_GREEN_SHARD":1105,"FLAG_ITEM_ROUTE_127_CARBOS":1035,"FLAG_ITEM_ROUTE_127_RARE_CANDY":1155,"FLAG_ITEM_ROUTE_127_ZINC":1034,"FLAG_ITEM_ROUTE_132_PROTEIN":1156,"FLAG_ITEM_ROUTE_132_RARE_CANDY":1036,"FLAG_ITEM_ROUTE_133_BIG_PEARL":1037,"FLAG_ITEM_ROUTE_133_MAX_REVIVE":1157,"FLAG_ITEM_ROUTE_133_STAR_PIECE":1038,"FLAG_ITEM_ROUTE_134_CARBOS":1158,"FLAG_ITEM_ROUTE_134_STAR_PIECE":1159,"FLAG_ITEM_RUSTBORO_CITY_X_DEFEND":1041,"FLAG_ITEM_RUSTURF_TUNNEL_MAX_ETHER":1049,"FLAG_ITEM_RUSTURF_TUNNEL_POKE_BALL":1048,"FLAG_ITEM_SAFARI_ZONE_NORTH_CALCIUM":1119,"FLAG_ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":1169,"FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":1094,"FLAG_ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":1170,"FLAG_ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":1131,"FLAG_ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":1079,"FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":1090,"FLAG_ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":1081,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":1113,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":1112,"FLAG_ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":1082,"FLAG_ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":1083,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":1060,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":1061,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":1062,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":1063,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":1064,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":1065,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":1067,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":1068,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":1069,"FLAG_ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":1084,"FLAG_ITEM_VICTORY_ROAD_1F_PP_UP":1085,"FLAG_ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":1087,"FLAG_ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":1086,"FLAG_ITEM_VICTORY_ROAD_B2F_FULL_HEAL":1088,"FLAG_KECLEON_FLED_FORTREE":295,"FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN":129,"FLAG_KYOGRE_IS_RECOVERING":1273,"FLAG_LANDMARK_ABANDONED_SHIP":2206,"FLAG_LANDMARK_ALTERING_CAVE":2269,"FLAG_LANDMARK_ANCIENT_TOMB":2233,"FLAG_LANDMARK_ARTISAN_CAVE":2271,"FLAG_LANDMARK_BATTLE_FRONTIER":2216,"FLAG_LANDMARK_BERRY_MASTERS_HOUSE":2243,"FLAG_LANDMARK_DESERT_RUINS":2230,"FLAG_LANDMARK_DESERT_UNDERPASS":2270,"FLAG_LANDMARK_FIERY_PATH":2218,"FLAG_LANDMARK_FLOWER_SHOP":2204,"FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE":2231,"FLAG_LANDMARK_GLASS_WORKSHOP":2212,"FLAG_LANDMARK_HUNTERS_HOUSE":2235,"FLAG_LANDMARK_ISLAND_CAVE":2229,"FLAG_LANDMARK_LANETTES_HOUSE":2213,"FLAG_LANDMARK_MIRAGE_TOWER":120,"FLAG_LANDMARK_MR_BRINEY_HOUSE":2205,"FLAG_LANDMARK_NEW_MAUVILLE":2208,"FLAG_LANDMARK_OLD_LADY_REST_SHOP":2209,"FLAG_LANDMARK_POKEMON_DAYCARE":2214,"FLAG_LANDMARK_POKEMON_LEAGUE":2228,"FLAG_LANDMARK_SCORCHED_SLAB":2232,"FLAG_LANDMARK_SEAFLOOR_CAVERN":2215,"FLAG_LANDMARK_SEALED_CHAMBER":2236,"FLAG_LANDMARK_SEASHORE_HOUSE":2207,"FLAG_LANDMARK_SKY_PILLAR":2238,"FLAG_LANDMARK_SOUTHERN_ISLAND":2217,"FLAG_LANDMARK_TRAINER_HILL":2274,"FLAG_LANDMARK_TRICK_HOUSE":2210,"FLAG_LANDMARK_TUNNELERS_REST_HOUSE":2234,"FLAG_LANDMARK_WINSTRATE_FAMILY":2211,"FLAG_LATIAS_IS_RECOVERING":1263,"FLAG_LATIOS_IS_RECOVERING":1255,"FLAG_LATIOS_OR_LATIAS_ROAMING":255,"FLAG_LEGENDARIES_IN_SOOTOPOLIS":83,"FLAG_LILYCOVE_RECEIVED_BERRY":1208,"FLAG_LUGIA_IS_RECOVERING":1257,"FLAG_MAP_SCRIPT_CHECKED_DEOXYS":2259,"FLAG_MATCH_CALL_REGISTERED":348,"FLAG_MAUVILLE_GYM_BARRIERS_STATE":99,"FLAG_MET_ARCHIE_METEOR_FALLS":207,"FLAG_MET_ARCHIE_SOOTOPOLIS":308,"FLAG_MET_BATTLE_FRONTIER_BREEDER":339,"FLAG_MET_BATTLE_FRONTIER_GAMBLER":343,"FLAG_MET_BATTLE_FRONTIER_MANIAC":340,"FLAG_MET_DEVON_EMPLOYEE":287,"FLAG_MET_DIVING_TREASURE_HUNTER":217,"FLAG_MET_FANCLUB_YOUNGER_BROTHER":300,"FLAG_MET_FRONTIER_BEAUTY_MOVE_TUTOR":346,"FLAG_MET_FRONTIER_SWIMMER_MOVE_TUTOR":347,"FLAG_MET_HIDDEN_POWER_GIVER":118,"FLAG_MET_MAXIE_SOOTOPOLIS":309,"FLAG_MET_PRETTY_PETAL_SHOP_OWNER":127,"FLAG_MET_PROF_COZMO":244,"FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE":293,"FLAG_MET_RIVAL_LILYCOVE":292,"FLAG_MET_RIVAL_MOM":87,"FLAG_MET_RIVAL_RUSTBORO":288,"FLAG_MET_SCOTT_AFTER_OBTAINING_STONE_BADGE":459,"FLAG_MET_SCOTT_IN_EVERGRANDE":463,"FLAG_MET_SCOTT_IN_FALLARBOR":461,"FLAG_MET_SCOTT_IN_LILYCOVE":462,"FLAG_MET_SCOTT_IN_VERDANTURF":460,"FLAG_MET_SCOTT_ON_SS_TIDAL":464,"FLAG_MET_SCOTT_RUSTBORO":310,"FLAG_MET_SLATEPORT_FANCLUB_CHAIRMAN":342,"FLAG_MET_TEAM_AQUA_HARBOR":97,"FLAG_MET_WAILMER_TRAINER":218,"FLAG_MEW_IS_RECOVERING":1259,"FLAG_MIRAGE_TOWER_VISIBLE":334,"FLAG_MOSSDEEP_GYM_SWITCH_1":100,"FLAG_MOSSDEEP_GYM_SWITCH_2":101,"FLAG_MOSSDEEP_GYM_SWITCH_3":102,"FLAG_MOSSDEEP_GYM_SWITCH_4":103,"FLAG_MOVE_TUTOR_TAUGHT_DOUBLE_EDGE":441,"FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH":440,"FLAG_MOVE_TUTOR_TAUGHT_EXPLOSION":442,"FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER":435,"FLAG_MOVE_TUTOR_TAUGHT_METRONOME":437,"FLAG_MOVE_TUTOR_TAUGHT_MIMIC":436,"FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT":434,"FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK":438,"FLAG_MOVE_TUTOR_TAUGHT_SUBSTITUTE":439,"FLAG_MOVE_TUTOR_TAUGHT_SWAGGER":433,"FLAG_MR_BRINEY_SAILING_INTRO":147,"FLAG_MYSTERY_GIFT_1":485,"FLAG_MYSTERY_GIFT_10":494,"FLAG_MYSTERY_GIFT_11":495,"FLAG_MYSTERY_GIFT_12":496,"FLAG_MYSTERY_GIFT_13":497,"FLAG_MYSTERY_GIFT_14":498,"FLAG_MYSTERY_GIFT_15":499,"FLAG_MYSTERY_GIFT_2":486,"FLAG_MYSTERY_GIFT_3":487,"FLAG_MYSTERY_GIFT_4":488,"FLAG_MYSTERY_GIFT_5":489,"FLAG_MYSTERY_GIFT_6":490,"FLAG_MYSTERY_GIFT_7":491,"FLAG_MYSTERY_GIFT_8":492,"FLAG_MYSTERY_GIFT_9":493,"FLAG_MYSTERY_GIFT_DONE":484,"FLAG_NEVER_SET_0x0DC":220,"FLAG_NOT_READY_FOR_BATTLE_ROUTE_120":290,"FLAG_NURSE_MENTIONS_GOLD_CARD":345,"FLAG_NURSE_UNION_ROOM_REMINDER":2176,"FLAG_OCEANIC_MUSEUM_MET_REPORTER":105,"FLAG_OMIT_DIVE_FROM_STEVEN_LETTER":302,"FLAG_PACIFIDLOG_NPC_TRADE_COMPLETED":154,"FLAG_PENDING_DAYCARE_EGG":134,"FLAG_PETALBURG_MART_EXPANDED_ITEMS":296,"FLAG_POKERUS_EXPLAINED":273,"FLAG_PURCHASED_HARBOR_MAIL":104,"FLAG_RAYQUAZA_IS_RECOVERING":1279,"FLAG_RECEIVED_20_COINS":225,"FLAG_RECEIVED_6_SODA_POP":140,"FLAG_RECEIVED_ACRO_BIKE":1181,"FLAG_RECEIVED_AMULET_COIN":133,"FLAG_RECEIVED_AURORA_TICKET":314,"FLAG_RECEIVED_BADGE_1":1182,"FLAG_RECEIVED_BADGE_2":1183,"FLAG_RECEIVED_BADGE_3":1184,"FLAG_RECEIVED_BADGE_4":1185,"FLAG_RECEIVED_BADGE_5":1186,"FLAG_RECEIVED_BADGE_6":1187,"FLAG_RECEIVED_BADGE_7":1188,"FLAG_RECEIVED_BADGE_8":1189,"FLAG_RECEIVED_BELDUM":298,"FLAG_RECEIVED_BELUE_BERRY":252,"FLAG_RECEIVED_BIKE":90,"FLAG_RECEIVED_BLUE_SCARF":201,"FLAG_RECEIVED_CASTFORM":151,"FLAG_RECEIVED_CHARCOAL":254,"FLAG_RECEIVED_CHESTO_BERRY_ROUTE_104":246,"FLAG_RECEIVED_CLEANSE_TAG":282,"FLAG_RECEIVED_COIN_CASE":258,"FLAG_RECEIVED_CONTEST_PASS":150,"FLAG_RECEIVED_DEEP_SEA_SCALE":1190,"FLAG_RECEIVED_DEEP_SEA_TOOTH":1191,"FLAG_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":1172,"FLAG_RECEIVED_DEVON_SCOPE":285,"FLAG_RECEIVED_DOLL_LANETTE":131,"FLAG_RECEIVED_DURIN_BERRY":251,"FLAG_RECEIVED_EON_TICKET":474,"FLAG_RECEIVED_EXP_SHARE":272,"FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK":299,"FLAG_RECEIVED_FIRST_POKEBALLS":233,"FLAG_RECEIVED_FOCUS_BAND":283,"FLAG_RECEIVED_GLASS_ORNAMENT":236,"FLAG_RECEIVED_GOLD_SHIELD":238,"FLAG_RECEIVED_GOOD_ROD":227,"FLAG_RECEIVED_GO_GOGGLES":221,"FLAG_RECEIVED_GREAT_BALL_PETALBURG_WOODS":1171,"FLAG_RECEIVED_GREAT_BALL_RUSTBORO_CITY":1173,"FLAG_RECEIVED_GREEN_SCARF":203,"FLAG_RECEIVED_HM_CUT":137,"FLAG_RECEIVED_HM_DIVE":123,"FLAG_RECEIVED_HM_FLASH":109,"FLAG_RECEIVED_HM_FLY":110,"FLAG_RECEIVED_HM_ROCK_SMASH":107,"FLAG_RECEIVED_HM_STRENGTH":106,"FLAG_RECEIVED_HM_SURF":122,"FLAG_RECEIVED_HM_WATERFALL":312,"FLAG_RECEIVED_ITEMFINDER":1176,"FLAG_RECEIVED_KINGS_ROCK":276,"FLAG_RECEIVED_LAVARIDGE_EGG":266,"FLAG_RECEIVED_LETTER":1174,"FLAG_RECEIVED_MACHO_BRACE":277,"FLAG_RECEIVED_MACH_BIKE":1180,"FLAG_RECEIVED_MAGMA_EMBLEM":1177,"FLAG_RECEIVED_MENTAL_HERB":223,"FLAG_RECEIVED_METEORITE":115,"FLAG_RECEIVED_MIRACLE_SEED":297,"FLAG_RECEIVED_MYSTIC_TICKET":315,"FLAG_RECEIVED_OLD_ROD":257,"FLAG_RECEIVED_OLD_SEA_MAP":316,"FLAG_RECEIVED_PAMTRE_BERRY":249,"FLAG_RECEIVED_PINK_SCARF":202,"FLAG_RECEIVED_POKEBLOCK_CASE":95,"FLAG_RECEIVED_POKEDEX_FROM_BIRCH":2276,"FLAG_RECEIVED_POKENAV":188,"FLAG_RECEIVED_POTION_OLDALE":132,"FLAG_RECEIVED_POWDER_JAR":337,"FLAG_RECEIVED_PREMIER_BALL_RUSTBORO":213,"FLAG_RECEIVED_QUICK_CLAW":275,"FLAG_RECEIVED_RED_OR_BLUE_ORB":212,"FLAG_RECEIVED_RED_SCARF":200,"FLAG_RECEIVED_REPEAT_BALL":256,"FLAG_RECEIVED_REVIVED_FOSSIL_MON":267,"FLAG_RECEIVED_RUNNING_SHOES":274,"FLAG_RECEIVED_SECRET_POWER":96,"FLAG_RECEIVED_SHOAL_SALT_1":952,"FLAG_RECEIVED_SHOAL_SALT_2":953,"FLAG_RECEIVED_SHOAL_SALT_3":954,"FLAG_RECEIVED_SHOAL_SALT_4":955,"FLAG_RECEIVED_SHOAL_SHELL_1":956,"FLAG_RECEIVED_SHOAL_SHELL_2":957,"FLAG_RECEIVED_SHOAL_SHELL_3":958,"FLAG_RECEIVED_SHOAL_SHELL_4":959,"FLAG_RECEIVED_SILK_SCARF":289,"FLAG_RECEIVED_SILVER_SHIELD":237,"FLAG_RECEIVED_SOFT_SAND":280,"FLAG_RECEIVED_SOOTHE_BELL":278,"FLAG_RECEIVED_SOOT_SACK":1033,"FLAG_RECEIVED_SPECIAL_PHRASE_HINT":85,"FLAG_RECEIVED_SPELON_BERRY":248,"FLAG_RECEIVED_SS_TICKET":291,"FLAG_RECEIVED_STARTER_DOLL":226,"FLAG_RECEIVED_SUN_STONE_MOSSDEEP":192,"FLAG_RECEIVED_SUPER_ROD":152,"FLAG_RECEIVED_TM_AERIAL_ACE":170,"FLAG_RECEIVED_TM_ATTRACT":235,"FLAG_RECEIVED_TM_BRICK_BREAK":121,"FLAG_RECEIVED_TM_BULK_UP":166,"FLAG_RECEIVED_TM_BULLET_SEED":262,"FLAG_RECEIVED_TM_CALM_MIND":171,"FLAG_RECEIVED_TM_DIG":261,"FLAG_RECEIVED_TM_FACADE":169,"FLAG_RECEIVED_TM_FRUSTRATION":1179,"FLAG_RECEIVED_TM_GIGA_DRAIN":232,"FLAG_RECEIVED_TM_HIDDEN_POWER":264,"FLAG_RECEIVED_TM_OVERHEAT":168,"FLAG_RECEIVED_TM_REST":234,"FLAG_RECEIVED_TM_RETURN":229,"FLAG_RECEIVED_TM_RETURN_2":1178,"FLAG_RECEIVED_TM_ROAR":231,"FLAG_RECEIVED_TM_ROCK_TOMB":165,"FLAG_RECEIVED_TM_SHOCK_WAVE":167,"FLAG_RECEIVED_TM_SLUDGE_BOMB":230,"FLAG_RECEIVED_TM_SNATCH":260,"FLAG_RECEIVED_TM_STEEL_WING":1175,"FLAG_RECEIVED_TM_THIEF":269,"FLAG_RECEIVED_TM_TORMENT":265,"FLAG_RECEIVED_TM_WATER_PULSE":172,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_1":1200,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_2":1201,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_3":1202,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_4":1203,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_5":1204,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_6":1205,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_7":1206,"FLAG_RECEIVED_WAILMER_DOLL":245,"FLAG_RECEIVED_WAILMER_PAIL":94,"FLAG_RECEIVED_WATMEL_BERRY":250,"FLAG_RECEIVED_WHITE_HERB":279,"FLAG_RECEIVED_YELLOW_SCARF":204,"FLAG_RECOVERED_DEVON_GOODS":143,"FLAG_REGICE_IS_RECOVERING":1260,"FLAG_REGIROCK_IS_RECOVERING":1261,"FLAG_REGISTEEL_IS_RECOVERING":1262,"FLAG_REGISTERED_STEVEN_POKENAV":305,"FLAG_REGISTER_RIVAL_POKENAV":124,"FLAG_REGI_DOORS_OPENED":228,"FLAG_REMATCH_ABIGAIL":387,"FLAG_REMATCH_AMY_AND_LIV":399,"FLAG_REMATCH_ANDRES":350,"FLAG_REMATCH_ANNA_AND_MEG":378,"FLAG_REMATCH_BENJAMIN":390,"FLAG_REMATCH_BERNIE":369,"FLAG_REMATCH_BRAWLY":415,"FLAG_REMATCH_BROOKE":356,"FLAG_REMATCH_CALVIN":383,"FLAG_REMATCH_CAMERON":373,"FLAG_REMATCH_CATHERINE":406,"FLAG_REMATCH_CINDY":359,"FLAG_REMATCH_CORY":401,"FLAG_REMATCH_CRISTIN":355,"FLAG_REMATCH_CYNDY":395,"FLAG_REMATCH_DALTON":368,"FLAG_REMATCH_DIANA":398,"FLAG_REMATCH_DRAKE":424,"FLAG_REMATCH_DUSTY":351,"FLAG_REMATCH_DYLAN":388,"FLAG_REMATCH_EDWIN":402,"FLAG_REMATCH_ELLIOT":384,"FLAG_REMATCH_ERNEST":400,"FLAG_REMATCH_ETHAN":370,"FLAG_REMATCH_FERNANDO":367,"FLAG_REMATCH_FLANNERY":417,"FLAG_REMATCH_GABRIELLE":405,"FLAG_REMATCH_GLACIA":423,"FLAG_REMATCH_HALEY":408,"FLAG_REMATCH_ISAAC":404,"FLAG_REMATCH_ISABEL":379,"FLAG_REMATCH_ISAIAH":385,"FLAG_REMATCH_JACKI":374,"FLAG_REMATCH_JACKSON":407,"FLAG_REMATCH_JAMES":409,"FLAG_REMATCH_JEFFREY":372,"FLAG_REMATCH_JENNY":397,"FLAG_REMATCH_JERRY":377,"FLAG_REMATCH_JESSICA":361,"FLAG_REMATCH_JOHN_AND_JAY":371,"FLAG_REMATCH_KAREN":376,"FLAG_REMATCH_KATELYN":389,"FLAG_REMATCH_KIRA_AND_DAN":412,"FLAG_REMATCH_KOJI":366,"FLAG_REMATCH_LAO":394,"FLAG_REMATCH_LILA_AND_ROY":354,"FLAG_REMATCH_LOLA":352,"FLAG_REMATCH_LYDIA":403,"FLAG_REMATCH_MADELINE":396,"FLAG_REMATCH_MARIA":386,"FLAG_REMATCH_MIGUEL":380,"FLAG_REMATCH_NICOLAS":392,"FLAG_REMATCH_NOB":365,"FLAG_REMATCH_NORMAN":418,"FLAG_REMATCH_PABLO":391,"FLAG_REMATCH_PHOEBE":422,"FLAG_REMATCH_RICKY":353,"FLAG_REMATCH_ROBERT":393,"FLAG_REMATCH_ROSE":349,"FLAG_REMATCH_ROXANNE":414,"FLAG_REMATCH_SAWYER":411,"FLAG_REMATCH_SHELBY":382,"FLAG_REMATCH_SIDNEY":421,"FLAG_REMATCH_STEVE":363,"FLAG_REMATCH_TATE_AND_LIZA":420,"FLAG_REMATCH_THALIA":360,"FLAG_REMATCH_TIMOTHY":381,"FLAG_REMATCH_TONY":364,"FLAG_REMATCH_TRENT":410,"FLAG_REMATCH_VALERIE":358,"FLAG_REMATCH_WALLACE":425,"FLAG_REMATCH_WALLY":413,"FLAG_REMATCH_WALTER":375,"FLAG_REMATCH_WATTSON":416,"FLAG_REMATCH_WILTON":357,"FLAG_REMATCH_WINONA":419,"FLAG_REMATCH_WINSTON":362,"FLAG_RESCUED_BIRCH":82,"FLAG_RETURNED_DEVON_GOODS":144,"FLAG_RETURNED_RED_OR_BLUE_ORB":259,"FLAG_RIVAL_LEFT_FOR_ROUTE103":301,"FLAG_ROUTE_111_RECEIVED_BERRY":1192,"FLAG_ROUTE_114_RECEIVED_BERRY":1193,"FLAG_ROUTE_120_RECEIVED_BERRY":1194,"FLAG_RUSTBORO_NPC_TRADE_COMPLETED":153,"FLAG_RUSTURF_TUNNEL_OPENED":199,"FLAG_SCOTT_CALL_BATTLE_FRONTIER":114,"FLAG_SCOTT_CALL_FORTREE_GYM":138,"FLAG_SCOTT_GIVES_BATTLE_POINTS":465,"FLAG_SECRET_BASE_REGISTRY_ENABLED":268,"FLAG_SET_WALL_CLOCK":81,"FLAG_SHOWN_AURORA_TICKET":431,"FLAG_SHOWN_BOX_WAS_FULL_MESSAGE":2263,"FLAG_SHOWN_EON_TICKET":430,"FLAG_SHOWN_MYSTIC_TICKET":475,"FLAG_SHOWN_OLD_SEA_MAP":432,"FLAG_SMART_PAINTING_MADE":163,"FLAG_SOOTOPOLIS_ARCHIE_MAXIE_LEAVE":158,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_1":1198,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_2":1199,"FLAG_SPECIAL_FLAG_UNUSED_0x4003":16387,"FLAG_SS_TIDAL_DISABLED":84,"FLAG_STEVEN_GUIDES_TO_CAVE_OF_ORIGIN":307,"FLAG_STORING_ITEMS_IN_PYRAMID_BAG":16388,"FLAG_SYS_ARENA_GOLD":2251,"FLAG_SYS_ARENA_SILVER":2250,"FLAG_SYS_BRAILLE_DIG":2223,"FLAG_SYS_BRAILLE_REGICE_COMPLETED":2225,"FLAG_SYS_B_DASH":2240,"FLAG_SYS_CAVE_BATTLE":2201,"FLAG_SYS_CAVE_SHIP":2199,"FLAG_SYS_CAVE_WONDER":2200,"FLAG_SYS_CHANGED_DEWFORD_TREND":2195,"FLAG_SYS_CHAT_USED":2149,"FLAG_SYS_CLOCK_SET":2197,"FLAG_SYS_CRUISE_MODE":2189,"FLAG_SYS_CTRL_OBJ_DELETE":2241,"FLAG_SYS_CYCLING_ROAD":2187,"FLAG_SYS_DOME_GOLD":2247,"FLAG_SYS_DOME_SILVER":2246,"FLAG_SYS_ENC_DOWN_ITEM":2222,"FLAG_SYS_ENC_UP_ITEM":2221,"FLAG_SYS_FACTORY_GOLD":2253,"FLAG_SYS_FACTORY_SILVER":2252,"FLAG_SYS_FRONTIER_PASS":2258,"FLAG_SYS_GAME_CLEAR":2148,"FLAG_SYS_MIX_RECORD":2196,"FLAG_SYS_MYSTERY_EVENT_ENABLE":2220,"FLAG_SYS_MYSTERY_GIFT_ENABLE":2267,"FLAG_SYS_NATIONAL_DEX":2198,"FLAG_SYS_PALACE_GOLD":2249,"FLAG_SYS_PALACE_SILVER":2248,"FLAG_SYS_PC_LANETTE":2219,"FLAG_SYS_PIKE_GOLD":2255,"FLAG_SYS_PIKE_SILVER":2254,"FLAG_SYS_POKEDEX_GET":2145,"FLAG_SYS_POKEMON_GET":2144,"FLAG_SYS_POKENAV_GET":2146,"FLAG_SYS_PYRAMID_GOLD":2257,"FLAG_SYS_PYRAMID_SILVER":2256,"FLAG_SYS_REGIROCK_PUZZLE_COMPLETED":2224,"FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED":2226,"FLAG_SYS_RESET_RTC_ENABLE":2242,"FLAG_SYS_RIBBON_GET":2203,"FLAG_SYS_SAFARI_MODE":2188,"FLAG_SYS_SHOAL_ITEM":2239,"FLAG_SYS_SHOAL_TIDE":2202,"FLAG_SYS_TOWER_GOLD":2245,"FLAG_SYS_TOWER_SILVER":2244,"FLAG_SYS_TV_HOME":2192,"FLAG_SYS_TV_LATIAS_LATIOS":2237,"FLAG_SYS_TV_START":2194,"FLAG_SYS_TV_WATCH":2193,"FLAG_SYS_USE_FLASH":2184,"FLAG_SYS_USE_STRENGTH":2185,"FLAG_SYS_WEATHER_CTRL":2186,"FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE":112,"FLAG_TEMP_1":1,"FLAG_TEMP_10":16,"FLAG_TEMP_11":17,"FLAG_TEMP_12":18,"FLAG_TEMP_13":19,"FLAG_TEMP_14":20,"FLAG_TEMP_15":21,"FLAG_TEMP_16":22,"FLAG_TEMP_17":23,"FLAG_TEMP_18":24,"FLAG_TEMP_19":25,"FLAG_TEMP_1A":26,"FLAG_TEMP_1B":27,"FLAG_TEMP_1C":28,"FLAG_TEMP_1D":29,"FLAG_TEMP_1E":30,"FLAG_TEMP_1F":31,"FLAG_TEMP_2":2,"FLAG_TEMP_3":3,"FLAG_TEMP_4":4,"FLAG_TEMP_5":5,"FLAG_TEMP_6":6,"FLAG_TEMP_7":7,"FLAG_TEMP_8":8,"FLAG_TEMP_9":9,"FLAG_TEMP_A":10,"FLAG_TEMP_B":11,"FLAG_TEMP_C":12,"FLAG_TEMP_D":13,"FLAG_TEMP_E":14,"FLAG_TEMP_F":15,"FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE":17,"FLAG_TEMP_REGICE_PUZZLE_FAILED":3,"FLAG_TEMP_REGICE_PUZZLE_STARTED":2,"FLAG_TEMP_SKIP_GABBY_INTERVIEW":1,"FLAG_THANKED_FOR_PLAYING_WITH_WALLY":135,"FLAG_TOUGH_PAINTING_MADE":164,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1":194,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2":195,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3":196,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4":197,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5":198,"FLAG_TV_EXPLAINED":98,"FLAG_UNLOCKED_TRENDY_SAYINGS":2150,"FLAG_USED_ROOM_1_KEY":240,"FLAG_USED_ROOM_2_KEY":241,"FLAG_USED_ROOM_4_KEY":242,"FLAG_USED_ROOM_6_KEY":243,"FLAG_USED_STORAGE_KEY":239,"FLAG_VISITED_DEWFORD_TOWN":2161,"FLAG_VISITED_EVER_GRANDE_CITY":2174,"FLAG_VISITED_FALLARBOR_TOWN":2163,"FLAG_VISITED_FORTREE_CITY":2170,"FLAG_VISITED_LAVARIDGE_TOWN":2162,"FLAG_VISITED_LILYCOVE_CITY":2171,"FLAG_VISITED_LITTLEROOT_TOWN":2159,"FLAG_VISITED_MAUVILLE_CITY":2168,"FLAG_VISITED_MOSSDEEP_CITY":2172,"FLAG_VISITED_OLDALE_TOWN":2160,"FLAG_VISITED_PACIFIDLOG_TOWN":2165,"FLAG_VISITED_PETALBURG_CITY":2166,"FLAG_VISITED_RUSTBORO_CITY":2169,"FLAG_VISITED_SLATEPORT_CITY":2167,"FLAG_VISITED_SOOTOPOLIS_CITY":2173,"FLAG_VISITED_VERDANTURF_TOWN":2164,"FLAG_WALLACE_GOES_TO_SKY_PILLAR":311,"FLAG_WALLY_SPEECH":193,"FLAG_WATTSON_REMATCH_AVAILABLE":91,"FLAG_WHITEOUT_TO_LAVARIDGE":108,"FLAG_WINGULL_DELIVERED_MAIL":224,"FLAG_WINGULL_SENT_ON_ERRAND":222,"FLAG_WONDER_CARD_UNUSED_1":317,"FLAG_WONDER_CARD_UNUSED_10":326,"FLAG_WONDER_CARD_UNUSED_11":327,"FLAG_WONDER_CARD_UNUSED_12":328,"FLAG_WONDER_CARD_UNUSED_13":329,"FLAG_WONDER_CARD_UNUSED_14":330,"FLAG_WONDER_CARD_UNUSED_15":331,"FLAG_WONDER_CARD_UNUSED_16":332,"FLAG_WONDER_CARD_UNUSED_17":333,"FLAG_WONDER_CARD_UNUSED_2":318,"FLAG_WONDER_CARD_UNUSED_3":319,"FLAG_WONDER_CARD_UNUSED_4":320,"FLAG_WONDER_CARD_UNUSED_5":321,"FLAG_WONDER_CARD_UNUSED_6":322,"FLAG_WONDER_CARD_UNUSED_7":323,"FLAG_WONDER_CARD_UNUSED_8":324,"FLAG_WONDER_CARD_UNUSED_9":325,"FLAVOR_BITTER":3,"FLAVOR_COUNT":5,"FLAVOR_DRY":1,"FLAVOR_SOUR":4,"FLAVOR_SPICY":0,"FLAVOR_SWEET":2,"GOOD_ROD":1,"ITEMS_COUNT":377,"ITEM_034":52,"ITEM_035":53,"ITEM_036":54,"ITEM_037":55,"ITEM_038":56,"ITEM_039":57,"ITEM_03A":58,"ITEM_03B":59,"ITEM_03C":60,"ITEM_03D":61,"ITEM_03E":62,"ITEM_048":72,"ITEM_052":82,"ITEM_057":87,"ITEM_058":88,"ITEM_059":89,"ITEM_05A":90,"ITEM_05B":91,"ITEM_05C":92,"ITEM_063":99,"ITEM_064":100,"ITEM_065":101,"ITEM_066":102,"ITEM_069":105,"ITEM_071":113,"ITEM_072":114,"ITEM_073":115,"ITEM_074":116,"ITEM_075":117,"ITEM_076":118,"ITEM_077":119,"ITEM_078":120,"ITEM_0EA":234,"ITEM_0EB":235,"ITEM_0EC":236,"ITEM_0ED":237,"ITEM_0EE":238,"ITEM_0EF":239,"ITEM_0F0":240,"ITEM_0F1":241,"ITEM_0F2":242,"ITEM_0F3":243,"ITEM_0F4":244,"ITEM_0F5":245,"ITEM_0F6":246,"ITEM_0F7":247,"ITEM_0F8":248,"ITEM_0F9":249,"ITEM_0FA":250,"ITEM_0FB":251,"ITEM_0FC":252,"ITEM_0FD":253,"ITEM_10B":267,"ITEM_15B":347,"ITEM_15C":348,"ITEM_ACRO_BIKE":272,"ITEM_AGUAV_BERRY":146,"ITEM_AMULET_COIN":189,"ITEM_ANTIDOTE":14,"ITEM_APICOT_BERRY":172,"ITEM_ARCHIPELAGO_PROGRESSION":112,"ITEM_ASPEAR_BERRY":137,"ITEM_AURORA_TICKET":371,"ITEM_AWAKENING":17,"ITEM_BADGE_1":226,"ITEM_BADGE_2":227,"ITEM_BADGE_3":228,"ITEM_BADGE_4":229,"ITEM_BADGE_5":230,"ITEM_BADGE_6":231,"ITEM_BADGE_7":232,"ITEM_BADGE_8":233,"ITEM_BASEMENT_KEY":271,"ITEM_BEAD_MAIL":127,"ITEM_BELUE_BERRY":167,"ITEM_BERRY_JUICE":44,"ITEM_BERRY_POUCH":365,"ITEM_BICYCLE":360,"ITEM_BIG_MUSHROOM":104,"ITEM_BIG_PEARL":107,"ITEM_BIKE_VOUCHER":352,"ITEM_BLACK_BELT":207,"ITEM_BLACK_FLUTE":42,"ITEM_BLACK_GLASSES":206,"ITEM_BLUE_FLUTE":39,"ITEM_BLUE_ORB":277,"ITEM_BLUE_SCARF":255,"ITEM_BLUE_SHARD":49,"ITEM_BLUK_BERRY":149,"ITEM_BRIGHT_POWDER":179,"ITEM_BURN_HEAL":15,"ITEM_B_USE_MEDICINE":1,"ITEM_B_USE_OTHER":2,"ITEM_CALCIUM":67,"ITEM_CARBOS":66,"ITEM_CARD_KEY":355,"ITEM_CHARCOAL":215,"ITEM_CHERI_BERRY":133,"ITEM_CHESTO_BERRY":134,"ITEM_CHOICE_BAND":186,"ITEM_CLAW_FOSSIL":287,"ITEM_CLEANSE_TAG":190,"ITEM_COIN_CASE":260,"ITEM_CONTEST_PASS":266,"ITEM_CORNN_BERRY":159,"ITEM_DEEP_SEA_SCALE":193,"ITEM_DEEP_SEA_TOOTH":192,"ITEM_DEVON_GOODS":269,"ITEM_DEVON_SCOPE":288,"ITEM_DIRE_HIT":74,"ITEM_DIVE_BALL":7,"ITEM_DOME_FOSSIL":358,"ITEM_DRAGON_FANG":216,"ITEM_DRAGON_SCALE":201,"ITEM_DREAM_MAIL":130,"ITEM_DURIN_BERRY":166,"ITEM_ELIXIR":36,"ITEM_ENERGY_POWDER":30,"ITEM_ENERGY_ROOT":31,"ITEM_ENIGMA_BERRY":175,"ITEM_EON_TICKET":275,"ITEM_ESCAPE_ROPE":85,"ITEM_ETHER":34,"ITEM_EVERSTONE":195,"ITEM_EXP_SHARE":182,"ITEM_FAB_MAIL":131,"ITEM_FAME_CHECKER":363,"ITEM_FIGY_BERRY":143,"ITEM_FIRE_STONE":95,"ITEM_FLUFFY_TAIL":81,"ITEM_FOCUS_BAND":196,"ITEM_FRESH_WATER":26,"ITEM_FULL_HEAL":23,"ITEM_FULL_RESTORE":19,"ITEM_GANLON_BERRY":169,"ITEM_GLITTER_MAIL":123,"ITEM_GOLD_TEETH":353,"ITEM_GOOD_ROD":263,"ITEM_GO_GOGGLES":279,"ITEM_GREAT_BALL":3,"ITEM_GREEN_SCARF":257,"ITEM_GREEN_SHARD":51,"ITEM_GREPA_BERRY":157,"ITEM_GUARD_SPEC":73,"ITEM_HARBOR_MAIL":122,"ITEM_HARD_STONE":204,"ITEM_HEAL_POWDER":32,"ITEM_HEART_SCALE":111,"ITEM_HELIX_FOSSIL":357,"ITEM_HM01":339,"ITEM_HM02":340,"ITEM_HM03":341,"ITEM_HM04":342,"ITEM_HM05":343,"ITEM_HM06":344,"ITEM_HM07":345,"ITEM_HM08":346,"ITEM_HM_CUT":339,"ITEM_HM_DIVE":346,"ITEM_HM_FLASH":343,"ITEM_HM_FLY":340,"ITEM_HM_ROCK_SMASH":344,"ITEM_HM_STRENGTH":342,"ITEM_HM_SURF":341,"ITEM_HM_WATERFALL":345,"ITEM_HONDEW_BERRY":156,"ITEM_HP_UP":63,"ITEM_HYPER_POTION":21,"ITEM_IAPAPA_BERRY":147,"ITEM_ICE_HEAL":16,"ITEM_IRON":65,"ITEM_ITEMFINDER":261,"ITEM_KELPSY_BERRY":154,"ITEM_KINGS_ROCK":187,"ITEM_LANSAT_BERRY":173,"ITEM_LAVA_COOKIE":38,"ITEM_LAX_INCENSE":221,"ITEM_LEAF_STONE":98,"ITEM_LEFTOVERS":200,"ITEM_LEMONADE":28,"ITEM_LEPPA_BERRY":138,"ITEM_LETTER":274,"ITEM_LIECHI_BERRY":168,"ITEM_LIFT_KEY":356,"ITEM_LIGHT_BALL":202,"ITEM_LIST_END":65535,"ITEM_LUCKY_EGG":197,"ITEM_LUCKY_PUNCH":222,"ITEM_LUM_BERRY":141,"ITEM_LUXURY_BALL":11,"ITEM_MACHO_BRACE":181,"ITEM_MACH_BIKE":259,"ITEM_MAGMA_EMBLEM":375,"ITEM_MAGNET":208,"ITEM_MAGOST_BERRY":160,"ITEM_MAGO_BERRY":145,"ITEM_MASTER_BALL":1,"ITEM_MAX_ELIXIR":37,"ITEM_MAX_ETHER":35,"ITEM_MAX_POTION":20,"ITEM_MAX_REPEL":84,"ITEM_MAX_REVIVE":25,"ITEM_MECH_MAIL":124,"ITEM_MENTAL_HERB":185,"ITEM_METAL_COAT":199,"ITEM_METAL_POWDER":223,"ITEM_METEORITE":280,"ITEM_MIRACLE_SEED":205,"ITEM_MOOMOO_MILK":29,"ITEM_MOON_STONE":94,"ITEM_MYSTIC_TICKET":370,"ITEM_MYSTIC_WATER":209,"ITEM_NANAB_BERRY":150,"ITEM_NEST_BALL":8,"ITEM_NET_BALL":6,"ITEM_NEVER_MELT_ICE":212,"ITEM_NOMEL_BERRY":162,"ITEM_NONE":0,"ITEM_NUGGET":110,"ITEM_OAKS_PARCEL":349,"ITEM_OLD_AMBER":354,"ITEM_OLD_ROD":262,"ITEM_OLD_SEA_MAP":376,"ITEM_ORANGE_MAIL":121,"ITEM_ORAN_BERRY":139,"ITEM_PAMTRE_BERRY":164,"ITEM_PARALYZE_HEAL":18,"ITEM_PEARL":106,"ITEM_PECHA_BERRY":135,"ITEM_PERSIM_BERRY":140,"ITEM_PETAYA_BERRY":171,"ITEM_PINAP_BERRY":152,"ITEM_PINK_SCARF":256,"ITEM_POISON_BARB":211,"ITEM_POKEBLOCK_CASE":273,"ITEM_POKE_BALL":4,"ITEM_POKE_DOLL":80,"ITEM_POKE_FLUTE":350,"ITEM_POMEG_BERRY":153,"ITEM_POTION":13,"ITEM_POWDER_JAR":372,"ITEM_PP_MAX":71,"ITEM_PP_UP":69,"ITEM_PREMIER_BALL":12,"ITEM_PROTEIN":64,"ITEM_QUALOT_BERRY":155,"ITEM_QUICK_CLAW":183,"ITEM_RABUTA_BERRY":161,"ITEM_RAINBOW_PASS":368,"ITEM_RARE_CANDY":68,"ITEM_RAWST_BERRY":136,"ITEM_RAZZ_BERRY":148,"ITEM_RED_FLUTE":41,"ITEM_RED_ORB":276,"ITEM_RED_SCARF":254,"ITEM_RED_SHARD":48,"ITEM_REPEAT_BALL":9,"ITEM_REPEL":86,"ITEM_RETRO_MAIL":132,"ITEM_REVIVAL_HERB":33,"ITEM_REVIVE":24,"ITEM_ROOM_1_KEY":281,"ITEM_ROOM_2_KEY":282,"ITEM_ROOM_4_KEY":283,"ITEM_ROOM_6_KEY":284,"ITEM_ROOT_FOSSIL":286,"ITEM_RUBY":373,"ITEM_SACRED_ASH":45,"ITEM_SAFARI_BALL":5,"ITEM_SALAC_BERRY":170,"ITEM_SAPPHIRE":374,"ITEM_SCANNER":278,"ITEM_SCOPE_LENS":198,"ITEM_SEA_INCENSE":220,"ITEM_SECRET_KEY":351,"ITEM_SHADOW_MAIL":128,"ITEM_SHARP_BEAK":210,"ITEM_SHELL_BELL":219,"ITEM_SHOAL_SALT":46,"ITEM_SHOAL_SHELL":47,"ITEM_SILK_SCARF":217,"ITEM_SILPH_SCOPE":359,"ITEM_SILVER_POWDER":188,"ITEM_SITRUS_BERRY":142,"ITEM_SMOKE_BALL":194,"ITEM_SODA_POP":27,"ITEM_SOFT_SAND":203,"ITEM_SOOTHE_BELL":184,"ITEM_SOOT_SACK":270,"ITEM_SOUL_DEW":191,"ITEM_SPELL_TAG":213,"ITEM_SPELON_BERRY":163,"ITEM_SS_TICKET":265,"ITEM_STARDUST":108,"ITEM_STARF_BERRY":174,"ITEM_STAR_PIECE":109,"ITEM_STICK":225,"ITEM_STORAGE_KEY":285,"ITEM_SUN_STONE":93,"ITEM_SUPER_POTION":22,"ITEM_SUPER_REPEL":83,"ITEM_SUPER_ROD":264,"ITEM_TAMATO_BERRY":158,"ITEM_TEA":369,"ITEM_TEACHY_TV":366,"ITEM_THICK_CLUB":224,"ITEM_THUNDER_STONE":96,"ITEM_TIMER_BALL":10,"ITEM_TINY_MUSHROOM":103,"ITEM_TM01":289,"ITEM_TM02":290,"ITEM_TM03":291,"ITEM_TM04":292,"ITEM_TM05":293,"ITEM_TM06":294,"ITEM_TM07":295,"ITEM_TM08":296,"ITEM_TM09":297,"ITEM_TM10":298,"ITEM_TM11":299,"ITEM_TM12":300,"ITEM_TM13":301,"ITEM_TM14":302,"ITEM_TM15":303,"ITEM_TM16":304,"ITEM_TM17":305,"ITEM_TM18":306,"ITEM_TM19":307,"ITEM_TM20":308,"ITEM_TM21":309,"ITEM_TM22":310,"ITEM_TM23":311,"ITEM_TM24":312,"ITEM_TM25":313,"ITEM_TM26":314,"ITEM_TM27":315,"ITEM_TM28":316,"ITEM_TM29":317,"ITEM_TM30":318,"ITEM_TM31":319,"ITEM_TM32":320,"ITEM_TM33":321,"ITEM_TM34":322,"ITEM_TM35":323,"ITEM_TM36":324,"ITEM_TM37":325,"ITEM_TM38":326,"ITEM_TM39":327,"ITEM_TM40":328,"ITEM_TM41":329,"ITEM_TM42":330,"ITEM_TM43":331,"ITEM_TM44":332,"ITEM_TM45":333,"ITEM_TM46":334,"ITEM_TM47":335,"ITEM_TM48":336,"ITEM_TM49":337,"ITEM_TM50":338,"ITEM_TM_AERIAL_ACE":328,"ITEM_TM_ATTRACT":333,"ITEM_TM_BLIZZARD":302,"ITEM_TM_BRICK_BREAK":319,"ITEM_TM_BULK_UP":296,"ITEM_TM_BULLET_SEED":297,"ITEM_TM_CALM_MIND":292,"ITEM_TM_CASE":364,"ITEM_TM_DIG":316,"ITEM_TM_DOUBLE_TEAM":320,"ITEM_TM_DRAGON_CLAW":290,"ITEM_TM_EARTHQUAKE":314,"ITEM_TM_FACADE":330,"ITEM_TM_FIRE_BLAST":326,"ITEM_TM_FLAMETHROWER":323,"ITEM_TM_FOCUS_PUNCH":289,"ITEM_TM_FRUSTRATION":309,"ITEM_TM_GIGA_DRAIN":307,"ITEM_TM_HAIL":295,"ITEM_TM_HIDDEN_POWER":298,"ITEM_TM_HYPER_BEAM":303,"ITEM_TM_ICE_BEAM":301,"ITEM_TM_IRON_TAIL":311,"ITEM_TM_LIGHT_SCREEN":304,"ITEM_TM_OVERHEAT":338,"ITEM_TM_PROTECT":305,"ITEM_TM_PSYCHIC":317,"ITEM_TM_RAIN_DANCE":306,"ITEM_TM_REFLECT":321,"ITEM_TM_REST":332,"ITEM_TM_RETURN":315,"ITEM_TM_ROAR":293,"ITEM_TM_ROCK_TOMB":327,"ITEM_TM_SAFEGUARD":308,"ITEM_TM_SANDSTORM":325,"ITEM_TM_SECRET_POWER":331,"ITEM_TM_SHADOW_BALL":318,"ITEM_TM_SHOCK_WAVE":322,"ITEM_TM_SKILL_SWAP":336,"ITEM_TM_SLUDGE_BOMB":324,"ITEM_TM_SNATCH":337,"ITEM_TM_SOLAR_BEAM":310,"ITEM_TM_STEEL_WING":335,"ITEM_TM_SUNNY_DAY":299,"ITEM_TM_TAUNT":300,"ITEM_TM_THIEF":334,"ITEM_TM_THUNDER":313,"ITEM_TM_THUNDERBOLT":312,"ITEM_TM_TORMENT":329,"ITEM_TM_TOXIC":294,"ITEM_TM_WATER_PULSE":291,"ITEM_TOWN_MAP":361,"ITEM_TRI_PASS":367,"ITEM_TROPIC_MAIL":129,"ITEM_TWISTED_SPOON":214,"ITEM_ULTRA_BALL":2,"ITEM_UNUSED_BERRY_1":176,"ITEM_UNUSED_BERRY_2":177,"ITEM_UNUSED_BERRY_3":178,"ITEM_UP_GRADE":218,"ITEM_USE_BAG_MENU":4,"ITEM_USE_FIELD":2,"ITEM_USE_MAIL":0,"ITEM_USE_PARTY_MENU":1,"ITEM_USE_PBLOCK_CASE":3,"ITEM_VS_SEEKER":362,"ITEM_WAILMER_PAIL":268,"ITEM_WATER_STONE":97,"ITEM_WATMEL_BERRY":165,"ITEM_WAVE_MAIL":126,"ITEM_WEPEAR_BERRY":151,"ITEM_WHITE_FLUTE":43,"ITEM_WHITE_HERB":180,"ITEM_WIKI_BERRY":144,"ITEM_WOOD_MAIL":125,"ITEM_X_ACCURACY":78,"ITEM_X_ATTACK":75,"ITEM_X_DEFEND":76,"ITEM_X_SPECIAL":79,"ITEM_X_SPEED":77,"ITEM_YELLOW_FLUTE":40,"ITEM_YELLOW_SCARF":258,"ITEM_YELLOW_SHARD":50,"ITEM_ZINC":70,"LAST_BALL":12,"LAST_BERRY_INDEX":175,"LAST_BERRY_MASTER_BERRY":162,"LAST_BERRY_MASTER_WIFE_BERRY":142,"LAST_KIRI_BERRY":162,"LAST_ROUTE_114_MAN_BERRY":152,"MACH_BIKE":0,"MAIL_NONE":255,"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":6207,"MAP_ABANDONED_SHIP_CORRIDORS_1F":6199,"MAP_ABANDONED_SHIP_CORRIDORS_B1F":6201,"MAP_ABANDONED_SHIP_DECK":6198,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":6209,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":6210,"MAP_ABANDONED_SHIP_ROOMS2_1F":6206,"MAP_ABANDONED_SHIP_ROOMS2_B1F":6203,"MAP_ABANDONED_SHIP_ROOMS_1F":6200,"MAP_ABANDONED_SHIP_ROOMS_B1F":6202,"MAP_ABANDONED_SHIP_ROOM_B1F":6205,"MAP_ABANDONED_SHIP_UNDERWATER1":6204,"MAP_ABANDONED_SHIP_UNDERWATER2":6208,"MAP_ALTERING_CAVE":6250,"MAP_ANCIENT_TOMB":6212,"MAP_AQUA_HIDEOUT_1F":6167,"MAP_AQUA_HIDEOUT_B1F":6168,"MAP_AQUA_HIDEOUT_B2F":6169,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":6218,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":6219,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":6220,"MAP_ARTISAN_CAVE_1F":6244,"MAP_ARTISAN_CAVE_B1F":6243,"MAP_BATTLE_COLOSSEUM_2P":6424,"MAP_BATTLE_COLOSSEUM_4P":6427,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":6686,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":6685,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":6684,"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":6677,"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":6675,"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":6674,"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":6676,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":6689,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":6687,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":6688,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":6680,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":6679,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":6678,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":6691,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":6690,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":6694,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":6693,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":6695,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":6692,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":6682,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":6681,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":6683,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":6664,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":6663,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":6662,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":6661,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":6673,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":6672,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":6671,"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":6698,"MAP_BATTLE_FRONTIER_LOUNGE1":6697,"MAP_BATTLE_FRONTIER_LOUNGE2":6699,"MAP_BATTLE_FRONTIER_LOUNGE3":6700,"MAP_BATTLE_FRONTIER_LOUNGE4":6701,"MAP_BATTLE_FRONTIER_LOUNGE5":6703,"MAP_BATTLE_FRONTIER_LOUNGE6":6704,"MAP_BATTLE_FRONTIER_LOUNGE7":6705,"MAP_BATTLE_FRONTIER_LOUNGE8":6707,"MAP_BATTLE_FRONTIER_LOUNGE9":6708,"MAP_BATTLE_FRONTIER_MART":6711,"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":6670,"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":6660,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":6709,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":6710,"MAP_BATTLE_FRONTIER_RANKING_HALL":6696,"MAP_BATTLE_FRONTIER_RECEPTION_GATE":6706,"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":6702,"MAP_BATTLE_PYRAMID_SQUARE01":6444,"MAP_BATTLE_PYRAMID_SQUARE02":6445,"MAP_BATTLE_PYRAMID_SQUARE03":6446,"MAP_BATTLE_PYRAMID_SQUARE04":6447,"MAP_BATTLE_PYRAMID_SQUARE05":6448,"MAP_BATTLE_PYRAMID_SQUARE06":6449,"MAP_BATTLE_PYRAMID_SQUARE07":6450,"MAP_BATTLE_PYRAMID_SQUARE08":6451,"MAP_BATTLE_PYRAMID_SQUARE09":6452,"MAP_BATTLE_PYRAMID_SQUARE10":6453,"MAP_BATTLE_PYRAMID_SQUARE11":6454,"MAP_BATTLE_PYRAMID_SQUARE12":6455,"MAP_BATTLE_PYRAMID_SQUARE13":6456,"MAP_BATTLE_PYRAMID_SQUARE14":6457,"MAP_BATTLE_PYRAMID_SQUARE15":6458,"MAP_BATTLE_PYRAMID_SQUARE16":6459,"MAP_BIRTH_ISLAND_EXTERIOR":6714,"MAP_BIRTH_ISLAND_HARBOR":6715,"MAP_CAVE_OF_ORIGIN_1F":6182,"MAP_CAVE_OF_ORIGIN_B1F":6186,"MAP_CAVE_OF_ORIGIN_ENTRANCE":6181,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":6183,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":6184,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":6185,"MAP_CONTEST_HALL":6428,"MAP_CONTEST_HALL_BEAUTY":6435,"MAP_CONTEST_HALL_COOL":6437,"MAP_CONTEST_HALL_CUTE":6439,"MAP_CONTEST_HALL_SMART":6438,"MAP_CONTEST_HALL_TOUGH":6436,"MAP_DESERT_RUINS":6150,"MAP_DESERT_UNDERPASS":6242,"MAP_DEWFORD_TOWN":11,"MAP_DEWFORD_TOWN_GYM":771,"MAP_DEWFORD_TOWN_HALL":772,"MAP_DEWFORD_TOWN_HOUSE1":768,"MAP_DEWFORD_TOWN_HOUSE2":773,"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":769,"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":770,"MAP_EVER_GRANDE_CITY":8,"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":4100,"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":4099,"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":4098,"MAP_EVER_GRANDE_CITY_HALL1":4101,"MAP_EVER_GRANDE_CITY_HALL2":4102,"MAP_EVER_GRANDE_CITY_HALL3":4103,"MAP_EVER_GRANDE_CITY_HALL4":4104,"MAP_EVER_GRANDE_CITY_HALL5":4105,"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":4107,"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":4097,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":4108,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":4109,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":4106,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":4110,"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":4096,"MAP_FALLARBOR_TOWN":13,"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":1283,"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":1282,"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":1281,"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":1286,"MAP_FALLARBOR_TOWN_MART":1280,"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":1287,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":1284,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":1285,"MAP_FARAWAY_ISLAND_ENTRANCE":6712,"MAP_FARAWAY_ISLAND_INTERIOR":6713,"MAP_FIERY_PATH":6158,"MAP_FORTREE_CITY":4,"MAP_FORTREE_CITY_DECORATION_SHOP":3081,"MAP_FORTREE_CITY_GYM":3073,"MAP_FORTREE_CITY_HOUSE1":3072,"MAP_FORTREE_CITY_HOUSE2":3077,"MAP_FORTREE_CITY_HOUSE3":3078,"MAP_FORTREE_CITY_HOUSE4":3079,"MAP_FORTREE_CITY_HOUSE5":3080,"MAP_FORTREE_CITY_MART":3076,"MAP_FORTREE_CITY_POKEMON_CENTER_1F":3074,"MAP_FORTREE_CITY_POKEMON_CENTER_2F":3075,"MAP_GRANITE_CAVE_1F":6151,"MAP_GRANITE_CAVE_B1F":6152,"MAP_GRANITE_CAVE_B2F":6153,"MAP_GRANITE_CAVE_STEVENS_ROOM":6154,"MAP_GROUPS_COUNT":34,"MAP_INSIDE_OF_TRUCK":6440,"MAP_ISLAND_CAVE":6211,"MAP_JAGGED_PASS":6157,"MAP_LAVARIDGE_TOWN":12,"MAP_LAVARIDGE_TOWN_GYM_1F":1025,"MAP_LAVARIDGE_TOWN_GYM_B1F":1026,"MAP_LAVARIDGE_TOWN_HERB_SHOP":1024,"MAP_LAVARIDGE_TOWN_HOUSE":1027,"MAP_LAVARIDGE_TOWN_MART":1028,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":1029,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":1030,"MAP_LILYCOVE_CITY":5,"MAP_LILYCOVE_CITY_CONTEST_HALL":3333,"MAP_LILYCOVE_CITY_CONTEST_LOBBY":3332,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":3328,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":3329,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":3344,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":3345,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":3346,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":3347,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":3348,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":3350,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":3349,"MAP_LILYCOVE_CITY_HARBOR":3338,"MAP_LILYCOVE_CITY_HOUSE1":3340,"MAP_LILYCOVE_CITY_HOUSE2":3341,"MAP_LILYCOVE_CITY_HOUSE3":3342,"MAP_LILYCOVE_CITY_HOUSE4":3343,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":3330,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":3331,"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":3339,"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":3334,"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":3335,"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":3337,"MAP_LILYCOVE_CITY_UNUSED_MART":3336,"MAP_LITTLEROOT_TOWN":9,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":256,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":257,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":258,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":259,"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":260,"MAP_MAGMA_HIDEOUT_1F":6230,"MAP_MAGMA_HIDEOUT_2F_1R":6231,"MAP_MAGMA_HIDEOUT_2F_2R":6232,"MAP_MAGMA_HIDEOUT_2F_3R":6237,"MAP_MAGMA_HIDEOUT_3F_1R":6233,"MAP_MAGMA_HIDEOUT_3F_2R":6234,"MAP_MAGMA_HIDEOUT_3F_3R":6236,"MAP_MAGMA_HIDEOUT_4F":6235,"MAP_MARINE_CAVE_END":6247,"MAP_MARINE_CAVE_ENTRANCE":6246,"MAP_MAUVILLE_CITY":2,"MAP_MAUVILLE_CITY_BIKE_SHOP":2561,"MAP_MAUVILLE_CITY_GAME_CORNER":2563,"MAP_MAUVILLE_CITY_GYM":2560,"MAP_MAUVILLE_CITY_HOUSE1":2562,"MAP_MAUVILLE_CITY_HOUSE2":2564,"MAP_MAUVILLE_CITY_MART":2567,"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":2565,"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":2566,"MAP_METEOR_FALLS_1F_1R":6144,"MAP_METEOR_FALLS_1F_2R":6145,"MAP_METEOR_FALLS_B1F_1R":6146,"MAP_METEOR_FALLS_B1F_2R":6147,"MAP_METEOR_FALLS_STEVENS_CAVE":6251,"MAP_MIRAGE_TOWER_1F":6238,"MAP_MIRAGE_TOWER_2F":6239,"MAP_MIRAGE_TOWER_3F":6240,"MAP_MIRAGE_TOWER_4F":6241,"MAP_MOSSDEEP_CITY":6,"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":3595,"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":3596,"MAP_MOSSDEEP_CITY_GYM":3584,"MAP_MOSSDEEP_CITY_HOUSE1":3585,"MAP_MOSSDEEP_CITY_HOUSE2":3586,"MAP_MOSSDEEP_CITY_HOUSE3":3590,"MAP_MOSSDEEP_CITY_HOUSE4":3592,"MAP_MOSSDEEP_CITY_MART":3589,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":3587,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":3588,"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":3593,"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":3594,"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":3591,"MAP_MT_CHIMNEY":6156,"MAP_MT_CHIMNEY_CABLE_CAR_STATION":4865,"MAP_MT_PYRE_1F":6159,"MAP_MT_PYRE_2F":6160,"MAP_MT_PYRE_3F":6161,"MAP_MT_PYRE_4F":6162,"MAP_MT_PYRE_5F":6163,"MAP_MT_PYRE_6F":6164,"MAP_MT_PYRE_EXTERIOR":6165,"MAP_MT_PYRE_SUMMIT":6166,"MAP_NAVEL_ROCK_B1F":6725,"MAP_NAVEL_ROCK_BOTTOM":6743,"MAP_NAVEL_ROCK_DOWN01":6732,"MAP_NAVEL_ROCK_DOWN02":6733,"MAP_NAVEL_ROCK_DOWN03":6734,"MAP_NAVEL_ROCK_DOWN04":6735,"MAP_NAVEL_ROCK_DOWN05":6736,"MAP_NAVEL_ROCK_DOWN06":6737,"MAP_NAVEL_ROCK_DOWN07":6738,"MAP_NAVEL_ROCK_DOWN08":6739,"MAP_NAVEL_ROCK_DOWN09":6740,"MAP_NAVEL_ROCK_DOWN10":6741,"MAP_NAVEL_ROCK_DOWN11":6742,"MAP_NAVEL_ROCK_ENTRANCE":6724,"MAP_NAVEL_ROCK_EXTERIOR":6722,"MAP_NAVEL_ROCK_FORK":6726,"MAP_NAVEL_ROCK_HARBOR":6723,"MAP_NAVEL_ROCK_TOP":6731,"MAP_NAVEL_ROCK_UP1":6727,"MAP_NAVEL_ROCK_UP2":6728,"MAP_NAVEL_ROCK_UP3":6729,"MAP_NAVEL_ROCK_UP4":6730,"MAP_NEW_MAUVILLE_ENTRANCE":6196,"MAP_NEW_MAUVILLE_INSIDE":6197,"MAP_OLDALE_TOWN":10,"MAP_OLDALE_TOWN_HOUSE1":512,"MAP_OLDALE_TOWN_HOUSE2":513,"MAP_OLDALE_TOWN_MART":516,"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":514,"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":515,"MAP_PACIFIDLOG_TOWN":15,"MAP_PACIFIDLOG_TOWN_HOUSE1":1794,"MAP_PACIFIDLOG_TOWN_HOUSE2":1795,"MAP_PACIFIDLOG_TOWN_HOUSE3":1796,"MAP_PACIFIDLOG_TOWN_HOUSE4":1797,"MAP_PACIFIDLOG_TOWN_HOUSE5":1798,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":1792,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":1793,"MAP_PETALBURG_CITY":0,"MAP_PETALBURG_CITY_GYM":2049,"MAP_PETALBURG_CITY_HOUSE1":2050,"MAP_PETALBURG_CITY_HOUSE2":2051,"MAP_PETALBURG_CITY_MART":2054,"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":2052,"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":2053,"MAP_PETALBURG_CITY_WALLYS_HOUSE":2048,"MAP_PETALBURG_WOODS":6155,"MAP_RECORD_CORNER":6426,"MAP_ROUTE101":16,"MAP_ROUTE102":17,"MAP_ROUTE103":18,"MAP_ROUTE104":19,"MAP_ROUTE104_MR_BRINEYS_HOUSE":4352,"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":4353,"MAP_ROUTE104_PROTOTYPE":6912,"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":6913,"MAP_ROUTE105":20,"MAP_ROUTE106":21,"MAP_ROUTE107":22,"MAP_ROUTE108":23,"MAP_ROUTE109":24,"MAP_ROUTE109_SEASHORE_HOUSE":7168,"MAP_ROUTE110":25,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":7435,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":7436,"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":7426,"MAP_ROUTE110_TRICK_HOUSE_END":7425,"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":7424,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":7427,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":7428,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":7429,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":7430,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":7431,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":7432,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":7433,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":7434,"MAP_ROUTE111":26,"MAP_ROUTE111_OLD_LADYS_REST_STOP":4609,"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":4608,"MAP_ROUTE112":27,"MAP_ROUTE112_CABLE_CAR_STATION":4864,"MAP_ROUTE113":28,"MAP_ROUTE113_GLASS_WORKSHOP":7680,"MAP_ROUTE114":29,"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":5120,"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":5121,"MAP_ROUTE114_LANETTES_HOUSE":5122,"MAP_ROUTE115":30,"MAP_ROUTE116":31,"MAP_ROUTE116_TUNNELERS_REST_HOUSE":5376,"MAP_ROUTE117":32,"MAP_ROUTE117_POKEMON_DAY_CARE":5632,"MAP_ROUTE118":33,"MAP_ROUTE119":34,"MAP_ROUTE119_HOUSE":8194,"MAP_ROUTE119_WEATHER_INSTITUTE_1F":8192,"MAP_ROUTE119_WEATHER_INSTITUTE_2F":8193,"MAP_ROUTE120":35,"MAP_ROUTE121":36,"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":5888,"MAP_ROUTE122":37,"MAP_ROUTE123":38,"MAP_ROUTE123_BERRY_MASTERS_HOUSE":7936,"MAP_ROUTE124":39,"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":8448,"MAP_ROUTE125":40,"MAP_ROUTE126":41,"MAP_ROUTE127":42,"MAP_ROUTE128":43,"MAP_ROUTE129":44,"MAP_ROUTE130":45,"MAP_ROUTE131":46,"MAP_ROUTE132":47,"MAP_ROUTE133":48,"MAP_ROUTE134":49,"MAP_RUSTBORO_CITY":3,"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":2827,"MAP_RUSTBORO_CITY_DEVON_CORP_1F":2816,"MAP_RUSTBORO_CITY_DEVON_CORP_2F":2817,"MAP_RUSTBORO_CITY_DEVON_CORP_3F":2818,"MAP_RUSTBORO_CITY_FLAT1_1F":2824,"MAP_RUSTBORO_CITY_FLAT1_2F":2825,"MAP_RUSTBORO_CITY_FLAT2_1F":2829,"MAP_RUSTBORO_CITY_FLAT2_2F":2830,"MAP_RUSTBORO_CITY_FLAT2_3F":2831,"MAP_RUSTBORO_CITY_GYM":2819,"MAP_RUSTBORO_CITY_HOUSE1":2826,"MAP_RUSTBORO_CITY_HOUSE2":2828,"MAP_RUSTBORO_CITY_HOUSE3":2832,"MAP_RUSTBORO_CITY_MART":2823,"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":2821,"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":2822,"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":2820,"MAP_RUSTURF_TUNNEL":6148,"MAP_SAFARI_ZONE_NORTH":6657,"MAP_SAFARI_ZONE_NORTHEAST":6668,"MAP_SAFARI_ZONE_NORTHWEST":6656,"MAP_SAFARI_ZONE_REST_HOUSE":6667,"MAP_SAFARI_ZONE_SOUTH":6659,"MAP_SAFARI_ZONE_SOUTHEAST":6669,"MAP_SAFARI_ZONE_SOUTHWEST":6658,"MAP_SCORCHED_SLAB":6217,"MAP_SEAFLOOR_CAVERN_ENTRANCE":6171,"MAP_SEAFLOOR_CAVERN_ROOM1":6172,"MAP_SEAFLOOR_CAVERN_ROOM2":6173,"MAP_SEAFLOOR_CAVERN_ROOM3":6174,"MAP_SEAFLOOR_CAVERN_ROOM4":6175,"MAP_SEAFLOOR_CAVERN_ROOM5":6176,"MAP_SEAFLOOR_CAVERN_ROOM6":6177,"MAP_SEAFLOOR_CAVERN_ROOM7":6178,"MAP_SEAFLOOR_CAVERN_ROOM8":6179,"MAP_SEAFLOOR_CAVERN_ROOM9":6180,"MAP_SEALED_CHAMBER_INNER_ROOM":6216,"MAP_SEALED_CHAMBER_OUTER_ROOM":6215,"MAP_SECRET_BASE_BLUE_CAVE1":6402,"MAP_SECRET_BASE_BLUE_CAVE2":6408,"MAP_SECRET_BASE_BLUE_CAVE3":6414,"MAP_SECRET_BASE_BLUE_CAVE4":6420,"MAP_SECRET_BASE_BROWN_CAVE1":6401,"MAP_SECRET_BASE_BROWN_CAVE2":6407,"MAP_SECRET_BASE_BROWN_CAVE3":6413,"MAP_SECRET_BASE_BROWN_CAVE4":6419,"MAP_SECRET_BASE_RED_CAVE1":6400,"MAP_SECRET_BASE_RED_CAVE2":6406,"MAP_SECRET_BASE_RED_CAVE3":6412,"MAP_SECRET_BASE_RED_CAVE4":6418,"MAP_SECRET_BASE_SHRUB1":6405,"MAP_SECRET_BASE_SHRUB2":6411,"MAP_SECRET_BASE_SHRUB3":6417,"MAP_SECRET_BASE_SHRUB4":6423,"MAP_SECRET_BASE_TREE1":6404,"MAP_SECRET_BASE_TREE2":6410,"MAP_SECRET_BASE_TREE3":6416,"MAP_SECRET_BASE_TREE4":6422,"MAP_SECRET_BASE_YELLOW_CAVE1":6403,"MAP_SECRET_BASE_YELLOW_CAVE2":6409,"MAP_SECRET_BASE_YELLOW_CAVE3":6415,"MAP_SECRET_BASE_YELLOW_CAVE4":6421,"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":6194,"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":6195,"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":6190,"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":6227,"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":6191,"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":6193,"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":6192,"MAP_SKY_PILLAR_1F":6223,"MAP_SKY_PILLAR_2F":6224,"MAP_SKY_PILLAR_3F":6225,"MAP_SKY_PILLAR_4F":6226,"MAP_SKY_PILLAR_5F":6228,"MAP_SKY_PILLAR_ENTRANCE":6221,"MAP_SKY_PILLAR_OUTSIDE":6222,"MAP_SKY_PILLAR_TOP":6229,"MAP_SLATEPORT_CITY":1,"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":2308,"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":2307,"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":2306,"MAP_SLATEPORT_CITY_HARBOR":2313,"MAP_SLATEPORT_CITY_HOUSE":2314,"MAP_SLATEPORT_CITY_MART":2317,"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":2309,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":2311,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":2312,"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":2315,"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":2316,"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":2310,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":2304,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":2305,"MAP_SOOTOPOLIS_CITY":7,"MAP_SOOTOPOLIS_CITY_GYM_1F":3840,"MAP_SOOTOPOLIS_CITY_GYM_B1F":3841,"MAP_SOOTOPOLIS_CITY_HOUSE1":3845,"MAP_SOOTOPOLIS_CITY_HOUSE2":3846,"MAP_SOOTOPOLIS_CITY_HOUSE3":3847,"MAP_SOOTOPOLIS_CITY_HOUSE4":3848,"MAP_SOOTOPOLIS_CITY_HOUSE5":3849,"MAP_SOOTOPOLIS_CITY_HOUSE6":3850,"MAP_SOOTOPOLIS_CITY_HOUSE7":3851,"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":3852,"MAP_SOOTOPOLIS_CITY_MART":3844,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":3853,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":3854,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":3842,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":3843,"MAP_SOUTHERN_ISLAND_EXTERIOR":6665,"MAP_SOUTHERN_ISLAND_INTERIOR":6666,"MAP_SS_TIDAL_CORRIDOR":6441,"MAP_SS_TIDAL_LOWER_DECK":6442,"MAP_SS_TIDAL_ROOMS":6443,"MAP_TERRA_CAVE_END":6249,"MAP_TERRA_CAVE_ENTRANCE":6248,"MAP_TRADE_CENTER":6425,"MAP_TRAINER_HILL_1F":6717,"MAP_TRAINER_HILL_2F":6718,"MAP_TRAINER_HILL_3F":6719,"MAP_TRAINER_HILL_4F":6720,"MAP_TRAINER_HILL_ELEVATOR":6744,"MAP_TRAINER_HILL_ENTRANCE":6716,"MAP_TRAINER_HILL_ROOF":6721,"MAP_UNDERWATER_MARINE_CAVE":6245,"MAP_UNDERWATER_ROUTE105":55,"MAP_UNDERWATER_ROUTE124":50,"MAP_UNDERWATER_ROUTE125":56,"MAP_UNDERWATER_ROUTE126":51,"MAP_UNDERWATER_ROUTE127":52,"MAP_UNDERWATER_ROUTE128":53,"MAP_UNDERWATER_ROUTE129":54,"MAP_UNDERWATER_ROUTE134":6213,"MAP_UNDERWATER_SEAFLOOR_CAVERN":6170,"MAP_UNDERWATER_SEALED_CHAMBER":6214,"MAP_UNDERWATER_SOOTOPOLIS_CITY":6149,"MAP_UNION_ROOM":6460,"MAP_UNUSED_CONTEST_HALL1":6429,"MAP_UNUSED_CONTEST_HALL2":6430,"MAP_UNUSED_CONTEST_HALL3":6431,"MAP_UNUSED_CONTEST_HALL4":6432,"MAP_UNUSED_CONTEST_HALL5":6433,"MAP_UNUSED_CONTEST_HALL6":6434,"MAP_VERDANTURF_TOWN":14,"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":1538,"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":1537,"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":1536,"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":1543,"MAP_VERDANTURF_TOWN_HOUSE":1544,"MAP_VERDANTURF_TOWN_MART":1539,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":1540,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":1541,"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":1542,"MAP_VICTORY_ROAD_1F":6187,"MAP_VICTORY_ROAD_B1F":6188,"MAP_VICTORY_ROAD_B2F":6189,"MAX_BAG_ITEM_CAPACITY":99,"MAX_BERRY_CAPACITY":999,"MAX_BERRY_INDEX":178,"MAX_ITEM_DIGITS":3,"MAX_PC_ITEM_CAPACITY":999,"MAX_TRAINERS_COUNT":864,"MOVES_COUNT":355,"MOVE_ABSORB":71,"MOVE_ACID":51,"MOVE_ACID_ARMOR":151,"MOVE_AERIAL_ACE":332,"MOVE_AEROBLAST":177,"MOVE_AGILITY":97,"MOVE_AIR_CUTTER":314,"MOVE_AMNESIA":133,"MOVE_ANCIENT_POWER":246,"MOVE_ARM_THRUST":292,"MOVE_AROMATHERAPY":312,"MOVE_ASSIST":274,"MOVE_ASTONISH":310,"MOVE_ATTRACT":213,"MOVE_AURORA_BEAM":62,"MOVE_BARRAGE":140,"MOVE_BARRIER":112,"MOVE_BATON_PASS":226,"MOVE_BEAT_UP":251,"MOVE_BELLY_DRUM":187,"MOVE_BIDE":117,"MOVE_BIND":20,"MOVE_BITE":44,"MOVE_BLAST_BURN":307,"MOVE_BLAZE_KICK":299,"MOVE_BLIZZARD":59,"MOVE_BLOCK":335,"MOVE_BODY_SLAM":34,"MOVE_BONEMERANG":155,"MOVE_BONE_CLUB":125,"MOVE_BONE_RUSH":198,"MOVE_BOUNCE":340,"MOVE_BRICK_BREAK":280,"MOVE_BUBBLE":145,"MOVE_BUBBLE_BEAM":61,"MOVE_BULK_UP":339,"MOVE_BULLET_SEED":331,"MOVE_CALM_MIND":347,"MOVE_CAMOUFLAGE":293,"MOVE_CHARGE":268,"MOVE_CHARM":204,"MOVE_CLAMP":128,"MOVE_COMET_PUNCH":4,"MOVE_CONFUSE_RAY":109,"MOVE_CONFUSION":93,"MOVE_CONSTRICT":132,"MOVE_CONVERSION":160,"MOVE_CONVERSION_2":176,"MOVE_COSMIC_POWER":322,"MOVE_COTTON_SPORE":178,"MOVE_COUNTER":68,"MOVE_COVET":343,"MOVE_CRABHAMMER":152,"MOVE_CROSS_CHOP":238,"MOVE_CRUNCH":242,"MOVE_CRUSH_CLAW":306,"MOVE_CURSE":174,"MOVE_CUT":15,"MOVE_DEFENSE_CURL":111,"MOVE_DESTINY_BOND":194,"MOVE_DETECT":197,"MOVE_DIG":91,"MOVE_DISABLE":50,"MOVE_DIVE":291,"MOVE_DIZZY_PUNCH":146,"MOVE_DOOM_DESIRE":353,"MOVE_DOUBLE_EDGE":38,"MOVE_DOUBLE_KICK":24,"MOVE_DOUBLE_SLAP":3,"MOVE_DOUBLE_TEAM":104,"MOVE_DRAGON_BREATH":225,"MOVE_DRAGON_CLAW":337,"MOVE_DRAGON_DANCE":349,"MOVE_DRAGON_RAGE":82,"MOVE_DREAM_EATER":138,"MOVE_DRILL_PECK":65,"MOVE_DYNAMIC_PUNCH":223,"MOVE_EARTHQUAKE":89,"MOVE_EGG_BOMB":121,"MOVE_EMBER":52,"MOVE_ENCORE":227,"MOVE_ENDEAVOR":283,"MOVE_ENDURE":203,"MOVE_ERUPTION":284,"MOVE_EXPLOSION":153,"MOVE_EXTRASENSORY":326,"MOVE_EXTREME_SPEED":245,"MOVE_FACADE":263,"MOVE_FAINT_ATTACK":185,"MOVE_FAKE_OUT":252,"MOVE_FAKE_TEARS":313,"MOVE_FALSE_SWIPE":206,"MOVE_FEATHER_DANCE":297,"MOVE_FIRE_BLAST":126,"MOVE_FIRE_PUNCH":7,"MOVE_FIRE_SPIN":83,"MOVE_FISSURE":90,"MOVE_FLAIL":175,"MOVE_FLAMETHROWER":53,"MOVE_FLAME_WHEEL":172,"MOVE_FLASH":148,"MOVE_FLATTER":260,"MOVE_FLY":19,"MOVE_FOCUS_ENERGY":116,"MOVE_FOCUS_PUNCH":264,"MOVE_FOLLOW_ME":266,"MOVE_FORESIGHT":193,"MOVE_FRENZY_PLANT":338,"MOVE_FRUSTRATION":218,"MOVE_FURY_ATTACK":31,"MOVE_FURY_CUTTER":210,"MOVE_FURY_SWIPES":154,"MOVE_FUTURE_SIGHT":248,"MOVE_GIGA_DRAIN":202,"MOVE_GLARE":137,"MOVE_GRASS_WHISTLE":320,"MOVE_GROWL":45,"MOVE_GROWTH":74,"MOVE_GRUDGE":288,"MOVE_GUILLOTINE":12,"MOVE_GUST":16,"MOVE_HAIL":258,"MOVE_HARDEN":106,"MOVE_HAZE":114,"MOVE_HEADBUTT":29,"MOVE_HEAL_BELL":215,"MOVE_HEAT_WAVE":257,"MOVE_HELPING_HAND":270,"MOVE_HIDDEN_POWER":237,"MOVE_HI_JUMP_KICK":136,"MOVE_HORN_ATTACK":30,"MOVE_HORN_DRILL":32,"MOVE_HOWL":336,"MOVE_HYDRO_CANNON":308,"MOVE_HYDRO_PUMP":56,"MOVE_HYPER_BEAM":63,"MOVE_HYPER_FANG":158,"MOVE_HYPER_VOICE":304,"MOVE_HYPNOSIS":95,"MOVE_ICE_BALL":301,"MOVE_ICE_BEAM":58,"MOVE_ICE_PUNCH":8,"MOVE_ICICLE_SPEAR":333,"MOVE_ICY_WIND":196,"MOVE_IMPRISON":286,"MOVE_INGRAIN":275,"MOVE_IRON_DEFENSE":334,"MOVE_IRON_TAIL":231,"MOVE_JUMP_KICK":26,"MOVE_KARATE_CHOP":2,"MOVE_KINESIS":134,"MOVE_KNOCK_OFF":282,"MOVE_LEAF_BLADE":348,"MOVE_LEECH_LIFE":141,"MOVE_LEECH_SEED":73,"MOVE_LEER":43,"MOVE_LICK":122,"MOVE_LIGHT_SCREEN":113,"MOVE_LOCK_ON":199,"MOVE_LOVELY_KISS":142,"MOVE_LOW_KICK":67,"MOVE_LUSTER_PURGE":295,"MOVE_MACH_PUNCH":183,"MOVE_MAGICAL_LEAF":345,"MOVE_MAGIC_COAT":277,"MOVE_MAGNITUDE":222,"MOVE_MEAN_LOOK":212,"MOVE_MEDITATE":96,"MOVE_MEGAHORN":224,"MOVE_MEGA_DRAIN":72,"MOVE_MEGA_KICK":25,"MOVE_MEGA_PUNCH":5,"MOVE_MEMENTO":262,"MOVE_METAL_CLAW":232,"MOVE_METAL_SOUND":319,"MOVE_METEOR_MASH":309,"MOVE_METRONOME":118,"MOVE_MILK_DRINK":208,"MOVE_MIMIC":102,"MOVE_MIND_READER":170,"MOVE_MINIMIZE":107,"MOVE_MIRROR_COAT":243,"MOVE_MIRROR_MOVE":119,"MOVE_MIST":54,"MOVE_MIST_BALL":296,"MOVE_MOONLIGHT":236,"MOVE_MORNING_SUN":234,"MOVE_MUDDY_WATER":330,"MOVE_MUD_SHOT":341,"MOVE_MUD_SLAP":189,"MOVE_MUD_SPORT":300,"MOVE_NATURE_POWER":267,"MOVE_NEEDLE_ARM":302,"MOVE_NIGHTMARE":171,"MOVE_NIGHT_SHADE":101,"MOVE_NONE":0,"MOVE_OCTAZOOKA":190,"MOVE_ODOR_SLEUTH":316,"MOVE_OUTRAGE":200,"MOVE_OVERHEAT":315,"MOVE_PAIN_SPLIT":220,"MOVE_PAY_DAY":6,"MOVE_PECK":64,"MOVE_PERISH_SONG":195,"MOVE_PETAL_DANCE":80,"MOVE_PIN_MISSILE":42,"MOVE_POISON_FANG":305,"MOVE_POISON_GAS":139,"MOVE_POISON_POWDER":77,"MOVE_POISON_STING":40,"MOVE_POISON_TAIL":342,"MOVE_POUND":1,"MOVE_POWDER_SNOW":181,"MOVE_PRESENT":217,"MOVE_PROTECT":182,"MOVE_PSYBEAM":60,"MOVE_PSYCHIC":94,"MOVE_PSYCHO_BOOST":354,"MOVE_PSYCH_UP":244,"MOVE_PSYWAVE":149,"MOVE_PURSUIT":228,"MOVE_QUICK_ATTACK":98,"MOVE_RAGE":99,"MOVE_RAIN_DANCE":240,"MOVE_RAPID_SPIN":229,"MOVE_RAZOR_LEAF":75,"MOVE_RAZOR_WIND":13,"MOVE_RECOVER":105,"MOVE_RECYCLE":278,"MOVE_REFLECT":115,"MOVE_REFRESH":287,"MOVE_REST":156,"MOVE_RETURN":216,"MOVE_REVENGE":279,"MOVE_REVERSAL":179,"MOVE_ROAR":46,"MOVE_ROCK_BLAST":350,"MOVE_ROCK_SLIDE":157,"MOVE_ROCK_SMASH":249,"MOVE_ROCK_THROW":88,"MOVE_ROCK_TOMB":317,"MOVE_ROLE_PLAY":272,"MOVE_ROLLING_KICK":27,"MOVE_ROLLOUT":205,"MOVE_SACRED_FIRE":221,"MOVE_SAFEGUARD":219,"MOVE_SANDSTORM":201,"MOVE_SAND_ATTACK":28,"MOVE_SAND_TOMB":328,"MOVE_SCARY_FACE":184,"MOVE_SCRATCH":10,"MOVE_SCREECH":103,"MOVE_SECRET_POWER":290,"MOVE_SEISMIC_TOSS":69,"MOVE_SELF_DESTRUCT":120,"MOVE_SHADOW_BALL":247,"MOVE_SHADOW_PUNCH":325,"MOVE_SHARPEN":159,"MOVE_SHEER_COLD":329,"MOVE_SHOCK_WAVE":351,"MOVE_SIGNAL_BEAM":324,"MOVE_SILVER_WIND":318,"MOVE_SING":47,"MOVE_SKETCH":166,"MOVE_SKILL_SWAP":285,"MOVE_SKULL_BASH":130,"MOVE_SKY_ATTACK":143,"MOVE_SKY_UPPERCUT":327,"MOVE_SLACK_OFF":303,"MOVE_SLAM":21,"MOVE_SLASH":163,"MOVE_SLEEP_POWDER":79,"MOVE_SLEEP_TALK":214,"MOVE_SLUDGE":124,"MOVE_SLUDGE_BOMB":188,"MOVE_SMELLING_SALT":265,"MOVE_SMOG":123,"MOVE_SMOKESCREEN":108,"MOVE_SNATCH":289,"MOVE_SNORE":173,"MOVE_SOFT_BOILED":135,"MOVE_SOLAR_BEAM":76,"MOVE_SONIC_BOOM":49,"MOVE_SPARK":209,"MOVE_SPIDER_WEB":169,"MOVE_SPIKES":191,"MOVE_SPIKE_CANNON":131,"MOVE_SPITE":180,"MOVE_SPIT_UP":255,"MOVE_SPLASH":150,"MOVE_SPORE":147,"MOVE_STEEL_WING":211,"MOVE_STOCKPILE":254,"MOVE_STOMP":23,"MOVE_STRENGTH":70,"MOVE_STRING_SHOT":81,"MOVE_STRUGGLE":165,"MOVE_STUN_SPORE":78,"MOVE_SUBMISSION":66,"MOVE_SUBSTITUTE":164,"MOVE_SUNNY_DAY":241,"MOVE_SUPERPOWER":276,"MOVE_SUPERSONIC":48,"MOVE_SUPER_FANG":162,"MOVE_SURF":57,"MOVE_SWAGGER":207,"MOVE_SWALLOW":256,"MOVE_SWEET_KISS":186,"MOVE_SWEET_SCENT":230,"MOVE_SWIFT":129,"MOVE_SWORDS_DANCE":14,"MOVE_SYNTHESIS":235,"MOVE_TACKLE":33,"MOVE_TAIL_GLOW":294,"MOVE_TAIL_WHIP":39,"MOVE_TAKE_DOWN":36,"MOVE_TAUNT":269,"MOVE_TEETER_DANCE":298,"MOVE_TELEPORT":100,"MOVE_THIEF":168,"MOVE_THRASH":37,"MOVE_THUNDER":87,"MOVE_THUNDERBOLT":85,"MOVE_THUNDER_PUNCH":9,"MOVE_THUNDER_SHOCK":84,"MOVE_THUNDER_WAVE":86,"MOVE_TICKLE":321,"MOVE_TORMENT":259,"MOVE_TOXIC":92,"MOVE_TRANSFORM":144,"MOVE_TRICK":271,"MOVE_TRIPLE_KICK":167,"MOVE_TRI_ATTACK":161,"MOVE_TWINEEDLE":41,"MOVE_TWISTER":239,"MOVE_UNAVAILABLE":65535,"MOVE_UPROAR":253,"MOVE_VICE_GRIP":11,"MOVE_VINE_WHIP":22,"MOVE_VITAL_THROW":233,"MOVE_VOLT_TACKLE":344,"MOVE_WATERFALL":127,"MOVE_WATER_GUN":55,"MOVE_WATER_PULSE":352,"MOVE_WATER_SPORT":346,"MOVE_WATER_SPOUT":323,"MOVE_WEATHER_BALL":311,"MOVE_WHIRLPOOL":250,"MOVE_WHIRLWIND":18,"MOVE_WILL_O_WISP":261,"MOVE_WING_ATTACK":17,"MOVE_WISH":273,"MOVE_WITHDRAW":110,"MOVE_WRAP":35,"MOVE_YAWN":281,"MOVE_ZAP_CANNON":192,"MUS_ABANDONED_SHIP":381,"MUS_ABNORMAL_WEATHER":443,"MUS_AQUA_MAGMA_HIDEOUT":430,"MUS_AWAKEN_LEGEND":388,"MUS_BIRCH_LAB":383,"MUS_B_ARENA":458,"MUS_B_DOME":467,"MUS_B_DOME_LOBBY":473,"MUS_B_FACTORY":469,"MUS_B_FRONTIER":457,"MUS_B_PALACE":463,"MUS_B_PIKE":468,"MUS_B_PYRAMID":461,"MUS_B_PYRAMID_TOP":462,"MUS_B_TOWER":465,"MUS_B_TOWER_RS":384,"MUS_CABLE_CAR":425,"MUS_CAUGHT":352,"MUS_CAVE_OF_ORIGIN":386,"MUS_CONTEST":440,"MUS_CONTEST_LOBBY":452,"MUS_CONTEST_RESULTS":446,"MUS_CONTEST_WINNER":439,"MUS_CREDITS":455,"MUS_CYCLING":403,"MUS_C_COMM_CENTER":356,"MUS_C_VS_LEGEND_BEAST":358,"MUS_DESERT":409,"MUS_DEWFORD":427,"MUS_DUMMY":0,"MUS_ENCOUNTER_AQUA":419,"MUS_ENCOUNTER_BRENDAN":421,"MUS_ENCOUNTER_CHAMPION":454,"MUS_ENCOUNTER_COOL":417,"MUS_ENCOUNTER_ELITE_FOUR":450,"MUS_ENCOUNTER_FEMALE":407,"MUS_ENCOUNTER_GIRL":379,"MUS_ENCOUNTER_HIKER":451,"MUS_ENCOUNTER_INTENSE":416,"MUS_ENCOUNTER_INTERVIEWER":453,"MUS_ENCOUNTER_MAGMA":441,"MUS_ENCOUNTER_MALE":380,"MUS_ENCOUNTER_MAY":415,"MUS_ENCOUNTER_RICH":397,"MUS_ENCOUNTER_SUSPICIOUS":423,"MUS_ENCOUNTER_SWIMMER":385,"MUS_ENCOUNTER_TWINS":449,"MUS_END":456,"MUS_EVER_GRANDE":422,"MUS_EVOLUTION":377,"MUS_EVOLUTION_INTRO":376,"MUS_EVOLVED":371,"MUS_FALLARBOR":437,"MUS_FOLLOW_ME":420,"MUS_FORTREE":382,"MUS_GAME_CORNER":426,"MUS_GSC_PEWTER":357,"MUS_GSC_ROUTE38":351,"MUS_GYM":364,"MUS_HALL_OF_FAME":436,"MUS_HALL_OF_FAME_ROOM":447,"MUS_HEAL":368,"MUS_HELP":410,"MUS_INTRO":414,"MUS_INTRO_BATTLE":442,"MUS_LEVEL_UP":367,"MUS_LILYCOVE":408,"MUS_LILYCOVE_MUSEUM":373,"MUS_LINK_CONTEST_P1":393,"MUS_LINK_CONTEST_P2":394,"MUS_LINK_CONTEST_P3":395,"MUS_LINK_CONTEST_P4":396,"MUS_LITTLEROOT":405,"MUS_LITTLEROOT_TEST":350,"MUS_MOVE_DELETED":378,"MUS_MT_CHIMNEY":406,"MUS_MT_PYRE":432,"MUS_MT_PYRE_EXTERIOR":434,"MUS_NONE":65535,"MUS_OBTAIN_BADGE":369,"MUS_OBTAIN_BERRY":387,"MUS_OBTAIN_B_POINTS":459,"MUS_OBTAIN_ITEM":370,"MUS_OBTAIN_SYMBOL":466,"MUS_OBTAIN_TMHM":372,"MUS_OCEANIC_MUSEUM":375,"MUS_OLDALE":363,"MUS_PETALBURG":362,"MUS_PETALBURG_WOODS":366,"MUS_POKE_CENTER":400,"MUS_POKE_MART":404,"MUS_RAYQUAZA_APPEARS":464,"MUS_REGISTER_MATCH_CALL":460,"MUS_RG_BERRY_PICK":542,"MUS_RG_CAUGHT":534,"MUS_RG_CAUGHT_INTRO":531,"MUS_RG_CELADON":521,"MUS_RG_CINNABAR":491,"MUS_RG_CREDITS":502,"MUS_RG_CYCLING":494,"MUS_RG_DEX_RATING":529,"MUS_RG_ENCOUNTER_BOY":497,"MUS_RG_ENCOUNTER_DEOXYS":555,"MUS_RG_ENCOUNTER_GIRL":496,"MUS_RG_ENCOUNTER_GYM_LEADER":554,"MUS_RG_ENCOUNTER_RIVAL":527,"MUS_RG_ENCOUNTER_ROCKET":495,"MUS_RG_FOLLOW_ME":484,"MUS_RG_FUCHSIA":520,"MUS_RG_GAME_CORNER":485,"MUS_RG_GAME_FREAK":533,"MUS_RG_GYM":487,"MUS_RG_HALL_OF_FAME":498,"MUS_RG_HEAL":493,"MUS_RG_INTRO_FIGHT":489,"MUS_RG_JIGGLYPUFF":488,"MUS_RG_LAVENDER":492,"MUS_RG_MT_MOON":500,"MUS_RG_MYSTERY_GIFT":541,"MUS_RG_NET_CENTER":540,"MUS_RG_NEW_GAME_EXIT":537,"MUS_RG_NEW_GAME_INSTRUCT":535,"MUS_RG_NEW_GAME_INTRO":536,"MUS_RG_OAK":514,"MUS_RG_OAK_LAB":513,"MUS_RG_OBTAIN_KEY_ITEM":530,"MUS_RG_PALLET":512,"MUS_RG_PEWTER":526,"MUS_RG_PHOTO":532,"MUS_RG_POKE_CENTER":515,"MUS_RG_POKE_FLUTE":550,"MUS_RG_POKE_JUMP":538,"MUS_RG_POKE_MANSION":501,"MUS_RG_POKE_TOWER":518,"MUS_RG_RIVAL_EXIT":528,"MUS_RG_ROCKET_HIDEOUT":486,"MUS_RG_ROUTE1":503,"MUS_RG_ROUTE11":506,"MUS_RG_ROUTE24":504,"MUS_RG_ROUTE3":505,"MUS_RG_SEVII_123":547,"MUS_RG_SEVII_45":548,"MUS_RG_SEVII_67":549,"MUS_RG_SEVII_CAVE":543,"MUS_RG_SEVII_DUNGEON":546,"MUS_RG_SEVII_ROUTE":545,"MUS_RG_SILPH":519,"MUS_RG_SLOW_PALLET":557,"MUS_RG_SS_ANNE":516,"MUS_RG_SURF":517,"MUS_RG_TEACHY_TV_MENU":558,"MUS_RG_TEACHY_TV_SHOW":544,"MUS_RG_TITLE":490,"MUS_RG_TRAINER_TOWER":556,"MUS_RG_UNION_ROOM":539,"MUS_RG_VERMILLION":525,"MUS_RG_VICTORY_GYM_LEADER":524,"MUS_RG_VICTORY_ROAD":507,"MUS_RG_VICTORY_TRAINER":522,"MUS_RG_VICTORY_WILD":523,"MUS_RG_VIRIDIAN_FOREST":499,"MUS_RG_VS_CHAMPION":511,"MUS_RG_VS_DEOXYS":551,"MUS_RG_VS_GYM_LEADER":508,"MUS_RG_VS_LEGEND":553,"MUS_RG_VS_MEWTWO":552,"MUS_RG_VS_TRAINER":509,"MUS_RG_VS_WILD":510,"MUS_ROULETTE":392,"MUS_ROUTE101":359,"MUS_ROUTE104":401,"MUS_ROUTE110":360,"MUS_ROUTE113":418,"MUS_ROUTE118":32767,"MUS_ROUTE119":402,"MUS_ROUTE120":361,"MUS_ROUTE122":374,"MUS_RUSTBORO":399,"MUS_SAFARI_ZONE":428,"MUS_SAILING":431,"MUS_SCHOOL":435,"MUS_SEALED_CHAMBER":438,"MUS_SLATEPORT":433,"MUS_SLOTS_JACKPOT":389,"MUS_SLOTS_WIN":390,"MUS_SOOTOPOLIS":445,"MUS_SURF":365,"MUS_TITLE":413,"MUS_TOO_BAD":391,"MUS_TRICK_HOUSE":448,"MUS_UNDERWATER":411,"MUS_VERDANTURF":398,"MUS_VICTORY_AQUA_MAGMA":424,"MUS_VICTORY_GYM_LEADER":354,"MUS_VICTORY_LEAGUE":355,"MUS_VICTORY_ROAD":429,"MUS_VICTORY_TRAINER":412,"MUS_VICTORY_WILD":353,"MUS_VS_AQUA_MAGMA":475,"MUS_VS_AQUA_MAGMA_LEADER":483,"MUS_VS_CHAMPION":478,"MUS_VS_ELITE_FOUR":482,"MUS_VS_FRONTIER_BRAIN":471,"MUS_VS_GYM_LEADER":477,"MUS_VS_KYOGRE_GROUDON":480,"MUS_VS_MEW":472,"MUS_VS_RAYQUAZA":470,"MUS_VS_REGI":479,"MUS_VS_RIVAL":481,"MUS_VS_TRAINER":476,"MUS_VS_WILD":474,"MUS_WEATHER_GROUDON":444,"NUM_BADGES":8,"NUM_BERRY_MASTER_BERRIES":10,"NUM_BERRY_MASTER_BERRIES_SKIPPED":20,"NUM_BERRY_MASTER_WIFE_BERRIES":10,"NUM_DAILY_FLAGS":64,"NUM_HIDDEN_MACHINES":8,"NUM_KIRI_BERRIES":10,"NUM_KIRI_BERRIES_SKIPPED":20,"NUM_ROUTE_114_MAN_BERRIES":5,"NUM_ROUTE_114_MAN_BERRIES_SKIPPED":15,"NUM_SPECIAL_FLAGS":128,"NUM_SPECIES":412,"NUM_TECHNICAL_MACHINES":50,"NUM_TEMP_FLAGS":32,"NUM_WATER_STAGES":4,"NUM_WONDER_CARD_FLAGS":20,"OLD_ROD":0,"PH_CHOICE_BLEND":589,"PH_CHOICE_HELD":590,"PH_CHOICE_SOLO":591,"PH_CLOTH_BLEND":565,"PH_CLOTH_HELD":566,"PH_CLOTH_SOLO":567,"PH_CURE_BLEND":604,"PH_CURE_HELD":605,"PH_CURE_SOLO":606,"PH_DRESS_BLEND":568,"PH_DRESS_HELD":569,"PH_DRESS_SOLO":570,"PH_FACE_BLEND":562,"PH_FACE_HELD":563,"PH_FACE_SOLO":564,"PH_FLEECE_BLEND":571,"PH_FLEECE_HELD":572,"PH_FLEECE_SOLO":573,"PH_FOOT_BLEND":595,"PH_FOOT_HELD":596,"PH_FOOT_SOLO":597,"PH_GOAT_BLEND":583,"PH_GOAT_HELD":584,"PH_GOAT_SOLO":585,"PH_GOOSE_BLEND":598,"PH_GOOSE_HELD":599,"PH_GOOSE_SOLO":600,"PH_KIT_BLEND":574,"PH_KIT_HELD":575,"PH_KIT_SOLO":576,"PH_LOT_BLEND":580,"PH_LOT_HELD":581,"PH_LOT_SOLO":582,"PH_MOUTH_BLEND":592,"PH_MOUTH_HELD":593,"PH_MOUTH_SOLO":594,"PH_NURSE_BLEND":607,"PH_NURSE_HELD":608,"PH_NURSE_SOLO":609,"PH_PRICE_BLEND":577,"PH_PRICE_HELD":578,"PH_PRICE_SOLO":579,"PH_STRUT_BLEND":601,"PH_STRUT_HELD":602,"PH_STRUT_SOLO":603,"PH_THOUGHT_BLEND":586,"PH_THOUGHT_HELD":587,"PH_THOUGHT_SOLO":588,"PH_TRAP_BLEND":559,"PH_TRAP_HELD":560,"PH_TRAP_SOLO":561,"SE_A":25,"SE_APPLAUSE":105,"SE_ARENA_TIMEUP1":265,"SE_ARENA_TIMEUP2":266,"SE_BALL":23,"SE_BALLOON_BLUE":75,"SE_BALLOON_RED":74,"SE_BALLOON_YELLOW":76,"SE_BALL_BOUNCE_1":56,"SE_BALL_BOUNCE_2":57,"SE_BALL_BOUNCE_3":58,"SE_BALL_BOUNCE_4":59,"SE_BALL_OPEN":15,"SE_BALL_THROW":61,"SE_BALL_TRADE":60,"SE_BALL_TRAY_BALL":115,"SE_BALL_TRAY_ENTER":114,"SE_BALL_TRAY_EXIT":116,"SE_BANG":20,"SE_BERRY_BLENDER":53,"SE_BIKE_BELL":11,"SE_BIKE_HOP":34,"SE_BOO":22,"SE_BREAKABLE_DOOR":77,"SE_BRIDGE_WALK":71,"SE_CARD":54,"SE_CLICK":36,"SE_CONTEST_CONDITION_LOSE":38,"SE_CONTEST_CURTAIN_FALL":98,"SE_CONTEST_CURTAIN_RISE":97,"SE_CONTEST_HEART":96,"SE_CONTEST_ICON_CHANGE":99,"SE_CONTEST_ICON_CLEAR":100,"SE_CONTEST_MONS_TURN":101,"SE_CONTEST_PLACE":24,"SE_DEX_PAGE":109,"SE_DEX_SCROLL":108,"SE_DEX_SEARCH":112,"SE_DING_DONG":73,"SE_DOOR":8,"SE_DOWNPOUR":83,"SE_DOWNPOUR_STOP":84,"SE_E":28,"SE_EFFECTIVE":13,"SE_EGG_HATCH":113,"SE_ELEVATOR":89,"SE_ESCALATOR":80,"SE_EXIT":9,"SE_EXP":33,"SE_EXP_MAX":91,"SE_FAILURE":32,"SE_FAINT":16,"SE_FALL":43,"SE_FIELD_POISON":79,"SE_FLEE":17,"SE_FU_ZAKU":37,"SE_GLASS_FLUTE":117,"SE_I":26,"SE_ICE_BREAK":41,"SE_ICE_CRACK":42,"SE_ICE_STAIRS":40,"SE_INTRO_BLAST":103,"SE_ITEMFINDER":72,"SE_LAVARIDGE_FALL_WARP":39,"SE_LEDGE":10,"SE_LOW_HEALTH":90,"SE_MUD_BALL":78,"SE_MUGSHOT":104,"SE_M_ABSORB":180,"SE_M_ABSORB_2":179,"SE_M_ACID_ARMOR":218,"SE_M_ATTRACT":226,"SE_M_ATTRACT2":227,"SE_M_BARRIER":208,"SE_M_BATON_PASS":224,"SE_M_BELLY_DRUM":185,"SE_M_BIND":170,"SE_M_BITE":161,"SE_M_BLIZZARD":153,"SE_M_BLIZZARD2":154,"SE_M_BONEMERANG":187,"SE_M_BRICK_BREAK":198,"SE_M_BUBBLE":124,"SE_M_BUBBLE2":125,"SE_M_BUBBLE3":126,"SE_M_BUBBLE_BEAM":182,"SE_M_BUBBLE_BEAM2":183,"SE_M_CHARGE":213,"SE_M_CHARM":212,"SE_M_COMET_PUNCH":139,"SE_M_CONFUSE_RAY":196,"SE_M_COSMIC_POWER":243,"SE_M_CRABHAMMER":142,"SE_M_CUT":128,"SE_M_DETECT":209,"SE_M_DIG":175,"SE_M_DIVE":233,"SE_M_DIZZY_PUNCH":176,"SE_M_DOUBLE_SLAP":134,"SE_M_DOUBLE_TEAM":135,"SE_M_DRAGON_RAGE":171,"SE_M_EARTHQUAKE":234,"SE_M_EMBER":151,"SE_M_ENCORE":222,"SE_M_ENCORE2":223,"SE_M_EXPLOSION":178,"SE_M_FAINT_ATTACK":190,"SE_M_FIRE_PUNCH":147,"SE_M_FLAMETHROWER":146,"SE_M_FLAME_WHEEL":144,"SE_M_FLAME_WHEEL2":145,"SE_M_FLATTER":229,"SE_M_FLY":158,"SE_M_GIGA_DRAIN":199,"SE_M_GRASSWHISTLE":231,"SE_M_GUST":132,"SE_M_GUST2":133,"SE_M_HAIL":242,"SE_M_HARDEN":120,"SE_M_HAZE":246,"SE_M_HEADBUTT":162,"SE_M_HEAL_BELL":195,"SE_M_HEAT_WAVE":240,"SE_M_HORN_ATTACK":166,"SE_M_HYDRO_PUMP":164,"SE_M_HYPER_BEAM":215,"SE_M_HYPER_BEAM2":247,"SE_M_ICY_WIND":137,"SE_M_JUMP_KICK":143,"SE_M_LEER":192,"SE_M_LICK":188,"SE_M_LOCK_ON":210,"SE_M_MEGA_KICK":140,"SE_M_MEGA_KICK2":141,"SE_M_METRONOME":186,"SE_M_MILK_DRINK":225,"SE_M_MINIMIZE":204,"SE_M_MIST":168,"SE_M_MOONLIGHT":211,"SE_M_MORNING_SUN":228,"SE_M_NIGHTMARE":121,"SE_M_PAY_DAY":174,"SE_M_PERISH_SONG":173,"SE_M_PETAL_DANCE":202,"SE_M_POISON_POWDER":169,"SE_M_PSYBEAM":189,"SE_M_PSYBEAM2":200,"SE_M_RAIN_DANCE":127,"SE_M_RAZOR_WIND":136,"SE_M_RAZOR_WIND2":160,"SE_M_REFLECT":207,"SE_M_REVERSAL":217,"SE_M_ROCK_THROW":131,"SE_M_SACRED_FIRE":149,"SE_M_SACRED_FIRE2":150,"SE_M_SANDSTORM":219,"SE_M_SAND_ATTACK":159,"SE_M_SAND_TOMB":230,"SE_M_SCRATCH":155,"SE_M_SCREECH":181,"SE_M_SELF_DESTRUCT":177,"SE_M_SING":172,"SE_M_SKETCH":205,"SE_M_SKY_UPPERCUT":238,"SE_M_SNORE":197,"SE_M_SOLAR_BEAM":201,"SE_M_SPIT_UP":232,"SE_M_STAT_DECREASE":245,"SE_M_STAT_INCREASE":239,"SE_M_STRENGTH":214,"SE_M_STRING_SHOT":129,"SE_M_STRING_SHOT2":130,"SE_M_SUPERSONIC":184,"SE_M_SURF":163,"SE_M_SWAGGER":193,"SE_M_SWAGGER2":194,"SE_M_SWEET_SCENT":236,"SE_M_SWIFT":206,"SE_M_SWORDS_DANCE":191,"SE_M_TAIL_WHIP":167,"SE_M_TAKE_DOWN":152,"SE_M_TEETER_DANCE":244,"SE_M_TELEPORT":203,"SE_M_THUNDERBOLT":118,"SE_M_THUNDERBOLT2":119,"SE_M_THUNDER_WAVE":138,"SE_M_TOXIC":148,"SE_M_TRI_ATTACK":220,"SE_M_TRI_ATTACK2":221,"SE_M_TWISTER":235,"SE_M_UPROAR":241,"SE_M_VICEGRIP":156,"SE_M_VITAL_THROW":122,"SE_M_VITAL_THROW2":123,"SE_M_WATERFALL":216,"SE_M_WHIRLPOOL":165,"SE_M_WING_ATTACK":157,"SE_M_YAWN":237,"SE_N":30,"SE_NOTE_A":67,"SE_NOTE_B":68,"SE_NOTE_C":62,"SE_NOTE_C_HIGH":69,"SE_NOTE_D":63,"SE_NOTE_E":64,"SE_NOTE_F":65,"SE_NOTE_G":66,"SE_NOT_EFFECTIVE":12,"SE_O":29,"SE_ORB":107,"SE_PC_LOGIN":2,"SE_PC_OFF":3,"SE_PC_ON":4,"SE_PIKE_CURTAIN_CLOSE":267,"SE_PIKE_CURTAIN_OPEN":268,"SE_PIN":21,"SE_POKENAV_CALL":263,"SE_POKENAV_HANG_UP":264,"SE_POKENAV_OFF":111,"SE_POKENAV_ON":110,"SE_PUDDLE":70,"SE_RAIN":85,"SE_RAIN_STOP":86,"SE_REPEL":47,"SE_RG_BAG_CURSOR":252,"SE_RG_BAG_POCKET":253,"SE_RG_BALL_CLICK":254,"SE_RG_CARD_FLIP":249,"SE_RG_CARD_FLIPPING":250,"SE_RG_CARD_OPEN":251,"SE_RG_DEOXYS_MOVE":260,"SE_RG_DOOR":248,"SE_RG_HELP_CLOSE":258,"SE_RG_HELP_ERROR":259,"SE_RG_HELP_OPEN":257,"SE_RG_POKE_JUMP_FAILURE":262,"SE_RG_POKE_JUMP_SUCCESS":261,"SE_RG_SHOP":255,"SE_RG_SS_ANNE_HORN":256,"SE_ROTATING_GATE":48,"SE_ROULETTE_BALL":92,"SE_ROULETTE_BALL2":93,"SE_SAVE":55,"SE_SELECT":5,"SE_SHINY":102,"SE_SHIP":19,"SE_SHOP":95,"SE_SLIDING_DOOR":18,"SE_SUCCESS":31,"SE_SUDOWOODO_SHAKE":269,"SE_SUPER_EFFECTIVE":14,"SE_SWITCH":35,"SE_TAILLOW_WING_FLAP":94,"SE_THUNDER":87,"SE_THUNDER2":88,"SE_THUNDERSTORM":81,"SE_THUNDERSTORM_STOP":82,"SE_TRUCK_DOOR":52,"SE_TRUCK_MOVE":49,"SE_TRUCK_STOP":50,"SE_TRUCK_UNLOAD":51,"SE_U":27,"SE_UNLOCK":44,"SE_USE_ITEM":1,"SE_VEND":106,"SE_WALL_HIT":7,"SE_WARP_IN":45,"SE_WARP_OUT":46,"SE_WIN_OPEN":6,"SPECIAL_FLAGS_END":16511,"SPECIAL_FLAGS_START":16384,"SPECIES_ABRA":63,"SPECIES_ABSOL":376,"SPECIES_AERODACTYL":142,"SPECIES_AGGRON":384,"SPECIES_AIPOM":190,"SPECIES_ALAKAZAM":65,"SPECIES_ALTARIA":359,"SPECIES_AMPHAROS":181,"SPECIES_ANORITH":390,"SPECIES_ARBOK":24,"SPECIES_ARCANINE":59,"SPECIES_ARIADOS":168,"SPECIES_ARMALDO":391,"SPECIES_ARON":382,"SPECIES_ARTICUNO":144,"SPECIES_AZUMARILL":184,"SPECIES_AZURILL":350,"SPECIES_BAGON":395,"SPECIES_BALTOY":318,"SPECIES_BANETTE":378,"SPECIES_BARBOACH":323,"SPECIES_BAYLEEF":153,"SPECIES_BEAUTIFLY":292,"SPECIES_BEEDRILL":15,"SPECIES_BELDUM":398,"SPECIES_BELLOSSOM":182,"SPECIES_BELLSPROUT":69,"SPECIES_BLASTOISE":9,"SPECIES_BLAZIKEN":282,"SPECIES_BLISSEY":242,"SPECIES_BRELOOM":307,"SPECIES_BULBASAUR":1,"SPECIES_BUTTERFREE":12,"SPECIES_CACNEA":344,"SPECIES_CACTURNE":345,"SPECIES_CAMERUPT":340,"SPECIES_CARVANHA":330,"SPECIES_CASCOON":293,"SPECIES_CASTFORM":385,"SPECIES_CATERPIE":10,"SPECIES_CELEBI":251,"SPECIES_CHANSEY":113,"SPECIES_CHARIZARD":6,"SPECIES_CHARMANDER":4,"SPECIES_CHARMELEON":5,"SPECIES_CHIKORITA":152,"SPECIES_CHIMECHO":411,"SPECIES_CHINCHOU":170,"SPECIES_CLAMPERL":373,"SPECIES_CLAYDOL":319,"SPECIES_CLEFABLE":36,"SPECIES_CLEFAIRY":35,"SPECIES_CLEFFA":173,"SPECIES_CLOYSTER":91,"SPECIES_COMBUSKEN":281,"SPECIES_CORPHISH":326,"SPECIES_CORSOLA":222,"SPECIES_CRADILY":389,"SPECIES_CRAWDAUNT":327,"SPECIES_CROBAT":169,"SPECIES_CROCONAW":159,"SPECIES_CUBONE":104,"SPECIES_CYNDAQUIL":155,"SPECIES_DELCATTY":316,"SPECIES_DELIBIRD":225,"SPECIES_DEOXYS":410,"SPECIES_DEWGONG":87,"SPECIES_DIGLETT":50,"SPECIES_DITTO":132,"SPECIES_DODRIO":85,"SPECIES_DODUO":84,"SPECIES_DONPHAN":232,"SPECIES_DRAGONAIR":148,"SPECIES_DRAGONITE":149,"SPECIES_DRATINI":147,"SPECIES_DROWZEE":96,"SPECIES_DUGTRIO":51,"SPECIES_DUNSPARCE":206,"SPECIES_DUSCLOPS":362,"SPECIES_DUSKULL":361,"SPECIES_DUSTOX":294,"SPECIES_EEVEE":133,"SPECIES_EGG":412,"SPECIES_EKANS":23,"SPECIES_ELECTABUZZ":125,"SPECIES_ELECTRIKE":337,"SPECIES_ELECTRODE":101,"SPECIES_ELEKID":239,"SPECIES_ENTEI":244,"SPECIES_ESPEON":196,"SPECIES_EXEGGCUTE":102,"SPECIES_EXEGGUTOR":103,"SPECIES_EXPLOUD":372,"SPECIES_FARFETCHD":83,"SPECIES_FEAROW":22,"SPECIES_FEEBAS":328,"SPECIES_FERALIGATR":160,"SPECIES_FLAAFFY":180,"SPECIES_FLAREON":136,"SPECIES_FLYGON":334,"SPECIES_FORRETRESS":205,"SPECIES_FURRET":162,"SPECIES_GARDEVOIR":394,"SPECIES_GASTLY":92,"SPECIES_GENGAR":94,"SPECIES_GEODUDE":74,"SPECIES_GIRAFARIG":203,"SPECIES_GLALIE":347,"SPECIES_GLIGAR":207,"SPECIES_GLOOM":44,"SPECIES_GOLBAT":42,"SPECIES_GOLDEEN":118,"SPECIES_GOLDUCK":55,"SPECIES_GOLEM":76,"SPECIES_GOREBYSS":375,"SPECIES_GRANBULL":210,"SPECIES_GRAVELER":75,"SPECIES_GRIMER":88,"SPECIES_GROUDON":405,"SPECIES_GROVYLE":278,"SPECIES_GROWLITHE":58,"SPECIES_GRUMPIG":352,"SPECIES_GULPIN":367,"SPECIES_GYARADOS":130,"SPECIES_HARIYAMA":336,"SPECIES_HAUNTER":93,"SPECIES_HERACROSS":214,"SPECIES_HITMONCHAN":107,"SPECIES_HITMONLEE":106,"SPECIES_HITMONTOP":237,"SPECIES_HOOTHOOT":163,"SPECIES_HOPPIP":187,"SPECIES_HORSEA":116,"SPECIES_HOUNDOOM":229,"SPECIES_HOUNDOUR":228,"SPECIES_HO_OH":250,"SPECIES_HUNTAIL":374,"SPECIES_HYPNO":97,"SPECIES_IGGLYBUFF":174,"SPECIES_ILLUMISE":387,"SPECIES_IVYSAUR":2,"SPECIES_JIGGLYPUFF":39,"SPECIES_JIRACHI":409,"SPECIES_JOLTEON":135,"SPECIES_JUMPLUFF":189,"SPECIES_JYNX":124,"SPECIES_KABUTO":140,"SPECIES_KABUTOPS":141,"SPECIES_KADABRA":64,"SPECIES_KAKUNA":14,"SPECIES_KANGASKHAN":115,"SPECIES_KECLEON":317,"SPECIES_KINGDRA":230,"SPECIES_KINGLER":99,"SPECIES_KIRLIA":393,"SPECIES_KOFFING":109,"SPECIES_KRABBY":98,"SPECIES_KYOGRE":404,"SPECIES_LAIRON":383,"SPECIES_LANTURN":171,"SPECIES_LAPRAS":131,"SPECIES_LARVITAR":246,"SPECIES_LATIAS":407,"SPECIES_LATIOS":408,"SPECIES_LEDIAN":166,"SPECIES_LEDYBA":165,"SPECIES_LICKITUNG":108,"SPECIES_LILEEP":388,"SPECIES_LINOONE":289,"SPECIES_LOMBRE":296,"SPECIES_LOTAD":295,"SPECIES_LOUDRED":371,"SPECIES_LUDICOLO":297,"SPECIES_LUGIA":249,"SPECIES_LUNATONE":348,"SPECIES_LUVDISC":325,"SPECIES_MACHAMP":68,"SPECIES_MACHOKE":67,"SPECIES_MACHOP":66,"SPECIES_MAGBY":240,"SPECIES_MAGCARGO":219,"SPECIES_MAGIKARP":129,"SPECIES_MAGMAR":126,"SPECIES_MAGNEMITE":81,"SPECIES_MAGNETON":82,"SPECIES_MAKUHITA":335,"SPECIES_MANECTRIC":338,"SPECIES_MANKEY":56,"SPECIES_MANTINE":226,"SPECIES_MAREEP":179,"SPECIES_MARILL":183,"SPECIES_MAROWAK":105,"SPECIES_MARSHTOMP":284,"SPECIES_MASQUERAIN":312,"SPECIES_MAWILE":355,"SPECIES_MEDICHAM":357,"SPECIES_MEDITITE":356,"SPECIES_MEGANIUM":154,"SPECIES_MEOWTH":52,"SPECIES_METAGROSS":400,"SPECIES_METANG":399,"SPECIES_METAPOD":11,"SPECIES_MEW":151,"SPECIES_MEWTWO":150,"SPECIES_MIGHTYENA":287,"SPECIES_MILOTIC":329,"SPECIES_MILTANK":241,"SPECIES_MINUN":354,"SPECIES_MISDREAVUS":200,"SPECIES_MOLTRES":146,"SPECIES_MR_MIME":122,"SPECIES_MUDKIP":283,"SPECIES_MUK":89,"SPECIES_MURKROW":198,"SPECIES_NATU":177,"SPECIES_NIDOKING":34,"SPECIES_NIDOQUEEN":31,"SPECIES_NIDORAN_F":29,"SPECIES_NIDORAN_M":32,"SPECIES_NIDORINA":30,"SPECIES_NIDORINO":33,"SPECIES_NINCADA":301,"SPECIES_NINETALES":38,"SPECIES_NINJASK":302,"SPECIES_NOCTOWL":164,"SPECIES_NONE":0,"SPECIES_NOSEPASS":320,"SPECIES_NUMEL":339,"SPECIES_NUZLEAF":299,"SPECIES_OCTILLERY":224,"SPECIES_ODDISH":43,"SPECIES_OLD_UNOWN_B":252,"SPECIES_OLD_UNOWN_C":253,"SPECIES_OLD_UNOWN_D":254,"SPECIES_OLD_UNOWN_E":255,"SPECIES_OLD_UNOWN_F":256,"SPECIES_OLD_UNOWN_G":257,"SPECIES_OLD_UNOWN_H":258,"SPECIES_OLD_UNOWN_I":259,"SPECIES_OLD_UNOWN_J":260,"SPECIES_OLD_UNOWN_K":261,"SPECIES_OLD_UNOWN_L":262,"SPECIES_OLD_UNOWN_M":263,"SPECIES_OLD_UNOWN_N":264,"SPECIES_OLD_UNOWN_O":265,"SPECIES_OLD_UNOWN_P":266,"SPECIES_OLD_UNOWN_Q":267,"SPECIES_OLD_UNOWN_R":268,"SPECIES_OLD_UNOWN_S":269,"SPECIES_OLD_UNOWN_T":270,"SPECIES_OLD_UNOWN_U":271,"SPECIES_OLD_UNOWN_V":272,"SPECIES_OLD_UNOWN_W":273,"SPECIES_OLD_UNOWN_X":274,"SPECIES_OLD_UNOWN_Y":275,"SPECIES_OLD_UNOWN_Z":276,"SPECIES_OMANYTE":138,"SPECIES_OMASTAR":139,"SPECIES_ONIX":95,"SPECIES_PARAS":46,"SPECIES_PARASECT":47,"SPECIES_PELIPPER":310,"SPECIES_PERSIAN":53,"SPECIES_PHANPY":231,"SPECIES_PICHU":172,"SPECIES_PIDGEOT":18,"SPECIES_PIDGEOTTO":17,"SPECIES_PIDGEY":16,"SPECIES_PIKACHU":25,"SPECIES_PILOSWINE":221,"SPECIES_PINECO":204,"SPECIES_PINSIR":127,"SPECIES_PLUSLE":353,"SPECIES_POLITOED":186,"SPECIES_POLIWAG":60,"SPECIES_POLIWHIRL":61,"SPECIES_POLIWRATH":62,"SPECIES_PONYTA":77,"SPECIES_POOCHYENA":286,"SPECIES_PORYGON":137,"SPECIES_PORYGON2":233,"SPECIES_PRIMEAPE":57,"SPECIES_PSYDUCK":54,"SPECIES_PUPITAR":247,"SPECIES_QUAGSIRE":195,"SPECIES_QUILAVA":156,"SPECIES_QWILFISH":211,"SPECIES_RAICHU":26,"SPECIES_RAIKOU":243,"SPECIES_RALTS":392,"SPECIES_RAPIDASH":78,"SPECIES_RATICATE":20,"SPECIES_RATTATA":19,"SPECIES_RAYQUAZA":406,"SPECIES_REGICE":402,"SPECIES_REGIROCK":401,"SPECIES_REGISTEEL":403,"SPECIES_RELICANTH":381,"SPECIES_REMORAID":223,"SPECIES_RHYDON":112,"SPECIES_RHYHORN":111,"SPECIES_ROSELIA":363,"SPECIES_SABLEYE":322,"SPECIES_SALAMENCE":397,"SPECIES_SANDSHREW":27,"SPECIES_SANDSLASH":28,"SPECIES_SCEPTILE":279,"SPECIES_SCIZOR":212,"SPECIES_SCYTHER":123,"SPECIES_SEADRA":117,"SPECIES_SEAKING":119,"SPECIES_SEALEO":342,"SPECIES_SEEDOT":298,"SPECIES_SEEL":86,"SPECIES_SENTRET":161,"SPECIES_SEVIPER":379,"SPECIES_SHARPEDO":331,"SPECIES_SHEDINJA":303,"SPECIES_SHELGON":396,"SPECIES_SHELLDER":90,"SPECIES_SHIFTRY":300,"SPECIES_SHROOMISH":306,"SPECIES_SHUCKLE":213,"SPECIES_SHUPPET":377,"SPECIES_SILCOON":291,"SPECIES_SKARMORY":227,"SPECIES_SKIPLOOM":188,"SPECIES_SKITTY":315,"SPECIES_SLAKING":366,"SPECIES_SLAKOTH":364,"SPECIES_SLOWBRO":80,"SPECIES_SLOWKING":199,"SPECIES_SLOWPOKE":79,"SPECIES_SLUGMA":218,"SPECIES_SMEARGLE":235,"SPECIES_SMOOCHUM":238,"SPECIES_SNEASEL":215,"SPECIES_SNORLAX":143,"SPECIES_SNORUNT":346,"SPECIES_SNUBBULL":209,"SPECIES_SOLROCK":349,"SPECIES_SPEAROW":21,"SPECIES_SPHEAL":341,"SPECIES_SPINARAK":167,"SPECIES_SPINDA":308,"SPECIES_SPOINK":351,"SPECIES_SQUIRTLE":7,"SPECIES_STANTLER":234,"SPECIES_STARMIE":121,"SPECIES_STARYU":120,"SPECIES_STEELIX":208,"SPECIES_SUDOWOODO":185,"SPECIES_SUICUNE":245,"SPECIES_SUNFLORA":192,"SPECIES_SUNKERN":191,"SPECIES_SURSKIT":311,"SPECIES_SWABLU":358,"SPECIES_SWALOT":368,"SPECIES_SWAMPERT":285,"SPECIES_SWELLOW":305,"SPECIES_SWINUB":220,"SPECIES_TAILLOW":304,"SPECIES_TANGELA":114,"SPECIES_TAUROS":128,"SPECIES_TEDDIURSA":216,"SPECIES_TENTACOOL":72,"SPECIES_TENTACRUEL":73,"SPECIES_TOGEPI":175,"SPECIES_TOGETIC":176,"SPECIES_TORCHIC":280,"SPECIES_TORKOAL":321,"SPECIES_TOTODILE":158,"SPECIES_TRAPINCH":332,"SPECIES_TREECKO":277,"SPECIES_TROPIUS":369,"SPECIES_TYPHLOSION":157,"SPECIES_TYRANITAR":248,"SPECIES_TYROGUE":236,"SPECIES_UMBREON":197,"SPECIES_UNOWN":201,"SPECIES_UNOWN_B":413,"SPECIES_UNOWN_C":414,"SPECIES_UNOWN_D":415,"SPECIES_UNOWN_E":416,"SPECIES_UNOWN_EMARK":438,"SPECIES_UNOWN_F":417,"SPECIES_UNOWN_G":418,"SPECIES_UNOWN_H":419,"SPECIES_UNOWN_I":420,"SPECIES_UNOWN_J":421,"SPECIES_UNOWN_K":422,"SPECIES_UNOWN_L":423,"SPECIES_UNOWN_M":424,"SPECIES_UNOWN_N":425,"SPECIES_UNOWN_O":426,"SPECIES_UNOWN_P":427,"SPECIES_UNOWN_Q":428,"SPECIES_UNOWN_QMARK":439,"SPECIES_UNOWN_R":429,"SPECIES_UNOWN_S":430,"SPECIES_UNOWN_T":431,"SPECIES_UNOWN_U":432,"SPECIES_UNOWN_V":433,"SPECIES_UNOWN_W":434,"SPECIES_UNOWN_X":435,"SPECIES_UNOWN_Y":436,"SPECIES_UNOWN_Z":437,"SPECIES_URSARING":217,"SPECIES_VAPOREON":134,"SPECIES_VENOMOTH":49,"SPECIES_VENONAT":48,"SPECIES_VENUSAUR":3,"SPECIES_VIBRAVA":333,"SPECIES_VICTREEBEL":71,"SPECIES_VIGOROTH":365,"SPECIES_VILEPLUME":45,"SPECIES_VOLBEAT":386,"SPECIES_VOLTORB":100,"SPECIES_VULPIX":37,"SPECIES_WAILMER":313,"SPECIES_WAILORD":314,"SPECIES_WALREIN":343,"SPECIES_WARTORTLE":8,"SPECIES_WEEDLE":13,"SPECIES_WEEPINBELL":70,"SPECIES_WEEZING":110,"SPECIES_WHISCASH":324,"SPECIES_WHISMUR":370,"SPECIES_WIGGLYTUFF":40,"SPECIES_WINGULL":309,"SPECIES_WOBBUFFET":202,"SPECIES_WOOPER":194,"SPECIES_WURMPLE":290,"SPECIES_WYNAUT":360,"SPECIES_XATU":178,"SPECIES_YANMA":193,"SPECIES_ZANGOOSE":380,"SPECIES_ZAPDOS":145,"SPECIES_ZIGZAGOON":288,"SPECIES_ZUBAT":41,"SUPER_ROD":2,"SYSTEM_FLAGS":2144,"TEMP_FLAGS_END":31,"TEMP_FLAGS_START":0,"TRAINERS_COUNT":855,"TRAINER_AARON":397,"TRAINER_ABIGAIL_1":358,"TRAINER_ABIGAIL_2":360,"TRAINER_ABIGAIL_3":361,"TRAINER_ABIGAIL_4":362,"TRAINER_ABIGAIL_5":363,"TRAINER_AIDAN":674,"TRAINER_AISHA":757,"TRAINER_ALAN":630,"TRAINER_ALBERT":80,"TRAINER_ALBERTO":12,"TRAINER_ALEX":413,"TRAINER_ALEXA":670,"TRAINER_ALEXIA":90,"TRAINER_ALEXIS":248,"TRAINER_ALICE":448,"TRAINER_ALIX":750,"TRAINER_ALLEN":333,"TRAINER_ALLISON":387,"TRAINER_ALVARO":849,"TRAINER_ALYSSA":701,"TRAINER_AMY_AND_LIV_1":481,"TRAINER_AMY_AND_LIV_2":482,"TRAINER_AMY_AND_LIV_3":485,"TRAINER_AMY_AND_LIV_4":487,"TRAINER_AMY_AND_LIV_5":488,"TRAINER_AMY_AND_LIV_6":489,"TRAINER_ANABEL":805,"TRAINER_ANDREA":613,"TRAINER_ANDRES_1":737,"TRAINER_ANDRES_2":812,"TRAINER_ANDRES_3":813,"TRAINER_ANDRES_4":814,"TRAINER_ANDRES_5":815,"TRAINER_ANDREW":336,"TRAINER_ANGELICA":436,"TRAINER_ANGELINA":712,"TRAINER_ANGELO":802,"TRAINER_ANNA_AND_MEG_1":287,"TRAINER_ANNA_AND_MEG_2":288,"TRAINER_ANNA_AND_MEG_3":289,"TRAINER_ANNA_AND_MEG_4":290,"TRAINER_ANNA_AND_MEG_5":291,"TRAINER_ANNIKA":502,"TRAINER_ANTHONY":352,"TRAINER_ARCHIE":34,"TRAINER_ASHLEY":655,"TRAINER_ATHENA":577,"TRAINER_ATSUSHI":190,"TRAINER_AURON":506,"TRAINER_AUSTINA":58,"TRAINER_AUTUMN":217,"TRAINER_AXLE":203,"TRAINER_BARNY":343,"TRAINER_BARRY":163,"TRAINER_BEAU":212,"TRAINER_BECK":414,"TRAINER_BECKY":470,"TRAINER_BEN":323,"TRAINER_BENJAMIN_1":353,"TRAINER_BENJAMIN_2":354,"TRAINER_BENJAMIN_3":355,"TRAINER_BENJAMIN_4":356,"TRAINER_BENJAMIN_5":357,"TRAINER_BENNY":407,"TRAINER_BERKE":74,"TRAINER_BERNIE_1":206,"TRAINER_BERNIE_2":207,"TRAINER_BERNIE_3":208,"TRAINER_BERNIE_4":209,"TRAINER_BERNIE_5":210,"TRAINER_BETH":445,"TRAINER_BETHANY":301,"TRAINER_BEVERLY":441,"TRAINER_BIANCA":706,"TRAINER_BILLY":319,"TRAINER_BLAKE":235,"TRAINER_BRANDEN":745,"TRAINER_BRANDI":756,"TRAINER_BRANDON":811,"TRAINER_BRAWLY_1":266,"TRAINER_BRAWLY_2":774,"TRAINER_BRAWLY_3":775,"TRAINER_BRAWLY_4":776,"TRAINER_BRAWLY_5":777,"TRAINER_BRAXTON":75,"TRAINER_BRENDA":454,"TRAINER_BRENDAN_LILYCOVE_MUDKIP":661,"TRAINER_BRENDAN_LILYCOVE_TORCHIC":663,"TRAINER_BRENDAN_LILYCOVE_TREECKO":662,"TRAINER_BRENDAN_PLACEHOLDER":853,"TRAINER_BRENDAN_ROUTE_103_MUDKIP":520,"TRAINER_BRENDAN_ROUTE_103_TORCHIC":526,"TRAINER_BRENDAN_ROUTE_103_TREECKO":523,"TRAINER_BRENDAN_ROUTE_110_MUDKIP":521,"TRAINER_BRENDAN_ROUTE_110_TORCHIC":527,"TRAINER_BRENDAN_ROUTE_110_TREECKO":524,"TRAINER_BRENDAN_ROUTE_119_MUDKIP":522,"TRAINER_BRENDAN_ROUTE_119_TORCHIC":528,"TRAINER_BRENDAN_ROUTE_119_TREECKO":525,"TRAINER_BRENDAN_RUSTBORO_MUDKIP":593,"TRAINER_BRENDAN_RUSTBORO_TORCHIC":599,"TRAINER_BRENDAN_RUSTBORO_TREECKO":592,"TRAINER_BRENDEN":572,"TRAINER_BRENT":223,"TRAINER_BRIANNA":118,"TRAINER_BRICE":626,"TRAINER_BRIDGET":129,"TRAINER_BROOKE_1":94,"TRAINER_BROOKE_2":101,"TRAINER_BROOKE_3":102,"TRAINER_BROOKE_4":103,"TRAINER_BROOKE_5":104,"TRAINER_BRYAN":744,"TRAINER_BRYANT":746,"TRAINER_CALE":764,"TRAINER_CALLIE":763,"TRAINER_CALVIN_1":318,"TRAINER_CALVIN_2":328,"TRAINER_CALVIN_3":329,"TRAINER_CALVIN_4":330,"TRAINER_CALVIN_5":331,"TRAINER_CAMDEN":374,"TRAINER_CAMERON_1":238,"TRAINER_CAMERON_2":239,"TRAINER_CAMERON_3":240,"TRAINER_CAMERON_4":241,"TRAINER_CAMERON_5":242,"TRAINER_CAMRON":739,"TRAINER_CARLEE":464,"TRAINER_CAROL":471,"TRAINER_CAROLINA":741,"TRAINER_CAROLINE":99,"TRAINER_CARTER":345,"TRAINER_CATHERINE_1":559,"TRAINER_CATHERINE_2":562,"TRAINER_CATHERINE_3":563,"TRAINER_CATHERINE_4":564,"TRAINER_CATHERINE_5":565,"TRAINER_CEDRIC":475,"TRAINER_CELIA":743,"TRAINER_CELINA":705,"TRAINER_CHAD":174,"TRAINER_CHANDLER":698,"TRAINER_CHARLIE":66,"TRAINER_CHARLOTTE":714,"TRAINER_CHASE":378,"TRAINER_CHESTER":408,"TRAINER_CHIP":45,"TRAINER_CHRIS":693,"TRAINER_CINDY_1":114,"TRAINER_CINDY_2":117,"TRAINER_CINDY_3":120,"TRAINER_CINDY_4":121,"TRAINER_CINDY_5":122,"TRAINER_CINDY_6":123,"TRAINER_CLARENCE":580,"TRAINER_CLARISSA":435,"TRAINER_CLARK":631,"TRAINER_CLAUDE":338,"TRAINER_CLIFFORD":584,"TRAINER_COBY":709,"TRAINER_COLE":201,"TRAINER_COLIN":405,"TRAINER_COLTON":294,"TRAINER_CONNIE":128,"TRAINER_CONOR":511,"TRAINER_CORA":428,"TRAINER_CORY_1":740,"TRAINER_CORY_2":816,"TRAINER_CORY_3":817,"TRAINER_CORY_4":818,"TRAINER_CORY_5":819,"TRAINER_CRISSY":614,"TRAINER_CRISTIAN":574,"TRAINER_CRISTIN_1":767,"TRAINER_CRISTIN_2":828,"TRAINER_CRISTIN_3":829,"TRAINER_CRISTIN_4":830,"TRAINER_CRISTIN_5":831,"TRAINER_CYNDY_1":427,"TRAINER_CYNDY_2":430,"TRAINER_CYNDY_3":431,"TRAINER_CYNDY_4":432,"TRAINER_CYNDY_5":433,"TRAINER_DAISUKE":189,"TRAINER_DAISY":36,"TRAINER_DALE":341,"TRAINER_DALTON_1":196,"TRAINER_DALTON_2":197,"TRAINER_DALTON_3":198,"TRAINER_DALTON_4":199,"TRAINER_DALTON_5":200,"TRAINER_DANA":458,"TRAINER_DANIELLE":650,"TRAINER_DAPHNE":115,"TRAINER_DARCY":733,"TRAINER_DARIAN":696,"TRAINER_DARIUS":803,"TRAINER_DARRIN":154,"TRAINER_DAVID":158,"TRAINER_DAVIS":539,"TRAINER_DAWSON":694,"TRAINER_DAYTON":760,"TRAINER_DEAN":164,"TRAINER_DEANDRE":715,"TRAINER_DEBRA":460,"TRAINER_DECLAN":15,"TRAINER_DEMETRIUS":375,"TRAINER_DENISE":444,"TRAINER_DEREK":227,"TRAINER_DEVAN":753,"TRAINER_DEZ_AND_LUKE":640,"TRAINER_DIANA_1":474,"TRAINER_DIANA_2":477,"TRAINER_DIANA_3":478,"TRAINER_DIANA_4":479,"TRAINER_DIANA_5":480,"TRAINER_DIANNE":417,"TRAINER_DILLON":327,"TRAINER_DOMINIK":152,"TRAINER_DONALD":224,"TRAINER_DONNY":384,"TRAINER_DOUG":618,"TRAINER_DOUGLAS":153,"TRAINER_DRAKE":264,"TRAINER_DREW":211,"TRAINER_DUDLEY":173,"TRAINER_DUNCAN":496,"TRAINER_DUSTY_1":44,"TRAINER_DUSTY_2":47,"TRAINER_DUSTY_3":48,"TRAINER_DUSTY_4":49,"TRAINER_DUSTY_5":50,"TRAINER_DWAYNE":493,"TRAINER_DYLAN_1":364,"TRAINER_DYLAN_2":365,"TRAINER_DYLAN_3":366,"TRAINER_DYLAN_4":367,"TRAINER_DYLAN_5":368,"TRAINER_ED":13,"TRAINER_EDDIE":332,"TRAINER_EDGAR":79,"TRAINER_EDMOND":491,"TRAINER_EDWARD":232,"TRAINER_EDWARDO":404,"TRAINER_EDWIN_1":512,"TRAINER_EDWIN_2":515,"TRAINER_EDWIN_3":516,"TRAINER_EDWIN_4":517,"TRAINER_EDWIN_5":518,"TRAINER_ELI":501,"TRAINER_ELIJAH":742,"TRAINER_ELLIOT_1":339,"TRAINER_ELLIOT_2":346,"TRAINER_ELLIOT_3":347,"TRAINER_ELLIOT_4":348,"TRAINER_ELLIOT_5":349,"TRAINER_ERIC":632,"TRAINER_ERNEST_1":492,"TRAINER_ERNEST_2":497,"TRAINER_ERNEST_3":498,"TRAINER_ERNEST_4":499,"TRAINER_ERNEST_5":500,"TRAINER_ETHAN_1":216,"TRAINER_ETHAN_2":219,"TRAINER_ETHAN_3":220,"TRAINER_ETHAN_4":221,"TRAINER_ETHAN_5":222,"TRAINER_EVERETT":850,"TRAINER_FABIAN":759,"TRAINER_FELIX":38,"TRAINER_FERNANDO_1":195,"TRAINER_FERNANDO_2":832,"TRAINER_FERNANDO_3":833,"TRAINER_FERNANDO_4":834,"TRAINER_FERNANDO_5":835,"TRAINER_FLAGS_END":2143,"TRAINER_FLAGS_START":1280,"TRAINER_FLANNERY_1":268,"TRAINER_FLANNERY_2":782,"TRAINER_FLANNERY_3":783,"TRAINER_FLANNERY_4":784,"TRAINER_FLANNERY_5":785,"TRAINER_FLINT":654,"TRAINER_FOSTER":46,"TRAINER_FRANKLIN":170,"TRAINER_FREDRICK":29,"TRAINER_GABBY_AND_TY_1":51,"TRAINER_GABBY_AND_TY_2":52,"TRAINER_GABBY_AND_TY_3":53,"TRAINER_GABBY_AND_TY_4":54,"TRAINER_GABBY_AND_TY_5":55,"TRAINER_GABBY_AND_TY_6":56,"TRAINER_GABRIELLE_1":9,"TRAINER_GABRIELLE_2":840,"TRAINER_GABRIELLE_3":841,"TRAINER_GABRIELLE_4":842,"TRAINER_GABRIELLE_5":843,"TRAINER_GARRET":138,"TRAINER_GARRISON":547,"TRAINER_GEORGE":73,"TRAINER_GEORGIA":281,"TRAINER_GERALD":648,"TRAINER_GILBERT":169,"TRAINER_GINA_AND_MIA_1":483,"TRAINER_GINA_AND_MIA_2":486,"TRAINER_GLACIA":263,"TRAINER_GRACE":450,"TRAINER_GREG":619,"TRAINER_GRETA":808,"TRAINER_GRUNT_AQUA_HIDEOUT_1":2,"TRAINER_GRUNT_AQUA_HIDEOUT_2":3,"TRAINER_GRUNT_AQUA_HIDEOUT_3":4,"TRAINER_GRUNT_AQUA_HIDEOUT_4":5,"TRAINER_GRUNT_AQUA_HIDEOUT_5":27,"TRAINER_GRUNT_AQUA_HIDEOUT_6":28,"TRAINER_GRUNT_AQUA_HIDEOUT_7":192,"TRAINER_GRUNT_AQUA_HIDEOUT_8":193,"TRAINER_GRUNT_JAGGED_PASS":570,"TRAINER_GRUNT_MAGMA_HIDEOUT_1":716,"TRAINER_GRUNT_MAGMA_HIDEOUT_10":725,"TRAINER_GRUNT_MAGMA_HIDEOUT_11":726,"TRAINER_GRUNT_MAGMA_HIDEOUT_12":727,"TRAINER_GRUNT_MAGMA_HIDEOUT_13":728,"TRAINER_GRUNT_MAGMA_HIDEOUT_14":729,"TRAINER_GRUNT_MAGMA_HIDEOUT_15":730,"TRAINER_GRUNT_MAGMA_HIDEOUT_16":731,"TRAINER_GRUNT_MAGMA_HIDEOUT_2":717,"TRAINER_GRUNT_MAGMA_HIDEOUT_3":718,"TRAINER_GRUNT_MAGMA_HIDEOUT_4":719,"TRAINER_GRUNT_MAGMA_HIDEOUT_5":720,"TRAINER_GRUNT_MAGMA_HIDEOUT_6":721,"TRAINER_GRUNT_MAGMA_HIDEOUT_7":722,"TRAINER_GRUNT_MAGMA_HIDEOUT_8":723,"TRAINER_GRUNT_MAGMA_HIDEOUT_9":724,"TRAINER_GRUNT_MT_CHIMNEY_1":146,"TRAINER_GRUNT_MT_CHIMNEY_2":579,"TRAINER_GRUNT_MT_PYRE_1":23,"TRAINER_GRUNT_MT_PYRE_2":24,"TRAINER_GRUNT_MT_PYRE_3":25,"TRAINER_GRUNT_MT_PYRE_4":569,"TRAINER_GRUNT_MUSEUM_1":20,"TRAINER_GRUNT_MUSEUM_2":21,"TRAINER_GRUNT_PETALBURG_WOODS":10,"TRAINER_GRUNT_RUSTURF_TUNNEL":16,"TRAINER_GRUNT_SEAFLOOR_CAVERN_1":6,"TRAINER_GRUNT_SEAFLOOR_CAVERN_2":7,"TRAINER_GRUNT_SEAFLOOR_CAVERN_3":8,"TRAINER_GRUNT_SEAFLOOR_CAVERN_4":14,"TRAINER_GRUNT_SEAFLOOR_CAVERN_5":567,"TRAINER_GRUNT_SPACE_CENTER_1":22,"TRAINER_GRUNT_SPACE_CENTER_2":116,"TRAINER_GRUNT_SPACE_CENTER_3":586,"TRAINER_GRUNT_SPACE_CENTER_4":587,"TRAINER_GRUNT_SPACE_CENTER_5":588,"TRAINER_GRUNT_SPACE_CENTER_6":589,"TRAINER_GRUNT_SPACE_CENTER_7":590,"TRAINER_GRUNT_UNUSED":568,"TRAINER_GRUNT_WEATHER_INST_1":17,"TRAINER_GRUNT_WEATHER_INST_2":18,"TRAINER_GRUNT_WEATHER_INST_3":19,"TRAINER_GRUNT_WEATHER_INST_4":26,"TRAINER_GRUNT_WEATHER_INST_5":596,"TRAINER_GWEN":59,"TRAINER_HAILEY":697,"TRAINER_HALEY_1":604,"TRAINER_HALEY_2":607,"TRAINER_HALEY_3":608,"TRAINER_HALEY_4":609,"TRAINER_HALEY_5":610,"TRAINER_HALLE":546,"TRAINER_HANNAH":244,"TRAINER_HARRISON":578,"TRAINER_HAYDEN":707,"TRAINER_HECTOR":513,"TRAINER_HEIDI":469,"TRAINER_HELENE":751,"TRAINER_HENRY":668,"TRAINER_HERMAN":167,"TRAINER_HIDEO":651,"TRAINER_HITOSHI":180,"TRAINER_HOPE":96,"TRAINER_HUDSON":510,"TRAINER_HUEY":490,"TRAINER_HUGH":399,"TRAINER_HUMBERTO":402,"TRAINER_IMANI":442,"TRAINER_IRENE":476,"TRAINER_ISAAC_1":538,"TRAINER_ISAAC_2":541,"TRAINER_ISAAC_3":542,"TRAINER_ISAAC_4":543,"TRAINER_ISAAC_5":544,"TRAINER_ISABELLA":595,"TRAINER_ISABELLE":736,"TRAINER_ISABEL_1":302,"TRAINER_ISABEL_2":303,"TRAINER_ISABEL_3":304,"TRAINER_ISABEL_4":305,"TRAINER_ISABEL_5":306,"TRAINER_ISAIAH_1":376,"TRAINER_ISAIAH_2":379,"TRAINER_ISAIAH_3":380,"TRAINER_ISAIAH_4":381,"TRAINER_ISAIAH_5":382,"TRAINER_ISOBEL":383,"TRAINER_IVAN":337,"TRAINER_JACE":204,"TRAINER_JACK":172,"TRAINER_JACKI_1":249,"TRAINER_JACKI_2":250,"TRAINER_JACKI_3":251,"TRAINER_JACKI_4":252,"TRAINER_JACKI_5":253,"TRAINER_JACKSON_1":552,"TRAINER_JACKSON_2":555,"TRAINER_JACKSON_3":556,"TRAINER_JACKSON_4":557,"TRAINER_JACKSON_5":558,"TRAINER_JACLYN":243,"TRAINER_JACOB":351,"TRAINER_JAIDEN":749,"TRAINER_JAMES_1":621,"TRAINER_JAMES_2":622,"TRAINER_JAMES_3":623,"TRAINER_JAMES_4":624,"TRAINER_JAMES_5":625,"TRAINER_JANI":418,"TRAINER_JANICE":605,"TRAINER_JARED":401,"TRAINER_JASMINE":359,"TRAINER_JAYLEN":326,"TRAINER_JAZMYN":503,"TRAINER_JEFF":202,"TRAINER_JEFFREY_1":226,"TRAINER_JEFFREY_2":228,"TRAINER_JEFFREY_3":229,"TRAINER_JEFFREY_4":230,"TRAINER_JEFFREY_5":231,"TRAINER_JENNA":560,"TRAINER_JENNIFER":95,"TRAINER_JENNY_1":449,"TRAINER_JENNY_2":465,"TRAINER_JENNY_3":466,"TRAINER_JENNY_4":467,"TRAINER_JENNY_5":468,"TRAINER_JEROME":156,"TRAINER_JERRY_1":273,"TRAINER_JERRY_2":276,"TRAINER_JERRY_3":277,"TRAINER_JERRY_4":278,"TRAINER_JERRY_5":279,"TRAINER_JESSICA_1":127,"TRAINER_JESSICA_2":132,"TRAINER_JESSICA_3":133,"TRAINER_JESSICA_4":134,"TRAINER_JESSICA_5":135,"TRAINER_JOCELYN":425,"TRAINER_JODY":91,"TRAINER_JOEY":322,"TRAINER_JOHANNA":647,"TRAINER_JOHNSON":754,"TRAINER_JOHN_AND_JAY_1":681,"TRAINER_JOHN_AND_JAY_2":682,"TRAINER_JOHN_AND_JAY_3":683,"TRAINER_JOHN_AND_JAY_4":684,"TRAINER_JOHN_AND_JAY_5":685,"TRAINER_JONAH":667,"TRAINER_JONAS":504,"TRAINER_JONATHAN":598,"TRAINER_JOSE":617,"TRAINER_JOSEPH":700,"TRAINER_JOSH":320,"TRAINER_JOSHUA":237,"TRAINER_JOSUE":738,"TRAINER_JUAN_1":272,"TRAINER_JUAN_2":798,"TRAINER_JUAN_3":799,"TRAINER_JUAN_4":800,"TRAINER_JUAN_5":801,"TRAINER_JULIE":100,"TRAINER_JULIO":566,"TRAINER_JUSTIN":215,"TRAINER_KAI":713,"TRAINER_KALEB":699,"TRAINER_KARA":457,"TRAINER_KAREN_1":280,"TRAINER_KAREN_2":282,"TRAINER_KAREN_3":283,"TRAINER_KAREN_4":284,"TRAINER_KAREN_5":285,"TRAINER_KATELYNN":325,"TRAINER_KATELYN_1":386,"TRAINER_KATELYN_2":388,"TRAINER_KATELYN_3":389,"TRAINER_KATELYN_4":390,"TRAINER_KATELYN_5":391,"TRAINER_KATE_AND_JOY":286,"TRAINER_KATHLEEN":583,"TRAINER_KATIE":455,"TRAINER_KAYLA":247,"TRAINER_KAYLEE":462,"TRAINER_KAYLEY":505,"TRAINER_KEEGAN":205,"TRAINER_KEIGO":652,"TRAINER_KEIRA":93,"TRAINER_KELVIN":507,"TRAINER_KENT":620,"TRAINER_KEVIN":171,"TRAINER_KIM_AND_IRIS":678,"TRAINER_KINDRA":106,"TRAINER_KIRA_AND_DAN_1":642,"TRAINER_KIRA_AND_DAN_2":643,"TRAINER_KIRA_AND_DAN_3":644,"TRAINER_KIRA_AND_DAN_4":645,"TRAINER_KIRA_AND_DAN_5":646,"TRAINER_KIRK":191,"TRAINER_KIYO":181,"TRAINER_KOICHI":182,"TRAINER_KOJI_1":672,"TRAINER_KOJI_2":824,"TRAINER_KOJI_3":825,"TRAINER_KOJI_4":826,"TRAINER_KOJI_5":827,"TRAINER_KYLA":443,"TRAINER_KYRA":748,"TRAINER_LAO_1":419,"TRAINER_LAO_2":421,"TRAINER_LAO_3":422,"TRAINER_LAO_4":423,"TRAINER_LAO_5":424,"TRAINER_LARRY":213,"TRAINER_LAURA":426,"TRAINER_LAUREL":463,"TRAINER_LAWRENCE":710,"TRAINER_LEAF":852,"TRAINER_LEAH":35,"TRAINER_LEA_AND_JED":641,"TRAINER_LENNY":628,"TRAINER_LEONARD":495,"TRAINER_LEONARDO":576,"TRAINER_LEONEL":762,"TRAINER_LEROY":77,"TRAINER_LILA_AND_ROY_1":687,"TRAINER_LILA_AND_ROY_2":688,"TRAINER_LILA_AND_ROY_3":689,"TRAINER_LILA_AND_ROY_4":690,"TRAINER_LILA_AND_ROY_5":691,"TRAINER_LILITH":573,"TRAINER_LINDA":461,"TRAINER_LISA_AND_RAY":692,"TRAINER_LOLA_1":57,"TRAINER_LOLA_2":60,"TRAINER_LOLA_3":61,"TRAINER_LOLA_4":62,"TRAINER_LOLA_5":63,"TRAINER_LORENZO":553,"TRAINER_LUCAS_1":629,"TRAINER_LUCAS_2":633,"TRAINER_LUCY":810,"TRAINER_LUIS":151,"TRAINER_LUNG":420,"TRAINER_LYDIA_1":545,"TRAINER_LYDIA_2":548,"TRAINER_LYDIA_3":549,"TRAINER_LYDIA_4":550,"TRAINER_LYDIA_5":551,"TRAINER_LYLE":616,"TRAINER_MACEY":591,"TRAINER_MADELINE_1":434,"TRAINER_MADELINE_2":437,"TRAINER_MADELINE_3":438,"TRAINER_MADELINE_4":439,"TRAINER_MADELINE_5":440,"TRAINER_MAKAYLA":758,"TRAINER_MARC":571,"TRAINER_MARCEL":11,"TRAINER_MARCOS":702,"TRAINER_MARIA_1":369,"TRAINER_MARIA_2":370,"TRAINER_MARIA_3":371,"TRAINER_MARIA_4":372,"TRAINER_MARIA_5":373,"TRAINER_MARIELA":848,"TRAINER_MARK":145,"TRAINER_MARLENE":752,"TRAINER_MARLEY":508,"TRAINER_MARTHA":473,"TRAINER_MARY":89,"TRAINER_MATT":30,"TRAINER_MATTHEW":157,"TRAINER_MAURA":246,"TRAINER_MAXIE_MAGMA_HIDEOUT":601,"TRAINER_MAXIE_MOSSDEEP":734,"TRAINER_MAXIE_MT_CHIMNEY":602,"TRAINER_MAY_LILYCOVE_MUDKIP":664,"TRAINER_MAY_LILYCOVE_TORCHIC":666,"TRAINER_MAY_LILYCOVE_TREECKO":665,"TRAINER_MAY_PLACEHOLDER":854,"TRAINER_MAY_ROUTE_103_MUDKIP":529,"TRAINER_MAY_ROUTE_103_TORCHIC":535,"TRAINER_MAY_ROUTE_103_TREECKO":532,"TRAINER_MAY_ROUTE_110_MUDKIP":530,"TRAINER_MAY_ROUTE_110_TORCHIC":536,"TRAINER_MAY_ROUTE_110_TREECKO":533,"TRAINER_MAY_ROUTE_119_MUDKIP":531,"TRAINER_MAY_ROUTE_119_TORCHIC":537,"TRAINER_MAY_ROUTE_119_TREECKO":534,"TRAINER_MAY_RUSTBORO_MUDKIP":600,"TRAINER_MAY_RUSTBORO_TORCHIC":769,"TRAINER_MAY_RUSTBORO_TREECKO":768,"TRAINER_MELINA":755,"TRAINER_MELISSA":124,"TRAINER_MEL_AND_PAUL":680,"TRAINER_MICAH":255,"TRAINER_MICHELLE":98,"TRAINER_MIGUEL_1":293,"TRAINER_MIGUEL_2":295,"TRAINER_MIGUEL_3":296,"TRAINER_MIGUEL_4":297,"TRAINER_MIGUEL_5":298,"TRAINER_MIKE_1":634,"TRAINER_MIKE_2":635,"TRAINER_MISSY":447,"TRAINER_MITCHELL":540,"TRAINER_MIU_AND_YUKI":484,"TRAINER_MOLLIE":137,"TRAINER_MYLES":765,"TRAINER_NANCY":472,"TRAINER_NAOMI":119,"TRAINER_NATE":582,"TRAINER_NED":340,"TRAINER_NICHOLAS":585,"TRAINER_NICOLAS_1":392,"TRAINER_NICOLAS_2":393,"TRAINER_NICOLAS_3":394,"TRAINER_NICOLAS_4":395,"TRAINER_NICOLAS_5":396,"TRAINER_NIKKI":453,"TRAINER_NOB_1":183,"TRAINER_NOB_2":184,"TRAINER_NOB_3":185,"TRAINER_NOB_4":186,"TRAINER_NOB_5":187,"TRAINER_NOLAN":342,"TRAINER_NOLAND":809,"TRAINER_NOLEN":161,"TRAINER_NONE":0,"TRAINER_NORMAN_1":269,"TRAINER_NORMAN_2":786,"TRAINER_NORMAN_3":787,"TRAINER_NORMAN_4":788,"TRAINER_NORMAN_5":789,"TRAINER_OLIVIA":130,"TRAINER_OWEN":83,"TRAINER_PABLO_1":377,"TRAINER_PABLO_2":820,"TRAINER_PABLO_3":821,"TRAINER_PABLO_4":822,"TRAINER_PABLO_5":823,"TRAINER_PARKER":72,"TRAINER_PAT":766,"TRAINER_PATRICIA":105,"TRAINER_PAUL":275,"TRAINER_PAULA":429,"TRAINER_PAXTON":594,"TRAINER_PERRY":398,"TRAINER_PETE":735,"TRAINER_PHIL":400,"TRAINER_PHILLIP":494,"TRAINER_PHOEBE":262,"TRAINER_PRESLEY":403,"TRAINER_PRESTON":233,"TRAINER_QUINCY":324,"TRAINER_RACHEL":761,"TRAINER_RANDALL":71,"TRAINER_RED":851,"TRAINER_REED":675,"TRAINER_RELI_AND_IAN":686,"TRAINER_REYNA":509,"TRAINER_RHETT":703,"TRAINER_RICHARD":166,"TRAINER_RICK":615,"TRAINER_RICKY_1":64,"TRAINER_RICKY_2":67,"TRAINER_RICKY_3":68,"TRAINER_RICKY_4":69,"TRAINER_RICKY_5":70,"TRAINER_RILEY":653,"TRAINER_ROBERT_1":406,"TRAINER_ROBERT_2":409,"TRAINER_ROBERT_3":410,"TRAINER_ROBERT_4":411,"TRAINER_ROBERT_5":412,"TRAINER_ROBIN":612,"TRAINER_RODNEY":165,"TRAINER_ROGER":669,"TRAINER_ROLAND":160,"TRAINER_RONALD":350,"TRAINER_ROSE_1":37,"TRAINER_ROSE_2":40,"TRAINER_ROSE_3":41,"TRAINER_ROSE_4":42,"TRAINER_ROSE_5":43,"TRAINER_ROXANNE_1":265,"TRAINER_ROXANNE_2":770,"TRAINER_ROXANNE_3":771,"TRAINER_ROXANNE_4":772,"TRAINER_ROXANNE_5":773,"TRAINER_RUBEN":671,"TRAINER_SALLY":611,"TRAINER_SAMANTHA":245,"TRAINER_SAMUEL":81,"TRAINER_SANTIAGO":168,"TRAINER_SARAH":695,"TRAINER_SAWYER_1":1,"TRAINER_SAWYER_2":836,"TRAINER_SAWYER_3":837,"TRAINER_SAWYER_4":838,"TRAINER_SAWYER_5":839,"TRAINER_SEBASTIAN":554,"TRAINER_SHANE":214,"TRAINER_SHANNON":97,"TRAINER_SHARON":452,"TRAINER_SHAWN":194,"TRAINER_SHAYLA":747,"TRAINER_SHEILA":125,"TRAINER_SHELBY_1":313,"TRAINER_SHELBY_2":314,"TRAINER_SHELBY_3":315,"TRAINER_SHELBY_4":316,"TRAINER_SHELBY_5":317,"TRAINER_SHELLY_SEAFLOOR_CAVERN":33,"TRAINER_SHELLY_WEATHER_INSTITUTE":32,"TRAINER_SHIRLEY":126,"TRAINER_SIDNEY":261,"TRAINER_SIENNA":459,"TRAINER_SIMON":65,"TRAINER_SOPHIA":561,"TRAINER_SOPHIE":708,"TRAINER_SPENCER":159,"TRAINER_SPENSER":807,"TRAINER_STAN":162,"TRAINER_STEVEN":804,"TRAINER_STEVE_1":143,"TRAINER_STEVE_2":147,"TRAINER_STEVE_3":148,"TRAINER_STEVE_4":149,"TRAINER_STEVE_5":150,"TRAINER_SUSIE":456,"TRAINER_SYLVIA":575,"TRAINER_TABITHA_MAGMA_HIDEOUT":732,"TRAINER_TABITHA_MOSSDEEP":514,"TRAINER_TABITHA_MT_CHIMNEY":597,"TRAINER_TAKAO":179,"TRAINER_TAKASHI":416,"TRAINER_TALIA":385,"TRAINER_TAMMY":107,"TRAINER_TANYA":451,"TRAINER_TARA":446,"TRAINER_TASHA":109,"TRAINER_TATE_AND_LIZA_1":271,"TRAINER_TATE_AND_LIZA_2":794,"TRAINER_TATE_AND_LIZA_3":795,"TRAINER_TATE_AND_LIZA_4":796,"TRAINER_TATE_AND_LIZA_5":797,"TRAINER_TAYLOR":225,"TRAINER_TED":274,"TRAINER_TERRY":581,"TRAINER_THALIA_1":144,"TRAINER_THALIA_2":844,"TRAINER_THALIA_3":845,"TRAINER_THALIA_4":846,"TRAINER_THALIA_5":847,"TRAINER_THOMAS":256,"TRAINER_TIANA":603,"TRAINER_TIFFANY":131,"TRAINER_TIMMY":334,"TRAINER_TIMOTHY_1":307,"TRAINER_TIMOTHY_2":308,"TRAINER_TIMOTHY_3":309,"TRAINER_TIMOTHY_4":310,"TRAINER_TIMOTHY_5":311,"TRAINER_TISHA":676,"TRAINER_TOMMY":321,"TRAINER_TONY_1":155,"TRAINER_TONY_2":175,"TRAINER_TONY_3":176,"TRAINER_TONY_4":177,"TRAINER_TONY_5":178,"TRAINER_TORI_AND_TIA":677,"TRAINER_TRAVIS":218,"TRAINER_TRENT_1":627,"TRAINER_TRENT_2":636,"TRAINER_TRENT_3":637,"TRAINER_TRENT_4":638,"TRAINER_TRENT_5":639,"TRAINER_TUCKER":806,"TRAINER_TYRA_AND_IVY":679,"TRAINER_TYRON":704,"TRAINER_VALERIE_1":108,"TRAINER_VALERIE_2":110,"TRAINER_VALERIE_3":111,"TRAINER_VALERIE_4":112,"TRAINER_VALERIE_5":113,"TRAINER_VANESSA":300,"TRAINER_VICKY":312,"TRAINER_VICTOR":292,"TRAINER_VICTORIA":299,"TRAINER_VINCENT":76,"TRAINER_VIOLET":39,"TRAINER_VIRGIL":234,"TRAINER_VITO":82,"TRAINER_VIVI":606,"TRAINER_VIVIAN":649,"TRAINER_WADE":344,"TRAINER_WALLACE":335,"TRAINER_WALLY_MAUVILLE":656,"TRAINER_WALLY_VR_1":519,"TRAINER_WALLY_VR_2":657,"TRAINER_WALLY_VR_3":658,"TRAINER_WALLY_VR_4":659,"TRAINER_WALLY_VR_5":660,"TRAINER_WALTER_1":254,"TRAINER_WALTER_2":257,"TRAINER_WALTER_3":258,"TRAINER_WALTER_4":259,"TRAINER_WALTER_5":260,"TRAINER_WARREN":88,"TRAINER_WATTSON_1":267,"TRAINER_WATTSON_2":778,"TRAINER_WATTSON_3":779,"TRAINER_WATTSON_4":780,"TRAINER_WATTSON_5":781,"TRAINER_WAYNE":673,"TRAINER_WENDY":92,"TRAINER_WILLIAM":236,"TRAINER_WILTON_1":78,"TRAINER_WILTON_2":84,"TRAINER_WILTON_3":85,"TRAINER_WILTON_4":86,"TRAINER_WILTON_5":87,"TRAINER_WINONA_1":270,"TRAINER_WINONA_2":790,"TRAINER_WINONA_3":791,"TRAINER_WINONA_4":792,"TRAINER_WINONA_5":793,"TRAINER_WINSTON_1":136,"TRAINER_WINSTON_2":139,"TRAINER_WINSTON_3":140,"TRAINER_WINSTON_4":141,"TRAINER_WINSTON_5":142,"TRAINER_WYATT":711,"TRAINER_YASU":415,"TRAINER_YUJI":188,"TRAINER_ZANDER":31},"legendary_encounters":[{"address":2538600,"catch_flag":429,"defeat_flag":428,"level":30,"species":410},{"address":2354334,"catch_flag":480,"defeat_flag":447,"level":70,"species":405},{"address":2543160,"catch_flag":146,"defeat_flag":476,"level":70,"species":250},{"address":2354112,"catch_flag":479,"defeat_flag":446,"level":70,"species":404},{"address":2385623,"catch_flag":457,"defeat_flag":456,"level":50,"species":407},{"address":2385687,"catch_flag":482,"defeat_flag":481,"level":50,"species":408},{"address":2543443,"catch_flag":145,"defeat_flag":477,"level":70,"species":249},{"address":2538177,"catch_flag":458,"defeat_flag":455,"level":30,"species":151},{"address":2347488,"catch_flag":478,"defeat_flag":448,"level":70,"species":406},{"address":2345460,"catch_flag":427,"defeat_flag":444,"level":40,"species":402},{"address":2298183,"catch_flag":426,"defeat_flag":443,"level":40,"species":401},{"address":2345731,"catch_flag":483,"defeat_flag":445,"level":40,"species":403}],"locations":{"BADGE_1":{"address":2188036,"default_item":226,"flag":1182},"BADGE_2":{"address":2095131,"default_item":227,"flag":1183},"BADGE_3":{"address":2167252,"default_item":228,"flag":1184},"BADGE_4":{"address":2103246,"default_item":229,"flag":1185},"BADGE_5":{"address":2129781,"default_item":230,"flag":1186},"BADGE_6":{"address":2202122,"default_item":231,"flag":1187},"BADGE_7":{"address":2243964,"default_item":232,"flag":1188},"BADGE_8":{"address":2262314,"default_item":233,"flag":1189},"BERRY_TREE_01":{"address":5843562,"default_item":135,"flag":612},"BERRY_TREE_02":{"address":5843564,"default_item":139,"flag":613},"BERRY_TREE_03":{"address":5843566,"default_item":142,"flag":614},"BERRY_TREE_04":{"address":5843568,"default_item":139,"flag":615},"BERRY_TREE_05":{"address":5843570,"default_item":133,"flag":616},"BERRY_TREE_06":{"address":5843572,"default_item":138,"flag":617},"BERRY_TREE_07":{"address":5843574,"default_item":133,"flag":618},"BERRY_TREE_08":{"address":5843576,"default_item":133,"flag":619},"BERRY_TREE_09":{"address":5843578,"default_item":142,"flag":620},"BERRY_TREE_10":{"address":5843580,"default_item":138,"flag":621},"BERRY_TREE_11":{"address":5843582,"default_item":139,"flag":622},"BERRY_TREE_12":{"address":5843584,"default_item":142,"flag":623},"BERRY_TREE_13":{"address":5843586,"default_item":135,"flag":624},"BERRY_TREE_14":{"address":5843588,"default_item":155,"flag":625},"BERRY_TREE_15":{"address":5843590,"default_item":153,"flag":626},"BERRY_TREE_16":{"address":5843592,"default_item":150,"flag":627},"BERRY_TREE_17":{"address":5843594,"default_item":150,"flag":628},"BERRY_TREE_18":{"address":5843596,"default_item":150,"flag":629},"BERRY_TREE_19":{"address":5843598,"default_item":148,"flag":630},"BERRY_TREE_20":{"address":5843600,"default_item":148,"flag":631},"BERRY_TREE_21":{"address":5843602,"default_item":136,"flag":632},"BERRY_TREE_22":{"address":5843604,"default_item":135,"flag":633},"BERRY_TREE_23":{"address":5843606,"default_item":135,"flag":634},"BERRY_TREE_24":{"address":5843608,"default_item":136,"flag":635},"BERRY_TREE_25":{"address":5843610,"default_item":152,"flag":636},"BERRY_TREE_26":{"address":5843612,"default_item":134,"flag":637},"BERRY_TREE_27":{"address":5843614,"default_item":151,"flag":638},"BERRY_TREE_28":{"address":5843616,"default_item":151,"flag":639},"BERRY_TREE_29":{"address":5843618,"default_item":151,"flag":640},"BERRY_TREE_30":{"address":5843620,"default_item":153,"flag":641},"BERRY_TREE_31":{"address":5843622,"default_item":142,"flag":642},"BERRY_TREE_32":{"address":5843624,"default_item":142,"flag":643},"BERRY_TREE_33":{"address":5843626,"default_item":142,"flag":644},"BERRY_TREE_34":{"address":5843628,"default_item":153,"flag":645},"BERRY_TREE_35":{"address":5843630,"default_item":153,"flag":646},"BERRY_TREE_36":{"address":5843632,"default_item":153,"flag":647},"BERRY_TREE_37":{"address":5843634,"default_item":137,"flag":648},"BERRY_TREE_38":{"address":5843636,"default_item":137,"flag":649},"BERRY_TREE_39":{"address":5843638,"default_item":137,"flag":650},"BERRY_TREE_40":{"address":5843640,"default_item":135,"flag":651},"BERRY_TREE_41":{"address":5843642,"default_item":135,"flag":652},"BERRY_TREE_42":{"address":5843644,"default_item":135,"flag":653},"BERRY_TREE_43":{"address":5843646,"default_item":148,"flag":654},"BERRY_TREE_44":{"address":5843648,"default_item":150,"flag":655},"BERRY_TREE_45":{"address":5843650,"default_item":152,"flag":656},"BERRY_TREE_46":{"address":5843652,"default_item":151,"flag":657},"BERRY_TREE_47":{"address":5843654,"default_item":140,"flag":658},"BERRY_TREE_48":{"address":5843656,"default_item":137,"flag":659},"BERRY_TREE_49":{"address":5843658,"default_item":136,"flag":660},"BERRY_TREE_50":{"address":5843660,"default_item":134,"flag":661},"BERRY_TREE_51":{"address":5843662,"default_item":142,"flag":662},"BERRY_TREE_52":{"address":5843664,"default_item":150,"flag":663},"BERRY_TREE_53":{"address":5843666,"default_item":150,"flag":664},"BERRY_TREE_54":{"address":5843668,"default_item":142,"flag":665},"BERRY_TREE_55":{"address":5843670,"default_item":149,"flag":666},"BERRY_TREE_56":{"address":5843672,"default_item":149,"flag":667},"BERRY_TREE_57":{"address":5843674,"default_item":136,"flag":668},"BERRY_TREE_58":{"address":5843676,"default_item":153,"flag":669},"BERRY_TREE_59":{"address":5843678,"default_item":153,"flag":670},"BERRY_TREE_60":{"address":5843680,"default_item":157,"flag":671},"BERRY_TREE_61":{"address":5843682,"default_item":157,"flag":672},"BERRY_TREE_62":{"address":5843684,"default_item":138,"flag":673},"BERRY_TREE_63":{"address":5843686,"default_item":142,"flag":674},"BERRY_TREE_64":{"address":5843688,"default_item":138,"flag":675},"BERRY_TREE_65":{"address":5843690,"default_item":157,"flag":676},"BERRY_TREE_66":{"address":5843692,"default_item":134,"flag":677},"BERRY_TREE_67":{"address":5843694,"default_item":152,"flag":678},"BERRY_TREE_68":{"address":5843696,"default_item":140,"flag":679},"BERRY_TREE_69":{"address":5843698,"default_item":154,"flag":680},"BERRY_TREE_70":{"address":5843700,"default_item":154,"flag":681},"BERRY_TREE_71":{"address":5843702,"default_item":154,"flag":682},"BERRY_TREE_72":{"address":5843704,"default_item":157,"flag":683},"BERRY_TREE_73":{"address":5843706,"default_item":155,"flag":684},"BERRY_TREE_74":{"address":5843708,"default_item":155,"flag":685},"BERRY_TREE_75":{"address":5843710,"default_item":142,"flag":686},"BERRY_TREE_76":{"address":5843712,"default_item":133,"flag":687},"BERRY_TREE_77":{"address":5843714,"default_item":140,"flag":688},"BERRY_TREE_78":{"address":5843716,"default_item":140,"flag":689},"BERRY_TREE_79":{"address":5843718,"default_item":155,"flag":690},"BERRY_TREE_80":{"address":5843720,"default_item":139,"flag":691},"BERRY_TREE_81":{"address":5843722,"default_item":139,"flag":692},"BERRY_TREE_82":{"address":5843724,"default_item":168,"flag":693},"BERRY_TREE_83":{"address":5843726,"default_item":156,"flag":694},"BERRY_TREE_84":{"address":5843728,"default_item":156,"flag":695},"BERRY_TREE_85":{"address":5843730,"default_item":142,"flag":696},"BERRY_TREE_86":{"address":5843732,"default_item":138,"flag":697},"BERRY_TREE_87":{"address":5843734,"default_item":135,"flag":698},"BERRY_TREE_88":{"address":5843736,"default_item":142,"flag":699},"HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":{"address":5497200,"default_item":281,"flag":531},"HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":{"address":5497212,"default_item":282,"flag":532},"HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":{"address":5497224,"default_item":283,"flag":533},"HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":{"address":5497236,"default_item":284,"flag":534},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":{"address":5500100,"default_item":67,"flag":601},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":{"address":5500124,"default_item":65,"flag":604},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":{"address":5500112,"default_item":64,"flag":603},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":{"address":5500088,"default_item":70,"flag":602},"HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":{"address":5435924,"default_item":110,"flag":528},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":{"address":5487372,"default_item":195,"flag":548},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":{"address":5487384,"default_item":195,"flag":549},"HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":{"address":5489116,"default_item":23,"flag":577},"HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":{"address":5489128,"default_item":3,"flag":576},"HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":{"address":5435672,"default_item":16,"flag":500},"HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":{"address":5432608,"default_item":111,"flag":527},"HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":{"address":5432632,"default_item":4,"flag":575},"HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":{"address":5432620,"default_item":69,"flag":543},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":{"address":5490440,"default_item":35,"flag":578},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":{"address":5490428,"default_item":2,"flag":529},"HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":{"address":5490796,"default_item":68,"flag":580},"HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":{"address":5490784,"default_item":70,"flag":579},"HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":{"address":5525804,"default_item":45,"flag":609},"HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":{"address":5428972,"default_item":68,"flag":595},"HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":{"address":5487908,"default_item":4,"flag":561},"HIDDEN_ITEM_PETALBURG_WOODS_POTION":{"address":5487872,"default_item":13,"flag":558},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":{"address":5487884,"default_item":103,"flag":559},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":{"address":5487896,"default_item":103,"flag":560},"HIDDEN_ITEM_ROUTE_104_ANTIDOTE":{"address":5438492,"default_item":14,"flag":585},"HIDDEN_ITEM_ROUTE_104_HEART_SCALE":{"address":5438504,"default_item":111,"flag":588},"HIDDEN_ITEM_ROUTE_104_POKE_BALL":{"address":5438468,"default_item":4,"flag":562},"HIDDEN_ITEM_ROUTE_104_POTION":{"address":5438480,"default_item":13,"flag":537},"HIDDEN_ITEM_ROUTE_104_SUPER_POTION":{"address":5438456,"default_item":22,"flag":544},"HIDDEN_ITEM_ROUTE_105_BIG_PEARL":{"address":5438748,"default_item":107,"flag":611},"HIDDEN_ITEM_ROUTE_105_HEART_SCALE":{"address":5438736,"default_item":111,"flag":589},"HIDDEN_ITEM_ROUTE_106_HEART_SCALE":{"address":5438932,"default_item":111,"flag":547},"HIDDEN_ITEM_ROUTE_106_POKE_BALL":{"address":5438908,"default_item":4,"flag":563},"HIDDEN_ITEM_ROUTE_106_STARDUST":{"address":5438920,"default_item":108,"flag":546},"HIDDEN_ITEM_ROUTE_108_RARE_CANDY":{"address":5439340,"default_item":68,"flag":586},"HIDDEN_ITEM_ROUTE_109_ETHER":{"address":5440016,"default_item":34,"flag":564},"HIDDEN_ITEM_ROUTE_109_GREAT_BALL":{"address":5440004,"default_item":3,"flag":551},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":{"address":5439992,"default_item":111,"flag":552},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":{"address":5440028,"default_item":111,"flag":590},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":{"address":5440040,"default_item":111,"flag":591},"HIDDEN_ITEM_ROUTE_109_REVIVE":{"address":5439980,"default_item":24,"flag":550},"HIDDEN_ITEM_ROUTE_110_FULL_HEAL":{"address":5441308,"default_item":23,"flag":555},"HIDDEN_ITEM_ROUTE_110_GREAT_BALL":{"address":5441284,"default_item":3,"flag":553},"HIDDEN_ITEM_ROUTE_110_POKE_BALL":{"address":5441296,"default_item":4,"flag":565},"HIDDEN_ITEM_ROUTE_110_REVIVE":{"address":5441272,"default_item":24,"flag":554},"HIDDEN_ITEM_ROUTE_111_PROTEIN":{"address":5443220,"default_item":64,"flag":556},"HIDDEN_ITEM_ROUTE_111_RARE_CANDY":{"address":5443232,"default_item":68,"flag":557},"HIDDEN_ITEM_ROUTE_111_STARDUST":{"address":5443160,"default_item":108,"flag":502},"HIDDEN_ITEM_ROUTE_113_ETHER":{"address":5444488,"default_item":34,"flag":503},"HIDDEN_ITEM_ROUTE_113_NUGGET":{"address":5444512,"default_item":110,"flag":598},"HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":{"address":5444500,"default_item":320,"flag":530},"HIDDEN_ITEM_ROUTE_114_CARBOS":{"address":5445340,"default_item":66,"flag":504},"HIDDEN_ITEM_ROUTE_114_REVIVE":{"address":5445364,"default_item":24,"flag":542},"HIDDEN_ITEM_ROUTE_115_HEART_SCALE":{"address":5446176,"default_item":111,"flag":597},"HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":{"address":5447056,"default_item":206,"flag":596},"HIDDEN_ITEM_ROUTE_116_SUPER_POTION":{"address":5447044,"default_item":22,"flag":545},"HIDDEN_ITEM_ROUTE_117_REPEL":{"address":5447708,"default_item":86,"flag":572},"HIDDEN_ITEM_ROUTE_118_HEART_SCALE":{"address":5448404,"default_item":111,"flag":566},"HIDDEN_ITEM_ROUTE_118_IRON":{"address":5448392,"default_item":65,"flag":567},"HIDDEN_ITEM_ROUTE_119_CALCIUM":{"address":5449972,"default_item":67,"flag":505},"HIDDEN_ITEM_ROUTE_119_FULL_HEAL":{"address":5450056,"default_item":23,"flag":568},"HIDDEN_ITEM_ROUTE_119_MAX_ETHER":{"address":5450068,"default_item":35,"flag":587},"HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":{"address":5449984,"default_item":2,"flag":506},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":{"address":5451596,"default_item":68,"flag":571},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":{"address":5451620,"default_item":68,"flag":569},"HIDDEN_ITEM_ROUTE_120_REVIVE":{"address":5451608,"default_item":24,"flag":584},"HIDDEN_ITEM_ROUTE_120_ZINC":{"address":5451632,"default_item":70,"flag":570},"HIDDEN_ITEM_ROUTE_121_FULL_HEAL":{"address":5452540,"default_item":23,"flag":573},"HIDDEN_ITEM_ROUTE_121_HP_UP":{"address":5452516,"default_item":63,"flag":539},"HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":{"address":5452552,"default_item":25,"flag":600},"HIDDEN_ITEM_ROUTE_121_NUGGET":{"address":5452528,"default_item":110,"flag":540},"HIDDEN_ITEM_ROUTE_123_HYPER_POTION":{"address":5454100,"default_item":21,"flag":574},"HIDDEN_ITEM_ROUTE_123_PP_UP":{"address":5454112,"default_item":69,"flag":599},"HIDDEN_ITEM_ROUTE_123_RARE_CANDY":{"address":5454124,"default_item":68,"flag":610},"HIDDEN_ITEM_ROUTE_123_REVIVE":{"address":5454088,"default_item":24,"flag":541},"HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":{"address":5454052,"default_item":83,"flag":507},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":{"address":5455620,"default_item":111,"flag":592},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":{"address":5455632,"default_item":111,"flag":593},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":{"address":5455644,"default_item":111,"flag":594},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":{"address":5517256,"default_item":68,"flag":606},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":{"address":5517268,"default_item":70,"flag":607},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":{"address":5517432,"default_item":19,"flag":605},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":{"address":5517420,"default_item":69,"flag":608},"HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":{"address":5511292,"default_item":200,"flag":535},"HIDDEN_ITEM_TRICK_HOUSE_NUGGET":{"address":5526716,"default_item":110,"flag":501},"HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":{"address":5456992,"default_item":107,"flag":511},"HIDDEN_ITEM_UNDERWATER_124_CALCIUM":{"address":5457016,"default_item":67,"flag":536},"HIDDEN_ITEM_UNDERWATER_124_CARBOS":{"address":5456956,"default_item":66,"flag":508},"HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":{"address":5456968,"default_item":51,"flag":509},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":{"address":5457004,"default_item":111,"flag":513},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":{"address":5457028,"default_item":111,"flag":538},"HIDDEN_ITEM_UNDERWATER_124_PEARL":{"address":5456980,"default_item":106,"flag":510},"HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":{"address":5457140,"default_item":107,"flag":520},"HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":{"address":5457152,"default_item":49,"flag":512},"HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":{"address":5457068,"default_item":111,"flag":514},"HIDDEN_ITEM_UNDERWATER_126_IRON":{"address":5457116,"default_item":65,"flag":519},"HIDDEN_ITEM_UNDERWATER_126_PEARL":{"address":5457104,"default_item":106,"flag":517},"HIDDEN_ITEM_UNDERWATER_126_STARDUST":{"address":5457092,"default_item":108,"flag":516},"HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":{"address":5457080,"default_item":2,"flag":515},"HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":{"address":5457128,"default_item":50,"flag":518},"HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":{"address":5457224,"default_item":111,"flag":523},"HIDDEN_ITEM_UNDERWATER_127_HP_UP":{"address":5457212,"default_item":63,"flag":522},"HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":{"address":5457236,"default_item":48,"flag":524},"HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":{"address":5457200,"default_item":109,"flag":521},"HIDDEN_ITEM_UNDERWATER_128_PEARL":{"address":5457288,"default_item":106,"flag":526},"HIDDEN_ITEM_UNDERWATER_128_PROTEIN":{"address":5457276,"default_item":64,"flag":525},"HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":{"address":5493932,"default_item":2,"flag":581},"HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":{"address":5494744,"default_item":36,"flag":582},"HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":{"address":5494756,"default_item":84,"flag":583},"ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":{"address":2709805,"default_item":285,"flag":1100},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":{"address":2709857,"default_item":306,"flag":1102},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":{"address":2709831,"default_item":278,"flag":1078},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":{"address":2709844,"default_item":97,"flag":1101},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":{"address":2709818,"default_item":11,"flag":1077},"ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":{"address":2709740,"default_item":122,"flag":1095},"ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":{"address":2709792,"default_item":24,"flag":1099},"ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":{"address":2709766,"default_item":7,"flag":1097},"ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":{"address":2709753,"default_item":85,"flag":1096},"ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":{"address":2709779,"default_item":301,"flag":1098},"ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":{"address":2710039,"default_item":1,"flag":1124},"ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":{"address":2710065,"default_item":37,"flag":1071},"ITEM_AQUA_HIDEOUT_B1F_NUGGET":{"address":2710052,"default_item":110,"flag":1132},"ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":{"address":2710078,"default_item":8,"flag":1072},"ITEM_ARTISAN_CAVE_1F_CARBOS":{"address":2710416,"default_item":66,"flag":1163},"ITEM_ARTISAN_CAVE_B1F_HP_UP":{"address":2710403,"default_item":63,"flag":1162},"ITEM_FIERY_PATH_FIRE_STONE":{"address":2709584,"default_item":95,"flag":1111},"ITEM_FIERY_PATH_TM_TOXIC":{"address":2709597,"default_item":294,"flag":1091},"ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":{"address":2709519,"default_item":85,"flag":1050},"ITEM_GRANITE_CAVE_B1F_POKE_BALL":{"address":2709532,"default_item":4,"flag":1051},"ITEM_GRANITE_CAVE_B2F_RARE_CANDY":{"address":2709558,"default_item":68,"flag":1054},"ITEM_GRANITE_CAVE_B2F_REPEL":{"address":2709545,"default_item":86,"flag":1053},"ITEM_JAGGED_PASS_BURN_HEAL":{"address":2709571,"default_item":15,"flag":1070},"ITEM_LILYCOVE_CITY_MAX_REPEL":{"address":2709415,"default_item":84,"flag":1042},"ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":{"address":2710429,"default_item":68,"flag":1151},"ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":{"address":2710455,"default_item":19,"flag":1165},"ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":{"address":2710442,"default_item":37,"flag":1164},"ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":{"address":2710468,"default_item":110,"flag":1166},"ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":{"address":2710481,"default_item":71,"flag":1167},"ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":{"address":2710507,"default_item":85,"flag":1059},"ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":{"address":2710494,"default_item":25,"flag":1168},"ITEM_MAUVILLE_CITY_X_SPEED":{"address":2709389,"default_item":77,"flag":1116},"ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":{"address":2709623,"default_item":23,"flag":1045},"ITEM_METEOR_FALLS_1F_1R_MOON_STONE":{"address":2709636,"default_item":94,"flag":1046},"ITEM_METEOR_FALLS_1F_1R_PP_UP":{"address":2709649,"default_item":69,"flag":1047},"ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":{"address":2709610,"default_item":311,"flag":1044},"ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":{"address":2709662,"default_item":290,"flag":1080},"ITEM_MOSSDEEP_CITY_NET_BALL":{"address":2709428,"default_item":6,"flag":1043},"ITEM_MT_PYRE_2F_ULTRA_BALL":{"address":2709948,"default_item":2,"flag":1129},"ITEM_MT_PYRE_3F_SUPER_REPEL":{"address":2709961,"default_item":83,"flag":1120},"ITEM_MT_PYRE_4F_SEA_INCENSE":{"address":2709974,"default_item":220,"flag":1130},"ITEM_MT_PYRE_5F_LAX_INCENSE":{"address":2709987,"default_item":221,"flag":1052},"ITEM_MT_PYRE_6F_TM_SHADOW_BALL":{"address":2710000,"default_item":318,"flag":1089},"ITEM_MT_PYRE_EXTERIOR_MAX_POTION":{"address":2710013,"default_item":20,"flag":1073},"ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":{"address":2710026,"default_item":336,"flag":1074},"ITEM_NEW_MAUVILLE_ESCAPE_ROPE":{"address":2709688,"default_item":85,"flag":1076},"ITEM_NEW_MAUVILLE_FULL_HEAL":{"address":2709714,"default_item":23,"flag":1122},"ITEM_NEW_MAUVILLE_PARALYZE_HEAL":{"address":2709727,"default_item":18,"flag":1123},"ITEM_NEW_MAUVILLE_THUNDER_STONE":{"address":2709701,"default_item":96,"flag":1110},"ITEM_NEW_MAUVILLE_ULTRA_BALL":{"address":2709675,"default_item":2,"flag":1075},"ITEM_PETALBURG_CITY_ETHER":{"address":2709376,"default_item":34,"flag":1040},"ITEM_PETALBURG_CITY_MAX_REVIVE":{"address":2709363,"default_item":25,"flag":1039},"ITEM_PETALBURG_WOODS_ETHER":{"address":2709467,"default_item":34,"flag":1058},"ITEM_PETALBURG_WOODS_GREAT_BALL":{"address":2709454,"default_item":3,"flag":1056},"ITEM_PETALBURG_WOODS_PARALYZE_HEAL":{"address":2709480,"default_item":18,"flag":1117},"ITEM_PETALBURG_WOODS_X_ATTACK":{"address":2709441,"default_item":75,"flag":1055},"ITEM_ROUTE_102_POTION":{"address":2708375,"default_item":13,"flag":1000},"ITEM_ROUTE_103_GUARD_SPEC":{"address":2708388,"default_item":73,"flag":1114},"ITEM_ROUTE_103_PP_UP":{"address":2708401,"default_item":69,"flag":1137},"ITEM_ROUTE_104_POKE_BALL":{"address":2708427,"default_item":4,"flag":1057},"ITEM_ROUTE_104_POTION":{"address":2708453,"default_item":13,"flag":1135},"ITEM_ROUTE_104_PP_UP":{"address":2708414,"default_item":69,"flag":1002},"ITEM_ROUTE_104_X_ACCURACY":{"address":2708440,"default_item":78,"flag":1115},"ITEM_ROUTE_105_IRON":{"address":2708466,"default_item":65,"flag":1003},"ITEM_ROUTE_106_PROTEIN":{"address":2708479,"default_item":64,"flag":1004},"ITEM_ROUTE_108_STAR_PIECE":{"address":2708492,"default_item":109,"flag":1139},"ITEM_ROUTE_109_POTION":{"address":2708518,"default_item":13,"flag":1140},"ITEM_ROUTE_109_PP_UP":{"address":2708505,"default_item":69,"flag":1005},"ITEM_ROUTE_110_DIRE_HIT":{"address":2708544,"default_item":74,"flag":1007},"ITEM_ROUTE_110_ELIXIR":{"address":2708557,"default_item":36,"flag":1141},"ITEM_ROUTE_110_RARE_CANDY":{"address":2708531,"default_item":68,"flag":1006},"ITEM_ROUTE_111_ELIXIR":{"address":2708609,"default_item":36,"flag":1142},"ITEM_ROUTE_111_HP_UP":{"address":2708596,"default_item":63,"flag":1010},"ITEM_ROUTE_111_STARDUST":{"address":2708583,"default_item":108,"flag":1009},"ITEM_ROUTE_111_TM_SANDSTORM":{"address":2708570,"default_item":325,"flag":1008},"ITEM_ROUTE_112_NUGGET":{"address":2708622,"default_item":110,"flag":1011},"ITEM_ROUTE_113_HYPER_POTION":{"address":2708661,"default_item":21,"flag":1143},"ITEM_ROUTE_113_MAX_ETHER":{"address":2708635,"default_item":35,"flag":1012},"ITEM_ROUTE_113_SUPER_REPEL":{"address":2708648,"default_item":83,"flag":1013},"ITEM_ROUTE_114_ENERGY_POWDER":{"address":2708700,"default_item":30,"flag":1160},"ITEM_ROUTE_114_PROTEIN":{"address":2708687,"default_item":64,"flag":1015},"ITEM_ROUTE_114_RARE_CANDY":{"address":2708674,"default_item":68,"flag":1014},"ITEM_ROUTE_115_GREAT_BALL":{"address":2708752,"default_item":3,"flag":1118},"ITEM_ROUTE_115_HEAL_POWDER":{"address":2708765,"default_item":32,"flag":1144},"ITEM_ROUTE_115_IRON":{"address":2708739,"default_item":65,"flag":1018},"ITEM_ROUTE_115_PP_UP":{"address":2708778,"default_item":69,"flag":1161},"ITEM_ROUTE_115_SUPER_POTION":{"address":2708713,"default_item":22,"flag":1016},"ITEM_ROUTE_115_TM_FOCUS_PUNCH":{"address":2708726,"default_item":289,"flag":1017},"ITEM_ROUTE_116_ETHER":{"address":2708804,"default_item":34,"flag":1019},"ITEM_ROUTE_116_HP_UP":{"address":2708830,"default_item":63,"flag":1021},"ITEM_ROUTE_116_POTION":{"address":2708843,"default_item":13,"flag":1146},"ITEM_ROUTE_116_REPEL":{"address":2708817,"default_item":86,"flag":1020},"ITEM_ROUTE_116_X_SPECIAL":{"address":2708791,"default_item":79,"flag":1001},"ITEM_ROUTE_117_GREAT_BALL":{"address":2708856,"default_item":3,"flag":1022},"ITEM_ROUTE_117_REVIVE":{"address":2708869,"default_item":24,"flag":1023},"ITEM_ROUTE_118_HYPER_POTION":{"address":2708882,"default_item":21,"flag":1121},"ITEM_ROUTE_119_ELIXIR_1":{"address":2708921,"default_item":36,"flag":1026},"ITEM_ROUTE_119_ELIXIR_2":{"address":2708986,"default_item":36,"flag":1147},"ITEM_ROUTE_119_HYPER_POTION_1":{"address":2708960,"default_item":21,"flag":1029},"ITEM_ROUTE_119_HYPER_POTION_2":{"address":2708973,"default_item":21,"flag":1106},"ITEM_ROUTE_119_LEAF_STONE":{"address":2708934,"default_item":98,"flag":1027},"ITEM_ROUTE_119_NUGGET":{"address":2710104,"default_item":110,"flag":1134},"ITEM_ROUTE_119_RARE_CANDY":{"address":2708947,"default_item":68,"flag":1028},"ITEM_ROUTE_119_SUPER_REPEL":{"address":2708895,"default_item":83,"flag":1024},"ITEM_ROUTE_119_ZINC":{"address":2708908,"default_item":70,"flag":1025},"ITEM_ROUTE_120_FULL_HEAL":{"address":2709012,"default_item":23,"flag":1031},"ITEM_ROUTE_120_HYPER_POTION":{"address":2709025,"default_item":21,"flag":1107},"ITEM_ROUTE_120_NEST_BALL":{"address":2709038,"default_item":8,"flag":1108},"ITEM_ROUTE_120_NUGGET":{"address":2708999,"default_item":110,"flag":1030},"ITEM_ROUTE_120_REVIVE":{"address":2709051,"default_item":24,"flag":1148},"ITEM_ROUTE_121_CARBOS":{"address":2709064,"default_item":66,"flag":1103},"ITEM_ROUTE_121_REVIVE":{"address":2709077,"default_item":24,"flag":1149},"ITEM_ROUTE_121_ZINC":{"address":2709090,"default_item":70,"flag":1150},"ITEM_ROUTE_123_CALCIUM":{"address":2709103,"default_item":67,"flag":1032},"ITEM_ROUTE_123_ELIXIR":{"address":2709129,"default_item":36,"flag":1109},"ITEM_ROUTE_123_PP_UP":{"address":2709142,"default_item":69,"flag":1152},"ITEM_ROUTE_123_REVIVAL_HERB":{"address":2709155,"default_item":33,"flag":1153},"ITEM_ROUTE_123_ULTRA_BALL":{"address":2709116,"default_item":2,"flag":1104},"ITEM_ROUTE_124_BLUE_SHARD":{"address":2709181,"default_item":49,"flag":1093},"ITEM_ROUTE_124_RED_SHARD":{"address":2709168,"default_item":48,"flag":1092},"ITEM_ROUTE_124_YELLOW_SHARD":{"address":2709194,"default_item":50,"flag":1066},"ITEM_ROUTE_125_BIG_PEARL":{"address":2709207,"default_item":107,"flag":1154},"ITEM_ROUTE_126_GREEN_SHARD":{"address":2709220,"default_item":51,"flag":1105},"ITEM_ROUTE_127_CARBOS":{"address":2709246,"default_item":66,"flag":1035},"ITEM_ROUTE_127_RARE_CANDY":{"address":2709259,"default_item":68,"flag":1155},"ITEM_ROUTE_127_ZINC":{"address":2709233,"default_item":70,"flag":1034},"ITEM_ROUTE_132_PROTEIN":{"address":2709285,"default_item":64,"flag":1156},"ITEM_ROUTE_132_RARE_CANDY":{"address":2709272,"default_item":68,"flag":1036},"ITEM_ROUTE_133_BIG_PEARL":{"address":2709298,"default_item":107,"flag":1037},"ITEM_ROUTE_133_MAX_REVIVE":{"address":2709324,"default_item":25,"flag":1157},"ITEM_ROUTE_133_STAR_PIECE":{"address":2709311,"default_item":109,"flag":1038},"ITEM_ROUTE_134_CARBOS":{"address":2709337,"default_item":66,"flag":1158},"ITEM_ROUTE_134_STAR_PIECE":{"address":2709350,"default_item":109,"flag":1159},"ITEM_RUSTBORO_CITY_X_DEFEND":{"address":2709402,"default_item":76,"flag":1041},"ITEM_RUSTURF_TUNNEL_MAX_ETHER":{"address":2709506,"default_item":35,"flag":1049},"ITEM_RUSTURF_TUNNEL_POKE_BALL":{"address":2709493,"default_item":4,"flag":1048},"ITEM_SAFARI_ZONE_NORTH_CALCIUM":{"address":2709896,"default_item":67,"flag":1119},"ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":{"address":2709922,"default_item":110,"flag":1169},"ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":{"address":2709883,"default_item":310,"flag":1094},"ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":{"address":2709935,"default_item":107,"flag":1170},"ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":{"address":2709909,"default_item":25,"flag":1131},"ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":{"address":2709870,"default_item":299,"flag":1079},"ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":{"address":2710208,"default_item":314,"flag":1090},"ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":{"address":2710143,"default_item":107,"flag":1081},"ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":{"address":2710195,"default_item":212,"flag":1113},"ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":{"address":2710182,"default_item":295,"flag":1112},"ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":{"address":2710156,"default_item":68,"flag":1082},"ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":{"address":2710169,"default_item":16,"flag":1083},"ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":{"address":[2710221,2551006],"default_item":121,"flag":1060},"ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":{"address":[2710234,2551032],"default_item":122,"flag":1061},"ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":{"address":[2710247,2551058],"default_item":126,"flag":1062},"ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":{"address":[2710260,2551084],"default_item":128,"flag":1063},"ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":{"address":[2710273,2551110],"default_item":125,"flag":1064},"ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":{"address":[2710286,2551136],"default_item":124,"flag":1065},"ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":{"address":[2710299,2551162],"default_item":123,"flag":1067},"ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":{"address":[2710312,2551188],"default_item":129,"flag":1068},"ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":{"address":[2710325,2551214],"default_item":127,"flag":1069},"ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":{"address":2710338,"default_item":37,"flag":1084},"ITEM_VICTORY_ROAD_1F_PP_UP":{"address":2710351,"default_item":69,"flag":1085},"ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":{"address":2710377,"default_item":19,"flag":1087},"ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":{"address":2710364,"default_item":317,"flag":1086},"ITEM_VICTORY_ROAD_B2F_FULL_HEAL":{"address":2710390,"default_item":23,"flag":1088},"NPC_GIFT_BERRY_MASTERS_WIFE":{"address":2570453,"default_item":133,"flag":1197},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_1":{"address":2570263,"default_item":153,"flag":1195},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_2":{"address":2570315,"default_item":154,"flag":1196},"NPC_GIFT_FLOWER_SHOP_RECEIVED_BERRY":{"address":2284375,"default_item":133,"flag":1207},"NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON":{"address":1971718,"default_item":271,"flag":208},"NPC_GIFT_GOT_TM_THUNDERBOLT_FROM_WATTSON":{"address":1971754,"default_item":312,"flag":209},"NPC_GIFT_LILYCOVE_RECEIVED_BERRY":{"address":1985277,"default_item":141,"flag":1208},"NPC_GIFT_RECEIVED_6_SODA_POP":{"address":2543767,"default_item":27,"flag":140},"NPC_GIFT_RECEIVED_ACRO_BIKE":{"address":2170570,"default_item":272,"flag":1181},"NPC_GIFT_RECEIVED_AMULET_COIN":{"address":2716248,"default_item":189,"flag":133},"NPC_GIFT_RECEIVED_AURORA_TICKET":{"address":2716523,"default_item":371,"flag":314},"NPC_GIFT_RECEIVED_CHARCOAL":{"address":2102559,"default_item":215,"flag":254},"NPC_GIFT_RECEIVED_CHESTO_BERRY_ROUTE_104":{"address":2028703,"default_item":134,"flag":246},"NPC_GIFT_RECEIVED_CLEANSE_TAG":{"address":2312109,"default_item":190,"flag":282},"NPC_GIFT_RECEIVED_COIN_CASE":{"address":2179054,"default_item":260,"flag":258},"NPC_GIFT_RECEIVED_DEEP_SEA_SCALE":{"address":2162572,"default_item":193,"flag":1190},"NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH":{"address":2162555,"default_item":192,"flag":1191},"NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":{"address":2295814,"default_item":269,"flag":1172},"NPC_GIFT_RECEIVED_DEVON_SCOPE":{"address":2065146,"default_item":288,"flag":285},"NPC_GIFT_RECEIVED_EON_TICKET":{"address":2716574,"default_item":275,"flag":474},"NPC_GIFT_RECEIVED_EXP_SHARE":{"address":2185525,"default_item":182,"flag":272},"NPC_GIFT_RECEIVED_FIRST_POKEBALLS":{"address":2085751,"default_item":4,"flag":233},"NPC_GIFT_RECEIVED_FOCUS_BAND":{"address":2337807,"default_item":196,"flag":283},"NPC_GIFT_RECEIVED_GOOD_ROD":{"address":2058408,"default_item":263,"flag":227},"NPC_GIFT_RECEIVED_GO_GOGGLES":{"address":2017746,"default_item":279,"flag":221},"NPC_GIFT_RECEIVED_GREAT_BALL_PETALBURG_WOODS":{"address":2300119,"default_item":3,"flag":1171},"NPC_GIFT_RECEIVED_GREAT_BALL_RUSTBORO_CITY":{"address":1977146,"default_item":3,"flag":1173},"NPC_GIFT_RECEIVED_HM_CUT":{"address":2199532,"default_item":339,"flag":137},"NPC_GIFT_RECEIVED_HM_DIVE":{"address":2252095,"default_item":346,"flag":123},"NPC_GIFT_RECEIVED_HM_FLASH":{"address":2298287,"default_item":343,"flag":109},"NPC_GIFT_RECEIVED_HM_FLY":{"address":2060636,"default_item":340,"flag":110},"NPC_GIFT_RECEIVED_HM_ROCK_SMASH":{"address":2174128,"default_item":344,"flag":107},"NPC_GIFT_RECEIVED_HM_STRENGTH":{"address":2295305,"default_item":342,"flag":106},"NPC_GIFT_RECEIVED_HM_SURF":{"address":2126671,"default_item":341,"flag":122},"NPC_GIFT_RECEIVED_HM_WATERFALL":{"address":1999854,"default_item":345,"flag":312},"NPC_GIFT_RECEIVED_ITEMFINDER":{"address":2039874,"default_item":261,"flag":1176},"NPC_GIFT_RECEIVED_KINGS_ROCK":{"address":1993670,"default_item":187,"flag":276},"NPC_GIFT_RECEIVED_LETTER":{"address":2185301,"default_item":274,"flag":1174},"NPC_GIFT_RECEIVED_MACHO_BRACE":{"address":2284472,"default_item":181,"flag":277},"NPC_GIFT_RECEIVED_MACH_BIKE":{"address":2170553,"default_item":259,"flag":1180},"NPC_GIFT_RECEIVED_MAGMA_EMBLEM":{"address":2316671,"default_item":375,"flag":1177},"NPC_GIFT_RECEIVED_MENTAL_HERB":{"address":2208103,"default_item":185,"flag":223},"NPC_GIFT_RECEIVED_METEORITE":{"address":2304222,"default_item":280,"flag":115},"NPC_GIFT_RECEIVED_MIRACLE_SEED":{"address":2300337,"default_item":205,"flag":297},"NPC_GIFT_RECEIVED_MYSTIC_TICKET":{"address":2716540,"default_item":370,"flag":315},"NPC_GIFT_RECEIVED_OLD_ROD":{"address":2012541,"default_item":262,"flag":257},"NPC_GIFT_RECEIVED_OLD_SEA_MAP":{"address":2716557,"default_item":376,"flag":316},"NPC_GIFT_RECEIVED_POKEBLOCK_CASE":{"address":2614193,"default_item":273,"flag":95},"NPC_GIFT_RECEIVED_POTION_OLDALE":{"address":2010888,"default_item":13,"flag":132},"NPC_GIFT_RECEIVED_POWDER_JAR":{"address":1962504,"default_item":372,"flag":337},"NPC_GIFT_RECEIVED_PREMIER_BALL_RUSTBORO":{"address":2200571,"default_item":12,"flag":213},"NPC_GIFT_RECEIVED_QUICK_CLAW":{"address":2192227,"default_item":183,"flag":275},"NPC_GIFT_RECEIVED_REPEAT_BALL":{"address":2053722,"default_item":9,"flag":256},"NPC_GIFT_RECEIVED_SECRET_POWER":{"address":2598914,"default_item":331,"flag":96},"NPC_GIFT_RECEIVED_SILK_SCARF":{"address":2101830,"default_item":217,"flag":289},"NPC_GIFT_RECEIVED_SOFT_SAND":{"address":2035664,"default_item":203,"flag":280},"NPC_GIFT_RECEIVED_SOOTHE_BELL":{"address":2151278,"default_item":184,"flag":278},"NPC_GIFT_RECEIVED_SOOT_SACK":{"address":2567245,"default_item":270,"flag":1033},"NPC_GIFT_RECEIVED_SS_TICKET":{"address":2716506,"default_item":265,"flag":291},"NPC_GIFT_RECEIVED_SUN_STONE_MOSSDEEP":{"address":2254406,"default_item":93,"flag":192},"NPC_GIFT_RECEIVED_SUPER_ROD":{"address":2251560,"default_item":264,"flag":152},"NPC_GIFT_RECEIVED_TM_AERIAL_ACE":{"address":2202201,"default_item":328,"flag":170},"NPC_GIFT_RECEIVED_TM_ATTRACT":{"address":2116413,"default_item":333,"flag":235},"NPC_GIFT_RECEIVED_TM_BRICK_BREAK":{"address":2269085,"default_item":319,"flag":121},"NPC_GIFT_RECEIVED_TM_BULK_UP":{"address":2095210,"default_item":296,"flag":166},"NPC_GIFT_RECEIVED_TM_BULLET_SEED":{"address":2028910,"default_item":297,"flag":262},"NPC_GIFT_RECEIVED_TM_CALM_MIND":{"address":2244066,"default_item":292,"flag":171},"NPC_GIFT_RECEIVED_TM_DIG":{"address":2286669,"default_item":316,"flag":261},"NPC_GIFT_RECEIVED_TM_FACADE":{"address":2129909,"default_item":330,"flag":169},"NPC_GIFT_RECEIVED_TM_FRUSTRATION":{"address":2124110,"default_item":309,"flag":1179},"NPC_GIFT_RECEIVED_TM_GIGA_DRAIN":{"address":2068012,"default_item":307,"flag":232},"NPC_GIFT_RECEIVED_TM_HIDDEN_POWER":{"address":2206905,"default_item":298,"flag":264},"NPC_GIFT_RECEIVED_TM_OVERHEAT":{"address":2103328,"default_item":338,"flag":168},"NPC_GIFT_RECEIVED_TM_REST":{"address":2236966,"default_item":332,"flag":234},"NPC_GIFT_RECEIVED_TM_RETURN":{"address":2113546,"default_item":315,"flag":229},"NPC_GIFT_RECEIVED_TM_RETURN_2":{"address":2124055,"default_item":315,"flag":1178},"NPC_GIFT_RECEIVED_TM_ROAR":{"address":2051750,"default_item":293,"flag":231},"NPC_GIFT_RECEIVED_TM_ROCK_TOMB":{"address":2188088,"default_item":327,"flag":165},"NPC_GIFT_RECEIVED_TM_SHOCK_WAVE":{"address":2167340,"default_item":322,"flag":167},"NPC_GIFT_RECEIVED_TM_SLUDGE_BOMB":{"address":2099189,"default_item":324,"flag":230},"NPC_GIFT_RECEIVED_TM_SNATCH":{"address":2360766,"default_item":337,"flag":260},"NPC_GIFT_RECEIVED_TM_STEEL_WING":{"address":2298866,"default_item":335,"flag":1175},"NPC_GIFT_RECEIVED_TM_THIEF":{"address":2154698,"default_item":334,"flag":269},"NPC_GIFT_RECEIVED_TM_TORMENT":{"address":2145260,"default_item":329,"flag":265},"NPC_GIFT_RECEIVED_TM_WATER_PULSE":{"address":2262402,"default_item":291,"flag":172},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_1":{"address":2550316,"default_item":68,"flag":1200},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_2":{"address":2550390,"default_item":10,"flag":1201},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_3":{"address":2550473,"default_item":204,"flag":1202},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_4":{"address":2550556,"default_item":194,"flag":1203},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_5":{"address":2550630,"default_item":300,"flag":1204},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_6":{"address":2550695,"default_item":208,"flag":1205},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_7":{"address":2550769,"default_item":71,"flag":1206},"NPC_GIFT_RECEIVED_WAILMER_PAIL":{"address":2284320,"default_item":268,"flag":94},"NPC_GIFT_RECEIVED_WHITE_HERB":{"address":2028770,"default_item":180,"flag":279},"NPC_GIFT_ROUTE_111_RECEIVED_BERRY":{"address":2045493,"default_item":148,"flag":1192},"NPC_GIFT_ROUTE_114_RECEIVED_BERRY":{"address":2051680,"default_item":149,"flag":1193},"NPC_GIFT_ROUTE_120_RECEIVED_BERRY":{"address":2064727,"default_item":143,"flag":1194},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_1":{"address":1998521,"default_item":153,"flag":1198},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_2":{"address":1998566,"default_item":143,"flag":1199},"POKEDEX_REWARD_001":{"address":5729368,"default_item":3,"flag":0},"POKEDEX_REWARD_002":{"address":5729370,"default_item":3,"flag":0},"POKEDEX_REWARD_003":{"address":5729372,"default_item":3,"flag":0},"POKEDEX_REWARD_004":{"address":5729374,"default_item":3,"flag":0},"POKEDEX_REWARD_005":{"address":5729376,"default_item":3,"flag":0},"POKEDEX_REWARD_006":{"address":5729378,"default_item":3,"flag":0},"POKEDEX_REWARD_007":{"address":5729380,"default_item":3,"flag":0},"POKEDEX_REWARD_008":{"address":5729382,"default_item":3,"flag":0},"POKEDEX_REWARD_009":{"address":5729384,"default_item":3,"flag":0},"POKEDEX_REWARD_010":{"address":5729386,"default_item":3,"flag":0},"POKEDEX_REWARD_011":{"address":5729388,"default_item":3,"flag":0},"POKEDEX_REWARD_012":{"address":5729390,"default_item":3,"flag":0},"POKEDEX_REWARD_013":{"address":5729392,"default_item":3,"flag":0},"POKEDEX_REWARD_014":{"address":5729394,"default_item":3,"flag":0},"POKEDEX_REWARD_015":{"address":5729396,"default_item":3,"flag":0},"POKEDEX_REWARD_016":{"address":5729398,"default_item":3,"flag":0},"POKEDEX_REWARD_017":{"address":5729400,"default_item":3,"flag":0},"POKEDEX_REWARD_018":{"address":5729402,"default_item":3,"flag":0},"POKEDEX_REWARD_019":{"address":5729404,"default_item":3,"flag":0},"POKEDEX_REWARD_020":{"address":5729406,"default_item":3,"flag":0},"POKEDEX_REWARD_021":{"address":5729408,"default_item":3,"flag":0},"POKEDEX_REWARD_022":{"address":5729410,"default_item":3,"flag":0},"POKEDEX_REWARD_023":{"address":5729412,"default_item":3,"flag":0},"POKEDEX_REWARD_024":{"address":5729414,"default_item":3,"flag":0},"POKEDEX_REWARD_025":{"address":5729416,"default_item":3,"flag":0},"POKEDEX_REWARD_026":{"address":5729418,"default_item":3,"flag":0},"POKEDEX_REWARD_027":{"address":5729420,"default_item":3,"flag":0},"POKEDEX_REWARD_028":{"address":5729422,"default_item":3,"flag":0},"POKEDEX_REWARD_029":{"address":5729424,"default_item":3,"flag":0},"POKEDEX_REWARD_030":{"address":5729426,"default_item":3,"flag":0},"POKEDEX_REWARD_031":{"address":5729428,"default_item":3,"flag":0},"POKEDEX_REWARD_032":{"address":5729430,"default_item":3,"flag":0},"POKEDEX_REWARD_033":{"address":5729432,"default_item":3,"flag":0},"POKEDEX_REWARD_034":{"address":5729434,"default_item":3,"flag":0},"POKEDEX_REWARD_035":{"address":5729436,"default_item":3,"flag":0},"POKEDEX_REWARD_036":{"address":5729438,"default_item":3,"flag":0},"POKEDEX_REWARD_037":{"address":5729440,"default_item":3,"flag":0},"POKEDEX_REWARD_038":{"address":5729442,"default_item":3,"flag":0},"POKEDEX_REWARD_039":{"address":5729444,"default_item":3,"flag":0},"POKEDEX_REWARD_040":{"address":5729446,"default_item":3,"flag":0},"POKEDEX_REWARD_041":{"address":5729448,"default_item":3,"flag":0},"POKEDEX_REWARD_042":{"address":5729450,"default_item":3,"flag":0},"POKEDEX_REWARD_043":{"address":5729452,"default_item":3,"flag":0},"POKEDEX_REWARD_044":{"address":5729454,"default_item":3,"flag":0},"POKEDEX_REWARD_045":{"address":5729456,"default_item":3,"flag":0},"POKEDEX_REWARD_046":{"address":5729458,"default_item":3,"flag":0},"POKEDEX_REWARD_047":{"address":5729460,"default_item":3,"flag":0},"POKEDEX_REWARD_048":{"address":5729462,"default_item":3,"flag":0},"POKEDEX_REWARD_049":{"address":5729464,"default_item":3,"flag":0},"POKEDEX_REWARD_050":{"address":5729466,"default_item":3,"flag":0},"POKEDEX_REWARD_051":{"address":5729468,"default_item":3,"flag":0},"POKEDEX_REWARD_052":{"address":5729470,"default_item":3,"flag":0},"POKEDEX_REWARD_053":{"address":5729472,"default_item":3,"flag":0},"POKEDEX_REWARD_054":{"address":5729474,"default_item":3,"flag":0},"POKEDEX_REWARD_055":{"address":5729476,"default_item":3,"flag":0},"POKEDEX_REWARD_056":{"address":5729478,"default_item":3,"flag":0},"POKEDEX_REWARD_057":{"address":5729480,"default_item":3,"flag":0},"POKEDEX_REWARD_058":{"address":5729482,"default_item":3,"flag":0},"POKEDEX_REWARD_059":{"address":5729484,"default_item":3,"flag":0},"POKEDEX_REWARD_060":{"address":5729486,"default_item":3,"flag":0},"POKEDEX_REWARD_061":{"address":5729488,"default_item":3,"flag":0},"POKEDEX_REWARD_062":{"address":5729490,"default_item":3,"flag":0},"POKEDEX_REWARD_063":{"address":5729492,"default_item":3,"flag":0},"POKEDEX_REWARD_064":{"address":5729494,"default_item":3,"flag":0},"POKEDEX_REWARD_065":{"address":5729496,"default_item":3,"flag":0},"POKEDEX_REWARD_066":{"address":5729498,"default_item":3,"flag":0},"POKEDEX_REWARD_067":{"address":5729500,"default_item":3,"flag":0},"POKEDEX_REWARD_068":{"address":5729502,"default_item":3,"flag":0},"POKEDEX_REWARD_069":{"address":5729504,"default_item":3,"flag":0},"POKEDEX_REWARD_070":{"address":5729506,"default_item":3,"flag":0},"POKEDEX_REWARD_071":{"address":5729508,"default_item":3,"flag":0},"POKEDEX_REWARD_072":{"address":5729510,"default_item":3,"flag":0},"POKEDEX_REWARD_073":{"address":5729512,"default_item":3,"flag":0},"POKEDEX_REWARD_074":{"address":5729514,"default_item":3,"flag":0},"POKEDEX_REWARD_075":{"address":5729516,"default_item":3,"flag":0},"POKEDEX_REWARD_076":{"address":5729518,"default_item":3,"flag":0},"POKEDEX_REWARD_077":{"address":5729520,"default_item":3,"flag":0},"POKEDEX_REWARD_078":{"address":5729522,"default_item":3,"flag":0},"POKEDEX_REWARD_079":{"address":5729524,"default_item":3,"flag":0},"POKEDEX_REWARD_080":{"address":5729526,"default_item":3,"flag":0},"POKEDEX_REWARD_081":{"address":5729528,"default_item":3,"flag":0},"POKEDEX_REWARD_082":{"address":5729530,"default_item":3,"flag":0},"POKEDEX_REWARD_083":{"address":5729532,"default_item":3,"flag":0},"POKEDEX_REWARD_084":{"address":5729534,"default_item":3,"flag":0},"POKEDEX_REWARD_085":{"address":5729536,"default_item":3,"flag":0},"POKEDEX_REWARD_086":{"address":5729538,"default_item":3,"flag":0},"POKEDEX_REWARD_087":{"address":5729540,"default_item":3,"flag":0},"POKEDEX_REWARD_088":{"address":5729542,"default_item":3,"flag":0},"POKEDEX_REWARD_089":{"address":5729544,"default_item":3,"flag":0},"POKEDEX_REWARD_090":{"address":5729546,"default_item":3,"flag":0},"POKEDEX_REWARD_091":{"address":5729548,"default_item":3,"flag":0},"POKEDEX_REWARD_092":{"address":5729550,"default_item":3,"flag":0},"POKEDEX_REWARD_093":{"address":5729552,"default_item":3,"flag":0},"POKEDEX_REWARD_094":{"address":5729554,"default_item":3,"flag":0},"POKEDEX_REWARD_095":{"address":5729556,"default_item":3,"flag":0},"POKEDEX_REWARD_096":{"address":5729558,"default_item":3,"flag":0},"POKEDEX_REWARD_097":{"address":5729560,"default_item":3,"flag":0},"POKEDEX_REWARD_098":{"address":5729562,"default_item":3,"flag":0},"POKEDEX_REWARD_099":{"address":5729564,"default_item":3,"flag":0},"POKEDEX_REWARD_100":{"address":5729566,"default_item":3,"flag":0},"POKEDEX_REWARD_101":{"address":5729568,"default_item":3,"flag":0},"POKEDEX_REWARD_102":{"address":5729570,"default_item":3,"flag":0},"POKEDEX_REWARD_103":{"address":5729572,"default_item":3,"flag":0},"POKEDEX_REWARD_104":{"address":5729574,"default_item":3,"flag":0},"POKEDEX_REWARD_105":{"address":5729576,"default_item":3,"flag":0},"POKEDEX_REWARD_106":{"address":5729578,"default_item":3,"flag":0},"POKEDEX_REWARD_107":{"address":5729580,"default_item":3,"flag":0},"POKEDEX_REWARD_108":{"address":5729582,"default_item":3,"flag":0},"POKEDEX_REWARD_109":{"address":5729584,"default_item":3,"flag":0},"POKEDEX_REWARD_110":{"address":5729586,"default_item":3,"flag":0},"POKEDEX_REWARD_111":{"address":5729588,"default_item":3,"flag":0},"POKEDEX_REWARD_112":{"address":5729590,"default_item":3,"flag":0},"POKEDEX_REWARD_113":{"address":5729592,"default_item":3,"flag":0},"POKEDEX_REWARD_114":{"address":5729594,"default_item":3,"flag":0},"POKEDEX_REWARD_115":{"address":5729596,"default_item":3,"flag":0},"POKEDEX_REWARD_116":{"address":5729598,"default_item":3,"flag":0},"POKEDEX_REWARD_117":{"address":5729600,"default_item":3,"flag":0},"POKEDEX_REWARD_118":{"address":5729602,"default_item":3,"flag":0},"POKEDEX_REWARD_119":{"address":5729604,"default_item":3,"flag":0},"POKEDEX_REWARD_120":{"address":5729606,"default_item":3,"flag":0},"POKEDEX_REWARD_121":{"address":5729608,"default_item":3,"flag":0},"POKEDEX_REWARD_122":{"address":5729610,"default_item":3,"flag":0},"POKEDEX_REWARD_123":{"address":5729612,"default_item":3,"flag":0},"POKEDEX_REWARD_124":{"address":5729614,"default_item":3,"flag":0},"POKEDEX_REWARD_125":{"address":5729616,"default_item":3,"flag":0},"POKEDEX_REWARD_126":{"address":5729618,"default_item":3,"flag":0},"POKEDEX_REWARD_127":{"address":5729620,"default_item":3,"flag":0},"POKEDEX_REWARD_128":{"address":5729622,"default_item":3,"flag":0},"POKEDEX_REWARD_129":{"address":5729624,"default_item":3,"flag":0},"POKEDEX_REWARD_130":{"address":5729626,"default_item":3,"flag":0},"POKEDEX_REWARD_131":{"address":5729628,"default_item":3,"flag":0},"POKEDEX_REWARD_132":{"address":5729630,"default_item":3,"flag":0},"POKEDEX_REWARD_133":{"address":5729632,"default_item":3,"flag":0},"POKEDEX_REWARD_134":{"address":5729634,"default_item":3,"flag":0},"POKEDEX_REWARD_135":{"address":5729636,"default_item":3,"flag":0},"POKEDEX_REWARD_136":{"address":5729638,"default_item":3,"flag":0},"POKEDEX_REWARD_137":{"address":5729640,"default_item":3,"flag":0},"POKEDEX_REWARD_138":{"address":5729642,"default_item":3,"flag":0},"POKEDEX_REWARD_139":{"address":5729644,"default_item":3,"flag":0},"POKEDEX_REWARD_140":{"address":5729646,"default_item":3,"flag":0},"POKEDEX_REWARD_141":{"address":5729648,"default_item":3,"flag":0},"POKEDEX_REWARD_142":{"address":5729650,"default_item":3,"flag":0},"POKEDEX_REWARD_143":{"address":5729652,"default_item":3,"flag":0},"POKEDEX_REWARD_144":{"address":5729654,"default_item":3,"flag":0},"POKEDEX_REWARD_145":{"address":5729656,"default_item":3,"flag":0},"POKEDEX_REWARD_146":{"address":5729658,"default_item":3,"flag":0},"POKEDEX_REWARD_147":{"address":5729660,"default_item":3,"flag":0},"POKEDEX_REWARD_148":{"address":5729662,"default_item":3,"flag":0},"POKEDEX_REWARD_149":{"address":5729664,"default_item":3,"flag":0},"POKEDEX_REWARD_150":{"address":5729666,"default_item":3,"flag":0},"POKEDEX_REWARD_151":{"address":5729668,"default_item":3,"flag":0},"POKEDEX_REWARD_152":{"address":5729670,"default_item":3,"flag":0},"POKEDEX_REWARD_153":{"address":5729672,"default_item":3,"flag":0},"POKEDEX_REWARD_154":{"address":5729674,"default_item":3,"flag":0},"POKEDEX_REWARD_155":{"address":5729676,"default_item":3,"flag":0},"POKEDEX_REWARD_156":{"address":5729678,"default_item":3,"flag":0},"POKEDEX_REWARD_157":{"address":5729680,"default_item":3,"flag":0},"POKEDEX_REWARD_158":{"address":5729682,"default_item":3,"flag":0},"POKEDEX_REWARD_159":{"address":5729684,"default_item":3,"flag":0},"POKEDEX_REWARD_160":{"address":5729686,"default_item":3,"flag":0},"POKEDEX_REWARD_161":{"address":5729688,"default_item":3,"flag":0},"POKEDEX_REWARD_162":{"address":5729690,"default_item":3,"flag":0},"POKEDEX_REWARD_163":{"address":5729692,"default_item":3,"flag":0},"POKEDEX_REWARD_164":{"address":5729694,"default_item":3,"flag":0},"POKEDEX_REWARD_165":{"address":5729696,"default_item":3,"flag":0},"POKEDEX_REWARD_166":{"address":5729698,"default_item":3,"flag":0},"POKEDEX_REWARD_167":{"address":5729700,"default_item":3,"flag":0},"POKEDEX_REWARD_168":{"address":5729702,"default_item":3,"flag":0},"POKEDEX_REWARD_169":{"address":5729704,"default_item":3,"flag":0},"POKEDEX_REWARD_170":{"address":5729706,"default_item":3,"flag":0},"POKEDEX_REWARD_171":{"address":5729708,"default_item":3,"flag":0},"POKEDEX_REWARD_172":{"address":5729710,"default_item":3,"flag":0},"POKEDEX_REWARD_173":{"address":5729712,"default_item":3,"flag":0},"POKEDEX_REWARD_174":{"address":5729714,"default_item":3,"flag":0},"POKEDEX_REWARD_175":{"address":5729716,"default_item":3,"flag":0},"POKEDEX_REWARD_176":{"address":5729718,"default_item":3,"flag":0},"POKEDEX_REWARD_177":{"address":5729720,"default_item":3,"flag":0},"POKEDEX_REWARD_178":{"address":5729722,"default_item":3,"flag":0},"POKEDEX_REWARD_179":{"address":5729724,"default_item":3,"flag":0},"POKEDEX_REWARD_180":{"address":5729726,"default_item":3,"flag":0},"POKEDEX_REWARD_181":{"address":5729728,"default_item":3,"flag":0},"POKEDEX_REWARD_182":{"address":5729730,"default_item":3,"flag":0},"POKEDEX_REWARD_183":{"address":5729732,"default_item":3,"flag":0},"POKEDEX_REWARD_184":{"address":5729734,"default_item":3,"flag":0},"POKEDEX_REWARD_185":{"address":5729736,"default_item":3,"flag":0},"POKEDEX_REWARD_186":{"address":5729738,"default_item":3,"flag":0},"POKEDEX_REWARD_187":{"address":5729740,"default_item":3,"flag":0},"POKEDEX_REWARD_188":{"address":5729742,"default_item":3,"flag":0},"POKEDEX_REWARD_189":{"address":5729744,"default_item":3,"flag":0},"POKEDEX_REWARD_190":{"address":5729746,"default_item":3,"flag":0},"POKEDEX_REWARD_191":{"address":5729748,"default_item":3,"flag":0},"POKEDEX_REWARD_192":{"address":5729750,"default_item":3,"flag":0},"POKEDEX_REWARD_193":{"address":5729752,"default_item":3,"flag":0},"POKEDEX_REWARD_194":{"address":5729754,"default_item":3,"flag":0},"POKEDEX_REWARD_195":{"address":5729756,"default_item":3,"flag":0},"POKEDEX_REWARD_196":{"address":5729758,"default_item":3,"flag":0},"POKEDEX_REWARD_197":{"address":5729760,"default_item":3,"flag":0},"POKEDEX_REWARD_198":{"address":5729762,"default_item":3,"flag":0},"POKEDEX_REWARD_199":{"address":5729764,"default_item":3,"flag":0},"POKEDEX_REWARD_200":{"address":5729766,"default_item":3,"flag":0},"POKEDEX_REWARD_201":{"address":5729768,"default_item":3,"flag":0},"POKEDEX_REWARD_202":{"address":5729770,"default_item":3,"flag":0},"POKEDEX_REWARD_203":{"address":5729772,"default_item":3,"flag":0},"POKEDEX_REWARD_204":{"address":5729774,"default_item":3,"flag":0},"POKEDEX_REWARD_205":{"address":5729776,"default_item":3,"flag":0},"POKEDEX_REWARD_206":{"address":5729778,"default_item":3,"flag":0},"POKEDEX_REWARD_207":{"address":5729780,"default_item":3,"flag":0},"POKEDEX_REWARD_208":{"address":5729782,"default_item":3,"flag":0},"POKEDEX_REWARD_209":{"address":5729784,"default_item":3,"flag":0},"POKEDEX_REWARD_210":{"address":5729786,"default_item":3,"flag":0},"POKEDEX_REWARD_211":{"address":5729788,"default_item":3,"flag":0},"POKEDEX_REWARD_212":{"address":5729790,"default_item":3,"flag":0},"POKEDEX_REWARD_213":{"address":5729792,"default_item":3,"flag":0},"POKEDEX_REWARD_214":{"address":5729794,"default_item":3,"flag":0},"POKEDEX_REWARD_215":{"address":5729796,"default_item":3,"flag":0},"POKEDEX_REWARD_216":{"address":5729798,"default_item":3,"flag":0},"POKEDEX_REWARD_217":{"address":5729800,"default_item":3,"flag":0},"POKEDEX_REWARD_218":{"address":5729802,"default_item":3,"flag":0},"POKEDEX_REWARD_219":{"address":5729804,"default_item":3,"flag":0},"POKEDEX_REWARD_220":{"address":5729806,"default_item":3,"flag":0},"POKEDEX_REWARD_221":{"address":5729808,"default_item":3,"flag":0},"POKEDEX_REWARD_222":{"address":5729810,"default_item":3,"flag":0},"POKEDEX_REWARD_223":{"address":5729812,"default_item":3,"flag":0},"POKEDEX_REWARD_224":{"address":5729814,"default_item":3,"flag":0},"POKEDEX_REWARD_225":{"address":5729816,"default_item":3,"flag":0},"POKEDEX_REWARD_226":{"address":5729818,"default_item":3,"flag":0},"POKEDEX_REWARD_227":{"address":5729820,"default_item":3,"flag":0},"POKEDEX_REWARD_228":{"address":5729822,"default_item":3,"flag":0},"POKEDEX_REWARD_229":{"address":5729824,"default_item":3,"flag":0},"POKEDEX_REWARD_230":{"address":5729826,"default_item":3,"flag":0},"POKEDEX_REWARD_231":{"address":5729828,"default_item":3,"flag":0},"POKEDEX_REWARD_232":{"address":5729830,"default_item":3,"flag":0},"POKEDEX_REWARD_233":{"address":5729832,"default_item":3,"flag":0},"POKEDEX_REWARD_234":{"address":5729834,"default_item":3,"flag":0},"POKEDEX_REWARD_235":{"address":5729836,"default_item":3,"flag":0},"POKEDEX_REWARD_236":{"address":5729838,"default_item":3,"flag":0},"POKEDEX_REWARD_237":{"address":5729840,"default_item":3,"flag":0},"POKEDEX_REWARD_238":{"address":5729842,"default_item":3,"flag":0},"POKEDEX_REWARD_239":{"address":5729844,"default_item":3,"flag":0},"POKEDEX_REWARD_240":{"address":5729846,"default_item":3,"flag":0},"POKEDEX_REWARD_241":{"address":5729848,"default_item":3,"flag":0},"POKEDEX_REWARD_242":{"address":5729850,"default_item":3,"flag":0},"POKEDEX_REWARD_243":{"address":5729852,"default_item":3,"flag":0},"POKEDEX_REWARD_244":{"address":5729854,"default_item":3,"flag":0},"POKEDEX_REWARD_245":{"address":5729856,"default_item":3,"flag":0},"POKEDEX_REWARD_246":{"address":5729858,"default_item":3,"flag":0},"POKEDEX_REWARD_247":{"address":5729860,"default_item":3,"flag":0},"POKEDEX_REWARD_248":{"address":5729862,"default_item":3,"flag":0},"POKEDEX_REWARD_249":{"address":5729864,"default_item":3,"flag":0},"POKEDEX_REWARD_250":{"address":5729866,"default_item":3,"flag":0},"POKEDEX_REWARD_251":{"address":5729868,"default_item":3,"flag":0},"POKEDEX_REWARD_252":{"address":5729870,"default_item":3,"flag":0},"POKEDEX_REWARD_253":{"address":5729872,"default_item":3,"flag":0},"POKEDEX_REWARD_254":{"address":5729874,"default_item":3,"flag":0},"POKEDEX_REWARD_255":{"address":5729876,"default_item":3,"flag":0},"POKEDEX_REWARD_256":{"address":5729878,"default_item":3,"flag":0},"POKEDEX_REWARD_257":{"address":5729880,"default_item":3,"flag":0},"POKEDEX_REWARD_258":{"address":5729882,"default_item":3,"flag":0},"POKEDEX_REWARD_259":{"address":5729884,"default_item":3,"flag":0},"POKEDEX_REWARD_260":{"address":5729886,"default_item":3,"flag":0},"POKEDEX_REWARD_261":{"address":5729888,"default_item":3,"flag":0},"POKEDEX_REWARD_262":{"address":5729890,"default_item":3,"flag":0},"POKEDEX_REWARD_263":{"address":5729892,"default_item":3,"flag":0},"POKEDEX_REWARD_264":{"address":5729894,"default_item":3,"flag":0},"POKEDEX_REWARD_265":{"address":5729896,"default_item":3,"flag":0},"POKEDEX_REWARD_266":{"address":5729898,"default_item":3,"flag":0},"POKEDEX_REWARD_267":{"address":5729900,"default_item":3,"flag":0},"POKEDEX_REWARD_268":{"address":5729902,"default_item":3,"flag":0},"POKEDEX_REWARD_269":{"address":5729904,"default_item":3,"flag":0},"POKEDEX_REWARD_270":{"address":5729906,"default_item":3,"flag":0},"POKEDEX_REWARD_271":{"address":5729908,"default_item":3,"flag":0},"POKEDEX_REWARD_272":{"address":5729910,"default_item":3,"flag":0},"POKEDEX_REWARD_273":{"address":5729912,"default_item":3,"flag":0},"POKEDEX_REWARD_274":{"address":5729914,"default_item":3,"flag":0},"POKEDEX_REWARD_275":{"address":5729916,"default_item":3,"flag":0},"POKEDEX_REWARD_276":{"address":5729918,"default_item":3,"flag":0},"POKEDEX_REWARD_277":{"address":5729920,"default_item":3,"flag":0},"POKEDEX_REWARD_278":{"address":5729922,"default_item":3,"flag":0},"POKEDEX_REWARD_279":{"address":5729924,"default_item":3,"flag":0},"POKEDEX_REWARD_280":{"address":5729926,"default_item":3,"flag":0},"POKEDEX_REWARD_281":{"address":5729928,"default_item":3,"flag":0},"POKEDEX_REWARD_282":{"address":5729930,"default_item":3,"flag":0},"POKEDEX_REWARD_283":{"address":5729932,"default_item":3,"flag":0},"POKEDEX_REWARD_284":{"address":5729934,"default_item":3,"flag":0},"POKEDEX_REWARD_285":{"address":5729936,"default_item":3,"flag":0},"POKEDEX_REWARD_286":{"address":5729938,"default_item":3,"flag":0},"POKEDEX_REWARD_287":{"address":5729940,"default_item":3,"flag":0},"POKEDEX_REWARD_288":{"address":5729942,"default_item":3,"flag":0},"POKEDEX_REWARD_289":{"address":5729944,"default_item":3,"flag":0},"POKEDEX_REWARD_290":{"address":5729946,"default_item":3,"flag":0},"POKEDEX_REWARD_291":{"address":5729948,"default_item":3,"flag":0},"POKEDEX_REWARD_292":{"address":5729950,"default_item":3,"flag":0},"POKEDEX_REWARD_293":{"address":5729952,"default_item":3,"flag":0},"POKEDEX_REWARD_294":{"address":5729954,"default_item":3,"flag":0},"POKEDEX_REWARD_295":{"address":5729956,"default_item":3,"flag":0},"POKEDEX_REWARD_296":{"address":5729958,"default_item":3,"flag":0},"POKEDEX_REWARD_297":{"address":5729960,"default_item":3,"flag":0},"POKEDEX_REWARD_298":{"address":5729962,"default_item":3,"flag":0},"POKEDEX_REWARD_299":{"address":5729964,"default_item":3,"flag":0},"POKEDEX_REWARD_300":{"address":5729966,"default_item":3,"flag":0},"POKEDEX_REWARD_301":{"address":5729968,"default_item":3,"flag":0},"POKEDEX_REWARD_302":{"address":5729970,"default_item":3,"flag":0},"POKEDEX_REWARD_303":{"address":5729972,"default_item":3,"flag":0},"POKEDEX_REWARD_304":{"address":5729974,"default_item":3,"flag":0},"POKEDEX_REWARD_305":{"address":5729976,"default_item":3,"flag":0},"POKEDEX_REWARD_306":{"address":5729978,"default_item":3,"flag":0},"POKEDEX_REWARD_307":{"address":5729980,"default_item":3,"flag":0},"POKEDEX_REWARD_308":{"address":5729982,"default_item":3,"flag":0},"POKEDEX_REWARD_309":{"address":5729984,"default_item":3,"flag":0},"POKEDEX_REWARD_310":{"address":5729986,"default_item":3,"flag":0},"POKEDEX_REWARD_311":{"address":5729988,"default_item":3,"flag":0},"POKEDEX_REWARD_312":{"address":5729990,"default_item":3,"flag":0},"POKEDEX_REWARD_313":{"address":5729992,"default_item":3,"flag":0},"POKEDEX_REWARD_314":{"address":5729994,"default_item":3,"flag":0},"POKEDEX_REWARD_315":{"address":5729996,"default_item":3,"flag":0},"POKEDEX_REWARD_316":{"address":5729998,"default_item":3,"flag":0},"POKEDEX_REWARD_317":{"address":5730000,"default_item":3,"flag":0},"POKEDEX_REWARD_318":{"address":5730002,"default_item":3,"flag":0},"POKEDEX_REWARD_319":{"address":5730004,"default_item":3,"flag":0},"POKEDEX_REWARD_320":{"address":5730006,"default_item":3,"flag":0},"POKEDEX_REWARD_321":{"address":5730008,"default_item":3,"flag":0},"POKEDEX_REWARD_322":{"address":5730010,"default_item":3,"flag":0},"POKEDEX_REWARD_323":{"address":5730012,"default_item":3,"flag":0},"POKEDEX_REWARD_324":{"address":5730014,"default_item":3,"flag":0},"POKEDEX_REWARD_325":{"address":5730016,"default_item":3,"flag":0},"POKEDEX_REWARD_326":{"address":5730018,"default_item":3,"flag":0},"POKEDEX_REWARD_327":{"address":5730020,"default_item":3,"flag":0},"POKEDEX_REWARD_328":{"address":5730022,"default_item":3,"flag":0},"POKEDEX_REWARD_329":{"address":5730024,"default_item":3,"flag":0},"POKEDEX_REWARD_330":{"address":5730026,"default_item":3,"flag":0},"POKEDEX_REWARD_331":{"address":5730028,"default_item":3,"flag":0},"POKEDEX_REWARD_332":{"address":5730030,"default_item":3,"flag":0},"POKEDEX_REWARD_333":{"address":5730032,"default_item":3,"flag":0},"POKEDEX_REWARD_334":{"address":5730034,"default_item":3,"flag":0},"POKEDEX_REWARD_335":{"address":5730036,"default_item":3,"flag":0},"POKEDEX_REWARD_336":{"address":5730038,"default_item":3,"flag":0},"POKEDEX_REWARD_337":{"address":5730040,"default_item":3,"flag":0},"POKEDEX_REWARD_338":{"address":5730042,"default_item":3,"flag":0},"POKEDEX_REWARD_339":{"address":5730044,"default_item":3,"flag":0},"POKEDEX_REWARD_340":{"address":5730046,"default_item":3,"flag":0},"POKEDEX_REWARD_341":{"address":5730048,"default_item":3,"flag":0},"POKEDEX_REWARD_342":{"address":5730050,"default_item":3,"flag":0},"POKEDEX_REWARD_343":{"address":5730052,"default_item":3,"flag":0},"POKEDEX_REWARD_344":{"address":5730054,"default_item":3,"flag":0},"POKEDEX_REWARD_345":{"address":5730056,"default_item":3,"flag":0},"POKEDEX_REWARD_346":{"address":5730058,"default_item":3,"flag":0},"POKEDEX_REWARD_347":{"address":5730060,"default_item":3,"flag":0},"POKEDEX_REWARD_348":{"address":5730062,"default_item":3,"flag":0},"POKEDEX_REWARD_349":{"address":5730064,"default_item":3,"flag":0},"POKEDEX_REWARD_350":{"address":5730066,"default_item":3,"flag":0},"POKEDEX_REWARD_351":{"address":5730068,"default_item":3,"flag":0},"POKEDEX_REWARD_352":{"address":5730070,"default_item":3,"flag":0},"POKEDEX_REWARD_353":{"address":5730072,"default_item":3,"flag":0},"POKEDEX_REWARD_354":{"address":5730074,"default_item":3,"flag":0},"POKEDEX_REWARD_355":{"address":5730076,"default_item":3,"flag":0},"POKEDEX_REWARD_356":{"address":5730078,"default_item":3,"flag":0},"POKEDEX_REWARD_357":{"address":5730080,"default_item":3,"flag":0},"POKEDEX_REWARD_358":{"address":5730082,"default_item":3,"flag":0},"POKEDEX_REWARD_359":{"address":5730084,"default_item":3,"flag":0},"POKEDEX_REWARD_360":{"address":5730086,"default_item":3,"flag":0},"POKEDEX_REWARD_361":{"address":5730088,"default_item":3,"flag":0},"POKEDEX_REWARD_362":{"address":5730090,"default_item":3,"flag":0},"POKEDEX_REWARD_363":{"address":5730092,"default_item":3,"flag":0},"POKEDEX_REWARD_364":{"address":5730094,"default_item":3,"flag":0},"POKEDEX_REWARD_365":{"address":5730096,"default_item":3,"flag":0},"POKEDEX_REWARD_366":{"address":5730098,"default_item":3,"flag":0},"POKEDEX_REWARD_367":{"address":5730100,"default_item":3,"flag":0},"POKEDEX_REWARD_368":{"address":5730102,"default_item":3,"flag":0},"POKEDEX_REWARD_369":{"address":5730104,"default_item":3,"flag":0},"POKEDEX_REWARD_370":{"address":5730106,"default_item":3,"flag":0},"POKEDEX_REWARD_371":{"address":5730108,"default_item":3,"flag":0},"POKEDEX_REWARD_372":{"address":5730110,"default_item":3,"flag":0},"POKEDEX_REWARD_373":{"address":5730112,"default_item":3,"flag":0},"POKEDEX_REWARD_374":{"address":5730114,"default_item":3,"flag":0},"POKEDEX_REWARD_375":{"address":5730116,"default_item":3,"flag":0},"POKEDEX_REWARD_376":{"address":5730118,"default_item":3,"flag":0},"POKEDEX_REWARD_377":{"address":5730120,"default_item":3,"flag":0},"POKEDEX_REWARD_378":{"address":5730122,"default_item":3,"flag":0},"POKEDEX_REWARD_379":{"address":5730124,"default_item":3,"flag":0},"POKEDEX_REWARD_380":{"address":5730126,"default_item":3,"flag":0},"POKEDEX_REWARD_381":{"address":5730128,"default_item":3,"flag":0},"POKEDEX_REWARD_382":{"address":5730130,"default_item":3,"flag":0},"POKEDEX_REWARD_383":{"address":5730132,"default_item":3,"flag":0},"POKEDEX_REWARD_384":{"address":5730134,"default_item":3,"flag":0},"POKEDEX_REWARD_385":{"address":5730136,"default_item":3,"flag":0},"POKEDEX_REWARD_386":{"address":5730138,"default_item":3,"flag":0},"TRAINER_AARON_REWARD":{"address":5602878,"default_item":104,"flag":1677},"TRAINER_ABIGAIL_1_REWARD":{"address":5602800,"default_item":106,"flag":1638},"TRAINER_AIDAN_REWARD":{"address":5603432,"default_item":104,"flag":1954},"TRAINER_AISHA_REWARD":{"address":5603598,"default_item":106,"flag":2037},"TRAINER_ALBERTO_REWARD":{"address":5602108,"default_item":108,"flag":1292},"TRAINER_ALBERT_REWARD":{"address":5602244,"default_item":104,"flag":1360},"TRAINER_ALEXA_REWARD":{"address":5603424,"default_item":104,"flag":1950},"TRAINER_ALEXIA_REWARD":{"address":5602264,"default_item":104,"flag":1370},"TRAINER_ALEX_REWARD":{"address":5602910,"default_item":104,"flag":1693},"TRAINER_ALICE_REWARD":{"address":5602980,"default_item":103,"flag":1728},"TRAINER_ALIX_REWARD":{"address":5603584,"default_item":106,"flag":2030},"TRAINER_ALLEN_REWARD":{"address":5602750,"default_item":103,"flag":1613},"TRAINER_ALLISON_REWARD":{"address":5602858,"default_item":104,"flag":1667},"TRAINER_ALYSSA_REWARD":{"address":5603486,"default_item":106,"flag":1981},"TRAINER_AMY_AND_LIV_1_REWARD":{"address":5603046,"default_item":103,"flag":1761},"TRAINER_ANDREA_REWARD":{"address":5603310,"default_item":106,"flag":1893},"TRAINER_ANDRES_1_REWARD":{"address":5603558,"default_item":104,"flag":2017},"TRAINER_ANDREW_REWARD":{"address":5602756,"default_item":106,"flag":1616},"TRAINER_ANGELICA_REWARD":{"address":5602956,"default_item":104,"flag":1716},"TRAINER_ANGELINA_REWARD":{"address":5603508,"default_item":106,"flag":1992},"TRAINER_ANGELO_REWARD":{"address":5603688,"default_item":104,"flag":2082},"TRAINER_ANNA_AND_MEG_1_REWARD":{"address":5602658,"default_item":106,"flag":1567},"TRAINER_ANNIKA_REWARD":{"address":5603088,"default_item":107,"flag":1782},"TRAINER_ANTHONY_REWARD":{"address":5602788,"default_item":106,"flag":1632},"TRAINER_ARCHIE_REWARD":{"address":5602152,"default_item":107,"flag":1314},"TRAINER_ASHLEY_REWARD":{"address":5603394,"default_item":106,"flag":1935},"TRAINER_ATHENA_REWARD":{"address":5603238,"default_item":104,"flag":1857},"TRAINER_ATSUSHI_REWARD":{"address":5602464,"default_item":104,"flag":1470},"TRAINER_AURON_REWARD":{"address":5603096,"default_item":104,"flag":1786},"TRAINER_AUSTINA_REWARD":{"address":5602200,"default_item":103,"flag":1338},"TRAINER_AUTUMN_REWARD":{"address":5602518,"default_item":106,"flag":1497},"TRAINER_AXLE_REWARD":{"address":5602490,"default_item":108,"flag":1483},"TRAINER_BARNY_REWARD":{"address":5602770,"default_item":104,"flag":1623},"TRAINER_BARRY_REWARD":{"address":5602410,"default_item":106,"flag":1443},"TRAINER_BEAU_REWARD":{"address":5602508,"default_item":106,"flag":1492},"TRAINER_BECKY_REWARD":{"address":5603024,"default_item":106,"flag":1750},"TRAINER_BECK_REWARD":{"address":5602912,"default_item":104,"flag":1694},"TRAINER_BENJAMIN_1_REWARD":{"address":5602790,"default_item":106,"flag":1633},"TRAINER_BEN_REWARD":{"address":5602730,"default_item":106,"flag":1603},"TRAINER_BERKE_REWARD":{"address":5602232,"default_item":104,"flag":1354},"TRAINER_BERNIE_1_REWARD":{"address":5602496,"default_item":106,"flag":1486},"TRAINER_BETHANY_REWARD":{"address":5602686,"default_item":107,"flag":1581},"TRAINER_BETH_REWARD":{"address":5602974,"default_item":103,"flag":1725},"TRAINER_BEVERLY_REWARD":{"address":5602966,"default_item":103,"flag":1721},"TRAINER_BIANCA_REWARD":{"address":5603496,"default_item":106,"flag":1986},"TRAINER_BILLY_REWARD":{"address":5602722,"default_item":103,"flag":1599},"TRAINER_BLAKE_REWARD":{"address":5602554,"default_item":108,"flag":1515},"TRAINER_BRANDEN_REWARD":{"address":5603574,"default_item":106,"flag":2025},"TRAINER_BRANDI_REWARD":{"address":5603596,"default_item":106,"flag":2036},"TRAINER_BRAWLY_1_REWARD":{"address":5602616,"default_item":104,"flag":1546},"TRAINER_BRAXTON_REWARD":{"address":5602234,"default_item":104,"flag":1355},"TRAINER_BRENDAN_LILYCOVE_MUDKIP_REWARD":{"address":5603406,"default_item":104,"flag":1941},"TRAINER_BRENDAN_LILYCOVE_TORCHIC_REWARD":{"address":5603410,"default_item":104,"flag":1943},"TRAINER_BRENDAN_LILYCOVE_TREECKO_REWARD":{"address":5603408,"default_item":104,"flag":1942},"TRAINER_BRENDAN_ROUTE_103_MUDKIP_REWARD":{"address":5603124,"default_item":106,"flag":1800},"TRAINER_BRENDAN_ROUTE_103_TORCHIC_REWARD":{"address":5603136,"default_item":106,"flag":1806},"TRAINER_BRENDAN_ROUTE_103_TREECKO_REWARD":{"address":5603130,"default_item":106,"flag":1803},"TRAINER_BRENDAN_ROUTE_110_MUDKIP_REWARD":{"address":5603126,"default_item":104,"flag":1801},"TRAINER_BRENDAN_ROUTE_110_TORCHIC_REWARD":{"address":5603138,"default_item":104,"flag":1807},"TRAINER_BRENDAN_ROUTE_110_TREECKO_REWARD":{"address":5603132,"default_item":104,"flag":1804},"TRAINER_BRENDAN_ROUTE_119_MUDKIP_REWARD":{"address":5603128,"default_item":104,"flag":1802},"TRAINER_BRENDAN_ROUTE_119_TORCHIC_REWARD":{"address":5603140,"default_item":104,"flag":1808},"TRAINER_BRENDAN_ROUTE_119_TREECKO_REWARD":{"address":5603134,"default_item":104,"flag":1805},"TRAINER_BRENDAN_RUSTBORO_MUDKIP_REWARD":{"address":5603270,"default_item":108,"flag":1873},"TRAINER_BRENDAN_RUSTBORO_TORCHIC_REWARD":{"address":5603282,"default_item":108,"flag":1879},"TRAINER_BRENDAN_RUSTBORO_TREECKO_REWARD":{"address":5603268,"default_item":108,"flag":1872},"TRAINER_BRENDA_REWARD":{"address":5602992,"default_item":106,"flag":1734},"TRAINER_BRENDEN_REWARD":{"address":5603228,"default_item":106,"flag":1852},"TRAINER_BRENT_REWARD":{"address":5602530,"default_item":104,"flag":1503},"TRAINER_BRIANNA_REWARD":{"address":5602320,"default_item":110,"flag":1398},"TRAINER_BRICE_REWARD":{"address":5603336,"default_item":106,"flag":1906},"TRAINER_BRIDGET_REWARD":{"address":5602342,"default_item":107,"flag":1409},"TRAINER_BROOKE_1_REWARD":{"address":5602272,"default_item":108,"flag":1374},"TRAINER_BRYANT_REWARD":{"address":5603576,"default_item":106,"flag":2026},"TRAINER_BRYAN_REWARD":{"address":5603572,"default_item":104,"flag":2024},"TRAINER_CALE_REWARD":{"address":5603612,"default_item":104,"flag":2044},"TRAINER_CALLIE_REWARD":{"address":5603610,"default_item":106,"flag":2043},"TRAINER_CALVIN_1_REWARD":{"address":5602720,"default_item":103,"flag":1598},"TRAINER_CAMDEN_REWARD":{"address":5602832,"default_item":104,"flag":1654},"TRAINER_CAMERON_1_REWARD":{"address":5602560,"default_item":108,"flag":1518},"TRAINER_CAMRON_REWARD":{"address":5603562,"default_item":104,"flag":2019},"TRAINER_CARLEE_REWARD":{"address":5603012,"default_item":106,"flag":1744},"TRAINER_CAROLINA_REWARD":{"address":5603566,"default_item":104,"flag":2021},"TRAINER_CAROLINE_REWARD":{"address":5602282,"default_item":104,"flag":1379},"TRAINER_CAROL_REWARD":{"address":5603026,"default_item":106,"flag":1751},"TRAINER_CARTER_REWARD":{"address":5602774,"default_item":104,"flag":1625},"TRAINER_CATHERINE_1_REWARD":{"address":5603202,"default_item":104,"flag":1839},"TRAINER_CEDRIC_REWARD":{"address":5603034,"default_item":108,"flag":1755},"TRAINER_CELIA_REWARD":{"address":5603570,"default_item":106,"flag":2023},"TRAINER_CELINA_REWARD":{"address":5603494,"default_item":108,"flag":1985},"TRAINER_CHAD_REWARD":{"address":5602432,"default_item":106,"flag":1454},"TRAINER_CHANDLER_REWARD":{"address":5603480,"default_item":103,"flag":1978},"TRAINER_CHARLIE_REWARD":{"address":5602216,"default_item":103,"flag":1346},"TRAINER_CHARLOTTE_REWARD":{"address":5603512,"default_item":106,"flag":1994},"TRAINER_CHASE_REWARD":{"address":5602840,"default_item":104,"flag":1658},"TRAINER_CHESTER_REWARD":{"address":5602900,"default_item":108,"flag":1688},"TRAINER_CHIP_REWARD":{"address":5602174,"default_item":104,"flag":1325},"TRAINER_CHRIS_REWARD":{"address":5603470,"default_item":108,"flag":1973},"TRAINER_CINDY_1_REWARD":{"address":5602312,"default_item":104,"flag":1394},"TRAINER_CLARENCE_REWARD":{"address":5603244,"default_item":106,"flag":1860},"TRAINER_CLARISSA_REWARD":{"address":5602954,"default_item":104,"flag":1715},"TRAINER_CLARK_REWARD":{"address":5603346,"default_item":106,"flag":1911},"TRAINER_CLAUDE_REWARD":{"address":5602760,"default_item":108,"flag":1618},"TRAINER_CLIFFORD_REWARD":{"address":5603252,"default_item":107,"flag":1864},"TRAINER_COBY_REWARD":{"address":5603502,"default_item":106,"flag":1989},"TRAINER_COLE_REWARD":{"address":5602486,"default_item":108,"flag":1481},"TRAINER_COLIN_REWARD":{"address":5602894,"default_item":108,"flag":1685},"TRAINER_COLTON_REWARD":{"address":5602672,"default_item":107,"flag":1574},"TRAINER_CONNIE_REWARD":{"address":5602340,"default_item":107,"flag":1408},"TRAINER_CONOR_REWARD":{"address":5603106,"default_item":104,"flag":1791},"TRAINER_CORY_1_REWARD":{"address":5603564,"default_item":108,"flag":2020},"TRAINER_CRISSY_REWARD":{"address":5603312,"default_item":106,"flag":1894},"TRAINER_CRISTIAN_REWARD":{"address":5603232,"default_item":106,"flag":1854},"TRAINER_CRISTIN_1_REWARD":{"address":5603618,"default_item":104,"flag":2047},"TRAINER_CYNDY_1_REWARD":{"address":5602938,"default_item":106,"flag":1707},"TRAINER_DAISUKE_REWARD":{"address":5602462,"default_item":106,"flag":1469},"TRAINER_DAISY_REWARD":{"address":5602156,"default_item":106,"flag":1316},"TRAINER_DALE_REWARD":{"address":5602766,"default_item":106,"flag":1621},"TRAINER_DALTON_1_REWARD":{"address":5602476,"default_item":106,"flag":1476},"TRAINER_DANA_REWARD":{"address":5603000,"default_item":106,"flag":1738},"TRAINER_DANIELLE_REWARD":{"address":5603384,"default_item":106,"flag":1930},"TRAINER_DAPHNE_REWARD":{"address":5602314,"default_item":110,"flag":1395},"TRAINER_DARCY_REWARD":{"address":5603550,"default_item":104,"flag":2013},"TRAINER_DARIAN_REWARD":{"address":5603476,"default_item":106,"flag":1976},"TRAINER_DARIUS_REWARD":{"address":5603690,"default_item":108,"flag":2083},"TRAINER_DARRIN_REWARD":{"address":5602392,"default_item":103,"flag":1434},"TRAINER_DAVID_REWARD":{"address":5602400,"default_item":103,"flag":1438},"TRAINER_DAVIS_REWARD":{"address":5603162,"default_item":106,"flag":1819},"TRAINER_DAWSON_REWARD":{"address":5603472,"default_item":104,"flag":1974},"TRAINER_DAYTON_REWARD":{"address":5603604,"default_item":108,"flag":2040},"TRAINER_DEANDRE_REWARD":{"address":5603514,"default_item":103,"flag":1995},"TRAINER_DEAN_REWARD":{"address":5602412,"default_item":103,"flag":1444},"TRAINER_DEBRA_REWARD":{"address":5603004,"default_item":106,"flag":1740},"TRAINER_DECLAN_REWARD":{"address":5602114,"default_item":106,"flag":1295},"TRAINER_DEMETRIUS_REWARD":{"address":5602834,"default_item":106,"flag":1655},"TRAINER_DENISE_REWARD":{"address":5602972,"default_item":103,"flag":1724},"TRAINER_DEREK_REWARD":{"address":5602538,"default_item":108,"flag":1507},"TRAINER_DEVAN_REWARD":{"address":5603590,"default_item":106,"flag":2033},"TRAINER_DEZ_AND_LUKE_REWARD":{"address":5603364,"default_item":108,"flag":1920},"TRAINER_DIANA_1_REWARD":{"address":5603032,"default_item":106,"flag":1754},"TRAINER_DIANNE_REWARD":{"address":5602918,"default_item":104,"flag":1697},"TRAINER_DILLON_REWARD":{"address":5602738,"default_item":106,"flag":1607},"TRAINER_DOMINIK_REWARD":{"address":5602388,"default_item":103,"flag":1432},"TRAINER_DONALD_REWARD":{"address":5602532,"default_item":104,"flag":1504},"TRAINER_DONNY_REWARD":{"address":5602852,"default_item":104,"flag":1664},"TRAINER_DOUGLAS_REWARD":{"address":5602390,"default_item":103,"flag":1433},"TRAINER_DOUG_REWARD":{"address":5603320,"default_item":106,"flag":1898},"TRAINER_DRAKE_REWARD":{"address":5602612,"default_item":110,"flag":1544},"TRAINER_DREW_REWARD":{"address":5602506,"default_item":106,"flag":1491},"TRAINER_DUNCAN_REWARD":{"address":5603076,"default_item":108,"flag":1776},"TRAINER_DUSTY_1_REWARD":{"address":5602172,"default_item":104,"flag":1324},"TRAINER_DWAYNE_REWARD":{"address":5603070,"default_item":106,"flag":1773},"TRAINER_DYLAN_1_REWARD":{"address":5602812,"default_item":106,"flag":1644},"TRAINER_EDGAR_REWARD":{"address":5602242,"default_item":104,"flag":1359},"TRAINER_EDMOND_REWARD":{"address":5603066,"default_item":106,"flag":1771},"TRAINER_EDWARDO_REWARD":{"address":5602892,"default_item":108,"flag":1684},"TRAINER_EDWARD_REWARD":{"address":5602548,"default_item":106,"flag":1512},"TRAINER_EDWIN_1_REWARD":{"address":5603108,"default_item":108,"flag":1792},"TRAINER_ED_REWARD":{"address":5602110,"default_item":104,"flag":1293},"TRAINER_ELIJAH_REWARD":{"address":5603568,"default_item":108,"flag":2022},"TRAINER_ELI_REWARD":{"address":5603086,"default_item":108,"flag":1781},"TRAINER_ELLIOT_1_REWARD":{"address":5602762,"default_item":106,"flag":1619},"TRAINER_ERIC_REWARD":{"address":5603348,"default_item":108,"flag":1912},"TRAINER_ERNEST_1_REWARD":{"address":5603068,"default_item":104,"flag":1772},"TRAINER_ETHAN_1_REWARD":{"address":5602516,"default_item":106,"flag":1496},"TRAINER_FABIAN_REWARD":{"address":5603602,"default_item":108,"flag":2039},"TRAINER_FELIX_REWARD":{"address":5602160,"default_item":104,"flag":1318},"TRAINER_FERNANDO_1_REWARD":{"address":5602474,"default_item":108,"flag":1475},"TRAINER_FLANNERY_1_REWARD":{"address":5602620,"default_item":107,"flag":1548},"TRAINER_FLINT_REWARD":{"address":5603392,"default_item":106,"flag":1934},"TRAINER_FOSTER_REWARD":{"address":5602176,"default_item":104,"flag":1326},"TRAINER_FRANKLIN_REWARD":{"address":5602424,"default_item":106,"flag":1450},"TRAINER_FREDRICK_REWARD":{"address":5602142,"default_item":104,"flag":1309},"TRAINER_GABRIELLE_1_REWARD":{"address":5602102,"default_item":104,"flag":1289},"TRAINER_GARRET_REWARD":{"address":5602360,"default_item":110,"flag":1418},"TRAINER_GARRISON_REWARD":{"address":5603178,"default_item":104,"flag":1827},"TRAINER_GEORGE_REWARD":{"address":5602230,"default_item":104,"flag":1353},"TRAINER_GERALD_REWARD":{"address":5603380,"default_item":104,"flag":1928},"TRAINER_GILBERT_REWARD":{"address":5602422,"default_item":106,"flag":1449},"TRAINER_GINA_AND_MIA_1_REWARD":{"address":5603050,"default_item":103,"flag":1763},"TRAINER_GLACIA_REWARD":{"address":5602610,"default_item":110,"flag":1543},"TRAINER_GRACE_REWARD":{"address":5602984,"default_item":106,"flag":1730},"TRAINER_GREG_REWARD":{"address":5603322,"default_item":106,"flag":1899},"TRAINER_GRUNT_AQUA_HIDEOUT_1_REWARD":{"address":5602088,"default_item":106,"flag":1282},"TRAINER_GRUNT_AQUA_HIDEOUT_2_REWARD":{"address":5602090,"default_item":106,"flag":1283},"TRAINER_GRUNT_AQUA_HIDEOUT_3_REWARD":{"address":5602092,"default_item":106,"flag":1284},"TRAINER_GRUNT_AQUA_HIDEOUT_4_REWARD":{"address":5602094,"default_item":106,"flag":1285},"TRAINER_GRUNT_AQUA_HIDEOUT_5_REWARD":{"address":5602138,"default_item":106,"flag":1307},"TRAINER_GRUNT_AQUA_HIDEOUT_6_REWARD":{"address":5602140,"default_item":106,"flag":1308},"TRAINER_GRUNT_AQUA_HIDEOUT_7_REWARD":{"address":5602468,"default_item":106,"flag":1472},"TRAINER_GRUNT_AQUA_HIDEOUT_8_REWARD":{"address":5602470,"default_item":106,"flag":1473},"TRAINER_GRUNT_MAGMA_HIDEOUT_10_REWARD":{"address":5603534,"default_item":106,"flag":2005},"TRAINER_GRUNT_MAGMA_HIDEOUT_11_REWARD":{"address":5603536,"default_item":106,"flag":2006},"TRAINER_GRUNT_MAGMA_HIDEOUT_12_REWARD":{"address":5603538,"default_item":106,"flag":2007},"TRAINER_GRUNT_MAGMA_HIDEOUT_13_REWARD":{"address":5603540,"default_item":106,"flag":2008},"TRAINER_GRUNT_MAGMA_HIDEOUT_14_REWARD":{"address":5603542,"default_item":106,"flag":2009},"TRAINER_GRUNT_MAGMA_HIDEOUT_15_REWARD":{"address":5603544,"default_item":106,"flag":2010},"TRAINER_GRUNT_MAGMA_HIDEOUT_16_REWARD":{"address":5603546,"default_item":106,"flag":2011},"TRAINER_GRUNT_MAGMA_HIDEOUT_1_REWARD":{"address":5603516,"default_item":106,"flag":1996},"TRAINER_GRUNT_MAGMA_HIDEOUT_2_REWARD":{"address":5603518,"default_item":106,"flag":1997},"TRAINER_GRUNT_MAGMA_HIDEOUT_3_REWARD":{"address":5603520,"default_item":106,"flag":1998},"TRAINER_GRUNT_MAGMA_HIDEOUT_4_REWARD":{"address":5603522,"default_item":106,"flag":1999},"TRAINER_GRUNT_MAGMA_HIDEOUT_5_REWARD":{"address":5603524,"default_item":106,"flag":2000},"TRAINER_GRUNT_MAGMA_HIDEOUT_6_REWARD":{"address":5603526,"default_item":106,"flag":2001},"TRAINER_GRUNT_MAGMA_HIDEOUT_7_REWARD":{"address":5603528,"default_item":106,"flag":2002},"TRAINER_GRUNT_MAGMA_HIDEOUT_8_REWARD":{"address":5603530,"default_item":106,"flag":2003},"TRAINER_GRUNT_MAGMA_HIDEOUT_9_REWARD":{"address":5603532,"default_item":106,"flag":2004},"TRAINER_GRUNT_MT_CHIMNEY_1_REWARD":{"address":5602376,"default_item":106,"flag":1426},"TRAINER_GRUNT_MT_CHIMNEY_2_REWARD":{"address":5603242,"default_item":106,"flag":1859},"TRAINER_GRUNT_MT_PYRE_1_REWARD":{"address":5602130,"default_item":106,"flag":1303},"TRAINER_GRUNT_MT_PYRE_2_REWARD":{"address":5602132,"default_item":106,"flag":1304},"TRAINER_GRUNT_MT_PYRE_3_REWARD":{"address":5602134,"default_item":106,"flag":1305},"TRAINER_GRUNT_MT_PYRE_4_REWARD":{"address":5603222,"default_item":106,"flag":1849},"TRAINER_GRUNT_MUSEUM_1_REWARD":{"address":5602124,"default_item":106,"flag":1300},"TRAINER_GRUNT_MUSEUM_2_REWARD":{"address":5602126,"default_item":106,"flag":1301},"TRAINER_GRUNT_PETALBURG_WOODS_REWARD":{"address":5602104,"default_item":103,"flag":1290},"TRAINER_GRUNT_RUSTURF_TUNNEL_REWARD":{"address":5602116,"default_item":103,"flag":1296},"TRAINER_GRUNT_SEAFLOOR_CAVERN_1_REWARD":{"address":5602096,"default_item":108,"flag":1286},"TRAINER_GRUNT_SEAFLOOR_CAVERN_2_REWARD":{"address":5602098,"default_item":108,"flag":1287},"TRAINER_GRUNT_SEAFLOOR_CAVERN_3_REWARD":{"address":5602100,"default_item":108,"flag":1288},"TRAINER_GRUNT_SEAFLOOR_CAVERN_4_REWARD":{"address":5602112,"default_item":108,"flag":1294},"TRAINER_GRUNT_SEAFLOOR_CAVERN_5_REWARD":{"address":5603218,"default_item":108,"flag":1847},"TRAINER_GRUNT_SPACE_CENTER_1_REWARD":{"address":5602128,"default_item":106,"flag":1302},"TRAINER_GRUNT_SPACE_CENTER_2_REWARD":{"address":5602316,"default_item":106,"flag":1396},"TRAINER_GRUNT_SPACE_CENTER_3_REWARD":{"address":5603256,"default_item":106,"flag":1866},"TRAINER_GRUNT_SPACE_CENTER_4_REWARD":{"address":5603258,"default_item":106,"flag":1867},"TRAINER_GRUNT_SPACE_CENTER_5_REWARD":{"address":5603260,"default_item":106,"flag":1868},"TRAINER_GRUNT_SPACE_CENTER_6_REWARD":{"address":5603262,"default_item":106,"flag":1869},"TRAINER_GRUNT_SPACE_CENTER_7_REWARD":{"address":5603264,"default_item":106,"flag":1870},"TRAINER_GRUNT_WEATHER_INST_1_REWARD":{"address":5602118,"default_item":106,"flag":1297},"TRAINER_GRUNT_WEATHER_INST_2_REWARD":{"address":5602120,"default_item":106,"flag":1298},"TRAINER_GRUNT_WEATHER_INST_3_REWARD":{"address":5602122,"default_item":106,"flag":1299},"TRAINER_GRUNT_WEATHER_INST_4_REWARD":{"address":5602136,"default_item":106,"flag":1306},"TRAINER_GRUNT_WEATHER_INST_5_REWARD":{"address":5603276,"default_item":106,"flag":1876},"TRAINER_GWEN_REWARD":{"address":5602202,"default_item":103,"flag":1339},"TRAINER_HAILEY_REWARD":{"address":5603478,"default_item":103,"flag":1977},"TRAINER_HALEY_1_REWARD":{"address":5603292,"default_item":103,"flag":1884},"TRAINER_HALLE_REWARD":{"address":5603176,"default_item":104,"flag":1826},"TRAINER_HANNAH_REWARD":{"address":5602572,"default_item":108,"flag":1524},"TRAINER_HARRISON_REWARD":{"address":5603240,"default_item":106,"flag":1858},"TRAINER_HAYDEN_REWARD":{"address":5603498,"default_item":106,"flag":1987},"TRAINER_HECTOR_REWARD":{"address":5603110,"default_item":104,"flag":1793},"TRAINER_HEIDI_REWARD":{"address":5603022,"default_item":106,"flag":1749},"TRAINER_HELENE_REWARD":{"address":5603586,"default_item":106,"flag":2031},"TRAINER_HENRY_REWARD":{"address":5603420,"default_item":104,"flag":1948},"TRAINER_HERMAN_REWARD":{"address":5602418,"default_item":106,"flag":1447},"TRAINER_HIDEO_REWARD":{"address":5603386,"default_item":106,"flag":1931},"TRAINER_HITOSHI_REWARD":{"address":5602444,"default_item":104,"flag":1460},"TRAINER_HOPE_REWARD":{"address":5602276,"default_item":104,"flag":1376},"TRAINER_HUDSON_REWARD":{"address":5603104,"default_item":104,"flag":1790},"TRAINER_HUEY_REWARD":{"address":5603064,"default_item":106,"flag":1770},"TRAINER_HUGH_REWARD":{"address":5602882,"default_item":108,"flag":1679},"TRAINER_HUMBERTO_REWARD":{"address":5602888,"default_item":108,"flag":1682},"TRAINER_IMANI_REWARD":{"address":5602968,"default_item":103,"flag":1722},"TRAINER_IRENE_REWARD":{"address":5603036,"default_item":106,"flag":1756},"TRAINER_ISAAC_1_REWARD":{"address":5603160,"default_item":106,"flag":1818},"TRAINER_ISABELLA_REWARD":{"address":5603274,"default_item":104,"flag":1875},"TRAINER_ISABELLE_REWARD":{"address":5603556,"default_item":103,"flag":2016},"TRAINER_ISABEL_1_REWARD":{"address":5602688,"default_item":104,"flag":1582},"TRAINER_ISAIAH_1_REWARD":{"address":5602836,"default_item":104,"flag":1656},"TRAINER_ISOBEL_REWARD":{"address":5602850,"default_item":104,"flag":1663},"TRAINER_IVAN_REWARD":{"address":5602758,"default_item":106,"flag":1617},"TRAINER_JACE_REWARD":{"address":5602492,"default_item":108,"flag":1484},"TRAINER_JACKI_1_REWARD":{"address":5602582,"default_item":108,"flag":1529},"TRAINER_JACKSON_1_REWARD":{"address":5603188,"default_item":104,"flag":1832},"TRAINER_JACK_REWARD":{"address":5602428,"default_item":106,"flag":1452},"TRAINER_JACLYN_REWARD":{"address":5602570,"default_item":106,"flag":1523},"TRAINER_JACOB_REWARD":{"address":5602786,"default_item":106,"flag":1631},"TRAINER_JAIDEN_REWARD":{"address":5603582,"default_item":106,"flag":2029},"TRAINER_JAMES_1_REWARD":{"address":5603326,"default_item":103,"flag":1901},"TRAINER_JANICE_REWARD":{"address":5603294,"default_item":103,"flag":1885},"TRAINER_JANI_REWARD":{"address":5602920,"default_item":103,"flag":1698},"TRAINER_JARED_REWARD":{"address":5602886,"default_item":108,"flag":1681},"TRAINER_JASMINE_REWARD":{"address":5602802,"default_item":103,"flag":1639},"TRAINER_JAYLEN_REWARD":{"address":5602736,"default_item":106,"flag":1606},"TRAINER_JAZMYN_REWARD":{"address":5603090,"default_item":106,"flag":1783},"TRAINER_JEFFREY_1_REWARD":{"address":5602536,"default_item":104,"flag":1506},"TRAINER_JEFF_REWARD":{"address":5602488,"default_item":108,"flag":1482},"TRAINER_JENNA_REWARD":{"address":5603204,"default_item":104,"flag":1840},"TRAINER_JENNIFER_REWARD":{"address":5602274,"default_item":104,"flag":1375},"TRAINER_JENNY_1_REWARD":{"address":5602982,"default_item":106,"flag":1729},"TRAINER_JEROME_REWARD":{"address":5602396,"default_item":103,"flag":1436},"TRAINER_JERRY_1_REWARD":{"address":5602630,"default_item":103,"flag":1553},"TRAINER_JESSICA_1_REWARD":{"address":5602338,"default_item":104,"flag":1407},"TRAINER_JOCELYN_REWARD":{"address":5602934,"default_item":106,"flag":1705},"TRAINER_JODY_REWARD":{"address":5602266,"default_item":104,"flag":1371},"TRAINER_JOEY_REWARD":{"address":5602728,"default_item":103,"flag":1602},"TRAINER_JOHANNA_REWARD":{"address":5603378,"default_item":104,"flag":1927},"TRAINER_JOHNSON_REWARD":{"address":5603592,"default_item":103,"flag":2034},"TRAINER_JOHN_AND_JAY_1_REWARD":{"address":5603446,"default_item":104,"flag":1961},"TRAINER_JONAH_REWARD":{"address":5603418,"default_item":104,"flag":1947},"TRAINER_JONAS_REWARD":{"address":5603092,"default_item":106,"flag":1784},"TRAINER_JONATHAN_REWARD":{"address":5603280,"default_item":104,"flag":1878},"TRAINER_JOSEPH_REWARD":{"address":5603484,"default_item":106,"flag":1980},"TRAINER_JOSE_REWARD":{"address":5603318,"default_item":103,"flag":1897},"TRAINER_JOSH_REWARD":{"address":5602724,"default_item":103,"flag":1600},"TRAINER_JOSUE_REWARD":{"address":5603560,"default_item":108,"flag":2018},"TRAINER_JUAN_1_REWARD":{"address":5602628,"default_item":109,"flag":1552},"TRAINER_JULIE_REWARD":{"address":5602284,"default_item":104,"flag":1380},"TRAINER_JULIO_REWARD":{"address":5603216,"default_item":108,"flag":1846},"TRAINER_KAI_REWARD":{"address":5603510,"default_item":108,"flag":1993},"TRAINER_KALEB_REWARD":{"address":5603482,"default_item":104,"flag":1979},"TRAINER_KARA_REWARD":{"address":5602998,"default_item":106,"flag":1737},"TRAINER_KAREN_1_REWARD":{"address":5602644,"default_item":103,"flag":1560},"TRAINER_KATELYNN_REWARD":{"address":5602734,"default_item":104,"flag":1605},"TRAINER_KATELYN_1_REWARD":{"address":5602856,"default_item":104,"flag":1666},"TRAINER_KATE_AND_JOY_REWARD":{"address":5602656,"default_item":106,"flag":1566},"TRAINER_KATHLEEN_REWARD":{"address":5603250,"default_item":108,"flag":1863},"TRAINER_KATIE_REWARD":{"address":5602994,"default_item":106,"flag":1735},"TRAINER_KAYLA_REWARD":{"address":5602578,"default_item":106,"flag":1527},"TRAINER_KAYLEY_REWARD":{"address":5603094,"default_item":104,"flag":1785},"TRAINER_KEEGAN_REWARD":{"address":5602494,"default_item":108,"flag":1485},"TRAINER_KEIGO_REWARD":{"address":5603388,"default_item":106,"flag":1932},"TRAINER_KELVIN_REWARD":{"address":5603098,"default_item":104,"flag":1787},"TRAINER_KENT_REWARD":{"address":5603324,"default_item":106,"flag":1900},"TRAINER_KEVIN_REWARD":{"address":5602426,"default_item":106,"flag":1451},"TRAINER_KIM_AND_IRIS_REWARD":{"address":5603440,"default_item":106,"flag":1958},"TRAINER_KINDRA_REWARD":{"address":5602296,"default_item":108,"flag":1386},"TRAINER_KIRA_AND_DAN_1_REWARD":{"address":5603368,"default_item":108,"flag":1922},"TRAINER_KIRK_REWARD":{"address":5602466,"default_item":106,"flag":1471},"TRAINER_KIYO_REWARD":{"address":5602446,"default_item":104,"flag":1461},"TRAINER_KOICHI_REWARD":{"address":5602448,"default_item":108,"flag":1462},"TRAINER_KOJI_1_REWARD":{"address":5603428,"default_item":104,"flag":1952},"TRAINER_KYLA_REWARD":{"address":5602970,"default_item":103,"flag":1723},"TRAINER_KYRA_REWARD":{"address":5603580,"default_item":104,"flag":2028},"TRAINER_LAO_1_REWARD":{"address":5602922,"default_item":103,"flag":1699},"TRAINER_LARRY_REWARD":{"address":5602510,"default_item":106,"flag":1493},"TRAINER_LAURA_REWARD":{"address":5602936,"default_item":106,"flag":1706},"TRAINER_LAUREL_REWARD":{"address":5603010,"default_item":106,"flag":1743},"TRAINER_LAWRENCE_REWARD":{"address":5603504,"default_item":106,"flag":1990},"TRAINER_LEAH_REWARD":{"address":5602154,"default_item":108,"flag":1315},"TRAINER_LEA_AND_JED_REWARD":{"address":5603366,"default_item":104,"flag":1921},"TRAINER_LENNY_REWARD":{"address":5603340,"default_item":108,"flag":1908},"TRAINER_LEONARDO_REWARD":{"address":5603236,"default_item":106,"flag":1856},"TRAINER_LEONARD_REWARD":{"address":5603074,"default_item":104,"flag":1775},"TRAINER_LEONEL_REWARD":{"address":5603608,"default_item":104,"flag":2042},"TRAINER_LILA_AND_ROY_1_REWARD":{"address":5603458,"default_item":106,"flag":1967},"TRAINER_LILITH_REWARD":{"address":5603230,"default_item":106,"flag":1853},"TRAINER_LINDA_REWARD":{"address":5603006,"default_item":106,"flag":1741},"TRAINER_LISA_AND_RAY_REWARD":{"address":5603468,"default_item":106,"flag":1972},"TRAINER_LOLA_1_REWARD":{"address":5602198,"default_item":103,"flag":1337},"TRAINER_LORENZO_REWARD":{"address":5603190,"default_item":104,"flag":1833},"TRAINER_LUCAS_1_REWARD":{"address":5603342,"default_item":108,"flag":1909},"TRAINER_LUIS_REWARD":{"address":5602386,"default_item":103,"flag":1431},"TRAINER_LUNG_REWARD":{"address":5602924,"default_item":103,"flag":1700},"TRAINER_LYDIA_1_REWARD":{"address":5603174,"default_item":106,"flag":1825},"TRAINER_LYLE_REWARD":{"address":5603316,"default_item":103,"flag":1896},"TRAINER_MACEY_REWARD":{"address":5603266,"default_item":108,"flag":1871},"TRAINER_MADELINE_1_REWARD":{"address":5602952,"default_item":108,"flag":1714},"TRAINER_MAKAYLA_REWARD":{"address":5603600,"default_item":104,"flag":2038},"TRAINER_MARCEL_REWARD":{"address":5602106,"default_item":104,"flag":1291},"TRAINER_MARCOS_REWARD":{"address":5603488,"default_item":106,"flag":1982},"TRAINER_MARC_REWARD":{"address":5603226,"default_item":106,"flag":1851},"TRAINER_MARIA_1_REWARD":{"address":5602822,"default_item":106,"flag":1649},"TRAINER_MARK_REWARD":{"address":5602374,"default_item":104,"flag":1425},"TRAINER_MARLENE_REWARD":{"address":5603588,"default_item":106,"flag":2032},"TRAINER_MARLEY_REWARD":{"address":5603100,"default_item":104,"flag":1788},"TRAINER_MARY_REWARD":{"address":5602262,"default_item":104,"flag":1369},"TRAINER_MATTHEW_REWARD":{"address":5602398,"default_item":103,"flag":1437},"TRAINER_MATT_REWARD":{"address":5602144,"default_item":104,"flag":1310},"TRAINER_MAURA_REWARD":{"address":5602576,"default_item":108,"flag":1526},"TRAINER_MAXIE_MAGMA_HIDEOUT_REWARD":{"address":5603286,"default_item":107,"flag":1881},"TRAINER_MAXIE_MT_CHIMNEY_REWARD":{"address":5603288,"default_item":104,"flag":1882},"TRAINER_MAY_LILYCOVE_MUDKIP_REWARD":{"address":5603412,"default_item":104,"flag":1944},"TRAINER_MAY_LILYCOVE_TORCHIC_REWARD":{"address":5603416,"default_item":104,"flag":1946},"TRAINER_MAY_LILYCOVE_TREECKO_REWARD":{"address":5603414,"default_item":104,"flag":1945},"TRAINER_MAY_ROUTE_103_MUDKIP_REWARD":{"address":5603142,"default_item":106,"flag":1809},"TRAINER_MAY_ROUTE_103_TORCHIC_REWARD":{"address":5603154,"default_item":106,"flag":1815},"TRAINER_MAY_ROUTE_103_TREECKO_REWARD":{"address":5603148,"default_item":106,"flag":1812},"TRAINER_MAY_ROUTE_110_MUDKIP_REWARD":{"address":5603144,"default_item":104,"flag":1810},"TRAINER_MAY_ROUTE_110_TORCHIC_REWARD":{"address":5603156,"default_item":104,"flag":1816},"TRAINER_MAY_ROUTE_110_TREECKO_REWARD":{"address":5603150,"default_item":104,"flag":1813},"TRAINER_MAY_ROUTE_119_MUDKIP_REWARD":{"address":5603146,"default_item":104,"flag":1811},"TRAINER_MAY_ROUTE_119_TORCHIC_REWARD":{"address":5603158,"default_item":104,"flag":1817},"TRAINER_MAY_ROUTE_119_TREECKO_REWARD":{"address":5603152,"default_item":104,"flag":1814},"TRAINER_MAY_RUSTBORO_MUDKIP_REWARD":{"address":5603284,"default_item":108,"flag":1880},"TRAINER_MAY_RUSTBORO_TORCHIC_REWARD":{"address":5603622,"default_item":108,"flag":2049},"TRAINER_MAY_RUSTBORO_TREECKO_REWARD":{"address":5603620,"default_item":108,"flag":2048},"TRAINER_MELINA_REWARD":{"address":5603594,"default_item":106,"flag":2035},"TRAINER_MELISSA_REWARD":{"address":5602332,"default_item":104,"flag":1404},"TRAINER_MEL_AND_PAUL_REWARD":{"address":5603444,"default_item":108,"flag":1960},"TRAINER_MICAH_REWARD":{"address":5602594,"default_item":107,"flag":1535},"TRAINER_MICHELLE_REWARD":{"address":5602280,"default_item":104,"flag":1378},"TRAINER_MIGUEL_1_REWARD":{"address":5602670,"default_item":104,"flag":1573},"TRAINER_MIKE_2_REWARD":{"address":5603354,"default_item":106,"flag":1915},"TRAINER_MISSY_REWARD":{"address":5602978,"default_item":103,"flag":1727},"TRAINER_MITCHELL_REWARD":{"address":5603164,"default_item":104,"flag":1820},"TRAINER_MIU_AND_YUKI_REWARD":{"address":5603052,"default_item":106,"flag":1764},"TRAINER_MOLLIE_REWARD":{"address":5602358,"default_item":104,"flag":1417},"TRAINER_MYLES_REWARD":{"address":5603614,"default_item":104,"flag":2045},"TRAINER_NANCY_REWARD":{"address":5603028,"default_item":106,"flag":1752},"TRAINER_NAOMI_REWARD":{"address":5602322,"default_item":110,"flag":1399},"TRAINER_NATE_REWARD":{"address":5603248,"default_item":107,"flag":1862},"TRAINER_NED_REWARD":{"address":5602764,"default_item":106,"flag":1620},"TRAINER_NICHOLAS_REWARD":{"address":5603254,"default_item":108,"flag":1865},"TRAINER_NICOLAS_1_REWARD":{"address":5602868,"default_item":104,"flag":1672},"TRAINER_NIKKI_REWARD":{"address":5602990,"default_item":106,"flag":1733},"TRAINER_NOB_1_REWARD":{"address":5602450,"default_item":106,"flag":1463},"TRAINER_NOLAN_REWARD":{"address":5602768,"default_item":108,"flag":1622},"TRAINER_NOLEN_REWARD":{"address":5602406,"default_item":106,"flag":1441},"TRAINER_NORMAN_1_REWARD":{"address":5602622,"default_item":107,"flag":1549},"TRAINER_OLIVIA_REWARD":{"address":5602344,"default_item":107,"flag":1410},"TRAINER_OWEN_REWARD":{"address":5602250,"default_item":104,"flag":1363},"TRAINER_PABLO_1_REWARD":{"address":5602838,"default_item":104,"flag":1657},"TRAINER_PARKER_REWARD":{"address":5602228,"default_item":104,"flag":1352},"TRAINER_PAT_REWARD":{"address":5603616,"default_item":104,"flag":2046},"TRAINER_PAXTON_REWARD":{"address":5603272,"default_item":104,"flag":1874},"TRAINER_PERRY_REWARD":{"address":5602880,"default_item":108,"flag":1678},"TRAINER_PETE_REWARD":{"address":5603554,"default_item":103,"flag":2015},"TRAINER_PHILLIP_REWARD":{"address":5603072,"default_item":104,"flag":1774},"TRAINER_PHIL_REWARD":{"address":5602884,"default_item":108,"flag":1680},"TRAINER_PHOEBE_REWARD":{"address":5602608,"default_item":110,"flag":1542},"TRAINER_PRESLEY_REWARD":{"address":5602890,"default_item":104,"flag":1683},"TRAINER_PRESTON_REWARD":{"address":5602550,"default_item":108,"flag":1513},"TRAINER_QUINCY_REWARD":{"address":5602732,"default_item":104,"flag":1604},"TRAINER_RACHEL_REWARD":{"address":5603606,"default_item":104,"flag":2041},"TRAINER_RANDALL_REWARD":{"address":5602226,"default_item":104,"flag":1351},"TRAINER_REED_REWARD":{"address":5603434,"default_item":106,"flag":1955},"TRAINER_RELI_AND_IAN_REWARD":{"address":5603456,"default_item":106,"flag":1966},"TRAINER_REYNA_REWARD":{"address":5603102,"default_item":108,"flag":1789},"TRAINER_RHETT_REWARD":{"address":5603490,"default_item":106,"flag":1983},"TRAINER_RICHARD_REWARD":{"address":5602416,"default_item":106,"flag":1446},"TRAINER_RICKY_1_REWARD":{"address":5602212,"default_item":103,"flag":1344},"TRAINER_RICK_REWARD":{"address":5603314,"default_item":103,"flag":1895},"TRAINER_RILEY_REWARD":{"address":5603390,"default_item":106,"flag":1933},"TRAINER_ROBERT_1_REWARD":{"address":5602896,"default_item":108,"flag":1686},"TRAINER_RODNEY_REWARD":{"address":5602414,"default_item":106,"flag":1445},"TRAINER_ROGER_REWARD":{"address":5603422,"default_item":104,"flag":1949},"TRAINER_ROLAND_REWARD":{"address":5602404,"default_item":106,"flag":1440},"TRAINER_RONALD_REWARD":{"address":5602784,"default_item":104,"flag":1630},"TRAINER_ROSE_1_REWARD":{"address":5602158,"default_item":106,"flag":1317},"TRAINER_ROXANNE_1_REWARD":{"address":5602614,"default_item":104,"flag":1545},"TRAINER_RUBEN_REWARD":{"address":5603426,"default_item":104,"flag":1951},"TRAINER_SAMANTHA_REWARD":{"address":5602574,"default_item":108,"flag":1525},"TRAINER_SAMUEL_REWARD":{"address":5602246,"default_item":104,"flag":1361},"TRAINER_SANTIAGO_REWARD":{"address":5602420,"default_item":106,"flag":1448},"TRAINER_SARAH_REWARD":{"address":5603474,"default_item":104,"flag":1975},"TRAINER_SAWYER_1_REWARD":{"address":5602086,"default_item":108,"flag":1281},"TRAINER_SHANE_REWARD":{"address":5602512,"default_item":106,"flag":1494},"TRAINER_SHANNON_REWARD":{"address":5602278,"default_item":104,"flag":1377},"TRAINER_SHARON_REWARD":{"address":5602988,"default_item":106,"flag":1732},"TRAINER_SHAWN_REWARD":{"address":5602472,"default_item":106,"flag":1474},"TRAINER_SHAYLA_REWARD":{"address":5603578,"default_item":108,"flag":2027},"TRAINER_SHEILA_REWARD":{"address":5602334,"default_item":104,"flag":1405},"TRAINER_SHELBY_1_REWARD":{"address":5602710,"default_item":108,"flag":1593},"TRAINER_SHELLY_SEAFLOOR_CAVERN_REWARD":{"address":5602150,"default_item":104,"flag":1313},"TRAINER_SHELLY_WEATHER_INSTITUTE_REWARD":{"address":5602148,"default_item":104,"flag":1312},"TRAINER_SHIRLEY_REWARD":{"address":5602336,"default_item":104,"flag":1406},"TRAINER_SIDNEY_REWARD":{"address":5602606,"default_item":110,"flag":1541},"TRAINER_SIENNA_REWARD":{"address":5603002,"default_item":106,"flag":1739},"TRAINER_SIMON_REWARD":{"address":5602214,"default_item":103,"flag":1345},"TRAINER_SOPHIE_REWARD":{"address":5603500,"default_item":106,"flag":1988},"TRAINER_SPENCER_REWARD":{"address":5602402,"default_item":106,"flag":1439},"TRAINER_STAN_REWARD":{"address":5602408,"default_item":106,"flag":1442},"TRAINER_STEVEN_REWARD":{"address":5603692,"default_item":109,"flag":2084},"TRAINER_STEVE_1_REWARD":{"address":5602370,"default_item":104,"flag":1423},"TRAINER_SUSIE_REWARD":{"address":5602996,"default_item":106,"flag":1736},"TRAINER_SYLVIA_REWARD":{"address":5603234,"default_item":108,"flag":1855},"TRAINER_TABITHA_MAGMA_HIDEOUT_REWARD":{"address":5603548,"default_item":104,"flag":2012},"TRAINER_TABITHA_MT_CHIMNEY_REWARD":{"address":5603278,"default_item":108,"flag":1877},"TRAINER_TAKAO_REWARD":{"address":5602442,"default_item":106,"flag":1459},"TRAINER_TAKASHI_REWARD":{"address":5602916,"default_item":106,"flag":1696},"TRAINER_TALIA_REWARD":{"address":5602854,"default_item":104,"flag":1665},"TRAINER_TAMMY_REWARD":{"address":5602298,"default_item":106,"flag":1387},"TRAINER_TANYA_REWARD":{"address":5602986,"default_item":106,"flag":1731},"TRAINER_TARA_REWARD":{"address":5602976,"default_item":103,"flag":1726},"TRAINER_TASHA_REWARD":{"address":5602302,"default_item":108,"flag":1389},"TRAINER_TATE_AND_LIZA_1_REWARD":{"address":5602626,"default_item":109,"flag":1551},"TRAINER_TAYLOR_REWARD":{"address":5602534,"default_item":104,"flag":1505},"TRAINER_THALIA_1_REWARD":{"address":5602372,"default_item":104,"flag":1424},"TRAINER_THOMAS_REWARD":{"address":5602596,"default_item":107,"flag":1536},"TRAINER_TIANA_REWARD":{"address":5603290,"default_item":103,"flag":1883},"TRAINER_TIFFANY_REWARD":{"address":5602346,"default_item":107,"flag":1411},"TRAINER_TIMMY_REWARD":{"address":5602752,"default_item":103,"flag":1614},"TRAINER_TIMOTHY_1_REWARD":{"address":5602698,"default_item":104,"flag":1587},"TRAINER_TISHA_REWARD":{"address":5603436,"default_item":106,"flag":1956},"TRAINER_TOMMY_REWARD":{"address":5602726,"default_item":103,"flag":1601},"TRAINER_TONY_1_REWARD":{"address":5602394,"default_item":103,"flag":1435},"TRAINER_TORI_AND_TIA_REWARD":{"address":5603438,"default_item":103,"flag":1957},"TRAINER_TRAVIS_REWARD":{"address":5602520,"default_item":106,"flag":1498},"TRAINER_TRENT_1_REWARD":{"address":5603338,"default_item":106,"flag":1907},"TRAINER_TYRA_AND_IVY_REWARD":{"address":5603442,"default_item":106,"flag":1959},"TRAINER_TYRON_REWARD":{"address":5603492,"default_item":106,"flag":1984},"TRAINER_VALERIE_1_REWARD":{"address":5602300,"default_item":108,"flag":1388},"TRAINER_VANESSA_REWARD":{"address":5602684,"default_item":104,"flag":1580},"TRAINER_VICKY_REWARD":{"address":5602708,"default_item":108,"flag":1592},"TRAINER_VICTORIA_REWARD":{"address":5602682,"default_item":106,"flag":1579},"TRAINER_VICTOR_REWARD":{"address":5602668,"default_item":106,"flag":1572},"TRAINER_VIOLET_REWARD":{"address":5602162,"default_item":104,"flag":1319},"TRAINER_VIRGIL_REWARD":{"address":5602552,"default_item":108,"flag":1514},"TRAINER_VITO_REWARD":{"address":5602248,"default_item":104,"flag":1362},"TRAINER_VIVIAN_REWARD":{"address":5603382,"default_item":106,"flag":1929},"TRAINER_VIVI_REWARD":{"address":5603296,"default_item":106,"flag":1886},"TRAINER_WADE_REWARD":{"address":5602772,"default_item":106,"flag":1624},"TRAINER_WALLACE_REWARD":{"address":5602754,"default_item":110,"flag":1615},"TRAINER_WALLY_MAUVILLE_REWARD":{"address":5603396,"default_item":108,"flag":1936},"TRAINER_WALLY_VR_1_REWARD":{"address":5603122,"default_item":107,"flag":1799},"TRAINER_WALTER_1_REWARD":{"address":5602592,"default_item":104,"flag":1534},"TRAINER_WARREN_REWARD":{"address":5602260,"default_item":104,"flag":1368},"TRAINER_WATTSON_1_REWARD":{"address":5602618,"default_item":104,"flag":1547},"TRAINER_WAYNE_REWARD":{"address":5603430,"default_item":104,"flag":1953},"TRAINER_WENDY_REWARD":{"address":5602268,"default_item":104,"flag":1372},"TRAINER_WILLIAM_REWARD":{"address":5602556,"default_item":106,"flag":1516},"TRAINER_WILTON_1_REWARD":{"address":5602240,"default_item":108,"flag":1358},"TRAINER_WINONA_1_REWARD":{"address":5602624,"default_item":107,"flag":1550},"TRAINER_WINSTON_1_REWARD":{"address":5602356,"default_item":104,"flag":1416},"TRAINER_WYATT_REWARD":{"address":5603506,"default_item":104,"flag":1991},"TRAINER_YASU_REWARD":{"address":5602914,"default_item":106,"flag":1695},"TRAINER_ZANDER_REWARD":{"address":5602146,"default_item":108,"flag":1311}},"maps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":{"header_address":4766420,"warp_table_address":5496844},"MAP_ABANDONED_SHIP_CORRIDORS_1F":{"header_address":4766196,"warp_table_address":5495920},"MAP_ABANDONED_SHIP_CORRIDORS_B1F":{"header_address":4766252,"warp_table_address":5496248},"MAP_ABANDONED_SHIP_DECK":{"header_address":4766168,"warp_table_address":5495812},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":{"fishing_encounters":{"address":5609088,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766476,"warp_table_address":5496908,"water_encounters":{"address":5609060,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":{"header_address":4766504,"warp_table_address":5497120},"MAP_ABANDONED_SHIP_ROOMS2_1F":{"header_address":4766392,"warp_table_address":5496752},"MAP_ABANDONED_SHIP_ROOMS2_B1F":{"header_address":4766308,"warp_table_address":5496484},"MAP_ABANDONED_SHIP_ROOMS_1F":{"header_address":4766224,"warp_table_address":5496132},"MAP_ABANDONED_SHIP_ROOMS_B1F":{"fishing_encounters":{"address":5606324,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766280,"warp_table_address":5496392,"water_encounters":{"address":5606296,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_ROOM_B1F":{"header_address":4766364,"warp_table_address":5496596},"MAP_ABANDONED_SHIP_UNDERWATER1":{"header_address":4766336,"warp_table_address":5496536},"MAP_ABANDONED_SHIP_UNDERWATER2":{"header_address":4766448,"warp_table_address":5496880},"MAP_ALTERING_CAVE":{"header_address":4767624,"land_encounters":{"address":5613400,"slots":[41,41,41,41,41,41,41,41,41,41,41,41]},"warp_table_address":5500436},"MAP_ANCIENT_TOMB":{"header_address":4766560,"warp_table_address":5497460},"MAP_AQUA_HIDEOUT_1F":{"header_address":4765300,"warp_table_address":5490892},"MAP_AQUA_HIDEOUT_B1F":{"header_address":4765328,"warp_table_address":5491152},"MAP_AQUA_HIDEOUT_B2F":{"header_address":4765356,"warp_table_address":5491516},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":{"header_address":4766728,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":{"header_address":4766756,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":{"header_address":4766784,"warp_table_address":4160749568},"MAP_ARTISAN_CAVE_1F":{"header_address":4767456,"land_encounters":{"address":5613344,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500172},"MAP_ARTISAN_CAVE_B1F":{"header_address":4767428,"land_encounters":{"address":5613288,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500064},"MAP_BATTLE_COLOSSEUM_2P":{"header_address":4768352,"warp_table_address":5509852},"MAP_BATTLE_COLOSSEUM_4P":{"header_address":4768436,"warp_table_address":5510152},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":{"header_address":4770228,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":{"header_address":4770200,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":{"header_address":4770172,"warp_table_address":5520908},"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":{"header_address":4769976,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":{"header_address":4769920,"warp_table_address":5519076},"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":{"header_address":4769892,"warp_table_address":5518968},"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":{"header_address":4769948,"warp_table_address":5519136},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":{"header_address":4770312,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":{"header_address":4770256,"warp_table_address":5521384},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":{"header_address":4770284,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":{"header_address":4770060,"warp_table_address":5520116},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":{"header_address":4770032,"warp_table_address":5519944},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":{"header_address":4770004,"warp_table_address":5519696},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":{"header_address":4770368,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":{"header_address":4770340,"warp_table_address":5521808},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":{"header_address":4770452,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":{"header_address":4770424,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":{"header_address":4770480,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":{"header_address":4770396,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":{"header_address":4770116,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":{"header_address":4770088,"warp_table_address":5520248},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":{"header_address":4770144,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":{"header_address":4769612,"warp_table_address":5516696},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":{"header_address":4769584,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":{"header_address":4769556,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":{"header_address":4769528,"warp_table_address":5516432},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":{"header_address":4769864,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":{"header_address":4769836,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":{"header_address":4769808,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":{"header_address":4770564,"warp_table_address":5523056},"MAP_BATTLE_FRONTIER_LOUNGE1":{"header_address":4770536,"warp_table_address":5522812},"MAP_BATTLE_FRONTIER_LOUNGE2":{"header_address":4770592,"warp_table_address":5523220},"MAP_BATTLE_FRONTIER_LOUNGE3":{"header_address":4770620,"warp_table_address":5523376},"MAP_BATTLE_FRONTIER_LOUNGE4":{"header_address":4770648,"warp_table_address":5523476},"MAP_BATTLE_FRONTIER_LOUNGE5":{"header_address":4770704,"warp_table_address":5523660},"MAP_BATTLE_FRONTIER_LOUNGE6":{"header_address":4770732,"warp_table_address":5523720},"MAP_BATTLE_FRONTIER_LOUNGE7":{"header_address":4770760,"warp_table_address":5523844},"MAP_BATTLE_FRONTIER_LOUNGE8":{"header_address":4770816,"warp_table_address":5524100},"MAP_BATTLE_FRONTIER_LOUNGE9":{"header_address":4770844,"warp_table_address":5524152},"MAP_BATTLE_FRONTIER_MART":{"header_address":4770928,"warp_table_address":5524588},"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":{"header_address":4769780,"warp_table_address":5518080},"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":{"header_address":4769500,"warp_table_address":5516048},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":{"header_address":4770872,"warp_table_address":5524308},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":{"header_address":4770900,"warp_table_address":5524448},"MAP_BATTLE_FRONTIER_RANKING_HALL":{"header_address":4770508,"warp_table_address":5522560},"MAP_BATTLE_FRONTIER_RECEPTION_GATE":{"header_address":4770788,"warp_table_address":5523992},"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":{"header_address":4770676,"warp_table_address":5523528},"MAP_BATTLE_PYRAMID_SQUARE01":{"header_address":4768912,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE02":{"header_address":4768940,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE03":{"header_address":4768968,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE04":{"header_address":4768996,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE05":{"header_address":4769024,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE06":{"header_address":4769052,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE07":{"header_address":4769080,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE08":{"header_address":4769108,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE09":{"header_address":4769136,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE10":{"header_address":4769164,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE11":{"header_address":4769192,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE12":{"header_address":4769220,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE13":{"header_address":4769248,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE14":{"header_address":4769276,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE15":{"header_address":4769304,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE16":{"header_address":4769332,"warp_table_address":4160749568},"MAP_BIRTH_ISLAND_EXTERIOR":{"header_address":4771012,"warp_table_address":5524876},"MAP_BIRTH_ISLAND_HARBOR":{"header_address":4771040,"warp_table_address":5524952},"MAP_CAVE_OF_ORIGIN_1F":{"header_address":4765720,"land_encounters":{"address":5609868,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493440},"MAP_CAVE_OF_ORIGIN_B1F":{"header_address":4765832,"warp_table_address":5493608},"MAP_CAVE_OF_ORIGIN_ENTRANCE":{"header_address":4765692,"land_encounters":{"address":5609812,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493404},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":{"header_address":4765748,"land_encounters":{"address":5609924,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493476},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":{"header_address":4765776,"land_encounters":{"address":5609980,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493512},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":{"header_address":4765804,"land_encounters":{"address":5610036,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493548},"MAP_CONTEST_HALL":{"header_address":4768464,"warp_table_address":4160749568},"MAP_CONTEST_HALL_BEAUTY":{"header_address":4768660,"warp_table_address":4160749568},"MAP_CONTEST_HALL_COOL":{"header_address":4768716,"warp_table_address":4160749568},"MAP_CONTEST_HALL_CUTE":{"header_address":4768772,"warp_table_address":4160749568},"MAP_CONTEST_HALL_SMART":{"header_address":4768744,"warp_table_address":4160749568},"MAP_CONTEST_HALL_TOUGH":{"header_address":4768688,"warp_table_address":4160749568},"MAP_DESERT_RUINS":{"header_address":4764824,"warp_table_address":5486828},"MAP_DESERT_UNDERPASS":{"header_address":4767400,"land_encounters":{"address":5613232,"slots":[132,370,132,371,132,370,371,132,370,132,371,132]},"warp_table_address":5500012},"MAP_DEWFORD_TOWN":{"fishing_encounters":{"address":5611588,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758300,"warp_table_address":5435180,"water_encounters":{"address":5611560,"slots":[72,309,309,310,310]}},"MAP_DEWFORD_TOWN_GYM":{"header_address":4759952,"warp_table_address":5460340},"MAP_DEWFORD_TOWN_HALL":{"header_address":4759980,"warp_table_address":5460640},"MAP_DEWFORD_TOWN_HOUSE1":{"header_address":4759868,"warp_table_address":5459856},"MAP_DEWFORD_TOWN_HOUSE2":{"header_address":4760008,"warp_table_address":5460748},"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":{"header_address":4759896,"warp_table_address":5459964},"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":{"header_address":4759924,"warp_table_address":5460104},"MAP_EVER_GRANDE_CITY":{"fishing_encounters":{"address":5611892,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4758216,"warp_table_address":5434048,"water_encounters":{"address":5611864,"slots":[72,309,309,310,310]}},"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":{"header_address":4764012,"warp_table_address":5483720},"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":{"header_address":4763984,"warp_table_address":5483612},"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":{"header_address":4763956,"warp_table_address":5483552},"MAP_EVER_GRANDE_CITY_HALL1":{"header_address":4764040,"warp_table_address":5483756},"MAP_EVER_GRANDE_CITY_HALL2":{"header_address":4764068,"warp_table_address":5483808},"MAP_EVER_GRANDE_CITY_HALL3":{"header_address":4764096,"warp_table_address":5483860},"MAP_EVER_GRANDE_CITY_HALL4":{"header_address":4764124,"warp_table_address":5483912},"MAP_EVER_GRANDE_CITY_HALL5":{"header_address":4764152,"warp_table_address":5483948},"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":{"header_address":4764208,"warp_table_address":5484180},"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":{"header_address":4763928,"warp_table_address":5483492},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":{"header_address":4764236,"warp_table_address":5484304},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":{"header_address":4764264,"warp_table_address":5484444},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":{"header_address":4764180,"warp_table_address":5484096},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":{"header_address":4764292,"warp_table_address":5484584},"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":{"header_address":4763900,"warp_table_address":5483432},"MAP_FALLARBOR_TOWN":{"header_address":4758356,"warp_table_address":5435792},"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760316,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760288,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760260,"warp_table_address":5462376},"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":{"header_address":4760400,"warp_table_address":5462888},"MAP_FALLARBOR_TOWN_MART":{"header_address":4760232,"warp_table_address":5462220},"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":{"header_address":4760428,"warp_table_address":5462948},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":{"header_address":4760344,"warp_table_address":5462656},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":{"header_address":4760372,"warp_table_address":5462796},"MAP_FARAWAY_ISLAND_ENTRANCE":{"header_address":4770956,"warp_table_address":5524672},"MAP_FARAWAY_ISLAND_INTERIOR":{"header_address":4770984,"warp_table_address":5524792},"MAP_FIERY_PATH":{"header_address":4765048,"land_encounters":{"address":5606456,"slots":[339,109,339,66,321,218,109,66,321,321,88,88]},"warp_table_address":5489344},"MAP_FORTREE_CITY":{"header_address":4758104,"warp_table_address":5431676},"MAP_FORTREE_CITY_DECORATION_SHOP":{"header_address":4762444,"warp_table_address":5473936},"MAP_FORTREE_CITY_GYM":{"header_address":4762220,"warp_table_address":5472984},"MAP_FORTREE_CITY_HOUSE1":{"header_address":4762192,"warp_table_address":5472756},"MAP_FORTREE_CITY_HOUSE2":{"header_address":4762332,"warp_table_address":5473504},"MAP_FORTREE_CITY_HOUSE3":{"header_address":4762360,"warp_table_address":5473588},"MAP_FORTREE_CITY_HOUSE4":{"header_address":4762388,"warp_table_address":5473696},"MAP_FORTREE_CITY_HOUSE5":{"header_address":4762416,"warp_table_address":5473804},"MAP_FORTREE_CITY_MART":{"header_address":4762304,"warp_table_address":5473420},"MAP_FORTREE_CITY_POKEMON_CENTER_1F":{"header_address":4762248,"warp_table_address":5473140},"MAP_FORTREE_CITY_POKEMON_CENTER_2F":{"header_address":4762276,"warp_table_address":5473280},"MAP_GRANITE_CAVE_1F":{"header_address":4764852,"land_encounters":{"address":5605988,"slots":[41,335,335,41,335,63,335,335,74,74,74,74]},"warp_table_address":5486956},"MAP_GRANITE_CAVE_B1F":{"header_address":4764880,"land_encounters":{"address":5606044,"slots":[41,382,382,382,41,63,335,335,322,322,322,322]},"warp_table_address":5487032},"MAP_GRANITE_CAVE_B2F":{"header_address":4764908,"land_encounters":{"address":5606372,"slots":[41,382,382,41,382,63,322,322,322,322,322,322]},"rock_smash_encounters":{"address":5606428,"slots":[74,320,74,74,74]},"warp_table_address":5487324},"MAP_GRANITE_CAVE_STEVENS_ROOM":{"header_address":4764936,"land_encounters":{"address":5608188,"slots":[41,335,335,41,335,63,335,335,382,382,382,382]},"warp_table_address":5487432},"MAP_INSIDE_OF_TRUCK":{"header_address":4768800,"warp_table_address":5510720},"MAP_ISLAND_CAVE":{"header_address":4766532,"warp_table_address":5497356},"MAP_JAGGED_PASS":{"header_address":4765020,"land_encounters":{"address":5606644,"slots":[339,339,66,339,351,66,351,66,339,351,339,351]},"warp_table_address":5488908},"MAP_LAVARIDGE_TOWN":{"header_address":4758328,"warp_table_address":5435516},"MAP_LAVARIDGE_TOWN_GYM_1F":{"header_address":4760064,"warp_table_address":5461036},"MAP_LAVARIDGE_TOWN_GYM_B1F":{"header_address":4760092,"warp_table_address":5461384},"MAP_LAVARIDGE_TOWN_HERB_SHOP":{"header_address":4760036,"warp_table_address":5460856},"MAP_LAVARIDGE_TOWN_HOUSE":{"header_address":4760120,"warp_table_address":5461668},"MAP_LAVARIDGE_TOWN_MART":{"header_address":4760148,"warp_table_address":5461776},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":{"header_address":4760176,"warp_table_address":5461908},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":{"header_address":4760204,"warp_table_address":5462056},"MAP_LILYCOVE_CITY":{"fishing_encounters":{"address":5611512,"slots":[129,72,129,72,313,313,313,120,313,313]},"header_address":4758132,"warp_table_address":5432368,"water_encounters":{"address":5611484,"slots":[72,309,309,310,310]}},"MAP_LILYCOVE_CITY_CONTEST_HALL":{"header_address":4762612,"warp_table_address":5476560},"MAP_LILYCOVE_CITY_CONTEST_LOBBY":{"header_address":4762584,"warp_table_address":5475596},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":{"header_address":4762472,"warp_table_address":5473996},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":{"header_address":4762500,"warp_table_address":5474224},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":{"header_address":4762920,"warp_table_address":5478044},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":{"header_address":4762948,"warp_table_address":5478228},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":{"header_address":4762976,"warp_table_address":5478392},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":{"header_address":4763004,"warp_table_address":5478556},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":{"header_address":4763032,"warp_table_address":5478768},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":{"header_address":4763088,"warp_table_address":5478984},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":{"header_address":4763060,"warp_table_address":5478908},"MAP_LILYCOVE_CITY_HARBOR":{"header_address":4762752,"warp_table_address":5477396},"MAP_LILYCOVE_CITY_HOUSE1":{"header_address":4762808,"warp_table_address":5477540},"MAP_LILYCOVE_CITY_HOUSE2":{"header_address":4762836,"warp_table_address":5477600},"MAP_LILYCOVE_CITY_HOUSE3":{"header_address":4762864,"warp_table_address":5477780},"MAP_LILYCOVE_CITY_HOUSE4":{"header_address":4762892,"warp_table_address":5477864},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":{"header_address":4762528,"warp_table_address":5474492},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":{"header_address":4762556,"warp_table_address":5474824},"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":{"header_address":4762780,"warp_table_address":5477456},"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":{"header_address":4762640,"warp_table_address":5476804},"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":{"header_address":4762668,"warp_table_address":5476944},"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":{"header_address":4762724,"warp_table_address":5477240},"MAP_LILYCOVE_CITY_UNUSED_MART":{"header_address":4762696,"warp_table_address":5476988},"MAP_LITTLEROOT_TOWN":{"header_address":4758244,"warp_table_address":5434528},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":{"header_address":4759588,"warp_table_address":5457588},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":{"header_address":4759616,"warp_table_address":5458080},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":{"header_address":4759644,"warp_table_address":5458324},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":{"header_address":4759672,"warp_table_address":5458816},"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":{"header_address":4759700,"warp_table_address":5459036},"MAP_MAGMA_HIDEOUT_1F":{"header_address":4767064,"land_encounters":{"address":5612560,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498844},"MAP_MAGMA_HIDEOUT_2F_1R":{"header_address":4767092,"land_encounters":{"address":5612616,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498992},"MAP_MAGMA_HIDEOUT_2F_2R":{"header_address":4767120,"land_encounters":{"address":5612672,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499180},"MAP_MAGMA_HIDEOUT_2F_3R":{"header_address":4767260,"land_encounters":{"address":5612952,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499696},"MAP_MAGMA_HIDEOUT_3F_1R":{"header_address":4767148,"land_encounters":{"address":5612728,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499288},"MAP_MAGMA_HIDEOUT_3F_2R":{"header_address":4767176,"land_encounters":{"address":5612784,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499380},"MAP_MAGMA_HIDEOUT_3F_3R":{"header_address":4767232,"land_encounters":{"address":5612896,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499660},"MAP_MAGMA_HIDEOUT_4F":{"header_address":4767204,"land_encounters":{"address":5612840,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499600},"MAP_MARINE_CAVE_END":{"header_address":4767540,"warp_table_address":5500288},"MAP_MARINE_CAVE_ENTRANCE":{"header_address":4767512,"warp_table_address":5500236},"MAP_MAUVILLE_CITY":{"header_address":4758048,"warp_table_address":5430380},"MAP_MAUVILLE_CITY_BIKE_SHOP":{"header_address":4761520,"warp_table_address":5469232},"MAP_MAUVILLE_CITY_GAME_CORNER":{"header_address":4761576,"warp_table_address":5469640},"MAP_MAUVILLE_CITY_GYM":{"header_address":4761492,"warp_table_address":5469060},"MAP_MAUVILLE_CITY_HOUSE1":{"header_address":4761548,"warp_table_address":5469316},"MAP_MAUVILLE_CITY_HOUSE2":{"header_address":4761604,"warp_table_address":5469988},"MAP_MAUVILLE_CITY_MART":{"header_address":4761688,"warp_table_address":5470424},"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":{"header_address":4761632,"warp_table_address":5470144},"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":{"header_address":4761660,"warp_table_address":5470308},"MAP_METEOR_FALLS_1F_1R":{"fishing_encounters":{"address":5610796,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4764656,"land_encounters":{"address":5610712,"slots":[41,41,41,41,41,349,349,349,41,41,41,41]},"warp_table_address":5486052,"water_encounters":{"address":5610768,"slots":[41,41,349,349,349]}},"MAP_METEOR_FALLS_1F_2R":{"fishing_encounters":{"address":5610928,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764684,"land_encounters":{"address":5610844,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486220,"water_encounters":{"address":5610900,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_1R":{"fishing_encounters":{"address":5611060,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764712,"land_encounters":{"address":5610976,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486284,"water_encounters":{"address":5611032,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_2R":{"fishing_encounters":{"address":5606596,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764740,"land_encounters":{"address":5606512,"slots":[42,42,395,349,395,349,395,349,42,42,42,42]},"warp_table_address":5486376,"water_encounters":{"address":5606568,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_STEVENS_CAVE":{"header_address":4767652,"land_encounters":{"address":5613904,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5500488},"MAP_MIRAGE_TOWER_1F":{"header_address":4767288,"land_encounters":{"address":5613008,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499732},"MAP_MIRAGE_TOWER_2F":{"header_address":4767316,"land_encounters":{"address":5613064,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499768},"MAP_MIRAGE_TOWER_3F":{"header_address":4767344,"land_encounters":{"address":5613120,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499852},"MAP_MIRAGE_TOWER_4F":{"header_address":4767372,"land_encounters":{"address":5613176,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499960},"MAP_MOSSDEEP_CITY":{"fishing_encounters":{"address":5611740,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758160,"warp_table_address":5433064,"water_encounters":{"address":5611712,"slots":[72,309,309,310,310]}},"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":{"header_address":4763424,"warp_table_address":5481712},"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":{"header_address":4763452,"warp_table_address":5481816},"MAP_MOSSDEEP_CITY_GYM":{"header_address":4763116,"warp_table_address":5479884},"MAP_MOSSDEEP_CITY_HOUSE1":{"header_address":4763144,"warp_table_address":5480232},"MAP_MOSSDEEP_CITY_HOUSE2":{"header_address":4763172,"warp_table_address":5480340},"MAP_MOSSDEEP_CITY_HOUSE3":{"header_address":4763284,"warp_table_address":5480812},"MAP_MOSSDEEP_CITY_HOUSE4":{"header_address":4763340,"warp_table_address":5481076},"MAP_MOSSDEEP_CITY_MART":{"header_address":4763256,"warp_table_address":5480752},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":{"header_address":4763200,"warp_table_address":5480448},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":{"header_address":4763228,"warp_table_address":5480612},"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":{"header_address":4763368,"warp_table_address":5481376},"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":{"header_address":4763396,"warp_table_address":5481636},"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":{"header_address":4763312,"warp_table_address":5480920},"MAP_MT_CHIMNEY":{"header_address":4764992,"warp_table_address":5488664},"MAP_MT_CHIMNEY_CABLE_CAR_STATION":{"header_address":4764460,"warp_table_address":5485144},"MAP_MT_PYRE_1F":{"header_address":4765076,"land_encounters":{"address":5606100,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489452},"MAP_MT_PYRE_2F":{"header_address":4765104,"land_encounters":{"address":5607796,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489712},"MAP_MT_PYRE_3F":{"header_address":4765132,"land_encounters":{"address":5607852,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489868},"MAP_MT_PYRE_4F":{"header_address":4765160,"land_encounters":{"address":5607908,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5489984},"MAP_MT_PYRE_5F":{"header_address":4765188,"land_encounters":{"address":5607964,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490100},"MAP_MT_PYRE_6F":{"header_address":4765216,"land_encounters":{"address":5608020,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490232},"MAP_MT_PYRE_EXTERIOR":{"header_address":4765244,"land_encounters":{"address":5608076,"slots":[377,377,377,377,37,37,37,37,309,309,309,309]},"warp_table_address":5490316},"MAP_MT_PYRE_SUMMIT":{"header_address":4765272,"land_encounters":{"address":5608132,"slots":[377,377,377,377,377,377,377,361,361,361,411,411]},"warp_table_address":5490656},"MAP_NAVEL_ROCK_B1F":{"header_address":4771320,"warp_table_address":5525524},"MAP_NAVEL_ROCK_BOTTOM":{"header_address":4771824,"warp_table_address":5526248},"MAP_NAVEL_ROCK_DOWN01":{"header_address":4771516,"warp_table_address":5525828},"MAP_NAVEL_ROCK_DOWN02":{"header_address":4771544,"warp_table_address":5525864},"MAP_NAVEL_ROCK_DOWN03":{"header_address":4771572,"warp_table_address":5525900},"MAP_NAVEL_ROCK_DOWN04":{"header_address":4771600,"warp_table_address":5525936},"MAP_NAVEL_ROCK_DOWN05":{"header_address":4771628,"warp_table_address":5525972},"MAP_NAVEL_ROCK_DOWN06":{"header_address":4771656,"warp_table_address":5526008},"MAP_NAVEL_ROCK_DOWN07":{"header_address":4771684,"warp_table_address":5526044},"MAP_NAVEL_ROCK_DOWN08":{"header_address":4771712,"warp_table_address":5526080},"MAP_NAVEL_ROCK_DOWN09":{"header_address":4771740,"warp_table_address":5526116},"MAP_NAVEL_ROCK_DOWN10":{"header_address":4771768,"warp_table_address":5526152},"MAP_NAVEL_ROCK_DOWN11":{"header_address":4771796,"warp_table_address":5526188},"MAP_NAVEL_ROCK_ENTRANCE":{"header_address":4771292,"warp_table_address":5525488},"MAP_NAVEL_ROCK_EXTERIOR":{"header_address":4771236,"warp_table_address":5525376},"MAP_NAVEL_ROCK_FORK":{"header_address":4771348,"warp_table_address":5525560},"MAP_NAVEL_ROCK_HARBOR":{"header_address":4771264,"warp_table_address":5525460},"MAP_NAVEL_ROCK_TOP":{"header_address":4771488,"warp_table_address":5525772},"MAP_NAVEL_ROCK_UP1":{"header_address":4771376,"warp_table_address":5525604},"MAP_NAVEL_ROCK_UP2":{"header_address":4771404,"warp_table_address":5525640},"MAP_NAVEL_ROCK_UP3":{"header_address":4771432,"warp_table_address":5525676},"MAP_NAVEL_ROCK_UP4":{"header_address":4771460,"warp_table_address":5525712},"MAP_NEW_MAUVILLE_ENTRANCE":{"header_address":4766112,"land_encounters":{"address":5610092,"slots":[100,81,100,81,100,81,100,81,100,81,100,81]},"warp_table_address":5495284},"MAP_NEW_MAUVILLE_INSIDE":{"header_address":4766140,"land_encounters":{"address":5607136,"slots":[100,81,100,81,100,81,100,81,100,81,101,82]},"warp_table_address":5495528},"MAP_OLDALE_TOWN":{"header_address":4758272,"warp_table_address":5434860},"MAP_OLDALE_TOWN_HOUSE1":{"header_address":4759728,"warp_table_address":5459276},"MAP_OLDALE_TOWN_HOUSE2":{"header_address":4759756,"warp_table_address":5459360},"MAP_OLDALE_TOWN_MART":{"header_address":4759840,"warp_table_address":5459748},"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":{"header_address":4759784,"warp_table_address":5459492},"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":{"header_address":4759812,"warp_table_address":5459632},"MAP_PACIFIDLOG_TOWN":{"fishing_encounters":{"address":5611816,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758412,"warp_table_address":5436288,"water_encounters":{"address":5611788,"slots":[72,309,309,310,310]}},"MAP_PACIFIDLOG_TOWN_HOUSE1":{"header_address":4760764,"warp_table_address":5464400},"MAP_PACIFIDLOG_TOWN_HOUSE2":{"header_address":4760792,"warp_table_address":5464508},"MAP_PACIFIDLOG_TOWN_HOUSE3":{"header_address":4760820,"warp_table_address":5464592},"MAP_PACIFIDLOG_TOWN_HOUSE4":{"header_address":4760848,"warp_table_address":5464700},"MAP_PACIFIDLOG_TOWN_HOUSE5":{"header_address":4760876,"warp_table_address":5464784},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":{"header_address":4760708,"warp_table_address":5464168},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":{"header_address":4760736,"warp_table_address":5464308},"MAP_PETALBURG_CITY":{"fishing_encounters":{"address":5611968,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4757992,"warp_table_address":5428704,"water_encounters":{"address":5611940,"slots":[183,183,183,183,183]}},"MAP_PETALBURG_CITY_GYM":{"header_address":4760932,"warp_table_address":5465168},"MAP_PETALBURG_CITY_HOUSE1":{"header_address":4760960,"warp_table_address":5465708},"MAP_PETALBURG_CITY_HOUSE2":{"header_address":4760988,"warp_table_address":5465792},"MAP_PETALBURG_CITY_MART":{"header_address":4761072,"warp_table_address":5466228},"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":{"header_address":4761016,"warp_table_address":5465948},"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":{"header_address":4761044,"warp_table_address":5466088},"MAP_PETALBURG_CITY_WALLYS_HOUSE":{"header_address":4760904,"warp_table_address":5464868},"MAP_PETALBURG_WOODS":{"header_address":4764964,"land_encounters":{"address":5605876,"slots":[286,290,306,286,291,293,290,306,304,364,304,364]},"warp_table_address":5487772},"MAP_RECORD_CORNER":{"header_address":4768408,"warp_table_address":5510036},"MAP_ROUTE101":{"header_address":4758440,"land_encounters":{"address":5604388,"slots":[290,286,290,290,286,286,290,286,288,288,288,288]},"warp_table_address":4160749568},"MAP_ROUTE102":{"fishing_encounters":{"address":5604528,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758468,"land_encounters":{"address":5604444,"slots":[286,290,286,290,295,295,288,288,288,392,288,298]},"warp_table_address":4160749568,"water_encounters":{"address":5604500,"slots":[183,183,183,183,118]}},"MAP_ROUTE103":{"fishing_encounters":{"address":5604660,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758496,"land_encounters":{"address":5604576,"slots":[286,286,286,286,309,288,288,288,309,309,309,309]},"warp_table_address":5437452,"water_encounters":{"address":5604632,"slots":[72,309,309,310,310]}},"MAP_ROUTE104":{"fishing_encounters":{"address":5604792,"slots":[129,129,129,129,129,129,129,129,129,129]},"header_address":4758524,"land_encounters":{"address":5604708,"slots":[286,290,286,183,183,286,304,304,309,309,309,309]},"warp_table_address":5438308,"water_encounters":{"address":5604764,"slots":[309,309,309,310,310]}},"MAP_ROUTE104_MR_BRINEYS_HOUSE":{"header_address":4764320,"warp_table_address":5484676},"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4764348,"warp_table_address":5484784},"MAP_ROUTE104_PROTOTYPE":{"header_address":4771880,"warp_table_address":4160749568},"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4771908,"warp_table_address":4160749568},"MAP_ROUTE105":{"fishing_encounters":{"address":5604868,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758552,"warp_table_address":5438720,"water_encounters":{"address":5604840,"slots":[72,309,309,310,310]}},"MAP_ROUTE106":{"fishing_encounters":{"address":5606728,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758580,"warp_table_address":5438892,"water_encounters":{"address":5606700,"slots":[72,309,309,310,310]}},"MAP_ROUTE107":{"fishing_encounters":{"address":5606804,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758608,"warp_table_address":4160749568,"water_encounters":{"address":5606776,"slots":[72,309,309,310,310]}},"MAP_ROUTE108":{"fishing_encounters":{"address":5606880,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758636,"warp_table_address":5439324,"water_encounters":{"address":5606852,"slots":[72,309,309,310,310]}},"MAP_ROUTE109":{"fishing_encounters":{"address":5606956,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758664,"warp_table_address":5439940,"water_encounters":{"address":5606928,"slots":[72,309,309,310,310]}},"MAP_ROUTE109_SEASHORE_HOUSE":{"header_address":4771936,"warp_table_address":5526472},"MAP_ROUTE110":{"fishing_encounters":{"address":5605000,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758692,"land_encounters":{"address":5604916,"slots":[286,337,367,337,354,43,354,367,309,309,353,353]},"warp_table_address":5440928,"water_encounters":{"address":5604972,"slots":[72,309,309,310,310]}},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":{"header_address":4772272,"warp_table_address":5529400},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":{"header_address":4772300,"warp_table_address":5529508},"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":{"header_address":4772020,"warp_table_address":5526740},"MAP_ROUTE110_TRICK_HOUSE_END":{"header_address":4771992,"warp_table_address":5526676},"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":{"header_address":4771964,"warp_table_address":5526532},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":{"header_address":4772048,"warp_table_address":5527152},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":{"header_address":4772076,"warp_table_address":5527328},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":{"header_address":4772104,"warp_table_address":5527616},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":{"header_address":4772132,"warp_table_address":5528072},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":{"header_address":4772160,"warp_table_address":5528248},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":{"header_address":4772188,"warp_table_address":5528752},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":{"header_address":4772216,"warp_table_address":5529024},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":{"header_address":4772244,"warp_table_address":5529320},"MAP_ROUTE111":{"fishing_encounters":{"address":5605160,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758720,"land_encounters":{"address":5605048,"slots":[27,332,27,332,318,318,27,332,318,344,344,344]},"rock_smash_encounters":{"address":5605132,"slots":[74,74,74,74,74]},"warp_table_address":5442448,"water_encounters":{"address":5605104,"slots":[183,183,183,183,118]}},"MAP_ROUTE111_OLD_LADYS_REST_STOP":{"header_address":4764404,"warp_table_address":5484976},"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":{"header_address":4764376,"warp_table_address":5484916},"MAP_ROUTE112":{"header_address":4758748,"land_encounters":{"address":5605208,"slots":[339,339,183,339,339,183,339,183,339,339,339,339]},"warp_table_address":5443604},"MAP_ROUTE112_CABLE_CAR_STATION":{"header_address":4764432,"warp_table_address":5485060},"MAP_ROUTE113":{"header_address":4758776,"land_encounters":{"address":5605264,"slots":[308,308,218,308,308,218,308,218,308,227,308,227]},"warp_table_address":5444092},"MAP_ROUTE113_GLASS_WORKSHOP":{"header_address":4772328,"warp_table_address":5529640},"MAP_ROUTE114":{"fishing_encounters":{"address":5605432,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758804,"land_encounters":{"address":5605320,"slots":[358,295,358,358,295,296,296,296,379,379,379,299]},"rock_smash_encounters":{"address":5605404,"slots":[74,74,74,74,74]},"warp_table_address":5445184,"water_encounters":{"address":5605376,"slots":[183,183,183,183,118]}},"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":{"header_address":4764488,"warp_table_address":5485204},"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":{"header_address":4764516,"warp_table_address":5485320},"MAP_ROUTE114_LANETTES_HOUSE":{"header_address":4764544,"warp_table_address":5485420},"MAP_ROUTE115":{"fishing_encounters":{"address":5607088,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758832,"land_encounters":{"address":5607004,"slots":[358,304,358,304,304,305,39,39,309,309,309,309]},"warp_table_address":5445988,"water_encounters":{"address":5607060,"slots":[72,309,309,310,310]}},"MAP_ROUTE116":{"header_address":4758860,"land_encounters":{"address":5605480,"slots":[286,370,301,63,301,304,304,304,286,286,315,315]},"warp_table_address":5446872},"MAP_ROUTE116_TUNNELERS_REST_HOUSE":{"header_address":4764572,"warp_table_address":5485564},"MAP_ROUTE117":{"fishing_encounters":{"address":5605620,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758888,"land_encounters":{"address":5605536,"slots":[286,43,286,43,183,43,387,387,387,387,386,298]},"warp_table_address":5447656,"water_encounters":{"address":5605592,"slots":[183,183,183,183,118]}},"MAP_ROUTE117_POKEMON_DAY_CARE":{"header_address":4764600,"warp_table_address":5485624},"MAP_ROUTE118":{"fishing_encounters":{"address":5605752,"slots":[129,72,129,72,330,331,330,330,330,330]},"header_address":4758916,"land_encounters":{"address":5605668,"slots":[288,337,288,337,289,338,309,309,309,309,309,317]},"warp_table_address":5448236,"water_encounters":{"address":5605724,"slots":[72,309,309,310,310]}},"MAP_ROUTE119":{"fishing_encounters":{"address":5607276,"slots":[129,72,129,72,330,330,330,330,330,330]},"header_address":4758944,"land_encounters":{"address":5607192,"slots":[288,289,288,43,289,43,43,43,369,369,369,317]},"warp_table_address":5449460,"water_encounters":{"address":5607248,"slots":[72,309,309,310,310]}},"MAP_ROUTE119_HOUSE":{"header_address":4772440,"warp_table_address":5530360},"MAP_ROUTE119_WEATHER_INSTITUTE_1F":{"header_address":4772384,"warp_table_address":5529880},"MAP_ROUTE119_WEATHER_INSTITUTE_2F":{"header_address":4772412,"warp_table_address":5530164},"MAP_ROUTE120":{"fishing_encounters":{"address":5607408,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758972,"land_encounters":{"address":5607324,"slots":[286,287,287,43,183,43,43,183,376,376,317,298]},"warp_table_address":5451160,"water_encounters":{"address":5607380,"slots":[183,183,183,183,118]}},"MAP_ROUTE121":{"fishing_encounters":{"address":5607540,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759000,"land_encounters":{"address":5607456,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5452364,"water_encounters":{"address":5607512,"slots":[72,309,309,310,310]}},"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":{"header_address":4764628,"warp_table_address":5485732},"MAP_ROUTE122":{"fishing_encounters":{"address":5607616,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759028,"warp_table_address":5452576,"water_encounters":{"address":5607588,"slots":[72,309,309,310,310]}},"MAP_ROUTE123":{"fishing_encounters":{"address":5607748,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759056,"land_encounters":{"address":5607664,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5453636,"water_encounters":{"address":5607720,"slots":[72,309,309,310,310]}},"MAP_ROUTE123_BERRY_MASTERS_HOUSE":{"header_address":4772356,"warp_table_address":5529724},"MAP_ROUTE124":{"fishing_encounters":{"address":5605828,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759084,"warp_table_address":5454436,"water_encounters":{"address":5605800,"slots":[72,309,309,310,310]}},"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":{"header_address":4772468,"warp_table_address":5530420},"MAP_ROUTE125":{"fishing_encounters":{"address":5608272,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759112,"warp_table_address":5454716,"water_encounters":{"address":5608244,"slots":[72,309,309,310,310]}},"MAP_ROUTE126":{"fishing_encounters":{"address":5608348,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759140,"warp_table_address":4160749568,"water_encounters":{"address":5608320,"slots":[72,309,309,310,310]}},"MAP_ROUTE127":{"fishing_encounters":{"address":5608424,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759168,"warp_table_address":4160749568,"water_encounters":{"address":5608396,"slots":[72,309,309,310,310]}},"MAP_ROUTE128":{"fishing_encounters":{"address":5608500,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4759196,"warp_table_address":4160749568,"water_encounters":{"address":5608472,"slots":[72,309,309,310,310]}},"MAP_ROUTE129":{"fishing_encounters":{"address":5608576,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759224,"warp_table_address":4160749568,"water_encounters":{"address":5608548,"slots":[72,309,309,310,314]}},"MAP_ROUTE130":{"fishing_encounters":{"address":5608708,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759252,"land_encounters":{"address":5608624,"slots":[360,360,360,360,360,360,360,360,360,360,360,360]},"warp_table_address":4160749568,"water_encounters":{"address":5608680,"slots":[72,309,309,310,310]}},"MAP_ROUTE131":{"fishing_encounters":{"address":5608784,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759280,"warp_table_address":5456116,"water_encounters":{"address":5608756,"slots":[72,309,309,310,310]}},"MAP_ROUTE132":{"fishing_encounters":{"address":5608860,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759308,"warp_table_address":4160749568,"water_encounters":{"address":5608832,"slots":[72,309,309,310,310]}},"MAP_ROUTE133":{"fishing_encounters":{"address":5608936,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759336,"warp_table_address":4160749568,"water_encounters":{"address":5608908,"slots":[72,309,309,310,310]}},"MAP_ROUTE134":{"fishing_encounters":{"address":5609012,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759364,"warp_table_address":4160749568,"water_encounters":{"address":5608984,"slots":[72,309,309,310,310]}},"MAP_RUSTBORO_CITY":{"header_address":4758076,"warp_table_address":5430936},"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":{"header_address":4762024,"warp_table_address":5472204},"MAP_RUSTBORO_CITY_DEVON_CORP_1F":{"header_address":4761716,"warp_table_address":5470532},"MAP_RUSTBORO_CITY_DEVON_CORP_2F":{"header_address":4761744,"warp_table_address":5470744},"MAP_RUSTBORO_CITY_DEVON_CORP_3F":{"header_address":4761772,"warp_table_address":5470852},"MAP_RUSTBORO_CITY_FLAT1_1F":{"header_address":4761940,"warp_table_address":5471808},"MAP_RUSTBORO_CITY_FLAT1_2F":{"header_address":4761968,"warp_table_address":5472044},"MAP_RUSTBORO_CITY_FLAT2_1F":{"header_address":4762080,"warp_table_address":5472372},"MAP_RUSTBORO_CITY_FLAT2_2F":{"header_address":4762108,"warp_table_address":5472464},"MAP_RUSTBORO_CITY_FLAT2_3F":{"header_address":4762136,"warp_table_address":5472548},"MAP_RUSTBORO_CITY_GYM":{"header_address":4761800,"warp_table_address":5471024},"MAP_RUSTBORO_CITY_HOUSE1":{"header_address":4761996,"warp_table_address":5472120},"MAP_RUSTBORO_CITY_HOUSE2":{"header_address":4762052,"warp_table_address":5472288},"MAP_RUSTBORO_CITY_HOUSE3":{"header_address":4762164,"warp_table_address":5472648},"MAP_RUSTBORO_CITY_MART":{"header_address":4761912,"warp_table_address":5471724},"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":{"header_address":4761856,"warp_table_address":5471444},"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":{"header_address":4761884,"warp_table_address":5471584},"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":{"header_address":4761828,"warp_table_address":5471252},"MAP_RUSTURF_TUNNEL":{"header_address":4764768,"land_encounters":{"address":5605932,"slots":[370,370,370,370,370,370,370,370,370,370,370,370]},"warp_table_address":5486644},"MAP_SAFARI_ZONE_NORTH":{"header_address":4769416,"land_encounters":{"address":5610280,"slots":[231,43,231,43,177,44,44,177,178,214,178,214]},"rock_smash_encounters":{"address":5610336,"slots":[74,74,74,74,74]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHEAST":{"header_address":4769724,"land_encounters":{"address":5612476,"slots":[190,216,190,216,191,165,163,204,228,241,228,241]},"rock_smash_encounters":{"address":5612532,"slots":[213,213,213,213,213]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHWEST":{"fishing_encounters":{"address":5610448,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769388,"land_encounters":{"address":5610364,"slots":[111,43,111,43,84,44,44,84,85,127,85,127]},"warp_table_address":4160749568,"water_encounters":{"address":5610420,"slots":[54,54,54,55,55]}},"MAP_SAFARI_ZONE_REST_HOUSE":{"header_address":4769696,"warp_table_address":5516996},"MAP_SAFARI_ZONE_SOUTH":{"header_address":4769472,"land_encounters":{"address":5606212,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515444},"MAP_SAFARI_ZONE_SOUTHEAST":{"fishing_encounters":{"address":5612428,"slots":[129,118,129,118,223,118,223,223,223,224]},"header_address":4769752,"land_encounters":{"address":5612344,"slots":[191,179,191,179,190,167,163,209,234,207,234,207]},"warp_table_address":4160749568,"water_encounters":{"address":5612400,"slots":[194,183,183,183,195]}},"MAP_SAFARI_ZONE_SOUTHWEST":{"fishing_encounters":{"address":5610232,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769444,"land_encounters":{"address":5610148,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515260,"water_encounters":{"address":5610204,"slots":[54,54,54,54,54]}},"MAP_SCORCHED_SLAB":{"header_address":4766700,"warp_table_address":5498144},"MAP_SEAFLOOR_CAVERN_ENTRANCE":{"fishing_encounters":{"address":5609764,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765412,"warp_table_address":5491796,"water_encounters":{"address":5609736,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM1":{"header_address":4765440,"land_encounters":{"address":5609136,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5491952},"MAP_SEAFLOOR_CAVERN_ROOM2":{"header_address":4765468,"land_encounters":{"address":5609192,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492188},"MAP_SEAFLOOR_CAVERN_ROOM3":{"header_address":4765496,"land_encounters":{"address":5609248,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492456},"MAP_SEAFLOOR_CAVERN_ROOM4":{"header_address":4765524,"land_encounters":{"address":5609304,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492548},"MAP_SEAFLOOR_CAVERN_ROOM5":{"header_address":4765552,"land_encounters":{"address":5609360,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492744},"MAP_SEAFLOOR_CAVERN_ROOM6":{"fishing_encounters":{"address":5609500,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765580,"land_encounters":{"address":5609416,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492788,"water_encounters":{"address":5609472,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM7":{"fishing_encounters":{"address":5609632,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765608,"land_encounters":{"address":5609548,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492832,"water_encounters":{"address":5609604,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM8":{"header_address":4765636,"land_encounters":{"address":5609680,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493156},"MAP_SEAFLOOR_CAVERN_ROOM9":{"header_address":4765664,"warp_table_address":5493360},"MAP_SEALED_CHAMBER_INNER_ROOM":{"header_address":4766672,"warp_table_address":5497984},"MAP_SEALED_CHAMBER_OUTER_ROOM":{"header_address":4766644,"warp_table_address":5497608},"MAP_SECRET_BASE_BLUE_CAVE1":{"header_address":4767736,"warp_table_address":5501652},"MAP_SECRET_BASE_BLUE_CAVE2":{"header_address":4767904,"warp_table_address":5503980},"MAP_SECRET_BASE_BLUE_CAVE3":{"header_address":4768072,"warp_table_address":5506308},"MAP_SECRET_BASE_BLUE_CAVE4":{"header_address":4768240,"warp_table_address":5508636},"MAP_SECRET_BASE_BROWN_CAVE1":{"header_address":4767708,"warp_table_address":5501264},"MAP_SECRET_BASE_BROWN_CAVE2":{"header_address":4767876,"warp_table_address":5503592},"MAP_SECRET_BASE_BROWN_CAVE3":{"header_address":4768044,"warp_table_address":5505920},"MAP_SECRET_BASE_BROWN_CAVE4":{"header_address":4768212,"warp_table_address":5508248},"MAP_SECRET_BASE_RED_CAVE1":{"header_address":4767680,"warp_table_address":5500876},"MAP_SECRET_BASE_RED_CAVE2":{"header_address":4767848,"warp_table_address":5503204},"MAP_SECRET_BASE_RED_CAVE3":{"header_address":4768016,"warp_table_address":5505532},"MAP_SECRET_BASE_RED_CAVE4":{"header_address":4768184,"warp_table_address":5507860},"MAP_SECRET_BASE_SHRUB1":{"header_address":4767820,"warp_table_address":5502816},"MAP_SECRET_BASE_SHRUB2":{"header_address":4767988,"warp_table_address":5505144},"MAP_SECRET_BASE_SHRUB3":{"header_address":4768156,"warp_table_address":5507472},"MAP_SECRET_BASE_SHRUB4":{"header_address":4768324,"warp_table_address":5509800},"MAP_SECRET_BASE_TREE1":{"header_address":4767792,"warp_table_address":5502428},"MAP_SECRET_BASE_TREE2":{"header_address":4767960,"warp_table_address":5504756},"MAP_SECRET_BASE_TREE3":{"header_address":4768128,"warp_table_address":5507084},"MAP_SECRET_BASE_TREE4":{"header_address":4768296,"warp_table_address":5509412},"MAP_SECRET_BASE_YELLOW_CAVE1":{"header_address":4767764,"warp_table_address":5502040},"MAP_SECRET_BASE_YELLOW_CAVE2":{"header_address":4767932,"warp_table_address":5504368},"MAP_SECRET_BASE_YELLOW_CAVE3":{"header_address":4768100,"warp_table_address":5506696},"MAP_SECRET_BASE_YELLOW_CAVE4":{"header_address":4768268,"warp_table_address":5509024},"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":{"header_address":4766056,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":{"header_address":4766084,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":{"fishing_encounters":{"address":5611436,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765944,"land_encounters":{"address":5611352,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494828,"water_encounters":{"address":5611408,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":{"header_address":4766980,"land_encounters":{"address":5612044,"slots":[41,341,41,341,41,341,346,341,42,346,42,346]},"warp_table_address":5498544},"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":{"fishing_encounters":{"address":5611304,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765972,"land_encounters":{"address":5611220,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494904,"water_encounters":{"address":5611276,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":{"header_address":4766028,"land_encounters":{"address":5611164,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495180},"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":{"header_address":4766000,"land_encounters":{"address":5611108,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495084},"MAP_SKY_PILLAR_1F":{"header_address":4766868,"land_encounters":{"address":5612100,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498328},"MAP_SKY_PILLAR_2F":{"header_address":4766896,"warp_table_address":5498372},"MAP_SKY_PILLAR_3F":{"header_address":4766924,"land_encounters":{"address":5612232,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498408},"MAP_SKY_PILLAR_4F":{"header_address":4766952,"warp_table_address":5498452},"MAP_SKY_PILLAR_5F":{"header_address":4767008,"land_encounters":{"address":5612288,"slots":[322,42,42,322,319,378,378,319,319,359,359,359]},"warp_table_address":5498572},"MAP_SKY_PILLAR_ENTRANCE":{"header_address":4766812,"warp_table_address":5498232},"MAP_SKY_PILLAR_OUTSIDE":{"header_address":4766840,"warp_table_address":5498292},"MAP_SKY_PILLAR_TOP":{"header_address":4767036,"warp_table_address":5498656},"MAP_SLATEPORT_CITY":{"fishing_encounters":{"address":5611664,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758020,"warp_table_address":5429836,"water_encounters":{"address":5611636,"slots":[72,309,309,310,310]}},"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":{"header_address":4761212,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":{"header_address":4761184,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":{"header_address":4761156,"warp_table_address":5466624},"MAP_SLATEPORT_CITY_HARBOR":{"header_address":4761352,"warp_table_address":5468328},"MAP_SLATEPORT_CITY_HOUSE":{"header_address":4761380,"warp_table_address":5468492},"MAP_SLATEPORT_CITY_MART":{"header_address":4761464,"warp_table_address":5468856},"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":{"header_address":4761240,"warp_table_address":5466832},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":{"header_address":4761296,"warp_table_address":5467456},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":{"header_address":4761324,"warp_table_address":5467856},"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":{"header_address":4761408,"warp_table_address":5468600},"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":{"header_address":4761436,"warp_table_address":5468740},"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":{"header_address":4761268,"warp_table_address":5467084},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":{"header_address":4761100,"warp_table_address":5466360},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":{"header_address":4761128,"warp_table_address":5466476},"MAP_SOOTOPOLIS_CITY":{"fishing_encounters":{"address":5612184,"slots":[129,72,129,129,129,129,129,130,130,130]},"header_address":4758188,"warp_table_address":5433852,"water_encounters":{"address":5612156,"slots":[129,129,129,129,129]}},"MAP_SOOTOPOLIS_CITY_GYM_1F":{"header_address":4763480,"warp_table_address":5481892},"MAP_SOOTOPOLIS_CITY_GYM_B1F":{"header_address":4763508,"warp_table_address":5482200},"MAP_SOOTOPOLIS_CITY_HOUSE1":{"header_address":4763620,"warp_table_address":5482664},"MAP_SOOTOPOLIS_CITY_HOUSE2":{"header_address":4763648,"warp_table_address":5482724},"MAP_SOOTOPOLIS_CITY_HOUSE3":{"header_address":4763676,"warp_table_address":5482808},"MAP_SOOTOPOLIS_CITY_HOUSE4":{"header_address":4763704,"warp_table_address":5482916},"MAP_SOOTOPOLIS_CITY_HOUSE5":{"header_address":4763732,"warp_table_address":5483000},"MAP_SOOTOPOLIS_CITY_HOUSE6":{"header_address":4763760,"warp_table_address":5483060},"MAP_SOOTOPOLIS_CITY_HOUSE7":{"header_address":4763788,"warp_table_address":5483144},"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":{"header_address":4763816,"warp_table_address":5483228},"MAP_SOOTOPOLIS_CITY_MART":{"header_address":4763592,"warp_table_address":5482580},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":{"header_address":4763844,"warp_table_address":5483312},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":{"header_address":4763872,"warp_table_address":5483380},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":{"header_address":4763536,"warp_table_address":5482324},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":{"header_address":4763564,"warp_table_address":5482464},"MAP_SOUTHERN_ISLAND_EXTERIOR":{"header_address":4769640,"warp_table_address":5516780},"MAP_SOUTHERN_ISLAND_INTERIOR":{"header_address":4769668,"warp_table_address":5516876},"MAP_SS_TIDAL_CORRIDOR":{"header_address":4768828,"warp_table_address":5510992},"MAP_SS_TIDAL_LOWER_DECK":{"header_address":4768856,"warp_table_address":5511276},"MAP_SS_TIDAL_ROOMS":{"header_address":4768884,"warp_table_address":5511508},"MAP_TERRA_CAVE_END":{"header_address":4767596,"warp_table_address":5500392},"MAP_TERRA_CAVE_ENTRANCE":{"header_address":4767568,"warp_table_address":5500332},"MAP_TRADE_CENTER":{"header_address":4768380,"warp_table_address":5509944},"MAP_TRAINER_HILL_1F":{"header_address":4771096,"warp_table_address":5525172},"MAP_TRAINER_HILL_2F":{"header_address":4771124,"warp_table_address":5525208},"MAP_TRAINER_HILL_3F":{"header_address":4771152,"warp_table_address":5525244},"MAP_TRAINER_HILL_4F":{"header_address":4771180,"warp_table_address":5525280},"MAP_TRAINER_HILL_ELEVATOR":{"header_address":4771852,"warp_table_address":5526300},"MAP_TRAINER_HILL_ENTRANCE":{"header_address":4771068,"warp_table_address":5525100},"MAP_TRAINER_HILL_ROOF":{"header_address":4771208,"warp_table_address":5525340},"MAP_UNDERWATER_MARINE_CAVE":{"header_address":4767484,"warp_table_address":5500208},"MAP_UNDERWATER_ROUTE105":{"header_address":4759532,"warp_table_address":5457348},"MAP_UNDERWATER_ROUTE124":{"header_address":4759392,"warp_table_address":4160749568,"water_encounters":{"address":5612016,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE125":{"header_address":4759560,"warp_table_address":5457384},"MAP_UNDERWATER_ROUTE126":{"header_address":4759420,"warp_table_address":5457052,"water_encounters":{"address":5606268,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE127":{"header_address":4759448,"warp_table_address":5457176},"MAP_UNDERWATER_ROUTE128":{"header_address":4759476,"warp_table_address":5457260},"MAP_UNDERWATER_ROUTE129":{"header_address":4759504,"warp_table_address":5457312},"MAP_UNDERWATER_ROUTE134":{"header_address":4766588,"warp_table_address":5497540},"MAP_UNDERWATER_SEAFLOOR_CAVERN":{"header_address":4765384,"warp_table_address":5491744},"MAP_UNDERWATER_SEALED_CHAMBER":{"header_address":4766616,"warp_table_address":5497568},"MAP_UNDERWATER_SOOTOPOLIS_CITY":{"header_address":4764796,"warp_table_address":5486768},"MAP_UNION_ROOM":{"header_address":4769360,"warp_table_address":5514872},"MAP_UNUSED_CONTEST_HALL1":{"header_address":4768492,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL2":{"header_address":4768520,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL3":{"header_address":4768548,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL4":{"header_address":4768576,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL5":{"header_address":4768604,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL6":{"header_address":4768632,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN":{"header_address":4758384,"warp_table_address":5436044},"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760512,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760484,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760456,"warp_table_address":5463128},"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":{"header_address":4760652,"warp_table_address":5463928},"MAP_VERDANTURF_TOWN_HOUSE":{"header_address":4760680,"warp_table_address":5464012},"MAP_VERDANTURF_TOWN_MART":{"header_address":4760540,"warp_table_address":5463408},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":{"header_address":4760568,"warp_table_address":5463540},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":{"header_address":4760596,"warp_table_address":5463680},"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":{"header_address":4760624,"warp_table_address":5463844},"MAP_VICTORY_ROAD_1F":{"header_address":4765860,"land_encounters":{"address":5606156,"slots":[42,336,383,371,41,335,42,336,382,370,382,370]},"warp_table_address":5493852},"MAP_VICTORY_ROAD_B1F":{"header_address":4765888,"land_encounters":{"address":5610496,"slots":[42,336,383,383,42,336,42,336,383,355,383,355]},"rock_smash_encounters":{"address":5610552,"slots":[75,74,75,75,75]},"warp_table_address":5494460},"MAP_VICTORY_ROAD_B2F":{"fishing_encounters":{"address":5610664,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4765916,"land_encounters":{"address":5610580,"slots":[42,322,383,383,42,322,42,322,383,355,383,355]},"warp_table_address":5494704,"water_encounters":{"address":5610636,"slots":[42,42,42,42,42]}}},"misc_pokemon":[{"address":2572358,"species":385},{"address":2018148,"species":360},{"address":2323175,"species":101},{"address":2323252,"species":101},{"address":2581669,"species":317},{"address":2581574,"species":317},{"address":2581688,"species":317},{"address":2581593,"species":317},{"address":2581612,"species":317},{"address":2581631,"species":317},{"address":2581650,"species":317},{"address":2065036,"species":317},{"address":2386223,"species":185},{"address":2339323,"species":100},{"address":2339400,"species":100},{"address":2339477,"species":100}],"misc_ram_addresses":{"CB2_Overworld":134768624,"gArchipelagoDeathLinkQueued":33804824,"gArchipelagoReceivedItem":33804776,"gMain":50340544,"gPlayerParty":33703196,"gSaveBlock1Ptr":50355596,"gSaveBlock2Ptr":50355600},"misc_rom_addresses":{"gArchipelagoInfo":5912960,"gArchipelagoItemNames":5896457,"gArchipelagoNameTable":5905457,"gArchipelagoOptions":5895556,"gArchipelagoPlayerNames":5895607,"gBattleMoves":3281380,"gEvolutionTable":3318404,"gLevelUpLearnsets":3334884,"gRandomizedBerryTreeItems":5843560,"gRandomizedSoundTable":10155508,"gSpeciesInfo":3296744,"gTMHMLearnsets":3289780,"gTrainers":3230072,"gTutorMoves":6428060,"sFanfares":5422580,"sNewGamePCItems":6210444,"sStarterMon":6021752,"sTMHMMoves":6432208,"sTutorLearnsets":6428120},"species":[{"abilities":[0,0],"address":3296744,"base_stats":[0,0,0,0,0,0],"catch_rate":0,"evolutions":[],"friendship":0,"id":0,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3296772,"base_stats":[45,49,49,45,65,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":2}],"friendship":70,"id":1,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296800,"base_stats":[60,62,63,60,80,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":3}],"friendship":70,"id":2,"learnset":{"address":3308308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":38,"move_id":74},{"level":47,"move_id":235},{"level":56,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296828,"base_stats":[80,82,83,80,100,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":3,"learnset":{"address":3308338,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":1,"move_id":22},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":41,"move_id":74},{"level":53,"move_id":235},{"level":65,"move_id":76}]},"tmhm_learnset":"00E41E0886354730","types":[12,3]},{"abilities":[66,0],"address":3296856,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":5}],"friendship":70,"id":4,"learnset":{"address":3308368,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":19,"move_id":99},{"level":25,"move_id":184},{"level":31,"move_id":53},{"level":37,"move_id":163},{"level":43,"move_id":82},{"level":49,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296884,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":6}],"friendship":70,"id":5,"learnset":{"address":3308394,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":41,"move_id":163},{"level":48,"move_id":82},{"level":55,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296912,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":6,"learnset":{"address":3308420,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":1,"move_id":108},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":36,"move_id":17},{"level":44,"move_id":163},{"level":54,"move_id":82},{"level":64,"move_id":83}]},"tmhm_learnset":"00AE5EA4CE514633","types":[10,2]},{"abilities":[67,0],"address":3296940,"base_stats":[44,48,65,43,50,64],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":8}],"friendship":70,"id":7,"learnset":{"address":3308448,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":18,"move_id":44},{"level":23,"move_id":229},{"level":28,"move_id":182},{"level":33,"move_id":240},{"level":40,"move_id":130},{"level":47,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296968,"base_stats":[59,63,80,58,65,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":9}],"friendship":70,"id":8,"learnset":{"address":3308478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":37,"move_id":240},{"level":45,"move_id":130},{"level":53,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296996,"base_stats":[79,83,100,78,85,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":9,"learnset":{"address":3308508,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":1,"move_id":110},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":42,"move_id":240},{"level":55,"move_id":130},{"level":68,"move_id":56}]},"tmhm_learnset":"03B01E00CE537275","types":[11,11]},{"abilities":[19,0],"address":3297024,"base_stats":[45,30,35,45,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":11}],"friendship":70,"id":10,"learnset":{"address":3308538,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3297052,"base_stats":[50,20,55,30,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":12}],"friendship":70,"id":11,"learnset":{"address":3308548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[14,0],"address":3297080,"base_stats":[60,45,50,70,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":12,"learnset":{"address":3308560,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":77},{"level":14,"move_id":78},{"level":15,"move_id":79},{"level":18,"move_id":48},{"level":23,"move_id":18},{"level":28,"move_id":16},{"level":34,"move_id":60},{"level":40,"move_id":219},{"level":47,"move_id":318}]},"tmhm_learnset":"0040BE80B43F4620","types":[6,2]},{"abilities":[19,0],"address":3297108,"base_stats":[40,35,30,50,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":14}],"friendship":70,"id":13,"learnset":{"address":3308590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[61,0],"address":3297136,"base_stats":[45,25,50,35,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":15}],"friendship":70,"id":14,"learnset":{"address":3308600,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[68,0],"address":3297164,"base_stats":[65,80,40,75,45,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":15,"learnset":{"address":3308612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":31},{"level":10,"move_id":31},{"level":15,"move_id":116},{"level":20,"move_id":41},{"level":25,"move_id":99},{"level":30,"move_id":228},{"level":35,"move_id":42},{"level":40,"move_id":97},{"level":45,"move_id":283}]},"tmhm_learnset":"00843E88C4354620","types":[6,3]},{"abilities":[51,0],"address":3297192,"base_stats":[40,45,40,56,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":17}],"friendship":70,"id":16,"learnset":{"address":3308638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":19,"move_id":18},{"level":25,"move_id":17},{"level":31,"move_id":297},{"level":39,"move_id":97},{"level":47,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297220,"base_stats":[63,60,55,71,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":18}],"friendship":70,"id":17,"learnset":{"address":3308664,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":43,"move_id":97},{"level":52,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297248,"base_stats":[83,80,75,91,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":18,"learnset":{"address":3308690,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":1,"move_id":98},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":48,"move_id":97},{"level":62,"move_id":119}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[50,62],"address":3297276,"base_stats":[30,56,35,72,25,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":20}],"friendship":70,"id":19,"learnset":{"address":3308716,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":116},{"level":27,"move_id":228},{"level":34,"move_id":162},{"level":41,"move_id":283}]},"tmhm_learnset":"00843E02ADD33E20","types":[0,0]},{"abilities":[50,62],"address":3297304,"base_stats":[55,81,60,97,50,70],"catch_rate":127,"evolutions":[],"friendship":70,"id":20,"learnset":{"address":3308738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":184},{"level":30,"move_id":228},{"level":40,"move_id":162},{"level":50,"move_id":283}]},"tmhm_learnset":"00A43E02ADD37E30","types":[0,0]},{"abilities":[51,0],"address":3297332,"base_stats":[40,60,30,70,31,31],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":22}],"friendship":70,"id":21,"learnset":{"address":3308760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":19,"move_id":228},{"level":25,"move_id":332},{"level":31,"move_id":119},{"level":37,"move_id":65},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297360,"base_stats":[65,90,65,100,61,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":22,"learnset":{"address":3308784,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":43},{"level":1,"move_id":31},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":26,"move_id":228},{"level":32,"move_id":119},{"level":40,"move_id":65},{"level":47,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[22,61],"address":3297388,"base_stats":[35,60,44,55,40,54],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":24}],"friendship":70,"id":23,"learnset":{"address":3308806,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":25,"move_id":103},{"level":32,"move_id":51},{"level":37,"move_id":254},{"level":37,"move_id":256},{"level":37,"move_id":255},{"level":44,"move_id":114}]},"tmhm_learnset":"00213F088E570620","types":[3,3]},{"abilities":[22,61],"address":3297416,"base_stats":[60,85,69,80,65,79],"catch_rate":90,"evolutions":[],"friendship":70,"id":24,"learnset":{"address":3308834,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":40},{"level":1,"move_id":44},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":28,"move_id":103},{"level":38,"move_id":51},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255},{"level":56,"move_id":114}]},"tmhm_learnset":"00213F088E574620","types":[3,3]},{"abilities":[9,0],"address":3297444,"base_stats":[35,55,30,90,50,40],"catch_rate":190,"evolutions":[{"method":"ITEM","param":96,"species":26}],"friendship":70,"id":25,"learnset":{"address":3308862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":45},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":98},{"level":15,"move_id":104},{"level":20,"move_id":21},{"level":26,"move_id":85},{"level":33,"move_id":97},{"level":41,"move_id":87},{"level":50,"move_id":113}]},"tmhm_learnset":"00E01E02CDD38221","types":[13,13]},{"abilities":[9,0],"address":3297472,"base_stats":[60,90,55,100,90,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":26,"learnset":{"address":3308890,"moves":[{"level":1,"move_id":84},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":1,"move_id":85}]},"tmhm_learnset":"00E03E02CDD3C221","types":[13,13]},{"abilities":[8,0],"address":3297500,"base_stats":[50,75,85,40,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":28}],"friendship":70,"id":27,"learnset":{"address":3308900,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":23,"move_id":163},{"level":30,"move_id":129},{"level":37,"move_id":154},{"level":45,"move_id":328},{"level":53,"move_id":201}]},"tmhm_learnset":"00A43ED0CE510621","types":[4,4]},{"abilities":[8,0],"address":3297528,"base_stats":[75,100,110,65,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":28,"learnset":{"address":3308926,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":28},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":24,"move_id":163},{"level":33,"move_id":129},{"level":42,"move_id":154},{"level":52,"move_id":328},{"level":62,"move_id":201}]},"tmhm_learnset":"00A43ED0CE514621","types":[4,4]},{"abilities":[38,0],"address":3297556,"base_stats":[55,47,52,41,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":30}],"friendship":70,"id":29,"learnset":{"address":3308952,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":44},{"level":23,"move_id":270},{"level":30,"move_id":154},{"level":38,"move_id":260},{"level":47,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297584,"base_stats":[70,62,67,56,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":31}],"friendship":70,"id":30,"learnset":{"address":3308978,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":44},{"level":26,"move_id":270},{"level":34,"move_id":154},{"level":43,"move_id":260},{"level":53,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297612,"base_stats":[90,82,87,76,75,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":31,"learnset":{"address":3309004,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":34}]},"tmhm_learnset":"00B43FFEEFD37E35","types":[3,4]},{"abilities":[38,0],"address":3297640,"base_stats":[46,57,40,50,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":33}],"friendship":70,"id":32,"learnset":{"address":3309016,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":30},{"level":23,"move_id":270},{"level":30,"move_id":31},{"level":38,"move_id":260},{"level":47,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297668,"base_stats":[61,72,57,65,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":34}],"friendship":70,"id":33,"learnset":{"address":3309042,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":30},{"level":26,"move_id":270},{"level":34,"move_id":31},{"level":43,"move_id":260},{"level":53,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297696,"base_stats":[81,92,77,85,85,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":34,"learnset":{"address":3309068,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":116},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":37}]},"tmhm_learnset":"00B43F7EEFD37E35","types":[3,4]},{"abilities":[56,0],"address":3297724,"base_stats":[70,45,48,35,60,65],"catch_rate":150,"evolutions":[{"method":"ITEM","param":94,"species":36}],"friendship":140,"id":35,"learnset":{"address":3309080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":227},{"level":9,"move_id":47},{"level":13,"move_id":3},{"level":17,"move_id":266},{"level":21,"move_id":107},{"level":25,"move_id":111},{"level":29,"move_id":118},{"level":33,"move_id":322},{"level":37,"move_id":236},{"level":41,"move_id":113},{"level":45,"move_id":309}]},"tmhm_learnset":"00611E27FDFBB62D","types":[0,0]},{"abilities":[56,0],"address":3297752,"base_stats":[95,70,73,60,85,90],"catch_rate":25,"evolutions":[],"friendship":140,"id":36,"learnset":{"address":3309112,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":3},{"level":1,"move_id":107},{"level":1,"move_id":118}]},"tmhm_learnset":"00611E27FDFBF62D","types":[0,0]},{"abilities":[18,0],"address":3297780,"base_stats":[38,41,40,65,50,65],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":38}],"friendship":70,"id":37,"learnset":{"address":3309122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":5,"move_id":39},{"level":9,"move_id":46},{"level":13,"move_id":98},{"level":17,"move_id":261},{"level":21,"move_id":109},{"level":25,"move_id":286},{"level":29,"move_id":53},{"level":33,"move_id":219},{"level":37,"move_id":288},{"level":41,"move_id":83}]},"tmhm_learnset":"00021E248C590630","types":[10,10]},{"abilities":[18,0],"address":3297808,"base_stats":[73,76,75,100,81,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":38,"learnset":{"address":3309152,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":98},{"level":1,"move_id":109},{"level":1,"move_id":219},{"level":45,"move_id":83}]},"tmhm_learnset":"00021E248C594630","types":[10,10]},{"abilities":[56,0],"address":3297836,"base_stats":[115,45,20,20,45,25],"catch_rate":170,"evolutions":[{"method":"ITEM","param":94,"species":40}],"friendship":70,"id":39,"learnset":{"address":3309164,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":50},{"level":19,"move_id":205},{"level":24,"move_id":3},{"level":29,"move_id":156},{"level":34,"move_id":34},{"level":39,"move_id":102},{"level":44,"move_id":304},{"level":49,"move_id":38}]},"tmhm_learnset":"00611E27FDBBB625","types":[0,0]},{"abilities":[56,0],"address":3297864,"base_stats":[140,70,45,45,75,50],"catch_rate":50,"evolutions":[],"friendship":70,"id":40,"learnset":{"address":3309194,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":50},{"level":1,"move_id":111},{"level":1,"move_id":3}]},"tmhm_learnset":"00611E27FDBBF625","types":[0,0]},{"abilities":[39,0],"address":3297892,"base_stats":[40,45,35,55,30,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":42}],"friendship":70,"id":41,"learnset":{"address":3309204,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":141},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":26,"move_id":109},{"level":31,"move_id":314},{"level":36,"move_id":212},{"level":41,"move_id":305},{"level":46,"move_id":114}]},"tmhm_learnset":"00017F88A4170E20","types":[3,2]},{"abilities":[39,0],"address":3297920,"base_stats":[75,80,70,90,65,75],"catch_rate":90,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":169}],"friendship":70,"id":42,"learnset":{"address":3309232,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00017F88A4174E20","types":[3,2]},{"abilities":[34,0],"address":3297948,"base_stats":[45,50,55,30,75,65],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":44}],"friendship":70,"id":43,"learnset":{"address":3309260,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":23,"move_id":51},{"level":32,"move_id":236},{"level":39,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3297976,"base_stats":[60,65,70,40,85,75],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":45},{"method":"ITEM","param":93,"species":182}],"friendship":70,"id":44,"learnset":{"address":3309284,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":77},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":24,"move_id":51},{"level":35,"move_id":236},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298004,"base_stats":[75,80,85,50,100,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":45,"learnset":{"address":3309308,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":312},{"level":1,"move_id":78},{"level":1,"move_id":72},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884354720","types":[12,3]},{"abilities":[27,0],"address":3298032,"base_stats":[35,70,55,25,45,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":24,"species":47}],"friendship":70,"id":46,"learnset":{"address":3309320,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":25,"move_id":147},{"level":31,"move_id":163},{"level":37,"move_id":74},{"level":43,"move_id":202},{"level":49,"move_id":312}]},"tmhm_learnset":"00C43E888C350720","types":[6,12]},{"abilities":[27,0],"address":3298060,"base_stats":[60,95,80,30,60,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":47,"learnset":{"address":3309346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":78},{"level":1,"move_id":77},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":27,"move_id":147},{"level":35,"move_id":163},{"level":43,"move_id":74},{"level":51,"move_id":202},{"level":59,"move_id":312}]},"tmhm_learnset":"00C43E888C354720","types":[6,12]},{"abilities":[14,0],"address":3298088,"base_stats":[60,55,50,45,40,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":49}],"friendship":70,"id":48,"learnset":{"address":3309372,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":33,"move_id":60},{"level":36,"move_id":79},{"level":41,"move_id":94}]},"tmhm_learnset":"0040BE0894350620","types":[6,3]},{"abilities":[19,0],"address":3298116,"base_stats":[70,65,60,90,90,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":49,"learnset":{"address":3309398,"moves":[{"level":1,"move_id":318},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":1,"move_id":48},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":31,"move_id":16},{"level":36,"move_id":60},{"level":42,"move_id":79},{"level":52,"move_id":94}]},"tmhm_learnset":"0040BE8894354620","types":[6,3]},{"abilities":[8,71],"address":3298144,"base_stats":[10,55,25,95,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":26,"species":51}],"friendship":70,"id":50,"learnset":{"address":3309428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":33,"move_id":163},{"level":41,"move_id":89},{"level":49,"move_id":90}]},"tmhm_learnset":"00843EC88E110620","types":[4,4]},{"abilities":[8,71],"address":3298172,"base_stats":[35,80,50,120,50,70],"catch_rate":50,"evolutions":[],"friendship":70,"id":51,"learnset":{"address":3309452,"moves":[{"level":1,"move_id":161},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":1,"move_id":45},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":26,"move_id":328},{"level":38,"move_id":163},{"level":51,"move_id":89},{"level":64,"move_id":90}]},"tmhm_learnset":"00843EC88E114620","types":[4,4]},{"abilities":[53,0],"address":3298200,"base_stats":[40,45,35,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":28,"species":53}],"friendship":70,"id":52,"learnset":{"address":3309478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":28,"move_id":185},{"level":35,"move_id":103},{"level":41,"move_id":154},{"level":46,"move_id":163},{"level":50,"move_id":252}]},"tmhm_learnset":"00453F82ADD30E24","types":[0,0]},{"abilities":[7,0],"address":3298228,"base_stats":[65,70,60,115,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":53,"learnset":{"address":3309502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":44},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":29,"move_id":185},{"level":38,"move_id":103},{"level":46,"move_id":154},{"level":53,"move_id":163},{"level":59,"move_id":252}]},"tmhm_learnset":"00453F82ADD34E34","types":[0,0]},{"abilities":[6,13],"address":3298256,"base_stats":[50,52,48,55,65,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":33,"species":55}],"friendship":70,"id":54,"learnset":{"address":3309526,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":40,"move_id":154},{"level":50,"move_id":56}]},"tmhm_learnset":"03F01E80CC53326D","types":[11,11]},{"abilities":[6,13],"address":3298284,"base_stats":[80,82,78,85,95,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":55,"learnset":{"address":3309550,"moves":[{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":50},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":44,"move_id":154},{"level":58,"move_id":56}]},"tmhm_learnset":"03F01E80CC53726D","types":[11,11]},{"abilities":[72,0],"address":3298312,"base_stats":[40,80,35,70,35,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":57}],"friendship":70,"id":56,"learnset":{"address":3309574,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":33,"move_id":69},{"level":39,"move_id":238},{"level":45,"move_id":103},{"level":51,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD30EA1","types":[1,1]},{"abilities":[72,0],"address":3298340,"base_stats":[65,105,60,95,60,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":57,"learnset":{"address":3309600,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":67},{"level":1,"move_id":99},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":28,"move_id":99},{"level":36,"move_id":69},{"level":45,"move_id":238},{"level":54,"move_id":103},{"level":63,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD34EA1","types":[1,1]},{"abilities":[22,18],"address":3298368,"base_stats":[55,70,45,60,70,50],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":59}],"friendship":70,"id":58,"learnset":{"address":3309628,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":7,"move_id":52},{"level":13,"move_id":43},{"level":19,"move_id":316},{"level":25,"move_id":36},{"level":31,"move_id":172},{"level":37,"move_id":270},{"level":43,"move_id":97},{"level":49,"move_id":53}]},"tmhm_learnset":"00A23EA48C510630","types":[10,10]},{"abilities":[22,18],"address":3298396,"base_stats":[90,110,80,95,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":59,"learnset":{"address":3309654,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":1,"move_id":52},{"level":1,"move_id":316},{"level":49,"move_id":245}]},"tmhm_learnset":"00A23EA48C514630","types":[10,10]},{"abilities":[11,6],"address":3298424,"base_stats":[40,50,40,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":61}],"friendship":70,"id":60,"learnset":{"address":3309666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":25,"move_id":240},{"level":31,"move_id":34},{"level":37,"move_id":187},{"level":43,"move_id":56}]},"tmhm_learnset":"03103E009C133264","types":[11,11]},{"abilities":[11,6],"address":3298452,"base_stats":[65,65,65,90,50,50],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":62},{"method":"ITEM","param":187,"species":186}],"friendship":70,"id":61,"learnset":{"address":3309690,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":95},{"level":1,"move_id":55},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":27,"move_id":240},{"level":35,"move_id":34},{"level":43,"move_id":187},{"level":51,"move_id":56}]},"tmhm_learnset":"03B03E00DE133265","types":[11,11]},{"abilities":[11,6],"address":3298480,"base_stats":[90,85,95,70,70,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":62,"learnset":{"address":3309714,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":66},{"level":35,"move_id":66},{"level":51,"move_id":170}]},"tmhm_learnset":"03B03E40DE1372E5","types":[11,1]},{"abilities":[28,39],"address":3298508,"base_stats":[25,20,15,90,105,55],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":16,"species":64}],"friendship":70,"id":63,"learnset":{"address":3309728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":100}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298536,"base_stats":[40,35,30,105,120,70],"catch_rate":100,"evolutions":[{"method":"LEVEL","param":37,"species":65}],"friendship":70,"id":64,"learnset":{"address":3309738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":272},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298564,"base_stats":[55,50,45,120,135,85],"catch_rate":50,"evolutions":[],"friendship":70,"id":65,"learnset":{"address":3309766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":347},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45BCE29","types":[14,14]},{"abilities":[62,0],"address":3298592,"base_stats":[70,80,50,35,35,35],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":28,"species":67}],"friendship":70,"id":66,"learnset":{"address":3309794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":31,"move_id":233},{"level":37,"move_id":66},{"level":40,"move_id":238},{"level":43,"move_id":184},{"level":49,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298620,"base_stats":[80,100,70,45,50,60],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":68}],"friendship":70,"id":67,"learnset":{"address":3309824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298648,"base_stats":[90,130,80,55,65,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":68,"learnset":{"address":3309854,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1346A1","types":[1,1]},{"abilities":[34,0],"address":3298676,"base_stats":[50,75,35,40,70,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":70}],"friendship":70,"id":69,"learnset":{"address":3309884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":23,"move_id":51},{"level":30,"move_id":230},{"level":37,"move_id":75},{"level":45,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298704,"base_stats":[65,90,50,55,85,45],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":71}],"friendship":70,"id":70,"learnset":{"address":3309912,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":1,"move_id":74},{"level":1,"move_id":35},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":24,"move_id":51},{"level":33,"move_id":230},{"level":42,"move_id":75},{"level":54,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298732,"base_stats":[80,105,65,70,100,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":71,"learnset":{"address":3309940,"moves":[{"level":1,"move_id":22},{"level":1,"move_id":79},{"level":1,"move_id":230},{"level":1,"move_id":75}]},"tmhm_learnset":"00443E0884354720","types":[12,3]},{"abilities":[29,64],"address":3298760,"base_stats":[40,40,35,70,50,100],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":73}],"friendship":70,"id":72,"learnset":{"address":3309950,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":36,"move_id":112},{"level":43,"move_id":103},{"level":49,"move_id":56}]},"tmhm_learnset":"03143E0884173264","types":[11,3]},{"abilities":[29,64],"address":3298788,"base_stats":[80,70,65,100,80,120],"catch_rate":60,"evolutions":[],"friendship":70,"id":73,"learnset":{"address":3309976,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":48},{"level":1,"move_id":132},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":38,"move_id":112},{"level":47,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03143E0884177264","types":[11,3]},{"abilities":[69,5],"address":3298816,"base_stats":[40,80,100,20,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":75}],"friendship":70,"id":74,"learnset":{"address":3310002,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":26,"move_id":205},{"level":31,"move_id":350},{"level":36,"move_id":89},{"level":41,"move_id":153},{"level":46,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298844,"base_stats":[55,95,115,35,45,45],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":37,"species":76}],"friendship":70,"id":75,"learnset":{"address":3310030,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298872,"base_stats":[80,110,130,45,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":76,"learnset":{"address":3310058,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE114631","types":[5,4]},{"abilities":[50,18],"address":3298900,"base_stats":[50,85,55,90,65,65],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":40,"species":78}],"friendship":70,"id":77,"learnset":{"address":3310086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":45,"move_id":340},{"level":53,"move_id":126}]},"tmhm_learnset":"00221E2484710620","types":[10,10]},{"abilities":[50,18],"address":3298928,"base_stats":[65,100,70,105,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":78,"learnset":{"address":3310114,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":52},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":40,"move_id":31},{"level":50,"move_id":340},{"level":63,"move_id":126}]},"tmhm_learnset":"00221E2484714620","types":[10,10]},{"abilities":[12,20],"address":3298956,"base_stats":[90,65,65,15,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":80},{"method":"ITEM","param":187,"species":199}],"friendship":70,"id":79,"learnset":{"address":3310144,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":133},{"level":48,"move_id":94}]},"tmhm_learnset":"02709E24BE5B366C","types":[11,14]},{"abilities":[12,20],"address":3298984,"base_stats":[95,75,110,30,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":80,"learnset":{"address":3310168,"moves":[{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":37,"move_id":110},{"level":46,"move_id":133},{"level":54,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[42,5],"address":3299012,"base_stats":[25,35,70,45,95,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":82}],"friendship":70,"id":81,"learnset":{"address":3310194,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":32,"move_id":199},{"level":38,"move_id":129},{"level":44,"move_id":103},{"level":50,"move_id":192}]},"tmhm_learnset":"00400E0385930620","types":[13,8]},{"abilities":[42,5],"address":3299040,"base_stats":[50,60,95,70,120,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":82,"learnset":{"address":3310222,"moves":[{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":1,"move_id":84},{"level":1,"move_id":48},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":35,"move_id":199},{"level":44,"move_id":161},{"level":53,"move_id":103},{"level":62,"move_id":192}]},"tmhm_learnset":"00400E0385934620","types":[13,8]},{"abilities":[51,39],"address":3299068,"base_stats":[52,65,55,60,58,62],"catch_rate":45,"evolutions":[],"friendship":70,"id":83,"learnset":{"address":3310250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":6,"move_id":28},{"level":11,"move_id":43},{"level":16,"move_id":31},{"level":21,"move_id":282},{"level":26,"move_id":210},{"level":31,"move_id":14},{"level":36,"move_id":97},{"level":41,"move_id":163},{"level":46,"move_id":206}]},"tmhm_learnset":"000C7E8084510620","types":[0,2]},{"abilities":[50,48],"address":3299096,"base_stats":[35,85,45,75,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":85}],"friendship":70,"id":84,"learnset":{"address":3310278,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":33,"move_id":253},{"level":37,"move_id":65},{"level":45,"move_id":97}]},"tmhm_learnset":"00087E8084110620","types":[0,2]},{"abilities":[50,48],"address":3299124,"base_stats":[60,110,70,100,60,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":85,"learnset":{"address":3310302,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":228},{"level":1,"move_id":31},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":38,"move_id":253},{"level":47,"move_id":65},{"level":60,"move_id":97}]},"tmhm_learnset":"00087F8084114E20","types":[0,2]},{"abilities":[47,0],"address":3299152,"base_stats":[65,45,55,45,45,70],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":34,"species":87}],"friendship":70,"id":86,"learnset":{"address":3310326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":29},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":37,"move_id":36},{"level":41,"move_id":58},{"level":49,"move_id":219}]},"tmhm_learnset":"03103E00841B3264","types":[11,11]},{"abilities":[47,0],"address":3299180,"base_stats":[90,70,80,70,70,95],"catch_rate":75,"evolutions":[],"friendship":70,"id":87,"learnset":{"address":3310350,"moves":[{"level":1,"move_id":29},{"level":1,"move_id":45},{"level":1,"move_id":196},{"level":1,"move_id":62},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":34,"move_id":329},{"level":42,"move_id":36},{"level":51,"move_id":58},{"level":64,"move_id":219}]},"tmhm_learnset":"03103E00841B7264","types":[11,15]},{"abilities":[1,60],"address":3299208,"base_stats":[80,80,50,25,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":89}],"friendship":70,"id":88,"learnset":{"address":3310376,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":43,"move_id":188},{"level":53,"move_id":262}]},"tmhm_learnset":"00003F6E8D970E20","types":[3,3]},{"abilities":[1,60],"address":3299236,"base_stats":[105,105,75,50,65,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":89,"learnset":{"address":3310402,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":47,"move_id":188},{"level":61,"move_id":262}]},"tmhm_learnset":"00A03F6ECD974E21","types":[3,3]},{"abilities":[75,0],"address":3299264,"base_stats":[30,65,100,40,45,25],"catch_rate":190,"evolutions":[{"method":"ITEM","param":97,"species":91}],"friendship":70,"id":90,"learnset":{"address":3310428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":110},{"level":9,"move_id":48},{"level":17,"move_id":62},{"level":25,"move_id":182},{"level":33,"move_id":43},{"level":41,"move_id":128},{"level":49,"move_id":58}]},"tmhm_learnset":"02101E0084133264","types":[11,11]},{"abilities":[75,0],"address":3299292,"base_stats":[50,95,180,70,85,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":91,"learnset":{"address":3310450,"moves":[{"level":1,"move_id":110},{"level":1,"move_id":48},{"level":1,"move_id":62},{"level":1,"move_id":182},{"level":33,"move_id":191},{"level":41,"move_id":131}]},"tmhm_learnset":"02101F0084137264","types":[11,15]},{"abilities":[26,0],"address":3299320,"base_stats":[30,35,30,80,100,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":93}],"friendship":70,"id":92,"learnset":{"address":3310464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":28,"move_id":109},{"level":33,"move_id":138},{"level":36,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299348,"base_stats":[45,50,45,95,115,55],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":94}],"friendship":70,"id":93,"learnset":{"address":3310488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299376,"base_stats":[60,65,60,110,130,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":94,"learnset":{"address":3310514,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"00A1BF08F5974E21","types":[7,3]},{"abilities":[69,5],"address":3299404,"base_stats":[35,45,160,70,30,45],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":208}],"friendship":70,"id":95,"learnset":{"address":3310540,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":328},{"level":57,"move_id":38}]},"tmhm_learnset":"00A01F508E510E30","types":[5,4]},{"abilities":[15,0],"address":3299432,"base_stats":[60,48,45,42,43,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":26,"species":97}],"friendship":70,"id":96,"learnset":{"address":3310568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":31,"move_id":139},{"level":36,"move_id":96},{"level":40,"move_id":94},{"level":43,"move_id":244},{"level":45,"move_id":248}]},"tmhm_learnset":"0041BF01F41B8E29","types":[14,14]},{"abilities":[15,0],"address":3299460,"base_stats":[85,73,70,67,73,115],"catch_rate":75,"evolutions":[],"friendship":70,"id":97,"learnset":{"address":3310594,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":1,"move_id":50},{"level":1,"move_id":93},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":33,"move_id":139},{"level":40,"move_id":96},{"level":49,"move_id":94},{"level":55,"move_id":244},{"level":60,"move_id":248}]},"tmhm_learnset":"0041BF01F41BCE29","types":[14,14]},{"abilities":[52,75],"address":3299488,"base_stats":[30,105,90,50,25,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":28,"species":99}],"friendship":70,"id":98,"learnset":{"address":3310620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":34,"move_id":12},{"level":41,"move_id":182},{"level":45,"move_id":152}]},"tmhm_learnset":"02B43E408C133264","types":[11,11]},{"abilities":[52,75],"address":3299516,"base_stats":[55,130,115,75,50,50],"catch_rate":60,"evolutions":[],"friendship":70,"id":99,"learnset":{"address":3310646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":43},{"level":1,"move_id":11},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":38,"move_id":12},{"level":49,"move_id":182},{"level":57,"move_id":152}]},"tmhm_learnset":"02B43E408C137264","types":[11,11]},{"abilities":[43,9],"address":3299544,"base_stats":[40,30,50,100,55,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":101}],"friendship":70,"id":100,"learnset":{"address":3310672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":32,"move_id":205},{"level":37,"move_id":113},{"level":42,"move_id":129},{"level":46,"move_id":153},{"level":49,"move_id":243}]},"tmhm_learnset":"00402F0285938A20","types":[13,13]},{"abilities":[43,9],"address":3299572,"base_stats":[60,50,70,140,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":101,"learnset":{"address":3310700,"moves":[{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":1,"move_id":49},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":34,"move_id":205},{"level":41,"move_id":113},{"level":48,"move_id":129},{"level":54,"move_id":153},{"level":59,"move_id":243}]},"tmhm_learnset":"00402F028593CA20","types":[13,13]},{"abilities":[34,0],"address":3299600,"base_stats":[60,40,80,40,60,45],"catch_rate":90,"evolutions":[{"method":"ITEM","param":98,"species":103}],"friendship":70,"id":102,"learnset":{"address":3310728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":253},{"level":1,"move_id":95},{"level":7,"move_id":115},{"level":13,"move_id":73},{"level":19,"move_id":93},{"level":25,"move_id":78},{"level":31,"move_id":77},{"level":37,"move_id":79},{"level":43,"move_id":76}]},"tmhm_learnset":"0060BE0994358720","types":[12,14]},{"abilities":[34,0],"address":3299628,"base_stats":[95,95,85,55,125,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":103,"learnset":{"address":3310752,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":95},{"level":1,"move_id":93},{"level":19,"move_id":23},{"level":31,"move_id":121}]},"tmhm_learnset":"0060BE099435C720","types":[12,14]},{"abilities":[69,31],"address":3299656,"base_stats":[50,50,95,35,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":105}],"friendship":70,"id":104,"learnset":{"address":3310766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":125},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":29,"move_id":99},{"level":33,"move_id":206},{"level":37,"move_id":37},{"level":41,"move_id":198},{"level":45,"move_id":38}]},"tmhm_learnset":"00A03EF4CE513621","types":[4,4]},{"abilities":[69,31],"address":3299684,"base_stats":[60,80,110,45,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":105,"learnset":{"address":3310798,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":125},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":32,"move_id":99},{"level":39,"move_id":206},{"level":46,"move_id":37},{"level":53,"move_id":198},{"level":61,"move_id":38}]},"tmhm_learnset":"00A03EF4CE517621","types":[4,4]},{"abilities":[7,0],"address":3299712,"base_stats":[50,120,53,87,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":106,"learnset":{"address":3310830,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":24},{"level":6,"move_id":96},{"level":11,"move_id":27},{"level":16,"move_id":26},{"level":20,"move_id":280},{"level":21,"move_id":116},{"level":26,"move_id":136},{"level":31,"move_id":170},{"level":36,"move_id":193},{"level":41,"move_id":203},{"level":46,"move_id":25},{"level":51,"move_id":179}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[51,0],"address":3299740,"base_stats":[50,105,79,76,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":107,"learnset":{"address":3310862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":4},{"level":7,"move_id":97},{"level":13,"move_id":228},{"level":20,"move_id":183},{"level":26,"move_id":9},{"level":26,"move_id":8},{"level":26,"move_id":7},{"level":32,"move_id":327},{"level":38,"move_id":5},{"level":44,"move_id":197},{"level":50,"move_id":68}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[20,12],"address":3299768,"base_stats":[90,55,75,30,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":108,"learnset":{"address":3310892,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":122},{"level":7,"move_id":48},{"level":12,"move_id":111},{"level":18,"move_id":282},{"level":23,"move_id":23},{"level":29,"move_id":35},{"level":34,"move_id":50},{"level":40,"move_id":21},{"level":45,"move_id":103},{"level":51,"move_id":287}]},"tmhm_learnset":"00B43E76EFF37625","types":[0,0]},{"abilities":[26,0],"address":3299796,"base_stats":[40,65,95,35,60,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":35,"species":110}],"friendship":70,"id":109,"learnset":{"address":3310920,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":41,"move_id":153},{"level":45,"move_id":194},{"level":49,"move_id":262}]},"tmhm_learnset":"00403F2EA5930E20","types":[3,3]},{"abilities":[26,0],"address":3299824,"base_stats":[65,90,120,60,85,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":110,"learnset":{"address":3310946,"moves":[{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":1,"move_id":123},{"level":1,"move_id":120},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":44,"move_id":153},{"level":51,"move_id":194},{"level":58,"move_id":262}]},"tmhm_learnset":"00403F2EA5934E20","types":[3,3]},{"abilities":[31,69],"address":3299852,"base_stats":[80,85,95,25,30,30],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":42,"species":112}],"friendship":70,"id":111,"learnset":{"address":3310972,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":43,"move_id":36},{"level":52,"move_id":89},{"level":57,"move_id":224}]},"tmhm_learnset":"00A03E768FD33630","types":[4,5]},{"abilities":[31,69],"address":3299880,"base_stats":[105,130,120,40,45,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":112,"learnset":{"address":3310998,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":1,"move_id":23},{"level":1,"move_id":31},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":46,"move_id":36},{"level":58,"move_id":89},{"level":66,"move_id":224}]},"tmhm_learnset":"00B43E76CFD37631","types":[4,5]},{"abilities":[30,32],"address":3299908,"base_stats":[250,5,5,50,35,105],"catch_rate":30,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":242}],"friendship":140,"id":113,"learnset":{"address":3311024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":287},{"level":13,"move_id":135},{"level":17,"move_id":3},{"level":23,"move_id":107},{"level":29,"move_id":47},{"level":35,"move_id":121},{"level":41,"move_id":111},{"level":49,"move_id":113},{"level":57,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[34,0],"address":3299936,"base_stats":[65,55,115,60,100,40],"catch_rate":45,"evolutions":[],"friendship":70,"id":114,"learnset":{"address":3311054,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":275},{"level":1,"move_id":132},{"level":4,"move_id":79},{"level":10,"move_id":71},{"level":13,"move_id":74},{"level":19,"move_id":77},{"level":22,"move_id":22},{"level":28,"move_id":20},{"level":31,"move_id":72},{"level":37,"move_id":78},{"level":40,"move_id":21},{"level":46,"move_id":321}]},"tmhm_learnset":"00C43E0884354720","types":[12,12]},{"abilities":[48,0],"address":3299964,"base_stats":[105,95,80,90,40,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":115,"learnset":{"address":3311084,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":4},{"level":1,"move_id":43},{"level":7,"move_id":44},{"level":13,"move_id":39},{"level":19,"move_id":252},{"level":25,"move_id":5},{"level":31,"move_id":99},{"level":37,"move_id":203},{"level":43,"move_id":146},{"level":49,"move_id":179}]},"tmhm_learnset":"00B43EF6EFF37675","types":[0,0]},{"abilities":[33,0],"address":3299992,"base_stats":[30,40,70,60,70,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":32,"species":117}],"friendship":70,"id":116,"learnset":{"address":3311110,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":36,"move_id":97},{"level":43,"move_id":56},{"level":50,"move_id":349}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[38,0],"address":3300020,"base_stats":[55,65,95,85,95,45],"catch_rate":75,"evolutions":[{"method":"ITEM","param":201,"species":230}],"friendship":70,"id":117,"learnset":{"address":3311134,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[33,41],"address":3300048,"base_stats":[45,67,60,63,35,50],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":119}],"friendship":70,"id":118,"learnset":{"address":3311158,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":38,"move_id":127},{"level":43,"move_id":32},{"level":52,"move_id":97}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,41],"address":3300076,"base_stats":[80,92,65,68,65,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":119,"learnset":{"address":3311182,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":1,"move_id":48},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":41,"move_id":127},{"level":49,"move_id":32},{"level":61,"move_id":97}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[35,30],"address":3300104,"base_stats":[30,45,55,85,70,55],"catch_rate":225,"evolutions":[{"method":"ITEM","param":97,"species":121}],"friendship":70,"id":120,"learnset":{"address":3311206,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":6,"move_id":55},{"level":10,"move_id":229},{"level":15,"move_id":105},{"level":19,"move_id":293},{"level":24,"move_id":129},{"level":28,"move_id":61},{"level":33,"move_id":107},{"level":37,"move_id":113},{"level":42,"move_id":322},{"level":46,"move_id":56}]},"tmhm_learnset":"03500E019593B264","types":[11,11]},{"abilities":[35,30],"address":3300132,"base_stats":[60,75,85,115,100,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":121,"learnset":{"address":3311236,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":229},{"level":1,"move_id":105},{"level":1,"move_id":129},{"level":33,"move_id":109}]},"tmhm_learnset":"03508E019593F264","types":[11,14]},{"abilities":[43,0],"address":3300160,"base_stats":[40,45,65,90,100,120],"catch_rate":45,"evolutions":[],"friendship":70,"id":122,"learnset":{"address":3311248,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":112},{"level":5,"move_id":93},{"level":9,"move_id":164},{"level":13,"move_id":96},{"level":17,"move_id":3},{"level":21,"move_id":113},{"level":21,"move_id":115},{"level":25,"move_id":227},{"level":29,"move_id":60},{"level":33,"move_id":278},{"level":37,"move_id":271},{"level":41,"move_id":272},{"level":45,"move_id":94},{"level":49,"move_id":226},{"level":53,"move_id":219}]},"tmhm_learnset":"0041BF03F5BBCE29","types":[14,14]},{"abilities":[68,0],"address":3300188,"base_stats":[70,110,80,105,55,80],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":212}],"friendship":70,"id":123,"learnset":{"address":3311286,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":17},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00847E8084134620","types":[6,2]},{"abilities":[12,0],"address":3300216,"base_stats":[65,50,35,95,115,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":124,"learnset":{"address":3311314,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":1,"move_id":142},{"level":1,"move_id":181},{"level":9,"move_id":142},{"level":13,"move_id":181},{"level":21,"move_id":3},{"level":25,"move_id":8},{"level":35,"move_id":212},{"level":41,"move_id":313},{"level":51,"move_id":34},{"level":57,"move_id":195},{"level":67,"move_id":59}]},"tmhm_learnset":"0040BF01F413FA6D","types":[15,14]},{"abilities":[9,0],"address":3300244,"base_stats":[65,83,57,105,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":125,"learnset":{"address":3311342,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":1,"move_id":9},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":36,"move_id":103},{"level":47,"move_id":85},{"level":58,"move_id":87}]},"tmhm_learnset":"00E03E02D5D3C221","types":[13,13]},{"abilities":[49,0],"address":3300272,"base_stats":[65,95,57,93,100,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":126,"learnset":{"address":3311364,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":43},{"level":1,"move_id":123},{"level":1,"move_id":7},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":33,"move_id":241},{"level":41,"move_id":53},{"level":49,"move_id":109},{"level":57,"move_id":126}]},"tmhm_learnset":"00A03E24D4514621","types":[10,10]},{"abilities":[52,0],"address":3300300,"base_stats":[65,125,100,85,55,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":127,"learnset":{"address":3311390,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":11},{"level":1,"move_id":116},{"level":7,"move_id":20},{"level":13,"move_id":69},{"level":19,"move_id":106},{"level":25,"move_id":279},{"level":31,"move_id":280},{"level":37,"move_id":12},{"level":43,"move_id":66},{"level":49,"move_id":14}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,6]},{"abilities":[22,0],"address":3300328,"base_stats":[75,100,95,110,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":128,"learnset":{"address":3311416,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":8,"move_id":99},{"level":13,"move_id":30},{"level":19,"move_id":184},{"level":26,"move_id":228},{"level":34,"move_id":156},{"level":43,"move_id":37},{"level":53,"move_id":36}]},"tmhm_learnset":"00B01E7687F37624","types":[0,0]},{"abilities":[33,0],"address":3300356,"base_stats":[20,10,55,80,15,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":130}],"friendship":70,"id":129,"learnset":{"address":3311442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"0000000000000000","types":[11,11]},{"abilities":[22,0],"address":3300384,"base_stats":[95,125,79,81,60,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":130,"learnset":{"address":3311456,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":37},{"level":20,"move_id":44},{"level":25,"move_id":82},{"level":30,"move_id":43},{"level":35,"move_id":239},{"level":40,"move_id":56},{"level":45,"move_id":240},{"level":50,"move_id":349},{"level":55,"move_id":63}]},"tmhm_learnset":"03B01F3487937A74","types":[11,2]},{"abilities":[11,75],"address":3300412,"base_stats":[130,85,80,60,85,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":131,"learnset":{"address":3311482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":45},{"level":1,"move_id":47},{"level":7,"move_id":54},{"level":13,"move_id":34},{"level":19,"move_id":109},{"level":25,"move_id":195},{"level":31,"move_id":58},{"level":37,"move_id":240},{"level":43,"move_id":219},{"level":49,"move_id":56},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E0295DB7274","types":[11,15]},{"abilities":[7,0],"address":3300440,"base_stats":[48,48,48,48,48,48],"catch_rate":35,"evolutions":[],"friendship":70,"id":132,"learnset":{"address":3311510,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":144}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[50,0],"address":3300468,"base_stats":[55,55,50,55,45,65],"catch_rate":45,"evolutions":[{"method":"ITEM","param":96,"species":135},{"method":"ITEM","param":97,"species":134},{"method":"ITEM","param":95,"species":136},{"method":"FRIENDSHIP_DAY","param":0,"species":196},{"method":"FRIENDSHIP_NIGHT","param":0,"species":197}],"friendship":70,"id":133,"learnset":{"address":3311520,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":45},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":226},{"level":42,"move_id":36}]},"tmhm_learnset":"00001E00AC530620","types":[0,0]},{"abilities":[11,0],"address":3300496,"base_stats":[130,65,60,65,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":134,"learnset":{"address":3311542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":55},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":62},{"level":42,"move_id":114},{"level":47,"move_id":151},{"level":52,"move_id":56}]},"tmhm_learnset":"03101E00AC537674","types":[11,11]},{"abilities":[10,0],"address":3300524,"base_stats":[65,65,60,130,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":135,"learnset":{"address":3311568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":84},{"level":23,"move_id":98},{"level":30,"move_id":24},{"level":36,"move_id":42},{"level":42,"move_id":86},{"level":47,"move_id":97},{"level":52,"move_id":87}]},"tmhm_learnset":"00401E02ADD34630","types":[13,13]},{"abilities":[18,0],"address":3300552,"base_stats":[65,130,60,65,95,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":136,"learnset":{"address":3311594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":52},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":83},{"level":42,"move_id":123},{"level":47,"move_id":43},{"level":52,"move_id":53}]},"tmhm_learnset":"00021E24AC534630","types":[10,10]},{"abilities":[36,0],"address":3300580,"base_stats":[65,60,70,40,85,75],"catch_rate":45,"evolutions":[{"method":"ITEM","param":218,"species":233}],"friendship":70,"id":137,"learnset":{"address":3311620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":159},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[33,75],"address":3300608,"base_stats":[35,40,100,35,90,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":139}],"friendship":70,"id":138,"learnset":{"address":3311646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":43,"move_id":321},{"level":49,"move_id":246},{"level":55,"move_id":56}]},"tmhm_learnset":"03903E5084133264","types":[5,11]},{"abilities":[33,75],"address":3300636,"base_stats":[70,60,125,55,115,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":139,"learnset":{"address":3311672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":1,"move_id":44},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":40,"move_id":131},{"level":46,"move_id":321},{"level":55,"move_id":246},{"level":65,"move_id":56}]},"tmhm_learnset":"03903E5084137264","types":[5,11]},{"abilities":[33,4],"address":3300664,"base_stats":[30,80,90,55,55,45],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":141}],"friendship":70,"id":140,"learnset":{"address":3311700,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":43,"move_id":319},{"level":49,"move_id":72},{"level":55,"move_id":246}]},"tmhm_learnset":"01903ED08C173264","types":[5,11]},{"abilities":[33,4],"address":3300692,"base_stats":[60,115,105,80,65,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":141,"learnset":{"address":3311726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":71},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":40,"move_id":163},{"level":46,"move_id":319},{"level":55,"move_id":72},{"level":65,"move_id":246}]},"tmhm_learnset":"03943ED0CC177264","types":[5,11]},{"abilities":[69,46],"address":3300720,"base_stats":[80,105,65,130,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":142,"learnset":{"address":3311754,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":8,"move_id":97},{"level":15,"move_id":44},{"level":22,"move_id":48},{"level":29,"move_id":246},{"level":36,"move_id":184},{"level":43,"move_id":36},{"level":50,"move_id":63}]},"tmhm_learnset":"00A87FF486534E32","types":[5,2]},{"abilities":[17,47],"address":3300748,"base_stats":[160,110,65,30,65,110],"catch_rate":25,"evolutions":[],"friendship":70,"id":143,"learnset":{"address":3311778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":133},{"level":10,"move_id":111},{"level":15,"move_id":187},{"level":19,"move_id":29},{"level":24,"move_id":281},{"level":28,"move_id":156},{"level":28,"move_id":173},{"level":33,"move_id":34},{"level":37,"move_id":335},{"level":42,"move_id":343},{"level":46,"move_id":205},{"level":51,"move_id":63}]},"tmhm_learnset":"00301E76F7B37625","types":[0,0]},{"abilities":[46,0],"address":3300776,"base_stats":[90,85,100,85,95,125],"catch_rate":3,"evolutions":[],"friendship":35,"id":144,"learnset":{"address":3311812,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":181},{"level":13,"move_id":54},{"level":25,"move_id":97},{"level":37,"move_id":170},{"level":49,"move_id":58},{"level":61,"move_id":115},{"level":73,"move_id":59},{"level":85,"move_id":329}]},"tmhm_learnset":"00884E9184137674","types":[15,2]},{"abilities":[46,0],"address":3300804,"base_stats":[90,90,85,100,125,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":145,"learnset":{"address":3311836,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":84},{"level":13,"move_id":86},{"level":25,"move_id":97},{"level":37,"move_id":197},{"level":49,"move_id":65},{"level":61,"move_id":268},{"level":73,"move_id":113},{"level":85,"move_id":87}]},"tmhm_learnset":"00C84E928593C630","types":[13,2]},{"abilities":[46,0],"address":3300832,"base_stats":[90,100,90,90,125,85],"catch_rate":3,"evolutions":[],"friendship":35,"id":146,"learnset":{"address":3311860,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":1,"move_id":52},{"level":13,"move_id":83},{"level":25,"move_id":97},{"level":37,"move_id":203},{"level":49,"move_id":53},{"level":61,"move_id":219},{"level":73,"move_id":257},{"level":85,"move_id":143}]},"tmhm_learnset":"008A4EB4841B4630","types":[10,2]},{"abilities":[61,0],"address":3300860,"base_stats":[41,64,45,50,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":148}],"friendship":35,"id":147,"learnset":{"address":3311884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":36,"move_id":97},{"level":43,"move_id":219},{"level":50,"move_id":200},{"level":57,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[61,0],"address":3300888,"base_stats":[61,84,65,70,70,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":149}],"friendship":35,"id":148,"learnset":{"address":3311910,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":56,"move_id":200},{"level":65,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[39,0],"address":3300916,"base_stats":[91,134,95,80,100,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":149,"learnset":{"address":3311936,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":55,"move_id":17},{"level":61,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BC5EF6C7DB7677","types":[16,2]},{"abilities":[46,0],"address":3300944,"base_stats":[106,110,90,130,154,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":150,"learnset":{"address":3311964,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":50},{"level":11,"move_id":112},{"level":22,"move_id":129},{"level":33,"move_id":244},{"level":44,"move_id":248},{"level":55,"move_id":54},{"level":66,"move_id":94},{"level":77,"move_id":133},{"level":88,"move_id":105},{"level":99,"move_id":219}]},"tmhm_learnset":"00E18FF7F7FBFEED","types":[14,14]},{"abilities":[28,0],"address":3300972,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":151,"learnset":{"address":3311992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":10,"move_id":144},{"level":20,"move_id":5},{"level":30,"move_id":118},{"level":40,"move_id":94},{"level":50,"move_id":246}]},"tmhm_learnset":"03FFFFFFFFFFFFFF","types":[14,14]},{"abilities":[65,0],"address":3301000,"base_stats":[45,49,65,45,49,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":153}],"friendship":70,"id":152,"learnset":{"address":3312012,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":22,"move_id":235},{"level":29,"move_id":34},{"level":36,"move_id":113},{"level":43,"move_id":219},{"level":50,"move_id":76}]},"tmhm_learnset":"00441E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301028,"base_stats":[60,62,80,60,63,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":154}],"friendship":70,"id":153,"learnset":{"address":3312038,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":39,"move_id":113},{"level":47,"move_id":219},{"level":55,"move_id":76}]},"tmhm_learnset":"00E41E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301056,"base_stats":[80,82,100,80,83,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":154,"learnset":{"address":3312064,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":41,"move_id":113},{"level":51,"move_id":219},{"level":61,"move_id":76}]},"tmhm_learnset":"00E41E01867DC720","types":[12,12]},{"abilities":[66,0],"address":3301084,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":14,"species":156}],"friendship":70,"id":155,"learnset":{"address":3312090,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":19,"move_id":98},{"level":27,"move_id":172},{"level":36,"move_id":129},{"level":46,"move_id":53}]},"tmhm_learnset":"00061EA48C110620","types":[10,10]},{"abilities":[66,0],"address":3301112,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":157}],"friendship":70,"id":156,"learnset":{"address":3312112,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":42,"move_id":129},{"level":54,"move_id":53}]},"tmhm_learnset":"00A61EA4CC110631","types":[10,10]},{"abilities":[66,0],"address":3301140,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":157,"learnset":{"address":3312134,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":1,"move_id":52},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":45,"move_id":129},{"level":60,"move_id":53}]},"tmhm_learnset":"00A61EA4CE114631","types":[10,10]},{"abilities":[67,0],"address":3301168,"base_stats":[50,65,64,43,44,48],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":18,"species":159}],"friendship":70,"id":158,"learnset":{"address":3312156,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":20,"move_id":44},{"level":27,"move_id":184},{"level":35,"move_id":163},{"level":43,"move_id":103},{"level":52,"move_id":56}]},"tmhm_learnset":"03141E80CC533265","types":[11,11]},{"abilities":[67,0],"address":3301196,"base_stats":[65,80,80,58,59,63],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":160}],"friendship":70,"id":159,"learnset":{"address":3312180,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":37,"move_id":163},{"level":45,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03B41E80CC533275","types":[11,11]},{"abilities":[67,0],"address":3301224,"base_stats":[85,105,100,78,79,83],"catch_rate":45,"evolutions":[],"friendship":70,"id":160,"learnset":{"address":3312204,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":1,"move_id":55},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":38,"move_id":163},{"level":47,"move_id":103},{"level":58,"move_id":56}]},"tmhm_learnset":"03B41E80CE537277","types":[11,11]},{"abilities":[50,51],"address":3301252,"base_stats":[35,46,34,20,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":15,"species":162}],"friendship":70,"id":161,"learnset":{"address":3312228,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":17,"move_id":270},{"level":24,"move_id":21},{"level":31,"move_id":266},{"level":40,"move_id":156},{"level":49,"move_id":133}]},"tmhm_learnset":"00143E06ECF31625","types":[0,0]},{"abilities":[50,51],"address":3301280,"base_stats":[85,76,64,90,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":162,"learnset":{"address":3312254,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":98},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":19,"move_id":270},{"level":28,"move_id":21},{"level":37,"move_id":266},{"level":48,"move_id":156},{"level":59,"move_id":133}]},"tmhm_learnset":"00B43E06EDF37625","types":[0,0]},{"abilities":[15,51],"address":3301308,"base_stats":[60,30,30,50,36,56],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":164}],"friendship":70,"id":163,"learnset":{"address":3312280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":22,"move_id":115},{"level":28,"move_id":36},{"level":34,"move_id":93},{"level":48,"move_id":138}]},"tmhm_learnset":"00487E81B4130620","types":[0,2]},{"abilities":[15,51],"address":3301336,"base_stats":[100,50,50,70,76,96],"catch_rate":90,"evolutions":[],"friendship":70,"id":164,"learnset":{"address":3312304,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":193},{"level":1,"move_id":64},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":25,"move_id":115},{"level":33,"move_id":36},{"level":41,"move_id":93},{"level":57,"move_id":138}]},"tmhm_learnset":"00487E81B4134620","types":[0,2]},{"abilities":[68,48],"address":3301364,"base_stats":[40,20,30,55,40,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":166}],"friendship":70,"id":165,"learnset":{"address":3312328,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":22,"move_id":113},{"level":22,"move_id":115},{"level":22,"move_id":219},{"level":29,"move_id":226},{"level":36,"move_id":129},{"level":43,"move_id":97},{"level":50,"move_id":38}]},"tmhm_learnset":"00403E81CC3D8621","types":[6,2]},{"abilities":[68,48],"address":3301392,"base_stats":[55,35,50,85,55,110],"catch_rate":90,"evolutions":[],"friendship":70,"id":166,"learnset":{"address":3312356,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":48},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":24,"move_id":113},{"level":24,"move_id":115},{"level":24,"move_id":219},{"level":33,"move_id":226},{"level":42,"move_id":129},{"level":51,"move_id":97},{"level":60,"move_id":38}]},"tmhm_learnset":"00403E81CC3DC621","types":[6,2]},{"abilities":[68,15],"address":3301420,"base_stats":[40,60,40,30,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":168}],"friendship":70,"id":167,"learnset":{"address":3312384,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":23,"move_id":141},{"level":30,"move_id":154},{"level":37,"move_id":169},{"level":45,"move_id":97},{"level":53,"move_id":94}]},"tmhm_learnset":"00403E089C350620","types":[6,3]},{"abilities":[68,15],"address":3301448,"base_stats":[70,90,70,40,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":168,"learnset":{"address":3312410,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":1,"move_id":184},{"level":1,"move_id":132},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":25,"move_id":141},{"level":34,"move_id":154},{"level":43,"move_id":169},{"level":53,"move_id":97},{"level":63,"move_id":94}]},"tmhm_learnset":"00403E089C354620","types":[6,3]},{"abilities":[39,0],"address":3301476,"base_stats":[85,90,80,130,70,80],"catch_rate":90,"evolutions":[],"friendship":70,"id":169,"learnset":{"address":3312436,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00097F88A4174E20","types":[3,2]},{"abilities":[10,35],"address":3301504,"base_stats":[75,38,38,67,56,56],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":27,"species":171}],"friendship":70,"id":170,"learnset":{"address":3312464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":29,"move_id":109},{"level":37,"move_id":36},{"level":41,"move_id":56},{"level":49,"move_id":268}]},"tmhm_learnset":"03501E0285933264","types":[11,13]},{"abilities":[10,35],"address":3301532,"base_stats":[125,58,58,67,76,76],"catch_rate":75,"evolutions":[],"friendship":70,"id":171,"learnset":{"address":3312490,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":1,"move_id":48},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":32,"move_id":109},{"level":43,"move_id":36},{"level":50,"move_id":56},{"level":61,"move_id":268}]},"tmhm_learnset":"03501E0285937264","types":[11,13]},{"abilities":[9,0],"address":3301560,"base_stats":[20,40,15,60,35,35],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":25}],"friendship":70,"id":172,"learnset":{"address":3312516,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":204},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":186}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[56,0],"address":3301588,"base_stats":[50,25,28,15,45,55],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":35}],"friendship":140,"id":173,"learnset":{"address":3312532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":204},{"level":4,"move_id":227},{"level":8,"move_id":47},{"level":13,"move_id":186}]},"tmhm_learnset":"00401E27BC7B8624","types":[0,0]},{"abilities":[56,0],"address":3301616,"base_stats":[90,30,15,15,40,20],"catch_rate":170,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":39}],"friendship":70,"id":174,"learnset":{"address":3312548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":1,"move_id":204},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":186}]},"tmhm_learnset":"00401E27BC3B8624","types":[0,0]},{"abilities":[55,32],"address":3301644,"base_stats":[35,20,65,20,40,65],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":176}],"friendship":70,"id":175,"learnset":{"address":3312564,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C01E27B43B8624","types":[0,0]},{"abilities":[55,32],"address":3301672,"base_stats":[55,40,85,40,80,105],"catch_rate":75,"evolutions":[],"friendship":70,"id":176,"learnset":{"address":3312590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C85EA7F43BC625","types":[0,2]},{"abilities":[28,48],"address":3301700,"base_stats":[40,50,45,70,70,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":178}],"friendship":70,"id":177,"learnset":{"address":3312616,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":30,"move_id":273},{"level":30,"move_id":248},{"level":40,"move_id":109},{"level":50,"move_id":94}]},"tmhm_learnset":"0040FE81B4378628","types":[14,2]},{"abilities":[28,48],"address":3301728,"base_stats":[65,75,70,95,95,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":178,"learnset":{"address":3312638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":35,"move_id":273},{"level":35,"move_id":248},{"level":50,"move_id":109},{"level":65,"move_id":94}]},"tmhm_learnset":"0048FE81B437C628","types":[14,2]},{"abilities":[9,0],"address":3301756,"base_stats":[55,40,40,35,65,45],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":15,"species":180}],"friendship":70,"id":179,"learnset":{"address":3312660,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":84},{"level":16,"move_id":86},{"level":23,"move_id":178},{"level":30,"move_id":113},{"level":37,"move_id":87}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[9,0],"address":3301784,"base_stats":[70,55,55,45,80,60],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":181}],"friendship":70,"id":180,"learnset":{"address":3312680,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":36,"move_id":113},{"level":45,"move_id":87}]},"tmhm_learnset":"00E01E02C5D38221","types":[13,13]},{"abilities":[9,0],"address":3301812,"base_stats":[90,75,75,55,115,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":181,"learnset":{"address":3312700,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":1,"move_id":86},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":30,"move_id":9},{"level":42,"move_id":113},{"level":57,"move_id":87}]},"tmhm_learnset":"00E01E02C5D3C221","types":[13,13]},{"abilities":[34,0],"address":3301840,"base_stats":[75,80,85,50,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":182,"learnset":{"address":3312722,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":78},{"level":1,"move_id":345},{"level":44,"move_id":80},{"level":55,"move_id":76}]},"tmhm_learnset":"00441E08843D4720","types":[12,12]},{"abilities":[47,37],"address":3301868,"base_stats":[70,20,50,40,20,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":18,"species":184}],"friendship":70,"id":183,"learnset":{"address":3312736,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":21,"move_id":61},{"level":28,"move_id":38},{"level":36,"move_id":240},{"level":45,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[47,37],"address":3301896,"base_stats":[100,50,80,50,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":184,"learnset":{"address":3312762,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":39},{"level":1,"move_id":55},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":24,"move_id":61},{"level":34,"move_id":38},{"level":45,"move_id":240},{"level":57,"move_id":56}]},"tmhm_learnset":"03B01E00CC537265","types":[11,11]},{"abilities":[5,69],"address":3301924,"base_stats":[70,100,115,30,30,65],"catch_rate":65,"evolutions":[],"friendship":70,"id":185,"learnset":{"address":3312788,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":102},{"level":9,"move_id":175},{"level":17,"move_id":67},{"level":25,"move_id":157},{"level":33,"move_id":335},{"level":41,"move_id":185},{"level":49,"move_id":21},{"level":57,"move_id":38}]},"tmhm_learnset":"00A03E50CE110E29","types":[5,5]},{"abilities":[11,6],"address":3301952,"base_stats":[90,75,75,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":186,"learnset":{"address":3312812,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":195},{"level":35,"move_id":195},{"level":51,"move_id":207}]},"tmhm_learnset":"03B03E00DE137265","types":[11,11]},{"abilities":[34,0],"address":3301980,"base_stats":[35,35,40,50,35,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":188}],"friendship":70,"id":187,"learnset":{"address":3312826,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":20,"move_id":73},{"level":25,"move_id":178},{"level":30,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302008,"base_stats":[55,45,50,80,45,65],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":27,"species":189}],"friendship":70,"id":188,"learnset":{"address":3312854,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":29,"move_id":178},{"level":36,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302036,"base_stats":[75,55,70,110,55,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":189,"learnset":{"address":3312882,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":33,"move_id":178},{"level":44,"move_id":72}]},"tmhm_learnset":"00401E8084354720","types":[12,2]},{"abilities":[50,53],"address":3302064,"base_stats":[55,70,55,85,40,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":190,"learnset":{"address":3312910,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":6,"move_id":28},{"level":13,"move_id":310},{"level":18,"move_id":226},{"level":25,"move_id":321},{"level":31,"move_id":154},{"level":38,"move_id":129},{"level":43,"move_id":103},{"level":50,"move_id":97}]},"tmhm_learnset":"00A53E82EDF30E25","types":[0,0]},{"abilities":[34,0],"address":3302092,"base_stats":[30,30,30,30,30,30],"catch_rate":235,"evolutions":[{"method":"ITEM","param":93,"species":192}],"friendship":70,"id":191,"learnset":{"address":3312936,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":6,"move_id":74},{"level":13,"move_id":72},{"level":18,"move_id":275},{"level":25,"move_id":283},{"level":30,"move_id":241},{"level":37,"move_id":235},{"level":42,"move_id":202}]},"tmhm_learnset":"00441E08843D8720","types":[12,12]},{"abilities":[34,0],"address":3302120,"base_stats":[75,75,55,30,105,85],"catch_rate":120,"evolutions":[],"friendship":70,"id":192,"learnset":{"address":3312960,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":1},{"level":6,"move_id":74},{"level":13,"move_id":75},{"level":18,"move_id":275},{"level":25,"move_id":331},{"level":30,"move_id":241},{"level":37,"move_id":80},{"level":42,"move_id":76}]},"tmhm_learnset":"00441E08843DC720","types":[12,12]},{"abilities":[3,14],"address":3302148,"base_stats":[65,65,45,95,75,45],"catch_rate":75,"evolutions":[],"friendship":70,"id":193,"learnset":{"address":3312984,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":193},{"level":7,"move_id":98},{"level":13,"move_id":104},{"level":19,"move_id":49},{"level":25,"move_id":197},{"level":31,"move_id":48},{"level":37,"move_id":253},{"level":43,"move_id":17},{"level":49,"move_id":103}]},"tmhm_learnset":"00407E80B4350620","types":[6,2]},{"abilities":[6,11],"address":3302176,"base_stats":[55,45,45,15,25,25],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":195}],"friendship":70,"id":194,"learnset":{"address":3313010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":21,"move_id":133},{"level":31,"move_id":281},{"level":36,"move_id":89},{"level":41,"move_id":240},{"level":51,"move_id":54},{"level":51,"move_id":114}]},"tmhm_learnset":"03D01E188E533264","types":[11,4]},{"abilities":[6,11],"address":3302204,"base_stats":[95,85,85,35,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":195,"learnset":{"address":3313036,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":23,"move_id":133},{"level":35,"move_id":281},{"level":42,"move_id":89},{"level":49,"move_id":240},{"level":61,"move_id":54},{"level":61,"move_id":114}]},"tmhm_learnset":"03F01E58CE537265","types":[11,4]},{"abilities":[28,0],"address":3302232,"base_stats":[65,65,60,110,130,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":196,"learnset":{"address":3313062,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":93},{"level":23,"move_id":98},{"level":30,"move_id":129},{"level":36,"move_id":60},{"level":42,"move_id":244},{"level":47,"move_id":94},{"level":52,"move_id":234}]},"tmhm_learnset":"00449E01BC53C628","types":[14,14]},{"abilities":[28,0],"address":3302260,"base_stats":[95,65,110,65,60,130],"catch_rate":45,"evolutions":[],"friendship":35,"id":197,"learnset":{"address":3313088,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":228},{"level":23,"move_id":98},{"level":30,"move_id":109},{"level":36,"move_id":185},{"level":42,"move_id":212},{"level":47,"move_id":103},{"level":52,"move_id":236}]},"tmhm_learnset":"00451F00BC534E20","types":[17,17]},{"abilities":[15,0],"address":3302288,"base_stats":[60,85,42,91,85,42],"catch_rate":30,"evolutions":[],"friendship":35,"id":198,"learnset":{"address":3313114,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":9,"move_id":310},{"level":14,"move_id":228},{"level":22,"move_id":114},{"level":27,"move_id":101},{"level":35,"move_id":185},{"level":40,"move_id":269},{"level":48,"move_id":212}]},"tmhm_learnset":"00097F80A4130E28","types":[17,2]},{"abilities":[12,20],"address":3302316,"base_stats":[95,75,80,30,100,110],"catch_rate":70,"evolutions":[],"friendship":70,"id":199,"learnset":{"address":3313138,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":207},{"level":48,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[26,0],"address":3302344,"base_stats":[60,60,60,85,85,85],"catch_rate":45,"evolutions":[],"friendship":35,"id":200,"learnset":{"address":3313162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":149},{"level":6,"move_id":180},{"level":11,"move_id":310},{"level":17,"move_id":109},{"level":23,"move_id":212},{"level":30,"move_id":60},{"level":37,"move_id":220},{"level":45,"move_id":195},{"level":53,"move_id":288}]},"tmhm_learnset":"0041BF82B5930E28","types":[7,7]},{"abilities":[26,0],"address":3302372,"base_stats":[48,72,48,48,72,48],"catch_rate":225,"evolutions":[],"friendship":70,"id":201,"learnset":{"address":3313188,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":237}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[23,0],"address":3302400,"base_stats":[190,33,58,33,33,58],"catch_rate":45,"evolutions":[],"friendship":70,"id":202,"learnset":{"address":3313198,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":243},{"level":1,"move_id":219},{"level":1,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[39,48],"address":3302428,"base_stats":[70,80,65,85,90,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":203,"learnset":{"address":3313208,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":7,"move_id":310},{"level":13,"move_id":93},{"level":19,"move_id":23},{"level":25,"move_id":316},{"level":31,"move_id":97},{"level":37,"move_id":226},{"level":43,"move_id":60},{"level":49,"move_id":242}]},"tmhm_learnset":"00E0BE03B7D38628","types":[0,14]},{"abilities":[5,0],"address":3302456,"base_stats":[50,65,90,15,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":205}],"friendship":70,"id":204,"learnset":{"address":3313234,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":36,"move_id":153},{"level":43,"move_id":191},{"level":50,"move_id":38}]},"tmhm_learnset":"00A01E118E358620","types":[6,6]},{"abilities":[5,0],"address":3302484,"base_stats":[75,90,140,40,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":205,"learnset":{"address":3313258,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":1,"move_id":120},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":39,"move_id":153},{"level":49,"move_id":191},{"level":59,"move_id":38}]},"tmhm_learnset":"00A01E118E35C620","types":[6,8]},{"abilities":[32,50],"address":3302512,"base_stats":[100,70,70,45,65,65],"catch_rate":190,"evolutions":[],"friendship":70,"id":206,"learnset":{"address":3313282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":4,"move_id":111},{"level":11,"move_id":281},{"level":14,"move_id":137},{"level":21,"move_id":180},{"level":24,"move_id":228},{"level":31,"move_id":103},{"level":34,"move_id":36},{"level":41,"move_id":283}]},"tmhm_learnset":"00A03E66AFF3362C","types":[0,0]},{"abilities":[52,8],"address":3302540,"base_stats":[65,75,105,85,35,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":207,"learnset":{"address":3313308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":28},{"level":13,"move_id":106},{"level":20,"move_id":98},{"level":28,"move_id":185},{"level":36,"move_id":163},{"level":44,"move_id":103},{"level":52,"move_id":12}]},"tmhm_learnset":"00A47ED88E530620","types":[4,2]},{"abilities":[69,5],"address":3302568,"base_stats":[75,85,200,30,55,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":208,"learnset":{"address":3313332,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":242},{"level":57,"move_id":38}]},"tmhm_learnset":"00A41F508E514E30","types":[8,4]},{"abilities":[22,50],"address":3302596,"base_stats":[60,80,50,30,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":23,"species":210}],"friendship":70,"id":209,"learnset":{"address":3313360,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":26,"move_id":46},{"level":34,"move_id":99},{"level":43,"move_id":36},{"level":53,"move_id":242}]},"tmhm_learnset":"00A23F2EEFB30EB5","types":[0,0]},{"abilities":[22,22],"address":3302624,"base_stats":[90,120,75,45,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":210,"learnset":{"address":3313386,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":28,"move_id":46},{"level":38,"move_id":99},{"level":49,"move_id":36},{"level":61,"move_id":242}]},"tmhm_learnset":"00A23F6EEFF34EB5","types":[0,0]},{"abilities":[38,33],"address":3302652,"base_stats":[65,95,75,85,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":211,"learnset":{"address":3313412,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":191},{"level":1,"move_id":33},{"level":1,"move_id":40},{"level":10,"move_id":106},{"level":10,"move_id":107},{"level":19,"move_id":55},{"level":28,"move_id":42},{"level":37,"move_id":36},{"level":46,"move_id":56}]},"tmhm_learnset":"03101E0AA4133264","types":[11,3]},{"abilities":[68,0],"address":3302680,"base_stats":[70,130,100,65,55,80],"catch_rate":25,"evolutions":[],"friendship":70,"id":212,"learnset":{"address":3313434,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":232},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00A47E9084134620","types":[6,8]},{"abilities":[5,0],"address":3302708,"base_stats":[20,10,230,5,10,230],"catch_rate":190,"evolutions":[],"friendship":70,"id":213,"learnset":{"address":3313462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":9,"move_id":35},{"level":14,"move_id":227},{"level":23,"move_id":219},{"level":28,"move_id":117},{"level":37,"move_id":156}]},"tmhm_learnset":"00E01E588E190620","types":[6,5]},{"abilities":[68,62],"address":3302736,"base_stats":[80,125,75,85,40,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":214,"learnset":{"address":3313482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":30},{"level":11,"move_id":203},{"level":17,"move_id":31},{"level":23,"move_id":280},{"level":30,"move_id":68},{"level":37,"move_id":36},{"level":45,"move_id":179},{"level":53,"move_id":224}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,1]},{"abilities":[39,51],"address":3302764,"base_stats":[55,95,55,115,35,75],"catch_rate":60,"evolutions":[],"friendship":35,"id":215,"learnset":{"address":3313508,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":269},{"level":8,"move_id":98},{"level":15,"move_id":103},{"level":22,"move_id":185},{"level":29,"move_id":154},{"level":36,"move_id":97},{"level":43,"move_id":196},{"level":50,"move_id":163},{"level":57,"move_id":251},{"level":64,"move_id":232}]},"tmhm_learnset":"00B53F80EC533E69","types":[17,15]},{"abilities":[53,0],"address":3302792,"base_stats":[60,80,50,40,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":217}],"friendship":70,"id":216,"learnset":{"address":3313536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43F80CE130EB1","types":[0,0]},{"abilities":[62,0],"address":3302820,"base_stats":[90,130,75,55,75,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":217,"learnset":{"address":3313562,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":122},{"level":1,"move_id":154},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43FC0CE134EB1","types":[0,0]},{"abilities":[40,49],"address":3302848,"base_stats":[40,40,40,20,70,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":219}],"friendship":70,"id":218,"learnset":{"address":3313588,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":43,"move_id":157},{"level":50,"move_id":34}]},"tmhm_learnset":"00821E2584118620","types":[10,10]},{"abilities":[40,49],"address":3302876,"base_stats":[50,50,120,30,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":219,"learnset":{"address":3313612,"moves":[{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":1,"move_id":52},{"level":1,"move_id":88},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":48,"move_id":157},{"level":60,"move_id":34}]},"tmhm_learnset":"00A21E758611C620","types":[10,5]},{"abilities":[12,0],"address":3302904,"base_stats":[50,50,40,50,30,30],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":221}],"friendship":70,"id":220,"learnset":{"address":3313636,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":316},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":37,"move_id":54},{"level":46,"move_id":59},{"level":55,"move_id":133}]},"tmhm_learnset":"00A01E518E13B270","types":[15,4]},{"abilities":[12,0],"address":3302932,"base_stats":[100,100,80,50,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":221,"learnset":{"address":3313658,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":316},{"level":1,"move_id":181},{"level":1,"move_id":203},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":33,"move_id":31},{"level":42,"move_id":54},{"level":56,"move_id":59},{"level":70,"move_id":133}]},"tmhm_learnset":"00A01E518E13F270","types":[15,4]},{"abilities":[55,30],"address":3302960,"base_stats":[55,55,85,35,65,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":222,"learnset":{"address":3313682,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":106},{"level":12,"move_id":145},{"level":17,"move_id":105},{"level":17,"move_id":287},{"level":23,"move_id":61},{"level":28,"move_id":131},{"level":34,"move_id":350},{"level":39,"move_id":243},{"level":45,"move_id":246}]},"tmhm_learnset":"00B01E51BE1BB66C","types":[11,5]},{"abilities":[55,0],"address":3302988,"base_stats":[35,65,35,65,65,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":224}],"friendship":70,"id":223,"learnset":{"address":3313710,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":199},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":33,"move_id":116},{"level":44,"move_id":58},{"level":55,"move_id":63}]},"tmhm_learnset":"03103E2494137624","types":[11,11]},{"abilities":[21,0],"address":3303016,"base_stats":[75,105,75,45,105,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":224,"learnset":{"address":3313734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":132},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":25,"move_id":190},{"level":38,"move_id":116},{"level":54,"move_id":58},{"level":70,"move_id":63}]},"tmhm_learnset":"03103E2C94137724","types":[11,11]},{"abilities":[72,55],"address":3303044,"base_stats":[45,55,45,75,65,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":225,"learnset":{"address":3313760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":217}]},"tmhm_learnset":"00083E8084133265","types":[15,2]},{"abilities":[33,11],"address":3303072,"base_stats":[65,40,70,70,80,140],"catch_rate":25,"evolutions":[],"friendship":70,"id":226,"learnset":{"address":3313770,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":145},{"level":8,"move_id":48},{"level":15,"move_id":61},{"level":22,"move_id":36},{"level":29,"move_id":97},{"level":36,"move_id":17},{"level":43,"move_id":352},{"level":50,"move_id":109}]},"tmhm_learnset":"03101E8086133264","types":[11,2]},{"abilities":[51,5],"address":3303100,"base_stats":[65,80,140,70,40,70],"catch_rate":25,"evolutions":[],"friendship":70,"id":227,"learnset":{"address":3313794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":10,"move_id":28},{"level":13,"move_id":129},{"level":16,"move_id":97},{"level":26,"move_id":31},{"level":29,"move_id":314},{"level":32,"move_id":211},{"level":42,"move_id":191},{"level":45,"move_id":319}]},"tmhm_learnset":"008C7F9084110E30","types":[8,2]},{"abilities":[48,18],"address":3303128,"base_stats":[45,60,30,65,80,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":24,"species":229}],"friendship":35,"id":228,"learnset":{"address":3313820,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":25,"move_id":44},{"level":31,"move_id":316},{"level":37,"move_id":185},{"level":43,"move_id":53},{"level":49,"move_id":242}]},"tmhm_learnset":"00833F2CA4710E30","types":[17,10]},{"abilities":[48,18],"address":3303156,"base_stats":[75,90,50,95,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":229,"learnset":{"address":3313846,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":1,"move_id":336},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":27,"move_id":44},{"level":35,"move_id":316},{"level":43,"move_id":185},{"level":51,"move_id":53},{"level":59,"move_id":242}]},"tmhm_learnset":"00A33F2CA4714E30","types":[17,10]},{"abilities":[33,0],"address":3303184,"base_stats":[75,95,95,85,95,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":230,"learnset":{"address":3313872,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,16]},{"abilities":[53,0],"address":3303212,"base_stats":[90,60,60,40,40,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":25,"species":232}],"friendship":70,"id":231,"learnset":{"address":3313896,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":36},{"level":33,"move_id":205},{"level":41,"move_id":203},{"level":49,"move_id":38}]},"tmhm_learnset":"00A01E5086510630","types":[4,4]},{"abilities":[5,0],"address":3303240,"base_stats":[90,120,120,50,60,60],"catch_rate":60,"evolutions":[],"friendship":70,"id":232,"learnset":{"address":3313918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":30},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":31},{"level":33,"move_id":205},{"level":41,"move_id":229},{"level":49,"move_id":89}]},"tmhm_learnset":"00A01E5086514630","types":[4,4]},{"abilities":[36,0],"address":3303268,"base_stats":[85,80,90,60,105,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":233,"learnset":{"address":3313940,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":111},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[22,0],"address":3303296,"base_stats":[73,95,62,85,85,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":234,"learnset":{"address":3313966,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":43},{"level":13,"move_id":310},{"level":19,"move_id":95},{"level":25,"move_id":23},{"level":31,"move_id":28},{"level":37,"move_id":36},{"level":43,"move_id":109},{"level":49,"move_id":347}]},"tmhm_learnset":"0040BE03B7F38638","types":[0,0]},{"abilities":[20,0],"address":3303324,"base_stats":[55,20,35,75,20,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":235,"learnset":{"address":3313992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":166},{"level":11,"move_id":166},{"level":21,"move_id":166},{"level":31,"move_id":166},{"level":41,"move_id":166},{"level":51,"move_id":166},{"level":61,"move_id":166},{"level":71,"move_id":166},{"level":81,"move_id":166},{"level":91,"move_id":166}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[62,0],"address":3303352,"base_stats":[35,35,35,35,35,35],"catch_rate":75,"evolutions":[{"method":"LEVEL_ATK_LT_DEF","param":20,"species":107},{"method":"LEVEL_ATK_GT_DEF","param":20,"species":106},{"method":"LEVEL_ATK_EQ_DEF","param":20,"species":237}],"friendship":70,"id":236,"learnset":{"address":3314020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"00A03E00C61306A0","types":[1,1]},{"abilities":[22,0],"address":3303380,"base_stats":[50,95,95,70,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":237,"learnset":{"address":3314030,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":27},{"level":7,"move_id":116},{"level":13,"move_id":228},{"level":19,"move_id":98},{"level":20,"move_id":167},{"level":25,"move_id":229},{"level":31,"move_id":68},{"level":37,"move_id":97},{"level":43,"move_id":197},{"level":49,"move_id":283}]},"tmhm_learnset":"00A03E10CE1306A0","types":[1,1]},{"abilities":[12,0],"address":3303408,"base_stats":[45,30,15,65,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":124}],"friendship":70,"id":238,"learnset":{"address":3314058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":9,"move_id":186},{"level":13,"move_id":181},{"level":21,"move_id":93},{"level":25,"move_id":47},{"level":33,"move_id":212},{"level":37,"move_id":313},{"level":45,"move_id":94},{"level":49,"move_id":195},{"level":57,"move_id":59}]},"tmhm_learnset":"0040BE01B413B26C","types":[15,14]},{"abilities":[9,0],"address":3303436,"base_stats":[45,63,37,95,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":125}],"friendship":70,"id":239,"learnset":{"address":3314086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":33,"move_id":103},{"level":41,"move_id":85},{"level":49,"move_id":87}]},"tmhm_learnset":"00C03E02D5938221","types":[13,13]},{"abilities":[49,0],"address":3303464,"base_stats":[45,75,37,83,70,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":126}],"friendship":70,"id":240,"learnset":{"address":3314108,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":31,"move_id":241},{"level":37,"move_id":53},{"level":43,"move_id":109},{"level":49,"move_id":126}]},"tmhm_learnset":"00803E24D4510621","types":[10,10]},{"abilities":[47,0],"address":3303492,"base_stats":[95,80,105,100,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":241,"learnset":{"address":3314134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":8,"move_id":111},{"level":13,"move_id":23},{"level":19,"move_id":208},{"level":26,"move_id":117},{"level":34,"move_id":205},{"level":43,"move_id":34},{"level":53,"move_id":215}]},"tmhm_learnset":"00B01E52E7F37625","types":[0,0]},{"abilities":[30,32],"address":3303520,"base_stats":[255,10,10,55,75,135],"catch_rate":30,"evolutions":[],"friendship":140,"id":242,"learnset":{"address":3314160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":4,"move_id":39},{"level":7,"move_id":287},{"level":10,"move_id":135},{"level":13,"move_id":3},{"level":18,"move_id":107},{"level":23,"move_id":47},{"level":28,"move_id":121},{"level":33,"move_id":111},{"level":40,"move_id":113},{"level":47,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[46,0],"address":3303548,"base_stats":[90,85,75,115,115,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":243,"learnset":{"address":3314190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":84},{"level":21,"move_id":46},{"level":31,"move_id":98},{"level":41,"move_id":209},{"level":51,"move_id":115},{"level":61,"move_id":242},{"level":71,"move_id":87},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E138DD34638","types":[13,13]},{"abilities":[46,0],"address":3303576,"base_stats":[115,115,85,100,90,75],"catch_rate":3,"evolutions":[],"friendship":35,"id":244,"learnset":{"address":3314216,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":52},{"level":21,"move_id":46},{"level":31,"move_id":83},{"level":41,"move_id":23},{"level":51,"move_id":53},{"level":61,"move_id":207},{"level":71,"move_id":126},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E358C734638","types":[10,10]},{"abilities":[46,0],"address":3303604,"base_stats":[100,75,115,85,90,115],"catch_rate":3,"evolutions":[],"friendship":35,"id":245,"learnset":{"address":3314242,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":61},{"level":21,"move_id":240},{"level":31,"move_id":16},{"level":41,"move_id":62},{"level":51,"move_id":54},{"level":61,"move_id":243},{"level":71,"move_id":56},{"level":81,"move_id":347}]},"tmhm_learnset":"03940E118C53767C","types":[11,11]},{"abilities":[62,0],"address":3303632,"base_stats":[50,64,50,41,45,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":247}],"friendship":35,"id":246,"learnset":{"address":3314268,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":36,"move_id":184},{"level":43,"move_id":242},{"level":50,"move_id":89},{"level":57,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[61,0],"address":3303660,"base_stats":[70,84,70,51,65,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":248}],"friendship":35,"id":247,"learnset":{"address":3314294,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":56,"move_id":89},{"level":65,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[45,0],"address":3303688,"base_stats":[100,134,110,61,95,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":248,"learnset":{"address":3314320,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":61,"move_id":89},{"level":75,"move_id":63}]},"tmhm_learnset":"00B41FF6CFD37E37","types":[5,17]},{"abilities":[46,0],"address":3303716,"base_stats":[106,90,130,110,90,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":249,"learnset":{"address":3314346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":56},{"level":55,"move_id":240},{"level":66,"move_id":129},{"level":77,"move_id":177},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"03B8CE93B7DFF67C","types":[14,2]},{"abilities":[46,0],"address":3303744,"base_stats":[106,130,90,90,110,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":250,"learnset":{"address":3314374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":126},{"level":55,"move_id":241},{"level":66,"move_id":129},{"level":77,"move_id":221},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"00EA4EB7B7BFC638","types":[10,2]},{"abilities":[30,0],"address":3303772,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":251,"learnset":{"address":3314402,"moves":[{"level":1,"move_id":73},{"level":1,"move_id":93},{"level":1,"move_id":105},{"level":1,"move_id":215},{"level":10,"move_id":219},{"level":20,"move_id":246},{"level":30,"move_id":248},{"level":40,"move_id":226},{"level":50,"move_id":195}]},"tmhm_learnset":"00448E93B43FC62C","types":[14,12]},{"abilities":[0,0],"address":3303800,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":252,"learnset":{"address":3314422,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303828,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":253,"learnset":{"address":3314432,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303856,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":254,"learnset":{"address":3314442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303884,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":255,"learnset":{"address":3314452,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303912,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":256,"learnset":{"address":3314462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303940,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":257,"learnset":{"address":3314472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303968,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":258,"learnset":{"address":3314482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303996,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":259,"learnset":{"address":3314492,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304024,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":260,"learnset":{"address":3314502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304052,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":261,"learnset":{"address":3314512,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304080,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":262,"learnset":{"address":3314522,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304108,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":263,"learnset":{"address":3314532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304136,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":264,"learnset":{"address":3314542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304164,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":265,"learnset":{"address":3314552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304192,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":266,"learnset":{"address":3314562,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304220,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":267,"learnset":{"address":3314572,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304248,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":268,"learnset":{"address":3314582,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304276,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":269,"learnset":{"address":3314592,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304304,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":270,"learnset":{"address":3314602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304332,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":271,"learnset":{"address":3314612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304360,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":272,"learnset":{"address":3314622,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304388,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":273,"learnset":{"address":3314632,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304416,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":274,"learnset":{"address":3314642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304444,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":275,"learnset":{"address":3314652,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304472,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":276,"learnset":{"address":3314662,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3304500,"base_stats":[40,45,35,70,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":278}],"friendship":70,"id":277,"learnset":{"address":3314672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":228},{"level":21,"move_id":103},{"level":26,"move_id":72},{"level":31,"move_id":97},{"level":36,"move_id":21},{"level":41,"move_id":197},{"level":46,"move_id":202}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304528,"base_stats":[50,65,45,95,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":279}],"friendship":70,"id":278,"learnset":{"address":3314700,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":41,"move_id":21},{"level":47,"move_id":197},{"level":53,"move_id":206}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304556,"base_stats":[70,85,65,120,105,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":279,"learnset":{"address":3314730,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":43,"move_id":21},{"level":51,"move_id":197},{"level":59,"move_id":206}]},"tmhm_learnset":"00E41EC0CE7D4733","types":[12,12]},{"abilities":[66,0],"address":3304584,"base_stats":[45,60,40,45,70,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":281}],"friendship":70,"id":280,"learnset":{"address":3314760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":116},{"level":10,"move_id":52},{"level":16,"move_id":64},{"level":19,"move_id":28},{"level":25,"move_id":83},{"level":28,"move_id":98},{"level":34,"move_id":163},{"level":37,"move_id":119},{"level":43,"move_id":53}]},"tmhm_learnset":"00A61EE48C110620","types":[10,10]},{"abilities":[66,0],"address":3304612,"base_stats":[60,85,60,55,85,60],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":282}],"friendship":70,"id":281,"learnset":{"address":3314788,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":39,"move_id":163},{"level":43,"move_id":119},{"level":50,"move_id":327}]},"tmhm_learnset":"00A61EE4CC1106A1","types":[10,1]},{"abilities":[66,0],"address":3304640,"base_stats":[80,120,70,80,110,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":282,"learnset":{"address":3314818,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":36,"move_id":299},{"level":42,"move_id":163},{"level":49,"move_id":119},{"level":59,"move_id":327}]},"tmhm_learnset":"00A61EE4CE1146B1","types":[10,1]},{"abilities":[67,0],"address":3304668,"base_stats":[50,70,50,40,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":284}],"friendship":70,"id":283,"learnset":{"address":3314852,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":19,"move_id":193},{"level":24,"move_id":300},{"level":28,"move_id":36},{"level":33,"move_id":250},{"level":37,"move_id":182},{"level":42,"move_id":56},{"level":46,"move_id":283}]},"tmhm_learnset":"03B01E408C533264","types":[11,11]},{"abilities":[67,0],"address":3304696,"base_stats":[70,85,70,50,60,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":285}],"friendship":70,"id":284,"learnset":{"address":3314882,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":37,"move_id":330},{"level":42,"move_id":182},{"level":46,"move_id":89},{"level":53,"move_id":283}]},"tmhm_learnset":"03B01E408E533264","types":[11,4]},{"abilities":[67,0],"address":3304724,"base_stats":[100,110,90,60,85,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":285,"learnset":{"address":3314914,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":39,"move_id":330},{"level":46,"move_id":182},{"level":52,"move_id":89},{"level":61,"move_id":283}]},"tmhm_learnset":"03B01E40CE537275","types":[11,4]},{"abilities":[50,0],"address":3304752,"base_stats":[35,55,35,35,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":287}],"friendship":70,"id":286,"learnset":{"address":3314946,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":21,"move_id":46},{"level":25,"move_id":207},{"level":29,"move_id":184},{"level":33,"move_id":36},{"level":37,"move_id":269},{"level":41,"move_id":242},{"level":45,"move_id":168}]},"tmhm_learnset":"00813F00AC530E30","types":[17,17]},{"abilities":[22,0],"address":3304780,"base_stats":[70,90,70,70,60,60],"catch_rate":127,"evolutions":[],"friendship":70,"id":287,"learnset":{"address":3314978,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":336},{"level":1,"move_id":28},{"level":1,"move_id":44},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":22,"move_id":46},{"level":27,"move_id":207},{"level":32,"move_id":184},{"level":37,"move_id":36},{"level":42,"move_id":269},{"level":47,"move_id":242},{"level":52,"move_id":168}]},"tmhm_learnset":"00A13F00AC534E30","types":[17,17]},{"abilities":[53,0],"address":3304808,"base_stats":[38,30,41,60,30,41],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":289}],"friendship":70,"id":288,"learnset":{"address":3315010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":21,"move_id":300},{"level":25,"move_id":42},{"level":29,"move_id":343},{"level":33,"move_id":175},{"level":37,"move_id":156},{"level":41,"move_id":187}]},"tmhm_learnset":"00943E02ADD33624","types":[0,0]},{"abilities":[53,0],"address":3304836,"base_stats":[78,70,61,100,50,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":289,"learnset":{"address":3315040,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":23,"move_id":300},{"level":29,"move_id":154},{"level":35,"move_id":343},{"level":41,"move_id":163},{"level":47,"move_id":156},{"level":53,"move_id":187}]},"tmhm_learnset":"00B43E02ADD37634","types":[0,0]},{"abilities":[19,0],"address":3304864,"base_stats":[45,45,35,20,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_SILCOON","param":7,"species":291},{"method":"LEVEL_CASCOON","param":7,"species":293}],"friendship":70,"id":290,"learnset":{"address":3315070,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81},{"level":5,"move_id":40}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3304892,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":292}],"friendship":70,"id":291,"learnset":{"address":3315082,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[68,0],"address":3304920,"base_stats":[60,70,50,65,90,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":292,"learnset":{"address":3315094,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":10,"move_id":71},{"level":13,"move_id":16},{"level":17,"move_id":78},{"level":20,"move_id":234},{"level":24,"move_id":72},{"level":27,"move_id":18},{"level":31,"move_id":213},{"level":34,"move_id":318},{"level":38,"move_id":202}]},"tmhm_learnset":"00403E80B43D4620","types":[6,2]},{"abilities":[61,0],"address":3304948,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":294}],"friendship":70,"id":293,"learnset":{"address":3315122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[19,0],"address":3304976,"base_stats":[60,50,70,65,50,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":294,"learnset":{"address":3315134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":16},{"level":17,"move_id":182},{"level":20,"move_id":236},{"level":24,"move_id":60},{"level":27,"move_id":18},{"level":31,"move_id":113},{"level":34,"move_id":318},{"level":38,"move_id":92}]},"tmhm_learnset":"00403E88B435C620","types":[6,3]},{"abilities":[33,44],"address":3305004,"base_stats":[40,30,30,30,40,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":296}],"friendship":70,"id":295,"learnset":{"address":3315162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":21,"move_id":54},{"level":31,"move_id":240},{"level":43,"move_id":72}]},"tmhm_learnset":"00503E0084373764","types":[11,12]},{"abilities":[33,44],"address":3305032,"base_stats":[60,50,50,50,60,70],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":297}],"friendship":70,"id":296,"learnset":{"address":3315184,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":154},{"level":31,"move_id":346},{"level":37,"move_id":168},{"level":43,"move_id":253},{"level":49,"move_id":56}]},"tmhm_learnset":"03F03E00C4373764","types":[11,12]},{"abilities":[33,44],"address":3305060,"base_stats":[80,70,70,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":297,"learnset":{"address":3315212,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":45},{"level":1,"move_id":71},{"level":1,"move_id":267}]},"tmhm_learnset":"03F03E00C4377765","types":[11,12]},{"abilities":[34,48],"address":3305088,"base_stats":[40,40,50,30,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":299}],"friendship":70,"id":298,"learnset":{"address":3315222,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":21,"move_id":235},{"level":31,"move_id":241},{"level":43,"move_id":153}]},"tmhm_learnset":"00C01E00AC350720","types":[12,12]},{"abilities":[34,48],"address":3305116,"base_stats":[70,70,40,60,60,40],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":300}],"friendship":70,"id":299,"learnset":{"address":3315244,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":259},{"level":31,"move_id":185},{"level":37,"move_id":13},{"level":43,"move_id":207},{"level":49,"move_id":326}]},"tmhm_learnset":"00E43F40EC354720","types":[12,17]},{"abilities":[34,48],"address":3305144,"base_stats":[90,100,60,80,90,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":300,"learnset":{"address":3315272,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":1,"move_id":74},{"level":1,"move_id":267}]},"tmhm_learnset":"00E43FC0EC354720","types":[12,17]},{"abilities":[14,0],"address":3305172,"base_stats":[31,45,90,40,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_NINJASK","param":20,"species":302},{"method":"LEVEL_SHEDINJA","param":20,"species":303}],"friendship":70,"id":301,"learnset":{"address":3315282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":206},{"level":31,"move_id":189},{"level":38,"move_id":232},{"level":45,"move_id":91}]},"tmhm_learnset":"00440E90AC350620","types":[6,4]},{"abilities":[3,0],"address":3305200,"base_stats":[61,90,45,160,50,50],"catch_rate":120,"evolutions":[],"friendship":70,"id":302,"learnset":{"address":3315308,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":141},{"level":1,"move_id":28},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":20,"move_id":104},{"level":20,"move_id":210},{"level":20,"move_id":103},{"level":25,"move_id":14},{"level":31,"move_id":163},{"level":38,"move_id":97},{"level":45,"move_id":226}]},"tmhm_learnset":"00443E90AC354620","types":[6,2]},{"abilities":[25,0],"address":3305228,"base_stats":[1,90,45,40,30,30],"catch_rate":45,"evolutions":[],"friendship":70,"id":303,"learnset":{"address":3315340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":180},{"level":31,"move_id":109},{"level":38,"move_id":247},{"level":45,"move_id":288}]},"tmhm_learnset":"00442E90AC354620","types":[6,7]},{"abilities":[62,0],"address":3305256,"base_stats":[40,55,30,85,30,30],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":305}],"friendship":70,"id":304,"learnset":{"address":3315366,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":26,"move_id":283},{"level":34,"move_id":332},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[62,0],"address":3305284,"base_stats":[60,85,60,125,50,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":305,"learnset":{"address":3315390,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":98},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":28,"move_id":283},{"level":38,"move_id":332},{"level":49,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[27,0],"address":3305312,"base_stats":[60,40,60,35,40,60],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":23,"species":307}],"friendship":70,"id":306,"learnset":{"address":3315414,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":28,"move_id":77},{"level":36,"move_id":74},{"level":45,"move_id":202},{"level":54,"move_id":147}]},"tmhm_learnset":"00411E08843D0720","types":[12,12]},{"abilities":[27,0],"address":3305340,"base_stats":[60,130,80,70,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":307,"learnset":{"address":3315442,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":33},{"level":1,"move_id":78},{"level":1,"move_id":73},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":23,"move_id":183},{"level":28,"move_id":68},{"level":36,"move_id":327},{"level":45,"move_id":170},{"level":54,"move_id":223}]},"tmhm_learnset":"00E51E08C47D47A1","types":[12,1]},{"abilities":[20,0],"address":3305368,"base_stats":[60,60,60,60,60,60],"catch_rate":255,"evolutions":[],"friendship":70,"id":308,"learnset":{"address":3315472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":253},{"level":12,"move_id":185},{"level":16,"move_id":60},{"level":23,"move_id":95},{"level":27,"move_id":146},{"level":34,"move_id":298},{"level":38,"move_id":244},{"level":45,"move_id":38},{"level":49,"move_id":175},{"level":56,"move_id":37}]},"tmhm_learnset":"00E1BE42FC1B062D","types":[0,0]},{"abilities":[51,0],"address":3305396,"base_stats":[40,30,30,85,55,30],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":310}],"friendship":70,"id":309,"learnset":{"address":3315502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":31,"move_id":98},{"level":43,"move_id":228},{"level":55,"move_id":97}]},"tmhm_learnset":"00087E8284133264","types":[11,2]},{"abilities":[51,0],"address":3305424,"base_stats":[60,50,100,65,85,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":310,"learnset":{"address":3315524,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":346},{"level":1,"move_id":17},{"level":3,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":25,"move_id":182},{"level":33,"move_id":254},{"level":33,"move_id":256},{"level":47,"move_id":255},{"level":61,"move_id":56}]},"tmhm_learnset":"00187E8284137264","types":[11,2]},{"abilities":[33,0],"address":3305452,"base_stats":[40,30,32,65,50,52],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":312}],"friendship":70,"id":311,"learnset":{"address":3315552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":25,"move_id":61},{"level":31,"move_id":97},{"level":37,"move_id":54},{"level":37,"move_id":114}]},"tmhm_learnset":"00403E00A4373624","types":[6,11]},{"abilities":[22,0],"address":3305480,"base_stats":[70,60,62,60,80,82],"catch_rate":75,"evolutions":[],"friendship":70,"id":312,"learnset":{"address":3315576,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":98},{"level":1,"move_id":230},{"level":1,"move_id":346},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":26,"move_id":16},{"level":33,"move_id":184},{"level":40,"move_id":78},{"level":47,"move_id":318},{"level":53,"move_id":18}]},"tmhm_learnset":"00403E80A4377624","types":[6,2]},{"abilities":[41,12],"address":3305508,"base_stats":[130,70,35,60,70,35],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":40,"species":314}],"friendship":70,"id":313,"learnset":{"address":3315602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":150},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":41,"move_id":323},{"level":46,"move_id":133},{"level":50,"move_id":56}]},"tmhm_learnset":"03B01E4086133274","types":[11,11]},{"abilities":[41,12],"address":3305536,"base_stats":[170,90,45,60,90,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":314,"learnset":{"address":3315634,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":205},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":44,"move_id":323},{"level":52,"move_id":133},{"level":59,"move_id":56}]},"tmhm_learnset":"03B01E4086137274","types":[11,11]},{"abilities":[56,0],"address":3305564,"base_stats":[50,45,45,50,35,35],"catch_rate":255,"evolutions":[{"method":"ITEM","param":94,"species":316}],"friendship":70,"id":315,"learnset":{"address":3315666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":3,"move_id":39},{"level":7,"move_id":213},{"level":13,"move_id":47},{"level":15,"move_id":3},{"level":19,"move_id":274},{"level":25,"move_id":204},{"level":27,"move_id":185},{"level":31,"move_id":343},{"level":37,"move_id":215},{"level":39,"move_id":38}]},"tmhm_learnset":"00401E02ADFB362C","types":[0,0]},{"abilities":[56,0],"address":3305592,"base_stats":[70,65,65,70,55,55],"catch_rate":60,"evolutions":[],"friendship":70,"id":316,"learnset":{"address":3315696,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":213},{"level":1,"move_id":47},{"level":1,"move_id":3}]},"tmhm_learnset":"00E01E02ADFB762C","types":[0,0]},{"abilities":[16,0],"address":3305620,"base_stats":[60,90,70,40,60,120],"catch_rate":200,"evolutions":[],"friendship":70,"id":317,"learnset":{"address":3315706,"moves":[{"level":1,"move_id":168},{"level":1,"move_id":39},{"level":1,"move_id":310},{"level":1,"move_id":122},{"level":1,"move_id":10},{"level":4,"move_id":20},{"level":7,"move_id":185},{"level":12,"move_id":154},{"level":17,"move_id":60},{"level":24,"move_id":103},{"level":31,"move_id":163},{"level":40,"move_id":164},{"level":49,"move_id":246}]},"tmhm_learnset":"00E5BEE6EDF33625","types":[0,0]},{"abilities":[26,0],"address":3305648,"base_stats":[40,40,55,55,40,70],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":36,"species":319}],"friendship":70,"id":318,"learnset":{"address":3315734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":37,"move_id":322},{"level":45,"move_id":153}]},"tmhm_learnset":"00408E51BE339620","types":[4,14]},{"abilities":[26,0],"address":3305676,"base_stats":[60,70,105,75,70,120],"catch_rate":90,"evolutions":[],"friendship":70,"id":319,"learnset":{"address":3315764,"moves":[{"level":1,"move_id":100},{"level":1,"move_id":93},{"level":1,"move_id":106},{"level":1,"move_id":229},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":36,"move_id":63},{"level":42,"move_id":322},{"level":55,"move_id":153}]},"tmhm_learnset":"00E08E51BE33D620","types":[4,14]},{"abilities":[5,42],"address":3305704,"base_stats":[30,45,135,30,45,90],"catch_rate":255,"evolutions":[],"friendship":70,"id":320,"learnset":{"address":3315796,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":106},{"level":13,"move_id":88},{"level":16,"move_id":335},{"level":22,"move_id":86},{"level":28,"move_id":157},{"level":31,"move_id":201},{"level":37,"move_id":156},{"level":43,"move_id":192},{"level":46,"move_id":199}]},"tmhm_learnset":"00A01F5287910E20","types":[5,5]},{"abilities":[73,0],"address":3305732,"base_stats":[70,85,140,20,85,70],"catch_rate":90,"evolutions":[],"friendship":70,"id":321,"learnset":{"address":3315824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":4,"move_id":123},{"level":7,"move_id":174},{"level":14,"move_id":108},{"level":17,"move_id":83},{"level":20,"move_id":34},{"level":27,"move_id":182},{"level":30,"move_id":53},{"level":33,"move_id":334},{"level":40,"move_id":133},{"level":43,"move_id":175},{"level":46,"move_id":257}]},"tmhm_learnset":"00A21E2C84510620","types":[10,10]},{"abilities":[51,0],"address":3305760,"base_stats":[50,75,75,50,65,65],"catch_rate":45,"evolutions":[],"friendship":35,"id":322,"learnset":{"address":3315856,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":10},{"level":5,"move_id":193},{"level":9,"move_id":101},{"level":13,"move_id":310},{"level":17,"move_id":154},{"level":21,"move_id":252},{"level":25,"move_id":197},{"level":29,"move_id":185},{"level":33,"move_id":282},{"level":37,"move_id":109},{"level":41,"move_id":247},{"level":45,"move_id":212}]},"tmhm_learnset":"00C53FC2FC130E2D","types":[17,7]},{"abilities":[12,0],"address":3305788,"base_stats":[50,48,43,60,46,41],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":324}],"friendship":70,"id":323,"learnset":{"address":3315888,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":189},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":31,"move_id":89},{"level":36,"move_id":248},{"level":41,"move_id":90}]},"tmhm_learnset":"03101E5086133264","types":[11,4]},{"abilities":[12,0],"address":3305816,"base_stats":[110,78,73,60,76,71],"catch_rate":75,"evolutions":[],"friendship":70,"id":324,"learnset":{"address":3315918,"moves":[{"level":1,"move_id":321},{"level":1,"move_id":189},{"level":1,"move_id":300},{"level":1,"move_id":346},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":36,"move_id":89},{"level":46,"move_id":248},{"level":56,"move_id":90}]},"tmhm_learnset":"03B01E5086137264","types":[11,4]},{"abilities":[33,0],"address":3305844,"base_stats":[43,30,55,97,40,65],"catch_rate":225,"evolutions":[],"friendship":70,"id":325,"learnset":{"address":3315948,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":204},{"level":12,"move_id":55},{"level":16,"move_id":97},{"level":24,"move_id":36},{"level":28,"move_id":213},{"level":36,"move_id":186},{"level":40,"move_id":175},{"level":48,"move_id":219}]},"tmhm_learnset":"03101E00841B3264","types":[11,11]},{"abilities":[52,75],"address":3305872,"base_stats":[43,80,65,35,50,35],"catch_rate":205,"evolutions":[{"method":"LEVEL","param":30,"species":327}],"friendship":70,"id":326,"learnset":{"address":3315974,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":32,"move_id":269},{"level":35,"move_id":152},{"level":38,"move_id":14},{"level":44,"move_id":12}]},"tmhm_learnset":"01B41EC8CC133A64","types":[11,11]},{"abilities":[52,75],"address":3305900,"base_stats":[63,120,85,55,90,55],"catch_rate":155,"evolutions":[],"friendship":70,"id":327,"learnset":{"address":3316004,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":106},{"level":1,"move_id":11},{"level":1,"move_id":43},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":34,"move_id":269},{"level":39,"move_id":152},{"level":44,"move_id":14},{"level":52,"move_id":12}]},"tmhm_learnset":"03B41EC8CC137A64","types":[11,17]},{"abilities":[33,0],"address":3305928,"base_stats":[20,15,20,80,10,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":30,"species":329}],"friendship":70,"id":328,"learnset":{"address":3316034,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[63,0],"address":3305956,"base_stats":[95,60,79,81,100,125],"catch_rate":60,"evolutions":[],"friendship":70,"id":329,"learnset":{"address":3316048,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":5,"move_id":35},{"level":10,"move_id":346},{"level":15,"move_id":287},{"level":20,"move_id":352},{"level":25,"move_id":239},{"level":30,"move_id":105},{"level":35,"move_id":240},{"level":40,"move_id":56},{"level":45,"move_id":213},{"level":50,"move_id":219}]},"tmhm_learnset":"03101E00845B7264","types":[11,11]},{"abilities":[24,0],"address":3305984,"base_stats":[45,90,20,65,65,20],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":30,"species":331}],"friendship":35,"id":330,"learnset":{"address":3316078,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":31,"move_id":36},{"level":37,"move_id":207},{"level":43,"move_id":97}]},"tmhm_learnset":"03103F0084133A64","types":[11,17]},{"abilities":[24,0],"address":3306012,"base_stats":[70,120,40,95,95,40],"catch_rate":60,"evolutions":[],"friendship":35,"id":331,"learnset":{"address":3316104,"moves":[{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":1,"move_id":99},{"level":1,"move_id":116},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":33,"move_id":163},{"level":38,"move_id":269},{"level":43,"move_id":207},{"level":48,"move_id":130},{"level":53,"move_id":97}]},"tmhm_learnset":"03B03F4086137A74","types":[11,17]},{"abilities":[52,71],"address":3306040,"base_stats":[45,100,45,10,45,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":333}],"friendship":70,"id":332,"learnset":{"address":3316134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":41,"move_id":91},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A01E508E354620","types":[4,4]},{"abilities":[26,26],"address":3306068,"base_stats":[50,70,50,70,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":45,"species":334}],"friendship":70,"id":333,"learnset":{"address":3316158,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A85E508E354620","types":[4,16]},{"abilities":[26,26],"address":3306096,"base_stats":[80,100,80,100,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":334,"learnset":{"address":3316184,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":53,"move_id":201},{"level":65,"move_id":63}]},"tmhm_learnset":"00A85E748E754622","types":[4,16]},{"abilities":[47,62],"address":3306124,"base_stats":[72,60,30,25,20,30],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":24,"species":336}],"friendship":70,"id":335,"learnset":{"address":3316210,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":28,"move_id":282},{"level":31,"move_id":265},{"level":37,"move_id":187},{"level":40,"move_id":203},{"level":46,"move_id":69},{"level":49,"move_id":179}]},"tmhm_learnset":"00B01E40CE1306A1","types":[1,1]},{"abilities":[47,62],"address":3306152,"base_stats":[144,120,60,50,40,60],"catch_rate":200,"evolutions":[],"friendship":70,"id":336,"learnset":{"address":3316242,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":1,"move_id":28},{"level":1,"move_id":292},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":29,"move_id":282},{"level":33,"move_id":265},{"level":40,"move_id":187},{"level":44,"move_id":203},{"level":51,"move_id":69},{"level":55,"move_id":179}]},"tmhm_learnset":"00B01E40CE1346A1","types":[1,1]},{"abilities":[9,31],"address":3306180,"base_stats":[40,45,40,65,65,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":26,"species":338}],"friendship":70,"id":337,"learnset":{"address":3316274,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":28,"move_id":46},{"level":33,"move_id":44},{"level":36,"move_id":87},{"level":41,"move_id":268}]},"tmhm_learnset":"00603E0285D30230","types":[13,13]},{"abilities":[9,31],"address":3306208,"base_stats":[70,75,60,105,105,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":338,"learnset":{"address":3316304,"moves":[{"level":1,"move_id":86},{"level":1,"move_id":43},{"level":1,"move_id":336},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":31,"move_id":46},{"level":39,"move_id":44},{"level":45,"move_id":87},{"level":53,"move_id":268}]},"tmhm_learnset":"00603E0285D34230","types":[13,13]},{"abilities":[12,0],"address":3306236,"base_stats":[60,60,40,35,65,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":33,"species":340}],"friendship":70,"id":339,"learnset":{"address":3316334,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":35,"move_id":89},{"level":41,"move_id":53},{"level":49,"move_id":38}]},"tmhm_learnset":"00A21E748E110620","types":[10,4]},{"abilities":[40,0],"address":3306264,"base_stats":[70,100,70,40,105,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":340,"learnset":{"address":3316360,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":1,"move_id":52},{"level":1,"move_id":222},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":33,"move_id":157},{"level":37,"move_id":89},{"level":45,"move_id":284},{"level":55,"move_id":90}]},"tmhm_learnset":"00A21E748E114630","types":[10,4]},{"abilities":[47,0],"address":3306292,"base_stats":[70,40,50,25,55,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":342}],"friendship":70,"id":341,"learnset":{"address":3316388,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":59},{"level":49,"move_id":329}]},"tmhm_learnset":"03B01E4086533264","types":[15,11]},{"abilities":[47,0],"address":3306320,"base_stats":[90,60,70,45,75,70],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":44,"species":343}],"friendship":70,"id":342,"learnset":{"address":3316416,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":47,"move_id":59},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E4086533274","types":[15,11]},{"abilities":[47,0],"address":3306348,"base_stats":[110,80,90,65,95,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":343,"learnset":{"address":3316444,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":50,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"03B01E4086537274","types":[15,11]},{"abilities":[8,0],"address":3306376,"base_stats":[50,85,40,35,85,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":32,"species":345}],"friendship":35,"id":344,"learnset":{"address":3316472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":33,"move_id":191},{"level":37,"move_id":302},{"level":41,"move_id":178},{"level":45,"move_id":201}]},"tmhm_learnset":"00441E1084350721","types":[12,12]},{"abilities":[8,0],"address":3306404,"base_stats":[70,115,60,55,115,60],"catch_rate":60,"evolutions":[],"friendship":35,"id":345,"learnset":{"address":3316504,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":74},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":35,"move_id":191},{"level":41,"move_id":302},{"level":47,"move_id":178},{"level":53,"move_id":201}]},"tmhm_learnset":"00641E1084354721","types":[12,17]},{"abilities":[39,0],"address":3306432,"base_stats":[50,50,50,50,50,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":42,"species":347}],"friendship":70,"id":346,"learnset":{"address":3316536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":37,"move_id":258},{"level":43,"move_id":59}]},"tmhm_learnset":"00401E00A41BB264","types":[15,15]},{"abilities":[39,0],"address":3306460,"base_stats":[80,80,80,80,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":347,"learnset":{"address":3316564,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":1,"move_id":104},{"level":1,"move_id":44},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":42,"move_id":258},{"level":53,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"00401F00A61BFA64","types":[15,15]},{"abilities":[26,0],"address":3306488,"base_stats":[70,55,65,70,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":348,"learnset":{"address":3316594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":95},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":94},{"level":43,"move_id":248},{"level":49,"move_id":153}]},"tmhm_learnset":"00408E51B61BD228","types":[5,14]},{"abilities":[26,0],"address":3306516,"base_stats":[70,95,85,70,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":349,"learnset":{"address":3316620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":83},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":157},{"level":43,"move_id":76},{"level":49,"move_id":153}]},"tmhm_learnset":"00428E75B639C628","types":[5,14]},{"abilities":[47,37],"address":3306544,"base_stats":[50,20,40,20,20,40],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":183}],"friendship":70,"id":350,"learnset":{"address":3316646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":150},{"level":3,"move_id":204},{"level":6,"move_id":39},{"level":10,"move_id":145},{"level":15,"move_id":21},{"level":21,"move_id":55}]},"tmhm_learnset":"01101E0084533264","types":[0,0]},{"abilities":[47,20],"address":3306572,"base_stats":[60,25,35,60,70,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":352}],"friendship":70,"id":351,"learnset":{"address":3316666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":1,"move_id":150},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":34,"move_id":94},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":340}]},"tmhm_learnset":"0041BF03B4538E28","types":[14,14]},{"abilities":[47,20],"address":3306600,"base_stats":[80,45,65,80,90,110],"catch_rate":60,"evolutions":[],"friendship":70,"id":352,"learnset":{"address":3316696,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":149},{"level":1,"move_id":316},{"level":1,"move_id":60},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":37,"move_id":94},{"level":43,"move_id":156},{"level":43,"move_id":173},{"level":55,"move_id":340}]},"tmhm_learnset":"0041BF03B453CE29","types":[14,14]},{"abilities":[57,0],"address":3306628,"base_stats":[60,50,40,95,85,75],"catch_rate":200,"evolutions":[],"friendship":70,"id":353,"learnset":{"address":3316726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":313},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[58,0],"address":3306656,"base_stats":[60,40,50,95,75,85],"catch_rate":200,"evolutions":[],"friendship":70,"id":354,"learnset":{"address":3316756,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":204},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[52,22],"address":3306684,"base_stats":[50,85,85,50,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":355,"learnset":{"address":3316786,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":6,"move_id":313},{"level":11,"move_id":44},{"level":16,"move_id":230},{"level":21,"move_id":11},{"level":26,"move_id":185},{"level":31,"move_id":226},{"level":36,"move_id":242},{"level":41,"move_id":334},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255}]},"tmhm_learnset":"00A01F7CC4335E21","types":[8,8]},{"abilities":[74,0],"address":3306712,"base_stats":[30,40,55,60,40,55],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":37,"species":357}],"friendship":70,"id":356,"learnset":{"address":3316818,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":38,"move_id":244},{"level":42,"move_id":179},{"level":48,"move_id":105}]},"tmhm_learnset":"00E01E41F41386A9","types":[1,14]},{"abilities":[74,0],"address":3306740,"base_stats":[60,60,75,80,60,75],"catch_rate":90,"evolutions":[],"friendship":70,"id":357,"learnset":{"address":3316848,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":9},{"level":1,"move_id":8},{"level":1,"move_id":117},{"level":1,"move_id":96},{"level":1,"move_id":93},{"level":1,"move_id":197},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":40,"move_id":244},{"level":46,"move_id":179},{"level":54,"move_id":105}]},"tmhm_learnset":"00E01E41F413C6A9","types":[1,14]},{"abilities":[30,0],"address":3306768,"base_stats":[45,40,60,50,40,75],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":359}],"friendship":70,"id":358,"learnset":{"address":3316884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":38,"move_id":119},{"level":41,"move_id":287},{"level":48,"move_id":195}]},"tmhm_learnset":"00087E80843B1620","types":[0,2]},{"abilities":[30,0],"address":3306796,"base_stats":[75,70,90,80,70,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":359,"learnset":{"address":3316912,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":310},{"level":1,"move_id":47},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":35,"move_id":225},{"level":40,"move_id":349},{"level":45,"move_id":287},{"level":54,"move_id":195},{"level":59,"move_id":143}]},"tmhm_learnset":"00887EA4867B5632","types":[16,2]},{"abilities":[23,0],"address":3306824,"base_stats":[95,23,48,23,23,48],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":15,"species":202}],"friendship":70,"id":360,"learnset":{"address":3316944,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":150},{"level":1,"move_id":204},{"level":1,"move_id":227},{"level":15,"move_id":68},{"level":15,"move_id":243},{"level":15,"move_id":219},{"level":15,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[26,0],"address":3306852,"base_stats":[20,40,90,25,30,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":362}],"friendship":35,"id":361,"learnset":{"address":3316962,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":38,"move_id":261},{"level":45,"move_id":212},{"level":49,"move_id":248}]},"tmhm_learnset":"0041BF00B4133E28","types":[7,7]},{"abilities":[46,0],"address":3306880,"base_stats":[40,70,130,25,60,130],"catch_rate":90,"evolutions":[],"friendship":35,"id":362,"learnset":{"address":3316990,"moves":[{"level":1,"move_id":20},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":1,"move_id":50},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":37,"move_id":325},{"level":41,"move_id":261},{"level":51,"move_id":212},{"level":58,"move_id":248}]},"tmhm_learnset":"00E1BF40B6137E29","types":[7,7]},{"abilities":[30,38],"address":3306908,"base_stats":[50,60,45,65,100,80],"catch_rate":150,"evolutions":[],"friendship":70,"id":363,"learnset":{"address":3317020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":5,"move_id":74},{"level":9,"move_id":40},{"level":13,"move_id":78},{"level":17,"move_id":72},{"level":21,"move_id":73},{"level":25,"move_id":345},{"level":29,"move_id":320},{"level":33,"move_id":202},{"level":37,"move_id":230},{"level":41,"move_id":275},{"level":45,"move_id":92},{"level":49,"move_id":80},{"level":53,"move_id":312},{"level":57,"move_id":235}]},"tmhm_learnset":"00441E08A4350720","types":[12,3]},{"abilities":[54,0],"address":3306936,"base_stats":[60,60,60,30,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":365}],"friendship":70,"id":364,"learnset":{"address":3317058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E5B336A5","types":[0,0]},{"abilities":[72,0],"address":3306964,"base_stats":[80,80,80,90,55,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":366}],"friendship":70,"id":365,"learnset":{"address":3317082,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":116},{"level":1,"move_id":227},{"level":1,"move_id":253},{"level":7,"move_id":227},{"level":13,"move_id":253},{"level":19,"move_id":154},{"level":25,"move_id":203},{"level":31,"move_id":163},{"level":37,"move_id":68},{"level":43,"move_id":264},{"level":49,"move_id":179}]},"tmhm_learnset":"00A41EA6E7B33EB5","types":[0,0]},{"abilities":[54,0],"address":3306992,"base_stats":[150,160,100,100,95,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":366,"learnset":{"address":3317108,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":1,"move_id":227},{"level":1,"move_id":303},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":36,"move_id":207},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E7B37EB5","types":[0,0]},{"abilities":[64,60],"address":3307020,"base_stats":[70,43,53,40,43,53],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":26,"species":368}],"friendship":70,"id":367,"learnset":{"address":3317134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":28,"move_id":92},{"level":34,"move_id":254},{"level":34,"move_id":255},{"level":34,"move_id":256},{"level":39,"move_id":188}]},"tmhm_learnset":"00A11E0AA4371724","types":[3,3]},{"abilities":[64,60],"address":3307048,"base_stats":[100,73,83,55,73,83],"catch_rate":75,"evolutions":[],"friendship":70,"id":368,"learnset":{"address":3317164,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":281},{"level":1,"move_id":139},{"level":1,"move_id":124},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":26,"move_id":34},{"level":31,"move_id":92},{"level":40,"move_id":254},{"level":40,"move_id":255},{"level":40,"move_id":256},{"level":48,"move_id":188}]},"tmhm_learnset":"00A11E0AA4375724","types":[3,3]},{"abilities":[34,0],"address":3307076,"base_stats":[99,68,83,51,72,87],"catch_rate":200,"evolutions":[],"friendship":70,"id":369,"learnset":{"address":3317196,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":16},{"level":7,"move_id":74},{"level":11,"move_id":75},{"level":17,"move_id":23},{"level":21,"move_id":230},{"level":27,"move_id":18},{"level":31,"move_id":345},{"level":37,"move_id":34},{"level":41,"move_id":76},{"level":47,"move_id":235}]},"tmhm_learnset":"00EC5E80863D4730","types":[12,2]},{"abilities":[43,0],"address":3307104,"base_stats":[64,51,23,28,51,23],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":20,"species":371}],"friendship":70,"id":370,"learnset":{"address":3317224,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":21,"move_id":48},{"level":25,"move_id":23},{"level":31,"move_id":103},{"level":35,"move_id":46},{"level":41,"move_id":156},{"level":41,"move_id":214},{"level":45,"move_id":304}]},"tmhm_learnset":"00001E26A4333634","types":[0,0]},{"abilities":[43,0],"address":3307132,"base_stats":[84,71,43,48,71,43],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":40,"species":372}],"friendship":70,"id":371,"learnset":{"address":3317254,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":43,"move_id":46},{"level":51,"move_id":156},{"level":51,"move_id":214},{"level":57,"move_id":304}]},"tmhm_learnset":"00A21F26E6333E34","types":[0,0]},{"abilities":[43,0],"address":3307160,"base_stats":[104,91,63,68,91,63],"catch_rate":45,"evolutions":[],"friendship":70,"id":372,"learnset":{"address":3317284,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":40,"move_id":63},{"level":45,"move_id":46},{"level":55,"move_id":156},{"level":55,"move_id":214},{"level":63,"move_id":304}]},"tmhm_learnset":"00A21F26E6337E34","types":[0,0]},{"abilities":[75,0],"address":3307188,"base_stats":[35,64,85,32,74,55],"catch_rate":255,"evolutions":[{"method":"ITEM","param":192,"species":374},{"method":"ITEM","param":193,"species":375}],"friendship":70,"id":373,"learnset":{"address":3317316,"moves":[{"level":1,"move_id":128},{"level":1,"move_id":55},{"level":1,"move_id":250},{"level":1,"move_id":334}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,0],"address":3307216,"base_stats":[55,104,105,52,94,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":374,"learnset":{"address":3317326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":44},{"level":15,"move_id":103},{"level":22,"move_id":352},{"level":29,"move_id":184},{"level":36,"move_id":242},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03111E4084137264","types":[11,11]},{"abilities":[33,0],"address":3307244,"base_stats":[55,84,105,52,114,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":375,"learnset":{"address":3317350,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":93},{"level":15,"move_id":97},{"level":22,"move_id":352},{"level":29,"move_id":133},{"level":36,"move_id":94},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03101E00B41B7264","types":[11,11]},{"abilities":[46,0],"address":3307272,"base_stats":[65,130,60,75,75,60],"catch_rate":30,"evolutions":[],"friendship":35,"id":376,"learnset":{"address":3317374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":5,"move_id":43},{"level":9,"move_id":269},{"level":13,"move_id":98},{"level":17,"move_id":13},{"level":21,"move_id":44},{"level":26,"move_id":14},{"level":31,"move_id":104},{"level":36,"move_id":163},{"level":41,"move_id":248},{"level":46,"move_id":195}]},"tmhm_learnset":"00E53FB6A5D37E6C","types":[17,17]},{"abilities":[15,0],"address":3307300,"base_stats":[44,75,35,45,63,33],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":37,"species":378}],"friendship":35,"id":377,"learnset":{"address":3317404,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":282},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":37,"move_id":185},{"level":44,"move_id":247},{"level":49,"move_id":289},{"level":56,"move_id":288}]},"tmhm_learnset":"0041BF02B5930E28","types":[7,7]},{"abilities":[15,0],"address":3307328,"base_stats":[64,115,65,65,83,63],"catch_rate":45,"evolutions":[],"friendship":35,"id":378,"learnset":{"address":3317432,"moves":[{"level":1,"move_id":282},{"level":1,"move_id":103},{"level":1,"move_id":101},{"level":1,"move_id":174},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":39,"move_id":185},{"level":48,"move_id":247},{"level":55,"move_id":289},{"level":64,"move_id":288}]},"tmhm_learnset":"0041BF02B5934E28","types":[7,7]},{"abilities":[61,0],"address":3307356,"base_stats":[73,100,60,65,100,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":379,"learnset":{"address":3317460,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":7,"move_id":122},{"level":10,"move_id":44},{"level":16,"move_id":342},{"level":19,"move_id":103},{"level":25,"move_id":137},{"level":28,"move_id":242},{"level":34,"move_id":305},{"level":37,"move_id":207},{"level":43,"move_id":114}]},"tmhm_learnset":"00A13E0C8E570E20","types":[3,3]},{"abilities":[17,0],"address":3307384,"base_stats":[73,115,60,90,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":380,"learnset":{"address":3317488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":43},{"level":7,"move_id":98},{"level":10,"move_id":14},{"level":13,"move_id":210},{"level":19,"move_id":163},{"level":25,"move_id":228},{"level":31,"move_id":306},{"level":37,"move_id":269},{"level":46,"move_id":197},{"level":55,"move_id":206}]},"tmhm_learnset":"00A03EA6EDF73E35","types":[0,0]},{"abilities":[33,69],"address":3307412,"base_stats":[100,90,130,55,45,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":381,"learnset":{"address":3317518,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":8,"move_id":55},{"level":15,"move_id":317},{"level":22,"move_id":281},{"level":29,"move_id":36},{"level":36,"move_id":300},{"level":43,"move_id":246},{"level":50,"move_id":156},{"level":57,"move_id":38},{"level":64,"move_id":56}]},"tmhm_learnset":"03901E50861B726C","types":[11,5]},{"abilities":[5,69],"address":3307440,"base_stats":[50,70,100,30,40,40],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":32,"species":383}],"friendship":35,"id":382,"learnset":{"address":3317546,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":34,"move_id":182},{"level":39,"move_id":319},{"level":44,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307468,"base_stats":[60,90,140,40,50,50],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":42,"species":384}],"friendship":35,"id":383,"learnset":{"address":3317578,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":45,"move_id":319},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307496,"base_stats":[70,110,180,50,60,60],"catch_rate":45,"evolutions":[],"friendship":35,"id":384,"learnset":{"address":3317610,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":50,"move_id":319},{"level":63,"move_id":38}]},"tmhm_learnset":"00B41EF6CFF37E37","types":[8,5]},{"abilities":[59,0],"address":3307524,"base_stats":[70,70,70,70,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":385,"learnset":{"address":3317642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":10,"move_id":55},{"level":10,"move_id":52},{"level":10,"move_id":181},{"level":20,"move_id":240},{"level":20,"move_id":241},{"level":20,"move_id":258},{"level":30,"move_id":311}]},"tmhm_learnset":"00403E36A5B33664","types":[0,0]},{"abilities":[35,68],"address":3307552,"base_stats":[65,73,55,85,47,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":386,"learnset":{"address":3317666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":109},{"level":9,"move_id":104},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":294},{"level":25,"move_id":324},{"level":29,"move_id":182},{"level":33,"move_id":270},{"level":37,"move_id":38}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[12,0],"address":3307580,"base_stats":[65,47,55,85,73,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":387,"learnset":{"address":3317694,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":230},{"level":9,"move_id":204},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":273},{"level":25,"move_id":227},{"level":29,"move_id":260},{"level":33,"move_id":270},{"level":37,"move_id":343}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[21,0],"address":3307608,"base_stats":[66,41,77,23,61,87],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":389}],"friendship":70,"id":388,"learnset":{"address":3317722,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":43,"move_id":246},{"level":50,"move_id":254},{"level":50,"move_id":255},{"level":50,"move_id":256}]},"tmhm_learnset":"00001E1884350720","types":[5,12]},{"abilities":[21,0],"address":3307636,"base_stats":[86,81,97,43,81,107],"catch_rate":45,"evolutions":[],"friendship":70,"id":389,"learnset":{"address":3317750,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":132},{"level":1,"move_id":51},{"level":1,"move_id":275},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":48,"move_id":246},{"level":60,"move_id":254},{"level":60,"move_id":255},{"level":60,"move_id":256}]},"tmhm_learnset":"00A01E5886354720","types":[5,12]},{"abilities":[4,0],"address":3307664,"base_stats":[45,95,50,75,40,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":391}],"friendship":70,"id":390,"learnset":{"address":3317778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":43,"move_id":210},{"level":49,"move_id":163},{"level":55,"move_id":350}]},"tmhm_learnset":"00841ED0CC110624","types":[5,6]},{"abilities":[4,0],"address":3307692,"base_stats":[75,125,100,45,70,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":391,"learnset":{"address":3317806,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":300},{"level":1,"move_id":55},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":46,"move_id":210},{"level":55,"move_id":163},{"level":64,"move_id":350}]},"tmhm_learnset":"00A41ED0CE514624","types":[5,6]},{"abilities":[28,36],"address":3307720,"base_stats":[28,25,25,40,45,35],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":20,"species":393}],"friendship":35,"id":392,"learnset":{"address":3317834,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":45},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":31,"move_id":286},{"level":36,"move_id":248},{"level":41,"move_id":95},{"level":46,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307748,"base_stats":[38,35,35,50,65,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":394}],"friendship":35,"id":393,"learnset":{"address":3317862,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":40,"move_id":248},{"level":47,"move_id":95},{"level":54,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307776,"base_stats":[68,65,65,80,125,115],"catch_rate":45,"evolutions":[],"friendship":35,"id":394,"learnset":{"address":3317890,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":42,"move_id":248},{"level":51,"move_id":95},{"level":60,"move_id":138}]},"tmhm_learnset":"0041BF03B49BCE28","types":[14,14]},{"abilities":[69,0],"address":3307804,"base_stats":[45,75,60,50,40,30],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":396}],"friendship":35,"id":395,"learnset":{"address":3317918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":33,"move_id":225},{"level":37,"move_id":184},{"level":41,"move_id":242},{"level":49,"move_id":337},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[69,0],"address":3307832,"base_stats":[65,95,100,50,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":50,"species":397}],"friendship":35,"id":396,"learnset":{"address":3317948,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":56,"move_id":242},{"level":69,"move_id":337},{"level":78,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[22,0],"address":3307860,"base_stats":[95,135,80,100,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":397,"learnset":{"address":3317980,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":50,"move_id":19},{"level":61,"move_id":242},{"level":79,"move_id":337},{"level":93,"move_id":38}]},"tmhm_learnset":"00AC5EE4C6534632","types":[16,2]},{"abilities":[29,0],"address":3307888,"base_stats":[40,55,80,30,35,60],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":20,"species":399}],"friendship":35,"id":398,"learnset":{"address":3318014,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36}]},"tmhm_learnset":"0000000000000000","types":[8,14]},{"abilities":[29,0],"address":3307916,"base_stats":[60,75,100,50,55,80],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":45,"species":400}],"friendship":35,"id":399,"learnset":{"address":3318024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":50,"move_id":309},{"level":56,"move_id":97},{"level":62,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307944,"base_stats":[80,135,130,70,95,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":400,"learnset":{"address":3318052,"moves":[{"level":1,"move_id":36},{"level":1,"move_id":93},{"level":1,"move_id":232},{"level":1,"move_id":184},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":55,"move_id":309},{"level":66,"move_id":97},{"level":77,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307972,"base_stats":[80,100,200,50,50,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":401,"learnset":{"address":3318080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":153},{"level":9,"move_id":88},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E52CF994621","types":[5,5]},{"abilities":[29,0],"address":3308000,"base_stats":[80,50,100,50,100,200],"catch_rate":3,"evolutions":[],"friendship":35,"id":402,"learnset":{"address":3318106,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":196},{"level":1,"move_id":153},{"level":9,"move_id":196},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E02C79B7261","types":[15,15]},{"abilities":[29,0],"address":3308028,"base_stats":[80,75,150,50,75,150],"catch_rate":3,"evolutions":[],"friendship":35,"id":403,"learnset":{"address":3318132,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":232},{"level":1,"move_id":153},{"level":9,"move_id":232},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00ED2C79B4621","types":[8,8]},{"abilities":[2,0],"address":3308056,"base_stats":[100,100,90,90,150,140],"catch_rate":5,"evolutions":[],"friendship":0,"id":404,"learnset":{"address":3318160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":352},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":34},{"level":30,"move_id":347},{"level":35,"move_id":58},{"level":45,"move_id":56},{"level":50,"move_id":156},{"level":60,"move_id":329},{"level":65,"move_id":38},{"level":75,"move_id":323}]},"tmhm_learnset":"03B00E42C79B727C","types":[11,11]},{"abilities":[70,0],"address":3308084,"base_stats":[100,150,140,90,100,90],"catch_rate":5,"evolutions":[],"friendship":0,"id":405,"learnset":{"address":3318190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":341},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":163},{"level":30,"move_id":339},{"level":35,"move_id":89},{"level":45,"move_id":126},{"level":50,"move_id":156},{"level":60,"move_id":90},{"level":65,"move_id":76},{"level":75,"move_id":284}]},"tmhm_learnset":"00A60EF6CFF946B2","types":[4,4]},{"abilities":[77,0],"address":3308112,"base_stats":[105,150,90,95,150,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":406,"learnset":{"address":3318220,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":239},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":337},{"level":30,"move_id":349},{"level":35,"move_id":242},{"level":45,"move_id":19},{"level":50,"move_id":156},{"level":60,"move_id":245},{"level":65,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BA0EB6C7F376B6","types":[16,2]},{"abilities":[26,0],"address":3308140,"base_stats":[80,80,90,110,110,130],"catch_rate":3,"evolutions":[],"friendship":90,"id":407,"learnset":{"address":3318250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":273},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":346},{"level":30,"move_id":287},{"level":35,"move_id":296},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":204}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[26,0],"address":3308168,"base_stats":[80,90,80,110,130,110],"catch_rate":3,"evolutions":[],"friendship":90,"id":408,"learnset":{"address":3318280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":262},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":182},{"level":30,"move_id":287},{"level":35,"move_id":295},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":349}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[32,0],"address":3308196,"base_stats":[100,100,100,100,100,100],"catch_rate":3,"evolutions":[],"friendship":100,"id":409,"learnset":{"address":3318310,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":273},{"level":1,"move_id":93},{"level":5,"move_id":156},{"level":10,"move_id":129},{"level":15,"move_id":270},{"level":20,"move_id":94},{"level":25,"move_id":287},{"level":30,"move_id":156},{"level":35,"move_id":38},{"level":40,"move_id":248},{"level":45,"move_id":322},{"level":50,"move_id":353}]},"tmhm_learnset":"00408E93B59BC62C","types":[8,14]},{"abilities":[46,0],"address":3308224,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":410,"learnset":{"address":3318340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":35},{"level":5,"move_id":101},{"level":10,"move_id":104},{"level":15,"move_id":282},{"level":20,"move_id":228},{"level":25,"move_id":94},{"level":30,"move_id":129},{"level":35,"move_id":97},{"level":40,"move_id":105},{"level":45,"move_id":354},{"level":50,"move_id":245}]},"tmhm_learnset":"00E58FC3F5BBDE2D","types":[14,14]},{"abilities":[26,0],"address":3308252,"base_stats":[65,50,70,65,95,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":411,"learnset":{"address":3318370,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":6,"move_id":45},{"level":9,"move_id":310},{"level":14,"move_id":93},{"level":17,"move_id":36},{"level":22,"move_id":253},{"level":25,"move_id":281},{"level":30,"move_id":149},{"level":33,"move_id":38},{"level":38,"move_id":215},{"level":41,"move_id":219},{"level":46,"move_id":94}]},"tmhm_learnset":"00419F03B41B8E28","types":[14,14]}],"tmhm_moves":[264,337,352,347,46,92,258,339,331,237,241,269,58,59,63,113,182,240,202,219,218,76,231,85,87,89,216,91,94,247,280,104,115,351,53,188,201,126,317,332,259,263,290,156,213,168,211,285,289,315,15,19,57,70,148,249,127,291],"trainers":[{"address":3230072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[],"party_address":4160749568,"script_address":0},{"address":3230112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":74}],"party_address":3211124,"script_address":2304511},{"address":3230152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":286}],"party_address":3211132,"script_address":2321901},{"address":3230192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":330}],"party_address":3211140,"script_address":2323326},{"address":3230232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211156,"script_address":2323373},{"address":3230272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211164,"script_address":2324386},{"address":3230312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":286}],"party_address":3211172,"script_address":2326808},{"address":3230352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211180,"script_address":2326839},{"address":3230392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":41}],"party_address":3211188,"script_address":2328040},{"address":3230432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":315},{"level":26,"species":286},{"level":26,"species":288},{"level":26,"species":295},{"level":26,"species":298},{"level":26,"species":304}],"party_address":3211196,"script_address":2314251},{"address":3230472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":286}],"party_address":3211244,"script_address":0},{"address":3230512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":300}],"party_address":3211252,"script_address":2067580},{"address":3230552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":310},{"level":30,"species":178}],"party_address":3211268,"script_address":2068523},{"address":3230592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":380},{"level":30,"species":379}],"party_address":3211284,"script_address":2068554},{"address":3230632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211300,"script_address":2328071},{"address":3230672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3211308,"script_address":2069620},{"address":3230712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":286}],"party_address":3211316,"script_address":0},{"address":3230752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3211324,"script_address":2570959},{"address":3230792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":286},{"level":27,"species":330}],"party_address":3211340,"script_address":2572093},{"address":3230832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":286},{"level":26,"species":41},{"level":26,"species":330}],"party_address":3211356,"script_address":2572124},{"address":3230872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":330}],"party_address":3211380,"script_address":2157889},{"address":3230912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":41},{"level":14,"species":330}],"party_address":3211388,"script_address":2157948},{"address":3230952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":339}],"party_address":3211404,"script_address":2254636},{"address":3230992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211412,"script_address":2317522},{"address":3231032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211420,"script_address":2317553},{"address":3231072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":286},{"level":30,"species":330}],"party_address":3211428,"script_address":2317584},{"address":3231112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330}],"party_address":3211444,"script_address":2570990},{"address":3231152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211452,"script_address":2323414},{"address":3231192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211460,"script_address":2324427},{"address":3231232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":335},{"level":30,"species":67}],"party_address":3211468,"script_address":2068492},{"address":3231272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":287},{"level":34,"species":42}],"party_address":3211484,"script_address":2324250},{"address":3231312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":336}],"party_address":3211500,"script_address":2312702},{"address":3231352,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330},{"level":28,"species":287}],"party_address":3211508,"script_address":2572155},{"address":3231392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":331},{"level":37,"species":287}],"party_address":3211524,"script_address":2327156},{"address":3231432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":287},{"level":41,"species":169},{"level":43,"species":331}],"party_address":3211540,"script_address":2328478},{"address":3231472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":351}],"party_address":3211564,"script_address":2312671},{"address":3231512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211572,"script_address":2026085},{"address":3231552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":363},{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211588,"script_address":2058784},{"address":3231592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,0,0,0],"species":357},{"level":43,"moves":[29,89,0,0],"species":319}],"party_address":3211612,"script_address":2335547},{"address":3231632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":363},{"level":26,"species":44}],"party_address":3211644,"script_address":2068148},{"address":3231672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":363}],"party_address":3211660,"script_address":0},{"address":3231712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":306},{"level":28,"species":44},{"level":28,"species":363}],"party_address":3211676,"script_address":0},{"address":3231752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":306},{"level":31,"species":44},{"level":31,"species":363}],"party_address":3211700,"script_address":0},{"address":3231792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307},{"level":34,"species":44},{"level":34,"species":363}],"party_address":3211724,"script_address":0},{"address":3231832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,163,28,40],"species":28}],"party_address":3211748,"script_address":2046490},{"address":3231872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[60,120,201,246],"species":318},{"level":27,"moves":[91,163,28,40],"species":27},{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211764,"script_address":2065682},{"address":3231912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[91,163,28,40],"species":27},{"level":25,"moves":[91,163,28,40],"species":28}],"party_address":3211812,"script_address":2033540},{"address":3231952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211844,"script_address":0},{"address":3231992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[91,163,28,40],"species":28}],"party_address":3211860,"script_address":0},{"address":3232032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[91,163,28,40],"species":28}],"party_address":3211876,"script_address":0},{"address":3232072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[91,163,28,40],"species":28}],"party_address":3211892,"script_address":0},{"address":3232112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":81},{"level":17,"species":370}],"party_address":3211908,"script_address":0},{"address":3232152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":81},{"level":27,"species":371}],"party_address":3211924,"script_address":0},{"address":3232192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":82},{"level":30,"species":371}],"party_address":3211940,"script_address":0},{"address":3232232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":82},{"level":33,"species":371}],"party_address":3211956,"script_address":0},{"address":3232272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82},{"level":36,"species":371}],"party_address":3211972,"script_address":0},{"address":3232312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[49,86,63,85],"species":82},{"level":39,"moves":[54,23,48,48],"species":372}],"party_address":3211988,"script_address":0},{"address":3232352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":350}],"party_address":3212020,"script_address":2036011},{"address":3232392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212036,"script_address":2036121},{"address":3232432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212044,"script_address":2036152},{"address":3232472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183},{"level":26,"species":183}],"party_address":3212052,"script_address":0},{"address":3232512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":183},{"level":29,"species":183}],"party_address":3212068,"script_address":0},{"address":3232552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":183},{"level":32,"species":183}],"party_address":3212084,"script_address":0},{"address":3232592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":35,"species":184}],"party_address":3212100,"script_address":0},{"address":3232632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":13,"moves":[28,29,39,57],"species":288}],"party_address":3212116,"script_address":2035901},{"address":3232672,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":183}],"party_address":3212132,"script_address":2544001},{"address":3232712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212148,"script_address":2339831},{"address":3232752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[28,42,39,57],"species":289}],"party_address":3212156,"script_address":0},{"address":3232792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[28,42,39,57],"species":289}],"party_address":3212172,"script_address":0},{"address":3232832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[28,42,39,57],"species":289}],"party_address":3212188,"script_address":0},{"address":3232872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[28,42,39,57],"species":289}],"party_address":3212204,"script_address":0},{"address":3232912,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[98,97,17,0],"species":305}],"party_address":3212220,"script_address":2131164},{"address":3232952,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[42,146,8,0],"species":308}],"party_address":3212236,"script_address":2131228},{"address":3232992,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[47,68,247,0],"species":364}],"party_address":3212252,"script_address":2131292},{"address":3233032,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[116,163,0,0],"species":365}],"party_address":3212268,"script_address":2131356},{"address":3233072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[116,98,17,27],"species":305},{"level":28,"moves":[44,91,185,72],"species":332},{"level":28,"moves":[205,250,54,96],"species":313},{"level":28,"moves":[85,48,86,49],"species":82},{"level":28,"moves":[202,185,104,207],"species":300}],"party_address":3212284,"script_address":2068117},{"address":3233112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":322},{"level":44,"species":357},{"level":44,"species":331}],"party_address":3212364,"script_address":2565920},{"address":3233152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":355},{"level":46,"species":121}],"party_address":3212388,"script_address":2565982},{"address":3233192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":337},{"level":17,"species":313},{"level":17,"species":335}],"party_address":3212404,"script_address":2046693},{"address":3233232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":345},{"level":43,"species":310}],"party_address":3212428,"script_address":2332685},{"address":3233272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":82},{"level":43,"species":89}],"party_address":3212444,"script_address":2332716},{"address":3233312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":305},{"level":42,"species":355},{"level":42,"species":64}],"party_address":3212460,"script_address":2334375},{"address":3233352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":85},{"level":42,"species":64},{"level":42,"species":101},{"level":42,"species":300}],"party_address":3212484,"script_address":2335423},{"address":3233392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":317},{"level":42,"species":75},{"level":42,"species":314}],"party_address":3212516,"script_address":2335454},{"address":3233432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":337},{"level":26,"species":313},{"level":26,"species":335}],"party_address":3212540,"script_address":0},{"address":3233472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":313},{"level":29,"species":335}],"party_address":3212564,"script_address":0},{"address":3233512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":338},{"level":32,"species":313},{"level":32,"species":335}],"party_address":3212588,"script_address":0},{"address":3233552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":338},{"level":35,"species":313},{"level":35,"species":336}],"party_address":3212612,"script_address":0},{"address":3233592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":297}],"party_address":3212636,"script_address":2073950},{"address":3233632,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[185,95,0,0],"species":316}],"party_address":3212652,"script_address":2131420},{"address":3233672,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[111,38,247,0],"species":40}],"party_address":3212668,"script_address":2131484},{"address":3233712,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[14,163,0,0],"species":380}],"party_address":3212684,"script_address":2131548},{"address":3233752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[226,185,57,44],"species":355},{"level":29,"moves":[72,89,64,73],"species":363},{"level":29,"moves":[19,55,54,182],"species":310}],"party_address":3212700,"script_address":2068086},{"address":3233792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":383},{"level":45,"species":338}],"party_address":3212748,"script_address":2565951},{"address":3233832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":309},{"level":17,"species":339},{"level":17,"species":363}],"party_address":3212764,"script_address":2046803},{"address":3233872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":322}],"party_address":3212788,"script_address":2065651},{"address":3233912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3212796,"script_address":2332747},{"address":3233952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":319}],"party_address":3212804,"script_address":2334406},{"address":3233992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":321},{"level":42,"species":357},{"level":42,"species":297}],"party_address":3212812,"script_address":2334437},{"address":3234032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":227},{"level":43,"species":322}],"party_address":3212836,"script_address":2335485},{"address":3234072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":28},{"level":42,"species":38},{"level":42,"species":369}],"party_address":3212852,"script_address":2335516},{"address":3234112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":26,"species":339},{"level":26,"species":363}],"party_address":3212876,"script_address":0},{"address":3234152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":339},{"level":29,"species":363}],"party_address":3212900,"script_address":0},{"address":3234192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":339},{"level":32,"species":363}],"party_address":3212924,"script_address":0},{"address":3234232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":340},{"level":34,"species":363}],"party_address":3212948,"script_address":0},{"address":3234272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":348}],"party_address":3212972,"script_address":2564729},{"address":3234312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":361},{"level":30,"species":377}],"party_address":3212988,"script_address":2068461},{"address":3234352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":361},{"level":29,"species":377}],"party_address":3213004,"script_address":2067284},{"address":3234392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":322}],"party_address":3213020,"script_address":2315745},{"address":3234432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":377}],"party_address":3213028,"script_address":2315532},{"address":3234472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":322},{"level":31,"species":351}],"party_address":3213036,"script_address":0},{"address":3234512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":351},{"level":35,"species":322}],"party_address":3213052,"script_address":0},{"address":3234552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":351},{"level":40,"species":322}],"party_address":3213068,"script_address":0},{"address":3234592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":361},{"level":42,"species":322},{"level":42,"species":352}],"party_address":3213084,"script_address":0},{"address":3234632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213108,"script_address":2030087},{"address":3234672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[213,186,175,96],"species":325},{"level":39,"moves":[213,219,36,96],"species":325}],"party_address":3213116,"script_address":2265894},{"address":3234712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":287},{"level":28,"species":287},{"level":30,"species":339}],"party_address":3213148,"script_address":2254717},{"address":3234752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":11,"moves":[33,39,0,0],"species":288}],"party_address":3213172,"script_address":0},{"address":3234792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":40,"species":119}],"party_address":3213188,"script_address":2265677},{"address":3234832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3213196,"script_address":2361019},{"address":3234872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213204,"script_address":0},{"address":3234912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213212,"script_address":0},{"address":3234952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213220,"script_address":0},{"address":3234992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213228,"script_address":0},{"address":3235032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":183}],"party_address":3213244,"script_address":2304387},{"address":3235072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3213252,"script_address":2304418},{"address":3235112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":339}],"party_address":3213260,"script_address":2304449},{"address":3235152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[20,122,154,185],"species":317},{"level":29,"moves":[86,103,137,242],"species":379}],"party_address":3213268,"script_address":2067377},{"address":3235192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":118}],"party_address":3213300,"script_address":2265708},{"address":3235232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":184}],"party_address":3213308,"script_address":2265739},{"address":3235272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[78,250,240,96],"species":373},{"level":37,"moves":[13,152,96,0],"species":326},{"level":39,"moves":[253,154,252,96],"species":296}],"party_address":3213316,"script_address":2265770},{"address":3235312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":330},{"level":39,"species":331}],"party_address":3213364,"script_address":2265801},{"address":3235352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[20,122,154,185],"species":317},{"level":35,"moves":[86,103,137,242],"species":379}],"party_address":3213380,"script_address":0},{"address":3235392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[20,122,154,185],"species":317},{"level":38,"moves":[86,103,137,242],"species":379}],"party_address":3213412,"script_address":0},{"address":3235432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[20,122,154,185],"species":317},{"level":41,"moves":[86,103,137,242],"species":379}],"party_address":3213444,"script_address":0},{"address":3235472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[20,122,154,185],"species":317},{"level":44,"moves":[86,103,137,242],"species":379}],"party_address":3213476,"script_address":0},{"address":3235512,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213508,"script_address":2029901},{"address":3235552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":324},{"level":33,"species":356}],"party_address":3213516,"script_address":2074012},{"address":3235592,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":184}],"party_address":3213532,"script_address":2360988},{"address":3235632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213540,"script_address":0},{"address":3235672,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213548,"script_address":0},{"address":3235712,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213556,"script_address":0},{"address":3235752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213564,"script_address":0},{"address":3235792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3213580,"script_address":2051965},{"address":3235832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":116}],"party_address":3213588,"script_address":2340108},{"address":3235872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":111}],"party_address":3213604,"script_address":2312578},{"address":3235912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":339}],"party_address":3213612,"script_address":2304480},{"address":3235952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":383}],"party_address":3213620,"script_address":0},{"address":3235992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":383},{"level":29,"species":111}],"party_address":3213628,"script_address":0},{"address":3236032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":383},{"level":32,"species":111}],"party_address":3213644,"script_address":0},{"address":3236072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":384},{"level":35,"species":112}],"party_address":3213660,"script_address":0},{"address":3236112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213676,"script_address":2033571},{"address":3236152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":72}],"party_address":3213684,"script_address":2033602},{"address":3236192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":72}],"party_address":3213692,"script_address":2034185},{"address":3236232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":309},{"level":24,"species":72}],"party_address":3213708,"script_address":2034479},{"address":3236272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213732,"script_address":2034510},{"address":3236312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":73}],"party_address":3213740,"script_address":2034776},{"address":3236352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213748,"script_address":2034807},{"address":3236392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3213756,"script_address":2035777},{"address":3236432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309}],"party_address":3213772,"script_address":2069178},{"address":3236472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3213788,"script_address":2069209},{"address":3236512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":73}],"party_address":3213796,"script_address":2069789},{"address":3236552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":116}],"party_address":3213804,"script_address":2069820},{"address":3236592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213812,"script_address":2070163},{"address":3236632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":31,"species":309},{"level":31,"species":330}],"party_address":3213820,"script_address":2070194},{"address":3236672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213844,"script_address":2073229},{"address":3236712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310}],"party_address":3213852,"script_address":2073359},{"address":3236752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213860,"script_address":2073390},{"address":3236792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":73},{"level":33,"species":313}],"party_address":3213876,"script_address":2073291},{"address":3236832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3213892,"script_address":2073608},{"address":3236872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":342}],"party_address":3213900,"script_address":2073857},{"address":3236912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":341}],"party_address":3213908,"script_address":2073576},{"address":3236952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213916,"script_address":2074089},{"address":3236992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213924,"script_address":0},{"address":3237032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":313}],"party_address":3213948,"script_address":2069381},{"address":3237072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":331}],"party_address":3213964,"script_address":0},{"address":3237112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":331}],"party_address":3213972,"script_address":0},{"address":3237152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120},{"level":36,"species":331}],"party_address":3213980,"script_address":0},{"address":3237192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":121},{"level":39,"species":331}],"party_address":3213996,"script_address":0},{"address":3237232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3214012,"script_address":2095275},{"address":3237272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":66},{"level":32,"species":67}],"party_address":3214020,"script_address":2074213},{"address":3237312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":336}],"party_address":3214036,"script_address":2073701},{"address":3237352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":66},{"level":28,"species":67}],"party_address":3214044,"script_address":2052921},{"address":3237392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214060,"script_address":2052952},{"address":3237432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":67}],"party_address":3214068,"script_address":0},{"address":3237472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":66},{"level":29,"species":67}],"party_address":3214076,"script_address":0},{"address":3237512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":66},{"level":31,"species":67},{"level":31,"species":67}],"party_address":3214092,"script_address":0},{"address":3237552,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":66},{"level":33,"species":67},{"level":33,"species":67},{"level":33,"species":68}],"party_address":3214116,"script_address":0},{"address":3237592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":335},{"level":26,"species":67}],"party_address":3214148,"script_address":2557758},{"address":3237632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214164,"script_address":2046662},{"address":3237672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":336}],"party_address":3214172,"script_address":2315359},{"address":3237712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[98,86,209,43],"species":337},{"level":17,"moves":[12,95,103,0],"species":100}],"party_address":3214180,"script_address":2167608},{"address":3237752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":286},{"level":31,"species":41}],"party_address":3214212,"script_address":2323445},{"address":3237792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3214228,"script_address":2324458},{"address":3237832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":100},{"level":17,"species":81}],"party_address":3214236,"script_address":2167639},{"address":3237872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":337},{"level":30,"species":371}],"party_address":3214252,"script_address":2068709},{"address":3237912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81},{"level":15,"species":370}],"party_address":3214268,"script_address":2058956},{"address":3237952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":81},{"level":25,"species":370},{"level":25,"species":81}],"party_address":3214284,"script_address":0},{"address":3237992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81},{"level":28,"species":371},{"level":28,"species":81}],"party_address":3214308,"script_address":0},{"address":3238032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":82},{"level":31,"species":371},{"level":31,"species":82}],"party_address":3214332,"script_address":0},{"address":3238072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82},{"level":34,"species":372},{"level":34,"species":82}],"party_address":3214356,"script_address":0},{"address":3238112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214380,"script_address":2103394},{"address":3238152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":218},{"level":22,"species":218}],"party_address":3214388,"script_address":2103601},{"address":3238192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214404,"script_address":2103446},{"address":3238232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214412,"script_address":2103570},{"address":3238272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214420,"script_address":2103477},{"address":3238312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309}],"party_address":3214428,"script_address":2052075},{"address":3238352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":218},{"level":26,"species":309}],"party_address":3214444,"script_address":0},{"address":3238392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310}],"party_address":3214460,"script_address":0},{"address":3238432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":218},{"level":32,"species":310}],"party_address":3214476,"script_address":0},{"address":3238472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":219},{"level":35,"species":310}],"party_address":3214492,"script_address":0},{"address":3238512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,28,40,163],"species":27}],"party_address":3214508,"script_address":2046366},{"address":3238552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":21,"moves":[229,189,60,61],"species":318},{"level":21,"moves":[40,28,10,91],"species":27},{"level":21,"moves":[229,189,60,61],"species":318}],"party_address":3214524,"script_address":2046428},{"address":3238592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":299}],"party_address":3214572,"script_address":2049829},{"address":3238632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27},{"level":18,"species":299}],"party_address":3214580,"script_address":2051903},{"address":3238672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":317}],"party_address":3214596,"script_address":2557005},{"address":3238712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":288},{"level":20,"species":304}],"party_address":3214604,"script_address":2310199},{"address":3238752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3214620,"script_address":2310337},{"address":3238792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27}],"party_address":3214628,"script_address":2046600},{"address":3238832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":288},{"level":26,"species":304}],"party_address":3214636,"script_address":0},{"address":3238872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":289},{"level":29,"species":305}],"party_address":3214652,"script_address":0},{"address":3238912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":305},{"level":31,"species":289}],"party_address":3214668,"script_address":0},{"address":3238952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":28},{"level":34,"species":289}],"party_address":3214692,"script_address":0},{"address":3238992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":311}],"party_address":3214716,"script_address":2061044},{"address":3239032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":290},{"level":24,"species":291},{"level":24,"species":292}],"party_address":3214724,"script_address":2061075},{"address":3239072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":290},{"level":27,"species":293},{"level":27,"species":294}],"party_address":3214748,"script_address":2061106},{"address":3239112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":311},{"level":27,"species":311},{"level":27,"species":311}],"party_address":3214772,"script_address":2065541},{"address":3239152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":294},{"level":16,"species":292}],"party_address":3214796,"script_address":2057595},{"address":3239192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":311},{"level":31,"species":311}],"party_address":3214812,"script_address":0},{"address":3239232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":311},{"level":34,"species":311},{"level":34,"species":312}],"party_address":3214836,"script_address":0},{"address":3239272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":311},{"level":36,"species":290},{"level":36,"species":311},{"level":36,"species":312}],"party_address":3214860,"script_address":0},{"address":3239312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":311},{"level":38,"species":294},{"level":38,"species":311},{"level":38,"species":312},{"level":38,"species":292}],"party_address":3214892,"script_address":0},{"address":3239352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[237,0,0,0],"species":63}],"party_address":3214932,"script_address":2038374},{"address":3239392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3214948,"script_address":2244488},{"address":3239432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":392}],"party_address":3214956,"script_address":2244519},{"address":3239472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3214964,"script_address":2244550},{"address":3239512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":392},{"level":26,"species":393}],"party_address":3214972,"script_address":2314189},{"address":3239552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3214996,"script_address":2564698},{"address":3239592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":349}],"party_address":3215012,"script_address":2068179},{"address":3239632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":64},{"level":33,"species":349}],"party_address":3215020,"script_address":0},{"address":3239672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":64},{"level":38,"species":349}],"party_address":3215036,"script_address":0},{"address":3239712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3215052,"script_address":0},{"address":3239752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":349},{"level":45,"species":65}],"party_address":3215068,"script_address":0},{"address":3239792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[237,0,0,0],"species":63}],"party_address":3215084,"script_address":2038405},{"address":3239832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3215100,"script_address":2244581},{"address":3239872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":178}],"party_address":3215108,"script_address":2244612},{"address":3239912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3215116,"script_address":2244643},{"address":3239952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":202},{"level":26,"species":177},{"level":26,"species":64}],"party_address":3215124,"script_address":2314220},{"address":3239992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":393},{"level":41,"species":178}],"party_address":3215148,"script_address":2564760},{"address":3240032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":64},{"level":30,"species":348}],"party_address":3215164,"script_address":2068289},{"address":3240072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":64},{"level":34,"species":348}],"party_address":3215180,"script_address":0},{"address":3240112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":64},{"level":37,"species":348}],"party_address":3215196,"script_address":0},{"address":3240152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":64},{"level":40,"species":348}],"party_address":3215212,"script_address":0},{"address":3240192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":348},{"level":43,"species":65}],"party_address":3215228,"script_address":0},{"address":3240232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338}],"party_address":3215244,"script_address":2067174},{"address":3240272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":338},{"level":44,"species":338}],"party_address":3215252,"script_address":2360864},{"address":3240312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":380}],"party_address":3215268,"script_address":2360895},{"address":3240352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":338}],"party_address":3215276,"script_address":0},{"address":3240392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[29,28,60,154],"species":289},{"level":36,"moves":[98,209,60,46],"species":338}],"party_address":3215284,"script_address":0},{"address":3240432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[29,28,60,154],"species":289},{"level":39,"moves":[98,209,60,0],"species":338}],"party_address":3215316,"script_address":0},{"address":3240472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[29,28,60,154],"species":289},{"level":41,"moves":[154,50,93,244],"species":55},{"level":41,"moves":[98,209,60,46],"species":338}],"party_address":3215348,"script_address":0},{"address":3240512,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,38,28,242],"species":287},{"level":48,"moves":[3,104,207,70],"species":300},{"level":46,"moves":[73,185,46,178],"species":345},{"level":48,"moves":[57,14,70,7],"species":327},{"level":49,"moves":[76,157,14,163],"species":376}],"party_address":3215396,"script_address":2274753},{"address":3240552,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[69,109,174,182],"species":362},{"level":49,"moves":[247,32,5,185],"species":378},{"level":50,"moves":[247,104,101,185],"species":322},{"level":49,"moves":[247,94,85,7],"species":378},{"level":51,"moves":[247,58,157,89],"species":362}],"party_address":3215476,"script_address":2275380},{"address":3240592,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[227,34,2,45],"species":342},{"level":50,"moves":[113,242,196,58],"species":347},{"level":52,"moves":[213,38,2,59],"species":342},{"level":52,"moves":[247,153,2,58],"species":347},{"level":53,"moves":[57,34,58,73],"species":343}],"party_address":3215556,"script_address":2276062},{"address":3240632,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[61,81,182,38],"species":396},{"level":54,"moves":[38,225,93,76],"species":359},{"level":53,"moves":[108,93,57,34],"species":230},{"level":53,"moves":[53,242,225,89],"species":334},{"level":55,"moves":[53,81,157,242],"species":397}],"party_address":3215636,"script_address":2276724},{"address":3240672,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":12,"moves":[33,111,88,61],"species":74},{"level":12,"moves":[33,111,88,61],"species":74},{"level":15,"moves":[79,106,33,61],"species":320}],"party_address":3215716,"script_address":2187976},{"address":3240712,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[2,67,69,83],"species":66},{"level":16,"moves":[8,113,115,83],"species":356},{"level":19,"moves":[36,233,179,83],"species":335}],"party_address":3215764,"script_address":2095066},{"address":3240752,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":20,"moves":[205,209,120,95],"species":100},{"level":20,"moves":[95,43,98,80],"species":337},{"level":22,"moves":[48,95,86,49],"species":82},{"level":24,"moves":[98,86,95,80],"species":338}],"party_address":3215812,"script_address":2167181},{"address":3240792,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[59,36,222,241],"species":339},{"level":24,"moves":[59,123,113,241],"species":218},{"level":26,"moves":[59,33,241,213],"species":340},{"level":29,"moves":[59,241,34,213],"species":321}],"party_address":3215876,"script_address":2103186},{"address":3240832,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[42,60,7,227],"species":308},{"level":27,"moves":[163,7,227,185],"species":365},{"level":29,"moves":[163,187,7,29],"species":289},{"level":31,"moves":[68,25,7,185],"species":366}],"party_address":3215940,"script_address":2129756},{"address":3240872,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[195,119,219,76],"species":358},{"level":29,"moves":[241,76,76,235],"species":369},{"level":30,"moves":[55,48,182,76],"species":310},{"level":31,"moves":[28,31,211,76],"species":227},{"level":33,"moves":[89,225,93,76],"species":359}],"party_address":3216004,"script_address":2202062},{"address":3240912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[89,246,94,113],"species":319},{"level":41,"moves":[94,241,109,91],"species":178},{"level":42,"moves":[113,94,95,91],"species":348},{"level":42,"moves":[241,76,94,53],"species":349}],"party_address":3216084,"script_address":0},{"address":3240952,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[96,213,186,175],"species":325},{"level":41,"moves":[240,96,133,89],"species":324},{"level":43,"moves":[227,34,62,96],"species":342},{"level":43,"moves":[96,152,13,43],"species":327},{"level":46,"moves":[96,104,58,156],"species":230}],"party_address":3216148,"script_address":2262245},{"address":3240992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":392}],"party_address":3216228,"script_address":2054242},{"address":3241032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3216236,"script_address":2554598},{"address":3241072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":339},{"level":15,"species":43},{"level":15,"species":309}],"party_address":3216244,"script_address":2554629},{"address":3241112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":356}],"party_address":3216268,"script_address":0},{"address":3241152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":393},{"level":29,"species":356}],"party_address":3216284,"script_address":0},{"address":3241192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":393},{"level":32,"species":357}],"party_address":3216300,"script_address":0},{"address":3241232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":393},{"level":34,"species":378},{"level":34,"species":357}],"party_address":3216316,"script_address":0},{"address":3241272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":306}],"party_address":3216340,"script_address":2054490},{"address":3241312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":306},{"level":16,"species":292}],"party_address":3216348,"script_address":2554660},{"address":3241352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":370}],"party_address":3216364,"script_address":0},{"address":3241392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":306},{"level":29,"species":371}],"party_address":3216380,"script_address":0},{"address":3241432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":307},{"level":32,"species":371}],"party_address":3216396,"script_address":0},{"address":3241472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":307},{"level":35,"species":372}],"party_address":3216412,"script_address":0},{"address":3241512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[95,60,146,42],"species":308},{"level":32,"moves":[8,25,47,185],"species":366}],"party_address":3216428,"script_address":0},{"address":3241552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[45,39,29,60],"species":288},{"level":17,"moves":[33,116,36,0],"species":335}],"party_address":3216460,"script_address":0},{"address":3241592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[45,39,29,60],"species":288},{"level":30,"moves":[33,116,36,0],"species":335}],"party_address":3216492,"script_address":0},{"address":3241632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[45,39,29,60],"species":288},{"level":33,"moves":[33,116,36,0],"species":335}],"party_address":3216524,"script_address":0},{"address":3241672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[45,39,29,60],"species":289},{"level":36,"moves":[33,116,36,0],"species":335}],"party_address":3216556,"script_address":0},{"address":3241712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[45,39,29,60],"species":289},{"level":38,"moves":[33,116,36,0],"species":336}],"party_address":3216588,"script_address":0},{"address":3241752,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":16,"species":304},{"level":16,"species":288}],"party_address":3216620,"script_address":2045785},{"address":3241792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":15,"species":315}],"party_address":3216636,"script_address":2026353},{"address":3241832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[18,204,185,215],"species":315},{"level":36,"moves":[18,204,185,215],"species":315},{"level":40,"moves":[18,204,185,215],"species":315},{"level":12,"moves":[18,204,185,215],"species":315},{"level":30,"moves":[18,204,185,215],"species":315},{"level":42,"moves":[18,204,185,215],"species":316}],"party_address":3216644,"script_address":2360833},{"address":3241872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":315}],"party_address":3216740,"script_address":0},{"address":3241912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":315}],"party_address":3216748,"script_address":0},{"address":3241952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316}],"party_address":3216756,"script_address":0},{"address":3241992,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":316}],"party_address":3216764,"script_address":0},{"address":3242032,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":17,"species":363}],"party_address":3216772,"script_address":2045890},{"address":3242072,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":25}],"party_address":3216780,"script_address":2067143},{"address":3242112,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":350},{"level":37,"species":183},{"level":39,"species":184}],"party_address":3216788,"script_address":2265832},{"address":3242152,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":353},{"level":14,"species":354}],"party_address":3216812,"script_address":2038890},{"address":3242192,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":26,"species":353},{"level":26,"species":354}],"party_address":3216828,"script_address":0},{"address":3242232,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":353},{"level":29,"species":354}],"party_address":3216844,"script_address":0},{"address":3242272,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":353},{"level":32,"species":354}],"party_address":3216860,"script_address":0},{"address":3242312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":353},{"level":35,"species":354}],"party_address":3216876,"script_address":0},{"address":3242352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":336}],"party_address":3216892,"script_address":2052811},{"address":3242392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[36,26,28,91],"species":336}],"party_address":3216900,"script_address":0},{"address":3242432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[36,26,28,91],"species":336}],"party_address":3216916,"script_address":0},{"address":3242472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[36,187,28,91],"species":336}],"party_address":3216932,"script_address":0},{"address":3242512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[36,187,28,91],"species":336}],"party_address":3216948,"script_address":0},{"address":3242552,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[136,96,93,197],"species":356}],"party_address":3216964,"script_address":2046100},{"address":3242592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":356},{"level":21,"species":335}],"party_address":3216980,"script_address":2304277},{"address":3242632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":356},{"level":30,"species":335}],"party_address":3216996,"script_address":0},{"address":3242672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":357},{"level":33,"species":336}],"party_address":3217012,"script_address":0},{"address":3242712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":357},{"level":36,"species":336}],"party_address":3217028,"script_address":0},{"address":3242752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":357},{"level":39,"species":336}],"party_address":3217044,"script_address":0},{"address":3242792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":286}],"party_address":3217060,"script_address":2024678},{"address":3242832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":288},{"level":7,"species":298}],"party_address":3217068,"script_address":2029684},{"address":3242872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[33,0,0,0],"species":74}],"party_address":3217084,"script_address":2188154},{"address":3242912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3217100,"script_address":2188185},{"address":3242952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":66}],"party_address":3217116,"script_address":2054180},{"address":3242992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[29,28,45,85],"species":288},{"level":17,"moves":[133,124,25,1],"species":367}],"party_address":3217124,"script_address":2167670},{"address":3243032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[213,58,85,53],"species":366},{"level":43,"moves":[29,182,5,92],"species":362}],"party_address":3217156,"script_address":2332778},{"address":3243072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,94,85,91],"species":394},{"level":43,"moves":[89,247,76,24],"species":366}],"party_address":3217188,"script_address":2332809},{"address":3243112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":332}],"party_address":3217220,"script_address":2050594},{"address":3243152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3217228,"script_address":2050625},{"address":3243192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":287}],"party_address":3217236,"script_address":0},{"address":3243232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":305},{"level":30,"species":287}],"party_address":3217244,"script_address":0},{"address":3243272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":305},{"level":29,"species":289},{"level":33,"species":287}],"party_address":3217260,"script_address":0},{"address":3243312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":32,"species":289},{"level":36,"species":287}],"party_address":3217284,"script_address":0},{"address":3243352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":16,"species":288}],"party_address":3217308,"script_address":2553792},{"address":3243392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":3,"species":304}],"party_address":3217324,"script_address":2024926},{"address":3243432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":382},{"level":13,"species":337}],"party_address":3217340,"script_address":2039000},{"address":3243472,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[240,67,38,59],"species":314},{"level":55,"moves":[92,56,188,58],"species":73},{"level":56,"moves":[202,57,73,104],"species":297},{"level":56,"moves":[89,57,133,63],"species":324},{"level":56,"moves":[93,89,63,57],"species":130},{"level":58,"moves":[105,57,58,92],"species":329}],"party_address":3217356,"script_address":2277575},{"address":3243512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":10,"species":72},{"level":15,"species":129}],"party_address":3217452,"script_address":2026322},{"address":3243552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":6,"species":129},{"level":7,"species":129}],"party_address":3217476,"script_address":2029653},{"address":3243592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":129},{"level":17,"species":118},{"level":18,"species":323}],"party_address":3217500,"script_address":2052185},{"address":3243632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":10,"species":129},{"level":7,"species":72},{"level":10,"species":129}],"party_address":3217524,"script_address":2034247},{"address":3243672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72}],"party_address":3217548,"script_address":2034357},{"address":3243712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72},{"level":14,"species":313},{"level":11,"species":72},{"level":14,"species":313}],"party_address":3217556,"script_address":2038546},{"address":3243752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3217588,"script_address":2052216},{"address":3243792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3217596,"script_address":2058894},{"address":3243832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":72}],"party_address":3217612,"script_address":2058925},{"address":3243872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":73}],"party_address":3217620,"script_address":2036183},{"address":3243912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":27,"species":130},{"level":27,"species":130}],"party_address":3217636,"script_address":0},{"address":3243952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":130},{"level":26,"species":330},{"level":26,"species":72},{"level":29,"species":130}],"party_address":3217660,"script_address":0},{"address":3243992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":130},{"level":30,"species":330},{"level":30,"species":73},{"level":31,"species":130}],"party_address":3217692,"script_address":0},{"address":3244032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":130},{"level":33,"species":331},{"level":33,"species":130},{"level":35,"species":73}],"party_address":3217724,"script_address":0},{"address":3244072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":129},{"level":21,"species":130},{"level":23,"species":130},{"level":26,"species":130},{"level":30,"species":130},{"level":35,"species":130}],"party_address":3217756,"script_address":2073670},{"address":3244112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":100},{"level":6,"species":100},{"level":14,"species":81}],"party_address":3217804,"script_address":2038577},{"address":3244152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81}],"party_address":3217828,"script_address":2038608},{"address":3244192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217844,"script_address":2038639},{"address":3244232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":81}],"party_address":3217852,"script_address":0},{"address":3244272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":81}],"party_address":3217860,"script_address":0},{"address":3244312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82}],"party_address":3217868,"script_address":0},{"address":3244352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":82}],"party_address":3217876,"script_address":0},{"address":3244392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217884,"script_address":2038780},{"address":3244432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81},{"level":6,"species":100}],"party_address":3217892,"script_address":2038749},{"address":3244472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81}],"party_address":3217916,"script_address":0},{"address":3244512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":81}],"party_address":3217924,"script_address":0},{"address":3244552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82}],"party_address":3217932,"script_address":0},{"address":3244592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":82}],"party_address":3217940,"script_address":0},{"address":3244632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217948,"script_address":2057375},{"address":3244672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217956,"script_address":0},{"address":3244712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3217964,"script_address":0},{"address":3244752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3217972,"script_address":0},{"address":3244792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3217980,"script_address":0},{"address":3244832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217988,"script_address":2057485},{"address":3244872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217996,"script_address":0},{"address":3244912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3218004,"script_address":0},{"address":3244952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3218012,"script_address":0},{"address":3244992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3218020,"script_address":0},{"address":3245032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218028,"script_address":2070582},{"address":3245072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":288},{"level":25,"species":337}],"party_address":3218044,"script_address":2340077},{"address":3245112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218060,"script_address":2071332},{"address":3245152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218068,"script_address":2070380},{"address":3245192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218084,"script_address":2072978},{"address":3245232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218100,"script_address":0},{"address":3245272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218108,"script_address":0},{"address":3245312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218116,"script_address":0},{"address":3245352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218124,"script_address":0},{"address":3245392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218132,"script_address":2070318},{"address":3245432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218140,"script_address":2070613},{"address":3245472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218156,"script_address":2073545},{"address":3245512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218164,"script_address":2071442},{"address":3245552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":309},{"level":33,"species":120}],"party_address":3218172,"script_address":2073009},{"address":3245592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218188,"script_address":0},{"address":3245632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218196,"script_address":0},{"address":3245672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218204,"script_address":0},{"address":3245712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218212,"script_address":0},{"address":3245752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":359},{"level":37,"species":359}],"party_address":3218220,"script_address":2292701},{"address":3245792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":359}],"party_address":3218236,"script_address":0},{"address":3245832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":359},{"level":44,"species":359}],"party_address":3218252,"script_address":0},{"address":3245872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":395},{"level":46,"species":359},{"level":46,"species":359}],"party_address":3218268,"script_address":0},{"address":3245912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":49,"species":359},{"level":49,"species":359},{"level":49,"species":396}],"party_address":3218292,"script_address":0},{"address":3245952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[225,29,116,52],"species":395}],"party_address":3218316,"script_address":2074182},{"address":3245992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309}],"party_address":3218332,"script_address":2059066},{"address":3246032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":369}],"party_address":3218340,"script_address":2061450},{"address":3246072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":305}],"party_address":3218356,"script_address":2061481},{"address":3246112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":84},{"level":27,"species":227},{"level":27,"species":369}],"party_address":3218364,"script_address":2202267},{"address":3246152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":227}],"party_address":3218388,"script_address":2202391},{"address":3246192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":369},{"level":33,"species":178}],"party_address":3218396,"script_address":2070085},{"address":3246232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":84},{"level":29,"species":310}],"party_address":3218412,"script_address":2202298},{"address":3246272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":309},{"level":28,"species":177}],"party_address":3218428,"script_address":2065338},{"address":3246312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":358}],"party_address":3218444,"script_address":2065369},{"address":3246352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":305},{"level":36,"species":310},{"level":36,"species":178}],"party_address":3218452,"script_address":2563257},{"address":3246392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":305}],"party_address":3218476,"script_address":2059097},{"address":3246432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":177},{"level":32,"species":358}],"party_address":3218492,"script_address":0},{"address":3246472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":177},{"level":35,"species":359}],"party_address":3218508,"script_address":0},{"address":3246512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":177},{"level":38,"species":359}],"party_address":3218524,"script_address":0},{"address":3246552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":178}],"party_address":3218540,"script_address":0},{"address":3246592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":177},{"level":33,"species":305}],"party_address":3218556,"script_address":2074151},{"address":3246632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":369}],"party_address":3218572,"script_address":2073981},{"address":3246672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302}],"party_address":3218580,"script_address":2061512},{"address":3246712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302},{"level":25,"species":109}],"party_address":3218588,"script_address":2061543},{"address":3246752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,89,0,0],"species":319},{"level":43,"moves":[85,89,0,0],"species":171}],"party_address":3218604,"script_address":2335578},{"address":3246792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3218636,"script_address":2341860},{"address":3246832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,124,120],"species":109}],"party_address":3218644,"script_address":2050766},{"address":3246872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":109},{"level":18,"species":302}],"party_address":3218692,"script_address":2050876},{"address":3246912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[139,33,124,120],"species":109},{"level":24,"moves":[139,33,124,0],"species":109},{"level":24,"moves":[139,33,124,120],"species":109},{"level":26,"moves":[33,124,0,0],"species":109}],"party_address":3218708,"script_address":0},{"address":3246952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,0],"species":109},{"level":29,"moves":[33,124,0,0],"species":109}],"party_address":3218772,"script_address":0},{"address":3246992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":32,"moves":[33,124,0,0],"species":109}],"party_address":3218836,"script_address":0},{"address":3247032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[139,33,124,0],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":35,"moves":[33,124,0,0],"species":110}],"party_address":3218900,"script_address":0},{"address":3247072,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218964,"script_address":2095313},{"address":3247112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218972,"script_address":2095351},{"address":3247152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":335}],"party_address":3218980,"script_address":2053062},{"address":3247192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":356}],"party_address":3218996,"script_address":2557727},{"address":3247232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3219004,"script_address":2557789},{"address":3247272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3219012,"script_address":0},{"address":3247312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":356},{"level":29,"species":335}],"party_address":3219028,"script_address":0},{"address":3247352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":357},{"level":32,"species":336}],"party_address":3219044,"script_address":0},{"address":3247392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":357},{"level":35,"species":336}],"party_address":3219060,"script_address":0},{"address":3247432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":19,"moves":[52,33,222,241],"species":339}],"party_address":3219076,"script_address":2050656},{"address":3247472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":363},{"level":28,"species":313}],"party_address":3219092,"script_address":2065713},{"address":3247512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[240,55,87,96],"species":385}],"party_address":3219108,"script_address":2065744},{"address":3247552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[52,33,222,241],"species":339}],"party_address":3219124,"script_address":0},{"address":3247592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[52,36,222,241],"species":339}],"party_address":3219140,"script_address":0},{"address":3247632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[73,72,64,241],"species":363},{"level":34,"moves":[53,36,222,241],"species":339}],"party_address":3219156,"script_address":0},{"address":3247672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[73,202,76,241],"species":363},{"level":37,"moves":[53,36,89,241],"species":340}],"party_address":3219188,"script_address":0},{"address":3247712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":313}],"party_address":3219220,"script_address":2033633},{"address":3247752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3219236,"script_address":2033664},{"address":3247792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":313}],"party_address":3219244,"script_address":2034216},{"address":3247832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":118}],"party_address":3219252,"script_address":2034620},{"address":3247872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219268,"script_address":2034651},{"address":3247912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":116},{"level":25,"species":183}],"party_address":3219276,"script_address":2034838},{"address":3247952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219292,"script_address":2034869},{"address":3247992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":118},{"level":24,"species":309},{"level":24,"species":118}],"party_address":3219300,"script_address":2035808},{"address":3248032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3219324,"script_address":2069240},{"address":3248072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":183}],"party_address":3219332,"script_address":2069350},{"address":3248112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219340,"script_address":2069851},{"address":3248152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219348,"script_address":2069882},{"address":3248192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":183},{"level":33,"species":341}],"party_address":3219356,"script_address":2070225},{"address":3248232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":118}],"party_address":3219372,"script_address":2070256},{"address":3248272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":118},{"level":33,"species":341}],"party_address":3219380,"script_address":2073260},{"address":3248312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219396,"script_address":2073421},{"address":3248352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219404,"script_address":2073452},{"address":3248392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":184}],"party_address":3219412,"script_address":2073639},{"address":3248432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219420,"script_address":2070349},{"address":3248472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219436,"script_address":2073888},{"address":3248512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":116},{"level":33,"species":117}],"party_address":3219444,"script_address":2073919},{"address":3248552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":171},{"level":34,"species":310}],"party_address":3219460,"script_address":0},{"address":3248592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219476,"script_address":2074120},{"address":3248632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":119}],"party_address":3219492,"script_address":2071676},{"address":3248672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":313}],"party_address":3219500,"script_address":0},{"address":3248712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":313}],"party_address":3219508,"script_address":0},{"address":3248752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":120},{"level":43,"species":313}],"party_address":3219516,"script_address":0},{"address":3248792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":313},{"level":45,"species":121}],"party_address":3219532,"script_address":0},{"address":3248832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[91,28,40,163],"species":27},{"level":22,"moves":[229,189,60,61],"species":318}],"party_address":3219556,"script_address":2046397},{"address":3248872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[28,40,163,91],"species":27},{"level":22,"moves":[205,61,39,111],"species":183}],"party_address":3219588,"script_address":2046459},{"address":3248912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":304},{"level":17,"species":296}],"party_address":3219620,"script_address":2049860},{"address":3248952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":183},{"level":18,"species":296}],"party_address":3219636,"script_address":2051934},{"address":3248992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":315},{"level":23,"species":358}],"party_address":3219652,"script_address":2557036},{"address":3249032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":306},{"level":19,"species":43},{"level":19,"species":358}],"party_address":3219668,"script_address":2310092},{"address":3249072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[194,219,68,243],"species":202}],"party_address":3219692,"script_address":2315855},{"address":3249112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":306},{"level":17,"species":183}],"party_address":3219708,"script_address":2046631},{"address":3249152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":306},{"level":25,"species":44},{"level":25,"species":358}],"party_address":3219724,"script_address":0},{"address":3249192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":307},{"level":28,"species":44},{"level":28,"species":358}],"party_address":3219748,"script_address":0},{"address":3249232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307},{"level":31,"species":44},{"level":31,"species":358}],"party_address":3219772,"script_address":0},{"address":3249272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":307},{"level":40,"species":45},{"level":40,"species":359}],"party_address":3219796,"script_address":0},{"address":3249312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":353},{"level":15,"species":354}],"party_address":3219820,"script_address":0},{"address":3249352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":353},{"level":27,"species":354}],"party_address":3219836,"script_address":0},{"address":3249392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":298},{"level":6,"species":295}],"party_address":3219852,"script_address":0},{"address":3249432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":292},{"level":26,"species":294}],"party_address":3219868,"script_address":0},{"address":3249472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":353},{"level":9,"species":354}],"party_address":3219884,"script_address":0},{"address":3249512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[101,50,0,0],"species":361},{"level":10,"moves":[71,73,0,0],"species":306}],"party_address":3219900,"script_address":0},{"address":3249552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":353},{"level":30,"species":354}],"party_address":3219932,"script_address":0},{"address":3249592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[209,12,57,14],"species":353},{"level":33,"moves":[209,12,204,14],"species":354}],"party_address":3219948,"script_address":0},{"address":3249632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,12,57,14],"species":353},{"level":36,"moves":[87,12,204,14],"species":354}],"party_address":3219980,"script_address":0},{"address":3249672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":309},{"level":12,"species":66}],"party_address":3220012,"script_address":2035839},{"address":3249712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309}],"party_address":3220028,"script_address":2035870},{"address":3249752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":67}],"party_address":3220036,"script_address":2069913},{"address":3249792,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":66},{"level":11,"species":72}],"party_address":3220052,"script_address":2543939},{"address":3249832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":73},{"level":44,"species":67}],"party_address":3220076,"script_address":2360255},{"address":3249872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":66},{"level":43,"species":310},{"level":43,"species":67}],"party_address":3220092,"script_address":2360286},{"address":3249912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":341},{"level":25,"species":67}],"party_address":3220116,"script_address":2340984},{"address":3249952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":309},{"level":36,"species":72},{"level":36,"species":67}],"party_address":3220132,"script_address":0},{"address":3249992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":310},{"level":39,"species":72},{"level":39,"species":67}],"party_address":3220156,"script_address":0},{"address":3250032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":310},{"level":42,"species":72},{"level":42,"species":67}],"party_address":3220180,"script_address":0},{"address":3250072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":310},{"level":45,"species":67},{"level":45,"species":73}],"party_address":3220204,"script_address":0},{"address":3250112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3220228,"script_address":2103632},{"address":3250152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[175,96,216,213],"species":328},{"level":39,"moves":[175,96,216,213],"species":328}],"party_address":3220236,"script_address":2265863},{"address":3250192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":376}],"party_address":3220268,"script_address":2068647},{"address":3250232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[92,87,120,188],"species":109}],"party_address":3220276,"script_address":2068616},{"address":3250272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[241,55,53,76],"species":385}],"party_address":3220292,"script_address":2068585},{"address":3250312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":338},{"level":33,"species":68}],"party_address":3220308,"script_address":2070116},{"address":3250352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":341}],"party_address":3220324,"script_address":2074337},{"address":3250392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[44,46,86,85],"species":338}],"party_address":3220340,"script_address":2074306},{"address":3250432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":356},{"level":33,"species":336}],"party_address":3220356,"script_address":2074275},{"address":3250472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3220372,"script_address":2074244},{"address":3250512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":170},{"level":33,"species":336}],"party_address":3220380,"script_address":2074043},{"address":3250552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":296},{"level":14,"species":299}],"party_address":3220396,"script_address":2038436},{"address":3250592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":380},{"level":18,"species":379}],"party_address":3220412,"script_address":2053172},{"address":3250632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":340},{"level":38,"species":287},{"level":40,"species":42}],"party_address":3220428,"script_address":0},{"address":3250672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":299}],"party_address":3220452,"script_address":0},{"address":3250712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":299}],"party_address":3220468,"script_address":0},{"address":3250752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":299}],"party_address":3220484,"script_address":0},{"address":3250792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":297},{"level":35,"species":300}],"party_address":3220500,"script_address":0},{"address":3250832,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[76,219,225,93],"species":359},{"level":43,"moves":[47,18,204,185],"species":316},{"level":44,"moves":[89,73,202,92],"species":363},{"level":41,"moves":[48,85,161,103],"species":82},{"level":45,"moves":[104,91,94,248],"species":394}],"party_address":3220516,"script_address":2332529},{"address":3250872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220596,"script_address":2025759},{"address":3250912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309},{"level":20,"species":278}],"party_address":3220604,"script_address":2039798},{"address":3250952,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310},{"level":31,"species":278}],"party_address":3220628,"script_address":2060578},{"address":3250992,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220652,"script_address":2025703},{"address":3251032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220660,"script_address":2039742},{"address":3251072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220684,"script_address":2060522},{"address":3251112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220708,"script_address":2025731},{"address":3251152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220716,"script_address":2039770},{"address":3251192,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220740,"script_address":2060550},{"address":3251232,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220764,"script_address":2025675},{"address":3251272,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":218},{"level":20,"species":278}],"party_address":3220772,"script_address":2039622},{"address":3251312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":296},{"level":31,"species":278}],"party_address":3220796,"script_address":2060420},{"address":3251352,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220820,"script_address":2025619},{"address":3251392,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220828,"script_address":2039566},{"address":3251432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220852,"script_address":2060364},{"address":3251472,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220876,"script_address":2025647},{"address":3251512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220884,"script_address":2039594},{"address":3251552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220908,"script_address":2060392},{"address":3251592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":370},{"level":11,"species":288},{"level":11,"species":382},{"level":11,"species":286},{"level":11,"species":304},{"level":11,"species":335}],"party_address":3220932,"script_address":2057155},{"address":3251632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":127}],"party_address":3220980,"script_address":2068678},{"address":3251672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[153,115,113,94],"species":348},{"level":43,"moves":[153,115,113,247],"species":349}],"party_address":3220988,"script_address":2334468},{"address":3251712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":371},{"level":22,"species":289},{"level":22,"species":382},{"level":22,"species":287},{"level":22,"species":305},{"level":22,"species":335}],"party_address":3221020,"script_address":0},{"address":3251752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":371},{"level":25,"species":289},{"level":25,"species":382},{"level":25,"species":287},{"level":25,"species":305},{"level":25,"species":336}],"party_address":3221068,"script_address":0},{"address":3251792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":371},{"level":28,"species":289},{"level":28,"species":382},{"level":28,"species":287},{"level":28,"species":305},{"level":28,"species":336}],"party_address":3221116,"script_address":0},{"address":3251832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":371},{"level":31,"species":289},{"level":31,"species":383},{"level":31,"species":287},{"level":31,"species":305},{"level":31,"species":336}],"party_address":3221164,"script_address":0},{"address":3251872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":306},{"level":11,"species":183},{"level":11,"species":363},{"level":11,"species":315},{"level":11,"species":118}],"party_address":3221212,"script_address":2057265},{"address":3251912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":322},{"level":43,"species":376}],"party_address":3221260,"script_address":2334499},{"address":3251952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":28}],"party_address":3221276,"script_address":2341891},{"address":3251992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":309},{"level":22,"species":306},{"level":22,"species":183},{"level":22,"species":363},{"level":22,"species":315},{"level":22,"species":118}],"party_address":3221284,"script_address":0},{"address":3252032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":310},{"level":25,"species":307},{"level":25,"species":183},{"level":25,"species":363},{"level":25,"species":316},{"level":25,"species":118}],"party_address":3221332,"script_address":0},{"address":3252072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":310},{"level":28,"species":307},{"level":28,"species":183},{"level":28,"species":363},{"level":28,"species":316},{"level":28,"species":118}],"party_address":3221380,"script_address":0},{"address":3252112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":310},{"level":31,"species":307},{"level":31,"species":184},{"level":31,"species":363},{"level":31,"species":316},{"level":31,"species":119}],"party_address":3221428,"script_address":0},{"address":3252152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3221476,"script_address":2061230},{"address":3252192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":298},{"level":28,"species":299},{"level":28,"species":296}],"party_address":3221484,"script_address":2065479},{"address":3252232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":345}],"party_address":3221508,"script_address":2563288},{"address":3252272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307}],"party_address":3221516,"script_address":0},{"address":3252312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307}],"party_address":3221524,"script_address":0},{"address":3252352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":307}],"party_address":3221532,"script_address":0},{"address":3252392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":317},{"level":39,"species":307}],"party_address":3221540,"script_address":0},{"address":3252432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":44},{"level":26,"species":363}],"party_address":3221556,"script_address":2061340},{"address":3252472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":295},{"level":28,"species":296},{"level":28,"species":299}],"party_address":3221572,"script_address":2065510},{"address":3252512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":358},{"level":38,"species":363}],"party_address":3221596,"script_address":2563226},{"address":3252552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":44},{"level":30,"species":363}],"party_address":3221612,"script_address":0},{"address":3252592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":44},{"level":33,"species":363}],"party_address":3221628,"script_address":0},{"address":3252632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":44},{"level":36,"species":363}],"party_address":3221644,"script_address":0},{"address":3252672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":182},{"level":39,"species":363}],"party_address":3221660,"script_address":0},{"address":3252712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":81}],"party_address":3221676,"script_address":2310306},{"address":3252752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":287},{"level":35,"species":42}],"party_address":3221684,"script_address":2327187},{"address":3252792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":313},{"level":31,"species":41}],"party_address":3221700,"script_address":0},{"address":3252832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":30,"species":41}],"party_address":3221716,"script_address":2317615},{"address":3252872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":286},{"level":22,"species":339}],"party_address":3221732,"script_address":2309993},{"address":3252912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3221748,"script_address":2188216},{"address":3252952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3221764,"script_address":2095389},{"address":3252992,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3221772,"script_address":2095465},{"address":3253032,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":335}],"party_address":3221780,"script_address":2095427},{"address":3253072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":356}],"party_address":3221788,"script_address":2244674},{"address":3253112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3221796,"script_address":2070287},{"address":3253152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[87,86,98,0],"species":338},{"level":32,"moves":[57,168,0,0],"species":289}],"party_address":3221804,"script_address":2070768},{"address":3253192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":73}],"party_address":3221836,"script_address":2071645},{"address":3253232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":41}],"party_address":3221844,"script_address":2304070},{"address":3253272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3221852,"script_address":2073102},{"address":3253312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":203}],"party_address":3221860,"script_address":0},{"address":3253352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":351}],"party_address":3221868,"script_address":2244705},{"address":3253392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3221876,"script_address":2244829},{"address":3253432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3221884,"script_address":2244767},{"address":3253472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":202}],"party_address":3221892,"script_address":2244798},{"address":3253512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":286}],"party_address":3221900,"script_address":2254605},{"address":3253552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221916,"script_address":2254667},{"address":3253592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3221924,"script_address":2257768},{"address":3253632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":287}],"party_address":3221932,"script_address":2257818},{"address":3253672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221940,"script_address":2257868},{"address":3253712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":177}],"party_address":3221948,"script_address":2244736},{"address":3253752,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3221956,"script_address":1978559},{"address":3253792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3221972,"script_address":1978621},{"address":3253832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":305},{"level":33,"species":307}],"party_address":3221988,"script_address":2073732},{"address":3253872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3222004,"script_address":2069651},{"address":3253912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3222012,"script_address":2572062},{"address":3253952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":20,"species":286},{"level":22,"species":339},{"level":22,"species":41}],"party_address":3222028,"script_address":2304039},{"address":3253992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":317},{"level":33,"species":371}],"party_address":3222060,"script_address":2073794},{"address":3254032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":218},{"level":15,"species":283}],"party_address":3222076,"script_address":1978590},{"address":3254072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3222092,"script_address":1978317},{"address":3254112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":287},{"level":38,"species":169},{"level":39,"species":340}],"party_address":3222108,"script_address":2351441},{"address":3254152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":287},{"level":24,"species":41},{"level":25,"species":340}],"party_address":3222132,"script_address":2303440},{"address":3254192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":4,"species":306}],"party_address":3222156,"script_address":2024895},{"address":3254232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":295},{"level":6,"species":306}],"party_address":3222172,"script_address":2029715},{"address":3254272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":183}],"party_address":3222188,"script_address":2054459},{"address":3254312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183},{"level":15,"species":306},{"level":15,"species":339}],"party_address":3222196,"script_address":2045995},{"address":3254352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":306}],"party_address":3222220,"script_address":0},{"address":3254392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":307}],"party_address":3222236,"script_address":0},{"address":3254432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":307}],"party_address":3222252,"script_address":0},{"address":3254472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":296},{"level":34,"species":307}],"party_address":3222268,"script_address":0},{"address":3254512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":43}],"party_address":3222292,"script_address":2553761},{"address":3254552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":315},{"level":14,"species":306},{"level":14,"species":183}],"party_address":3222300,"script_address":2553823},{"address":3254592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325}],"party_address":3222324,"script_address":2265615},{"address":3254632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":118},{"level":39,"species":313}],"party_address":3222332,"script_address":2265646},{"address":3254672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":290},{"level":4,"species":290}],"party_address":3222348,"script_address":2024864},{"address":3254712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290}],"party_address":3222364,"script_address":2300392},{"address":3254752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":290},{"level":8,"species":301}],"party_address":3222396,"script_address":2054211},{"address":3254792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":301},{"level":28,"species":302}],"party_address":3222412,"script_address":2061137},{"address":3254832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222428,"script_address":2061168},{"address":3254872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302}],"party_address":3222444,"script_address":2061199},{"address":3254912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":301},{"level":6,"species":301}],"party_address":3222452,"script_address":2300423},{"address":3254952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":302}],"party_address":3222468,"script_address":0},{"address":3254992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":302}],"party_address":3222476,"script_address":0},{"address":3255032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":294},{"level":31,"species":302}],"party_address":3222492,"script_address":0},{"address":3255072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":311},{"level":33,"species":302},{"level":33,"species":294},{"level":33,"species":302}],"party_address":3222516,"script_address":0},{"address":3255112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":339},{"level":17,"species":66}],"party_address":3222548,"script_address":2049688},{"address":3255152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":17,"species":74},{"level":16,"species":74}],"party_address":3222564,"script_address":2049719},{"address":3255192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":66}],"party_address":3222588,"script_address":2051841},{"address":3255232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":339}],"party_address":3222604,"script_address":2051872},{"address":3255272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":74},{"level":22,"species":320},{"level":22,"species":75}],"party_address":3222620,"script_address":2557067},{"address":3255312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74}],"party_address":3222644,"script_address":2054428},{"address":3255352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":74},{"level":20,"species":318}],"party_address":3222652,"script_address":2310061},{"address":3255392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":9,"moves":[150,55,0,0],"species":313}],"party_address":3222668,"script_address":0},{"address":3255432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[16,45,0,0],"species":310},{"level":10,"moves":[44,184,0,0],"species":286}],"party_address":3222684,"script_address":0},{"address":3255472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":16,"species":74},{"level":16,"species":66}],"party_address":3222716,"script_address":2296023},{"address":3255512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":75}],"party_address":3222740,"script_address":0},{"address":3255552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":74},{"level":27,"species":74},{"level":27,"species":75},{"level":27,"species":75}],"party_address":3222772,"script_address":0},{"address":3255592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":74},{"level":30,"species":75},{"level":30,"species":75},{"level":30,"species":75}],"party_address":3222804,"script_address":0},{"address":3255632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":76}],"party_address":3222836,"script_address":0},{"address":3255672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":316},{"level":31,"species":338}],"party_address":3222868,"script_address":0},{"address":3255712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":325}],"party_address":3222884,"script_address":0},{"address":3255752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222900,"script_address":0},{"address":3255792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":386},{"level":30,"species":387}],"party_address":3222916,"script_address":0},{"address":3255832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":386},{"level":33,"species":387}],"party_address":3222932,"script_address":0},{"address":3255872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":386},{"level":36,"species":387}],"party_address":3222948,"script_address":0},{"address":3255912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":386},{"level":39,"species":387}],"party_address":3222964,"script_address":0},{"address":3255952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":118}],"party_address":3222980,"script_address":2543970},{"address":3255992,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[53,154,185,20],"species":317}],"party_address":3222988,"script_address":2103539},{"address":3256032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[117,197,93,9],"species":356},{"level":17,"moves":[9,197,93,96],"species":356}],"party_address":3223004,"script_address":2167701},{"address":3256072,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[117,197,93,7],"species":356}],"party_address":3223036,"script_address":2103508},{"address":3256112,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[33,120,124,108],"species":109},{"level":25,"moves":[33,139,124,108],"species":109}],"party_address":3223052,"script_address":2061574},{"address":3256152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[139,120,124,108],"species":109},{"level":28,"moves":[28,104,210,14],"species":302}],"party_address":3223084,"script_address":2065775},{"address":3256192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[141,154,170,91],"species":301},{"level":28,"moves":[33,120,124,108],"species":109}],"party_address":3223116,"script_address":2065806},{"address":3256232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":305},{"level":29,"species":178}],"party_address":3223148,"script_address":2202329},{"address":3256272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":358},{"level":27,"species":358},{"level":27,"species":358}],"party_address":3223164,"script_address":2202360},{"address":3256312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":392}],"party_address":3223188,"script_address":1971405},{"address":3256352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[76,219,225,93],"species":359},{"level":46,"moves":[47,18,204,185],"species":316},{"level":47,"moves":[89,73,202,92],"species":363},{"level":44,"moves":[48,85,161,103],"species":82},{"level":48,"moves":[104,91,94,248],"species":394}],"party_address":3223196,"script_address":2332607},{"address":3256392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[76,219,225,93],"species":359},{"level":49,"moves":[47,18,204,185],"species":316},{"level":50,"moves":[89,73,202,92],"species":363},{"level":47,"moves":[48,85,161,103],"species":82},{"level":51,"moves":[104,91,94,248],"species":394}],"party_address":3223276,"script_address":0},{"address":3256432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[76,219,225,93],"species":359},{"level":52,"moves":[47,18,204,185],"species":316},{"level":53,"moves":[89,73,202,92],"species":363},{"level":50,"moves":[48,85,161,103],"species":82},{"level":54,"moves":[104,91,94,248],"species":394}],"party_address":3223356,"script_address":0},{"address":3256472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[76,219,225,93],"species":359},{"level":55,"moves":[47,18,204,185],"species":316},{"level":56,"moves":[89,73,202,92],"species":363},{"level":53,"moves":[48,85,161,103],"species":82},{"level":57,"moves":[104,91,94,248],"species":394}],"party_address":3223436,"script_address":0},{"address":3256512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223516,"script_address":1986165},{"address":3256552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223548,"script_address":1986109},{"address":3256592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223580,"script_address":1986137},{"address":3256632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223612,"script_address":1986081},{"address":3256672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223644,"script_address":1986025},{"address":3256712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223676,"script_address":1986053},{"address":3256752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":31,"species":72},{"level":32,"species":331}],"party_address":3223708,"script_address":2070644},{"address":3256792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":34,"species":73}],"party_address":3223732,"script_address":2070675},{"address":3256832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":129},{"level":25,"species":129},{"level":35,"species":130}],"party_address":3223748,"script_address":2070706},{"address":3256872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":44},{"level":34,"species":184}],"party_address":3223772,"script_address":2071552},{"address":3256912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":300},{"level":34,"species":320}],"party_address":3223788,"script_address":2071583},{"address":3256952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":67}],"party_address":3223804,"script_address":2070799},{"address":3256992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":72},{"level":31,"species":72},{"level":36,"species":313}],"party_address":3223812,"script_address":2071614},{"address":3257032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":305},{"level":32,"species":227}],"party_address":3223836,"script_address":2070737},{"address":3257072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":341},{"level":33,"species":331}],"party_address":3223852,"script_address":2073040},{"address":3257112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170}],"party_address":3223868,"script_address":2073071},{"address":3257152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":308},{"level":19,"species":308}],"party_address":3223876,"script_address":0},{"address":3257192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[47,31,219,76],"species":358},{"level":35,"moves":[53,36,156,89],"species":339}],"party_address":3223892,"script_address":0},{"address":3257232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[74,78,72,73],"species":363},{"level":20,"moves":[111,205,44,88],"species":75}],"party_address":3223924,"script_address":0},{"address":3257272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[16,60,92,182],"species":294},{"level":27,"moves":[16,72,213,78],"species":292}],"party_address":3223956,"script_address":0},{"address":3257312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[94,7,244,182],"species":357},{"level":39,"moves":[8,61,156,187],"species":336}],"party_address":3223988,"script_address":0},{"address":3257352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,7,244,182],"species":357},{"level":43,"moves":[8,61,156,187],"species":336}],"party_address":3224020,"script_address":0},{"address":3257392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[94,7,244,182],"species":357},{"level":46,"moves":[8,61,156,187],"species":336}],"party_address":3224052,"script_address":0},{"address":3257432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":49,"moves":[94,7,244,182],"species":357},{"level":49,"moves":[8,61,156,187],"species":336}],"party_address":3224084,"script_address":0},{"address":3257472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[94,7,244,182],"species":357},{"level":52,"moves":[8,61,156,187],"species":336}],"party_address":3224116,"script_address":0},{"address":3257512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":33,"species":309}],"party_address":3224148,"script_address":0},{"address":3257552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170},{"level":33,"species":330}],"party_address":3224164,"script_address":0},{"address":3257592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":170},{"level":40,"species":330}],"party_address":3224180,"script_address":0},{"address":3257632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":171},{"level":43,"species":330}],"party_address":3224196,"script_address":0},{"address":3257672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":171},{"level":46,"species":331}],"party_address":3224212,"script_address":0},{"address":3257712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":51,"species":171},{"level":49,"species":331}],"party_address":3224228,"script_address":0},{"address":3257752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":118},{"level":25,"species":72}],"party_address":3224244,"script_address":0},{"address":3257792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":129},{"level":20,"species":72},{"level":26,"species":328},{"level":23,"species":330}],"party_address":3224260,"script_address":2061605},{"address":3257832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":288},{"level":8,"species":286}],"party_address":3224292,"script_address":2054707},{"address":3257872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":295},{"level":8,"species":288}],"party_address":3224308,"script_address":2054676},{"address":3257912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":129}],"party_address":3224324,"script_address":2030343},{"address":3257952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":183}],"party_address":3224332,"script_address":2036307},{"address":3257992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":72},{"level":12,"species":72}],"party_address":3224340,"script_address":2036276},{"address":3258032,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":354},{"level":14,"species":353}],"party_address":3224356,"script_address":2039032},{"address":3258072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":337},{"level":14,"species":100}],"party_address":3224372,"script_address":2039063},{"address":3258112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81}],"party_address":3224388,"script_address":2039094},{"address":3258152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":100}],"party_address":3224396,"script_address":2026463},{"address":3258192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":335}],"party_address":3224404,"script_address":2026494},{"address":3258232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":27}],"party_address":3224412,"script_address":2046975},{"address":3258272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":363}],"party_address":3224420,"script_address":2047006},{"address":3258312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306}],"party_address":3224428,"script_address":2046944},{"address":3258352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339}],"party_address":3224436,"script_address":2046913},{"address":3258392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":183},{"level":19,"species":296}],"party_address":3224444,"script_address":2050969},{"address":3258432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":227},{"level":19,"species":305}],"party_address":3224460,"script_address":2051000},{"address":3258472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":318},{"level":18,"species":27}],"party_address":3224476,"script_address":2051031},{"address":3258512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":382},{"level":18,"species":382}],"party_address":3224492,"script_address":2051062},{"address":3258552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":183}],"party_address":3224508,"script_address":2052309},{"address":3258592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3224524,"script_address":2052371},{"address":3258632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":299}],"party_address":3224532,"script_address":2052340},{"address":3258672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":14,"species":382},{"level":14,"species":337}],"party_address":3224540,"script_address":2059128},{"address":3258712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224564,"script_address":2347841},{"address":3258752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224572,"script_address":2347872},{"address":3258792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224580,"script_address":2348597},{"address":3258832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":41}],"party_address":3224588,"script_address":2348628},{"address":3258872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":339}],"party_address":3224604,"script_address":2348659},{"address":3258912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224620,"script_address":2349324},{"address":3258952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224628,"script_address":2349355},{"address":3258992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224636,"script_address":2349386},{"address":3259032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224644,"script_address":2350264},{"address":3259072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224652,"script_address":2350826},{"address":3259112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224660,"script_address":2351566},{"address":3259152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224668,"script_address":2351597},{"address":3259192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224676,"script_address":2351628},{"address":3259232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224684,"script_address":2348566},{"address":3259272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224692,"script_address":2349293},{"address":3259312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224700,"script_address":2350295},{"address":3259352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":339},{"level":28,"species":287},{"level":30,"species":41},{"level":33,"species":340}],"party_address":3224708,"script_address":2351659},{"address":3259392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":310},{"level":33,"species":340}],"party_address":3224740,"script_address":2073763},{"address":3259432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":287},{"level":43,"species":169},{"level":44,"species":340}],"party_address":3224756,"script_address":0},{"address":3259472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":72}],"party_address":3224780,"script_address":2026525},{"address":3259512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183}],"party_address":3224788,"script_address":2026556},{"address":3259552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":27},{"level":25,"species":27}],"party_address":3224796,"script_address":2033726},{"address":3259592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":309}],"party_address":3224812,"script_address":2033695},{"address":3259632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":120}],"party_address":3224828,"script_address":2034744},{"address":3259672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":309},{"level":24,"species":66},{"level":24,"species":72}],"party_address":3224836,"script_address":2034931},{"address":3259712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":338},{"level":24,"species":305},{"level":24,"species":338}],"party_address":3224860,"script_address":2034900},{"address":3259752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":227},{"level":25,"species":227}],"party_address":3224884,"script_address":2036338},{"address":3259792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":183},{"level":22,"species":296}],"party_address":3224900,"script_address":2047037},{"address":3259832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":27},{"level":22,"species":28}],"party_address":3224916,"script_address":2047068},{"address":3259872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":304},{"level":22,"species":299}],"party_address":3224932,"script_address":2047099},{"address":3259912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":18,"species":218}],"party_address":3224948,"script_address":2049891},{"address":3259952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306},{"level":18,"species":363}],"party_address":3224964,"script_address":2049922},{"address":3259992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":84},{"level":26,"species":85}],"party_address":3224980,"script_address":2053203},{"address":3260032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302},{"level":26,"species":367}],"party_address":3224996,"script_address":2053234},{"address":3260072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":64},{"level":26,"species":393}],"party_address":3225012,"script_address":2053265},{"address":3260112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3225028,"script_address":2053296},{"address":3260152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":351}],"party_address":3225044,"script_address":2053327},{"address":3260192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3225060,"script_address":2054738},{"address":3260232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":306},{"level":8,"species":295}],"party_address":3225076,"script_address":2054769},{"address":3260272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3225092,"script_address":2057834},{"address":3260312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3225100,"script_address":2057865},{"address":3260352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":356}],"party_address":3225108,"script_address":2057896},{"address":3260392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":363},{"level":33,"species":357}],"party_address":3225116,"script_address":2073825},{"address":3260432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":338}],"party_address":3225132,"script_address":2061636},{"address":3260472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":218},{"level":25,"species":339}],"party_address":3225140,"script_address":2061667},{"address":3260512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3225156,"script_address":2061698},{"address":3260552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[87,98,86,0],"species":338}],"party_address":3225164,"script_address":2065837},{"address":3260592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":356},{"level":28,"species":335}],"party_address":3225180,"script_address":2065868},{"address":3260632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":292}],"party_address":3225196,"script_address":2067487},{"address":3260672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":335},{"level":25,"species":309},{"level":25,"species":369},{"level":25,"species":288},{"level":25,"species":337},{"level":25,"species":339}],"party_address":3225212,"script_address":2067518},{"address":3260712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":286},{"level":25,"species":306},{"level":25,"species":337},{"level":25,"species":183},{"level":25,"species":27},{"level":25,"species":367}],"party_address":3225260,"script_address":2067549},{"address":3260752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":371},{"level":29,"species":365}],"party_address":3225308,"script_address":2067611},{"address":3260792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3225324,"script_address":1978255},{"address":3260832,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":321},{"level":15,"species":283}],"party_address":3225340,"script_address":1978286},{"address":3260872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[182,205,222,153],"species":76},{"level":35,"moves":[14,58,57,157],"species":140},{"level":35,"moves":[231,153,46,157],"species":95},{"level":37,"moves":[104,153,182,157],"species":320}],"party_address":3225356,"script_address":0},{"address":3260912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[182,58,157,57],"species":138},{"level":37,"moves":[182,205,222,153],"species":76},{"level":40,"moves":[14,58,57,157],"species":141},{"level":40,"moves":[231,153,46,157],"species":95},{"level":42,"moves":[104,153,182,157],"species":320}],"party_address":3225420,"script_address":0},{"address":3260952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[182,58,157,57],"species":139},{"level":42,"moves":[182,205,89,153],"species":76},{"level":45,"moves":[14,58,57,157],"species":141},{"level":45,"moves":[231,153,46,157],"species":95},{"level":47,"moves":[104,153,182,157],"species":320}],"party_address":3225500,"script_address":0},{"address":3260992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[157,63,48,182],"species":142},{"level":47,"moves":[8,205,89,153],"species":76},{"level":47,"moves":[182,58,157,57],"species":139},{"level":50,"moves":[14,58,57,157],"species":141},{"level":50,"moves":[231,153,46,157],"species":208},{"level":52,"moves":[104,153,182,157],"species":320}],"party_address":3225580,"script_address":0},{"address":3261032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[2,157,8,83],"species":68},{"level":33,"moves":[94,113,115,8],"species":356},{"level":35,"moves":[228,68,182,167],"species":237},{"level":37,"moves":[252,8,187,89],"species":336}],"party_address":3225676,"script_address":0},{"address":3261072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[2,157,8,83],"species":68},{"level":38,"moves":[94,113,115,8],"species":357},{"level":40,"moves":[228,68,182,167],"species":237},{"level":42,"moves":[252,8,187,89],"species":336}],"party_address":3225740,"script_address":0},{"address":3261112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[71,182,7,8],"species":107},{"level":43,"moves":[2,157,8,83],"species":68},{"level":43,"moves":[8,113,115,94],"species":357},{"level":45,"moves":[228,68,182,167],"species":237},{"level":47,"moves":[252,8,187,89],"species":336}],"party_address":3225804,"script_address":0},{"address":3261152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[25,8,89,83],"species":106},{"level":46,"moves":[71,182,7,8],"species":107},{"level":48,"moves":[238,157,8,83],"species":68},{"level":48,"moves":[8,113,115,94],"species":357},{"level":50,"moves":[228,68,182,167],"species":237},{"level":52,"moves":[252,8,187,89],"species":336}],"party_address":3225884,"script_address":0},{"address":3261192,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,182,86,113],"species":179},{"level":36,"moves":[205,87,153,240],"species":101},{"level":38,"moves":[48,182,87,240],"species":82},{"level":40,"moves":[44,86,87,182],"species":338}],"party_address":3225980,"script_address":0},{"address":3261232,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[87,21,240,95],"species":25},{"level":41,"moves":[87,182,86,113],"species":180},{"level":41,"moves":[205,87,153,240],"species":101},{"level":43,"moves":[48,182,87,240],"species":82},{"level":45,"moves":[44,86,87,182],"species":338}],"party_address":3226044,"script_address":0},{"address":3261272,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[87,21,240,182],"species":26},{"level":46,"moves":[87,182,86,113],"species":181},{"level":46,"moves":[205,87,153,240],"species":101},{"level":48,"moves":[48,182,87,240],"species":82},{"level":50,"moves":[44,86,87,182],"species":338}],"party_address":3226124,"script_address":0},{"address":3261312,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[129,8,9,113],"species":125},{"level":51,"moves":[87,21,240,182],"species":26},{"level":51,"moves":[87,182,86,113],"species":181},{"level":53,"moves":[205,87,153,240],"species":101},{"level":53,"moves":[48,182,87,240],"species":82},{"level":55,"moves":[44,86,87,182],"species":338}],"party_address":3226204,"script_address":0},{"address":3261352,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[59,213,113,157],"species":219},{"level":36,"moves":[53,213,76,84],"species":77},{"level":38,"moves":[59,241,89,213],"species":340},{"level":40,"moves":[59,241,153,213],"species":321}],"party_address":3226300,"script_address":0},{"address":3261392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[14,53,46,241],"species":58},{"level":43,"moves":[59,213,113,157],"species":219},{"level":41,"moves":[53,213,76,84],"species":77},{"level":43,"moves":[59,241,89,213],"species":340},{"level":45,"moves":[59,241,153,213],"species":321}],"party_address":3226364,"script_address":0},{"address":3261432,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,76,13,241],"species":228},{"level":46,"moves":[14,53,241,46],"species":58},{"level":48,"moves":[59,213,113,157],"species":219},{"level":46,"moves":[53,213,76,84],"species":78},{"level":48,"moves":[59,241,89,213],"species":340},{"level":50,"moves":[59,241,153,213],"species":321}],"party_address":3226444,"script_address":0},{"address":3261472,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":51,"moves":[14,53,241,46],"species":59},{"level":53,"moves":[59,213,113,157],"species":219},{"level":51,"moves":[46,76,13,241],"species":229},{"level":51,"moves":[53,213,76,84],"species":78},{"level":53,"moves":[59,241,89,213],"species":340},{"level":55,"moves":[59,241,153,213],"species":321}],"party_address":3226540,"script_address":0},{"address":3261512,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[113,47,29,8],"species":113},{"level":42,"moves":[59,247,38,126],"species":366},{"level":43,"moves":[42,29,7,95],"species":308},{"level":45,"moves":[63,53,85,247],"species":366}],"party_address":3226636,"script_address":0},{"address":3261552,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[59,247,38,126],"species":366},{"level":47,"moves":[113,47,29,8],"species":113},{"level":45,"moves":[252,146,203,179],"species":115},{"level":48,"moves":[42,29,7,95],"species":308},{"level":50,"moves":[63,53,85,247],"species":366}],"party_address":3226700,"script_address":0},{"address":3261592,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[59,247,38,126],"species":366},{"level":52,"moves":[113,47,29,8],"species":242},{"level":50,"moves":[252,146,203,179],"species":115},{"level":53,"moves":[42,29,7,95],"species":308},{"level":55,"moves":[63,53,85,247],"species":366}],"party_address":3226780,"script_address":0},{"address":3261632,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[59,247,38,126],"species":366},{"level":57,"moves":[182,47,29,8],"species":242},{"level":55,"moves":[252,146,203,179],"species":115},{"level":57,"moves":[36,182,126,89],"species":128},{"level":58,"moves":[42,29,7,95],"species":308},{"level":60,"moves":[63,53,85,247],"species":366}],"party_address":3226860,"script_address":0},{"address":3261672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[86,85,182,58],"species":147},{"level":38,"moves":[241,76,76,89],"species":369},{"level":41,"moves":[57,48,182,76],"species":310},{"level":43,"moves":[18,191,211,76],"species":227},{"level":45,"moves":[76,156,93,89],"species":359}],"party_address":3226956,"script_address":0},{"address":3261712,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[95,94,115,138],"species":163},{"level":43,"moves":[241,76,76,89],"species":369},{"level":45,"moves":[86,85,182,58],"species":148},{"level":46,"moves":[57,48,182,76],"species":310},{"level":48,"moves":[18,191,211,76],"species":227},{"level":50,"moves":[76,156,93,89],"species":359}],"party_address":3227036,"script_address":0},{"address":3261752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[95,94,115,138],"species":164},{"level":49,"moves":[241,76,76,89],"species":369},{"level":50,"moves":[86,85,182,58],"species":148},{"level":51,"moves":[57,48,182,76],"species":310},{"level":53,"moves":[18,191,211,76],"species":227},{"level":55,"moves":[76,156,93,89],"species":359}],"party_address":3227132,"script_address":0},{"address":3261792,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,94,115,138],"species":164},{"level":54,"moves":[241,76,76,89],"species":369},{"level":55,"moves":[57,48,182,76],"species":310},{"level":55,"moves":[63,85,89,58],"species":149},{"level":58,"moves":[18,191,211,76],"species":227},{"level":60,"moves":[143,156,93,89],"species":359}],"party_address":3227228,"script_address":0},{"address":3261832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[25,94,91,182],"species":79},{"level":49,"moves":[89,246,94,113],"species":319},{"level":49,"moves":[94,156,109,91],"species":178},{"level":50,"moves":[89,94,156,91],"species":348},{"level":50,"moves":[241,76,94,53],"species":349}],"party_address":3227324,"script_address":0},{"address":3261872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,138,29,182],"species":96},{"level":53,"moves":[25,94,91,182],"species":79},{"level":54,"moves":[89,153,94,113],"species":319},{"level":54,"moves":[94,156,109,91],"species":178},{"level":55,"moves":[89,94,156,91],"species":348},{"level":55,"moves":[241,76,94,53],"species":349}],"party_address":3227404,"script_address":0},{"address":3261912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":58,"moves":[95,138,29,182],"species":97},{"level":59,"moves":[89,153,94,113],"species":319},{"level":58,"moves":[25,94,91,182],"species":79},{"level":59,"moves":[94,156,109,91],"species":178},{"level":60,"moves":[89,94,156,91],"species":348},{"level":60,"moves":[241,76,94,53],"species":349}],"party_address":3227500,"script_address":0},{"address":3261952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":63,"moves":[95,138,29,182],"species":97},{"level":64,"moves":[89,153,94,113],"species":319},{"level":63,"moves":[25,94,91,182],"species":199},{"level":64,"moves":[94,156,109,91],"species":178},{"level":65,"moves":[89,94,156,91],"species":348},{"level":65,"moves":[241,76,94,53],"species":349}],"party_address":3227596,"script_address":0},{"address":3261992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[95,240,182,56],"species":60},{"level":46,"moves":[240,96,104,90],"species":324},{"level":48,"moves":[96,34,182,58],"species":343},{"level":48,"moves":[156,152,13,104],"species":327},{"level":51,"moves":[96,104,58,156],"species":230}],"party_address":3227692,"script_address":0},{"address":3262032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[95,240,182,56],"species":61},{"level":51,"moves":[240,96,104,90],"species":324},{"level":53,"moves":[96,34,182,58],"species":343},{"level":53,"moves":[156,12,13,104],"species":327},{"level":56,"moves":[96,104,58,156],"species":230}],"party_address":3227772,"script_address":0},{"address":3262072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[56,195,58,109],"species":131},{"level":58,"moves":[240,96,104,90],"species":324},{"level":56,"moves":[95,240,182,56],"species":61},{"level":58,"moves":[96,34,182,58],"species":343},{"level":58,"moves":[156,12,13,104],"species":327},{"level":61,"moves":[96,104,58,156],"species":230}],"party_address":3227852,"script_address":0},{"address":3262112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":61,"moves":[56,195,58,109],"species":131},{"level":63,"moves":[240,96,104,90],"species":324},{"level":61,"moves":[95,240,56,195],"species":186},{"level":63,"moves":[96,34,182,73],"species":343},{"level":63,"moves":[156,12,13,104],"species":327},{"level":66,"moves":[96,104,58,156],"species":230}],"party_address":3227948,"script_address":0},{"address":3262152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[95,98,204,0],"species":387},{"level":17,"moves":[95,98,109,0],"species":386}],"party_address":3228044,"script_address":2167732},{"address":3262192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":369}],"party_address":3228076,"script_address":2202422},{"address":3262232,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":77,"moves":[92,76,191,211],"species":227},{"level":75,"moves":[115,113,246,89],"species":319},{"level":76,"moves":[87,89,76,81],"species":384},{"level":76,"moves":[202,246,19,109],"species":389},{"level":76,"moves":[96,246,76,163],"species":391},{"level":78,"moves":[89,94,53,247],"species":400}],"party_address":3228084,"script_address":2354502},{"address":3262272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228180,"script_address":0},{"address":3262312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228188,"script_address":0},{"address":3262352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228196,"script_address":0},{"address":3262392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228204,"script_address":0},{"address":3262432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228212,"script_address":0},{"address":3262472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228220,"script_address":0},{"address":3262512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228228,"script_address":0},{"address":3262552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":27}],"party_address":3228236,"script_address":0},{"address":3262592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":320},{"level":33,"species":27},{"level":33,"species":27}],"party_address":3228252,"script_address":0},{"address":3262632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":320},{"level":35,"species":27},{"level":35,"species":27}],"party_address":3228276,"script_address":0},{"address":3262672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":320},{"level":37,"species":28},{"level":37,"species":28}],"party_address":3228300,"script_address":0},{"address":3262712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":309},{"level":30,"species":66},{"level":30,"species":72}],"party_address":3228324,"script_address":0},{"address":3262752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":66},{"level":32,"species":72}],"party_address":3228348,"script_address":0},{"address":3262792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":66},{"level":34,"species":73}],"party_address":3228372,"script_address":0},{"address":3262832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":310},{"level":36,"species":67},{"level":36,"species":73}],"party_address":3228396,"script_address":0},{"address":3262872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":120},{"level":37,"species":120}],"party_address":3228420,"script_address":0},{"address":3262912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":309},{"level":39,"species":120},{"level":39,"species":120}],"party_address":3228436,"script_address":0},{"address":3262952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":310},{"level":41,"species":120},{"level":41,"species":120}],"party_address":3228460,"script_address":0},{"address":3262992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":310},{"level":43,"species":121},{"level":43,"species":121}],"party_address":3228484,"script_address":0},{"address":3263032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":67},{"level":37,"species":67}],"party_address":3228508,"script_address":0},{"address":3263072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":335},{"level":39,"species":67},{"level":39,"species":67}],"party_address":3228524,"script_address":0},{"address":3263112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":336},{"level":41,"species":67},{"level":41,"species":67}],"party_address":3228548,"script_address":0},{"address":3263152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":336},{"level":43,"species":68},{"level":43,"species":68}],"party_address":3228572,"script_address":0},{"address":3263192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":371},{"level":35,"species":365}],"party_address":3228596,"script_address":0},{"address":3263232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":308},{"level":37,"species":371},{"level":37,"species":365}],"party_address":3228612,"script_address":0},{"address":3263272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":308},{"level":39,"species":371},{"level":39,"species":365}],"party_address":3228636,"script_address":0},{"address":3263312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":308},{"level":41,"species":372},{"level":41,"species":366}],"party_address":3228660,"script_address":0},{"address":3263352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":337},{"level":35,"species":337},{"level":35,"species":371}],"party_address":3228684,"script_address":0},{"address":3263392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":337},{"level":37,"species":338},{"level":37,"species":371}],"party_address":3228708,"script_address":0},{"address":3263432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":338},{"level":39,"species":338},{"level":39,"species":371}],"party_address":3228732,"script_address":0},{"address":3263472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":338},{"level":41,"species":338},{"level":41,"species":372}],"party_address":3228756,"script_address":0},{"address":3263512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":74},{"level":26,"species":339}],"party_address":3228780,"script_address":0},{"address":3263552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":66},{"level":28,"species":339},{"level":28,"species":75}],"party_address":3228796,"script_address":0},{"address":3263592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":66},{"level":30,"species":339},{"level":30,"species":75}],"party_address":3228820,"script_address":0},{"address":3263632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":340},{"level":33,"species":76}],"party_address":3228844,"script_address":0},{"address":3263672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":315},{"level":31,"species":287},{"level":31,"species":288},{"level":31,"species":295},{"level":31,"species":298},{"level":31,"species":304}],"party_address":3228868,"script_address":0},{"address":3263712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":315},{"level":33,"species":287},{"level":33,"species":289},{"level":33,"species":296},{"level":33,"species":299},{"level":33,"species":304}],"party_address":3228916,"script_address":0},{"address":3263752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316},{"level":35,"species":287},{"level":35,"species":289},{"level":35,"species":296},{"level":35,"species":299},{"level":35,"species":305}],"party_address":3228964,"script_address":0},{"address":3263792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":316},{"level":37,"species":287},{"level":37,"species":289},{"level":37,"species":297},{"level":37,"species":300},{"level":37,"species":305}],"party_address":3229012,"script_address":0},{"address":3263832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313},{"level":34,"species":116}],"party_address":3229060,"script_address":0},{"address":3263872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":325},{"level":36,"species":313},{"level":36,"species":117}],"party_address":3229076,"script_address":0},{"address":3263912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":325},{"level":38,"species":313},{"level":38,"species":117}],"party_address":3229100,"script_address":0},{"address":3263952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325},{"level":40,"species":314},{"level":40,"species":230}],"party_address":3229124,"script_address":0},{"address":3263992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":411}],"party_address":3229148,"script_address":2564791},{"address":3264032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":64}],"party_address":3229156,"script_address":2564822},{"address":3264072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":202}],"party_address":3229172,"script_address":0},{"address":3264112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":4}],"party_address":3229180,"script_address":0},{"address":3264152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":1}],"party_address":3229188,"script_address":0},{"address":3264192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":405}],"party_address":3229196,"script_address":0},{"address":3264232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":404}],"party_address":3229204,"script_address":0}],"warps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4":"MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0","MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2":"MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1","MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10","MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2":"MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11","MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3":"MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2","MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0":"MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4","MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3":"MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5","MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2":"MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6","MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4":"MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7","MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0":"MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8","MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9","MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2":"MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0","MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0":"MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1","MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0":"MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2","MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1":"MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3","MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2":"MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4","MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0":"MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5","MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10":"MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6","MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9":"MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7","MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0":"MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0","MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2","MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3","MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0":"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8","MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8":"MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0","MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11":"MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2","MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0","MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0","MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3","MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4","MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0","MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1","MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2","MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0","MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0":"MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0","MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0":"MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0","MAP_ALTERING_CAVE:0/MAP_ROUTE103:0":"MAP_ROUTE103:0/MAP_ALTERING_CAVE:0","MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0":"MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0","MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2":"MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1","MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1":"MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2","MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6":"MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0","MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0":"MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2","MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2":"MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0","MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0":"MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1","MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6":"MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10","MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22":"MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11","MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9":"MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12","MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18":"MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13","MAP_AQUA_HIDEOUT_B1F:14/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16":"MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15","MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15":"MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16","MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20":"MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17","MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13":"MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18","MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24":"MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19","MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1":"MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2","MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:21/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11":"MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22","MAP_AQUA_HIDEOUT_B1F:23/MAP_AQUA_HIDEOUT_B1F:17!":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19":"MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24","MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2":"MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3","MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7":"MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4","MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8":"MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5","MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10":"MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6","MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5":"MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8","MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1":"MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0","MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2":"MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1","MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3":"MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2","MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5":"MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3","MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8":"MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4","MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3":"MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5","MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7":"MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6","MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6":"MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7","MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4":"MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8","MAP_AQUA_HIDEOUT_B2F:9/MAP_AQUA_HIDEOUT_B1F:4!":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0","MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1":"MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1","MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0","MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1":"MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1","MAP_BATTLE_COLOSSEUM_2P:0,1/MAP_DYNAMIC:-1!":"","MAP_BATTLE_COLOSSEUM_4P:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:3/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0!":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2","MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2","MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0","MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0","MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0","MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0","MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0","MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0","MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0","MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0","MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0","MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0","MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0":"MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0":"MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0":"MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0":"MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0":"MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0":"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0":"MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0":"MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0":"MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0":"MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0":"MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0":"MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0":"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0":"MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0":"MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1","MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0","MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0":"MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0","MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0":"MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0","MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1":"MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0","MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3":"MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0":"MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:0/MAP_CAVE_OF_ORIGIN_1F:1!":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:1/MAP_CAVE_OF_ORIGIN_B1F:0!":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_DESERT_RUINS:0/MAP_ROUTE111:1":"MAP_ROUTE111:1/MAP_DESERT_RUINS:0","MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2":"MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1","MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1":"MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2","MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0","MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0":"MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0","MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1","MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0":"MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2","MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0":"MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3","MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0":"MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4","MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2":"MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0","MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0":"MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0","MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3":"MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0","MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4":"MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1":"MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0","MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1","MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0":"MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2","MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1":"MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1":"MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0":"MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1":"MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0":"MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1":"MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0":"MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1","MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0","MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1","MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0","MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1","MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0","MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1","MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0","MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1","MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0","MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1","MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1":"MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0":"MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1":"MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0":"MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0":"MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1":"MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0":"MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1","MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0":"MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0","MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0":"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1","MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2","MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0":"MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3","MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0":"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4","MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1":"MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0","MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3":"MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0","MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0":"MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0","MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4":"MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2":"MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1":"MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1","MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1":"MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1","MAP_FIERY_PATH:0/MAP_ROUTE112:4":"MAP_ROUTE112:4/MAP_FIERY_PATH:0","MAP_FIERY_PATH:1/MAP_ROUTE112:5":"MAP_ROUTE112:5/MAP_FIERY_PATH:1","MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0","MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0":"MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1","MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0":"MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2","MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0":"MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3","MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0":"MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4","MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0":"MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5","MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0":"MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6","MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0":"MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7","MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0":"MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8","MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8":"MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0","MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2":"MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0","MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1":"MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0","MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4":"MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0","MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5":"MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0","MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6":"MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0","MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7":"MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0","MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3":"MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0":"MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2","MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0","MAP_FORTREE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FORTREE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0":"MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0","MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0":"MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1","MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1":"MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2","MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0":"MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3","MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1":"MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0","MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2":"MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1","MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0":"MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2","MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1":"MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3","MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2":"MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4","MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3":"MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5","MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4":"MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6","MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2":"MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0","MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3":"MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1","MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4":"MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2","MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5":"MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3","MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6":"MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4","MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3":"MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0","MAP_INSIDE_OF_TRUCK:0,1,2/MAP_DYNAMIC:-1!":"","MAP_ISLAND_CAVE:0/MAP_ROUTE105:0":"MAP_ROUTE105:0/MAP_ISLAND_CAVE:0","MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2":"MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1","MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1":"MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2","MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3":"MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1","MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3":"MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3","MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0":"MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4","MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0":"MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0","MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0":"MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1","MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0":"MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2","MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3","MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0":"MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4","MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5","MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1":"MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0","MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8":"MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10","MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9":"MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11","MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10":"MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12","MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11":"MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13","MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12":"MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14","MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13":"MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15","MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14":"MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16","MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15":"MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17","MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16":"MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18","MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17":"MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19","MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0":"MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2","MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18":"MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20","MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20":"MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21","MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19":"MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22","MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21":"MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23","MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22":"MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24","MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23":"MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25","MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2":"MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3","MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4":"MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4","MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3":"MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5","MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1":"MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6","MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5":"MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7","MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6":"MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8","MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7":"MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9","MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2":"MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0","MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6":"MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1","MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12":"MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10","MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13":"MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11","MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14":"MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12","MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15":"MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13","MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16":"MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14","MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17":"MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15","MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18":"MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16","MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19":"MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17","MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20":"MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18","MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22":"MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19","MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3":"MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2","MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21":"MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20","MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23":"MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21","MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24":"MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22","MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25":"MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23","MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5":"MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3","MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4":"MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4","MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7":"MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5","MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8":"MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6","MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9":"MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7","MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10":"MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8","MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11":"MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9","MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0":"MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0","MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4":"MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0","MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2":"MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3":"MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5":"MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0","MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1","MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0":"MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10","MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0":"MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11","MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0":"MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12","MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2","MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13","MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4","MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1":"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5","MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0":"MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6","MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0":"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7","MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0":"MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8","MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0":"MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9","MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0","MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1","MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4":"MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0","MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0":"MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2","MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1":"MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1":"MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:3/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!":"","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0","MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12":"MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0","MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8":"MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0","MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9":"MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0","MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10":"MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0","MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11":"MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13":"MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0","MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7":"MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2":"MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5":"MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1","MAP_LILYCOVE_CITY_UNUSED_MART:0,1/MAP_LILYCOVE_CITY:0!":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0","MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1","MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0":"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1":"MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0":"MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2":"MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0","MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4":"MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0","MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1":"MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1","MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1":"MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2","MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0":"MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3","MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0":"MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0","MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1":"MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1","MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2":"MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2","MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0":"MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0","MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2":"MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1","MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3":"MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0","MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0":"MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1","MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0":"MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0","MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0":"MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1","MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2":"MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2","MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1":"MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0","MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1":"MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0","MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1":"MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1","MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0":"MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0","MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1":"MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1","MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0":"MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0","MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0":"MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0","MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0":"MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0","MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1","MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0":"MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2","MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0":"MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3","MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0":"MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4","MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0":"MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5","MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0":"MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6","MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2":"MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0","MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5":"MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0","MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0":"MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0","MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4":"MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0","MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6":"MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0","MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3":"MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1":"MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0":"MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0","MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0":"MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1","MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0":"MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2","MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4":"MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3","MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5":"MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4","MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0":"MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5","MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2":"MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0","MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0":"MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1","MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1":"MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2","MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2":"MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3","MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1":"MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0","MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2":"MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1","MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3":"MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2","MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0":"MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3","MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3":"MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4","MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4":"MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5","MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3":"MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0","MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5":"MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0","MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3":"MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0","MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1":"MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1","MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0":"MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0","MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1":"MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1","MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0":"MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0","MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0":"MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1","MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1":"MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0","MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0":"MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0","MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0":"MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1","MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2","MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0":"MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3","MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0":"MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4","MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0":"MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5","MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0":"MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6","MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1":"MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7","MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8","MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9":"MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2","MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0","MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1":"MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0","MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11":"MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10","MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10":"MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11","MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13":"MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12","MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12":"MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13","MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3":"MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2","MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2":"MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3","MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5":"MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4","MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4":"MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5","MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7":"MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6","MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6":"MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7","MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9":"MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8","MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8":"MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9","MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0":"MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0","MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3":"MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0","MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5":"MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0","MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7":"MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1","MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4":"MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2":"MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8":"MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2","MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0","MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6":"MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0","MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1":"MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1","MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3":"MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3","MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1":"MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1","MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0":"MAP_ROUTE122:0/MAP_MT_PYRE_1F:0","MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0":"MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1","MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0":"MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4","MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4":"MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5","MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4":"MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0","MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0":"MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1","MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4":"MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2","MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5":"MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3","MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5":"MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4","MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1":"MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0","MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1":"MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1","MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4":"MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2","MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5":"MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3","MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2":"MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4","MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3":"MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5","MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1":"MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0","MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1":"MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1","MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3":"MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2","MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4":"MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3","MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2":"MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4","MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3":"MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5","MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0":"MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0","MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0":"MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1","MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1":"MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2","MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2":"MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3","MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3":"MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4","MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0":"MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0","MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2":"MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1","MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1":"MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0","MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1":"MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1","MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1":"MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1","MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0":"MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0","MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1":"MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1","MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0":"MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0","MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2":"MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0","MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0":"MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1","MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1":"MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0","MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0":"MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1","MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1":"MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0","MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0":"MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1","MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1":"MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0","MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0":"MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1","MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1":"MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0","MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0":"MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1","MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1":"MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0","MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0":"MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1","MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1":"MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0","MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0":"MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1","MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1":"MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0","MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0":"MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1","MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1":"MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0","MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0":"MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1","MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1":"MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0","MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1":"MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1","MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0":"MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0","MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1":"MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1","MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0":"MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0","MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1":"MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1","MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0":"MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0","MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1":"MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1","MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0":"MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0","MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1":"MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1","MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0":"MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2","MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0":"MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0","MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1":"MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0","MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0":"MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0","MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0":"MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1","MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1":"MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0","MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0":"MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1","MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1":"MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0","MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0":"MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1","MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1":"MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0","MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0":"MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1","MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0":"MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0","MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0":"MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1","MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1":"MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0","MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0":"MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0","MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0":"MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1","MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2","MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0":"MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3","MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0":"MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0","MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1":"MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0","MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3":"MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2":"MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0","MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0":"MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1","MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0":"MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2","MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0":"MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3","MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0":"MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4","MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0":"MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5","MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1":"MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0","MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2":"MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0","MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3":"MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0","MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4":"MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0","MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5":"MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0":"MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0":"MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0","MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0":"MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1","MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0":"MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2","MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3","MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0":"MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4","MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0":"MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5","MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2":"MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0","MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8":"MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10","MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9":"MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12","MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16":"MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14","MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18":"MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15","MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14":"MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16","MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15":"MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18","MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3":"MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2","MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24":"MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20","MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26":"MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21","MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28":"MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22","MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30":"MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23","MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20":"MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24","MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21":"MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26","MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22":"MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28","MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2":"MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3","MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23":"MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30","MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34":"MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32","MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36":"MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33","MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32":"MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34","MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33":"MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36","MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6":"MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5","MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5":"MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6","MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10":"MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8","MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12":"MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9","MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0":"MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0","MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4":"MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0","MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5":"MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3":"MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1":"MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0","MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3":"MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1","MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5":"MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3","MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7":"MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5","MAP_RECORD_CORNER:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_ROUTE103:0/MAP_ALTERING_CAVE:0":"MAP_ALTERING_CAVE:0/MAP_ROUTE103:0","MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0":"MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0","MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0":"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1","MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1":"MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3","MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3":"MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5","MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5":"MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7","MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0":"MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0","MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1":"MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0","MAP_ROUTE105:0/MAP_ISLAND_CAVE:0":"MAP_ISLAND_CAVE:0/MAP_ROUTE105:0","MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0":"MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0","MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0":"MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0","MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0":"MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0","MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0":"MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0","MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0":"MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0","MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1","MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2","MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3","MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4","MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4":"MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5":"MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2":"MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3":"MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1":"MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:2,3/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0","MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0":"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1":"MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0":"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0","MAP_ROUTE111:1/MAP_DESERT_RUINS:0":"MAP_DESERT_RUINS:0/MAP_ROUTE111:1","MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0":"MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2","MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0":"MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3","MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0":"MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4","MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2":"MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0","MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0":"MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0","MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1":"MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1","MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1":"MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3","MAP_ROUTE112:4/MAP_FIERY_PATH:0":"MAP_FIERY_PATH:0/MAP_ROUTE112:4","MAP_ROUTE112:5/MAP_FIERY_PATH:1":"MAP_FIERY_PATH:1/MAP_ROUTE112:5","MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1":"MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1","MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0":"MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0","MAP_ROUTE113:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0":"MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0","MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0":"MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0","MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1","MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0":"MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2","MAP_ROUTE114:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1":"MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0":"MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2","MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2":"MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0","MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1":"MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0","MAP_ROUTE115:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE115:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0":"MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0","MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0":"MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1","MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2":"MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2","MAP_ROUTE116:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1":"MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0","MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0":"MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0","MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0":"MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0","MAP_ROUTE118:0/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE118:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0","MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0":"MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1","MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1":"MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0":"MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2","MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0","MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0":"MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0","MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0":"MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1","MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0":"MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0":"MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2","MAP_ROUTE122:0/MAP_MT_PYRE_1F:0":"MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0","MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0":"MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0","MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0":"MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0","MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0":"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0","MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0":"MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0","MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0","MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0":"MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0","MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0":"MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0","MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0":"MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1","MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0":"MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10","MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0":"MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11","MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0":"MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2","MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3","MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0":"MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4","MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6","MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0":"MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7","MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0":"MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8","MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0":"MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9","MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8":"MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0","MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6":"MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1","MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2","MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0","MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1","MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0","MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1":"MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0","MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0":"MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2","MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2":"MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0","MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10":"MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0","MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0":"MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2","MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2":"MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0","MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0":"MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1","MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1":"MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0","MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0":"MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0","MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7":"MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0","MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9":"MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0","MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11":"MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0","MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2":"MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3":"MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4":"MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0","MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0":"MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0","MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4":"MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1","MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2":"MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2","MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0":"MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0","MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0","MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0":"MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0","MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1":"MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:0/MAP_UNDERWATER_ROUTE128:0!":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0":"MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1","MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0":"MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1","MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0":"MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2","MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2":"MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0","MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0":"MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1","MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0":"MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2","MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0":"MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3","MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1":"MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0","MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1":"MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1","MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1":"MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2","MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1":"MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0","MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1":"MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1","MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2":"MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2","MAP_SEAFLOOR_CAVERN_ROOM4:3/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1":"MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0","MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1":"MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1","MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2":"MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2","MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2":"MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0","MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2":"MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1","MAP_SEAFLOOR_CAVERN_ROOM6:2/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3":"MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0","MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1":"MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1","MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0":"MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0","MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0":"MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1","MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0":"MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0","MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0":"MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0","MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0":"MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0","MAP_SECRET_BASE_BLUE_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0":"MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1","MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1":"MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0","MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0":"MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2","MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2":"MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0","MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0":"MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1","MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1":"MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0","MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0":"MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1","MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1":"MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2","MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1":"MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0","MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2":"MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1","MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0":"MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2","MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2":"MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0","MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0":"MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1","MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0":"MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0","MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0":"MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1","MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1":"MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0","MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0":"MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1","MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1":"MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0","MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0","MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0":"MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1","MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0":"MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10","MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2","MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0":"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3","MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0":"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4","MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7","MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0":"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6","MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0":"MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8","MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2":"MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9","MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3":"MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0","MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8":"MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0","MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9":"MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2","MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10":"MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0","MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1":"MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0","MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6":"MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7":"MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0":"MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4":"MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2":"MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0","MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0","MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0":"MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1","MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0":"MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10","MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0":"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11","MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12","MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0":"MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2","MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0":"MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3","MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0":"MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4","MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0":"MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5","MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0":"MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6","MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0":"MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7","MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0":"MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8","MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0":"MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9","MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2":"MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0","MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0":"MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2","MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2":"MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0","MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4":"MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0","MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5":"MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0","MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6":"MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0","MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7":"MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0","MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8":"MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0","MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9":"MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0","MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10":"MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0","MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11":"MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0","MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1":"MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12":"MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0":"MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1":"MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1","MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1":"MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1","MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0":"MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0","MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2":"MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1","MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4":"MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2","MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6":"MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3","MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8":"MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4","MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9":"MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5","MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10":"MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6","MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11":"MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7","MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0":"MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8","MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8":"MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0","MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0":"MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0","MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6":"MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10","MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7":"MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11","MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1":"MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2","MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2":"MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4","MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3":"MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6","MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4":"MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8","MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5":"MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9","MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1":"MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0","MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!":"","MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0":"MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1","MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!":"","MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2":"MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0","MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0":"MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1","MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1":"MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0","MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0":"MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1","MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1":"MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0","MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0":"MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1","MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1":"MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0","MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0":"MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1","MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1":"MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1","MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4":"MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0","MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0":"MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2","MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1":"MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0","MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1":"MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1","MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!":"","MAP_UNDERWATER_ROUTE105:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE105:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0":"MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0","MAP_UNDERWATER_ROUTE127:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE127:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0":"MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0","MAP_UNDERWATER_ROUTE129:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE129:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0":"MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0","MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0":"MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0","MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0":"MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0","MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!":"","MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0":"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0","MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0":"MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1","MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2","MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0":"MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3","MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1":"MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4","MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0":"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5","MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0":"MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6","MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0":"MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0","MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5":"MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0","MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6":"MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0","MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1":"MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2":"MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3":"MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0","MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2":"MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0","MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3":"MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1","MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5":"MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2","MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2":"MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3","MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4":"MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4","MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0":"MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0","MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2":"MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1","MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3":"MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2","MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1":"MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3","MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4":"MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4","MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2":"MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5","MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3":"MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6","MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0":"MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0","MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3":"MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1","MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1":"MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2","MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6":"MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3"}} +{"_comment":"DO NOT MODIFY. This file was auto-generated. Your changes will likely be overwritten.","_rom_name":"pokemon emerald version / AP 5","constants":{"ABILITIES_COUNT":78,"ABILITY_AIR_LOCK":77,"ABILITY_ARENA_TRAP":71,"ABILITY_BATTLE_ARMOR":4,"ABILITY_BLAZE":66,"ABILITY_CACOPHONY":76,"ABILITY_CHLOROPHYLL":34,"ABILITY_CLEAR_BODY":29,"ABILITY_CLOUD_NINE":13,"ABILITY_COLOR_CHANGE":16,"ABILITY_COMPOUND_EYES":14,"ABILITY_CUTE_CHARM":56,"ABILITY_DAMP":6,"ABILITY_DRIZZLE":2,"ABILITY_DROUGHT":70,"ABILITY_EARLY_BIRD":48,"ABILITY_EFFECT_SPORE":27,"ABILITY_FLAME_BODY":49,"ABILITY_FLASH_FIRE":18,"ABILITY_FORECAST":59,"ABILITY_GUTS":62,"ABILITY_HUGE_POWER":37,"ABILITY_HUSTLE":55,"ABILITY_HYPER_CUTTER":52,"ABILITY_ILLUMINATE":35,"ABILITY_IMMUNITY":17,"ABILITY_INNER_FOCUS":39,"ABILITY_INSOMNIA":15,"ABILITY_INTIMIDATE":22,"ABILITY_KEEN_EYE":51,"ABILITY_LEVITATE":26,"ABILITY_LIGHTNING_ROD":31,"ABILITY_LIMBER":7,"ABILITY_LIQUID_OOZE":64,"ABILITY_MAGMA_ARMOR":40,"ABILITY_MAGNET_PULL":42,"ABILITY_MARVEL_SCALE":63,"ABILITY_MINUS":58,"ABILITY_NATURAL_CURE":30,"ABILITY_NONE":0,"ABILITY_OBLIVIOUS":12,"ABILITY_OVERGROW":65,"ABILITY_OWN_TEMPO":20,"ABILITY_PICKUP":53,"ABILITY_PLUS":57,"ABILITY_POISON_POINT":38,"ABILITY_PRESSURE":46,"ABILITY_PURE_POWER":74,"ABILITY_RAIN_DISH":44,"ABILITY_ROCK_HEAD":69,"ABILITY_ROUGH_SKIN":24,"ABILITY_RUN_AWAY":50,"ABILITY_SAND_STREAM":45,"ABILITY_SAND_VEIL":8,"ABILITY_SERENE_GRACE":32,"ABILITY_SHADOW_TAG":23,"ABILITY_SHED_SKIN":61,"ABILITY_SHELL_ARMOR":75,"ABILITY_SHIELD_DUST":19,"ABILITY_SOUNDPROOF":43,"ABILITY_SPEED_BOOST":3,"ABILITY_STATIC":9,"ABILITY_STENCH":1,"ABILITY_STICKY_HOLD":60,"ABILITY_STURDY":5,"ABILITY_SUCTION_CUPS":21,"ABILITY_SWARM":68,"ABILITY_SWIFT_SWIM":33,"ABILITY_SYNCHRONIZE":28,"ABILITY_THICK_FAT":47,"ABILITY_TORRENT":67,"ABILITY_TRACE":36,"ABILITY_TRUANT":54,"ABILITY_VITAL_SPIRIT":72,"ABILITY_VOLT_ABSORB":10,"ABILITY_WATER_ABSORB":11,"ABILITY_WATER_VEIL":41,"ABILITY_WHITE_SMOKE":73,"ABILITY_WONDER_GUARD":25,"ACRO_BIKE":1,"BAG_ITEM_CAPACITY_DIGITS":2,"BERRY_CAPACITY_DIGITS":3,"BERRY_FIRMNESS_HARD":3,"BERRY_FIRMNESS_SOFT":2,"BERRY_FIRMNESS_SUPER_HARD":5,"BERRY_FIRMNESS_UNKNOWN":0,"BERRY_FIRMNESS_VERY_HARD":4,"BERRY_FIRMNESS_VERY_SOFT":1,"BERRY_NONE":0,"BERRY_STAGE_BERRIES":5,"BERRY_STAGE_FLOWERING":4,"BERRY_STAGE_NO_BERRY":0,"BERRY_STAGE_PLANTED":1,"BERRY_STAGE_SPARKLING":255,"BERRY_STAGE_SPROUTED":2,"BERRY_STAGE_TALLER":3,"BERRY_TREES_COUNT":128,"BERRY_TREE_ROUTE_102_ORAN":2,"BERRY_TREE_ROUTE_102_PECHA":1,"BERRY_TREE_ROUTE_103_CHERI_1":5,"BERRY_TREE_ROUTE_103_CHERI_2":7,"BERRY_TREE_ROUTE_103_LEPPA":6,"BERRY_TREE_ROUTE_104_CHERI_1":8,"BERRY_TREE_ROUTE_104_CHERI_2":76,"BERRY_TREE_ROUTE_104_LEPPA":10,"BERRY_TREE_ROUTE_104_ORAN_1":4,"BERRY_TREE_ROUTE_104_ORAN_2":11,"BERRY_TREE_ROUTE_104_PECHA":13,"BERRY_TREE_ROUTE_104_SOIL_1":3,"BERRY_TREE_ROUTE_104_SOIL_2":9,"BERRY_TREE_ROUTE_104_SOIL_3":12,"BERRY_TREE_ROUTE_104_SOIL_4":75,"BERRY_TREE_ROUTE_110_NANAB_1":16,"BERRY_TREE_ROUTE_110_NANAB_2":17,"BERRY_TREE_ROUTE_110_NANAB_3":18,"BERRY_TREE_ROUTE_111_ORAN_1":80,"BERRY_TREE_ROUTE_111_ORAN_2":81,"BERRY_TREE_ROUTE_111_RAZZ_1":19,"BERRY_TREE_ROUTE_111_RAZZ_2":20,"BERRY_TREE_ROUTE_112_PECHA_1":22,"BERRY_TREE_ROUTE_112_PECHA_2":23,"BERRY_TREE_ROUTE_112_RAWST_1":21,"BERRY_TREE_ROUTE_112_RAWST_2":24,"BERRY_TREE_ROUTE_114_PERSIM_1":68,"BERRY_TREE_ROUTE_114_PERSIM_2":77,"BERRY_TREE_ROUTE_114_PERSIM_3":78,"BERRY_TREE_ROUTE_115_BLUK_1":55,"BERRY_TREE_ROUTE_115_BLUK_2":56,"BERRY_TREE_ROUTE_115_KELPSY_1":69,"BERRY_TREE_ROUTE_115_KELPSY_2":70,"BERRY_TREE_ROUTE_115_KELPSY_3":71,"BERRY_TREE_ROUTE_116_CHESTO_1":26,"BERRY_TREE_ROUTE_116_CHESTO_2":66,"BERRY_TREE_ROUTE_116_PINAP_1":25,"BERRY_TREE_ROUTE_116_PINAP_2":67,"BERRY_TREE_ROUTE_117_WEPEAR_1":27,"BERRY_TREE_ROUTE_117_WEPEAR_2":28,"BERRY_TREE_ROUTE_117_WEPEAR_3":29,"BERRY_TREE_ROUTE_118_SITRUS_1":31,"BERRY_TREE_ROUTE_118_SITRUS_2":33,"BERRY_TREE_ROUTE_118_SOIL":32,"BERRY_TREE_ROUTE_119_HONDEW_1":83,"BERRY_TREE_ROUTE_119_HONDEW_2":84,"BERRY_TREE_ROUTE_119_LEPPA":86,"BERRY_TREE_ROUTE_119_POMEG_1":34,"BERRY_TREE_ROUTE_119_POMEG_2":35,"BERRY_TREE_ROUTE_119_POMEG_3":36,"BERRY_TREE_ROUTE_119_SITRUS":85,"BERRY_TREE_ROUTE_120_ASPEAR_1":37,"BERRY_TREE_ROUTE_120_ASPEAR_2":38,"BERRY_TREE_ROUTE_120_ASPEAR_3":39,"BERRY_TREE_ROUTE_120_NANAB":44,"BERRY_TREE_ROUTE_120_PECHA_1":40,"BERRY_TREE_ROUTE_120_PECHA_2":41,"BERRY_TREE_ROUTE_120_PECHA_3":42,"BERRY_TREE_ROUTE_120_PINAP":45,"BERRY_TREE_ROUTE_120_RAZZ":43,"BERRY_TREE_ROUTE_120_WEPEAR":46,"BERRY_TREE_ROUTE_121_ASPEAR":48,"BERRY_TREE_ROUTE_121_CHESTO":50,"BERRY_TREE_ROUTE_121_NANAB_1":52,"BERRY_TREE_ROUTE_121_NANAB_2":53,"BERRY_TREE_ROUTE_121_PERSIM":47,"BERRY_TREE_ROUTE_121_RAWST":49,"BERRY_TREE_ROUTE_121_SOIL_1":51,"BERRY_TREE_ROUTE_121_SOIL_2":54,"BERRY_TREE_ROUTE_123_GREPA_1":60,"BERRY_TREE_ROUTE_123_GREPA_2":61,"BERRY_TREE_ROUTE_123_GREPA_3":65,"BERRY_TREE_ROUTE_123_GREPA_4":72,"BERRY_TREE_ROUTE_123_LEPPA_1":62,"BERRY_TREE_ROUTE_123_LEPPA_2":64,"BERRY_TREE_ROUTE_123_PECHA":87,"BERRY_TREE_ROUTE_123_POMEG_1":15,"BERRY_TREE_ROUTE_123_POMEG_2":30,"BERRY_TREE_ROUTE_123_POMEG_3":58,"BERRY_TREE_ROUTE_123_POMEG_4":59,"BERRY_TREE_ROUTE_123_QUALOT_1":14,"BERRY_TREE_ROUTE_123_QUALOT_2":73,"BERRY_TREE_ROUTE_123_QUALOT_3":74,"BERRY_TREE_ROUTE_123_QUALOT_4":79,"BERRY_TREE_ROUTE_123_RAWST":57,"BERRY_TREE_ROUTE_123_SITRUS":88,"BERRY_TREE_ROUTE_123_SOIL":63,"BERRY_TREE_ROUTE_130_LIECHI":82,"DAILY_FLAGS_END":2399,"DAILY_FLAGS_START":2336,"FIRST_BALL":1,"FIRST_BERRY_INDEX":133,"FIRST_BERRY_MASTER_BERRY":153,"FIRST_BERRY_MASTER_WIFE_BERRY":133,"FIRST_KIRI_BERRY":153,"FIRST_MAIL_INDEX":121,"FIRST_ROUTE_114_MAN_BERRY":148,"FLAGS_COUNT":2400,"FLAG_ADDED_MATCH_CALL_TO_POKENAV":304,"FLAG_ADVENTURE_STARTED":116,"FLAG_ARRIVED_AT_MARINE_CAVE_EMERGE_SPOT":2265,"FLAG_ARRIVED_AT_NAVEL_ROCK":2273,"FLAG_ARRIVED_AT_TERRA_CAVE_ENTRANCE":2266,"FLAG_ARRIVED_ON_FARAWAY_ISLAND":2264,"FLAG_BADGE01_GET":2151,"FLAG_BADGE02_GET":2152,"FLAG_BADGE03_GET":2153,"FLAG_BADGE04_GET":2154,"FLAG_BADGE05_GET":2155,"FLAG_BADGE06_GET":2156,"FLAG_BADGE07_GET":2157,"FLAG_BADGE08_GET":2158,"FLAG_BATTLE_FRONTIER_TRADE_DONE":156,"FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS":313,"FLAG_BEAUTY_PAINTING_MADE":161,"FLAG_BERRY_MASTERS_WIFE":1197,"FLAG_BERRY_MASTER_RECEIVED_BERRY_1":1195,"FLAG_BERRY_MASTER_RECEIVED_BERRY_2":1196,"FLAG_BERRY_TREES_START":612,"FLAG_BERRY_TREE_01":612,"FLAG_BERRY_TREE_02":613,"FLAG_BERRY_TREE_03":614,"FLAG_BERRY_TREE_04":615,"FLAG_BERRY_TREE_05":616,"FLAG_BERRY_TREE_06":617,"FLAG_BERRY_TREE_07":618,"FLAG_BERRY_TREE_08":619,"FLAG_BERRY_TREE_09":620,"FLAG_BERRY_TREE_10":621,"FLAG_BERRY_TREE_11":622,"FLAG_BERRY_TREE_12":623,"FLAG_BERRY_TREE_13":624,"FLAG_BERRY_TREE_14":625,"FLAG_BERRY_TREE_15":626,"FLAG_BERRY_TREE_16":627,"FLAG_BERRY_TREE_17":628,"FLAG_BERRY_TREE_18":629,"FLAG_BERRY_TREE_19":630,"FLAG_BERRY_TREE_20":631,"FLAG_BERRY_TREE_21":632,"FLAG_BERRY_TREE_22":633,"FLAG_BERRY_TREE_23":634,"FLAG_BERRY_TREE_24":635,"FLAG_BERRY_TREE_25":636,"FLAG_BERRY_TREE_26":637,"FLAG_BERRY_TREE_27":638,"FLAG_BERRY_TREE_28":639,"FLAG_BERRY_TREE_29":640,"FLAG_BERRY_TREE_30":641,"FLAG_BERRY_TREE_31":642,"FLAG_BERRY_TREE_32":643,"FLAG_BERRY_TREE_33":644,"FLAG_BERRY_TREE_34":645,"FLAG_BERRY_TREE_35":646,"FLAG_BERRY_TREE_36":647,"FLAG_BERRY_TREE_37":648,"FLAG_BERRY_TREE_38":649,"FLAG_BERRY_TREE_39":650,"FLAG_BERRY_TREE_40":651,"FLAG_BERRY_TREE_41":652,"FLAG_BERRY_TREE_42":653,"FLAG_BERRY_TREE_43":654,"FLAG_BERRY_TREE_44":655,"FLAG_BERRY_TREE_45":656,"FLAG_BERRY_TREE_46":657,"FLAG_BERRY_TREE_47":658,"FLAG_BERRY_TREE_48":659,"FLAG_BERRY_TREE_49":660,"FLAG_BERRY_TREE_50":661,"FLAG_BERRY_TREE_51":662,"FLAG_BERRY_TREE_52":663,"FLAG_BERRY_TREE_53":664,"FLAG_BERRY_TREE_54":665,"FLAG_BERRY_TREE_55":666,"FLAG_BERRY_TREE_56":667,"FLAG_BERRY_TREE_57":668,"FLAG_BERRY_TREE_58":669,"FLAG_BERRY_TREE_59":670,"FLAG_BERRY_TREE_60":671,"FLAG_BERRY_TREE_61":672,"FLAG_BERRY_TREE_62":673,"FLAG_BERRY_TREE_63":674,"FLAG_BERRY_TREE_64":675,"FLAG_BERRY_TREE_65":676,"FLAG_BERRY_TREE_66":677,"FLAG_BERRY_TREE_67":678,"FLAG_BERRY_TREE_68":679,"FLAG_BERRY_TREE_69":680,"FLAG_BERRY_TREE_70":681,"FLAG_BERRY_TREE_71":682,"FLAG_BERRY_TREE_72":683,"FLAG_BERRY_TREE_73":684,"FLAG_BERRY_TREE_74":685,"FLAG_BERRY_TREE_75":686,"FLAG_BERRY_TREE_76":687,"FLAG_BERRY_TREE_77":688,"FLAG_BERRY_TREE_78":689,"FLAG_BERRY_TREE_79":690,"FLAG_BERRY_TREE_80":691,"FLAG_BERRY_TREE_81":692,"FLAG_BERRY_TREE_82":693,"FLAG_BERRY_TREE_83":694,"FLAG_BERRY_TREE_84":695,"FLAG_BERRY_TREE_85":696,"FLAG_BERRY_TREE_86":697,"FLAG_BERRY_TREE_87":698,"FLAG_BERRY_TREE_88":699,"FLAG_BETTER_SHOPS_ENABLED":206,"FLAG_BIRCH_AIDE_MET":88,"FLAG_CANCEL_BATTLE_ROOM_CHALLENGE":119,"FLAG_CAUGHT_DEOXYS":429,"FLAG_CAUGHT_GROUDON":480,"FLAG_CAUGHT_HO_OH":146,"FLAG_CAUGHT_KYOGRE":479,"FLAG_CAUGHT_LATIAS":457,"FLAG_CAUGHT_LATIOS":482,"FLAG_CAUGHT_LUGIA":145,"FLAG_CAUGHT_MEW":458,"FLAG_CAUGHT_RAYQUAZA":478,"FLAG_CAUGHT_REGICE":427,"FLAG_CAUGHT_REGIROCK":426,"FLAG_CAUGHT_REGISTEEL":483,"FLAG_CHOSEN_MULTI_BATTLE_NPC_PARTNER":338,"FLAG_CHOSE_CLAW_FOSSIL":336,"FLAG_CHOSE_ROOT_FOSSIL":335,"FLAG_COLLECTED_ALL_GOLD_SYMBOLS":466,"FLAG_COLLECTED_ALL_SILVER_SYMBOLS":92,"FLAG_CONTEST_SKETCH_CREATED":270,"FLAG_COOL_PAINTING_MADE":160,"FLAG_CUTE_PAINTING_MADE":162,"FLAG_DAILY_APPRENTICE_LEAVES":2356,"FLAG_DAILY_BERRY_MASTERS_WIFE":2353,"FLAG_DAILY_BERRY_MASTER_RECEIVED_BERRY":2349,"FLAG_DAILY_CONTEST_LOBBY_RECEIVED_BERRY":2337,"FLAG_DAILY_FLOWER_SHOP_RECEIVED_BERRY":2352,"FLAG_DAILY_LILYCOVE_RECEIVED_BERRY":2351,"FLAG_DAILY_PICKED_LOTO_TICKET":2346,"FLAG_DAILY_ROUTE_111_RECEIVED_BERRY":2348,"FLAG_DAILY_ROUTE_114_RECEIVED_BERRY":2347,"FLAG_DAILY_ROUTE_120_RECEIVED_BERRY":2350,"FLAG_DAILY_SECRET_BASE":2338,"FLAG_DAILY_SOOTOPOLIS_RECEIVED_BERRY":2354,"FLAG_DECLINED_BIKE":89,"FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE":286,"FLAG_DECLINED_WALLY_BATTLE_MAUVILLE":284,"FLAG_DECORATION_1":174,"FLAG_DECORATION_10":183,"FLAG_DECORATION_11":184,"FLAG_DECORATION_12":185,"FLAG_DECORATION_13":186,"FLAG_DECORATION_14":187,"FLAG_DECORATION_2":175,"FLAG_DECORATION_3":176,"FLAG_DECORATION_4":177,"FLAG_DECORATION_5":178,"FLAG_DECORATION_6":179,"FLAG_DECORATION_7":180,"FLAG_DECORATION_8":181,"FLAG_DECORATION_9":182,"FLAG_DEFEATED_DEOXYS":428,"FLAG_DEFEATED_DEWFORD_GYM":1265,"FLAG_DEFEATED_ELECTRODE_1_AQUA_HIDEOUT":452,"FLAG_DEFEATED_ELECTRODE_2_AQUA_HIDEOUT":453,"FLAG_DEFEATED_ELITE_4_DRAKE":1278,"FLAG_DEFEATED_ELITE_4_GLACIA":1277,"FLAG_DEFEATED_ELITE_4_PHOEBE":1276,"FLAG_DEFEATED_ELITE_4_SIDNEY":1275,"FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY":139,"FLAG_DEFEATED_FORTREE_GYM":1269,"FLAG_DEFEATED_GROUDON":447,"FLAG_DEFEATED_GRUNT_SPACE_CENTER_1F":191,"FLAG_DEFEATED_HO_OH":476,"FLAG_DEFEATED_KECLEON_1_ROUTE_119":989,"FLAG_DEFEATED_KECLEON_1_ROUTE_120":982,"FLAG_DEFEATED_KECLEON_2_ROUTE_119":990,"FLAG_DEFEATED_KECLEON_2_ROUTE_120":985,"FLAG_DEFEATED_KECLEON_3_ROUTE_120":986,"FLAG_DEFEATED_KECLEON_4_ROUTE_120":987,"FLAG_DEFEATED_KECLEON_5_ROUTE_120":988,"FLAG_DEFEATED_KEKLEON_ROUTE_120_BRIDGE":970,"FLAG_DEFEATED_KYOGRE":446,"FLAG_DEFEATED_LATIAS":456,"FLAG_DEFEATED_LATIOS":481,"FLAG_DEFEATED_LAVARIDGE_GYM":1267,"FLAG_DEFEATED_LUGIA":477,"FLAG_DEFEATED_MAGMA_SPACE_CENTER":117,"FLAG_DEFEATED_MAUVILLE_GYM":1266,"FLAG_DEFEATED_METEOR_FALLS_STEVEN":1272,"FLAG_DEFEATED_MEW":455,"FLAG_DEFEATED_MOSSDEEP_GYM":1270,"FLAG_DEFEATED_PETALBURG_GYM":1268,"FLAG_DEFEATED_RAYQUAZA":448,"FLAG_DEFEATED_REGICE":444,"FLAG_DEFEATED_REGIROCK":443,"FLAG_DEFEATED_REGISTEEL":445,"FLAG_DEFEATED_RIVAL_ROUTE103":130,"FLAG_DEFEATED_RIVAL_ROUTE_104":125,"FLAG_DEFEATED_RIVAL_RUSTBORO":211,"FLAG_DEFEATED_RUSTBORO_GYM":1264,"FLAG_DEFEATED_SEASHORE_HOUSE":141,"FLAG_DEFEATED_SOOTOPOLIS_GYM":1271,"FLAG_DEFEATED_SS_TIDAL_TRAINERS":247,"FLAG_DEFEATED_SUDOWOODO":454,"FLAG_DEFEATED_VOLTORB_1_NEW_MAUVILLE":449,"FLAG_DEFEATED_VOLTORB_2_NEW_MAUVILLE":450,"FLAG_DEFEATED_VOLTORB_3_NEW_MAUVILLE":451,"FLAG_DEFEATED_WALLY_MAUVILLE":190,"FLAG_DEFEATED_WALLY_VICTORY_ROAD":126,"FLAG_DELIVERED_DEVON_GOODS":149,"FLAG_DELIVERED_STEVEN_LETTER":189,"FLAG_DEOXYS_IS_RECOVERING":1258,"FLAG_DEOXYS_ROCK_COMPLETE":2260,"FLAG_DEVON_GOODS_STOLEN":142,"FLAG_DOCK_REJECTED_DEVON_GOODS":148,"FLAG_DONT_TRANSITION_MUSIC":16385,"FLAG_ENABLE_BRAWLY_MATCH_CALL":468,"FLAG_ENABLE_FIRST_WALLY_POKENAV_CALL":136,"FLAG_ENABLE_FLANNERY_MATCH_CALL":470,"FLAG_ENABLE_JUAN_MATCH_CALL":473,"FLAG_ENABLE_MOM_MATCH_CALL":216,"FLAG_ENABLE_MR_STONE_POKENAV":344,"FLAG_ENABLE_MULTI_CORRIDOR_DOOR":16386,"FLAG_ENABLE_NORMAN_MATCH_CALL":306,"FLAG_ENABLE_PROF_BIRCH_MATCH_CALL":281,"FLAG_ENABLE_RIVAL_MATCH_CALL":253,"FLAG_ENABLE_ROXANNE_FIRST_CALL":128,"FLAG_ENABLE_ROXANNE_MATCH_CALL":467,"FLAG_ENABLE_SCOTT_MATCH_CALL":215,"FLAG_ENABLE_SHIP_BIRTH_ISLAND":2261,"FLAG_ENABLE_SHIP_FARAWAY_ISLAND":2262,"FLAG_ENABLE_SHIP_NAVEL_ROCK":2272,"FLAG_ENABLE_SHIP_SOUTHERN_ISLAND":2227,"FLAG_ENABLE_TATE_AND_LIZA_MATCH_CALL":472,"FLAG_ENABLE_WALLY_MATCH_CALL":214,"FLAG_ENABLE_WATTSON_MATCH_CALL":469,"FLAG_ENABLE_WINONA_MATCH_CALL":471,"FLAG_ENTERED_CONTEST":341,"FLAG_ENTERED_ELITE_FOUR":263,"FLAG_ENTERED_MIRAGE_TOWER":2268,"FLAG_EVIL_LEADER_PLEASE_STOP":219,"FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE":271,"FLAG_EXCHANGED_SCANNER":294,"FLAG_FAN_CLUB_STRENGTH_SHARED":210,"FLAG_FLOWER_SHOP_RECEIVED_BERRY":1207,"FLAG_FORCE_MIRAGE_TOWER_VISIBLE":157,"FLAG_FORTREE_NPC_TRADE_COMPLETED":155,"FLAG_GOOD_LUCK_SAFARI_ZONE":93,"FLAG_GOT_BASEMENT_KEY_FROM_WATTSON":208,"FLAG_GOT_TM_THUNDERBOLT_FROM_WATTSON":209,"FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT":111,"FLAG_GROUDON_IS_RECOVERING":1274,"FLAG_HAS_MATCH_CALL":303,"FLAG_HIDDEN_ITEMS_START":500,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":531,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":532,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":533,"FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":534,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":601,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":604,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":603,"FLAG_HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":602,"FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":528,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":548,"FLAG_HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":549,"FLAG_HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":577,"FLAG_HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":576,"FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":500,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":527,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":575,"FLAG_HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":543,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":578,"FLAG_HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":529,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":580,"FLAG_HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":579,"FLAG_HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":609,"FLAG_HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":595,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":561,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_POTION":558,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":559,"FLAG_HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":560,"FLAG_HIDDEN_ITEM_ROUTE_104_ANTIDOTE":585,"FLAG_HIDDEN_ITEM_ROUTE_104_HEART_SCALE":588,"FLAG_HIDDEN_ITEM_ROUTE_104_POKE_BALL":562,"FLAG_HIDDEN_ITEM_ROUTE_104_POTION":537,"FLAG_HIDDEN_ITEM_ROUTE_104_SUPER_POTION":544,"FLAG_HIDDEN_ITEM_ROUTE_105_BIG_PEARL":611,"FLAG_HIDDEN_ITEM_ROUTE_105_HEART_SCALE":589,"FLAG_HIDDEN_ITEM_ROUTE_106_HEART_SCALE":547,"FLAG_HIDDEN_ITEM_ROUTE_106_POKE_BALL":563,"FLAG_HIDDEN_ITEM_ROUTE_106_STARDUST":546,"FLAG_HIDDEN_ITEM_ROUTE_108_RARE_CANDY":586,"FLAG_HIDDEN_ITEM_ROUTE_109_ETHER":564,"FLAG_HIDDEN_ITEM_ROUTE_109_GREAT_BALL":551,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":552,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":590,"FLAG_HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":591,"FLAG_HIDDEN_ITEM_ROUTE_109_REVIVE":550,"FLAG_HIDDEN_ITEM_ROUTE_110_FULL_HEAL":555,"FLAG_HIDDEN_ITEM_ROUTE_110_GREAT_BALL":553,"FLAG_HIDDEN_ITEM_ROUTE_110_POKE_BALL":565,"FLAG_HIDDEN_ITEM_ROUTE_110_REVIVE":554,"FLAG_HIDDEN_ITEM_ROUTE_111_PROTEIN":556,"FLAG_HIDDEN_ITEM_ROUTE_111_RARE_CANDY":557,"FLAG_HIDDEN_ITEM_ROUTE_111_STARDUST":502,"FLAG_HIDDEN_ITEM_ROUTE_113_ETHER":503,"FLAG_HIDDEN_ITEM_ROUTE_113_NUGGET":598,"FLAG_HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":530,"FLAG_HIDDEN_ITEM_ROUTE_114_CARBOS":504,"FLAG_HIDDEN_ITEM_ROUTE_114_REVIVE":542,"FLAG_HIDDEN_ITEM_ROUTE_115_HEART_SCALE":597,"FLAG_HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":596,"FLAG_HIDDEN_ITEM_ROUTE_116_SUPER_POTION":545,"FLAG_HIDDEN_ITEM_ROUTE_117_REPEL":572,"FLAG_HIDDEN_ITEM_ROUTE_118_HEART_SCALE":566,"FLAG_HIDDEN_ITEM_ROUTE_118_IRON":567,"FLAG_HIDDEN_ITEM_ROUTE_119_CALCIUM":505,"FLAG_HIDDEN_ITEM_ROUTE_119_FULL_HEAL":568,"FLAG_HIDDEN_ITEM_ROUTE_119_MAX_ETHER":587,"FLAG_HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":506,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":571,"FLAG_HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":569,"FLAG_HIDDEN_ITEM_ROUTE_120_REVIVE":584,"FLAG_HIDDEN_ITEM_ROUTE_120_ZINC":570,"FLAG_HIDDEN_ITEM_ROUTE_121_FULL_HEAL":573,"FLAG_HIDDEN_ITEM_ROUTE_121_HP_UP":539,"FLAG_HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":600,"FLAG_HIDDEN_ITEM_ROUTE_121_NUGGET":540,"FLAG_HIDDEN_ITEM_ROUTE_123_HYPER_POTION":574,"FLAG_HIDDEN_ITEM_ROUTE_123_PP_UP":599,"FLAG_HIDDEN_ITEM_ROUTE_123_RARE_CANDY":610,"FLAG_HIDDEN_ITEM_ROUTE_123_REVIVE":541,"FLAG_HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":507,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":592,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":593,"FLAG_HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":594,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":606,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":607,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":605,"FLAG_HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":608,"FLAG_HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":535,"FLAG_HIDDEN_ITEM_TRICK_HOUSE_NUGGET":501,"FLAG_HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":511,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CALCIUM":536,"FLAG_HIDDEN_ITEM_UNDERWATER_124_CARBOS":508,"FLAG_HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":509,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":513,"FLAG_HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":538,"FLAG_HIDDEN_ITEM_UNDERWATER_124_PEARL":510,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":520,"FLAG_HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":512,"FLAG_HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":514,"FLAG_HIDDEN_ITEM_UNDERWATER_126_IRON":519,"FLAG_HIDDEN_ITEM_UNDERWATER_126_PEARL":517,"FLAG_HIDDEN_ITEM_UNDERWATER_126_STARDUST":516,"FLAG_HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":515,"FLAG_HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":518,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":523,"FLAG_HIDDEN_ITEM_UNDERWATER_127_HP_UP":522,"FLAG_HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":524,"FLAG_HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":521,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PEARL":526,"FLAG_HIDDEN_ITEM_UNDERWATER_128_PROTEIN":525,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":581,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":582,"FLAG_HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":583,"FLAG_HIDE_APPRENTICE":701,"FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNTS_BLOCKING_ENTRANCE":821,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_1":977,"FLAG_HIDE_AQUA_HIDEOUT_B1F_ELECTRODE_2":978,"FLAG_HIDE_AQUA_HIDEOUT_B2F_SUBMARINE_SHADOW":943,"FLAG_HIDE_AQUA_HIDEOUT_GRUNTS":924,"FLAG_HIDE_BATTLE_FRONTIER_RECEPTION_GATE_SCOTT":836,"FLAG_HIDE_BATTLE_FRONTIER_SUDOWOODO":842,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_1":711,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_2":712,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_3":713,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_4":714,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_5":715,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_6":716,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_1":864,"FLAG_HIDE_BATTLE_TOWER_MULTI_BATTLE_PARTNER_ALT_2":865,"FLAG_HIDE_BATTLE_TOWER_OPPONENT":888,"FLAG_HIDE_BATTLE_TOWER_REPORTER":918,"FLAG_HIDE_BIRTH_ISLAND_DEOXYS_TRIANGLE":764,"FLAG_HIDE_BRINEYS_HOUSE_MR_BRINEY":739,"FLAG_HIDE_BRINEYS_HOUSE_PEEKO":881,"FLAG_HIDE_CAVE_OF_ORIGIN_B1F_WALLACE":820,"FLAG_HIDE_CHAMPIONS_ROOM_BIRCH":921,"FLAG_HIDE_CHAMPIONS_ROOM_RIVAL":920,"FLAG_HIDE_CONTEST_POKE_BALL":86,"FLAG_HIDE_DEOXYS":763,"FLAG_HIDE_DESERT_UNDERPASS_FOSSIL":874,"FLAG_HIDE_DEWFORD_HALL_SLUDGE_BOMB_MAN":940,"FLAG_HIDE_EVER_GRANDE_POKEMON_CENTER_1F_SCOTT":793,"FLAG_HIDE_FALLARBOR_AZURILL":907,"FLAG_HIDE_FALLARBOR_HOUSE_PROF_COZMO":928,"FLAG_HIDE_FALLARBOR_TOWN_BATTLE_TENT_SCOTT":767,"FLAG_HIDE_FALLORBOR_POKEMON_CENTER_LANETTE":871,"FLAG_HIDE_FANCLUB_BOY":790,"FLAG_HIDE_FANCLUB_LADY":792,"FLAG_HIDE_FANCLUB_LITTLE_BOY":791,"FLAG_HIDE_FANCLUB_OLD_LADY":789,"FLAG_HIDE_FORTREE_CITY_HOUSE_4_WINGULL":933,"FLAG_HIDE_FORTREE_CITY_KECLEON":969,"FLAG_HIDE_GRANITE_CAVE_STEVEN":833,"FLAG_HIDE_HO_OH":801,"FLAG_HIDE_JAGGED_PASS_MAGMA_GUARD":847,"FLAG_HIDE_LANETTES_HOUSE_LANETTE":870,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL":929,"FLAG_HIDE_LAVARIDGE_TOWN_RIVAL_ON_BIKE":930,"FLAG_HIDE_LILYCOVE_CITY_AQUA_GRUNTS":852,"FLAG_HIDE_LILYCOVE_CITY_RIVAL":971,"FLAG_HIDE_LILYCOVE_CITY_WAILMER":729,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER":832,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER_REPLACEMENT":873,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_1":774,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_CONTEST_ATTENDANT_2":895,"FLAG_HIDE_LILYCOVE_CONTEST_HALL_REPORTER":802,"FLAG_HIDE_LILYCOVE_DEPARTMENT_STORE_ROOFTOP_SALE_WOMAN":962,"FLAG_HIDE_LILYCOVE_FAN_CLUB_INTERVIEWER":730,"FLAG_HIDE_LILYCOVE_HARBOR_EVENT_TICKET_TAKER":748,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_ATTENDANT":908,"FLAG_HIDE_LILYCOVE_HARBOR_FERRY_SAILOR":909,"FLAG_HIDE_LILYCOVE_HARBOR_SSTIDAL":861,"FLAG_HIDE_LILYCOVE_MOTEL_GAME_DESIGNERS":925,"FLAG_HIDE_LILYCOVE_MOTEL_SCOTT":787,"FLAG_HIDE_LILYCOVE_MUSEUM_CURATOR":775,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_1":776,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_2":777,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_3":778,"FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_4":779,"FLAG_HIDE_LILYCOVE_MUSEUM_TOURISTS":780,"FLAG_HIDE_LILYCOVE_POKEMON_CENTER_CONTEST_LADY_MON":993,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCH":795,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_BIRCH":721,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CHIKORITA":838,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CYNDAQUIL":811,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_TOTODILE":812,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_RIVAL":889,"FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_UNKNOWN_0x380":896,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_POKE_BALL":817,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_SWABLU_DOLL":815,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_BRENDAN":745,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_MOM":758,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_BEDROOM":760,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_MOM":784,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_SIBLING":735,"FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_TRUCK":761,"FLAG_HIDE_LITTLEROOT_TOWN_FAT_MAN":868,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_PICHU_DOLL":849,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_POKE_BALL":818,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MAY":746,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MOM":759,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_BEDROOM":722,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_MOM":785,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_SIBLING":736,"FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_TRUCK":762,"FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE":752,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_BEDROOM_MOM":757,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_1":754,"FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_2":755,"FLAG_HIDE_LITTLEROOT_TOWN_RIVAL":794,"FLAG_HIDE_LUGIA":800,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON":853,"FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON_ASLEEP":850,"FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS":857,"FLAG_HIDE_MAGMA_HIDEOUT_MAXIE":867,"FLAG_HIDE_MAP_NAME_POPUP":16384,"FLAG_HIDE_MARINE_CAVE_KYOGRE":782,"FLAG_HIDE_MAUVILLE_CITY_SCOTT":765,"FLAG_HIDE_MAUVILLE_CITY_WALLY":804,"FLAG_HIDE_MAUVILLE_CITY_WALLYS_UNCLE":805,"FLAG_HIDE_MAUVILLE_CITY_WATTSON":912,"FLAG_HIDE_MAUVILLE_GYM_WATTSON":913,"FLAG_HIDE_METEOR_FALLS_1F_1R_COZMO":942,"FLAG_HIDE_METEOR_FALLS_TEAM_AQUA":938,"FLAG_HIDE_METEOR_FALLS_TEAM_MAGMA":939,"FLAG_HIDE_MEW":718,"FLAG_HIDE_MIRAGE_TOWER_CLAW_FOSSIL":964,"FLAG_HIDE_MIRAGE_TOWER_ROOT_FOSSIL":963,"FLAG_HIDE_MOSSDEEP_CITY_HOUSE_2_WINGULL":934,"FLAG_HIDE_MOSSDEEP_CITY_SCOTT":788,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_STEVEN":753,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_TEAM_MAGMA":756,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_STEVEN":863,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA":862,"FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_MAGMA_NOTE":737,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_BELDUM_POKEBALL":968,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_INVISIBLE_NINJA_BOY":727,"FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN":967,"FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA":823,"FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN":743,"FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN":740,"FLAG_HIDE_MT_CHIMNEY_LAVA_COOKIE_LADY":994,"FLAG_HIDE_MT_CHIMNEY_TEAM_AQUA":926,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA":927,"FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA_BATTLEABLE":981,"FLAG_HIDE_MT_CHIMNEY_TRAINERS":877,"FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE":916,"FLAG_HIDE_MT_PYRE_SUMMIT_MAXIE":856,"FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA":917,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_1":974,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_2":975,"FLAG_HIDE_NEW_MAUVILLE_VOLTORB_3":976,"FLAG_HIDE_OLDALE_TOWN_RIVAL":979,"FLAG_HIDE_PETALBURG_CITY_SCOTT":995,"FLAG_HIDE_PETALBURG_CITY_WALLY":726,"FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD":830,"FLAG_HIDE_PETALBURG_CITY_WALLYS_MOM":728,"FLAG_HIDE_PETALBURG_GYM_GREETER":781,"FLAG_HIDE_PETALBURG_GYM_NORMAN":772,"FLAG_HIDE_PETALBURG_GYM_WALLY":866,"FLAG_HIDE_PETALBURG_GYM_WALLYS_DAD":824,"FLAG_HIDE_PETALBURG_WOODS_AQUA_GRUNT":725,"FLAG_HIDE_PETALBURG_WOODS_DEVON_EMPLOYEE":724,"FLAG_HIDE_PLAYERS_HOUSE_DAD":734,"FLAG_HIDE_POKEMON_CENTER_2F_MYSTERY_GIFT_MAN":702,"FLAG_HIDE_REGICE":936,"FLAG_HIDE_REGIROCK":935,"FLAG_HIDE_REGISTEEL":937,"FLAG_HIDE_ROUTE_101_BIRCH":897,"FLAG_HIDE_ROUTE_101_BIRCH_STARTERS_BAG":700,"FLAG_HIDE_ROUTE_101_BIRCH_ZIGZAGOON_BATTLE":720,"FLAG_HIDE_ROUTE_101_BOY":991,"FLAG_HIDE_ROUTE_101_ZIGZAGOON":750,"FLAG_HIDE_ROUTE_103_BIRCH":898,"FLAG_HIDE_ROUTE_103_RIVAL":723,"FLAG_HIDE_ROUTE_104_MR_BRINEY":738,"FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT":742,"FLAG_HIDE_ROUTE_104_RIVAL":719,"FLAG_HIDE_ROUTE_104_WHITE_HERB_FLORIST":906,"FLAG_HIDE_ROUTE_109_MR_BRINEY":741,"FLAG_HIDE_ROUTE_109_MR_BRINEY_BOAT":744,"FLAG_HIDE_ROUTE_110_BIRCH":837,"FLAG_HIDE_ROUTE_110_RIVAL":919,"FLAG_HIDE_ROUTE_110_RIVAL_ON_BIKE":922,"FLAG_HIDE_ROUTE_110_TEAM_AQUA":900,"FLAG_HIDE_ROUTE_111_DESERT_FOSSIL":876,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_1":796,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2":903,"FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3":799,"FLAG_HIDE_ROUTE_111_PLAYER_DESCENT":875,"FLAG_HIDE_ROUTE_111_ROCK_SMASH_TIP_GUY":843,"FLAG_HIDE_ROUTE_111_SECRET_POWER_MAN":960,"FLAG_HIDE_ROUTE_111_VICKY_WINSTRATE":771,"FLAG_HIDE_ROUTE_111_VICTORIA_WINSTRATE":769,"FLAG_HIDE_ROUTE_111_VICTOR_WINSTRATE":768,"FLAG_HIDE_ROUTE_111_VIVI_WINSTRATE":770,"FLAG_HIDE_ROUTE_112_TEAM_MAGMA":819,"FLAG_HIDE_ROUTE_115_BOULDERS":825,"FLAG_HIDE_ROUTE_116_DEVON_EMPLOYEE":947,"FLAG_HIDE_ROUTE_116_DROPPED_GLASSES_MAN":813,"FLAG_HIDE_ROUTE_116_MR_BRINEY":891,"FLAG_HIDE_ROUTE_116_WANDAS_BOYFRIEND":894,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_1":797,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2":901,"FLAG_HIDE_ROUTE_118_GABBY_AND_TY_3":904,"FLAG_HIDE_ROUTE_118_STEVEN":966,"FLAG_HIDE_ROUTE_119_RIVAL":851,"FLAG_HIDE_ROUTE_119_RIVAL_ON_BIKE":923,"FLAG_HIDE_ROUTE_119_SCOTT":786,"FLAG_HIDE_ROUTE_119_TEAM_AQUA":890,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_BRIDGE":822,"FLAG_HIDE_ROUTE_119_TEAM_AQUA_SHELLY":915,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1":798,"FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2":902,"FLAG_HIDE_ROUTE_120_STEVEN":972,"FLAG_HIDE_ROUTE_121_TEAM_AQUA_GRUNTS":914,"FLAG_HIDE_ROUTE_128_ARCHIE":944,"FLAG_HIDE_ROUTE_128_MAXIE":945,"FLAG_HIDE_ROUTE_128_STEVEN":834,"FLAG_HIDE_RUSTBORO_CITY_AQUA_GRUNT":731,"FLAG_HIDE_RUSTBORO_CITY_DEVON_CORP_3F_EMPLOYEE":949,"FLAG_HIDE_RUSTBORO_CITY_DEVON_EMPLOYEE_1":732,"FLAG_HIDE_RUSTBORO_CITY_POKEMON_SCHOOL_SCOTT":999,"FLAG_HIDE_RUSTBORO_CITY_RIVAL":814,"FLAG_HIDE_RUSTBORO_CITY_SCIENTIST":844,"FLAG_HIDE_RUSTURF_TUNNEL_AQUA_GRUNT":878,"FLAG_HIDE_RUSTURF_TUNNEL_BRINEY":879,"FLAG_HIDE_RUSTURF_TUNNEL_PEEKO":880,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1":931,"FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2":932,"FLAG_HIDE_RUSTURF_TUNNEL_WANDA":983,"FLAG_HIDE_RUSTURF_TUNNEL_WANDAS_BOYFRIEND":807,"FLAG_HIDE_SAFARI_ZONE_SOUTH_CONSTRUCTION_WORKERS":717,"FLAG_HIDE_SAFARI_ZONE_SOUTH_EAST_EXPANSION":747,"FLAG_HIDE_SEAFLOOR_CAVERN_AQUA_GRUNTS":946,"FLAG_HIDE_SEAFLOOR_CAVERN_ENTRANCE_AQUA_GRUNT":941,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_ARCHIE":828,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE":859,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE_ASLEEP":733,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAGMA_GRUNTS":831,"FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAXIE":829,"FLAG_HIDE_SECRET_BASE_TRAINER":173,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA":773,"FLAG_HIDE_SKY_PILLAR_TOP_RAYQUAZA_STILL":80,"FLAG_HIDE_SKY_PILLAR_WALLACE":855,"FLAG_HIDE_SLATEPORT_CITY_CAPTAIN_STERN":840,"FLAG_HIDE_SLATEPORT_CITY_CONTEST_REPORTER":803,"FLAG_HIDE_SLATEPORT_CITY_GABBY_AND_TY":835,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_AQUA_GRUNT":845,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_ARCHIE":846,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_CAPTAIN_STERN":841,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_PATRONS":905,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SS_TIDAL":860,"FLAG_HIDE_SLATEPORT_CITY_HARBOR_SUBMARINE_SHADOW":848,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_1":884,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_2":885,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_ARCHIE":886,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_CAPTAIN_STERN":887,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_AQUA_GRUNTS":883,"FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_FAMILIAR_AQUA_GRUNT":965,"FLAG_HIDE_SLATEPORT_CITY_SCOTT":749,"FLAG_HIDE_SLATEPORT_CITY_STERNS_SHIPYARD_MR_BRINEY":869,"FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA":882,"FLAG_HIDE_SLATEPORT_CITY_TM_SALESMAN":948,"FLAG_HIDE_SLATEPORT_MUSEUM_POPULATION":961,"FLAG_HIDE_SOOTOPOLIS_CITY_ARCHIE":826,"FLAG_HIDE_SOOTOPOLIS_CITY_GROUDON":998,"FLAG_HIDE_SOOTOPOLIS_CITY_KYOGRE":997,"FLAG_HIDE_SOOTOPOLIS_CITY_MAN_1":839,"FLAG_HIDE_SOOTOPOLIS_CITY_MAXIE":827,"FLAG_HIDE_SOOTOPOLIS_CITY_RAYQUAZA":996,"FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS":854,"FLAG_HIDE_SOOTOPOLIS_CITY_STEVEN":973,"FLAG_HIDE_SOOTOPOLIS_CITY_WALLACE":816,"FLAG_HIDE_SOUTHERN_ISLAND_EON_STONE":910,"FLAG_HIDE_SOUTHERN_ISLAND_UNCHOSEN_EON_DUO_MON":911,"FLAG_HIDE_SS_TIDAL_CORRIDOR_MR_BRINEY":950,"FLAG_HIDE_SS_TIDAL_CORRIDOR_SCOTT":810,"FLAG_HIDE_SS_TIDAL_ROOMS_SNATCH_GIVER":951,"FLAG_HIDE_TERRA_CAVE_GROUDON":783,"FLAG_HIDE_TRICK_HOUSE_END_MAN":899,"FLAG_HIDE_TRICK_HOUSE_ENTRANCE_MAN":872,"FLAG_HIDE_UNDERWATER_SEA_FLOOR_CAVERN_STOLEN_SUBMARINE":980,"FLAG_HIDE_UNION_ROOM_PLAYER_1":703,"FLAG_HIDE_UNION_ROOM_PLAYER_2":704,"FLAG_HIDE_UNION_ROOM_PLAYER_3":705,"FLAG_HIDE_UNION_ROOM_PLAYER_4":706,"FLAG_HIDE_UNION_ROOM_PLAYER_5":707,"FLAG_HIDE_UNION_ROOM_PLAYER_6":708,"FLAG_HIDE_UNION_ROOM_PLAYER_7":709,"FLAG_HIDE_UNION_ROOM_PLAYER_8":710,"FLAG_HIDE_VERDANTURF_TOWN_SCOTT":766,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLY":806,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLYS_UNCLE":809,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDA":984,"FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDAS_BOYFRIEND":808,"FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY":858,"FLAG_HIDE_VICTORY_ROAD_EXIT_WALLY":751,"FLAG_HIDE_WEATHER_INSTITUTE_1F_WORKERS":892,"FLAG_HIDE_WEATHER_INSTITUTE_2F_AQUA_GRUNT_M":992,"FLAG_HIDE_WEATHER_INSTITUTE_2F_WORKERS":893,"FLAG_HO_OH_IS_RECOVERING":1256,"FLAG_INTERACTED_WITH_DEVON_EMPLOYEE_GOODS_STOLEN":159,"FLAG_INTERACTED_WITH_STEVEN_SPACE_CENTER":205,"FLAG_IS_CHAMPION":2175,"FLAG_ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":1100,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":1102,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":1078,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":1101,"FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":1077,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":1095,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":1099,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":1097,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":1096,"FLAG_ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":1098,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":1124,"FLAG_ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":1071,"FLAG_ITEM_AQUA_HIDEOUT_B1F_NUGGET":1132,"FLAG_ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":1072,"FLAG_ITEM_ARTISAN_CAVE_1F_CARBOS":1163,"FLAG_ITEM_ARTISAN_CAVE_B1F_HP_UP":1162,"FLAG_ITEM_FIERY_PATH_FIRE_STONE":1111,"FLAG_ITEM_FIERY_PATH_TM_TOXIC":1091,"FLAG_ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":1050,"FLAG_ITEM_GRANITE_CAVE_B1F_POKE_BALL":1051,"FLAG_ITEM_GRANITE_CAVE_B2F_RARE_CANDY":1054,"FLAG_ITEM_GRANITE_CAVE_B2F_REPEL":1053,"FLAG_ITEM_JAGGED_PASS_BURN_HEAL":1070,"FLAG_ITEM_LILYCOVE_CITY_MAX_REPEL":1042,"FLAG_ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":1151,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":1165,"FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":1164,"FLAG_ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":1166,"FLAG_ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":1167,"FLAG_ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":1059,"FLAG_ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":1168,"FLAG_ITEM_MAUVILLE_CITY_X_SPEED":1116,"FLAG_ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":1045,"FLAG_ITEM_METEOR_FALLS_1F_1R_MOON_STONE":1046,"FLAG_ITEM_METEOR_FALLS_1F_1R_PP_UP":1047,"FLAG_ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":1044,"FLAG_ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":1080,"FLAG_ITEM_MOSSDEEP_CITY_NET_BALL":1043,"FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_HM08":1133,"FLAG_ITEM_MT_PYRE_2F_ULTRA_BALL":1129,"FLAG_ITEM_MT_PYRE_3F_SUPER_REPEL":1120,"FLAG_ITEM_MT_PYRE_4F_SEA_INCENSE":1130,"FLAG_ITEM_MT_PYRE_5F_LAX_INCENSE":1052,"FLAG_ITEM_MT_PYRE_6F_TM_SHADOW_BALL":1089,"FLAG_ITEM_MT_PYRE_EXTERIOR_MAX_POTION":1073,"FLAG_ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":1074,"FLAG_ITEM_NEW_MAUVILLE_ESCAPE_ROPE":1076,"FLAG_ITEM_NEW_MAUVILLE_FULL_HEAL":1122,"FLAG_ITEM_NEW_MAUVILLE_PARALYZE_HEAL":1123,"FLAG_ITEM_NEW_MAUVILLE_THUNDER_STONE":1110,"FLAG_ITEM_NEW_MAUVILLE_ULTRA_BALL":1075,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MASTER_BALL":1125,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B1F_MAX_ELIXIR":1126,"FLAG_ITEM_OLD_MAGMA_HIDEOUT_B2F_NEST_BALL":1127,"FLAG_ITEM_PETALBURG_CITY_ETHER":1040,"FLAG_ITEM_PETALBURG_CITY_MAX_REVIVE":1039,"FLAG_ITEM_PETALBURG_WOODS_ETHER":1058,"FLAG_ITEM_PETALBURG_WOODS_GREAT_BALL":1056,"FLAG_ITEM_PETALBURG_WOODS_PARALYZE_HEAL":1117,"FLAG_ITEM_PETALBURG_WOODS_X_ATTACK":1055,"FLAG_ITEM_ROUTE_102_POTION":1000,"FLAG_ITEM_ROUTE_103_GUARD_SPEC":1114,"FLAG_ITEM_ROUTE_103_PP_UP":1137,"FLAG_ITEM_ROUTE_104_POKE_BALL":1057,"FLAG_ITEM_ROUTE_104_POTION":1135,"FLAG_ITEM_ROUTE_104_PP_UP":1002,"FLAG_ITEM_ROUTE_104_X_ACCURACY":1115,"FLAG_ITEM_ROUTE_105_IRON":1003,"FLAG_ITEM_ROUTE_106_PROTEIN":1004,"FLAG_ITEM_ROUTE_108_STAR_PIECE":1139,"FLAG_ITEM_ROUTE_109_POTION":1140,"FLAG_ITEM_ROUTE_109_PP_UP":1005,"FLAG_ITEM_ROUTE_110_DIRE_HIT":1007,"FLAG_ITEM_ROUTE_110_ELIXIR":1141,"FLAG_ITEM_ROUTE_110_RARE_CANDY":1006,"FLAG_ITEM_ROUTE_111_ELIXIR":1142,"FLAG_ITEM_ROUTE_111_HP_UP":1010,"FLAG_ITEM_ROUTE_111_STARDUST":1009,"FLAG_ITEM_ROUTE_111_TM_SANDSTORM":1008,"FLAG_ITEM_ROUTE_112_NUGGET":1011,"FLAG_ITEM_ROUTE_113_HYPER_POTION":1143,"FLAG_ITEM_ROUTE_113_MAX_ETHER":1012,"FLAG_ITEM_ROUTE_113_SUPER_REPEL":1013,"FLAG_ITEM_ROUTE_114_ENERGY_POWDER":1160,"FLAG_ITEM_ROUTE_114_PROTEIN":1015,"FLAG_ITEM_ROUTE_114_RARE_CANDY":1014,"FLAG_ITEM_ROUTE_115_GREAT_BALL":1118,"FLAG_ITEM_ROUTE_115_HEAL_POWDER":1144,"FLAG_ITEM_ROUTE_115_IRON":1018,"FLAG_ITEM_ROUTE_115_PP_UP":1161,"FLAG_ITEM_ROUTE_115_SUPER_POTION":1016,"FLAG_ITEM_ROUTE_115_TM_FOCUS_PUNCH":1017,"FLAG_ITEM_ROUTE_116_ETHER":1019,"FLAG_ITEM_ROUTE_116_HP_UP":1021,"FLAG_ITEM_ROUTE_116_POTION":1146,"FLAG_ITEM_ROUTE_116_REPEL":1020,"FLAG_ITEM_ROUTE_116_X_SPECIAL":1001,"FLAG_ITEM_ROUTE_117_GREAT_BALL":1022,"FLAG_ITEM_ROUTE_117_REVIVE":1023,"FLAG_ITEM_ROUTE_118_HYPER_POTION":1121,"FLAG_ITEM_ROUTE_119_ELIXIR_1":1026,"FLAG_ITEM_ROUTE_119_ELIXIR_2":1147,"FLAG_ITEM_ROUTE_119_HYPER_POTION_1":1029,"FLAG_ITEM_ROUTE_119_HYPER_POTION_2":1106,"FLAG_ITEM_ROUTE_119_LEAF_STONE":1027,"FLAG_ITEM_ROUTE_119_NUGGET":1134,"FLAG_ITEM_ROUTE_119_RARE_CANDY":1028,"FLAG_ITEM_ROUTE_119_SUPER_REPEL":1024,"FLAG_ITEM_ROUTE_119_ZINC":1025,"FLAG_ITEM_ROUTE_120_FULL_HEAL":1031,"FLAG_ITEM_ROUTE_120_HYPER_POTION":1107,"FLAG_ITEM_ROUTE_120_NEST_BALL":1108,"FLAG_ITEM_ROUTE_120_NUGGET":1030,"FLAG_ITEM_ROUTE_120_REVIVE":1148,"FLAG_ITEM_ROUTE_121_CARBOS":1103,"FLAG_ITEM_ROUTE_121_REVIVE":1149,"FLAG_ITEM_ROUTE_121_ZINC":1150,"FLAG_ITEM_ROUTE_123_CALCIUM":1032,"FLAG_ITEM_ROUTE_123_ELIXIR":1109,"FLAG_ITEM_ROUTE_123_PP_UP":1152,"FLAG_ITEM_ROUTE_123_REVIVAL_HERB":1153,"FLAG_ITEM_ROUTE_123_ULTRA_BALL":1104,"FLAG_ITEM_ROUTE_124_BLUE_SHARD":1093,"FLAG_ITEM_ROUTE_124_RED_SHARD":1092,"FLAG_ITEM_ROUTE_124_YELLOW_SHARD":1066,"FLAG_ITEM_ROUTE_125_BIG_PEARL":1154,"FLAG_ITEM_ROUTE_126_GREEN_SHARD":1105,"FLAG_ITEM_ROUTE_127_CARBOS":1035,"FLAG_ITEM_ROUTE_127_RARE_CANDY":1155,"FLAG_ITEM_ROUTE_127_ZINC":1034,"FLAG_ITEM_ROUTE_132_PROTEIN":1156,"FLAG_ITEM_ROUTE_132_RARE_CANDY":1036,"FLAG_ITEM_ROUTE_133_BIG_PEARL":1037,"FLAG_ITEM_ROUTE_133_MAX_REVIVE":1157,"FLAG_ITEM_ROUTE_133_STAR_PIECE":1038,"FLAG_ITEM_ROUTE_134_CARBOS":1158,"FLAG_ITEM_ROUTE_134_STAR_PIECE":1159,"FLAG_ITEM_RUSTBORO_CITY_X_DEFEND":1041,"FLAG_ITEM_RUSTURF_TUNNEL_MAX_ETHER":1049,"FLAG_ITEM_RUSTURF_TUNNEL_POKE_BALL":1048,"FLAG_ITEM_SAFARI_ZONE_NORTH_CALCIUM":1119,"FLAG_ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":1169,"FLAG_ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":1094,"FLAG_ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":1170,"FLAG_ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":1131,"FLAG_ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":1079,"FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":1090,"FLAG_ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":1081,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":1113,"FLAG_ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":1112,"FLAG_ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":1082,"FLAG_ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":1083,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":1060,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":1061,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":1062,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":1063,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":1064,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":1065,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":1067,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":1068,"FLAG_ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":1069,"FLAG_ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":1084,"FLAG_ITEM_VICTORY_ROAD_1F_PP_UP":1085,"FLAG_ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":1087,"FLAG_ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":1086,"FLAG_ITEM_VICTORY_ROAD_B2F_FULL_HEAL":1088,"FLAG_KECLEON_FLED_FORTREE":295,"FLAG_KYOGRE_ESCAPED_SEAFLOOR_CAVERN":129,"FLAG_KYOGRE_IS_RECOVERING":1273,"FLAG_LANDMARK_ABANDONED_SHIP":2206,"FLAG_LANDMARK_ALTERING_CAVE":2269,"FLAG_LANDMARK_ANCIENT_TOMB":2233,"FLAG_LANDMARK_ARTISAN_CAVE":2271,"FLAG_LANDMARK_BATTLE_FRONTIER":2216,"FLAG_LANDMARK_BERRY_MASTERS_HOUSE":2243,"FLAG_LANDMARK_DESERT_RUINS":2230,"FLAG_LANDMARK_DESERT_UNDERPASS":2270,"FLAG_LANDMARK_FIERY_PATH":2218,"FLAG_LANDMARK_FLOWER_SHOP":2204,"FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE":2231,"FLAG_LANDMARK_GLASS_WORKSHOP":2212,"FLAG_LANDMARK_HUNTERS_HOUSE":2235,"FLAG_LANDMARK_ISLAND_CAVE":2229,"FLAG_LANDMARK_LANETTES_HOUSE":2213,"FLAG_LANDMARK_MIRAGE_TOWER":120,"FLAG_LANDMARK_MR_BRINEY_HOUSE":2205,"FLAG_LANDMARK_NEW_MAUVILLE":2208,"FLAG_LANDMARK_OLD_LADY_REST_SHOP":2209,"FLAG_LANDMARK_POKEMON_DAYCARE":2214,"FLAG_LANDMARK_POKEMON_LEAGUE":2228,"FLAG_LANDMARK_SCORCHED_SLAB":2232,"FLAG_LANDMARK_SEAFLOOR_CAVERN":2215,"FLAG_LANDMARK_SEALED_CHAMBER":2236,"FLAG_LANDMARK_SEASHORE_HOUSE":2207,"FLAG_LANDMARK_SKY_PILLAR":2238,"FLAG_LANDMARK_SOUTHERN_ISLAND":2217,"FLAG_LANDMARK_TRAINER_HILL":2274,"FLAG_LANDMARK_TRICK_HOUSE":2210,"FLAG_LANDMARK_TUNNELERS_REST_HOUSE":2234,"FLAG_LANDMARK_WINSTRATE_FAMILY":2211,"FLAG_LATIAS_IS_RECOVERING":1263,"FLAG_LATIOS_IS_RECOVERING":1255,"FLAG_LATIOS_OR_LATIAS_ROAMING":255,"FLAG_LEGENDARIES_IN_SOOTOPOLIS":83,"FLAG_LILYCOVE_RECEIVED_BERRY":1208,"FLAG_LUGIA_IS_RECOVERING":1257,"FLAG_MAP_SCRIPT_CHECKED_DEOXYS":2259,"FLAG_MATCH_CALL_REGISTERED":348,"FLAG_MAUVILLE_GYM_BARRIERS_STATE":99,"FLAG_MET_ARCHIE_METEOR_FALLS":207,"FLAG_MET_ARCHIE_SOOTOPOLIS":308,"FLAG_MET_BATTLE_FRONTIER_BREEDER":339,"FLAG_MET_BATTLE_FRONTIER_GAMBLER":343,"FLAG_MET_BATTLE_FRONTIER_MANIAC":340,"FLAG_MET_DEVON_EMPLOYEE":287,"FLAG_MET_DIVING_TREASURE_HUNTER":217,"FLAG_MET_FANCLUB_YOUNGER_BROTHER":300,"FLAG_MET_FRONTIER_BEAUTY_MOVE_TUTOR":346,"FLAG_MET_FRONTIER_SWIMMER_MOVE_TUTOR":347,"FLAG_MET_HIDDEN_POWER_GIVER":118,"FLAG_MET_MAXIE_SOOTOPOLIS":309,"FLAG_MET_PRETTY_PETAL_SHOP_OWNER":127,"FLAG_MET_PROF_COZMO":244,"FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE":293,"FLAG_MET_RIVAL_LILYCOVE":292,"FLAG_MET_RIVAL_MOM":87,"FLAG_MET_RIVAL_RUSTBORO":288,"FLAG_MET_SCOTT_AFTER_OBTAINING_STONE_BADGE":459,"FLAG_MET_SCOTT_IN_EVERGRANDE":463,"FLAG_MET_SCOTT_IN_FALLARBOR":461,"FLAG_MET_SCOTT_IN_LILYCOVE":462,"FLAG_MET_SCOTT_IN_VERDANTURF":460,"FLAG_MET_SCOTT_ON_SS_TIDAL":464,"FLAG_MET_SCOTT_RUSTBORO":310,"FLAG_MET_SLATEPORT_FANCLUB_CHAIRMAN":342,"FLAG_MET_TEAM_AQUA_HARBOR":97,"FLAG_MET_WAILMER_TRAINER":218,"FLAG_MEW_IS_RECOVERING":1259,"FLAG_MIRAGE_TOWER_VISIBLE":334,"FLAG_MOSSDEEP_GYM_SWITCH_1":100,"FLAG_MOSSDEEP_GYM_SWITCH_2":101,"FLAG_MOSSDEEP_GYM_SWITCH_3":102,"FLAG_MOSSDEEP_GYM_SWITCH_4":103,"FLAG_MOVE_TUTOR_TAUGHT_DOUBLE_EDGE":441,"FLAG_MOVE_TUTOR_TAUGHT_DYNAMICPUNCH":440,"FLAG_MOVE_TUTOR_TAUGHT_EXPLOSION":442,"FLAG_MOVE_TUTOR_TAUGHT_FURY_CUTTER":435,"FLAG_MOVE_TUTOR_TAUGHT_METRONOME":437,"FLAG_MOVE_TUTOR_TAUGHT_MIMIC":436,"FLAG_MOVE_TUTOR_TAUGHT_ROLLOUT":434,"FLAG_MOVE_TUTOR_TAUGHT_SLEEP_TALK":438,"FLAG_MOVE_TUTOR_TAUGHT_SUBSTITUTE":439,"FLAG_MOVE_TUTOR_TAUGHT_SWAGGER":433,"FLAG_MR_BRINEY_SAILING_INTRO":147,"FLAG_MYSTERY_GIFT_1":485,"FLAG_MYSTERY_GIFT_10":494,"FLAG_MYSTERY_GIFT_11":495,"FLAG_MYSTERY_GIFT_12":496,"FLAG_MYSTERY_GIFT_13":497,"FLAG_MYSTERY_GIFT_14":498,"FLAG_MYSTERY_GIFT_15":499,"FLAG_MYSTERY_GIFT_2":486,"FLAG_MYSTERY_GIFT_3":487,"FLAG_MYSTERY_GIFT_4":488,"FLAG_MYSTERY_GIFT_5":489,"FLAG_MYSTERY_GIFT_6":490,"FLAG_MYSTERY_GIFT_7":491,"FLAG_MYSTERY_GIFT_8":492,"FLAG_MYSTERY_GIFT_9":493,"FLAG_MYSTERY_GIFT_DONE":484,"FLAG_NEVER_SET_0x0DC":220,"FLAG_NOT_READY_FOR_BATTLE_ROUTE_120":290,"FLAG_NURSE_MENTIONS_GOLD_CARD":345,"FLAG_NURSE_UNION_ROOM_REMINDER":2176,"FLAG_OCEANIC_MUSEUM_MET_REPORTER":105,"FLAG_OMIT_DIVE_FROM_STEVEN_LETTER":302,"FLAG_PACIFIDLOG_NPC_TRADE_COMPLETED":154,"FLAG_PENDING_DAYCARE_EGG":134,"FLAG_PETALBURG_MART_EXPANDED_ITEMS":296,"FLAG_POKERUS_EXPLAINED":273,"FLAG_PURCHASED_HARBOR_MAIL":104,"FLAG_RAYQUAZA_IS_RECOVERING":1279,"FLAG_RECEIVED_20_COINS":225,"FLAG_RECEIVED_6_SODA_POP":140,"FLAG_RECEIVED_ACRO_BIKE":1181,"FLAG_RECEIVED_AMULET_COIN":133,"FLAG_RECEIVED_AURORA_TICKET":314,"FLAG_RECEIVED_BADGE_1":1182,"FLAG_RECEIVED_BADGE_2":1183,"FLAG_RECEIVED_BADGE_3":1184,"FLAG_RECEIVED_BADGE_4":1185,"FLAG_RECEIVED_BADGE_5":1186,"FLAG_RECEIVED_BADGE_6":1187,"FLAG_RECEIVED_BADGE_7":1188,"FLAG_RECEIVED_BADGE_8":1189,"FLAG_RECEIVED_BELDUM":298,"FLAG_RECEIVED_BELUE_BERRY":252,"FLAG_RECEIVED_BIKE":90,"FLAG_RECEIVED_BLUE_SCARF":201,"FLAG_RECEIVED_CASTFORM":151,"FLAG_RECEIVED_CHARCOAL":254,"FLAG_RECEIVED_CHESTO_BERRY_ROUTE_104":246,"FLAG_RECEIVED_CLEANSE_TAG":282,"FLAG_RECEIVED_COIN_CASE":258,"FLAG_RECEIVED_CONTEST_PASS":150,"FLAG_RECEIVED_DEEP_SEA_SCALE":1190,"FLAG_RECEIVED_DEEP_SEA_TOOTH":1191,"FLAG_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":1172,"FLAG_RECEIVED_DEVON_SCOPE":285,"FLAG_RECEIVED_DOLL_LANETTE":131,"FLAG_RECEIVED_DURIN_BERRY":251,"FLAG_RECEIVED_EON_TICKET":474,"FLAG_RECEIVED_EXP_SHARE":272,"FLAG_RECEIVED_FANCLUB_TM_THIS_WEEK":299,"FLAG_RECEIVED_FIRST_POKEBALLS":233,"FLAG_RECEIVED_FOCUS_BAND":283,"FLAG_RECEIVED_GLASS_ORNAMENT":236,"FLAG_RECEIVED_GOLD_SHIELD":238,"FLAG_RECEIVED_GOOD_ROD":227,"FLAG_RECEIVED_GO_GOGGLES":221,"FLAG_RECEIVED_GREAT_BALL_PETALBURG_WOODS":1171,"FLAG_RECEIVED_GREAT_BALL_RUSTBORO_CITY":1173,"FLAG_RECEIVED_GREEN_SCARF":203,"FLAG_RECEIVED_HM_CUT":137,"FLAG_RECEIVED_HM_DIVE":123,"FLAG_RECEIVED_HM_FLASH":109,"FLAG_RECEIVED_HM_FLY":110,"FLAG_RECEIVED_HM_ROCK_SMASH":107,"FLAG_RECEIVED_HM_STRENGTH":106,"FLAG_RECEIVED_HM_SURF":122,"FLAG_RECEIVED_HM_WATERFALL":312,"FLAG_RECEIVED_ITEMFINDER":1176,"FLAG_RECEIVED_KINGS_ROCK":276,"FLAG_RECEIVED_LAVARIDGE_EGG":266,"FLAG_RECEIVED_LETTER":1174,"FLAG_RECEIVED_MACHO_BRACE":277,"FLAG_RECEIVED_MACH_BIKE":1180,"FLAG_RECEIVED_MAGMA_EMBLEM":1177,"FLAG_RECEIVED_MENTAL_HERB":223,"FLAG_RECEIVED_METEORITE":115,"FLAG_RECEIVED_MIRACLE_SEED":297,"FLAG_RECEIVED_MYSTIC_TICKET":315,"FLAG_RECEIVED_OLD_ROD":257,"FLAG_RECEIVED_OLD_SEA_MAP":316,"FLAG_RECEIVED_PAMTRE_BERRY":249,"FLAG_RECEIVED_PINK_SCARF":202,"FLAG_RECEIVED_POKEBLOCK_CASE":95,"FLAG_RECEIVED_POKEDEX_FROM_BIRCH":2276,"FLAG_RECEIVED_POKENAV":188,"FLAG_RECEIVED_POTION_OLDALE":132,"FLAG_RECEIVED_POWDER_JAR":337,"FLAG_RECEIVED_PREMIER_BALL_RUSTBORO":213,"FLAG_RECEIVED_QUICK_CLAW":275,"FLAG_RECEIVED_RED_OR_BLUE_ORB":212,"FLAG_RECEIVED_RED_SCARF":200,"FLAG_RECEIVED_REPEAT_BALL":256,"FLAG_RECEIVED_REVIVED_FOSSIL_MON":267,"FLAG_RECEIVED_RUNNING_SHOES":274,"FLAG_RECEIVED_SECRET_POWER":96,"FLAG_RECEIVED_SHOAL_SALT_1":952,"FLAG_RECEIVED_SHOAL_SALT_2":953,"FLAG_RECEIVED_SHOAL_SALT_3":954,"FLAG_RECEIVED_SHOAL_SALT_4":955,"FLAG_RECEIVED_SHOAL_SHELL_1":956,"FLAG_RECEIVED_SHOAL_SHELL_2":957,"FLAG_RECEIVED_SHOAL_SHELL_3":958,"FLAG_RECEIVED_SHOAL_SHELL_4":959,"FLAG_RECEIVED_SILK_SCARF":289,"FLAG_RECEIVED_SILVER_SHIELD":237,"FLAG_RECEIVED_SOFT_SAND":280,"FLAG_RECEIVED_SOOTHE_BELL":278,"FLAG_RECEIVED_SOOT_SACK":1033,"FLAG_RECEIVED_SPECIAL_PHRASE_HINT":85,"FLAG_RECEIVED_SPELON_BERRY":248,"FLAG_RECEIVED_SS_TICKET":291,"FLAG_RECEIVED_STARTER_DOLL":226,"FLAG_RECEIVED_SUN_STONE_MOSSDEEP":192,"FLAG_RECEIVED_SUPER_ROD":152,"FLAG_RECEIVED_TM_AERIAL_ACE":170,"FLAG_RECEIVED_TM_ATTRACT":235,"FLAG_RECEIVED_TM_BRICK_BREAK":121,"FLAG_RECEIVED_TM_BULK_UP":166,"FLAG_RECEIVED_TM_BULLET_SEED":262,"FLAG_RECEIVED_TM_CALM_MIND":171,"FLAG_RECEIVED_TM_DIG":261,"FLAG_RECEIVED_TM_FACADE":169,"FLAG_RECEIVED_TM_FRUSTRATION":1179,"FLAG_RECEIVED_TM_GIGA_DRAIN":232,"FLAG_RECEIVED_TM_HIDDEN_POWER":264,"FLAG_RECEIVED_TM_OVERHEAT":168,"FLAG_RECEIVED_TM_REST":234,"FLAG_RECEIVED_TM_RETURN":229,"FLAG_RECEIVED_TM_RETURN_2":1178,"FLAG_RECEIVED_TM_ROAR":231,"FLAG_RECEIVED_TM_ROCK_TOMB":165,"FLAG_RECEIVED_TM_SHOCK_WAVE":167,"FLAG_RECEIVED_TM_SLUDGE_BOMB":230,"FLAG_RECEIVED_TM_SNATCH":260,"FLAG_RECEIVED_TM_STEEL_WING":1175,"FLAG_RECEIVED_TM_THIEF":269,"FLAG_RECEIVED_TM_TORMENT":265,"FLAG_RECEIVED_TM_WATER_PULSE":172,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_1":1200,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_2":1201,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_3":1202,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_4":1203,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_5":1204,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_6":1205,"FLAG_RECEIVED_TRICK_HOUSE_REWARD_7":1206,"FLAG_RECEIVED_WAILMER_DOLL":245,"FLAG_RECEIVED_WAILMER_PAIL":94,"FLAG_RECEIVED_WATMEL_BERRY":250,"FLAG_RECEIVED_WHITE_HERB":279,"FLAG_RECEIVED_YELLOW_SCARF":204,"FLAG_RECOVERED_DEVON_GOODS":143,"FLAG_REGICE_IS_RECOVERING":1260,"FLAG_REGIROCK_IS_RECOVERING":1261,"FLAG_REGISTEEL_IS_RECOVERING":1262,"FLAG_REGISTERED_STEVEN_POKENAV":305,"FLAG_REGISTER_RIVAL_POKENAV":124,"FLAG_REGI_DOORS_OPENED":228,"FLAG_REMATCH_ABIGAIL":387,"FLAG_REMATCH_AMY_AND_LIV":399,"FLAG_REMATCH_ANDRES":350,"FLAG_REMATCH_ANNA_AND_MEG":378,"FLAG_REMATCH_BENJAMIN":390,"FLAG_REMATCH_BERNIE":369,"FLAG_REMATCH_BRAWLY":415,"FLAG_REMATCH_BROOKE":356,"FLAG_REMATCH_CALVIN":383,"FLAG_REMATCH_CAMERON":373,"FLAG_REMATCH_CATHERINE":406,"FLAG_REMATCH_CINDY":359,"FLAG_REMATCH_CORY":401,"FLAG_REMATCH_CRISTIN":355,"FLAG_REMATCH_CYNDY":395,"FLAG_REMATCH_DALTON":368,"FLAG_REMATCH_DIANA":398,"FLAG_REMATCH_DRAKE":424,"FLAG_REMATCH_DUSTY":351,"FLAG_REMATCH_DYLAN":388,"FLAG_REMATCH_EDWIN":402,"FLAG_REMATCH_ELLIOT":384,"FLAG_REMATCH_ERNEST":400,"FLAG_REMATCH_ETHAN":370,"FLAG_REMATCH_FERNANDO":367,"FLAG_REMATCH_FLANNERY":417,"FLAG_REMATCH_GABRIELLE":405,"FLAG_REMATCH_GLACIA":423,"FLAG_REMATCH_HALEY":408,"FLAG_REMATCH_ISAAC":404,"FLAG_REMATCH_ISABEL":379,"FLAG_REMATCH_ISAIAH":385,"FLAG_REMATCH_JACKI":374,"FLAG_REMATCH_JACKSON":407,"FLAG_REMATCH_JAMES":409,"FLAG_REMATCH_JEFFREY":372,"FLAG_REMATCH_JENNY":397,"FLAG_REMATCH_JERRY":377,"FLAG_REMATCH_JESSICA":361,"FLAG_REMATCH_JOHN_AND_JAY":371,"FLAG_REMATCH_KAREN":376,"FLAG_REMATCH_KATELYN":389,"FLAG_REMATCH_KIRA_AND_DAN":412,"FLAG_REMATCH_KOJI":366,"FLAG_REMATCH_LAO":394,"FLAG_REMATCH_LILA_AND_ROY":354,"FLAG_REMATCH_LOLA":352,"FLAG_REMATCH_LYDIA":403,"FLAG_REMATCH_MADELINE":396,"FLAG_REMATCH_MARIA":386,"FLAG_REMATCH_MIGUEL":380,"FLAG_REMATCH_NICOLAS":392,"FLAG_REMATCH_NOB":365,"FLAG_REMATCH_NORMAN":418,"FLAG_REMATCH_PABLO":391,"FLAG_REMATCH_PHOEBE":422,"FLAG_REMATCH_RICKY":353,"FLAG_REMATCH_ROBERT":393,"FLAG_REMATCH_ROSE":349,"FLAG_REMATCH_ROXANNE":414,"FLAG_REMATCH_SAWYER":411,"FLAG_REMATCH_SHELBY":382,"FLAG_REMATCH_SIDNEY":421,"FLAG_REMATCH_STEVE":363,"FLAG_REMATCH_TATE_AND_LIZA":420,"FLAG_REMATCH_THALIA":360,"FLAG_REMATCH_TIMOTHY":381,"FLAG_REMATCH_TONY":364,"FLAG_REMATCH_TRENT":410,"FLAG_REMATCH_VALERIE":358,"FLAG_REMATCH_WALLACE":425,"FLAG_REMATCH_WALLY":413,"FLAG_REMATCH_WALTER":375,"FLAG_REMATCH_WATTSON":416,"FLAG_REMATCH_WILTON":357,"FLAG_REMATCH_WINONA":419,"FLAG_REMATCH_WINSTON":362,"FLAG_RESCUED_BIRCH":82,"FLAG_RETURNED_DEVON_GOODS":144,"FLAG_RETURNED_RED_OR_BLUE_ORB":259,"FLAG_RIVAL_LEFT_FOR_ROUTE103":301,"FLAG_ROUTE_111_RECEIVED_BERRY":1192,"FLAG_ROUTE_114_RECEIVED_BERRY":1193,"FLAG_ROUTE_120_RECEIVED_BERRY":1194,"FLAG_RUSTBORO_NPC_TRADE_COMPLETED":153,"FLAG_RUSTURF_TUNNEL_OPENED":199,"FLAG_SCOTT_CALL_BATTLE_FRONTIER":114,"FLAG_SCOTT_CALL_FORTREE_GYM":138,"FLAG_SCOTT_GIVES_BATTLE_POINTS":465,"FLAG_SECRET_BASE_REGISTRY_ENABLED":268,"FLAG_SET_WALL_CLOCK":81,"FLAG_SHOWN_AURORA_TICKET":431,"FLAG_SHOWN_BOX_WAS_FULL_MESSAGE":2263,"FLAG_SHOWN_EON_TICKET":430,"FLAG_SHOWN_MYSTIC_TICKET":475,"FLAG_SHOWN_OLD_SEA_MAP":432,"FLAG_SMART_PAINTING_MADE":163,"FLAG_SOOTOPOLIS_ARCHIE_MAXIE_LEAVE":158,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_1":1198,"FLAG_SOOTOPOLIS_RECEIVED_BERRY_2":1199,"FLAG_SPECIAL_FLAG_UNUSED_0x4003":16387,"FLAG_SS_TIDAL_DISABLED":84,"FLAG_STEVEN_GUIDES_TO_CAVE_OF_ORIGIN":307,"FLAG_STORING_ITEMS_IN_PYRAMID_BAG":16388,"FLAG_SYS_ARENA_GOLD":2251,"FLAG_SYS_ARENA_SILVER":2250,"FLAG_SYS_BRAILLE_DIG":2223,"FLAG_SYS_BRAILLE_REGICE_COMPLETED":2225,"FLAG_SYS_B_DASH":2240,"FLAG_SYS_CAVE_BATTLE":2201,"FLAG_SYS_CAVE_SHIP":2199,"FLAG_SYS_CAVE_WONDER":2200,"FLAG_SYS_CHANGED_DEWFORD_TREND":2195,"FLAG_SYS_CHAT_USED":2149,"FLAG_SYS_CLOCK_SET":2197,"FLAG_SYS_CRUISE_MODE":2189,"FLAG_SYS_CTRL_OBJ_DELETE":2241,"FLAG_SYS_CYCLING_ROAD":2187,"FLAG_SYS_DOME_GOLD":2247,"FLAG_SYS_DOME_SILVER":2246,"FLAG_SYS_ENC_DOWN_ITEM":2222,"FLAG_SYS_ENC_UP_ITEM":2221,"FLAG_SYS_FACTORY_GOLD":2253,"FLAG_SYS_FACTORY_SILVER":2252,"FLAG_SYS_FRONTIER_PASS":2258,"FLAG_SYS_GAME_CLEAR":2148,"FLAG_SYS_MIX_RECORD":2196,"FLAG_SYS_MYSTERY_EVENT_ENABLE":2220,"FLAG_SYS_MYSTERY_GIFT_ENABLE":2267,"FLAG_SYS_NATIONAL_DEX":2198,"FLAG_SYS_PALACE_GOLD":2249,"FLAG_SYS_PALACE_SILVER":2248,"FLAG_SYS_PC_LANETTE":2219,"FLAG_SYS_PIKE_GOLD":2255,"FLAG_SYS_PIKE_SILVER":2254,"FLAG_SYS_POKEDEX_GET":2145,"FLAG_SYS_POKEMON_GET":2144,"FLAG_SYS_POKENAV_GET":2146,"FLAG_SYS_PYRAMID_GOLD":2257,"FLAG_SYS_PYRAMID_SILVER":2256,"FLAG_SYS_REGIROCK_PUZZLE_COMPLETED":2224,"FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED":2226,"FLAG_SYS_RESET_RTC_ENABLE":2242,"FLAG_SYS_RIBBON_GET":2203,"FLAG_SYS_SAFARI_MODE":2188,"FLAG_SYS_SHOAL_ITEM":2239,"FLAG_SYS_SHOAL_TIDE":2202,"FLAG_SYS_TOWER_GOLD":2245,"FLAG_SYS_TOWER_SILVER":2244,"FLAG_SYS_TV_HOME":2192,"FLAG_SYS_TV_LATIAS_LATIOS":2237,"FLAG_SYS_TV_START":2194,"FLAG_SYS_TV_WATCH":2193,"FLAG_SYS_USE_FLASH":2184,"FLAG_SYS_USE_STRENGTH":2185,"FLAG_SYS_WEATHER_CTRL":2186,"FLAG_TEAM_AQUA_ESCAPED_IN_SUBMARINE":112,"FLAG_TEMP_1":1,"FLAG_TEMP_10":16,"FLAG_TEMP_11":17,"FLAG_TEMP_12":18,"FLAG_TEMP_13":19,"FLAG_TEMP_14":20,"FLAG_TEMP_15":21,"FLAG_TEMP_16":22,"FLAG_TEMP_17":23,"FLAG_TEMP_18":24,"FLAG_TEMP_19":25,"FLAG_TEMP_1A":26,"FLAG_TEMP_1B":27,"FLAG_TEMP_1C":28,"FLAG_TEMP_1D":29,"FLAG_TEMP_1E":30,"FLAG_TEMP_1F":31,"FLAG_TEMP_2":2,"FLAG_TEMP_3":3,"FLAG_TEMP_4":4,"FLAG_TEMP_5":5,"FLAG_TEMP_6":6,"FLAG_TEMP_7":7,"FLAG_TEMP_8":8,"FLAG_TEMP_9":9,"FLAG_TEMP_A":10,"FLAG_TEMP_B":11,"FLAG_TEMP_C":12,"FLAG_TEMP_D":13,"FLAG_TEMP_E":14,"FLAG_TEMP_F":15,"FLAG_TEMP_HIDE_MIRAGE_ISLAND_BERRY_TREE":17,"FLAG_TEMP_REGICE_PUZZLE_FAILED":3,"FLAG_TEMP_REGICE_PUZZLE_STARTED":2,"FLAG_TEMP_SKIP_GABBY_INTERVIEW":1,"FLAG_THANKED_FOR_PLAYING_WITH_WALLY":135,"FLAG_TOUGH_PAINTING_MADE":164,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1":194,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2":195,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3":196,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4":197,"FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5":198,"FLAG_TV_EXPLAINED":98,"FLAG_UNLOCKED_TRENDY_SAYINGS":2150,"FLAG_USED_ROOM_1_KEY":240,"FLAG_USED_ROOM_2_KEY":241,"FLAG_USED_ROOM_4_KEY":242,"FLAG_USED_ROOM_6_KEY":243,"FLAG_USED_STORAGE_KEY":239,"FLAG_VISITED_DEWFORD_TOWN":2161,"FLAG_VISITED_EVER_GRANDE_CITY":2174,"FLAG_VISITED_FALLARBOR_TOWN":2163,"FLAG_VISITED_FORTREE_CITY":2170,"FLAG_VISITED_LAVARIDGE_TOWN":2162,"FLAG_VISITED_LILYCOVE_CITY":2171,"FLAG_VISITED_LITTLEROOT_TOWN":2159,"FLAG_VISITED_MAUVILLE_CITY":2168,"FLAG_VISITED_MOSSDEEP_CITY":2172,"FLAG_VISITED_OLDALE_TOWN":2160,"FLAG_VISITED_PACIFIDLOG_TOWN":2165,"FLAG_VISITED_PETALBURG_CITY":2166,"FLAG_VISITED_RUSTBORO_CITY":2169,"FLAG_VISITED_SLATEPORT_CITY":2167,"FLAG_VISITED_SOOTOPOLIS_CITY":2173,"FLAG_VISITED_VERDANTURF_TOWN":2164,"FLAG_WALLACE_GOES_TO_SKY_PILLAR":311,"FLAG_WALLY_SPEECH":193,"FLAG_WATTSON_REMATCH_AVAILABLE":91,"FLAG_WHITEOUT_TO_LAVARIDGE":108,"FLAG_WINGULL_DELIVERED_MAIL":224,"FLAG_WINGULL_SENT_ON_ERRAND":222,"FLAG_WONDER_CARD_UNUSED_1":317,"FLAG_WONDER_CARD_UNUSED_10":326,"FLAG_WONDER_CARD_UNUSED_11":327,"FLAG_WONDER_CARD_UNUSED_12":328,"FLAG_WONDER_CARD_UNUSED_13":329,"FLAG_WONDER_CARD_UNUSED_14":330,"FLAG_WONDER_CARD_UNUSED_15":331,"FLAG_WONDER_CARD_UNUSED_16":332,"FLAG_WONDER_CARD_UNUSED_17":333,"FLAG_WONDER_CARD_UNUSED_2":318,"FLAG_WONDER_CARD_UNUSED_3":319,"FLAG_WONDER_CARD_UNUSED_4":320,"FLAG_WONDER_CARD_UNUSED_5":321,"FLAG_WONDER_CARD_UNUSED_6":322,"FLAG_WONDER_CARD_UNUSED_7":323,"FLAG_WONDER_CARD_UNUSED_8":324,"FLAG_WONDER_CARD_UNUSED_9":325,"FLAVOR_BITTER":3,"FLAVOR_COUNT":5,"FLAVOR_DRY":1,"FLAVOR_SOUR":4,"FLAVOR_SPICY":0,"FLAVOR_SWEET":2,"GOOD_ROD":1,"ITEMS_COUNT":377,"ITEM_034":52,"ITEM_035":53,"ITEM_036":54,"ITEM_037":55,"ITEM_038":56,"ITEM_039":57,"ITEM_03A":58,"ITEM_03B":59,"ITEM_03C":60,"ITEM_03D":61,"ITEM_03E":62,"ITEM_048":72,"ITEM_052":82,"ITEM_057":87,"ITEM_058":88,"ITEM_059":89,"ITEM_05A":90,"ITEM_05B":91,"ITEM_05C":92,"ITEM_063":99,"ITEM_064":100,"ITEM_065":101,"ITEM_066":102,"ITEM_069":105,"ITEM_071":113,"ITEM_072":114,"ITEM_073":115,"ITEM_074":116,"ITEM_075":117,"ITEM_076":118,"ITEM_077":119,"ITEM_078":120,"ITEM_0EA":234,"ITEM_0EB":235,"ITEM_0EC":236,"ITEM_0ED":237,"ITEM_0EE":238,"ITEM_0EF":239,"ITEM_0F0":240,"ITEM_0F1":241,"ITEM_0F2":242,"ITEM_0F3":243,"ITEM_0F4":244,"ITEM_0F5":245,"ITEM_0F6":246,"ITEM_0F7":247,"ITEM_0F8":248,"ITEM_0F9":249,"ITEM_0FA":250,"ITEM_0FB":251,"ITEM_0FC":252,"ITEM_0FD":253,"ITEM_10B":267,"ITEM_15B":347,"ITEM_15C":348,"ITEM_ACRO_BIKE":272,"ITEM_AGUAV_BERRY":146,"ITEM_AMULET_COIN":189,"ITEM_ANTIDOTE":14,"ITEM_APICOT_BERRY":172,"ITEM_ARCHIPELAGO_PROGRESSION":112,"ITEM_ASPEAR_BERRY":137,"ITEM_AURORA_TICKET":371,"ITEM_AWAKENING":17,"ITEM_BADGE_1":226,"ITEM_BADGE_2":227,"ITEM_BADGE_3":228,"ITEM_BADGE_4":229,"ITEM_BADGE_5":230,"ITEM_BADGE_6":231,"ITEM_BADGE_7":232,"ITEM_BADGE_8":233,"ITEM_BASEMENT_KEY":271,"ITEM_BEAD_MAIL":127,"ITEM_BELUE_BERRY":167,"ITEM_BERRY_JUICE":44,"ITEM_BERRY_POUCH":365,"ITEM_BICYCLE":360,"ITEM_BIG_MUSHROOM":104,"ITEM_BIG_PEARL":107,"ITEM_BIKE_VOUCHER":352,"ITEM_BLACK_BELT":207,"ITEM_BLACK_FLUTE":42,"ITEM_BLACK_GLASSES":206,"ITEM_BLUE_FLUTE":39,"ITEM_BLUE_ORB":277,"ITEM_BLUE_SCARF":255,"ITEM_BLUE_SHARD":49,"ITEM_BLUK_BERRY":149,"ITEM_BRIGHT_POWDER":179,"ITEM_BURN_HEAL":15,"ITEM_B_USE_MEDICINE":1,"ITEM_B_USE_OTHER":2,"ITEM_CALCIUM":67,"ITEM_CARBOS":66,"ITEM_CARD_KEY":355,"ITEM_CHARCOAL":215,"ITEM_CHERI_BERRY":133,"ITEM_CHESTO_BERRY":134,"ITEM_CHOICE_BAND":186,"ITEM_CLAW_FOSSIL":287,"ITEM_CLEANSE_TAG":190,"ITEM_COIN_CASE":260,"ITEM_CONTEST_PASS":266,"ITEM_CORNN_BERRY":159,"ITEM_DEEP_SEA_SCALE":193,"ITEM_DEEP_SEA_TOOTH":192,"ITEM_DEVON_GOODS":269,"ITEM_DEVON_SCOPE":288,"ITEM_DIRE_HIT":74,"ITEM_DIVE_BALL":7,"ITEM_DOME_FOSSIL":358,"ITEM_DRAGON_FANG":216,"ITEM_DRAGON_SCALE":201,"ITEM_DREAM_MAIL":130,"ITEM_DURIN_BERRY":166,"ITEM_ELIXIR":36,"ITEM_ENERGY_POWDER":30,"ITEM_ENERGY_ROOT":31,"ITEM_ENIGMA_BERRY":175,"ITEM_EON_TICKET":275,"ITEM_ESCAPE_ROPE":85,"ITEM_ETHER":34,"ITEM_EVERSTONE":195,"ITEM_EXP_SHARE":182,"ITEM_FAB_MAIL":131,"ITEM_FAME_CHECKER":363,"ITEM_FIGY_BERRY":143,"ITEM_FIRE_STONE":95,"ITEM_FLUFFY_TAIL":81,"ITEM_FOCUS_BAND":196,"ITEM_FRESH_WATER":26,"ITEM_FULL_HEAL":23,"ITEM_FULL_RESTORE":19,"ITEM_GANLON_BERRY":169,"ITEM_GLITTER_MAIL":123,"ITEM_GOLD_TEETH":353,"ITEM_GOOD_ROD":263,"ITEM_GO_GOGGLES":279,"ITEM_GREAT_BALL":3,"ITEM_GREEN_SCARF":257,"ITEM_GREEN_SHARD":51,"ITEM_GREPA_BERRY":157,"ITEM_GUARD_SPEC":73,"ITEM_HARBOR_MAIL":122,"ITEM_HARD_STONE":204,"ITEM_HEAL_POWDER":32,"ITEM_HEART_SCALE":111,"ITEM_HELIX_FOSSIL":357,"ITEM_HM01":339,"ITEM_HM02":340,"ITEM_HM03":341,"ITEM_HM04":342,"ITEM_HM05":343,"ITEM_HM06":344,"ITEM_HM07":345,"ITEM_HM08":346,"ITEM_HM_CUT":339,"ITEM_HM_DIVE":346,"ITEM_HM_FLASH":343,"ITEM_HM_FLY":340,"ITEM_HM_ROCK_SMASH":344,"ITEM_HM_STRENGTH":342,"ITEM_HM_SURF":341,"ITEM_HM_WATERFALL":345,"ITEM_HONDEW_BERRY":156,"ITEM_HP_UP":63,"ITEM_HYPER_POTION":21,"ITEM_IAPAPA_BERRY":147,"ITEM_ICE_HEAL":16,"ITEM_IRON":65,"ITEM_ITEMFINDER":261,"ITEM_KELPSY_BERRY":154,"ITEM_KINGS_ROCK":187,"ITEM_LANSAT_BERRY":173,"ITEM_LAVA_COOKIE":38,"ITEM_LAX_INCENSE":221,"ITEM_LEAF_STONE":98,"ITEM_LEFTOVERS":200,"ITEM_LEMONADE":28,"ITEM_LEPPA_BERRY":138,"ITEM_LETTER":274,"ITEM_LIECHI_BERRY":168,"ITEM_LIFT_KEY":356,"ITEM_LIGHT_BALL":202,"ITEM_LIST_END":65535,"ITEM_LUCKY_EGG":197,"ITEM_LUCKY_PUNCH":222,"ITEM_LUM_BERRY":141,"ITEM_LUXURY_BALL":11,"ITEM_MACHO_BRACE":181,"ITEM_MACH_BIKE":259,"ITEM_MAGMA_EMBLEM":375,"ITEM_MAGNET":208,"ITEM_MAGOST_BERRY":160,"ITEM_MAGO_BERRY":145,"ITEM_MASTER_BALL":1,"ITEM_MAX_ELIXIR":37,"ITEM_MAX_ETHER":35,"ITEM_MAX_POTION":20,"ITEM_MAX_REPEL":84,"ITEM_MAX_REVIVE":25,"ITEM_MECH_MAIL":124,"ITEM_MENTAL_HERB":185,"ITEM_METAL_COAT":199,"ITEM_METAL_POWDER":223,"ITEM_METEORITE":280,"ITEM_MIRACLE_SEED":205,"ITEM_MOOMOO_MILK":29,"ITEM_MOON_STONE":94,"ITEM_MYSTIC_TICKET":370,"ITEM_MYSTIC_WATER":209,"ITEM_NANAB_BERRY":150,"ITEM_NEST_BALL":8,"ITEM_NET_BALL":6,"ITEM_NEVER_MELT_ICE":212,"ITEM_NOMEL_BERRY":162,"ITEM_NONE":0,"ITEM_NUGGET":110,"ITEM_OAKS_PARCEL":349,"ITEM_OLD_AMBER":354,"ITEM_OLD_ROD":262,"ITEM_OLD_SEA_MAP":376,"ITEM_ORANGE_MAIL":121,"ITEM_ORAN_BERRY":139,"ITEM_PAMTRE_BERRY":164,"ITEM_PARALYZE_HEAL":18,"ITEM_PEARL":106,"ITEM_PECHA_BERRY":135,"ITEM_PERSIM_BERRY":140,"ITEM_PETAYA_BERRY":171,"ITEM_PINAP_BERRY":152,"ITEM_PINK_SCARF":256,"ITEM_POISON_BARB":211,"ITEM_POKEBLOCK_CASE":273,"ITEM_POKE_BALL":4,"ITEM_POKE_DOLL":80,"ITEM_POKE_FLUTE":350,"ITEM_POMEG_BERRY":153,"ITEM_POTION":13,"ITEM_POWDER_JAR":372,"ITEM_PP_MAX":71,"ITEM_PP_UP":69,"ITEM_PREMIER_BALL":12,"ITEM_PROTEIN":64,"ITEM_QUALOT_BERRY":155,"ITEM_QUICK_CLAW":183,"ITEM_RABUTA_BERRY":161,"ITEM_RAINBOW_PASS":368,"ITEM_RARE_CANDY":68,"ITEM_RAWST_BERRY":136,"ITEM_RAZZ_BERRY":148,"ITEM_RED_FLUTE":41,"ITEM_RED_ORB":276,"ITEM_RED_SCARF":254,"ITEM_RED_SHARD":48,"ITEM_REPEAT_BALL":9,"ITEM_REPEL":86,"ITEM_RETRO_MAIL":132,"ITEM_REVIVAL_HERB":33,"ITEM_REVIVE":24,"ITEM_ROOM_1_KEY":281,"ITEM_ROOM_2_KEY":282,"ITEM_ROOM_4_KEY":283,"ITEM_ROOM_6_KEY":284,"ITEM_ROOT_FOSSIL":286,"ITEM_RUBY":373,"ITEM_SACRED_ASH":45,"ITEM_SAFARI_BALL":5,"ITEM_SALAC_BERRY":170,"ITEM_SAPPHIRE":374,"ITEM_SCANNER":278,"ITEM_SCOPE_LENS":198,"ITEM_SEA_INCENSE":220,"ITEM_SECRET_KEY":351,"ITEM_SHADOW_MAIL":128,"ITEM_SHARP_BEAK":210,"ITEM_SHELL_BELL":219,"ITEM_SHOAL_SALT":46,"ITEM_SHOAL_SHELL":47,"ITEM_SILK_SCARF":217,"ITEM_SILPH_SCOPE":359,"ITEM_SILVER_POWDER":188,"ITEM_SITRUS_BERRY":142,"ITEM_SMOKE_BALL":194,"ITEM_SODA_POP":27,"ITEM_SOFT_SAND":203,"ITEM_SOOTHE_BELL":184,"ITEM_SOOT_SACK":270,"ITEM_SOUL_DEW":191,"ITEM_SPELL_TAG":213,"ITEM_SPELON_BERRY":163,"ITEM_SS_TICKET":265,"ITEM_STARDUST":108,"ITEM_STARF_BERRY":174,"ITEM_STAR_PIECE":109,"ITEM_STICK":225,"ITEM_STORAGE_KEY":285,"ITEM_SUN_STONE":93,"ITEM_SUPER_POTION":22,"ITEM_SUPER_REPEL":83,"ITEM_SUPER_ROD":264,"ITEM_TAMATO_BERRY":158,"ITEM_TEA":369,"ITEM_TEACHY_TV":366,"ITEM_THICK_CLUB":224,"ITEM_THUNDER_STONE":96,"ITEM_TIMER_BALL":10,"ITEM_TINY_MUSHROOM":103,"ITEM_TM01":289,"ITEM_TM02":290,"ITEM_TM03":291,"ITEM_TM04":292,"ITEM_TM05":293,"ITEM_TM06":294,"ITEM_TM07":295,"ITEM_TM08":296,"ITEM_TM09":297,"ITEM_TM10":298,"ITEM_TM11":299,"ITEM_TM12":300,"ITEM_TM13":301,"ITEM_TM14":302,"ITEM_TM15":303,"ITEM_TM16":304,"ITEM_TM17":305,"ITEM_TM18":306,"ITEM_TM19":307,"ITEM_TM20":308,"ITEM_TM21":309,"ITEM_TM22":310,"ITEM_TM23":311,"ITEM_TM24":312,"ITEM_TM25":313,"ITEM_TM26":314,"ITEM_TM27":315,"ITEM_TM28":316,"ITEM_TM29":317,"ITEM_TM30":318,"ITEM_TM31":319,"ITEM_TM32":320,"ITEM_TM33":321,"ITEM_TM34":322,"ITEM_TM35":323,"ITEM_TM36":324,"ITEM_TM37":325,"ITEM_TM38":326,"ITEM_TM39":327,"ITEM_TM40":328,"ITEM_TM41":329,"ITEM_TM42":330,"ITEM_TM43":331,"ITEM_TM44":332,"ITEM_TM45":333,"ITEM_TM46":334,"ITEM_TM47":335,"ITEM_TM48":336,"ITEM_TM49":337,"ITEM_TM50":338,"ITEM_TM_AERIAL_ACE":328,"ITEM_TM_ATTRACT":333,"ITEM_TM_BLIZZARD":302,"ITEM_TM_BRICK_BREAK":319,"ITEM_TM_BULK_UP":296,"ITEM_TM_BULLET_SEED":297,"ITEM_TM_CALM_MIND":292,"ITEM_TM_CASE":364,"ITEM_TM_DIG":316,"ITEM_TM_DOUBLE_TEAM":320,"ITEM_TM_DRAGON_CLAW":290,"ITEM_TM_EARTHQUAKE":314,"ITEM_TM_FACADE":330,"ITEM_TM_FIRE_BLAST":326,"ITEM_TM_FLAMETHROWER":323,"ITEM_TM_FOCUS_PUNCH":289,"ITEM_TM_FRUSTRATION":309,"ITEM_TM_GIGA_DRAIN":307,"ITEM_TM_HAIL":295,"ITEM_TM_HIDDEN_POWER":298,"ITEM_TM_HYPER_BEAM":303,"ITEM_TM_ICE_BEAM":301,"ITEM_TM_IRON_TAIL":311,"ITEM_TM_LIGHT_SCREEN":304,"ITEM_TM_OVERHEAT":338,"ITEM_TM_PROTECT":305,"ITEM_TM_PSYCHIC":317,"ITEM_TM_RAIN_DANCE":306,"ITEM_TM_REFLECT":321,"ITEM_TM_REST":332,"ITEM_TM_RETURN":315,"ITEM_TM_ROAR":293,"ITEM_TM_ROCK_TOMB":327,"ITEM_TM_SAFEGUARD":308,"ITEM_TM_SANDSTORM":325,"ITEM_TM_SECRET_POWER":331,"ITEM_TM_SHADOW_BALL":318,"ITEM_TM_SHOCK_WAVE":322,"ITEM_TM_SKILL_SWAP":336,"ITEM_TM_SLUDGE_BOMB":324,"ITEM_TM_SNATCH":337,"ITEM_TM_SOLAR_BEAM":310,"ITEM_TM_STEEL_WING":335,"ITEM_TM_SUNNY_DAY":299,"ITEM_TM_TAUNT":300,"ITEM_TM_THIEF":334,"ITEM_TM_THUNDER":313,"ITEM_TM_THUNDERBOLT":312,"ITEM_TM_TORMENT":329,"ITEM_TM_TOXIC":294,"ITEM_TM_WATER_PULSE":291,"ITEM_TOWN_MAP":361,"ITEM_TRI_PASS":367,"ITEM_TROPIC_MAIL":129,"ITEM_TWISTED_SPOON":214,"ITEM_ULTRA_BALL":2,"ITEM_UNUSED_BERRY_1":176,"ITEM_UNUSED_BERRY_2":177,"ITEM_UNUSED_BERRY_3":178,"ITEM_UP_GRADE":218,"ITEM_USE_BAG_MENU":4,"ITEM_USE_FIELD":2,"ITEM_USE_MAIL":0,"ITEM_USE_PARTY_MENU":1,"ITEM_USE_PBLOCK_CASE":3,"ITEM_VS_SEEKER":362,"ITEM_WAILMER_PAIL":268,"ITEM_WATER_STONE":97,"ITEM_WATMEL_BERRY":165,"ITEM_WAVE_MAIL":126,"ITEM_WEPEAR_BERRY":151,"ITEM_WHITE_FLUTE":43,"ITEM_WHITE_HERB":180,"ITEM_WIKI_BERRY":144,"ITEM_WOOD_MAIL":125,"ITEM_X_ACCURACY":78,"ITEM_X_ATTACK":75,"ITEM_X_DEFEND":76,"ITEM_X_SPECIAL":79,"ITEM_X_SPEED":77,"ITEM_YELLOW_FLUTE":40,"ITEM_YELLOW_SCARF":258,"ITEM_YELLOW_SHARD":50,"ITEM_ZINC":70,"LAST_BALL":12,"LAST_BERRY_INDEX":175,"LAST_BERRY_MASTER_BERRY":162,"LAST_BERRY_MASTER_WIFE_BERRY":142,"LAST_KIRI_BERRY":162,"LAST_ROUTE_114_MAN_BERRY":152,"MACH_BIKE":0,"MAIL_NONE":255,"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":6207,"MAP_ABANDONED_SHIP_CORRIDORS_1F":6199,"MAP_ABANDONED_SHIP_CORRIDORS_B1F":6201,"MAP_ABANDONED_SHIP_DECK":6198,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":6209,"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":6210,"MAP_ABANDONED_SHIP_ROOMS2_1F":6206,"MAP_ABANDONED_SHIP_ROOMS2_B1F":6203,"MAP_ABANDONED_SHIP_ROOMS_1F":6200,"MAP_ABANDONED_SHIP_ROOMS_B1F":6202,"MAP_ABANDONED_SHIP_ROOM_B1F":6205,"MAP_ABANDONED_SHIP_UNDERWATER1":6204,"MAP_ABANDONED_SHIP_UNDERWATER2":6208,"MAP_ALTERING_CAVE":6250,"MAP_ANCIENT_TOMB":6212,"MAP_AQUA_HIDEOUT_1F":6167,"MAP_AQUA_HIDEOUT_B1F":6168,"MAP_AQUA_HIDEOUT_B2F":6169,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":6218,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":6219,"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":6220,"MAP_ARTISAN_CAVE_1F":6244,"MAP_ARTISAN_CAVE_B1F":6243,"MAP_BATTLE_COLOSSEUM_2P":6424,"MAP_BATTLE_COLOSSEUM_4P":6427,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":6686,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":6685,"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":6684,"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":6677,"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":6675,"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":6674,"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":6676,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":6689,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":6687,"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":6688,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":6680,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":6679,"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":6678,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":6691,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":6690,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":6694,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":6693,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":6695,"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":6692,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":6682,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":6681,"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":6683,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":6664,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":6663,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":6662,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":6661,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":6673,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":6672,"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":6671,"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":6698,"MAP_BATTLE_FRONTIER_LOUNGE1":6697,"MAP_BATTLE_FRONTIER_LOUNGE2":6699,"MAP_BATTLE_FRONTIER_LOUNGE3":6700,"MAP_BATTLE_FRONTIER_LOUNGE4":6701,"MAP_BATTLE_FRONTIER_LOUNGE5":6703,"MAP_BATTLE_FRONTIER_LOUNGE6":6704,"MAP_BATTLE_FRONTIER_LOUNGE7":6705,"MAP_BATTLE_FRONTIER_LOUNGE8":6707,"MAP_BATTLE_FRONTIER_LOUNGE9":6708,"MAP_BATTLE_FRONTIER_MART":6711,"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":6670,"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":6660,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":6709,"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":6710,"MAP_BATTLE_FRONTIER_RANKING_HALL":6696,"MAP_BATTLE_FRONTIER_RECEPTION_GATE":6706,"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":6702,"MAP_BATTLE_PYRAMID_SQUARE01":6444,"MAP_BATTLE_PYRAMID_SQUARE02":6445,"MAP_BATTLE_PYRAMID_SQUARE03":6446,"MAP_BATTLE_PYRAMID_SQUARE04":6447,"MAP_BATTLE_PYRAMID_SQUARE05":6448,"MAP_BATTLE_PYRAMID_SQUARE06":6449,"MAP_BATTLE_PYRAMID_SQUARE07":6450,"MAP_BATTLE_PYRAMID_SQUARE08":6451,"MAP_BATTLE_PYRAMID_SQUARE09":6452,"MAP_BATTLE_PYRAMID_SQUARE10":6453,"MAP_BATTLE_PYRAMID_SQUARE11":6454,"MAP_BATTLE_PYRAMID_SQUARE12":6455,"MAP_BATTLE_PYRAMID_SQUARE13":6456,"MAP_BATTLE_PYRAMID_SQUARE14":6457,"MAP_BATTLE_PYRAMID_SQUARE15":6458,"MAP_BATTLE_PYRAMID_SQUARE16":6459,"MAP_BIRTH_ISLAND_EXTERIOR":6714,"MAP_BIRTH_ISLAND_HARBOR":6715,"MAP_CAVE_OF_ORIGIN_1F":6182,"MAP_CAVE_OF_ORIGIN_B1F":6186,"MAP_CAVE_OF_ORIGIN_ENTRANCE":6181,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":6183,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":6184,"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":6185,"MAP_CONTEST_HALL":6428,"MAP_CONTEST_HALL_BEAUTY":6435,"MAP_CONTEST_HALL_COOL":6437,"MAP_CONTEST_HALL_CUTE":6439,"MAP_CONTEST_HALL_SMART":6438,"MAP_CONTEST_HALL_TOUGH":6436,"MAP_DESERT_RUINS":6150,"MAP_DESERT_UNDERPASS":6242,"MAP_DEWFORD_TOWN":11,"MAP_DEWFORD_TOWN_GYM":771,"MAP_DEWFORD_TOWN_HALL":772,"MAP_DEWFORD_TOWN_HOUSE1":768,"MAP_DEWFORD_TOWN_HOUSE2":773,"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":769,"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":770,"MAP_EVER_GRANDE_CITY":8,"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":4100,"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":4099,"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":4098,"MAP_EVER_GRANDE_CITY_HALL1":4101,"MAP_EVER_GRANDE_CITY_HALL2":4102,"MAP_EVER_GRANDE_CITY_HALL3":4103,"MAP_EVER_GRANDE_CITY_HALL4":4104,"MAP_EVER_GRANDE_CITY_HALL5":4105,"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":4107,"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":4097,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":4108,"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":4109,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":4106,"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":4110,"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":4096,"MAP_FALLARBOR_TOWN":13,"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":1283,"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":1282,"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":1281,"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":1286,"MAP_FALLARBOR_TOWN_MART":1280,"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":1287,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":1284,"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":1285,"MAP_FARAWAY_ISLAND_ENTRANCE":6712,"MAP_FARAWAY_ISLAND_INTERIOR":6713,"MAP_FIERY_PATH":6158,"MAP_FORTREE_CITY":4,"MAP_FORTREE_CITY_DECORATION_SHOP":3081,"MAP_FORTREE_CITY_GYM":3073,"MAP_FORTREE_CITY_HOUSE1":3072,"MAP_FORTREE_CITY_HOUSE2":3077,"MAP_FORTREE_CITY_HOUSE3":3078,"MAP_FORTREE_CITY_HOUSE4":3079,"MAP_FORTREE_CITY_HOUSE5":3080,"MAP_FORTREE_CITY_MART":3076,"MAP_FORTREE_CITY_POKEMON_CENTER_1F":3074,"MAP_FORTREE_CITY_POKEMON_CENTER_2F":3075,"MAP_GRANITE_CAVE_1F":6151,"MAP_GRANITE_CAVE_B1F":6152,"MAP_GRANITE_CAVE_B2F":6153,"MAP_GRANITE_CAVE_STEVENS_ROOM":6154,"MAP_GROUPS_COUNT":34,"MAP_INSIDE_OF_TRUCK":6440,"MAP_ISLAND_CAVE":6211,"MAP_JAGGED_PASS":6157,"MAP_LAVARIDGE_TOWN":12,"MAP_LAVARIDGE_TOWN_GYM_1F":1025,"MAP_LAVARIDGE_TOWN_GYM_B1F":1026,"MAP_LAVARIDGE_TOWN_HERB_SHOP":1024,"MAP_LAVARIDGE_TOWN_HOUSE":1027,"MAP_LAVARIDGE_TOWN_MART":1028,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":1029,"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":1030,"MAP_LILYCOVE_CITY":5,"MAP_LILYCOVE_CITY_CONTEST_HALL":3333,"MAP_LILYCOVE_CITY_CONTEST_LOBBY":3332,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":3328,"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":3329,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":3344,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":3345,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":3346,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":3347,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":3348,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":3350,"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":3349,"MAP_LILYCOVE_CITY_HARBOR":3338,"MAP_LILYCOVE_CITY_HOUSE1":3340,"MAP_LILYCOVE_CITY_HOUSE2":3341,"MAP_LILYCOVE_CITY_HOUSE3":3342,"MAP_LILYCOVE_CITY_HOUSE4":3343,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":3330,"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":3331,"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":3339,"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":3334,"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":3335,"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":3337,"MAP_LILYCOVE_CITY_UNUSED_MART":3336,"MAP_LITTLEROOT_TOWN":9,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":256,"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":257,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":258,"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":259,"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":260,"MAP_MAGMA_HIDEOUT_1F":6230,"MAP_MAGMA_HIDEOUT_2F_1R":6231,"MAP_MAGMA_HIDEOUT_2F_2R":6232,"MAP_MAGMA_HIDEOUT_2F_3R":6237,"MAP_MAGMA_HIDEOUT_3F_1R":6233,"MAP_MAGMA_HIDEOUT_3F_2R":6234,"MAP_MAGMA_HIDEOUT_3F_3R":6236,"MAP_MAGMA_HIDEOUT_4F":6235,"MAP_MARINE_CAVE_END":6247,"MAP_MARINE_CAVE_ENTRANCE":6246,"MAP_MAUVILLE_CITY":2,"MAP_MAUVILLE_CITY_BIKE_SHOP":2561,"MAP_MAUVILLE_CITY_GAME_CORNER":2563,"MAP_MAUVILLE_CITY_GYM":2560,"MAP_MAUVILLE_CITY_HOUSE1":2562,"MAP_MAUVILLE_CITY_HOUSE2":2564,"MAP_MAUVILLE_CITY_MART":2567,"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":2565,"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":2566,"MAP_METEOR_FALLS_1F_1R":6144,"MAP_METEOR_FALLS_1F_2R":6145,"MAP_METEOR_FALLS_B1F_1R":6146,"MAP_METEOR_FALLS_B1F_2R":6147,"MAP_METEOR_FALLS_STEVENS_CAVE":6251,"MAP_MIRAGE_TOWER_1F":6238,"MAP_MIRAGE_TOWER_2F":6239,"MAP_MIRAGE_TOWER_3F":6240,"MAP_MIRAGE_TOWER_4F":6241,"MAP_MOSSDEEP_CITY":6,"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":3595,"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":3596,"MAP_MOSSDEEP_CITY_GYM":3584,"MAP_MOSSDEEP_CITY_HOUSE1":3585,"MAP_MOSSDEEP_CITY_HOUSE2":3586,"MAP_MOSSDEEP_CITY_HOUSE3":3590,"MAP_MOSSDEEP_CITY_HOUSE4":3592,"MAP_MOSSDEEP_CITY_MART":3589,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":3587,"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":3588,"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":3593,"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":3594,"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":3591,"MAP_MT_CHIMNEY":6156,"MAP_MT_CHIMNEY_CABLE_CAR_STATION":4865,"MAP_MT_PYRE_1F":6159,"MAP_MT_PYRE_2F":6160,"MAP_MT_PYRE_3F":6161,"MAP_MT_PYRE_4F":6162,"MAP_MT_PYRE_5F":6163,"MAP_MT_PYRE_6F":6164,"MAP_MT_PYRE_EXTERIOR":6165,"MAP_MT_PYRE_SUMMIT":6166,"MAP_NAVEL_ROCK_B1F":6725,"MAP_NAVEL_ROCK_BOTTOM":6743,"MAP_NAVEL_ROCK_DOWN01":6732,"MAP_NAVEL_ROCK_DOWN02":6733,"MAP_NAVEL_ROCK_DOWN03":6734,"MAP_NAVEL_ROCK_DOWN04":6735,"MAP_NAVEL_ROCK_DOWN05":6736,"MAP_NAVEL_ROCK_DOWN06":6737,"MAP_NAVEL_ROCK_DOWN07":6738,"MAP_NAVEL_ROCK_DOWN08":6739,"MAP_NAVEL_ROCK_DOWN09":6740,"MAP_NAVEL_ROCK_DOWN10":6741,"MAP_NAVEL_ROCK_DOWN11":6742,"MAP_NAVEL_ROCK_ENTRANCE":6724,"MAP_NAVEL_ROCK_EXTERIOR":6722,"MAP_NAVEL_ROCK_FORK":6726,"MAP_NAVEL_ROCK_HARBOR":6723,"MAP_NAVEL_ROCK_TOP":6731,"MAP_NAVEL_ROCK_UP1":6727,"MAP_NAVEL_ROCK_UP2":6728,"MAP_NAVEL_ROCK_UP3":6729,"MAP_NAVEL_ROCK_UP4":6730,"MAP_NEW_MAUVILLE_ENTRANCE":6196,"MAP_NEW_MAUVILLE_INSIDE":6197,"MAP_OLDALE_TOWN":10,"MAP_OLDALE_TOWN_HOUSE1":512,"MAP_OLDALE_TOWN_HOUSE2":513,"MAP_OLDALE_TOWN_MART":516,"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":514,"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":515,"MAP_PACIFIDLOG_TOWN":15,"MAP_PACIFIDLOG_TOWN_HOUSE1":1794,"MAP_PACIFIDLOG_TOWN_HOUSE2":1795,"MAP_PACIFIDLOG_TOWN_HOUSE3":1796,"MAP_PACIFIDLOG_TOWN_HOUSE4":1797,"MAP_PACIFIDLOG_TOWN_HOUSE5":1798,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":1792,"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":1793,"MAP_PETALBURG_CITY":0,"MAP_PETALBURG_CITY_GYM":2049,"MAP_PETALBURG_CITY_HOUSE1":2050,"MAP_PETALBURG_CITY_HOUSE2":2051,"MAP_PETALBURG_CITY_MART":2054,"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":2052,"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":2053,"MAP_PETALBURG_CITY_WALLYS_HOUSE":2048,"MAP_PETALBURG_WOODS":6155,"MAP_RECORD_CORNER":6426,"MAP_ROUTE101":16,"MAP_ROUTE102":17,"MAP_ROUTE103":18,"MAP_ROUTE104":19,"MAP_ROUTE104_MR_BRINEYS_HOUSE":4352,"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":4353,"MAP_ROUTE104_PROTOTYPE":6912,"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":6913,"MAP_ROUTE105":20,"MAP_ROUTE106":21,"MAP_ROUTE107":22,"MAP_ROUTE108":23,"MAP_ROUTE109":24,"MAP_ROUTE109_SEASHORE_HOUSE":7168,"MAP_ROUTE110":25,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":7435,"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":7436,"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":7426,"MAP_ROUTE110_TRICK_HOUSE_END":7425,"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":7424,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":7427,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":7428,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":7429,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":7430,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":7431,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":7432,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":7433,"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":7434,"MAP_ROUTE111":26,"MAP_ROUTE111_OLD_LADYS_REST_STOP":4609,"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":4608,"MAP_ROUTE112":27,"MAP_ROUTE112_CABLE_CAR_STATION":4864,"MAP_ROUTE113":28,"MAP_ROUTE113_GLASS_WORKSHOP":7680,"MAP_ROUTE114":29,"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":5120,"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":5121,"MAP_ROUTE114_LANETTES_HOUSE":5122,"MAP_ROUTE115":30,"MAP_ROUTE116":31,"MAP_ROUTE116_TUNNELERS_REST_HOUSE":5376,"MAP_ROUTE117":32,"MAP_ROUTE117_POKEMON_DAY_CARE":5632,"MAP_ROUTE118":33,"MAP_ROUTE119":34,"MAP_ROUTE119_HOUSE":8194,"MAP_ROUTE119_WEATHER_INSTITUTE_1F":8192,"MAP_ROUTE119_WEATHER_INSTITUTE_2F":8193,"MAP_ROUTE120":35,"MAP_ROUTE121":36,"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":5888,"MAP_ROUTE122":37,"MAP_ROUTE123":38,"MAP_ROUTE123_BERRY_MASTERS_HOUSE":7936,"MAP_ROUTE124":39,"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":8448,"MAP_ROUTE125":40,"MAP_ROUTE126":41,"MAP_ROUTE127":42,"MAP_ROUTE128":43,"MAP_ROUTE129":44,"MAP_ROUTE130":45,"MAP_ROUTE131":46,"MAP_ROUTE132":47,"MAP_ROUTE133":48,"MAP_ROUTE134":49,"MAP_RUSTBORO_CITY":3,"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":2827,"MAP_RUSTBORO_CITY_DEVON_CORP_1F":2816,"MAP_RUSTBORO_CITY_DEVON_CORP_2F":2817,"MAP_RUSTBORO_CITY_DEVON_CORP_3F":2818,"MAP_RUSTBORO_CITY_FLAT1_1F":2824,"MAP_RUSTBORO_CITY_FLAT1_2F":2825,"MAP_RUSTBORO_CITY_FLAT2_1F":2829,"MAP_RUSTBORO_CITY_FLAT2_2F":2830,"MAP_RUSTBORO_CITY_FLAT2_3F":2831,"MAP_RUSTBORO_CITY_GYM":2819,"MAP_RUSTBORO_CITY_HOUSE1":2826,"MAP_RUSTBORO_CITY_HOUSE2":2828,"MAP_RUSTBORO_CITY_HOUSE3":2832,"MAP_RUSTBORO_CITY_MART":2823,"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":2821,"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":2822,"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":2820,"MAP_RUSTURF_TUNNEL":6148,"MAP_SAFARI_ZONE_NORTH":6657,"MAP_SAFARI_ZONE_NORTHEAST":6668,"MAP_SAFARI_ZONE_NORTHWEST":6656,"MAP_SAFARI_ZONE_REST_HOUSE":6667,"MAP_SAFARI_ZONE_SOUTH":6659,"MAP_SAFARI_ZONE_SOUTHEAST":6669,"MAP_SAFARI_ZONE_SOUTHWEST":6658,"MAP_SCORCHED_SLAB":6217,"MAP_SEAFLOOR_CAVERN_ENTRANCE":6171,"MAP_SEAFLOOR_CAVERN_ROOM1":6172,"MAP_SEAFLOOR_CAVERN_ROOM2":6173,"MAP_SEAFLOOR_CAVERN_ROOM3":6174,"MAP_SEAFLOOR_CAVERN_ROOM4":6175,"MAP_SEAFLOOR_CAVERN_ROOM5":6176,"MAP_SEAFLOOR_CAVERN_ROOM6":6177,"MAP_SEAFLOOR_CAVERN_ROOM7":6178,"MAP_SEAFLOOR_CAVERN_ROOM8":6179,"MAP_SEAFLOOR_CAVERN_ROOM9":6180,"MAP_SEALED_CHAMBER_INNER_ROOM":6216,"MAP_SEALED_CHAMBER_OUTER_ROOM":6215,"MAP_SECRET_BASE_BLUE_CAVE1":6402,"MAP_SECRET_BASE_BLUE_CAVE2":6408,"MAP_SECRET_BASE_BLUE_CAVE3":6414,"MAP_SECRET_BASE_BLUE_CAVE4":6420,"MAP_SECRET_BASE_BROWN_CAVE1":6401,"MAP_SECRET_BASE_BROWN_CAVE2":6407,"MAP_SECRET_BASE_BROWN_CAVE3":6413,"MAP_SECRET_BASE_BROWN_CAVE4":6419,"MAP_SECRET_BASE_RED_CAVE1":6400,"MAP_SECRET_BASE_RED_CAVE2":6406,"MAP_SECRET_BASE_RED_CAVE3":6412,"MAP_SECRET_BASE_RED_CAVE4":6418,"MAP_SECRET_BASE_SHRUB1":6405,"MAP_SECRET_BASE_SHRUB2":6411,"MAP_SECRET_BASE_SHRUB3":6417,"MAP_SECRET_BASE_SHRUB4":6423,"MAP_SECRET_BASE_TREE1":6404,"MAP_SECRET_BASE_TREE2":6410,"MAP_SECRET_BASE_TREE3":6416,"MAP_SECRET_BASE_TREE4":6422,"MAP_SECRET_BASE_YELLOW_CAVE1":6403,"MAP_SECRET_BASE_YELLOW_CAVE2":6409,"MAP_SECRET_BASE_YELLOW_CAVE3":6415,"MAP_SECRET_BASE_YELLOW_CAVE4":6421,"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":6194,"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":6195,"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":6190,"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":6227,"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":6191,"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":6193,"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":6192,"MAP_SKY_PILLAR_1F":6223,"MAP_SKY_PILLAR_2F":6224,"MAP_SKY_PILLAR_3F":6225,"MAP_SKY_PILLAR_4F":6226,"MAP_SKY_PILLAR_5F":6228,"MAP_SKY_PILLAR_ENTRANCE":6221,"MAP_SKY_PILLAR_OUTSIDE":6222,"MAP_SKY_PILLAR_TOP":6229,"MAP_SLATEPORT_CITY":1,"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":2308,"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":2307,"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":2306,"MAP_SLATEPORT_CITY_HARBOR":2313,"MAP_SLATEPORT_CITY_HOUSE":2314,"MAP_SLATEPORT_CITY_MART":2317,"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":2309,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":2311,"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":2312,"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":2315,"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":2316,"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":2310,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":2304,"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":2305,"MAP_SOOTOPOLIS_CITY":7,"MAP_SOOTOPOLIS_CITY_GYM_1F":3840,"MAP_SOOTOPOLIS_CITY_GYM_B1F":3841,"MAP_SOOTOPOLIS_CITY_HOUSE1":3845,"MAP_SOOTOPOLIS_CITY_HOUSE2":3846,"MAP_SOOTOPOLIS_CITY_HOUSE3":3847,"MAP_SOOTOPOLIS_CITY_HOUSE4":3848,"MAP_SOOTOPOLIS_CITY_HOUSE5":3849,"MAP_SOOTOPOLIS_CITY_HOUSE6":3850,"MAP_SOOTOPOLIS_CITY_HOUSE7":3851,"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":3852,"MAP_SOOTOPOLIS_CITY_MART":3844,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":3853,"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":3854,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":3842,"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":3843,"MAP_SOUTHERN_ISLAND_EXTERIOR":6665,"MAP_SOUTHERN_ISLAND_INTERIOR":6666,"MAP_SS_TIDAL_CORRIDOR":6441,"MAP_SS_TIDAL_LOWER_DECK":6442,"MAP_SS_TIDAL_ROOMS":6443,"MAP_TERRA_CAVE_END":6249,"MAP_TERRA_CAVE_ENTRANCE":6248,"MAP_TRADE_CENTER":6425,"MAP_TRAINER_HILL_1F":6717,"MAP_TRAINER_HILL_2F":6718,"MAP_TRAINER_HILL_3F":6719,"MAP_TRAINER_HILL_4F":6720,"MAP_TRAINER_HILL_ELEVATOR":6744,"MAP_TRAINER_HILL_ENTRANCE":6716,"MAP_TRAINER_HILL_ROOF":6721,"MAP_UNDERWATER_MARINE_CAVE":6245,"MAP_UNDERWATER_ROUTE105":55,"MAP_UNDERWATER_ROUTE124":50,"MAP_UNDERWATER_ROUTE125":56,"MAP_UNDERWATER_ROUTE126":51,"MAP_UNDERWATER_ROUTE127":52,"MAP_UNDERWATER_ROUTE128":53,"MAP_UNDERWATER_ROUTE129":54,"MAP_UNDERWATER_ROUTE134":6213,"MAP_UNDERWATER_SEAFLOOR_CAVERN":6170,"MAP_UNDERWATER_SEALED_CHAMBER":6214,"MAP_UNDERWATER_SOOTOPOLIS_CITY":6149,"MAP_UNION_ROOM":6460,"MAP_UNUSED_CONTEST_HALL1":6429,"MAP_UNUSED_CONTEST_HALL2":6430,"MAP_UNUSED_CONTEST_HALL3":6431,"MAP_UNUSED_CONTEST_HALL4":6432,"MAP_UNUSED_CONTEST_HALL5":6433,"MAP_UNUSED_CONTEST_HALL6":6434,"MAP_VERDANTURF_TOWN":14,"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":1538,"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":1537,"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":1536,"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":1543,"MAP_VERDANTURF_TOWN_HOUSE":1544,"MAP_VERDANTURF_TOWN_MART":1539,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":1540,"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":1541,"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":1542,"MAP_VICTORY_ROAD_1F":6187,"MAP_VICTORY_ROAD_B1F":6188,"MAP_VICTORY_ROAD_B2F":6189,"MAX_BAG_ITEM_CAPACITY":99,"MAX_BERRY_CAPACITY":999,"MAX_BERRY_INDEX":178,"MAX_ITEM_DIGITS":3,"MAX_PC_ITEM_CAPACITY":999,"MAX_TRAINERS_COUNT":864,"MOVES_COUNT":355,"MOVE_ABSORB":71,"MOVE_ACID":51,"MOVE_ACID_ARMOR":151,"MOVE_AERIAL_ACE":332,"MOVE_AEROBLAST":177,"MOVE_AGILITY":97,"MOVE_AIR_CUTTER":314,"MOVE_AMNESIA":133,"MOVE_ANCIENT_POWER":246,"MOVE_ARM_THRUST":292,"MOVE_AROMATHERAPY":312,"MOVE_ASSIST":274,"MOVE_ASTONISH":310,"MOVE_ATTRACT":213,"MOVE_AURORA_BEAM":62,"MOVE_BARRAGE":140,"MOVE_BARRIER":112,"MOVE_BATON_PASS":226,"MOVE_BEAT_UP":251,"MOVE_BELLY_DRUM":187,"MOVE_BIDE":117,"MOVE_BIND":20,"MOVE_BITE":44,"MOVE_BLAST_BURN":307,"MOVE_BLAZE_KICK":299,"MOVE_BLIZZARD":59,"MOVE_BLOCK":335,"MOVE_BODY_SLAM":34,"MOVE_BONEMERANG":155,"MOVE_BONE_CLUB":125,"MOVE_BONE_RUSH":198,"MOVE_BOUNCE":340,"MOVE_BRICK_BREAK":280,"MOVE_BUBBLE":145,"MOVE_BUBBLE_BEAM":61,"MOVE_BULK_UP":339,"MOVE_BULLET_SEED":331,"MOVE_CALM_MIND":347,"MOVE_CAMOUFLAGE":293,"MOVE_CHARGE":268,"MOVE_CHARM":204,"MOVE_CLAMP":128,"MOVE_COMET_PUNCH":4,"MOVE_CONFUSE_RAY":109,"MOVE_CONFUSION":93,"MOVE_CONSTRICT":132,"MOVE_CONVERSION":160,"MOVE_CONVERSION_2":176,"MOVE_COSMIC_POWER":322,"MOVE_COTTON_SPORE":178,"MOVE_COUNTER":68,"MOVE_COVET":343,"MOVE_CRABHAMMER":152,"MOVE_CROSS_CHOP":238,"MOVE_CRUNCH":242,"MOVE_CRUSH_CLAW":306,"MOVE_CURSE":174,"MOVE_CUT":15,"MOVE_DEFENSE_CURL":111,"MOVE_DESTINY_BOND":194,"MOVE_DETECT":197,"MOVE_DIG":91,"MOVE_DISABLE":50,"MOVE_DIVE":291,"MOVE_DIZZY_PUNCH":146,"MOVE_DOOM_DESIRE":353,"MOVE_DOUBLE_EDGE":38,"MOVE_DOUBLE_KICK":24,"MOVE_DOUBLE_SLAP":3,"MOVE_DOUBLE_TEAM":104,"MOVE_DRAGON_BREATH":225,"MOVE_DRAGON_CLAW":337,"MOVE_DRAGON_DANCE":349,"MOVE_DRAGON_RAGE":82,"MOVE_DREAM_EATER":138,"MOVE_DRILL_PECK":65,"MOVE_DYNAMIC_PUNCH":223,"MOVE_EARTHQUAKE":89,"MOVE_EGG_BOMB":121,"MOVE_EMBER":52,"MOVE_ENCORE":227,"MOVE_ENDEAVOR":283,"MOVE_ENDURE":203,"MOVE_ERUPTION":284,"MOVE_EXPLOSION":153,"MOVE_EXTRASENSORY":326,"MOVE_EXTREME_SPEED":245,"MOVE_FACADE":263,"MOVE_FAINT_ATTACK":185,"MOVE_FAKE_OUT":252,"MOVE_FAKE_TEARS":313,"MOVE_FALSE_SWIPE":206,"MOVE_FEATHER_DANCE":297,"MOVE_FIRE_BLAST":126,"MOVE_FIRE_PUNCH":7,"MOVE_FIRE_SPIN":83,"MOVE_FISSURE":90,"MOVE_FLAIL":175,"MOVE_FLAMETHROWER":53,"MOVE_FLAME_WHEEL":172,"MOVE_FLASH":148,"MOVE_FLATTER":260,"MOVE_FLY":19,"MOVE_FOCUS_ENERGY":116,"MOVE_FOCUS_PUNCH":264,"MOVE_FOLLOW_ME":266,"MOVE_FORESIGHT":193,"MOVE_FRENZY_PLANT":338,"MOVE_FRUSTRATION":218,"MOVE_FURY_ATTACK":31,"MOVE_FURY_CUTTER":210,"MOVE_FURY_SWIPES":154,"MOVE_FUTURE_SIGHT":248,"MOVE_GIGA_DRAIN":202,"MOVE_GLARE":137,"MOVE_GRASS_WHISTLE":320,"MOVE_GROWL":45,"MOVE_GROWTH":74,"MOVE_GRUDGE":288,"MOVE_GUILLOTINE":12,"MOVE_GUST":16,"MOVE_HAIL":258,"MOVE_HARDEN":106,"MOVE_HAZE":114,"MOVE_HEADBUTT":29,"MOVE_HEAL_BELL":215,"MOVE_HEAT_WAVE":257,"MOVE_HELPING_HAND":270,"MOVE_HIDDEN_POWER":237,"MOVE_HI_JUMP_KICK":136,"MOVE_HORN_ATTACK":30,"MOVE_HORN_DRILL":32,"MOVE_HOWL":336,"MOVE_HYDRO_CANNON":308,"MOVE_HYDRO_PUMP":56,"MOVE_HYPER_BEAM":63,"MOVE_HYPER_FANG":158,"MOVE_HYPER_VOICE":304,"MOVE_HYPNOSIS":95,"MOVE_ICE_BALL":301,"MOVE_ICE_BEAM":58,"MOVE_ICE_PUNCH":8,"MOVE_ICICLE_SPEAR":333,"MOVE_ICY_WIND":196,"MOVE_IMPRISON":286,"MOVE_INGRAIN":275,"MOVE_IRON_DEFENSE":334,"MOVE_IRON_TAIL":231,"MOVE_JUMP_KICK":26,"MOVE_KARATE_CHOP":2,"MOVE_KINESIS":134,"MOVE_KNOCK_OFF":282,"MOVE_LEAF_BLADE":348,"MOVE_LEECH_LIFE":141,"MOVE_LEECH_SEED":73,"MOVE_LEER":43,"MOVE_LICK":122,"MOVE_LIGHT_SCREEN":113,"MOVE_LOCK_ON":199,"MOVE_LOVELY_KISS":142,"MOVE_LOW_KICK":67,"MOVE_LUSTER_PURGE":295,"MOVE_MACH_PUNCH":183,"MOVE_MAGICAL_LEAF":345,"MOVE_MAGIC_COAT":277,"MOVE_MAGNITUDE":222,"MOVE_MEAN_LOOK":212,"MOVE_MEDITATE":96,"MOVE_MEGAHORN":224,"MOVE_MEGA_DRAIN":72,"MOVE_MEGA_KICK":25,"MOVE_MEGA_PUNCH":5,"MOVE_MEMENTO":262,"MOVE_METAL_CLAW":232,"MOVE_METAL_SOUND":319,"MOVE_METEOR_MASH":309,"MOVE_METRONOME":118,"MOVE_MILK_DRINK":208,"MOVE_MIMIC":102,"MOVE_MIND_READER":170,"MOVE_MINIMIZE":107,"MOVE_MIRROR_COAT":243,"MOVE_MIRROR_MOVE":119,"MOVE_MIST":54,"MOVE_MIST_BALL":296,"MOVE_MOONLIGHT":236,"MOVE_MORNING_SUN":234,"MOVE_MUDDY_WATER":330,"MOVE_MUD_SHOT":341,"MOVE_MUD_SLAP":189,"MOVE_MUD_SPORT":300,"MOVE_NATURE_POWER":267,"MOVE_NEEDLE_ARM":302,"MOVE_NIGHTMARE":171,"MOVE_NIGHT_SHADE":101,"MOVE_NONE":0,"MOVE_OCTAZOOKA":190,"MOVE_ODOR_SLEUTH":316,"MOVE_OUTRAGE":200,"MOVE_OVERHEAT":315,"MOVE_PAIN_SPLIT":220,"MOVE_PAY_DAY":6,"MOVE_PECK":64,"MOVE_PERISH_SONG":195,"MOVE_PETAL_DANCE":80,"MOVE_PIN_MISSILE":42,"MOVE_POISON_FANG":305,"MOVE_POISON_GAS":139,"MOVE_POISON_POWDER":77,"MOVE_POISON_STING":40,"MOVE_POISON_TAIL":342,"MOVE_POUND":1,"MOVE_POWDER_SNOW":181,"MOVE_PRESENT":217,"MOVE_PROTECT":182,"MOVE_PSYBEAM":60,"MOVE_PSYCHIC":94,"MOVE_PSYCHO_BOOST":354,"MOVE_PSYCH_UP":244,"MOVE_PSYWAVE":149,"MOVE_PURSUIT":228,"MOVE_QUICK_ATTACK":98,"MOVE_RAGE":99,"MOVE_RAIN_DANCE":240,"MOVE_RAPID_SPIN":229,"MOVE_RAZOR_LEAF":75,"MOVE_RAZOR_WIND":13,"MOVE_RECOVER":105,"MOVE_RECYCLE":278,"MOVE_REFLECT":115,"MOVE_REFRESH":287,"MOVE_REST":156,"MOVE_RETURN":216,"MOVE_REVENGE":279,"MOVE_REVERSAL":179,"MOVE_ROAR":46,"MOVE_ROCK_BLAST":350,"MOVE_ROCK_SLIDE":157,"MOVE_ROCK_SMASH":249,"MOVE_ROCK_THROW":88,"MOVE_ROCK_TOMB":317,"MOVE_ROLE_PLAY":272,"MOVE_ROLLING_KICK":27,"MOVE_ROLLOUT":205,"MOVE_SACRED_FIRE":221,"MOVE_SAFEGUARD":219,"MOVE_SANDSTORM":201,"MOVE_SAND_ATTACK":28,"MOVE_SAND_TOMB":328,"MOVE_SCARY_FACE":184,"MOVE_SCRATCH":10,"MOVE_SCREECH":103,"MOVE_SECRET_POWER":290,"MOVE_SEISMIC_TOSS":69,"MOVE_SELF_DESTRUCT":120,"MOVE_SHADOW_BALL":247,"MOVE_SHADOW_PUNCH":325,"MOVE_SHARPEN":159,"MOVE_SHEER_COLD":329,"MOVE_SHOCK_WAVE":351,"MOVE_SIGNAL_BEAM":324,"MOVE_SILVER_WIND":318,"MOVE_SING":47,"MOVE_SKETCH":166,"MOVE_SKILL_SWAP":285,"MOVE_SKULL_BASH":130,"MOVE_SKY_ATTACK":143,"MOVE_SKY_UPPERCUT":327,"MOVE_SLACK_OFF":303,"MOVE_SLAM":21,"MOVE_SLASH":163,"MOVE_SLEEP_POWDER":79,"MOVE_SLEEP_TALK":214,"MOVE_SLUDGE":124,"MOVE_SLUDGE_BOMB":188,"MOVE_SMELLING_SALT":265,"MOVE_SMOG":123,"MOVE_SMOKESCREEN":108,"MOVE_SNATCH":289,"MOVE_SNORE":173,"MOVE_SOFT_BOILED":135,"MOVE_SOLAR_BEAM":76,"MOVE_SONIC_BOOM":49,"MOVE_SPARK":209,"MOVE_SPIDER_WEB":169,"MOVE_SPIKES":191,"MOVE_SPIKE_CANNON":131,"MOVE_SPITE":180,"MOVE_SPIT_UP":255,"MOVE_SPLASH":150,"MOVE_SPORE":147,"MOVE_STEEL_WING":211,"MOVE_STOCKPILE":254,"MOVE_STOMP":23,"MOVE_STRENGTH":70,"MOVE_STRING_SHOT":81,"MOVE_STRUGGLE":165,"MOVE_STUN_SPORE":78,"MOVE_SUBMISSION":66,"MOVE_SUBSTITUTE":164,"MOVE_SUNNY_DAY":241,"MOVE_SUPERPOWER":276,"MOVE_SUPERSONIC":48,"MOVE_SUPER_FANG":162,"MOVE_SURF":57,"MOVE_SWAGGER":207,"MOVE_SWALLOW":256,"MOVE_SWEET_KISS":186,"MOVE_SWEET_SCENT":230,"MOVE_SWIFT":129,"MOVE_SWORDS_DANCE":14,"MOVE_SYNTHESIS":235,"MOVE_TACKLE":33,"MOVE_TAIL_GLOW":294,"MOVE_TAIL_WHIP":39,"MOVE_TAKE_DOWN":36,"MOVE_TAUNT":269,"MOVE_TEETER_DANCE":298,"MOVE_TELEPORT":100,"MOVE_THIEF":168,"MOVE_THRASH":37,"MOVE_THUNDER":87,"MOVE_THUNDERBOLT":85,"MOVE_THUNDER_PUNCH":9,"MOVE_THUNDER_SHOCK":84,"MOVE_THUNDER_WAVE":86,"MOVE_TICKLE":321,"MOVE_TORMENT":259,"MOVE_TOXIC":92,"MOVE_TRANSFORM":144,"MOVE_TRICK":271,"MOVE_TRIPLE_KICK":167,"MOVE_TRI_ATTACK":161,"MOVE_TWINEEDLE":41,"MOVE_TWISTER":239,"MOVE_UNAVAILABLE":65535,"MOVE_UPROAR":253,"MOVE_VICE_GRIP":11,"MOVE_VINE_WHIP":22,"MOVE_VITAL_THROW":233,"MOVE_VOLT_TACKLE":344,"MOVE_WATERFALL":127,"MOVE_WATER_GUN":55,"MOVE_WATER_PULSE":352,"MOVE_WATER_SPORT":346,"MOVE_WATER_SPOUT":323,"MOVE_WEATHER_BALL":311,"MOVE_WHIRLPOOL":250,"MOVE_WHIRLWIND":18,"MOVE_WILL_O_WISP":261,"MOVE_WING_ATTACK":17,"MOVE_WISH":273,"MOVE_WITHDRAW":110,"MOVE_WRAP":35,"MOVE_YAWN":281,"MOVE_ZAP_CANNON":192,"MUS_ABANDONED_SHIP":381,"MUS_ABNORMAL_WEATHER":443,"MUS_AQUA_MAGMA_HIDEOUT":430,"MUS_AWAKEN_LEGEND":388,"MUS_BIRCH_LAB":383,"MUS_B_ARENA":458,"MUS_B_DOME":467,"MUS_B_DOME_LOBBY":473,"MUS_B_FACTORY":469,"MUS_B_FRONTIER":457,"MUS_B_PALACE":463,"MUS_B_PIKE":468,"MUS_B_PYRAMID":461,"MUS_B_PYRAMID_TOP":462,"MUS_B_TOWER":465,"MUS_B_TOWER_RS":384,"MUS_CABLE_CAR":425,"MUS_CAUGHT":352,"MUS_CAVE_OF_ORIGIN":386,"MUS_CONTEST":440,"MUS_CONTEST_LOBBY":452,"MUS_CONTEST_RESULTS":446,"MUS_CONTEST_WINNER":439,"MUS_CREDITS":455,"MUS_CYCLING":403,"MUS_C_COMM_CENTER":356,"MUS_C_VS_LEGEND_BEAST":358,"MUS_DESERT":409,"MUS_DEWFORD":427,"MUS_DUMMY":0,"MUS_ENCOUNTER_AQUA":419,"MUS_ENCOUNTER_BRENDAN":421,"MUS_ENCOUNTER_CHAMPION":454,"MUS_ENCOUNTER_COOL":417,"MUS_ENCOUNTER_ELITE_FOUR":450,"MUS_ENCOUNTER_FEMALE":407,"MUS_ENCOUNTER_GIRL":379,"MUS_ENCOUNTER_HIKER":451,"MUS_ENCOUNTER_INTENSE":416,"MUS_ENCOUNTER_INTERVIEWER":453,"MUS_ENCOUNTER_MAGMA":441,"MUS_ENCOUNTER_MALE":380,"MUS_ENCOUNTER_MAY":415,"MUS_ENCOUNTER_RICH":397,"MUS_ENCOUNTER_SUSPICIOUS":423,"MUS_ENCOUNTER_SWIMMER":385,"MUS_ENCOUNTER_TWINS":449,"MUS_END":456,"MUS_EVER_GRANDE":422,"MUS_EVOLUTION":377,"MUS_EVOLUTION_INTRO":376,"MUS_EVOLVED":371,"MUS_FALLARBOR":437,"MUS_FOLLOW_ME":420,"MUS_FORTREE":382,"MUS_GAME_CORNER":426,"MUS_GSC_PEWTER":357,"MUS_GSC_ROUTE38":351,"MUS_GYM":364,"MUS_HALL_OF_FAME":436,"MUS_HALL_OF_FAME_ROOM":447,"MUS_HEAL":368,"MUS_HELP":410,"MUS_INTRO":414,"MUS_INTRO_BATTLE":442,"MUS_LEVEL_UP":367,"MUS_LILYCOVE":408,"MUS_LILYCOVE_MUSEUM":373,"MUS_LINK_CONTEST_P1":393,"MUS_LINK_CONTEST_P2":394,"MUS_LINK_CONTEST_P3":395,"MUS_LINK_CONTEST_P4":396,"MUS_LITTLEROOT":405,"MUS_LITTLEROOT_TEST":350,"MUS_MOVE_DELETED":378,"MUS_MT_CHIMNEY":406,"MUS_MT_PYRE":432,"MUS_MT_PYRE_EXTERIOR":434,"MUS_NONE":65535,"MUS_OBTAIN_BADGE":369,"MUS_OBTAIN_BERRY":387,"MUS_OBTAIN_B_POINTS":459,"MUS_OBTAIN_ITEM":370,"MUS_OBTAIN_SYMBOL":466,"MUS_OBTAIN_TMHM":372,"MUS_OCEANIC_MUSEUM":375,"MUS_OLDALE":363,"MUS_PETALBURG":362,"MUS_PETALBURG_WOODS":366,"MUS_POKE_CENTER":400,"MUS_POKE_MART":404,"MUS_RAYQUAZA_APPEARS":464,"MUS_REGISTER_MATCH_CALL":460,"MUS_RG_BERRY_PICK":542,"MUS_RG_CAUGHT":534,"MUS_RG_CAUGHT_INTRO":531,"MUS_RG_CELADON":521,"MUS_RG_CINNABAR":491,"MUS_RG_CREDITS":502,"MUS_RG_CYCLING":494,"MUS_RG_DEX_RATING":529,"MUS_RG_ENCOUNTER_BOY":497,"MUS_RG_ENCOUNTER_DEOXYS":555,"MUS_RG_ENCOUNTER_GIRL":496,"MUS_RG_ENCOUNTER_GYM_LEADER":554,"MUS_RG_ENCOUNTER_RIVAL":527,"MUS_RG_ENCOUNTER_ROCKET":495,"MUS_RG_FOLLOW_ME":484,"MUS_RG_FUCHSIA":520,"MUS_RG_GAME_CORNER":485,"MUS_RG_GAME_FREAK":533,"MUS_RG_GYM":487,"MUS_RG_HALL_OF_FAME":498,"MUS_RG_HEAL":493,"MUS_RG_INTRO_FIGHT":489,"MUS_RG_JIGGLYPUFF":488,"MUS_RG_LAVENDER":492,"MUS_RG_MT_MOON":500,"MUS_RG_MYSTERY_GIFT":541,"MUS_RG_NET_CENTER":540,"MUS_RG_NEW_GAME_EXIT":537,"MUS_RG_NEW_GAME_INSTRUCT":535,"MUS_RG_NEW_GAME_INTRO":536,"MUS_RG_OAK":514,"MUS_RG_OAK_LAB":513,"MUS_RG_OBTAIN_KEY_ITEM":530,"MUS_RG_PALLET":512,"MUS_RG_PEWTER":526,"MUS_RG_PHOTO":532,"MUS_RG_POKE_CENTER":515,"MUS_RG_POKE_FLUTE":550,"MUS_RG_POKE_JUMP":538,"MUS_RG_POKE_MANSION":501,"MUS_RG_POKE_TOWER":518,"MUS_RG_RIVAL_EXIT":528,"MUS_RG_ROCKET_HIDEOUT":486,"MUS_RG_ROUTE1":503,"MUS_RG_ROUTE11":506,"MUS_RG_ROUTE24":504,"MUS_RG_ROUTE3":505,"MUS_RG_SEVII_123":547,"MUS_RG_SEVII_45":548,"MUS_RG_SEVII_67":549,"MUS_RG_SEVII_CAVE":543,"MUS_RG_SEVII_DUNGEON":546,"MUS_RG_SEVII_ROUTE":545,"MUS_RG_SILPH":519,"MUS_RG_SLOW_PALLET":557,"MUS_RG_SS_ANNE":516,"MUS_RG_SURF":517,"MUS_RG_TEACHY_TV_MENU":558,"MUS_RG_TEACHY_TV_SHOW":544,"MUS_RG_TITLE":490,"MUS_RG_TRAINER_TOWER":556,"MUS_RG_UNION_ROOM":539,"MUS_RG_VERMILLION":525,"MUS_RG_VICTORY_GYM_LEADER":524,"MUS_RG_VICTORY_ROAD":507,"MUS_RG_VICTORY_TRAINER":522,"MUS_RG_VICTORY_WILD":523,"MUS_RG_VIRIDIAN_FOREST":499,"MUS_RG_VS_CHAMPION":511,"MUS_RG_VS_DEOXYS":551,"MUS_RG_VS_GYM_LEADER":508,"MUS_RG_VS_LEGEND":553,"MUS_RG_VS_MEWTWO":552,"MUS_RG_VS_TRAINER":509,"MUS_RG_VS_WILD":510,"MUS_ROULETTE":392,"MUS_ROUTE101":359,"MUS_ROUTE104":401,"MUS_ROUTE110":360,"MUS_ROUTE113":418,"MUS_ROUTE118":32767,"MUS_ROUTE119":402,"MUS_ROUTE120":361,"MUS_ROUTE122":374,"MUS_RUSTBORO":399,"MUS_SAFARI_ZONE":428,"MUS_SAILING":431,"MUS_SCHOOL":435,"MUS_SEALED_CHAMBER":438,"MUS_SLATEPORT":433,"MUS_SLOTS_JACKPOT":389,"MUS_SLOTS_WIN":390,"MUS_SOOTOPOLIS":445,"MUS_SURF":365,"MUS_TITLE":413,"MUS_TOO_BAD":391,"MUS_TRICK_HOUSE":448,"MUS_UNDERWATER":411,"MUS_VERDANTURF":398,"MUS_VICTORY_AQUA_MAGMA":424,"MUS_VICTORY_GYM_LEADER":354,"MUS_VICTORY_LEAGUE":355,"MUS_VICTORY_ROAD":429,"MUS_VICTORY_TRAINER":412,"MUS_VICTORY_WILD":353,"MUS_VS_AQUA_MAGMA":475,"MUS_VS_AQUA_MAGMA_LEADER":483,"MUS_VS_CHAMPION":478,"MUS_VS_ELITE_FOUR":482,"MUS_VS_FRONTIER_BRAIN":471,"MUS_VS_GYM_LEADER":477,"MUS_VS_KYOGRE_GROUDON":480,"MUS_VS_MEW":472,"MUS_VS_RAYQUAZA":470,"MUS_VS_REGI":479,"MUS_VS_RIVAL":481,"MUS_VS_TRAINER":476,"MUS_VS_WILD":474,"MUS_WEATHER_GROUDON":444,"NUM_BADGES":8,"NUM_BERRY_MASTER_BERRIES":10,"NUM_BERRY_MASTER_BERRIES_SKIPPED":20,"NUM_BERRY_MASTER_WIFE_BERRIES":10,"NUM_DAILY_FLAGS":64,"NUM_HIDDEN_MACHINES":8,"NUM_KIRI_BERRIES":10,"NUM_KIRI_BERRIES_SKIPPED":20,"NUM_ROUTE_114_MAN_BERRIES":5,"NUM_ROUTE_114_MAN_BERRIES_SKIPPED":15,"NUM_SPECIAL_FLAGS":128,"NUM_SPECIES":412,"NUM_TECHNICAL_MACHINES":50,"NUM_TEMP_FLAGS":32,"NUM_WATER_STAGES":4,"NUM_WONDER_CARD_FLAGS":20,"OLD_ROD":0,"PH_CHOICE_BLEND":589,"PH_CHOICE_HELD":590,"PH_CHOICE_SOLO":591,"PH_CLOTH_BLEND":565,"PH_CLOTH_HELD":566,"PH_CLOTH_SOLO":567,"PH_CURE_BLEND":604,"PH_CURE_HELD":605,"PH_CURE_SOLO":606,"PH_DRESS_BLEND":568,"PH_DRESS_HELD":569,"PH_DRESS_SOLO":570,"PH_FACE_BLEND":562,"PH_FACE_HELD":563,"PH_FACE_SOLO":564,"PH_FLEECE_BLEND":571,"PH_FLEECE_HELD":572,"PH_FLEECE_SOLO":573,"PH_FOOT_BLEND":595,"PH_FOOT_HELD":596,"PH_FOOT_SOLO":597,"PH_GOAT_BLEND":583,"PH_GOAT_HELD":584,"PH_GOAT_SOLO":585,"PH_GOOSE_BLEND":598,"PH_GOOSE_HELD":599,"PH_GOOSE_SOLO":600,"PH_KIT_BLEND":574,"PH_KIT_HELD":575,"PH_KIT_SOLO":576,"PH_LOT_BLEND":580,"PH_LOT_HELD":581,"PH_LOT_SOLO":582,"PH_MOUTH_BLEND":592,"PH_MOUTH_HELD":593,"PH_MOUTH_SOLO":594,"PH_NURSE_BLEND":607,"PH_NURSE_HELD":608,"PH_NURSE_SOLO":609,"PH_PRICE_BLEND":577,"PH_PRICE_HELD":578,"PH_PRICE_SOLO":579,"PH_STRUT_BLEND":601,"PH_STRUT_HELD":602,"PH_STRUT_SOLO":603,"PH_THOUGHT_BLEND":586,"PH_THOUGHT_HELD":587,"PH_THOUGHT_SOLO":588,"PH_TRAP_BLEND":559,"PH_TRAP_HELD":560,"PH_TRAP_SOLO":561,"SE_A":25,"SE_APPLAUSE":105,"SE_ARENA_TIMEUP1":265,"SE_ARENA_TIMEUP2":266,"SE_BALL":23,"SE_BALLOON_BLUE":75,"SE_BALLOON_RED":74,"SE_BALLOON_YELLOW":76,"SE_BALL_BOUNCE_1":56,"SE_BALL_BOUNCE_2":57,"SE_BALL_BOUNCE_3":58,"SE_BALL_BOUNCE_4":59,"SE_BALL_OPEN":15,"SE_BALL_THROW":61,"SE_BALL_TRADE":60,"SE_BALL_TRAY_BALL":115,"SE_BALL_TRAY_ENTER":114,"SE_BALL_TRAY_EXIT":116,"SE_BANG":20,"SE_BERRY_BLENDER":53,"SE_BIKE_BELL":11,"SE_BIKE_HOP":34,"SE_BOO":22,"SE_BREAKABLE_DOOR":77,"SE_BRIDGE_WALK":71,"SE_CARD":54,"SE_CLICK":36,"SE_CONTEST_CONDITION_LOSE":38,"SE_CONTEST_CURTAIN_FALL":98,"SE_CONTEST_CURTAIN_RISE":97,"SE_CONTEST_HEART":96,"SE_CONTEST_ICON_CHANGE":99,"SE_CONTEST_ICON_CLEAR":100,"SE_CONTEST_MONS_TURN":101,"SE_CONTEST_PLACE":24,"SE_DEX_PAGE":109,"SE_DEX_SCROLL":108,"SE_DEX_SEARCH":112,"SE_DING_DONG":73,"SE_DOOR":8,"SE_DOWNPOUR":83,"SE_DOWNPOUR_STOP":84,"SE_E":28,"SE_EFFECTIVE":13,"SE_EGG_HATCH":113,"SE_ELEVATOR":89,"SE_ESCALATOR":80,"SE_EXIT":9,"SE_EXP":33,"SE_EXP_MAX":91,"SE_FAILURE":32,"SE_FAINT":16,"SE_FALL":43,"SE_FIELD_POISON":79,"SE_FLEE":17,"SE_FU_ZAKU":37,"SE_GLASS_FLUTE":117,"SE_I":26,"SE_ICE_BREAK":41,"SE_ICE_CRACK":42,"SE_ICE_STAIRS":40,"SE_INTRO_BLAST":103,"SE_ITEMFINDER":72,"SE_LAVARIDGE_FALL_WARP":39,"SE_LEDGE":10,"SE_LOW_HEALTH":90,"SE_MUD_BALL":78,"SE_MUGSHOT":104,"SE_M_ABSORB":180,"SE_M_ABSORB_2":179,"SE_M_ACID_ARMOR":218,"SE_M_ATTRACT":226,"SE_M_ATTRACT2":227,"SE_M_BARRIER":208,"SE_M_BATON_PASS":224,"SE_M_BELLY_DRUM":185,"SE_M_BIND":170,"SE_M_BITE":161,"SE_M_BLIZZARD":153,"SE_M_BLIZZARD2":154,"SE_M_BONEMERANG":187,"SE_M_BRICK_BREAK":198,"SE_M_BUBBLE":124,"SE_M_BUBBLE2":125,"SE_M_BUBBLE3":126,"SE_M_BUBBLE_BEAM":182,"SE_M_BUBBLE_BEAM2":183,"SE_M_CHARGE":213,"SE_M_CHARM":212,"SE_M_COMET_PUNCH":139,"SE_M_CONFUSE_RAY":196,"SE_M_COSMIC_POWER":243,"SE_M_CRABHAMMER":142,"SE_M_CUT":128,"SE_M_DETECT":209,"SE_M_DIG":175,"SE_M_DIVE":233,"SE_M_DIZZY_PUNCH":176,"SE_M_DOUBLE_SLAP":134,"SE_M_DOUBLE_TEAM":135,"SE_M_DRAGON_RAGE":171,"SE_M_EARTHQUAKE":234,"SE_M_EMBER":151,"SE_M_ENCORE":222,"SE_M_ENCORE2":223,"SE_M_EXPLOSION":178,"SE_M_FAINT_ATTACK":190,"SE_M_FIRE_PUNCH":147,"SE_M_FLAMETHROWER":146,"SE_M_FLAME_WHEEL":144,"SE_M_FLAME_WHEEL2":145,"SE_M_FLATTER":229,"SE_M_FLY":158,"SE_M_GIGA_DRAIN":199,"SE_M_GRASSWHISTLE":231,"SE_M_GUST":132,"SE_M_GUST2":133,"SE_M_HAIL":242,"SE_M_HARDEN":120,"SE_M_HAZE":246,"SE_M_HEADBUTT":162,"SE_M_HEAL_BELL":195,"SE_M_HEAT_WAVE":240,"SE_M_HORN_ATTACK":166,"SE_M_HYDRO_PUMP":164,"SE_M_HYPER_BEAM":215,"SE_M_HYPER_BEAM2":247,"SE_M_ICY_WIND":137,"SE_M_JUMP_KICK":143,"SE_M_LEER":192,"SE_M_LICK":188,"SE_M_LOCK_ON":210,"SE_M_MEGA_KICK":140,"SE_M_MEGA_KICK2":141,"SE_M_METRONOME":186,"SE_M_MILK_DRINK":225,"SE_M_MINIMIZE":204,"SE_M_MIST":168,"SE_M_MOONLIGHT":211,"SE_M_MORNING_SUN":228,"SE_M_NIGHTMARE":121,"SE_M_PAY_DAY":174,"SE_M_PERISH_SONG":173,"SE_M_PETAL_DANCE":202,"SE_M_POISON_POWDER":169,"SE_M_PSYBEAM":189,"SE_M_PSYBEAM2":200,"SE_M_RAIN_DANCE":127,"SE_M_RAZOR_WIND":136,"SE_M_RAZOR_WIND2":160,"SE_M_REFLECT":207,"SE_M_REVERSAL":217,"SE_M_ROCK_THROW":131,"SE_M_SACRED_FIRE":149,"SE_M_SACRED_FIRE2":150,"SE_M_SANDSTORM":219,"SE_M_SAND_ATTACK":159,"SE_M_SAND_TOMB":230,"SE_M_SCRATCH":155,"SE_M_SCREECH":181,"SE_M_SELF_DESTRUCT":177,"SE_M_SING":172,"SE_M_SKETCH":205,"SE_M_SKY_UPPERCUT":238,"SE_M_SNORE":197,"SE_M_SOLAR_BEAM":201,"SE_M_SPIT_UP":232,"SE_M_STAT_DECREASE":245,"SE_M_STAT_INCREASE":239,"SE_M_STRENGTH":214,"SE_M_STRING_SHOT":129,"SE_M_STRING_SHOT2":130,"SE_M_SUPERSONIC":184,"SE_M_SURF":163,"SE_M_SWAGGER":193,"SE_M_SWAGGER2":194,"SE_M_SWEET_SCENT":236,"SE_M_SWIFT":206,"SE_M_SWORDS_DANCE":191,"SE_M_TAIL_WHIP":167,"SE_M_TAKE_DOWN":152,"SE_M_TEETER_DANCE":244,"SE_M_TELEPORT":203,"SE_M_THUNDERBOLT":118,"SE_M_THUNDERBOLT2":119,"SE_M_THUNDER_WAVE":138,"SE_M_TOXIC":148,"SE_M_TRI_ATTACK":220,"SE_M_TRI_ATTACK2":221,"SE_M_TWISTER":235,"SE_M_UPROAR":241,"SE_M_VICEGRIP":156,"SE_M_VITAL_THROW":122,"SE_M_VITAL_THROW2":123,"SE_M_WATERFALL":216,"SE_M_WHIRLPOOL":165,"SE_M_WING_ATTACK":157,"SE_M_YAWN":237,"SE_N":30,"SE_NOTE_A":67,"SE_NOTE_B":68,"SE_NOTE_C":62,"SE_NOTE_C_HIGH":69,"SE_NOTE_D":63,"SE_NOTE_E":64,"SE_NOTE_F":65,"SE_NOTE_G":66,"SE_NOT_EFFECTIVE":12,"SE_O":29,"SE_ORB":107,"SE_PC_LOGIN":2,"SE_PC_OFF":3,"SE_PC_ON":4,"SE_PIKE_CURTAIN_CLOSE":267,"SE_PIKE_CURTAIN_OPEN":268,"SE_PIN":21,"SE_POKENAV_CALL":263,"SE_POKENAV_HANG_UP":264,"SE_POKENAV_OFF":111,"SE_POKENAV_ON":110,"SE_PUDDLE":70,"SE_RAIN":85,"SE_RAIN_STOP":86,"SE_REPEL":47,"SE_RG_BAG_CURSOR":252,"SE_RG_BAG_POCKET":253,"SE_RG_BALL_CLICK":254,"SE_RG_CARD_FLIP":249,"SE_RG_CARD_FLIPPING":250,"SE_RG_CARD_OPEN":251,"SE_RG_DEOXYS_MOVE":260,"SE_RG_DOOR":248,"SE_RG_HELP_CLOSE":258,"SE_RG_HELP_ERROR":259,"SE_RG_HELP_OPEN":257,"SE_RG_POKE_JUMP_FAILURE":262,"SE_RG_POKE_JUMP_SUCCESS":261,"SE_RG_SHOP":255,"SE_RG_SS_ANNE_HORN":256,"SE_ROTATING_GATE":48,"SE_ROULETTE_BALL":92,"SE_ROULETTE_BALL2":93,"SE_SAVE":55,"SE_SELECT":5,"SE_SHINY":102,"SE_SHIP":19,"SE_SHOP":95,"SE_SLIDING_DOOR":18,"SE_SUCCESS":31,"SE_SUDOWOODO_SHAKE":269,"SE_SUPER_EFFECTIVE":14,"SE_SWITCH":35,"SE_TAILLOW_WING_FLAP":94,"SE_THUNDER":87,"SE_THUNDER2":88,"SE_THUNDERSTORM":81,"SE_THUNDERSTORM_STOP":82,"SE_TRUCK_DOOR":52,"SE_TRUCK_MOVE":49,"SE_TRUCK_STOP":50,"SE_TRUCK_UNLOAD":51,"SE_U":27,"SE_UNLOCK":44,"SE_USE_ITEM":1,"SE_VEND":106,"SE_WALL_HIT":7,"SE_WARP_IN":45,"SE_WARP_OUT":46,"SE_WIN_OPEN":6,"SPECIAL_FLAGS_END":16511,"SPECIAL_FLAGS_START":16384,"SPECIES_ABRA":63,"SPECIES_ABSOL":376,"SPECIES_AERODACTYL":142,"SPECIES_AGGRON":384,"SPECIES_AIPOM":190,"SPECIES_ALAKAZAM":65,"SPECIES_ALTARIA":359,"SPECIES_AMPHAROS":181,"SPECIES_ANORITH":390,"SPECIES_ARBOK":24,"SPECIES_ARCANINE":59,"SPECIES_ARIADOS":168,"SPECIES_ARMALDO":391,"SPECIES_ARON":382,"SPECIES_ARTICUNO":144,"SPECIES_AZUMARILL":184,"SPECIES_AZURILL":350,"SPECIES_BAGON":395,"SPECIES_BALTOY":318,"SPECIES_BANETTE":378,"SPECIES_BARBOACH":323,"SPECIES_BAYLEEF":153,"SPECIES_BEAUTIFLY":292,"SPECIES_BEEDRILL":15,"SPECIES_BELDUM":398,"SPECIES_BELLOSSOM":182,"SPECIES_BELLSPROUT":69,"SPECIES_BLASTOISE":9,"SPECIES_BLAZIKEN":282,"SPECIES_BLISSEY":242,"SPECIES_BRELOOM":307,"SPECIES_BULBASAUR":1,"SPECIES_BUTTERFREE":12,"SPECIES_CACNEA":344,"SPECIES_CACTURNE":345,"SPECIES_CAMERUPT":340,"SPECIES_CARVANHA":330,"SPECIES_CASCOON":293,"SPECIES_CASTFORM":385,"SPECIES_CATERPIE":10,"SPECIES_CELEBI":251,"SPECIES_CHANSEY":113,"SPECIES_CHARIZARD":6,"SPECIES_CHARMANDER":4,"SPECIES_CHARMELEON":5,"SPECIES_CHIKORITA":152,"SPECIES_CHIMECHO":411,"SPECIES_CHINCHOU":170,"SPECIES_CLAMPERL":373,"SPECIES_CLAYDOL":319,"SPECIES_CLEFABLE":36,"SPECIES_CLEFAIRY":35,"SPECIES_CLEFFA":173,"SPECIES_CLOYSTER":91,"SPECIES_COMBUSKEN":281,"SPECIES_CORPHISH":326,"SPECIES_CORSOLA":222,"SPECIES_CRADILY":389,"SPECIES_CRAWDAUNT":327,"SPECIES_CROBAT":169,"SPECIES_CROCONAW":159,"SPECIES_CUBONE":104,"SPECIES_CYNDAQUIL":155,"SPECIES_DELCATTY":316,"SPECIES_DELIBIRD":225,"SPECIES_DEOXYS":410,"SPECIES_DEWGONG":87,"SPECIES_DIGLETT":50,"SPECIES_DITTO":132,"SPECIES_DODRIO":85,"SPECIES_DODUO":84,"SPECIES_DONPHAN":232,"SPECIES_DRAGONAIR":148,"SPECIES_DRAGONITE":149,"SPECIES_DRATINI":147,"SPECIES_DROWZEE":96,"SPECIES_DUGTRIO":51,"SPECIES_DUNSPARCE":206,"SPECIES_DUSCLOPS":362,"SPECIES_DUSKULL":361,"SPECIES_DUSTOX":294,"SPECIES_EEVEE":133,"SPECIES_EGG":412,"SPECIES_EKANS":23,"SPECIES_ELECTABUZZ":125,"SPECIES_ELECTRIKE":337,"SPECIES_ELECTRODE":101,"SPECIES_ELEKID":239,"SPECIES_ENTEI":244,"SPECIES_ESPEON":196,"SPECIES_EXEGGCUTE":102,"SPECIES_EXEGGUTOR":103,"SPECIES_EXPLOUD":372,"SPECIES_FARFETCHD":83,"SPECIES_FEAROW":22,"SPECIES_FEEBAS":328,"SPECIES_FERALIGATR":160,"SPECIES_FLAAFFY":180,"SPECIES_FLAREON":136,"SPECIES_FLYGON":334,"SPECIES_FORRETRESS":205,"SPECIES_FURRET":162,"SPECIES_GARDEVOIR":394,"SPECIES_GASTLY":92,"SPECIES_GENGAR":94,"SPECIES_GEODUDE":74,"SPECIES_GIRAFARIG":203,"SPECIES_GLALIE":347,"SPECIES_GLIGAR":207,"SPECIES_GLOOM":44,"SPECIES_GOLBAT":42,"SPECIES_GOLDEEN":118,"SPECIES_GOLDUCK":55,"SPECIES_GOLEM":76,"SPECIES_GOREBYSS":375,"SPECIES_GRANBULL":210,"SPECIES_GRAVELER":75,"SPECIES_GRIMER":88,"SPECIES_GROUDON":405,"SPECIES_GROVYLE":278,"SPECIES_GROWLITHE":58,"SPECIES_GRUMPIG":352,"SPECIES_GULPIN":367,"SPECIES_GYARADOS":130,"SPECIES_HARIYAMA":336,"SPECIES_HAUNTER":93,"SPECIES_HERACROSS":214,"SPECIES_HITMONCHAN":107,"SPECIES_HITMONLEE":106,"SPECIES_HITMONTOP":237,"SPECIES_HOOTHOOT":163,"SPECIES_HOPPIP":187,"SPECIES_HORSEA":116,"SPECIES_HOUNDOOM":229,"SPECIES_HOUNDOUR":228,"SPECIES_HO_OH":250,"SPECIES_HUNTAIL":374,"SPECIES_HYPNO":97,"SPECIES_IGGLYBUFF":174,"SPECIES_ILLUMISE":387,"SPECIES_IVYSAUR":2,"SPECIES_JIGGLYPUFF":39,"SPECIES_JIRACHI":409,"SPECIES_JOLTEON":135,"SPECIES_JUMPLUFF":189,"SPECIES_JYNX":124,"SPECIES_KABUTO":140,"SPECIES_KABUTOPS":141,"SPECIES_KADABRA":64,"SPECIES_KAKUNA":14,"SPECIES_KANGASKHAN":115,"SPECIES_KECLEON":317,"SPECIES_KINGDRA":230,"SPECIES_KINGLER":99,"SPECIES_KIRLIA":393,"SPECIES_KOFFING":109,"SPECIES_KRABBY":98,"SPECIES_KYOGRE":404,"SPECIES_LAIRON":383,"SPECIES_LANTURN":171,"SPECIES_LAPRAS":131,"SPECIES_LARVITAR":246,"SPECIES_LATIAS":407,"SPECIES_LATIOS":408,"SPECIES_LEDIAN":166,"SPECIES_LEDYBA":165,"SPECIES_LICKITUNG":108,"SPECIES_LILEEP":388,"SPECIES_LINOONE":289,"SPECIES_LOMBRE":296,"SPECIES_LOTAD":295,"SPECIES_LOUDRED":371,"SPECIES_LUDICOLO":297,"SPECIES_LUGIA":249,"SPECIES_LUNATONE":348,"SPECIES_LUVDISC":325,"SPECIES_MACHAMP":68,"SPECIES_MACHOKE":67,"SPECIES_MACHOP":66,"SPECIES_MAGBY":240,"SPECIES_MAGCARGO":219,"SPECIES_MAGIKARP":129,"SPECIES_MAGMAR":126,"SPECIES_MAGNEMITE":81,"SPECIES_MAGNETON":82,"SPECIES_MAKUHITA":335,"SPECIES_MANECTRIC":338,"SPECIES_MANKEY":56,"SPECIES_MANTINE":226,"SPECIES_MAREEP":179,"SPECIES_MARILL":183,"SPECIES_MAROWAK":105,"SPECIES_MARSHTOMP":284,"SPECIES_MASQUERAIN":312,"SPECIES_MAWILE":355,"SPECIES_MEDICHAM":357,"SPECIES_MEDITITE":356,"SPECIES_MEGANIUM":154,"SPECIES_MEOWTH":52,"SPECIES_METAGROSS":400,"SPECIES_METANG":399,"SPECIES_METAPOD":11,"SPECIES_MEW":151,"SPECIES_MEWTWO":150,"SPECIES_MIGHTYENA":287,"SPECIES_MILOTIC":329,"SPECIES_MILTANK":241,"SPECIES_MINUN":354,"SPECIES_MISDREAVUS":200,"SPECIES_MOLTRES":146,"SPECIES_MR_MIME":122,"SPECIES_MUDKIP":283,"SPECIES_MUK":89,"SPECIES_MURKROW":198,"SPECIES_NATU":177,"SPECIES_NIDOKING":34,"SPECIES_NIDOQUEEN":31,"SPECIES_NIDORAN_F":29,"SPECIES_NIDORAN_M":32,"SPECIES_NIDORINA":30,"SPECIES_NIDORINO":33,"SPECIES_NINCADA":301,"SPECIES_NINETALES":38,"SPECIES_NINJASK":302,"SPECIES_NOCTOWL":164,"SPECIES_NONE":0,"SPECIES_NOSEPASS":320,"SPECIES_NUMEL":339,"SPECIES_NUZLEAF":299,"SPECIES_OCTILLERY":224,"SPECIES_ODDISH":43,"SPECIES_OLD_UNOWN_B":252,"SPECIES_OLD_UNOWN_C":253,"SPECIES_OLD_UNOWN_D":254,"SPECIES_OLD_UNOWN_E":255,"SPECIES_OLD_UNOWN_F":256,"SPECIES_OLD_UNOWN_G":257,"SPECIES_OLD_UNOWN_H":258,"SPECIES_OLD_UNOWN_I":259,"SPECIES_OLD_UNOWN_J":260,"SPECIES_OLD_UNOWN_K":261,"SPECIES_OLD_UNOWN_L":262,"SPECIES_OLD_UNOWN_M":263,"SPECIES_OLD_UNOWN_N":264,"SPECIES_OLD_UNOWN_O":265,"SPECIES_OLD_UNOWN_P":266,"SPECIES_OLD_UNOWN_Q":267,"SPECIES_OLD_UNOWN_R":268,"SPECIES_OLD_UNOWN_S":269,"SPECIES_OLD_UNOWN_T":270,"SPECIES_OLD_UNOWN_U":271,"SPECIES_OLD_UNOWN_V":272,"SPECIES_OLD_UNOWN_W":273,"SPECIES_OLD_UNOWN_X":274,"SPECIES_OLD_UNOWN_Y":275,"SPECIES_OLD_UNOWN_Z":276,"SPECIES_OMANYTE":138,"SPECIES_OMASTAR":139,"SPECIES_ONIX":95,"SPECIES_PARAS":46,"SPECIES_PARASECT":47,"SPECIES_PELIPPER":310,"SPECIES_PERSIAN":53,"SPECIES_PHANPY":231,"SPECIES_PICHU":172,"SPECIES_PIDGEOT":18,"SPECIES_PIDGEOTTO":17,"SPECIES_PIDGEY":16,"SPECIES_PIKACHU":25,"SPECIES_PILOSWINE":221,"SPECIES_PINECO":204,"SPECIES_PINSIR":127,"SPECIES_PLUSLE":353,"SPECIES_POLITOED":186,"SPECIES_POLIWAG":60,"SPECIES_POLIWHIRL":61,"SPECIES_POLIWRATH":62,"SPECIES_PONYTA":77,"SPECIES_POOCHYENA":286,"SPECIES_PORYGON":137,"SPECIES_PORYGON2":233,"SPECIES_PRIMEAPE":57,"SPECIES_PSYDUCK":54,"SPECIES_PUPITAR":247,"SPECIES_QUAGSIRE":195,"SPECIES_QUILAVA":156,"SPECIES_QWILFISH":211,"SPECIES_RAICHU":26,"SPECIES_RAIKOU":243,"SPECIES_RALTS":392,"SPECIES_RAPIDASH":78,"SPECIES_RATICATE":20,"SPECIES_RATTATA":19,"SPECIES_RAYQUAZA":406,"SPECIES_REGICE":402,"SPECIES_REGIROCK":401,"SPECIES_REGISTEEL":403,"SPECIES_RELICANTH":381,"SPECIES_REMORAID":223,"SPECIES_RHYDON":112,"SPECIES_RHYHORN":111,"SPECIES_ROSELIA":363,"SPECIES_SABLEYE":322,"SPECIES_SALAMENCE":397,"SPECIES_SANDSHREW":27,"SPECIES_SANDSLASH":28,"SPECIES_SCEPTILE":279,"SPECIES_SCIZOR":212,"SPECIES_SCYTHER":123,"SPECIES_SEADRA":117,"SPECIES_SEAKING":119,"SPECIES_SEALEO":342,"SPECIES_SEEDOT":298,"SPECIES_SEEL":86,"SPECIES_SENTRET":161,"SPECIES_SEVIPER":379,"SPECIES_SHARPEDO":331,"SPECIES_SHEDINJA":303,"SPECIES_SHELGON":396,"SPECIES_SHELLDER":90,"SPECIES_SHIFTRY":300,"SPECIES_SHROOMISH":306,"SPECIES_SHUCKLE":213,"SPECIES_SHUPPET":377,"SPECIES_SILCOON":291,"SPECIES_SKARMORY":227,"SPECIES_SKIPLOOM":188,"SPECIES_SKITTY":315,"SPECIES_SLAKING":366,"SPECIES_SLAKOTH":364,"SPECIES_SLOWBRO":80,"SPECIES_SLOWKING":199,"SPECIES_SLOWPOKE":79,"SPECIES_SLUGMA":218,"SPECIES_SMEARGLE":235,"SPECIES_SMOOCHUM":238,"SPECIES_SNEASEL":215,"SPECIES_SNORLAX":143,"SPECIES_SNORUNT":346,"SPECIES_SNUBBULL":209,"SPECIES_SOLROCK":349,"SPECIES_SPEAROW":21,"SPECIES_SPHEAL":341,"SPECIES_SPINARAK":167,"SPECIES_SPINDA":308,"SPECIES_SPOINK":351,"SPECIES_SQUIRTLE":7,"SPECIES_STANTLER":234,"SPECIES_STARMIE":121,"SPECIES_STARYU":120,"SPECIES_STEELIX":208,"SPECIES_SUDOWOODO":185,"SPECIES_SUICUNE":245,"SPECIES_SUNFLORA":192,"SPECIES_SUNKERN":191,"SPECIES_SURSKIT":311,"SPECIES_SWABLU":358,"SPECIES_SWALOT":368,"SPECIES_SWAMPERT":285,"SPECIES_SWELLOW":305,"SPECIES_SWINUB":220,"SPECIES_TAILLOW":304,"SPECIES_TANGELA":114,"SPECIES_TAUROS":128,"SPECIES_TEDDIURSA":216,"SPECIES_TENTACOOL":72,"SPECIES_TENTACRUEL":73,"SPECIES_TOGEPI":175,"SPECIES_TOGETIC":176,"SPECIES_TORCHIC":280,"SPECIES_TORKOAL":321,"SPECIES_TOTODILE":158,"SPECIES_TRAPINCH":332,"SPECIES_TREECKO":277,"SPECIES_TROPIUS":369,"SPECIES_TYPHLOSION":157,"SPECIES_TYRANITAR":248,"SPECIES_TYROGUE":236,"SPECIES_UMBREON":197,"SPECIES_UNOWN":201,"SPECIES_UNOWN_B":413,"SPECIES_UNOWN_C":414,"SPECIES_UNOWN_D":415,"SPECIES_UNOWN_E":416,"SPECIES_UNOWN_EMARK":438,"SPECIES_UNOWN_F":417,"SPECIES_UNOWN_G":418,"SPECIES_UNOWN_H":419,"SPECIES_UNOWN_I":420,"SPECIES_UNOWN_J":421,"SPECIES_UNOWN_K":422,"SPECIES_UNOWN_L":423,"SPECIES_UNOWN_M":424,"SPECIES_UNOWN_N":425,"SPECIES_UNOWN_O":426,"SPECIES_UNOWN_P":427,"SPECIES_UNOWN_Q":428,"SPECIES_UNOWN_QMARK":439,"SPECIES_UNOWN_R":429,"SPECIES_UNOWN_S":430,"SPECIES_UNOWN_T":431,"SPECIES_UNOWN_U":432,"SPECIES_UNOWN_V":433,"SPECIES_UNOWN_W":434,"SPECIES_UNOWN_X":435,"SPECIES_UNOWN_Y":436,"SPECIES_UNOWN_Z":437,"SPECIES_URSARING":217,"SPECIES_VAPOREON":134,"SPECIES_VENOMOTH":49,"SPECIES_VENONAT":48,"SPECIES_VENUSAUR":3,"SPECIES_VIBRAVA":333,"SPECIES_VICTREEBEL":71,"SPECIES_VIGOROTH":365,"SPECIES_VILEPLUME":45,"SPECIES_VOLBEAT":386,"SPECIES_VOLTORB":100,"SPECIES_VULPIX":37,"SPECIES_WAILMER":313,"SPECIES_WAILORD":314,"SPECIES_WALREIN":343,"SPECIES_WARTORTLE":8,"SPECIES_WEEDLE":13,"SPECIES_WEEPINBELL":70,"SPECIES_WEEZING":110,"SPECIES_WHISCASH":324,"SPECIES_WHISMUR":370,"SPECIES_WIGGLYTUFF":40,"SPECIES_WINGULL":309,"SPECIES_WOBBUFFET":202,"SPECIES_WOOPER":194,"SPECIES_WURMPLE":290,"SPECIES_WYNAUT":360,"SPECIES_XATU":178,"SPECIES_YANMA":193,"SPECIES_ZANGOOSE":380,"SPECIES_ZAPDOS":145,"SPECIES_ZIGZAGOON":288,"SPECIES_ZUBAT":41,"SUPER_ROD":2,"SYSTEM_FLAGS":2144,"TEMP_FLAGS_END":31,"TEMP_FLAGS_START":0,"TRAINERS_COUNT":855,"TRAINER_AARON":397,"TRAINER_ABIGAIL_1":358,"TRAINER_ABIGAIL_2":360,"TRAINER_ABIGAIL_3":361,"TRAINER_ABIGAIL_4":362,"TRAINER_ABIGAIL_5":363,"TRAINER_AIDAN":674,"TRAINER_AISHA":757,"TRAINER_ALAN":630,"TRAINER_ALBERT":80,"TRAINER_ALBERTO":12,"TRAINER_ALEX":413,"TRAINER_ALEXA":670,"TRAINER_ALEXIA":90,"TRAINER_ALEXIS":248,"TRAINER_ALICE":448,"TRAINER_ALIX":750,"TRAINER_ALLEN":333,"TRAINER_ALLISON":387,"TRAINER_ALVARO":849,"TRAINER_ALYSSA":701,"TRAINER_AMY_AND_LIV_1":481,"TRAINER_AMY_AND_LIV_2":482,"TRAINER_AMY_AND_LIV_3":485,"TRAINER_AMY_AND_LIV_4":487,"TRAINER_AMY_AND_LIV_5":488,"TRAINER_AMY_AND_LIV_6":489,"TRAINER_ANABEL":805,"TRAINER_ANDREA":613,"TRAINER_ANDRES_1":737,"TRAINER_ANDRES_2":812,"TRAINER_ANDRES_3":813,"TRAINER_ANDRES_4":814,"TRAINER_ANDRES_5":815,"TRAINER_ANDREW":336,"TRAINER_ANGELICA":436,"TRAINER_ANGELINA":712,"TRAINER_ANGELO":802,"TRAINER_ANNA_AND_MEG_1":287,"TRAINER_ANNA_AND_MEG_2":288,"TRAINER_ANNA_AND_MEG_3":289,"TRAINER_ANNA_AND_MEG_4":290,"TRAINER_ANNA_AND_MEG_5":291,"TRAINER_ANNIKA":502,"TRAINER_ANTHONY":352,"TRAINER_ARCHIE":34,"TRAINER_ASHLEY":655,"TRAINER_ATHENA":577,"TRAINER_ATSUSHI":190,"TRAINER_AURON":506,"TRAINER_AUSTINA":58,"TRAINER_AUTUMN":217,"TRAINER_AXLE":203,"TRAINER_BARNY":343,"TRAINER_BARRY":163,"TRAINER_BEAU":212,"TRAINER_BECK":414,"TRAINER_BECKY":470,"TRAINER_BEN":323,"TRAINER_BENJAMIN_1":353,"TRAINER_BENJAMIN_2":354,"TRAINER_BENJAMIN_3":355,"TRAINER_BENJAMIN_4":356,"TRAINER_BENJAMIN_5":357,"TRAINER_BENNY":407,"TRAINER_BERKE":74,"TRAINER_BERNIE_1":206,"TRAINER_BERNIE_2":207,"TRAINER_BERNIE_3":208,"TRAINER_BERNIE_4":209,"TRAINER_BERNIE_5":210,"TRAINER_BETH":445,"TRAINER_BETHANY":301,"TRAINER_BEVERLY":441,"TRAINER_BIANCA":706,"TRAINER_BILLY":319,"TRAINER_BLAKE":235,"TRAINER_BRANDEN":745,"TRAINER_BRANDI":756,"TRAINER_BRANDON":811,"TRAINER_BRAWLY_1":266,"TRAINER_BRAWLY_2":774,"TRAINER_BRAWLY_3":775,"TRAINER_BRAWLY_4":776,"TRAINER_BRAWLY_5":777,"TRAINER_BRAXTON":75,"TRAINER_BRENDA":454,"TRAINER_BRENDAN_LILYCOVE_MUDKIP":661,"TRAINER_BRENDAN_LILYCOVE_TORCHIC":663,"TRAINER_BRENDAN_LILYCOVE_TREECKO":662,"TRAINER_BRENDAN_PLACEHOLDER":853,"TRAINER_BRENDAN_ROUTE_103_MUDKIP":520,"TRAINER_BRENDAN_ROUTE_103_TORCHIC":526,"TRAINER_BRENDAN_ROUTE_103_TREECKO":523,"TRAINER_BRENDAN_ROUTE_110_MUDKIP":521,"TRAINER_BRENDAN_ROUTE_110_TORCHIC":527,"TRAINER_BRENDAN_ROUTE_110_TREECKO":524,"TRAINER_BRENDAN_ROUTE_119_MUDKIP":522,"TRAINER_BRENDAN_ROUTE_119_TORCHIC":528,"TRAINER_BRENDAN_ROUTE_119_TREECKO":525,"TRAINER_BRENDAN_RUSTBORO_MUDKIP":593,"TRAINER_BRENDAN_RUSTBORO_TORCHIC":599,"TRAINER_BRENDAN_RUSTBORO_TREECKO":592,"TRAINER_BRENDEN":572,"TRAINER_BRENT":223,"TRAINER_BRIANNA":118,"TRAINER_BRICE":626,"TRAINER_BRIDGET":129,"TRAINER_BROOKE_1":94,"TRAINER_BROOKE_2":101,"TRAINER_BROOKE_3":102,"TRAINER_BROOKE_4":103,"TRAINER_BROOKE_5":104,"TRAINER_BRYAN":744,"TRAINER_BRYANT":746,"TRAINER_CALE":764,"TRAINER_CALLIE":763,"TRAINER_CALVIN_1":318,"TRAINER_CALVIN_2":328,"TRAINER_CALVIN_3":329,"TRAINER_CALVIN_4":330,"TRAINER_CALVIN_5":331,"TRAINER_CAMDEN":374,"TRAINER_CAMERON_1":238,"TRAINER_CAMERON_2":239,"TRAINER_CAMERON_3":240,"TRAINER_CAMERON_4":241,"TRAINER_CAMERON_5":242,"TRAINER_CAMRON":739,"TRAINER_CARLEE":464,"TRAINER_CAROL":471,"TRAINER_CAROLINA":741,"TRAINER_CAROLINE":99,"TRAINER_CARTER":345,"TRAINER_CATHERINE_1":559,"TRAINER_CATHERINE_2":562,"TRAINER_CATHERINE_3":563,"TRAINER_CATHERINE_4":564,"TRAINER_CATHERINE_5":565,"TRAINER_CEDRIC":475,"TRAINER_CELIA":743,"TRAINER_CELINA":705,"TRAINER_CHAD":174,"TRAINER_CHANDLER":698,"TRAINER_CHARLIE":66,"TRAINER_CHARLOTTE":714,"TRAINER_CHASE":378,"TRAINER_CHESTER":408,"TRAINER_CHIP":45,"TRAINER_CHRIS":693,"TRAINER_CINDY_1":114,"TRAINER_CINDY_2":117,"TRAINER_CINDY_3":120,"TRAINER_CINDY_4":121,"TRAINER_CINDY_5":122,"TRAINER_CINDY_6":123,"TRAINER_CLARENCE":580,"TRAINER_CLARISSA":435,"TRAINER_CLARK":631,"TRAINER_CLAUDE":338,"TRAINER_CLIFFORD":584,"TRAINER_COBY":709,"TRAINER_COLE":201,"TRAINER_COLIN":405,"TRAINER_COLTON":294,"TRAINER_CONNIE":128,"TRAINER_CONOR":511,"TRAINER_CORA":428,"TRAINER_CORY_1":740,"TRAINER_CORY_2":816,"TRAINER_CORY_3":817,"TRAINER_CORY_4":818,"TRAINER_CORY_5":819,"TRAINER_CRISSY":614,"TRAINER_CRISTIAN":574,"TRAINER_CRISTIN_1":767,"TRAINER_CRISTIN_2":828,"TRAINER_CRISTIN_3":829,"TRAINER_CRISTIN_4":830,"TRAINER_CRISTIN_5":831,"TRAINER_CYNDY_1":427,"TRAINER_CYNDY_2":430,"TRAINER_CYNDY_3":431,"TRAINER_CYNDY_4":432,"TRAINER_CYNDY_5":433,"TRAINER_DAISUKE":189,"TRAINER_DAISY":36,"TRAINER_DALE":341,"TRAINER_DALTON_1":196,"TRAINER_DALTON_2":197,"TRAINER_DALTON_3":198,"TRAINER_DALTON_4":199,"TRAINER_DALTON_5":200,"TRAINER_DANA":458,"TRAINER_DANIELLE":650,"TRAINER_DAPHNE":115,"TRAINER_DARCY":733,"TRAINER_DARIAN":696,"TRAINER_DARIUS":803,"TRAINER_DARRIN":154,"TRAINER_DAVID":158,"TRAINER_DAVIS":539,"TRAINER_DAWSON":694,"TRAINER_DAYTON":760,"TRAINER_DEAN":164,"TRAINER_DEANDRE":715,"TRAINER_DEBRA":460,"TRAINER_DECLAN":15,"TRAINER_DEMETRIUS":375,"TRAINER_DENISE":444,"TRAINER_DEREK":227,"TRAINER_DEVAN":753,"TRAINER_DEZ_AND_LUKE":640,"TRAINER_DIANA_1":474,"TRAINER_DIANA_2":477,"TRAINER_DIANA_3":478,"TRAINER_DIANA_4":479,"TRAINER_DIANA_5":480,"TRAINER_DIANNE":417,"TRAINER_DILLON":327,"TRAINER_DOMINIK":152,"TRAINER_DONALD":224,"TRAINER_DONNY":384,"TRAINER_DOUG":618,"TRAINER_DOUGLAS":153,"TRAINER_DRAKE":264,"TRAINER_DREW":211,"TRAINER_DUDLEY":173,"TRAINER_DUNCAN":496,"TRAINER_DUSTY_1":44,"TRAINER_DUSTY_2":47,"TRAINER_DUSTY_3":48,"TRAINER_DUSTY_4":49,"TRAINER_DUSTY_5":50,"TRAINER_DWAYNE":493,"TRAINER_DYLAN_1":364,"TRAINER_DYLAN_2":365,"TRAINER_DYLAN_3":366,"TRAINER_DYLAN_4":367,"TRAINER_DYLAN_5":368,"TRAINER_ED":13,"TRAINER_EDDIE":332,"TRAINER_EDGAR":79,"TRAINER_EDMOND":491,"TRAINER_EDWARD":232,"TRAINER_EDWARDO":404,"TRAINER_EDWIN_1":512,"TRAINER_EDWIN_2":515,"TRAINER_EDWIN_3":516,"TRAINER_EDWIN_4":517,"TRAINER_EDWIN_5":518,"TRAINER_ELI":501,"TRAINER_ELIJAH":742,"TRAINER_ELLIOT_1":339,"TRAINER_ELLIOT_2":346,"TRAINER_ELLIOT_3":347,"TRAINER_ELLIOT_4":348,"TRAINER_ELLIOT_5":349,"TRAINER_ERIC":632,"TRAINER_ERNEST_1":492,"TRAINER_ERNEST_2":497,"TRAINER_ERNEST_3":498,"TRAINER_ERNEST_4":499,"TRAINER_ERNEST_5":500,"TRAINER_ETHAN_1":216,"TRAINER_ETHAN_2":219,"TRAINER_ETHAN_3":220,"TRAINER_ETHAN_4":221,"TRAINER_ETHAN_5":222,"TRAINER_EVERETT":850,"TRAINER_FABIAN":759,"TRAINER_FELIX":38,"TRAINER_FERNANDO_1":195,"TRAINER_FERNANDO_2":832,"TRAINER_FERNANDO_3":833,"TRAINER_FERNANDO_4":834,"TRAINER_FERNANDO_5":835,"TRAINER_FLAGS_END":2143,"TRAINER_FLAGS_START":1280,"TRAINER_FLANNERY_1":268,"TRAINER_FLANNERY_2":782,"TRAINER_FLANNERY_3":783,"TRAINER_FLANNERY_4":784,"TRAINER_FLANNERY_5":785,"TRAINER_FLINT":654,"TRAINER_FOSTER":46,"TRAINER_FRANKLIN":170,"TRAINER_FREDRICK":29,"TRAINER_GABBY_AND_TY_1":51,"TRAINER_GABBY_AND_TY_2":52,"TRAINER_GABBY_AND_TY_3":53,"TRAINER_GABBY_AND_TY_4":54,"TRAINER_GABBY_AND_TY_5":55,"TRAINER_GABBY_AND_TY_6":56,"TRAINER_GABRIELLE_1":9,"TRAINER_GABRIELLE_2":840,"TRAINER_GABRIELLE_3":841,"TRAINER_GABRIELLE_4":842,"TRAINER_GABRIELLE_5":843,"TRAINER_GARRET":138,"TRAINER_GARRISON":547,"TRAINER_GEORGE":73,"TRAINER_GEORGIA":281,"TRAINER_GERALD":648,"TRAINER_GILBERT":169,"TRAINER_GINA_AND_MIA_1":483,"TRAINER_GINA_AND_MIA_2":486,"TRAINER_GLACIA":263,"TRAINER_GRACE":450,"TRAINER_GREG":619,"TRAINER_GRETA":808,"TRAINER_GRUNT_AQUA_HIDEOUT_1":2,"TRAINER_GRUNT_AQUA_HIDEOUT_2":3,"TRAINER_GRUNT_AQUA_HIDEOUT_3":4,"TRAINER_GRUNT_AQUA_HIDEOUT_4":5,"TRAINER_GRUNT_AQUA_HIDEOUT_5":27,"TRAINER_GRUNT_AQUA_HIDEOUT_6":28,"TRAINER_GRUNT_AQUA_HIDEOUT_7":192,"TRAINER_GRUNT_AQUA_HIDEOUT_8":193,"TRAINER_GRUNT_JAGGED_PASS":570,"TRAINER_GRUNT_MAGMA_HIDEOUT_1":716,"TRAINER_GRUNT_MAGMA_HIDEOUT_10":725,"TRAINER_GRUNT_MAGMA_HIDEOUT_11":726,"TRAINER_GRUNT_MAGMA_HIDEOUT_12":727,"TRAINER_GRUNT_MAGMA_HIDEOUT_13":728,"TRAINER_GRUNT_MAGMA_HIDEOUT_14":729,"TRAINER_GRUNT_MAGMA_HIDEOUT_15":730,"TRAINER_GRUNT_MAGMA_HIDEOUT_16":731,"TRAINER_GRUNT_MAGMA_HIDEOUT_2":717,"TRAINER_GRUNT_MAGMA_HIDEOUT_3":718,"TRAINER_GRUNT_MAGMA_HIDEOUT_4":719,"TRAINER_GRUNT_MAGMA_HIDEOUT_5":720,"TRAINER_GRUNT_MAGMA_HIDEOUT_6":721,"TRAINER_GRUNT_MAGMA_HIDEOUT_7":722,"TRAINER_GRUNT_MAGMA_HIDEOUT_8":723,"TRAINER_GRUNT_MAGMA_HIDEOUT_9":724,"TRAINER_GRUNT_MT_CHIMNEY_1":146,"TRAINER_GRUNT_MT_CHIMNEY_2":579,"TRAINER_GRUNT_MT_PYRE_1":23,"TRAINER_GRUNT_MT_PYRE_2":24,"TRAINER_GRUNT_MT_PYRE_3":25,"TRAINER_GRUNT_MT_PYRE_4":569,"TRAINER_GRUNT_MUSEUM_1":20,"TRAINER_GRUNT_MUSEUM_2":21,"TRAINER_GRUNT_PETALBURG_WOODS":10,"TRAINER_GRUNT_RUSTURF_TUNNEL":16,"TRAINER_GRUNT_SEAFLOOR_CAVERN_1":6,"TRAINER_GRUNT_SEAFLOOR_CAVERN_2":7,"TRAINER_GRUNT_SEAFLOOR_CAVERN_3":8,"TRAINER_GRUNT_SEAFLOOR_CAVERN_4":14,"TRAINER_GRUNT_SEAFLOOR_CAVERN_5":567,"TRAINER_GRUNT_SPACE_CENTER_1":22,"TRAINER_GRUNT_SPACE_CENTER_2":116,"TRAINER_GRUNT_SPACE_CENTER_3":586,"TRAINER_GRUNT_SPACE_CENTER_4":587,"TRAINER_GRUNT_SPACE_CENTER_5":588,"TRAINER_GRUNT_SPACE_CENTER_6":589,"TRAINER_GRUNT_SPACE_CENTER_7":590,"TRAINER_GRUNT_UNUSED":568,"TRAINER_GRUNT_WEATHER_INST_1":17,"TRAINER_GRUNT_WEATHER_INST_2":18,"TRAINER_GRUNT_WEATHER_INST_3":19,"TRAINER_GRUNT_WEATHER_INST_4":26,"TRAINER_GRUNT_WEATHER_INST_5":596,"TRAINER_GWEN":59,"TRAINER_HAILEY":697,"TRAINER_HALEY_1":604,"TRAINER_HALEY_2":607,"TRAINER_HALEY_3":608,"TRAINER_HALEY_4":609,"TRAINER_HALEY_5":610,"TRAINER_HALLE":546,"TRAINER_HANNAH":244,"TRAINER_HARRISON":578,"TRAINER_HAYDEN":707,"TRAINER_HECTOR":513,"TRAINER_HEIDI":469,"TRAINER_HELENE":751,"TRAINER_HENRY":668,"TRAINER_HERMAN":167,"TRAINER_HIDEO":651,"TRAINER_HITOSHI":180,"TRAINER_HOPE":96,"TRAINER_HUDSON":510,"TRAINER_HUEY":490,"TRAINER_HUGH":399,"TRAINER_HUMBERTO":402,"TRAINER_IMANI":442,"TRAINER_IRENE":476,"TRAINER_ISAAC_1":538,"TRAINER_ISAAC_2":541,"TRAINER_ISAAC_3":542,"TRAINER_ISAAC_4":543,"TRAINER_ISAAC_5":544,"TRAINER_ISABELLA":595,"TRAINER_ISABELLE":736,"TRAINER_ISABEL_1":302,"TRAINER_ISABEL_2":303,"TRAINER_ISABEL_3":304,"TRAINER_ISABEL_4":305,"TRAINER_ISABEL_5":306,"TRAINER_ISAIAH_1":376,"TRAINER_ISAIAH_2":379,"TRAINER_ISAIAH_3":380,"TRAINER_ISAIAH_4":381,"TRAINER_ISAIAH_5":382,"TRAINER_ISOBEL":383,"TRAINER_IVAN":337,"TRAINER_JACE":204,"TRAINER_JACK":172,"TRAINER_JACKI_1":249,"TRAINER_JACKI_2":250,"TRAINER_JACKI_3":251,"TRAINER_JACKI_4":252,"TRAINER_JACKI_5":253,"TRAINER_JACKSON_1":552,"TRAINER_JACKSON_2":555,"TRAINER_JACKSON_3":556,"TRAINER_JACKSON_4":557,"TRAINER_JACKSON_5":558,"TRAINER_JACLYN":243,"TRAINER_JACOB":351,"TRAINER_JAIDEN":749,"TRAINER_JAMES_1":621,"TRAINER_JAMES_2":622,"TRAINER_JAMES_3":623,"TRAINER_JAMES_4":624,"TRAINER_JAMES_5":625,"TRAINER_JANI":418,"TRAINER_JANICE":605,"TRAINER_JARED":401,"TRAINER_JASMINE":359,"TRAINER_JAYLEN":326,"TRAINER_JAZMYN":503,"TRAINER_JEFF":202,"TRAINER_JEFFREY_1":226,"TRAINER_JEFFREY_2":228,"TRAINER_JEFFREY_3":229,"TRAINER_JEFFREY_4":230,"TRAINER_JEFFREY_5":231,"TRAINER_JENNA":560,"TRAINER_JENNIFER":95,"TRAINER_JENNY_1":449,"TRAINER_JENNY_2":465,"TRAINER_JENNY_3":466,"TRAINER_JENNY_4":467,"TRAINER_JENNY_5":468,"TRAINER_JEROME":156,"TRAINER_JERRY_1":273,"TRAINER_JERRY_2":276,"TRAINER_JERRY_3":277,"TRAINER_JERRY_4":278,"TRAINER_JERRY_5":279,"TRAINER_JESSICA_1":127,"TRAINER_JESSICA_2":132,"TRAINER_JESSICA_3":133,"TRAINER_JESSICA_4":134,"TRAINER_JESSICA_5":135,"TRAINER_JOCELYN":425,"TRAINER_JODY":91,"TRAINER_JOEY":322,"TRAINER_JOHANNA":647,"TRAINER_JOHNSON":754,"TRAINER_JOHN_AND_JAY_1":681,"TRAINER_JOHN_AND_JAY_2":682,"TRAINER_JOHN_AND_JAY_3":683,"TRAINER_JOHN_AND_JAY_4":684,"TRAINER_JOHN_AND_JAY_5":685,"TRAINER_JONAH":667,"TRAINER_JONAS":504,"TRAINER_JONATHAN":598,"TRAINER_JOSE":617,"TRAINER_JOSEPH":700,"TRAINER_JOSH":320,"TRAINER_JOSHUA":237,"TRAINER_JOSUE":738,"TRAINER_JUAN_1":272,"TRAINER_JUAN_2":798,"TRAINER_JUAN_3":799,"TRAINER_JUAN_4":800,"TRAINER_JUAN_5":801,"TRAINER_JULIE":100,"TRAINER_JULIO":566,"TRAINER_JUSTIN":215,"TRAINER_KAI":713,"TRAINER_KALEB":699,"TRAINER_KARA":457,"TRAINER_KAREN_1":280,"TRAINER_KAREN_2":282,"TRAINER_KAREN_3":283,"TRAINER_KAREN_4":284,"TRAINER_KAREN_5":285,"TRAINER_KATELYNN":325,"TRAINER_KATELYN_1":386,"TRAINER_KATELYN_2":388,"TRAINER_KATELYN_3":389,"TRAINER_KATELYN_4":390,"TRAINER_KATELYN_5":391,"TRAINER_KATE_AND_JOY":286,"TRAINER_KATHLEEN":583,"TRAINER_KATIE":455,"TRAINER_KAYLA":247,"TRAINER_KAYLEE":462,"TRAINER_KAYLEY":505,"TRAINER_KEEGAN":205,"TRAINER_KEIGO":652,"TRAINER_KEIRA":93,"TRAINER_KELVIN":507,"TRAINER_KENT":620,"TRAINER_KEVIN":171,"TRAINER_KIM_AND_IRIS":678,"TRAINER_KINDRA":106,"TRAINER_KIRA_AND_DAN_1":642,"TRAINER_KIRA_AND_DAN_2":643,"TRAINER_KIRA_AND_DAN_3":644,"TRAINER_KIRA_AND_DAN_4":645,"TRAINER_KIRA_AND_DAN_5":646,"TRAINER_KIRK":191,"TRAINER_KIYO":181,"TRAINER_KOICHI":182,"TRAINER_KOJI_1":672,"TRAINER_KOJI_2":824,"TRAINER_KOJI_3":825,"TRAINER_KOJI_4":826,"TRAINER_KOJI_5":827,"TRAINER_KYLA":443,"TRAINER_KYRA":748,"TRAINER_LAO_1":419,"TRAINER_LAO_2":421,"TRAINER_LAO_3":422,"TRAINER_LAO_4":423,"TRAINER_LAO_5":424,"TRAINER_LARRY":213,"TRAINER_LAURA":426,"TRAINER_LAUREL":463,"TRAINER_LAWRENCE":710,"TRAINER_LEAF":852,"TRAINER_LEAH":35,"TRAINER_LEA_AND_JED":641,"TRAINER_LENNY":628,"TRAINER_LEONARD":495,"TRAINER_LEONARDO":576,"TRAINER_LEONEL":762,"TRAINER_LEROY":77,"TRAINER_LILA_AND_ROY_1":687,"TRAINER_LILA_AND_ROY_2":688,"TRAINER_LILA_AND_ROY_3":689,"TRAINER_LILA_AND_ROY_4":690,"TRAINER_LILA_AND_ROY_5":691,"TRAINER_LILITH":573,"TRAINER_LINDA":461,"TRAINER_LISA_AND_RAY":692,"TRAINER_LOLA_1":57,"TRAINER_LOLA_2":60,"TRAINER_LOLA_3":61,"TRAINER_LOLA_4":62,"TRAINER_LOLA_5":63,"TRAINER_LORENZO":553,"TRAINER_LUCAS_1":629,"TRAINER_LUCAS_2":633,"TRAINER_LUCY":810,"TRAINER_LUIS":151,"TRAINER_LUNG":420,"TRAINER_LYDIA_1":545,"TRAINER_LYDIA_2":548,"TRAINER_LYDIA_3":549,"TRAINER_LYDIA_4":550,"TRAINER_LYDIA_5":551,"TRAINER_LYLE":616,"TRAINER_MACEY":591,"TRAINER_MADELINE_1":434,"TRAINER_MADELINE_2":437,"TRAINER_MADELINE_3":438,"TRAINER_MADELINE_4":439,"TRAINER_MADELINE_5":440,"TRAINER_MAKAYLA":758,"TRAINER_MARC":571,"TRAINER_MARCEL":11,"TRAINER_MARCOS":702,"TRAINER_MARIA_1":369,"TRAINER_MARIA_2":370,"TRAINER_MARIA_3":371,"TRAINER_MARIA_4":372,"TRAINER_MARIA_5":373,"TRAINER_MARIELA":848,"TRAINER_MARK":145,"TRAINER_MARLENE":752,"TRAINER_MARLEY":508,"TRAINER_MARTHA":473,"TRAINER_MARY":89,"TRAINER_MATT":30,"TRAINER_MATTHEW":157,"TRAINER_MAURA":246,"TRAINER_MAXIE_MAGMA_HIDEOUT":601,"TRAINER_MAXIE_MOSSDEEP":734,"TRAINER_MAXIE_MT_CHIMNEY":602,"TRAINER_MAY_LILYCOVE_MUDKIP":664,"TRAINER_MAY_LILYCOVE_TORCHIC":666,"TRAINER_MAY_LILYCOVE_TREECKO":665,"TRAINER_MAY_PLACEHOLDER":854,"TRAINER_MAY_ROUTE_103_MUDKIP":529,"TRAINER_MAY_ROUTE_103_TORCHIC":535,"TRAINER_MAY_ROUTE_103_TREECKO":532,"TRAINER_MAY_ROUTE_110_MUDKIP":530,"TRAINER_MAY_ROUTE_110_TORCHIC":536,"TRAINER_MAY_ROUTE_110_TREECKO":533,"TRAINER_MAY_ROUTE_119_MUDKIP":531,"TRAINER_MAY_ROUTE_119_TORCHIC":537,"TRAINER_MAY_ROUTE_119_TREECKO":534,"TRAINER_MAY_RUSTBORO_MUDKIP":600,"TRAINER_MAY_RUSTBORO_TORCHIC":769,"TRAINER_MAY_RUSTBORO_TREECKO":768,"TRAINER_MELINA":755,"TRAINER_MELISSA":124,"TRAINER_MEL_AND_PAUL":680,"TRAINER_MICAH":255,"TRAINER_MICHELLE":98,"TRAINER_MIGUEL_1":293,"TRAINER_MIGUEL_2":295,"TRAINER_MIGUEL_3":296,"TRAINER_MIGUEL_4":297,"TRAINER_MIGUEL_5":298,"TRAINER_MIKE_1":634,"TRAINER_MIKE_2":635,"TRAINER_MISSY":447,"TRAINER_MITCHELL":540,"TRAINER_MIU_AND_YUKI":484,"TRAINER_MOLLIE":137,"TRAINER_MYLES":765,"TRAINER_NANCY":472,"TRAINER_NAOMI":119,"TRAINER_NATE":582,"TRAINER_NED":340,"TRAINER_NICHOLAS":585,"TRAINER_NICOLAS_1":392,"TRAINER_NICOLAS_2":393,"TRAINER_NICOLAS_3":394,"TRAINER_NICOLAS_4":395,"TRAINER_NICOLAS_5":396,"TRAINER_NIKKI":453,"TRAINER_NOB_1":183,"TRAINER_NOB_2":184,"TRAINER_NOB_3":185,"TRAINER_NOB_4":186,"TRAINER_NOB_5":187,"TRAINER_NOLAN":342,"TRAINER_NOLAND":809,"TRAINER_NOLEN":161,"TRAINER_NONE":0,"TRAINER_NORMAN_1":269,"TRAINER_NORMAN_2":786,"TRAINER_NORMAN_3":787,"TRAINER_NORMAN_4":788,"TRAINER_NORMAN_5":789,"TRAINER_OLIVIA":130,"TRAINER_OWEN":83,"TRAINER_PABLO_1":377,"TRAINER_PABLO_2":820,"TRAINER_PABLO_3":821,"TRAINER_PABLO_4":822,"TRAINER_PABLO_5":823,"TRAINER_PARKER":72,"TRAINER_PAT":766,"TRAINER_PATRICIA":105,"TRAINER_PAUL":275,"TRAINER_PAULA":429,"TRAINER_PAXTON":594,"TRAINER_PERRY":398,"TRAINER_PETE":735,"TRAINER_PHIL":400,"TRAINER_PHILLIP":494,"TRAINER_PHOEBE":262,"TRAINER_PRESLEY":403,"TRAINER_PRESTON":233,"TRAINER_QUINCY":324,"TRAINER_RACHEL":761,"TRAINER_RANDALL":71,"TRAINER_RED":851,"TRAINER_REED":675,"TRAINER_RELI_AND_IAN":686,"TRAINER_REYNA":509,"TRAINER_RHETT":703,"TRAINER_RICHARD":166,"TRAINER_RICK":615,"TRAINER_RICKY_1":64,"TRAINER_RICKY_2":67,"TRAINER_RICKY_3":68,"TRAINER_RICKY_4":69,"TRAINER_RICKY_5":70,"TRAINER_RILEY":653,"TRAINER_ROBERT_1":406,"TRAINER_ROBERT_2":409,"TRAINER_ROBERT_3":410,"TRAINER_ROBERT_4":411,"TRAINER_ROBERT_5":412,"TRAINER_ROBIN":612,"TRAINER_RODNEY":165,"TRAINER_ROGER":669,"TRAINER_ROLAND":160,"TRAINER_RONALD":350,"TRAINER_ROSE_1":37,"TRAINER_ROSE_2":40,"TRAINER_ROSE_3":41,"TRAINER_ROSE_4":42,"TRAINER_ROSE_5":43,"TRAINER_ROXANNE_1":265,"TRAINER_ROXANNE_2":770,"TRAINER_ROXANNE_3":771,"TRAINER_ROXANNE_4":772,"TRAINER_ROXANNE_5":773,"TRAINER_RUBEN":671,"TRAINER_SALLY":611,"TRAINER_SAMANTHA":245,"TRAINER_SAMUEL":81,"TRAINER_SANTIAGO":168,"TRAINER_SARAH":695,"TRAINER_SAWYER_1":1,"TRAINER_SAWYER_2":836,"TRAINER_SAWYER_3":837,"TRAINER_SAWYER_4":838,"TRAINER_SAWYER_5":839,"TRAINER_SEBASTIAN":554,"TRAINER_SHANE":214,"TRAINER_SHANNON":97,"TRAINER_SHARON":452,"TRAINER_SHAWN":194,"TRAINER_SHAYLA":747,"TRAINER_SHEILA":125,"TRAINER_SHELBY_1":313,"TRAINER_SHELBY_2":314,"TRAINER_SHELBY_3":315,"TRAINER_SHELBY_4":316,"TRAINER_SHELBY_5":317,"TRAINER_SHELLY_SEAFLOOR_CAVERN":33,"TRAINER_SHELLY_WEATHER_INSTITUTE":32,"TRAINER_SHIRLEY":126,"TRAINER_SIDNEY":261,"TRAINER_SIENNA":459,"TRAINER_SIMON":65,"TRAINER_SOPHIA":561,"TRAINER_SOPHIE":708,"TRAINER_SPENCER":159,"TRAINER_SPENSER":807,"TRAINER_STAN":162,"TRAINER_STEVEN":804,"TRAINER_STEVE_1":143,"TRAINER_STEVE_2":147,"TRAINER_STEVE_3":148,"TRAINER_STEVE_4":149,"TRAINER_STEVE_5":150,"TRAINER_SUSIE":456,"TRAINER_SYLVIA":575,"TRAINER_TABITHA_MAGMA_HIDEOUT":732,"TRAINER_TABITHA_MOSSDEEP":514,"TRAINER_TABITHA_MT_CHIMNEY":597,"TRAINER_TAKAO":179,"TRAINER_TAKASHI":416,"TRAINER_TALIA":385,"TRAINER_TAMMY":107,"TRAINER_TANYA":451,"TRAINER_TARA":446,"TRAINER_TASHA":109,"TRAINER_TATE_AND_LIZA_1":271,"TRAINER_TATE_AND_LIZA_2":794,"TRAINER_TATE_AND_LIZA_3":795,"TRAINER_TATE_AND_LIZA_4":796,"TRAINER_TATE_AND_LIZA_5":797,"TRAINER_TAYLOR":225,"TRAINER_TED":274,"TRAINER_TERRY":581,"TRAINER_THALIA_1":144,"TRAINER_THALIA_2":844,"TRAINER_THALIA_3":845,"TRAINER_THALIA_4":846,"TRAINER_THALIA_5":847,"TRAINER_THOMAS":256,"TRAINER_TIANA":603,"TRAINER_TIFFANY":131,"TRAINER_TIMMY":334,"TRAINER_TIMOTHY_1":307,"TRAINER_TIMOTHY_2":308,"TRAINER_TIMOTHY_3":309,"TRAINER_TIMOTHY_4":310,"TRAINER_TIMOTHY_5":311,"TRAINER_TISHA":676,"TRAINER_TOMMY":321,"TRAINER_TONY_1":155,"TRAINER_TONY_2":175,"TRAINER_TONY_3":176,"TRAINER_TONY_4":177,"TRAINER_TONY_5":178,"TRAINER_TORI_AND_TIA":677,"TRAINER_TRAVIS":218,"TRAINER_TRENT_1":627,"TRAINER_TRENT_2":636,"TRAINER_TRENT_3":637,"TRAINER_TRENT_4":638,"TRAINER_TRENT_5":639,"TRAINER_TUCKER":806,"TRAINER_TYRA_AND_IVY":679,"TRAINER_TYRON":704,"TRAINER_VALERIE_1":108,"TRAINER_VALERIE_2":110,"TRAINER_VALERIE_3":111,"TRAINER_VALERIE_4":112,"TRAINER_VALERIE_5":113,"TRAINER_VANESSA":300,"TRAINER_VICKY":312,"TRAINER_VICTOR":292,"TRAINER_VICTORIA":299,"TRAINER_VINCENT":76,"TRAINER_VIOLET":39,"TRAINER_VIRGIL":234,"TRAINER_VITO":82,"TRAINER_VIVI":606,"TRAINER_VIVIAN":649,"TRAINER_WADE":344,"TRAINER_WALLACE":335,"TRAINER_WALLY_MAUVILLE":656,"TRAINER_WALLY_VR_1":519,"TRAINER_WALLY_VR_2":657,"TRAINER_WALLY_VR_3":658,"TRAINER_WALLY_VR_4":659,"TRAINER_WALLY_VR_5":660,"TRAINER_WALTER_1":254,"TRAINER_WALTER_2":257,"TRAINER_WALTER_3":258,"TRAINER_WALTER_4":259,"TRAINER_WALTER_5":260,"TRAINER_WARREN":88,"TRAINER_WATTSON_1":267,"TRAINER_WATTSON_2":778,"TRAINER_WATTSON_3":779,"TRAINER_WATTSON_4":780,"TRAINER_WATTSON_5":781,"TRAINER_WAYNE":673,"TRAINER_WENDY":92,"TRAINER_WILLIAM":236,"TRAINER_WILTON_1":78,"TRAINER_WILTON_2":84,"TRAINER_WILTON_3":85,"TRAINER_WILTON_4":86,"TRAINER_WILTON_5":87,"TRAINER_WINONA_1":270,"TRAINER_WINONA_2":790,"TRAINER_WINONA_3":791,"TRAINER_WINONA_4":792,"TRAINER_WINONA_5":793,"TRAINER_WINSTON_1":136,"TRAINER_WINSTON_2":139,"TRAINER_WINSTON_3":140,"TRAINER_WINSTON_4":141,"TRAINER_WINSTON_5":142,"TRAINER_WYATT":711,"TRAINER_YASU":415,"TRAINER_YUJI":188,"TRAINER_ZANDER":31},"legendary_encounters":[{"address":2538600,"catch_flag":429,"defeat_flag":428,"level":30,"species":410},{"address":2354334,"catch_flag":480,"defeat_flag":447,"level":70,"species":405},{"address":2543160,"catch_flag":146,"defeat_flag":476,"level":70,"species":250},{"address":2354112,"catch_flag":479,"defeat_flag":446,"level":70,"species":404},{"address":2385623,"catch_flag":457,"defeat_flag":456,"level":50,"species":407},{"address":2385687,"catch_flag":482,"defeat_flag":481,"level":50,"species":408},{"address":2543443,"catch_flag":145,"defeat_flag":477,"level":70,"species":249},{"address":2538177,"catch_flag":458,"defeat_flag":455,"level":30,"species":151},{"address":2347488,"catch_flag":478,"defeat_flag":448,"level":70,"species":406},{"address":2345460,"catch_flag":427,"defeat_flag":444,"level":40,"species":402},{"address":2298183,"catch_flag":426,"defeat_flag":443,"level":40,"species":401},{"address":2345731,"catch_flag":483,"defeat_flag":445,"level":40,"species":403}],"locations":{"BADGE_1":{"address":2188036,"default_item":226,"flag":1182},"BADGE_2":{"address":2095131,"default_item":227,"flag":1183},"BADGE_3":{"address":2167252,"default_item":228,"flag":1184},"BADGE_4":{"address":2103246,"default_item":229,"flag":1185},"BADGE_5":{"address":2129781,"default_item":230,"flag":1186},"BADGE_6":{"address":2202122,"default_item":231,"flag":1187},"BADGE_7":{"address":2243964,"default_item":232,"flag":1188},"BADGE_8":{"address":2262314,"default_item":233,"flag":1189},"BERRY_TREE_01":{"address":5843562,"default_item":135,"flag":612},"BERRY_TREE_02":{"address":5843564,"default_item":139,"flag":613},"BERRY_TREE_03":{"address":5843566,"default_item":142,"flag":614},"BERRY_TREE_04":{"address":5843568,"default_item":139,"flag":615},"BERRY_TREE_05":{"address":5843570,"default_item":133,"flag":616},"BERRY_TREE_06":{"address":5843572,"default_item":138,"flag":617},"BERRY_TREE_07":{"address":5843574,"default_item":133,"flag":618},"BERRY_TREE_08":{"address":5843576,"default_item":133,"flag":619},"BERRY_TREE_09":{"address":5843578,"default_item":142,"flag":620},"BERRY_TREE_10":{"address":5843580,"default_item":138,"flag":621},"BERRY_TREE_11":{"address":5843582,"default_item":139,"flag":622},"BERRY_TREE_12":{"address":5843584,"default_item":142,"flag":623},"BERRY_TREE_13":{"address":5843586,"default_item":135,"flag":624},"BERRY_TREE_14":{"address":5843588,"default_item":155,"flag":625},"BERRY_TREE_15":{"address":5843590,"default_item":153,"flag":626},"BERRY_TREE_16":{"address":5843592,"default_item":150,"flag":627},"BERRY_TREE_17":{"address":5843594,"default_item":150,"flag":628},"BERRY_TREE_18":{"address":5843596,"default_item":150,"flag":629},"BERRY_TREE_19":{"address":5843598,"default_item":148,"flag":630},"BERRY_TREE_20":{"address":5843600,"default_item":148,"flag":631},"BERRY_TREE_21":{"address":5843602,"default_item":136,"flag":632},"BERRY_TREE_22":{"address":5843604,"default_item":135,"flag":633},"BERRY_TREE_23":{"address":5843606,"default_item":135,"flag":634},"BERRY_TREE_24":{"address":5843608,"default_item":136,"flag":635},"BERRY_TREE_25":{"address":5843610,"default_item":152,"flag":636},"BERRY_TREE_26":{"address":5843612,"default_item":134,"flag":637},"BERRY_TREE_27":{"address":5843614,"default_item":151,"flag":638},"BERRY_TREE_28":{"address":5843616,"default_item":151,"flag":639},"BERRY_TREE_29":{"address":5843618,"default_item":151,"flag":640},"BERRY_TREE_30":{"address":5843620,"default_item":153,"flag":641},"BERRY_TREE_31":{"address":5843622,"default_item":142,"flag":642},"BERRY_TREE_32":{"address":5843624,"default_item":142,"flag":643},"BERRY_TREE_33":{"address":5843626,"default_item":142,"flag":644},"BERRY_TREE_34":{"address":5843628,"default_item":153,"flag":645},"BERRY_TREE_35":{"address":5843630,"default_item":153,"flag":646},"BERRY_TREE_36":{"address":5843632,"default_item":153,"flag":647},"BERRY_TREE_37":{"address":5843634,"default_item":137,"flag":648},"BERRY_TREE_38":{"address":5843636,"default_item":137,"flag":649},"BERRY_TREE_39":{"address":5843638,"default_item":137,"flag":650},"BERRY_TREE_40":{"address":5843640,"default_item":135,"flag":651},"BERRY_TREE_41":{"address":5843642,"default_item":135,"flag":652},"BERRY_TREE_42":{"address":5843644,"default_item":135,"flag":653},"BERRY_TREE_43":{"address":5843646,"default_item":148,"flag":654},"BERRY_TREE_44":{"address":5843648,"default_item":150,"flag":655},"BERRY_TREE_45":{"address":5843650,"default_item":152,"flag":656},"BERRY_TREE_46":{"address":5843652,"default_item":151,"flag":657},"BERRY_TREE_47":{"address":5843654,"default_item":140,"flag":658},"BERRY_TREE_48":{"address":5843656,"default_item":137,"flag":659},"BERRY_TREE_49":{"address":5843658,"default_item":136,"flag":660},"BERRY_TREE_50":{"address":5843660,"default_item":134,"flag":661},"BERRY_TREE_51":{"address":5843662,"default_item":142,"flag":662},"BERRY_TREE_52":{"address":5843664,"default_item":150,"flag":663},"BERRY_TREE_53":{"address":5843666,"default_item":150,"flag":664},"BERRY_TREE_54":{"address":5843668,"default_item":142,"flag":665},"BERRY_TREE_55":{"address":5843670,"default_item":149,"flag":666},"BERRY_TREE_56":{"address":5843672,"default_item":149,"flag":667},"BERRY_TREE_57":{"address":5843674,"default_item":136,"flag":668},"BERRY_TREE_58":{"address":5843676,"default_item":153,"flag":669},"BERRY_TREE_59":{"address":5843678,"default_item":153,"flag":670},"BERRY_TREE_60":{"address":5843680,"default_item":157,"flag":671},"BERRY_TREE_61":{"address":5843682,"default_item":157,"flag":672},"BERRY_TREE_62":{"address":5843684,"default_item":138,"flag":673},"BERRY_TREE_63":{"address":5843686,"default_item":142,"flag":674},"BERRY_TREE_64":{"address":5843688,"default_item":138,"flag":675},"BERRY_TREE_65":{"address":5843690,"default_item":157,"flag":676},"BERRY_TREE_66":{"address":5843692,"default_item":134,"flag":677},"BERRY_TREE_67":{"address":5843694,"default_item":152,"flag":678},"BERRY_TREE_68":{"address":5843696,"default_item":140,"flag":679},"BERRY_TREE_69":{"address":5843698,"default_item":154,"flag":680},"BERRY_TREE_70":{"address":5843700,"default_item":154,"flag":681},"BERRY_TREE_71":{"address":5843702,"default_item":154,"flag":682},"BERRY_TREE_72":{"address":5843704,"default_item":157,"flag":683},"BERRY_TREE_73":{"address":5843706,"default_item":155,"flag":684},"BERRY_TREE_74":{"address":5843708,"default_item":155,"flag":685},"BERRY_TREE_75":{"address":5843710,"default_item":142,"flag":686},"BERRY_TREE_76":{"address":5843712,"default_item":133,"flag":687},"BERRY_TREE_77":{"address":5843714,"default_item":140,"flag":688},"BERRY_TREE_78":{"address":5843716,"default_item":140,"flag":689},"BERRY_TREE_79":{"address":5843718,"default_item":155,"flag":690},"BERRY_TREE_80":{"address":5843720,"default_item":139,"flag":691},"BERRY_TREE_81":{"address":5843722,"default_item":139,"flag":692},"BERRY_TREE_82":{"address":5843724,"default_item":168,"flag":693},"BERRY_TREE_83":{"address":5843726,"default_item":156,"flag":694},"BERRY_TREE_84":{"address":5843728,"default_item":156,"flag":695},"BERRY_TREE_85":{"address":5843730,"default_item":142,"flag":696},"BERRY_TREE_86":{"address":5843732,"default_item":138,"flag":697},"BERRY_TREE_87":{"address":5843734,"default_item":135,"flag":698},"BERRY_TREE_88":{"address":5843736,"default_item":142,"flag":699},"HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY":{"address":5497200,"default_item":281,"flag":531},"HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY":{"address":5497212,"default_item":282,"flag":532},"HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY":{"address":5497224,"default_item":283,"flag":533},"HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY":{"address":5497236,"default_item":284,"flag":534},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM":{"address":5500100,"default_item":67,"flag":601},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON":{"address":5500124,"default_item":65,"flag":604},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN":{"address":5500112,"default_item":64,"flag":603},"HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC":{"address":5500088,"default_item":70,"flag":602},"HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET":{"address":5435924,"default_item":110,"flag":528},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_1":{"address":5487372,"default_item":195,"flag":548},"HIDDEN_ITEM_GRANITE_CAVE_B2F_EVERSTONE_2":{"address":5487384,"default_item":195,"flag":549},"HIDDEN_ITEM_JAGGED_PASS_FULL_HEAL":{"address":5489116,"default_item":23,"flag":577},"HIDDEN_ITEM_JAGGED_PASS_GREAT_BALL":{"address":5489128,"default_item":3,"flag":576},"HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL":{"address":5435672,"default_item":16,"flag":500},"HIDDEN_ITEM_LILYCOVE_CITY_HEART_SCALE":{"address":5432608,"default_item":111,"flag":527},"HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL":{"address":5432632,"default_item":4,"flag":575},"HIDDEN_ITEM_LILYCOVE_CITY_PP_UP":{"address":5432620,"default_item":69,"flag":543},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_MAX_ETHER":{"address":5490440,"default_item":35,"flag":578},"HIDDEN_ITEM_MT_PYRE_EXTERIOR_ULTRA_BALL":{"address":5490428,"default_item":2,"flag":529},"HIDDEN_ITEM_MT_PYRE_SUMMIT_RARE_CANDY":{"address":5490796,"default_item":68,"flag":580},"HIDDEN_ITEM_MT_PYRE_SUMMIT_ZINC":{"address":5490784,"default_item":70,"flag":579},"HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH":{"address":5525804,"default_item":45,"flag":609},"HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY":{"address":5428972,"default_item":68,"flag":595},"HIDDEN_ITEM_PETALBURG_WOODS_POKE_BALL":{"address":5487908,"default_item":4,"flag":561},"HIDDEN_ITEM_PETALBURG_WOODS_POTION":{"address":5487872,"default_item":13,"flag":558},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_1":{"address":5487884,"default_item":103,"flag":559},"HIDDEN_ITEM_PETALBURG_WOODS_TINY_MUSHROOM_2":{"address":5487896,"default_item":103,"flag":560},"HIDDEN_ITEM_ROUTE_104_ANTIDOTE":{"address":5438492,"default_item":14,"flag":585},"HIDDEN_ITEM_ROUTE_104_HEART_SCALE":{"address":5438504,"default_item":111,"flag":588},"HIDDEN_ITEM_ROUTE_104_POKE_BALL":{"address":5438468,"default_item":4,"flag":562},"HIDDEN_ITEM_ROUTE_104_POTION":{"address":5438480,"default_item":13,"flag":537},"HIDDEN_ITEM_ROUTE_104_SUPER_POTION":{"address":5438456,"default_item":22,"flag":544},"HIDDEN_ITEM_ROUTE_105_BIG_PEARL":{"address":5438748,"default_item":107,"flag":611},"HIDDEN_ITEM_ROUTE_105_HEART_SCALE":{"address":5438736,"default_item":111,"flag":589},"HIDDEN_ITEM_ROUTE_106_HEART_SCALE":{"address":5438932,"default_item":111,"flag":547},"HIDDEN_ITEM_ROUTE_106_POKE_BALL":{"address":5438908,"default_item":4,"flag":563},"HIDDEN_ITEM_ROUTE_106_STARDUST":{"address":5438920,"default_item":108,"flag":546},"HIDDEN_ITEM_ROUTE_108_RARE_CANDY":{"address":5439340,"default_item":68,"flag":586},"HIDDEN_ITEM_ROUTE_109_ETHER":{"address":5440016,"default_item":34,"flag":564},"HIDDEN_ITEM_ROUTE_109_GREAT_BALL":{"address":5440004,"default_item":3,"flag":551},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_1":{"address":5439992,"default_item":111,"flag":552},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_2":{"address":5440028,"default_item":111,"flag":590},"HIDDEN_ITEM_ROUTE_109_HEART_SCALE_3":{"address":5440040,"default_item":111,"flag":591},"HIDDEN_ITEM_ROUTE_109_REVIVE":{"address":5439980,"default_item":24,"flag":550},"HIDDEN_ITEM_ROUTE_110_FULL_HEAL":{"address":5441308,"default_item":23,"flag":555},"HIDDEN_ITEM_ROUTE_110_GREAT_BALL":{"address":5441284,"default_item":3,"flag":553},"HIDDEN_ITEM_ROUTE_110_POKE_BALL":{"address":5441296,"default_item":4,"flag":565},"HIDDEN_ITEM_ROUTE_110_REVIVE":{"address":5441272,"default_item":24,"flag":554},"HIDDEN_ITEM_ROUTE_111_PROTEIN":{"address":5443220,"default_item":64,"flag":556},"HIDDEN_ITEM_ROUTE_111_RARE_CANDY":{"address":5443232,"default_item":68,"flag":557},"HIDDEN_ITEM_ROUTE_111_STARDUST":{"address":5443160,"default_item":108,"flag":502},"HIDDEN_ITEM_ROUTE_113_ETHER":{"address":5444488,"default_item":34,"flag":503},"HIDDEN_ITEM_ROUTE_113_NUGGET":{"address":5444512,"default_item":110,"flag":598},"HIDDEN_ITEM_ROUTE_113_TM_DOUBLE_TEAM":{"address":5444500,"default_item":320,"flag":530},"HIDDEN_ITEM_ROUTE_114_CARBOS":{"address":5445340,"default_item":66,"flag":504},"HIDDEN_ITEM_ROUTE_114_REVIVE":{"address":5445364,"default_item":24,"flag":542},"HIDDEN_ITEM_ROUTE_115_HEART_SCALE":{"address":5446176,"default_item":111,"flag":597},"HIDDEN_ITEM_ROUTE_116_BLACK_GLASSES":{"address":5447056,"default_item":206,"flag":596},"HIDDEN_ITEM_ROUTE_116_SUPER_POTION":{"address":5447044,"default_item":22,"flag":545},"HIDDEN_ITEM_ROUTE_117_REPEL":{"address":5447708,"default_item":86,"flag":572},"HIDDEN_ITEM_ROUTE_118_HEART_SCALE":{"address":5448404,"default_item":111,"flag":566},"HIDDEN_ITEM_ROUTE_118_IRON":{"address":5448392,"default_item":65,"flag":567},"HIDDEN_ITEM_ROUTE_119_CALCIUM":{"address":5449972,"default_item":67,"flag":505},"HIDDEN_ITEM_ROUTE_119_FULL_HEAL":{"address":5450056,"default_item":23,"flag":568},"HIDDEN_ITEM_ROUTE_119_MAX_ETHER":{"address":5450068,"default_item":35,"flag":587},"HIDDEN_ITEM_ROUTE_119_ULTRA_BALL":{"address":5449984,"default_item":2,"flag":506},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1":{"address":5451596,"default_item":68,"flag":571},"HIDDEN_ITEM_ROUTE_120_RARE_CANDY_2":{"address":5451620,"default_item":68,"flag":569},"HIDDEN_ITEM_ROUTE_120_REVIVE":{"address":5451608,"default_item":24,"flag":584},"HIDDEN_ITEM_ROUTE_120_ZINC":{"address":5451632,"default_item":70,"flag":570},"HIDDEN_ITEM_ROUTE_121_FULL_HEAL":{"address":5452540,"default_item":23,"flag":573},"HIDDEN_ITEM_ROUTE_121_HP_UP":{"address":5452516,"default_item":63,"flag":539},"HIDDEN_ITEM_ROUTE_121_MAX_REVIVE":{"address":5452552,"default_item":25,"flag":600},"HIDDEN_ITEM_ROUTE_121_NUGGET":{"address":5452528,"default_item":110,"flag":540},"HIDDEN_ITEM_ROUTE_123_HYPER_POTION":{"address":5454100,"default_item":21,"flag":574},"HIDDEN_ITEM_ROUTE_123_PP_UP":{"address":5454112,"default_item":69,"flag":599},"HIDDEN_ITEM_ROUTE_123_RARE_CANDY":{"address":5454124,"default_item":68,"flag":610},"HIDDEN_ITEM_ROUTE_123_REVIVE":{"address":5454088,"default_item":24,"flag":541},"HIDDEN_ITEM_ROUTE_123_SUPER_REPEL":{"address":5454052,"default_item":83,"flag":507},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_1":{"address":5455620,"default_item":111,"flag":592},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_2":{"address":5455632,"default_item":111,"flag":593},"HIDDEN_ITEM_ROUTE_128_HEART_SCALE_3":{"address":5455644,"default_item":111,"flag":594},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_RARE_CANDY":{"address":5517256,"default_item":68,"flag":606},"HIDDEN_ITEM_SAFARI_ZONE_NORTH_EAST_ZINC":{"address":5517268,"default_item":70,"flag":607},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_FULL_RESTORE":{"address":5517432,"default_item":19,"flag":605},"HIDDEN_ITEM_SAFARI_ZONE_SOUTH_EAST_PP_UP":{"address":5517420,"default_item":69,"flag":608},"HIDDEN_ITEM_SS_TIDAL_LOWER_DECK_LEFTOVERS":{"address":5511292,"default_item":200,"flag":535},"HIDDEN_ITEM_TRICK_HOUSE_NUGGET":{"address":5526716,"default_item":110,"flag":501},"HIDDEN_ITEM_UNDERWATER_124_BIG_PEARL":{"address":5456992,"default_item":107,"flag":511},"HIDDEN_ITEM_UNDERWATER_124_CALCIUM":{"address":5457016,"default_item":67,"flag":536},"HIDDEN_ITEM_UNDERWATER_124_CARBOS":{"address":5456956,"default_item":66,"flag":508},"HIDDEN_ITEM_UNDERWATER_124_GREEN_SHARD":{"address":5456968,"default_item":51,"flag":509},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_1":{"address":5457004,"default_item":111,"flag":513},"HIDDEN_ITEM_UNDERWATER_124_HEART_SCALE_2":{"address":5457028,"default_item":111,"flag":538},"HIDDEN_ITEM_UNDERWATER_124_PEARL":{"address":5456980,"default_item":106,"flag":510},"HIDDEN_ITEM_UNDERWATER_126_BIG_PEARL":{"address":5457140,"default_item":107,"flag":520},"HIDDEN_ITEM_UNDERWATER_126_BLUE_SHARD":{"address":5457152,"default_item":49,"flag":512},"HIDDEN_ITEM_UNDERWATER_126_HEART_SCALE":{"address":5457068,"default_item":111,"flag":514},"HIDDEN_ITEM_UNDERWATER_126_IRON":{"address":5457116,"default_item":65,"flag":519},"HIDDEN_ITEM_UNDERWATER_126_PEARL":{"address":5457104,"default_item":106,"flag":517},"HIDDEN_ITEM_UNDERWATER_126_STARDUST":{"address":5457092,"default_item":108,"flag":516},"HIDDEN_ITEM_UNDERWATER_126_ULTRA_BALL":{"address":5457080,"default_item":2,"flag":515},"HIDDEN_ITEM_UNDERWATER_126_YELLOW_SHARD":{"address":5457128,"default_item":50,"flag":518},"HIDDEN_ITEM_UNDERWATER_127_HEART_SCALE":{"address":5457224,"default_item":111,"flag":523},"HIDDEN_ITEM_UNDERWATER_127_HP_UP":{"address":5457212,"default_item":63,"flag":522},"HIDDEN_ITEM_UNDERWATER_127_RED_SHARD":{"address":5457236,"default_item":48,"flag":524},"HIDDEN_ITEM_UNDERWATER_127_STAR_PIECE":{"address":5457200,"default_item":109,"flag":521},"HIDDEN_ITEM_UNDERWATER_128_PEARL":{"address":5457288,"default_item":106,"flag":526},"HIDDEN_ITEM_UNDERWATER_128_PROTEIN":{"address":5457276,"default_item":64,"flag":525},"HIDDEN_ITEM_VICTORY_ROAD_1F_ULTRA_BALL":{"address":5493932,"default_item":2,"flag":581},"HIDDEN_ITEM_VICTORY_ROAD_B2F_ELIXIR":{"address":5494744,"default_item":36,"flag":582},"HIDDEN_ITEM_VICTORY_ROAD_B2F_MAX_REPEL":{"address":5494756,"default_item":84,"flag":583},"ITEM_ABANDONED_SHIP_CAPTAINS_OFFICE_STORAGE_KEY":{"address":2709805,"default_item":285,"flag":1100},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_1_TM_RAIN_DANCE":{"address":2709857,"default_item":306,"flag":1102},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_2_SCANNER":{"address":2709831,"default_item":278,"flag":1078},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_3_WATER_STONE":{"address":2709844,"default_item":97,"flag":1101},"ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOM_6_LUXURY_BALL":{"address":2709818,"default_item":11,"flag":1077},"ITEM_ABANDONED_SHIP_ROOMS_1F_HARBOR_MAIL":{"address":2709740,"default_item":122,"flag":1095},"ITEM_ABANDONED_SHIP_ROOMS_2_1F_REVIVE":{"address":2709792,"default_item":24,"flag":1099},"ITEM_ABANDONED_SHIP_ROOMS_2_B1F_DIVE_BALL":{"address":2709766,"default_item":7,"flag":1097},"ITEM_ABANDONED_SHIP_ROOMS_B1F_ESCAPE_ROPE":{"address":2709753,"default_item":85,"flag":1096},"ITEM_ABANDONED_SHIP_ROOMS_B1F_TM_ICE_BEAM":{"address":2709779,"default_item":301,"flag":1098},"ITEM_AQUA_HIDEOUT_B1F_MASTER_BALL":{"address":2710039,"default_item":1,"flag":1124},"ITEM_AQUA_HIDEOUT_B1F_MAX_ELIXIR":{"address":2710065,"default_item":37,"flag":1071},"ITEM_AQUA_HIDEOUT_B1F_NUGGET":{"address":2710052,"default_item":110,"flag":1132},"ITEM_AQUA_HIDEOUT_B2F_NEST_BALL":{"address":2710078,"default_item":8,"flag":1072},"ITEM_ARTISAN_CAVE_1F_CARBOS":{"address":2710416,"default_item":66,"flag":1163},"ITEM_ARTISAN_CAVE_B1F_HP_UP":{"address":2710403,"default_item":63,"flag":1162},"ITEM_FIERY_PATH_FIRE_STONE":{"address":2709584,"default_item":95,"flag":1111},"ITEM_FIERY_PATH_TM_TOXIC":{"address":2709597,"default_item":294,"flag":1091},"ITEM_GRANITE_CAVE_1F_ESCAPE_ROPE":{"address":2709519,"default_item":85,"flag":1050},"ITEM_GRANITE_CAVE_B1F_POKE_BALL":{"address":2709532,"default_item":4,"flag":1051},"ITEM_GRANITE_CAVE_B2F_RARE_CANDY":{"address":2709558,"default_item":68,"flag":1054},"ITEM_GRANITE_CAVE_B2F_REPEL":{"address":2709545,"default_item":86,"flag":1053},"ITEM_JAGGED_PASS_BURN_HEAL":{"address":2709571,"default_item":15,"flag":1070},"ITEM_LILYCOVE_CITY_MAX_REPEL":{"address":2709415,"default_item":84,"flag":1042},"ITEM_MAGMA_HIDEOUT_1F_RARE_CANDY":{"address":2710429,"default_item":68,"flag":1151},"ITEM_MAGMA_HIDEOUT_2F_2R_FULL_RESTORE":{"address":2710455,"default_item":19,"flag":1165},"ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR":{"address":2710442,"default_item":37,"flag":1164},"ITEM_MAGMA_HIDEOUT_3F_1R_NUGGET":{"address":2710468,"default_item":110,"flag":1166},"ITEM_MAGMA_HIDEOUT_3F_2R_PP_MAX":{"address":2710481,"default_item":71,"flag":1167},"ITEM_MAGMA_HIDEOUT_3F_3R_ECAPE_ROPE":{"address":2710507,"default_item":85,"flag":1059},"ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE":{"address":2710494,"default_item":25,"flag":1168},"ITEM_MAUVILLE_CITY_X_SPEED":{"address":2709389,"default_item":77,"flag":1116},"ITEM_METEOR_FALLS_1F_1R_FULL_HEAL":{"address":2709623,"default_item":23,"flag":1045},"ITEM_METEOR_FALLS_1F_1R_MOON_STONE":{"address":2709636,"default_item":94,"flag":1046},"ITEM_METEOR_FALLS_1F_1R_PP_UP":{"address":2709649,"default_item":69,"flag":1047},"ITEM_METEOR_FALLS_1F_1R_TM_IRON_TAIL":{"address":2709610,"default_item":311,"flag":1044},"ITEM_METEOR_FALLS_B1F_2R_TM_DRAGON_CLAW":{"address":2709662,"default_item":290,"flag":1080},"ITEM_MOSSDEEP_CITY_NET_BALL":{"address":2709428,"default_item":6,"flag":1043},"ITEM_MT_PYRE_2F_ULTRA_BALL":{"address":2709948,"default_item":2,"flag":1129},"ITEM_MT_PYRE_3F_SUPER_REPEL":{"address":2709961,"default_item":83,"flag":1120},"ITEM_MT_PYRE_4F_SEA_INCENSE":{"address":2709974,"default_item":220,"flag":1130},"ITEM_MT_PYRE_5F_LAX_INCENSE":{"address":2709987,"default_item":221,"flag":1052},"ITEM_MT_PYRE_6F_TM_SHADOW_BALL":{"address":2710000,"default_item":318,"flag":1089},"ITEM_MT_PYRE_EXTERIOR_MAX_POTION":{"address":2710013,"default_item":20,"flag":1073},"ITEM_MT_PYRE_EXTERIOR_TM_SKILL_SWAP":{"address":2710026,"default_item":336,"flag":1074},"ITEM_NEW_MAUVILLE_ESCAPE_ROPE":{"address":2709688,"default_item":85,"flag":1076},"ITEM_NEW_MAUVILLE_FULL_HEAL":{"address":2709714,"default_item":23,"flag":1122},"ITEM_NEW_MAUVILLE_PARALYZE_HEAL":{"address":2709727,"default_item":18,"flag":1123},"ITEM_NEW_MAUVILLE_THUNDER_STONE":{"address":2709701,"default_item":96,"flag":1110},"ITEM_NEW_MAUVILLE_ULTRA_BALL":{"address":2709675,"default_item":2,"flag":1075},"ITEM_PETALBURG_CITY_ETHER":{"address":2709376,"default_item":34,"flag":1040},"ITEM_PETALBURG_CITY_MAX_REVIVE":{"address":2709363,"default_item":25,"flag":1039},"ITEM_PETALBURG_WOODS_ETHER":{"address":2709467,"default_item":34,"flag":1058},"ITEM_PETALBURG_WOODS_GREAT_BALL":{"address":2709454,"default_item":3,"flag":1056},"ITEM_PETALBURG_WOODS_PARALYZE_HEAL":{"address":2709480,"default_item":18,"flag":1117},"ITEM_PETALBURG_WOODS_X_ATTACK":{"address":2709441,"default_item":75,"flag":1055},"ITEM_ROUTE_102_POTION":{"address":2708375,"default_item":13,"flag":1000},"ITEM_ROUTE_103_GUARD_SPEC":{"address":2708388,"default_item":73,"flag":1114},"ITEM_ROUTE_103_PP_UP":{"address":2708401,"default_item":69,"flag":1137},"ITEM_ROUTE_104_POKE_BALL":{"address":2708427,"default_item":4,"flag":1057},"ITEM_ROUTE_104_POTION":{"address":2708453,"default_item":13,"flag":1135},"ITEM_ROUTE_104_PP_UP":{"address":2708414,"default_item":69,"flag":1002},"ITEM_ROUTE_104_X_ACCURACY":{"address":2708440,"default_item":78,"flag":1115},"ITEM_ROUTE_105_IRON":{"address":2708466,"default_item":65,"flag":1003},"ITEM_ROUTE_106_PROTEIN":{"address":2708479,"default_item":64,"flag":1004},"ITEM_ROUTE_108_STAR_PIECE":{"address":2708492,"default_item":109,"flag":1139},"ITEM_ROUTE_109_POTION":{"address":2708518,"default_item":13,"flag":1140},"ITEM_ROUTE_109_PP_UP":{"address":2708505,"default_item":69,"flag":1005},"ITEM_ROUTE_110_DIRE_HIT":{"address":2708544,"default_item":74,"flag":1007},"ITEM_ROUTE_110_ELIXIR":{"address":2708557,"default_item":36,"flag":1141},"ITEM_ROUTE_110_RARE_CANDY":{"address":2708531,"default_item":68,"flag":1006},"ITEM_ROUTE_111_ELIXIR":{"address":2708609,"default_item":36,"flag":1142},"ITEM_ROUTE_111_HP_UP":{"address":2708596,"default_item":63,"flag":1010},"ITEM_ROUTE_111_STARDUST":{"address":2708583,"default_item":108,"flag":1009},"ITEM_ROUTE_111_TM_SANDSTORM":{"address":2708570,"default_item":325,"flag":1008},"ITEM_ROUTE_112_NUGGET":{"address":2708622,"default_item":110,"flag":1011},"ITEM_ROUTE_113_HYPER_POTION":{"address":2708661,"default_item":21,"flag":1143},"ITEM_ROUTE_113_MAX_ETHER":{"address":2708635,"default_item":35,"flag":1012},"ITEM_ROUTE_113_SUPER_REPEL":{"address":2708648,"default_item":83,"flag":1013},"ITEM_ROUTE_114_ENERGY_POWDER":{"address":2708700,"default_item":30,"flag":1160},"ITEM_ROUTE_114_PROTEIN":{"address":2708687,"default_item":64,"flag":1015},"ITEM_ROUTE_114_RARE_CANDY":{"address":2708674,"default_item":68,"flag":1014},"ITEM_ROUTE_115_GREAT_BALL":{"address":2708752,"default_item":3,"flag":1118},"ITEM_ROUTE_115_HEAL_POWDER":{"address":2708765,"default_item":32,"flag":1144},"ITEM_ROUTE_115_IRON":{"address":2708739,"default_item":65,"flag":1018},"ITEM_ROUTE_115_PP_UP":{"address":2708778,"default_item":69,"flag":1161},"ITEM_ROUTE_115_SUPER_POTION":{"address":2708713,"default_item":22,"flag":1016},"ITEM_ROUTE_115_TM_FOCUS_PUNCH":{"address":2708726,"default_item":289,"flag":1017},"ITEM_ROUTE_116_ETHER":{"address":2708804,"default_item":34,"flag":1019},"ITEM_ROUTE_116_HP_UP":{"address":2708830,"default_item":63,"flag":1021},"ITEM_ROUTE_116_POTION":{"address":2708843,"default_item":13,"flag":1146},"ITEM_ROUTE_116_REPEL":{"address":2708817,"default_item":86,"flag":1020},"ITEM_ROUTE_116_X_SPECIAL":{"address":2708791,"default_item":79,"flag":1001},"ITEM_ROUTE_117_GREAT_BALL":{"address":2708856,"default_item":3,"flag":1022},"ITEM_ROUTE_117_REVIVE":{"address":2708869,"default_item":24,"flag":1023},"ITEM_ROUTE_118_HYPER_POTION":{"address":2708882,"default_item":21,"flag":1121},"ITEM_ROUTE_119_ELIXIR_1":{"address":2708921,"default_item":36,"flag":1026},"ITEM_ROUTE_119_ELIXIR_2":{"address":2708986,"default_item":36,"flag":1147},"ITEM_ROUTE_119_HYPER_POTION_1":{"address":2708960,"default_item":21,"flag":1029},"ITEM_ROUTE_119_HYPER_POTION_2":{"address":2708973,"default_item":21,"flag":1106},"ITEM_ROUTE_119_LEAF_STONE":{"address":2708934,"default_item":98,"flag":1027},"ITEM_ROUTE_119_NUGGET":{"address":2710104,"default_item":110,"flag":1134},"ITEM_ROUTE_119_RARE_CANDY":{"address":2708947,"default_item":68,"flag":1028},"ITEM_ROUTE_119_SUPER_REPEL":{"address":2708895,"default_item":83,"flag":1024},"ITEM_ROUTE_119_ZINC":{"address":2708908,"default_item":70,"flag":1025},"ITEM_ROUTE_120_FULL_HEAL":{"address":2709012,"default_item":23,"flag":1031},"ITEM_ROUTE_120_HYPER_POTION":{"address":2709025,"default_item":21,"flag":1107},"ITEM_ROUTE_120_NEST_BALL":{"address":2709038,"default_item":8,"flag":1108},"ITEM_ROUTE_120_NUGGET":{"address":2708999,"default_item":110,"flag":1030},"ITEM_ROUTE_120_REVIVE":{"address":2709051,"default_item":24,"flag":1148},"ITEM_ROUTE_121_CARBOS":{"address":2709064,"default_item":66,"flag":1103},"ITEM_ROUTE_121_REVIVE":{"address":2709077,"default_item":24,"flag":1149},"ITEM_ROUTE_121_ZINC":{"address":2709090,"default_item":70,"flag":1150},"ITEM_ROUTE_123_CALCIUM":{"address":2709103,"default_item":67,"flag":1032},"ITEM_ROUTE_123_ELIXIR":{"address":2709129,"default_item":36,"flag":1109},"ITEM_ROUTE_123_PP_UP":{"address":2709142,"default_item":69,"flag":1152},"ITEM_ROUTE_123_REVIVAL_HERB":{"address":2709155,"default_item":33,"flag":1153},"ITEM_ROUTE_123_ULTRA_BALL":{"address":2709116,"default_item":2,"flag":1104},"ITEM_ROUTE_124_BLUE_SHARD":{"address":2709181,"default_item":49,"flag":1093},"ITEM_ROUTE_124_RED_SHARD":{"address":2709168,"default_item":48,"flag":1092},"ITEM_ROUTE_124_YELLOW_SHARD":{"address":2709194,"default_item":50,"flag":1066},"ITEM_ROUTE_125_BIG_PEARL":{"address":2709207,"default_item":107,"flag":1154},"ITEM_ROUTE_126_GREEN_SHARD":{"address":2709220,"default_item":51,"flag":1105},"ITEM_ROUTE_127_CARBOS":{"address":2709246,"default_item":66,"flag":1035},"ITEM_ROUTE_127_RARE_CANDY":{"address":2709259,"default_item":68,"flag":1155},"ITEM_ROUTE_127_ZINC":{"address":2709233,"default_item":70,"flag":1034},"ITEM_ROUTE_132_PROTEIN":{"address":2709285,"default_item":64,"flag":1156},"ITEM_ROUTE_132_RARE_CANDY":{"address":2709272,"default_item":68,"flag":1036},"ITEM_ROUTE_133_BIG_PEARL":{"address":2709298,"default_item":107,"flag":1037},"ITEM_ROUTE_133_MAX_REVIVE":{"address":2709324,"default_item":25,"flag":1157},"ITEM_ROUTE_133_STAR_PIECE":{"address":2709311,"default_item":109,"flag":1038},"ITEM_ROUTE_134_CARBOS":{"address":2709337,"default_item":66,"flag":1158},"ITEM_ROUTE_134_STAR_PIECE":{"address":2709350,"default_item":109,"flag":1159},"ITEM_RUSTBORO_CITY_X_DEFEND":{"address":2709402,"default_item":76,"flag":1041},"ITEM_RUSTURF_TUNNEL_MAX_ETHER":{"address":2709506,"default_item":35,"flag":1049},"ITEM_RUSTURF_TUNNEL_POKE_BALL":{"address":2709493,"default_item":4,"flag":1048},"ITEM_SAFARI_ZONE_NORTH_CALCIUM":{"address":2709896,"default_item":67,"flag":1119},"ITEM_SAFARI_ZONE_NORTH_EAST_NUGGET":{"address":2709922,"default_item":110,"flag":1169},"ITEM_SAFARI_ZONE_NORTH_WEST_TM_SOLAR_BEAM":{"address":2709883,"default_item":310,"flag":1094},"ITEM_SAFARI_ZONE_SOUTH_EAST_BIG_PEARL":{"address":2709935,"default_item":107,"flag":1170},"ITEM_SAFARI_ZONE_SOUTH_WEST_MAX_REVIVE":{"address":2709909,"default_item":25,"flag":1131},"ITEM_SCORCHED_SLAB_TM_SUNNY_DAY":{"address":2709870,"default_item":299,"flag":1079},"ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE":{"address":2710208,"default_item":314,"flag":1090},"ITEM_SHOAL_CAVE_ENTRANCE_BIG_PEARL":{"address":2710143,"default_item":107,"flag":1081},"ITEM_SHOAL_CAVE_ICE_ROOM_NEVER_MELT_ICE":{"address":2710195,"default_item":212,"flag":1113},"ITEM_SHOAL_CAVE_ICE_ROOM_TM_HAIL":{"address":2710182,"default_item":295,"flag":1112},"ITEM_SHOAL_CAVE_INNER_ROOM_RARE_CANDY":{"address":2710156,"default_item":68,"flag":1082},"ITEM_SHOAL_CAVE_STAIRS_ROOM_ICE_HEAL":{"address":2710169,"default_item":16,"flag":1083},"ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL":{"address":[2710221,2551006],"default_item":121,"flag":1060},"ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL":{"address":[2710234,2551032],"default_item":122,"flag":1061},"ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL":{"address":[2710247,2551058],"default_item":126,"flag":1062},"ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL":{"address":[2710260,2551084],"default_item":128,"flag":1063},"ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL":{"address":[2710273,2551110],"default_item":125,"flag":1064},"ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL":{"address":[2710286,2551136],"default_item":124,"flag":1065},"ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL":{"address":[2710299,2551162],"default_item":123,"flag":1067},"ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL":{"address":[2710312,2551188],"default_item":129,"flag":1068},"ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL":{"address":[2710325,2551214],"default_item":127,"flag":1069},"ITEM_VICTORY_ROAD_1F_MAX_ELIXIR":{"address":2710338,"default_item":37,"flag":1084},"ITEM_VICTORY_ROAD_1F_PP_UP":{"address":2710351,"default_item":69,"flag":1085},"ITEM_VICTORY_ROAD_B1F_FULL_RESTORE":{"address":2710377,"default_item":19,"flag":1087},"ITEM_VICTORY_ROAD_B1F_TM_PSYCHIC":{"address":2710364,"default_item":317,"flag":1086},"ITEM_VICTORY_ROAD_B2F_FULL_HEAL":{"address":2710390,"default_item":23,"flag":1088},"NPC_GIFT_BERRY_MASTERS_WIFE":{"address":2570453,"default_item":133,"flag":1197},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_1":{"address":2570263,"default_item":153,"flag":1195},"NPC_GIFT_BERRY_MASTER_RECEIVED_BERRY_2":{"address":2570315,"default_item":154,"flag":1196},"NPC_GIFT_FLOWER_SHOP_RECEIVED_BERRY":{"address":2284375,"default_item":133,"flag":1207},"NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON":{"address":1971718,"default_item":271,"flag":208},"NPC_GIFT_GOT_TM_THUNDERBOLT_FROM_WATTSON":{"address":1971754,"default_item":312,"flag":209},"NPC_GIFT_LILYCOVE_RECEIVED_BERRY":{"address":1985277,"default_item":141,"flag":1208},"NPC_GIFT_RECEIVED_6_SODA_POP":{"address":2543767,"default_item":27,"flag":140},"NPC_GIFT_RECEIVED_ACRO_BIKE":{"address":2170570,"default_item":272,"flag":1181},"NPC_GIFT_RECEIVED_AMULET_COIN":{"address":2716248,"default_item":189,"flag":133},"NPC_GIFT_RECEIVED_AURORA_TICKET":{"address":2716523,"default_item":371,"flag":314},"NPC_GIFT_RECEIVED_CHARCOAL":{"address":2102559,"default_item":215,"flag":254},"NPC_GIFT_RECEIVED_CHESTO_BERRY_ROUTE_104":{"address":2028703,"default_item":134,"flag":246},"NPC_GIFT_RECEIVED_CLEANSE_TAG":{"address":2312109,"default_item":190,"flag":282},"NPC_GIFT_RECEIVED_COIN_CASE":{"address":2179054,"default_item":260,"flag":258},"NPC_GIFT_RECEIVED_DEEP_SEA_SCALE":{"address":2162572,"default_item":193,"flag":1190},"NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH":{"address":2162555,"default_item":192,"flag":1191},"NPC_GIFT_RECEIVED_DEVON_GOODS_RUSTURF_TUNNEL":{"address":2295814,"default_item":269,"flag":1172},"NPC_GIFT_RECEIVED_DEVON_SCOPE":{"address":2065146,"default_item":288,"flag":285},"NPC_GIFT_RECEIVED_EON_TICKET":{"address":2716574,"default_item":275,"flag":474},"NPC_GIFT_RECEIVED_EXP_SHARE":{"address":2185525,"default_item":182,"flag":272},"NPC_GIFT_RECEIVED_FIRST_POKEBALLS":{"address":2085751,"default_item":4,"flag":233},"NPC_GIFT_RECEIVED_FOCUS_BAND":{"address":2337807,"default_item":196,"flag":283},"NPC_GIFT_RECEIVED_GOOD_ROD":{"address":2058408,"default_item":263,"flag":227},"NPC_GIFT_RECEIVED_GO_GOGGLES":{"address":2017746,"default_item":279,"flag":221},"NPC_GIFT_RECEIVED_GREAT_BALL_PETALBURG_WOODS":{"address":2300119,"default_item":3,"flag":1171},"NPC_GIFT_RECEIVED_GREAT_BALL_RUSTBORO_CITY":{"address":1977146,"default_item":3,"flag":1173},"NPC_GIFT_RECEIVED_HM_CUT":{"address":2199532,"default_item":339,"flag":137},"NPC_GIFT_RECEIVED_HM_DIVE":{"address":2252095,"default_item":346,"flag":123},"NPC_GIFT_RECEIVED_HM_FLASH":{"address":2298287,"default_item":343,"flag":109},"NPC_GIFT_RECEIVED_HM_FLY":{"address":2060636,"default_item":340,"flag":110},"NPC_GIFT_RECEIVED_HM_ROCK_SMASH":{"address":2174128,"default_item":344,"flag":107},"NPC_GIFT_RECEIVED_HM_STRENGTH":{"address":2295305,"default_item":342,"flag":106},"NPC_GIFT_RECEIVED_HM_SURF":{"address":2126671,"default_item":341,"flag":122},"NPC_GIFT_RECEIVED_HM_WATERFALL":{"address":1999854,"default_item":345,"flag":312},"NPC_GIFT_RECEIVED_ITEMFINDER":{"address":2039874,"default_item":261,"flag":1176},"NPC_GIFT_RECEIVED_KINGS_ROCK":{"address":1993670,"default_item":187,"flag":276},"NPC_GIFT_RECEIVED_LETTER":{"address":2185301,"default_item":274,"flag":1174},"NPC_GIFT_RECEIVED_MACHO_BRACE":{"address":2284472,"default_item":181,"flag":277},"NPC_GIFT_RECEIVED_MACH_BIKE":{"address":2170553,"default_item":259,"flag":1180},"NPC_GIFT_RECEIVED_MAGMA_EMBLEM":{"address":2316671,"default_item":375,"flag":1177},"NPC_GIFT_RECEIVED_MENTAL_HERB":{"address":2208103,"default_item":185,"flag":223},"NPC_GIFT_RECEIVED_METEORITE":{"address":2304222,"default_item":280,"flag":115},"NPC_GIFT_RECEIVED_MIRACLE_SEED":{"address":2300337,"default_item":205,"flag":297},"NPC_GIFT_RECEIVED_MYSTIC_TICKET":{"address":2716540,"default_item":370,"flag":315},"NPC_GIFT_RECEIVED_OLD_ROD":{"address":2012541,"default_item":262,"flag":257},"NPC_GIFT_RECEIVED_OLD_SEA_MAP":{"address":2716557,"default_item":376,"flag":316},"NPC_GIFT_RECEIVED_POKEBLOCK_CASE":{"address":2614193,"default_item":273,"flag":95},"NPC_GIFT_RECEIVED_POTION_OLDALE":{"address":2010888,"default_item":13,"flag":132},"NPC_GIFT_RECEIVED_POWDER_JAR":{"address":1962504,"default_item":372,"flag":337},"NPC_GIFT_RECEIVED_PREMIER_BALL_RUSTBORO":{"address":2200571,"default_item":12,"flag":213},"NPC_GIFT_RECEIVED_QUICK_CLAW":{"address":2192227,"default_item":183,"flag":275},"NPC_GIFT_RECEIVED_REPEAT_BALL":{"address":2053722,"default_item":9,"flag":256},"NPC_GIFT_RECEIVED_SECRET_POWER":{"address":2598914,"default_item":331,"flag":96},"NPC_GIFT_RECEIVED_SILK_SCARF":{"address":2101830,"default_item":217,"flag":289},"NPC_GIFT_RECEIVED_SOFT_SAND":{"address":2035664,"default_item":203,"flag":280},"NPC_GIFT_RECEIVED_SOOTHE_BELL":{"address":2151278,"default_item":184,"flag":278},"NPC_GIFT_RECEIVED_SOOT_SACK":{"address":2567245,"default_item":270,"flag":1033},"NPC_GIFT_RECEIVED_SS_TICKET":{"address":2716506,"default_item":265,"flag":291},"NPC_GIFT_RECEIVED_SUN_STONE_MOSSDEEP":{"address":2254406,"default_item":93,"flag":192},"NPC_GIFT_RECEIVED_SUPER_ROD":{"address":2251560,"default_item":264,"flag":152},"NPC_GIFT_RECEIVED_TM_AERIAL_ACE":{"address":2202201,"default_item":328,"flag":170},"NPC_GIFT_RECEIVED_TM_ATTRACT":{"address":2116413,"default_item":333,"flag":235},"NPC_GIFT_RECEIVED_TM_BRICK_BREAK":{"address":2269085,"default_item":319,"flag":121},"NPC_GIFT_RECEIVED_TM_BULK_UP":{"address":2095210,"default_item":296,"flag":166},"NPC_GIFT_RECEIVED_TM_BULLET_SEED":{"address":2028910,"default_item":297,"flag":262},"NPC_GIFT_RECEIVED_TM_CALM_MIND":{"address":2244066,"default_item":292,"flag":171},"NPC_GIFT_RECEIVED_TM_DIG":{"address":2286669,"default_item":316,"flag":261},"NPC_GIFT_RECEIVED_TM_FACADE":{"address":2129909,"default_item":330,"flag":169},"NPC_GIFT_RECEIVED_TM_FRUSTRATION":{"address":2124110,"default_item":309,"flag":1179},"NPC_GIFT_RECEIVED_TM_GIGA_DRAIN":{"address":2068012,"default_item":307,"flag":232},"NPC_GIFT_RECEIVED_TM_HIDDEN_POWER":{"address":2206905,"default_item":298,"flag":264},"NPC_GIFT_RECEIVED_TM_OVERHEAT":{"address":2103328,"default_item":338,"flag":168},"NPC_GIFT_RECEIVED_TM_REST":{"address":2236966,"default_item":332,"flag":234},"NPC_GIFT_RECEIVED_TM_RETURN":{"address":2113546,"default_item":315,"flag":229},"NPC_GIFT_RECEIVED_TM_RETURN_2":{"address":2124055,"default_item":315,"flag":1178},"NPC_GIFT_RECEIVED_TM_ROAR":{"address":2051750,"default_item":293,"flag":231},"NPC_GIFT_RECEIVED_TM_ROCK_TOMB":{"address":2188088,"default_item":327,"flag":165},"NPC_GIFT_RECEIVED_TM_SHOCK_WAVE":{"address":2167340,"default_item":322,"flag":167},"NPC_GIFT_RECEIVED_TM_SLUDGE_BOMB":{"address":2099189,"default_item":324,"flag":230},"NPC_GIFT_RECEIVED_TM_SNATCH":{"address":2360766,"default_item":337,"flag":260},"NPC_GIFT_RECEIVED_TM_STEEL_WING":{"address":2298866,"default_item":335,"flag":1175},"NPC_GIFT_RECEIVED_TM_THIEF":{"address":2154698,"default_item":334,"flag":269},"NPC_GIFT_RECEIVED_TM_TORMENT":{"address":2145260,"default_item":329,"flag":265},"NPC_GIFT_RECEIVED_TM_WATER_PULSE":{"address":2262402,"default_item":291,"flag":172},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_1":{"address":2550316,"default_item":68,"flag":1200},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_2":{"address":2550390,"default_item":10,"flag":1201},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_3":{"address":2550473,"default_item":204,"flag":1202},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_4":{"address":2550556,"default_item":194,"flag":1203},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_5":{"address":2550630,"default_item":300,"flag":1204},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_6":{"address":2550695,"default_item":208,"flag":1205},"NPC_GIFT_RECEIVED_TRICK_HOUSE_REWARD_7":{"address":2550769,"default_item":71,"flag":1206},"NPC_GIFT_RECEIVED_WAILMER_PAIL":{"address":2284320,"default_item":268,"flag":94},"NPC_GIFT_RECEIVED_WHITE_HERB":{"address":2028770,"default_item":180,"flag":279},"NPC_GIFT_ROUTE_111_RECEIVED_BERRY":{"address":2045493,"default_item":148,"flag":1192},"NPC_GIFT_ROUTE_114_RECEIVED_BERRY":{"address":2051680,"default_item":149,"flag":1193},"NPC_GIFT_ROUTE_120_RECEIVED_BERRY":{"address":2064727,"default_item":143,"flag":1194},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_1":{"address":1998521,"default_item":153,"flag":1198},"NPC_GIFT_SOOTOPOLIS_RECEIVED_BERRY_2":{"address":1998566,"default_item":143,"flag":1199},"POKEDEX_REWARD_001":{"address":5729368,"default_item":3,"flag":0},"POKEDEX_REWARD_002":{"address":5729370,"default_item":3,"flag":0},"POKEDEX_REWARD_003":{"address":5729372,"default_item":3,"flag":0},"POKEDEX_REWARD_004":{"address":5729374,"default_item":3,"flag":0},"POKEDEX_REWARD_005":{"address":5729376,"default_item":3,"flag":0},"POKEDEX_REWARD_006":{"address":5729378,"default_item":3,"flag":0},"POKEDEX_REWARD_007":{"address":5729380,"default_item":3,"flag":0},"POKEDEX_REWARD_008":{"address":5729382,"default_item":3,"flag":0},"POKEDEX_REWARD_009":{"address":5729384,"default_item":3,"flag":0},"POKEDEX_REWARD_010":{"address":5729386,"default_item":3,"flag":0},"POKEDEX_REWARD_011":{"address":5729388,"default_item":3,"flag":0},"POKEDEX_REWARD_012":{"address":5729390,"default_item":3,"flag":0},"POKEDEX_REWARD_013":{"address":5729392,"default_item":3,"flag":0},"POKEDEX_REWARD_014":{"address":5729394,"default_item":3,"flag":0},"POKEDEX_REWARD_015":{"address":5729396,"default_item":3,"flag":0},"POKEDEX_REWARD_016":{"address":5729398,"default_item":3,"flag":0},"POKEDEX_REWARD_017":{"address":5729400,"default_item":3,"flag":0},"POKEDEX_REWARD_018":{"address":5729402,"default_item":3,"flag":0},"POKEDEX_REWARD_019":{"address":5729404,"default_item":3,"flag":0},"POKEDEX_REWARD_020":{"address":5729406,"default_item":3,"flag":0},"POKEDEX_REWARD_021":{"address":5729408,"default_item":3,"flag":0},"POKEDEX_REWARD_022":{"address":5729410,"default_item":3,"flag":0},"POKEDEX_REWARD_023":{"address":5729412,"default_item":3,"flag":0},"POKEDEX_REWARD_024":{"address":5729414,"default_item":3,"flag":0},"POKEDEX_REWARD_025":{"address":5729416,"default_item":3,"flag":0},"POKEDEX_REWARD_026":{"address":5729418,"default_item":3,"flag":0},"POKEDEX_REWARD_027":{"address":5729420,"default_item":3,"flag":0},"POKEDEX_REWARD_028":{"address":5729422,"default_item":3,"flag":0},"POKEDEX_REWARD_029":{"address":5729424,"default_item":3,"flag":0},"POKEDEX_REWARD_030":{"address":5729426,"default_item":3,"flag":0},"POKEDEX_REWARD_031":{"address":5729428,"default_item":3,"flag":0},"POKEDEX_REWARD_032":{"address":5729430,"default_item":3,"flag":0},"POKEDEX_REWARD_033":{"address":5729432,"default_item":3,"flag":0},"POKEDEX_REWARD_034":{"address":5729434,"default_item":3,"flag":0},"POKEDEX_REWARD_035":{"address":5729436,"default_item":3,"flag":0},"POKEDEX_REWARD_036":{"address":5729438,"default_item":3,"flag":0},"POKEDEX_REWARD_037":{"address":5729440,"default_item":3,"flag":0},"POKEDEX_REWARD_038":{"address":5729442,"default_item":3,"flag":0},"POKEDEX_REWARD_039":{"address":5729444,"default_item":3,"flag":0},"POKEDEX_REWARD_040":{"address":5729446,"default_item":3,"flag":0},"POKEDEX_REWARD_041":{"address":5729448,"default_item":3,"flag":0},"POKEDEX_REWARD_042":{"address":5729450,"default_item":3,"flag":0},"POKEDEX_REWARD_043":{"address":5729452,"default_item":3,"flag":0},"POKEDEX_REWARD_044":{"address":5729454,"default_item":3,"flag":0},"POKEDEX_REWARD_045":{"address":5729456,"default_item":3,"flag":0},"POKEDEX_REWARD_046":{"address":5729458,"default_item":3,"flag":0},"POKEDEX_REWARD_047":{"address":5729460,"default_item":3,"flag":0},"POKEDEX_REWARD_048":{"address":5729462,"default_item":3,"flag":0},"POKEDEX_REWARD_049":{"address":5729464,"default_item":3,"flag":0},"POKEDEX_REWARD_050":{"address":5729466,"default_item":3,"flag":0},"POKEDEX_REWARD_051":{"address":5729468,"default_item":3,"flag":0},"POKEDEX_REWARD_052":{"address":5729470,"default_item":3,"flag":0},"POKEDEX_REWARD_053":{"address":5729472,"default_item":3,"flag":0},"POKEDEX_REWARD_054":{"address":5729474,"default_item":3,"flag":0},"POKEDEX_REWARD_055":{"address":5729476,"default_item":3,"flag":0},"POKEDEX_REWARD_056":{"address":5729478,"default_item":3,"flag":0},"POKEDEX_REWARD_057":{"address":5729480,"default_item":3,"flag":0},"POKEDEX_REWARD_058":{"address":5729482,"default_item":3,"flag":0},"POKEDEX_REWARD_059":{"address":5729484,"default_item":3,"flag":0},"POKEDEX_REWARD_060":{"address":5729486,"default_item":3,"flag":0},"POKEDEX_REWARD_061":{"address":5729488,"default_item":3,"flag":0},"POKEDEX_REWARD_062":{"address":5729490,"default_item":3,"flag":0},"POKEDEX_REWARD_063":{"address":5729492,"default_item":3,"flag":0},"POKEDEX_REWARD_064":{"address":5729494,"default_item":3,"flag":0},"POKEDEX_REWARD_065":{"address":5729496,"default_item":3,"flag":0},"POKEDEX_REWARD_066":{"address":5729498,"default_item":3,"flag":0},"POKEDEX_REWARD_067":{"address":5729500,"default_item":3,"flag":0},"POKEDEX_REWARD_068":{"address":5729502,"default_item":3,"flag":0},"POKEDEX_REWARD_069":{"address":5729504,"default_item":3,"flag":0},"POKEDEX_REWARD_070":{"address":5729506,"default_item":3,"flag":0},"POKEDEX_REWARD_071":{"address":5729508,"default_item":3,"flag":0},"POKEDEX_REWARD_072":{"address":5729510,"default_item":3,"flag":0},"POKEDEX_REWARD_073":{"address":5729512,"default_item":3,"flag":0},"POKEDEX_REWARD_074":{"address":5729514,"default_item":3,"flag":0},"POKEDEX_REWARD_075":{"address":5729516,"default_item":3,"flag":0},"POKEDEX_REWARD_076":{"address":5729518,"default_item":3,"flag":0},"POKEDEX_REWARD_077":{"address":5729520,"default_item":3,"flag":0},"POKEDEX_REWARD_078":{"address":5729522,"default_item":3,"flag":0},"POKEDEX_REWARD_079":{"address":5729524,"default_item":3,"flag":0},"POKEDEX_REWARD_080":{"address":5729526,"default_item":3,"flag":0},"POKEDEX_REWARD_081":{"address":5729528,"default_item":3,"flag":0},"POKEDEX_REWARD_082":{"address":5729530,"default_item":3,"flag":0},"POKEDEX_REWARD_083":{"address":5729532,"default_item":3,"flag":0},"POKEDEX_REWARD_084":{"address":5729534,"default_item":3,"flag":0},"POKEDEX_REWARD_085":{"address":5729536,"default_item":3,"flag":0},"POKEDEX_REWARD_086":{"address":5729538,"default_item":3,"flag":0},"POKEDEX_REWARD_087":{"address":5729540,"default_item":3,"flag":0},"POKEDEX_REWARD_088":{"address":5729542,"default_item":3,"flag":0},"POKEDEX_REWARD_089":{"address":5729544,"default_item":3,"flag":0},"POKEDEX_REWARD_090":{"address":5729546,"default_item":3,"flag":0},"POKEDEX_REWARD_091":{"address":5729548,"default_item":3,"flag":0},"POKEDEX_REWARD_092":{"address":5729550,"default_item":3,"flag":0},"POKEDEX_REWARD_093":{"address":5729552,"default_item":3,"flag":0},"POKEDEX_REWARD_094":{"address":5729554,"default_item":3,"flag":0},"POKEDEX_REWARD_095":{"address":5729556,"default_item":3,"flag":0},"POKEDEX_REWARD_096":{"address":5729558,"default_item":3,"flag":0},"POKEDEX_REWARD_097":{"address":5729560,"default_item":3,"flag":0},"POKEDEX_REWARD_098":{"address":5729562,"default_item":3,"flag":0},"POKEDEX_REWARD_099":{"address":5729564,"default_item":3,"flag":0},"POKEDEX_REWARD_100":{"address":5729566,"default_item":3,"flag":0},"POKEDEX_REWARD_101":{"address":5729568,"default_item":3,"flag":0},"POKEDEX_REWARD_102":{"address":5729570,"default_item":3,"flag":0},"POKEDEX_REWARD_103":{"address":5729572,"default_item":3,"flag":0},"POKEDEX_REWARD_104":{"address":5729574,"default_item":3,"flag":0},"POKEDEX_REWARD_105":{"address":5729576,"default_item":3,"flag":0},"POKEDEX_REWARD_106":{"address":5729578,"default_item":3,"flag":0},"POKEDEX_REWARD_107":{"address":5729580,"default_item":3,"flag":0},"POKEDEX_REWARD_108":{"address":5729582,"default_item":3,"flag":0},"POKEDEX_REWARD_109":{"address":5729584,"default_item":3,"flag":0},"POKEDEX_REWARD_110":{"address":5729586,"default_item":3,"flag":0},"POKEDEX_REWARD_111":{"address":5729588,"default_item":3,"flag":0},"POKEDEX_REWARD_112":{"address":5729590,"default_item":3,"flag":0},"POKEDEX_REWARD_113":{"address":5729592,"default_item":3,"flag":0},"POKEDEX_REWARD_114":{"address":5729594,"default_item":3,"flag":0},"POKEDEX_REWARD_115":{"address":5729596,"default_item":3,"flag":0},"POKEDEX_REWARD_116":{"address":5729598,"default_item":3,"flag":0},"POKEDEX_REWARD_117":{"address":5729600,"default_item":3,"flag":0},"POKEDEX_REWARD_118":{"address":5729602,"default_item":3,"flag":0},"POKEDEX_REWARD_119":{"address":5729604,"default_item":3,"flag":0},"POKEDEX_REWARD_120":{"address":5729606,"default_item":3,"flag":0},"POKEDEX_REWARD_121":{"address":5729608,"default_item":3,"flag":0},"POKEDEX_REWARD_122":{"address":5729610,"default_item":3,"flag":0},"POKEDEX_REWARD_123":{"address":5729612,"default_item":3,"flag":0},"POKEDEX_REWARD_124":{"address":5729614,"default_item":3,"flag":0},"POKEDEX_REWARD_125":{"address":5729616,"default_item":3,"flag":0},"POKEDEX_REWARD_126":{"address":5729618,"default_item":3,"flag":0},"POKEDEX_REWARD_127":{"address":5729620,"default_item":3,"flag":0},"POKEDEX_REWARD_128":{"address":5729622,"default_item":3,"flag":0},"POKEDEX_REWARD_129":{"address":5729624,"default_item":3,"flag":0},"POKEDEX_REWARD_130":{"address":5729626,"default_item":3,"flag":0},"POKEDEX_REWARD_131":{"address":5729628,"default_item":3,"flag":0},"POKEDEX_REWARD_132":{"address":5729630,"default_item":3,"flag":0},"POKEDEX_REWARD_133":{"address":5729632,"default_item":3,"flag":0},"POKEDEX_REWARD_134":{"address":5729634,"default_item":3,"flag":0},"POKEDEX_REWARD_135":{"address":5729636,"default_item":3,"flag":0},"POKEDEX_REWARD_136":{"address":5729638,"default_item":3,"flag":0},"POKEDEX_REWARD_137":{"address":5729640,"default_item":3,"flag":0},"POKEDEX_REWARD_138":{"address":5729642,"default_item":3,"flag":0},"POKEDEX_REWARD_139":{"address":5729644,"default_item":3,"flag":0},"POKEDEX_REWARD_140":{"address":5729646,"default_item":3,"flag":0},"POKEDEX_REWARD_141":{"address":5729648,"default_item":3,"flag":0},"POKEDEX_REWARD_142":{"address":5729650,"default_item":3,"flag":0},"POKEDEX_REWARD_143":{"address":5729652,"default_item":3,"flag":0},"POKEDEX_REWARD_144":{"address":5729654,"default_item":3,"flag":0},"POKEDEX_REWARD_145":{"address":5729656,"default_item":3,"flag":0},"POKEDEX_REWARD_146":{"address":5729658,"default_item":3,"flag":0},"POKEDEX_REWARD_147":{"address":5729660,"default_item":3,"flag":0},"POKEDEX_REWARD_148":{"address":5729662,"default_item":3,"flag":0},"POKEDEX_REWARD_149":{"address":5729664,"default_item":3,"flag":0},"POKEDEX_REWARD_150":{"address":5729666,"default_item":3,"flag":0},"POKEDEX_REWARD_151":{"address":5729668,"default_item":3,"flag":0},"POKEDEX_REWARD_152":{"address":5729670,"default_item":3,"flag":0},"POKEDEX_REWARD_153":{"address":5729672,"default_item":3,"flag":0},"POKEDEX_REWARD_154":{"address":5729674,"default_item":3,"flag":0},"POKEDEX_REWARD_155":{"address":5729676,"default_item":3,"flag":0},"POKEDEX_REWARD_156":{"address":5729678,"default_item":3,"flag":0},"POKEDEX_REWARD_157":{"address":5729680,"default_item":3,"flag":0},"POKEDEX_REWARD_158":{"address":5729682,"default_item":3,"flag":0},"POKEDEX_REWARD_159":{"address":5729684,"default_item":3,"flag":0},"POKEDEX_REWARD_160":{"address":5729686,"default_item":3,"flag":0},"POKEDEX_REWARD_161":{"address":5729688,"default_item":3,"flag":0},"POKEDEX_REWARD_162":{"address":5729690,"default_item":3,"flag":0},"POKEDEX_REWARD_163":{"address":5729692,"default_item":3,"flag":0},"POKEDEX_REWARD_164":{"address":5729694,"default_item":3,"flag":0},"POKEDEX_REWARD_165":{"address":5729696,"default_item":3,"flag":0},"POKEDEX_REWARD_166":{"address":5729698,"default_item":3,"flag":0},"POKEDEX_REWARD_167":{"address":5729700,"default_item":3,"flag":0},"POKEDEX_REWARD_168":{"address":5729702,"default_item":3,"flag":0},"POKEDEX_REWARD_169":{"address":5729704,"default_item":3,"flag":0},"POKEDEX_REWARD_170":{"address":5729706,"default_item":3,"flag":0},"POKEDEX_REWARD_171":{"address":5729708,"default_item":3,"flag":0},"POKEDEX_REWARD_172":{"address":5729710,"default_item":3,"flag":0},"POKEDEX_REWARD_173":{"address":5729712,"default_item":3,"flag":0},"POKEDEX_REWARD_174":{"address":5729714,"default_item":3,"flag":0},"POKEDEX_REWARD_175":{"address":5729716,"default_item":3,"flag":0},"POKEDEX_REWARD_176":{"address":5729718,"default_item":3,"flag":0},"POKEDEX_REWARD_177":{"address":5729720,"default_item":3,"flag":0},"POKEDEX_REWARD_178":{"address":5729722,"default_item":3,"flag":0},"POKEDEX_REWARD_179":{"address":5729724,"default_item":3,"flag":0},"POKEDEX_REWARD_180":{"address":5729726,"default_item":3,"flag":0},"POKEDEX_REWARD_181":{"address":5729728,"default_item":3,"flag":0},"POKEDEX_REWARD_182":{"address":5729730,"default_item":3,"flag":0},"POKEDEX_REWARD_183":{"address":5729732,"default_item":3,"flag":0},"POKEDEX_REWARD_184":{"address":5729734,"default_item":3,"flag":0},"POKEDEX_REWARD_185":{"address":5729736,"default_item":3,"flag":0},"POKEDEX_REWARD_186":{"address":5729738,"default_item":3,"flag":0},"POKEDEX_REWARD_187":{"address":5729740,"default_item":3,"flag":0},"POKEDEX_REWARD_188":{"address":5729742,"default_item":3,"flag":0},"POKEDEX_REWARD_189":{"address":5729744,"default_item":3,"flag":0},"POKEDEX_REWARD_190":{"address":5729746,"default_item":3,"flag":0},"POKEDEX_REWARD_191":{"address":5729748,"default_item":3,"flag":0},"POKEDEX_REWARD_192":{"address":5729750,"default_item":3,"flag":0},"POKEDEX_REWARD_193":{"address":5729752,"default_item":3,"flag":0},"POKEDEX_REWARD_194":{"address":5729754,"default_item":3,"flag":0},"POKEDEX_REWARD_195":{"address":5729756,"default_item":3,"flag":0},"POKEDEX_REWARD_196":{"address":5729758,"default_item":3,"flag":0},"POKEDEX_REWARD_197":{"address":5729760,"default_item":3,"flag":0},"POKEDEX_REWARD_198":{"address":5729762,"default_item":3,"flag":0},"POKEDEX_REWARD_199":{"address":5729764,"default_item":3,"flag":0},"POKEDEX_REWARD_200":{"address":5729766,"default_item":3,"flag":0},"POKEDEX_REWARD_201":{"address":5729768,"default_item":3,"flag":0},"POKEDEX_REWARD_202":{"address":5729770,"default_item":3,"flag":0},"POKEDEX_REWARD_203":{"address":5729772,"default_item":3,"flag":0},"POKEDEX_REWARD_204":{"address":5729774,"default_item":3,"flag":0},"POKEDEX_REWARD_205":{"address":5729776,"default_item":3,"flag":0},"POKEDEX_REWARD_206":{"address":5729778,"default_item":3,"flag":0},"POKEDEX_REWARD_207":{"address":5729780,"default_item":3,"flag":0},"POKEDEX_REWARD_208":{"address":5729782,"default_item":3,"flag":0},"POKEDEX_REWARD_209":{"address":5729784,"default_item":3,"flag":0},"POKEDEX_REWARD_210":{"address":5729786,"default_item":3,"flag":0},"POKEDEX_REWARD_211":{"address":5729788,"default_item":3,"flag":0},"POKEDEX_REWARD_212":{"address":5729790,"default_item":3,"flag":0},"POKEDEX_REWARD_213":{"address":5729792,"default_item":3,"flag":0},"POKEDEX_REWARD_214":{"address":5729794,"default_item":3,"flag":0},"POKEDEX_REWARD_215":{"address":5729796,"default_item":3,"flag":0},"POKEDEX_REWARD_216":{"address":5729798,"default_item":3,"flag":0},"POKEDEX_REWARD_217":{"address":5729800,"default_item":3,"flag":0},"POKEDEX_REWARD_218":{"address":5729802,"default_item":3,"flag":0},"POKEDEX_REWARD_219":{"address":5729804,"default_item":3,"flag":0},"POKEDEX_REWARD_220":{"address":5729806,"default_item":3,"flag":0},"POKEDEX_REWARD_221":{"address":5729808,"default_item":3,"flag":0},"POKEDEX_REWARD_222":{"address":5729810,"default_item":3,"flag":0},"POKEDEX_REWARD_223":{"address":5729812,"default_item":3,"flag":0},"POKEDEX_REWARD_224":{"address":5729814,"default_item":3,"flag":0},"POKEDEX_REWARD_225":{"address":5729816,"default_item":3,"flag":0},"POKEDEX_REWARD_226":{"address":5729818,"default_item":3,"flag":0},"POKEDEX_REWARD_227":{"address":5729820,"default_item":3,"flag":0},"POKEDEX_REWARD_228":{"address":5729822,"default_item":3,"flag":0},"POKEDEX_REWARD_229":{"address":5729824,"default_item":3,"flag":0},"POKEDEX_REWARD_230":{"address":5729826,"default_item":3,"flag":0},"POKEDEX_REWARD_231":{"address":5729828,"default_item":3,"flag":0},"POKEDEX_REWARD_232":{"address":5729830,"default_item":3,"flag":0},"POKEDEX_REWARD_233":{"address":5729832,"default_item":3,"flag":0},"POKEDEX_REWARD_234":{"address":5729834,"default_item":3,"flag":0},"POKEDEX_REWARD_235":{"address":5729836,"default_item":3,"flag":0},"POKEDEX_REWARD_236":{"address":5729838,"default_item":3,"flag":0},"POKEDEX_REWARD_237":{"address":5729840,"default_item":3,"flag":0},"POKEDEX_REWARD_238":{"address":5729842,"default_item":3,"flag":0},"POKEDEX_REWARD_239":{"address":5729844,"default_item":3,"flag":0},"POKEDEX_REWARD_240":{"address":5729846,"default_item":3,"flag":0},"POKEDEX_REWARD_241":{"address":5729848,"default_item":3,"flag":0},"POKEDEX_REWARD_242":{"address":5729850,"default_item":3,"flag":0},"POKEDEX_REWARD_243":{"address":5729852,"default_item":3,"flag":0},"POKEDEX_REWARD_244":{"address":5729854,"default_item":3,"flag":0},"POKEDEX_REWARD_245":{"address":5729856,"default_item":3,"flag":0},"POKEDEX_REWARD_246":{"address":5729858,"default_item":3,"flag":0},"POKEDEX_REWARD_247":{"address":5729860,"default_item":3,"flag":0},"POKEDEX_REWARD_248":{"address":5729862,"default_item":3,"flag":0},"POKEDEX_REWARD_249":{"address":5729864,"default_item":3,"flag":0},"POKEDEX_REWARD_250":{"address":5729866,"default_item":3,"flag":0},"POKEDEX_REWARD_251":{"address":5729868,"default_item":3,"flag":0},"POKEDEX_REWARD_252":{"address":5729870,"default_item":3,"flag":0},"POKEDEX_REWARD_253":{"address":5729872,"default_item":3,"flag":0},"POKEDEX_REWARD_254":{"address":5729874,"default_item":3,"flag":0},"POKEDEX_REWARD_255":{"address":5729876,"default_item":3,"flag":0},"POKEDEX_REWARD_256":{"address":5729878,"default_item":3,"flag":0},"POKEDEX_REWARD_257":{"address":5729880,"default_item":3,"flag":0},"POKEDEX_REWARD_258":{"address":5729882,"default_item":3,"flag":0},"POKEDEX_REWARD_259":{"address":5729884,"default_item":3,"flag":0},"POKEDEX_REWARD_260":{"address":5729886,"default_item":3,"flag":0},"POKEDEX_REWARD_261":{"address":5729888,"default_item":3,"flag":0},"POKEDEX_REWARD_262":{"address":5729890,"default_item":3,"flag":0},"POKEDEX_REWARD_263":{"address":5729892,"default_item":3,"flag":0},"POKEDEX_REWARD_264":{"address":5729894,"default_item":3,"flag":0},"POKEDEX_REWARD_265":{"address":5729896,"default_item":3,"flag":0},"POKEDEX_REWARD_266":{"address":5729898,"default_item":3,"flag":0},"POKEDEX_REWARD_267":{"address":5729900,"default_item":3,"flag":0},"POKEDEX_REWARD_268":{"address":5729902,"default_item":3,"flag":0},"POKEDEX_REWARD_269":{"address":5729904,"default_item":3,"flag":0},"POKEDEX_REWARD_270":{"address":5729906,"default_item":3,"flag":0},"POKEDEX_REWARD_271":{"address":5729908,"default_item":3,"flag":0},"POKEDEX_REWARD_272":{"address":5729910,"default_item":3,"flag":0},"POKEDEX_REWARD_273":{"address":5729912,"default_item":3,"flag":0},"POKEDEX_REWARD_274":{"address":5729914,"default_item":3,"flag":0},"POKEDEX_REWARD_275":{"address":5729916,"default_item":3,"flag":0},"POKEDEX_REWARD_276":{"address":5729918,"default_item":3,"flag":0},"POKEDEX_REWARD_277":{"address":5729920,"default_item":3,"flag":0},"POKEDEX_REWARD_278":{"address":5729922,"default_item":3,"flag":0},"POKEDEX_REWARD_279":{"address":5729924,"default_item":3,"flag":0},"POKEDEX_REWARD_280":{"address":5729926,"default_item":3,"flag":0},"POKEDEX_REWARD_281":{"address":5729928,"default_item":3,"flag":0},"POKEDEX_REWARD_282":{"address":5729930,"default_item":3,"flag":0},"POKEDEX_REWARD_283":{"address":5729932,"default_item":3,"flag":0},"POKEDEX_REWARD_284":{"address":5729934,"default_item":3,"flag":0},"POKEDEX_REWARD_285":{"address":5729936,"default_item":3,"flag":0},"POKEDEX_REWARD_286":{"address":5729938,"default_item":3,"flag":0},"POKEDEX_REWARD_287":{"address":5729940,"default_item":3,"flag":0},"POKEDEX_REWARD_288":{"address":5729942,"default_item":3,"flag":0},"POKEDEX_REWARD_289":{"address":5729944,"default_item":3,"flag":0},"POKEDEX_REWARD_290":{"address":5729946,"default_item":3,"flag":0},"POKEDEX_REWARD_291":{"address":5729948,"default_item":3,"flag":0},"POKEDEX_REWARD_292":{"address":5729950,"default_item":3,"flag":0},"POKEDEX_REWARD_293":{"address":5729952,"default_item":3,"flag":0},"POKEDEX_REWARD_294":{"address":5729954,"default_item":3,"flag":0},"POKEDEX_REWARD_295":{"address":5729956,"default_item":3,"flag":0},"POKEDEX_REWARD_296":{"address":5729958,"default_item":3,"flag":0},"POKEDEX_REWARD_297":{"address":5729960,"default_item":3,"flag":0},"POKEDEX_REWARD_298":{"address":5729962,"default_item":3,"flag":0},"POKEDEX_REWARD_299":{"address":5729964,"default_item":3,"flag":0},"POKEDEX_REWARD_300":{"address":5729966,"default_item":3,"flag":0},"POKEDEX_REWARD_301":{"address":5729968,"default_item":3,"flag":0},"POKEDEX_REWARD_302":{"address":5729970,"default_item":3,"flag":0},"POKEDEX_REWARD_303":{"address":5729972,"default_item":3,"flag":0},"POKEDEX_REWARD_304":{"address":5729974,"default_item":3,"flag":0},"POKEDEX_REWARD_305":{"address":5729976,"default_item":3,"flag":0},"POKEDEX_REWARD_306":{"address":5729978,"default_item":3,"flag":0},"POKEDEX_REWARD_307":{"address":5729980,"default_item":3,"flag":0},"POKEDEX_REWARD_308":{"address":5729982,"default_item":3,"flag":0},"POKEDEX_REWARD_309":{"address":5729984,"default_item":3,"flag":0},"POKEDEX_REWARD_310":{"address":5729986,"default_item":3,"flag":0},"POKEDEX_REWARD_311":{"address":5729988,"default_item":3,"flag":0},"POKEDEX_REWARD_312":{"address":5729990,"default_item":3,"flag":0},"POKEDEX_REWARD_313":{"address":5729992,"default_item":3,"flag":0},"POKEDEX_REWARD_314":{"address":5729994,"default_item":3,"flag":0},"POKEDEX_REWARD_315":{"address":5729996,"default_item":3,"flag":0},"POKEDEX_REWARD_316":{"address":5729998,"default_item":3,"flag":0},"POKEDEX_REWARD_317":{"address":5730000,"default_item":3,"flag":0},"POKEDEX_REWARD_318":{"address":5730002,"default_item":3,"flag":0},"POKEDEX_REWARD_319":{"address":5730004,"default_item":3,"flag":0},"POKEDEX_REWARD_320":{"address":5730006,"default_item":3,"flag":0},"POKEDEX_REWARD_321":{"address":5730008,"default_item":3,"flag":0},"POKEDEX_REWARD_322":{"address":5730010,"default_item":3,"flag":0},"POKEDEX_REWARD_323":{"address":5730012,"default_item":3,"flag":0},"POKEDEX_REWARD_324":{"address":5730014,"default_item":3,"flag":0},"POKEDEX_REWARD_325":{"address":5730016,"default_item":3,"flag":0},"POKEDEX_REWARD_326":{"address":5730018,"default_item":3,"flag":0},"POKEDEX_REWARD_327":{"address":5730020,"default_item":3,"flag":0},"POKEDEX_REWARD_328":{"address":5730022,"default_item":3,"flag":0},"POKEDEX_REWARD_329":{"address":5730024,"default_item":3,"flag":0},"POKEDEX_REWARD_330":{"address":5730026,"default_item":3,"flag":0},"POKEDEX_REWARD_331":{"address":5730028,"default_item":3,"flag":0},"POKEDEX_REWARD_332":{"address":5730030,"default_item":3,"flag":0},"POKEDEX_REWARD_333":{"address":5730032,"default_item":3,"flag":0},"POKEDEX_REWARD_334":{"address":5730034,"default_item":3,"flag":0},"POKEDEX_REWARD_335":{"address":5730036,"default_item":3,"flag":0},"POKEDEX_REWARD_336":{"address":5730038,"default_item":3,"flag":0},"POKEDEX_REWARD_337":{"address":5730040,"default_item":3,"flag":0},"POKEDEX_REWARD_338":{"address":5730042,"default_item":3,"flag":0},"POKEDEX_REWARD_339":{"address":5730044,"default_item":3,"flag":0},"POKEDEX_REWARD_340":{"address":5730046,"default_item":3,"flag":0},"POKEDEX_REWARD_341":{"address":5730048,"default_item":3,"flag":0},"POKEDEX_REWARD_342":{"address":5730050,"default_item":3,"flag":0},"POKEDEX_REWARD_343":{"address":5730052,"default_item":3,"flag":0},"POKEDEX_REWARD_344":{"address":5730054,"default_item":3,"flag":0},"POKEDEX_REWARD_345":{"address":5730056,"default_item":3,"flag":0},"POKEDEX_REWARD_346":{"address":5730058,"default_item":3,"flag":0},"POKEDEX_REWARD_347":{"address":5730060,"default_item":3,"flag":0},"POKEDEX_REWARD_348":{"address":5730062,"default_item":3,"flag":0},"POKEDEX_REWARD_349":{"address":5730064,"default_item":3,"flag":0},"POKEDEX_REWARD_350":{"address":5730066,"default_item":3,"flag":0},"POKEDEX_REWARD_351":{"address":5730068,"default_item":3,"flag":0},"POKEDEX_REWARD_352":{"address":5730070,"default_item":3,"flag":0},"POKEDEX_REWARD_353":{"address":5730072,"default_item":3,"flag":0},"POKEDEX_REWARD_354":{"address":5730074,"default_item":3,"flag":0},"POKEDEX_REWARD_355":{"address":5730076,"default_item":3,"flag":0},"POKEDEX_REWARD_356":{"address":5730078,"default_item":3,"flag":0},"POKEDEX_REWARD_357":{"address":5730080,"default_item":3,"flag":0},"POKEDEX_REWARD_358":{"address":5730082,"default_item":3,"flag":0},"POKEDEX_REWARD_359":{"address":5730084,"default_item":3,"flag":0},"POKEDEX_REWARD_360":{"address":5730086,"default_item":3,"flag":0},"POKEDEX_REWARD_361":{"address":5730088,"default_item":3,"flag":0},"POKEDEX_REWARD_362":{"address":5730090,"default_item":3,"flag":0},"POKEDEX_REWARD_363":{"address":5730092,"default_item":3,"flag":0},"POKEDEX_REWARD_364":{"address":5730094,"default_item":3,"flag":0},"POKEDEX_REWARD_365":{"address":5730096,"default_item":3,"flag":0},"POKEDEX_REWARD_366":{"address":5730098,"default_item":3,"flag":0},"POKEDEX_REWARD_367":{"address":5730100,"default_item":3,"flag":0},"POKEDEX_REWARD_368":{"address":5730102,"default_item":3,"flag":0},"POKEDEX_REWARD_369":{"address":5730104,"default_item":3,"flag":0},"POKEDEX_REWARD_370":{"address":5730106,"default_item":3,"flag":0},"POKEDEX_REWARD_371":{"address":5730108,"default_item":3,"flag":0},"POKEDEX_REWARD_372":{"address":5730110,"default_item":3,"flag":0},"POKEDEX_REWARD_373":{"address":5730112,"default_item":3,"flag":0},"POKEDEX_REWARD_374":{"address":5730114,"default_item":3,"flag":0},"POKEDEX_REWARD_375":{"address":5730116,"default_item":3,"flag":0},"POKEDEX_REWARD_376":{"address":5730118,"default_item":3,"flag":0},"POKEDEX_REWARD_377":{"address":5730120,"default_item":3,"flag":0},"POKEDEX_REWARD_378":{"address":5730122,"default_item":3,"flag":0},"POKEDEX_REWARD_379":{"address":5730124,"default_item":3,"flag":0},"POKEDEX_REWARD_380":{"address":5730126,"default_item":3,"flag":0},"POKEDEX_REWARD_381":{"address":5730128,"default_item":3,"flag":0},"POKEDEX_REWARD_382":{"address":5730130,"default_item":3,"flag":0},"POKEDEX_REWARD_383":{"address":5730132,"default_item":3,"flag":0},"POKEDEX_REWARD_384":{"address":5730134,"default_item":3,"flag":0},"POKEDEX_REWARD_385":{"address":5730136,"default_item":3,"flag":0},"POKEDEX_REWARD_386":{"address":5730138,"default_item":3,"flag":0},"TRAINER_AARON_REWARD":{"address":5602878,"default_item":104,"flag":1677},"TRAINER_ABIGAIL_1_REWARD":{"address":5602800,"default_item":106,"flag":1638},"TRAINER_AIDAN_REWARD":{"address":5603432,"default_item":104,"flag":1954},"TRAINER_AISHA_REWARD":{"address":5603598,"default_item":106,"flag":2037},"TRAINER_ALBERTO_REWARD":{"address":5602108,"default_item":108,"flag":1292},"TRAINER_ALBERT_REWARD":{"address":5602244,"default_item":104,"flag":1360},"TRAINER_ALEXA_REWARD":{"address":5603424,"default_item":104,"flag":1950},"TRAINER_ALEXIA_REWARD":{"address":5602264,"default_item":104,"flag":1370},"TRAINER_ALEX_REWARD":{"address":5602910,"default_item":104,"flag":1693},"TRAINER_ALICE_REWARD":{"address":5602980,"default_item":103,"flag":1728},"TRAINER_ALIX_REWARD":{"address":5603584,"default_item":106,"flag":2030},"TRAINER_ALLEN_REWARD":{"address":5602750,"default_item":103,"flag":1613},"TRAINER_ALLISON_REWARD":{"address":5602858,"default_item":104,"flag":1667},"TRAINER_ALYSSA_REWARD":{"address":5603486,"default_item":106,"flag":1981},"TRAINER_AMY_AND_LIV_1_REWARD":{"address":5603046,"default_item":103,"flag":1761},"TRAINER_ANDREA_REWARD":{"address":5603310,"default_item":106,"flag":1893},"TRAINER_ANDRES_1_REWARD":{"address":5603558,"default_item":104,"flag":2017},"TRAINER_ANDREW_REWARD":{"address":5602756,"default_item":106,"flag":1616},"TRAINER_ANGELICA_REWARD":{"address":5602956,"default_item":104,"flag":1716},"TRAINER_ANGELINA_REWARD":{"address":5603508,"default_item":106,"flag":1992},"TRAINER_ANGELO_REWARD":{"address":5603688,"default_item":104,"flag":2082},"TRAINER_ANNA_AND_MEG_1_REWARD":{"address":5602658,"default_item":106,"flag":1567},"TRAINER_ANNIKA_REWARD":{"address":5603088,"default_item":107,"flag":1782},"TRAINER_ANTHONY_REWARD":{"address":5602788,"default_item":106,"flag":1632},"TRAINER_ARCHIE_REWARD":{"address":5602152,"default_item":107,"flag":1314},"TRAINER_ASHLEY_REWARD":{"address":5603394,"default_item":106,"flag":1935},"TRAINER_ATHENA_REWARD":{"address":5603238,"default_item":104,"flag":1857},"TRAINER_ATSUSHI_REWARD":{"address":5602464,"default_item":104,"flag":1470},"TRAINER_AURON_REWARD":{"address":5603096,"default_item":104,"flag":1786},"TRAINER_AUSTINA_REWARD":{"address":5602200,"default_item":103,"flag":1338},"TRAINER_AUTUMN_REWARD":{"address":5602518,"default_item":106,"flag":1497},"TRAINER_AXLE_REWARD":{"address":5602490,"default_item":108,"flag":1483},"TRAINER_BARNY_REWARD":{"address":5602770,"default_item":104,"flag":1623},"TRAINER_BARRY_REWARD":{"address":5602410,"default_item":106,"flag":1443},"TRAINER_BEAU_REWARD":{"address":5602508,"default_item":106,"flag":1492},"TRAINER_BECKY_REWARD":{"address":5603024,"default_item":106,"flag":1750},"TRAINER_BECK_REWARD":{"address":5602912,"default_item":104,"flag":1694},"TRAINER_BENJAMIN_1_REWARD":{"address":5602790,"default_item":106,"flag":1633},"TRAINER_BEN_REWARD":{"address":5602730,"default_item":106,"flag":1603},"TRAINER_BERKE_REWARD":{"address":5602232,"default_item":104,"flag":1354},"TRAINER_BERNIE_1_REWARD":{"address":5602496,"default_item":106,"flag":1486},"TRAINER_BETHANY_REWARD":{"address":5602686,"default_item":107,"flag":1581},"TRAINER_BETH_REWARD":{"address":5602974,"default_item":103,"flag":1725},"TRAINER_BEVERLY_REWARD":{"address":5602966,"default_item":103,"flag":1721},"TRAINER_BIANCA_REWARD":{"address":5603496,"default_item":106,"flag":1986},"TRAINER_BILLY_REWARD":{"address":5602722,"default_item":103,"flag":1599},"TRAINER_BLAKE_REWARD":{"address":5602554,"default_item":108,"flag":1515},"TRAINER_BRANDEN_REWARD":{"address":5603574,"default_item":106,"flag":2025},"TRAINER_BRANDI_REWARD":{"address":5603596,"default_item":106,"flag":2036},"TRAINER_BRAWLY_1_REWARD":{"address":5602616,"default_item":104,"flag":1546},"TRAINER_BRAXTON_REWARD":{"address":5602234,"default_item":104,"flag":1355},"TRAINER_BRENDAN_LILYCOVE_MUDKIP_REWARD":{"address":5603406,"default_item":104,"flag":1941},"TRAINER_BRENDAN_LILYCOVE_TORCHIC_REWARD":{"address":5603410,"default_item":104,"flag":1943},"TRAINER_BRENDAN_LILYCOVE_TREECKO_REWARD":{"address":5603408,"default_item":104,"flag":1942},"TRAINER_BRENDAN_ROUTE_103_MUDKIP_REWARD":{"address":5603124,"default_item":106,"flag":1800},"TRAINER_BRENDAN_ROUTE_103_TORCHIC_REWARD":{"address":5603136,"default_item":106,"flag":1806},"TRAINER_BRENDAN_ROUTE_103_TREECKO_REWARD":{"address":5603130,"default_item":106,"flag":1803},"TRAINER_BRENDAN_ROUTE_110_MUDKIP_REWARD":{"address":5603126,"default_item":104,"flag":1801},"TRAINER_BRENDAN_ROUTE_110_TORCHIC_REWARD":{"address":5603138,"default_item":104,"flag":1807},"TRAINER_BRENDAN_ROUTE_110_TREECKO_REWARD":{"address":5603132,"default_item":104,"flag":1804},"TRAINER_BRENDAN_ROUTE_119_MUDKIP_REWARD":{"address":5603128,"default_item":104,"flag":1802},"TRAINER_BRENDAN_ROUTE_119_TORCHIC_REWARD":{"address":5603140,"default_item":104,"flag":1808},"TRAINER_BRENDAN_ROUTE_119_TREECKO_REWARD":{"address":5603134,"default_item":104,"flag":1805},"TRAINER_BRENDAN_RUSTBORO_MUDKIP_REWARD":{"address":5603270,"default_item":108,"flag":1873},"TRAINER_BRENDAN_RUSTBORO_TORCHIC_REWARD":{"address":5603282,"default_item":108,"flag":1879},"TRAINER_BRENDAN_RUSTBORO_TREECKO_REWARD":{"address":5603268,"default_item":108,"flag":1872},"TRAINER_BRENDA_REWARD":{"address":5602992,"default_item":106,"flag":1734},"TRAINER_BRENDEN_REWARD":{"address":5603228,"default_item":106,"flag":1852},"TRAINER_BRENT_REWARD":{"address":5602530,"default_item":104,"flag":1503},"TRAINER_BRIANNA_REWARD":{"address":5602320,"default_item":110,"flag":1398},"TRAINER_BRICE_REWARD":{"address":5603336,"default_item":106,"flag":1906},"TRAINER_BRIDGET_REWARD":{"address":5602342,"default_item":107,"flag":1409},"TRAINER_BROOKE_1_REWARD":{"address":5602272,"default_item":108,"flag":1374},"TRAINER_BRYANT_REWARD":{"address":5603576,"default_item":106,"flag":2026},"TRAINER_BRYAN_REWARD":{"address":5603572,"default_item":104,"flag":2024},"TRAINER_CALE_REWARD":{"address":5603612,"default_item":104,"flag":2044},"TRAINER_CALLIE_REWARD":{"address":5603610,"default_item":106,"flag":2043},"TRAINER_CALVIN_1_REWARD":{"address":5602720,"default_item":103,"flag":1598},"TRAINER_CAMDEN_REWARD":{"address":5602832,"default_item":104,"flag":1654},"TRAINER_CAMERON_1_REWARD":{"address":5602560,"default_item":108,"flag":1518},"TRAINER_CAMRON_REWARD":{"address":5603562,"default_item":104,"flag":2019},"TRAINER_CARLEE_REWARD":{"address":5603012,"default_item":106,"flag":1744},"TRAINER_CAROLINA_REWARD":{"address":5603566,"default_item":104,"flag":2021},"TRAINER_CAROLINE_REWARD":{"address":5602282,"default_item":104,"flag":1379},"TRAINER_CAROL_REWARD":{"address":5603026,"default_item":106,"flag":1751},"TRAINER_CARTER_REWARD":{"address":5602774,"default_item":104,"flag":1625},"TRAINER_CATHERINE_1_REWARD":{"address":5603202,"default_item":104,"flag":1839},"TRAINER_CEDRIC_REWARD":{"address":5603034,"default_item":108,"flag":1755},"TRAINER_CELIA_REWARD":{"address":5603570,"default_item":106,"flag":2023},"TRAINER_CELINA_REWARD":{"address":5603494,"default_item":108,"flag":1985},"TRAINER_CHAD_REWARD":{"address":5602432,"default_item":106,"flag":1454},"TRAINER_CHANDLER_REWARD":{"address":5603480,"default_item":103,"flag":1978},"TRAINER_CHARLIE_REWARD":{"address":5602216,"default_item":103,"flag":1346},"TRAINER_CHARLOTTE_REWARD":{"address":5603512,"default_item":106,"flag":1994},"TRAINER_CHASE_REWARD":{"address":5602840,"default_item":104,"flag":1658},"TRAINER_CHESTER_REWARD":{"address":5602900,"default_item":108,"flag":1688},"TRAINER_CHIP_REWARD":{"address":5602174,"default_item":104,"flag":1325},"TRAINER_CHRIS_REWARD":{"address":5603470,"default_item":108,"flag":1973},"TRAINER_CINDY_1_REWARD":{"address":5602312,"default_item":104,"flag":1394},"TRAINER_CLARENCE_REWARD":{"address":5603244,"default_item":106,"flag":1860},"TRAINER_CLARISSA_REWARD":{"address":5602954,"default_item":104,"flag":1715},"TRAINER_CLARK_REWARD":{"address":5603346,"default_item":106,"flag":1911},"TRAINER_CLAUDE_REWARD":{"address":5602760,"default_item":108,"flag":1618},"TRAINER_CLIFFORD_REWARD":{"address":5603252,"default_item":107,"flag":1864},"TRAINER_COBY_REWARD":{"address":5603502,"default_item":106,"flag":1989},"TRAINER_COLE_REWARD":{"address":5602486,"default_item":108,"flag":1481},"TRAINER_COLIN_REWARD":{"address":5602894,"default_item":108,"flag":1685},"TRAINER_COLTON_REWARD":{"address":5602672,"default_item":107,"flag":1574},"TRAINER_CONNIE_REWARD":{"address":5602340,"default_item":107,"flag":1408},"TRAINER_CONOR_REWARD":{"address":5603106,"default_item":104,"flag":1791},"TRAINER_CORY_1_REWARD":{"address":5603564,"default_item":108,"flag":2020},"TRAINER_CRISSY_REWARD":{"address":5603312,"default_item":106,"flag":1894},"TRAINER_CRISTIAN_REWARD":{"address":5603232,"default_item":106,"flag":1854},"TRAINER_CRISTIN_1_REWARD":{"address":5603618,"default_item":104,"flag":2047},"TRAINER_CYNDY_1_REWARD":{"address":5602938,"default_item":106,"flag":1707},"TRAINER_DAISUKE_REWARD":{"address":5602462,"default_item":106,"flag":1469},"TRAINER_DAISY_REWARD":{"address":5602156,"default_item":106,"flag":1316},"TRAINER_DALE_REWARD":{"address":5602766,"default_item":106,"flag":1621},"TRAINER_DALTON_1_REWARD":{"address":5602476,"default_item":106,"flag":1476},"TRAINER_DANA_REWARD":{"address":5603000,"default_item":106,"flag":1738},"TRAINER_DANIELLE_REWARD":{"address":5603384,"default_item":106,"flag":1930},"TRAINER_DAPHNE_REWARD":{"address":5602314,"default_item":110,"flag":1395},"TRAINER_DARCY_REWARD":{"address":5603550,"default_item":104,"flag":2013},"TRAINER_DARIAN_REWARD":{"address":5603476,"default_item":106,"flag":1976},"TRAINER_DARIUS_REWARD":{"address":5603690,"default_item":108,"flag":2083},"TRAINER_DARRIN_REWARD":{"address":5602392,"default_item":103,"flag":1434},"TRAINER_DAVID_REWARD":{"address":5602400,"default_item":103,"flag":1438},"TRAINER_DAVIS_REWARD":{"address":5603162,"default_item":106,"flag":1819},"TRAINER_DAWSON_REWARD":{"address":5603472,"default_item":104,"flag":1974},"TRAINER_DAYTON_REWARD":{"address":5603604,"default_item":108,"flag":2040},"TRAINER_DEANDRE_REWARD":{"address":5603514,"default_item":103,"flag":1995},"TRAINER_DEAN_REWARD":{"address":5602412,"default_item":103,"flag":1444},"TRAINER_DEBRA_REWARD":{"address":5603004,"default_item":106,"flag":1740},"TRAINER_DECLAN_REWARD":{"address":5602114,"default_item":106,"flag":1295},"TRAINER_DEMETRIUS_REWARD":{"address":5602834,"default_item":106,"flag":1655},"TRAINER_DENISE_REWARD":{"address":5602972,"default_item":103,"flag":1724},"TRAINER_DEREK_REWARD":{"address":5602538,"default_item":108,"flag":1507},"TRAINER_DEVAN_REWARD":{"address":5603590,"default_item":106,"flag":2033},"TRAINER_DEZ_AND_LUKE_REWARD":{"address":5603364,"default_item":108,"flag":1920},"TRAINER_DIANA_1_REWARD":{"address":5603032,"default_item":106,"flag":1754},"TRAINER_DIANNE_REWARD":{"address":5602918,"default_item":104,"flag":1697},"TRAINER_DILLON_REWARD":{"address":5602738,"default_item":106,"flag":1607},"TRAINER_DOMINIK_REWARD":{"address":5602388,"default_item":103,"flag":1432},"TRAINER_DONALD_REWARD":{"address":5602532,"default_item":104,"flag":1504},"TRAINER_DONNY_REWARD":{"address":5602852,"default_item":104,"flag":1664},"TRAINER_DOUGLAS_REWARD":{"address":5602390,"default_item":103,"flag":1433},"TRAINER_DOUG_REWARD":{"address":5603320,"default_item":106,"flag":1898},"TRAINER_DRAKE_REWARD":{"address":5602612,"default_item":110,"flag":1544},"TRAINER_DREW_REWARD":{"address":5602506,"default_item":106,"flag":1491},"TRAINER_DUNCAN_REWARD":{"address":5603076,"default_item":108,"flag":1776},"TRAINER_DUSTY_1_REWARD":{"address":5602172,"default_item":104,"flag":1324},"TRAINER_DWAYNE_REWARD":{"address":5603070,"default_item":106,"flag":1773},"TRAINER_DYLAN_1_REWARD":{"address":5602812,"default_item":106,"flag":1644},"TRAINER_EDGAR_REWARD":{"address":5602242,"default_item":104,"flag":1359},"TRAINER_EDMOND_REWARD":{"address":5603066,"default_item":106,"flag":1771},"TRAINER_EDWARDO_REWARD":{"address":5602892,"default_item":108,"flag":1684},"TRAINER_EDWARD_REWARD":{"address":5602548,"default_item":106,"flag":1512},"TRAINER_EDWIN_1_REWARD":{"address":5603108,"default_item":108,"flag":1792},"TRAINER_ED_REWARD":{"address":5602110,"default_item":104,"flag":1293},"TRAINER_ELIJAH_REWARD":{"address":5603568,"default_item":108,"flag":2022},"TRAINER_ELI_REWARD":{"address":5603086,"default_item":108,"flag":1781},"TRAINER_ELLIOT_1_REWARD":{"address":5602762,"default_item":106,"flag":1619},"TRAINER_ERIC_REWARD":{"address":5603348,"default_item":108,"flag":1912},"TRAINER_ERNEST_1_REWARD":{"address":5603068,"default_item":104,"flag":1772},"TRAINER_ETHAN_1_REWARD":{"address":5602516,"default_item":106,"flag":1496},"TRAINER_FABIAN_REWARD":{"address":5603602,"default_item":108,"flag":2039},"TRAINER_FELIX_REWARD":{"address":5602160,"default_item":104,"flag":1318},"TRAINER_FERNANDO_1_REWARD":{"address":5602474,"default_item":108,"flag":1475},"TRAINER_FLANNERY_1_REWARD":{"address":5602620,"default_item":107,"flag":1548},"TRAINER_FLINT_REWARD":{"address":5603392,"default_item":106,"flag":1934},"TRAINER_FOSTER_REWARD":{"address":5602176,"default_item":104,"flag":1326},"TRAINER_FRANKLIN_REWARD":{"address":5602424,"default_item":106,"flag":1450},"TRAINER_FREDRICK_REWARD":{"address":5602142,"default_item":104,"flag":1309},"TRAINER_GABRIELLE_1_REWARD":{"address":5602102,"default_item":104,"flag":1289},"TRAINER_GARRET_REWARD":{"address":5602360,"default_item":110,"flag":1418},"TRAINER_GARRISON_REWARD":{"address":5603178,"default_item":104,"flag":1827},"TRAINER_GEORGE_REWARD":{"address":5602230,"default_item":104,"flag":1353},"TRAINER_GERALD_REWARD":{"address":5603380,"default_item":104,"flag":1928},"TRAINER_GILBERT_REWARD":{"address":5602422,"default_item":106,"flag":1449},"TRAINER_GINA_AND_MIA_1_REWARD":{"address":5603050,"default_item":103,"flag":1763},"TRAINER_GLACIA_REWARD":{"address":5602610,"default_item":110,"flag":1543},"TRAINER_GRACE_REWARD":{"address":5602984,"default_item":106,"flag":1730},"TRAINER_GREG_REWARD":{"address":5603322,"default_item":106,"flag":1899},"TRAINER_GRUNT_AQUA_HIDEOUT_1_REWARD":{"address":5602088,"default_item":106,"flag":1282},"TRAINER_GRUNT_AQUA_HIDEOUT_2_REWARD":{"address":5602090,"default_item":106,"flag":1283},"TRAINER_GRUNT_AQUA_HIDEOUT_3_REWARD":{"address":5602092,"default_item":106,"flag":1284},"TRAINER_GRUNT_AQUA_HIDEOUT_4_REWARD":{"address":5602094,"default_item":106,"flag":1285},"TRAINER_GRUNT_AQUA_HIDEOUT_5_REWARD":{"address":5602138,"default_item":106,"flag":1307},"TRAINER_GRUNT_AQUA_HIDEOUT_6_REWARD":{"address":5602140,"default_item":106,"flag":1308},"TRAINER_GRUNT_AQUA_HIDEOUT_7_REWARD":{"address":5602468,"default_item":106,"flag":1472},"TRAINER_GRUNT_AQUA_HIDEOUT_8_REWARD":{"address":5602470,"default_item":106,"flag":1473},"TRAINER_GRUNT_MAGMA_HIDEOUT_10_REWARD":{"address":5603534,"default_item":106,"flag":2005},"TRAINER_GRUNT_MAGMA_HIDEOUT_11_REWARD":{"address":5603536,"default_item":106,"flag":2006},"TRAINER_GRUNT_MAGMA_HIDEOUT_12_REWARD":{"address":5603538,"default_item":106,"flag":2007},"TRAINER_GRUNT_MAGMA_HIDEOUT_13_REWARD":{"address":5603540,"default_item":106,"flag":2008},"TRAINER_GRUNT_MAGMA_HIDEOUT_14_REWARD":{"address":5603542,"default_item":106,"flag":2009},"TRAINER_GRUNT_MAGMA_HIDEOUT_15_REWARD":{"address":5603544,"default_item":106,"flag":2010},"TRAINER_GRUNT_MAGMA_HIDEOUT_16_REWARD":{"address":5603546,"default_item":106,"flag":2011},"TRAINER_GRUNT_MAGMA_HIDEOUT_1_REWARD":{"address":5603516,"default_item":106,"flag":1996},"TRAINER_GRUNT_MAGMA_HIDEOUT_2_REWARD":{"address":5603518,"default_item":106,"flag":1997},"TRAINER_GRUNT_MAGMA_HIDEOUT_3_REWARD":{"address":5603520,"default_item":106,"flag":1998},"TRAINER_GRUNT_MAGMA_HIDEOUT_4_REWARD":{"address":5603522,"default_item":106,"flag":1999},"TRAINER_GRUNT_MAGMA_HIDEOUT_5_REWARD":{"address":5603524,"default_item":106,"flag":2000},"TRAINER_GRUNT_MAGMA_HIDEOUT_6_REWARD":{"address":5603526,"default_item":106,"flag":2001},"TRAINER_GRUNT_MAGMA_HIDEOUT_7_REWARD":{"address":5603528,"default_item":106,"flag":2002},"TRAINER_GRUNT_MAGMA_HIDEOUT_8_REWARD":{"address":5603530,"default_item":106,"flag":2003},"TRAINER_GRUNT_MAGMA_HIDEOUT_9_REWARD":{"address":5603532,"default_item":106,"flag":2004},"TRAINER_GRUNT_MT_CHIMNEY_1_REWARD":{"address":5602376,"default_item":106,"flag":1426},"TRAINER_GRUNT_MT_CHIMNEY_2_REWARD":{"address":5603242,"default_item":106,"flag":1859},"TRAINER_GRUNT_MT_PYRE_1_REWARD":{"address":5602130,"default_item":106,"flag":1303},"TRAINER_GRUNT_MT_PYRE_2_REWARD":{"address":5602132,"default_item":106,"flag":1304},"TRAINER_GRUNT_MT_PYRE_3_REWARD":{"address":5602134,"default_item":106,"flag":1305},"TRAINER_GRUNT_MT_PYRE_4_REWARD":{"address":5603222,"default_item":106,"flag":1849},"TRAINER_GRUNT_MUSEUM_1_REWARD":{"address":5602124,"default_item":106,"flag":1300},"TRAINER_GRUNT_MUSEUM_2_REWARD":{"address":5602126,"default_item":106,"flag":1301},"TRAINER_GRUNT_PETALBURG_WOODS_REWARD":{"address":5602104,"default_item":103,"flag":1290},"TRAINER_GRUNT_RUSTURF_TUNNEL_REWARD":{"address":5602116,"default_item":103,"flag":1296},"TRAINER_GRUNT_SEAFLOOR_CAVERN_1_REWARD":{"address":5602096,"default_item":108,"flag":1286},"TRAINER_GRUNT_SEAFLOOR_CAVERN_2_REWARD":{"address":5602098,"default_item":108,"flag":1287},"TRAINER_GRUNT_SEAFLOOR_CAVERN_3_REWARD":{"address":5602100,"default_item":108,"flag":1288},"TRAINER_GRUNT_SEAFLOOR_CAVERN_4_REWARD":{"address":5602112,"default_item":108,"flag":1294},"TRAINER_GRUNT_SEAFLOOR_CAVERN_5_REWARD":{"address":5603218,"default_item":108,"flag":1847},"TRAINER_GRUNT_SPACE_CENTER_1_REWARD":{"address":5602128,"default_item":106,"flag":1302},"TRAINER_GRUNT_SPACE_CENTER_2_REWARD":{"address":5602316,"default_item":106,"flag":1396},"TRAINER_GRUNT_SPACE_CENTER_3_REWARD":{"address":5603256,"default_item":106,"flag":1866},"TRAINER_GRUNT_SPACE_CENTER_4_REWARD":{"address":5603258,"default_item":106,"flag":1867},"TRAINER_GRUNT_SPACE_CENTER_5_REWARD":{"address":5603260,"default_item":106,"flag":1868},"TRAINER_GRUNT_SPACE_CENTER_6_REWARD":{"address":5603262,"default_item":106,"flag":1869},"TRAINER_GRUNT_SPACE_CENTER_7_REWARD":{"address":5603264,"default_item":106,"flag":1870},"TRAINER_GRUNT_WEATHER_INST_1_REWARD":{"address":5602118,"default_item":106,"flag":1297},"TRAINER_GRUNT_WEATHER_INST_2_REWARD":{"address":5602120,"default_item":106,"flag":1298},"TRAINER_GRUNT_WEATHER_INST_3_REWARD":{"address":5602122,"default_item":106,"flag":1299},"TRAINER_GRUNT_WEATHER_INST_4_REWARD":{"address":5602136,"default_item":106,"flag":1306},"TRAINER_GRUNT_WEATHER_INST_5_REWARD":{"address":5603276,"default_item":106,"flag":1876},"TRAINER_GWEN_REWARD":{"address":5602202,"default_item":103,"flag":1339},"TRAINER_HAILEY_REWARD":{"address":5603478,"default_item":103,"flag":1977},"TRAINER_HALEY_1_REWARD":{"address":5603292,"default_item":103,"flag":1884},"TRAINER_HALLE_REWARD":{"address":5603176,"default_item":104,"flag":1826},"TRAINER_HANNAH_REWARD":{"address":5602572,"default_item":108,"flag":1524},"TRAINER_HARRISON_REWARD":{"address":5603240,"default_item":106,"flag":1858},"TRAINER_HAYDEN_REWARD":{"address":5603498,"default_item":106,"flag":1987},"TRAINER_HECTOR_REWARD":{"address":5603110,"default_item":104,"flag":1793},"TRAINER_HEIDI_REWARD":{"address":5603022,"default_item":106,"flag":1749},"TRAINER_HELENE_REWARD":{"address":5603586,"default_item":106,"flag":2031},"TRAINER_HENRY_REWARD":{"address":5603420,"default_item":104,"flag":1948},"TRAINER_HERMAN_REWARD":{"address":5602418,"default_item":106,"flag":1447},"TRAINER_HIDEO_REWARD":{"address":5603386,"default_item":106,"flag":1931},"TRAINER_HITOSHI_REWARD":{"address":5602444,"default_item":104,"flag":1460},"TRAINER_HOPE_REWARD":{"address":5602276,"default_item":104,"flag":1376},"TRAINER_HUDSON_REWARD":{"address":5603104,"default_item":104,"flag":1790},"TRAINER_HUEY_REWARD":{"address":5603064,"default_item":106,"flag":1770},"TRAINER_HUGH_REWARD":{"address":5602882,"default_item":108,"flag":1679},"TRAINER_HUMBERTO_REWARD":{"address":5602888,"default_item":108,"flag":1682},"TRAINER_IMANI_REWARD":{"address":5602968,"default_item":103,"flag":1722},"TRAINER_IRENE_REWARD":{"address":5603036,"default_item":106,"flag":1756},"TRAINER_ISAAC_1_REWARD":{"address":5603160,"default_item":106,"flag":1818},"TRAINER_ISABELLA_REWARD":{"address":5603274,"default_item":104,"flag":1875},"TRAINER_ISABELLE_REWARD":{"address":5603556,"default_item":103,"flag":2016},"TRAINER_ISABEL_1_REWARD":{"address":5602688,"default_item":104,"flag":1582},"TRAINER_ISAIAH_1_REWARD":{"address":5602836,"default_item":104,"flag":1656},"TRAINER_ISOBEL_REWARD":{"address":5602850,"default_item":104,"flag":1663},"TRAINER_IVAN_REWARD":{"address":5602758,"default_item":106,"flag":1617},"TRAINER_JACE_REWARD":{"address":5602492,"default_item":108,"flag":1484},"TRAINER_JACKI_1_REWARD":{"address":5602582,"default_item":108,"flag":1529},"TRAINER_JACKSON_1_REWARD":{"address":5603188,"default_item":104,"flag":1832},"TRAINER_JACK_REWARD":{"address":5602428,"default_item":106,"flag":1452},"TRAINER_JACLYN_REWARD":{"address":5602570,"default_item":106,"flag":1523},"TRAINER_JACOB_REWARD":{"address":5602786,"default_item":106,"flag":1631},"TRAINER_JAIDEN_REWARD":{"address":5603582,"default_item":106,"flag":2029},"TRAINER_JAMES_1_REWARD":{"address":5603326,"default_item":103,"flag":1901},"TRAINER_JANICE_REWARD":{"address":5603294,"default_item":103,"flag":1885},"TRAINER_JANI_REWARD":{"address":5602920,"default_item":103,"flag":1698},"TRAINER_JARED_REWARD":{"address":5602886,"default_item":108,"flag":1681},"TRAINER_JASMINE_REWARD":{"address":5602802,"default_item":103,"flag":1639},"TRAINER_JAYLEN_REWARD":{"address":5602736,"default_item":106,"flag":1606},"TRAINER_JAZMYN_REWARD":{"address":5603090,"default_item":106,"flag":1783},"TRAINER_JEFFREY_1_REWARD":{"address":5602536,"default_item":104,"flag":1506},"TRAINER_JEFF_REWARD":{"address":5602488,"default_item":108,"flag":1482},"TRAINER_JENNA_REWARD":{"address":5603204,"default_item":104,"flag":1840},"TRAINER_JENNIFER_REWARD":{"address":5602274,"default_item":104,"flag":1375},"TRAINER_JENNY_1_REWARD":{"address":5602982,"default_item":106,"flag":1729},"TRAINER_JEROME_REWARD":{"address":5602396,"default_item":103,"flag":1436},"TRAINER_JERRY_1_REWARD":{"address":5602630,"default_item":103,"flag":1553},"TRAINER_JESSICA_1_REWARD":{"address":5602338,"default_item":104,"flag":1407},"TRAINER_JOCELYN_REWARD":{"address":5602934,"default_item":106,"flag":1705},"TRAINER_JODY_REWARD":{"address":5602266,"default_item":104,"flag":1371},"TRAINER_JOEY_REWARD":{"address":5602728,"default_item":103,"flag":1602},"TRAINER_JOHANNA_REWARD":{"address":5603378,"default_item":104,"flag":1927},"TRAINER_JOHNSON_REWARD":{"address":5603592,"default_item":103,"flag":2034},"TRAINER_JOHN_AND_JAY_1_REWARD":{"address":5603446,"default_item":104,"flag":1961},"TRAINER_JONAH_REWARD":{"address":5603418,"default_item":104,"flag":1947},"TRAINER_JONAS_REWARD":{"address":5603092,"default_item":106,"flag":1784},"TRAINER_JONATHAN_REWARD":{"address":5603280,"default_item":104,"flag":1878},"TRAINER_JOSEPH_REWARD":{"address":5603484,"default_item":106,"flag":1980},"TRAINER_JOSE_REWARD":{"address":5603318,"default_item":103,"flag":1897},"TRAINER_JOSH_REWARD":{"address":5602724,"default_item":103,"flag":1600},"TRAINER_JOSUE_REWARD":{"address":5603560,"default_item":108,"flag":2018},"TRAINER_JUAN_1_REWARD":{"address":5602628,"default_item":109,"flag":1552},"TRAINER_JULIE_REWARD":{"address":5602284,"default_item":104,"flag":1380},"TRAINER_JULIO_REWARD":{"address":5603216,"default_item":108,"flag":1846},"TRAINER_KAI_REWARD":{"address":5603510,"default_item":108,"flag":1993},"TRAINER_KALEB_REWARD":{"address":5603482,"default_item":104,"flag":1979},"TRAINER_KARA_REWARD":{"address":5602998,"default_item":106,"flag":1737},"TRAINER_KAREN_1_REWARD":{"address":5602644,"default_item":103,"flag":1560},"TRAINER_KATELYNN_REWARD":{"address":5602734,"default_item":104,"flag":1605},"TRAINER_KATELYN_1_REWARD":{"address":5602856,"default_item":104,"flag":1666},"TRAINER_KATE_AND_JOY_REWARD":{"address":5602656,"default_item":106,"flag":1566},"TRAINER_KATHLEEN_REWARD":{"address":5603250,"default_item":108,"flag":1863},"TRAINER_KATIE_REWARD":{"address":5602994,"default_item":106,"flag":1735},"TRAINER_KAYLA_REWARD":{"address":5602578,"default_item":106,"flag":1527},"TRAINER_KAYLEY_REWARD":{"address":5603094,"default_item":104,"flag":1785},"TRAINER_KEEGAN_REWARD":{"address":5602494,"default_item":108,"flag":1485},"TRAINER_KEIGO_REWARD":{"address":5603388,"default_item":106,"flag":1932},"TRAINER_KELVIN_REWARD":{"address":5603098,"default_item":104,"flag":1787},"TRAINER_KENT_REWARD":{"address":5603324,"default_item":106,"flag":1900},"TRAINER_KEVIN_REWARD":{"address":5602426,"default_item":106,"flag":1451},"TRAINER_KIM_AND_IRIS_REWARD":{"address":5603440,"default_item":106,"flag":1958},"TRAINER_KINDRA_REWARD":{"address":5602296,"default_item":108,"flag":1386},"TRAINER_KIRA_AND_DAN_1_REWARD":{"address":5603368,"default_item":108,"flag":1922},"TRAINER_KIRK_REWARD":{"address":5602466,"default_item":106,"flag":1471},"TRAINER_KIYO_REWARD":{"address":5602446,"default_item":104,"flag":1461},"TRAINER_KOICHI_REWARD":{"address":5602448,"default_item":108,"flag":1462},"TRAINER_KOJI_1_REWARD":{"address":5603428,"default_item":104,"flag":1952},"TRAINER_KYLA_REWARD":{"address":5602970,"default_item":103,"flag":1723},"TRAINER_KYRA_REWARD":{"address":5603580,"default_item":104,"flag":2028},"TRAINER_LAO_1_REWARD":{"address":5602922,"default_item":103,"flag":1699},"TRAINER_LARRY_REWARD":{"address":5602510,"default_item":106,"flag":1493},"TRAINER_LAURA_REWARD":{"address":5602936,"default_item":106,"flag":1706},"TRAINER_LAUREL_REWARD":{"address":5603010,"default_item":106,"flag":1743},"TRAINER_LAWRENCE_REWARD":{"address":5603504,"default_item":106,"flag":1990},"TRAINER_LEAH_REWARD":{"address":5602154,"default_item":108,"flag":1315},"TRAINER_LEA_AND_JED_REWARD":{"address":5603366,"default_item":104,"flag":1921},"TRAINER_LENNY_REWARD":{"address":5603340,"default_item":108,"flag":1908},"TRAINER_LEONARDO_REWARD":{"address":5603236,"default_item":106,"flag":1856},"TRAINER_LEONARD_REWARD":{"address":5603074,"default_item":104,"flag":1775},"TRAINER_LEONEL_REWARD":{"address":5603608,"default_item":104,"flag":2042},"TRAINER_LILA_AND_ROY_1_REWARD":{"address":5603458,"default_item":106,"flag":1967},"TRAINER_LILITH_REWARD":{"address":5603230,"default_item":106,"flag":1853},"TRAINER_LINDA_REWARD":{"address":5603006,"default_item":106,"flag":1741},"TRAINER_LISA_AND_RAY_REWARD":{"address":5603468,"default_item":106,"flag":1972},"TRAINER_LOLA_1_REWARD":{"address":5602198,"default_item":103,"flag":1337},"TRAINER_LORENZO_REWARD":{"address":5603190,"default_item":104,"flag":1833},"TRAINER_LUCAS_1_REWARD":{"address":5603342,"default_item":108,"flag":1909},"TRAINER_LUIS_REWARD":{"address":5602386,"default_item":103,"flag":1431},"TRAINER_LUNG_REWARD":{"address":5602924,"default_item":103,"flag":1700},"TRAINER_LYDIA_1_REWARD":{"address":5603174,"default_item":106,"flag":1825},"TRAINER_LYLE_REWARD":{"address":5603316,"default_item":103,"flag":1896},"TRAINER_MACEY_REWARD":{"address":5603266,"default_item":108,"flag":1871},"TRAINER_MADELINE_1_REWARD":{"address":5602952,"default_item":108,"flag":1714},"TRAINER_MAKAYLA_REWARD":{"address":5603600,"default_item":104,"flag":2038},"TRAINER_MARCEL_REWARD":{"address":5602106,"default_item":104,"flag":1291},"TRAINER_MARCOS_REWARD":{"address":5603488,"default_item":106,"flag":1982},"TRAINER_MARC_REWARD":{"address":5603226,"default_item":106,"flag":1851},"TRAINER_MARIA_1_REWARD":{"address":5602822,"default_item":106,"flag":1649},"TRAINER_MARK_REWARD":{"address":5602374,"default_item":104,"flag":1425},"TRAINER_MARLENE_REWARD":{"address":5603588,"default_item":106,"flag":2032},"TRAINER_MARLEY_REWARD":{"address":5603100,"default_item":104,"flag":1788},"TRAINER_MARY_REWARD":{"address":5602262,"default_item":104,"flag":1369},"TRAINER_MATTHEW_REWARD":{"address":5602398,"default_item":103,"flag":1437},"TRAINER_MATT_REWARD":{"address":5602144,"default_item":104,"flag":1310},"TRAINER_MAURA_REWARD":{"address":5602576,"default_item":108,"flag":1526},"TRAINER_MAXIE_MAGMA_HIDEOUT_REWARD":{"address":5603286,"default_item":107,"flag":1881},"TRAINER_MAXIE_MT_CHIMNEY_REWARD":{"address":5603288,"default_item":104,"flag":1882},"TRAINER_MAY_LILYCOVE_MUDKIP_REWARD":{"address":5603412,"default_item":104,"flag":1944},"TRAINER_MAY_LILYCOVE_TORCHIC_REWARD":{"address":5603416,"default_item":104,"flag":1946},"TRAINER_MAY_LILYCOVE_TREECKO_REWARD":{"address":5603414,"default_item":104,"flag":1945},"TRAINER_MAY_ROUTE_103_MUDKIP_REWARD":{"address":5603142,"default_item":106,"flag":1809},"TRAINER_MAY_ROUTE_103_TORCHIC_REWARD":{"address":5603154,"default_item":106,"flag":1815},"TRAINER_MAY_ROUTE_103_TREECKO_REWARD":{"address":5603148,"default_item":106,"flag":1812},"TRAINER_MAY_ROUTE_110_MUDKIP_REWARD":{"address":5603144,"default_item":104,"flag":1810},"TRAINER_MAY_ROUTE_110_TORCHIC_REWARD":{"address":5603156,"default_item":104,"flag":1816},"TRAINER_MAY_ROUTE_110_TREECKO_REWARD":{"address":5603150,"default_item":104,"flag":1813},"TRAINER_MAY_ROUTE_119_MUDKIP_REWARD":{"address":5603146,"default_item":104,"flag":1811},"TRAINER_MAY_ROUTE_119_TORCHIC_REWARD":{"address":5603158,"default_item":104,"flag":1817},"TRAINER_MAY_ROUTE_119_TREECKO_REWARD":{"address":5603152,"default_item":104,"flag":1814},"TRAINER_MAY_RUSTBORO_MUDKIP_REWARD":{"address":5603284,"default_item":108,"flag":1880},"TRAINER_MAY_RUSTBORO_TORCHIC_REWARD":{"address":5603622,"default_item":108,"flag":2049},"TRAINER_MAY_RUSTBORO_TREECKO_REWARD":{"address":5603620,"default_item":108,"flag":2048},"TRAINER_MELINA_REWARD":{"address":5603594,"default_item":106,"flag":2035},"TRAINER_MELISSA_REWARD":{"address":5602332,"default_item":104,"flag":1404},"TRAINER_MEL_AND_PAUL_REWARD":{"address":5603444,"default_item":108,"flag":1960},"TRAINER_MICAH_REWARD":{"address":5602594,"default_item":107,"flag":1535},"TRAINER_MICHELLE_REWARD":{"address":5602280,"default_item":104,"flag":1378},"TRAINER_MIGUEL_1_REWARD":{"address":5602670,"default_item":104,"flag":1573},"TRAINER_MIKE_2_REWARD":{"address":5603354,"default_item":106,"flag":1915},"TRAINER_MISSY_REWARD":{"address":5602978,"default_item":103,"flag":1727},"TRAINER_MITCHELL_REWARD":{"address":5603164,"default_item":104,"flag":1820},"TRAINER_MIU_AND_YUKI_REWARD":{"address":5603052,"default_item":106,"flag":1764},"TRAINER_MOLLIE_REWARD":{"address":5602358,"default_item":104,"flag":1417},"TRAINER_MYLES_REWARD":{"address":5603614,"default_item":104,"flag":2045},"TRAINER_NANCY_REWARD":{"address":5603028,"default_item":106,"flag":1752},"TRAINER_NAOMI_REWARD":{"address":5602322,"default_item":110,"flag":1399},"TRAINER_NATE_REWARD":{"address":5603248,"default_item":107,"flag":1862},"TRAINER_NED_REWARD":{"address":5602764,"default_item":106,"flag":1620},"TRAINER_NICHOLAS_REWARD":{"address":5603254,"default_item":108,"flag":1865},"TRAINER_NICOLAS_1_REWARD":{"address":5602868,"default_item":104,"flag":1672},"TRAINER_NIKKI_REWARD":{"address":5602990,"default_item":106,"flag":1733},"TRAINER_NOB_1_REWARD":{"address":5602450,"default_item":106,"flag":1463},"TRAINER_NOLAN_REWARD":{"address":5602768,"default_item":108,"flag":1622},"TRAINER_NOLEN_REWARD":{"address":5602406,"default_item":106,"flag":1441},"TRAINER_NORMAN_1_REWARD":{"address":5602622,"default_item":107,"flag":1549},"TRAINER_OLIVIA_REWARD":{"address":5602344,"default_item":107,"flag":1410},"TRAINER_OWEN_REWARD":{"address":5602250,"default_item":104,"flag":1363},"TRAINER_PABLO_1_REWARD":{"address":5602838,"default_item":104,"flag":1657},"TRAINER_PARKER_REWARD":{"address":5602228,"default_item":104,"flag":1352},"TRAINER_PAT_REWARD":{"address":5603616,"default_item":104,"flag":2046},"TRAINER_PAXTON_REWARD":{"address":5603272,"default_item":104,"flag":1874},"TRAINER_PERRY_REWARD":{"address":5602880,"default_item":108,"flag":1678},"TRAINER_PETE_REWARD":{"address":5603554,"default_item":103,"flag":2015},"TRAINER_PHILLIP_REWARD":{"address":5603072,"default_item":104,"flag":1774},"TRAINER_PHIL_REWARD":{"address":5602884,"default_item":108,"flag":1680},"TRAINER_PHOEBE_REWARD":{"address":5602608,"default_item":110,"flag":1542},"TRAINER_PRESLEY_REWARD":{"address":5602890,"default_item":104,"flag":1683},"TRAINER_PRESTON_REWARD":{"address":5602550,"default_item":108,"flag":1513},"TRAINER_QUINCY_REWARD":{"address":5602732,"default_item":104,"flag":1604},"TRAINER_RACHEL_REWARD":{"address":5603606,"default_item":104,"flag":2041},"TRAINER_RANDALL_REWARD":{"address":5602226,"default_item":104,"flag":1351},"TRAINER_REED_REWARD":{"address":5603434,"default_item":106,"flag":1955},"TRAINER_RELI_AND_IAN_REWARD":{"address":5603456,"default_item":106,"flag":1966},"TRAINER_REYNA_REWARD":{"address":5603102,"default_item":108,"flag":1789},"TRAINER_RHETT_REWARD":{"address":5603490,"default_item":106,"flag":1983},"TRAINER_RICHARD_REWARD":{"address":5602416,"default_item":106,"flag":1446},"TRAINER_RICKY_1_REWARD":{"address":5602212,"default_item":103,"flag":1344},"TRAINER_RICK_REWARD":{"address":5603314,"default_item":103,"flag":1895},"TRAINER_RILEY_REWARD":{"address":5603390,"default_item":106,"flag":1933},"TRAINER_ROBERT_1_REWARD":{"address":5602896,"default_item":108,"flag":1686},"TRAINER_RODNEY_REWARD":{"address":5602414,"default_item":106,"flag":1445},"TRAINER_ROGER_REWARD":{"address":5603422,"default_item":104,"flag":1949},"TRAINER_ROLAND_REWARD":{"address":5602404,"default_item":106,"flag":1440},"TRAINER_RONALD_REWARD":{"address":5602784,"default_item":104,"flag":1630},"TRAINER_ROSE_1_REWARD":{"address":5602158,"default_item":106,"flag":1317},"TRAINER_ROXANNE_1_REWARD":{"address":5602614,"default_item":104,"flag":1545},"TRAINER_RUBEN_REWARD":{"address":5603426,"default_item":104,"flag":1951},"TRAINER_SAMANTHA_REWARD":{"address":5602574,"default_item":108,"flag":1525},"TRAINER_SAMUEL_REWARD":{"address":5602246,"default_item":104,"flag":1361},"TRAINER_SANTIAGO_REWARD":{"address":5602420,"default_item":106,"flag":1448},"TRAINER_SARAH_REWARD":{"address":5603474,"default_item":104,"flag":1975},"TRAINER_SAWYER_1_REWARD":{"address":5602086,"default_item":108,"flag":1281},"TRAINER_SHANE_REWARD":{"address":5602512,"default_item":106,"flag":1494},"TRAINER_SHANNON_REWARD":{"address":5602278,"default_item":104,"flag":1377},"TRAINER_SHARON_REWARD":{"address":5602988,"default_item":106,"flag":1732},"TRAINER_SHAWN_REWARD":{"address":5602472,"default_item":106,"flag":1474},"TRAINER_SHAYLA_REWARD":{"address":5603578,"default_item":108,"flag":2027},"TRAINER_SHEILA_REWARD":{"address":5602334,"default_item":104,"flag":1405},"TRAINER_SHELBY_1_REWARD":{"address":5602710,"default_item":108,"flag":1593},"TRAINER_SHELLY_SEAFLOOR_CAVERN_REWARD":{"address":5602150,"default_item":104,"flag":1313},"TRAINER_SHELLY_WEATHER_INSTITUTE_REWARD":{"address":5602148,"default_item":104,"flag":1312},"TRAINER_SHIRLEY_REWARD":{"address":5602336,"default_item":104,"flag":1406},"TRAINER_SIDNEY_REWARD":{"address":5602606,"default_item":110,"flag":1541},"TRAINER_SIENNA_REWARD":{"address":5603002,"default_item":106,"flag":1739},"TRAINER_SIMON_REWARD":{"address":5602214,"default_item":103,"flag":1345},"TRAINER_SOPHIE_REWARD":{"address":5603500,"default_item":106,"flag":1988},"TRAINER_SPENCER_REWARD":{"address":5602402,"default_item":106,"flag":1439},"TRAINER_STAN_REWARD":{"address":5602408,"default_item":106,"flag":1442},"TRAINER_STEVEN_REWARD":{"address":5603692,"default_item":109,"flag":2084},"TRAINER_STEVE_1_REWARD":{"address":5602370,"default_item":104,"flag":1423},"TRAINER_SUSIE_REWARD":{"address":5602996,"default_item":106,"flag":1736},"TRAINER_SYLVIA_REWARD":{"address":5603234,"default_item":108,"flag":1855},"TRAINER_TABITHA_MAGMA_HIDEOUT_REWARD":{"address":5603548,"default_item":104,"flag":2012},"TRAINER_TABITHA_MT_CHIMNEY_REWARD":{"address":5603278,"default_item":108,"flag":1877},"TRAINER_TAKAO_REWARD":{"address":5602442,"default_item":106,"flag":1459},"TRAINER_TAKASHI_REWARD":{"address":5602916,"default_item":106,"flag":1696},"TRAINER_TALIA_REWARD":{"address":5602854,"default_item":104,"flag":1665},"TRAINER_TAMMY_REWARD":{"address":5602298,"default_item":106,"flag":1387},"TRAINER_TANYA_REWARD":{"address":5602986,"default_item":106,"flag":1731},"TRAINER_TARA_REWARD":{"address":5602976,"default_item":103,"flag":1726},"TRAINER_TASHA_REWARD":{"address":5602302,"default_item":108,"flag":1389},"TRAINER_TATE_AND_LIZA_1_REWARD":{"address":5602626,"default_item":109,"flag":1551},"TRAINER_TAYLOR_REWARD":{"address":5602534,"default_item":104,"flag":1505},"TRAINER_THALIA_1_REWARD":{"address":5602372,"default_item":104,"flag":1424},"TRAINER_THOMAS_REWARD":{"address":5602596,"default_item":107,"flag":1536},"TRAINER_TIANA_REWARD":{"address":5603290,"default_item":103,"flag":1883},"TRAINER_TIFFANY_REWARD":{"address":5602346,"default_item":107,"flag":1411},"TRAINER_TIMMY_REWARD":{"address":5602752,"default_item":103,"flag":1614},"TRAINER_TIMOTHY_1_REWARD":{"address":5602698,"default_item":104,"flag":1587},"TRAINER_TISHA_REWARD":{"address":5603436,"default_item":106,"flag":1956},"TRAINER_TOMMY_REWARD":{"address":5602726,"default_item":103,"flag":1601},"TRAINER_TONY_1_REWARD":{"address":5602394,"default_item":103,"flag":1435},"TRAINER_TORI_AND_TIA_REWARD":{"address":5603438,"default_item":103,"flag":1957},"TRAINER_TRAVIS_REWARD":{"address":5602520,"default_item":106,"flag":1498},"TRAINER_TRENT_1_REWARD":{"address":5603338,"default_item":106,"flag":1907},"TRAINER_TYRA_AND_IVY_REWARD":{"address":5603442,"default_item":106,"flag":1959},"TRAINER_TYRON_REWARD":{"address":5603492,"default_item":106,"flag":1984},"TRAINER_VALERIE_1_REWARD":{"address":5602300,"default_item":108,"flag":1388},"TRAINER_VANESSA_REWARD":{"address":5602684,"default_item":104,"flag":1580},"TRAINER_VICKY_REWARD":{"address":5602708,"default_item":108,"flag":1592},"TRAINER_VICTORIA_REWARD":{"address":5602682,"default_item":106,"flag":1579},"TRAINER_VICTOR_REWARD":{"address":5602668,"default_item":106,"flag":1572},"TRAINER_VIOLET_REWARD":{"address":5602162,"default_item":104,"flag":1319},"TRAINER_VIRGIL_REWARD":{"address":5602552,"default_item":108,"flag":1514},"TRAINER_VITO_REWARD":{"address":5602248,"default_item":104,"flag":1362},"TRAINER_VIVIAN_REWARD":{"address":5603382,"default_item":106,"flag":1929},"TRAINER_VIVI_REWARD":{"address":5603296,"default_item":106,"flag":1886},"TRAINER_WADE_REWARD":{"address":5602772,"default_item":106,"flag":1624},"TRAINER_WALLACE_REWARD":{"address":5602754,"default_item":110,"flag":1615},"TRAINER_WALLY_MAUVILLE_REWARD":{"address":5603396,"default_item":108,"flag":1936},"TRAINER_WALLY_VR_1_REWARD":{"address":5603122,"default_item":107,"flag":1799},"TRAINER_WALTER_1_REWARD":{"address":5602592,"default_item":104,"flag":1534},"TRAINER_WARREN_REWARD":{"address":5602260,"default_item":104,"flag":1368},"TRAINER_WATTSON_1_REWARD":{"address":5602618,"default_item":104,"flag":1547},"TRAINER_WAYNE_REWARD":{"address":5603430,"default_item":104,"flag":1953},"TRAINER_WENDY_REWARD":{"address":5602268,"default_item":104,"flag":1372},"TRAINER_WILLIAM_REWARD":{"address":5602556,"default_item":106,"flag":1516},"TRAINER_WILTON_1_REWARD":{"address":5602240,"default_item":108,"flag":1358},"TRAINER_WINONA_1_REWARD":{"address":5602624,"default_item":107,"flag":1550},"TRAINER_WINSTON_1_REWARD":{"address":5602356,"default_item":104,"flag":1416},"TRAINER_WYATT_REWARD":{"address":5603506,"default_item":104,"flag":1991},"TRAINER_YASU_REWARD":{"address":5602914,"default_item":106,"flag":1695},"TRAINER_ZANDER_REWARD":{"address":5602146,"default_item":108,"flag":1311}},"maps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE":{"header_address":4766420,"warp_table_address":5496844},"MAP_ABANDONED_SHIP_CORRIDORS_1F":{"header_address":4766196,"warp_table_address":5495920},"MAP_ABANDONED_SHIP_CORRIDORS_B1F":{"header_address":4766252,"warp_table_address":5496248},"MAP_ABANDONED_SHIP_DECK":{"header_address":4766168,"warp_table_address":5495812},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS":{"fishing_encounters":{"address":5609088,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766476,"warp_table_address":5496908,"water_encounters":{"address":5609060,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS":{"header_address":4766504,"warp_table_address":5497120},"MAP_ABANDONED_SHIP_ROOMS2_1F":{"header_address":4766392,"warp_table_address":5496752},"MAP_ABANDONED_SHIP_ROOMS2_B1F":{"header_address":4766308,"warp_table_address":5496484},"MAP_ABANDONED_SHIP_ROOMS_1F":{"header_address":4766224,"warp_table_address":5496132},"MAP_ABANDONED_SHIP_ROOMS_B1F":{"fishing_encounters":{"address":5606324,"slots":[129,72,129,72,72,72,72,73,73,73]},"header_address":4766280,"warp_table_address":5496392,"water_encounters":{"address":5606296,"slots":[72,72,72,72,73]}},"MAP_ABANDONED_SHIP_ROOM_B1F":{"header_address":4766364,"warp_table_address":5496596},"MAP_ABANDONED_SHIP_UNDERWATER1":{"header_address":4766336,"warp_table_address":5496536},"MAP_ABANDONED_SHIP_UNDERWATER2":{"header_address":4766448,"warp_table_address":5496880},"MAP_ALTERING_CAVE":{"header_address":4767624,"land_encounters":{"address":5613400,"slots":[41,41,41,41,41,41,41,41,41,41,41,41]},"warp_table_address":5500436},"MAP_ANCIENT_TOMB":{"header_address":4766560,"warp_table_address":5497460},"MAP_AQUA_HIDEOUT_1F":{"header_address":4765300,"warp_table_address":5490892},"MAP_AQUA_HIDEOUT_B1F":{"header_address":4765328,"warp_table_address":5491152},"MAP_AQUA_HIDEOUT_B2F":{"header_address":4765356,"warp_table_address":5491516},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP1":{"header_address":4766728,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP2":{"header_address":4766756,"warp_table_address":4160749568},"MAP_AQUA_HIDEOUT_UNUSED_RUBY_MAP3":{"header_address":4766784,"warp_table_address":4160749568},"MAP_ARTISAN_CAVE_1F":{"header_address":4767456,"land_encounters":{"address":5613344,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500172},"MAP_ARTISAN_CAVE_B1F":{"header_address":4767428,"land_encounters":{"address":5613288,"slots":[235,235,235,235,235,235,235,235,235,235,235,235]},"warp_table_address":5500064},"MAP_BATTLE_COLOSSEUM_2P":{"header_address":4768352,"warp_table_address":5509852},"MAP_BATTLE_COLOSSEUM_4P":{"header_address":4768436,"warp_table_address":5510152},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM":{"header_address":4770228,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR":{"header_address":4770200,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY":{"header_address":4770172,"warp_table_address":5520908},"MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM":{"header_address":4769976,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR":{"header_address":4769920,"warp_table_address":5519076},"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY":{"header_address":4769892,"warp_table_address":5518968},"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM":{"header_address":4769948,"warp_table_address":5519136},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM":{"header_address":4770312,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY":{"header_address":4770256,"warp_table_address":5521384},"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM":{"header_address":4770284,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM":{"header_address":4770060,"warp_table_address":5520116},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR":{"header_address":4770032,"warp_table_address":5519944},"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY":{"header_address":4770004,"warp_table_address":5519696},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR":{"header_address":4770368,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY":{"header_address":4770340,"warp_table_address":5521808},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL":{"header_address":4770452,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL":{"header_address":4770424,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS":{"header_address":4770480,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM":{"header_address":4770396,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR":{"header_address":4770116,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY":{"header_address":4770088,"warp_table_address":5520248},"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP":{"header_address":4770144,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM":{"header_address":4769612,"warp_table_address":5516696},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR":{"header_address":4769584,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_ELEVATOR":{"header_address":4769556,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY":{"header_address":4769528,"warp_table_address":5516432},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM":{"header_address":4769864,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR":{"header_address":4769836,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM":{"header_address":4769808,"warp_table_address":4160749568},"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER":{"header_address":4770564,"warp_table_address":5523056},"MAP_BATTLE_FRONTIER_LOUNGE1":{"header_address":4770536,"warp_table_address":5522812},"MAP_BATTLE_FRONTIER_LOUNGE2":{"header_address":4770592,"warp_table_address":5523220},"MAP_BATTLE_FRONTIER_LOUNGE3":{"header_address":4770620,"warp_table_address":5523376},"MAP_BATTLE_FRONTIER_LOUNGE4":{"header_address":4770648,"warp_table_address":5523476},"MAP_BATTLE_FRONTIER_LOUNGE5":{"header_address":4770704,"warp_table_address":5523660},"MAP_BATTLE_FRONTIER_LOUNGE6":{"header_address":4770732,"warp_table_address":5523720},"MAP_BATTLE_FRONTIER_LOUNGE7":{"header_address":4770760,"warp_table_address":5523844},"MAP_BATTLE_FRONTIER_LOUNGE8":{"header_address":4770816,"warp_table_address":5524100},"MAP_BATTLE_FRONTIER_LOUNGE9":{"header_address":4770844,"warp_table_address":5524152},"MAP_BATTLE_FRONTIER_MART":{"header_address":4770928,"warp_table_address":5524588},"MAP_BATTLE_FRONTIER_OUTSIDE_EAST":{"header_address":4769780,"warp_table_address":5518080},"MAP_BATTLE_FRONTIER_OUTSIDE_WEST":{"header_address":4769500,"warp_table_address":5516048},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F":{"header_address":4770872,"warp_table_address":5524308},"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F":{"header_address":4770900,"warp_table_address":5524448},"MAP_BATTLE_FRONTIER_RANKING_HALL":{"header_address":4770508,"warp_table_address":5522560},"MAP_BATTLE_FRONTIER_RECEPTION_GATE":{"header_address":4770788,"warp_table_address":5523992},"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE":{"header_address":4770676,"warp_table_address":5523528},"MAP_BATTLE_PYRAMID_SQUARE01":{"header_address":4768912,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE02":{"header_address":4768940,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE03":{"header_address":4768968,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE04":{"header_address":4768996,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE05":{"header_address":4769024,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE06":{"header_address":4769052,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE07":{"header_address":4769080,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE08":{"header_address":4769108,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE09":{"header_address":4769136,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE10":{"header_address":4769164,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE11":{"header_address":4769192,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE12":{"header_address":4769220,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE13":{"header_address":4769248,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE14":{"header_address":4769276,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE15":{"header_address":4769304,"warp_table_address":4160749568},"MAP_BATTLE_PYRAMID_SQUARE16":{"header_address":4769332,"warp_table_address":4160749568},"MAP_BIRTH_ISLAND_EXTERIOR":{"header_address":4771012,"warp_table_address":5524876},"MAP_BIRTH_ISLAND_HARBOR":{"header_address":4771040,"warp_table_address":5524952},"MAP_CAVE_OF_ORIGIN_1F":{"header_address":4765720,"land_encounters":{"address":5609868,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493440},"MAP_CAVE_OF_ORIGIN_B1F":{"header_address":4765832,"warp_table_address":5493608},"MAP_CAVE_OF_ORIGIN_ENTRANCE":{"header_address":4765692,"land_encounters":{"address":5609812,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493404},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1":{"header_address":4765748,"land_encounters":{"address":5609924,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493476},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2":{"header_address":4765776,"land_encounters":{"address":5609980,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493512},"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3":{"header_address":4765804,"land_encounters":{"address":5610036,"slots":[41,41,41,322,322,322,41,41,42,42,42,42]},"warp_table_address":5493548},"MAP_CONTEST_HALL":{"header_address":4768464,"warp_table_address":4160749568},"MAP_CONTEST_HALL_BEAUTY":{"header_address":4768660,"warp_table_address":4160749568},"MAP_CONTEST_HALL_COOL":{"header_address":4768716,"warp_table_address":4160749568},"MAP_CONTEST_HALL_CUTE":{"header_address":4768772,"warp_table_address":4160749568},"MAP_CONTEST_HALL_SMART":{"header_address":4768744,"warp_table_address":4160749568},"MAP_CONTEST_HALL_TOUGH":{"header_address":4768688,"warp_table_address":4160749568},"MAP_DESERT_RUINS":{"header_address":4764824,"warp_table_address":5486828},"MAP_DESERT_UNDERPASS":{"header_address":4767400,"land_encounters":{"address":5613232,"slots":[132,370,132,371,132,370,371,132,370,132,371,132]},"warp_table_address":5500012},"MAP_DEWFORD_TOWN":{"fishing_encounters":{"address":5611588,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758300,"warp_table_address":5435180,"water_encounters":{"address":5611560,"slots":[72,309,309,310,310]}},"MAP_DEWFORD_TOWN_GYM":{"header_address":4759952,"warp_table_address":5460340},"MAP_DEWFORD_TOWN_HALL":{"header_address":4759980,"warp_table_address":5460640},"MAP_DEWFORD_TOWN_HOUSE1":{"header_address":4759868,"warp_table_address":5459856},"MAP_DEWFORD_TOWN_HOUSE2":{"header_address":4760008,"warp_table_address":5460748},"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F":{"header_address":4759896,"warp_table_address":5459964},"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F":{"header_address":4759924,"warp_table_address":5460104},"MAP_EVER_GRANDE_CITY":{"fishing_encounters":{"address":5611892,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4758216,"warp_table_address":5434048,"water_encounters":{"address":5611864,"slots":[72,309,309,310,310]}},"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM":{"header_address":4764012,"warp_table_address":5483720},"MAP_EVER_GRANDE_CITY_DRAKES_ROOM":{"header_address":4763984,"warp_table_address":5483612},"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM":{"header_address":4763956,"warp_table_address":5483552},"MAP_EVER_GRANDE_CITY_HALL1":{"header_address":4764040,"warp_table_address":5483756},"MAP_EVER_GRANDE_CITY_HALL2":{"header_address":4764068,"warp_table_address":5483808},"MAP_EVER_GRANDE_CITY_HALL3":{"header_address":4764096,"warp_table_address":5483860},"MAP_EVER_GRANDE_CITY_HALL4":{"header_address":4764124,"warp_table_address":5483912},"MAP_EVER_GRANDE_CITY_HALL5":{"header_address":4764152,"warp_table_address":5483948},"MAP_EVER_GRANDE_CITY_HALL_OF_FAME":{"header_address":4764208,"warp_table_address":5484180},"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM":{"header_address":4763928,"warp_table_address":5483492},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F":{"header_address":4764236,"warp_table_address":5484304},"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F":{"header_address":4764264,"warp_table_address":5484444},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F":{"header_address":4764180,"warp_table_address":5484096},"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F":{"header_address":4764292,"warp_table_address":5484584},"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM":{"header_address":4763900,"warp_table_address":5483432},"MAP_FALLARBOR_TOWN":{"header_address":4758356,"warp_table_address":5435792},"MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760316,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760288,"warp_table_address":4160749568},"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760260,"warp_table_address":5462376},"MAP_FALLARBOR_TOWN_COZMOS_HOUSE":{"header_address":4760400,"warp_table_address":5462888},"MAP_FALLARBOR_TOWN_MART":{"header_address":4760232,"warp_table_address":5462220},"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE":{"header_address":4760428,"warp_table_address":5462948},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F":{"header_address":4760344,"warp_table_address":5462656},"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F":{"header_address":4760372,"warp_table_address":5462796},"MAP_FARAWAY_ISLAND_ENTRANCE":{"header_address":4770956,"warp_table_address":5524672},"MAP_FARAWAY_ISLAND_INTERIOR":{"header_address":4770984,"warp_table_address":5524792},"MAP_FIERY_PATH":{"header_address":4765048,"land_encounters":{"address":5606456,"slots":[339,109,339,66,321,218,109,66,321,321,88,88]},"warp_table_address":5489344},"MAP_FORTREE_CITY":{"header_address":4758104,"warp_table_address":5431676},"MAP_FORTREE_CITY_DECORATION_SHOP":{"header_address":4762444,"warp_table_address":5473936},"MAP_FORTREE_CITY_GYM":{"header_address":4762220,"warp_table_address":5472984},"MAP_FORTREE_CITY_HOUSE1":{"header_address":4762192,"warp_table_address":5472756},"MAP_FORTREE_CITY_HOUSE2":{"header_address":4762332,"warp_table_address":5473504},"MAP_FORTREE_CITY_HOUSE3":{"header_address":4762360,"warp_table_address":5473588},"MAP_FORTREE_CITY_HOUSE4":{"header_address":4762388,"warp_table_address":5473696},"MAP_FORTREE_CITY_HOUSE5":{"header_address":4762416,"warp_table_address":5473804},"MAP_FORTREE_CITY_MART":{"header_address":4762304,"warp_table_address":5473420},"MAP_FORTREE_CITY_POKEMON_CENTER_1F":{"header_address":4762248,"warp_table_address":5473140},"MAP_FORTREE_CITY_POKEMON_CENTER_2F":{"header_address":4762276,"warp_table_address":5473280},"MAP_GRANITE_CAVE_1F":{"header_address":4764852,"land_encounters":{"address":5605988,"slots":[41,335,335,41,335,63,335,335,74,74,74,74]},"warp_table_address":5486956},"MAP_GRANITE_CAVE_B1F":{"header_address":4764880,"land_encounters":{"address":5606044,"slots":[41,382,382,382,41,63,335,335,322,322,322,322]},"warp_table_address":5487032},"MAP_GRANITE_CAVE_B2F":{"header_address":4764908,"land_encounters":{"address":5606372,"slots":[41,382,382,41,382,63,322,322,322,322,322,322]},"rock_smash_encounters":{"address":5606428,"slots":[74,320,74,74,74]},"warp_table_address":5487324},"MAP_GRANITE_CAVE_STEVENS_ROOM":{"header_address":4764936,"land_encounters":{"address":5608188,"slots":[41,335,335,41,335,63,335,335,382,382,382,382]},"warp_table_address":5487432},"MAP_INSIDE_OF_TRUCK":{"header_address":4768800,"warp_table_address":5510720},"MAP_ISLAND_CAVE":{"header_address":4766532,"warp_table_address":5497356},"MAP_JAGGED_PASS":{"header_address":4765020,"land_encounters":{"address":5606644,"slots":[339,339,66,339,351,66,351,66,339,351,339,351]},"warp_table_address":5488908},"MAP_LAVARIDGE_TOWN":{"header_address":4758328,"warp_table_address":5435516},"MAP_LAVARIDGE_TOWN_GYM_1F":{"header_address":4760064,"warp_table_address":5461036},"MAP_LAVARIDGE_TOWN_GYM_B1F":{"header_address":4760092,"warp_table_address":5461384},"MAP_LAVARIDGE_TOWN_HERB_SHOP":{"header_address":4760036,"warp_table_address":5460856},"MAP_LAVARIDGE_TOWN_HOUSE":{"header_address":4760120,"warp_table_address":5461668},"MAP_LAVARIDGE_TOWN_MART":{"header_address":4760148,"warp_table_address":5461776},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F":{"header_address":4760176,"warp_table_address":5461908},"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F":{"header_address":4760204,"warp_table_address":5462056},"MAP_LILYCOVE_CITY":{"fishing_encounters":{"address":5611512,"slots":[129,72,129,72,313,313,313,120,313,313]},"header_address":4758132,"warp_table_address":5432368,"water_encounters":{"address":5611484,"slots":[72,309,309,310,310]}},"MAP_LILYCOVE_CITY_CONTEST_HALL":{"header_address":4762612,"warp_table_address":5476560},"MAP_LILYCOVE_CITY_CONTEST_LOBBY":{"header_address":4762584,"warp_table_address":5475596},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F":{"header_address":4762472,"warp_table_address":5473996},"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F":{"header_address":4762500,"warp_table_address":5474224},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F":{"header_address":4762920,"warp_table_address":5478044},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F":{"header_address":4762948,"warp_table_address":5478228},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F":{"header_address":4762976,"warp_table_address":5478392},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F":{"header_address":4763004,"warp_table_address":5478556},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F":{"header_address":4763032,"warp_table_address":5478768},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR":{"header_address":4763088,"warp_table_address":5478984},"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP":{"header_address":4763060,"warp_table_address":5478908},"MAP_LILYCOVE_CITY_HARBOR":{"header_address":4762752,"warp_table_address":5477396},"MAP_LILYCOVE_CITY_HOUSE1":{"header_address":4762808,"warp_table_address":5477540},"MAP_LILYCOVE_CITY_HOUSE2":{"header_address":4762836,"warp_table_address":5477600},"MAP_LILYCOVE_CITY_HOUSE3":{"header_address":4762864,"warp_table_address":5477780},"MAP_LILYCOVE_CITY_HOUSE4":{"header_address":4762892,"warp_table_address":5477864},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F":{"header_address":4762528,"warp_table_address":5474492},"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F":{"header_address":4762556,"warp_table_address":5474824},"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE":{"header_address":4762780,"warp_table_address":5477456},"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F":{"header_address":4762640,"warp_table_address":5476804},"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F":{"header_address":4762668,"warp_table_address":5476944},"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB":{"header_address":4762724,"warp_table_address":5477240},"MAP_LILYCOVE_CITY_UNUSED_MART":{"header_address":4762696,"warp_table_address":5476988},"MAP_LITTLEROOT_TOWN":{"header_address":4758244,"warp_table_address":5434528},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F":{"header_address":4759588,"warp_table_address":5457588},"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F":{"header_address":4759616,"warp_table_address":5458080},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F":{"header_address":4759644,"warp_table_address":5458324},"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F":{"header_address":4759672,"warp_table_address":5458816},"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB":{"header_address":4759700,"warp_table_address":5459036},"MAP_MAGMA_HIDEOUT_1F":{"header_address":4767064,"land_encounters":{"address":5612560,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498844},"MAP_MAGMA_HIDEOUT_2F_1R":{"header_address":4767092,"land_encounters":{"address":5612616,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5498992},"MAP_MAGMA_HIDEOUT_2F_2R":{"header_address":4767120,"land_encounters":{"address":5612672,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499180},"MAP_MAGMA_HIDEOUT_2F_3R":{"header_address":4767260,"land_encounters":{"address":5612952,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499696},"MAP_MAGMA_HIDEOUT_3F_1R":{"header_address":4767148,"land_encounters":{"address":5612728,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499288},"MAP_MAGMA_HIDEOUT_3F_2R":{"header_address":4767176,"land_encounters":{"address":5612784,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499380},"MAP_MAGMA_HIDEOUT_3F_3R":{"header_address":4767232,"land_encounters":{"address":5612896,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499660},"MAP_MAGMA_HIDEOUT_4F":{"header_address":4767204,"land_encounters":{"address":5612840,"slots":[74,321,74,321,74,74,74,75,75,75,75,75]},"warp_table_address":5499600},"MAP_MARINE_CAVE_END":{"header_address":4767540,"warp_table_address":5500288},"MAP_MARINE_CAVE_ENTRANCE":{"header_address":4767512,"warp_table_address":5500236},"MAP_MAUVILLE_CITY":{"header_address":4758048,"warp_table_address":5430380},"MAP_MAUVILLE_CITY_BIKE_SHOP":{"header_address":4761520,"warp_table_address":5469232},"MAP_MAUVILLE_CITY_GAME_CORNER":{"header_address":4761576,"warp_table_address":5469640},"MAP_MAUVILLE_CITY_GYM":{"header_address":4761492,"warp_table_address":5469060},"MAP_MAUVILLE_CITY_HOUSE1":{"header_address":4761548,"warp_table_address":5469316},"MAP_MAUVILLE_CITY_HOUSE2":{"header_address":4761604,"warp_table_address":5469988},"MAP_MAUVILLE_CITY_MART":{"header_address":4761688,"warp_table_address":5470424},"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F":{"header_address":4761632,"warp_table_address":5470144},"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F":{"header_address":4761660,"warp_table_address":5470308},"MAP_METEOR_FALLS_1F_1R":{"fishing_encounters":{"address":5610796,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4764656,"land_encounters":{"address":5610712,"slots":[41,41,41,41,41,349,349,349,41,41,41,41]},"warp_table_address":5486052,"water_encounters":{"address":5610768,"slots":[41,41,349,349,349]}},"MAP_METEOR_FALLS_1F_2R":{"fishing_encounters":{"address":5610928,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764684,"land_encounters":{"address":5610844,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486220,"water_encounters":{"address":5610900,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_1R":{"fishing_encounters":{"address":5611060,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764712,"land_encounters":{"address":5610976,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5486284,"water_encounters":{"address":5611032,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_B1F_2R":{"fishing_encounters":{"address":5606596,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4764740,"land_encounters":{"address":5606512,"slots":[42,42,395,349,395,349,395,349,42,42,42,42]},"warp_table_address":5486376,"water_encounters":{"address":5606568,"slots":[42,42,349,349,349]}},"MAP_METEOR_FALLS_STEVENS_CAVE":{"header_address":4767652,"land_encounters":{"address":5613904,"slots":[42,42,42,349,349,349,42,349,42,42,42,42]},"warp_table_address":5500488},"MAP_MIRAGE_TOWER_1F":{"header_address":4767288,"land_encounters":{"address":5613008,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499732},"MAP_MIRAGE_TOWER_2F":{"header_address":4767316,"land_encounters":{"address":5613064,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499768},"MAP_MIRAGE_TOWER_3F":{"header_address":4767344,"land_encounters":{"address":5613120,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499852},"MAP_MIRAGE_TOWER_4F":{"header_address":4767372,"land_encounters":{"address":5613176,"slots":[27,332,27,332,27,332,27,332,27,332,27,332]},"warp_table_address":5499960},"MAP_MOSSDEEP_CITY":{"fishing_encounters":{"address":5611740,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758160,"warp_table_address":5433064,"water_encounters":{"address":5611712,"slots":[72,309,309,310,310]}},"MAP_MOSSDEEP_CITY_GAME_CORNER_1F":{"header_address":4763424,"warp_table_address":5481712},"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F":{"header_address":4763452,"warp_table_address":5481816},"MAP_MOSSDEEP_CITY_GYM":{"header_address":4763116,"warp_table_address":5479884},"MAP_MOSSDEEP_CITY_HOUSE1":{"header_address":4763144,"warp_table_address":5480232},"MAP_MOSSDEEP_CITY_HOUSE2":{"header_address":4763172,"warp_table_address":5480340},"MAP_MOSSDEEP_CITY_HOUSE3":{"header_address":4763284,"warp_table_address":5480812},"MAP_MOSSDEEP_CITY_HOUSE4":{"header_address":4763340,"warp_table_address":5481076},"MAP_MOSSDEEP_CITY_MART":{"header_address":4763256,"warp_table_address":5480752},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F":{"header_address":4763200,"warp_table_address":5480448},"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F":{"header_address":4763228,"warp_table_address":5480612},"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F":{"header_address":4763368,"warp_table_address":5481376},"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F":{"header_address":4763396,"warp_table_address":5481636},"MAP_MOSSDEEP_CITY_STEVENS_HOUSE":{"header_address":4763312,"warp_table_address":5480920},"MAP_MT_CHIMNEY":{"header_address":4764992,"warp_table_address":5488664},"MAP_MT_CHIMNEY_CABLE_CAR_STATION":{"header_address":4764460,"warp_table_address":5485144},"MAP_MT_PYRE_1F":{"header_address":4765076,"land_encounters":{"address":5606100,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489452},"MAP_MT_PYRE_2F":{"header_address":4765104,"land_encounters":{"address":5607796,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489712},"MAP_MT_PYRE_3F":{"header_address":4765132,"land_encounters":{"address":5607852,"slots":[377,377,377,377,377,377,377,377,377,377,377,377]},"warp_table_address":5489868},"MAP_MT_PYRE_4F":{"header_address":4765160,"land_encounters":{"address":5607908,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5489984},"MAP_MT_PYRE_5F":{"header_address":4765188,"land_encounters":{"address":5607964,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490100},"MAP_MT_PYRE_6F":{"header_address":4765216,"land_encounters":{"address":5608020,"slots":[377,377,377,377,377,377,377,377,361,361,361,361]},"warp_table_address":5490232},"MAP_MT_PYRE_EXTERIOR":{"header_address":4765244,"land_encounters":{"address":5608076,"slots":[377,377,377,377,37,37,37,37,309,309,309,309]},"warp_table_address":5490316},"MAP_MT_PYRE_SUMMIT":{"header_address":4765272,"land_encounters":{"address":5608132,"slots":[377,377,377,377,377,377,377,361,361,361,411,411]},"warp_table_address":5490656},"MAP_NAVEL_ROCK_B1F":{"header_address":4771320,"warp_table_address":5525524},"MAP_NAVEL_ROCK_BOTTOM":{"header_address":4771824,"warp_table_address":5526248},"MAP_NAVEL_ROCK_DOWN01":{"header_address":4771516,"warp_table_address":5525828},"MAP_NAVEL_ROCK_DOWN02":{"header_address":4771544,"warp_table_address":5525864},"MAP_NAVEL_ROCK_DOWN03":{"header_address":4771572,"warp_table_address":5525900},"MAP_NAVEL_ROCK_DOWN04":{"header_address":4771600,"warp_table_address":5525936},"MAP_NAVEL_ROCK_DOWN05":{"header_address":4771628,"warp_table_address":5525972},"MAP_NAVEL_ROCK_DOWN06":{"header_address":4771656,"warp_table_address":5526008},"MAP_NAVEL_ROCK_DOWN07":{"header_address":4771684,"warp_table_address":5526044},"MAP_NAVEL_ROCK_DOWN08":{"header_address":4771712,"warp_table_address":5526080},"MAP_NAVEL_ROCK_DOWN09":{"header_address":4771740,"warp_table_address":5526116},"MAP_NAVEL_ROCK_DOWN10":{"header_address":4771768,"warp_table_address":5526152},"MAP_NAVEL_ROCK_DOWN11":{"header_address":4771796,"warp_table_address":5526188},"MAP_NAVEL_ROCK_ENTRANCE":{"header_address":4771292,"warp_table_address":5525488},"MAP_NAVEL_ROCK_EXTERIOR":{"header_address":4771236,"warp_table_address":5525376},"MAP_NAVEL_ROCK_FORK":{"header_address":4771348,"warp_table_address":5525560},"MAP_NAVEL_ROCK_HARBOR":{"header_address":4771264,"warp_table_address":5525460},"MAP_NAVEL_ROCK_TOP":{"header_address":4771488,"warp_table_address":5525772},"MAP_NAVEL_ROCK_UP1":{"header_address":4771376,"warp_table_address":5525604},"MAP_NAVEL_ROCK_UP2":{"header_address":4771404,"warp_table_address":5525640},"MAP_NAVEL_ROCK_UP3":{"header_address":4771432,"warp_table_address":5525676},"MAP_NAVEL_ROCK_UP4":{"header_address":4771460,"warp_table_address":5525712},"MAP_NEW_MAUVILLE_ENTRANCE":{"header_address":4766112,"land_encounters":{"address":5610092,"slots":[100,81,100,81,100,81,100,81,100,81,100,81]},"warp_table_address":5495284},"MAP_NEW_MAUVILLE_INSIDE":{"header_address":4766140,"land_encounters":{"address":5607136,"slots":[100,81,100,81,100,81,100,81,100,81,101,82]},"warp_table_address":5495528},"MAP_OLDALE_TOWN":{"header_address":4758272,"warp_table_address":5434860},"MAP_OLDALE_TOWN_HOUSE1":{"header_address":4759728,"warp_table_address":5459276},"MAP_OLDALE_TOWN_HOUSE2":{"header_address":4759756,"warp_table_address":5459360},"MAP_OLDALE_TOWN_MART":{"header_address":4759840,"warp_table_address":5459748},"MAP_OLDALE_TOWN_POKEMON_CENTER_1F":{"header_address":4759784,"warp_table_address":5459492},"MAP_OLDALE_TOWN_POKEMON_CENTER_2F":{"header_address":4759812,"warp_table_address":5459632},"MAP_PACIFIDLOG_TOWN":{"fishing_encounters":{"address":5611816,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758412,"warp_table_address":5436288,"water_encounters":{"address":5611788,"slots":[72,309,309,310,310]}},"MAP_PACIFIDLOG_TOWN_HOUSE1":{"header_address":4760764,"warp_table_address":5464400},"MAP_PACIFIDLOG_TOWN_HOUSE2":{"header_address":4760792,"warp_table_address":5464508},"MAP_PACIFIDLOG_TOWN_HOUSE3":{"header_address":4760820,"warp_table_address":5464592},"MAP_PACIFIDLOG_TOWN_HOUSE4":{"header_address":4760848,"warp_table_address":5464700},"MAP_PACIFIDLOG_TOWN_HOUSE5":{"header_address":4760876,"warp_table_address":5464784},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F":{"header_address":4760708,"warp_table_address":5464168},"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F":{"header_address":4760736,"warp_table_address":5464308},"MAP_PETALBURG_CITY":{"fishing_encounters":{"address":5611968,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4757992,"warp_table_address":5428704,"water_encounters":{"address":5611940,"slots":[183,183,183,183,183]}},"MAP_PETALBURG_CITY_GYM":{"header_address":4760932,"warp_table_address":5465168},"MAP_PETALBURG_CITY_HOUSE1":{"header_address":4760960,"warp_table_address":5465708},"MAP_PETALBURG_CITY_HOUSE2":{"header_address":4760988,"warp_table_address":5465792},"MAP_PETALBURG_CITY_MART":{"header_address":4761072,"warp_table_address":5466228},"MAP_PETALBURG_CITY_POKEMON_CENTER_1F":{"header_address":4761016,"warp_table_address":5465948},"MAP_PETALBURG_CITY_POKEMON_CENTER_2F":{"header_address":4761044,"warp_table_address":5466088},"MAP_PETALBURG_CITY_WALLYS_HOUSE":{"header_address":4760904,"warp_table_address":5464868},"MAP_PETALBURG_WOODS":{"header_address":4764964,"land_encounters":{"address":5605876,"slots":[286,290,306,286,291,293,290,306,304,364,304,364]},"warp_table_address":5487772},"MAP_RECORD_CORNER":{"header_address":4768408,"warp_table_address":5510036},"MAP_ROUTE101":{"header_address":4758440,"land_encounters":{"address":5604388,"slots":[290,286,290,290,286,286,290,286,288,288,288,288]},"warp_table_address":4160749568},"MAP_ROUTE102":{"fishing_encounters":{"address":5604528,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758468,"land_encounters":{"address":5604444,"slots":[286,290,286,290,295,295,288,288,288,392,288,298]},"warp_table_address":4160749568,"water_encounters":{"address":5604500,"slots":[183,183,183,183,118]}},"MAP_ROUTE103":{"fishing_encounters":{"address":5604660,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4758496,"land_encounters":{"address":5604576,"slots":[286,286,286,286,309,288,288,288,309,309,309,309]},"warp_table_address":5437452,"water_encounters":{"address":5604632,"slots":[72,309,309,310,310]}},"MAP_ROUTE104":{"fishing_encounters":{"address":5604792,"slots":[129,129,129,129,129,129,129,129,129,129]},"header_address":4758524,"land_encounters":{"address":5604708,"slots":[286,290,286,183,183,286,304,304,309,309,309,309]},"warp_table_address":5438308,"water_encounters":{"address":5604764,"slots":[309,309,309,310,310]}},"MAP_ROUTE104_MR_BRINEYS_HOUSE":{"header_address":4764320,"warp_table_address":5484676},"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4764348,"warp_table_address":5484784},"MAP_ROUTE104_PROTOTYPE":{"header_address":4771880,"warp_table_address":4160749568},"MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP":{"header_address":4771908,"warp_table_address":4160749568},"MAP_ROUTE105":{"fishing_encounters":{"address":5604868,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758552,"warp_table_address":5438720,"water_encounters":{"address":5604840,"slots":[72,309,309,310,310]}},"MAP_ROUTE106":{"fishing_encounters":{"address":5606728,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758580,"warp_table_address":5438892,"water_encounters":{"address":5606700,"slots":[72,309,309,310,310]}},"MAP_ROUTE107":{"fishing_encounters":{"address":5606804,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758608,"warp_table_address":4160749568,"water_encounters":{"address":5606776,"slots":[72,309,309,310,310]}},"MAP_ROUTE108":{"fishing_encounters":{"address":5606880,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758636,"warp_table_address":5439324,"water_encounters":{"address":5606852,"slots":[72,309,309,310,310]}},"MAP_ROUTE109":{"fishing_encounters":{"address":5606956,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758664,"warp_table_address":5439940,"water_encounters":{"address":5606928,"slots":[72,309,309,310,310]}},"MAP_ROUTE109_SEASHORE_HOUSE":{"header_address":4771936,"warp_table_address":5526472},"MAP_ROUTE110":{"fishing_encounters":{"address":5605000,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758692,"land_encounters":{"address":5604916,"slots":[286,337,367,337,354,43,354,367,309,309,353,353]},"warp_table_address":5440928,"water_encounters":{"address":5604972,"slots":[72,309,309,310,310]}},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE":{"header_address":4772272,"warp_table_address":5529400},"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE":{"header_address":4772300,"warp_table_address":5529508},"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR":{"header_address":4772020,"warp_table_address":5526740},"MAP_ROUTE110_TRICK_HOUSE_END":{"header_address":4771992,"warp_table_address":5526676},"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE":{"header_address":4771964,"warp_table_address":5526532},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1":{"header_address":4772048,"warp_table_address":5527152},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2":{"header_address":4772076,"warp_table_address":5527328},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE3":{"header_address":4772104,"warp_table_address":5527616},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE4":{"header_address":4772132,"warp_table_address":5528072},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE5":{"header_address":4772160,"warp_table_address":5528248},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE6":{"header_address":4772188,"warp_table_address":5528752},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7":{"header_address":4772216,"warp_table_address":5529024},"MAP_ROUTE110_TRICK_HOUSE_PUZZLE8":{"header_address":4772244,"warp_table_address":5529320},"MAP_ROUTE111":{"fishing_encounters":{"address":5605160,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758720,"land_encounters":{"address":5605048,"slots":[27,332,27,332,318,318,27,332,318,344,344,344]},"rock_smash_encounters":{"address":5605132,"slots":[74,74,74,74,74]},"warp_table_address":5442448,"water_encounters":{"address":5605104,"slots":[183,183,183,183,118]}},"MAP_ROUTE111_OLD_LADYS_REST_STOP":{"header_address":4764404,"warp_table_address":5484976},"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE":{"header_address":4764376,"warp_table_address":5484916},"MAP_ROUTE112":{"header_address":4758748,"land_encounters":{"address":5605208,"slots":[339,339,183,339,339,183,339,183,339,339,339,339]},"warp_table_address":5443604},"MAP_ROUTE112_CABLE_CAR_STATION":{"header_address":4764432,"warp_table_address":5485060},"MAP_ROUTE113":{"header_address":4758776,"land_encounters":{"address":5605264,"slots":[308,308,218,308,308,218,308,218,308,227,308,227]},"warp_table_address":5444092},"MAP_ROUTE113_GLASS_WORKSHOP":{"header_address":4772328,"warp_table_address":5529640},"MAP_ROUTE114":{"fishing_encounters":{"address":5605432,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758804,"land_encounters":{"address":5605320,"slots":[358,295,358,358,295,296,296,296,379,379,379,299]},"rock_smash_encounters":{"address":5605404,"slots":[74,74,74,74,74]},"warp_table_address":5445184,"water_encounters":{"address":5605376,"slots":[183,183,183,183,118]}},"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE":{"header_address":4764488,"warp_table_address":5485204},"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL":{"header_address":4764516,"warp_table_address":5485320},"MAP_ROUTE114_LANETTES_HOUSE":{"header_address":4764544,"warp_table_address":5485420},"MAP_ROUTE115":{"fishing_encounters":{"address":5607088,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758832,"land_encounters":{"address":5607004,"slots":[358,304,358,304,304,305,39,39,309,309,309,309]},"warp_table_address":5445988,"water_encounters":{"address":5607060,"slots":[72,309,309,310,310]}},"MAP_ROUTE116":{"header_address":4758860,"land_encounters":{"address":5605480,"slots":[286,370,301,63,301,304,304,304,286,286,315,315]},"warp_table_address":5446872},"MAP_ROUTE116_TUNNELERS_REST_HOUSE":{"header_address":4764572,"warp_table_address":5485564},"MAP_ROUTE117":{"fishing_encounters":{"address":5605620,"slots":[129,118,129,118,326,326,326,326,326,326]},"header_address":4758888,"land_encounters":{"address":5605536,"slots":[286,43,286,43,183,43,387,387,387,387,386,298]},"warp_table_address":5447656,"water_encounters":{"address":5605592,"slots":[183,183,183,183,118]}},"MAP_ROUTE117_POKEMON_DAY_CARE":{"header_address":4764600,"warp_table_address":5485624},"MAP_ROUTE118":{"fishing_encounters":{"address":5605752,"slots":[129,72,129,72,330,331,330,330,330,330]},"header_address":4758916,"land_encounters":{"address":5605668,"slots":[288,337,288,337,289,338,309,309,309,309,309,317]},"warp_table_address":5448236,"water_encounters":{"address":5605724,"slots":[72,309,309,310,310]}},"MAP_ROUTE119":{"fishing_encounters":{"address":5607276,"slots":[129,72,129,72,330,330,330,330,330,330]},"header_address":4758944,"land_encounters":{"address":5607192,"slots":[288,289,288,43,289,43,43,43,369,369,369,317]},"warp_table_address":5449460,"water_encounters":{"address":5607248,"slots":[72,309,309,310,310]}},"MAP_ROUTE119_HOUSE":{"header_address":4772440,"warp_table_address":5530360},"MAP_ROUTE119_WEATHER_INSTITUTE_1F":{"header_address":4772384,"warp_table_address":5529880},"MAP_ROUTE119_WEATHER_INSTITUTE_2F":{"header_address":4772412,"warp_table_address":5530164},"MAP_ROUTE120":{"fishing_encounters":{"address":5607408,"slots":[129,118,129,118,323,323,323,323,323,323]},"header_address":4758972,"land_encounters":{"address":5607324,"slots":[286,287,287,43,183,43,43,183,376,376,317,298]},"warp_table_address":5451160,"water_encounters":{"address":5607380,"slots":[183,183,183,183,118]}},"MAP_ROUTE121":{"fishing_encounters":{"address":5607540,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759000,"land_encounters":{"address":5607456,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5452364,"water_encounters":{"address":5607512,"slots":[72,309,309,310,310]}},"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE":{"header_address":4764628,"warp_table_address":5485732},"MAP_ROUTE122":{"fishing_encounters":{"address":5607616,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759028,"warp_table_address":5452576,"water_encounters":{"address":5607588,"slots":[72,309,309,310,310]}},"MAP_ROUTE123":{"fishing_encounters":{"address":5607748,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4759056,"land_encounters":{"address":5607664,"slots":[286,377,287,377,287,43,43,44,309,309,309,317]},"warp_table_address":5453636,"water_encounters":{"address":5607720,"slots":[72,309,309,310,310]}},"MAP_ROUTE123_BERRY_MASTERS_HOUSE":{"header_address":4772356,"warp_table_address":5529724},"MAP_ROUTE124":{"fishing_encounters":{"address":5605828,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759084,"warp_table_address":5454436,"water_encounters":{"address":5605800,"slots":[72,309,309,310,310]}},"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE":{"header_address":4772468,"warp_table_address":5530420},"MAP_ROUTE125":{"fishing_encounters":{"address":5608272,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759112,"warp_table_address":5454716,"water_encounters":{"address":5608244,"slots":[72,309,309,310,310]}},"MAP_ROUTE126":{"fishing_encounters":{"address":5608348,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759140,"warp_table_address":4160749568,"water_encounters":{"address":5608320,"slots":[72,309,309,310,310]}},"MAP_ROUTE127":{"fishing_encounters":{"address":5608424,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759168,"warp_table_address":4160749568,"water_encounters":{"address":5608396,"slots":[72,309,309,310,310]}},"MAP_ROUTE128":{"fishing_encounters":{"address":5608500,"slots":[129,72,129,325,313,325,313,222,313,313]},"header_address":4759196,"warp_table_address":4160749568,"water_encounters":{"address":5608472,"slots":[72,309,309,310,310]}},"MAP_ROUTE129":{"fishing_encounters":{"address":5608576,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759224,"warp_table_address":4160749568,"water_encounters":{"address":5608548,"slots":[72,309,309,310,314]}},"MAP_ROUTE130":{"fishing_encounters":{"address":5608708,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759252,"land_encounters":{"address":5608624,"slots":[360,360,360,360,360,360,360,360,360,360,360,360]},"warp_table_address":4160749568,"water_encounters":{"address":5608680,"slots":[72,309,309,310,310]}},"MAP_ROUTE131":{"fishing_encounters":{"address":5608784,"slots":[129,72,129,72,313,331,313,313,313,313]},"header_address":4759280,"warp_table_address":5456116,"water_encounters":{"address":5608756,"slots":[72,309,309,310,310]}},"MAP_ROUTE132":{"fishing_encounters":{"address":5608860,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759308,"warp_table_address":4160749568,"water_encounters":{"address":5608832,"slots":[72,309,309,310,310]}},"MAP_ROUTE133":{"fishing_encounters":{"address":5608936,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759336,"warp_table_address":4160749568,"water_encounters":{"address":5608908,"slots":[72,309,309,310,310]}},"MAP_ROUTE134":{"fishing_encounters":{"address":5609012,"slots":[129,72,129,72,313,331,313,116,313,313]},"header_address":4759364,"warp_table_address":4160749568,"water_encounters":{"address":5608984,"slots":[72,309,309,310,310]}},"MAP_RUSTBORO_CITY":{"header_address":4758076,"warp_table_address":5430936},"MAP_RUSTBORO_CITY_CUTTERS_HOUSE":{"header_address":4762024,"warp_table_address":5472204},"MAP_RUSTBORO_CITY_DEVON_CORP_1F":{"header_address":4761716,"warp_table_address":5470532},"MAP_RUSTBORO_CITY_DEVON_CORP_2F":{"header_address":4761744,"warp_table_address":5470744},"MAP_RUSTBORO_CITY_DEVON_CORP_3F":{"header_address":4761772,"warp_table_address":5470852},"MAP_RUSTBORO_CITY_FLAT1_1F":{"header_address":4761940,"warp_table_address":5471808},"MAP_RUSTBORO_CITY_FLAT1_2F":{"header_address":4761968,"warp_table_address":5472044},"MAP_RUSTBORO_CITY_FLAT2_1F":{"header_address":4762080,"warp_table_address":5472372},"MAP_RUSTBORO_CITY_FLAT2_2F":{"header_address":4762108,"warp_table_address":5472464},"MAP_RUSTBORO_CITY_FLAT2_3F":{"header_address":4762136,"warp_table_address":5472548},"MAP_RUSTBORO_CITY_GYM":{"header_address":4761800,"warp_table_address":5471024},"MAP_RUSTBORO_CITY_HOUSE1":{"header_address":4761996,"warp_table_address":5472120},"MAP_RUSTBORO_CITY_HOUSE2":{"header_address":4762052,"warp_table_address":5472288},"MAP_RUSTBORO_CITY_HOUSE3":{"header_address":4762164,"warp_table_address":5472648},"MAP_RUSTBORO_CITY_MART":{"header_address":4761912,"warp_table_address":5471724},"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F":{"header_address":4761856,"warp_table_address":5471444},"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F":{"header_address":4761884,"warp_table_address":5471584},"MAP_RUSTBORO_CITY_POKEMON_SCHOOL":{"header_address":4761828,"warp_table_address":5471252},"MAP_RUSTURF_TUNNEL":{"header_address":4764768,"land_encounters":{"address":5605932,"slots":[370,370,370,370,370,370,370,370,370,370,370,370]},"warp_table_address":5486644},"MAP_SAFARI_ZONE_NORTH":{"header_address":4769416,"land_encounters":{"address":5610280,"slots":[231,43,231,43,177,44,44,177,178,214,178,214]},"rock_smash_encounters":{"address":5610336,"slots":[74,74,74,74,74]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHEAST":{"header_address":4769724,"land_encounters":{"address":5612476,"slots":[190,216,190,216,191,165,163,204,228,241,228,241]},"rock_smash_encounters":{"address":5612532,"slots":[213,213,213,213,213]},"warp_table_address":4160749568},"MAP_SAFARI_ZONE_NORTHWEST":{"fishing_encounters":{"address":5610448,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769388,"land_encounters":{"address":5610364,"slots":[111,43,111,43,84,44,44,84,85,127,85,127]},"warp_table_address":4160749568,"water_encounters":{"address":5610420,"slots":[54,54,54,55,55]}},"MAP_SAFARI_ZONE_REST_HOUSE":{"header_address":4769696,"warp_table_address":5516996},"MAP_SAFARI_ZONE_SOUTH":{"header_address":4769472,"land_encounters":{"address":5606212,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515444},"MAP_SAFARI_ZONE_SOUTHEAST":{"fishing_encounters":{"address":5612428,"slots":[129,118,129,118,223,118,223,223,223,224]},"header_address":4769752,"land_encounters":{"address":5612344,"slots":[191,179,191,179,190,167,163,209,234,207,234,207]},"warp_table_address":4160749568,"water_encounters":{"address":5612400,"slots":[194,183,183,183,195]}},"MAP_SAFARI_ZONE_SOUTHWEST":{"fishing_encounters":{"address":5610232,"slots":[129,118,129,118,118,118,118,119,119,119]},"header_address":4769444,"land_encounters":{"address":5610148,"slots":[43,43,203,203,177,84,44,202,25,202,25,202]},"warp_table_address":5515260,"water_encounters":{"address":5610204,"slots":[54,54,54,54,54]}},"MAP_SCORCHED_SLAB":{"header_address":4766700,"warp_table_address":5498144},"MAP_SEAFLOOR_CAVERN_ENTRANCE":{"fishing_encounters":{"address":5609764,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765412,"warp_table_address":5491796,"water_encounters":{"address":5609736,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM1":{"header_address":4765440,"land_encounters":{"address":5609136,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5491952},"MAP_SEAFLOOR_CAVERN_ROOM2":{"header_address":4765468,"land_encounters":{"address":5609192,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492188},"MAP_SEAFLOOR_CAVERN_ROOM3":{"header_address":4765496,"land_encounters":{"address":5609248,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492456},"MAP_SEAFLOOR_CAVERN_ROOM4":{"header_address":4765524,"land_encounters":{"address":5609304,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492548},"MAP_SEAFLOOR_CAVERN_ROOM5":{"header_address":4765552,"land_encounters":{"address":5609360,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492744},"MAP_SEAFLOOR_CAVERN_ROOM6":{"fishing_encounters":{"address":5609500,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765580,"land_encounters":{"address":5609416,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492788,"water_encounters":{"address":5609472,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM7":{"fishing_encounters":{"address":5609632,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765608,"land_encounters":{"address":5609548,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5492832,"water_encounters":{"address":5609604,"slots":[72,41,41,42,42]}},"MAP_SEAFLOOR_CAVERN_ROOM8":{"header_address":4765636,"land_encounters":{"address":5609680,"slots":[41,41,41,41,41,41,41,41,42,42,42,42]},"warp_table_address":5493156},"MAP_SEAFLOOR_CAVERN_ROOM9":{"header_address":4765664,"warp_table_address":5493360},"MAP_SEALED_CHAMBER_INNER_ROOM":{"header_address":4766672,"warp_table_address":5497984},"MAP_SEALED_CHAMBER_OUTER_ROOM":{"header_address":4766644,"warp_table_address":5497608},"MAP_SECRET_BASE_BLUE_CAVE1":{"header_address":4767736,"warp_table_address":5501652},"MAP_SECRET_BASE_BLUE_CAVE2":{"header_address":4767904,"warp_table_address":5503980},"MAP_SECRET_BASE_BLUE_CAVE3":{"header_address":4768072,"warp_table_address":5506308},"MAP_SECRET_BASE_BLUE_CAVE4":{"header_address":4768240,"warp_table_address":5508636},"MAP_SECRET_BASE_BROWN_CAVE1":{"header_address":4767708,"warp_table_address":5501264},"MAP_SECRET_BASE_BROWN_CAVE2":{"header_address":4767876,"warp_table_address":5503592},"MAP_SECRET_BASE_BROWN_CAVE3":{"header_address":4768044,"warp_table_address":5505920},"MAP_SECRET_BASE_BROWN_CAVE4":{"header_address":4768212,"warp_table_address":5508248},"MAP_SECRET_BASE_RED_CAVE1":{"header_address":4767680,"warp_table_address":5500876},"MAP_SECRET_BASE_RED_CAVE2":{"header_address":4767848,"warp_table_address":5503204},"MAP_SECRET_BASE_RED_CAVE3":{"header_address":4768016,"warp_table_address":5505532},"MAP_SECRET_BASE_RED_CAVE4":{"header_address":4768184,"warp_table_address":5507860},"MAP_SECRET_BASE_SHRUB1":{"header_address":4767820,"warp_table_address":5502816},"MAP_SECRET_BASE_SHRUB2":{"header_address":4767988,"warp_table_address":5505144},"MAP_SECRET_BASE_SHRUB3":{"header_address":4768156,"warp_table_address":5507472},"MAP_SECRET_BASE_SHRUB4":{"header_address":4768324,"warp_table_address":5509800},"MAP_SECRET_BASE_TREE1":{"header_address":4767792,"warp_table_address":5502428},"MAP_SECRET_BASE_TREE2":{"header_address":4767960,"warp_table_address":5504756},"MAP_SECRET_BASE_TREE3":{"header_address":4768128,"warp_table_address":5507084},"MAP_SECRET_BASE_TREE4":{"header_address":4768296,"warp_table_address":5509412},"MAP_SECRET_BASE_YELLOW_CAVE1":{"header_address":4767764,"warp_table_address":5502040},"MAP_SECRET_BASE_YELLOW_CAVE2":{"header_address":4767932,"warp_table_address":5504368},"MAP_SECRET_BASE_YELLOW_CAVE3":{"header_address":4768100,"warp_table_address":5506696},"MAP_SECRET_BASE_YELLOW_CAVE4":{"header_address":4768268,"warp_table_address":5509024},"MAP_SHOAL_CAVE_HIGH_TIDE_ENTRANCE_ROOM":{"header_address":4766056,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_HIGH_TIDE_INNER_ROOM":{"header_address":4766084,"warp_table_address":4160749568},"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM":{"fishing_encounters":{"address":5611436,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765944,"land_encounters":{"address":5611352,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494828,"water_encounters":{"address":5611408,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM":{"header_address":4766980,"land_encounters":{"address":5612044,"slots":[41,341,41,341,41,341,346,341,42,346,42,346]},"warp_table_address":5498544},"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM":{"fishing_encounters":{"address":5611304,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4765972,"land_encounters":{"address":5611220,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5494904,"water_encounters":{"address":5611276,"slots":[72,41,341,341,341]}},"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM":{"header_address":4766028,"land_encounters":{"address":5611164,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495180},"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM":{"header_address":4766000,"land_encounters":{"address":5611108,"slots":[41,341,41,341,41,341,41,341,42,341,42,341]},"warp_table_address":5495084},"MAP_SKY_PILLAR_1F":{"header_address":4766868,"land_encounters":{"address":5612100,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498328},"MAP_SKY_PILLAR_2F":{"header_address":4766896,"warp_table_address":5498372},"MAP_SKY_PILLAR_3F":{"header_address":4766924,"land_encounters":{"address":5612232,"slots":[322,42,42,322,319,378,378,319,319,319,319,319]},"warp_table_address":5498408},"MAP_SKY_PILLAR_4F":{"header_address":4766952,"warp_table_address":5498452},"MAP_SKY_PILLAR_5F":{"header_address":4767008,"land_encounters":{"address":5612288,"slots":[322,42,42,322,319,378,378,319,319,359,359,359]},"warp_table_address":5498572},"MAP_SKY_PILLAR_ENTRANCE":{"header_address":4766812,"warp_table_address":5498232},"MAP_SKY_PILLAR_OUTSIDE":{"header_address":4766840,"warp_table_address":5498292},"MAP_SKY_PILLAR_TOP":{"header_address":4767036,"warp_table_address":5498656},"MAP_SLATEPORT_CITY":{"fishing_encounters":{"address":5611664,"slots":[129,72,129,72,313,313,313,313,313,313]},"header_address":4758020,"warp_table_address":5429836,"water_encounters":{"address":5611636,"slots":[72,309,309,310,310]}},"MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM":{"header_address":4761212,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_CORRIDOR":{"header_address":4761184,"warp_table_address":4160749568},"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY":{"header_address":4761156,"warp_table_address":5466624},"MAP_SLATEPORT_CITY_HARBOR":{"header_address":4761352,"warp_table_address":5468328},"MAP_SLATEPORT_CITY_HOUSE":{"header_address":4761380,"warp_table_address":5468492},"MAP_SLATEPORT_CITY_MART":{"header_address":4761464,"warp_table_address":5468856},"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE":{"header_address":4761240,"warp_table_address":5466832},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F":{"header_address":4761296,"warp_table_address":5467456},"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F":{"header_address":4761324,"warp_table_address":5467856},"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F":{"header_address":4761408,"warp_table_address":5468600},"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F":{"header_address":4761436,"warp_table_address":5468740},"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB":{"header_address":4761268,"warp_table_address":5467084},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F":{"header_address":4761100,"warp_table_address":5466360},"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F":{"header_address":4761128,"warp_table_address":5466476},"MAP_SOOTOPOLIS_CITY":{"fishing_encounters":{"address":5612184,"slots":[129,72,129,129,129,129,129,130,130,130]},"header_address":4758188,"warp_table_address":5433852,"water_encounters":{"address":5612156,"slots":[129,129,129,129,129]}},"MAP_SOOTOPOLIS_CITY_GYM_1F":{"header_address":4763480,"warp_table_address":5481892},"MAP_SOOTOPOLIS_CITY_GYM_B1F":{"header_address":4763508,"warp_table_address":5482200},"MAP_SOOTOPOLIS_CITY_HOUSE1":{"header_address":4763620,"warp_table_address":5482664},"MAP_SOOTOPOLIS_CITY_HOUSE2":{"header_address":4763648,"warp_table_address":5482724},"MAP_SOOTOPOLIS_CITY_HOUSE3":{"header_address":4763676,"warp_table_address":5482808},"MAP_SOOTOPOLIS_CITY_HOUSE4":{"header_address":4763704,"warp_table_address":5482916},"MAP_SOOTOPOLIS_CITY_HOUSE5":{"header_address":4763732,"warp_table_address":5483000},"MAP_SOOTOPOLIS_CITY_HOUSE6":{"header_address":4763760,"warp_table_address":5483060},"MAP_SOOTOPOLIS_CITY_HOUSE7":{"header_address":4763788,"warp_table_address":5483144},"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE":{"header_address":4763816,"warp_table_address":5483228},"MAP_SOOTOPOLIS_CITY_MART":{"header_address":4763592,"warp_table_address":5482580},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F":{"header_address":4763844,"warp_table_address":5483312},"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F":{"header_address":4763872,"warp_table_address":5483380},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F":{"header_address":4763536,"warp_table_address":5482324},"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F":{"header_address":4763564,"warp_table_address":5482464},"MAP_SOUTHERN_ISLAND_EXTERIOR":{"header_address":4769640,"warp_table_address":5516780},"MAP_SOUTHERN_ISLAND_INTERIOR":{"header_address":4769668,"warp_table_address":5516876},"MAP_SS_TIDAL_CORRIDOR":{"header_address":4768828,"warp_table_address":5510992},"MAP_SS_TIDAL_LOWER_DECK":{"header_address":4768856,"warp_table_address":5511276},"MAP_SS_TIDAL_ROOMS":{"header_address":4768884,"warp_table_address":5511508},"MAP_TERRA_CAVE_END":{"header_address":4767596,"warp_table_address":5500392},"MAP_TERRA_CAVE_ENTRANCE":{"header_address":4767568,"warp_table_address":5500332},"MAP_TRADE_CENTER":{"header_address":4768380,"warp_table_address":5509944},"MAP_TRAINER_HILL_1F":{"header_address":4771096,"warp_table_address":5525172},"MAP_TRAINER_HILL_2F":{"header_address":4771124,"warp_table_address":5525208},"MAP_TRAINER_HILL_3F":{"header_address":4771152,"warp_table_address":5525244},"MAP_TRAINER_HILL_4F":{"header_address":4771180,"warp_table_address":5525280},"MAP_TRAINER_HILL_ELEVATOR":{"header_address":4771852,"warp_table_address":5526300},"MAP_TRAINER_HILL_ENTRANCE":{"header_address":4771068,"warp_table_address":5525100},"MAP_TRAINER_HILL_ROOF":{"header_address":4771208,"warp_table_address":5525340},"MAP_UNDERWATER_MARINE_CAVE":{"header_address":4767484,"warp_table_address":5500208},"MAP_UNDERWATER_ROUTE105":{"header_address":4759532,"warp_table_address":5457348},"MAP_UNDERWATER_ROUTE124":{"header_address":4759392,"warp_table_address":4160749568,"water_encounters":{"address":5612016,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE125":{"header_address":4759560,"warp_table_address":5457384},"MAP_UNDERWATER_ROUTE126":{"header_address":4759420,"warp_table_address":5457052,"water_encounters":{"address":5606268,"slots":[373,170,373,381,381]}},"MAP_UNDERWATER_ROUTE127":{"header_address":4759448,"warp_table_address":5457176},"MAP_UNDERWATER_ROUTE128":{"header_address":4759476,"warp_table_address":5457260},"MAP_UNDERWATER_ROUTE129":{"header_address":4759504,"warp_table_address":5457312},"MAP_UNDERWATER_ROUTE134":{"header_address":4766588,"warp_table_address":5497540},"MAP_UNDERWATER_SEAFLOOR_CAVERN":{"header_address":4765384,"warp_table_address":5491744},"MAP_UNDERWATER_SEALED_CHAMBER":{"header_address":4766616,"warp_table_address":5497568},"MAP_UNDERWATER_SOOTOPOLIS_CITY":{"header_address":4764796,"warp_table_address":5486768},"MAP_UNION_ROOM":{"header_address":4769360,"warp_table_address":5514872},"MAP_UNUSED_CONTEST_HALL1":{"header_address":4768492,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL2":{"header_address":4768520,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL3":{"header_address":4768548,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL4":{"header_address":4768576,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL5":{"header_address":4768604,"warp_table_address":4160749568},"MAP_UNUSED_CONTEST_HALL6":{"header_address":4768632,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN":{"header_address":4758384,"warp_table_address":5436044},"MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM":{"header_address":4760512,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR":{"header_address":4760484,"warp_table_address":4160749568},"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY":{"header_address":4760456,"warp_table_address":5463128},"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE":{"header_address":4760652,"warp_table_address":5463928},"MAP_VERDANTURF_TOWN_HOUSE":{"header_address":4760680,"warp_table_address":5464012},"MAP_VERDANTURF_TOWN_MART":{"header_address":4760540,"warp_table_address":5463408},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F":{"header_address":4760568,"warp_table_address":5463540},"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F":{"header_address":4760596,"warp_table_address":5463680},"MAP_VERDANTURF_TOWN_WANDAS_HOUSE":{"header_address":4760624,"warp_table_address":5463844},"MAP_VICTORY_ROAD_1F":{"header_address":4765860,"land_encounters":{"address":5606156,"slots":[42,336,383,371,41,335,42,336,382,370,382,370]},"warp_table_address":5493852},"MAP_VICTORY_ROAD_B1F":{"header_address":4765888,"land_encounters":{"address":5610496,"slots":[42,336,383,383,42,336,42,336,383,355,383,355]},"rock_smash_encounters":{"address":5610552,"slots":[75,74,75,75,75]},"warp_table_address":5494460},"MAP_VICTORY_ROAD_B2F":{"fishing_encounters":{"address":5610664,"slots":[129,118,129,118,323,323,323,324,324,324]},"header_address":4765916,"land_encounters":{"address":5610580,"slots":[42,322,383,383,42,322,42,322,383,355,383,355]},"warp_table_address":5494704,"water_encounters":{"address":5610636,"slots":[42,42,42,42,42]}}},"misc_pokemon":[{"address":2572358,"species":385},{"address":2018148,"species":360},{"address":2323175,"species":101},{"address":2323252,"species":101},{"address":2581669,"species":317},{"address":2581574,"species":317},{"address":2581688,"species":317},{"address":2581593,"species":317},{"address":2581612,"species":317},{"address":2581631,"species":317},{"address":2581650,"species":317},{"address":2065036,"species":317},{"address":2386223,"species":185},{"address":2339323,"species":100},{"address":2339400,"species":100},{"address":2339477,"species":100}],"misc_ram_addresses":{"CB2_Overworld":134768624,"gArchipelagoDeathLinkQueued":33804824,"gArchipelagoReceivedItem":33804776,"gMain":50340544,"gPlayerParty":33703196,"gSaveBlock1Ptr":50355596,"gSaveBlock2Ptr":50355600},"misc_rom_addresses":{"FindObjectEventPaletteIndexByTag":586344,"LoadObjectEventPalette":586116,"PatchObjectPalette":586244,"gArchipelagoInfo":5912960,"gArchipelagoItemNames":5896457,"gArchipelagoNameTable":5905457,"gArchipelagoOptions":5895556,"gArchipelagoPlayerNames":5895607,"gBattleMoves":3281380,"gEvolutionTable":3318404,"gLevelUpLearnsets":3334884,"gMonBackPicTable":3174912,"gMonFootprintTable":5726932,"gMonFrontPicTable":3205844,"gMonIconPaletteIndices":5784268,"gMonIconTable":5782508,"gMonPaletteTable":3178432,"gMonShinyPaletteTable":3181952,"gObjectEventBaseOam_16x16":5311020,"gObjectEventBaseOam_16x32":5311044,"gObjectEventBaseOam_32x32":5311052,"gObjectEventGraphicsInfoPointers":5294928,"gRandomizedBerryTreeItems":5843560,"gRandomizedSoundTable":10155508,"gSpeciesInfo":3296744,"gTMHMLearnsets":3289780,"gTrainerBackAnimsPtrTable":3188308,"gTrainerBackPicPaletteTable":3188436,"gTrainerBackPicTable":3188372,"gTrainerFrontPicPaletteTable":3187332,"gTrainerFrontPicTable":3186588,"gTrainers":3230072,"gTutorMoves":6428060,"sBackAnims_Brendan":3188244,"sBackAnims_Red":3188260,"sEggHatchTiles":3344020,"sEggPalette":3343988,"sEmpty6":14929745,"sFanfares":5422580,"sNewGamePCItems":6210444,"sOamTables_16x16":5311100,"sOamTables_16x32":5311184,"sOamTables_32x32":5311268,"sObjectEventSpritePalettes":5320952,"sStarterMon":6021752,"sTMHMMoves":6432208,"sTrainerBackSpriteTemplates":3337568,"sTutorLearnsets":6428120},"species":[{"abilities":[0,0],"address":3296744,"base_stats":[0,0,0,0,0,0],"catch_rate":0,"evolutions":[],"friendship":0,"id":0,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3296772,"base_stats":[45,49,49,45,65,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":2}],"friendship":70,"id":1,"learnset":{"address":3308280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":20,"move_id":75},{"level":25,"move_id":230},{"level":32,"move_id":74},{"level":39,"move_id":235},{"level":46,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296800,"base_stats":[60,62,63,60,80,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":3}],"friendship":70,"id":2,"learnset":{"address":3308308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":38,"move_id":74},{"level":47,"move_id":235},{"level":56,"move_id":76}]},"tmhm_learnset":"00E41E0884350720","types":[12,3]},{"abilities":[65,0],"address":3296828,"base_stats":[80,82,83,80,100,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":3,"learnset":{"address":3308338,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":73},{"level":1,"move_id":22},{"level":4,"move_id":45},{"level":7,"move_id":73},{"level":10,"move_id":22},{"level":15,"move_id":77},{"level":15,"move_id":79},{"level":22,"move_id":75},{"level":29,"move_id":230},{"level":41,"move_id":74},{"level":53,"move_id":235},{"level":65,"move_id":76}]},"tmhm_learnset":"00E41E0886354730","types":[12,3]},{"abilities":[66,0],"address":3296856,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":5}],"friendship":70,"id":4,"learnset":{"address":3308368,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":19,"move_id":99},{"level":25,"move_id":184},{"level":31,"move_id":53},{"level":37,"move_id":163},{"level":43,"move_id":82},{"level":49,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296884,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":6}],"friendship":70,"id":5,"learnset":{"address":3308394,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":41,"move_id":163},{"level":48,"move_id":82},{"level":55,"move_id":83}]},"tmhm_learnset":"00A61EA4CC510623","types":[10,10]},{"abilities":[66,0],"address":3296912,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":6,"learnset":{"address":3308420,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":52},{"level":1,"move_id":108},{"level":7,"move_id":52},{"level":13,"move_id":108},{"level":20,"move_id":99},{"level":27,"move_id":184},{"level":34,"move_id":53},{"level":36,"move_id":17},{"level":44,"move_id":163},{"level":54,"move_id":82},{"level":64,"move_id":83}]},"tmhm_learnset":"00AE5EA4CE514633","types":[10,2]},{"abilities":[67,0],"address":3296940,"base_stats":[44,48,65,43,50,64],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":8}],"friendship":70,"id":7,"learnset":{"address":3308448,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":18,"move_id":44},{"level":23,"move_id":229},{"level":28,"move_id":182},{"level":33,"move_id":240},{"level":40,"move_id":130},{"level":47,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296968,"base_stats":[59,63,80,58,65,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":9}],"friendship":70,"id":8,"learnset":{"address":3308478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":37,"move_id":240},{"level":45,"move_id":130},{"level":53,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[67,0],"address":3296996,"base_stats":[79,83,100,78,85,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":9,"learnset":{"address":3308508,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":145},{"level":1,"move_id":110},{"level":4,"move_id":39},{"level":7,"move_id":145},{"level":10,"move_id":110},{"level":13,"move_id":55},{"level":19,"move_id":44},{"level":25,"move_id":229},{"level":31,"move_id":182},{"level":42,"move_id":240},{"level":55,"move_id":130},{"level":68,"move_id":56}]},"tmhm_learnset":"03B01E00CE537275","types":[11,11]},{"abilities":[19,0],"address":3297024,"base_stats":[45,30,35,45,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":11}],"friendship":70,"id":10,"learnset":{"address":3308538,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3297052,"base_stats":[50,20,55,30,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":12}],"friendship":70,"id":11,"learnset":{"address":3308548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[14,0],"address":3297080,"base_stats":[60,45,50,70,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":12,"learnset":{"address":3308560,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":77},{"level":14,"move_id":78},{"level":15,"move_id":79},{"level":18,"move_id":48},{"level":23,"move_id":18},{"level":28,"move_id":16},{"level":34,"move_id":60},{"level":40,"move_id":219},{"level":47,"move_id":318}]},"tmhm_learnset":"0040BE80B43F4620","types":[6,2]},{"abilities":[19,0],"address":3297108,"base_stats":[40,35,30,50,20,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":7,"species":14}],"friendship":70,"id":13,"learnset":{"address":3308590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[61,0],"address":3297136,"base_stats":[45,25,50,35,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":15}],"friendship":70,"id":14,"learnset":{"address":3308600,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,3]},{"abilities":[68,0],"address":3297164,"base_stats":[65,80,40,75,45,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":15,"learnset":{"address":3308612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":31},{"level":10,"move_id":31},{"level":15,"move_id":116},{"level":20,"move_id":41},{"level":25,"move_id":99},{"level":30,"move_id":228},{"level":35,"move_id":42},{"level":40,"move_id":97},{"level":45,"move_id":283}]},"tmhm_learnset":"00843E88C4354620","types":[6,3]},{"abilities":[51,0],"address":3297192,"base_stats":[40,45,40,56,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":17}],"friendship":70,"id":16,"learnset":{"address":3308638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":19,"move_id":18},{"level":25,"move_id":17},{"level":31,"move_id":297},{"level":39,"move_id":97},{"level":47,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297220,"base_stats":[63,60,55,71,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":18}],"friendship":70,"id":17,"learnset":{"address":3308664,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":43,"move_id":97},{"level":52,"move_id":119}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297248,"base_stats":[83,80,75,91,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":18,"learnset":{"address":3308690,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":28},{"level":1,"move_id":16},{"level":1,"move_id":98},{"level":5,"move_id":28},{"level":9,"move_id":16},{"level":13,"move_id":98},{"level":20,"move_id":18},{"level":27,"move_id":17},{"level":34,"move_id":297},{"level":48,"move_id":97},{"level":62,"move_id":119}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[50,62],"address":3297276,"base_stats":[30,56,35,72,25,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":20}],"friendship":70,"id":19,"learnset":{"address":3308716,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":116},{"level":27,"move_id":228},{"level":34,"move_id":162},{"level":41,"move_id":283}]},"tmhm_learnset":"00843E02ADD33E20","types":[0,0]},{"abilities":[50,62],"address":3297304,"base_stats":[55,81,60,97,50,70],"catch_rate":127,"evolutions":[],"friendship":70,"id":20,"learnset":{"address":3308738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":7,"move_id":98},{"level":13,"move_id":158},{"level":20,"move_id":184},{"level":30,"move_id":228},{"level":40,"move_id":162},{"level":50,"move_id":283}]},"tmhm_learnset":"00A43E02ADD37E30","types":[0,0]},{"abilities":[51,0],"address":3297332,"base_stats":[40,60,30,70,31,31],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":22}],"friendship":70,"id":21,"learnset":{"address":3308760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":19,"move_id":228},{"level":25,"move_id":332},{"level":31,"move_id":119},{"level":37,"move_id":65},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[51,0],"address":3297360,"base_stats":[65,90,65,100,61,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":22,"learnset":{"address":3308784,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":43},{"level":1,"move_id":31},{"level":7,"move_id":43},{"level":13,"move_id":31},{"level":26,"move_id":228},{"level":32,"move_id":119},{"level":40,"move_id":65},{"level":47,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[22,61],"address":3297388,"base_stats":[35,60,44,55,40,54],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":24}],"friendship":70,"id":23,"learnset":{"address":3308806,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":25,"move_id":103},{"level":32,"move_id":51},{"level":37,"move_id":254},{"level":37,"move_id":256},{"level":37,"move_id":255},{"level":44,"move_id":114}]},"tmhm_learnset":"00213F088E570620","types":[3,3]},{"abilities":[22,61],"address":3297416,"base_stats":[60,85,69,80,65,79],"catch_rate":90,"evolutions":[],"friendship":70,"id":24,"learnset":{"address":3308834,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":40},{"level":1,"move_id":44},{"level":8,"move_id":40},{"level":13,"move_id":44},{"level":20,"move_id":137},{"level":28,"move_id":103},{"level":38,"move_id":51},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255},{"level":56,"move_id":114}]},"tmhm_learnset":"00213F088E574620","types":[3,3]},{"abilities":[9,0],"address":3297444,"base_stats":[35,55,30,90,50,40],"catch_rate":190,"evolutions":[{"method":"ITEM","param":96,"species":26}],"friendship":70,"id":25,"learnset":{"address":3308862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":45},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":98},{"level":15,"move_id":104},{"level":20,"move_id":21},{"level":26,"move_id":85},{"level":33,"move_id":97},{"level":41,"move_id":87},{"level":50,"move_id":113}]},"tmhm_learnset":"00E01E02CDD38221","types":[13,13]},{"abilities":[9,0],"address":3297472,"base_stats":[60,90,55,100,90,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":26,"learnset":{"address":3308890,"moves":[{"level":1,"move_id":84},{"level":1,"move_id":39},{"level":1,"move_id":98},{"level":1,"move_id":85}]},"tmhm_learnset":"00E03E02CDD3C221","types":[13,13]},{"abilities":[8,0],"address":3297500,"base_stats":[50,75,85,40,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":28}],"friendship":70,"id":27,"learnset":{"address":3308900,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":23,"move_id":163},{"level":30,"move_id":129},{"level":37,"move_id":154},{"level":45,"move_id":328},{"level":53,"move_id":201}]},"tmhm_learnset":"00A43ED0CE510621","types":[4,4]},{"abilities":[8,0],"address":3297528,"base_stats":[75,100,110,65,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":28,"learnset":{"address":3308926,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":28},{"level":6,"move_id":111},{"level":11,"move_id":28},{"level":17,"move_id":40},{"level":24,"move_id":163},{"level":33,"move_id":129},{"level":42,"move_id":154},{"level":52,"move_id":328},{"level":62,"move_id":201}]},"tmhm_learnset":"00A43ED0CE514621","types":[4,4]},{"abilities":[38,0],"address":3297556,"base_stats":[55,47,52,41,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":30}],"friendship":70,"id":29,"learnset":{"address":3308952,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":44},{"level":23,"move_id":270},{"level":30,"move_id":154},{"level":38,"move_id":260},{"level":47,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297584,"base_stats":[70,62,67,56,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":31}],"friendship":70,"id":30,"learnset":{"address":3308978,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":10},{"level":8,"move_id":39},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":44},{"level":26,"move_id":270},{"level":34,"move_id":154},{"level":43,"move_id":260},{"level":53,"move_id":242}]},"tmhm_learnset":"00A43E8A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297612,"base_stats":[90,82,87,76,75,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":31,"learnset":{"address":3309004,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":34}]},"tmhm_learnset":"00B43FFEEFD37E35","types":[3,4]},{"abilities":[38,0],"address":3297640,"base_stats":[46,57,40,50,40,40],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":16,"species":33}],"friendship":70,"id":32,"learnset":{"address":3309016,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":17,"move_id":40},{"level":20,"move_id":30},{"level":23,"move_id":270},{"level":30,"move_id":31},{"level":38,"move_id":260},{"level":47,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297668,"base_stats":[61,72,57,65,55,55],"catch_rate":120,"evolutions":[{"method":"ITEM","param":94,"species":34}],"friendship":70,"id":33,"learnset":{"address":3309042,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":8,"move_id":116},{"level":12,"move_id":24},{"level":18,"move_id":40},{"level":22,"move_id":30},{"level":26,"move_id":270},{"level":34,"move_id":31},{"level":43,"move_id":260},{"level":53,"move_id":32}]},"tmhm_learnset":"00A43E0A8DD33624","types":[3,3]},{"abilities":[38,0],"address":3297696,"base_stats":[81,92,77,85,85,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":34,"learnset":{"address":3309068,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":116},{"level":1,"move_id":24},{"level":1,"move_id":40},{"level":23,"move_id":37}]},"tmhm_learnset":"00B43F7EEFD37E35","types":[3,4]},{"abilities":[56,0],"address":3297724,"base_stats":[70,45,48,35,60,65],"catch_rate":150,"evolutions":[{"method":"ITEM","param":94,"species":36}],"friendship":140,"id":35,"learnset":{"address":3309080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":227},{"level":9,"move_id":47},{"level":13,"move_id":3},{"level":17,"move_id":266},{"level":21,"move_id":107},{"level":25,"move_id":111},{"level":29,"move_id":118},{"level":33,"move_id":322},{"level":37,"move_id":236},{"level":41,"move_id":113},{"level":45,"move_id":309}]},"tmhm_learnset":"00611E27FDFBB62D","types":[0,0]},{"abilities":[56,0],"address":3297752,"base_stats":[95,70,73,60,85,90],"catch_rate":25,"evolutions":[],"friendship":140,"id":36,"learnset":{"address":3309112,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":3},{"level":1,"move_id":107},{"level":1,"move_id":118}]},"tmhm_learnset":"00611E27FDFBF62D","types":[0,0]},{"abilities":[18,0],"address":3297780,"base_stats":[38,41,40,65,50,65],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":38}],"friendship":70,"id":37,"learnset":{"address":3309122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":5,"move_id":39},{"level":9,"move_id":46},{"level":13,"move_id":98},{"level":17,"move_id":261},{"level":21,"move_id":109},{"level":25,"move_id":286},{"level":29,"move_id":53},{"level":33,"move_id":219},{"level":37,"move_id":288},{"level":41,"move_id":83}]},"tmhm_learnset":"00021E248C590630","types":[10,10]},{"abilities":[18,0],"address":3297808,"base_stats":[73,76,75,100,81,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":38,"learnset":{"address":3309152,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":98},{"level":1,"move_id":109},{"level":1,"move_id":219},{"level":45,"move_id":83}]},"tmhm_learnset":"00021E248C594630","types":[10,10]},{"abilities":[56,0],"address":3297836,"base_stats":[115,45,20,20,45,25],"catch_rate":170,"evolutions":[{"method":"ITEM","param":94,"species":40}],"friendship":70,"id":39,"learnset":{"address":3309164,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":50},{"level":19,"move_id":205},{"level":24,"move_id":3},{"level":29,"move_id":156},{"level":34,"move_id":34},{"level":39,"move_id":102},{"level":44,"move_id":304},{"level":49,"move_id":38}]},"tmhm_learnset":"00611E27FDBBB625","types":[0,0]},{"abilities":[56,0],"address":3297864,"base_stats":[140,70,45,45,75,50],"catch_rate":50,"evolutions":[],"friendship":70,"id":40,"learnset":{"address":3309194,"moves":[{"level":1,"move_id":47},{"level":1,"move_id":50},{"level":1,"move_id":111},{"level":1,"move_id":3}]},"tmhm_learnset":"00611E27FDBBF625","types":[0,0]},{"abilities":[39,0],"address":3297892,"base_stats":[40,45,35,55,30,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":42}],"friendship":70,"id":41,"learnset":{"address":3309204,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":141},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":26,"move_id":109},{"level":31,"move_id":314},{"level":36,"move_id":212},{"level":41,"move_id":305},{"level":46,"move_id":114}]},"tmhm_learnset":"00017F88A4170E20","types":[3,2]},{"abilities":[39,0],"address":3297920,"base_stats":[75,80,70,90,65,75],"catch_rate":90,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":169}],"friendship":70,"id":42,"learnset":{"address":3309232,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00017F88A4174E20","types":[3,2]},{"abilities":[34,0],"address":3297948,"base_stats":[45,50,55,30,75,65],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":44}],"friendship":70,"id":43,"learnset":{"address":3309260,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":23,"move_id":51},{"level":32,"move_id":236},{"level":39,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3297976,"base_stats":[60,65,70,40,85,75],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":45},{"method":"ITEM","param":93,"species":182}],"friendship":70,"id":44,"learnset":{"address":3309284,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":77},{"level":7,"move_id":230},{"level":14,"move_id":77},{"level":16,"move_id":78},{"level":18,"move_id":79},{"level":24,"move_id":51},{"level":35,"move_id":236},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298004,"base_stats":[75,80,85,50,100,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":45,"learnset":{"address":3309308,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":312},{"level":1,"move_id":78},{"level":1,"move_id":72},{"level":44,"move_id":80}]},"tmhm_learnset":"00441E0884354720","types":[12,3]},{"abilities":[27,0],"address":3298032,"base_stats":[35,70,55,25,45,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":24,"species":47}],"friendship":70,"id":46,"learnset":{"address":3309320,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":25,"move_id":147},{"level":31,"move_id":163},{"level":37,"move_id":74},{"level":43,"move_id":202},{"level":49,"move_id":312}]},"tmhm_learnset":"00C43E888C350720","types":[6,12]},{"abilities":[27,0],"address":3298060,"base_stats":[60,95,80,30,60,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":47,"learnset":{"address":3309346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":78},{"level":1,"move_id":77},{"level":7,"move_id":78},{"level":13,"move_id":77},{"level":19,"move_id":141},{"level":27,"move_id":147},{"level":35,"move_id":163},{"level":43,"move_id":74},{"level":51,"move_id":202},{"level":59,"move_id":312}]},"tmhm_learnset":"00C43E888C354720","types":[6,12]},{"abilities":[14,0],"address":3298088,"base_stats":[60,55,50,45,40,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":49}],"friendship":70,"id":48,"learnset":{"address":3309372,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":33,"move_id":60},{"level":36,"move_id":79},{"level":41,"move_id":94}]},"tmhm_learnset":"0040BE0894350620","types":[6,3]},{"abilities":[19,0],"address":3298116,"base_stats":[70,65,60,90,90,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":49,"learnset":{"address":3309398,"moves":[{"level":1,"move_id":318},{"level":1,"move_id":33},{"level":1,"move_id":50},{"level":1,"move_id":193},{"level":1,"move_id":48},{"level":9,"move_id":48},{"level":17,"move_id":93},{"level":20,"move_id":77},{"level":25,"move_id":141},{"level":28,"move_id":78},{"level":31,"move_id":16},{"level":36,"move_id":60},{"level":42,"move_id":79},{"level":52,"move_id":94}]},"tmhm_learnset":"0040BE8894354620","types":[6,3]},{"abilities":[8,71],"address":3298144,"base_stats":[10,55,25,95,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":26,"species":51}],"friendship":70,"id":50,"learnset":{"address":3309428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":33,"move_id":163},{"level":41,"move_id":89},{"level":49,"move_id":90}]},"tmhm_learnset":"00843EC88E110620","types":[4,4]},{"abilities":[8,71],"address":3298172,"base_stats":[35,80,50,120,50,70],"catch_rate":50,"evolutions":[],"friendship":70,"id":51,"learnset":{"address":3309452,"moves":[{"level":1,"move_id":161},{"level":1,"move_id":10},{"level":1,"move_id":28},{"level":1,"move_id":45},{"level":5,"move_id":45},{"level":9,"move_id":222},{"level":17,"move_id":91},{"level":25,"move_id":189},{"level":26,"move_id":328},{"level":38,"move_id":163},{"level":51,"move_id":89},{"level":64,"move_id":90}]},"tmhm_learnset":"00843EC88E114620","types":[4,4]},{"abilities":[53,0],"address":3298200,"base_stats":[40,45,35,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":28,"species":53}],"friendship":70,"id":52,"learnset":{"address":3309478,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":28,"move_id":185},{"level":35,"move_id":103},{"level":41,"move_id":154},{"level":46,"move_id":163},{"level":50,"move_id":252}]},"tmhm_learnset":"00453F82ADD30E24","types":[0,0]},{"abilities":[7,0],"address":3298228,"base_stats":[65,70,60,115,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":53,"learnset":{"address":3309502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":44},{"level":11,"move_id":44},{"level":20,"move_id":6},{"level":29,"move_id":185},{"level":38,"move_id":103},{"level":46,"move_id":154},{"level":53,"move_id":163},{"level":59,"move_id":252}]},"tmhm_learnset":"00453F82ADD34E34","types":[0,0]},{"abilities":[6,13],"address":3298256,"base_stats":[50,52,48,55,65,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":33,"species":55}],"friendship":70,"id":54,"learnset":{"address":3309526,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":40,"move_id":154},{"level":50,"move_id":56}]},"tmhm_learnset":"03F01E80CC53326D","types":[11,11]},{"abilities":[6,13],"address":3298284,"base_stats":[80,82,78,85,95,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":55,"learnset":{"address":3309550,"moves":[{"level":1,"move_id":346},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":1,"move_id":50},{"level":5,"move_id":39},{"level":10,"move_id":50},{"level":16,"move_id":93},{"level":23,"move_id":103},{"level":31,"move_id":244},{"level":44,"move_id":154},{"level":58,"move_id":56}]},"tmhm_learnset":"03F01E80CC53726D","types":[11,11]},{"abilities":[72,0],"address":3298312,"base_stats":[40,80,35,70,35,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":57}],"friendship":70,"id":56,"learnset":{"address":3309574,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":33,"move_id":69},{"level":39,"move_id":238},{"level":45,"move_id":103},{"level":51,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD30EA1","types":[1,1]},{"abilities":[72,0],"address":3298340,"base_stats":[65,105,60,95,60,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":57,"learnset":{"address":3309600,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":67},{"level":1,"move_id":99},{"level":9,"move_id":67},{"level":15,"move_id":2},{"level":21,"move_id":154},{"level":27,"move_id":116},{"level":28,"move_id":99},{"level":36,"move_id":69},{"level":45,"move_id":238},{"level":54,"move_id":103},{"level":63,"move_id":37}]},"tmhm_learnset":"00A23EC0CFD34EA1","types":[1,1]},{"abilities":[22,18],"address":3298368,"base_stats":[55,70,45,60,70,50],"catch_rate":190,"evolutions":[{"method":"ITEM","param":95,"species":59}],"friendship":70,"id":58,"learnset":{"address":3309628,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":7,"move_id":52},{"level":13,"move_id":43},{"level":19,"move_id":316},{"level":25,"move_id":36},{"level":31,"move_id":172},{"level":37,"move_id":270},{"level":43,"move_id":97},{"level":49,"move_id":53}]},"tmhm_learnset":"00A23EA48C510630","types":[10,10]},{"abilities":[22,18],"address":3298396,"base_stats":[90,110,80,95,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":59,"learnset":{"address":3309654,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":46},{"level":1,"move_id":52},{"level":1,"move_id":316},{"level":49,"move_id":245}]},"tmhm_learnset":"00A23EA48C514630","types":[10,10]},{"abilities":[11,6],"address":3298424,"base_stats":[40,50,40,90,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":61}],"friendship":70,"id":60,"learnset":{"address":3309666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":25,"move_id":240},{"level":31,"move_id":34},{"level":37,"move_id":187},{"level":43,"move_id":56}]},"tmhm_learnset":"03103E009C133264","types":[11,11]},{"abilities":[11,6],"address":3298452,"base_stats":[65,65,65,90,50,50],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":62},{"method":"ITEM","param":187,"species":186}],"friendship":70,"id":61,"learnset":{"address":3309690,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":95},{"level":1,"move_id":55},{"level":7,"move_id":95},{"level":13,"move_id":55},{"level":19,"move_id":3},{"level":27,"move_id":240},{"level":35,"move_id":34},{"level":43,"move_id":187},{"level":51,"move_id":56}]},"tmhm_learnset":"03B03E00DE133265","types":[11,11]},{"abilities":[11,6],"address":3298480,"base_stats":[90,85,95,70,70,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":62,"learnset":{"address":3309714,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":66},{"level":35,"move_id":66},{"level":51,"move_id":170}]},"tmhm_learnset":"03B03E40DE1372E5","types":[11,1]},{"abilities":[28,39],"address":3298508,"base_stats":[25,20,15,90,105,55],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":16,"species":64}],"friendship":70,"id":63,"learnset":{"address":3309728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":100}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298536,"base_stats":[40,35,30,105,120,70],"catch_rate":100,"evolutions":[{"method":"LEVEL","param":37,"species":65}],"friendship":70,"id":64,"learnset":{"address":3309738,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":272},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45B8E29","types":[14,14]},{"abilities":[28,39],"address":3298564,"base_stats":[55,50,45,120,135,85],"catch_rate":50,"evolutions":[],"friendship":70,"id":65,"learnset":{"address":3309766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":100},{"level":1,"move_id":134},{"level":1,"move_id":93},{"level":16,"move_id":93},{"level":18,"move_id":50},{"level":21,"move_id":60},{"level":23,"move_id":115},{"level":25,"move_id":105},{"level":30,"move_id":248},{"level":33,"move_id":347},{"level":36,"move_id":94},{"level":43,"move_id":271}]},"tmhm_learnset":"0041BF03B45BCE29","types":[14,14]},{"abilities":[62,0],"address":3298592,"base_stats":[70,80,50,35,35,35],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":28,"species":67}],"friendship":70,"id":66,"learnset":{"address":3309794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":31,"move_id":233},{"level":37,"move_id":66},{"level":40,"move_id":238},{"level":43,"move_id":184},{"level":49,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298620,"base_stats":[80,100,70,45,50,60],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":68}],"friendship":70,"id":67,"learnset":{"address":3309824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1306A1","types":[1,1]},{"abilities":[62,0],"address":3298648,"base_stats":[90,130,80,55,65,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":68,"learnset":{"address":3309854,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":67},{"level":1,"move_id":43},{"level":1,"move_id":116},{"level":7,"move_id":116},{"level":13,"move_id":2},{"level":19,"move_id":69},{"level":22,"move_id":193},{"level":25,"move_id":279},{"level":33,"move_id":233},{"level":41,"move_id":66},{"level":46,"move_id":238},{"level":51,"move_id":184},{"level":59,"move_id":223}]},"tmhm_learnset":"00A03E64CE1346A1","types":[1,1]},{"abilities":[34,0],"address":3298676,"base_stats":[50,75,35,40,70,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":21,"species":70}],"friendship":70,"id":69,"learnset":{"address":3309884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":23,"move_id":51},{"level":30,"move_id":230},{"level":37,"move_id":75},{"level":45,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298704,"base_stats":[65,90,50,55,85,45],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":71}],"friendship":70,"id":70,"learnset":{"address":3309912,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":22},{"level":1,"move_id":74},{"level":1,"move_id":35},{"level":6,"move_id":74},{"level":11,"move_id":35},{"level":15,"move_id":79},{"level":17,"move_id":77},{"level":19,"move_id":78},{"level":24,"move_id":51},{"level":33,"move_id":230},{"level":42,"move_id":75},{"level":54,"move_id":21}]},"tmhm_learnset":"00443E0884350720","types":[12,3]},{"abilities":[34,0],"address":3298732,"base_stats":[80,105,65,70,100,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":71,"learnset":{"address":3309940,"moves":[{"level":1,"move_id":22},{"level":1,"move_id":79},{"level":1,"move_id":230},{"level":1,"move_id":75}]},"tmhm_learnset":"00443E0884354720","types":[12,3]},{"abilities":[29,64],"address":3298760,"base_stats":[40,40,35,70,50,100],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":73}],"friendship":70,"id":72,"learnset":{"address":3309950,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":36,"move_id":112},{"level":43,"move_id":103},{"level":49,"move_id":56}]},"tmhm_learnset":"03143E0884173264","types":[11,3]},{"abilities":[29,64],"address":3298788,"base_stats":[80,70,65,100,80,120],"catch_rate":60,"evolutions":[],"friendship":70,"id":73,"learnset":{"address":3309976,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":48},{"level":1,"move_id":132},{"level":6,"move_id":48},{"level":12,"move_id":132},{"level":19,"move_id":51},{"level":25,"move_id":61},{"level":30,"move_id":35},{"level":38,"move_id":112},{"level":47,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03143E0884177264","types":[11,3]},{"abilities":[69,5],"address":3298816,"base_stats":[40,80,100,20,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":25,"species":75}],"friendship":70,"id":74,"learnset":{"address":3310002,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":26,"move_id":205},{"level":31,"move_id":350},{"level":36,"move_id":89},{"level":41,"move_id":153},{"level":46,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298844,"base_stats":[55,95,115,35,45,45],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":37,"species":76}],"friendship":70,"id":75,"learnset":{"address":3310030,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE110621","types":[5,4]},{"abilities":[69,5],"address":3298872,"base_stats":[80,110,130,45,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":76,"learnset":{"address":3310058,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":300},{"level":1,"move_id":88},{"level":6,"move_id":300},{"level":11,"move_id":88},{"level":16,"move_id":222},{"level":21,"move_id":120},{"level":29,"move_id":205},{"level":37,"move_id":350},{"level":45,"move_id":89},{"level":53,"move_id":153},{"level":62,"move_id":38}]},"tmhm_learnset":"00A01E74CE114631","types":[5,4]},{"abilities":[50,18],"address":3298900,"base_stats":[50,85,55,90,65,65],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":40,"species":78}],"friendship":70,"id":77,"learnset":{"address":3310086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":45,"move_id":340},{"level":53,"move_id":126}]},"tmhm_learnset":"00221E2484710620","types":[10,10]},{"abilities":[50,18],"address":3298928,"base_stats":[65,100,70,105,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":78,"learnset":{"address":3310114,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":52},{"level":5,"move_id":45},{"level":9,"move_id":39},{"level":14,"move_id":52},{"level":19,"move_id":23},{"level":25,"move_id":83},{"level":31,"move_id":36},{"level":38,"move_id":97},{"level":40,"move_id":31},{"level":50,"move_id":340},{"level":63,"move_id":126}]},"tmhm_learnset":"00221E2484714620","types":[10,10]},{"abilities":[12,20],"address":3298956,"base_stats":[90,65,65,15,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":80},{"method":"ITEM","param":187,"species":199}],"friendship":70,"id":79,"learnset":{"address":3310144,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":133},{"level":48,"move_id":94}]},"tmhm_learnset":"02709E24BE5B366C","types":[11,14]},{"abilities":[12,20],"address":3298984,"base_stats":[95,75,110,30,100,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":80,"learnset":{"address":3310168,"moves":[{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":37,"move_id":110},{"level":46,"move_id":133},{"level":54,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[42,5],"address":3299012,"base_stats":[25,35,70,45,95,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":82}],"friendship":70,"id":81,"learnset":{"address":3310194,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":32,"move_id":199},{"level":38,"move_id":129},{"level":44,"move_id":103},{"level":50,"move_id":192}]},"tmhm_learnset":"00400E0385930620","types":[13,8]},{"abilities":[42,5],"address":3299040,"base_stats":[50,60,95,70,120,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":82,"learnset":{"address":3310222,"moves":[{"level":1,"move_id":319},{"level":1,"move_id":33},{"level":1,"move_id":84},{"level":1,"move_id":48},{"level":6,"move_id":84},{"level":11,"move_id":48},{"level":16,"move_id":49},{"level":21,"move_id":86},{"level":26,"move_id":209},{"level":35,"move_id":199},{"level":44,"move_id":161},{"level":53,"move_id":103},{"level":62,"move_id":192}]},"tmhm_learnset":"00400E0385934620","types":[13,8]},{"abilities":[51,39],"address":3299068,"base_stats":[52,65,55,60,58,62],"catch_rate":45,"evolutions":[],"friendship":70,"id":83,"learnset":{"address":3310250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":6,"move_id":28},{"level":11,"move_id":43},{"level":16,"move_id":31},{"level":21,"move_id":282},{"level":26,"move_id":210},{"level":31,"move_id":14},{"level":36,"move_id":97},{"level":41,"move_id":163},{"level":46,"move_id":206}]},"tmhm_learnset":"000C7E8084510620","types":[0,2]},{"abilities":[50,48],"address":3299096,"base_stats":[35,85,45,75,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":85}],"friendship":70,"id":84,"learnset":{"address":3310278,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":33,"move_id":253},{"level":37,"move_id":65},{"level":45,"move_id":97}]},"tmhm_learnset":"00087E8084110620","types":[0,2]},{"abilities":[50,48],"address":3299124,"base_stats":[60,110,70,100,60,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":85,"learnset":{"address":3310302,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":228},{"level":1,"move_id":31},{"level":9,"move_id":228},{"level":13,"move_id":31},{"level":21,"move_id":161},{"level":25,"move_id":99},{"level":38,"move_id":253},{"level":47,"move_id":65},{"level":60,"move_id":97}]},"tmhm_learnset":"00087F8084114E20","types":[0,2]},{"abilities":[47,0],"address":3299152,"base_stats":[65,45,55,45,45,70],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":34,"species":87}],"friendship":70,"id":86,"learnset":{"address":3310326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":29},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":37,"move_id":36},{"level":41,"move_id":58},{"level":49,"move_id":219}]},"tmhm_learnset":"03103E00841B3264","types":[11,11]},{"abilities":[47,0],"address":3299180,"base_stats":[90,70,80,70,70,95],"catch_rate":75,"evolutions":[],"friendship":70,"id":87,"learnset":{"address":3310350,"moves":[{"level":1,"move_id":29},{"level":1,"move_id":45},{"level":1,"move_id":196},{"level":1,"move_id":62},{"level":9,"move_id":45},{"level":17,"move_id":196},{"level":21,"move_id":62},{"level":29,"move_id":156},{"level":34,"move_id":329},{"level":42,"move_id":36},{"level":51,"move_id":58},{"level":64,"move_id":219}]},"tmhm_learnset":"03103E00841B7264","types":[11,15]},{"abilities":[1,60],"address":3299208,"base_stats":[80,80,50,25,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":89}],"friendship":70,"id":88,"learnset":{"address":3310376,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":43,"move_id":188},{"level":53,"move_id":262}]},"tmhm_learnset":"00003F6E8D970E20","types":[3,3]},{"abilities":[1,60],"address":3299236,"base_stats":[105,105,75,50,65,100],"catch_rate":75,"evolutions":[],"friendship":70,"id":89,"learnset":{"address":3310402,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":4,"move_id":106},{"level":8,"move_id":50},{"level":13,"move_id":124},{"level":19,"move_id":107},{"level":26,"move_id":103},{"level":34,"move_id":151},{"level":47,"move_id":188},{"level":61,"move_id":262}]},"tmhm_learnset":"00A03F6ECD974E21","types":[3,3]},{"abilities":[75,0],"address":3299264,"base_stats":[30,65,100,40,45,25],"catch_rate":190,"evolutions":[{"method":"ITEM","param":97,"species":91}],"friendship":70,"id":90,"learnset":{"address":3310428,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":110},{"level":9,"move_id":48},{"level":17,"move_id":62},{"level":25,"move_id":182},{"level":33,"move_id":43},{"level":41,"move_id":128},{"level":49,"move_id":58}]},"tmhm_learnset":"02101E0084133264","types":[11,11]},{"abilities":[75,0],"address":3299292,"base_stats":[50,95,180,70,85,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":91,"learnset":{"address":3310450,"moves":[{"level":1,"move_id":110},{"level":1,"move_id":48},{"level":1,"move_id":62},{"level":1,"move_id":182},{"level":33,"move_id":191},{"level":41,"move_id":131}]},"tmhm_learnset":"02101F0084137264","types":[11,15]},{"abilities":[26,0],"address":3299320,"base_stats":[30,35,30,80,100,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":93}],"friendship":70,"id":92,"learnset":{"address":3310464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":28,"move_id":109},{"level":33,"move_id":138},{"level":36,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299348,"base_stats":[45,50,45,95,115,55],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":37,"species":94}],"friendship":70,"id":93,"learnset":{"address":3310488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"0001BF08B4970E20","types":[7,3]},{"abilities":[26,0],"address":3299376,"base_stats":[60,65,60,110,130,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":94,"learnset":{"address":3310514,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":95},{"level":1,"move_id":122},{"level":1,"move_id":180},{"level":8,"move_id":180},{"level":13,"move_id":212},{"level":16,"move_id":174},{"level":21,"move_id":101},{"level":25,"move_id":325},{"level":31,"move_id":109},{"level":39,"move_id":138},{"level":48,"move_id":194}]},"tmhm_learnset":"00A1BF08F5974E21","types":[7,3]},{"abilities":[69,5],"address":3299404,"base_stats":[35,45,160,70,30,45],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":208}],"friendship":70,"id":95,"learnset":{"address":3310540,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":328},{"level":57,"move_id":38}]},"tmhm_learnset":"00A01F508E510E30","types":[5,4]},{"abilities":[15,0],"address":3299432,"base_stats":[60,48,45,42,43,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":26,"species":97}],"friendship":70,"id":96,"learnset":{"address":3310568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":31,"move_id":139},{"level":36,"move_id":96},{"level":40,"move_id":94},{"level":43,"move_id":244},{"level":45,"move_id":248}]},"tmhm_learnset":"0041BF01F41B8E29","types":[14,14]},{"abilities":[15,0],"address":3299460,"base_stats":[85,73,70,67,73,115],"catch_rate":75,"evolutions":[],"friendship":70,"id":97,"learnset":{"address":3310594,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":95},{"level":1,"move_id":50},{"level":1,"move_id":93},{"level":10,"move_id":50},{"level":18,"move_id":93},{"level":25,"move_id":29},{"level":33,"move_id":139},{"level":40,"move_id":96},{"level":49,"move_id":94},{"level":55,"move_id":244},{"level":60,"move_id":248}]},"tmhm_learnset":"0041BF01F41BCE29","types":[14,14]},{"abilities":[52,75],"address":3299488,"base_stats":[30,105,90,50,25,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":28,"species":99}],"friendship":70,"id":98,"learnset":{"address":3310620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":34,"move_id":12},{"level":41,"move_id":182},{"level":45,"move_id":152}]},"tmhm_learnset":"02B43E408C133264","types":[11,11]},{"abilities":[52,75],"address":3299516,"base_stats":[55,130,115,75,50,50],"catch_rate":60,"evolutions":[],"friendship":70,"id":99,"learnset":{"address":3310646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":43},{"level":1,"move_id":11},{"level":5,"move_id":43},{"level":12,"move_id":11},{"level":16,"move_id":106},{"level":23,"move_id":341},{"level":27,"move_id":23},{"level":38,"move_id":12},{"level":49,"move_id":182},{"level":57,"move_id":152}]},"tmhm_learnset":"02B43E408C137264","types":[11,11]},{"abilities":[43,9],"address":3299544,"base_stats":[40,30,50,100,55,55],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":101}],"friendship":70,"id":100,"learnset":{"address":3310672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":32,"move_id":205},{"level":37,"move_id":113},{"level":42,"move_id":129},{"level":46,"move_id":153},{"level":49,"move_id":243}]},"tmhm_learnset":"00402F0285938A20","types":[13,13]},{"abilities":[43,9],"address":3299572,"base_stats":[60,50,70,140,80,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":101,"learnset":{"address":3310700,"moves":[{"level":1,"move_id":268},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":1,"move_id":49},{"level":8,"move_id":103},{"level":15,"move_id":49},{"level":21,"move_id":209},{"level":27,"move_id":120},{"level":34,"move_id":205},{"level":41,"move_id":113},{"level":48,"move_id":129},{"level":54,"move_id":153},{"level":59,"move_id":243}]},"tmhm_learnset":"00402F028593CA20","types":[13,13]},{"abilities":[34,0],"address":3299600,"base_stats":[60,40,80,40,60,45],"catch_rate":90,"evolutions":[{"method":"ITEM","param":98,"species":103}],"friendship":70,"id":102,"learnset":{"address":3310728,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":253},{"level":1,"move_id":95},{"level":7,"move_id":115},{"level":13,"move_id":73},{"level":19,"move_id":93},{"level":25,"move_id":78},{"level":31,"move_id":77},{"level":37,"move_id":79},{"level":43,"move_id":76}]},"tmhm_learnset":"0060BE0994358720","types":[12,14]},{"abilities":[34,0],"address":3299628,"base_stats":[95,95,85,55,125,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":103,"learnset":{"address":3310752,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":140},{"level":1,"move_id":95},{"level":1,"move_id":93},{"level":19,"move_id":23},{"level":31,"move_id":121}]},"tmhm_learnset":"0060BE099435C720","types":[12,14]},{"abilities":[69,31],"address":3299656,"base_stats":[50,50,95,35,40,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":28,"species":105}],"friendship":70,"id":104,"learnset":{"address":3310766,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":125},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":29,"move_id":99},{"level":33,"move_id":206},{"level":37,"move_id":37},{"level":41,"move_id":198},{"level":45,"move_id":38}]},"tmhm_learnset":"00A03EF4CE513621","types":[4,4]},{"abilities":[69,31],"address":3299684,"base_stats":[60,80,110,45,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":105,"learnset":{"address":3310798,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":125},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":125},{"level":13,"move_id":29},{"level":17,"move_id":43},{"level":21,"move_id":116},{"level":25,"move_id":155},{"level":32,"move_id":99},{"level":39,"move_id":206},{"level":46,"move_id":37},{"level":53,"move_id":198},{"level":61,"move_id":38}]},"tmhm_learnset":"00A03EF4CE517621","types":[4,4]},{"abilities":[7,0],"address":3299712,"base_stats":[50,120,53,87,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":106,"learnset":{"address":3310830,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":24},{"level":6,"move_id":96},{"level":11,"move_id":27},{"level":16,"move_id":26},{"level":20,"move_id":280},{"level":21,"move_id":116},{"level":26,"move_id":136},{"level":31,"move_id":170},{"level":36,"move_id":193},{"level":41,"move_id":203},{"level":46,"move_id":25},{"level":51,"move_id":179}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[51,0],"address":3299740,"base_stats":[50,105,79,76,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":107,"learnset":{"address":3310862,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":4},{"level":7,"move_id":97},{"level":13,"move_id":228},{"level":20,"move_id":183},{"level":26,"move_id":9},{"level":26,"move_id":8},{"level":26,"move_id":7},{"level":32,"move_id":327},{"level":38,"move_id":5},{"level":44,"move_id":197},{"level":50,"move_id":68}]},"tmhm_learnset":"00A03E40C61306A1","types":[1,1]},{"abilities":[20,12],"address":3299768,"base_stats":[90,55,75,30,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":108,"learnset":{"address":3310892,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":122},{"level":7,"move_id":48},{"level":12,"move_id":111},{"level":18,"move_id":282},{"level":23,"move_id":23},{"level":29,"move_id":35},{"level":34,"move_id":50},{"level":40,"move_id":21},{"level":45,"move_id":103},{"level":51,"move_id":287}]},"tmhm_learnset":"00B43E76EFF37625","types":[0,0]},{"abilities":[26,0],"address":3299796,"base_stats":[40,65,95,35,60,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":35,"species":110}],"friendship":70,"id":109,"learnset":{"address":3310920,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":41,"move_id":153},{"level":45,"move_id":194},{"level":49,"move_id":262}]},"tmhm_learnset":"00403F2EA5930E20","types":[3,3]},{"abilities":[26,0],"address":3299824,"base_stats":[65,90,120,60,85,70],"catch_rate":60,"evolutions":[],"friendship":70,"id":110,"learnset":{"address":3310946,"moves":[{"level":1,"move_id":139},{"level":1,"move_id":33},{"level":1,"move_id":123},{"level":1,"move_id":120},{"level":9,"move_id":123},{"level":17,"move_id":120},{"level":21,"move_id":124},{"level":25,"move_id":108},{"level":33,"move_id":114},{"level":44,"move_id":153},{"level":51,"move_id":194},{"level":58,"move_id":262}]},"tmhm_learnset":"00403F2EA5934E20","types":[3,3]},{"abilities":[31,69],"address":3299852,"base_stats":[80,85,95,25,30,30],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":42,"species":112}],"friendship":70,"id":111,"learnset":{"address":3310972,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":43,"move_id":36},{"level":52,"move_id":89},{"level":57,"move_id":224}]},"tmhm_learnset":"00A03E768FD33630","types":[4,5]},{"abilities":[31,69],"address":3299880,"base_stats":[105,130,120,40,45,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":112,"learnset":{"address":3310998,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":39},{"level":1,"move_id":23},{"level":1,"move_id":31},{"level":10,"move_id":23},{"level":15,"move_id":31},{"level":24,"move_id":184},{"level":29,"move_id":350},{"level":38,"move_id":32},{"level":46,"move_id":36},{"level":58,"move_id":89},{"level":66,"move_id":224}]},"tmhm_learnset":"00B43E76CFD37631","types":[4,5]},{"abilities":[30,32],"address":3299908,"base_stats":[250,5,5,50,35,105],"catch_rate":30,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":242}],"friendship":140,"id":113,"learnset":{"address":3311024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":287},{"level":13,"move_id":135},{"level":17,"move_id":3},{"level":23,"move_id":107},{"level":29,"move_id":47},{"level":35,"move_id":121},{"level":41,"move_id":111},{"level":49,"move_id":113},{"level":57,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[34,0],"address":3299936,"base_stats":[65,55,115,60,100,40],"catch_rate":45,"evolutions":[],"friendship":70,"id":114,"learnset":{"address":3311054,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":275},{"level":1,"move_id":132},{"level":4,"move_id":79},{"level":10,"move_id":71},{"level":13,"move_id":74},{"level":19,"move_id":77},{"level":22,"move_id":22},{"level":28,"move_id":20},{"level":31,"move_id":72},{"level":37,"move_id":78},{"level":40,"move_id":21},{"level":46,"move_id":321}]},"tmhm_learnset":"00C43E0884354720","types":[12,12]},{"abilities":[48,0],"address":3299964,"base_stats":[105,95,80,90,40,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":115,"learnset":{"address":3311084,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":4},{"level":1,"move_id":43},{"level":7,"move_id":44},{"level":13,"move_id":39},{"level":19,"move_id":252},{"level":25,"move_id":5},{"level":31,"move_id":99},{"level":37,"move_id":203},{"level":43,"move_id":146},{"level":49,"move_id":179}]},"tmhm_learnset":"00B43EF6EFF37675","types":[0,0]},{"abilities":[33,0],"address":3299992,"base_stats":[30,40,70,60,70,25],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":32,"species":117}],"friendship":70,"id":116,"learnset":{"address":3311110,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":36,"move_id":97},{"level":43,"move_id":56},{"level":50,"move_id":349}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[38,0],"address":3300020,"base_stats":[55,65,95,85,95,45],"catch_rate":75,"evolutions":[{"method":"ITEM","param":201,"species":230}],"friendship":70,"id":117,"learnset":{"address":3311134,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[33,41],"address":3300048,"base_stats":[45,67,60,63,35,50],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":119}],"friendship":70,"id":118,"learnset":{"address":3311158,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":38,"move_id":127},{"level":43,"move_id":32},{"level":52,"move_id":97}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,41],"address":3300076,"base_stats":[80,92,65,68,65,80],"catch_rate":60,"evolutions":[],"friendship":70,"id":119,"learnset":{"address":3311182,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":39},{"level":1,"move_id":346},{"level":1,"move_id":48},{"level":10,"move_id":48},{"level":15,"move_id":30},{"level":24,"move_id":175},{"level":29,"move_id":31},{"level":41,"move_id":127},{"level":49,"move_id":32},{"level":61,"move_id":97}]},"tmhm_learnset":"03101E0084137264","types":[11,11]},{"abilities":[35,30],"address":3300104,"base_stats":[30,45,55,85,70,55],"catch_rate":225,"evolutions":[{"method":"ITEM","param":97,"species":121}],"friendship":70,"id":120,"learnset":{"address":3311206,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":6,"move_id":55},{"level":10,"move_id":229},{"level":15,"move_id":105},{"level":19,"move_id":293},{"level":24,"move_id":129},{"level":28,"move_id":61},{"level":33,"move_id":107},{"level":37,"move_id":113},{"level":42,"move_id":322},{"level":46,"move_id":56}]},"tmhm_learnset":"03500E019593B264","types":[11,11]},{"abilities":[35,30],"address":3300132,"base_stats":[60,75,85,115,100,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":121,"learnset":{"address":3311236,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":229},{"level":1,"move_id":105},{"level":1,"move_id":129},{"level":33,"move_id":109}]},"tmhm_learnset":"03508E019593F264","types":[11,14]},{"abilities":[43,0],"address":3300160,"base_stats":[40,45,65,90,100,120],"catch_rate":45,"evolutions":[],"friendship":70,"id":122,"learnset":{"address":3311248,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":112},{"level":5,"move_id":93},{"level":9,"move_id":164},{"level":13,"move_id":96},{"level":17,"move_id":3},{"level":21,"move_id":113},{"level":21,"move_id":115},{"level":25,"move_id":227},{"level":29,"move_id":60},{"level":33,"move_id":278},{"level":37,"move_id":271},{"level":41,"move_id":272},{"level":45,"move_id":94},{"level":49,"move_id":226},{"level":53,"move_id":219}]},"tmhm_learnset":"0041BF03F5BBCE29","types":[14,14]},{"abilities":[68,0],"address":3300188,"base_stats":[70,110,80,105,55,80],"catch_rate":45,"evolutions":[{"method":"ITEM","param":199,"species":212}],"friendship":70,"id":123,"learnset":{"address":3311286,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":17},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00847E8084134620","types":[6,2]},{"abilities":[12,0],"address":3300216,"base_stats":[65,50,35,95,115,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":124,"learnset":{"address":3311314,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":1,"move_id":142},{"level":1,"move_id":181},{"level":9,"move_id":142},{"level":13,"move_id":181},{"level":21,"move_id":3},{"level":25,"move_id":8},{"level":35,"move_id":212},{"level":41,"move_id":313},{"level":51,"move_id":34},{"level":57,"move_id":195},{"level":67,"move_id":59}]},"tmhm_learnset":"0040BF01F413FA6D","types":[15,14]},{"abilities":[9,0],"address":3300244,"base_stats":[65,83,57,105,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":125,"learnset":{"address":3311342,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":1,"move_id":9},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":36,"move_id":103},{"level":47,"move_id":85},{"level":58,"move_id":87}]},"tmhm_learnset":"00E03E02D5D3C221","types":[13,13]},{"abilities":[49,0],"address":3300272,"base_stats":[65,95,57,93,100,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":126,"learnset":{"address":3311364,"moves":[{"level":1,"move_id":52},{"level":1,"move_id":43},{"level":1,"move_id":123},{"level":1,"move_id":7},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":33,"move_id":241},{"level":41,"move_id":53},{"level":49,"move_id":109},{"level":57,"move_id":126}]},"tmhm_learnset":"00A03E24D4514621","types":[10,10]},{"abilities":[52,0],"address":3300300,"base_stats":[65,125,100,85,55,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":127,"learnset":{"address":3311390,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":11},{"level":1,"move_id":116},{"level":7,"move_id":20},{"level":13,"move_id":69},{"level":19,"move_id":106},{"level":25,"move_id":279},{"level":31,"move_id":280},{"level":37,"move_id":12},{"level":43,"move_id":66},{"level":49,"move_id":14}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,6]},{"abilities":[22,0],"address":3300328,"base_stats":[75,100,95,110,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":128,"learnset":{"address":3311416,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":39},{"level":8,"move_id":99},{"level":13,"move_id":30},{"level":19,"move_id":184},{"level":26,"move_id":228},{"level":34,"move_id":156},{"level":43,"move_id":37},{"level":53,"move_id":36}]},"tmhm_learnset":"00B01E7687F37624","types":[0,0]},{"abilities":[33,0],"address":3300356,"base_stats":[20,10,55,80,15,20],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":130}],"friendship":70,"id":129,"learnset":{"address":3311442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"0000000000000000","types":[11,11]},{"abilities":[22,0],"address":3300384,"base_stats":[95,125,79,81,60,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":130,"learnset":{"address":3311456,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":37},{"level":20,"move_id":44},{"level":25,"move_id":82},{"level":30,"move_id":43},{"level":35,"move_id":239},{"level":40,"move_id":56},{"level":45,"move_id":240},{"level":50,"move_id":349},{"level":55,"move_id":63}]},"tmhm_learnset":"03B01F3487937A74","types":[11,2]},{"abilities":[11,75],"address":3300412,"base_stats":[130,85,80,60,85,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":131,"learnset":{"address":3311482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":45},{"level":1,"move_id":47},{"level":7,"move_id":54},{"level":13,"move_id":34},{"level":19,"move_id":109},{"level":25,"move_id":195},{"level":31,"move_id":58},{"level":37,"move_id":240},{"level":43,"move_id":219},{"level":49,"move_id":56},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E0295DB7274","types":[11,15]},{"abilities":[7,0],"address":3300440,"base_stats":[48,48,48,48,48,48],"catch_rate":35,"evolutions":[],"friendship":70,"id":132,"learnset":{"address":3311510,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":144}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[50,0],"address":3300468,"base_stats":[55,55,50,55,45,65],"catch_rate":45,"evolutions":[{"method":"ITEM","param":96,"species":135},{"method":"ITEM","param":97,"species":134},{"method":"ITEM","param":95,"species":136},{"method":"FRIENDSHIP_DAY","param":0,"species":196},{"method":"FRIENDSHIP_NIGHT","param":0,"species":197}],"friendship":70,"id":133,"learnset":{"address":3311520,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":45},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":226},{"level":42,"move_id":36}]},"tmhm_learnset":"00001E00AC530620","types":[0,0]},{"abilities":[11,0],"address":3300496,"base_stats":[130,65,60,65,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":134,"learnset":{"address":3311542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":55},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":62},{"level":42,"move_id":114},{"level":47,"move_id":151},{"level":52,"move_id":56}]},"tmhm_learnset":"03101E00AC537674","types":[11,11]},{"abilities":[10,0],"address":3300524,"base_stats":[65,65,60,130,110,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":135,"learnset":{"address":3311568,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":84},{"level":23,"move_id":98},{"level":30,"move_id":24},{"level":36,"move_id":42},{"level":42,"move_id":86},{"level":47,"move_id":97},{"level":52,"move_id":87}]},"tmhm_learnset":"00401E02ADD34630","types":[13,13]},{"abilities":[18,0],"address":3300552,"base_stats":[65,130,60,65,95,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":136,"learnset":{"address":3311594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":52},{"level":23,"move_id":98},{"level":30,"move_id":44},{"level":36,"move_id":83},{"level":42,"move_id":123},{"level":47,"move_id":43},{"level":52,"move_id":53}]},"tmhm_learnset":"00021E24AC534630","types":[10,10]},{"abilities":[36,0],"address":3300580,"base_stats":[65,60,70,40,85,75],"catch_rate":45,"evolutions":[{"method":"ITEM","param":218,"species":233}],"friendship":70,"id":137,"learnset":{"address":3311620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":159},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[33,75],"address":3300608,"base_stats":[35,40,100,35,90,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":139}],"friendship":70,"id":138,"learnset":{"address":3311646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":43,"move_id":321},{"level":49,"move_id":246},{"level":55,"move_id":56}]},"tmhm_learnset":"03903E5084133264","types":[5,11]},{"abilities":[33,75],"address":3300636,"base_stats":[70,60,125,55,115,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":139,"learnset":{"address":3311672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":1,"move_id":44},{"level":13,"move_id":44},{"level":19,"move_id":55},{"level":25,"move_id":341},{"level":31,"move_id":43},{"level":37,"move_id":182},{"level":40,"move_id":131},{"level":46,"move_id":321},{"level":55,"move_id":246},{"level":65,"move_id":56}]},"tmhm_learnset":"03903E5084137264","types":[5,11]},{"abilities":[33,4],"address":3300664,"base_stats":[30,80,90,55,55,45],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":141}],"friendship":70,"id":140,"learnset":{"address":3311700,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":43,"move_id":319},{"level":49,"move_id":72},{"level":55,"move_id":246}]},"tmhm_learnset":"01903ED08C173264","types":[5,11]},{"abilities":[33,4],"address":3300692,"base_stats":[60,115,105,80,65,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":141,"learnset":{"address":3311726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":71},{"level":13,"move_id":71},{"level":19,"move_id":43},{"level":25,"move_id":341},{"level":31,"move_id":28},{"level":37,"move_id":203},{"level":40,"move_id":163},{"level":46,"move_id":319},{"level":55,"move_id":72},{"level":65,"move_id":246}]},"tmhm_learnset":"03943ED0CC177264","types":[5,11]},{"abilities":[69,46],"address":3300720,"base_stats":[80,105,65,130,60,75],"catch_rate":45,"evolutions":[],"friendship":70,"id":142,"learnset":{"address":3311754,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":8,"move_id":97},{"level":15,"move_id":44},{"level":22,"move_id":48},{"level":29,"move_id":246},{"level":36,"move_id":184},{"level":43,"move_id":36},{"level":50,"move_id":63}]},"tmhm_learnset":"00A87FF486534E32","types":[5,2]},{"abilities":[17,47],"address":3300748,"base_stats":[160,110,65,30,65,110],"catch_rate":25,"evolutions":[],"friendship":70,"id":143,"learnset":{"address":3311778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":133},{"level":10,"move_id":111},{"level":15,"move_id":187},{"level":19,"move_id":29},{"level":24,"move_id":281},{"level":28,"move_id":156},{"level":28,"move_id":173},{"level":33,"move_id":34},{"level":37,"move_id":335},{"level":42,"move_id":343},{"level":46,"move_id":205},{"level":51,"move_id":63}]},"tmhm_learnset":"00301E76F7B37625","types":[0,0]},{"abilities":[46,0],"address":3300776,"base_stats":[90,85,100,85,95,125],"catch_rate":3,"evolutions":[],"friendship":35,"id":144,"learnset":{"address":3311812,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":181},{"level":13,"move_id":54},{"level":25,"move_id":97},{"level":37,"move_id":170},{"level":49,"move_id":58},{"level":61,"move_id":115},{"level":73,"move_id":59},{"level":85,"move_id":329}]},"tmhm_learnset":"00884E9184137674","types":[15,2]},{"abilities":[46,0],"address":3300804,"base_stats":[90,90,85,100,125,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":145,"learnset":{"address":3311836,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":84},{"level":13,"move_id":86},{"level":25,"move_id":97},{"level":37,"move_id":197},{"level":49,"move_id":65},{"level":61,"move_id":268},{"level":73,"move_id":113},{"level":85,"move_id":87}]},"tmhm_learnset":"00C84E928593C630","types":[13,2]},{"abilities":[46,0],"address":3300832,"base_stats":[90,100,90,90,125,85],"catch_rate":3,"evolutions":[],"friendship":35,"id":146,"learnset":{"address":3311860,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":17},{"level":1,"move_id":52},{"level":13,"move_id":83},{"level":25,"move_id":97},{"level":37,"move_id":203},{"level":49,"move_id":53},{"level":61,"move_id":219},{"level":73,"move_id":257},{"level":85,"move_id":143}]},"tmhm_learnset":"008A4EB4841B4630","types":[10,2]},{"abilities":[61,0],"address":3300860,"base_stats":[41,64,45,50,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":148}],"friendship":35,"id":147,"learnset":{"address":3311884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":36,"move_id":97},{"level":43,"move_id":219},{"level":50,"move_id":200},{"level":57,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[61,0],"address":3300888,"base_stats":[61,84,65,70,70,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":149}],"friendship":35,"id":148,"learnset":{"address":3311910,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":56,"move_id":200},{"level":65,"move_id":63}]},"tmhm_learnset":"01101E2685DB7664","types":[16,16]},{"abilities":[39,0],"address":3300916,"base_stats":[91,134,95,80,100,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":149,"learnset":{"address":3311936,"moves":[{"level":1,"move_id":35},{"level":1,"move_id":43},{"level":1,"move_id":86},{"level":1,"move_id":239},{"level":8,"move_id":86},{"level":15,"move_id":239},{"level":22,"move_id":82},{"level":29,"move_id":21},{"level":38,"move_id":97},{"level":47,"move_id":219},{"level":55,"move_id":17},{"level":61,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BC5EF6C7DB7677","types":[16,2]},{"abilities":[46,0],"address":3300944,"base_stats":[106,110,90,130,154,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":150,"learnset":{"address":3311964,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":50},{"level":11,"move_id":112},{"level":22,"move_id":129},{"level":33,"move_id":244},{"level":44,"move_id":248},{"level":55,"move_id":54},{"level":66,"move_id":94},{"level":77,"move_id":133},{"level":88,"move_id":105},{"level":99,"move_id":219}]},"tmhm_learnset":"00E18FF7F7FBFEED","types":[14,14]},{"abilities":[28,0],"address":3300972,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":151,"learnset":{"address":3311992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":10,"move_id":144},{"level":20,"move_id":5},{"level":30,"move_id":118},{"level":40,"move_id":94},{"level":50,"move_id":246}]},"tmhm_learnset":"03FFFFFFFFFFFFFF","types":[14,14]},{"abilities":[65,0],"address":3301000,"base_stats":[45,49,65,45,49,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":153}],"friendship":70,"id":152,"learnset":{"address":3312012,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":22,"move_id":235},{"level":29,"move_id":34},{"level":36,"move_id":113},{"level":43,"move_id":219},{"level":50,"move_id":76}]},"tmhm_learnset":"00441E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301028,"base_stats":[60,62,80,60,63,80],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":32,"species":154}],"friendship":70,"id":153,"learnset":{"address":3312038,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":39,"move_id":113},{"level":47,"move_id":219},{"level":55,"move_id":76}]},"tmhm_learnset":"00E41E01847D8720","types":[12,12]},{"abilities":[65,0],"address":3301056,"base_stats":[80,82,100,80,83,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":154,"learnset":{"address":3312064,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":75},{"level":1,"move_id":115},{"level":8,"move_id":75},{"level":12,"move_id":115},{"level":15,"move_id":77},{"level":23,"move_id":235},{"level":31,"move_id":34},{"level":41,"move_id":113},{"level":51,"move_id":219},{"level":61,"move_id":76}]},"tmhm_learnset":"00E41E01867DC720","types":[12,12]},{"abilities":[66,0],"address":3301084,"base_stats":[39,52,43,65,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":14,"species":156}],"friendship":70,"id":155,"learnset":{"address":3312090,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":19,"move_id":98},{"level":27,"move_id":172},{"level":36,"move_id":129},{"level":46,"move_id":53}]},"tmhm_learnset":"00061EA48C110620","types":[10,10]},{"abilities":[66,0],"address":3301112,"base_stats":[58,64,58,80,80,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":157}],"friendship":70,"id":156,"learnset":{"address":3312112,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":42,"move_id":129},{"level":54,"move_id":53}]},"tmhm_learnset":"00A61EA4CC110631","types":[10,10]},{"abilities":[66,0],"address":3301140,"base_stats":[78,84,78,100,109,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":157,"learnset":{"address":3312134,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":1,"move_id":108},{"level":1,"move_id":52},{"level":6,"move_id":108},{"level":12,"move_id":52},{"level":21,"move_id":98},{"level":31,"move_id":172},{"level":45,"move_id":129},{"level":60,"move_id":53}]},"tmhm_learnset":"00A61EA4CE114631","types":[10,10]},{"abilities":[67,0],"address":3301168,"base_stats":[50,65,64,43,44,48],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":18,"species":159}],"friendship":70,"id":158,"learnset":{"address":3312156,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":20,"move_id":44},{"level":27,"move_id":184},{"level":35,"move_id":163},{"level":43,"move_id":103},{"level":52,"move_id":56}]},"tmhm_learnset":"03141E80CC533265","types":[11,11]},{"abilities":[67,0],"address":3301196,"base_stats":[65,80,80,58,59,63],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":160}],"friendship":70,"id":159,"learnset":{"address":3312180,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":37,"move_id":163},{"level":45,"move_id":103},{"level":55,"move_id":56}]},"tmhm_learnset":"03B41E80CC533275","types":[11,11]},{"abilities":[67,0],"address":3301224,"base_stats":[85,105,100,78,79,83],"catch_rate":45,"evolutions":[],"friendship":70,"id":160,"learnset":{"address":3312204,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":99},{"level":1,"move_id":55},{"level":7,"move_id":99},{"level":13,"move_id":55},{"level":21,"move_id":44},{"level":28,"move_id":184},{"level":38,"move_id":163},{"level":47,"move_id":103},{"level":58,"move_id":56}]},"tmhm_learnset":"03B41E80CE537277","types":[11,11]},{"abilities":[50,51],"address":3301252,"base_stats":[35,46,34,20,35,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":15,"species":162}],"friendship":70,"id":161,"learnset":{"address":3312228,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":17,"move_id":270},{"level":24,"move_id":21},{"level":31,"move_id":266},{"level":40,"move_id":156},{"level":49,"move_id":133}]},"tmhm_learnset":"00143E06ECF31625","types":[0,0]},{"abilities":[50,51],"address":3301280,"base_stats":[85,76,64,90,45,55],"catch_rate":90,"evolutions":[],"friendship":70,"id":162,"learnset":{"address":3312254,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":111},{"level":1,"move_id":98},{"level":4,"move_id":111},{"level":7,"move_id":98},{"level":12,"move_id":154},{"level":19,"move_id":270},{"level":28,"move_id":21},{"level":37,"move_id":266},{"level":48,"move_id":156},{"level":59,"move_id":133}]},"tmhm_learnset":"00B43E06EDF37625","types":[0,0]},{"abilities":[15,51],"address":3301308,"base_stats":[60,30,30,50,36,56],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":164}],"friendship":70,"id":163,"learnset":{"address":3312280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":22,"move_id":115},{"level":28,"move_id":36},{"level":34,"move_id":93},{"level":48,"move_id":138}]},"tmhm_learnset":"00487E81B4130620","types":[0,2]},{"abilities":[15,51],"address":3301336,"base_stats":[100,50,50,70,76,96],"catch_rate":90,"evolutions":[],"friendship":70,"id":164,"learnset":{"address":3312304,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":193},{"level":1,"move_id":64},{"level":6,"move_id":193},{"level":11,"move_id":64},{"level":16,"move_id":95},{"level":25,"move_id":115},{"level":33,"move_id":36},{"level":41,"move_id":93},{"level":57,"move_id":138}]},"tmhm_learnset":"00487E81B4134620","types":[0,2]},{"abilities":[68,48],"address":3301364,"base_stats":[40,20,30,55,40,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":166}],"friendship":70,"id":165,"learnset":{"address":3312328,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":22,"move_id":113},{"level":22,"move_id":115},{"level":22,"move_id":219},{"level":29,"move_id":226},{"level":36,"move_id":129},{"level":43,"move_id":97},{"level":50,"move_id":38}]},"tmhm_learnset":"00403E81CC3D8621","types":[6,2]},{"abilities":[68,48],"address":3301392,"base_stats":[55,35,50,85,55,110],"catch_rate":90,"evolutions":[],"friendship":70,"id":166,"learnset":{"address":3312356,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":48},{"level":8,"move_id":48},{"level":15,"move_id":4},{"level":24,"move_id":113},{"level":24,"move_id":115},{"level":24,"move_id":219},{"level":33,"move_id":226},{"level":42,"move_id":129},{"level":51,"move_id":97},{"level":60,"move_id":38}]},"tmhm_learnset":"00403E81CC3DC621","types":[6,2]},{"abilities":[68,15],"address":3301420,"base_stats":[40,60,40,30,40,40],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":22,"species":168}],"friendship":70,"id":167,"learnset":{"address":3312384,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":23,"move_id":141},{"level":30,"move_id":154},{"level":37,"move_id":169},{"level":45,"move_id":97},{"level":53,"move_id":94}]},"tmhm_learnset":"00403E089C350620","types":[6,3]},{"abilities":[68,15],"address":3301448,"base_stats":[70,90,70,40,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":168,"learnset":{"address":3312410,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":81},{"level":1,"move_id":184},{"level":1,"move_id":132},{"level":6,"move_id":184},{"level":11,"move_id":132},{"level":17,"move_id":101},{"level":25,"move_id":141},{"level":34,"move_id":154},{"level":43,"move_id":169},{"level":53,"move_id":97},{"level":63,"move_id":94}]},"tmhm_learnset":"00403E089C354620","types":[6,3]},{"abilities":[39,0],"address":3301476,"base_stats":[85,90,80,130,70,80],"catch_rate":90,"evolutions":[],"friendship":70,"id":169,"learnset":{"address":3312436,"moves":[{"level":1,"move_id":103},{"level":1,"move_id":141},{"level":1,"move_id":48},{"level":1,"move_id":310},{"level":6,"move_id":48},{"level":11,"move_id":310},{"level":16,"move_id":44},{"level":21,"move_id":17},{"level":28,"move_id":109},{"level":35,"move_id":314},{"level":42,"move_id":212},{"level":49,"move_id":305},{"level":56,"move_id":114}]},"tmhm_learnset":"00097F88A4174E20","types":[3,2]},{"abilities":[10,35],"address":3301504,"base_stats":[75,38,38,67,56,56],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":27,"species":171}],"friendship":70,"id":170,"learnset":{"address":3312464,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":29,"move_id":109},{"level":37,"move_id":36},{"level":41,"move_id":56},{"level":49,"move_id":268}]},"tmhm_learnset":"03501E0285933264","types":[11,13]},{"abilities":[10,35],"address":3301532,"base_stats":[125,58,58,67,76,76],"catch_rate":75,"evolutions":[],"friendship":70,"id":171,"learnset":{"address":3312490,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":86},{"level":1,"move_id":48},{"level":5,"move_id":48},{"level":13,"move_id":175},{"level":17,"move_id":55},{"level":25,"move_id":209},{"level":32,"move_id":109},{"level":43,"move_id":36},{"level":50,"move_id":56},{"level":61,"move_id":268}]},"tmhm_learnset":"03501E0285937264","types":[11,13]},{"abilities":[9,0],"address":3301560,"base_stats":[20,40,15,60,35,35],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":25}],"friendship":70,"id":172,"learnset":{"address":3312516,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":84},{"level":1,"move_id":204},{"level":6,"move_id":39},{"level":8,"move_id":86},{"level":11,"move_id":186}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[56,0],"address":3301588,"base_stats":[50,25,28,15,45,55],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":35}],"friendship":140,"id":173,"learnset":{"address":3312532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":204},{"level":4,"move_id":227},{"level":8,"move_id":47},{"level":13,"move_id":186}]},"tmhm_learnset":"00401E27BC7B8624","types":[0,0]},{"abilities":[56,0],"address":3301616,"base_stats":[90,30,15,15,40,20],"catch_rate":170,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":39}],"friendship":70,"id":174,"learnset":{"address":3312548,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":47},{"level":1,"move_id":204},{"level":4,"move_id":111},{"level":9,"move_id":1},{"level":14,"move_id":186}]},"tmhm_learnset":"00401E27BC3B8624","types":[0,0]},{"abilities":[55,32],"address":3301644,"base_stats":[35,20,65,20,40,65],"catch_rate":190,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":176}],"friendship":70,"id":175,"learnset":{"address":3312564,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C01E27B43B8624","types":[0,0]},{"abilities":[55,32],"address":3301672,"base_stats":[55,40,85,40,80,105],"catch_rate":75,"evolutions":[],"friendship":70,"id":176,"learnset":{"address":3312590,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":118},{"level":1,"move_id":45},{"level":1,"move_id":204},{"level":6,"move_id":118},{"level":11,"move_id":186},{"level":16,"move_id":281},{"level":21,"move_id":227},{"level":26,"move_id":266},{"level":31,"move_id":273},{"level":36,"move_id":219},{"level":41,"move_id":38}]},"tmhm_learnset":"00C85EA7F43BC625","types":[0,2]},{"abilities":[28,48],"address":3301700,"base_stats":[40,50,45,70,70,45],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":178}],"friendship":70,"id":177,"learnset":{"address":3312616,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":30,"move_id":273},{"level":30,"move_id":248},{"level":40,"move_id":109},{"level":50,"move_id":94}]},"tmhm_learnset":"0040FE81B4378628","types":[14,2]},{"abilities":[28,48],"address":3301728,"base_stats":[65,75,70,95,95,70],"catch_rate":75,"evolutions":[],"friendship":70,"id":178,"learnset":{"address":3312638,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":43},{"level":10,"move_id":101},{"level":20,"move_id":100},{"level":35,"move_id":273},{"level":35,"move_id":248},{"level":50,"move_id":109},{"level":65,"move_id":94}]},"tmhm_learnset":"0048FE81B437C628","types":[14,2]},{"abilities":[9,0],"address":3301756,"base_stats":[55,40,40,35,65,45],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":15,"species":180}],"friendship":70,"id":179,"learnset":{"address":3312660,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":84},{"level":16,"move_id":86},{"level":23,"move_id":178},{"level":30,"move_id":113},{"level":37,"move_id":87}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[9,0],"address":3301784,"base_stats":[70,55,55,45,80,60],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":181}],"friendship":70,"id":180,"learnset":{"address":3312680,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":36,"move_id":113},{"level":45,"move_id":87}]},"tmhm_learnset":"00E01E02C5D38221","types":[13,13]},{"abilities":[9,0],"address":3301812,"base_stats":[90,75,75,55,115,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":181,"learnset":{"address":3312700,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":84},{"level":1,"move_id":86},{"level":9,"move_id":84},{"level":18,"move_id":86},{"level":27,"move_id":178},{"level":30,"move_id":9},{"level":42,"move_id":113},{"level":57,"move_id":87}]},"tmhm_learnset":"00E01E02C5D3C221","types":[13,13]},{"abilities":[34,0],"address":3301840,"base_stats":[75,80,85,50,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":182,"learnset":{"address":3312722,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":230},{"level":1,"move_id":78},{"level":1,"move_id":345},{"level":44,"move_id":80},{"level":55,"move_id":76}]},"tmhm_learnset":"00441E08843D4720","types":[12,12]},{"abilities":[47,37],"address":3301868,"base_stats":[70,20,50,40,20,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":18,"species":184}],"friendship":70,"id":183,"learnset":{"address":3312736,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":21,"move_id":61},{"level":28,"move_id":38},{"level":36,"move_id":240},{"level":45,"move_id":56}]},"tmhm_learnset":"03B01E00CC533265","types":[11,11]},{"abilities":[47,37],"address":3301896,"base_stats":[100,50,80,50,50,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":184,"learnset":{"address":3312762,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":111},{"level":1,"move_id":39},{"level":1,"move_id":55},{"level":3,"move_id":111},{"level":6,"move_id":39},{"level":10,"move_id":55},{"level":15,"move_id":205},{"level":24,"move_id":61},{"level":34,"move_id":38},{"level":45,"move_id":240},{"level":57,"move_id":56}]},"tmhm_learnset":"03B01E00CC537265","types":[11,11]},{"abilities":[5,69],"address":3301924,"base_stats":[70,100,115,30,30,65],"catch_rate":65,"evolutions":[],"friendship":70,"id":185,"learnset":{"address":3312788,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":102},{"level":9,"move_id":175},{"level":17,"move_id":67},{"level":25,"move_id":157},{"level":33,"move_id":335},{"level":41,"move_id":185},{"level":49,"move_id":21},{"level":57,"move_id":38}]},"tmhm_learnset":"00A03E50CE110E29","types":[5,5]},{"abilities":[11,6],"address":3301952,"base_stats":[90,75,75,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":186,"learnset":{"address":3312812,"moves":[{"level":1,"move_id":55},{"level":1,"move_id":95},{"level":1,"move_id":3},{"level":1,"move_id":195},{"level":35,"move_id":195},{"level":51,"move_id":207}]},"tmhm_learnset":"03B03E00DE137265","types":[11,11]},{"abilities":[34,0],"address":3301980,"base_stats":[35,35,40,50,35,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":188}],"friendship":70,"id":187,"learnset":{"address":3312826,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":20,"move_id":73},{"level":25,"move_id":178},{"level":30,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302008,"base_stats":[55,45,50,80,45,65],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":27,"species":189}],"friendship":70,"id":188,"learnset":{"address":3312854,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":29,"move_id":178},{"level":36,"move_id":72}]},"tmhm_learnset":"00401E8084350720","types":[12,2]},{"abilities":[34,0],"address":3302036,"base_stats":[75,55,70,110,55,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":189,"learnset":{"address":3312882,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":235},{"level":1,"move_id":39},{"level":1,"move_id":33},{"level":5,"move_id":235},{"level":5,"move_id":39},{"level":10,"move_id":33},{"level":13,"move_id":77},{"level":15,"move_id":78},{"level":17,"move_id":79},{"level":22,"move_id":73},{"level":33,"move_id":178},{"level":44,"move_id":72}]},"tmhm_learnset":"00401E8084354720","types":[12,2]},{"abilities":[50,53],"address":3302064,"base_stats":[55,70,55,85,40,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":190,"learnset":{"address":3312910,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":39},{"level":6,"move_id":28},{"level":13,"move_id":310},{"level":18,"move_id":226},{"level":25,"move_id":321},{"level":31,"move_id":154},{"level":38,"move_id":129},{"level":43,"move_id":103},{"level":50,"move_id":97}]},"tmhm_learnset":"00A53E82EDF30E25","types":[0,0]},{"abilities":[34,0],"address":3302092,"base_stats":[30,30,30,30,30,30],"catch_rate":235,"evolutions":[{"method":"ITEM","param":93,"species":192}],"friendship":70,"id":191,"learnset":{"address":3312936,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":6,"move_id":74},{"level":13,"move_id":72},{"level":18,"move_id":275},{"level":25,"move_id":283},{"level":30,"move_id":241},{"level":37,"move_id":235},{"level":42,"move_id":202}]},"tmhm_learnset":"00441E08843D8720","types":[12,12]},{"abilities":[34,0],"address":3302120,"base_stats":[75,75,55,30,105,85],"catch_rate":120,"evolutions":[],"friendship":70,"id":192,"learnset":{"address":3312960,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":1,"move_id":1},{"level":6,"move_id":74},{"level":13,"move_id":75},{"level":18,"move_id":275},{"level":25,"move_id":331},{"level":30,"move_id":241},{"level":37,"move_id":80},{"level":42,"move_id":76}]},"tmhm_learnset":"00441E08843DC720","types":[12,12]},{"abilities":[3,14],"address":3302148,"base_stats":[65,65,45,95,75,45],"catch_rate":75,"evolutions":[],"friendship":70,"id":193,"learnset":{"address":3312984,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":193},{"level":7,"move_id":98},{"level":13,"move_id":104},{"level":19,"move_id":49},{"level":25,"move_id":197},{"level":31,"move_id":48},{"level":37,"move_id":253},{"level":43,"move_id":17},{"level":49,"move_id":103}]},"tmhm_learnset":"00407E80B4350620","types":[6,2]},{"abilities":[6,11],"address":3302176,"base_stats":[55,45,45,15,25,25],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":195}],"friendship":70,"id":194,"learnset":{"address":3313010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":21,"move_id":133},{"level":31,"move_id":281},{"level":36,"move_id":89},{"level":41,"move_id":240},{"level":51,"move_id":54},{"level":51,"move_id":114}]},"tmhm_learnset":"03D01E188E533264","types":[11,4]},{"abilities":[6,11],"address":3302204,"base_stats":[95,85,85,35,65,65],"catch_rate":90,"evolutions":[],"friendship":70,"id":195,"learnset":{"address":3313036,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":39},{"level":11,"move_id":21},{"level":16,"move_id":341},{"level":23,"move_id":133},{"level":35,"move_id":281},{"level":42,"move_id":89},{"level":49,"move_id":240},{"level":61,"move_id":54},{"level":61,"move_id":114}]},"tmhm_learnset":"03F01E58CE537265","types":[11,4]},{"abilities":[28,0],"address":3302232,"base_stats":[65,65,60,110,130,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":196,"learnset":{"address":3313062,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":93},{"level":23,"move_id":98},{"level":30,"move_id":129},{"level":36,"move_id":60},{"level":42,"move_id":244},{"level":47,"move_id":94},{"level":52,"move_id":234}]},"tmhm_learnset":"00449E01BC53C628","types":[14,14]},{"abilities":[28,0],"address":3302260,"base_stats":[95,65,110,65,60,130],"catch_rate":45,"evolutions":[],"friendship":35,"id":197,"learnset":{"address":3313088,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":39},{"level":1,"move_id":270},{"level":8,"move_id":28},{"level":16,"move_id":228},{"level":23,"move_id":98},{"level":30,"move_id":109},{"level":36,"move_id":185},{"level":42,"move_id":212},{"level":47,"move_id":103},{"level":52,"move_id":236}]},"tmhm_learnset":"00451F00BC534E20","types":[17,17]},{"abilities":[15,0],"address":3302288,"base_stats":[60,85,42,91,85,42],"catch_rate":30,"evolutions":[],"friendship":35,"id":198,"learnset":{"address":3313114,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":9,"move_id":310},{"level":14,"move_id":228},{"level":22,"move_id":114},{"level":27,"move_id":101},{"level":35,"move_id":185},{"level":40,"move_id":269},{"level":48,"move_id":212}]},"tmhm_learnset":"00097F80A4130E28","types":[17,2]},{"abilities":[12,20],"address":3302316,"base_stats":[95,75,80,30,100,110],"catch_rate":70,"evolutions":[],"friendship":70,"id":199,"learnset":{"address":3313138,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":174},{"level":1,"move_id":281},{"level":1,"move_id":33},{"level":6,"move_id":45},{"level":15,"move_id":55},{"level":20,"move_id":93},{"level":29,"move_id":50},{"level":34,"move_id":29},{"level":43,"move_id":207},{"level":48,"move_id":94}]},"tmhm_learnset":"02F09E24FE5B766D","types":[11,14]},{"abilities":[26,0],"address":3302344,"base_stats":[60,60,60,85,85,85],"catch_rate":45,"evolutions":[],"friendship":35,"id":200,"learnset":{"address":3313162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":149},{"level":6,"move_id":180},{"level":11,"move_id":310},{"level":17,"move_id":109},{"level":23,"move_id":212},{"level":30,"move_id":60},{"level":37,"move_id":220},{"level":45,"move_id":195},{"level":53,"move_id":288}]},"tmhm_learnset":"0041BF82B5930E28","types":[7,7]},{"abilities":[26,0],"address":3302372,"base_stats":[48,72,48,48,72,48],"catch_rate":225,"evolutions":[],"friendship":70,"id":201,"learnset":{"address":3313188,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":237}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[23,0],"address":3302400,"base_stats":[190,33,58,33,33,58],"catch_rate":45,"evolutions":[],"friendship":70,"id":202,"learnset":{"address":3313198,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":243},{"level":1,"move_id":219},{"level":1,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[39,48],"address":3302428,"base_stats":[70,80,65,85,90,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":203,"learnset":{"address":3313208,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":7,"move_id":310},{"level":13,"move_id":93},{"level":19,"move_id":23},{"level":25,"move_id":316},{"level":31,"move_id":97},{"level":37,"move_id":226},{"level":43,"move_id":60},{"level":49,"move_id":242}]},"tmhm_learnset":"00E0BE03B7D38628","types":[0,14]},{"abilities":[5,0],"address":3302456,"base_stats":[50,65,90,15,35,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":31,"species":205}],"friendship":70,"id":204,"learnset":{"address":3313234,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":36,"move_id":153},{"level":43,"move_id":191},{"level":50,"move_id":38}]},"tmhm_learnset":"00A01E118E358620","types":[6,6]},{"abilities":[5,0],"address":3302484,"base_stats":[75,90,140,40,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":205,"learnset":{"address":3313258,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":182},{"level":1,"move_id":120},{"level":8,"move_id":120},{"level":15,"move_id":36},{"level":22,"move_id":229},{"level":29,"move_id":117},{"level":39,"move_id":153},{"level":49,"move_id":191},{"level":59,"move_id":38}]},"tmhm_learnset":"00A01E118E35C620","types":[6,8]},{"abilities":[32,50],"address":3302512,"base_stats":[100,70,70,45,65,65],"catch_rate":190,"evolutions":[],"friendship":70,"id":206,"learnset":{"address":3313282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":4,"move_id":111},{"level":11,"move_id":281},{"level":14,"move_id":137},{"level":21,"move_id":180},{"level":24,"move_id":228},{"level":31,"move_id":103},{"level":34,"move_id":36},{"level":41,"move_id":283}]},"tmhm_learnset":"00A03E66AFF3362C","types":[0,0]},{"abilities":[52,8],"address":3302540,"base_stats":[65,75,105,85,35,65],"catch_rate":60,"evolutions":[],"friendship":70,"id":207,"learnset":{"address":3313308,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":6,"move_id":28},{"level":13,"move_id":106},{"level":20,"move_id":98},{"level":28,"move_id":185},{"level":36,"move_id":163},{"level":44,"move_id":103},{"level":52,"move_id":12}]},"tmhm_learnset":"00A47ED88E530620","types":[4,2]},{"abilities":[69,5],"address":3302568,"base_stats":[75,85,200,30,55,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":208,"learnset":{"address":3313332,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":103},{"level":9,"move_id":20},{"level":13,"move_id":88},{"level":21,"move_id":106},{"level":25,"move_id":99},{"level":33,"move_id":201},{"level":37,"move_id":21},{"level":45,"move_id":231},{"level":49,"move_id":242},{"level":57,"move_id":38}]},"tmhm_learnset":"00A41F508E514E30","types":[8,4]},{"abilities":[22,50],"address":3302596,"base_stats":[60,80,50,30,40,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":23,"species":210}],"friendship":70,"id":209,"learnset":{"address":3313360,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":26,"move_id":46},{"level":34,"move_id":99},{"level":43,"move_id":36},{"level":53,"move_id":242}]},"tmhm_learnset":"00A23F2EEFB30EB5","types":[0,0]},{"abilities":[22,22],"address":3302624,"base_stats":[90,120,75,45,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":210,"learnset":{"address":3313386,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":184},{"level":4,"move_id":39},{"level":8,"move_id":204},{"level":13,"move_id":44},{"level":19,"move_id":122},{"level":28,"move_id":46},{"level":38,"move_id":99},{"level":49,"move_id":36},{"level":61,"move_id":242}]},"tmhm_learnset":"00A23F6EEFF34EB5","types":[0,0]},{"abilities":[38,33],"address":3302652,"base_stats":[65,95,75,85,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":211,"learnset":{"address":3313412,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":191},{"level":1,"move_id":33},{"level":1,"move_id":40},{"level":10,"move_id":106},{"level":10,"move_id":107},{"level":19,"move_id":55},{"level":28,"move_id":42},{"level":37,"move_id":36},{"level":46,"move_id":56}]},"tmhm_learnset":"03101E0AA4133264","types":[11,3]},{"abilities":[68,0],"address":3302680,"base_stats":[70,130,100,65,55,80],"catch_rate":25,"evolutions":[],"friendship":70,"id":212,"learnset":{"address":3313434,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":6,"move_id":116},{"level":11,"move_id":228},{"level":16,"move_id":206},{"level":21,"move_id":97},{"level":26,"move_id":232},{"level":31,"move_id":163},{"level":36,"move_id":14},{"level":41,"move_id":104},{"level":46,"move_id":210}]},"tmhm_learnset":"00A47E9084134620","types":[6,8]},{"abilities":[5,0],"address":3302708,"base_stats":[20,10,230,5,10,230],"catch_rate":190,"evolutions":[],"friendship":70,"id":213,"learnset":{"address":3313462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":132},{"level":1,"move_id":110},{"level":9,"move_id":35},{"level":14,"move_id":227},{"level":23,"move_id":219},{"level":28,"move_id":117},{"level":37,"move_id":156}]},"tmhm_learnset":"00E01E588E190620","types":[6,5]},{"abilities":[68,62],"address":3302736,"base_stats":[80,125,75,85,40,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":214,"learnset":{"address":3313482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":43},{"level":6,"move_id":30},{"level":11,"move_id":203},{"level":17,"move_id":31},{"level":23,"move_id":280},{"level":30,"move_id":68},{"level":37,"move_id":36},{"level":45,"move_id":179},{"level":53,"move_id":224}]},"tmhm_learnset":"00A43E40CE1346A1","types":[6,1]},{"abilities":[39,51],"address":3302764,"base_stats":[55,95,55,115,35,75],"catch_rate":60,"evolutions":[],"friendship":35,"id":215,"learnset":{"address":3313508,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":269},{"level":8,"move_id":98},{"level":15,"move_id":103},{"level":22,"move_id":185},{"level":29,"move_id":154},{"level":36,"move_id":97},{"level":43,"move_id":196},{"level":50,"move_id":163},{"level":57,"move_id":251},{"level":64,"move_id":232}]},"tmhm_learnset":"00B53F80EC533E69","types":[17,15]},{"abilities":[53,0],"address":3302792,"base_stats":[60,80,50,40,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":217}],"friendship":70,"id":216,"learnset":{"address":3313536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43F80CE130EB1","types":[0,0]},{"abilities":[62,0],"address":3302820,"base_stats":[90,130,75,55,75,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":217,"learnset":{"address":3313562,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":43},{"level":1,"move_id":122},{"level":1,"move_id":154},{"level":7,"move_id":122},{"level":13,"move_id":154},{"level":19,"move_id":313},{"level":25,"move_id":185},{"level":31,"move_id":156},{"level":37,"move_id":163},{"level":43,"move_id":173},{"level":49,"move_id":37}]},"tmhm_learnset":"00A43FC0CE134EB1","types":[0,0]},{"abilities":[40,49],"address":3302848,"base_stats":[40,40,40,20,70,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":38,"species":219}],"friendship":70,"id":218,"learnset":{"address":3313588,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":43,"move_id":157},{"level":50,"move_id":34}]},"tmhm_learnset":"00821E2584118620","types":[10,10]},{"abilities":[40,49],"address":3302876,"base_stats":[50,50,120,30,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":219,"learnset":{"address":3313612,"moves":[{"level":1,"move_id":281},{"level":1,"move_id":123},{"level":1,"move_id":52},{"level":1,"move_id":88},{"level":8,"move_id":52},{"level":15,"move_id":88},{"level":22,"move_id":106},{"level":29,"move_id":133},{"level":36,"move_id":53},{"level":48,"move_id":157},{"level":60,"move_id":34}]},"tmhm_learnset":"00A21E758611C620","types":[10,5]},{"abilities":[12,0],"address":3302904,"base_stats":[50,50,40,50,30,30],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":33,"species":221}],"friendship":70,"id":220,"learnset":{"address":3313636,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":316},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":37,"move_id":54},{"level":46,"move_id":59},{"level":55,"move_id":133}]},"tmhm_learnset":"00A01E518E13B270","types":[15,4]},{"abilities":[12,0],"address":3302932,"base_stats":[100,100,80,50,60,60],"catch_rate":75,"evolutions":[],"friendship":70,"id":221,"learnset":{"address":3313658,"moves":[{"level":1,"move_id":30},{"level":1,"move_id":316},{"level":1,"move_id":181},{"level":1,"move_id":203},{"level":10,"move_id":181},{"level":19,"move_id":203},{"level":28,"move_id":36},{"level":33,"move_id":31},{"level":42,"move_id":54},{"level":56,"move_id":59},{"level":70,"move_id":133}]},"tmhm_learnset":"00A01E518E13F270","types":[15,4]},{"abilities":[55,30],"address":3302960,"base_stats":[55,55,85,35,65,85],"catch_rate":60,"evolutions":[],"friendship":70,"id":222,"learnset":{"address":3313682,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":6,"move_id":106},{"level":12,"move_id":145},{"level":17,"move_id":105},{"level":17,"move_id":287},{"level":23,"move_id":61},{"level":28,"move_id":131},{"level":34,"move_id":350},{"level":39,"move_id":243},{"level":45,"move_id":246}]},"tmhm_learnset":"00B01E51BE1BB66C","types":[11,5]},{"abilities":[55,0],"address":3302988,"base_stats":[35,65,35,65,65,35],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":224}],"friendship":70,"id":223,"learnset":{"address":3313710,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":199},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":33,"move_id":116},{"level":44,"move_id":58},{"level":55,"move_id":63}]},"tmhm_learnset":"03103E2494137624","types":[11,11]},{"abilities":[21,0],"address":3303016,"base_stats":[75,105,75,45,105,75],"catch_rate":75,"evolutions":[],"friendship":70,"id":224,"learnset":{"address":3313734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":11,"move_id":132},{"level":22,"move_id":60},{"level":22,"move_id":62},{"level":22,"move_id":61},{"level":25,"move_id":190},{"level":38,"move_id":116},{"level":54,"move_id":58},{"level":70,"move_id":63}]},"tmhm_learnset":"03103E2C94137724","types":[11,11]},{"abilities":[72,55],"address":3303044,"base_stats":[45,55,45,75,65,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":225,"learnset":{"address":3313760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":217}]},"tmhm_learnset":"00083E8084133265","types":[15,2]},{"abilities":[33,11],"address":3303072,"base_stats":[65,40,70,70,80,140],"catch_rate":25,"evolutions":[],"friendship":70,"id":226,"learnset":{"address":3313770,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":145},{"level":8,"move_id":48},{"level":15,"move_id":61},{"level":22,"move_id":36},{"level":29,"move_id":97},{"level":36,"move_id":17},{"level":43,"move_id":352},{"level":50,"move_id":109}]},"tmhm_learnset":"03101E8086133264","types":[11,2]},{"abilities":[51,5],"address":3303100,"base_stats":[65,80,140,70,40,70],"catch_rate":25,"evolutions":[],"friendship":70,"id":227,"learnset":{"address":3313794,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":64},{"level":10,"move_id":28},{"level":13,"move_id":129},{"level":16,"move_id":97},{"level":26,"move_id":31},{"level":29,"move_id":314},{"level":32,"move_id":211},{"level":42,"move_id":191},{"level":45,"move_id":319}]},"tmhm_learnset":"008C7F9084110E30","types":[8,2]},{"abilities":[48,18],"address":3303128,"base_stats":[45,60,30,65,80,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":24,"species":229}],"friendship":35,"id":228,"learnset":{"address":3313820,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":25,"move_id":44},{"level":31,"move_id":316},{"level":37,"move_id":185},{"level":43,"move_id":53},{"level":49,"move_id":242}]},"tmhm_learnset":"00833F2CA4710E30","types":[17,10]},{"abilities":[48,18],"address":3303156,"base_stats":[75,90,50,95,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":229,"learnset":{"address":3313846,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":52},{"level":1,"move_id":336},{"level":7,"move_id":336},{"level":13,"move_id":123},{"level":19,"move_id":46},{"level":27,"move_id":44},{"level":35,"move_id":316},{"level":43,"move_id":185},{"level":51,"move_id":53},{"level":59,"move_id":242}]},"tmhm_learnset":"00A33F2CA4714E30","types":[17,10]},{"abilities":[33,0],"address":3303184,"base_stats":[75,95,95,85,95,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":230,"learnset":{"address":3313872,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":108},{"level":1,"move_id":43},{"level":1,"move_id":55},{"level":8,"move_id":108},{"level":15,"move_id":43},{"level":22,"move_id":55},{"level":29,"move_id":239},{"level":40,"move_id":97},{"level":51,"move_id":56},{"level":62,"move_id":349}]},"tmhm_learnset":"03101E0084137264","types":[11,16]},{"abilities":[53,0],"address":3303212,"base_stats":[90,60,60,40,40,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":25,"species":232}],"friendship":70,"id":231,"learnset":{"address":3313896,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":36},{"level":33,"move_id":205},{"level":41,"move_id":203},{"level":49,"move_id":38}]},"tmhm_learnset":"00A01E5086510630","types":[4,4]},{"abilities":[5,0],"address":3303240,"base_stats":[90,120,120,50,60,60],"catch_rate":60,"evolutions":[],"friendship":70,"id":232,"learnset":{"address":3313918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":316},{"level":1,"move_id":30},{"level":1,"move_id":45},{"level":9,"move_id":111},{"level":17,"move_id":175},{"level":25,"move_id":31},{"level":33,"move_id":205},{"level":41,"move_id":229},{"level":49,"move_id":89}]},"tmhm_learnset":"00A01E5086514630","types":[4,4]},{"abilities":[36,0],"address":3303268,"base_stats":[85,80,90,60,105,95],"catch_rate":45,"evolutions":[],"friendship":70,"id":233,"learnset":{"address":3313940,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":176},{"level":1,"move_id":33},{"level":1,"move_id":160},{"level":9,"move_id":97},{"level":12,"move_id":60},{"level":20,"move_id":105},{"level":24,"move_id":111},{"level":32,"move_id":199},{"level":36,"move_id":161},{"level":44,"move_id":278},{"level":48,"move_id":192}]},"tmhm_learnset":"00402E82B5F37620","types":[0,0]},{"abilities":[22,0],"address":3303296,"base_stats":[73,95,62,85,85,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":234,"learnset":{"address":3313966,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":43},{"level":13,"move_id":310},{"level":19,"move_id":95},{"level":25,"move_id":23},{"level":31,"move_id":28},{"level":37,"move_id":36},{"level":43,"move_id":109},{"level":49,"move_id":347}]},"tmhm_learnset":"0040BE03B7F38638","types":[0,0]},{"abilities":[20,0],"address":3303324,"base_stats":[55,20,35,75,20,45],"catch_rate":45,"evolutions":[],"friendship":70,"id":235,"learnset":{"address":3313992,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":166},{"level":11,"move_id":166},{"level":21,"move_id":166},{"level":31,"move_id":166},{"level":41,"move_id":166},{"level":51,"move_id":166},{"level":61,"move_id":166},{"level":71,"move_id":166},{"level":81,"move_id":166},{"level":91,"move_id":166}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[62,0],"address":3303352,"base_stats":[35,35,35,35,35,35],"catch_rate":75,"evolutions":[{"method":"LEVEL_ATK_LT_DEF","param":20,"species":107},{"method":"LEVEL_ATK_GT_DEF","param":20,"species":106},{"method":"LEVEL_ATK_EQ_DEF","param":20,"species":237}],"friendship":70,"id":236,"learnset":{"address":3314020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"00A03E00C61306A0","types":[1,1]},{"abilities":[22,0],"address":3303380,"base_stats":[50,95,95,70,35,110],"catch_rate":45,"evolutions":[],"friendship":70,"id":237,"learnset":{"address":3314030,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":279},{"level":1,"move_id":27},{"level":7,"move_id":116},{"level":13,"move_id":228},{"level":19,"move_id":98},{"level":20,"move_id":167},{"level":25,"move_id":229},{"level":31,"move_id":68},{"level":37,"move_id":97},{"level":43,"move_id":197},{"level":49,"move_id":283}]},"tmhm_learnset":"00A03E10CE1306A0","types":[1,1]},{"abilities":[12,0],"address":3303408,"base_stats":[45,30,15,65,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":124}],"friendship":70,"id":238,"learnset":{"address":3314058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":122},{"level":9,"move_id":186},{"level":13,"move_id":181},{"level":21,"move_id":93},{"level":25,"move_id":47},{"level":33,"move_id":212},{"level":37,"move_id":313},{"level":45,"move_id":94},{"level":49,"move_id":195},{"level":57,"move_id":59}]},"tmhm_learnset":"0040BE01B413B26C","types":[15,14]},{"abilities":[9,0],"address":3303436,"base_stats":[45,63,37,95,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":125}],"friendship":70,"id":239,"learnset":{"address":3314086,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":43},{"level":9,"move_id":9},{"level":17,"move_id":113},{"level":25,"move_id":129},{"level":33,"move_id":103},{"level":41,"move_id":85},{"level":49,"move_id":87}]},"tmhm_learnset":"00C03E02D5938221","types":[13,13]},{"abilities":[49,0],"address":3303464,"base_stats":[45,75,37,83,70,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":126}],"friendship":70,"id":240,"learnset":{"address":3314108,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":7,"move_id":43},{"level":13,"move_id":123},{"level":19,"move_id":7},{"level":25,"move_id":108},{"level":31,"move_id":241},{"level":37,"move_id":53},{"level":43,"move_id":109},{"level":49,"move_id":126}]},"tmhm_learnset":"00803E24D4510621","types":[10,10]},{"abilities":[47,0],"address":3303492,"base_stats":[95,80,105,100,40,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":241,"learnset":{"address":3314134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":45},{"level":8,"move_id":111},{"level":13,"move_id":23},{"level":19,"move_id":208},{"level":26,"move_id":117},{"level":34,"move_id":205},{"level":43,"move_id":34},{"level":53,"move_id":215}]},"tmhm_learnset":"00B01E52E7F37625","types":[0,0]},{"abilities":[30,32],"address":3303520,"base_stats":[255,10,10,55,75,135],"catch_rate":30,"evolutions":[],"friendship":140,"id":242,"learnset":{"address":3314160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":45},{"level":4,"move_id":39},{"level":7,"move_id":287},{"level":10,"move_id":135},{"level":13,"move_id":3},{"level":18,"move_id":107},{"level":23,"move_id":47},{"level":28,"move_id":121},{"level":33,"move_id":111},{"level":40,"move_id":113},{"level":47,"move_id":38}]},"tmhm_learnset":"00E19E76F7FBF66D","types":[0,0]},{"abilities":[46,0],"address":3303548,"base_stats":[90,85,75,115,115,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":243,"learnset":{"address":3314190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":84},{"level":21,"move_id":46},{"level":31,"move_id":98},{"level":41,"move_id":209},{"level":51,"move_id":115},{"level":61,"move_id":242},{"level":71,"move_id":87},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E138DD34638","types":[13,13]},{"abilities":[46,0],"address":3303576,"base_stats":[115,115,85,100,90,75],"catch_rate":3,"evolutions":[],"friendship":35,"id":244,"learnset":{"address":3314216,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":52},{"level":21,"move_id":46},{"level":31,"move_id":83},{"level":41,"move_id":23},{"level":51,"move_id":53},{"level":61,"move_id":207},{"level":71,"move_id":126},{"level":81,"move_id":347}]},"tmhm_learnset":"00E40E358C734638","types":[10,10]},{"abilities":[46,0],"address":3303604,"base_stats":[100,75,115,85,90,115],"catch_rate":3,"evolutions":[],"friendship":35,"id":245,"learnset":{"address":3314242,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":11,"move_id":61},{"level":21,"move_id":240},{"level":31,"move_id":16},{"level":41,"move_id":62},{"level":51,"move_id":54},{"level":61,"move_id":243},{"level":71,"move_id":56},{"level":81,"move_id":347}]},"tmhm_learnset":"03940E118C53767C","types":[11,11]},{"abilities":[62,0],"address":3303632,"base_stats":[50,64,50,41,45,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":247}],"friendship":35,"id":246,"learnset":{"address":3314268,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":36,"move_id":184},{"level":43,"move_id":242},{"level":50,"move_id":89},{"level":57,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[61,0],"address":3303660,"base_stats":[70,84,70,51,65,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":55,"species":248}],"friendship":35,"id":247,"learnset":{"address":3314294,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":56,"move_id":89},{"level":65,"move_id":63}]},"tmhm_learnset":"00801F10CE134E20","types":[5,4]},{"abilities":[45,0],"address":3303688,"base_stats":[100,134,110,61,95,100],"catch_rate":45,"evolutions":[],"friendship":35,"id":248,"learnset":{"address":3314320,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":201},{"level":1,"move_id":103},{"level":8,"move_id":201},{"level":15,"move_id":103},{"level":22,"move_id":157},{"level":29,"move_id":37},{"level":38,"move_id":184},{"level":47,"move_id":242},{"level":61,"move_id":89},{"level":75,"move_id":63}]},"tmhm_learnset":"00B41FF6CFD37E37","types":[5,17]},{"abilities":[46,0],"address":3303716,"base_stats":[106,90,130,110,90,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":249,"learnset":{"address":3314346,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":16},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":56},{"level":55,"move_id":240},{"level":66,"move_id":129},{"level":77,"move_id":177},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"03B8CE93B7DFF67C","types":[14,2]},{"abilities":[46,0],"address":3303744,"base_stats":[106,130,90,90,110,154],"catch_rate":3,"evolutions":[],"friendship":0,"id":250,"learnset":{"address":3314374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":18},{"level":11,"move_id":219},{"level":22,"move_id":16},{"level":33,"move_id":105},{"level":44,"move_id":126},{"level":55,"move_id":241},{"level":66,"move_id":129},{"level":77,"move_id":221},{"level":88,"move_id":246},{"level":99,"move_id":248}]},"tmhm_learnset":"00EA4EB7B7BFC638","types":[10,2]},{"abilities":[30,0],"address":3303772,"base_stats":[100,100,100,100,100,100],"catch_rate":45,"evolutions":[],"friendship":100,"id":251,"learnset":{"address":3314402,"moves":[{"level":1,"move_id":73},{"level":1,"move_id":93},{"level":1,"move_id":105},{"level":1,"move_id":215},{"level":10,"move_id":219},{"level":20,"move_id":246},{"level":30,"move_id":248},{"level":40,"move_id":226},{"level":50,"move_id":195}]},"tmhm_learnset":"00448E93B43FC62C","types":[14,12]},{"abilities":[0,0],"address":3303800,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":252,"learnset":{"address":3314422,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303828,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":253,"learnset":{"address":3314432,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303856,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":254,"learnset":{"address":3314442,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303884,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":255,"learnset":{"address":3314452,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303912,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":256,"learnset":{"address":3314462,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303940,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":257,"learnset":{"address":3314472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303968,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":258,"learnset":{"address":3314482,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3303996,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":259,"learnset":{"address":3314492,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304024,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":260,"learnset":{"address":3314502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304052,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":261,"learnset":{"address":3314512,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304080,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":262,"learnset":{"address":3314522,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304108,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":263,"learnset":{"address":3314532,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304136,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":264,"learnset":{"address":3314542,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304164,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":265,"learnset":{"address":3314552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304192,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":266,"learnset":{"address":3314562,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304220,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":267,"learnset":{"address":3314572,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304248,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":268,"learnset":{"address":3314582,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304276,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":269,"learnset":{"address":3314592,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304304,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":270,"learnset":{"address":3314602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304332,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":271,"learnset":{"address":3314612,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304360,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":272,"learnset":{"address":3314622,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304388,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":273,"learnset":{"address":3314632,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304416,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":274,"learnset":{"address":3314642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304444,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":275,"learnset":{"address":3314652,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[0,0],"address":3304472,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":276,"learnset":{"address":3314662,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33}]},"tmhm_learnset":"0000000000000000","types":[0,0]},{"abilities":[65,0],"address":3304500,"base_stats":[40,45,35,70,65,55],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":278}],"friendship":70,"id":277,"learnset":{"address":3314672,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":228},{"level":21,"move_id":103},{"level":26,"move_id":72},{"level":31,"move_id":97},{"level":36,"move_id":21},{"level":41,"move_id":197},{"level":46,"move_id":202}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304528,"base_stats":[50,65,45,95,85,65],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":279}],"friendship":70,"id":278,"learnset":{"address":3314700,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":41,"move_id":21},{"level":47,"move_id":197},{"level":53,"move_id":206}]},"tmhm_learnset":"00E41EC0CC7D0721","types":[12,12]},{"abilities":[65,0],"address":3304556,"base_stats":[70,85,65,120,105,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":279,"learnset":{"address":3314730,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":98},{"level":6,"move_id":71},{"level":11,"move_id":98},{"level":16,"move_id":210},{"level":17,"move_id":228},{"level":23,"move_id":103},{"level":29,"move_id":348},{"level":35,"move_id":97},{"level":43,"move_id":21},{"level":51,"move_id":197},{"level":59,"move_id":206}]},"tmhm_learnset":"00E41EC0CE7D4733","types":[12,12]},{"abilities":[66,0],"address":3304584,"base_stats":[45,60,40,45,70,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":281}],"friendship":70,"id":280,"learnset":{"address":3314760,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":7,"move_id":116},{"level":10,"move_id":52},{"level":16,"move_id":64},{"level":19,"move_id":28},{"level":25,"move_id":83},{"level":28,"move_id":98},{"level":34,"move_id":163},{"level":37,"move_id":119},{"level":43,"move_id":53}]},"tmhm_learnset":"00A61EE48C110620","types":[10,10]},{"abilities":[66,0],"address":3304612,"base_stats":[60,85,60,55,85,60],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":282}],"friendship":70,"id":281,"learnset":{"address":3314788,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":39,"move_id":163},{"level":43,"move_id":119},{"level":50,"move_id":327}]},"tmhm_learnset":"00A61EE4CC1106A1","types":[10,1]},{"abilities":[66,0],"address":3304640,"base_stats":[80,120,70,80,110,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":282,"learnset":{"address":3314818,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":10},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":52},{"level":7,"move_id":116},{"level":13,"move_id":52},{"level":16,"move_id":24},{"level":17,"move_id":64},{"level":21,"move_id":28},{"level":28,"move_id":339},{"level":32,"move_id":98},{"level":36,"move_id":299},{"level":42,"move_id":163},{"level":49,"move_id":119},{"level":59,"move_id":327}]},"tmhm_learnset":"00A61EE4CE1146B1","types":[10,1]},{"abilities":[67,0],"address":3304668,"base_stats":[50,70,50,40,50,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":16,"species":284}],"friendship":70,"id":283,"learnset":{"address":3314852,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":19,"move_id":193},{"level":24,"move_id":300},{"level":28,"move_id":36},{"level":33,"move_id":250},{"level":37,"move_id":182},{"level":42,"move_id":56},{"level":46,"move_id":283}]},"tmhm_learnset":"03B01E408C533264","types":[11,11]},{"abilities":[67,0],"address":3304696,"base_stats":[70,85,70,50,60,70],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":36,"species":285}],"friendship":70,"id":284,"learnset":{"address":3314882,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":37,"move_id":330},{"level":42,"move_id":182},{"level":46,"move_id":89},{"level":53,"move_id":283}]},"tmhm_learnset":"03B01E408E533264","types":[11,4]},{"abilities":[67,0],"address":3304724,"base_stats":[100,110,90,60,85,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":285,"learnset":{"address":3314914,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":189},{"level":1,"move_id":55},{"level":6,"move_id":189},{"level":10,"move_id":55},{"level":15,"move_id":117},{"level":16,"move_id":341},{"level":20,"move_id":193},{"level":25,"move_id":300},{"level":31,"move_id":36},{"level":39,"move_id":330},{"level":46,"move_id":182},{"level":52,"move_id":89},{"level":61,"move_id":283}]},"tmhm_learnset":"03B01E40CE537275","types":[11,4]},{"abilities":[50,0],"address":3304752,"base_stats":[35,55,35,35,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":287}],"friendship":70,"id":286,"learnset":{"address":3314946,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":21,"move_id":46},{"level":25,"move_id":207},{"level":29,"move_id":184},{"level":33,"move_id":36},{"level":37,"move_id":269},{"level":41,"move_id":242},{"level":45,"move_id":168}]},"tmhm_learnset":"00813F00AC530E30","types":[17,17]},{"abilities":[22,0],"address":3304780,"base_stats":[70,90,70,70,60,60],"catch_rate":127,"evolutions":[],"friendship":70,"id":287,"learnset":{"address":3314978,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":336},{"level":1,"move_id":28},{"level":1,"move_id":44},{"level":5,"move_id":336},{"level":9,"move_id":28},{"level":13,"move_id":44},{"level":17,"move_id":316},{"level":22,"move_id":46},{"level":27,"move_id":207},{"level":32,"move_id":184},{"level":37,"move_id":36},{"level":42,"move_id":269},{"level":47,"move_id":242},{"level":52,"move_id":168}]},"tmhm_learnset":"00A13F00AC534E30","types":[17,17]},{"abilities":[53,0],"address":3304808,"base_stats":[38,30,41,60,30,41],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":20,"species":289}],"friendship":70,"id":288,"learnset":{"address":3315010,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":21,"move_id":300},{"level":25,"move_id":42},{"level":29,"move_id":343},{"level":33,"move_id":175},{"level":37,"move_id":156},{"level":41,"move_id":187}]},"tmhm_learnset":"00943E02ADD33624","types":[0,0]},{"abilities":[53,0],"address":3304836,"base_stats":[78,70,61,100,50,61],"catch_rate":90,"evolutions":[],"friendship":70,"id":289,"learnset":{"address":3315040,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":45},{"level":1,"move_id":39},{"level":1,"move_id":29},{"level":5,"move_id":39},{"level":9,"move_id":29},{"level":13,"move_id":28},{"level":17,"move_id":316},{"level":23,"move_id":300},{"level":29,"move_id":154},{"level":35,"move_id":343},{"level":41,"move_id":163},{"level":47,"move_id":156},{"level":53,"move_id":187}]},"tmhm_learnset":"00B43E02ADD37634","types":[0,0]},{"abilities":[19,0],"address":3304864,"base_stats":[45,45,35,20,20,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_SILCOON","param":7,"species":291},{"method":"LEVEL_CASCOON","param":7,"species":293}],"friendship":70,"id":290,"learnset":{"address":3315070,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":81},{"level":5,"move_id":40}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[61,0],"address":3304892,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":292}],"friendship":70,"id":291,"learnset":{"address":3315082,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[68,0],"address":3304920,"base_stats":[60,70,50,65,90,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":292,"learnset":{"address":3315094,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":10,"move_id":71},{"level":13,"move_id":16},{"level":17,"move_id":78},{"level":20,"move_id":234},{"level":24,"move_id":72},{"level":27,"move_id":18},{"level":31,"move_id":213},{"level":34,"move_id":318},{"level":38,"move_id":202}]},"tmhm_learnset":"00403E80B43D4620","types":[6,2]},{"abilities":[61,0],"address":3304948,"base_stats":[50,35,55,15,25,25],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":10,"species":294}],"friendship":70,"id":293,"learnset":{"address":3315122,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":106}]},"tmhm_learnset":"0000000000000000","types":[6,6]},{"abilities":[19,0],"address":3304976,"base_stats":[60,50,70,65,50,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":294,"learnset":{"address":3315134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":10,"move_id":93},{"level":13,"move_id":16},{"level":17,"move_id":182},{"level":20,"move_id":236},{"level":24,"move_id":60},{"level":27,"move_id":18},{"level":31,"move_id":113},{"level":34,"move_id":318},{"level":38,"move_id":92}]},"tmhm_learnset":"00403E88B435C620","types":[6,3]},{"abilities":[33,44],"address":3305004,"base_stats":[40,30,30,30,40,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":296}],"friendship":70,"id":295,"learnset":{"address":3315162,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":21,"move_id":54},{"level":31,"move_id":240},{"level":43,"move_id":72}]},"tmhm_learnset":"00503E0084373764","types":[11,12]},{"abilities":[33,44],"address":3305032,"base_stats":[60,50,50,50,60,70],"catch_rate":120,"evolutions":[{"method":"ITEM","param":97,"species":297}],"friendship":70,"id":296,"learnset":{"address":3315184,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":3,"move_id":45},{"level":7,"move_id":71},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":154},{"level":31,"move_id":346},{"level":37,"move_id":168},{"level":43,"move_id":253},{"level":49,"move_id":56}]},"tmhm_learnset":"03F03E00C4373764","types":[11,12]},{"abilities":[33,44],"address":3305060,"base_stats":[80,70,70,70,90,100],"catch_rate":45,"evolutions":[],"friendship":70,"id":297,"learnset":{"address":3315212,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":45},{"level":1,"move_id":71},{"level":1,"move_id":267}]},"tmhm_learnset":"03F03E00C4377765","types":[11,12]},{"abilities":[34,48],"address":3305088,"base_stats":[40,40,50,30,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":14,"species":299}],"friendship":70,"id":298,"learnset":{"address":3315222,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":21,"move_id":235},{"level":31,"move_id":241},{"level":43,"move_id":153}]},"tmhm_learnset":"00C01E00AC350720","types":[12,12]},{"abilities":[34,48],"address":3305116,"base_stats":[70,70,40,60,60,40],"catch_rate":120,"evolutions":[{"method":"ITEM","param":98,"species":300}],"friendship":70,"id":299,"learnset":{"address":3315244,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":3,"move_id":106},{"level":7,"move_id":74},{"level":13,"move_id":267},{"level":19,"move_id":252},{"level":25,"move_id":259},{"level":31,"move_id":185},{"level":37,"move_id":13},{"level":43,"move_id":207},{"level":49,"move_id":326}]},"tmhm_learnset":"00E43F40EC354720","types":[12,17]},{"abilities":[34,48],"address":3305144,"base_stats":[90,100,60,80,90,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":300,"learnset":{"address":3315272,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":106},{"level":1,"move_id":74},{"level":1,"move_id":267}]},"tmhm_learnset":"00E43FC0EC354720","types":[12,17]},{"abilities":[14,0],"address":3305172,"base_stats":[31,45,90,40,30,30],"catch_rate":255,"evolutions":[{"method":"LEVEL_NINJASK","param":20,"species":302},{"method":"LEVEL_SHEDINJA","param":20,"species":303}],"friendship":70,"id":301,"learnset":{"address":3315282,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":206},{"level":31,"move_id":189},{"level":38,"move_id":232},{"level":45,"move_id":91}]},"tmhm_learnset":"00440E90AC350620","types":[6,4]},{"abilities":[3,0],"address":3305200,"base_stats":[61,90,45,160,50,50],"catch_rate":120,"evolutions":[],"friendship":70,"id":302,"learnset":{"address":3315308,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":141},{"level":1,"move_id":28},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":20,"move_id":104},{"level":20,"move_id":210},{"level":20,"move_id":103},{"level":25,"move_id":14},{"level":31,"move_id":163},{"level":38,"move_id":97},{"level":45,"move_id":226}]},"tmhm_learnset":"00443E90AC354620","types":[6,2]},{"abilities":[25,0],"address":3305228,"base_stats":[1,90,45,40,30,30],"catch_rate":45,"evolutions":[],"friendship":70,"id":303,"learnset":{"address":3315340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":5,"move_id":141},{"level":9,"move_id":28},{"level":14,"move_id":154},{"level":19,"move_id":170},{"level":25,"move_id":180},{"level":31,"move_id":109},{"level":38,"move_id":247},{"level":45,"move_id":288}]},"tmhm_learnset":"00442E90AC354620","types":[6,7]},{"abilities":[62,0],"address":3305256,"base_stats":[40,55,30,85,30,30],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":305}],"friendship":70,"id":304,"learnset":{"address":3315366,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":26,"move_id":283},{"level":34,"move_id":332},{"level":43,"move_id":97}]},"tmhm_learnset":"00087E8084130620","types":[0,2]},{"abilities":[62,0],"address":3305284,"base_stats":[60,85,60,125,50,50],"catch_rate":45,"evolutions":[],"friendship":70,"id":305,"learnset":{"address":3315390,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":116},{"level":1,"move_id":98},{"level":4,"move_id":116},{"level":8,"move_id":98},{"level":13,"move_id":17},{"level":19,"move_id":104},{"level":28,"move_id":283},{"level":38,"move_id":332},{"level":49,"move_id":97}]},"tmhm_learnset":"00087E8084134620","types":[0,2]},{"abilities":[27,0],"address":3305312,"base_stats":[60,40,60,35,40,60],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":23,"species":307}],"friendship":70,"id":306,"learnset":{"address":3315414,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":28,"move_id":77},{"level":36,"move_id":74},{"level":45,"move_id":202},{"level":54,"move_id":147}]},"tmhm_learnset":"00411E08843D0720","types":[12,12]},{"abilities":[27,0],"address":3305340,"base_stats":[60,130,80,70,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":307,"learnset":{"address":3315442,"moves":[{"level":1,"move_id":71},{"level":1,"move_id":33},{"level":1,"move_id":78},{"level":1,"move_id":73},{"level":4,"move_id":33},{"level":7,"move_id":78},{"level":10,"move_id":73},{"level":16,"move_id":72},{"level":22,"move_id":29},{"level":23,"move_id":183},{"level":28,"move_id":68},{"level":36,"move_id":327},{"level":45,"move_id":170},{"level":54,"move_id":223}]},"tmhm_learnset":"00E51E08C47D47A1","types":[12,1]},{"abilities":[20,0],"address":3305368,"base_stats":[60,60,60,60,60,60],"catch_rate":255,"evolutions":[],"friendship":70,"id":308,"learnset":{"address":3315472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":253},{"level":12,"move_id":185},{"level":16,"move_id":60},{"level":23,"move_id":95},{"level":27,"move_id":146},{"level":34,"move_id":298},{"level":38,"move_id":244},{"level":45,"move_id":38},{"level":49,"move_id":175},{"level":56,"move_id":37}]},"tmhm_learnset":"00E1BE42FC1B062D","types":[0,0]},{"abilities":[51,0],"address":3305396,"base_stats":[40,30,30,85,55,30],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":25,"species":310}],"friendship":70,"id":309,"learnset":{"address":3315502,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":31,"move_id":98},{"level":43,"move_id":228},{"level":55,"move_id":97}]},"tmhm_learnset":"00087E8284133264","types":[11,2]},{"abilities":[51,0],"address":3305424,"base_stats":[60,50,100,65,85,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":310,"learnset":{"address":3315524,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":346},{"level":1,"move_id":17},{"level":3,"move_id":55},{"level":7,"move_id":48},{"level":13,"move_id":17},{"level":21,"move_id":54},{"level":25,"move_id":182},{"level":33,"move_id":254},{"level":33,"move_id":256},{"level":47,"move_id":255},{"level":61,"move_id":56}]},"tmhm_learnset":"00187E8284137264","types":[11,2]},{"abilities":[33,0],"address":3305452,"base_stats":[40,30,32,65,50,52],"catch_rate":200,"evolutions":[{"method":"LEVEL","param":22,"species":312}],"friendship":70,"id":311,"learnset":{"address":3315552,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":25,"move_id":61},{"level":31,"move_id":97},{"level":37,"move_id":54},{"level":37,"move_id":114}]},"tmhm_learnset":"00403E00A4373624","types":[6,11]},{"abilities":[22,0],"address":3305480,"base_stats":[70,60,62,60,80,82],"catch_rate":75,"evolutions":[],"friendship":70,"id":312,"learnset":{"address":3315576,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":98},{"level":1,"move_id":230},{"level":1,"move_id":346},{"level":7,"move_id":98},{"level":13,"move_id":230},{"level":19,"move_id":346},{"level":26,"move_id":16},{"level":33,"move_id":184},{"level":40,"move_id":78},{"level":47,"move_id":318},{"level":53,"move_id":18}]},"tmhm_learnset":"00403E80A4377624","types":[6,2]},{"abilities":[41,12],"address":3305508,"base_stats":[130,70,35,60,70,35],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":40,"species":314}],"friendship":70,"id":313,"learnset":{"address":3315602,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":1,"move_id":150},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":41,"move_id":323},{"level":46,"move_id":133},{"level":50,"move_id":56}]},"tmhm_learnset":"03B01E4086133274","types":[11,11]},{"abilities":[41,12],"address":3305536,"base_stats":[170,90,45,60,90,45],"catch_rate":60,"evolutions":[],"friendship":70,"id":314,"learnset":{"address":3315634,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":205},{"level":5,"move_id":45},{"level":10,"move_id":55},{"level":14,"move_id":205},{"level":19,"move_id":250},{"level":23,"move_id":310},{"level":28,"move_id":352},{"level":32,"move_id":54},{"level":37,"move_id":156},{"level":44,"move_id":323},{"level":52,"move_id":133},{"level":59,"move_id":56}]},"tmhm_learnset":"03B01E4086137274","types":[11,11]},{"abilities":[56,0],"address":3305564,"base_stats":[50,45,45,50,35,35],"catch_rate":255,"evolutions":[{"method":"ITEM","param":94,"species":316}],"friendship":70,"id":315,"learnset":{"address":3315666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":3,"move_id":39},{"level":7,"move_id":213},{"level":13,"move_id":47},{"level":15,"move_id":3},{"level":19,"move_id":274},{"level":25,"move_id":204},{"level":27,"move_id":185},{"level":31,"move_id":343},{"level":37,"move_id":215},{"level":39,"move_id":38}]},"tmhm_learnset":"00401E02ADFB362C","types":[0,0]},{"abilities":[56,0],"address":3305592,"base_stats":[70,65,65,70,55,55],"catch_rate":60,"evolutions":[],"friendship":70,"id":316,"learnset":{"address":3315696,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":213},{"level":1,"move_id":47},{"level":1,"move_id":3}]},"tmhm_learnset":"00E01E02ADFB762C","types":[0,0]},{"abilities":[16,0],"address":3305620,"base_stats":[60,90,70,40,60,120],"catch_rate":200,"evolutions":[],"friendship":70,"id":317,"learnset":{"address":3315706,"moves":[{"level":1,"move_id":168},{"level":1,"move_id":39},{"level":1,"move_id":310},{"level":1,"move_id":122},{"level":1,"move_id":10},{"level":4,"move_id":20},{"level":7,"move_id":185},{"level":12,"move_id":154},{"level":17,"move_id":60},{"level":24,"move_id":103},{"level":31,"move_id":163},{"level":40,"move_id":164},{"level":49,"move_id":246}]},"tmhm_learnset":"00E5BEE6EDF33625","types":[0,0]},{"abilities":[26,0],"address":3305648,"base_stats":[40,40,55,55,40,70],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":36,"species":319}],"friendship":70,"id":318,"learnset":{"address":3315734,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":37,"move_id":322},{"level":45,"move_id":153}]},"tmhm_learnset":"00408E51BE339620","types":[4,14]},{"abilities":[26,0],"address":3305676,"base_stats":[60,70,105,75,70,120],"catch_rate":90,"evolutions":[],"friendship":70,"id":319,"learnset":{"address":3315764,"moves":[{"level":1,"move_id":100},{"level":1,"move_id":93},{"level":1,"move_id":106},{"level":1,"move_id":229},{"level":3,"move_id":106},{"level":5,"move_id":229},{"level":7,"move_id":189},{"level":11,"move_id":60},{"level":15,"move_id":317},{"level":19,"move_id":120},{"level":25,"move_id":246},{"level":31,"move_id":201},{"level":36,"move_id":63},{"level":42,"move_id":322},{"level":55,"move_id":153}]},"tmhm_learnset":"00E08E51BE33D620","types":[4,14]},{"abilities":[5,42],"address":3305704,"base_stats":[30,45,135,30,45,90],"catch_rate":255,"evolutions":[],"friendship":70,"id":320,"learnset":{"address":3315796,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":7,"move_id":106},{"level":13,"move_id":88},{"level":16,"move_id":335},{"level":22,"move_id":86},{"level":28,"move_id":157},{"level":31,"move_id":201},{"level":37,"move_id":156},{"level":43,"move_id":192},{"level":46,"move_id":199}]},"tmhm_learnset":"00A01F5287910E20","types":[5,5]},{"abilities":[73,0],"address":3305732,"base_stats":[70,85,140,20,85,70],"catch_rate":90,"evolutions":[],"friendship":70,"id":321,"learnset":{"address":3315824,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":52},{"level":4,"move_id":123},{"level":7,"move_id":174},{"level":14,"move_id":108},{"level":17,"move_id":83},{"level":20,"move_id":34},{"level":27,"move_id":182},{"level":30,"move_id":53},{"level":33,"move_id":334},{"level":40,"move_id":133},{"level":43,"move_id":175},{"level":46,"move_id":257}]},"tmhm_learnset":"00A21E2C84510620","types":[10,10]},{"abilities":[51,0],"address":3305760,"base_stats":[50,75,75,50,65,65],"catch_rate":45,"evolutions":[],"friendship":35,"id":322,"learnset":{"address":3315856,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":10},{"level":5,"move_id":193},{"level":9,"move_id":101},{"level":13,"move_id":310},{"level":17,"move_id":154},{"level":21,"move_id":252},{"level":25,"move_id":197},{"level":29,"move_id":185},{"level":33,"move_id":282},{"level":37,"move_id":109},{"level":41,"move_id":247},{"level":45,"move_id":212}]},"tmhm_learnset":"00C53FC2FC130E2D","types":[17,7]},{"abilities":[12,0],"address":3305788,"base_stats":[50,48,43,60,46,41],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":30,"species":324}],"friendship":70,"id":323,"learnset":{"address":3315888,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":189},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":31,"move_id":89},{"level":36,"move_id":248},{"level":41,"move_id":90}]},"tmhm_learnset":"03101E5086133264","types":[11,4]},{"abilities":[12,0],"address":3305816,"base_stats":[110,78,73,60,76,71],"catch_rate":75,"evolutions":[],"friendship":70,"id":324,"learnset":{"address":3315918,"moves":[{"level":1,"move_id":321},{"level":1,"move_id":189},{"level":1,"move_id":300},{"level":1,"move_id":346},{"level":6,"move_id":300},{"level":6,"move_id":346},{"level":11,"move_id":55},{"level":16,"move_id":222},{"level":21,"move_id":133},{"level":26,"move_id":156},{"level":26,"move_id":173},{"level":36,"move_id":89},{"level":46,"move_id":248},{"level":56,"move_id":90}]},"tmhm_learnset":"03B01E5086137264","types":[11,4]},{"abilities":[33,0],"address":3305844,"base_stats":[43,30,55,97,40,65],"catch_rate":225,"evolutions":[],"friendship":70,"id":325,"learnset":{"address":3315948,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":204},{"level":12,"move_id":55},{"level":16,"move_id":97},{"level":24,"move_id":36},{"level":28,"move_id":213},{"level":36,"move_id":186},{"level":40,"move_id":175},{"level":48,"move_id":219}]},"tmhm_learnset":"03101E00841B3264","types":[11,11]},{"abilities":[52,75],"address":3305872,"base_stats":[43,80,65,35,50,35],"catch_rate":205,"evolutions":[{"method":"LEVEL","param":30,"species":327}],"friendship":70,"id":326,"learnset":{"address":3315974,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":32,"move_id":269},{"level":35,"move_id":152},{"level":38,"move_id":14},{"level":44,"move_id":12}]},"tmhm_learnset":"01B41EC8CC133A64","types":[11,11]},{"abilities":[52,75],"address":3305900,"base_stats":[63,120,85,55,90,55],"catch_rate":155,"evolutions":[],"friendship":70,"id":327,"learnset":{"address":3316004,"moves":[{"level":1,"move_id":145},{"level":1,"move_id":106},{"level":1,"move_id":11},{"level":1,"move_id":43},{"level":7,"move_id":106},{"level":10,"move_id":11},{"level":13,"move_id":43},{"level":20,"move_id":61},{"level":23,"move_id":182},{"level":26,"move_id":282},{"level":34,"move_id":269},{"level":39,"move_id":152},{"level":44,"move_id":14},{"level":52,"move_id":12}]},"tmhm_learnset":"03B41EC8CC137A64","types":[11,17]},{"abilities":[33,0],"address":3305928,"base_stats":[20,15,20,80,10,55],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":30,"species":329}],"friendship":70,"id":328,"learnset":{"address":3316034,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":150},{"level":15,"move_id":33},{"level":30,"move_id":175}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[63,0],"address":3305956,"base_stats":[95,60,79,81,100,125],"catch_rate":60,"evolutions":[],"friendship":70,"id":329,"learnset":{"address":3316048,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":55},{"level":5,"move_id":35},{"level":10,"move_id":346},{"level":15,"move_id":287},{"level":20,"move_id":352},{"level":25,"move_id":239},{"level":30,"move_id":105},{"level":35,"move_id":240},{"level":40,"move_id":56},{"level":45,"move_id":213},{"level":50,"move_id":219}]},"tmhm_learnset":"03101E00845B7264","types":[11,11]},{"abilities":[24,0],"address":3305984,"base_stats":[45,90,20,65,65,20],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":30,"species":331}],"friendship":35,"id":330,"learnset":{"address":3316078,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":31,"move_id":36},{"level":37,"move_id":207},{"level":43,"move_id":97}]},"tmhm_learnset":"03103F0084133A64","types":[11,17]},{"abilities":[24,0],"address":3306012,"base_stats":[70,120,40,95,95,40],"catch_rate":60,"evolutions":[],"friendship":35,"id":331,"learnset":{"address":3316104,"moves":[{"level":1,"move_id":43},{"level":1,"move_id":44},{"level":1,"move_id":99},{"level":1,"move_id":116},{"level":7,"move_id":99},{"level":13,"move_id":116},{"level":16,"move_id":184},{"level":22,"move_id":242},{"level":28,"move_id":103},{"level":33,"move_id":163},{"level":38,"move_id":269},{"level":43,"move_id":207},{"level":48,"move_id":130},{"level":53,"move_id":97}]},"tmhm_learnset":"03B03F4086137A74","types":[11,17]},{"abilities":[52,71],"address":3306040,"base_stats":[45,100,45,10,45,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":333}],"friendship":70,"id":332,"learnset":{"address":3316134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":44},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":41,"move_id":91},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A01E508E354620","types":[4,4]},{"abilities":[26,26],"address":3306068,"base_stats":[50,70,50,70,50,50],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":45,"species":334}],"friendship":70,"id":333,"learnset":{"address":3316158,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":49,"move_id":201},{"level":57,"move_id":63}]},"tmhm_learnset":"00A85E508E354620","types":[4,16]},{"abilities":[26,26],"address":3306096,"base_stats":[80,100,80,100,80,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":334,"learnset":{"address":3316184,"moves":[{"level":1,"move_id":44},{"level":1,"move_id":28},{"level":1,"move_id":185},{"level":1,"move_id":328},{"level":9,"move_id":28},{"level":17,"move_id":185},{"level":25,"move_id":328},{"level":33,"move_id":242},{"level":35,"move_id":225},{"level":41,"move_id":103},{"level":53,"move_id":201},{"level":65,"move_id":63}]},"tmhm_learnset":"00A85E748E754622","types":[4,16]},{"abilities":[47,62],"address":3306124,"base_stats":[72,60,30,25,20,30],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":24,"species":336}],"friendship":70,"id":335,"learnset":{"address":3316210,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":28,"move_id":282},{"level":31,"move_id":265},{"level":37,"move_id":187},{"level":40,"move_id":203},{"level":46,"move_id":69},{"level":49,"move_id":179}]},"tmhm_learnset":"00B01E40CE1306A1","types":[1,1]},{"abilities":[47,62],"address":3306152,"base_stats":[144,120,60,50,40,60],"catch_rate":200,"evolutions":[],"friendship":70,"id":336,"learnset":{"address":3316242,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":116},{"level":1,"move_id":28},{"level":1,"move_id":292},{"level":4,"move_id":28},{"level":10,"move_id":292},{"level":13,"move_id":233},{"level":19,"move_id":252},{"level":22,"move_id":18},{"level":29,"move_id":282},{"level":33,"move_id":265},{"level":40,"move_id":187},{"level":44,"move_id":203},{"level":51,"move_id":69},{"level":55,"move_id":179}]},"tmhm_learnset":"00B01E40CE1346A1","types":[1,1]},{"abilities":[9,31],"address":3306180,"base_stats":[40,45,40,65,65,40],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":26,"species":338}],"friendship":70,"id":337,"learnset":{"address":3316274,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":28,"move_id":46},{"level":33,"move_id":44},{"level":36,"move_id":87},{"level":41,"move_id":268}]},"tmhm_learnset":"00603E0285D30230","types":[13,13]},{"abilities":[9,31],"address":3306208,"base_stats":[70,75,60,105,105,60],"catch_rate":45,"evolutions":[],"friendship":70,"id":338,"learnset":{"address":3316304,"moves":[{"level":1,"move_id":86},{"level":1,"move_id":43},{"level":1,"move_id":336},{"level":1,"move_id":33},{"level":4,"move_id":86},{"level":9,"move_id":43},{"level":12,"move_id":336},{"level":17,"move_id":98},{"level":20,"move_id":209},{"level":25,"move_id":316},{"level":31,"move_id":46},{"level":39,"move_id":44},{"level":45,"move_id":87},{"level":53,"move_id":268}]},"tmhm_learnset":"00603E0285D34230","types":[13,13]},{"abilities":[12,0],"address":3306236,"base_stats":[60,60,40,35,65,45],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":33,"species":340}],"friendship":70,"id":339,"learnset":{"address":3316334,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":35,"move_id":89},{"level":41,"move_id":53},{"level":49,"move_id":38}]},"tmhm_learnset":"00A21E748E110620","types":[10,4]},{"abilities":[40,0],"address":3306264,"base_stats":[70,100,70,40,105,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":340,"learnset":{"address":3316360,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":33},{"level":1,"move_id":52},{"level":1,"move_id":222},{"level":11,"move_id":52},{"level":19,"move_id":222},{"level":25,"move_id":116},{"level":29,"move_id":36},{"level":31,"move_id":133},{"level":33,"move_id":157},{"level":37,"move_id":89},{"level":45,"move_id":284},{"level":55,"move_id":90}]},"tmhm_learnset":"00A21E748E114630","types":[10,4]},{"abilities":[47,0],"address":3306292,"base_stats":[70,40,50,25,55,50],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":342}],"friendship":70,"id":341,"learnset":{"address":3316388,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":59},{"level":49,"move_id":329}]},"tmhm_learnset":"03B01E4086533264","types":[15,11]},{"abilities":[47,0],"address":3306320,"base_stats":[90,60,70,45,75,70],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":44,"species":343}],"friendship":70,"id":342,"learnset":{"address":3316416,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":47,"move_id":59},{"level":55,"move_id":329}]},"tmhm_learnset":"03B01E4086533274","types":[15,11]},{"abilities":[47,0],"address":3306348,"base_stats":[110,80,90,65,95,90],"catch_rate":45,"evolutions":[],"friendship":70,"id":343,"learnset":{"address":3316444,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":45},{"level":1,"move_id":55},{"level":1,"move_id":227},{"level":7,"move_id":227},{"level":13,"move_id":301},{"level":19,"move_id":34},{"level":25,"move_id":62},{"level":31,"move_id":258},{"level":39,"move_id":156},{"level":39,"move_id":173},{"level":50,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"03B01E4086537274","types":[15,11]},{"abilities":[8,0],"address":3306376,"base_stats":[50,85,40,35,85,40],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":32,"species":345}],"friendship":35,"id":344,"learnset":{"address":3316472,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":33,"move_id":191},{"level":37,"move_id":302},{"level":41,"move_id":178},{"level":45,"move_id":201}]},"tmhm_learnset":"00441E1084350721","types":[12,12]},{"abilities":[8,0],"address":3306404,"base_stats":[70,115,60,55,115,60],"catch_rate":60,"evolutions":[],"friendship":35,"id":345,"learnset":{"address":3316504,"moves":[{"level":1,"move_id":40},{"level":1,"move_id":43},{"level":1,"move_id":71},{"level":1,"move_id":74},{"level":5,"move_id":71},{"level":9,"move_id":74},{"level":13,"move_id":73},{"level":17,"move_id":28},{"level":21,"move_id":42},{"level":25,"move_id":275},{"level":29,"move_id":185},{"level":35,"move_id":191},{"level":41,"move_id":302},{"level":47,"move_id":178},{"level":53,"move_id":201}]},"tmhm_learnset":"00641E1084354721","types":[12,17]},{"abilities":[39,0],"address":3306432,"base_stats":[50,50,50,50,50,50],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":42,"species":347}],"friendship":70,"id":346,"learnset":{"address":3316536,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":37,"move_id":258},{"level":43,"move_id":59}]},"tmhm_learnset":"00401E00A41BB264","types":[15,15]},{"abilities":[39,0],"address":3306460,"base_stats":[80,80,80,80,80,80],"catch_rate":75,"evolutions":[],"friendship":70,"id":347,"learnset":{"address":3316564,"moves":[{"level":1,"move_id":181},{"level":1,"move_id":43},{"level":1,"move_id":104},{"level":1,"move_id":44},{"level":7,"move_id":104},{"level":10,"move_id":44},{"level":16,"move_id":196},{"level":19,"move_id":29},{"level":25,"move_id":182},{"level":28,"move_id":242},{"level":34,"move_id":58},{"level":42,"move_id":258},{"level":53,"move_id":59},{"level":61,"move_id":329}]},"tmhm_learnset":"00401F00A61BFA64","types":[15,15]},{"abilities":[26,0],"address":3306488,"base_stats":[70,55,65,70,95,85],"catch_rate":45,"evolutions":[],"friendship":70,"id":348,"learnset":{"address":3316594,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":95},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":94},{"level":43,"move_id":248},{"level":49,"move_id":153}]},"tmhm_learnset":"00408E51B61BD228","types":[5,14]},{"abilities":[26,0],"address":3306516,"base_stats":[70,95,85,70,55,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":349,"learnset":{"address":3316620,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":7,"move_id":93},{"level":13,"move_id":88},{"level":19,"move_id":83},{"level":25,"move_id":149},{"level":31,"move_id":322},{"level":37,"move_id":157},{"level":43,"move_id":76},{"level":49,"move_id":153}]},"tmhm_learnset":"00428E75B639C628","types":[5,14]},{"abilities":[47,37],"address":3306544,"base_stats":[50,20,40,20,20,40],"catch_rate":150,"evolutions":[{"method":"FRIENDSHIP","param":0,"species":183}],"friendship":70,"id":350,"learnset":{"address":3316646,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":145},{"level":1,"move_id":150},{"level":3,"move_id":204},{"level":6,"move_id":39},{"level":10,"move_id":145},{"level":15,"move_id":21},{"level":21,"move_id":55}]},"tmhm_learnset":"01101E0084533264","types":[0,0]},{"abilities":[47,20],"address":3306572,"base_stats":[60,25,35,60,70,80],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":32,"species":352}],"friendship":70,"id":351,"learnset":{"address":3316666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":1,"move_id":150},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":34,"move_id":94},{"level":37,"move_id":156},{"level":37,"move_id":173},{"level":43,"move_id":340}]},"tmhm_learnset":"0041BF03B4538E28","types":[14,14]},{"abilities":[47,20],"address":3306600,"base_stats":[80,45,65,80,90,110],"catch_rate":60,"evolutions":[],"friendship":70,"id":352,"learnset":{"address":3316696,"moves":[{"level":1,"move_id":150},{"level":1,"move_id":149},{"level":1,"move_id":316},{"level":1,"move_id":60},{"level":7,"move_id":149},{"level":10,"move_id":316},{"level":16,"move_id":60},{"level":19,"move_id":244},{"level":25,"move_id":109},{"level":28,"move_id":277},{"level":37,"move_id":94},{"level":43,"move_id":156},{"level":43,"move_id":173},{"level":55,"move_id":340}]},"tmhm_learnset":"0041BF03B453CE29","types":[14,14]},{"abilities":[57,0],"address":3306628,"base_stats":[60,50,40,95,85,75],"catch_rate":200,"evolutions":[],"friendship":70,"id":353,"learnset":{"address":3316726,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":313},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[58,0],"address":3306656,"base_stats":[60,40,50,95,75,85],"catch_rate":200,"evolutions":[],"friendship":70,"id":354,"learnset":{"address":3316756,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":98},{"level":1,"move_id":45},{"level":4,"move_id":86},{"level":10,"move_id":98},{"level":13,"move_id":270},{"level":19,"move_id":209},{"level":22,"move_id":227},{"level":28,"move_id":204},{"level":31,"move_id":268},{"level":37,"move_id":87},{"level":40,"move_id":226},{"level":47,"move_id":97}]},"tmhm_learnset":"00401E0285D38220","types":[13,13]},{"abilities":[52,22],"address":3306684,"base_stats":[50,85,85,50,55,55],"catch_rate":45,"evolutions":[],"friendship":70,"id":355,"learnset":{"address":3316786,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":6,"move_id":313},{"level":11,"move_id":44},{"level":16,"move_id":230},{"level":21,"move_id":11},{"level":26,"move_id":185},{"level":31,"move_id":226},{"level":36,"move_id":242},{"level":41,"move_id":334},{"level":46,"move_id":254},{"level":46,"move_id":256},{"level":46,"move_id":255}]},"tmhm_learnset":"00A01F7CC4335E21","types":[8,8]},{"abilities":[74,0],"address":3306712,"base_stats":[30,40,55,60,40,55],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":37,"species":357}],"friendship":70,"id":356,"learnset":{"address":3316818,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":117},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":38,"move_id":244},{"level":42,"move_id":179},{"level":48,"move_id":105}]},"tmhm_learnset":"00E01E41F41386A9","types":[1,14]},{"abilities":[74,0],"address":3306740,"base_stats":[60,60,75,80,60,75],"catch_rate":90,"evolutions":[],"friendship":70,"id":357,"learnset":{"address":3316848,"moves":[{"level":1,"move_id":7},{"level":1,"move_id":9},{"level":1,"move_id":8},{"level":1,"move_id":117},{"level":1,"move_id":96},{"level":1,"move_id":93},{"level":1,"move_id":197},{"level":4,"move_id":96},{"level":9,"move_id":93},{"level":12,"move_id":197},{"level":18,"move_id":237},{"level":22,"move_id":170},{"level":28,"move_id":347},{"level":32,"move_id":136},{"level":40,"move_id":244},{"level":46,"move_id":179},{"level":54,"move_id":105}]},"tmhm_learnset":"00E01E41F413C6A9","types":[1,14]},{"abilities":[30,0],"address":3306768,"base_stats":[45,40,60,50,40,75],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":35,"species":359}],"friendship":70,"id":358,"learnset":{"address":3316884,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":38,"move_id":119},{"level":41,"move_id":287},{"level":48,"move_id":195}]},"tmhm_learnset":"00087E80843B1620","types":[0,2]},{"abilities":[30,0],"address":3306796,"base_stats":[75,70,90,80,70,105],"catch_rate":45,"evolutions":[],"friendship":70,"id":359,"learnset":{"address":3316912,"moves":[{"level":1,"move_id":64},{"level":1,"move_id":45},{"level":1,"move_id":310},{"level":1,"move_id":47},{"level":8,"move_id":310},{"level":11,"move_id":47},{"level":18,"move_id":31},{"level":21,"move_id":219},{"level":28,"move_id":54},{"level":31,"move_id":36},{"level":35,"move_id":225},{"level":40,"move_id":349},{"level":45,"move_id":287},{"level":54,"move_id":195},{"level":59,"move_id":143}]},"tmhm_learnset":"00887EA4867B5632","types":[16,2]},{"abilities":[23,0],"address":3306824,"base_stats":[95,23,48,23,23,48],"catch_rate":125,"evolutions":[{"method":"LEVEL","param":15,"species":202}],"friendship":70,"id":360,"learnset":{"address":3316944,"moves":[{"level":1,"move_id":68},{"level":1,"move_id":150},{"level":1,"move_id":204},{"level":1,"move_id":227},{"level":15,"move_id":68},{"level":15,"move_id":243},{"level":15,"move_id":219},{"level":15,"move_id":194}]},"tmhm_learnset":"0000000000000000","types":[14,14]},{"abilities":[26,0],"address":3306852,"base_stats":[20,40,90,25,30,90],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":37,"species":362}],"friendship":35,"id":361,"learnset":{"address":3316962,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":38,"move_id":261},{"level":45,"move_id":212},{"level":49,"move_id":248}]},"tmhm_learnset":"0041BF00B4133E28","types":[7,7]},{"abilities":[46,0],"address":3306880,"base_stats":[40,70,130,25,60,130],"catch_rate":90,"evolutions":[],"friendship":35,"id":362,"learnset":{"address":3316990,"moves":[{"level":1,"move_id":20},{"level":1,"move_id":43},{"level":1,"move_id":101},{"level":1,"move_id":50},{"level":5,"move_id":50},{"level":12,"move_id":193},{"level":16,"move_id":310},{"level":23,"move_id":109},{"level":27,"move_id":228},{"level":34,"move_id":174},{"level":37,"move_id":325},{"level":41,"move_id":261},{"level":51,"move_id":212},{"level":58,"move_id":248}]},"tmhm_learnset":"00E1BF40B6137E29","types":[7,7]},{"abilities":[30,38],"address":3306908,"base_stats":[50,60,45,65,100,80],"catch_rate":150,"evolutions":[],"friendship":70,"id":363,"learnset":{"address":3317020,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":71},{"level":5,"move_id":74},{"level":9,"move_id":40},{"level":13,"move_id":78},{"level":17,"move_id":72},{"level":21,"move_id":73},{"level":25,"move_id":345},{"level":29,"move_id":320},{"level":33,"move_id":202},{"level":37,"move_id":230},{"level":41,"move_id":275},{"level":45,"move_id":92},{"level":49,"move_id":80},{"level":53,"move_id":312},{"level":57,"move_id":235}]},"tmhm_learnset":"00441E08A4350720","types":[12,3]},{"abilities":[54,0],"address":3306936,"base_stats":[60,60,60,30,35,35],"catch_rate":255,"evolutions":[{"method":"LEVEL","param":18,"species":365}],"friendship":70,"id":364,"learnset":{"address":3317058,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E5B336A5","types":[0,0]},{"abilities":[72,0],"address":3306964,"base_stats":[80,80,80,90,55,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":36,"species":366}],"friendship":70,"id":365,"learnset":{"address":3317082,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":116},{"level":1,"move_id":227},{"level":1,"move_id":253},{"level":7,"move_id":227},{"level":13,"move_id":253},{"level":19,"move_id":154},{"level":25,"move_id":203},{"level":31,"move_id":163},{"level":37,"move_id":68},{"level":43,"move_id":264},{"level":49,"move_id":179}]},"tmhm_learnset":"00A41EA6E7B33EB5","types":[0,0]},{"abilities":[54,0],"address":3306992,"base_stats":[150,160,100,100,95,65],"catch_rate":45,"evolutions":[],"friendship":70,"id":366,"learnset":{"address":3317108,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":281},{"level":1,"move_id":227},{"level":1,"move_id":303},{"level":7,"move_id":227},{"level":13,"move_id":303},{"level":19,"move_id":185},{"level":25,"move_id":133},{"level":31,"move_id":343},{"level":36,"move_id":207},{"level":37,"move_id":68},{"level":43,"move_id":175}]},"tmhm_learnset":"00A41EA6E7B37EB5","types":[0,0]},{"abilities":[64,60],"address":3307020,"base_stats":[70,43,53,40,43,53],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":26,"species":368}],"friendship":70,"id":367,"learnset":{"address":3317134,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":28,"move_id":92},{"level":34,"move_id":254},{"level":34,"move_id":255},{"level":34,"move_id":256},{"level":39,"move_id":188}]},"tmhm_learnset":"00A11E0AA4371724","types":[3,3]},{"abilities":[64,60],"address":3307048,"base_stats":[100,73,83,55,73,83],"catch_rate":75,"evolutions":[],"friendship":70,"id":368,"learnset":{"address":3317164,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":281},{"level":1,"move_id":139},{"level":1,"move_id":124},{"level":6,"move_id":281},{"level":9,"move_id":139},{"level":14,"move_id":124},{"level":17,"move_id":133},{"level":23,"move_id":227},{"level":26,"move_id":34},{"level":31,"move_id":92},{"level":40,"move_id":254},{"level":40,"move_id":255},{"level":40,"move_id":256},{"level":48,"move_id":188}]},"tmhm_learnset":"00A11E0AA4375724","types":[3,3]},{"abilities":[34,0],"address":3307076,"base_stats":[99,68,83,51,72,87],"catch_rate":200,"evolutions":[],"friendship":70,"id":369,"learnset":{"address":3317196,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":16},{"level":7,"move_id":74},{"level":11,"move_id":75},{"level":17,"move_id":23},{"level":21,"move_id":230},{"level":27,"move_id":18},{"level":31,"move_id":345},{"level":37,"move_id":34},{"level":41,"move_id":76},{"level":47,"move_id":235}]},"tmhm_learnset":"00EC5E80863D4730","types":[12,2]},{"abilities":[43,0],"address":3307104,"base_stats":[64,51,23,28,51,23],"catch_rate":190,"evolutions":[{"method":"LEVEL","param":20,"species":371}],"friendship":70,"id":370,"learnset":{"address":3317224,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":1},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":21,"move_id":48},{"level":25,"move_id":23},{"level":31,"move_id":103},{"level":35,"move_id":46},{"level":41,"move_id":156},{"level":41,"move_id":214},{"level":45,"move_id":304}]},"tmhm_learnset":"00001E26A4333634","types":[0,0]},{"abilities":[43,0],"address":3307132,"base_stats":[84,71,43,48,71,43],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":40,"species":372}],"friendship":70,"id":371,"learnset":{"address":3317254,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":43,"move_id":46},{"level":51,"move_id":156},{"level":51,"move_id":214},{"level":57,"move_id":304}]},"tmhm_learnset":"00A21F26E6333E34","types":[0,0]},{"abilities":[43,0],"address":3307160,"base_stats":[104,91,63,68,91,63],"catch_rate":45,"evolutions":[],"friendship":70,"id":372,"learnset":{"address":3317284,"moves":[{"level":1,"move_id":1},{"level":1,"move_id":253},{"level":1,"move_id":310},{"level":1,"move_id":336},{"level":5,"move_id":253},{"level":11,"move_id":310},{"level":15,"move_id":336},{"level":23,"move_id":48},{"level":29,"move_id":23},{"level":37,"move_id":103},{"level":40,"move_id":63},{"level":45,"move_id":46},{"level":55,"move_id":156},{"level":55,"move_id":214},{"level":63,"move_id":304}]},"tmhm_learnset":"00A21F26E6337E34","types":[0,0]},{"abilities":[75,0],"address":3307188,"base_stats":[35,64,85,32,74,55],"catch_rate":255,"evolutions":[{"method":"ITEM","param":192,"species":374},{"method":"ITEM","param":193,"species":375}],"friendship":70,"id":373,"learnset":{"address":3317316,"moves":[{"level":1,"move_id":128},{"level":1,"move_id":55},{"level":1,"move_id":250},{"level":1,"move_id":334}]},"tmhm_learnset":"03101E0084133264","types":[11,11]},{"abilities":[33,0],"address":3307216,"base_stats":[55,104,105,52,94,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":374,"learnset":{"address":3317326,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":44},{"level":15,"move_id":103},{"level":22,"move_id":352},{"level":29,"move_id":184},{"level":36,"move_id":242},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03111E4084137264","types":[11,11]},{"abilities":[33,0],"address":3307244,"base_stats":[55,84,105,52,114,75],"catch_rate":60,"evolutions":[],"friendship":70,"id":375,"learnset":{"address":3317350,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":250},{"level":8,"move_id":93},{"level":15,"move_id":97},{"level":22,"move_id":352},{"level":29,"move_id":133},{"level":36,"move_id":94},{"level":43,"move_id":226},{"level":50,"move_id":56}]},"tmhm_learnset":"03101E00B41B7264","types":[11,11]},{"abilities":[46,0],"address":3307272,"base_stats":[65,130,60,75,75,60],"catch_rate":30,"evolutions":[],"friendship":35,"id":376,"learnset":{"address":3317374,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":5,"move_id":43},{"level":9,"move_id":269},{"level":13,"move_id":98},{"level":17,"move_id":13},{"level":21,"move_id":44},{"level":26,"move_id":14},{"level":31,"move_id":104},{"level":36,"move_id":163},{"level":41,"move_id":248},{"level":46,"move_id":195}]},"tmhm_learnset":"00E53FB6A5D37E6C","types":[17,17]},{"abilities":[15,0],"address":3307300,"base_stats":[44,75,35,45,63,33],"catch_rate":225,"evolutions":[{"method":"LEVEL","param":37,"species":378}],"friendship":35,"id":377,"learnset":{"address":3317404,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":282},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":37,"move_id":185},{"level":44,"move_id":247},{"level":49,"move_id":289},{"level":56,"move_id":288}]},"tmhm_learnset":"0041BF02B5930E28","types":[7,7]},{"abilities":[15,0],"address":3307328,"base_stats":[64,115,65,65,83,63],"catch_rate":45,"evolutions":[],"friendship":35,"id":378,"learnset":{"address":3317432,"moves":[{"level":1,"move_id":282},{"level":1,"move_id":103},{"level":1,"move_id":101},{"level":1,"move_id":174},{"level":8,"move_id":103},{"level":13,"move_id":101},{"level":20,"move_id":174},{"level":25,"move_id":180},{"level":32,"move_id":261},{"level":39,"move_id":185},{"level":48,"move_id":247},{"level":55,"move_id":289},{"level":64,"move_id":288}]},"tmhm_learnset":"0041BF02B5934E28","types":[7,7]},{"abilities":[61,0],"address":3307356,"base_stats":[73,100,60,65,100,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":379,"learnset":{"address":3317460,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":7,"move_id":122},{"level":10,"move_id":44},{"level":16,"move_id":342},{"level":19,"move_id":103},{"level":25,"move_id":137},{"level":28,"move_id":242},{"level":34,"move_id":305},{"level":37,"move_id":207},{"level":43,"move_id":114}]},"tmhm_learnset":"00A13E0C8E570E20","types":[3,3]},{"abilities":[17,0],"address":3307384,"base_stats":[73,115,60,90,60,60],"catch_rate":90,"evolutions":[],"friendship":70,"id":380,"learnset":{"address":3317488,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":4,"move_id":43},{"level":7,"move_id":98},{"level":10,"move_id":14},{"level":13,"move_id":210},{"level":19,"move_id":163},{"level":25,"move_id":228},{"level":31,"move_id":306},{"level":37,"move_id":269},{"level":46,"move_id":197},{"level":55,"move_id":206}]},"tmhm_learnset":"00A03EA6EDF73E35","types":[0,0]},{"abilities":[33,69],"address":3307412,"base_stats":[100,90,130,55,45,65],"catch_rate":25,"evolutions":[],"friendship":70,"id":381,"learnset":{"address":3317518,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":8,"move_id":55},{"level":15,"move_id":317},{"level":22,"move_id":281},{"level":29,"move_id":36},{"level":36,"move_id":300},{"level":43,"move_id":246},{"level":50,"move_id":156},{"level":57,"move_id":38},{"level":64,"move_id":56}]},"tmhm_learnset":"03901E50861B726C","types":[11,5]},{"abilities":[5,69],"address":3307440,"base_stats":[50,70,100,30,40,40],"catch_rate":180,"evolutions":[{"method":"LEVEL","param":32,"species":383}],"friendship":35,"id":382,"learnset":{"address":3317546,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":34,"move_id":182},{"level":39,"move_id":319},{"level":44,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307468,"base_stats":[60,90,140,40,50,50],"catch_rate":90,"evolutions":[{"method":"LEVEL","param":42,"species":384}],"friendship":35,"id":383,"learnset":{"address":3317578,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":45,"move_id":319},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41ED28E530634","types":[8,5]},{"abilities":[5,69],"address":3307496,"base_stats":[70,110,180,50,60,60],"catch_rate":45,"evolutions":[],"friendship":35,"id":384,"learnset":{"address":3317610,"moves":[{"level":1,"move_id":33},{"level":1,"move_id":106},{"level":1,"move_id":189},{"level":1,"move_id":29},{"level":4,"move_id":106},{"level":7,"move_id":189},{"level":10,"move_id":29},{"level":13,"move_id":232},{"level":17,"move_id":334},{"level":21,"move_id":46},{"level":25,"move_id":36},{"level":29,"move_id":231},{"level":37,"move_id":182},{"level":50,"move_id":319},{"level":63,"move_id":38}]},"tmhm_learnset":"00B41EF6CFF37E37","types":[8,5]},{"abilities":[59,0],"address":3307524,"base_stats":[70,70,70,70,70,70],"catch_rate":45,"evolutions":[],"friendship":70,"id":385,"learnset":{"address":3317642,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":10,"move_id":55},{"level":10,"move_id":52},{"level":10,"move_id":181},{"level":20,"move_id":240},{"level":20,"move_id":241},{"level":20,"move_id":258},{"level":30,"move_id":311}]},"tmhm_learnset":"00403E36A5B33664","types":[0,0]},{"abilities":[35,68],"address":3307552,"base_stats":[65,73,55,85,47,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":386,"learnset":{"address":3317666,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":109},{"level":9,"move_id":104},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":294},{"level":25,"move_id":324},{"level":29,"move_id":182},{"level":33,"move_id":270},{"level":37,"move_id":38}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[12,0],"address":3307580,"base_stats":[65,47,55,85,73,75],"catch_rate":150,"evolutions":[],"friendship":70,"id":387,"learnset":{"address":3317694,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":33},{"level":5,"move_id":230},{"level":9,"move_id":204},{"level":13,"move_id":236},{"level":17,"move_id":98},{"level":21,"move_id":273},{"level":25,"move_id":227},{"level":29,"move_id":260},{"level":33,"move_id":270},{"level":37,"move_id":343}]},"tmhm_learnset":"00403E82E5B78625","types":[6,6]},{"abilities":[21,0],"address":3307608,"base_stats":[66,41,77,23,61,87],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":389}],"friendship":70,"id":388,"learnset":{"address":3317722,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":310},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":43,"move_id":246},{"level":50,"move_id":254},{"level":50,"move_id":255},{"level":50,"move_id":256}]},"tmhm_learnset":"00001E1884350720","types":[5,12]},{"abilities":[21,0],"address":3307636,"base_stats":[86,81,97,43,81,107],"catch_rate":45,"evolutions":[],"friendship":70,"id":389,"learnset":{"address":3317750,"moves":[{"level":1,"move_id":310},{"level":1,"move_id":132},{"level":1,"move_id":51},{"level":1,"move_id":275},{"level":8,"move_id":132},{"level":15,"move_id":51},{"level":22,"move_id":275},{"level":29,"move_id":109},{"level":36,"move_id":133},{"level":48,"move_id":246},{"level":60,"move_id":254},{"level":60,"move_id":255},{"level":60,"move_id":256}]},"tmhm_learnset":"00A01E5886354720","types":[5,12]},{"abilities":[4,0],"address":3307664,"base_stats":[45,95,50,75,40,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":40,"species":391}],"friendship":70,"id":390,"learnset":{"address":3317778,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":10},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":43,"move_id":210},{"level":49,"move_id":163},{"level":55,"move_id":350}]},"tmhm_learnset":"00841ED0CC110624","types":[5,6]},{"abilities":[4,0],"address":3307692,"base_stats":[75,125,100,45,70,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":391,"learnset":{"address":3317806,"moves":[{"level":1,"move_id":10},{"level":1,"move_id":106},{"level":1,"move_id":300},{"level":1,"move_id":55},{"level":7,"move_id":106},{"level":13,"move_id":300},{"level":19,"move_id":55},{"level":25,"move_id":232},{"level":31,"move_id":182},{"level":37,"move_id":246},{"level":46,"move_id":210},{"level":55,"move_id":163},{"level":64,"move_id":350}]},"tmhm_learnset":"00A41ED0CE514624","types":[5,6]},{"abilities":[28,36],"address":3307720,"base_stats":[28,25,25,40,45,35],"catch_rate":235,"evolutions":[{"method":"LEVEL","param":20,"species":393}],"friendship":35,"id":392,"learnset":{"address":3317834,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":93},{"level":1,"move_id":45},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":31,"move_id":286},{"level":36,"move_id":248},{"level":41,"move_id":95},{"level":46,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307748,"base_stats":[38,35,35,50,65,55],"catch_rate":120,"evolutions":[{"method":"LEVEL","param":30,"species":394}],"friendship":35,"id":393,"learnset":{"address":3317862,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":40,"move_id":248},{"level":47,"move_id":95},{"level":54,"move_id":138}]},"tmhm_learnset":"0041BF03B49B8E28","types":[14,14]},{"abilities":[28,36],"address":3307776,"base_stats":[68,65,65,80,125,115],"catch_rate":45,"evolutions":[],"friendship":35,"id":394,"learnset":{"address":3317890,"moves":[{"level":1,"move_id":45},{"level":1,"move_id":93},{"level":1,"move_id":104},{"level":1,"move_id":100},{"level":6,"move_id":93},{"level":11,"move_id":104},{"level":16,"move_id":100},{"level":21,"move_id":347},{"level":26,"move_id":94},{"level":33,"move_id":286},{"level":42,"move_id":248},{"level":51,"move_id":95},{"level":60,"move_id":138}]},"tmhm_learnset":"0041BF03B49BCE28","types":[14,14]},{"abilities":[69,0],"address":3307804,"base_stats":[45,75,60,50,40,30],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":30,"species":396}],"friendship":35,"id":395,"learnset":{"address":3317918,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":99},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":33,"move_id":225},{"level":37,"move_id":184},{"level":41,"move_id":242},{"level":49,"move_id":337},{"level":53,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[69,0],"address":3307832,"base_stats":[65,95,100,50,60,50],"catch_rate":45,"evolutions":[{"method":"LEVEL","param":50,"species":397}],"friendship":35,"id":396,"learnset":{"address":3317948,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":56,"move_id":242},{"level":69,"move_id":337},{"level":78,"move_id":38}]},"tmhm_learnset":"00A41EE4C4130632","types":[16,16]},{"abilities":[22,0],"address":3307860,"base_stats":[95,135,80,100,110,80],"catch_rate":45,"evolutions":[],"friendship":35,"id":397,"learnset":{"address":3317980,"moves":[{"level":1,"move_id":99},{"level":1,"move_id":44},{"level":1,"move_id":43},{"level":1,"move_id":29},{"level":5,"move_id":44},{"level":9,"move_id":43},{"level":17,"move_id":29},{"level":21,"move_id":116},{"level":25,"move_id":52},{"level":30,"move_id":182},{"level":38,"move_id":225},{"level":47,"move_id":184},{"level":50,"move_id":19},{"level":61,"move_id":242},{"level":79,"move_id":337},{"level":93,"move_id":38}]},"tmhm_learnset":"00AC5EE4C6534632","types":[16,2]},{"abilities":[29,0],"address":3307888,"base_stats":[40,55,80,30,35,60],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":20,"species":399}],"friendship":35,"id":398,"learnset":{"address":3318014,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36}]},"tmhm_learnset":"0000000000000000","types":[8,14]},{"abilities":[29,0],"address":3307916,"base_stats":[60,75,100,50,55,80],"catch_rate":3,"evolutions":[{"method":"LEVEL","param":45,"species":400}],"friendship":35,"id":399,"learnset":{"address":3318024,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":36},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":50,"move_id":309},{"level":56,"move_id":97},{"level":62,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307944,"base_stats":[80,135,130,70,95,90],"catch_rate":3,"evolutions":[],"friendship":35,"id":400,"learnset":{"address":3318052,"moves":[{"level":1,"move_id":36},{"level":1,"move_id":93},{"level":1,"move_id":232},{"level":1,"move_id":184},{"level":20,"move_id":93},{"level":20,"move_id":232},{"level":26,"move_id":184},{"level":32,"move_id":228},{"level":38,"move_id":94},{"level":44,"move_id":334},{"level":55,"move_id":309},{"level":66,"move_id":97},{"level":77,"move_id":63}]},"tmhm_learnset":"00E40ED9F613C620","types":[8,14]},{"abilities":[29,0],"address":3307972,"base_stats":[80,100,200,50,50,100],"catch_rate":3,"evolutions":[],"friendship":35,"id":401,"learnset":{"address":3318080,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":88},{"level":1,"move_id":153},{"level":9,"move_id":88},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E52CF994621","types":[5,5]},{"abilities":[29,0],"address":3308000,"base_stats":[80,50,100,50,100,200],"catch_rate":3,"evolutions":[],"friendship":35,"id":402,"learnset":{"address":3318106,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":196},{"level":1,"move_id":153},{"level":9,"move_id":196},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00E02C79B7261","types":[15,15]},{"abilities":[29,0],"address":3308028,"base_stats":[80,75,150,50,75,150],"catch_rate":3,"evolutions":[],"friendship":35,"id":403,"learnset":{"address":3318132,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":232},{"level":1,"move_id":153},{"level":9,"move_id":232},{"level":17,"move_id":174},{"level":25,"move_id":276},{"level":33,"move_id":246},{"level":41,"move_id":334},{"level":41,"move_id":133},{"level":49,"move_id":192},{"level":57,"move_id":199},{"level":65,"move_id":63}]},"tmhm_learnset":"00A00ED2C79B4621","types":[8,8]},{"abilities":[2,0],"address":3308056,"base_stats":[100,100,90,90,150,140],"catch_rate":5,"evolutions":[],"friendship":0,"id":404,"learnset":{"address":3318160,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":352},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":34},{"level":30,"move_id":347},{"level":35,"move_id":58},{"level":45,"move_id":56},{"level":50,"move_id":156},{"level":60,"move_id":329},{"level":65,"move_id":38},{"level":75,"move_id":323}]},"tmhm_learnset":"03B00E42C79B727C","types":[11,11]},{"abilities":[70,0],"address":3308084,"base_stats":[100,150,140,90,100,90],"catch_rate":5,"evolutions":[],"friendship":0,"id":405,"learnset":{"address":3318190,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":341},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":163},{"level":30,"move_id":339},{"level":35,"move_id":89},{"level":45,"move_id":126},{"level":50,"move_id":156},{"level":60,"move_id":90},{"level":65,"move_id":76},{"level":75,"move_id":284}]},"tmhm_learnset":"00A60EF6CFF946B2","types":[4,4]},{"abilities":[77,0],"address":3308112,"base_stats":[105,150,90,95,150,90],"catch_rate":3,"evolutions":[],"friendship":0,"id":406,"learnset":{"address":3318220,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":239},{"level":5,"move_id":184},{"level":15,"move_id":246},{"level":20,"move_id":337},{"level":30,"move_id":349},{"level":35,"move_id":242},{"level":45,"move_id":19},{"level":50,"move_id":156},{"level":60,"move_id":245},{"level":65,"move_id":200},{"level":75,"move_id":63}]},"tmhm_learnset":"03BA0EB6C7F376B6","types":[16,2]},{"abilities":[26,0],"address":3308140,"base_stats":[80,80,90,110,110,130],"catch_rate":3,"evolutions":[],"friendship":90,"id":407,"learnset":{"address":3318250,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":273},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":346},{"level":30,"move_id":287},{"level":35,"move_id":296},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":204}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[26,0],"address":3308168,"base_stats":[80,90,80,110,130,110],"catch_rate":3,"evolutions":[],"friendship":90,"id":408,"learnset":{"address":3318280,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":149},{"level":5,"move_id":262},{"level":10,"move_id":270},{"level":15,"move_id":219},{"level":20,"move_id":225},{"level":25,"move_id":182},{"level":30,"move_id":287},{"level":35,"move_id":295},{"level":40,"move_id":94},{"level":45,"move_id":105},{"level":50,"move_id":349}]},"tmhm_learnset":"035C5E93B7BBD63E","types":[16,14]},{"abilities":[32,0],"address":3308196,"base_stats":[100,100,100,100,100,100],"catch_rate":3,"evolutions":[],"friendship":100,"id":409,"learnset":{"address":3318310,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":273},{"level":1,"move_id":93},{"level":5,"move_id":156},{"level":10,"move_id":129},{"level":15,"move_id":270},{"level":20,"move_id":94},{"level":25,"move_id":287},{"level":30,"move_id":156},{"level":35,"move_id":38},{"level":40,"move_id":248},{"level":45,"move_id":322},{"level":50,"move_id":353}]},"tmhm_learnset":"00408E93B59BC62C","types":[8,14]},{"abilities":[46,0],"address":3308224,"base_stats":[50,150,50,150,150,50],"catch_rate":3,"evolutions":[],"friendship":0,"id":410,"learnset":{"address":3318340,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":43},{"level":1,"move_id":35},{"level":5,"move_id":101},{"level":10,"move_id":104},{"level":15,"move_id":282},{"level":20,"move_id":228},{"level":25,"move_id":94},{"level":30,"move_id":129},{"level":35,"move_id":97},{"level":40,"move_id":105},{"level":45,"move_id":354},{"level":50,"move_id":245}]},"tmhm_learnset":"00E58FC3F5BBDE2D","types":[14,14]},{"abilities":[26,0],"address":3308252,"base_stats":[65,50,70,65,95,80],"catch_rate":45,"evolutions":[],"friendship":70,"id":411,"learnset":{"address":3318370,"moves":[{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":0},{"level":1,"move_id":35},{"level":6,"move_id":45},{"level":9,"move_id":310},{"level":14,"move_id":93},{"level":17,"move_id":36},{"level":22,"move_id":253},{"level":25,"move_id":281},{"level":30,"move_id":149},{"level":33,"move_id":38},{"level":38,"move_id":215},{"level":41,"move_id":219},{"level":46,"move_id":94}]},"tmhm_learnset":"00419F03B41B8E28","types":[14,14]}],"tmhm_moves":[264,337,352,347,46,92,258,339,331,237,241,269,58,59,63,113,182,240,202,219,218,76,231,85,87,89,216,91,94,247,280,104,115,351,53,188,201,126,317,332,259,263,290,156,213,168,211,285,289,315,15,19,57,70,148,249,127,291],"trainers":[{"address":3230072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[],"party_address":4160749568,"script_address":0},{"address":3230112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":74}],"party_address":3211124,"script_address":2304511},{"address":3230152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":286}],"party_address":3211132,"script_address":2321901},{"address":3230192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":330}],"party_address":3211140,"script_address":2323326},{"address":3230232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211156,"script_address":2323373},{"address":3230272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211164,"script_address":2324386},{"address":3230312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":286}],"party_address":3211172,"script_address":2326808},{"address":3230352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211180,"script_address":2326839},{"address":3230392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":41}],"party_address":3211188,"script_address":2328040},{"address":3230432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":315},{"level":26,"species":286},{"level":26,"species":288},{"level":26,"species":295},{"level":26,"species":298},{"level":26,"species":304}],"party_address":3211196,"script_address":2314251},{"address":3230472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":286}],"party_address":3211244,"script_address":0},{"address":3230512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":300}],"party_address":3211252,"script_address":2067580},{"address":3230552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":310},{"level":30,"species":178}],"party_address":3211268,"script_address":2068523},{"address":3230592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":380},{"level":30,"species":379}],"party_address":3211284,"script_address":2068554},{"address":3230632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":330}],"party_address":3211300,"script_address":2328071},{"address":3230672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3211308,"script_address":2069620},{"address":3230712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":286}],"party_address":3211316,"script_address":0},{"address":3230752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3211324,"script_address":2570959},{"address":3230792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":286},{"level":27,"species":330}],"party_address":3211340,"script_address":2572093},{"address":3230832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":286},{"level":26,"species":41},{"level":26,"species":330}],"party_address":3211356,"script_address":2572124},{"address":3230872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":330}],"party_address":3211380,"script_address":2157889},{"address":3230912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":41},{"level":14,"species":330}],"party_address":3211388,"script_address":2157948},{"address":3230952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":339}],"party_address":3211404,"script_address":2254636},{"address":3230992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211412,"script_address":2317522},{"address":3231032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211420,"script_address":2317553},{"address":3231072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":286},{"level":30,"species":330}],"party_address":3211428,"script_address":2317584},{"address":3231112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330}],"party_address":3211444,"script_address":2570990},{"address":3231152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3211452,"script_address":2323414},{"address":3231192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3211460,"script_address":2324427},{"address":3231232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":335},{"level":30,"species":67}],"party_address":3211468,"script_address":2068492},{"address":3231272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":287},{"level":34,"species":42}],"party_address":3211484,"script_address":2324250},{"address":3231312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":336}],"party_address":3211500,"script_address":2312702},{"address":3231352,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":330},{"level":28,"species":287}],"party_address":3211508,"script_address":2572155},{"address":3231392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":331},{"level":37,"species":287}],"party_address":3211524,"script_address":2327156},{"address":3231432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":287},{"level":41,"species":169},{"level":43,"species":331}],"party_address":3211540,"script_address":2328478},{"address":3231472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":351}],"party_address":3211564,"script_address":2312671},{"address":3231512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211572,"script_address":2026085},{"address":3231552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":363},{"level":14,"species":306},{"level":14,"species":363}],"party_address":3211588,"script_address":2058784},{"address":3231592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,0,0,0],"species":357},{"level":43,"moves":[29,89,0,0],"species":319}],"party_address":3211612,"script_address":2335547},{"address":3231632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":363},{"level":26,"species":44}],"party_address":3211644,"script_address":2068148},{"address":3231672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":363}],"party_address":3211660,"script_address":0},{"address":3231712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":306},{"level":28,"species":44},{"level":28,"species":363}],"party_address":3211676,"script_address":0},{"address":3231752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":306},{"level":31,"species":44},{"level":31,"species":363}],"party_address":3211700,"script_address":0},{"address":3231792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307},{"level":34,"species":44},{"level":34,"species":363}],"party_address":3211724,"script_address":0},{"address":3231832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,163,28,40],"species":28}],"party_address":3211748,"script_address":2046490},{"address":3231872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[60,120,201,246],"species":318},{"level":27,"moves":[91,163,28,40],"species":27},{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211764,"script_address":2065682},{"address":3231912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[91,163,28,40],"species":27},{"level":25,"moves":[91,163,28,40],"species":28}],"party_address":3211812,"script_address":2033540},{"address":3231952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[91,163,28,40],"species":28}],"party_address":3211844,"script_address":0},{"address":3231992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[91,163,28,40],"species":28}],"party_address":3211860,"script_address":0},{"address":3232032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[91,163,28,40],"species":28}],"party_address":3211876,"script_address":0},{"address":3232072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[91,163,28,40],"species":28}],"party_address":3211892,"script_address":0},{"address":3232112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":81},{"level":17,"species":370}],"party_address":3211908,"script_address":0},{"address":3232152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":81},{"level":27,"species":371}],"party_address":3211924,"script_address":0},{"address":3232192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":82},{"level":30,"species":371}],"party_address":3211940,"script_address":0},{"address":3232232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":82},{"level":33,"species":371}],"party_address":3211956,"script_address":0},{"address":3232272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82},{"level":36,"species":371}],"party_address":3211972,"script_address":0},{"address":3232312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[49,86,63,85],"species":82},{"level":39,"moves":[54,23,48,48],"species":372}],"party_address":3211988,"script_address":0},{"address":3232352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":350}],"party_address":3212020,"script_address":2036011},{"address":3232392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212036,"script_address":2036121},{"address":3232432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212044,"script_address":2036152},{"address":3232472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183},{"level":26,"species":183}],"party_address":3212052,"script_address":0},{"address":3232512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":183},{"level":29,"species":183}],"party_address":3212068,"script_address":0},{"address":3232552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":183},{"level":32,"species":183}],"party_address":3212084,"script_address":0},{"address":3232592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":35,"species":184}],"party_address":3212100,"script_address":0},{"address":3232632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":13,"moves":[28,29,39,57],"species":288}],"party_address":3212116,"script_address":2035901},{"address":3232672,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":350},{"level":12,"species":183}],"party_address":3212132,"script_address":2544001},{"address":3232712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3212148,"script_address":2339831},{"address":3232752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[28,42,39,57],"species":289}],"party_address":3212156,"script_address":0},{"address":3232792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[28,42,39,57],"species":289}],"party_address":3212172,"script_address":0},{"address":3232832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[28,42,39,57],"species":289}],"party_address":3212188,"script_address":0},{"address":3232872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[28,42,39,57],"species":289}],"party_address":3212204,"script_address":0},{"address":3232912,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[98,97,17,0],"species":305}],"party_address":3212220,"script_address":2131164},{"address":3232952,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[42,146,8,0],"species":308}],"party_address":3212236,"script_address":2131228},{"address":3232992,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[47,68,247,0],"species":364}],"party_address":3212252,"script_address":2131292},{"address":3233032,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[116,163,0,0],"species":365}],"party_address":3212268,"script_address":2131356},{"address":3233072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[116,98,17,27],"species":305},{"level":28,"moves":[44,91,185,72],"species":332},{"level":28,"moves":[205,250,54,96],"species":313},{"level":28,"moves":[85,48,86,49],"species":82},{"level":28,"moves":[202,185,104,207],"species":300}],"party_address":3212284,"script_address":2068117},{"address":3233112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":322},{"level":44,"species":357},{"level":44,"species":331}],"party_address":3212364,"script_address":2565920},{"address":3233152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":355},{"level":46,"species":121}],"party_address":3212388,"script_address":2565982},{"address":3233192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":337},{"level":17,"species":313},{"level":17,"species":335}],"party_address":3212404,"script_address":2046693},{"address":3233232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":345},{"level":43,"species":310}],"party_address":3212428,"script_address":2332685},{"address":3233272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":82},{"level":43,"species":89}],"party_address":3212444,"script_address":2332716},{"address":3233312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":305},{"level":42,"species":355},{"level":42,"species":64}],"party_address":3212460,"script_address":2334375},{"address":3233352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":85},{"level":42,"species":64},{"level":42,"species":101},{"level":42,"species":300}],"party_address":3212484,"script_address":2335423},{"address":3233392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":317},{"level":42,"species":75},{"level":42,"species":314}],"party_address":3212516,"script_address":2335454},{"address":3233432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":337},{"level":26,"species":313},{"level":26,"species":335}],"party_address":3212540,"script_address":0},{"address":3233472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338},{"level":29,"species":313},{"level":29,"species":335}],"party_address":3212564,"script_address":0},{"address":3233512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":338},{"level":32,"species":313},{"level":32,"species":335}],"party_address":3212588,"script_address":0},{"address":3233552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":338},{"level":35,"species":313},{"level":35,"species":336}],"party_address":3212612,"script_address":0},{"address":3233592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":297}],"party_address":3212636,"script_address":2073950},{"address":3233632,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[185,95,0,0],"species":316}],"party_address":3212652,"script_address":2131420},{"address":3233672,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[111,38,247,0],"species":40}],"party_address":3212668,"script_address":2131484},{"address":3233712,"battle_type":2,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":26,"moves":[14,163,0,0],"species":380}],"party_address":3212684,"script_address":2131548},{"address":3233752,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[226,185,57,44],"species":355},{"level":29,"moves":[72,89,64,73],"species":363},{"level":29,"moves":[19,55,54,182],"species":310}],"party_address":3212700,"script_address":2068086},{"address":3233792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":383},{"level":45,"species":338}],"party_address":3212748,"script_address":2565951},{"address":3233832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":309},{"level":17,"species":339},{"level":17,"species":363}],"party_address":3212764,"script_address":2046803},{"address":3233872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":322}],"party_address":3212788,"script_address":2065651},{"address":3233912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3212796,"script_address":2332747},{"address":3233952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":319}],"party_address":3212804,"script_address":2334406},{"address":3233992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":321},{"level":42,"species":357},{"level":42,"species":297}],"party_address":3212812,"script_address":2334437},{"address":3234032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":227},{"level":43,"species":322}],"party_address":3212836,"script_address":2335485},{"address":3234072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":28},{"level":42,"species":38},{"level":42,"species":369}],"party_address":3212852,"script_address":2335516},{"address":3234112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":26,"species":339},{"level":26,"species":363}],"party_address":3212876,"script_address":0},{"address":3234152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":339},{"level":29,"species":363}],"party_address":3212900,"script_address":0},{"address":3234192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":339},{"level":32,"species":363}],"party_address":3212924,"script_address":0},{"address":3234232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":340},{"level":34,"species":363}],"party_address":3212948,"script_address":0},{"address":3234272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":348}],"party_address":3212972,"script_address":2564729},{"address":3234312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":361},{"level":30,"species":377}],"party_address":3212988,"script_address":2068461},{"address":3234352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":361},{"level":29,"species":377}],"party_address":3213004,"script_address":2067284},{"address":3234392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":322}],"party_address":3213020,"script_address":2315745},{"address":3234432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":377}],"party_address":3213028,"script_address":2315532},{"address":3234472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":322},{"level":31,"species":351}],"party_address":3213036,"script_address":0},{"address":3234512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":351},{"level":35,"species":322}],"party_address":3213052,"script_address":0},{"address":3234552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":351},{"level":40,"species":322}],"party_address":3213068,"script_address":0},{"address":3234592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":361},{"level":42,"species":322},{"level":42,"species":352}],"party_address":3213084,"script_address":0},{"address":3234632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213108,"script_address":2030087},{"address":3234672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[213,186,175,96],"species":325},{"level":39,"moves":[213,219,36,96],"species":325}],"party_address":3213116,"script_address":2265894},{"address":3234712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":287},{"level":28,"species":287},{"level":30,"species":339}],"party_address":3213148,"script_address":2254717},{"address":3234752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":11,"moves":[33,39,0,0],"species":288}],"party_address":3213172,"script_address":0},{"address":3234792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":40,"species":119}],"party_address":3213188,"script_address":2265677},{"address":3234832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":363}],"party_address":3213196,"script_address":2361019},{"address":3234872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213204,"script_address":0},{"address":3234912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213212,"script_address":0},{"address":3234952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213220,"script_address":0},{"address":3234992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213228,"script_address":0},{"address":3235032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":183}],"party_address":3213244,"script_address":2304387},{"address":3235072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3213252,"script_address":2304418},{"address":3235112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":339}],"party_address":3213260,"script_address":2304449},{"address":3235152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[20,122,154,185],"species":317},{"level":29,"moves":[86,103,137,242],"species":379}],"party_address":3213268,"script_address":2067377},{"address":3235192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":118}],"party_address":3213300,"script_address":2265708},{"address":3235232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":184}],"party_address":3213308,"script_address":2265739},{"address":3235272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[78,250,240,96],"species":373},{"level":37,"moves":[13,152,96,0],"species":326},{"level":39,"moves":[253,154,252,96],"species":296}],"party_address":3213316,"script_address":2265770},{"address":3235312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":330},{"level":39,"species":331}],"party_address":3213364,"script_address":2265801},{"address":3235352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":35,"moves":[20,122,154,185],"species":317},{"level":35,"moves":[86,103,137,242],"species":379}],"party_address":3213380,"script_address":0},{"address":3235392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[20,122,154,185],"species":317},{"level":38,"moves":[86,103,137,242],"species":379}],"party_address":3213412,"script_address":0},{"address":3235432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[20,122,154,185],"species":317},{"level":41,"moves":[86,103,137,242],"species":379}],"party_address":3213444,"script_address":0},{"address":3235472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[20,122,154,185],"species":317},{"level":44,"moves":[86,103,137,242],"species":379}],"party_address":3213476,"script_address":0},{"address":3235512,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":7,"species":288}],"party_address":3213508,"script_address":2029901},{"address":3235552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":324},{"level":33,"species":356}],"party_address":3213516,"script_address":2074012},{"address":3235592,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":45,"species":184}],"party_address":3213532,"script_address":2360988},{"address":3235632,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":27,"species":289}],"party_address":3213540,"script_address":0},{"address":3235672,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":289}],"party_address":3213548,"script_address":0},{"address":3235712,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":289}],"party_address":3213556,"script_address":0},{"address":3235752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[154,44,60,28],"species":289}],"party_address":3213564,"script_address":0},{"address":3235792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3213580,"script_address":2051965},{"address":3235832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":116}],"party_address":3213588,"script_address":2340108},{"address":3235872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":111}],"party_address":3213604,"script_address":2312578},{"address":3235912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":339}],"party_address":3213612,"script_address":2304480},{"address":3235952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":383}],"party_address":3213620,"script_address":0},{"address":3235992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":383},{"level":29,"species":111}],"party_address":3213628,"script_address":0},{"address":3236032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":383},{"level":32,"species":111}],"party_address":3213644,"script_address":0},{"address":3236072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":384},{"level":35,"species":112}],"party_address":3213660,"script_address":0},{"address":3236112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213676,"script_address":2033571},{"address":3236152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":72}],"party_address":3213684,"script_address":2033602},{"address":3236192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":72}],"party_address":3213692,"script_address":2034185},{"address":3236232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":24,"species":309},{"level":24,"species":72}],"party_address":3213708,"script_address":2034479},{"address":3236272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213732,"script_address":2034510},{"address":3236312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":73}],"party_address":3213740,"script_address":2034776},{"address":3236352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":330}],"party_address":3213748,"script_address":2034807},{"address":3236392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3213756,"script_address":2035777},{"address":3236432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309}],"party_address":3213772,"script_address":2069178},{"address":3236472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3213788,"script_address":2069209},{"address":3236512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":73}],"party_address":3213796,"script_address":2069789},{"address":3236552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":116}],"party_address":3213804,"script_address":2069820},{"address":3236592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213812,"script_address":2070163},{"address":3236632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":31,"species":309},{"level":31,"species":330}],"party_address":3213820,"script_address":2070194},{"address":3236672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213844,"script_address":2073229},{"address":3236712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310}],"party_address":3213852,"script_address":2073359},{"address":3236752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213860,"script_address":2073390},{"address":3236792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":73},{"level":33,"species":313}],"party_address":3213876,"script_address":2073291},{"address":3236832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3213892,"script_address":2073608},{"address":3236872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":342}],"party_address":3213900,"script_address":2073857},{"address":3236912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":341}],"party_address":3213908,"script_address":2073576},{"address":3236952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":130}],"party_address":3213916,"script_address":2074089},{"address":3236992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":309},{"level":33,"species":73}],"party_address":3213924,"script_address":0},{"address":3237032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":72},{"level":33,"species":313}],"party_address":3213948,"script_address":2069381},{"address":3237072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":331}],"party_address":3213964,"script_address":0},{"address":3237112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":331}],"party_address":3213972,"script_address":0},{"address":3237152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120},{"level":36,"species":331}],"party_address":3213980,"script_address":0},{"address":3237192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":121},{"level":39,"species":331}],"party_address":3213996,"script_address":0},{"address":3237232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3214012,"script_address":2095275},{"address":3237272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":66},{"level":32,"species":67}],"party_address":3214020,"script_address":2074213},{"address":3237312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":336}],"party_address":3214036,"script_address":2073701},{"address":3237352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":66},{"level":28,"species":67}],"party_address":3214044,"script_address":2052921},{"address":3237392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214060,"script_address":2052952},{"address":3237432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":67}],"party_address":3214068,"script_address":0},{"address":3237472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":66},{"level":29,"species":67}],"party_address":3214076,"script_address":0},{"address":3237512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":66},{"level":31,"species":67},{"level":31,"species":67}],"party_address":3214092,"script_address":0},{"address":3237552,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":33,"species":66},{"level":33,"species":67},{"level":33,"species":67},{"level":33,"species":68}],"party_address":3214116,"script_address":0},{"address":3237592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":335},{"level":26,"species":67}],"party_address":3214148,"script_address":2557758},{"address":3237632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":66}],"party_address":3214164,"script_address":2046662},{"address":3237672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":336}],"party_address":3214172,"script_address":2315359},{"address":3237712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[98,86,209,43],"species":337},{"level":17,"moves":[12,95,103,0],"species":100}],"party_address":3214180,"script_address":2167608},{"address":3237752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":286},{"level":31,"species":41}],"party_address":3214212,"script_address":2323445},{"address":3237792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":330}],"party_address":3214228,"script_address":2324458},{"address":3237832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":100},{"level":17,"species":81}],"party_address":3214236,"script_address":2167639},{"address":3237872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":337},{"level":30,"species":371}],"party_address":3214252,"script_address":2068709},{"address":3237912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81},{"level":15,"species":370}],"party_address":3214268,"script_address":2058956},{"address":3237952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":81},{"level":25,"species":370},{"level":25,"species":81}],"party_address":3214284,"script_address":0},{"address":3237992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81},{"level":28,"species":371},{"level":28,"species":81}],"party_address":3214308,"script_address":0},{"address":3238032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":82},{"level":31,"species":371},{"level":31,"species":82}],"party_address":3214332,"script_address":0},{"address":3238072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82},{"level":34,"species":372},{"level":34,"species":82}],"party_address":3214356,"script_address":0},{"address":3238112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214380,"script_address":2103394},{"address":3238152,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":218},{"level":22,"species":218}],"party_address":3214388,"script_address":2103601},{"address":3238192,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3214404,"script_address":2103446},{"address":3238232,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214412,"script_address":2103570},{"address":3238272,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":218}],"party_address":3214420,"script_address":2103477},{"address":3238312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309}],"party_address":3214428,"script_address":2052075},{"address":3238352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":218},{"level":26,"species":309}],"party_address":3214444,"script_address":0},{"address":3238392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310}],"party_address":3214460,"script_address":0},{"address":3238432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":218},{"level":32,"species":310}],"party_address":3214476,"script_address":0},{"address":3238472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":219},{"level":35,"species":310}],"party_address":3214492,"script_address":0},{"address":3238512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[91,28,40,163],"species":27}],"party_address":3214508,"script_address":2046366},{"address":3238552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":21,"moves":[229,189,60,61],"species":318},{"level":21,"moves":[40,28,10,91],"species":27},{"level":21,"moves":[229,189,60,61],"species":318}],"party_address":3214524,"script_address":2046428},{"address":3238592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":299}],"party_address":3214572,"script_address":2049829},{"address":3238632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27},{"level":18,"species":299}],"party_address":3214580,"script_address":2051903},{"address":3238672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":317}],"party_address":3214596,"script_address":2557005},{"address":3238712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":288},{"level":20,"species":304}],"party_address":3214604,"script_address":2310199},{"address":3238752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":306}],"party_address":3214620,"script_address":2310337},{"address":3238792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":27}],"party_address":3214628,"script_address":2046600},{"address":3238832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":288},{"level":26,"species":304}],"party_address":3214636,"script_address":0},{"address":3238872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":289},{"level":29,"species":305}],"party_address":3214652,"script_address":0},{"address":3238912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":305},{"level":31,"species":289}],"party_address":3214668,"script_address":0},{"address":3238952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":28},{"level":34,"species":289}],"party_address":3214692,"script_address":0},{"address":3238992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":311}],"party_address":3214716,"script_address":2061044},{"address":3239032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":290},{"level":24,"species":291},{"level":24,"species":292}],"party_address":3214724,"script_address":2061075},{"address":3239072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":290},{"level":27,"species":293},{"level":27,"species":294}],"party_address":3214748,"script_address":2061106},{"address":3239112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":311},{"level":27,"species":311},{"level":27,"species":311}],"party_address":3214772,"script_address":2065541},{"address":3239152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":294},{"level":16,"species":292}],"party_address":3214796,"script_address":2057595},{"address":3239192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":311},{"level":31,"species":311}],"party_address":3214812,"script_address":0},{"address":3239232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":311},{"level":34,"species":311},{"level":34,"species":312}],"party_address":3214836,"script_address":0},{"address":3239272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":311},{"level":36,"species":290},{"level":36,"species":311},{"level":36,"species":312}],"party_address":3214860,"script_address":0},{"address":3239312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":311},{"level":38,"species":294},{"level":38,"species":311},{"level":38,"species":312},{"level":38,"species":292}],"party_address":3214892,"script_address":0},{"address":3239352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[237,0,0,0],"species":63}],"party_address":3214932,"script_address":2038374},{"address":3239392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3214948,"script_address":2244488},{"address":3239432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":392}],"party_address":3214956,"script_address":2244519},{"address":3239472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3214964,"script_address":2244550},{"address":3239512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":392},{"level":26,"species":393}],"party_address":3214972,"script_address":2314189},{"address":3239552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3214996,"script_address":2564698},{"address":3239592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":349}],"party_address":3215012,"script_address":2068179},{"address":3239632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":64},{"level":33,"species":349}],"party_address":3215020,"script_address":0},{"address":3239672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":64},{"level":38,"species":349}],"party_address":3215036,"script_address":0},{"address":3239712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":64},{"level":41,"species":349}],"party_address":3215052,"script_address":0},{"address":3239752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":349},{"level":45,"species":65}],"party_address":3215068,"script_address":0},{"address":3239792,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[237,0,0,0],"species":63}],"party_address":3215084,"script_address":2038405},{"address":3239832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":393}],"party_address":3215100,"script_address":2244581},{"address":3239872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":178}],"party_address":3215108,"script_address":2244612},{"address":3239912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3215116,"script_address":2244643},{"address":3239952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":202},{"level":26,"species":177},{"level":26,"species":64}],"party_address":3215124,"script_address":2314220},{"address":3239992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":393},{"level":41,"species":178}],"party_address":3215148,"script_address":2564760},{"address":3240032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":64},{"level":30,"species":348}],"party_address":3215164,"script_address":2068289},{"address":3240072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":64},{"level":34,"species":348}],"party_address":3215180,"script_address":0},{"address":3240112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":64},{"level":37,"species":348}],"party_address":3215196,"script_address":0},{"address":3240152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":64},{"level":40,"species":348}],"party_address":3215212,"script_address":0},{"address":3240192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":348},{"level":43,"species":65}],"party_address":3215228,"script_address":0},{"address":3240232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":338}],"party_address":3215244,"script_address":2067174},{"address":3240272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":338},{"level":44,"species":338}],"party_address":3215252,"script_address":2360864},{"address":3240312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":380}],"party_address":3215268,"script_address":2360895},{"address":3240352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":338}],"party_address":3215276,"script_address":0},{"address":3240392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[29,28,60,154],"species":289},{"level":36,"moves":[98,209,60,46],"species":338}],"party_address":3215284,"script_address":0},{"address":3240432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[29,28,60,154],"species":289},{"level":39,"moves":[98,209,60,0],"species":338}],"party_address":3215316,"script_address":0},{"address":3240472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[29,28,60,154],"species":289},{"level":41,"moves":[154,50,93,244],"species":55},{"level":41,"moves":[98,209,60,46],"species":338}],"party_address":3215348,"script_address":0},{"address":3240512,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,38,28,242],"species":287},{"level":48,"moves":[3,104,207,70],"species":300},{"level":46,"moves":[73,185,46,178],"species":345},{"level":48,"moves":[57,14,70,7],"species":327},{"level":49,"moves":[76,157,14,163],"species":376}],"party_address":3215396,"script_address":2274753},{"address":3240552,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[69,109,174,182],"species":362},{"level":49,"moves":[247,32,5,185],"species":378},{"level":50,"moves":[247,104,101,185],"species":322},{"level":49,"moves":[247,94,85,7],"species":378},{"level":51,"moves":[247,58,157,89],"species":362}],"party_address":3215476,"script_address":2275380},{"address":3240592,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[227,34,2,45],"species":342},{"level":50,"moves":[113,242,196,58],"species":347},{"level":52,"moves":[213,38,2,59],"species":342},{"level":52,"moves":[247,153,2,58],"species":347},{"level":53,"moves":[57,34,58,73],"species":343}],"party_address":3215556,"script_address":2276062},{"address":3240632,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[61,81,182,38],"species":396},{"level":54,"moves":[38,225,93,76],"species":359},{"level":53,"moves":[108,93,57,34],"species":230},{"level":53,"moves":[53,242,225,89],"species":334},{"level":55,"moves":[53,81,157,242],"species":397}],"party_address":3215636,"script_address":2276724},{"address":3240672,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":12,"moves":[33,111,88,61],"species":74},{"level":12,"moves":[33,111,88,61],"species":74},{"level":15,"moves":[79,106,33,61],"species":320}],"party_address":3215716,"script_address":2187976},{"address":3240712,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":16,"moves":[2,67,69,83],"species":66},{"level":16,"moves":[8,113,115,83],"species":356},{"level":19,"moves":[36,233,179,83],"species":335}],"party_address":3215764,"script_address":2095066},{"address":3240752,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":20,"moves":[205,209,120,95],"species":100},{"level":20,"moves":[95,43,98,80],"species":337},{"level":22,"moves":[48,95,86,49],"species":82},{"level":24,"moves":[98,86,95,80],"species":338}],"party_address":3215812,"script_address":2167181},{"address":3240792,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[59,36,222,241],"species":339},{"level":24,"moves":[59,123,113,241],"species":218},{"level":26,"moves":[59,33,241,213],"species":340},{"level":29,"moves":[59,241,34,213],"species":321}],"party_address":3215876,"script_address":2103186},{"address":3240832,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[42,60,7,227],"species":308},{"level":27,"moves":[163,7,227,185],"species":365},{"level":29,"moves":[163,187,7,29],"species":289},{"level":31,"moves":[68,25,7,185],"species":366}],"party_address":3215940,"script_address":2129756},{"address":3240872,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[195,119,219,76],"species":358},{"level":29,"moves":[241,76,76,235],"species":369},{"level":30,"moves":[55,48,182,76],"species":310},{"level":31,"moves":[28,31,211,76],"species":227},{"level":33,"moves":[89,225,93,76],"species":359}],"party_address":3216004,"script_address":2202062},{"address":3240912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[89,246,94,113],"species":319},{"level":41,"moves":[94,241,109,91],"species":178},{"level":42,"moves":[113,94,95,91],"species":348},{"level":42,"moves":[241,76,94,53],"species":349}],"party_address":3216084,"script_address":0},{"address":3240952,"battle_type":1,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[96,213,186,175],"species":325},{"level":41,"moves":[240,96,133,89],"species":324},{"level":43,"moves":[227,34,62,96],"species":342},{"level":43,"moves":[96,152,13,43],"species":327},{"level":46,"moves":[96,104,58,156],"species":230}],"party_address":3216148,"script_address":2262245},{"address":3240992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":392}],"party_address":3216228,"script_address":2054242},{"address":3241032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3216236,"script_address":2554598},{"address":3241072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":339},{"level":15,"species":43},{"level":15,"species":309}],"party_address":3216244,"script_address":2554629},{"address":3241112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":392},{"level":26,"species":356}],"party_address":3216268,"script_address":0},{"address":3241152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":393},{"level":29,"species":356}],"party_address":3216284,"script_address":0},{"address":3241192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":393},{"level":32,"species":357}],"party_address":3216300,"script_address":0},{"address":3241232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":393},{"level":34,"species":378},{"level":34,"species":357}],"party_address":3216316,"script_address":0},{"address":3241272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":306}],"party_address":3216340,"script_address":2054490},{"address":3241312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":306},{"level":16,"species":292}],"party_address":3216348,"script_address":2554660},{"address":3241352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":306},{"level":26,"species":370}],"party_address":3216364,"script_address":0},{"address":3241392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":306},{"level":29,"species":371}],"party_address":3216380,"script_address":0},{"address":3241432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":307},{"level":32,"species":371}],"party_address":3216396,"script_address":0},{"address":3241472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":307},{"level":35,"species":372}],"party_address":3216412,"script_address":0},{"address":3241512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[95,60,146,42],"species":308},{"level":32,"moves":[8,25,47,185],"species":366}],"party_address":3216428,"script_address":0},{"address":3241552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":15,"moves":[45,39,29,60],"species":288},{"level":17,"moves":[33,116,36,0],"species":335}],"party_address":3216460,"script_address":0},{"address":3241592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[45,39,29,60],"species":288},{"level":30,"moves":[33,116,36,0],"species":335}],"party_address":3216492,"script_address":0},{"address":3241632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[45,39,29,60],"species":288},{"level":33,"moves":[33,116,36,0],"species":335}],"party_address":3216524,"script_address":0},{"address":3241672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[45,39,29,60],"species":289},{"level":36,"moves":[33,116,36,0],"species":335}],"party_address":3216556,"script_address":0},{"address":3241712,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[45,39,29,60],"species":289},{"level":38,"moves":[33,116,36,0],"species":336}],"party_address":3216588,"script_address":0},{"address":3241752,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":16,"species":304},{"level":16,"species":288}],"party_address":3216620,"script_address":2045785},{"address":3241792,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":15,"species":315}],"party_address":3216636,"script_address":2026353},{"address":3241832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[18,204,185,215],"species":315},{"level":36,"moves":[18,204,185,215],"species":315},{"level":40,"moves":[18,204,185,215],"species":315},{"level":12,"moves":[18,204,185,215],"species":315},{"level":30,"moves":[18,204,185,215],"species":315},{"level":42,"moves":[18,204,185,215],"species":316}],"party_address":3216644,"script_address":2360833},{"address":3241872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":315}],"party_address":3216740,"script_address":0},{"address":3241912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":315}],"party_address":3216748,"script_address":0},{"address":3241952,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316}],"party_address":3216756,"script_address":0},{"address":3241992,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":38,"species":316}],"party_address":3216764,"script_address":0},{"address":3242032,"battle_type":3,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":17,"species":363}],"party_address":3216772,"script_address":2045890},{"address":3242072,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":30,"species":25}],"party_address":3216780,"script_address":2067143},{"address":3242112,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":350},{"level":37,"species":183},{"level":39,"species":184}],"party_address":3216788,"script_address":2265832},{"address":3242152,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":353},{"level":14,"species":354}],"party_address":3216812,"script_address":2038890},{"address":3242192,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":26,"species":353},{"level":26,"species":354}],"party_address":3216828,"script_address":0},{"address":3242232,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":29,"species":353},{"level":29,"species":354}],"party_address":3216844,"script_address":0},{"address":3242272,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":32,"species":353},{"level":32,"species":354}],"party_address":3216860,"script_address":0},{"address":3242312,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":35,"species":353},{"level":35,"species":354}],"party_address":3216876,"script_address":0},{"address":3242352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":336}],"party_address":3216892,"script_address":2052811},{"address":3242392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[36,26,28,91],"species":336}],"party_address":3216900,"script_address":0},{"address":3242432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[36,26,28,91],"species":336}],"party_address":3216916,"script_address":0},{"address":3242472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[36,187,28,91],"species":336}],"party_address":3216932,"script_address":0},{"address":3242512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[36,187,28,91],"species":336}],"party_address":3216948,"script_address":0},{"address":3242552,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[136,96,93,197],"species":356}],"party_address":3216964,"script_address":2046100},{"address":3242592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":356},{"level":21,"species":335}],"party_address":3216980,"script_address":2304277},{"address":3242632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":356},{"level":30,"species":335}],"party_address":3216996,"script_address":0},{"address":3242672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":357},{"level":33,"species":336}],"party_address":3217012,"script_address":0},{"address":3242712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":357},{"level":36,"species":336}],"party_address":3217028,"script_address":0},{"address":3242752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":357},{"level":39,"species":336}],"party_address":3217044,"script_address":0},{"address":3242792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":286}],"party_address":3217060,"script_address":2024678},{"address":3242832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":288},{"level":7,"species":298}],"party_address":3217068,"script_address":2029684},{"address":3242872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[33,0,0,0],"species":74}],"party_address":3217084,"script_address":2188154},{"address":3242912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3217100,"script_address":2188185},{"address":3242952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":66}],"party_address":3217116,"script_address":2054180},{"address":3242992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[29,28,45,85],"species":288},{"level":17,"moves":[133,124,25,1],"species":367}],"party_address":3217124,"script_address":2167670},{"address":3243032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[213,58,85,53],"species":366},{"level":43,"moves":[29,182,5,92],"species":362}],"party_address":3217156,"script_address":2332778},{"address":3243072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,94,85,91],"species":394},{"level":43,"moves":[89,247,76,24],"species":366}],"party_address":3217188,"script_address":2332809},{"address":3243112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":332}],"party_address":3217220,"script_address":2050594},{"address":3243152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":382}],"party_address":3217228,"script_address":2050625},{"address":3243192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":287}],"party_address":3217236,"script_address":0},{"address":3243232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":305},{"level":30,"species":287}],"party_address":3217244,"script_address":0},{"address":3243272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":305},{"level":29,"species":289},{"level":33,"species":287}],"party_address":3217260,"script_address":0},{"address":3243312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":32,"species":289},{"level":36,"species":287}],"party_address":3217284,"script_address":0},{"address":3243352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":16,"species":288}],"party_address":3217308,"script_address":2553792},{"address":3243392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":3,"species":304}],"party_address":3217324,"script_address":2024926},{"address":3243432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":382},{"level":13,"species":337}],"party_address":3217340,"script_address":2039000},{"address":3243472,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[240,67,38,59],"species":314},{"level":55,"moves":[92,56,188,58],"species":73},{"level":56,"moves":[202,57,73,104],"species":297},{"level":56,"moves":[89,57,133,63],"species":324},{"level":56,"moves":[93,89,63,57],"species":130},{"level":58,"moves":[105,57,58,92],"species":329}],"party_address":3217356,"script_address":2277575},{"address":3243512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":10,"species":72},{"level":15,"species":129}],"party_address":3217452,"script_address":2026322},{"address":3243552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":129},{"level":6,"species":129},{"level":7,"species":129}],"party_address":3217476,"script_address":2029653},{"address":3243592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":129},{"level":17,"species":118},{"level":18,"species":323}],"party_address":3217500,"script_address":2052185},{"address":3243632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":10,"species":129},{"level":7,"species":72},{"level":10,"species":129}],"party_address":3217524,"script_address":2034247},{"address":3243672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72}],"party_address":3217548,"script_address":2034357},{"address":3243712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":72},{"level":14,"species":313},{"level":11,"species":72},{"level":14,"species":313}],"party_address":3217556,"script_address":2038546},{"address":3243752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3217588,"script_address":2052216},{"address":3243792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":72},{"level":25,"species":330}],"party_address":3217596,"script_address":2058894},{"address":3243832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":72}],"party_address":3217612,"script_address":2058925},{"address":3243872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":313},{"level":25,"species":73}],"party_address":3217620,"script_address":2036183},{"address":3243912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":72},{"level":27,"species":130},{"level":27,"species":130}],"party_address":3217636,"script_address":0},{"address":3243952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":130},{"level":26,"species":330},{"level":26,"species":72},{"level":29,"species":130}],"party_address":3217660,"script_address":0},{"address":3243992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":130},{"level":30,"species":330},{"level":30,"species":73},{"level":31,"species":130}],"party_address":3217692,"script_address":0},{"address":3244032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":130},{"level":33,"species":331},{"level":33,"species":130},{"level":35,"species":73}],"party_address":3217724,"script_address":0},{"address":3244072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":129},{"level":21,"species":130},{"level":23,"species":130},{"level":26,"species":130},{"level":30,"species":130},{"level":35,"species":130}],"party_address":3217756,"script_address":2073670},{"address":3244112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":100},{"level":6,"species":100},{"level":14,"species":81}],"party_address":3217804,"script_address":2038577},{"address":3244152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81}],"party_address":3217828,"script_address":2038608},{"address":3244192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217844,"script_address":2038639},{"address":3244232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":81}],"party_address":3217852,"script_address":0},{"address":3244272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":81}],"party_address":3217860,"script_address":0},{"address":3244312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":82}],"party_address":3217868,"script_address":0},{"address":3244352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":82}],"party_address":3217876,"script_address":0},{"address":3244392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":81}],"party_address":3217884,"script_address":2038780},{"address":3244432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":81},{"level":14,"species":81},{"level":6,"species":100}],"party_address":3217892,"script_address":2038749},{"address":3244472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":81}],"party_address":3217916,"script_address":0},{"address":3244512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":81}],"party_address":3217924,"script_address":0},{"address":3244552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":82}],"party_address":3217932,"script_address":0},{"address":3244592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":82}],"party_address":3217940,"script_address":0},{"address":3244632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217948,"script_address":2057375},{"address":3244672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217956,"script_address":0},{"address":3244712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3217964,"script_address":0},{"address":3244752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3217972,"script_address":0},{"address":3244792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3217980,"script_address":0},{"address":3244832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3217988,"script_address":2057485},{"address":3244872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":84}],"party_address":3217996,"script_address":0},{"address":3244912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":84}],"party_address":3218004,"script_address":0},{"address":3244952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":85}],"party_address":3218012,"script_address":0},{"address":3244992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":85}],"party_address":3218020,"script_address":0},{"address":3245032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218028,"script_address":2070582},{"address":3245072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":288},{"level":25,"species":337}],"party_address":3218044,"script_address":2340077},{"address":3245112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218060,"script_address":2071332},{"address":3245152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":120},{"level":33,"species":120}],"party_address":3218068,"script_address":2070380},{"address":3245192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218084,"script_address":2072978},{"address":3245232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218100,"script_address":0},{"address":3245272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218108,"script_address":0},{"address":3245312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218116,"script_address":0},{"address":3245352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218124,"script_address":0},{"address":3245392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218132,"script_address":2070318},{"address":3245432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309},{"level":34,"species":120}],"party_address":3218140,"script_address":2070613},{"address":3245472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3218156,"script_address":2073545},{"address":3245512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":120}],"party_address":3218164,"script_address":2071442},{"address":3245552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":309},{"level":33,"species":120}],"party_address":3218172,"script_address":2073009},{"address":3245592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":120}],"party_address":3218188,"script_address":0},{"address":3245632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":120}],"party_address":3218196,"script_address":0},{"address":3245672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":121}],"party_address":3218204,"script_address":0},{"address":3245712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":121}],"party_address":3218212,"script_address":0},{"address":3245752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":359},{"level":37,"species":359}],"party_address":3218220,"script_address":2292701},{"address":3245792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":359}],"party_address":3218236,"script_address":0},{"address":3245832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":359},{"level":44,"species":359}],"party_address":3218252,"script_address":0},{"address":3245872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":46,"species":395},{"level":46,"species":359},{"level":46,"species":359}],"party_address":3218268,"script_address":0},{"address":3245912,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":49,"species":359},{"level":49,"species":359},{"level":49,"species":396}],"party_address":3218292,"script_address":0},{"address":3245952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[225,29,116,52],"species":395}],"party_address":3218316,"script_address":2074182},{"address":3245992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":309}],"party_address":3218332,"script_address":2059066},{"address":3246032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":369}],"party_address":3218340,"script_address":2061450},{"address":3246072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":305}],"party_address":3218356,"script_address":2061481},{"address":3246112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":84},{"level":27,"species":227},{"level":27,"species":369}],"party_address":3218364,"script_address":2202267},{"address":3246152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":227}],"party_address":3218388,"script_address":2202391},{"address":3246192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":369},{"level":33,"species":178}],"party_address":3218396,"script_address":2070085},{"address":3246232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":84},{"level":29,"species":310}],"party_address":3218412,"script_address":2202298},{"address":3246272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":309},{"level":28,"species":177}],"party_address":3218428,"script_address":2065338},{"address":3246312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":358}],"party_address":3218444,"script_address":2065369},{"address":3246352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":305},{"level":36,"species":310},{"level":36,"species":178}],"party_address":3218452,"script_address":2563257},{"address":3246392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":305}],"party_address":3218476,"script_address":2059097},{"address":3246432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":177},{"level":32,"species":358}],"party_address":3218492,"script_address":0},{"address":3246472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":177},{"level":35,"species":359}],"party_address":3218508,"script_address":0},{"address":3246512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":177},{"level":38,"species":359}],"party_address":3218524,"script_address":0},{"address":3246552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":359},{"level":41,"species":178}],"party_address":3218540,"script_address":0},{"address":3246592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":177},{"level":33,"species":305}],"party_address":3218556,"script_address":2074151},{"address":3246632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":369}],"party_address":3218572,"script_address":2073981},{"address":3246672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302}],"party_address":3218580,"script_address":2061512},{"address":3246712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302},{"level":25,"species":109}],"party_address":3218588,"script_address":2061543},{"address":3246752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[29,89,0,0],"species":319},{"level":43,"moves":[85,89,0,0],"species":171}],"party_address":3218604,"script_address":2335578},{"address":3246792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3218636,"script_address":2341860},{"address":3246832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,123,120],"species":109},{"level":17,"moves":[139,33,124,120],"species":109}],"party_address":3218644,"script_address":2050766},{"address":3246872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":109},{"level":18,"species":302}],"party_address":3218692,"script_address":2050876},{"address":3246912,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":24,"moves":[139,33,124,120],"species":109},{"level":24,"moves":[139,33,124,0],"species":109},{"level":24,"moves":[139,33,124,120],"species":109},{"level":26,"moves":[33,124,0,0],"species":109}],"party_address":3218708,"script_address":0},{"address":3246952,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,120],"species":109},{"level":27,"moves":[139,33,124,0],"species":109},{"level":29,"moves":[33,124,0,0],"species":109}],"party_address":3218772,"script_address":0},{"address":3246992,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":30,"moves":[139,33,124,0],"species":109},{"level":32,"moves":[33,124,0,0],"species":109}],"party_address":3218836,"script_address":0},{"address":3247032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[139,33,124,0],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":33,"moves":[139,33,124,120],"species":109},{"level":35,"moves":[33,124,0,0],"species":110}],"party_address":3218900,"script_address":0},{"address":3247072,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218964,"script_address":2095313},{"address":3247112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3218972,"script_address":2095351},{"address":3247152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":335}],"party_address":3218980,"script_address":2053062},{"address":3247192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":356}],"party_address":3218996,"script_address":2557727},{"address":3247232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3219004,"script_address":2557789},{"address":3247272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3219012,"script_address":0},{"address":3247312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":356},{"level":29,"species":335}],"party_address":3219028,"script_address":0},{"address":3247352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":357},{"level":32,"species":336}],"party_address":3219044,"script_address":0},{"address":3247392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":357},{"level":35,"species":336}],"party_address":3219060,"script_address":0},{"address":3247432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":19,"moves":[52,33,222,241],"species":339}],"party_address":3219076,"script_address":2050656},{"address":3247472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":363},{"level":28,"species":313}],"party_address":3219092,"script_address":2065713},{"address":3247512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[240,55,87,96],"species":385}],"party_address":3219108,"script_address":2065744},{"address":3247552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":29,"moves":[52,33,222,241],"species":339}],"party_address":3219124,"script_address":0},{"address":3247592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[52,36,222,241],"species":339}],"party_address":3219140,"script_address":0},{"address":3247632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[73,72,64,241],"species":363},{"level":34,"moves":[53,36,222,241],"species":339}],"party_address":3219156,"script_address":0},{"address":3247672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[73,202,76,241],"species":363},{"level":37,"moves":[53,36,89,241],"species":340}],"party_address":3219188,"script_address":0},{"address":3247712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":313}],"party_address":3219220,"script_address":2033633},{"address":3247752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":183}],"party_address":3219236,"script_address":2033664},{"address":3247792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":313}],"party_address":3219244,"script_address":2034216},{"address":3247832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":309},{"level":25,"species":118}],"party_address":3219252,"script_address":2034620},{"address":3247872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219268,"script_address":2034651},{"address":3247912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":116},{"level":25,"species":183}],"party_address":3219276,"script_address":2034838},{"address":3247952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3219292,"script_address":2034869},{"address":3247992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":118},{"level":24,"species":309},{"level":24,"species":118}],"party_address":3219300,"script_address":2035808},{"address":3248032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3219324,"script_address":2069240},{"address":3248072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":183}],"party_address":3219332,"script_address":2069350},{"address":3248112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219340,"script_address":2069851},{"address":3248152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219348,"script_address":2069882},{"address":3248192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":183},{"level":33,"species":341}],"party_address":3219356,"script_address":2070225},{"address":3248232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":118}],"party_address":3219372,"script_address":2070256},{"address":3248272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":118},{"level":33,"species":341}],"party_address":3219380,"script_address":2073260},{"address":3248312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":325}],"party_address":3219396,"script_address":2073421},{"address":3248352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219404,"script_address":2073452},{"address":3248392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":184}],"party_address":3219412,"script_address":2073639},{"address":3248432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219420,"script_address":2070349},{"address":3248472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":119}],"party_address":3219436,"script_address":2073888},{"address":3248512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":116},{"level":33,"species":117}],"party_address":3219444,"script_address":2073919},{"address":3248552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":171},{"level":34,"species":310}],"party_address":3219460,"script_address":0},{"address":3248592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":325},{"level":33,"species":325}],"party_address":3219476,"script_address":2074120},{"address":3248632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":119}],"party_address":3219492,"script_address":2071676},{"address":3248672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":313}],"party_address":3219500,"script_address":0},{"address":3248712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":313}],"party_address":3219508,"script_address":0},{"address":3248752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":120},{"level":43,"species":313}],"party_address":3219516,"script_address":0},{"address":3248792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":313},{"level":45,"species":121}],"party_address":3219532,"script_address":0},{"address":3248832,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[91,28,40,163],"species":27},{"level":22,"moves":[229,189,60,61],"species":318}],"party_address":3219556,"script_address":2046397},{"address":3248872,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":22,"moves":[28,40,163,91],"species":27},{"level":22,"moves":[205,61,39,111],"species":183}],"party_address":3219588,"script_address":2046459},{"address":3248912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":304},{"level":17,"species":296}],"party_address":3219620,"script_address":2049860},{"address":3248952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":183},{"level":18,"species":296}],"party_address":3219636,"script_address":2051934},{"address":3248992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":315},{"level":23,"species":358}],"party_address":3219652,"script_address":2557036},{"address":3249032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":306},{"level":19,"species":43},{"level":19,"species":358}],"party_address":3219668,"script_address":2310092},{"address":3249072,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[194,219,68,243],"species":202}],"party_address":3219692,"script_address":2315855},{"address":3249112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":306},{"level":17,"species":183}],"party_address":3219708,"script_address":2046631},{"address":3249152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":306},{"level":25,"species":44},{"level":25,"species":358}],"party_address":3219724,"script_address":0},{"address":3249192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":307},{"level":28,"species":44},{"level":28,"species":358}],"party_address":3219748,"script_address":0},{"address":3249232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307},{"level":31,"species":44},{"level":31,"species":358}],"party_address":3219772,"script_address":0},{"address":3249272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":307},{"level":40,"species":45},{"level":40,"species":359}],"party_address":3219796,"script_address":0},{"address":3249312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":353},{"level":15,"species":354}],"party_address":3219820,"script_address":0},{"address":3249352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":353},{"level":27,"species":354}],"party_address":3219836,"script_address":0},{"address":3249392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":298},{"level":6,"species":295}],"party_address":3219852,"script_address":0},{"address":3249432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":292},{"level":26,"species":294}],"party_address":3219868,"script_address":0},{"address":3249472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":353},{"level":9,"species":354}],"party_address":3219884,"script_address":0},{"address":3249512,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[101,50,0,0],"species":361},{"level":10,"moves":[71,73,0,0],"species":306}],"party_address":3219900,"script_address":0},{"address":3249552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":353},{"level":30,"species":354}],"party_address":3219932,"script_address":0},{"address":3249592,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[209,12,57,14],"species":353},{"level":33,"moves":[209,12,204,14],"species":354}],"party_address":3219948,"script_address":0},{"address":3249632,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,12,57,14],"species":353},{"level":36,"moves":[87,12,204,14],"species":354}],"party_address":3219980,"script_address":0},{"address":3249672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":309},{"level":12,"species":66}],"party_address":3220012,"script_address":2035839},{"address":3249712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309}],"party_address":3220028,"script_address":2035870},{"address":3249752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":309},{"level":33,"species":67}],"party_address":3220036,"script_address":2069913},{"address":3249792,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":66},{"level":11,"species":72}],"party_address":3220052,"script_address":2543939},{"address":3249832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":44,"species":73},{"level":44,"species":67}],"party_address":3220076,"script_address":2360255},{"address":3249872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":66},{"level":43,"species":310},{"level":43,"species":67}],"party_address":3220092,"script_address":2360286},{"address":3249912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":341},{"level":25,"species":67}],"party_address":3220116,"script_address":2340984},{"address":3249952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":309},{"level":36,"species":72},{"level":36,"species":67}],"party_address":3220132,"script_address":0},{"address":3249992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":310},{"level":39,"species":72},{"level":39,"species":67}],"party_address":3220156,"script_address":0},{"address":3250032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":310},{"level":42,"species":72},{"level":42,"species":67}],"party_address":3220180,"script_address":0},{"address":3250072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":310},{"level":45,"species":67},{"level":45,"species":73}],"party_address":3220204,"script_address":0},{"address":3250112,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":23,"species":339}],"party_address":3220228,"script_address":2103632},{"address":3250152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[175,96,216,213],"species":328},{"level":39,"moves":[175,96,216,213],"species":328}],"party_address":3220236,"script_address":2265863},{"address":3250192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":376}],"party_address":3220268,"script_address":2068647},{"address":3250232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[92,87,120,188],"species":109}],"party_address":3220276,"script_address":2068616},{"address":3250272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":31,"moves":[241,55,53,76],"species":385}],"party_address":3220292,"script_address":2068585},{"address":3250312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":338},{"level":33,"species":68}],"party_address":3220308,"script_address":2070116},{"address":3250352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":341}],"party_address":3220324,"script_address":2074337},{"address":3250392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":34,"moves":[44,46,86,85],"species":338}],"party_address":3220340,"script_address":2074306},{"address":3250432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":356},{"level":33,"species":336}],"party_address":3220356,"script_address":2074275},{"address":3250472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313}],"party_address":3220372,"script_address":2074244},{"address":3250512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":170},{"level":33,"species":336}],"party_address":3220380,"script_address":2074043},{"address":3250552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":296},{"level":14,"species":299}],"party_address":3220396,"script_address":2038436},{"address":3250592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":380},{"level":18,"species":379}],"party_address":3220412,"script_address":2053172},{"address":3250632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":340},{"level":38,"species":287},{"level":40,"species":42}],"party_address":3220428,"script_address":0},{"address":3250672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":299}],"party_address":3220452,"script_address":0},{"address":3250712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":299}],"party_address":3220468,"script_address":0},{"address":3250752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":299}],"party_address":3220484,"script_address":0},{"address":3250792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":297},{"level":35,"species":300}],"party_address":3220500,"script_address":0},{"address":3250832,"battle_type":3,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[76,219,225,93],"species":359},{"level":43,"moves":[47,18,204,185],"species":316},{"level":44,"moves":[89,73,202,92],"species":363},{"level":41,"moves":[48,85,161,103],"species":82},{"level":45,"moves":[104,91,94,248],"species":394}],"party_address":3220516,"script_address":2332529},{"address":3250872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220596,"script_address":2025759},{"address":3250912,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":218},{"level":18,"species":309},{"level":20,"species":278}],"party_address":3220604,"script_address":2039798},{"address":3250952,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":310},{"level":31,"species":278}],"party_address":3220628,"script_address":2060578},{"address":3250992,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220652,"script_address":2025703},{"address":3251032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220660,"script_address":2039742},{"address":3251072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220684,"script_address":2060522},{"address":3251112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220708,"script_address":2025731},{"address":3251152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220716,"script_address":2039770},{"address":3251192,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220740,"script_address":2060550},{"address":3251232,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":277}],"party_address":3220764,"script_address":2025675},{"address":3251272,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":218},{"level":20,"species":278}],"party_address":3220772,"script_address":2039622},{"address":3251312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":218},{"level":29,"species":296},{"level":31,"species":278}],"party_address":3220796,"script_address":2060420},{"address":3251352,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":280}],"party_address":3220820,"script_address":2025619},{"address":3251392,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":309},{"level":18,"species":296},{"level":20,"species":281}],"party_address":3220828,"script_address":2039566},{"address":3251432,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":310},{"level":29,"species":296},{"level":31,"species":281}],"party_address":3220852,"script_address":2060364},{"address":3251472,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":283}],"party_address":3220876,"script_address":2025647},{"address":3251512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":218},{"level":20,"species":284}],"party_address":3220884,"script_address":2039594},{"address":3251552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":218},{"level":31,"species":284}],"party_address":3220908,"script_address":2060392},{"address":3251592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":370},{"level":11,"species":288},{"level":11,"species":382},{"level":11,"species":286},{"level":11,"species":304},{"level":11,"species":335}],"party_address":3220932,"script_address":2057155},{"address":3251632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":127}],"party_address":3220980,"script_address":2068678},{"address":3251672,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[153,115,113,94],"species":348},{"level":43,"moves":[153,115,113,247],"species":349}],"party_address":3220988,"script_address":2334468},{"address":3251712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":371},{"level":22,"species":289},{"level":22,"species":382},{"level":22,"species":287},{"level":22,"species":305},{"level":22,"species":335}],"party_address":3221020,"script_address":0},{"address":3251752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":371},{"level":25,"species":289},{"level":25,"species":382},{"level":25,"species":287},{"level":25,"species":305},{"level":25,"species":336}],"party_address":3221068,"script_address":0},{"address":3251792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":371},{"level":28,"species":289},{"level":28,"species":382},{"level":28,"species":287},{"level":28,"species":305},{"level":28,"species":336}],"party_address":3221116,"script_address":0},{"address":3251832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":371},{"level":31,"species":289},{"level":31,"species":383},{"level":31,"species":287},{"level":31,"species":305},{"level":31,"species":336}],"party_address":3221164,"script_address":0},{"address":3251872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":11,"species":309},{"level":11,"species":306},{"level":11,"species":183},{"level":11,"species":363},{"level":11,"species":315},{"level":11,"species":118}],"party_address":3221212,"script_address":2057265},{"address":3251912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":322},{"level":43,"species":376}],"party_address":3221260,"script_address":2334499},{"address":3251952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":28}],"party_address":3221276,"script_address":2341891},{"address":3251992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":309},{"level":22,"species":306},{"level":22,"species":183},{"level":22,"species":363},{"level":22,"species":315},{"level":22,"species":118}],"party_address":3221284,"script_address":0},{"address":3252032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":310},{"level":25,"species":307},{"level":25,"species":183},{"level":25,"species":363},{"level":25,"species":316},{"level":25,"species":118}],"party_address":3221332,"script_address":0},{"address":3252072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":310},{"level":28,"species":307},{"level":28,"species":183},{"level":28,"species":363},{"level":28,"species":316},{"level":28,"species":118}],"party_address":3221380,"script_address":0},{"address":3252112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":310},{"level":31,"species":307},{"level":31,"species":184},{"level":31,"species":363},{"level":31,"species":316},{"level":31,"species":119}],"party_address":3221428,"script_address":0},{"address":3252152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":307}],"party_address":3221476,"script_address":2061230},{"address":3252192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":298},{"level":28,"species":299},{"level":28,"species":296}],"party_address":3221484,"script_address":2065479},{"address":3252232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":345}],"party_address":3221508,"script_address":2563288},{"address":3252272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":307}],"party_address":3221516,"script_address":0},{"address":3252312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":307}],"party_address":3221524,"script_address":0},{"address":3252352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":307}],"party_address":3221532,"script_address":0},{"address":3252392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":317},{"level":39,"species":307}],"party_address":3221540,"script_address":0},{"address":3252432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":44},{"level":26,"species":363}],"party_address":3221556,"script_address":2061340},{"address":3252472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":295},{"level":28,"species":296},{"level":28,"species":299}],"party_address":3221572,"script_address":2065510},{"address":3252512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":358},{"level":38,"species":363}],"party_address":3221596,"script_address":2563226},{"address":3252552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":44},{"level":30,"species":363}],"party_address":3221612,"script_address":0},{"address":3252592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":44},{"level":33,"species":363}],"party_address":3221628,"script_address":0},{"address":3252632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":44},{"level":36,"species":363}],"party_address":3221644,"script_address":0},{"address":3252672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":182},{"level":39,"species":363}],"party_address":3221660,"script_address":0},{"address":3252712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":21,"species":81}],"party_address":3221676,"script_address":2310306},{"address":3252752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":287},{"level":35,"species":42}],"party_address":3221684,"script_address":2327187},{"address":3252792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":313},{"level":31,"species":41}],"party_address":3221700,"script_address":0},{"address":3252832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":30,"species":41}],"party_address":3221716,"script_address":2317615},{"address":3252872,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":286},{"level":22,"species":339}],"party_address":3221732,"script_address":2309993},{"address":3252912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3221748,"script_address":2188216},{"address":3252952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":66}],"party_address":3221764,"script_address":2095389},{"address":3252992,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":356}],"party_address":3221772,"script_address":2095465},{"address":3253032,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":335}],"party_address":3221780,"script_address":2095427},{"address":3253072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":356}],"party_address":3221788,"script_address":2244674},{"address":3253112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":330}],"party_address":3221796,"script_address":2070287},{"address":3253152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[87,86,98,0],"species":338},{"level":32,"moves":[57,168,0,0],"species":289}],"party_address":3221804,"script_address":2070768},{"address":3253192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":73}],"party_address":3221836,"script_address":2071645},{"address":3253232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":41}],"party_address":3221844,"script_address":2304070},{"address":3253272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":331}],"party_address":3221852,"script_address":2073102},{"address":3253312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":203}],"party_address":3221860,"script_address":0},{"address":3253352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":351}],"party_address":3221868,"script_address":2244705},{"address":3253392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":64}],"party_address":3221876,"script_address":2244829},{"address":3253432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":203}],"party_address":3221884,"script_address":2244767},{"address":3253472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":202}],"party_address":3221892,"script_address":2244798},{"address":3253512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":41},{"level":31,"species":286}],"party_address":3221900,"script_address":2254605},{"address":3253552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221916,"script_address":2254667},{"address":3253592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":41}],"party_address":3221924,"script_address":2257768},{"address":3253632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":287}],"party_address":3221932,"script_address":2257818},{"address":3253672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":318}],"party_address":3221940,"script_address":2257868},{"address":3253712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":177}],"party_address":3221948,"script_address":2244736},{"address":3253752,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3221956,"script_address":1978559},{"address":3253792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3221972,"script_address":1978621},{"address":3253832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":305},{"level":33,"species":307}],"party_address":3221988,"script_address":2073732},{"address":3253872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":120}],"party_address":3222004,"script_address":2069651},{"address":3253912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":41},{"level":27,"species":286}],"party_address":3222012,"script_address":2572062},{"address":3253952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":20,"species":286},{"level":22,"species":339},{"level":22,"species":41}],"party_address":3222028,"script_address":2304039},{"address":3253992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":317},{"level":33,"species":371}],"party_address":3222060,"script_address":2073794},{"address":3254032,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":218},{"level":15,"species":283}],"party_address":3222076,"script_address":1978590},{"address":3254072,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":309},{"level":15,"species":277}],"party_address":3222092,"script_address":1978317},{"address":3254112,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":287},{"level":38,"species":169},{"level":39,"species":340}],"party_address":3222108,"script_address":2351441},{"address":3254152,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":287},{"level":24,"species":41},{"level":25,"species":340}],"party_address":3222132,"script_address":2303440},{"address":3254192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":288},{"level":4,"species":306}],"party_address":3222156,"script_address":2024895},{"address":3254232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":295},{"level":6,"species":306}],"party_address":3222172,"script_address":2029715},{"address":3254272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":183}],"party_address":3222188,"script_address":2054459},{"address":3254312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183},{"level":15,"species":306},{"level":15,"species":339}],"party_address":3222196,"script_address":2045995},{"address":3254352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":296},{"level":26,"species":306}],"party_address":3222220,"script_address":0},{"address":3254392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":296},{"level":29,"species":307}],"party_address":3222236,"script_address":0},{"address":3254432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":296},{"level":32,"species":307}],"party_address":3222252,"script_address":0},{"address":3254472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":305},{"level":34,"species":296},{"level":34,"species":307}],"party_address":3222268,"script_address":0},{"address":3254512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":43}],"party_address":3222292,"script_address":2553761},{"address":3254552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":315},{"level":14,"species":306},{"level":14,"species":183}],"party_address":3222300,"script_address":2553823},{"address":3254592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325}],"party_address":3222324,"script_address":2265615},{"address":3254632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":118},{"level":39,"species":313}],"party_address":3222332,"script_address":2265646},{"address":3254672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":4,"species":290},{"level":4,"species":290}],"party_address":3222348,"script_address":2024864},{"address":3254712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290},{"level":3,"species":290}],"party_address":3222364,"script_address":2300392},{"address":3254752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":290},{"level":8,"species":301}],"party_address":3222396,"script_address":2054211},{"address":3254792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":301},{"level":28,"species":302}],"party_address":3222412,"script_address":2061137},{"address":3254832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222428,"script_address":2061168},{"address":3254872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":302}],"party_address":3222444,"script_address":2061199},{"address":3254912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":6,"species":301},{"level":6,"species":301}],"party_address":3222452,"script_address":2300423},{"address":3254952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":302}],"party_address":3222468,"script_address":0},{"address":3254992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":302}],"party_address":3222476,"script_address":0},{"address":3255032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":311},{"level":31,"species":294},{"level":31,"species":302}],"party_address":3222492,"script_address":0},{"address":3255072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":311},{"level":33,"species":302},{"level":33,"species":294},{"level":33,"species":302}],"party_address":3222516,"script_address":0},{"address":3255112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":339},{"level":17,"species":66}],"party_address":3222548,"script_address":2049688},{"address":3255152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":17,"species":74},{"level":16,"species":74}],"party_address":3222564,"script_address":2049719},{"address":3255192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":66}],"party_address":3222588,"script_address":2051841},{"address":3255232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":74},{"level":18,"species":339}],"party_address":3222604,"script_address":2051872},{"address":3255272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":74},{"level":22,"species":320},{"level":22,"species":75}],"party_address":3222620,"script_address":2557067},{"address":3255312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74}],"party_address":3222644,"script_address":2054428},{"address":3255352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":20,"species":74},{"level":20,"species":318}],"party_address":3222652,"script_address":2310061},{"address":3255392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":9,"moves":[150,55,0,0],"species":313}],"party_address":3222668,"script_address":0},{"address":3255432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":10,"moves":[16,45,0,0],"species":310},{"level":10,"moves":[44,184,0,0],"species":286}],"party_address":3222684,"script_address":0},{"address":3255472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":74},{"level":16,"species":74},{"level":16,"species":66}],"party_address":3222716,"script_address":2296023},{"address":3255512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":74},{"level":24,"species":75}],"party_address":3222740,"script_address":0},{"address":3255552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":74},{"level":27,"species":74},{"level":27,"species":75},{"level":27,"species":75}],"party_address":3222772,"script_address":0},{"address":3255592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":74},{"level":30,"species":75},{"level":30,"species":75},{"level":30,"species":75}],"party_address":3222804,"script_address":0},{"address":3255632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":75},{"level":33,"species":76}],"party_address":3222836,"script_address":0},{"address":3255672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":316},{"level":31,"species":338}],"party_address":3222868,"script_address":0},{"address":3255712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":325},{"level":45,"species":325}],"party_address":3222884,"script_address":0},{"address":3255752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":386},{"level":25,"species":387}],"party_address":3222900,"script_address":0},{"address":3255792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":386},{"level":30,"species":387}],"party_address":3222916,"script_address":0},{"address":3255832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":386},{"level":33,"species":387}],"party_address":3222932,"script_address":0},{"address":3255872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":386},{"level":36,"species":387}],"party_address":3222948,"script_address":0},{"address":3255912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":386},{"level":39,"species":387}],"party_address":3222964,"script_address":0},{"address":3255952,"battle_type":2,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":118}],"party_address":3222980,"script_address":2543970},{"address":3255992,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[53,154,185,20],"species":317}],"party_address":3222988,"script_address":2103539},{"address":3256032,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[117,197,93,9],"species":356},{"level":17,"moves":[9,197,93,96],"species":356}],"party_address":3223004,"script_address":2167701},{"address":3256072,"battle_type":2,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":23,"moves":[117,197,93,7],"species":356}],"party_address":3223036,"script_address":2103508},{"address":3256112,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":25,"moves":[33,120,124,108],"species":109},{"level":25,"moves":[33,139,124,108],"species":109}],"party_address":3223052,"script_address":2061574},{"address":3256152,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[139,120,124,108],"species":109},{"level":28,"moves":[28,104,210,14],"species":302}],"party_address":3223084,"script_address":2065775},{"address":3256192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":28,"moves":[141,154,170,91],"species":301},{"level":28,"moves":[33,120,124,108],"species":109}],"party_address":3223116,"script_address":2065806},{"address":3256232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":305},{"level":29,"species":178}],"party_address":3223148,"script_address":2202329},{"address":3256272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":358},{"level":27,"species":358},{"level":27,"species":358}],"party_address":3223164,"script_address":2202360},{"address":3256312,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":16,"species":392}],"party_address":3223188,"script_address":1971405},{"address":3256352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[76,219,225,93],"species":359},{"level":46,"moves":[47,18,204,185],"species":316},{"level":47,"moves":[89,73,202,92],"species":363},{"level":44,"moves":[48,85,161,103],"species":82},{"level":48,"moves":[104,91,94,248],"species":394}],"party_address":3223196,"script_address":2332607},{"address":3256392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[76,219,225,93],"species":359},{"level":49,"moves":[47,18,204,185],"species":316},{"level":50,"moves":[89,73,202,92],"species":363},{"level":47,"moves":[48,85,161,103],"species":82},{"level":51,"moves":[104,91,94,248],"species":394}],"party_address":3223276,"script_address":0},{"address":3256432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[76,219,225,93],"species":359},{"level":52,"moves":[47,18,204,185],"species":316},{"level":53,"moves":[89,73,202,92],"species":363},{"level":50,"moves":[48,85,161,103],"species":82},{"level":54,"moves":[104,91,94,248],"species":394}],"party_address":3223356,"script_address":0},{"address":3256472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[76,219,225,93],"species":359},{"level":55,"moves":[47,18,204,185],"species":316},{"level":56,"moves":[89,73,202,92],"species":363},{"level":53,"moves":[48,85,161,103],"species":82},{"level":57,"moves":[104,91,94,248],"species":394}],"party_address":3223436,"script_address":0},{"address":3256512,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223516,"script_address":1986165},{"address":3256552,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223548,"script_address":1986109},{"address":3256592,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223580,"script_address":1986137},{"address":3256632,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":218},{"level":32,"species":310},{"level":34,"species":278}],"party_address":3223612,"script_address":1986081},{"address":3256672,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":310},{"level":32,"species":297},{"level":34,"species":281}],"party_address":3223644,"script_address":1986025},{"address":3256712,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":369},{"level":32,"species":297},{"level":32,"species":218},{"level":34,"species":284}],"party_address":3223676,"script_address":1986053},{"address":3256752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":313},{"level":31,"species":72},{"level":32,"species":331}],"party_address":3223708,"script_address":2070644},{"address":3256792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":330},{"level":34,"species":73}],"party_address":3223732,"script_address":2070675},{"address":3256832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":129},{"level":25,"species":129},{"level":35,"species":130}],"party_address":3223748,"script_address":2070706},{"address":3256872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":44},{"level":34,"species":184}],"party_address":3223772,"script_address":2071552},{"address":3256912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":300},{"level":34,"species":320}],"party_address":3223788,"script_address":2071583},{"address":3256952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":67}],"party_address":3223804,"script_address":2070799},{"address":3256992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":72},{"level":31,"species":72},{"level":36,"species":313}],"party_address":3223812,"script_address":2071614},{"address":3257032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":305},{"level":32,"species":227}],"party_address":3223836,"script_address":2070737},{"address":3257072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":341},{"level":33,"species":331}],"party_address":3223852,"script_address":2073040},{"address":3257112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170}],"party_address":3223868,"script_address":2073071},{"address":3257152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":308},{"level":19,"species":308}],"party_address":3223876,"script_address":0},{"address":3257192,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[47,31,219,76],"species":358},{"level":35,"moves":[53,36,156,89],"species":339}],"party_address":3223892,"script_address":0},{"address":3257232,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":18,"moves":[74,78,72,73],"species":363},{"level":20,"moves":[111,205,44,88],"species":75}],"party_address":3223924,"script_address":0},{"address":3257272,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":27,"moves":[16,60,92,182],"species":294},{"level":27,"moves":[16,72,213,78],"species":292}],"party_address":3223956,"script_address":0},{"address":3257312,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[94,7,244,182],"species":357},{"level":39,"moves":[8,61,156,187],"species":336}],"party_address":3223988,"script_address":0},{"address":3257352,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[94,7,244,182],"species":357},{"level":43,"moves":[8,61,156,187],"species":336}],"party_address":3224020,"script_address":0},{"address":3257392,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[94,7,244,182],"species":357},{"level":46,"moves":[8,61,156,187],"species":336}],"party_address":3224052,"script_address":0},{"address":3257432,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":49,"moves":[94,7,244,182],"species":357},{"level":49,"moves":[8,61,156,187],"species":336}],"party_address":3224084,"script_address":0},{"address":3257472,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[94,7,244,182],"species":357},{"level":52,"moves":[8,61,156,187],"species":336}],"party_address":3224116,"script_address":0},{"address":3257512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":184},{"level":33,"species":309}],"party_address":3224148,"script_address":0},{"address":3257552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":170},{"level":33,"species":330}],"party_address":3224164,"script_address":0},{"address":3257592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":170},{"level":40,"species":330}],"party_address":3224180,"script_address":0},{"address":3257632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":45,"species":171},{"level":43,"species":330}],"party_address":3224196,"script_address":0},{"address":3257672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":48,"species":171},{"level":46,"species":331}],"party_address":3224212,"script_address":0},{"address":3257712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":51,"species":171},{"level":49,"species":331}],"party_address":3224228,"script_address":0},{"address":3257752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":27,"species":118},{"level":25,"species":72}],"party_address":3224244,"script_address":0},{"address":3257792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":129},{"level":20,"species":72},{"level":26,"species":328},{"level":23,"species":330}],"party_address":3224260,"script_address":2061605},{"address":3257832,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":288},{"level":8,"species":286}],"party_address":3224292,"script_address":2054707},{"address":3257872,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":8,"species":295},{"level":8,"species":288}],"party_address":3224308,"script_address":2054676},{"address":3257912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":9,"species":129}],"party_address":3224324,"script_address":2030343},{"address":3257952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":183}],"party_address":3224332,"script_address":2036307},{"address":3257992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":12,"species":72},{"level":12,"species":72}],"party_address":3224340,"script_address":2036276},{"address":3258032,"battle_type":0,"data_type":"ITEM_DEFAULT_MOVES","party":[{"level":14,"species":354},{"level":14,"species":353}],"party_address":3224356,"script_address":2039032},{"address":3258072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":337},{"level":14,"species":100}],"party_address":3224372,"script_address":2039063},{"address":3258112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":81}],"party_address":3224388,"script_address":2039094},{"address":3258152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":100}],"party_address":3224396,"script_address":2026463},{"address":3258192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":335}],"party_address":3224404,"script_address":2026494},{"address":3258232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":27}],"party_address":3224412,"script_address":2046975},{"address":3258272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":363}],"party_address":3224420,"script_address":2047006},{"address":3258312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306}],"party_address":3224428,"script_address":2046944},{"address":3258352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339}],"party_address":3224436,"script_address":2046913},{"address":3258392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":183},{"level":19,"species":296}],"party_address":3224444,"script_address":2050969},{"address":3258432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":227},{"level":19,"species":305}],"party_address":3224460,"script_address":2051000},{"address":3258472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":318},{"level":18,"species":27}],"party_address":3224476,"script_address":2051031},{"address":3258512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":382},{"level":18,"species":382}],"party_address":3224492,"script_address":2051062},{"address":3258552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":296},{"level":18,"species":183}],"party_address":3224508,"script_address":2052309},{"address":3258592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":323}],"party_address":3224524,"script_address":2052371},{"address":3258632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":19,"species":299}],"party_address":3224532,"script_address":2052340},{"address":3258672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":14,"species":288},{"level":14,"species":382},{"level":14,"species":337}],"party_address":3224540,"script_address":2059128},{"address":3258712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224564,"script_address":2347841},{"address":3258752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224572,"script_address":2347872},{"address":3258792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224580,"script_address":2348597},{"address":3258832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":41}],"party_address":3224588,"script_address":2348628},{"address":3258872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":318},{"level":28,"species":339}],"party_address":3224604,"script_address":2348659},{"address":3258912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224620,"script_address":2349324},{"address":3258952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224628,"script_address":2349355},{"address":3258992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":286}],"party_address":3224636,"script_address":2349386},{"address":3259032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224644,"script_address":2350264},{"address":3259072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224652,"script_address":2350826},{"address":3259112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224660,"script_address":2351566},{"address":3259152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224668,"script_address":2351597},{"address":3259192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":41}],"party_address":3224676,"script_address":2351628},{"address":3259232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":287}],"party_address":3224684,"script_address":2348566},{"address":3259272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":339}],"party_address":3224692,"script_address":2349293},{"address":3259312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":318}],"party_address":3224700,"script_address":2350295},{"address":3259352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":339},{"level":28,"species":287},{"level":30,"species":41},{"level":33,"species":340}],"party_address":3224708,"script_address":2351659},{"address":3259392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":310},{"level":33,"species":340}],"party_address":3224740,"script_address":2073763},{"address":3259432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":42,"species":287},{"level":43,"species":169},{"level":44,"species":340}],"party_address":3224756,"script_address":0},{"address":3259472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":72}],"party_address":3224780,"script_address":2026525},{"address":3259512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":15,"species":183}],"party_address":3224788,"script_address":2026556},{"address":3259552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":27},{"level":25,"species":27}],"party_address":3224796,"script_address":2033726},{"address":3259592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":304},{"level":25,"species":309}],"party_address":3224812,"script_address":2033695},{"address":3259632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":120}],"party_address":3224828,"script_address":2034744},{"address":3259672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":309},{"level":24,"species":66},{"level":24,"species":72}],"party_address":3224836,"script_address":2034931},{"address":3259712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":24,"species":338},{"level":24,"species":305},{"level":24,"species":338}],"party_address":3224860,"script_address":2034900},{"address":3259752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":227},{"level":25,"species":227}],"party_address":3224884,"script_address":2036338},{"address":3259792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":183},{"level":22,"species":296}],"party_address":3224900,"script_address":2047037},{"address":3259832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":27},{"level":22,"species":28}],"party_address":3224916,"script_address":2047068},{"address":3259872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":22,"species":304},{"level":22,"species":299}],"party_address":3224932,"script_address":2047099},{"address":3259912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":339},{"level":18,"species":218}],"party_address":3224948,"script_address":2049891},{"address":3259952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":306},{"level":18,"species":363}],"party_address":3224964,"script_address":2049922},{"address":3259992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":84},{"level":26,"species":85}],"party_address":3224980,"script_address":2053203},{"address":3260032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":302},{"level":26,"species":367}],"party_address":3224996,"script_address":2053234},{"address":3260072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":64},{"level":26,"species":393}],"party_address":3225012,"script_address":2053265},{"address":3260112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":356},{"level":26,"species":335}],"party_address":3225028,"script_address":2053296},{"address":3260152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":18,"species":356},{"level":18,"species":351}],"party_address":3225044,"script_address":2053327},{"address":3260192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":74},{"level":8,"species":74}],"party_address":3225060,"script_address":2054738},{"address":3260232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":8,"species":306},{"level":8,"species":295}],"party_address":3225076,"script_address":2054769},{"address":3260272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":84}],"party_address":3225092,"script_address":2057834},{"address":3260312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":392}],"party_address":3225100,"script_address":2057865},{"address":3260352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":17,"species":356}],"party_address":3225108,"script_address":2057896},{"address":3260392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":363},{"level":33,"species":357}],"party_address":3225116,"script_address":2073825},{"address":3260432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":338}],"party_address":3225132,"script_address":2061636},{"address":3260472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":218},{"level":25,"species":339}],"party_address":3225140,"script_address":2061667},{"address":3260512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":118}],"party_address":3225156,"script_address":2061698},{"address":3260552,"battle_type":0,"data_type":"NO_ITEM_CUSTOM_MOVES","party":[{"level":30,"moves":[87,98,86,0],"species":338}],"party_address":3225164,"script_address":2065837},{"address":3260592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":356},{"level":28,"species":335}],"party_address":3225180,"script_address":2065868},{"address":3260632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":294},{"level":29,"species":292}],"party_address":3225196,"script_address":2067487},{"address":3260672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":335},{"level":25,"species":309},{"level":25,"species":369},{"level":25,"species":288},{"level":25,"species":337},{"level":25,"species":339}],"party_address":3225212,"script_address":2067518},{"address":3260712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":25,"species":286},{"level":25,"species":306},{"level":25,"species":337},{"level":25,"species":183},{"level":25,"species":27},{"level":25,"species":367}],"party_address":3225260,"script_address":2067549},{"address":3260752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":29,"species":371},{"level":29,"species":365}],"party_address":3225308,"script_address":2067611},{"address":3260792,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":295},{"level":15,"species":280}],"party_address":3225324,"script_address":1978255},{"address":3260832,"battle_type":3,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":13,"species":321},{"level":15,"species":283}],"party_address":3225340,"script_address":1978286},{"address":3260872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":32,"moves":[182,205,222,153],"species":76},{"level":35,"moves":[14,58,57,157],"species":140},{"level":35,"moves":[231,153,46,157],"species":95},{"level":37,"moves":[104,153,182,157],"species":320}],"party_address":3225356,"script_address":0},{"address":3260912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":37,"moves":[182,58,157,57],"species":138},{"level":37,"moves":[182,205,222,153],"species":76},{"level":40,"moves":[14,58,57,157],"species":141},{"level":40,"moves":[231,153,46,157],"species":95},{"level":42,"moves":[104,153,182,157],"species":320}],"party_address":3225420,"script_address":0},{"address":3260952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[182,58,157,57],"species":139},{"level":42,"moves":[182,205,89,153],"species":76},{"level":45,"moves":[14,58,57,157],"species":141},{"level":45,"moves":[231,153,46,157],"species":95},{"level":47,"moves":[104,153,182,157],"species":320}],"party_address":3225500,"script_address":0},{"address":3260992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[157,63,48,182],"species":142},{"level":47,"moves":[8,205,89,153],"species":76},{"level":47,"moves":[182,58,157,57],"species":139},{"level":50,"moves":[14,58,57,157],"species":141},{"level":50,"moves":[231,153,46,157],"species":208},{"level":52,"moves":[104,153,182,157],"species":320}],"party_address":3225580,"script_address":0},{"address":3261032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":33,"moves":[2,157,8,83],"species":68},{"level":33,"moves":[94,113,115,8],"species":356},{"level":35,"moves":[228,68,182,167],"species":237},{"level":37,"moves":[252,8,187,89],"species":336}],"party_address":3225676,"script_address":0},{"address":3261072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[2,157,8,83],"species":68},{"level":38,"moves":[94,113,115,8],"species":357},{"level":40,"moves":[228,68,182,167],"species":237},{"level":42,"moves":[252,8,187,89],"species":336}],"party_address":3225740,"script_address":0},{"address":3261112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[71,182,7,8],"species":107},{"level":43,"moves":[2,157,8,83],"species":68},{"level":43,"moves":[8,113,115,94],"species":357},{"level":45,"moves":[228,68,182,167],"species":237},{"level":47,"moves":[252,8,187,89],"species":336}],"party_address":3225804,"script_address":0},{"address":3261152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[25,8,89,83],"species":106},{"level":46,"moves":[71,182,7,8],"species":107},{"level":48,"moves":[238,157,8,83],"species":68},{"level":48,"moves":[8,113,115,94],"species":357},{"level":50,"moves":[228,68,182,167],"species":237},{"level":52,"moves":[252,8,187,89],"species":336}],"party_address":3225884,"script_address":0},{"address":3261192,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":36,"moves":[87,182,86,113],"species":179},{"level":36,"moves":[205,87,153,240],"species":101},{"level":38,"moves":[48,182,87,240],"species":82},{"level":40,"moves":[44,86,87,182],"species":338}],"party_address":3225980,"script_address":0},{"address":3261232,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":39,"moves":[87,21,240,95],"species":25},{"level":41,"moves":[87,182,86,113],"species":180},{"level":41,"moves":[205,87,153,240],"species":101},{"level":43,"moves":[48,182,87,240],"species":82},{"level":45,"moves":[44,86,87,182],"species":338}],"party_address":3226044,"script_address":0},{"address":3261272,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":44,"moves":[87,21,240,182],"species":26},{"level":46,"moves":[87,182,86,113],"species":181},{"level":46,"moves":[205,87,153,240],"species":101},{"level":48,"moves":[48,182,87,240],"species":82},{"level":50,"moves":[44,86,87,182],"species":338}],"party_address":3226124,"script_address":0},{"address":3261312,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[129,8,9,113],"species":125},{"level":51,"moves":[87,21,240,182],"species":26},{"level":51,"moves":[87,182,86,113],"species":181},{"level":53,"moves":[205,87,153,240],"species":101},{"level":53,"moves":[48,182,87,240],"species":82},{"level":55,"moves":[44,86,87,182],"species":338}],"party_address":3226204,"script_address":0},{"address":3261352,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":38,"moves":[59,213,113,157],"species":219},{"level":36,"moves":[53,213,76,84],"species":77},{"level":38,"moves":[59,241,89,213],"species":340},{"level":40,"moves":[59,241,153,213],"species":321}],"party_address":3226300,"script_address":0},{"address":3261392,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":41,"moves":[14,53,46,241],"species":58},{"level":43,"moves":[59,213,113,157],"species":219},{"level":41,"moves":[53,213,76,84],"species":77},{"level":43,"moves":[59,241,89,213],"species":340},{"level":45,"moves":[59,241,153,213],"species":321}],"party_address":3226364,"script_address":0},{"address":3261432,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[46,76,13,241],"species":228},{"level":46,"moves":[14,53,241,46],"species":58},{"level":48,"moves":[59,213,113,157],"species":219},{"level":46,"moves":[53,213,76,84],"species":78},{"level":48,"moves":[59,241,89,213],"species":340},{"level":50,"moves":[59,241,153,213],"species":321}],"party_address":3226444,"script_address":0},{"address":3261472,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":51,"moves":[14,53,241,46],"species":59},{"level":53,"moves":[59,213,113,157],"species":219},{"level":51,"moves":[46,76,13,241],"species":229},{"level":51,"moves":[53,213,76,84],"species":78},{"level":53,"moves":[59,241,89,213],"species":340},{"level":55,"moves":[59,241,153,213],"species":321}],"party_address":3226540,"script_address":0},{"address":3261512,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":42,"moves":[113,47,29,8],"species":113},{"level":42,"moves":[59,247,38,126],"species":366},{"level":43,"moves":[42,29,7,95],"species":308},{"level":45,"moves":[63,53,85,247],"species":366}],"party_address":3226636,"script_address":0},{"address":3261552,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":47,"moves":[59,247,38,126],"species":366},{"level":47,"moves":[113,47,29,8],"species":113},{"level":45,"moves":[252,146,203,179],"species":115},{"level":48,"moves":[42,29,7,95],"species":308},{"level":50,"moves":[63,53,85,247],"species":366}],"party_address":3226700,"script_address":0},{"address":3261592,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":52,"moves":[59,247,38,126],"species":366},{"level":52,"moves":[113,47,29,8],"species":242},{"level":50,"moves":[252,146,203,179],"species":115},{"level":53,"moves":[42,29,7,95],"species":308},{"level":55,"moves":[63,53,85,247],"species":366}],"party_address":3226780,"script_address":0},{"address":3261632,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":57,"moves":[59,247,38,126],"species":366},{"level":57,"moves":[182,47,29,8],"species":242},{"level":55,"moves":[252,146,203,179],"species":115},{"level":57,"moves":[36,182,126,89],"species":128},{"level":58,"moves":[42,29,7,95],"species":308},{"level":60,"moves":[63,53,85,247],"species":366}],"party_address":3226860,"script_address":0},{"address":3261672,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":40,"moves":[86,85,182,58],"species":147},{"level":38,"moves":[241,76,76,89],"species":369},{"level":41,"moves":[57,48,182,76],"species":310},{"level":43,"moves":[18,191,211,76],"species":227},{"level":45,"moves":[76,156,93,89],"species":359}],"party_address":3226956,"script_address":0},{"address":3261712,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":43,"moves":[95,94,115,138],"species":163},{"level":43,"moves":[241,76,76,89],"species":369},{"level":45,"moves":[86,85,182,58],"species":148},{"level":46,"moves":[57,48,182,76],"species":310},{"level":48,"moves":[18,191,211,76],"species":227},{"level":50,"moves":[76,156,93,89],"species":359}],"party_address":3227036,"script_address":0},{"address":3261752,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[95,94,115,138],"species":164},{"level":49,"moves":[241,76,76,89],"species":369},{"level":50,"moves":[86,85,182,58],"species":148},{"level":51,"moves":[57,48,182,76],"species":310},{"level":53,"moves":[18,191,211,76],"species":227},{"level":55,"moves":[76,156,93,89],"species":359}],"party_address":3227132,"script_address":0},{"address":3261792,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,94,115,138],"species":164},{"level":54,"moves":[241,76,76,89],"species":369},{"level":55,"moves":[57,48,182,76],"species":310},{"level":55,"moves":[63,85,89,58],"species":149},{"level":58,"moves":[18,191,211,76],"species":227},{"level":60,"moves":[143,156,93,89],"species":359}],"party_address":3227228,"script_address":0},{"address":3261832,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":48,"moves":[25,94,91,182],"species":79},{"level":49,"moves":[89,246,94,113],"species":319},{"level":49,"moves":[94,156,109,91],"species":178},{"level":50,"moves":[89,94,156,91],"species":348},{"level":50,"moves":[241,76,94,53],"species":349}],"party_address":3227324,"script_address":0},{"address":3261872,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":53,"moves":[95,138,29,182],"species":96},{"level":53,"moves":[25,94,91,182],"species":79},{"level":54,"moves":[89,153,94,113],"species":319},{"level":54,"moves":[94,156,109,91],"species":178},{"level":55,"moves":[89,94,156,91],"species":348},{"level":55,"moves":[241,76,94,53],"species":349}],"party_address":3227404,"script_address":0},{"address":3261912,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":58,"moves":[95,138,29,182],"species":97},{"level":59,"moves":[89,153,94,113],"species":319},{"level":58,"moves":[25,94,91,182],"species":79},{"level":59,"moves":[94,156,109,91],"species":178},{"level":60,"moves":[89,94,156,91],"species":348},{"level":60,"moves":[241,76,94,53],"species":349}],"party_address":3227500,"script_address":0},{"address":3261952,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":63,"moves":[95,138,29,182],"species":97},{"level":64,"moves":[89,153,94,113],"species":319},{"level":63,"moves":[25,94,91,182],"species":199},{"level":64,"moves":[94,156,109,91],"species":178},{"level":65,"moves":[89,94,156,91],"species":348},{"level":65,"moves":[241,76,94,53],"species":349}],"party_address":3227596,"script_address":0},{"address":3261992,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":46,"moves":[95,240,182,56],"species":60},{"level":46,"moves":[240,96,104,90],"species":324},{"level":48,"moves":[96,34,182,58],"species":343},{"level":48,"moves":[156,152,13,104],"species":327},{"level":51,"moves":[96,104,58,156],"species":230}],"party_address":3227692,"script_address":0},{"address":3262032,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":50,"moves":[95,240,182,56],"species":61},{"level":51,"moves":[240,96,104,90],"species":324},{"level":53,"moves":[96,34,182,58],"species":343},{"level":53,"moves":[156,12,13,104],"species":327},{"level":56,"moves":[96,104,58,156],"species":230}],"party_address":3227772,"script_address":0},{"address":3262072,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":56,"moves":[56,195,58,109],"species":131},{"level":58,"moves":[240,96,104,90],"species":324},{"level":56,"moves":[95,240,182,56],"species":61},{"level":58,"moves":[96,34,182,58],"species":343},{"level":58,"moves":[156,12,13,104],"species":327},{"level":61,"moves":[96,104,58,156],"species":230}],"party_address":3227852,"script_address":0},{"address":3262112,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":61,"moves":[56,195,58,109],"species":131},{"level":63,"moves":[240,96,104,90],"species":324},{"level":61,"moves":[95,240,56,195],"species":186},{"level":63,"moves":[96,34,182,73],"species":343},{"level":63,"moves":[156,12,13,104],"species":327},{"level":66,"moves":[96,104,58,156],"species":230}],"party_address":3227948,"script_address":0},{"address":3262152,"battle_type":0,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":17,"moves":[95,98,204,0],"species":387},{"level":17,"moves":[95,98,109,0],"species":386}],"party_address":3228044,"script_address":2167732},{"address":3262192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":369}],"party_address":3228076,"script_address":2202422},{"address":3262232,"battle_type":3,"data_type":"ITEM_CUSTOM_MOVES","party":[{"level":77,"moves":[92,76,191,211],"species":227},{"level":75,"moves":[115,113,246,89],"species":319},{"level":76,"moves":[87,89,76,81],"species":384},{"level":76,"moves":[202,246,19,109],"species":389},{"level":76,"moves":[96,246,76,163],"species":391},{"level":78,"moves":[89,94,53,247],"species":400}],"party_address":3228084,"script_address":2354502},{"address":3262272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228180,"script_address":0},{"address":3262312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228188,"script_address":0},{"address":3262352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228196,"script_address":0},{"address":3262392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228204,"script_address":0},{"address":3262432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228212,"script_address":0},{"address":3262472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228220,"script_address":0},{"address":3262512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":398}],"party_address":3228228,"script_address":0},{"address":3262552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":27},{"level":31,"species":27}],"party_address":3228236,"script_address":0},{"address":3262592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":320},{"level":33,"species":27},{"level":33,"species":27}],"party_address":3228252,"script_address":0},{"address":3262632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":320},{"level":35,"species":27},{"level":35,"species":27}],"party_address":3228276,"script_address":0},{"address":3262672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":320},{"level":37,"species":28},{"level":37,"species":28}],"party_address":3228300,"script_address":0},{"address":3262712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":309},{"level":30,"species":66},{"level":30,"species":72}],"party_address":3228324,"script_address":0},{"address":3262752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":32,"species":310},{"level":32,"species":66},{"level":32,"species":72}],"party_address":3228348,"script_address":0},{"address":3262792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":310},{"level":34,"species":66},{"level":34,"species":73}],"party_address":3228372,"script_address":0},{"address":3262832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":310},{"level":36,"species":67},{"level":36,"species":73}],"party_address":3228396,"script_address":0},{"address":3262872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":120},{"level":37,"species":120}],"party_address":3228420,"script_address":0},{"address":3262912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":309},{"level":39,"species":120},{"level":39,"species":120}],"party_address":3228436,"script_address":0},{"address":3262952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":310},{"level":41,"species":120},{"level":41,"species":120}],"party_address":3228460,"script_address":0},{"address":3262992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":310},{"level":43,"species":121},{"level":43,"species":121}],"party_address":3228484,"script_address":0},{"address":3263032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":67},{"level":37,"species":67}],"party_address":3228508,"script_address":0},{"address":3263072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":335},{"level":39,"species":67},{"level":39,"species":67}],"party_address":3228524,"script_address":0},{"address":3263112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":336},{"level":41,"species":67},{"level":41,"species":67}],"party_address":3228548,"script_address":0},{"address":3263152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":43,"species":336},{"level":43,"species":68},{"level":43,"species":68}],"party_address":3228572,"script_address":0},{"address":3263192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":371},{"level":35,"species":365}],"party_address":3228596,"script_address":0},{"address":3263232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":308},{"level":37,"species":371},{"level":37,"species":365}],"party_address":3228612,"script_address":0},{"address":3263272,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":308},{"level":39,"species":371},{"level":39,"species":365}],"party_address":3228636,"script_address":0},{"address":3263312,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":308},{"level":41,"species":372},{"level":41,"species":366}],"party_address":3228660,"script_address":0},{"address":3263352,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":337},{"level":35,"species":337},{"level":35,"species":371}],"party_address":3228684,"script_address":0},{"address":3263392,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":337},{"level":37,"species":338},{"level":37,"species":371}],"party_address":3228708,"script_address":0},{"address":3263432,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":39,"species":338},{"level":39,"species":338},{"level":39,"species":371}],"party_address":3228732,"script_address":0},{"address":3263472,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":338},{"level":41,"species":338},{"level":41,"species":372}],"party_address":3228756,"script_address":0},{"address":3263512,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":26,"species":74},{"level":26,"species":339}],"party_address":3228780,"script_address":0},{"address":3263552,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":28,"species":66},{"level":28,"species":339},{"level":28,"species":75}],"party_address":3228796,"script_address":0},{"address":3263592,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":30,"species":66},{"level":30,"species":339},{"level":30,"species":75}],"party_address":3228820,"script_address":0},{"address":3263632,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":67},{"level":33,"species":340},{"level":33,"species":76}],"party_address":3228844,"script_address":0},{"address":3263672,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":31,"species":315},{"level":31,"species":287},{"level":31,"species":288},{"level":31,"species":295},{"level":31,"species":298},{"level":31,"species":304}],"party_address":3228868,"script_address":0},{"address":3263712,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":33,"species":315},{"level":33,"species":287},{"level":33,"species":289},{"level":33,"species":296},{"level":33,"species":299},{"level":33,"species":304}],"party_address":3228916,"script_address":0},{"address":3263752,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":35,"species":316},{"level":35,"species":287},{"level":35,"species":289},{"level":35,"species":296},{"level":35,"species":299},{"level":35,"species":305}],"party_address":3228964,"script_address":0},{"address":3263792,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":37,"species":316},{"level":37,"species":287},{"level":37,"species":289},{"level":37,"species":297},{"level":37,"species":300},{"level":37,"species":305}],"party_address":3229012,"script_address":0},{"address":3263832,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":34,"species":313},{"level":34,"species":116}],"party_address":3229060,"script_address":0},{"address":3263872,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":36,"species":325},{"level":36,"species":313},{"level":36,"species":117}],"party_address":3229076,"script_address":0},{"address":3263912,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":38,"species":325},{"level":38,"species":313},{"level":38,"species":117}],"party_address":3229100,"script_address":0},{"address":3263952,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":40,"species":325},{"level":40,"species":314},{"level":40,"species":230}],"party_address":3229124,"script_address":0},{"address":3263992,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":411}],"party_address":3229148,"script_address":2564791},{"address":3264032,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":378},{"level":41,"species":64}],"party_address":3229156,"script_address":2564822},{"address":3264072,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":41,"species":202}],"party_address":3229172,"script_address":0},{"address":3264112,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":4}],"party_address":3229180,"script_address":0},{"address":3264152,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":1}],"party_address":3229188,"script_address":0},{"address":3264192,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":405}],"party_address":3229196,"script_address":0},{"address":3264232,"battle_type":0,"data_type":"NO_ITEM_DEFAULT_MOVES","party":[{"level":5,"species":404}],"party_address":3229204,"script_address":0}],"warps":{"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4":"MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0","MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2":"MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1","MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10","MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2":"MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11","MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3":"MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2","MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0":"MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4","MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3":"MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5","MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2":"MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6","MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4":"MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7","MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0":"MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8","MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9","MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2":"MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0","MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0":"MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1","MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0":"MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2","MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1":"MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3","MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2":"MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4","MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0":"MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5","MAP_ABANDONED_SHIP_CORRIDORS_B1F:6/MAP_ABANDONED_SHIP_CORRIDORS_1F:10":"MAP_ABANDONED_SHIP_CORRIDORS_1F:10/MAP_ABANDONED_SHIP_CORRIDORS_B1F:6","MAP_ABANDONED_SHIP_CORRIDORS_B1F:7/MAP_ABANDONED_SHIP_CORRIDORS_1F:9":"MAP_ABANDONED_SHIP_CORRIDORS_1F:9/MAP_ABANDONED_SHIP_CORRIDORS_B1F:7","MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0":"MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0","MAP_ABANDONED_SHIP_DECK:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_1F:0,1/MAP_ABANDONED_SHIP_DECK:2","MAP_ABANDONED_SHIP_DECK:3/MAP_ABANDONED_SHIP_CORRIDORS_1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_1F:2,3/MAP_ABANDONED_SHIP_DECK:3","MAP_ABANDONED_SHIP_DECK:4/MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0":"MAP_ABANDONED_SHIP_CAPTAINS_OFFICE:0,1/MAP_ABANDONED_SHIP_DECK:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0,1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2,3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4,5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:2/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:4","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:4/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:7","MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5":"MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8","MAP_ABANDONED_SHIP_ROOMS2_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:8":"MAP_ABANDONED_SHIP_CORRIDORS_1F:8/MAP_ABANDONED_SHIP_ROOMS2_1F:0","MAP_ABANDONED_SHIP_ROOMS2_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:11":"MAP_ABANDONED_SHIP_CORRIDORS_1F:11/MAP_ABANDONED_SHIP_ROOMS2_1F:2","MAP_ABANDONED_SHIP_ROOMS2_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:1":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:1/MAP_ABANDONED_SHIP_ROOMS2_B1F:0","MAP_ABANDONED_SHIP_ROOMS2_B1F:2,3/MAP_ABANDONED_SHIP_CORRIDORS_B1F:0":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:0/MAP_ABANDONED_SHIP_ROOMS2_B1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_1F:4/MAP_ABANDONED_SHIP_ROOMS_1F:0","MAP_ABANDONED_SHIP_ROOMS_1F:2/MAP_ABANDONED_SHIP_CORRIDORS_1F:6":"MAP_ABANDONED_SHIP_CORRIDORS_1F:6/MAP_ABANDONED_SHIP_ROOMS_1F:2","MAP_ABANDONED_SHIP_ROOMS_1F:3,5/MAP_ABANDONED_SHIP_CORRIDORS_1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_1F:5/MAP_ABANDONED_SHIP_ROOMS_1F:3","MAP_ABANDONED_SHIP_ROOMS_1F:4/MAP_ABANDONED_SHIP_CORRIDORS_1F:7":"MAP_ABANDONED_SHIP_CORRIDORS_1F:7/MAP_ABANDONED_SHIP_ROOMS_1F:4","MAP_ABANDONED_SHIP_ROOMS_B1F:0/MAP_ABANDONED_SHIP_CORRIDORS_B1F:2":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:2/MAP_ABANDONED_SHIP_ROOMS_B1F:0","MAP_ABANDONED_SHIP_ROOMS_B1F:1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:3":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:3/MAP_ABANDONED_SHIP_ROOMS_B1F:1","MAP_ABANDONED_SHIP_ROOMS_B1F:2/MAP_ABANDONED_SHIP_CORRIDORS_B1F:4":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:4/MAP_ABANDONED_SHIP_ROOMS_B1F:2","MAP_ABANDONED_SHIP_ROOM_B1F:0,1/MAP_ABANDONED_SHIP_CORRIDORS_B1F:5":"MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0","MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0":"MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0","MAP_ABANDONED_SHIP_UNDERWATER2:0/MAP_ABANDONED_SHIP_UNDERWATER1:0":"MAP_ABANDONED_SHIP_UNDERWATER1:0,1/MAP_ABANDONED_SHIP_UNDERWATER2:0","MAP_ALTERING_CAVE:0/MAP_ROUTE103:0":"MAP_ROUTE103:0/MAP_ALTERING_CAVE:0","MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0":"MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0","MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2":"MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1","MAP_ANCIENT_TOMB:2/MAP_ANCIENT_TOMB:1":"MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2","MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6":"MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0","MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0":"MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2","MAP_AQUA_HIDEOUT_B1F:0/MAP_AQUA_HIDEOUT_1F:2":"MAP_AQUA_HIDEOUT_1F:2/MAP_AQUA_HIDEOUT_B1F:0","MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0":"MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1","MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6":"MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10","MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22":"MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11","MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9":"MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12","MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18":"MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13","MAP_AQUA_HIDEOUT_B1F:14/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16":"MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15","MAP_AQUA_HIDEOUT_B1F:16/MAP_AQUA_HIDEOUT_B1F:15":"MAP_AQUA_HIDEOUT_B1F:15/MAP_AQUA_HIDEOUT_B1F:16","MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20":"MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17","MAP_AQUA_HIDEOUT_B1F:18/MAP_AQUA_HIDEOUT_B1F:13":"MAP_AQUA_HIDEOUT_B1F:13/MAP_AQUA_HIDEOUT_B1F:18","MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24":"MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19","MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1":"MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2","MAP_AQUA_HIDEOUT_B1F:20/MAP_AQUA_HIDEOUT_B1F:17":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:21/MAP_AQUA_HIDEOUT_B1F:12!":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B1F:22/MAP_AQUA_HIDEOUT_B1F:11":"MAP_AQUA_HIDEOUT_B1F:11/MAP_AQUA_HIDEOUT_B1F:22","MAP_AQUA_HIDEOUT_B1F:23/MAP_AQUA_HIDEOUT_B1F:17!":"MAP_AQUA_HIDEOUT_B1F:17/MAP_AQUA_HIDEOUT_B1F:20","MAP_AQUA_HIDEOUT_B1F:24/MAP_AQUA_HIDEOUT_B1F:19":"MAP_AQUA_HIDEOUT_B1F:19/MAP_AQUA_HIDEOUT_B1F:24","MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2":"MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3","MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7":"MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4","MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8":"MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5","MAP_AQUA_HIDEOUT_B1F:6/MAP_AQUA_HIDEOUT_B1F:10":"MAP_AQUA_HIDEOUT_B1F:10/MAP_AQUA_HIDEOUT_B1F:6","MAP_AQUA_HIDEOUT_B1F:7/MAP_AQUA_HIDEOUT_B1F:4":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_AQUA_HIDEOUT_B1F:8/MAP_AQUA_HIDEOUT_B1F:5":"MAP_AQUA_HIDEOUT_B1F:5/MAP_AQUA_HIDEOUT_B1F:8","MAP_AQUA_HIDEOUT_B1F:9/MAP_AQUA_HIDEOUT_B1F:12":"MAP_AQUA_HIDEOUT_B1F:12/MAP_AQUA_HIDEOUT_B1F:9","MAP_AQUA_HIDEOUT_B2F:0/MAP_AQUA_HIDEOUT_B1F:1":"MAP_AQUA_HIDEOUT_B1F:1/MAP_AQUA_HIDEOUT_B2F:0","MAP_AQUA_HIDEOUT_B2F:1/MAP_AQUA_HIDEOUT_B1F:2":"MAP_AQUA_HIDEOUT_B1F:2/MAP_AQUA_HIDEOUT_B2F:1","MAP_AQUA_HIDEOUT_B2F:2/MAP_AQUA_HIDEOUT_B1F:3":"MAP_AQUA_HIDEOUT_B1F:3/MAP_AQUA_HIDEOUT_B2F:2","MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5":"MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3","MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8":"MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4","MAP_AQUA_HIDEOUT_B2F:5/MAP_AQUA_HIDEOUT_B2F:3":"MAP_AQUA_HIDEOUT_B2F:3/MAP_AQUA_HIDEOUT_B2F:5","MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7":"MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6","MAP_AQUA_HIDEOUT_B2F:7/MAP_AQUA_HIDEOUT_B2F:6":"MAP_AQUA_HIDEOUT_B2F:6/MAP_AQUA_HIDEOUT_B2F:7","MAP_AQUA_HIDEOUT_B2F:8/MAP_AQUA_HIDEOUT_B2F:4":"MAP_AQUA_HIDEOUT_B2F:4/MAP_AQUA_HIDEOUT_B2F:8","MAP_AQUA_HIDEOUT_B2F:9/MAP_AQUA_HIDEOUT_B1F:4!":"MAP_AQUA_HIDEOUT_B1F:4/MAP_AQUA_HIDEOUT_B1F:7","MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0","MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1":"MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1","MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0","MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1":"MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1","MAP_BATTLE_COLOSSEUM_2P:0,1/MAP_DYNAMIC:-1!":"","MAP_BATTLE_COLOSSEUM_4P:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:3/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0!":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2","MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0","MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2","MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0","MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0","MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0","MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0","MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0","MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0","MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0","MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0","MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0","MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0","MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0":"MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0":"MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0":"MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0":"MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0":"MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0":"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0":"MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0":"MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8","MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0":"MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0":"MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0":"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0":"MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0":"MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0":"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0":"MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0":"MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8","MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1":"MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2":"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4":"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0","MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1","MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5":"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0","MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0":"MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0","MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0":"MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0","MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1":"MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0","MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3":"MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0","MAP_CAVE_OF_ORIGIN_ENTRANCE:1/MAP_CAVE_OF_ORIGIN_1F:0":"MAP_CAVE_OF_ORIGIN_1F:0/MAP_CAVE_OF_ORIGIN_ENTRANCE:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:0/MAP_CAVE_OF_ORIGIN_1F:1!":"MAP_CAVE_OF_ORIGIN_1F:1/MAP_CAVE_OF_ORIGIN_B1F:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1":"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0","MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:1/MAP_CAVE_OF_ORIGIN_B1F:0!":"MAP_CAVE_OF_ORIGIN_B1F:0/MAP_CAVE_OF_ORIGIN_1F:1","MAP_DESERT_RUINS:0/MAP_ROUTE111:1":"MAP_ROUTE111:1/MAP_DESERT_RUINS:0","MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2":"MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1","MAP_DESERT_RUINS:2/MAP_DESERT_RUINS:1":"MAP_DESERT_RUINS:1/MAP_DESERT_RUINS:2","MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0","MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0":"MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0","MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1","MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0":"MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2","MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0":"MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3","MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0":"MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4","MAP_DEWFORD_TOWN_GYM:0,1/MAP_DEWFORD_TOWN:2":"MAP_DEWFORD_TOWN:2/MAP_DEWFORD_TOWN_GYM:0","MAP_DEWFORD_TOWN_HALL:0,1/MAP_DEWFORD_TOWN:0":"MAP_DEWFORD_TOWN:0/MAP_DEWFORD_TOWN_HALL:0","MAP_DEWFORD_TOWN_HOUSE1:0,1/MAP_DEWFORD_TOWN:3":"MAP_DEWFORD_TOWN:3/MAP_DEWFORD_TOWN_HOUSE1:0","MAP_DEWFORD_TOWN_HOUSE2:0,1/MAP_DEWFORD_TOWN:4":"MAP_DEWFORD_TOWN:4/MAP_DEWFORD_TOWN_HOUSE2:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0,1/MAP_DEWFORD_TOWN:1":"MAP_DEWFORD_TOWN:1/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0":"MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0/MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2":"MAP_DEWFORD_TOWN_POKEMON_CENTER_1F:2/MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:0","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_DEWFORD_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0","MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1","MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0":"MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2","MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1":"MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1":"MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0","MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0":"MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1":"MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0","MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0":"MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1":"MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0","MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0":"MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1","MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0","MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1","MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1":"MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0","MAP_EVER_GRANDE_CITY_HALL2:1/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL2:1","MAP_EVER_GRANDE_CITY_HALL3:0,2,3/MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1":"MAP_EVER_GRANDE_CITY_GLACIAS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL3:0","MAP_EVER_GRANDE_CITY_HALL3:1/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL3:1","MAP_EVER_GRANDE_CITY_HALL4:0/MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1":"MAP_EVER_GRANDE_CITY_DRAKES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL4:0","MAP_EVER_GRANDE_CITY_HALL4:1/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL4:1","MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0","MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0":"MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1","MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0/MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1":"MAP_EVER_GRANDE_CITY_CHAMPIONS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL_OF_FAME:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0/MAP_EVER_GRANDE_CITY_HALL1:1":"MAP_EVER_GRANDE_CITY_HALL1:1/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:0","MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1/MAP_EVER_GRANDE_CITY_HALL2:0":"MAP_EVER_GRANDE_CITY_HALL2:0,2,3/MAP_EVER_GRANDE_CITY_PHOEBES_ROOM:1","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0,1/MAP_EVER_GRANDE_CITY:1":"MAP_EVER_GRANDE_CITY:1/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2":"MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F:2/MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0,1/MAP_EVER_GRANDE_CITY:0":"MAP_EVER_GRANDE_CITY:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2,3/MAP_EVER_GRANDE_CITY_HALL5:0":"MAP_EVER_GRANDE_CITY_HALL5:0,2,3/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:2","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4":"MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F:4/MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:0","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0/MAP_EVER_GRANDE_CITY_HALL5:1":"MAP_EVER_GRANDE_CITY_HALL5:1/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:0","MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1/MAP_EVER_GRANDE_CITY_HALL1:0":"MAP_EVER_GRANDE_CITY_HALL1:0,2,3/MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM:1","MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0":"MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0","MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0":"MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1","MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2","MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0":"MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3","MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0":"MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4","MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_FALLARBOR_TOWN:1":"MAP_FALLARBOR_TOWN:1/MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY:0","MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0,1/MAP_FALLARBOR_TOWN:3":"MAP_FALLARBOR_TOWN:3/MAP_FALLARBOR_TOWN_COZMOS_HOUSE:0","MAP_FALLARBOR_TOWN_MART:0,1/MAP_FALLARBOR_TOWN:0":"MAP_FALLARBOR_TOWN:0/MAP_FALLARBOR_TOWN_MART:0","MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0,1/MAP_FALLARBOR_TOWN:4":"MAP_FALLARBOR_TOWN:4/MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0,1/MAP_FALLARBOR_TOWN:2":"MAP_FALLARBOR_TOWN:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0/MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2":"MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F:2/MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:0","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FALLARBOR_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1":"MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1","MAP_FARAWAY_ISLAND_INTERIOR:0,1/MAP_FARAWAY_ISLAND_ENTRANCE:0,1":"MAP_FARAWAY_ISLAND_ENTRANCE:0,1/MAP_FARAWAY_ISLAND_INTERIOR:0,1","MAP_FIERY_PATH:0/MAP_ROUTE112:4":"MAP_ROUTE112:4/MAP_FIERY_PATH:0","MAP_FIERY_PATH:1/MAP_ROUTE112:5":"MAP_ROUTE112:5/MAP_FIERY_PATH:1","MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0","MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0":"MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1","MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0":"MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2","MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0":"MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3","MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0":"MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4","MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0":"MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5","MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0":"MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6","MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0":"MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7","MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0":"MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8","MAP_FORTREE_CITY_DECORATION_SHOP:0,1/MAP_FORTREE_CITY:8":"MAP_FORTREE_CITY:8/MAP_FORTREE_CITY_DECORATION_SHOP:0","MAP_FORTREE_CITY_GYM:0,1/MAP_FORTREE_CITY:2":"MAP_FORTREE_CITY:2/MAP_FORTREE_CITY_GYM:0","MAP_FORTREE_CITY_HOUSE1:0,1/MAP_FORTREE_CITY:1":"MAP_FORTREE_CITY:1/MAP_FORTREE_CITY_HOUSE1:0","MAP_FORTREE_CITY_HOUSE2:0,1/MAP_FORTREE_CITY:4":"MAP_FORTREE_CITY:4/MAP_FORTREE_CITY_HOUSE2:0","MAP_FORTREE_CITY_HOUSE3:0,1/MAP_FORTREE_CITY:5":"MAP_FORTREE_CITY:5/MAP_FORTREE_CITY_HOUSE3:0","MAP_FORTREE_CITY_HOUSE4:0,1/MAP_FORTREE_CITY:6":"MAP_FORTREE_CITY:6/MAP_FORTREE_CITY_HOUSE4:0","MAP_FORTREE_CITY_HOUSE5:0,1/MAP_FORTREE_CITY:7":"MAP_FORTREE_CITY:7/MAP_FORTREE_CITY_HOUSE5:0","MAP_FORTREE_CITY_MART:0,1/MAP_FORTREE_CITY:3":"MAP_FORTREE_CITY:3/MAP_FORTREE_CITY_MART:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:0,1/MAP_FORTREE_CITY:0":"MAP_FORTREE_CITY:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:0","MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0":"MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2","MAP_FORTREE_CITY_POKEMON_CENTER_2F:0/MAP_FORTREE_CITY_POKEMON_CENTER_1F:2":"MAP_FORTREE_CITY_POKEMON_CENTER_1F:2/MAP_FORTREE_CITY_POKEMON_CENTER_2F:0","MAP_FORTREE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_FORTREE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0":"MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0","MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0":"MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1","MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1":"MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2","MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0":"MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3","MAP_GRANITE_CAVE_B1F:0/MAP_GRANITE_CAVE_1F:1":"MAP_GRANITE_CAVE_1F:1/MAP_GRANITE_CAVE_B1F:0","MAP_GRANITE_CAVE_B1F:1/MAP_GRANITE_CAVE_1F:2":"MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1","MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0":"MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2","MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1":"MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3","MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2":"MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4","MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3":"MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5","MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4":"MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6","MAP_GRANITE_CAVE_B2F:0/MAP_GRANITE_CAVE_B1F:2":"MAP_GRANITE_CAVE_B1F:2/MAP_GRANITE_CAVE_B2F:0","MAP_GRANITE_CAVE_B2F:1/MAP_GRANITE_CAVE_B1F:3":"MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1","MAP_GRANITE_CAVE_B2F:2/MAP_GRANITE_CAVE_B1F:4":"MAP_GRANITE_CAVE_B1F:4/MAP_GRANITE_CAVE_B2F:2","MAP_GRANITE_CAVE_B2F:3/MAP_GRANITE_CAVE_B1F:5":"MAP_GRANITE_CAVE_B1F:5/MAP_GRANITE_CAVE_B2F:3","MAP_GRANITE_CAVE_B2F:4/MAP_GRANITE_CAVE_B1F:6":"MAP_GRANITE_CAVE_B1F:6/MAP_GRANITE_CAVE_B2F:4","MAP_GRANITE_CAVE_STEVENS_ROOM:0/MAP_GRANITE_CAVE_1F:3":"MAP_GRANITE_CAVE_1F:3/MAP_GRANITE_CAVE_STEVENS_ROOM:0","MAP_INSIDE_OF_TRUCK:0,1,2/MAP_DYNAMIC:-1!":"","MAP_ISLAND_CAVE:0/MAP_ROUTE105:0":"MAP_ROUTE105:0/MAP_ISLAND_CAVE:0","MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2":"MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1","MAP_ISLAND_CAVE:2/MAP_ISLAND_CAVE:1":"MAP_ISLAND_CAVE:1/MAP_ISLAND_CAVE:2","MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3":"MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1","MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3":"MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3","MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0":"MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4","MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0":"MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0","MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0":"MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1","MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0":"MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2","MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3","MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0":"MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4","MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5","MAP_LAVARIDGE_TOWN_GYM_1F:0,1/MAP_LAVARIDGE_TOWN:1":"MAP_LAVARIDGE_TOWN:1/MAP_LAVARIDGE_TOWN_GYM_1F:0","MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8":"MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10","MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9":"MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11","MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10":"MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12","MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11":"MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13","MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12":"MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14","MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13":"MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15","MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14":"MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16","MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15":"MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17","MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16":"MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18","MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17":"MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19","MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0":"MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2","MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18":"MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20","MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20":"MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21","MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19":"MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22","MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21":"MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23","MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22":"MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24","MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23":"MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25","MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2":"MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3","MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4":"MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4","MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3":"MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5","MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1":"MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6","MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5":"MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7","MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6":"MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8","MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7":"MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9","MAP_LAVARIDGE_TOWN_GYM_B1F:0/MAP_LAVARIDGE_TOWN_GYM_1F:2":"MAP_LAVARIDGE_TOWN_GYM_1F:2/MAP_LAVARIDGE_TOWN_GYM_B1F:0","MAP_LAVARIDGE_TOWN_GYM_B1F:1/MAP_LAVARIDGE_TOWN_GYM_1F:6":"MAP_LAVARIDGE_TOWN_GYM_1F:6/MAP_LAVARIDGE_TOWN_GYM_B1F:1","MAP_LAVARIDGE_TOWN_GYM_B1F:10/MAP_LAVARIDGE_TOWN_GYM_1F:12":"MAP_LAVARIDGE_TOWN_GYM_1F:12/MAP_LAVARIDGE_TOWN_GYM_B1F:10","MAP_LAVARIDGE_TOWN_GYM_B1F:11/MAP_LAVARIDGE_TOWN_GYM_1F:13":"MAP_LAVARIDGE_TOWN_GYM_1F:13/MAP_LAVARIDGE_TOWN_GYM_B1F:11","MAP_LAVARIDGE_TOWN_GYM_B1F:12/MAP_LAVARIDGE_TOWN_GYM_1F:14":"MAP_LAVARIDGE_TOWN_GYM_1F:14/MAP_LAVARIDGE_TOWN_GYM_B1F:12","MAP_LAVARIDGE_TOWN_GYM_B1F:13/MAP_LAVARIDGE_TOWN_GYM_1F:15":"MAP_LAVARIDGE_TOWN_GYM_1F:15/MAP_LAVARIDGE_TOWN_GYM_B1F:13","MAP_LAVARIDGE_TOWN_GYM_B1F:14/MAP_LAVARIDGE_TOWN_GYM_1F:16":"MAP_LAVARIDGE_TOWN_GYM_1F:16/MAP_LAVARIDGE_TOWN_GYM_B1F:14","MAP_LAVARIDGE_TOWN_GYM_B1F:15/MAP_LAVARIDGE_TOWN_GYM_1F:17":"MAP_LAVARIDGE_TOWN_GYM_1F:17/MAP_LAVARIDGE_TOWN_GYM_B1F:15","MAP_LAVARIDGE_TOWN_GYM_B1F:16/MAP_LAVARIDGE_TOWN_GYM_1F:18":"MAP_LAVARIDGE_TOWN_GYM_1F:18/MAP_LAVARIDGE_TOWN_GYM_B1F:16","MAP_LAVARIDGE_TOWN_GYM_B1F:17/MAP_LAVARIDGE_TOWN_GYM_1F:19":"MAP_LAVARIDGE_TOWN_GYM_1F:19/MAP_LAVARIDGE_TOWN_GYM_B1F:17","MAP_LAVARIDGE_TOWN_GYM_B1F:18/MAP_LAVARIDGE_TOWN_GYM_1F:20":"MAP_LAVARIDGE_TOWN_GYM_1F:20/MAP_LAVARIDGE_TOWN_GYM_B1F:18","MAP_LAVARIDGE_TOWN_GYM_B1F:19/MAP_LAVARIDGE_TOWN_GYM_1F:22":"MAP_LAVARIDGE_TOWN_GYM_1F:22/MAP_LAVARIDGE_TOWN_GYM_B1F:19","MAP_LAVARIDGE_TOWN_GYM_B1F:2/MAP_LAVARIDGE_TOWN_GYM_1F:3":"MAP_LAVARIDGE_TOWN_GYM_1F:3/MAP_LAVARIDGE_TOWN_GYM_B1F:2","MAP_LAVARIDGE_TOWN_GYM_B1F:20/MAP_LAVARIDGE_TOWN_GYM_1F:21":"MAP_LAVARIDGE_TOWN_GYM_1F:21/MAP_LAVARIDGE_TOWN_GYM_B1F:20","MAP_LAVARIDGE_TOWN_GYM_B1F:21/MAP_LAVARIDGE_TOWN_GYM_1F:23":"MAP_LAVARIDGE_TOWN_GYM_1F:23/MAP_LAVARIDGE_TOWN_GYM_B1F:21","MAP_LAVARIDGE_TOWN_GYM_B1F:22/MAP_LAVARIDGE_TOWN_GYM_1F:24":"MAP_LAVARIDGE_TOWN_GYM_1F:24/MAP_LAVARIDGE_TOWN_GYM_B1F:22","MAP_LAVARIDGE_TOWN_GYM_B1F:23/MAP_LAVARIDGE_TOWN_GYM_1F:25":"MAP_LAVARIDGE_TOWN_GYM_1F:25/MAP_LAVARIDGE_TOWN_GYM_B1F:23","MAP_LAVARIDGE_TOWN_GYM_B1F:3/MAP_LAVARIDGE_TOWN_GYM_1F:5":"MAP_LAVARIDGE_TOWN_GYM_1F:5/MAP_LAVARIDGE_TOWN_GYM_B1F:3","MAP_LAVARIDGE_TOWN_GYM_B1F:4/MAP_LAVARIDGE_TOWN_GYM_1F:4":"MAP_LAVARIDGE_TOWN_GYM_1F:4/MAP_LAVARIDGE_TOWN_GYM_B1F:4","MAP_LAVARIDGE_TOWN_GYM_B1F:5/MAP_LAVARIDGE_TOWN_GYM_1F:7":"MAP_LAVARIDGE_TOWN_GYM_1F:7/MAP_LAVARIDGE_TOWN_GYM_B1F:5","MAP_LAVARIDGE_TOWN_GYM_B1F:6/MAP_LAVARIDGE_TOWN_GYM_1F:8":"MAP_LAVARIDGE_TOWN_GYM_1F:8/MAP_LAVARIDGE_TOWN_GYM_B1F:6","MAP_LAVARIDGE_TOWN_GYM_B1F:7/MAP_LAVARIDGE_TOWN_GYM_1F:9":"MAP_LAVARIDGE_TOWN_GYM_1F:9/MAP_LAVARIDGE_TOWN_GYM_B1F:7","MAP_LAVARIDGE_TOWN_GYM_B1F:8/MAP_LAVARIDGE_TOWN_GYM_1F:10":"MAP_LAVARIDGE_TOWN_GYM_1F:10/MAP_LAVARIDGE_TOWN_GYM_B1F:8","MAP_LAVARIDGE_TOWN_GYM_B1F:9/MAP_LAVARIDGE_TOWN_GYM_1F:11":"MAP_LAVARIDGE_TOWN_GYM_1F:11/MAP_LAVARIDGE_TOWN_GYM_B1F:9","MAP_LAVARIDGE_TOWN_HERB_SHOP:0,1/MAP_LAVARIDGE_TOWN:0":"MAP_LAVARIDGE_TOWN:0/MAP_LAVARIDGE_TOWN_HERB_SHOP:0","MAP_LAVARIDGE_TOWN_HOUSE:0,1/MAP_LAVARIDGE_TOWN:4":"MAP_LAVARIDGE_TOWN:4/MAP_LAVARIDGE_TOWN_HOUSE:0","MAP_LAVARIDGE_TOWN_MART:0,1/MAP_LAVARIDGE_TOWN:2":"MAP_LAVARIDGE_TOWN:2/MAP_LAVARIDGE_TOWN_MART:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0,1/MAP_LAVARIDGE_TOWN:3":"MAP_LAVARIDGE_TOWN:3/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3/MAP_LAVARIDGE_TOWN:5":"MAP_LAVARIDGE_TOWN:5/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:3","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2":"MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F:2/MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:0","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0","MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1","MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0":"MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10","MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0":"MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11","MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0":"MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12","MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2","MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13","MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4","MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1":"MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5","MAP_LILYCOVE_CITY:6/MAP_AQUA_HIDEOUT_1F:0":"MAP_AQUA_HIDEOUT_1F:0,1/MAP_LILYCOVE_CITY:6","MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0":"MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7","MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0":"MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8","MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0":"MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9","MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0","MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3":"MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1","MAP_LILYCOVE_CITY_CONTEST_LOBBY:0,1/MAP_LILYCOVE_CITY:4":"MAP_LILYCOVE_CITY:4/MAP_LILYCOVE_CITY_CONTEST_LOBBY:0","MAP_LILYCOVE_CITY_CONTEST_LOBBY:2/MAP_LILYCOVE_CITY_CONTEST_HALL:0":"MAP_LILYCOVE_CITY_CONTEST_HALL:0,2/MAP_LILYCOVE_CITY_CONTEST_LOBBY:2","MAP_LILYCOVE_CITY_CONTEST_LOBBY:3/MAP_LILYCOVE_CITY_CONTEST_HALL:1":"MAP_LILYCOVE_CITY_CONTEST_HALL:1,3/MAP_LILYCOVE_CITY_CONTEST_LOBBY:3","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0,1/MAP_LILYCOVE_CITY:1":"MAP_LILYCOVE_CITY:1/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:0","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2","MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2":"MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F:2/MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0,1/MAP_LILYCOVE_CITY:0":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:3/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:0","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:1/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0!":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR:0,1/MAP_DYNAMIC:-1!":"","MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2":"MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F:2/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:0","MAP_LILYCOVE_CITY_HARBOR:0,1/MAP_LILYCOVE_CITY:12":"MAP_LILYCOVE_CITY:12/MAP_LILYCOVE_CITY_HARBOR:0","MAP_LILYCOVE_CITY_HOUSE1:0,1/MAP_LILYCOVE_CITY:8":"MAP_LILYCOVE_CITY:8/MAP_LILYCOVE_CITY_HOUSE1:0","MAP_LILYCOVE_CITY_HOUSE2:0,1/MAP_LILYCOVE_CITY:9":"MAP_LILYCOVE_CITY:9/MAP_LILYCOVE_CITY_HOUSE2:0","MAP_LILYCOVE_CITY_HOUSE3:0,1/MAP_LILYCOVE_CITY:10":"MAP_LILYCOVE_CITY:10/MAP_LILYCOVE_CITY_HOUSE3:0","MAP_LILYCOVE_CITY_HOUSE4:0,1/MAP_LILYCOVE_CITY:11":"MAP_LILYCOVE_CITY:11/MAP_LILYCOVE_CITY_HOUSE4:0","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1/MAP_LILYCOVE_CITY:3,13":"MAP_LILYCOVE_CITY:3,13/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:0,1","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2","MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2":"MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F:2/MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F:0","MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0,1/MAP_LILYCOVE_CITY:7":"MAP_LILYCOVE_CITY:7/MAP_LILYCOVE_CITY_MOVE_DELETERS_HOUSE:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0,1/MAP_LILYCOVE_CITY:2":"MAP_LILYCOVE_CITY:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0":"MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0/MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2":"MAP_LILYCOVE_CITY_POKEMON_CENTER_1F:2/MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:0","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:0,1/MAP_LILYCOVE_CITY:5":"MAP_LILYCOVE_CITY:5/MAP_LILYCOVE_CITY_POKEMON_TRAINER_FAN_CLUB:1","MAP_LILYCOVE_CITY_UNUSED_MART:0,1/MAP_LILYCOVE_CITY:0!":"MAP_LILYCOVE_CITY:0/MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F:0","MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0","MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1","MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0":"MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:1":"MAP_LITTLEROOT_TOWN:1/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:0,1/MAP_LITTLEROOT_TOWN:0":"MAP_LITTLEROOT_TOWN:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:1","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2","MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2":"MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F:2/MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F:0","MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0,1/MAP_LITTLEROOT_TOWN:2":"MAP_LITTLEROOT_TOWN:2/MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB:0","MAP_MAGMA_HIDEOUT_1F:0/MAP_JAGGED_PASS:4":"MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0","MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1":"MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1","MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1":"MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2","MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0":"MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3","MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0":"MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0","MAP_MAGMA_HIDEOUT_2F_1R:1/MAP_MAGMA_HIDEOUT_1F:1":"MAP_MAGMA_HIDEOUT_1F:1/MAP_MAGMA_HIDEOUT_2F_1R:1","MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2":"MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2","MAP_MAGMA_HIDEOUT_2F_2R:0/MAP_MAGMA_HIDEOUT_2F_1R:0":"MAP_MAGMA_HIDEOUT_2F_1R:0/MAP_MAGMA_HIDEOUT_2F_2R:0","MAP_MAGMA_HIDEOUT_2F_2R:1/MAP_MAGMA_HIDEOUT_1F:2":"MAP_MAGMA_HIDEOUT_1F:2/MAP_MAGMA_HIDEOUT_2F_2R:1","MAP_MAGMA_HIDEOUT_2F_3R:0/MAP_MAGMA_HIDEOUT_1F:3":"MAP_MAGMA_HIDEOUT_1F:3/MAP_MAGMA_HIDEOUT_2F_3R:0","MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0":"MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1","MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0":"MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0","MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0":"MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1","MAP_MAGMA_HIDEOUT_3F_1R:2/MAP_MAGMA_HIDEOUT_2F_1R:2":"MAP_MAGMA_HIDEOUT_2F_1R:2/MAP_MAGMA_HIDEOUT_3F_1R:2","MAP_MAGMA_HIDEOUT_3F_2R:0/MAP_MAGMA_HIDEOUT_3F_1R:1":"MAP_MAGMA_HIDEOUT_3F_1R:1/MAP_MAGMA_HIDEOUT_3F_2R:0","MAP_MAGMA_HIDEOUT_3F_3R:0/MAP_MAGMA_HIDEOUT_2F_3R:1":"MAP_MAGMA_HIDEOUT_2F_3R:1/MAP_MAGMA_HIDEOUT_3F_3R:0","MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1":"MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1","MAP_MAGMA_HIDEOUT_4F:0/MAP_MAGMA_HIDEOUT_3F_1R:0":"MAP_MAGMA_HIDEOUT_3F_1R:0/MAP_MAGMA_HIDEOUT_4F:0","MAP_MAGMA_HIDEOUT_4F:1/MAP_MAGMA_HIDEOUT_3F_3R:1":"MAP_MAGMA_HIDEOUT_3F_3R:1/MAP_MAGMA_HIDEOUT_4F:1","MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0":"MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0","MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0":"MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0","MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0":"MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0","MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1","MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0":"MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2","MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0":"MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3","MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0":"MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4","MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0":"MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5","MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0":"MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6","MAP_MAUVILLE_CITY_BIKE_SHOP:0,1/MAP_MAUVILLE_CITY:2":"MAP_MAUVILLE_CITY:2/MAP_MAUVILLE_CITY_BIKE_SHOP:0","MAP_MAUVILLE_CITY_GAME_CORNER:0,1/MAP_MAUVILLE_CITY:5":"MAP_MAUVILLE_CITY:5/MAP_MAUVILLE_CITY_GAME_CORNER:0","MAP_MAUVILLE_CITY_GYM:0,1/MAP_MAUVILLE_CITY:0":"MAP_MAUVILLE_CITY:0/MAP_MAUVILLE_CITY_GYM:0","MAP_MAUVILLE_CITY_HOUSE1:0,1/MAP_MAUVILLE_CITY:4":"MAP_MAUVILLE_CITY:4/MAP_MAUVILLE_CITY_HOUSE1:0","MAP_MAUVILLE_CITY_HOUSE2:0,1/MAP_MAUVILLE_CITY:6":"MAP_MAUVILLE_CITY:6/MAP_MAUVILLE_CITY_HOUSE2:0","MAP_MAUVILLE_CITY_MART:0,1/MAP_MAUVILLE_CITY:3":"MAP_MAUVILLE_CITY:3/MAP_MAUVILLE_CITY_MART:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0,1/MAP_MAUVILLE_CITY:1":"MAP_MAUVILLE_CITY:1/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0":"MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0/MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2":"MAP_MAUVILLE_CITY_POKEMON_CENTER_1F:2/MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:0","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MAUVILLE_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0":"MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0","MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0":"MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1","MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0":"MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2","MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4":"MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3","MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5":"MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4","MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0":"MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5","MAP_METEOR_FALLS_1F_2R:0/MAP_METEOR_FALLS_1F_1R:2":"MAP_METEOR_FALLS_1F_1R:2/MAP_METEOR_FALLS_1F_2R:0","MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0":"MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1","MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1":"MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2","MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2":"MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3","MAP_METEOR_FALLS_B1F_1R:0/MAP_METEOR_FALLS_1F_2R:1":"MAP_METEOR_FALLS_1F_2R:1/MAP_METEOR_FALLS_B1F_1R:0","MAP_METEOR_FALLS_B1F_1R:1/MAP_METEOR_FALLS_1F_2R:2":"MAP_METEOR_FALLS_1F_2R:2/MAP_METEOR_FALLS_B1F_1R:1","MAP_METEOR_FALLS_B1F_1R:2/MAP_METEOR_FALLS_1F_2R:3":"MAP_METEOR_FALLS_1F_2R:3/MAP_METEOR_FALLS_B1F_1R:2","MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0":"MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3","MAP_METEOR_FALLS_B1F_1R:4/MAP_METEOR_FALLS_1F_1R:3":"MAP_METEOR_FALLS_1F_1R:3/MAP_METEOR_FALLS_B1F_1R:4","MAP_METEOR_FALLS_B1F_1R:5/MAP_METEOR_FALLS_1F_1R:4":"MAP_METEOR_FALLS_1F_1R:4/MAP_METEOR_FALLS_B1F_1R:5","MAP_METEOR_FALLS_B1F_2R:0/MAP_METEOR_FALLS_B1F_1R:3":"MAP_METEOR_FALLS_B1F_1R:3/MAP_METEOR_FALLS_B1F_2R:0","MAP_METEOR_FALLS_STEVENS_CAVE:0/MAP_METEOR_FALLS_1F_1R:5":"MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0","MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3":"MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0","MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1":"MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1","MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0":"MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0","MAP_MIRAGE_TOWER_2F:1/MAP_MIRAGE_TOWER_1F:1":"MAP_MIRAGE_TOWER_1F:1/MAP_MIRAGE_TOWER_2F:1","MAP_MIRAGE_TOWER_3F:0/MAP_MIRAGE_TOWER_2F:0":"MAP_MIRAGE_TOWER_2F:0/MAP_MIRAGE_TOWER_3F:0","MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0":"MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1","MAP_MIRAGE_TOWER_4F:0/MAP_MIRAGE_TOWER_3F:1":"MAP_MIRAGE_TOWER_3F:1/MAP_MIRAGE_TOWER_4F:0","MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0":"MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0","MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0":"MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1","MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2","MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0":"MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3","MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0":"MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4","MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0":"MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5","MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0":"MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6","MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1":"MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7","MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8","MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0,1/MAP_MOSSDEEP_CITY:9":"MAP_MOSSDEEP_CITY:9/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:0","MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0":"MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2","MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0/MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2":"MAP_MOSSDEEP_CITY_GAME_CORNER_1F:2/MAP_MOSSDEEP_CITY_GAME_CORNER_B1F:0","MAP_MOSSDEEP_CITY_GYM:0,1/MAP_MOSSDEEP_CITY:1":"MAP_MOSSDEEP_CITY:1/MAP_MOSSDEEP_CITY_GYM:0","MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11":"MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10","MAP_MOSSDEEP_CITY_GYM:11/MAP_MOSSDEEP_CITY_GYM:10":"MAP_MOSSDEEP_CITY_GYM:10/MAP_MOSSDEEP_CITY_GYM:11","MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13":"MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12","MAP_MOSSDEEP_CITY_GYM:13/MAP_MOSSDEEP_CITY_GYM:12":"MAP_MOSSDEEP_CITY_GYM:12/MAP_MOSSDEEP_CITY_GYM:13","MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3":"MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2","MAP_MOSSDEEP_CITY_GYM:3/MAP_MOSSDEEP_CITY_GYM:2":"MAP_MOSSDEEP_CITY_GYM:2/MAP_MOSSDEEP_CITY_GYM:3","MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5":"MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4","MAP_MOSSDEEP_CITY_GYM:5/MAP_MOSSDEEP_CITY_GYM:4":"MAP_MOSSDEEP_CITY_GYM:4/MAP_MOSSDEEP_CITY_GYM:5","MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7":"MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6","MAP_MOSSDEEP_CITY_GYM:7/MAP_MOSSDEEP_CITY_GYM:6":"MAP_MOSSDEEP_CITY_GYM:6/MAP_MOSSDEEP_CITY_GYM:7","MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9":"MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8","MAP_MOSSDEEP_CITY_GYM:9/MAP_MOSSDEEP_CITY_GYM:8":"MAP_MOSSDEEP_CITY_GYM:8/MAP_MOSSDEEP_CITY_GYM:9","MAP_MOSSDEEP_CITY_HOUSE1:0,1/MAP_MOSSDEEP_CITY:0":"MAP_MOSSDEEP_CITY:0/MAP_MOSSDEEP_CITY_HOUSE1:0","MAP_MOSSDEEP_CITY_HOUSE2:0,1/MAP_MOSSDEEP_CITY:3":"MAP_MOSSDEEP_CITY:3/MAP_MOSSDEEP_CITY_HOUSE2:0","MAP_MOSSDEEP_CITY_HOUSE3:0,1/MAP_MOSSDEEP_CITY:5":"MAP_MOSSDEEP_CITY:5/MAP_MOSSDEEP_CITY_HOUSE3:0","MAP_MOSSDEEP_CITY_HOUSE4:0,1/MAP_MOSSDEEP_CITY:7":"MAP_MOSSDEEP_CITY:7/MAP_MOSSDEEP_CITY_HOUSE4:1","MAP_MOSSDEEP_CITY_MART:0,1/MAP_MOSSDEEP_CITY:4":"MAP_MOSSDEEP_CITY:4/MAP_MOSSDEEP_CITY_MART:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:2":"MAP_MOSSDEEP_CITY:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0/MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2":"MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F:2/MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:0","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0,1/MAP_MOSSDEEP_CITY:8":"MAP_MOSSDEEP_CITY:8/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:0","MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0":"MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2","MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0/MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2":"MAP_MOSSDEEP_CITY_SPACE_CENTER_1F:2/MAP_MOSSDEEP_CITY_SPACE_CENTER_2F:0","MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0,1/MAP_MOSSDEEP_CITY:6":"MAP_MOSSDEEP_CITY:6/MAP_MOSSDEEP_CITY_STEVENS_HOUSE:0","MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1":"MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1","MAP_MT_CHIMNEY:2,3/MAP_JAGGED_PASS:2,3":"MAP_JAGGED_PASS:2,3/MAP_MT_CHIMNEY:2,3","MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1/MAP_MT_CHIMNEY:0,1":"MAP_MT_CHIMNEY:0,1/MAP_MT_CHIMNEY_CABLE_CAR_STATION:0,1","MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0":"MAP_ROUTE122:0/MAP_MT_PYRE_1F:0","MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0":"MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1","MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0":"MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4","MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4":"MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5","MAP_MT_PYRE_2F:0/MAP_MT_PYRE_1F:4":"MAP_MT_PYRE_1F:4/MAP_MT_PYRE_2F:0","MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0":"MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1","MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4":"MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2","MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5":"MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3","MAP_MT_PYRE_2F:4/MAP_MT_PYRE_1F:5":"MAP_MT_PYRE_1F:5/MAP_MT_PYRE_2F:4","MAP_MT_PYRE_3F:0/MAP_MT_PYRE_2F:1":"MAP_MT_PYRE_2F:1/MAP_MT_PYRE_3F:0","MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1":"MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1","MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4":"MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2","MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5":"MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3","MAP_MT_PYRE_3F:4/MAP_MT_PYRE_2F:2":"MAP_MT_PYRE_2F:2/MAP_MT_PYRE_3F:4","MAP_MT_PYRE_3F:5/MAP_MT_PYRE_2F:3":"MAP_MT_PYRE_2F:3/MAP_MT_PYRE_3F:5","MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1":"MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0","MAP_MT_PYRE_4F:1/MAP_MT_PYRE_3F:1":"MAP_MT_PYRE_3F:1/MAP_MT_PYRE_4F:1","MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3":"MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2","MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4":"MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3","MAP_MT_PYRE_4F:4/MAP_MT_PYRE_3F:2":"MAP_MT_PYRE_3F:2/MAP_MT_PYRE_4F:4","MAP_MT_PYRE_4F:5/MAP_MT_PYRE_3F:3":"MAP_MT_PYRE_3F:3/MAP_MT_PYRE_4F:5","MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0":"MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0","MAP_MT_PYRE_5F:1/MAP_MT_PYRE_4F:0":"MAP_MT_PYRE_4F:0/MAP_MT_PYRE_5F:1","MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1":"MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2","MAP_MT_PYRE_5F:3/MAP_MT_PYRE_4F:2":"MAP_MT_PYRE_4F:2/MAP_MT_PYRE_5F:3","MAP_MT_PYRE_5F:4/MAP_MT_PYRE_4F:3":"MAP_MT_PYRE_4F:3/MAP_MT_PYRE_5F:4","MAP_MT_PYRE_6F:0/MAP_MT_PYRE_5F:0":"MAP_MT_PYRE_5F:0/MAP_MT_PYRE_6F:0","MAP_MT_PYRE_6F:1/MAP_MT_PYRE_5F:2":"MAP_MT_PYRE_5F:2/MAP_MT_PYRE_6F:1","MAP_MT_PYRE_EXTERIOR:0/MAP_MT_PYRE_1F:1":"MAP_MT_PYRE_1F:1,3/MAP_MT_PYRE_EXTERIOR:0","MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1":"MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1","MAP_MT_PYRE_SUMMIT:0,1,2/MAP_MT_PYRE_EXTERIOR:1":"MAP_MT_PYRE_EXTERIOR:1,2/MAP_MT_PYRE_SUMMIT:1","MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0":"MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0","MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1":"MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1","MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0":"MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0","MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2":"MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0","MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0":"MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1","MAP_NAVEL_ROCK_DOWN02:0/MAP_NAVEL_ROCK_DOWN01:1":"MAP_NAVEL_ROCK_DOWN01:1/MAP_NAVEL_ROCK_DOWN02:0","MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0":"MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1","MAP_NAVEL_ROCK_DOWN03:0/MAP_NAVEL_ROCK_DOWN02:1":"MAP_NAVEL_ROCK_DOWN02:1/MAP_NAVEL_ROCK_DOWN03:0","MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0":"MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1","MAP_NAVEL_ROCK_DOWN04:0/MAP_NAVEL_ROCK_DOWN03:1":"MAP_NAVEL_ROCK_DOWN03:1/MAP_NAVEL_ROCK_DOWN04:0","MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0":"MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1","MAP_NAVEL_ROCK_DOWN05:0/MAP_NAVEL_ROCK_DOWN04:1":"MAP_NAVEL_ROCK_DOWN04:1/MAP_NAVEL_ROCK_DOWN05:0","MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0":"MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1","MAP_NAVEL_ROCK_DOWN06:0/MAP_NAVEL_ROCK_DOWN05:1":"MAP_NAVEL_ROCK_DOWN05:1/MAP_NAVEL_ROCK_DOWN06:0","MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0":"MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1","MAP_NAVEL_ROCK_DOWN07:0/MAP_NAVEL_ROCK_DOWN06:1":"MAP_NAVEL_ROCK_DOWN06:1/MAP_NAVEL_ROCK_DOWN07:0","MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0":"MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1","MAP_NAVEL_ROCK_DOWN08:0/MAP_NAVEL_ROCK_DOWN07:1":"MAP_NAVEL_ROCK_DOWN07:1/MAP_NAVEL_ROCK_DOWN08:0","MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0":"MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1","MAP_NAVEL_ROCK_DOWN09:0/MAP_NAVEL_ROCK_DOWN08:1":"MAP_NAVEL_ROCK_DOWN08:1/MAP_NAVEL_ROCK_DOWN09:0","MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0":"MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1","MAP_NAVEL_ROCK_DOWN10:0/MAP_NAVEL_ROCK_DOWN09:1":"MAP_NAVEL_ROCK_DOWN09:1/MAP_NAVEL_ROCK_DOWN10:0","MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1":"MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1","MAP_NAVEL_ROCK_DOWN11:0/MAP_NAVEL_ROCK_BOTTOM:0":"MAP_NAVEL_ROCK_BOTTOM:0/MAP_NAVEL_ROCK_DOWN11:0","MAP_NAVEL_ROCK_DOWN11:1/MAP_NAVEL_ROCK_DOWN10:1":"MAP_NAVEL_ROCK_DOWN10:1/MAP_NAVEL_ROCK_DOWN11:1","MAP_NAVEL_ROCK_ENTRANCE:0/MAP_NAVEL_ROCK_B1F:0":"MAP_NAVEL_ROCK_B1F:0/MAP_NAVEL_ROCK_ENTRANCE:0","MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1":"MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1","MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0":"MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0","MAP_NAVEL_ROCK_EXTERIOR:1/MAP_NAVEL_ROCK_ENTRANCE:1":"MAP_NAVEL_ROCK_ENTRANCE:1/MAP_NAVEL_ROCK_EXTERIOR:1","MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0":"MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0","MAP_NAVEL_ROCK_FORK:1/MAP_NAVEL_ROCK_B1F:1":"MAP_NAVEL_ROCK_B1F:1/MAP_NAVEL_ROCK_FORK:1","MAP_NAVEL_ROCK_FORK:2/MAP_NAVEL_ROCK_DOWN01:0":"MAP_NAVEL_ROCK_DOWN01:0/MAP_NAVEL_ROCK_FORK:2","MAP_NAVEL_ROCK_HARBOR:0/MAP_NAVEL_ROCK_EXTERIOR:0":"MAP_NAVEL_ROCK_EXTERIOR:0/MAP_NAVEL_ROCK_HARBOR:0","MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1":"MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0","MAP_NAVEL_ROCK_UP1:0/MAP_NAVEL_ROCK_FORK:0":"MAP_NAVEL_ROCK_FORK:0/MAP_NAVEL_ROCK_UP1:0","MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0":"MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1","MAP_NAVEL_ROCK_UP2:0/MAP_NAVEL_ROCK_UP1:1":"MAP_NAVEL_ROCK_UP1:1/MAP_NAVEL_ROCK_UP2:0","MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0":"MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1","MAP_NAVEL_ROCK_UP3:0/MAP_NAVEL_ROCK_UP2:1":"MAP_NAVEL_ROCK_UP2:1/MAP_NAVEL_ROCK_UP3:0","MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0":"MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1","MAP_NAVEL_ROCK_UP4:0/MAP_NAVEL_ROCK_UP3:1":"MAP_NAVEL_ROCK_UP3:1/MAP_NAVEL_ROCK_UP4:0","MAP_NAVEL_ROCK_UP4:1/MAP_NAVEL_ROCK_TOP:0":"MAP_NAVEL_ROCK_TOP:0/MAP_NAVEL_ROCK_UP4:1","MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0":"MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0","MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0":"MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1","MAP_NEW_MAUVILLE_INSIDE:0/MAP_NEW_MAUVILLE_ENTRANCE:1":"MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0","MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0":"MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0","MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0":"MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1","MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2","MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0":"MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3","MAP_OLDALE_TOWN_HOUSE1:0,1/MAP_OLDALE_TOWN:0":"MAP_OLDALE_TOWN:0/MAP_OLDALE_TOWN_HOUSE1:0","MAP_OLDALE_TOWN_HOUSE2:0,1/MAP_OLDALE_TOWN:1":"MAP_OLDALE_TOWN:1/MAP_OLDALE_TOWN_HOUSE2:0","MAP_OLDALE_TOWN_MART:0,1/MAP_OLDALE_TOWN:3":"MAP_OLDALE_TOWN:3/MAP_OLDALE_TOWN_MART:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0,1/MAP_OLDALE_TOWN:2":"MAP_OLDALE_TOWN:2/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0":"MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0/MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2":"MAP_OLDALE_TOWN_POKEMON_CENTER_1F:2/MAP_OLDALE_TOWN_POKEMON_CENTER_2F:0","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_OLDALE_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0","MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0":"MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1","MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0":"MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2","MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0":"MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3","MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0":"MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4","MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0":"MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5","MAP_PACIFIDLOG_TOWN_HOUSE1:0,1/MAP_PACIFIDLOG_TOWN:1":"MAP_PACIFIDLOG_TOWN:1/MAP_PACIFIDLOG_TOWN_HOUSE1:0","MAP_PACIFIDLOG_TOWN_HOUSE2:0,1/MAP_PACIFIDLOG_TOWN:2":"MAP_PACIFIDLOG_TOWN:2/MAP_PACIFIDLOG_TOWN_HOUSE2:0","MAP_PACIFIDLOG_TOWN_HOUSE3:0,1/MAP_PACIFIDLOG_TOWN:3":"MAP_PACIFIDLOG_TOWN:3/MAP_PACIFIDLOG_TOWN_HOUSE3:0","MAP_PACIFIDLOG_TOWN_HOUSE4:0,1/MAP_PACIFIDLOG_TOWN:4":"MAP_PACIFIDLOG_TOWN:4/MAP_PACIFIDLOG_TOWN_HOUSE4:0","MAP_PACIFIDLOG_TOWN_HOUSE5:0,1/MAP_PACIFIDLOG_TOWN:5":"MAP_PACIFIDLOG_TOWN:5/MAP_PACIFIDLOG_TOWN_HOUSE5:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0,1/MAP_PACIFIDLOG_TOWN:0":"MAP_PACIFIDLOG_TOWN:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2":"MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F:2/MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:0","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0":"MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0","MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0":"MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1","MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0":"MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2","MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3","MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0":"MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4","MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0":"MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5","MAP_PETALBURG_CITY_GYM:0,1/MAP_PETALBURG_CITY:2":"MAP_PETALBURG_CITY:2/MAP_PETALBURG_CITY_GYM:0","MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8":"MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10","MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9":"MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12","MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16":"MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14","MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18":"MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15","MAP_PETALBURG_CITY_GYM:16,17/MAP_PETALBURG_CITY_GYM:14":"MAP_PETALBURG_CITY_GYM:14/MAP_PETALBURG_CITY_GYM:16","MAP_PETALBURG_CITY_GYM:18,19/MAP_PETALBURG_CITY_GYM:15":"MAP_PETALBURG_CITY_GYM:15/MAP_PETALBURG_CITY_GYM:18","MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3":"MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2","MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24":"MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20","MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26":"MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21","MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28":"MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22","MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30":"MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23","MAP_PETALBURG_CITY_GYM:24,25/MAP_PETALBURG_CITY_GYM:20":"MAP_PETALBURG_CITY_GYM:20/MAP_PETALBURG_CITY_GYM:24","MAP_PETALBURG_CITY_GYM:26,27/MAP_PETALBURG_CITY_GYM:21":"MAP_PETALBURG_CITY_GYM:21/MAP_PETALBURG_CITY_GYM:26","MAP_PETALBURG_CITY_GYM:28,29/MAP_PETALBURG_CITY_GYM:22":"MAP_PETALBURG_CITY_GYM:22/MAP_PETALBURG_CITY_GYM:28","MAP_PETALBURG_CITY_GYM:3,4/MAP_PETALBURG_CITY_GYM:2":"MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3","MAP_PETALBURG_CITY_GYM:30,31/MAP_PETALBURG_CITY_GYM:23":"MAP_PETALBURG_CITY_GYM:23/MAP_PETALBURG_CITY_GYM:30","MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34":"MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32","MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36":"MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33","MAP_PETALBURG_CITY_GYM:34,35/MAP_PETALBURG_CITY_GYM:32":"MAP_PETALBURG_CITY_GYM:32/MAP_PETALBURG_CITY_GYM:34","MAP_PETALBURG_CITY_GYM:36,37/MAP_PETALBURG_CITY_GYM:33":"MAP_PETALBURG_CITY_GYM:33/MAP_PETALBURG_CITY_GYM:36","MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6":"MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5","MAP_PETALBURG_CITY_GYM:6,7/MAP_PETALBURG_CITY_GYM:5":"MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6","MAP_PETALBURG_CITY_GYM:8/MAP_PETALBURG_CITY_GYM:10":"MAP_PETALBURG_CITY_GYM:10,11/MAP_PETALBURG_CITY_GYM:8","MAP_PETALBURG_CITY_GYM:9/MAP_PETALBURG_CITY_GYM:12":"MAP_PETALBURG_CITY_GYM:12,13/MAP_PETALBURG_CITY_GYM:9","MAP_PETALBURG_CITY_HOUSE1:0,1/MAP_PETALBURG_CITY:0":"MAP_PETALBURG_CITY:0/MAP_PETALBURG_CITY_HOUSE1:0","MAP_PETALBURG_CITY_HOUSE2:0,1/MAP_PETALBURG_CITY:4":"MAP_PETALBURG_CITY:4/MAP_PETALBURG_CITY_HOUSE2:0","MAP_PETALBURG_CITY_MART:0,1/MAP_PETALBURG_CITY:5":"MAP_PETALBURG_CITY:5/MAP_PETALBURG_CITY_MART:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0,1/MAP_PETALBURG_CITY:3":"MAP_PETALBURG_CITY:3/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0":"MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0/MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2":"MAP_PETALBURG_CITY_POKEMON_CENTER_1F:2/MAP_PETALBURG_CITY_POKEMON_CENTER_2F:0","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_PETALBURG_CITY_WALLYS_HOUSE:0,1/MAP_PETALBURG_CITY:1":"MAP_PETALBURG_CITY:1/MAP_PETALBURG_CITY_WALLYS_HOUSE:0","MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3":"MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1","MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5":"MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3","MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7":"MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5","MAP_RECORD_CORNER:0,1,2,3/MAP_DYNAMIC:-1!":"","MAP_ROUTE103:0/MAP_ALTERING_CAVE:0":"MAP_ALTERING_CAVE:0/MAP_ROUTE103:0","MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0":"MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0","MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0":"MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1","MAP_ROUTE104:2,3/MAP_PETALBURG_WOODS:0,1":"MAP_PETALBURG_WOODS:0,1/MAP_ROUTE104:2,3","MAP_ROUTE104:4,5/MAP_PETALBURG_WOODS:2,3":"MAP_PETALBURG_WOODS:2,3/MAP_ROUTE104:4,5","MAP_ROUTE104:6,7/MAP_PETALBURG_WOODS:4,5":"MAP_PETALBURG_WOODS:4,5/MAP_ROUTE104:6,7","MAP_ROUTE104_MR_BRINEYS_HOUSE:0,1/MAP_ROUTE104:0":"MAP_ROUTE104:0/MAP_ROUTE104_MR_BRINEYS_HOUSE:0","MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0,1/MAP_ROUTE104:1":"MAP_ROUTE104:1/MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP:0","MAP_ROUTE105:0/MAP_ISLAND_CAVE:0":"MAP_ISLAND_CAVE:0/MAP_ROUTE105:0","MAP_ROUTE106:0/MAP_GRANITE_CAVE_1F:0":"MAP_GRANITE_CAVE_1F:0/MAP_ROUTE106:0","MAP_ROUTE108:0/MAP_ABANDONED_SHIP_DECK:0":"MAP_ABANDONED_SHIP_DECK:0,1/MAP_ROUTE108:0","MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0":"MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0","MAP_ROUTE109_SEASHORE_HOUSE:0,1/MAP_ROUTE109:0":"MAP_ROUTE109:0/MAP_ROUTE109_SEASHORE_HOUSE:0","MAP_ROUTE110:0/MAP_NEW_MAUVILLE_ENTRANCE:0":"MAP_NEW_MAUVILLE_ENTRANCE:0/MAP_ROUTE110:0","MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1","MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2","MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3","MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4","MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2":"MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0,1/MAP_ROUTE110:4":"MAP_ROUTE110:4/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2,3/MAP_ROUTE110:5":"MAP_ROUTE110:5/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE:2","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0,1/MAP_ROUTE110:2":"MAP_ROUTE110:2/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:0","MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2,3/MAP_ROUTE110:3":"MAP_ROUTE110:3/MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1":"MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0","MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:2,3/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0","MAP_ROUTE110_TRICK_HOUSE_END:1/MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0":"MAP_ROUTE110_TRICK_HOUSE_CORRIDOR:0,1/MAP_ROUTE110_TRICK_HOUSE_END:1","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0,1/MAP_ROUTE110:1":"MAP_ROUTE110:1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:0","MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2/MAP_ROUTE110_TRICK_HOUSE_END:0":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE3:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE4:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE5:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE6:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:11/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:12","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:3/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:4","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:5/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:6","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:7/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:8","MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10":"MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:10/MAP_ROUTE110_TRICK_HOUSE_PUZZLE7:9","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!":"MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:0","MAP_ROUTE110_TRICK_HOUSE_PUZZLE8:2/MAP_ROUTE110_TRICK_HOUSE_END:0!":"MAP_ROUTE110_TRICK_HOUSE_END:0/MAP_ROUTE110_TRICK_HOUSE_PUZZLE1:2","MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0":"MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0","MAP_ROUTE111:1/MAP_DESERT_RUINS:0":"MAP_DESERT_RUINS:0/MAP_ROUTE111:1","MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0":"MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2","MAP_ROUTE111:3/MAP_MIRAGE_TOWER_1F:0":"MAP_MIRAGE_TOWER_1F:0/MAP_ROUTE111:3","MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0":"MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4","MAP_ROUTE111_OLD_LADYS_REST_STOP:0,1/MAP_ROUTE111:2":"MAP_ROUTE111:2/MAP_ROUTE111_OLD_LADYS_REST_STOP:0","MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0,1/MAP_ROUTE111:0":"MAP_ROUTE111:0/MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE:0","MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1":"MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1","MAP_ROUTE112:2,3/MAP_JAGGED_PASS:0,1":"MAP_JAGGED_PASS:0,1/MAP_ROUTE112:2,3","MAP_ROUTE112:4/MAP_FIERY_PATH:0":"MAP_FIERY_PATH:0/MAP_ROUTE112:4","MAP_ROUTE112:5/MAP_FIERY_PATH:1":"MAP_FIERY_PATH:1/MAP_ROUTE112:5","MAP_ROUTE112_CABLE_CAR_STATION:0,1/MAP_ROUTE112:0,1":"MAP_ROUTE112:0,1/MAP_ROUTE112_CABLE_CAR_STATION:0,1","MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0":"MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0","MAP_ROUTE113:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE113_GLASS_WORKSHOP:0,1/MAP_ROUTE113:0":"MAP_ROUTE113:0/MAP_ROUTE113_GLASS_WORKSHOP:0","MAP_ROUTE114:0/MAP_METEOR_FALLS_1F_1R:0":"MAP_METEOR_FALLS_1F_1R:0/MAP_ROUTE114:0","MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1","MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0":"MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2","MAP_ROUTE114:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0,1/MAP_ROUTE114:1":"MAP_ROUTE114:1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:0","MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0":"MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0,1/MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2":"MAP_ROUTE114_FOSSIL_MANIACS_HOUSE:2/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:0","MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0":"MAP_DESERT_UNDERPASS:0/MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2","MAP_ROUTE114_LANETTES_HOUSE:0,1/MAP_ROUTE114:2":"MAP_ROUTE114:2/MAP_ROUTE114_LANETTES_HOUSE:0","MAP_ROUTE115:0/MAP_METEOR_FALLS_1F_1R:1":"MAP_METEOR_FALLS_1F_1R:1/MAP_ROUTE115:0","MAP_ROUTE115:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE115:2/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0":"MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0","MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0":"MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1","MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2":"MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2","MAP_ROUTE116:3/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116:4/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE116_TUNNELERS_REST_HOUSE:0,1/MAP_ROUTE116:1":"MAP_ROUTE116:1/MAP_ROUTE116_TUNNELERS_REST_HOUSE:0","MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0":"MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0","MAP_ROUTE117_POKEMON_DAY_CARE:0,1/MAP_ROUTE117:0":"MAP_ROUTE117:0/MAP_ROUTE117_POKEMON_DAY_CARE:0","MAP_ROUTE118:0/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE118:1/MAP_TERRA_CAVE_ENTRANCE:0!":"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!","MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0","MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0":"MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1","MAP_ROUTE119_HOUSE:0,1/MAP_ROUTE119:1":"MAP_ROUTE119:1/MAP_ROUTE119_HOUSE:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:0,1/MAP_ROUTE119:0":"MAP_ROUTE119:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:0","MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0":"MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2","MAP_ROUTE119_WEATHER_INSTITUTE_2F:0/MAP_ROUTE119_WEATHER_INSTITUTE_1F:2":"MAP_ROUTE119_WEATHER_INSTITUTE_1F:2/MAP_ROUTE119_WEATHER_INSTITUTE_2F:0","MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0":"MAP_ANCIENT_TOMB:0/MAP_ROUTE120:0","MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0":"MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1","MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0":"MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0","MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2,3/MAP_ROUTE121:0":"MAP_ROUTE121:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:2","MAP_ROUTE122:0/MAP_MT_PYRE_1F:0":"MAP_MT_PYRE_1F:0,2/MAP_ROUTE122:0","MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0":"MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0","MAP_ROUTE123_BERRY_MASTERS_HOUSE:0,1/MAP_ROUTE123:0":"MAP_ROUTE123:0/MAP_ROUTE123_BERRY_MASTERS_HOUSE:0","MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0":"MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0","MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0,1/MAP_ROUTE124:0":"MAP_ROUTE124:0/MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE:0","MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0","MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0":"MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0","MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0":"MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0","MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0":"MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1","MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0":"MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10","MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0":"MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11","MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0":"MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2","MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3","MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0":"MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4","MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6","MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0":"MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7","MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0":"MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8","MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0":"MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9","MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0,1/MAP_RUSTBORO_CITY:8":"MAP_RUSTBORO_CITY:8/MAP_RUSTBORO_CITY_CUTTERS_HOUSE:0","MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1/MAP_RUSTBORO_CITY:5,6":"MAP_RUSTBORO_CITY:5,6/MAP_RUSTBORO_CITY_DEVON_CORP_1F:0,1","MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2","MAP_RUSTBORO_CITY_DEVON_CORP_2F:0/MAP_RUSTBORO_CITY_DEVON_CORP_1F:2":"MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0","MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0":"MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1","MAP_RUSTBORO_CITY_DEVON_CORP_3F:0/MAP_RUSTBORO_CITY_DEVON_CORP_2F:1":"MAP_RUSTBORO_CITY_DEVON_CORP_2F:1/MAP_RUSTBORO_CITY_DEVON_CORP_3F:0","MAP_RUSTBORO_CITY_FLAT1_1F:0,1/MAP_RUSTBORO_CITY:1":"MAP_RUSTBORO_CITY:1/MAP_RUSTBORO_CITY_FLAT1_1F:0","MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0":"MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2","MAP_RUSTBORO_CITY_FLAT1_2F:0/MAP_RUSTBORO_CITY_FLAT1_1F:2":"MAP_RUSTBORO_CITY_FLAT1_1F:2/MAP_RUSTBORO_CITY_FLAT1_2F:0","MAP_RUSTBORO_CITY_FLAT2_1F:0,1/MAP_RUSTBORO_CITY:10":"MAP_RUSTBORO_CITY:10/MAP_RUSTBORO_CITY_FLAT2_1F:0","MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0":"MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2","MAP_RUSTBORO_CITY_FLAT2_2F:0/MAP_RUSTBORO_CITY_FLAT2_1F:2":"MAP_RUSTBORO_CITY_FLAT2_1F:2/MAP_RUSTBORO_CITY_FLAT2_2F:0","MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0":"MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1","MAP_RUSTBORO_CITY_FLAT2_3F:0/MAP_RUSTBORO_CITY_FLAT2_2F:1":"MAP_RUSTBORO_CITY_FLAT2_2F:1/MAP_RUSTBORO_CITY_FLAT2_3F:0","MAP_RUSTBORO_CITY_GYM:0,1/MAP_RUSTBORO_CITY:0":"MAP_RUSTBORO_CITY:0/MAP_RUSTBORO_CITY_GYM:0","MAP_RUSTBORO_CITY_HOUSE1:0,1/MAP_RUSTBORO_CITY:7":"MAP_RUSTBORO_CITY:7/MAP_RUSTBORO_CITY_HOUSE1:0","MAP_RUSTBORO_CITY_HOUSE2:0,1/MAP_RUSTBORO_CITY:9":"MAP_RUSTBORO_CITY:9/MAP_RUSTBORO_CITY_HOUSE2:0","MAP_RUSTBORO_CITY_HOUSE3:0,1/MAP_RUSTBORO_CITY:11":"MAP_RUSTBORO_CITY:11/MAP_RUSTBORO_CITY_HOUSE3:0","MAP_RUSTBORO_CITY_MART:0,1/MAP_RUSTBORO_CITY:2":"MAP_RUSTBORO_CITY:2/MAP_RUSTBORO_CITY_MART:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0,1/MAP_RUSTBORO_CITY:3":"MAP_RUSTBORO_CITY:3/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0":"MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0/MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2":"MAP_RUSTBORO_CITY_POKEMON_CENTER_1F:2/MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:0","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0,1/MAP_RUSTBORO_CITY:4":"MAP_RUSTBORO_CITY:4/MAP_RUSTBORO_CITY_POKEMON_SCHOOL:0","MAP_RUSTURF_TUNNEL:0/MAP_ROUTE116:0":"MAP_ROUTE116:0/MAP_RUSTURF_TUNNEL:0","MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4":"MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1","MAP_RUSTURF_TUNNEL:2/MAP_ROUTE116:2":"MAP_ROUTE116:2/MAP_RUSTURF_TUNNEL:2","MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0":"MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0","MAP_SAFARI_ZONE_SOUTH:0/MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0":"MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0","MAP_SAFARI_ZONE_SOUTHWEST:0/MAP_SAFARI_ZONE_REST_HOUSE:0":"MAP_SAFARI_ZONE_REST_HOUSE:0,1/MAP_SAFARI_ZONE_SOUTHWEST:0","MAP_SCORCHED_SLAB:0/MAP_ROUTE120:1":"MAP_ROUTE120:1/MAP_SCORCHED_SLAB:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:0/MAP_UNDERWATER_ROUTE128:0!":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0":"MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1","MAP_SEAFLOOR_CAVERN_ROOM1:0/MAP_SEAFLOOR_CAVERN_ENTRANCE:1":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0":"MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1","MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0":"MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2","MAP_SEAFLOOR_CAVERN_ROOM2:0/MAP_SEAFLOOR_CAVERN_ROOM1:2":"MAP_SEAFLOOR_CAVERN_ROOM1:2/MAP_SEAFLOOR_CAVERN_ROOM2:0","MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0":"MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1","MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0":"MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2","MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0":"MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3","MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1":"MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0","MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1":"MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1","MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1":"MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2","MAP_SEAFLOOR_CAVERN_ROOM4:0/MAP_SEAFLOOR_CAVERN_ROOM2:1":"MAP_SEAFLOOR_CAVERN_ROOM2:1/MAP_SEAFLOOR_CAVERN_ROOM4:0","MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1":"MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1","MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2":"MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2","MAP_SEAFLOOR_CAVERN_ROOM4:3/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM5:0/MAP_SEAFLOOR_CAVERN_ROOM1:1":"MAP_SEAFLOOR_CAVERN_ROOM1:1/MAP_SEAFLOOR_CAVERN_ROOM5:0","MAP_SEAFLOOR_CAVERN_ROOM5:1/MAP_SEAFLOOR_CAVERN_ROOM4:1":"MAP_SEAFLOOR_CAVERN_ROOM4:1/MAP_SEAFLOOR_CAVERN_ROOM5:1","MAP_SEAFLOOR_CAVERN_ROOM5:2/MAP_SEAFLOOR_CAVERN_ROOM4:2":"MAP_SEAFLOOR_CAVERN_ROOM4:2/MAP_SEAFLOOR_CAVERN_ROOM5:2","MAP_SEAFLOOR_CAVERN_ROOM6:0/MAP_SEAFLOOR_CAVERN_ROOM2:2":"MAP_SEAFLOOR_CAVERN_ROOM2:2/MAP_SEAFLOOR_CAVERN_ROOM6:0","MAP_SEAFLOOR_CAVERN_ROOM6:1/MAP_SEAFLOOR_CAVERN_ROOM3:2":"MAP_SEAFLOOR_CAVERN_ROOM3:2/MAP_SEAFLOOR_CAVERN_ROOM6:1","MAP_SEAFLOOR_CAVERN_ROOM6:2/MAP_SEAFLOOR_CAVERN_ENTRANCE:1!":"MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0","MAP_SEAFLOOR_CAVERN_ROOM7:0/MAP_SEAFLOOR_CAVERN_ROOM2:3":"MAP_SEAFLOOR_CAVERN_ROOM2:3/MAP_SEAFLOOR_CAVERN_ROOM7:0","MAP_SEAFLOOR_CAVERN_ROOM7:1/MAP_SEAFLOOR_CAVERN_ROOM3:1":"MAP_SEAFLOOR_CAVERN_ROOM3:1/MAP_SEAFLOOR_CAVERN_ROOM7:1","MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0":"MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0","MAP_SEAFLOOR_CAVERN_ROOM8:1/MAP_SEAFLOOR_CAVERN_ROOM3:0":"MAP_SEAFLOOR_CAVERN_ROOM3:0/MAP_SEAFLOOR_CAVERN_ROOM8:1","MAP_SEAFLOOR_CAVERN_ROOM9:0/MAP_SEAFLOOR_CAVERN_ROOM8:0":"MAP_SEAFLOOR_CAVERN_ROOM8:0/MAP_SEAFLOOR_CAVERN_ROOM9:0","MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0":"MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0","MAP_SEALED_CHAMBER_OUTER_ROOM:0/MAP_SEALED_CHAMBER_INNER_ROOM:0":"MAP_SEALED_CHAMBER_INNER_ROOM:0/MAP_SEALED_CHAMBER_OUTER_ROOM:0","MAP_SECRET_BASE_BLUE_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BLUE_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_BROWN_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_RED_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_SHRUB4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_TREE4:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE1:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE2:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE3:0/MAP_DYNAMIC:-2!":"","MAP_SECRET_BASE_YELLOW_CAVE4:0/MAP_DYNAMIC:-2!":"","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0/MAP_ROUTE125:0":"MAP_ROUTE125:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:6","MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7/MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:7","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:4/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:1","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:5/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:2","MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3/MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0":"MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM:3","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:0","MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1/MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2":"MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM:2/MAP_SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM:1","MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1":"MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0","MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0":"MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2","MAP_SKY_PILLAR_2F:0/MAP_SKY_PILLAR_1F:2":"MAP_SKY_PILLAR_1F:2/MAP_SKY_PILLAR_2F:0","MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0":"MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1","MAP_SKY_PILLAR_3F:0/MAP_SKY_PILLAR_2F:1":"MAP_SKY_PILLAR_2F:1/MAP_SKY_PILLAR_3F:0","MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0":"MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1","MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1":"MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2","MAP_SKY_PILLAR_4F:0/MAP_SKY_PILLAR_3F:1":"MAP_SKY_PILLAR_3F:1/MAP_SKY_PILLAR_4F:0","MAP_SKY_PILLAR_4F:1/MAP_SKY_PILLAR_3F:2":"MAP_SKY_PILLAR_3F:2/MAP_SKY_PILLAR_4F:1","MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0":"MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2","MAP_SKY_PILLAR_5F:0/MAP_SKY_PILLAR_4F:2":"MAP_SKY_PILLAR_4F:2/MAP_SKY_PILLAR_5F:0","MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0":"MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1","MAP_SKY_PILLAR_ENTRANCE:0/MAP_ROUTE131:0":"MAP_ROUTE131:0/MAP_SKY_PILLAR_ENTRANCE:0","MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0":"MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1","MAP_SKY_PILLAR_OUTSIDE:0/MAP_SKY_PILLAR_ENTRANCE:1":"MAP_SKY_PILLAR_ENTRANCE:1/MAP_SKY_PILLAR_OUTSIDE:0","MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0":"MAP_SKY_PILLAR_1F:0,1/MAP_SKY_PILLAR_OUTSIDE:1","MAP_SKY_PILLAR_TOP:0/MAP_SKY_PILLAR_5F:1":"MAP_SKY_PILLAR_5F:1/MAP_SKY_PILLAR_TOP:0","MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0","MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0":"MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1","MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0":"MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10","MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2","MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0":"MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3","MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0":"MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4","MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7","MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0":"MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6","MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0":"MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8","MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2":"MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9","MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0,1/MAP_SLATEPORT_CITY:3":"MAP_SLATEPORT_CITY:3/MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY:0","MAP_SLATEPORT_CITY_HARBOR:0,1/MAP_SLATEPORT_CITY:8":"MAP_SLATEPORT_CITY:8/MAP_SLATEPORT_CITY_HARBOR:0","MAP_SLATEPORT_CITY_HARBOR:2,3/MAP_SLATEPORT_CITY:9":"MAP_SLATEPORT_CITY:9/MAP_SLATEPORT_CITY_HARBOR:2","MAP_SLATEPORT_CITY_HOUSE:0,1/MAP_SLATEPORT_CITY:10":"MAP_SLATEPORT_CITY:10/MAP_SLATEPORT_CITY_HOUSE:0","MAP_SLATEPORT_CITY_MART:0,1/MAP_SLATEPORT_CITY:1":"MAP_SLATEPORT_CITY:1/MAP_SLATEPORT_CITY_MART:0","MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0,1/MAP_SLATEPORT_CITY:6":"MAP_SLATEPORT_CITY:6/MAP_SLATEPORT_CITY_NAME_RATERS_HOUSE:0","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1/MAP_SLATEPORT_CITY:5,7":"MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2","MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2":"MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:2/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0,1/MAP_SLATEPORT_CITY:0":"MAP_SLATEPORT_CITY:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0":"MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0/MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2":"MAP_SLATEPORT_CITY_POKEMON_CENTER_1F:2/MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:0","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0,1/MAP_SLATEPORT_CITY:4":"MAP_SLATEPORT_CITY:4/MAP_SLATEPORT_CITY_POKEMON_FAN_CLUB:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0,1/MAP_SLATEPORT_CITY:2":"MAP_SLATEPORT_CITY:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:0","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2","MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2":"MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F:2/MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F:0","MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0","MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0":"MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1","MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0":"MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10","MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0":"MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11","MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12","MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0":"MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2","MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0":"MAP_CAVE_OF_ORIGIN_ENTRANCE:0/MAP_SOOTOPOLIS_CITY:3","MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0":"MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4","MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0":"MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5","MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0":"MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6","MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0":"MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7","MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0":"MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8","MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0":"MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9","MAP_SOOTOPOLIS_CITY_GYM_1F:0,1/MAP_SOOTOPOLIS_CITY:2":"MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0","MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0":"MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2","MAP_SOOTOPOLIS_CITY_GYM_B1F:0/MAP_SOOTOPOLIS_CITY_GYM_1F:2":"MAP_SOOTOPOLIS_CITY_GYM_1F:2/MAP_SOOTOPOLIS_CITY_GYM_B1F:0","MAP_SOOTOPOLIS_CITY_HOUSE1:0,1/MAP_SOOTOPOLIS_CITY:4":"MAP_SOOTOPOLIS_CITY:4/MAP_SOOTOPOLIS_CITY_HOUSE1:0","MAP_SOOTOPOLIS_CITY_HOUSE2:0,1/MAP_SOOTOPOLIS_CITY:5":"MAP_SOOTOPOLIS_CITY:5/MAP_SOOTOPOLIS_CITY_HOUSE2:0","MAP_SOOTOPOLIS_CITY_HOUSE3:0,1/MAP_SOOTOPOLIS_CITY:6":"MAP_SOOTOPOLIS_CITY:6/MAP_SOOTOPOLIS_CITY_HOUSE3:0","MAP_SOOTOPOLIS_CITY_HOUSE4:0,1/MAP_SOOTOPOLIS_CITY:7":"MAP_SOOTOPOLIS_CITY:7/MAP_SOOTOPOLIS_CITY_HOUSE4:0","MAP_SOOTOPOLIS_CITY_HOUSE5:0,1/MAP_SOOTOPOLIS_CITY:8":"MAP_SOOTOPOLIS_CITY:8/MAP_SOOTOPOLIS_CITY_HOUSE5:0","MAP_SOOTOPOLIS_CITY_HOUSE6:0,1/MAP_SOOTOPOLIS_CITY:9":"MAP_SOOTOPOLIS_CITY:9/MAP_SOOTOPOLIS_CITY_HOUSE6:0","MAP_SOOTOPOLIS_CITY_HOUSE7:0,1/MAP_SOOTOPOLIS_CITY:10":"MAP_SOOTOPOLIS_CITY:10/MAP_SOOTOPOLIS_CITY_HOUSE7:0","MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0,1/MAP_SOOTOPOLIS_CITY:11":"MAP_SOOTOPOLIS_CITY:11/MAP_SOOTOPOLIS_CITY_LOTAD_AND_SEEDOT_HOUSE:0","MAP_SOOTOPOLIS_CITY_MART:0,1/MAP_SOOTOPOLIS_CITY:1":"MAP_SOOTOPOLIS_CITY:1/MAP_SOOTOPOLIS_CITY_MART:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0,1/MAP_SOOTOPOLIS_CITY:12":"MAP_SOOTOPOLIS_CITY:12/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:0","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2","MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2":"MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F:2/MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0,1/MAP_SOOTOPOLIS_CITY:0":"MAP_SOOTOPOLIS_CITY:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2":"MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F:2/MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:0","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1":"MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1","MAP_SOUTHERN_ISLAND_INTERIOR:0,1/MAP_SOUTHERN_ISLAND_EXTERIOR:0,1":"MAP_SOUTHERN_ISLAND_EXTERIOR:0,1/MAP_SOUTHERN_ISLAND_INTERIOR:0,1","MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0":"MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0","MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2":"MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1","MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4":"MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2","MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6":"MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3","MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8":"MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4","MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9":"MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5","MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10":"MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6","MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11":"MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7","MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0":"MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8","MAP_SS_TIDAL_LOWER_DECK:0/MAP_SS_TIDAL_CORRIDOR:8":"MAP_SS_TIDAL_CORRIDOR:8/MAP_SS_TIDAL_LOWER_DECK:0","MAP_SS_TIDAL_ROOMS:0,1/MAP_SS_TIDAL_CORRIDOR:0":"MAP_SS_TIDAL_CORRIDOR:0/MAP_SS_TIDAL_ROOMS:0","MAP_SS_TIDAL_ROOMS:10/MAP_SS_TIDAL_CORRIDOR:6":"MAP_SS_TIDAL_CORRIDOR:6/MAP_SS_TIDAL_ROOMS:10","MAP_SS_TIDAL_ROOMS:11/MAP_SS_TIDAL_CORRIDOR:7":"MAP_SS_TIDAL_CORRIDOR:7/MAP_SS_TIDAL_ROOMS:11","MAP_SS_TIDAL_ROOMS:2,3/MAP_SS_TIDAL_CORRIDOR:1":"MAP_SS_TIDAL_CORRIDOR:1/MAP_SS_TIDAL_ROOMS:2","MAP_SS_TIDAL_ROOMS:4,5/MAP_SS_TIDAL_CORRIDOR:2":"MAP_SS_TIDAL_CORRIDOR:2/MAP_SS_TIDAL_ROOMS:4","MAP_SS_TIDAL_ROOMS:6,7/MAP_SS_TIDAL_CORRIDOR:3":"MAP_SS_TIDAL_CORRIDOR:3/MAP_SS_TIDAL_ROOMS:6","MAP_SS_TIDAL_ROOMS:8/MAP_SS_TIDAL_CORRIDOR:4":"MAP_SS_TIDAL_CORRIDOR:4/MAP_SS_TIDAL_ROOMS:8","MAP_SS_TIDAL_ROOMS:9/MAP_SS_TIDAL_CORRIDOR:5":"MAP_SS_TIDAL_CORRIDOR:5/MAP_SS_TIDAL_ROOMS:9","MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1":"MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0","MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!":"","MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0":"MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1","MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!":"","MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2":"MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0","MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0":"MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1","MAP_TRAINER_HILL_2F:0/MAP_TRAINER_HILL_1F:1":"MAP_TRAINER_HILL_1F:1/MAP_TRAINER_HILL_2F:0","MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0":"MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1","MAP_TRAINER_HILL_3F:0/MAP_TRAINER_HILL_2F:1":"MAP_TRAINER_HILL_2F:1/MAP_TRAINER_HILL_3F:0","MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0":"MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1","MAP_TRAINER_HILL_4F:0/MAP_TRAINER_HILL_3F:1":"MAP_TRAINER_HILL_3F:1/MAP_TRAINER_HILL_4F:0","MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0":"MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1","MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1":"MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1","MAP_TRAINER_HILL_ENTRANCE:0,1/MAP_ROUTE111:4":"MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0","MAP_TRAINER_HILL_ENTRANCE:2/MAP_TRAINER_HILL_1F:0":"MAP_TRAINER_HILL_1F:0/MAP_TRAINER_HILL_ENTRANCE:2","MAP_TRAINER_HILL_ROOF:0/MAP_TRAINER_HILL_4F:1":"MAP_TRAINER_HILL_4F:1/MAP_TRAINER_HILL_ROOF:0","MAP_TRAINER_HILL_ROOF:1/MAP_TRAINER_HILL_ELEVATOR:1":"MAP_TRAINER_HILL_ELEVATOR:0,1/MAP_TRAINER_HILL_ROOF:1","MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!":"","MAP_UNDERWATER_ROUTE105:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE105:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE125:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0":"MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0","MAP_UNDERWATER_ROUTE127:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE127:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0":"MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0","MAP_UNDERWATER_ROUTE129:0/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE129:1/MAP_UNDERWATER_MARINE_CAVE:0!":"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!","MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0":"MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0","MAP_UNDERWATER_SEAFLOOR_CAVERN:0/MAP_UNDERWATER_ROUTE128:0":"MAP_UNDERWATER_ROUTE128:0/MAP_UNDERWATER_SEAFLOOR_CAVERN:0","MAP_UNDERWATER_SEALED_CHAMBER:0/MAP_UNDERWATER_ROUTE134:0":"MAP_UNDERWATER_ROUTE134:0/MAP_UNDERWATER_SEALED_CHAMBER:0","MAP_UNDERWATER_SOOTOPOLIS_CITY:0,1/MAP_UNDERWATER_ROUTE126:0":"MAP_UNDERWATER_ROUTE126:0/MAP_UNDERWATER_SOOTOPOLIS_CITY:0","MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!":"","MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0":"MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0","MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0":"MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1","MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2","MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0":"MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3","MAP_VERDANTURF_TOWN:4/MAP_RUSTURF_TUNNEL:1":"MAP_RUSTURF_TUNNEL:1/MAP_VERDANTURF_TOWN:4","MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0":"MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5","MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0":"MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6","MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0,1/MAP_VERDANTURF_TOWN:0":"MAP_VERDANTURF_TOWN:0/MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY:0","MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0,1/MAP_VERDANTURF_TOWN:5":"MAP_VERDANTURF_TOWN:5/MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE:0","MAP_VERDANTURF_TOWN_HOUSE:0,1/MAP_VERDANTURF_TOWN:6":"MAP_VERDANTURF_TOWN:6/MAP_VERDANTURF_TOWN_HOUSE:0","MAP_VERDANTURF_TOWN_MART:0,1/MAP_VERDANTURF_TOWN:1":"MAP_VERDANTURF_TOWN:1/MAP_VERDANTURF_TOWN_MART:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0,1/MAP_VERDANTURF_TOWN:2":"MAP_VERDANTURF_TOWN:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0/MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2":"MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F:2/MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:0","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:1/MAP_UNION_ROOM:0!":"MAP_UNION_ROOM:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_POKEMON_CENTER_2F:2/MAP_TRADE_CENTER:0!":"MAP_TRADE_CENTER:0,1/MAP_DYNAMIC:-1!","MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0,1/MAP_VERDANTURF_TOWN:3":"MAP_VERDANTURF_TOWN:3/MAP_VERDANTURF_TOWN_WANDAS_HOUSE:0","MAP_VICTORY_ROAD_1F:0/MAP_EVER_GRANDE_CITY:2":"MAP_EVER_GRANDE_CITY:2/MAP_VICTORY_ROAD_1F:0","MAP_VICTORY_ROAD_1F:1/MAP_EVER_GRANDE_CITY:3":"MAP_EVER_GRANDE_CITY:3/MAP_VICTORY_ROAD_1F:1","MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5":"MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2","MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2":"MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3","MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4":"MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4","MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0":"MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0","MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2":"MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1","MAP_VICTORY_ROAD_B1F:2/MAP_VICTORY_ROAD_1F:3":"MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2","MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1":"MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3","MAP_VICTORY_ROAD_B1F:4/MAP_VICTORY_ROAD_1F:4":"MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4","MAP_VICTORY_ROAD_B1F:5/MAP_VICTORY_ROAD_1F:2":"MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5","MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3":"MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6","MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0":"MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0","MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3":"MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1","MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1":"MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2","MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6":"MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3"}} diff --git a/worlds/pokemon_emerald/docs/adjuster_en.md b/worlds/pokemon_emerald/docs/adjuster_en.md new file mode 100644 index 0000000000..adb81b415e --- /dev/null +++ b/worlds/pokemon_emerald/docs/adjuster_en.md @@ -0,0 +1,293 @@ +# Pokémon Gen 3 Adjuster for Pokémon Emerald + +1) [Introduction](#introduction) +2) [Quickstart](#quickstart) +3) [Sprite Pack](#sprite-pack) + 1) [Extracting Resources from the ROM](#extracting-resources-from-the-rom) + 2) [Pokémon Folder Specifications](#pokemon-folder-specifications) + 1) [Pokémon Folder Sprites](#pokemon-folder-sprites) + 2) [Pokémon Folder Exceptions](#pokemon-folder-exceptions) + 3) [Player Folder Specifications](#player-folder-specifications) + 1) [Player Folder Palettes](#player-folder-palettes) + 2) [Player Folder Sprites](#player-folder-sprites) + 3) [Player Folder Sprite Size Override](#player-folder-sprite-size-override) +4) [Pokémon Data Edition](#pokemon-data-edition) +5) [Applying the Sprite Pack](#applying-the-sprite-pack) + +## Introduction + +The Pokémon Gen 3 Adjuster allows anyone to apply a sprite pack to Pokémon Emerald, Pokémon Firered and Pokémon +Leafgreen, in order to personnalize runs made in Archipelago with these games. + +While its main goal is to apply said sprite packs to an AP-patched version of said ROMs, the tool also allows the +patching of vanilla ROMs. + +## Quickstart + +If you want to quickly get into using the adjuster, you can create a sprite pack by +[extracting resources from the ROM](#extracting-resources-from-the-rom). + +Once you have said pack, modify the sprites in it at your leisure, but feel free to check the specifications for each +folder if you encounter any problem. + +Once a ROM (or AP patch) and a sprite pack is given, you just need to [apply the sprite pack](#applying-the-sprite-pack) +and run your adjusted ROM in your emulator of choice, and you're good to go! + +## Sprite Pack + +A sprite pack is a folder containing folders with specific names for the various objects you want to replace. Here +is an example of a valid sprite pack, who replaces some resources from the Pokémon Latios and the Player Brendan: + +``` +Sprite Pack/ + Brendan/ + battle_back.png + battle_front.png + Latios/ + front_anim.png + back.png +``` + +Note: If sprites contain several frames, then said frames must be vertical: a `64x64px` sprite with `2` +frames will require a `64x128px` sprite. + +**Warning:** All sprites used in sprite packs must be Indexed PNG files. Some pixel editing +programs such as Aseprite allow you to make those easily instead of standard PNG files. + +Different types of folder exists: mainly Pokémon folders, and Player folders. + +### Extracting Resources from the ROM + +The Pokémon Gen 3 Adjuster allows you to extract resources from any object handled by the adjuster. In order to +extract a resource, a ROM or .apemerald patch must be given. + +Once a valid ROM or patch is given, a new module will appear within the adjuster named `Sprite Extractor`. In it, +you can either select one specific object to extract the resources of using the field given in it, or you can +extract all resources from the ROM with one button press. + +Once you press any of the `Extract` buttons, you must select a folder in which either all resources from the +currently selected object will be extracted, or in which a complete sprite pack will be extracted. + +Note: If you try to extract resources in a folder that doesn't exist, the adjuster will create said folders +first. + +### Pokémon Folder Specifications + +Pokémon folder names correspond to the name of the 386 Pokémon available within Generation 3 of Pokémon, with some +extras and exceptions. Here is a list of them: + +- Nidoran♂ => Nidoran Male +- Nidoran♀ => Nidoran Female +- Unown => Unown A +- All letter shapes of Unown have been added as Unown B, Unown C... Unown Z +- Unown ! => Unown Exclamation Mark +- Unown ? => Unown Question Mark +- The Egg folder has been added + +#### Pokémon Folder Sprites + +Generally, Pokémon folders will handle these sprites: + +- `front_anim.png`: This sprite replaces the animation used when displaying the enemy's Pokémon sprite in battle, +and the Pokémon sprite used when looking at a Pokémon's status in your team menu + - Required sprite size: `64x64px` sprite with `2` frames (`64x128px`) + - Required palette size: `16` colors max +- `sfront_anim.png`: Shiny variant of the animation used when displaying the enemy's Pokémon sprite in battle, and +the Pokémon sprite used when looking at a Pokémon's status in your team menu + - Same requirements as `front_anim.png` + - Make sure that the sprite's pixel data matches the one from `front_anim.png`, as only the sprite's palette + is used by the adjuster +- `back.png`: This sprite replaces the sprite used when displaying your Pokémon sprite in battle + - Required sprite size: `64x64px` sprite + - Required palette size: `16` colors max +- `sback.png`: Shiny variant of the sprite used when displaying your Pokémon sprite in battle + - Optional if `sfront_anim.png` is given + - Same requirements as `back.png` + - Make sure that the sprite's pixel data matches the one from `back.png`, as only the sprite's palette + is used by the adjuster +- `icon-X.png`: Icon used for the Pokémon in the team menu + - Required sprite size: `32x32px` sprite with `2` frames (`32x64px`) + - X must be a value between 0 and 2: This number will choose which icon palette to use + - Icon palettes: [Palette 0](./icon_palette_0.pal), [Palette 1](./icon_palette_1.pal), + [Palette 2](./icon_palette_2.pal) + - Alternatively, `Venusaur` uses Palette 1, `Charizard` uses Palette 0, and `Blastoise` uses Palette 2. You can + extract those objects to get icon sprites with the right palettes. +- `footprint.png`: Pokémon's footprint in the Pokédex + - Required sprite size: `16x16px` sprite + - Required palette: Exactly 2 colors: black (0, 0, 0) and white (255, 255, 255) + +#### Pokémon Folder Exceptions + +While most Pokémon follow the rules above, some of them have different requirements: + +- Castform: + - `front_anim.png` & `sfront_anim.png`: + - Required sprite size: `64x64px` sprite with `4` frames (`64x256px`) + - Required palette size: Exactly `64` colors + - Each frame uses colors from its 16-color palette: Frame 1 uses colors 1-16 from the palette, Frame 2 + uses colors 17-32 from the palette, etc... + - `back.png` & `sback.png`: + - Required sprite size: `64x64px` sprite with `4` frames (`64x256px`) + - Required palette size: Exactly `64` colors + - Each frame uses colors from its 16-color palette: Frame 1 uses colors 1-16 from the palette, Frame 2 + uses colors 17-32 from the palette, etc... +- Deoxys: + - `back.png` & `sback.png`: + - Required sprite size: `64x64px` sprite with `2` frames (`64x128px`) + - First frame for the Normal Deoxys form, second frame for the Speed Deoxys form + - `icon-X.png`: + - Required sprite size: `32x32` sprite with `4` frames (`32x128px`) + - First two frames for the Normal Deoxys form, last two frames for the Speed Deoxys form +- All Unowns: + - `front_anim.png` & `back.png`: + - Palette: Only Unown A's palette is used for all Unowns, so the existing colors of the palette must be + kept. Extract Unown A's sprites to get its palette, and only edit the pink colors in it + - `sfront_anim.png` & `sback.png`: + - Palette: Only Unown A's shiny palette is used for all Unowns, so the existing colors of the palette must + be kept. Extract Unown A's sprites to get its shiny palette, and only edit the pink colors in it + - `footprint.png`: + - Only Unown A's footprint is used for all Unowns, thus this sprite doesn't exist within the ROM, and will + be ignored by the adjuster +- Egg: + - `hatch_anim.png`: + - Required sprite size: `32x32px` sprite with `4` frames + `8x8px` sprite with `4` frames (`32x136px`) + - Required palette size: `16` colors max + - Extract the Egg sprite from the ROM to see this sprite's shape. It contains 4 frames for the hatching + animation, and 4 frames for eggshells shards flying around after hatching + +### Player Folder Specifications + +Player folder names correspond to the name of the male and female players within Emerald: `Brendan` for the male +trainer, and `May` for the female trainer. + +These sprites are separated in two categories: battle sprites and overworld sprites. The sprites' palettes must be +the same between battle sprites, and between overworld sprites, unless stated otherwise. + +#### Player Folder Palettes + +The palettes used for overworld sprites has some restrictions, as elements other than the player uses said palette: +- The arrow displayed when next to an exit from a sub-area (cave, dungeon) uses the color #10 from the palette, +- The exclamation mark displayed above trainers when they notice you before battling uses colors #15 and #16 from +the palette, +- The Pokémon you surf on in the overworld uses color #6 for its light shade, color #7 for its medium shade, and +color #16 for its dark shade, +- The Pokémon you fly on in the overworld uses color #6 for its light shade, color #7 for its medium shade, and +color #16 for its dark shade, + +For this reason, color #15 of the player's overworld palette must be white (255, 255, 255), and color #16 must be +black (0, 0, 0). + +#### Player Folder Sprites + +- `battle_back.png`: `Battle` sprite. This sprite replaces the animation used when the player is throwing a ball, +whether it's at the beginning of a battle, or in the Safari Zone + - Required sprite size: `64x64px` sprite with `4` OR `5` frames (`64x256px` OR `64x320px`) + - Required palette size: Exactly `16` colors + - If `4` frames are given, the player will use the `Emerald-style` ball throwing animation, and if `5` frames + are given, the player will use the `Firered/Leafgreen-style` ball thowing animation + - `Emerald-style` ball throwing animation: The last frame is the idle frame, the rest is the animation + - `Firered/Leafgreen-style` ball throwing animation: The first frame is the idle frame, the rest is the + animation +- `battle_front.png`: `Battle` sprite. This sprite replaces the sprite used when fighting your rival, at the +beginning and end of a battle, and the sprite used in the Trainer card. + - Required sprite size: `64x64px` sprite + - Required palette size: Exactly `16` colors +- `walking_running.png`: `Overworld` sprite. This sprite replaces the walking and running animations of the player +in the overworld. + - Required sprite size: `16x32px` sprite with `18` frames (`16x576px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `reflection.png`: `Overworld` sprite. This sprite's palette is shown whenever the player stands in front of clear +water, in their reflection. + - Required sprite size: `16x32px` sprite with `18` frames (`16x576px`) + - Required palette size: Exactly `16` colors + - The palette must be a faded version of the overworld palette, to look like a reflection of the player in the + water +- `acro_bike.png`: `Overworld` sprite. This sprite replaces the Acro Bike animations of the player in the overworld. + - Required sprite size: `32x32px` sprite with `27` frames (`32x864px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `mach_bike.png`: `Overworld` sprite. This sprite replaces the Mach Bike animations of the player in the overworld. + - Required sprite size: `32x32px` sprite with `9` frames (`32x288px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `surfing.png`: `Overworld` sprite. This sprite replaces the surfing animations of the player in the overworld. + - Required sprite size: `32x32px` sprite with `12` frames (`32x384px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `field_move.png`: `Overworld` sprite. This sprite replaces the animation used when the player uses an HM move in +the overworld such as Cut, Rock Smash or Strength. + - Required sprite size: `32x32px` sprite with `5` frames (`32x160px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `underwater.png`: `Overworld` sprite. This sprite replaces the animation used when the player is swimming on a +Pokémon's back underwater. + - Required sprite size: `32x32px` sprite with `9` frames (`32x288px`) + - Required palette size: Exactly `16` colors. Since this palette is shared among both players, the existing + colors of the palette must be kept. Extract the player's sprites to get its palette, and only edit colors #2 + to #5, and colors #11 to #16 +- `fishing.png`: `Overworld` sprite. This sprite replaces the animation used when the player is fishing. + - Required sprite size: `32x32px` sprite with `12` frames (`32x384px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `watering.png`: `Overworld` sprite. This sprite replaces the animation used when the player is watering berries. + - Required sprite size: `32x32px` sprite with `9` frames (`32x288px`) + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) +- `decorating.png`: `Overworld` sprite. This sprite replaces the sprite used when the player is decorating their +secret base. + - Required sprite size: `16x32px` sprite + - Required palette size: Exactly `16` colors, see [Player Folder Palettes](#player-folder-palettes) + +#### Player Folder Sprite Size Override + +All overworld sprites frames can have a different size if you wish for your sprite to be bigger or smaller. In +order to change a sprite's size, you must add `-XxY` at the end of their file name, with `X` the width of the +sprite, and `Y` the height of the sprite. + +Currently, only three overworld sprite sizes are allowed: `16x16px`, `16x32px` and `32x32px`. + +For example, if you want the frames of the sprite `walking_running.png` to have a size of `32x32px`, then the +sprite must be named `walking_running-32x32.png`, and its size must be `32x576px`. + +## Pokémon Data Edition + +Once a sprite pack has been loaded into the adjuster, a `Sprite Preview` module will be added to it. It allows you +to preview the various sprites within the sprite pack, as well as their palette. + +If a valid ROM or AP patch have been given, then the `Pokémon Data Editor` module will appear. This module allows +you to edit some data related to the Pokémon in the current sprite pack. + +Here is a list of the values and their specifications: + +- HP: The Pokémon's base HP. Must be a number between 1 and 255. +- Attack: The Pokémon's base attack. Must be a number between 1 and 255. +- Defense: The Pokémon's base defense. Must be a number between 1 and 255. +- Sp. Attack: The Pokémon's base special attack. Must be a number between 1 and 255. +- Sp. Defense: The Pokémon's base special defense. Must be a number between 1 and 255. +- Speed: The Pokémon's base speed. Must be a number between 1 and 255. +- Type 1: The Pokémon's first type. Select a value within the given list. +- Type 2: The Pokémon's second type. Select a value within the given list. Make it match the first type if you want +the Pokémon to only have one type. +- Ability 1: The Pokémon's first ability. Select a value within the given list. +- Ability 2: The Pokémon's second ability. Select a value within the given list. Make it match the first ability if +you want the Pokémon to only have one ability. +- Gender Ratio: The Pokémon's gender ratio. Select a value within the given list. +- Forbid Flip: Dictates whether the Pokémon's sprite can be flipped or not when looking at the Pokémon's status +screen in your team. The sprite can't be flipped if the option is ticked, otherwise it can be flipped. +- Move Pool: The Pokémon's level up learnset. Each line must contain a move. Each move must be written in the +format `: `, with `` a known Pokémon move from this generation, and `` a number between 1 +and 100. + +**Warning:** Some of these values may overwrite randomization options selected in Archipelago: if the +Pokémon's base stats or level up move pool have been randomized, the adjuster will replace the randomized values +with its values. + +Hovering over a field's name will tell you more details about what kind of value it needs. Additionally, if the value's +text is red, blue or in bold, it will tell you exactly why. + +Saving any changes for the Pokémon's data will create a file named `data.txt` in the Pokémon's folder. The contents of +the file should not be modified manually. + +## Applying the Sprite Pack + +Once both a ROM (or AP patch) and a sprite pack have been passed to the adjuster, you can press the `Adjust ROM` +button and a new ROM will be made from the patch application, whih is usable as-is. + +In order to use this ROM instead of the standard AP-patched ROM with Archipelago, once BizHawk or any other +emulator is running, you should open the ROM made from the adjuster instead of the original one. Normally, the ROM +made by the adjuster should have the same name as the ROM or AP patch you passed to it, with `-adjusted` added at +the end of its name. diff --git a/worlds/pokemon_emerald/docs/icon_palette_0.pal b/worlds/pokemon_emerald/docs/icon_palette_0.pal new file mode 100644 index 0000000000..48a835b0db --- /dev/null +++ b/worlds/pokemon_emerald/docs/icon_palette_0.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +98 156 131 +131 131 115 +189 189 189 +255 255 255 +189 164 65 +246 246 41 +213 98 65 +246 148 41 +139 123 255 +98 74 205 +238 115 156 +255 180 164 +164 197 255 +106 172 156 +98 98 90 +65 65 65 diff --git a/worlds/pokemon_emerald/docs/icon_palette_1.pal b/worlds/pokemon_emerald/docs/icon_palette_1.pal new file mode 100644 index 0000000000..261ea164d9 --- /dev/null +++ b/worlds/pokemon_emerald/docs/icon_palette_1.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +98 156 131 +115 115 115 +189 189 189 +255 255 255 +123 156 74 +156 205 74 +148 246 74 +238 115 156 +246 148 246 +189 164 90 +246 230 41 +246 246 172 +213 213 106 +230 74 41 +98 98 90 +65 65 65 diff --git a/worlds/pokemon_emerald/docs/icon_palette_2.pal b/worlds/pokemon_emerald/docs/icon_palette_2.pal new file mode 100644 index 0000000000..30463baeb1 --- /dev/null +++ b/worlds/pokemon_emerald/docs/icon_palette_2.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +98 156 131 +123 123 123 +189 189 180 +255 255 255 +115 115 205 +164 172 246 +180 131 90 +238 197 139 +197 172 41 +246 246 41 +246 98 82 +148 123 205 +197 164 205 +189 41 156 +98 98 90 +65 65 65 diff --git a/worlds/pokemon_emerald/pokemon.py b/worlds/pokemon_emerald/pokemon.py index 6f2676500d..b39f8c2abf 100644 --- a/worlds/pokemon_emerald/pokemon.py +++ b/worlds/pokemon_emerald/pokemon.py @@ -397,6 +397,10 @@ def randomize_abilities(world: "PokemonEmeraldWorld") -> None: ability_blacklist = {ability_label_to_value[label] for label in ability_blacklist_labels} ability_whitelist = [a.ability_id for a in data.abilities if a.ability_id not in ability_blacklist] + # If every ability is blacklisted, set all abilities to Cacophony, effectively disabling abilities + if len(ability_whitelist) == 0: + ability_whitelist = [data.constants["ABILITY_CACOPHONY"]] + if world.options.abilities == RandomizeAbilities.option_follow_evolutions: already_modified: Set[int] = set() diff --git a/worlds/pokemon_emerald/test/test_warps.py b/worlds/pokemon_emerald/test/test_warps.py index d1b5b01dcf..f210ff6b24 100644 --- a/worlds/pokemon_emerald/test/test_warps.py +++ b/worlds/pokemon_emerald/test/test_warps.py @@ -1,8 +1,8 @@ -from test.bases import TestBase +from unittest import TestCase from ..data import Warp -class TestWarps(TestBase): +class TestWarps(TestCase): def test_warps_connect_ltr(self) -> None: # 2-way self.assertTrue(Warp("FAKE_MAP_A:0/FAKE_MAP_B:0").connects_to(Warp("FAKE_MAP_B:0/FAKE_MAP_A:0"))) diff --git a/worlds/pokemon_rb/__init__.py b/worlds/pokemon_rb/__init__.py index a455e38f29..3f5a24cc17 100644 --- a/worlds/pokemon_rb/__init__.py +++ b/worlds/pokemon_rb/__init__.py @@ -713,7 +713,8 @@ class PokemonRedBlueWorld(World): "require_pokedex": self.options.require_pokedex.value, "area_1_to_1_mapping": self.options.area_1_to_1_mapping.value, "blind_trainers": self.options.blind_trainers.value, - "v5_update": True, + "game_version": self.options.game_version.value, + "exp_all": self.options.exp_all.value, } if self.options.type_chart_seed == "random" or self.options.type_chart_seed.value.isdigit(): diff --git a/worlds/pokemon_rb/client.py b/worlds/pokemon_rb/client.py index 97ca126476..2eb56f5398 100644 --- a/worlds/pokemon_rb/client.py +++ b/worlds/pokemon_rb/client.py @@ -23,6 +23,7 @@ DATA_LOCATIONS = { "DexSanityFlag": (0x1A71, 19), "GameStatus": (0x1A84, 0x01), "Money": (0x141F, 3), + "CurrentMap": (0x1436, 1), "ResetCheck": (0x0100, 4), # First and second Vermilion Gym trash can selection. Second is not used, so should always be 0. # First should never be above 0x0F. This is just before Event Flags. @@ -65,6 +66,7 @@ class PokemonRBClient(BizHawkClient): self.banking_command = None self.game_state = False self.last_death_link = 0 + self.current_map = 0 async def validate_rom(self, ctx): game_name = await read(ctx.bizhawk_ctx, [(0x134, 12, "ROM")]) @@ -230,6 +232,10 @@ class PokemonRBClient(BizHawkClient): }]) self.banking_command = None + if data["CurrentMap"][0] != self.current_map: + await ctx.send_msgs([{"cmd": "Bounce", "slots": [ctx.slot], "data": {"currentMap": data["CurrentMap"][0]}}]) + self.current_map = data["CurrentMap"][0] + # VICTORY if data["EventFlag"][280] & 1 and not ctx.finished_game: diff --git a/worlds/pokemon_rb/docs/setup_en.md b/worlds/pokemon_rb/docs/setup_en.md index 773fb14da9..7e05c8c782 100644 --- a/worlds/pokemon_rb/docs/setup_en.md +++ b/worlds/pokemon_rb/docs/setup_en.md @@ -15,7 +15,7 @@ As we are using BizHawk, this guide is only applicable to Windows and Linux syst ## Optional Software -- [Pokémon Red and Blue Archipelago Map Tracker](https://github.com/coveleski/rb_tracker/releases/latest), for use with [PopTracker](https://github.com/black-sliver/PopTracker/releases) +- [Pokémon Red and Blue Archipelago Map Tracker](https://github.com/palex00/rb_tracker/releases/latest), for use with [PopTracker](https://github.com/black-sliver/PopTracker/releases) ## Configuring BizHawk @@ -109,7 +109,7 @@ server uses password, type in the bottom textfield `/connect
: [p Pokémon Red and Blue has a fully functional map tracker that supports auto-tracking. -1. Download [Pokémon Red and Blue Archipelago Map Tracker](https://github.com/coveleski/rb_tracker/releases/latest) and [PopTracker](https://github.com/black-sliver/PopTracker/releases). +1. Download [Pokémon Red and Blue Archipelago Map Tracker](https://github.com/palex00/rb_tracker/releases/latest) and [PopTracker](https://github.com/black-sliver/PopTracker/releases). 2. Open PopTracker, and load the Pokémon Red and Blue pack. 3. Click on the "AP" symbol at the top. 4. Enter the AP address, slot name and password. diff --git a/worlds/pokemon_rb/docs/setup_es.md b/worlds/pokemon_rb/docs/setup_es.md index 67024c5b52..5c735bfe99 100644 --- a/worlds/pokemon_rb/docs/setup_es.md +++ b/worlds/pokemon_rb/docs/setup_es.md @@ -16,7 +16,7 @@ Al usar BizHawk, esta guía solo es aplicable en los sistemas de Windows y Linux ## Software Opcional -- [Tracker de mapa para Pokémon Red and Blue Archipelago](https://github.com/coveleski/rb_tracker/releases/latest), para usar con [PopTracker](https://github.com/black-sliver/PopTracker/releases) +- [Tracker de mapa para Pokémon Red and Blue Archipelago](https://github.com/palex00/rb_tracker/releases/latest), para usar con [PopTracker](https://github.com/black-sliver/PopTracker/releases) ## Configurando BizHawk @@ -114,7 +114,7 @@ presiona enter (si el servidor usa contraseña, escribe en el campo de texto inf Pokémon Red and Blue tiene un mapa completamente funcional que soporta seguimiento automático. -1. Descarga el [Tracker de mapa para Pokémon Red and Blue Archipelago](https://github.com/coveleski/rb_tracker/releases/latest) y [PopTracker](https://github.com/black-sliver/PopTracker/releases). +1. Descarga el [Tracker de mapa para Pokémon Red and Blue Archipelago](https://github.com/palex00/rb_tracker/releases/latest) y [PopTracker](https://github.com/black-sliver/PopTracker/releases). 2. Abre PopTracker, y carga el pack de Pokémon Red and Blue. 3. Haz clic en el símbolo "AP" en la parte superior. 4. Ingresa la dirección de AP, nombre del slot y contraseña (si es que hay). diff --git a/worlds/raft/__init__.py b/worlds/raft/__init__.py index 3e33b417c0..374d952d46 100644 --- a/worlds/raft/__init__.py +++ b/worlds/raft/__init__.py @@ -40,6 +40,8 @@ class RaftWorld(World): options_dataclass = RaftOptions options: RaftOptions + extraItemNamePool: list[str] | None = None + required_client_version = (0, 3, 4) def create_items(self): @@ -52,52 +54,52 @@ class RaftWorld(World): pool = [] frequencyItems = [] for item in item_table: - raft_item = self.create_item_replaceAsNecessary(item["name"]) + raft_item = self.create_item(self.replace_item_name_as_necessary(item["name"])) if isFillingFrequencies and "Frequency" in item["name"]: frequencyItems.append(raft_item) else: pool.append(raft_item) - extraItemNamePool = [] + self.extraItemNamePool = [] extras = len(location_table) - len(item_table) - 1 # Victory takes up 1 unaccounted-for slot - if extras > 0: - if (self.options.filler_item_types != self.options.filler_item_types.option_duplicates): # Use resource packs - for packItem in resourcePackItems: - for i in range(minimumResourcePackAmount, maximumResourcePackAmount + 1): - extraItemNamePool.append(createResourcePackName(i, packItem)) - if self.options.filler_item_types != self.options.filler_item_types.option_resource_packs: # Use duplicate items - dupeItemPool = item_table.copy() - # Remove frequencies if necessary - if self.options.island_frequency_locations != self.options.island_frequency_locations.option_anywhere: # Not completely random locations - # If we let frequencies stay in with progressive-frequencies, the progressive-frequency item - # will be included 7 times. This is a massive flood of progressive-frequency items, so we - # instead add progressive-frequency as its own item a smaller amount of times to prevent - # flooding the duplicate item pool with them. - if self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive: - for _ in range(2): - # Progressives are not in item_pool, need to create faux item for duplicate item pool - # This can still be filtered out later by duplicate_items setting - dupeItemPool.append({ "name": "progressive-frequency", "progression": True }) # Progressive frequencies need to be included - # Always remove non-progressive Frequency items - dupeItemPool = (itm for itm in dupeItemPool if "Frequency" not in itm["name"]) - - # Remove progression or non-progression items if necessary - if (self.options.duplicate_items == self.options.duplicate_items.option_progression): # Progression only - dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == True) - elif (self.options.duplicate_items == self.options.duplicate_items.option_non_progression): # Non-progression only - dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == False) - - dupeItemPool = list(dupeItemPool) - # Finally, add items as necessary - if len(dupeItemPool) > 0: - for item in dupeItemPool: - extraItemNamePool.append(item["name"]) + if (self.options.filler_item_types != self.options.filler_item_types.option_duplicates): # Use resource packs + for packItem in resourcePackItems: + for i in range(minimumResourcePackAmount, maximumResourcePackAmount + 1): + self.extraItemNamePool.append(createResourcePackName(i, packItem)) + + if self.options.filler_item_types != self.options.filler_item_types.option_resource_packs: # Use duplicate items + dupeItemPool = item_table.copy() + # Remove frequencies if necessary + if self.options.island_frequency_locations != self.options.island_frequency_locations.option_anywhere: # Not completely random locations + # If we let frequencies stay in with progressive-frequencies, the progressive-frequency item + # will be included 7 times. This is a massive flood of progressive-frequency items, so we + # instead add progressive-frequency as its own item a smaller amount of times to prevent + # flooding the duplicate item pool with them. + if self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive: + for _ in range(2): + # Progressives are not in item_pool, need to create faux item for duplicate item pool + # This can still be filtered out later by duplicate_items setting + dupeItemPool.append({ "name": "progressive-frequency", "progression": True }) # Progressive frequencies need to be included + # Always remove non-progressive Frequency items + dupeItemPool = (itm for itm in dupeItemPool if "Frequency" not in itm["name"]) + + # Remove progression or non-progression items if necessary + if (self.options.duplicate_items == self.options.duplicate_items.option_progression): # Progression only + dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == True) + elif (self.options.duplicate_items == self.options.duplicate_items.option_non_progression): # Non-progression only + dupeItemPool = (itm for itm in dupeItemPool if itm["progression"] == False) + + dupeItemPool = list(dupeItemPool) + # Finally, add items as necessary + for item in dupeItemPool: + self.extraItemNamePool.append(self.replace_item_name_as_necessary(item["name"])) - if (len(extraItemNamePool) > 0): - for randomItem in self.random.choices(extraItemNamePool, k=extras): - raft_item = self.create_item_replaceAsNecessary(randomItem) - pool.append(raft_item) + assert self.extraItemNamePool, f"Don't know what extra items to create for {self.player_name}." + + for randomItem in self.random.choices(self.extraItemNamePool, k=extras): + raft_item = self.create_item(randomItem) + pool.append(raft_item) self.multiworld.itempool += pool @@ -108,19 +110,35 @@ class RaftWorld(World): if frequencyItems: self.place_frequencyItems(frequencyItems) + def get_filler_item_name(self) -> str: + # A normal Raft world will have an extraItemNamePool defined after create_items. + if self.extraItemNamePool: + return self.random.choice(self.extraItemNamePool) + + # If this is a "fake" world, e.g. item links with link replacement: Resource packs are always be safe to create + minRPSpecified = self.options.minimum_resource_pack_amount.value + maxRPSpecified = self.options.maximum_resource_pack_amount.value + minimumResourcePackAmount = min(minRPSpecified, maxRPSpecified) + maximumResourcePackAmount = max(minRPSpecified, maxRPSpecified) + resource_amount = self.random.randint(minimumResourcePackAmount, maximumResourcePackAmount) + resource_type = self.random.choice(resourcePackItems) + return createResourcePackName(resource_amount, resource_type) + def set_rules(self): set_rules(self.multiworld, self.player) def create_regions(self): create_regions(self.multiworld, self.player) - - def create_item_replaceAsNecessary(self, name: str) -> Item: - isFrequency = "Frequency" in name - shouldUseProgressive = bool((isFrequency and self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive) - or (not isFrequency and self.options.progressive_items)) - if shouldUseProgressive and name in progressive_table: - name = progressive_table[name] - return self.create_item(name) + + def replace_item_name_as_necessary(self, name: str) -> str: + if name not in progressive_table: + return name + if "Frequency" in name: + if self.options.island_frequency_locations == self.options.island_frequency_locations.option_progressive: + return progressive_table[name] + elif self.options.progressive_items: + return progressive_table[name] + return name def create_item(self, name: str) -> Item: item = lookup_name_to_item[name] diff --git a/worlds/raft/docs/setup_en.md b/worlds/raft/docs/setup_en.md index 16e7883776..25e2c16bc5 100644 --- a/worlds/raft/docs/setup_en.md +++ b/worlds/raft/docs/setup_en.md @@ -45,7 +45,8 @@ ## Multiplayer Raft You're able to have multiple Raft players on a single Raftipelago world. This will work, with a few notes: -- Only the player that creates/loads the world can connect to Archipelago (this is the "host" of the Raft world). Other players do not need to connect; everything will be routed through the the host. +- Every player that joins the Raft world must have the Raftipelago mod loaded. +- Only the player that creates/loads the world can connect to Archipelago (this is the "host" of the Raft world). Other players do not need to run */connect*; everything will be routed through the the host. - Players other than the host will be labeled as a "Raft Player (Steam name)" when using ingame chat, which will be routed through Archipelago chat. - Ingame chat will only work when the host is connected to the Archipelago server. diff --git a/worlds/raft/locations.json b/worlds/raft/locations.json index 5f73c2f8b2..8d04e3046a 100644 --- a/worlds/raft/locations.json +++ b/worlds/raft/locations.json @@ -810,7 +810,10 @@ { "id": 48105, "name": "Engine controls blueprint", - "region": "CaravanIsland" + "region": "CaravanIsland", + "requiresAccessToItems": [ + "Zipline tool" + ] }, { "id": 48106, diff --git a/worlds/raft/progressives.json b/worlds/raft/progressives.json index 11bd614ab0..6f3900738e 100644 --- a/worlds/raft/progressives.json +++ b/worlds/raft/progressives.json @@ -30,7 +30,7 @@ "Steering Wheel": "progressive-engine", "Engine controls": "progressive-engine", "Scarecrow": "progressive-scarecrow", - "Advanced scarecrow": "progressive-scarecrow", + "Advanced Scarecrow": "progressive-scarecrow", "Simple collection net": "progressive-net", "Advanced collection net": "progressive-net", "Storage": "progressive-storage", diff --git a/worlds/rogue_legacy/Items.py b/worlds/rogue_legacy/Items.py deleted file mode 100644 index efa24df05a..0000000000 --- a/worlds/rogue_legacy/Items.py +++ /dev/null @@ -1,111 +0,0 @@ -from typing import Dict, NamedTuple, Optional - -from BaseClasses import Item, ItemClassification - - -class RLItem(Item): - game: str = "Rogue Legacy" - - -class RLItemData(NamedTuple): - category: str - code: Optional[int] = None - classification: ItemClassification = ItemClassification.filler - max_quantity: int = 1 - weight: int = 1 - - -def get_items_by_category(category: str) -> Dict[str, RLItemData]: - item_dict: Dict[str, RLItemData] = {} - for name, data in item_table.items(): - if data.category == category: - item_dict.setdefault(name, data) - - return item_dict - - -item_table: Dict[str, RLItemData] = { - # Vendors - "Blacksmith": RLItemData("Vendors", 90_000, ItemClassification.progression), - "Enchantress": RLItemData("Vendors", 90_001, ItemClassification.progression), - "Architect": RLItemData("Vendors", 90_002, ItemClassification.useful), - - # Classes - "Progressive Knights": RLItemData("Classes", 90_003, ItemClassification.useful, 2), - "Progressive Mages": RLItemData("Classes", 90_004, ItemClassification.useful, 2), - "Progressive Barbarians": RLItemData("Classes", 90_005, ItemClassification.useful, 2), - "Progressive Knaves": RLItemData("Classes", 90_006, ItemClassification.useful, 2), - "Progressive Shinobis": RLItemData("Classes", 90_007, ItemClassification.useful, 2), - "Progressive Miners": RLItemData("Classes", 90_008, ItemClassification.useful, 2), - "Progressive Liches": RLItemData("Classes", 90_009, ItemClassification.useful, 2), - "Progressive Spellthieves": RLItemData("Classes", 90_010, ItemClassification.useful, 2), - "Dragons": RLItemData("Classes", 90_096, ItemClassification.progression), - "Traitors": RLItemData("Classes", 90_097, ItemClassification.useful), - - # Skills - "Health Up": RLItemData("Skills", 90_013, ItemClassification.progression_skip_balancing, 15), - "Mana Up": RLItemData("Skills", 90_014, ItemClassification.progression_skip_balancing, 15), - "Attack Up": RLItemData("Skills", 90_015, ItemClassification.progression_skip_balancing, 15), - "Magic Damage Up": RLItemData("Skills", 90_016, ItemClassification.progression_skip_balancing, 15), - "Armor Up": RLItemData("Skills", 90_017, ItemClassification.useful, 15), - "Equip Up": RLItemData("Skills", 90_018, ItemClassification.useful, 5), - "Crit Chance Up": RLItemData("Skills", 90_019, ItemClassification.useful, 5), - "Crit Damage Up": RLItemData("Skills", 90_020, ItemClassification.useful, 5), - "Down Strike Up": RLItemData("Skills", 90_021), - "Gold Gain Up": RLItemData("Skills", 90_022), - "Potion Efficiency Up": RLItemData("Skills", 90_023), - "Invulnerability Time Up": RLItemData("Skills", 90_024), - "Mana Cost Down": RLItemData("Skills", 90_025), - "Death Defiance": RLItemData("Skills", 90_026, ItemClassification.useful), - "Haggling": RLItemData("Skills", 90_027, ItemClassification.useful), - "Randomize Children": RLItemData("Skills", 90_028, ItemClassification.useful), - - # Blueprints - "Progressive Blueprints": RLItemData("Blueprints", 90_055, ItemClassification.useful, 15), - "Squire Blueprints": RLItemData("Blueprints", 90_040, ItemClassification.useful), - "Silver Blueprints": RLItemData("Blueprints", 90_041, ItemClassification.useful), - "Guardian Blueprints": RLItemData("Blueprints", 90_042, ItemClassification.useful), - "Imperial Blueprints": RLItemData("Blueprints", 90_043, ItemClassification.useful), - "Royal Blueprints": RLItemData("Blueprints", 90_044, ItemClassification.useful), - "Knight Blueprints": RLItemData("Blueprints", 90_045, ItemClassification.useful), - "Ranger Blueprints": RLItemData("Blueprints", 90_046, ItemClassification.useful), - "Sky Blueprints": RLItemData("Blueprints", 90_047, ItemClassification.useful), - "Dragon Blueprints": RLItemData("Blueprints", 90_048, ItemClassification.useful), - "Slayer Blueprints": RLItemData("Blueprints", 90_049, ItemClassification.useful), - "Blood Blueprints": RLItemData("Blueprints", 90_050, ItemClassification.useful), - "Sage Blueprints": RLItemData("Blueprints", 90_051, ItemClassification.useful), - "Retribution Blueprints": RLItemData("Blueprints", 90_052, ItemClassification.useful), - "Holy Blueprints": RLItemData("Blueprints", 90_053, ItemClassification.useful), - "Dark Blueprints": RLItemData("Blueprints", 90_054, ItemClassification.useful), - - # Runes - "Vault Runes": RLItemData("Runes", 90_060, ItemClassification.progression), - "Sprint Runes": RLItemData("Runes", 90_061, ItemClassification.progression), - "Vampire Runes": RLItemData("Runes", 90_062, ItemClassification.useful), - "Sky Runes": RLItemData("Runes", 90_063, ItemClassification.progression), - "Siphon Runes": RLItemData("Runes", 90_064, ItemClassification.useful), - "Retaliation Runes": RLItemData("Runes", 90_065), - "Bounty Runes": RLItemData("Runes", 90_066), - "Haste Runes": RLItemData("Runes", 90_067), - "Curse Runes": RLItemData("Runes", 90_068), - "Grace Runes": RLItemData("Runes", 90_069), - "Balance Runes": RLItemData("Runes", 90_070, ItemClassification.useful), - - # Junk - "Triple Stat Increase": RLItemData("Filler", 90_030, weight=6), - "1000 Gold": RLItemData("Filler", 90_031, weight=3), - "3000 Gold": RLItemData("Filler", 90_032, weight=2), - "5000 Gold": RLItemData("Filler", 90_033, weight=1), -} - -event_item_table: Dict[str, RLItemData] = { - "Defeat Khidr": RLItemData("Event", classification=ItemClassification.progression), - "Defeat Alexander": RLItemData("Event", classification=ItemClassification.progression), - "Defeat Ponce de Leon": RLItemData("Event", classification=ItemClassification.progression), - "Defeat Herodotus": RLItemData("Event", classification=ItemClassification.progression), - "Defeat Neo Khidr": RLItemData("Event", classification=ItemClassification.progression), - "Defeat Alexander IV": RLItemData("Event", classification=ItemClassification.progression), - "Defeat Ponce de Freon": RLItemData("Event", classification=ItemClassification.progression), - "Defeat Astrodotus": RLItemData("Event", classification=ItemClassification.progression), - "Defeat The Fountain": RLItemData("Event", classification=ItemClassification.progression), -} diff --git a/worlds/rogue_legacy/Locations.py b/worlds/rogue_legacy/Locations.py deleted file mode 100644 index db9e1db3b0..0000000000 --- a/worlds/rogue_legacy/Locations.py +++ /dev/null @@ -1,94 +0,0 @@ -from typing import Dict, NamedTuple, Optional - -from BaseClasses import Location - - -class RLLocation(Location): - game: str = "Rogue Legacy" - - -class RLLocationData(NamedTuple): - category: str - code: Optional[int] = None - - -def get_locations_by_category(category: str) -> Dict[str, RLLocationData]: - location_dict: Dict[str, RLLocationData] = {} - for name, data in location_table.items(): - if data.category == category: - location_dict.setdefault(name, data) - - return location_dict - - -location_table: Dict[str, RLLocationData] = { - # Manor Renovation - "Manor - Ground Road": RLLocationData("Manor", 91_000), - "Manor - Main Base": RLLocationData("Manor", 91_001), - "Manor - Main Bottom Window": RLLocationData("Manor", 91_002), - "Manor - Main Top Window": RLLocationData("Manor", 91_003), - "Manor - Main Rooftop": RLLocationData("Manor", 91_004), - "Manor - Left Wing Base": RLLocationData("Manor", 91_005), - "Manor - Left Wing Window": RLLocationData("Manor", 91_006), - "Manor - Left Wing Rooftop": RLLocationData("Manor", 91_007), - "Manor - Left Big Base": RLLocationData("Manor", 91_008), - "Manor - Left Big Upper 1": RLLocationData("Manor", 91_009), - "Manor - Left Big Upper 2": RLLocationData("Manor", 91_010), - "Manor - Left Big Windows": RLLocationData("Manor", 91_011), - "Manor - Left Big Rooftop": RLLocationData("Manor", 91_012), - "Manor - Left Far Base": RLLocationData("Manor", 91_013), - "Manor - Left Far Roof": RLLocationData("Manor", 91_014), - "Manor - Left Extension": RLLocationData("Manor", 91_015), - "Manor - Left Tree 1": RLLocationData("Manor", 91_016), - "Manor - Left Tree 2": RLLocationData("Manor", 91_017), - "Manor - Right Wing Base": RLLocationData("Manor", 91_018), - "Manor - Right Wing Window": RLLocationData("Manor", 91_019), - "Manor - Right Wing Rooftop": RLLocationData("Manor", 91_020), - "Manor - Right Big Base": RLLocationData("Manor", 91_021), - "Manor - Right Big Upper": RLLocationData("Manor", 91_022), - "Manor - Right Big Rooftop": RLLocationData("Manor", 91_023), - "Manor - Right High Base": RLLocationData("Manor", 91_024), - "Manor - Right High Upper": RLLocationData("Manor", 91_025), - "Manor - Right High Tower": RLLocationData("Manor", 91_026), - "Manor - Right Extension": RLLocationData("Manor", 91_027), - "Manor - Right Tree": RLLocationData("Manor", 91_028), - "Manor - Observatory Base": RLLocationData("Manor", 91_029), - "Manor - Observatory Telescope": RLLocationData("Manor", 91_030), - - # Boss Rewards - "Castle Hamson Boss Reward": RLLocationData("Boss", 91_100), - "Forest Abkhazia Boss Reward": RLLocationData("Boss", 91_102), - "The Maya Boss Reward": RLLocationData("Boss", 91_104), - "Land of Darkness Boss Reward": RLLocationData("Boss", 91_106), - - # Special Locations - "Jukebox": RLLocationData("Special", 91_200), - "Painting": RLLocationData("Special", 91_201), - "Cheapskate Elf's Game": RLLocationData("Special", 91_202), - "Carnival": RLLocationData("Special", 91_203), - - # Diaries - **{f"Diary {i+1}": RLLocationData("Diary", 91_300 + i) for i in range(0, 25)}, - - # Chests - **{f"Castle Hamson - Chest {i+1}": RLLocationData("Chests", 91_600 + i) for i in range(0, 50)}, - **{f"Forest Abkhazia - Chest {i+1}": RLLocationData("Chests", 91_700 + i) for i in range(0, 50)}, - **{f"The Maya - Chest {i+1}": RLLocationData("Chests", 91_800 + i) for i in range(0, 50)}, - **{f"Land of Darkness - Chest {i+1}": RLLocationData("Chests", 91_900 + i) for i in range(0, 50)}, - **{f"Chest {i+1}": RLLocationData("Chests", 92_000 + i) for i in range(0, 200)}, - - # Fairy Chests - **{f"Castle Hamson - Fairy Chest {i+1}": RLLocationData("Fairies", 91_400 + i) for i in range(0, 15)}, - **{f"Forest Abkhazia - Fairy Chest {i+1}": RLLocationData("Fairies", 91_450 + i) for i in range(0, 15)}, - **{f"The Maya - Fairy Chest {i+1}": RLLocationData("Fairies", 91_500 + i) for i in range(0, 15)}, - **{f"Land of Darkness - Fairy Chest {i+1}": RLLocationData("Fairies", 91_550 + i) for i in range(0, 15)}, - **{f"Fairy Chest {i+1}": RLLocationData("Fairies", 92_200 + i) for i in range(0, 60)}, -} - -event_location_table: Dict[str, RLLocationData] = { - "Castle Hamson Boss Room": RLLocationData("Event"), - "Forest Abkhazia Boss Room": RLLocationData("Event"), - "The Maya Boss Room": RLLocationData("Event"), - "Land of Darkness Boss Room": RLLocationData("Event"), - "Fountain Room": RLLocationData("Event"), -} diff --git a/worlds/rogue_legacy/Options.py b/worlds/rogue_legacy/Options.py deleted file mode 100644 index 139ff60944..0000000000 --- a/worlds/rogue_legacy/Options.py +++ /dev/null @@ -1,387 +0,0 @@ -from Options import Choice, Range, Toggle, DeathLink, DefaultOnToggle, OptionSet, PerGameCommonOptions - -from dataclasses import dataclass - - -class StartingGender(Choice): - """ - Determines the gender of your initial 'Sir Lee' character. - """ - display_name = "Starting Gender" - option_sir = 0 - option_lady = 1 - alias_male = 0 - alias_female = 1 - default = "random" - - -class StartingClass(Choice): - """ - Determines the starting class of your initial 'Sir Lee' character. - """ - display_name = "Starting Class" - option_knight = 0 - option_mage = 1 - option_barbarian = 2 - option_knave = 3 - option_shinobi = 4 - option_miner = 5 - option_spellthief = 6 - option_lich = 7 - default = 0 - - -class NewGamePlus(Choice): - """ - Puts the castle in new game plus mode which vastly increases enemy level, but increases gold gain by 50%. Not - recommended for those inexperienced to Rogue Legacy! - """ - display_name = "New Game Plus" - option_normal = 0 - option_new_game_plus = 1 - option_new_game_plus_2 = 2 - alias_hard = 1 - alias_brutal = 2 - default = 0 - - -class LevelScaling(Range): - """ - A percentage modifier for scaling enemy level as you continue throughout the castle. 100 means enemies will have - 100% level scaling (normal). Setting this too high will result in enemies with absurdly high levels, you have been - warned. - """ - display_name = "Enemy Level Scaling Percentage" - range_start = 1 - range_end = 300 - default = 100 - - -class FairyChestsPerZone(Range): - """ - Determines the number of Fairy Chests in a given zone that contain items. After these have been checked, only stat - bonuses can be found in Fairy Chests. - """ - display_name = "Fairy Chests Per Zone" - range_start = 0 - range_end = 15 - default = 1 - - -class ChestsPerZone(Range): - """ - Determines the number of Non-Fairy Chests in a given zone that contain items. After these have been checked, only - gold or stat bonuses can be found in Chests. - """ - display_name = "Chests Per Zone" - range_start = 20 - range_end = 50 - default = 20 - - -class UniversalFairyChests(Toggle): - """ - Determines if fairy chests should be combined into one pool instead of per zone, similar to Risk of Rain 2. - """ - display_name = "Universal Fairy Chests" - - -class UniversalChests(Toggle): - """ - Determines if non-fairy chests should be combined into one pool instead of per zone, similar to Risk of Rain 2. - """ - display_name = "Universal Non-Fairy Chests" - - -class Vendors(Choice): - """ - Determines where to place the Blacksmith and Enchantress unlocks in logic (or start with them unlocked). - """ - display_name = "Vendors" - option_start_unlocked = 0 - option_early = 1 - option_normal = 2 - option_anywhere = 3 - default = 1 - - -class Architect(Choice): - """ - Determines where the Architect sits in the item pool. - """ - display_name = "Architect" - option_start_unlocked = 0 - option_early = 1 - option_anywhere = 2 - option_disabled = 3 - alias_normal = 2 - default = 2 - - -class ArchitectFee(Range): - """ - Determines how large of a percentage the architect takes from the player when utilizing his services. 100 means he - takes all your gold. 0 means his services are free. - """ - display_name = "Architect Fee Percentage" - range_start = 0 - range_end = 100 - default = 40 - - -class DisableCharon(Toggle): - """ - Prevents Charon from taking your money when you re-enter the castle. Also removes Haggling from the Item Pool. - """ - display_name = "Disable Charon" - - -class RequirePurchasing(DefaultOnToggle): - """ - Determines where you will be required to purchase equipment and runes from the Blacksmith and Enchantress before - equipping them. If you disable require purchasing, Manor Renovations are scaled to take this into account. - """ - display_name = "Require Purchasing" - - -class ProgressiveBlueprints(Toggle): - """ - Instead of shuffling blueprints randomly into the pool, blueprint unlocks are progressively unlocked. You would get - Squire first, then Knight, etc., until finally Dark. - """ - display_name = "Progressive Blueprints" - - -class GoldGainMultiplier(Choice): - """ - Adjusts the multiplier for gaining gold from all sources. - """ - display_name = "Gold Gain Multiplier" - option_normal = 0 - option_quarter = 1 - option_half = 2 - option_double = 3 - option_quadruple = 4 - default = 0 - - -class NumberOfChildren(Range): - """ - Determines the number of offspring you can choose from on the lineage screen after a death. - """ - display_name = "Number of Children" - range_start = 1 - range_end = 5 - default = 3 - - -class AdditionalLadyNames(OptionSet): - """ - Set of additional names your potential offspring can have. If Allow Default Names is disabled, this is the only list - of names your children can have. The first value will also be your initial character's name depending on Starting - Gender. - """ - display_name = "Additional Lady Names" - -class AdditionalSirNames(OptionSet): - """ - Set of additional names your potential offspring can have. If Allow Default Names is disabled, this is the only list - of names your children can have. The first value will also be your initial character's name depending on Starting - Gender. - """ - display_name = "Additional Sir Names" - - -class AllowDefaultNames(DefaultOnToggle): - """ - Determines if the default names defined in the vanilla game are allowed to be used. Warning: Your world will not - generate if the number of Additional Names defined is less than the Number of Children value. - """ - display_name = "Allow Default Names" - - -class CastleScaling(Range): - """ - Adjusts the scaling factor for how big a castle can be. Larger castles scale enemies quicker and also take longer - to generate. 100 means normal castle size. - """ - display_name = "Castle Size Scaling Percentage" - range_start = 50 - range_end = 300 - default = 100 - - -class ChallengeBossKhidr(Choice): - """ - Determines if Neo Khidr replaces Khidr in their boss room. - """ - display_name = "Khidr" - option_vanilla = 0 - option_challenge = 1 - default = 0 - - -class ChallengeBossAlexander(Choice): - """ - Determines if Alexander the IV replaces Alexander in their boss room. - """ - display_name = "Alexander" - option_vanilla = 0 - option_challenge = 1 - default = 0 - - -class ChallengeBossLeon(Choice): - """ - Determines if Ponce de Freon replaces Ponce de Leon in their boss room. - """ - display_name = "Ponce de Leon" - option_vanilla = 0 - option_challenge = 1 - default = 0 - - -class ChallengeBossHerodotus(Choice): - """ - Determines if Astrodotus replaces Herodotus in their boss room. - """ - display_name = "Herodotus" - option_vanilla = 0 - option_challenge = 1 - default = 0 - - -class HealthUpPool(Range): - """ - Determines the number of Health Ups in the item pool. - """ - display_name = "Health Up Pool" - range_start = 0 - range_end = 15 - default = 15 - - -class ManaUpPool(Range): - """ - Determines the number of Mana Ups in the item pool. - """ - display_name = "Mana Up Pool" - range_start = 0 - range_end = 15 - default = 15 - - -class AttackUpPool(Range): - """ - Determines the number of Attack Ups in the item pool. - """ - display_name = "Attack Up Pool" - range_start = 0 - range_end = 15 - default = 15 - - -class MagicDamageUpPool(Range): - """ - Determines the number of Magic Damage Ups in the item pool. - """ - display_name = "Magic Damage Up Pool" - range_start = 0 - range_end = 15 - default = 15 - - -class ArmorUpPool(Range): - """ - Determines the number of Armor Ups in the item pool. - """ - display_name = "Armor Up Pool" - range_start = 0 - range_end = 10 - default = 10 - - -class EquipUpPool(Range): - """ - Determines the number of Equip Ups in the item pool. - """ - display_name = "Equip Up Pool" - range_start = 0 - range_end = 10 - default = 10 - - -class CritChanceUpPool(Range): - """ - Determines the number of Crit Chance Ups in the item pool. - """ - display_name = "Crit Chance Up Pool" - range_start = 0 - range_end = 5 - default = 5 - - -class CritDamageUpPool(Range): - """ - Determines the number of Crit Damage Ups in the item pool. - """ - display_name = "Crit Damage Up Pool" - range_start = 0 - range_end = 5 - default = 5 - - -class FreeDiaryOnGeneration(DefaultOnToggle): - """ - Allows the player to get a free diary check every time they regenerate the castle in the starting room. - """ - display_name = "Free Diary On Generation" - - -class AvailableClasses(OptionSet): - """ - List of classes that will be in the item pool to find. The upgraded form of the class will be added with it. - The upgraded form of your starting class will be available regardless. - """ - display_name = "Available Classes" - default = frozenset( - {"Knight", "Mage", "Barbarian", "Knave", "Shinobi", "Miner", "Spellthief", "Lich", "Dragon", "Traitor"} - ) - valid_keys = {"Knight", "Mage", "Barbarian", "Knave", "Shinobi", "Miner", "Spellthief", "Lich", "Dragon", "Traitor"} - - -@dataclass -class RLOptions(PerGameCommonOptions): - starting_gender: StartingGender - starting_class: StartingClass - available_classes: AvailableClasses - new_game_plus: NewGamePlus - fairy_chests_per_zone: FairyChestsPerZone - chests_per_zone: ChestsPerZone - universal_fairy_chests: UniversalFairyChests - universal_chests: UniversalChests - vendors: Vendors - architect: Architect - architect_fee: ArchitectFee - disable_charon: DisableCharon - require_purchasing: RequirePurchasing - progressive_blueprints: ProgressiveBlueprints - gold_gain_multiplier: GoldGainMultiplier - number_of_children: NumberOfChildren - free_diary_on_generation: FreeDiaryOnGeneration - khidr: ChallengeBossKhidr - alexander: ChallengeBossAlexander - leon: ChallengeBossLeon - herodotus: ChallengeBossHerodotus - health_pool: HealthUpPool - mana_pool: ManaUpPool - attack_pool: AttackUpPool - magic_damage_pool: MagicDamageUpPool - armor_pool: ArmorUpPool - equip_pool: EquipUpPool - crit_chance_pool: CritChanceUpPool - crit_damage_pool: CritDamageUpPool - allow_default_names: AllowDefaultNames - additional_lady_names: AdditionalLadyNames - additional_sir_names: AdditionalSirNames - death_link: DeathLink diff --git a/worlds/rogue_legacy/Presets.py b/worlds/rogue_legacy/Presets.py deleted file mode 100644 index 2dfeee64d8..0000000000 --- a/worlds/rogue_legacy/Presets.py +++ /dev/null @@ -1,61 +0,0 @@ -from typing import Any, Dict - -from .Options import Architect, GoldGainMultiplier, Vendors - -rl_options_presets: Dict[str, Dict[str, Any]] = { - # Example preset using only literal values. - "Unknown Fate": { - "progression_balancing": "random", - "accessibility": "random", - "starting_gender": "random", - "starting_class": "random", - "new_game_plus": "random", - "fairy_chests_per_zone": "random", - "chests_per_zone": "random", - "universal_fairy_chests": "random", - "universal_chests": "random", - "vendors": "random", - "architect": "random", - "architect_fee": "random", - "disable_charon": "random", - "require_purchasing": "random", - "progressive_blueprints": "random", - "gold_gain_multiplier": "random", - "number_of_children": "random", - "free_diary_on_generation": "random", - "khidr": "random", - "alexander": "random", - "leon": "random", - "herodotus": "random", - "health_pool": "random", - "mana_pool": "random", - "attack_pool": "random", - "magic_damage_pool": "random", - "armor_pool": "random", - "equip_pool": "random", - "crit_chance_pool": "random", - "crit_damage_pool": "random", - "allow_default_names": True, - "death_link": "random", - }, - # A preset I actually use, using some literal values and some from the option itself. - "Limited Potential": { - "progression_balancing": "disabled", - "fairy_chests_per_zone": 2, - "starting_class": "random", - "chests_per_zone": 30, - "vendors": Vendors.option_normal, - "architect": Architect.option_disabled, - "gold_gain_multiplier": GoldGainMultiplier.option_half, - "number_of_children": 2, - "free_diary_on_generation": False, - "health_pool": 10, - "mana_pool": 10, - "attack_pool": 10, - "magic_damage_pool": 10, - "armor_pool": 5, - "equip_pool": 10, - "crit_chance_pool": 5, - "crit_damage_pool": 5, - } -} diff --git a/worlds/rogue_legacy/Regions.py b/worlds/rogue_legacy/Regions.py deleted file mode 100644 index 61b0ef73ec..0000000000 --- a/worlds/rogue_legacy/Regions.py +++ /dev/null @@ -1,114 +0,0 @@ -from typing import Dict, List, NamedTuple, Optional, TYPE_CHECKING - -from BaseClasses import MultiWorld, Region, Entrance -from .Locations import RLLocation, location_table, get_locations_by_category - -if TYPE_CHECKING: - from . import RLWorld - - -class RLRegionData(NamedTuple): - locations: Optional[List[str]] - region_exits: Optional[List[str]] - - -def create_regions(world: "RLWorld"): - regions: Dict[str, RLRegionData] = { - "Menu": RLRegionData(None, ["Castle Hamson"]), - "The Manor": RLRegionData([], []), - "Castle Hamson": RLRegionData([], ["Forest Abkhazia", "The Maya", "Land of Darkness", - "The Fountain Room", "The Manor"]), - "Forest Abkhazia": RLRegionData([], []), - "The Maya": RLRegionData([], []), - "Land of Darkness": RLRegionData([], []), - "The Fountain Room": RLRegionData([], None), - } - - # Artificially stagger diary spheres for progression. - for diary in range(0, 25): - region: str - if 0 <= diary < 6: - region = "Castle Hamson" - elif 6 <= diary < 12: - region = "Forest Abkhazia" - elif 12 <= diary < 18: - region = "The Maya" - elif 18 <= diary < 24: - region = "Land of Darkness" - else: - region = "The Fountain Room" - regions[region].locations.append(f"Diary {diary + 1}") - - # Manor & Special - for manor in get_locations_by_category("Manor").keys(): - regions["The Manor"].locations.append(manor) - for special in get_locations_by_category("Special").keys(): - regions["Castle Hamson"].locations.append(special) - - # Boss Rewards - regions["Castle Hamson"].locations.append("Castle Hamson Boss Reward") - regions["Forest Abkhazia"].locations.append("Forest Abkhazia Boss Reward") - regions["The Maya"].locations.append("The Maya Boss Reward") - regions["Land of Darkness"].locations.append("Land of Darkness Boss Reward") - - # Events - regions["Castle Hamson"].locations.append("Castle Hamson Boss Room") - regions["Forest Abkhazia"].locations.append("Forest Abkhazia Boss Room") - regions["The Maya"].locations.append("The Maya Boss Room") - regions["Land of Darkness"].locations.append("Land of Darkness Boss Room") - regions["The Fountain Room"].locations.append("Fountain Room") - - # Chests - chests = int(world.options.chests_per_zone) - for i in range(0, chests): - if world.options.universal_chests: - regions["Castle Hamson"].locations.append(f"Chest {i + 1}") - regions["Forest Abkhazia"].locations.append(f"Chest {i + 1 + chests}") - regions["The Maya"].locations.append(f"Chest {i + 1 + (chests * 2)}") - regions["Land of Darkness"].locations.append(f"Chest {i + 1 + (chests * 3)}") - else: - regions["Castle Hamson"].locations.append(f"Castle Hamson - Chest {i + 1}") - regions["Forest Abkhazia"].locations.append(f"Forest Abkhazia - Chest {i + 1}") - regions["The Maya"].locations.append(f"The Maya - Chest {i + 1}") - regions["Land of Darkness"].locations.append(f"Land of Darkness - Chest {i + 1}") - - # Fairy Chests - chests = int(world.options.fairy_chests_per_zone) - for i in range(0, chests): - if world.options.universal_fairy_chests: - regions["Castle Hamson"].locations.append(f"Fairy Chest {i + 1}") - regions["Forest Abkhazia"].locations.append(f"Fairy Chest {i + 1 + chests}") - regions["The Maya"].locations.append(f"Fairy Chest {i + 1 + (chests * 2)}") - regions["Land of Darkness"].locations.append(f"Fairy Chest {i + 1 + (chests * 3)}") - else: - regions["Castle Hamson"].locations.append(f"Castle Hamson - Fairy Chest {i + 1}") - regions["Forest Abkhazia"].locations.append(f"Forest Abkhazia - Fairy Chest {i + 1}") - regions["The Maya"].locations.append(f"The Maya - Fairy Chest {i + 1}") - regions["Land of Darkness"].locations.append(f"Land of Darkness - Fairy Chest {i + 1}") - - # Set up the regions correctly. - for name, data in regions.items(): - world.multiworld.regions.append(create_region(world.multiworld, world.player, name, data)) - - world.get_entrance("Castle Hamson").connect(world.get_region("Castle Hamson")) - world.get_entrance("The Manor").connect(world.get_region("The Manor")) - world.get_entrance("Forest Abkhazia").connect(world.get_region("Forest Abkhazia")) - world.get_entrance("The Maya").connect(world.get_region("The Maya")) - world.get_entrance("Land of Darkness").connect(world.get_region("Land of Darkness")) - world.get_entrance("The Fountain Room").connect(world.get_region("The Fountain Room")) - - -def create_region(multiworld: MultiWorld, player: int, name: str, data: RLRegionData): - region = Region(name, player, multiworld) - if data.locations: - for loc_name in data.locations: - loc_data = location_table.get(loc_name) - location = RLLocation(player, loc_name, loc_data.code if loc_data else None, region) - region.locations.append(location) - - if data.region_exits: - for exit in data.region_exits: - entrance = Entrance(player, exit, region) - region.exits.append(entrance) - - return region diff --git a/worlds/rogue_legacy/Rules.py b/worlds/rogue_legacy/Rules.py deleted file mode 100644 index 505bbdd635..0000000000 --- a/worlds/rogue_legacy/Rules.py +++ /dev/null @@ -1,117 +0,0 @@ -from BaseClasses import CollectionState -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from . import RLWorld - - -def get_upgrade_total(world: "RLWorld") -> int: - return int(world.options.health_pool) + int(world.options.mana_pool) + \ - int(world.options.attack_pool) + int(world.options.magic_damage_pool) - - -def get_upgrade_count(state: CollectionState, player: int) -> int: - return state.count("Health Up", player) + state.count("Mana Up", player) + \ - state.count("Attack Up", player) + state.count("Magic Damage Up", player) - - -def has_vendors(state: CollectionState, player: int) -> bool: - return state.has_all({"Blacksmith", "Enchantress"}, player) - - -def has_upgrade_amount(state: CollectionState, player: int, amount: int) -> bool: - return get_upgrade_count(state, player) >= amount - - -def has_upgrades_percentage(state: CollectionState, world: "RLWorld", percentage: float) -> bool: - return has_upgrade_amount(state, world.player, round(get_upgrade_total(world) * (percentage / 100))) - - -def has_movement_rune(state: CollectionState, player: int) -> bool: - return state.has("Vault Runes", player) or state.has("Sprint Runes", player) or state.has("Sky Runes", player) - - -def has_fairy_progression(state: CollectionState, player: int) -> bool: - return state.has("Dragons", player) or (state.has("Enchantress", player) and has_movement_rune(state, player)) - - -def has_defeated_castle(state: CollectionState, player: int) -> bool: - return state.has("Defeat Khidr", player) or state.has("Defeat Neo Khidr", player) - - -def has_defeated_forest(state: CollectionState, player: int) -> bool: - return state.has("Defeat Alexander", player) or state.has("Defeat Alexander IV", player) - - -def has_defeated_tower(state: CollectionState, player: int) -> bool: - return state.has("Defeat Ponce de Leon", player) or state.has("Defeat Ponce de Freon", player) - - -def has_defeated_dungeon(state: CollectionState, player: int) -> bool: - return state.has("Defeat Herodotus", player) or state.has("Defeat Astrodotus", player) - - -def set_rules(world: "RLWorld", player: int): - # If 'vendors' are 'normal', then expect it to show up in the first half(ish) of the spheres. - if world.options.vendors == "normal": - world.get_location("Forest Abkhazia Boss Reward").access_rule = \ - lambda state: has_vendors(state, player) - - # Gate each manor location so everything isn't dumped into sphere 1. - manor_rules = { - "Defeat Khidr" if world.options.khidr == "vanilla" else "Defeat Neo Khidr": [ - "Manor - Left Wing Window", - "Manor - Left Wing Rooftop", - "Manor - Right Wing Window", - "Manor - Right Wing Rooftop", - "Manor - Left Big Base", - "Manor - Right Big Base", - "Manor - Left Tree 1", - "Manor - Left Tree 2", - "Manor - Right Tree", - ], - "Defeat Alexander" if world.options.alexander == "vanilla" else "Defeat Alexander IV": [ - "Manor - Left Big Upper 1", - "Manor - Left Big Upper 2", - "Manor - Left Big Windows", - "Manor - Left Big Rooftop", - "Manor - Left Far Base", - "Manor - Left Far Roof", - "Manor - Left Extension", - "Manor - Right Big Upper", - "Manor - Right Big Rooftop", - "Manor - Right Extension", - ], - "Defeat Ponce de Leon" if world.options.leon == "vanilla" else "Defeat Ponce de Freon": [ - "Manor - Right High Base", - "Manor - Right High Upper", - "Manor - Right High Tower", - "Manor - Observatory Base", - "Manor - Observatory Telescope", - ] - } - - # Set rules for manor locations. - for event, locations in manor_rules.items(): - for location in locations: - world.get_location(location).access_rule = lambda state: state.has(event, player) - - # Set rules for fairy chests to decrease headache of expectation to find non-movement fairy chests. - for fairy_location in [location for location in world.multiworld.get_locations(player) if "Fairy" in location.name]: - fairy_location.access_rule = lambda state: has_fairy_progression(state, player) - - # Region rules. - world.get_entrance("Forest Abkhazia").access_rule = \ - lambda state: has_upgrades_percentage(state, world, 12.5) and has_defeated_castle(state, player) - - world.get_entrance("The Maya").access_rule = \ - lambda state: has_upgrades_percentage(state, world, 25) and has_defeated_forest(state, player) - - world.get_entrance("Land of Darkness").access_rule = \ - lambda state: has_upgrades_percentage(state, world, 37.5) and has_defeated_tower(state, player) - - world.get_entrance("The Fountain Room").access_rule = \ - lambda state: has_upgrades_percentage(state, world, 50) and has_defeated_dungeon(state, player) - - # Win condition. - world.multiworld.completion_condition[player] = lambda state: state.has("Defeat The Fountain", player) diff --git a/worlds/rogue_legacy/__init__.py b/worlds/rogue_legacy/__init__.py deleted file mode 100644 index 7ffdd459db..0000000000 --- a/worlds/rogue_legacy/__init__.py +++ /dev/null @@ -1,243 +0,0 @@ -from typing import List - -from BaseClasses import Tutorial -from worlds.AutoWorld import WebWorld, World -from .Items import RLItem, RLItemData, event_item_table, get_items_by_category, item_table -from .Locations import RLLocation, location_table -from .Options import RLOptions -from .Presets import rl_options_presets -from .Regions import create_regions -from .Rules import set_rules - - -class RLWeb(WebWorld): - theme = "stone" - tutorials = [Tutorial( - "Multiworld Setup Guide", - "A guide to setting up the Rogue Legacy Randomizer software on your computer. This guide covers single-player, " - "multiworld, and related software.", - "English", - "rogue-legacy_en.md", - "rogue-legacy/en", - ["Phar"] - )] - bug_report_page = "https://github.com/ThePhar/RogueLegacyRandomizer/issues/new?assignees=&labels=bug&template=" \ - "report-an-issue---.md&title=%5BIssue%5D" - options_presets = rl_options_presets - - -class RLWorld(World): - """ - Rogue Legacy is a genealogical rogue-"LITE" where anyone can be a hero. Each time you die, your child will succeed - you. Every child is unique. One child might be colorblind, another might have vertigo-- they could even be a dwarf. - But that's OK, because no one is perfect, and you don't have to be to succeed. - """ - game = "Rogue Legacy" - options_dataclass = RLOptions - options: RLOptions - topology_present = True - required_client_version = (0, 3, 5) - web = RLWeb() - - item_name_to_id = {name: data.code for name, data in item_table.items() if data.code is not None} - location_name_to_id = {name: data.code for name, data in location_table.items() if data.code is not None} - - def fill_slot_data(self) -> dict: - return self.options.as_dict(*[name for name in self.options_dataclass.type_hints.keys()]) - - def generate_early(self): - # Check validation of names. - additional_lady_names = len(self.options.additional_lady_names.value) - additional_sir_names = len(self.options.additional_sir_names.value) - if not self.options.allow_default_names: - if additional_lady_names < int(self.options.number_of_children): - raise Exception( - f"allow_default_names is off, but not enough names are defined in additional_lady_names. " - f"Expected {int(self.options.number_of_children)}, Got {additional_lady_names}") - - if additional_sir_names < int(self.options.number_of_children): - raise Exception( - f"allow_default_names is off, but not enough names are defined in additional_sir_names. " - f"Expected {int(self.options.number_of_children)}, Got {additional_sir_names}") - - def create_items(self): - item_pool: List[RLItem] = [] - total_locations = len(self.multiworld.get_unfilled_locations(self.player)) - for name, data in item_table.items(): - quantity = data.max_quantity - - # Architect - if name == "Architect": - if self.options.architect == "disabled": - continue - if self.options.architect == "start_unlocked": - self.multiworld.push_precollected(self.create_item(name)) - continue - if self.options.architect == "early": - self.multiworld.local_early_items[self.player]["Architect"] = 1 - - # Blacksmith and Enchantress - if name == "Blacksmith" or name == "Enchantress": - if self.options.vendors == "start_unlocked": - self.multiworld.push_precollected(self.create_item(name)) - continue - if self.options.vendors == "early": - self.multiworld.local_early_items[self.player]["Blacksmith"] = 1 - self.multiworld.local_early_items[self.player]["Enchantress"] = 1 - - # Haggling - if name == "Haggling" and self.options.disable_charon: - continue - - # Blueprints - if data.category == "Blueprints": - # No progressive blueprints if progressive_blueprints are disabled. - if name == "Progressive Blueprints" and not self.options.progressive_blueprints: - continue - # No distinct blueprints if progressive_blueprints are enabled. - elif name != "Progressive Blueprints" and self.options.progressive_blueprints: - continue - - # Classes - if data.category == "Classes": - if name == "Progressive Knights": - if "Knight" not in self.options.available_classes: - continue - - if self.options.starting_class == "knight": - quantity = 1 - if name == "Progressive Mages": - if "Mage" not in self.options.available_classes: - continue - - if self.options.starting_class == "mage": - quantity = 1 - if name == "Progressive Barbarians": - if "Barbarian" not in self.options.available_classes: - continue - - if self.options.starting_class == "barbarian": - quantity = 1 - if name == "Progressive Knaves": - if "Knave" not in self.options.available_classes: - continue - - if self.options.starting_class == "knave": - quantity = 1 - if name == "Progressive Miners": - if "Miner" not in self.options.available_classes: - continue - - if self.options.starting_class == "miner": - quantity = 1 - if name == "Progressive Shinobis": - if "Shinobi" not in self.options.available_classes: - continue - - if self.options.starting_class == "shinobi": - quantity = 1 - if name == "Progressive Liches": - if "Lich" not in self.options.available_classes: - continue - - if self.options.starting_class == "lich": - quantity = 1 - if name == "Progressive Spellthieves": - if "Spellthief" not in self.options.available_classes: - continue - - if self.options.starting_class == "spellthief": - quantity = 1 - if name == "Dragons": - if "Dragon" not in self.options.available_classes: - continue - if name == "Traitors": - if "Traitor" not in self.options.available_classes: - continue - - # Skills - if name == "Health Up": - quantity = self.options.health_pool.value - elif name == "Mana Up": - quantity = self.options.mana_pool.value - elif name == "Attack Up": - quantity = self.options.attack_pool.value - elif name == "Magic Damage Up": - quantity = self.options.magic_damage_pool.value - elif name == "Armor Up": - quantity = self.options.armor_pool.value - elif name == "Equip Up": - quantity = self.options.equip_pool.value - elif name == "Crit Chance Up": - quantity = self.options.crit_chance_pool.value - elif name == "Crit Damage Up": - quantity = self.options.crit_damage_pool.value - - # Ignore filler, it will be added in a later stage. - if data.category == "Filler": - continue - - item_pool += [self.create_item(name) for _ in range(0, quantity)] - - # Fill any empty locations with filler items. - while len(item_pool) < total_locations: - item_pool.append(self.create_item(self.get_filler_item_name())) - - self.multiworld.itempool += item_pool - - def get_filler_item_name(self) -> str: - fillers = get_items_by_category("Filler") - weights = [data.weight for data in fillers.values()] - return self.random.choices([filler for filler in fillers.keys()], weights, k=1)[0] - - def create_item(self, name: str) -> RLItem: - data = item_table[name] - return RLItem(name, data.classification, data.code, self.player) - - def create_event(self, name: str) -> RLItem: - data = event_item_table[name] - return RLItem(name, data.classification, data.code, self.player) - - def set_rules(self): - set_rules(self, self.player) - - def create_regions(self): - create_regions(self) - self._place_events() - - def _place_events(self): - # Fountain - self.multiworld.get_location("Fountain Room", self.player).place_locked_item( - self.create_event("Defeat The Fountain")) - - # Khidr / Neo Khidr - if self.options.khidr == "vanilla": - self.multiworld.get_location("Castle Hamson Boss Room", self.player).place_locked_item( - self.create_event("Defeat Khidr")) - else: - self.multiworld.get_location("Castle Hamson Boss Room", self.player).place_locked_item( - self.create_event("Defeat Neo Khidr")) - - # Alexander / Alexander IV - if self.options.alexander == "vanilla": - self.multiworld.get_location("Forest Abkhazia Boss Room", self.player).place_locked_item( - self.create_event("Defeat Alexander")) - else: - self.multiworld.get_location("Forest Abkhazia Boss Room", self.player).place_locked_item( - self.create_event("Defeat Alexander IV")) - - # Ponce de Leon / Ponce de Freon - if self.options.leon == "vanilla": - self.multiworld.get_location("The Maya Boss Room", self.player).place_locked_item( - self.create_event("Defeat Ponce de Leon")) - else: - self.multiworld.get_location("The Maya Boss Room", self.player).place_locked_item( - self.create_event("Defeat Ponce de Freon")) - - # Herodotus / Astrodotus - if self.options.herodotus == "vanilla": - self.multiworld.get_location("Land of Darkness Boss Room", self.player).place_locked_item( - self.create_event("Defeat Herodotus")) - else: - self.multiworld.get_location("Land of Darkness Boss Room", self.player).place_locked_item( - self.create_event("Defeat Astrodotus")) diff --git a/worlds/rogue_legacy/docs/en_Rogue Legacy.md b/worlds/rogue_legacy/docs/en_Rogue Legacy.md deleted file mode 100644 index dd203c73ac..0000000000 --- a/worlds/rogue_legacy/docs/en_Rogue Legacy.md +++ /dev/null @@ -1,34 +0,0 @@ -# Rogue Legacy (PC) - -## Where is the options page? - -The [player options page for this game](../player-options) contains most of the options you need to -configure and export a config file. Some options can only be made in YAML, but an explanation can be found in the -[template yaml here](../../../static/generated/configs/Rogue%20Legacy.yaml). - -## What does randomization do to this game? - -Rogue Legacy Randomizer takes all the classes, skills, runes, and blueprints and spreads them out into chests, the manor -upgrade screen, bosses, and some special individual locations. The goal is to become powerful enough to defeat the four -zone bosses and then defeat The Fountain. - -## What items and locations get shuffled? -All the skill upgrades, class upgrades, runes packs, and equipment packs are shuffled in the manor upgrade screen, diary -checks, chests and fairy chests, and boss rewards. Skill upgrades are also grouped in packs of 5 to make the finding of -stats less of a chore. Runes and Equipment are also grouped together. - -Some additional locations that can contain items are the Jukebox, the Portraits, and the mini-game rewards. - -## Which items can be in another player's world? - -Any of the items which can be shuffled may also be placed into another player's world. It is possible to choose to limit -certain items to your own world. -## When the player receives an item, what happens? - -When the player receives an item, your character will hold the item above their head and display it to the world. It's -good for business! - -## What do I do if I encounter a bug with the game? - -Please reach out to Phar#4444 on Discord or you can drop a bug report on the -[GitHub page for Rogue Legacy Randomizer](https://github.com/ThePhar/RogueLegacyRandomizer/issues/new?assignees=&labels=bug&template=report-an-issue---.md&title=%5BIssue%5D). diff --git a/worlds/rogue_legacy/docs/rogue-legacy_en.md b/worlds/rogue_legacy/docs/rogue-legacy_en.md deleted file mode 100644 index fc9f692017..0000000000 --- a/worlds/rogue_legacy/docs/rogue-legacy_en.md +++ /dev/null @@ -1,35 +0,0 @@ -# Rogue Legacy Randomizer Setup Guide - -## Required Software - -- Rogue Legacy Randomizer from the - [Rogue Legacy Randomizer Releases Page](https://github.com/ThePhar/RogueLegacyRandomizer/releases) - -## Recommended Installation Instructions - -Please read the README file on the -[Rogue Legacy Randomizer GitHub](https://github.com/ThePhar/RogueLegacyRandomizer/blob/master/README.md) page for -up-to-date installation instructions. - -## Configuring your YAML file - -### What is a YAML file and why do I need one? - -Your YAML file contains a set of configuration options which provide the generator with information about how it should -generate your game. Each player of a multiworld will provide their own YAML file. This setup allows each player to enjoy -an experience customized for their taste, and different players in the same multiworld can all have different options. - -### Where do I get a YAML file? - -you can customize your options by visiting the [Rogue Legacy Options Page](/games/Rogue%20Legacy/player-options). - -### Connect to the MultiServer - -Once in game, press the start button and the AP connection screen should appear. You will fill out the hostname, port, -slot name, and password (if applicable). You should only need to fill out hostname, port, and password if the server -provides an alternative one to the default values. - -### Play the game - -Once you have entered the required values, you go to Connect and then select Confirm on the "Ready to Start" screen. Now -you're off to start your legacy! diff --git a/worlds/rogue_legacy/test/TestUnique.py b/worlds/rogue_legacy/test/TestUnique.py deleted file mode 100644 index 1ae9968d55..0000000000 --- a/worlds/rogue_legacy/test/TestUnique.py +++ /dev/null @@ -1,23 +0,0 @@ -from typing import Dict - -from . import RLTestBase -from ..Items import item_table -from ..Locations import location_table - - -class UniqueTest(RLTestBase): - @staticmethod - def test_item_ids_are_all_unique(): - item_ids: Dict[int, str] = {} - for name, data in item_table.items(): - assert data.code not in item_ids.keys(), f"'{name}': {data.code}, is not unique. " \ - f"'{item_ids[data.code]}' also has this identifier." - item_ids[data.code] = name - - @staticmethod - def test_location_ids_are_all_unique(): - location_ids: Dict[int, str] = {} - for name, data in location_table.items(): - assert data.code not in location_ids.keys(), f"'{name}': {data.code}, is not unique. " \ - f"'{location_ids[data.code]}' also has this identifier." - location_ids[data.code] = name diff --git a/worlds/rogue_legacy/test/__init__.py b/worlds/rogue_legacy/test/__init__.py deleted file mode 100644 index 3346476ba6..0000000000 --- a/worlds/rogue_legacy/test/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from test.bases import WorldTestBase - - -class RLTestBase(WorldTestBase): - game = "Rogue Legacy" diff --git a/worlds/sa2b/AestheticData.py b/worlds/sa2b/AestheticData.py index 386b2850df..7942729194 100644 --- a/worlds/sa2b/AestheticData.py +++ b/worlds/sa2b/AestheticData.py @@ -170,126 +170,309 @@ sample_chao_names = [ "Portia", "Graves", "Kaycee", + "Ghandi", + "Medli", + "Jak", + "Wario", + "Theo", ] -totally_real_item_names = [ - "Mallet", - "Lava Rod", - "Master Knife", - "Slippers", - "Spade", +totally_real_item_names: dict[str, list[str]] = { + "Bumper Stickers": [ + "Bonus Score", + "Boosting Bumper", + ], - "Progressive Car Upgrade", - "Bonus Token", + "Castlevania 64": [ + "Earth card", + "Venus card", + "Ax", + "Storehouse Key", + ], - "Shortnail", - "Runmaster", + "Celeste 64": [ + "Blueberry", + "Side Flip", + "Triple Dash Refills", + "Swap Blocks", + "Dream Blocks", + ], - "Courage Form", - "Auto Courage", - "Donald Defender", - "Goofy Blizzard", - "Ultimate Weapon", + "Celeste (Open World)": [ + "Green Boosters", + "Triple Dash Refills", + "Rising Platforms", + "Red Bubbles", + "Granny's Car Keys", + "Blueberry", + ], - "Song of the Sky Whale", - "Gryphon Shoes", - "Wing Key", - "Strength Anklet", + "Civilization VI": [ + "Advanced Trebuchets", + "The Wheel 2", + "NFTs", + ], - "Hairclip", + "Donkey Kong Country 3": [ + "Progressive Car Upgrade", + "Bonus Token", + ], - "Key of Wisdom", + "Factorio": [ + "logistic-ai", + "progressive-militia", + "progressive-stronger-explosives", + "uranium-food", + ], - "Baking", - "Progressive Block Mining", + "A Hat in Time": [ + "Fire Hat", + "69 Pons", + "Relic (Green Canyon)", + "Relic (Cooler Cow)", + "Time Fragment", + ], - "Jar", - "Whistle of Space", - "Rito Tunic", + "Hollow Knight": [ + "Shortnail", + "Runmaster", + ], - "Kitchen Sink", + "Jak and Daxter The Precursor Legacy": [ + "69 Precursor Orbs", + "Jump Roll", + "Roll Kick", + ], - "Rock Badge", - "Key Card", - "Pikachu", - "Eevee", - "HM02 Strength", + "Kirby's Dream Land 3": [ + "CooCoo", + ], - "Progressive Astromancers", - "Progressive Chefs", - "The Living Safe", - "Lady Quinn", + "Kingdom Hearts 2": [ + "Courage Form", + "Auto Courage", + "Donald Defender", + "Goofy Blizzard", + "Ultimate Weapon", + ], - "Dio's Worst Enemy", + "Lingo": [ + "Art Gallery (First Floor)", + "Color Hunt - Pink Barrier", + ], - "Pink Chaos Emerald", - "Black Chaos Emerald", - "Tails - Large Cannon", - "Eggman - Bazooka", - "Eggman - Booster", - "Knuckles - Shades", - "Sonic - Magic Shoes", - "Shadow - Bounce Bracelet", - "Rouge - Air Necklace", - "Big Key (Eggman's Pyramid)", + "A Link to the Past": [ + "Mallet", + "Lava Rod", + "Master Knife", + "Slippers", + "Spade", + "Big Key (Dark Palace)", + "Big Key (Hera Tower)", + ], - "Sensor Bunker", - "Phantom", - "Soldier", + "Links Awakening DX": [ + "Song of the Sky Whale", + "Gryphon Shoes", + "Wing Key", + "Strength Anklet", + ], - "Plasma Suit", - "Gravity Beam", - "Hi-Jump Ball", + "Mario & Luigi Superstar Saga": [ + "Mega Nut", + ], - "Cannon Unlock LLL", - "Feather Cap", + "The Messenger": [ + "Key of Anger", + "Time Shard (69)", + "Hydro", + ], - "Progressive Yoshi", - "Purple Switch Palace", - "Cape Feather", + "Muse Dash": [ + "U.N. Owen Was Her", + "Renai Circulation", + "Flyers", + ], - "Cane of Bryan", + "Noita": [ + "Gold (69)", + "Sphere", + "Melee Die", + ], - "Van Repair", - "Autumn", - "Galaxy Knife", - "Green Cabbage Seeds", + "Ocarina of Time": [ + "Jar", + "Whistle of Space", + "Rito Tunic", + "Boss Key (Forest Haven)", + "Boss Key (Swamp Palace)", + "Boss Key (Great Bay Temple)", + ], - "Timespinner Cog 1", + "Old School Runescape": [ + "Area: Taverly", + "Area: Meiyerditch", + "Fire Cape", + ], - "Ladder", + "Overcooked! 2": [ + "Kitchen Sink", + ], - "Visible Dots", + "Paint": [ + "AI Enhance", + "Paint Bucket", + "Pen", + ], - "CooCoo", + "Pokemon Red and Blue": [ + "Rock Badge", + "Key Card", + "Pikachu", + "Eevee", + "HM02 Strength", + "HM05 Fly", + "HM01 Surf", + "Card Key 12F", + ], - "Blueberry", + "Risk of Rain 2": [ + "Dio's Worst Enemy", + "Stage 5", + "Mythical Item", + ], - "Ear of Luigi", + "Rogue Legacy": [ + "Progressive Astromancers", + "Progressive Chefs", + "The Living Safe", + "Lady Quinn", + ], - "Mega Nut", + "Saving Princess": [ + "Fire Spreadshot", + "Volcano Key", + "Frozen Key", + ], - "DUELIST ALLIANCE", - "DUEL OVERLOAD", - "POWER OF THE ELEMENTS", - "S:P Little Knight", - "Red-Eyes Dark Dragoon", + "Secret of Evermore": [ + "Mantis Claw", + "Progressive pants", + "Deflect", + ], - "Fire Hat", + "shapez": [ + "Spinner", + "Toggle", + "Slicer", + "Splitter", + ], - "Area: Taverly", - "Area: Meiyerditch", - "Fire Cape", + "SMZ3": [ + "Cane of Bryan", + ], - "Donald Zeta Flare", + "Sonic Adventure 2 Battle": [ + "Pink Chaos Emerald", + "Black Chaos Emerald", + "Tails - Large Cannon", + "Eggman - Bazooka", + "Eggman - Booster", + "Knuckles - Shades", + "Sonic - Magic Shoes", + "Shadow - Bounce Bracelet", + "Rouge - Air Necklace", + "Big Key (Eggman's Pyramid)", + ], - "Category One of a Kind", - "Category Fuller House", + "Starcraft 2": [ + "Sensor Bunker", + "Phantom", + "Soldier", + ], - "Passive Camoflage", + "Stardew Valley": [ + "Van Repair", + "Ship Repair", + "Autumn", + "Galaxy Knife", + "Green Cabbage Seeds", + "Casket", + "Pet Moonlight Jelly", + "Adventurer's Guild Key", + ], - "Earth Card", -] + "Super Mario Land 2": [ + "Luigi Coin", + "Luigi Zone Progression", + "Hard Mode", + ], + + "Super Metroid": [ + "Plasma Suit", + "Gravity Beam", + "Hi-Jump Ball", + ], + + "Super Mario 64": [ + "Cannon Unlock LLL", + "Feather Cap", + ], + + "Super Mario World": [ + "Progressive Yoshi", + "Purple Switch Palace", + "Cape Feather", + "Fire Flower", + "Cling", + "Twirl Jump", + ], + + "Timespinner": [ + "Timespinner Cog 1", + "Leg Cannon", + ], + + "TUNIC": [ + "Ladder To West Forest", + "Money x69", + "Page 69", + "Master Sword", + ], + + "The Wind Waker": [ + "Ballad of Storms", + "Wind God's Song", + "Earth God's Song", + "Ordon's Pearl", + ], + + "The Witness": [ + "Visible Dots", + ], + + "Yacht Dice": [ + "Category One of a Kind", + "Category Fuller House", + ], + + "Yoshi's Island": [ + "Ear of Luigi", + "+69 Stars", + "Water Melon", + "World 7 Gate", + "Small Spring Ball", + ], + + "Yu-Gi-Oh! 2006": [ + "DUELIST ALLIANCE", + "DUEL OVERLOAD", + "POWER OF THE ELEMENTS", + "S:P Little Knight", + "Red-Eyes Dark Dragoon", + "Maxx C" + ], +} all_exits = [ 0x00, # Lobby to Neutral diff --git a/worlds/sa2b/GateBosses.py b/worlds/sa2b/GateBosses.py index 9e1a81bae9..02e089359b 100644 --- a/worlds/sa2b/GateBosses.py +++ b/worlds/sa2b/GateBosses.py @@ -1,6 +1,7 @@ import typing from BaseClasses import MultiWorld +from Options import OptionError from worlds.AutoWorld import World from .Names import LocationName @@ -99,8 +100,9 @@ def get_gate_bosses(world: World): pass if boss in plando_bosses: - # TODO: Raise error here. Duplicates not allowed - pass + raise OptionError(f"Invalid input for option `plando_bosses`: " + f"No Duplicate Bosses permitted ({boss}) - for " + f"{world.player_name}") plando_bosses[boss_num] = boss @@ -108,13 +110,14 @@ def get_gate_bosses(world: World): available_bosses.remove(boss) for x in range(world.options.number_of_level_gates): - if ("king boom boo" not in selected_bosses) and ("king boom boo" not in available_bosses) and ((x + 1) / world.options.number_of_level_gates) > 0.5: - available_bosses.extend(gate_bosses_with_requirements_table) + if (10 not in selected_bosses) and (king_boom_boo not in available_bosses) and ((x + 1) / world.options.number_of_level_gates) > 0.5: + available_bosses.extend(gate_bosses_with_requirements_table.keys()) world.random.shuffle(available_bosses) chosen_boss = available_bosses[0] if plando_bosses[x] != "None": - available_bosses.append(plando_bosses[x]) + if plando_bosses[x] not in available_bosses: + available_bosses.append(plando_bosses[x]) chosen_boss = plando_bosses[x] selected_bosses.append(all_gate_bosses_table[chosen_boss]) diff --git a/worlds/sa2b/Missions.py b/worlds/sa2b/Missions.py index 0c43834fb1..a5aac267a2 100644 --- a/worlds/sa2b/Missions.py +++ b/worlds/sa2b/Missions.py @@ -241,7 +241,7 @@ def get_mission_count_table(multiworld: MultiWorld, world: World, player: int): sonic_active_missions = min(sonic_active_missions, world.options.sonic_mission_count.value) tails_active_missions = min(tails_active_missions, world.options.tails_mission_count.value) knuckles_active_missions = min(knuckles_active_missions, world.options.knuckles_mission_count.value) - shadow_active_missions = min(shadow_active_missions, world.options.sonic_mission_count.value) + shadow_active_missions = min(shadow_active_missions, world.options.shadow_mission_count.value) eggman_active_missions = min(eggman_active_missions, world.options.eggman_mission_count.value) rouge_active_missions = min(rouge_active_missions, world.options.rouge_mission_count.value) kart_active_missions = min(kart_active_missions, world.options.kart_mission_count.value) diff --git a/worlds/sa2b/Rules.py b/worlds/sa2b/Rules.py index 53edc686b6..e5080f462a 100644 --- a/worlds/sa2b/Rules.py +++ b/worlds/sa2b/Rules.py @@ -324,7 +324,8 @@ def set_mission_upgrade_rules_standard(multiworld: MultiWorld, world: World, pla add_rule_safe(multiworld, LocationName.iron_gate_5, player, lambda state: state.has(ItemName.eggman_large_cannon, player)) add_rule_safe(multiworld, LocationName.dry_lagoon_5, player, - lambda state: state.has(ItemName.rouge_treasure_scope, player)) + lambda state: state.has(ItemName.rouge_pick_nails, player) and + state.has(ItemName.rouge_treasure_scope, player)) add_rule_safe(multiworld, LocationName.sand_ocean_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule_safe(multiworld, LocationName.egg_quarters_5, player, @@ -407,8 +408,7 @@ def set_mission_upgrade_rules_standard(multiworld: MultiWorld, world: World, pla lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) add_rule(multiworld.get_location(LocationName.cosmic_wall_chao_1, player), - lambda state: state.has(ItemName.eggman_mystic_melody, player) and - state.has(ItemName.eggman_jet_engine, player)) + lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule(multiworld.get_location(LocationName.cannon_core_chao_1, player), lambda state: state.has(ItemName.tails_booster, player) and @@ -1402,13 +1402,12 @@ def set_mission_upgrade_rules_standard(multiworld: MultiWorld, world: World, pla state.has(ItemName.eggman_large_cannon, player))) add_rule(multiworld.get_location(LocationName.dry_lagoon_lifebox_2, player), lambda state: state.has(ItemName.rouge_treasure_scope, player)) - add_rule(multiworld.get_location(LocationName.sand_ocean_lifebox_2, player), - lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule(multiworld.get_location(LocationName.egg_quarters_lifebox_2, player), lambda state: (state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_treasure_scope, player))) add_rule(multiworld.get_location(LocationName.white_jungle_lifebox_2, player), - lambda state: state.has(ItemName.shadow_flame_ring, player)) + lambda state: (state.has(ItemName.shadow_flame_ring, player) and + state.has(ItemName.shadow_air_shoes, player))) add_rule(multiworld.get_location(LocationName.metal_harbor_lifebox_3, player), lambda state: state.has(ItemName.sonic_light_shoes, player)) @@ -1724,6 +1723,9 @@ def set_mission_upgrade_rules_standard(multiworld: MultiWorld, world: World, pla lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule(multiworld.get_location(LocationName.white_jungle_itembox_8, player), lambda state: state.has(ItemName.shadow_air_shoes, player)) + add_rule(multiworld.get_location(LocationName.sky_rail_itembox_8, player), + lambda state: (state.has(ItemName.shadow_air_shoes, player) and + state.has(ItemName.shadow_mystic_melody, player))) add_rule(multiworld.get_location(LocationName.mad_space_itembox_8, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) add_rule(multiworld.get_location(LocationName.cosmic_wall_itembox_8, player), @@ -2061,6 +2063,8 @@ def set_mission_upgrade_rules_standard(multiworld: MultiWorld, world: World, pla add_rule(multiworld.get_location(LocationName.mad_space_big, player), lambda state: state.has(ItemName.rouge_iron_boots, player)) + add_rule(multiworld.get_location(LocationName.cannon_core_big_1, player), + lambda state: state.has(ItemName.tails_booster, player)) add_rule(multiworld.get_location(LocationName.cannon_core_big_2, player), lambda state: state.has(ItemName.tails_booster, player) and state.has(ItemName.eggman_jet_engine, player)) @@ -2257,7 +2261,7 @@ def set_mission_upgrade_rules_hard(multiworld: MultiWorld, world: World, player: add_rule_safe(multiworld, LocationName.weapons_bed_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule_safe(multiworld, LocationName.security_hall_5, player, - lambda state: state.has(ItemName.rouge_treasure_scope, player)) + lambda state: state.has(ItemName.rouge_pick_nails, player)) add_rule_safe(multiworld, LocationName.cosmic_wall_5, player, lambda state: state.has(ItemName.eggman_jet_engine, player)) @@ -2308,8 +2312,7 @@ def set_mission_upgrade_rules_hard(multiworld: MultiWorld, world: World, player: lambda state: state.has(ItemName.tails_booster, player)) add_rule(multiworld.get_location(LocationName.cosmic_wall_chao_1, player), - lambda state: state.has(ItemName.eggman_mystic_melody, player) and - state.has(ItemName.eggman_jet_engine, player)) + lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule(multiworld.get_location(LocationName.cannon_core_chao_1, player), lambda state: state.has(ItemName.tails_booster, player) and @@ -2971,7 +2974,7 @@ def set_mission_upgrade_rules_hard(multiworld: MultiWorld, world: World, player: add_rule(multiworld.get_location(LocationName.mission_street_lifebox_2, player), lambda state: (state.has(ItemName.tails_booster, player) and -- state.has(ItemName.tails_mystic_melody, player))) + state.has(ItemName.tails_mystic_melody, player))) add_rule(multiworld.get_location(LocationName.eternal_engine_lifebox_2, player), lambda state: state.has(ItemName.tails_booster, player)) @@ -2980,8 +2983,6 @@ def set_mission_upgrade_rules_hard(multiworld: MultiWorld, world: World, player: state.has(ItemName.eggman_jet_engine, player))) add_rule(multiworld.get_location(LocationName.dry_lagoon_lifebox_2, player), lambda state: state.has(ItemName.rouge_treasure_scope, player)) - add_rule(multiworld.get_location(LocationName.sand_ocean_lifebox_2, player), - lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule(multiworld.get_location(LocationName.egg_quarters_lifebox_2, player), lambda state: (state.has(ItemName.rouge_mystic_melody, player) and state.has(ItemName.rouge_treasure_scope, player))) @@ -3593,8 +3594,7 @@ def set_mission_upgrade_rules_expert(multiworld: MultiWorld, world: World, playe lambda state: state.has(ItemName.tails_booster, player)) add_rule(multiworld.get_location(LocationName.cosmic_wall_chao_1, player), - lambda state: state.has(ItemName.eggman_mystic_melody, player) and - state.has(ItemName.eggman_jet_engine, player)) + lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule(multiworld.get_location(LocationName.cannon_core_chao_1, player), lambda state: state.has(ItemName.eggman_jet_engine, player) and @@ -3643,9 +3643,6 @@ def set_mission_upgrade_rules_expert(multiworld: MultiWorld, world: World, playe add_rule(multiworld.get_location(LocationName.cosmic_wall_pipe_2, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(multiworld.get_location(LocationName.cannon_core_pipe_2, player), - lambda state: state.has(ItemName.tails_booster, player)) - add_rule(multiworld.get_location(LocationName.prison_lane_pipe_3, player), lambda state: state.has(ItemName.tails_bazooka, player)) add_rule(multiworld.get_location(LocationName.mission_street_pipe_3, player), @@ -3771,10 +3768,6 @@ def set_mission_upgrade_rules_expert(multiworld: MultiWorld, world: World, playe add_rule(multiworld.get_location(LocationName.cosmic_wall_beetle, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) - add_rule(multiworld.get_location(LocationName.cannon_core_beetle, player), - lambda state: state.has(ItemName.tails_booster, player) and - state.has(ItemName.knuckles_hammer_gloves, player)) - # Animal Upgrade Requirements if world.options.animalsanity: add_rule(multiworld.get_location(LocationName.hidden_base_animal_2, player), @@ -3839,8 +3832,7 @@ def set_mission_upgrade_rules_expert(multiworld: MultiWorld, world: World, playe add_rule(multiworld.get_location(LocationName.weapons_bed_animal_8, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule(multiworld.get_location(LocationName.security_hall_animal_8, player), - lambda state: state.has(ItemName.rouge_pick_nails, player) and - state.has(ItemName.rouge_iron_boots, player)) + lambda state: state.has(ItemName.rouge_iron_boots, player)) add_rule(multiworld.get_location(LocationName.cosmic_wall_animal_8, player), lambda state: state.has(ItemName.eggman_jet_engine, player)) @@ -3976,8 +3968,6 @@ def set_mission_upgrade_rules_expert(multiworld: MultiWorld, world: World, playe state.has(ItemName.tails_bazooka, player)) add_rule(multiworld.get_location(LocationName.crazy_gadget_animal_16, player), lambda state: state.has(ItemName.sonic_flame_ring, player)) - add_rule(multiworld.get_location(LocationName.final_rush_animal_16, player), - lambda state: state.has(ItemName.sonic_bounce_bracelet, player)) add_rule(multiworld.get_location(LocationName.final_chase_animal_17, player), lambda state: state.has(ItemName.shadow_flame_ring, player)) @@ -4035,8 +4025,6 @@ def set_mission_upgrade_rules_expert(multiworld: MultiWorld, world: World, playe lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule(multiworld.get_location(LocationName.dry_lagoon_lifebox_2, player), lambda state: state.has(ItemName.rouge_treasure_scope, player)) - add_rule(multiworld.get_location(LocationName.sand_ocean_lifebox_2, player), - lambda state: state.has(ItemName.eggman_jet_engine, player)) add_rule(multiworld.get_location(LocationName.egg_quarters_lifebox_2, player), lambda state: state.has(ItemName.rouge_treasure_scope, player)) diff --git a/worlds/sa2b/__init__.py b/worlds/sa2b/__init__.py index d7c9ceaeba..21989626db 100644 --- a/worlds/sa2b/__init__.py +++ b/worlds/sa2b/__init__.py @@ -613,7 +613,8 @@ class SA2BWorld(World): self.options.chao_stats.value > 0 or \ self.options.chao_animal_parts or \ self.options.chao_kindergarten or \ - self.options.black_market_slots.value > 0: + self.options.black_market_slots.value > 0 or \ + self.options.goal.value == 7: return True; return False @@ -757,13 +758,16 @@ class SA2BWorld(World): item_names = [] player_names = [] progression_flags = [] - totally_real_item_names_copy = totally_real_item_names.copy() location_names = [(LocationName.chao_black_market_base + str(i)) for i in range(1, self.options.black_market_slots.value + 1)] locations = [self.multiworld.get_location(location_name, self.player) for location_name in location_names] for location in locations: if location.item.classification & ItemClassification.trap: - item_name = self.random.choice(totally_real_item_names_copy) - totally_real_item_names_copy.remove(item_name) + item_name = "" + if location.item.game in totally_real_item_names: + item_name = self.random.choice(totally_real_item_names[location.item.game]) + else: + random_game_names: list[str] = self.random.choice(list(totally_real_item_names.values())) + item_name = self.random.choice(random_game_names) item_names.append(item_name) else: item_names.append(location.item.name) diff --git a/worlds/saving_princess/__init__.py b/worlds/saving_princess/__init__.py index 4109f356fd..f731012abc 100644 --- a/worlds/saving_princess/__init__.py +++ b/worlds/saving_princess/__init__.py @@ -12,7 +12,7 @@ from .Constants import * def launch_client(*args: str): from .Client import launch - launch_subprocess(launch(*args), name=CLIENT_NAME) + launch_subprocess(launch, name=CLIENT_NAME, args=args) components.append( diff --git a/worlds/sc2/Client.py b/worlds/sc2/Client.py deleted file mode 100644 index 77b13a5acb..0000000000 --- a/worlds/sc2/Client.py +++ /dev/null @@ -1,1630 +0,0 @@ -from __future__ import annotations - -import asyncio -import copy -import ctypes -import enum -import inspect -import logging -import multiprocessing -import os.path -import re -import sys -import tempfile -import typing -import queue -import zipfile -import io -import random -import concurrent.futures -from pathlib import Path - -# CommonClient import first to trigger ModuleUpdater -from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser -from Utils import init_logging, is_windows, async_start -from . import ItemNames, Options -from .ItemGroups import item_name_groups -from .Options import ( - MissionOrder, KerriganPrimalStatus, kerrigan_unit_available, KerriganPresence, - GameSpeed, GenericUpgradeItems, GenericUpgradeResearch, ColorChoice, GenericUpgradeMissions, - LocationInclusion, ExtraLocations, MasteryLocations, ChallengeLocations, VanillaLocations, - DisableForcedCamera, SkipCutscenes, GrantStoryTech, GrantStoryLevels, TakeOverAIAllies, RequiredTactics, - SpearOfAdunPresence, SpearOfAdunPresentInNoBuild, SpearOfAdunAutonomouslyCastAbilityPresence, - SpearOfAdunAutonomouslyCastPresentInNoBuild -) - - -if __name__ == "__main__": - init_logging("SC2Client", exception_logger="Client") - -logger = logging.getLogger("Client") -sc2_logger = logging.getLogger("Starcraft2") - -import nest_asyncio -from worlds._sc2common import bot -from worlds._sc2common.bot.data import Race -from worlds._sc2common.bot.main import run_game -from worlds._sc2common.bot.player import Bot -from .Items import (lookup_id_to_name, get_full_item_list, ItemData, type_flaggroups, upgrade_numbers, - upgrade_numbers_all) -from .Locations import SC2WOL_LOC_ID_OFFSET, LocationType, SC2HOTS_LOC_ID_OFFSET -from .MissionTables import (lookup_id_to_mission, SC2Campaign, lookup_name_to_mission, - lookup_id_to_campaign, MissionConnection, SC2Mission, campaign_mission_table, SC2Race) -from .Regions import MissionInfo - -import colorama -from Options import Option -from NetUtils import ClientStatus, NetworkItem, JSONtoTextParser, JSONMessagePart, add_json_item, add_json_location, add_json_text, JSONTypes -from MultiServer import mark_raw - -pool = concurrent.futures.ThreadPoolExecutor(1) -loop = asyncio.get_event_loop_policy().new_event_loop() -nest_asyncio.apply(loop) -MAX_BONUS: int = 28 -VICTORY_MODULO: int = 100 - -# GitHub repo where the Map/mod data is hosted for /download_data command -DATA_REPO_OWNER = "Ziktofel" -DATA_REPO_NAME = "Archipelago-SC2-data" -DATA_API_VERSION = "API3" - -# Bot controller -CONTROLLER_HEALTH: int = 38281 -CONTROLLER2_HEALTH: int = 38282 - -# Games -STARCRAFT2 = "Starcraft 2" -STARCRAFT2_WOL = "Starcraft 2 Wings of Liberty" - - -# Data version file path. -# This file is used to tell if the downloaded data are outdated -# Associated with /download_data command -def get_metadata_file() -> str: - return os.environ["SC2PATH"] + os.sep + "ArchipelagoSC2Metadata.txt" - - -class ConfigurableOptionType(enum.Enum): - INTEGER = enum.auto() - ENUM = enum.auto() - -class ConfigurableOptionInfo(typing.NamedTuple): - name: str - variable_name: str - option_class: typing.Type[Option] - option_type: ConfigurableOptionType = ConfigurableOptionType.ENUM - can_break_logic: bool = False - - -class ColouredMessage: - def __init__(self, text: str = '', *, keep_markup: bool = False) -> None: - self.parts: typing.List[dict] = [] - if text: - self(text, keep_markup=keep_markup) - def __call__(self, text: str, *, keep_markup: bool = False) -> 'ColouredMessage': - add_json_text(self.parts, text, keep_markup=keep_markup) - return self - def coloured(self, text: str, colour: str) -> 'ColouredMessage': - add_json_text(self.parts, text, type="color", color=colour) - return self - def location(self, location_id: int, player_id: int) -> 'ColouredMessage': - add_json_location(self.parts, location_id, player_id) - return self - def item(self, item_id: int, player_id: int, flags: int = 0) -> 'ColouredMessage': - add_json_item(self.parts, item_id, player_id, flags) - return self - def player(self, player_id: int) -> 'ColouredMessage': - add_json_text(self.parts, str(player_id), type=JSONTypes.player_id) - return self - def send(self, ctx: SC2Context) -> None: - ctx.on_print_json({"data": self.parts, "cmd": "PrintJSON"}) - - -class StarcraftClientProcessor(ClientCommandProcessor): - ctx: SC2Context - - def formatted_print(self, text: str) -> None: - """Prints with kivy formatting to the GUI, and also prints to command-line and to all logs""" - # Note(mm): Bold/underline can help readability, but unfortunately the CommonClient does not filter bold tags from command-line output. - # Regardless, using `on_print_json` to get formatted text in the GUI and output in the command-line and in the logs, - # without having to branch code from CommonClient - self.ctx.on_print_json({"data": [{"text": text, "keep_markup": True}]}) - - def _cmd_difficulty(self, difficulty: str = "") -> bool: - """Overrides the current difficulty set for the world. Takes the argument casual, normal, hard, or brutal""" - options = difficulty.split() - num_options = len(options) - - if num_options > 0: - difficulty_choice = options[0].lower() - if difficulty_choice == "casual": - self.ctx.difficulty_override = 0 - elif difficulty_choice == "normal": - self.ctx.difficulty_override = 1 - elif difficulty_choice == "hard": - self.ctx.difficulty_override = 2 - elif difficulty_choice == "brutal": - self.ctx.difficulty_override = 3 - else: - self.output("Unable to parse difficulty '" + options[0] + "'") - return False - - self.output("Difficulty set to " + options[0]) - return True - - else: - if self.ctx.difficulty == -1: - self.output("Please connect to a seed before checking difficulty.") - else: - current_difficulty = self.ctx.difficulty - if self.ctx.difficulty_override >= 0: - current_difficulty = self.ctx.difficulty_override - self.output("Current difficulty: " + ["Casual", "Normal", "Hard", "Brutal"][current_difficulty]) - self.output("To change the difficulty, add the name of the difficulty after the command.") - return False - - - def _cmd_game_speed(self, game_speed: str = "") -> bool: - """Overrides the current game speed for the world. - Takes the arguments default, slower, slow, normal, fast, faster""" - options = game_speed.split() - num_options = len(options) - - if num_options > 0: - speed_choice = options[0].lower() - if speed_choice == "default": - self.ctx.game_speed_override = 0 - elif speed_choice == "slower": - self.ctx.game_speed_override = 1 - elif speed_choice == "slow": - self.ctx.game_speed_override = 2 - elif speed_choice == "normal": - self.ctx.game_speed_override = 3 - elif speed_choice == "fast": - self.ctx.game_speed_override = 4 - elif speed_choice == "faster": - self.ctx.game_speed_override = 5 - else: - self.output("Unable to parse game speed '" + options[0] + "'") - return False - - self.output("Game speed set to " + options[0]) - return True - - else: - if self.ctx.game_speed == -1: - self.output("Please connect to a seed before checking game speed.") - else: - current_speed = self.ctx.game_speed - if self.ctx.game_speed_override >= 0: - current_speed = self.ctx.game_speed_override - self.output("Current game speed: " - + ["Default", "Slower", "Slow", "Normal", "Fast", "Faster"][current_speed]) - self.output("To change the game speed, add the name of the speed after the command," - " or Default to select based on difficulty.") - return False - - @mark_raw - def _cmd_received(self, filter_search: str = "") -> bool: - """List received items. - Pass in a parameter to filter the search by partial item name or exact item group.""" - # Groups must be matched case-sensitively, so we properly capitalize the search term - # eg. "Spear of Adun" over "Spear Of Adun" or "spear of adun" - # This fails a lot of item name matches, but those should be found by partial name match - formatted_filter_search = " ".join([(part.lower() if len(part) <= 3 else part.lower().capitalize()) for part in filter_search.split()]) - - def item_matches_filter(item_name: str) -> bool: - # The filter can be an exact group name or a partial item name - # Partial item name can be matched case-insensitively - if filter_search.lower() in item_name.lower(): - return True - # The search term should already be formatted as a group name - if formatted_filter_search in item_name_groups and item_name in item_name_groups[formatted_filter_search]: - return True - return False - - items = get_full_item_list() - categorized_items: typing.Dict[SC2Race, typing.List[int]] = {} - parent_to_child: typing.Dict[int, typing.List[int]] = {} - items_received: typing.Dict[int, typing.List[NetworkItem]] = {} - filter_match_count = 0 - for item in self.ctx.items_received: - items_received.setdefault(item.item, []).append(item) - items_received_set = set(items_received) - for item_data in items.values(): - if item_data.parent_item: - parent_to_child.setdefault(items[item_data.parent_item].code, []).append(item_data.code) - else: - categorized_items.setdefault(item_data.race, []).append(item_data.code) - for faction in SC2Race: - has_printed_faction_title = False - def print_faction_title(): - if not has_printed_faction_title: - self.formatted_print(f" [u]{faction.name}[/u] ") - - for item_id in categorized_items[faction]: - item_name = self.ctx.item_names.lookup_in_game(item_id) - received_child_items = items_received_set.intersection(parent_to_child.get(item_id, [])) - matching_children = [child for child in received_child_items - if item_matches_filter(self.ctx.item_names.lookup_in_game(child))] - received_items_of_this_type = items_received.get(item_id, []) - item_is_match = item_matches_filter(item_name) - if item_is_match or len(matching_children) > 0: - # Print found item if it or its children match the filter - if item_is_match: - filter_match_count += len(received_items_of_this_type) - for item in received_items_of_this_type: - print_faction_title() - has_printed_faction_title = True - (ColouredMessage('* ').item(item.item, self.ctx.slot, flags=item.flags) - (" from ").location(item.location, item.player) - (" by ").player(item.player) - ).send(self.ctx) - - if received_child_items: - # We have this item's children - if len(matching_children) == 0: - # ...but none of them match the filter - continue - - if not received_items_of_this_type: - # We didn't receive the item itself - print_faction_title() - has_printed_faction_title = True - ColouredMessage("- ").coloured(item_name, "black")(" - not obtained").send(self.ctx) - - for child_item in matching_children: - received_items_of_this_type = items_received.get(child_item, []) - for item in received_items_of_this_type: - filter_match_count += len(received_items_of_this_type) - (ColouredMessage(' * ').item(item.item, self.ctx.slot, flags=item.flags) - (" from ").location(item.location, item.player) - (" by ").player(item.player) - ).send(self.ctx) - - non_matching_children = len(received_child_items) - len(matching_children) - if non_matching_children > 0: - self.formatted_print(f" + {non_matching_children} child items that don't match the filter") - if filter_search == "": - self.formatted_print(f"[b]Obtained: {len(self.ctx.items_received)} items[/b]") - else: - self.formatted_print(f"[b]Filter \"{filter_search}\" found {filter_match_count} out of {len(self.ctx.items_received)} obtained items[/b]") - return True - - def _cmd_option(self, option_name: str = "", option_value: str = "") -> None: - """Sets a Starcraft game option that can be changed after generation. Use "/option list" to see all options.""" - - LOGIC_WARNING = f" *Note changing this may result in logically unbeatable games*\n" - - options = ( - ConfigurableOptionInfo('kerrigan_presence', 'kerrigan_presence', Options.KerriganPresence, can_break_logic=True), - ConfigurableOptionInfo('soa_presence', 'spear_of_adun_presence', Options.SpearOfAdunPresence, can_break_logic=True), - ConfigurableOptionInfo('soa_in_nobuilds', 'spear_of_adun_present_in_no_build', Options.SpearOfAdunPresentInNoBuild, can_break_logic=True), - ConfigurableOptionInfo('control_ally', 'take_over_ai_allies', Options.TakeOverAIAllies, can_break_logic=True), - ConfigurableOptionInfo('minerals_per_item', 'minerals_per_item', Options.MineralsPerItem, ConfigurableOptionType.INTEGER), - ConfigurableOptionInfo('gas_per_item', 'vespene_per_item', Options.VespenePerItem, ConfigurableOptionType.INTEGER), - ConfigurableOptionInfo('supply_per_item', 'starting_supply_per_item', Options.StartingSupplyPerItem, ConfigurableOptionType.INTEGER), - ConfigurableOptionInfo('no_forced_camera', 'disable_forced_camera', Options.DisableForcedCamera), - ConfigurableOptionInfo('skip_cutscenes', 'skip_cutscenes', Options.SkipCutscenes), - ) - - WARNING_COLOUR = "salmon" - CMD_COLOUR = "slateblue" - boolean_option_map = { - 'y': 'true', 'yes': 'true', 'n': 'false', 'no': 'false', - } - - help_message = ColouredMessage(inspect.cleandoc(""" - Options - -------------------- - """))('\n') - for option in options: - option_help_text = inspect.cleandoc(option.option_class.__doc__ or "No description provided.").split('\n', 1)[0] - help_message.coloured(option.name, CMD_COLOUR)(": " + " | ".join(option.option_class.options) - + f" -- {option_help_text}\n") - if option.can_break_logic: - help_message.coloured(LOGIC_WARNING, WARNING_COLOUR) - help_message("--------------------\nEnter an option without arguments to see its current value.\n") - - if not option_name or option_name == 'list' or option_name == 'help': - help_message.send(self.ctx) - return - for option in options: - if option_name == option.name: - option_value = boolean_option_map.get(option_value, option_value) - if not option_value: - pass - elif option.option_type == ConfigurableOptionType.ENUM and option_value in option.option_class.options: - self.ctx.__dict__[option.variable_name] = option.option_class.options[option_value] - elif option.option_type == ConfigurableOptionType.INTEGER: - try: - self.ctx.__dict__[option.variable_name] = int(option_value, base=0) - except: - self.output(f"{option_value} is not a valid integer") - else: - self.output(f"Unknown option value '{option_value}'") - ColouredMessage(f"{option.name} is '{option.option_class.get_option_name(self.ctx.__dict__[option.variable_name])}'").send(self.ctx) - break - else: - self.output(f"Unknown option '{option_name}'") - help_message.send(self.ctx) - - def _cmd_color(self, faction: str = "", color: str = "") -> None: - """Changes the player color for a given faction.""" - player_colors = [ - "White", "Red", "Blue", "Teal", - "Purple", "Yellow", "Orange", "Green", - "LightPink", "Violet", "LightGrey", "DarkGreen", - "Brown", "LightGreen", "DarkGrey", "Pink", - "Rainbow", "Random", "Default" - ] - var_names = { - 'raynor': 'player_color_raynor', - 'kerrigan': 'player_color_zerg', - 'primal': 'player_color_zerg_primal', - 'protoss': 'player_color_protoss', - 'nova': 'player_color_nova', - } - faction = faction.lower() - if not faction: - for faction_name, key in var_names.items(): - self.output(f"Current player color for {faction_name}: {player_colors[self.ctx.__dict__[key]]}") - self.output("To change your color, add the faction name and color after the command.") - self.output("Available factions: " + ', '.join(var_names)) - self.output("Available colors: " + ', '.join(player_colors)) - return - elif faction not in var_names: - self.output(f"Unknown faction '{faction}'.") - self.output("Available factions: " + ', '.join(var_names)) - return - match_colors = [player_color.lower() for player_color in player_colors] - if not color: - self.output(f"Current player color for {faction}: {player_colors[self.ctx.__dict__[var_names[faction]]]}") - self.output("To change this faction's colors, add the name of the color after the command.") - self.output("Available colors: " + ', '.join(player_colors)) - else: - if color.lower() not in match_colors: - self.output(color + " is not a valid color. Available colors: " + ', '.join(player_colors)) - return - if color.lower() == "random": - color = random.choice(player_colors[:16]) - self.ctx.__dict__[var_names[faction]] = match_colors.index(color.lower()) - self.ctx.pending_color_update = True - self.output(f"Color for {faction} set to " + player_colors[self.ctx.__dict__[var_names[faction]]]) - - def _cmd_disable_mission_check(self) -> bool: - """Disables the check to see if a mission is available to play. Meant for co-op runs where one player can play - the next mission in a chain the other player is doing.""" - self.ctx.missions_unlocked = True - sc2_logger.info("Mission check has been disabled") - return True - - def _cmd_play(self, mission_id: str = "") -> bool: - """Start a Starcraft 2 mission""" - - options = mission_id.split() - num_options = len(options) - - if num_options > 0: - mission_number = int(options[0]) - - self.ctx.play_mission(mission_number) - - else: - sc2_logger.info( - "Mission ID needs to be specified. Use /unfinished or /available to view ids for available missions.") - return False - - return True - - def _cmd_available(self) -> bool: - """Get what missions are currently available to play""" - - request_available_missions(self.ctx) - return True - - def _cmd_unfinished(self) -> bool: - """Get what missions are currently available to play and have not had all locations checked""" - - request_unfinished_missions(self.ctx) - return True - - @mark_raw - def _cmd_set_path(self, path: str = '') -> bool: - """Manually set the SC2 install directory (if the automatic detection fails).""" - if path: - os.environ["SC2PATH"] = path - is_mod_installed_correctly() - return True - else: - sc2_logger.warning("When using set_path, you must type the path to your SC2 install directory.") - return False - - def _cmd_download_data(self) -> bool: - """Download the most recent release of the necessary files for playing SC2 with - Archipelago. Will overwrite existing files.""" - pool.submit(self._download_data) - return True - - @staticmethod - def _download_data() -> bool: - if "SC2PATH" not in os.environ: - check_game_install_path() - - if os.path.exists(get_metadata_file()): - with open(get_metadata_file(), "r") as f: - metadata = f.read() - else: - metadata = None - - tempzip, metadata = download_latest_release_zip( - DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, metadata=metadata, force_download=True) - - if tempzip: - try: - zipfile.ZipFile(tempzip).extractall(path=os.environ["SC2PATH"]) - sc2_logger.info(f"Download complete. Package installed.") - if metadata is not None: - with open(get_metadata_file(), "w") as f: - f.write(metadata) - finally: - os.remove(tempzip) - else: - sc2_logger.warning("Download aborted/failed. Read the log for more information.") - return False - return True - - -class SC2JSONtoTextParser(JSONtoTextParser): - def __init__(self, ctx) -> None: - self.handlers = { - "ItemSend": self._handle_color, - "ItemCheat": self._handle_color, - "Hint": self._handle_color, - } - super().__init__(ctx) - - def _handle_color(self, node: JSONMessagePart) -> str: - codes = node["color"].split(";") - buffer = "".join(self.color_code(code) for code in codes if code in self.color_codes) - return buffer + self._handle_text(node) + '' - - def color_code(self, code: str) -> str: - return '' - - -class SC2Context(CommonContext): - command_processor = StarcraftClientProcessor - game = STARCRAFT2 - items_handling = 0b111 - - def __init__(self, *args, **kwargs) -> None: - super(SC2Context, self).__init__(*args, **kwargs) - self.raw_text_parser = SC2JSONtoTextParser(self) - - self.difficulty = -1 - self.game_speed = -1 - self.disable_forced_camera = 0 - self.skip_cutscenes = 0 - self.all_in_choice = 0 - self.mission_order = 0 - self.player_color_raynor = ColorChoice.option_blue - self.player_color_zerg = ColorChoice.option_orange - self.player_color_zerg_primal = ColorChoice.option_purple - self.player_color_protoss = ColorChoice.option_blue - self.player_color_nova = ColorChoice.option_dark_grey - self.pending_color_update = False - self.kerrigan_presence = 0 - self.kerrigan_primal_status = 0 - self.levels_per_check = 0 - self.checks_per_level = 1 - self.mission_req_table: typing.Dict[SC2Campaign, typing.Dict[str, MissionInfo]] = {} - self.final_mission: int = 29 - self.announcements: queue.Queue = queue.Queue() - self.sc2_run_task: typing.Optional[asyncio.Task] = None - self.missions_unlocked: bool = False # allow launching missions ignoring requirements - self.generic_upgrade_missions = 0 - self.generic_upgrade_research = 0 - self.generic_upgrade_items = 0 - self.location_inclusions: typing.Dict[LocationType, int] = {} - self.plando_locations: typing.List[str] = [] - self.current_tooltip = None - self.last_loc_list = None - self.difficulty_override = -1 - self.game_speed_override = -1 - self.mission_id_to_location_ids: typing.Dict[int, typing.List[int]] = {} - self.last_bot: typing.Optional[ArchipelagoBot] = None - self.slot_data_version = 2 - self.grant_story_tech = 0 - self.required_tactics = RequiredTactics.option_standard - self.take_over_ai_allies = TakeOverAIAllies.option_false - self.spear_of_adun_presence = SpearOfAdunPresence.option_not_present - self.spear_of_adun_present_in_no_build = SpearOfAdunPresentInNoBuild.option_false - self.spear_of_adun_autonomously_cast_ability_presence = SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present - self.spear_of_adun_autonomously_cast_present_in_no_build = SpearOfAdunAutonomouslyCastPresentInNoBuild.option_false - self.minerals_per_item = 15 - self.vespene_per_item = 15 - self.starting_supply_per_item = 2 - self.nova_covert_ops_only = False - self.kerrigan_levels_per_mission_completed = 0 - - async def server_auth(self, password_requested: bool = False) -> None: - self.game = STARCRAFT2 - if password_requested and not self.password: - await super(SC2Context, self).server_auth(password_requested) - await self.get_username() - await self.send_connect() - if self.ui: - self.ui.first_check = True - - def is_legacy_game(self): - return self.game == STARCRAFT2_WOL - - def event_invalid_game(self): - if self.is_legacy_game(): - self.game = STARCRAFT2 - super().event_invalid_game() - else: - self.game = STARCRAFT2_WOL - async_start(self.send_connect()) - - def on_package(self, cmd: str, args: dict) -> None: - if cmd == "Connected": - self.difficulty = args["slot_data"]["game_difficulty"] - self.game_speed = args["slot_data"].get("game_speed", GameSpeed.option_default) - self.disable_forced_camera = args["slot_data"].get("disable_forced_camera", DisableForcedCamera.default) - self.skip_cutscenes = args["slot_data"].get("skip_cutscenes", SkipCutscenes.default) - self.all_in_choice = args["slot_data"]["all_in_map"] - self.slot_data_version = args["slot_data"].get("version", 2) - slot_req_table: dict = args["slot_data"]["mission_req"] - - first_item = list(slot_req_table.keys())[0] - # Maintaining backwards compatibility with older slot data - if first_item in [str(campaign.id) for campaign in SC2Campaign]: - # Multi-campaign - self.mission_req_table = {} - for campaign_id in slot_req_table: - campaign = lookup_id_to_campaign[int(campaign_id)] - self.mission_req_table[campaign] = { - mission: self.parse_mission_info(mission_info) - for mission, mission_info in slot_req_table[campaign_id].items() - } - else: - # Old format - self.mission_req_table = {SC2Campaign.GLOBAL: { - mission: self.parse_mission_info(mission_info) - for mission, mission_info in slot_req_table.items() - } - } - - self.mission_order = args["slot_data"].get("mission_order", MissionOrder.option_vanilla) - self.final_mission = args["slot_data"].get("final_mission", SC2Mission.ALL_IN.id) - self.player_color_raynor = args["slot_data"].get("player_color_terran_raynor", ColorChoice.option_blue) - self.player_color_zerg = args["slot_data"].get("player_color_zerg", ColorChoice.option_orange) - self.player_color_zerg_primal = args["slot_data"].get("player_color_zerg_primal", ColorChoice.option_purple) - self.player_color_protoss = args["slot_data"].get("player_color_protoss", ColorChoice.option_blue) - self.player_color_nova = args["slot_data"].get("player_color_nova", ColorChoice.option_dark_grey) - self.generic_upgrade_missions = args["slot_data"].get("generic_upgrade_missions", GenericUpgradeMissions.default) - self.generic_upgrade_items = args["slot_data"].get("generic_upgrade_items", GenericUpgradeItems.option_individual_items) - self.generic_upgrade_research = args["slot_data"].get("generic_upgrade_research", GenericUpgradeResearch.option_vanilla) - self.kerrigan_presence = args["slot_data"].get("kerrigan_presence", KerriganPresence.option_vanilla) - self.kerrigan_primal_status = args["slot_data"].get("kerrigan_primal_status", KerriganPrimalStatus.option_vanilla) - self.kerrigan_levels_per_mission_completed = args["slot_data"].get("kerrigan_levels_per_mission_completed", 0) - self.kerrigan_levels_per_mission_completed_cap = args["slot_data"].get("kerrigan_levels_per_mission_completed_cap", -1) - self.kerrigan_total_level_cap = args["slot_data"].get("kerrigan_total_level_cap", -1) - self.grant_story_tech = args["slot_data"].get("grant_story_tech", GrantStoryTech.option_false) - self.grant_story_levels = args["slot_data"].get("grant_story_levels", GrantStoryLevels.option_additive) - self.required_tactics = args["slot_data"].get("required_tactics", RequiredTactics.option_standard) - self.take_over_ai_allies = args["slot_data"].get("take_over_ai_allies", TakeOverAIAllies.option_false) - self.spear_of_adun_presence = args["slot_data"].get("spear_of_adun_presence", SpearOfAdunPresence.option_not_present) - self.spear_of_adun_present_in_no_build = args["slot_data"].get("spear_of_adun_present_in_no_build", SpearOfAdunPresentInNoBuild.option_false) - self.spear_of_adun_autonomously_cast_ability_presence = args["slot_data"].get("spear_of_adun_autonomously_cast_ability_presence", SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present) - self.spear_of_adun_autonomously_cast_present_in_no_build = args["slot_data"].get("spear_of_adun_autonomously_cast_present_in_no_build", SpearOfAdunAutonomouslyCastPresentInNoBuild.option_false) - self.minerals_per_item = args["slot_data"].get("minerals_per_item", 15) - self.vespene_per_item = args["slot_data"].get("vespene_per_item", 15) - self.starting_supply_per_item = args["slot_data"].get("starting_supply_per_item", 2) - self.nova_covert_ops_only = args["slot_data"].get("nova_covert_ops_only", False) - - if self.required_tactics == RequiredTactics.option_no_logic: - # Locking Grant Story Tech/Levels if no logic - self.grant_story_tech = GrantStoryTech.option_true - self.grant_story_levels = GrantStoryLevels.option_minimum - - self.location_inclusions = { - LocationType.VICTORY: LocationInclusion.option_enabled, # Victory checks are always enabled - LocationType.VANILLA: args["slot_data"].get("vanilla_locations", VanillaLocations.default), - LocationType.EXTRA: args["slot_data"].get("extra_locations", ExtraLocations.default), - LocationType.CHALLENGE: args["slot_data"].get("challenge_locations", ChallengeLocations.default), - LocationType.MASTERY: args["slot_data"].get("mastery_locations", MasteryLocations.default), - } - self.plando_locations = args["slot_data"].get("plando_locations", []) - - self.build_location_to_mission_mapping() - - # Looks for the required maps and mods for SC2. Runs check_game_install_path. - maps_present = is_mod_installed_correctly() - if os.path.exists(get_metadata_file()): - with open(get_metadata_file(), "r") as f: - current_ver = f.read() - sc2_logger.debug(f"Current version: {current_ver}") - if is_mod_update_available(DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, current_ver): - sc2_logger.info("NOTICE: Update for required files found. Run /download_data to install.") - elif maps_present: - sc2_logger.warning("NOTICE: Your map files may be outdated (version number not found). " - "Run /download_data to update them.") - - @staticmethod - def parse_mission_info(mission_info: dict[str, typing.Any]) -> MissionInfo: - if mission_info.get("id") is not None: - mission_info["mission"] = lookup_id_to_mission[mission_info["id"]] - elif isinstance(mission_info["mission"], int): - mission_info["mission"] = lookup_id_to_mission[mission_info["mission"]] - - return MissionInfo( - **{field: value for field, value in mission_info.items() if field in MissionInfo._fields} - ) - - def find_campaign(self, mission_name: str) -> SC2Campaign: - data = self.mission_req_table - for campaign in data.keys(): - if mission_name in data[campaign].keys(): - return campaign - sc2_logger.info(f"Attempted to find campaign of unknown mission '{mission_name}'; defaulting to GLOBAL") - return SC2Campaign.GLOBAL - - - - def on_print_json(self, args: dict) -> None: - # goes to this world - if "receiving" in args and self.slot_concerns_self(args["receiving"]): - relevant = True - # found in this world - elif "item" in args and self.slot_concerns_self(args["item"].player): - relevant = True - # not related - else: - relevant = False - - if relevant: - self.announcements.put(self.raw_text_parser(copy.deepcopy(args["data"]))) - - super(SC2Context, self).on_print_json(args) - - def run_gui(self) -> None: - from .ClientGui import start_gui - start_gui(self) - - - async def shutdown(self) -> None: - await super(SC2Context, self).shutdown() - if self.last_bot: - self.last_bot.want_close = True - if self.sc2_run_task: - self.sc2_run_task.cancel() - - def play_mission(self, mission_id: int) -> bool: - if self.missions_unlocked or is_mission_available(self, mission_id): - if self.sc2_run_task: - if not self.sc2_run_task.done(): - sc2_logger.warning("Starcraft 2 Client is still running!") - self.sc2_run_task.cancel() # doesn't actually close the game, just stops the python task - if self.slot is None: - sc2_logger.warning("Launching Mission without Archipelago authentication, " - "checks will not be registered to server.") - self.sc2_run_task = asyncio.create_task(starcraft_launch(self, mission_id), - name="Starcraft 2 Launch") - return True - else: - sc2_logger.info( - f"{lookup_id_to_mission[mission_id].mission_name} is not currently unlocked. " - f"Use /unfinished or /available to see what is available.") - return False - - def build_location_to_mission_mapping(self) -> None: - mission_id_to_location_ids: typing.Dict[int, typing.Set[int]] = { - mission_info.mission.id: set() for campaign_mission in self.mission_req_table.values() for mission_info in campaign_mission.values() - } - - for loc in self.server_locations: - offset = SC2WOL_LOC_ID_OFFSET if loc < SC2HOTS_LOC_ID_OFFSET \ - else (SC2HOTS_LOC_ID_OFFSET - SC2Mission.ALL_IN.id * VICTORY_MODULO) - mission_id, objective = divmod(loc - offset, VICTORY_MODULO) - mission_id_to_location_ids[mission_id].add(objective) - self.mission_id_to_location_ids = {mission_id: sorted(objectives) for mission_id, objectives in - mission_id_to_location_ids.items()} - - def locations_for_mission(self, mission_name: str): - mission = lookup_name_to_mission[mission_name] - mission_id: int = mission.id - objectives = self.mission_id_to_location_ids[mission_id] - for objective in objectives: - yield get_location_offset(mission_id) + mission_id * VICTORY_MODULO + objective - - -class CompatItemHolder(typing.NamedTuple): - name: str - quantity: int = 1 - - -async def main(): - multiprocessing.freeze_support() - parser = get_base_parser() - parser.add_argument('--name', default=None, help="Slot Name to connect as.") - args = parser.parse_args() - - ctx = SC2Context(args.connect, args.password) - ctx.auth = args.name - if ctx.server_task is None: - ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop") - - if gui_enabled: - ctx.run_gui() - ctx.run_cli() - - await ctx.exit_event.wait() - - await ctx.shutdown() - -# These items must be given to the player if the game is generated on version 2 -API2_TO_API3_COMPAT_ITEMS: typing.Set[CompatItemHolder] = { - CompatItemHolder(ItemNames.PHOTON_CANNON), - CompatItemHolder(ItemNames.OBSERVER), - CompatItemHolder(ItemNames.WARP_HARMONIZATION), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_GROUND_WEAPON, 3), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_GROUND_ARMOR, 3), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_SHIELDS, 3), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_AIR_WEAPON, 3), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_AIR_ARMOR, 3), - CompatItemHolder(ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, 3) -} - - -def compat_item_to_network_items(compat_item: CompatItemHolder) -> typing.List[NetworkItem]: - item_id = get_full_item_list()[compat_item.name].code - network_item = NetworkItem(item_id, 0, 0, 0) - return compat_item.quantity * [network_item] - - -def calculate_items(ctx: SC2Context) -> typing.Dict[SC2Race, typing.List[int]]: - items = ctx.items_received.copy() - # Items unlocked in API2 by default (Prophecy default items) - if ctx.slot_data_version < 3: - for compat_item in API2_TO_API3_COMPAT_ITEMS: - items.extend(compat_item_to_network_items(compat_item)) - - network_item: NetworkItem - accumulators: typing.Dict[SC2Race, typing.List[int]] = {race: [0 for _ in type_flaggroups[race]] for race in SC2Race} - - # Protoss Shield grouped item specific logic - shields_from_ground_upgrade: int = 0 - shields_from_air_upgrade: int = 0 - - item_list = get_full_item_list() - for network_item in items: - name: str = lookup_id_to_name[network_item.item] - item_data: ItemData = item_list[name] - - # exists exactly once - if item_data.quantity == 1: - accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] |= 1 << item_data.number - - # exists multiple times - elif item_data.type in ["Upgrade", "Progressive Upgrade","Progressive Upgrade 2"]: - flaggroup = type_flaggroups[item_data.race][item_data.type] - - # Generic upgrades apply only to Weapon / Armor upgrades - if item_data.type != "Upgrade" or ctx.generic_upgrade_items == 0: - accumulators[item_data.race][flaggroup] += 1 << item_data.number - else: - if name == ItemNames.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: - shields_from_ground_upgrade += 1 - if name == ItemNames.PROGRESSIVE_PROTOSS_AIR_UPGRADE: - shields_from_air_upgrade += 1 - for bundled_number in upgrade_numbers[item_data.number]: - accumulators[item_data.race][flaggroup] += 1 << bundled_number - - # Regen bio-steel nerf with API3 - undo for older games - if ctx.slot_data_version < 3 and name == ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL: - current_level = (accumulators[item_data.race][flaggroup] >> item_data.number) % 4 - if current_level == 2: - # Switch from level 2 to level 3 for compatibility - accumulators[item_data.race][flaggroup] += 1 << item_data.number - # sum - else: - if name == ItemNames.STARTING_MINERALS: - accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += ctx.minerals_per_item - elif name == ItemNames.STARTING_VESPENE: - accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += ctx.vespene_per_item - elif name == ItemNames.STARTING_SUPPLY: - accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += ctx.starting_supply_per_item - else: - accumulators[item_data.race][type_flaggroups[item_data.race][item_data.type]] += item_data.number - - # Fix Shields from generic upgrades by unit class (Maximum of ground/air upgrades) - if shields_from_ground_upgrade > 0 or shields_from_air_upgrade > 0: - shield_upgrade_level = max(shields_from_ground_upgrade, shields_from_air_upgrade) - shield_upgrade_item = item_list[ItemNames.PROGRESSIVE_PROTOSS_SHIELDS] - for _ in range(0, shield_upgrade_level): - accumulators[shield_upgrade_item.race][type_flaggroups[shield_upgrade_item.race][shield_upgrade_item.type]] += 1 << shield_upgrade_item.number - - # Kerrigan levels per check - accumulators[SC2Race.ZERG][type_flaggroups[SC2Race.ZERG]["Level"]] += (len(ctx.checked_locations) // ctx.checks_per_level) * ctx.levels_per_check - - # Upgrades from completed missions - if ctx.generic_upgrade_missions > 0: - total_missions = sum(len(ctx.mission_req_table[campaign]) for campaign in ctx.mission_req_table) - for race in SC2Race: - if "Upgrade" not in type_flaggroups[race]: - continue - upgrade_flaggroup = type_flaggroups[race]["Upgrade"] - num_missions = ctx.generic_upgrade_missions * total_missions - amounts = [ - num_missions // 100, - 2 * num_missions // 100, - 3 * num_missions // 100 - ] - upgrade_count = 0 - completed = len([id for id in ctx.mission_id_to_location_ids if get_location_offset(id) + VICTORY_MODULO * id in ctx.checked_locations]) - for amount in amounts: - if completed >= amount: - upgrade_count += 1 - # Equivalent to "Progressive Weapon/Armor Upgrade" item - for bundled_number in upgrade_numbers[upgrade_numbers_all[race]]: - accumulators[race][upgrade_flaggroup] += upgrade_count << bundled_number - - return accumulators - - -def calc_difficulty(difficulty: int): - if difficulty == 0: - return 'C' - elif difficulty == 1: - return 'N' - elif difficulty == 2: - return 'H' - elif difficulty == 3: - return 'B' - - return 'X' - - -def get_kerrigan_level(ctx: SC2Context, items: typing.Dict[SC2Race, typing.List[int]], missions_beaten: int) -> int: - item_value = items[SC2Race.ZERG][type_flaggroups[SC2Race.ZERG]["Level"]] - mission_value = missions_beaten * ctx.kerrigan_levels_per_mission_completed - if ctx.kerrigan_levels_per_mission_completed_cap != -1: - mission_value = min(mission_value, ctx.kerrigan_levels_per_mission_completed_cap) - total_value = item_value + mission_value - if ctx.kerrigan_total_level_cap != -1: - total_value = min(total_value, ctx.kerrigan_total_level_cap) - return total_value - - -def calculate_kerrigan_options(ctx: SC2Context) -> int: - options = 0 - - # Bits 0, 1 - # Kerrigan unit available - if ctx.kerrigan_presence in kerrigan_unit_available: - options |= 1 << 0 - - # Bit 2 - # Kerrigan primal status by map - if ctx.kerrigan_primal_status == KerriganPrimalStatus.option_vanilla: - options |= 1 << 2 - - return options - - -def caclulate_soa_options(ctx: SC2Context) -> int: - options = 0 - - # Bits 0, 1 - # SoA Calldowns available - soa_presence_value = 0 - if ctx.spear_of_adun_presence == SpearOfAdunPresence.option_not_present: - soa_presence_value = 0 - elif ctx.spear_of_adun_presence == SpearOfAdunPresence.option_lotv_protoss: - soa_presence_value = 1 - elif ctx.spear_of_adun_presence == SpearOfAdunPresence.option_protoss: - soa_presence_value = 2 - elif ctx.spear_of_adun_presence == SpearOfAdunPresence.option_everywhere: - soa_presence_value = 3 - options |= soa_presence_value << 0 - - # Bit 2 - # SoA Calldowns for no-builds - if ctx.spear_of_adun_present_in_no_build == SpearOfAdunPresentInNoBuild.option_true: - options |= 1 << 2 - - # Bits 3,4 - # Autocasts - soa_autocasts_presence_value = 0 - if ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present: - soa_autocasts_presence_value = 0 - elif ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_lotv_protoss: - soa_autocasts_presence_value = 1 - elif ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_protoss: - soa_autocasts_presence_value = 2 - elif ctx.spear_of_adun_autonomously_cast_ability_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_everywhere: - soa_autocasts_presence_value = 3 - options |= soa_autocasts_presence_value << 3 - - # Bit 5 - # Autocasts in no-builds - if ctx.spear_of_adun_autonomously_cast_present_in_no_build == SpearOfAdunAutonomouslyCastPresentInNoBuild.option_true: - options |= 1 << 5 - - return options - -def kerrigan_primal(ctx: SC2Context, kerrigan_level: int) -> bool: - if ctx.kerrigan_primal_status == KerriganPrimalStatus.option_always_zerg: - return True - elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_always_human: - return False - elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_level_35: - return kerrigan_level >= 35 - elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_half_completion: - total_missions = len(ctx.mission_id_to_location_ids) - completed = sum((mission_id * VICTORY_MODULO + get_location_offset(mission_id)) in ctx.checked_locations - for mission_id in ctx.mission_id_to_location_ids) - return completed >= (total_missions / 2) - elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_item: - codes = [item.item for item in ctx.items_received] - return get_full_item_list()[ItemNames.KERRIGAN_PRIMAL_FORM].code in codes - return False - -async def starcraft_launch(ctx: SC2Context, mission_id: int): - sc2_logger.info(f"Launching {lookup_id_to_mission[mission_id].mission_name}. If game does not launch check log file for errors.") - - with DllDirectory(None): - run_game(bot.maps.get(lookup_id_to_mission[mission_id].map_file), [Bot(Race.Terran, ArchipelagoBot(ctx, mission_id), - name="Archipelago", fullscreen=True)], realtime=True) - - -class ArchipelagoBot(bot.bot_ai.BotAI): - __slots__ = [ - 'game_running', - 'mission_completed', - 'boni', - 'setup_done', - 'ctx', - 'mission_id', - 'want_close', - 'can_read_game', - 'last_received_update', - ] - - def __init__(self, ctx: SC2Context, mission_id: int): - self.game_running = False - self.mission_completed = False - self.want_close = False - self.can_read_game = False - self.last_received_update: int = 0 - self.setup_done = False - self.ctx = ctx - self.ctx.last_bot = self - self.mission_id = mission_id - self.boni = [False for _ in range(MAX_BONUS)] - - super(ArchipelagoBot, self).__init__() - - async def on_step(self, iteration: int): - if self.want_close: - self.want_close = False - await self._client.leave() - return - game_state = 0 - if not self.setup_done: - self.setup_done = True - start_items = calculate_items(self.ctx) - missions_beaten = self.missions_beaten_count() - kerrigan_level = get_kerrigan_level(self.ctx, start_items, missions_beaten) - kerrigan_options = calculate_kerrigan_options(self.ctx) - soa_options = caclulate_soa_options(self.ctx) - if self.ctx.difficulty_override >= 0: - difficulty = calc_difficulty(self.ctx.difficulty_override) - else: - difficulty = calc_difficulty(self.ctx.difficulty) - if self.ctx.game_speed_override >= 0: - game_speed = self.ctx.game_speed_override - else: - game_speed = self.ctx.game_speed - await self.chat_send("?SetOptions {} {} {} {} {} {} {} {} {} {} {} {} {}".format( - difficulty, - self.ctx.generic_upgrade_research, - self.ctx.all_in_choice, - game_speed, - self.ctx.disable_forced_camera, - self.ctx.skip_cutscenes, - kerrigan_options, - self.ctx.grant_story_tech, - self.ctx.take_over_ai_allies, - soa_options, - self.ctx.mission_order, - 1 if self.ctx.nova_covert_ops_only else 0, - self.ctx.grant_story_levels - )) - await self.chat_send("?GiveResources {} {} {}".format( - start_items[SC2Race.ANY][0], - start_items[SC2Race.ANY][1], - start_items[SC2Race.ANY][2] - )) - await self.updateTerranTech(start_items) - await self.updateZergTech(start_items, kerrigan_level) - await self.updateProtossTech(start_items) - await self.updateColors() - await self.chat_send("?LoadFinished") - self.last_received_update = len(self.ctx.items_received) - - else: - if self.ctx.pending_color_update: - await self.updateColors() - - if not self.ctx.announcements.empty(): - message = self.ctx.announcements.get(timeout=1) - await self.chat_send("?SendMessage " + message) - self.ctx.announcements.task_done() - - # Archipelago reads the health - controller1_state = 0 - controller2_state = 0 - for unit in self.all_own_units(): - if unit.health_max == CONTROLLER_HEALTH: - controller1_state = int(CONTROLLER_HEALTH - unit.health) - self.can_read_game = True - elif unit.health_max == CONTROLLER2_HEALTH: - controller2_state = int(CONTROLLER2_HEALTH - unit.health) - self.can_read_game = True - game_state = controller1_state + (controller2_state << 15) - - if iteration == 160 and not game_state & 1: - await self.chat_send("?SendMessage Warning: Archipelago unable to connect or has lost connection to " + - "Starcraft 2 (This is likely a map issue)") - - if self.last_received_update < len(self.ctx.items_received): - current_items = calculate_items(self.ctx) - missions_beaten = self.missions_beaten_count() - kerrigan_level = get_kerrigan_level(self.ctx, current_items, missions_beaten) - await self.updateTerranTech(current_items) - await self.updateZergTech(current_items, kerrigan_level) - await self.updateProtossTech(current_items) - self.last_received_update = len(self.ctx.items_received) - - if game_state & 1: - if not self.game_running: - print("Archipelago Connected") - self.game_running = True - - if self.can_read_game: - if game_state & (1 << 1) and not self.mission_completed: - if self.mission_id != self.ctx.final_mission: - print("Mission Completed") - await self.ctx.send_msgs( - [{"cmd": 'LocationChecks', - "locations": [get_location_offset(self.mission_id) + VICTORY_MODULO * self.mission_id]}]) - self.mission_completed = True - else: - print("Game Complete") - await self.ctx.send_msgs([{"cmd": 'StatusUpdate', "status": ClientStatus.CLIENT_GOAL}]) - self.mission_completed = True - - for x, completed in enumerate(self.boni): - if not completed and game_state & (1 << (x + 2)): - await self.ctx.send_msgs( - [{"cmd": 'LocationChecks', - "locations": [get_location_offset(self.mission_id) + VICTORY_MODULO * self.mission_id + x + 1]}]) - self.boni[x] = True - else: - await self.chat_send("?SendMessage LostConnection - Lost connection to game.") - - def missions_beaten_count(self): - return len([location for location in self.ctx.checked_locations if location % VICTORY_MODULO == 0]) - - async def updateColors(self): - await self.chat_send("?SetColor rr " + str(self.ctx.player_color_raynor)) - await self.chat_send("?SetColor ks " + str(self.ctx.player_color_zerg)) - await self.chat_send("?SetColor pz " + str(self.ctx.player_color_zerg_primal)) - await self.chat_send("?SetColor da " + str(self.ctx.player_color_protoss)) - await self.chat_send("?SetColor nova " + str(self.ctx.player_color_nova)) - self.ctx.pending_color_update = False - - async def updateTerranTech(self, current_items): - terran_items = current_items[SC2Race.TERRAN] - await self.chat_send("?GiveTerranTech {} {} {} {} {} {} {} {} {} {} {} {} {} {}".format( - terran_items[0], terran_items[1], terran_items[2], terran_items[3], terran_items[4], - terran_items[5], terran_items[6], terran_items[7], terran_items[8], terran_items[9], terran_items[10], - terran_items[11], terran_items[12], terran_items[13])) - - async def updateZergTech(self, current_items, kerrigan_level): - zerg_items = current_items[SC2Race.ZERG] - kerrigan_primal_by_items = kerrigan_primal(self.ctx, kerrigan_level) - kerrigan_primal_bot_value = 1 if kerrigan_primal_by_items else 0 - await self.chat_send("?GiveZergTech {} {} {} {} {} {} {} {} {} {} {} {}".format( - kerrigan_level, kerrigan_primal_bot_value, zerg_items[0], zerg_items[1], zerg_items[2], - zerg_items[3], zerg_items[4], zerg_items[5], zerg_items[6], zerg_items[9], zerg_items[10], zerg_items[11] - )) - - async def updateProtossTech(self, current_items): - protoss_items = current_items[SC2Race.PROTOSS] - await self.chat_send("?GiveProtossTech {} {} {} {} {} {} {} {} {} {}".format( - protoss_items[0], protoss_items[1], protoss_items[2], protoss_items[3], protoss_items[4], - protoss_items[5], protoss_items[6], protoss_items[7], protoss_items[8], protoss_items[9] - )) - - -def request_unfinished_missions(ctx: SC2Context) -> None: - if ctx.mission_req_table: - message = "Unfinished Missions: " - unlocks = initialize_blank_mission_dict(ctx.mission_req_table) - unfinished_locations: typing.Dict[SC2Mission, typing.List[str]] = {} - - _, unfinished_missions = calc_unfinished_missions(ctx, unlocks=unlocks) - - for mission in unfinished_missions: - objectives = set(ctx.locations_for_mission(mission)) - if objectives: - remaining_objectives = objectives.difference(ctx.checked_locations) - unfinished_locations[mission] = [ctx.location_names.lookup_in_game(location_id) for location_id in remaining_objectives] - else: - unfinished_locations[mission] = [] - - # Removing All-In from location pool - final_mission = lookup_id_to_mission[ctx.final_mission] - if final_mission in unfinished_missions.keys(): - message = f"Final Mission Available: {final_mission}[{ctx.final_mission}]\n" + message - if unfinished_missions[final_mission] == -1: - unfinished_missions.pop(final_mission) - - message += ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}[{ctx.mission_req_table[ctx.find_campaign(mission)][mission].mission.id}] " + - mark_up_objectives( - f"[{len(unfinished_missions[mission])}/" - f"{sum(1 for _ in ctx.locations_for_mission(mission))}]", - ctx, unfinished_locations, mission) - for mission in unfinished_missions) - - if ctx.ui: - ctx.ui.log_panels['All'].on_message_markup(message) - ctx.ui.log_panels['Starcraft2'].on_message_markup(message) - else: - sc2_logger.info(message) - else: - sc2_logger.warning("No mission table found, you are likely not connected to a server.") - - -def calc_unfinished_missions(ctx: SC2Context, unlocks: typing.Optional[typing.Dict] = None): - unfinished_missions: typing.List[str] = [] - locations_completed: typing.List[typing.Union[typing.Set[int], typing.Literal[-1]]] = [] - - if not unlocks: - unlocks = initialize_blank_mission_dict(ctx.mission_req_table) - - available_missions = calc_available_missions(ctx, unlocks) - - for name in available_missions: - objectives = set(ctx.locations_for_mission(name)) - if objectives: - objectives_completed = ctx.checked_locations & objectives - if len(objectives_completed) < len(objectives): - unfinished_missions.append(name) - locations_completed.append(objectives_completed) - - else: # infer that this is the final mission as it has no objectives - unfinished_missions.append(name) - locations_completed.append(-1) - - return available_missions, dict(zip(unfinished_missions, locations_completed)) - - -def is_mission_available(ctx: SC2Context, mission_id_to_check: int) -> bool: - unfinished_missions = calc_available_missions(ctx) - - return any(mission_id_to_check == ctx.mission_req_table[ctx.find_campaign(mission)][mission].mission.id for mission in unfinished_missions) - - -def mark_up_mission_name(ctx: SC2Context, mission_name: str, unlock_table: typing.Dict) -> str: - """Checks if the mission is required for game completion and adds '*' to the name to mark that.""" - - campaign = ctx.find_campaign(mission_name) - mission_info = ctx.mission_req_table[campaign][mission_name] - if mission_info.completion_critical: - if ctx.ui: - message = "[color=AF99EF]" + mission_name + "[/color]" - else: - message = "*" + mission_name + "*" - else: - message = mission_name - - if ctx.ui: - campaign_missions = list(ctx.mission_req_table[campaign].keys()) - unlocks: typing.List[str] - index = campaign_missions.index(mission_name) - if index in unlock_table[campaign]: - unlocks = unlock_table[campaign][index] - else: - unlocks = [] - - if len(unlocks) > 0: - pre_message = f"[ref={mission_info.mission.id}|Unlocks: " - pre_message += ", ".join(f"{unlock}({ctx.mission_req_table[ctx.find_campaign(unlock)][unlock].mission.id})" for unlock in unlocks) - pre_message += f"]" - message = pre_message + message + "[/ref]" - - return message - - -def mark_up_objectives(message, ctx, unfinished_locations, mission): - formatted_message = message - - if ctx.ui: - locations = unfinished_locations[mission] - campaign = ctx.find_campaign(mission) - - pre_message = f"[ref={list(ctx.mission_req_table[campaign]).index(mission) + 30}|" - pre_message += "
".join(location for location in locations) - pre_message += f"]" - formatted_message = pre_message + message + "[/ref]" - - return formatted_message - - -def request_available_missions(ctx: SC2Context): - if ctx.mission_req_table: - message = "Available Missions: " - - # Initialize mission unlock table - unlocks = initialize_blank_mission_dict(ctx.mission_req_table) - - missions = calc_available_missions(ctx, unlocks) - message += \ - ", ".join(f"{mark_up_mission_name(ctx, mission, unlocks)}" - f"[{ctx.mission_req_table[ctx.find_campaign(mission)][mission].mission.id}]" - for mission in missions) - - if ctx.ui: - ctx.ui.log_panels['All'].on_message_markup(message) - ctx.ui.log_panels['Starcraft2'].on_message_markup(message) - else: - sc2_logger.info(message) - else: - sc2_logger.warning("No mission table found, you are likely not connected to a server.") - - -def calc_available_missions(ctx: SC2Context, unlocks: typing.Optional[dict] = None) -> typing.List[str]: - available_missions: typing.List[str] = [] - missions_complete = 0 - - # Get number of missions completed - for loc in ctx.checked_locations: - if loc % VICTORY_MODULO == 0: - missions_complete += 1 - - for campaign in ctx.mission_req_table: - # Go through the required missions for each mission and fill up unlock table used later for hover-over tooltips - for mission_name in ctx.mission_req_table[campaign]: - if unlocks: - for unlock in ctx.mission_req_table[campaign][mission_name].required_world: - parsed_unlock = parse_unlock(unlock) - # TODO prophecy-only wants to connect to WoL here - index = parsed_unlock.connect_to - 1 - unlock_mission = list(ctx.mission_req_table[parsed_unlock.campaign])[index] - unlock_campaign = ctx.find_campaign(unlock_mission) - if unlock_campaign in unlocks: - if index not in unlocks[unlock_campaign]: - unlocks[unlock_campaign][index] = list() - unlocks[unlock_campaign][index].append(mission_name) - - if mission_reqs_completed(ctx, mission_name, missions_complete): - available_missions.append(mission_name) - - return available_missions - - -def parse_unlock(unlock: typing.Union[typing.Dict[typing.Literal["connect_to", "campaign"], int], MissionConnection, int]) -> MissionConnection: - if isinstance(unlock, int): - # Legacy - return MissionConnection(unlock) - elif isinstance(unlock, MissionConnection): - return unlock - else: - # Multi-campaign - return MissionConnection(unlock["connect_to"], lookup_id_to_campaign[unlock["campaign"]]) - - -def mission_reqs_completed(ctx: SC2Context, mission_name: str, missions_complete: int) -> bool: - """Returns a bool signifying if the mission has all requirements complete and can be done - - Arguments: - ctx -- instance of SC2Context - locations_to_check -- the mission string name to check - missions_complete -- an int of how many missions have been completed - mission_path -- a list of missions that have already been checked - """ - campaign = ctx.find_campaign(mission_name) - - if len(ctx.mission_req_table[campaign][mission_name].required_world) >= 1: - # A check for when the requirements are being or'd - or_success = False - - # Loop through required missions - for req_mission in ctx.mission_req_table[campaign][mission_name].required_world: - req_success = True - parsed_req_mission = parse_unlock(req_mission) - - # Check if required mission has been completed - mission_id = ctx.mission_req_table[parsed_req_mission.campaign][ - list(ctx.mission_req_table[parsed_req_mission.campaign])[parsed_req_mission.connect_to - 1]].mission.id - if not (mission_id * VICTORY_MODULO + get_location_offset(mission_id)) in ctx.checked_locations: - if not ctx.mission_req_table[campaign][mission_name].or_requirements: - return False - else: - req_success = False - - # Grid-specific logic (to avoid long path checks and infinite recursion) - if ctx.mission_order in (MissionOrder.option_grid, MissionOrder.option_mini_grid, MissionOrder.option_medium_grid): - if req_success: - return True - else: - if parsed_req_mission == ctx.mission_req_table[campaign][mission_name].required_world[-1]: - return False - else: - continue - - # Recursively check required mission to see if it's requirements are met, in case !collect has been done - # Skipping recursive check on Grid settings to speed up checks and avoid infinite recursion - if not mission_reqs_completed(ctx, list(ctx.mission_req_table[parsed_req_mission.campaign])[parsed_req_mission.connect_to - 1], missions_complete): - if not ctx.mission_req_table[campaign][mission_name].or_requirements: - return False - else: - req_success = False - - # If requirement check succeeded mark or as satisfied - if ctx.mission_req_table[campaign][mission_name].or_requirements and req_success: - or_success = True - - if ctx.mission_req_table[campaign][mission_name].or_requirements: - # Return false if or requirements not met - if not or_success: - return False - - # Check number of missions - if missions_complete >= ctx.mission_req_table[campaign][mission_name].number: - return True - else: - return False - else: - return True - - -def initialize_blank_mission_dict(location_table: typing.Dict[SC2Campaign, typing.Dict[str, MissionInfo]]): - unlocks: typing.Dict[SC2Campaign, typing.Dict] = {} - - for mission in list(location_table): - unlocks[mission] = {} - - return unlocks - - -def check_game_install_path() -> bool: - # First thing: go to the default location for ExecuteInfo. - # An exception for Windows is included because it's very difficult to find ~\Documents if the user moved it. - if is_windows: - # The next five lines of utterly inscrutable code are brought to you by copy-paste from Stack Overflow. - # https://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path/30924555# - import ctypes.wintypes - CSIDL_PERSONAL = 5 # My Documents - SHGFP_TYPE_CURRENT = 0 # Get current, not default value - - buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) - ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf) - documentspath: str = buf.value - einfo = str(documentspath / Path("StarCraft II\\ExecuteInfo.txt")) - else: - einfo = str(bot.paths.get_home() / Path(bot.paths.USERPATH[bot.paths.PF])) - - # Check if the file exists. - if os.path.isfile(einfo): - - # Open the file and read it, picking out the latest executable's path. - with open(einfo) as f: - content = f.read() - if content: - search_result = re.search(r" = (.*)Versions", content) - if not search_result: - sc2_logger.warning(f"Found {einfo}, but it was empty. Run SC2 through the Blizzard launcher, " - "then try again.") - return False - base = search_result.group(1) - - if os.path.exists(base): - executable = bot.paths.latest_executeble(Path(base).expanduser() / "Versions") - - # Finally, check the path for an actual executable. - # If we find one, great. Set up the SC2PATH. - if os.path.isfile(executable): - sc2_logger.info(f"Found an SC2 install at {base}!") - sc2_logger.debug(f"Latest executable at {executable}.") - os.environ["SC2PATH"] = base - sc2_logger.debug(f"SC2PATH set to {base}.") - return True - else: - sc2_logger.warning(f"We may have found an SC2 install at {base}, but couldn't find {executable}.") - else: - sc2_logger.warning(f"{einfo} pointed to {base}, but we could not find an SC2 install there.") - else: - sc2_logger.warning(f"Couldn't find {einfo}. Run SC2 through the Blizzard launcher, then try again. " - f"If that fails, please run /set_path with your SC2 install directory.") - return False - - -def is_mod_installed_correctly() -> bool: - """Searches for all required files.""" - if "SC2PATH" not in os.environ: - check_game_install_path() - sc2_path: str = os.environ["SC2PATH"] - mapdir = sc2_path / Path('Maps/ArchipelagoCampaign') - mods = ["ArchipelagoCore", "ArchipelagoPlayer", "ArchipelagoPlayerSuper", "ArchipelagoPatches", - "ArchipelagoTriggers", "ArchipelagoPlayerWoL", "ArchipelagoPlayerHotS", - "ArchipelagoPlayerLotV", "ArchipelagoPlayerLotVPrologue", "ArchipelagoPlayerNCO"] - modfiles = [sc2_path / Path("Mods/" + mod + ".SC2Mod") for mod in mods] - wol_required_maps: typing.List[str] = ["WoL" + os.sep + mission.map_file + ".SC2Map" for mission in SC2Mission - if mission.campaign in (SC2Campaign.WOL, SC2Campaign.PROPHECY)] - hots_required_maps: typing.List[str] = ["HotS" + os.sep + mission.map_file + ".SC2Map" for mission in campaign_mission_table[SC2Campaign.HOTS]] - lotv_required_maps: typing.List[str] = ["LotV" + os.sep + mission.map_file + ".SC2Map" for mission in SC2Mission - if mission.campaign in (SC2Campaign.LOTV, SC2Campaign.PROLOGUE, SC2Campaign.EPILOGUE)] - nco_required_maps: typing.List[str] = ["NCO" + os.sep + mission.map_file + ".SC2Map" for mission in campaign_mission_table[SC2Campaign.NCO]] - required_maps = wol_required_maps + hots_required_maps + lotv_required_maps + nco_required_maps - needs_files = False - - # Check for maps. - missing_maps: typing.List[str] = [] - for mapfile in required_maps: - if not os.path.isfile(mapdir / mapfile): - missing_maps.append(mapfile) - if len(missing_maps) >= 19: - sc2_logger.warning(f"All map files missing from {mapdir}.") - needs_files = True - elif len(missing_maps) > 0: - for map in missing_maps: - sc2_logger.debug(f"Missing {map} from {mapdir}.") - sc2_logger.warning(f"Missing {len(missing_maps)} map files.") - needs_files = True - else: # Must be no maps missing - sc2_logger.info(f"All maps found in {mapdir}.") - - # Check for mods. - for modfile in modfiles: - if os.path.isfile(modfile) or os.path.isdir(modfile): - sc2_logger.info(f"Archipelago mod found at {modfile}.") - else: - sc2_logger.warning(f"Archipelago mod could not be found at {modfile}.") - needs_files = True - - # Final verdict. - if needs_files: - sc2_logger.warning(f"Required files are missing. Run /download_data to acquire them.") - return False - else: - sc2_logger.debug(f"All map/mod files are properly installed.") - return True - - -class DllDirectory: - # Credit to Black Sliver for this code. - # More info: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectoryw - _old: typing.Optional[str] = None - _new: typing.Optional[str] = None - - def __init__(self, new: typing.Optional[str]): - self._new = new - - def __enter__(self): - old = self.get() - if self.set(self._new): - self._old = old - - def __exit__(self, *args): - if self._old is not None: - self.set(self._old) - - @staticmethod - def get() -> typing.Optional[str]: - if sys.platform == "win32": - n = ctypes.windll.kernel32.GetDllDirectoryW(0, None) - buf = ctypes.create_unicode_buffer(n) - ctypes.windll.kernel32.GetDllDirectoryW(n, buf) - return buf.value - # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific - return None - - @staticmethod - def set(s: typing.Optional[str]) -> bool: - if sys.platform == "win32": - return ctypes.windll.kernel32.SetDllDirectoryW(s) != 0 - # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific - return False - - -def download_latest_release_zip( - owner: str, - repo: str, - api_version: str, - metadata: typing.Optional[str] = None, - force_download=False -) -> typing.Tuple[str, typing.Optional[str]]: - """Downloads the latest release of a GitHub repo to the current directory as a .zip file.""" - import requests - - headers = {"Accept": 'application/vnd.github.v3+json'} - url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}" - - r1 = requests.get(url, headers=headers) - if r1.status_code == 200: - latest_metadata = r1.json() - cleanup_downloaded_metadata(latest_metadata) - latest_metadata = str(latest_metadata) - # sc2_logger.info(f"Latest version: {latest_metadata}.") - else: - sc2_logger.warning(f"Status code: {r1.status_code}") - sc2_logger.warning(f"Failed to reach GitHub. Could not find download link.") - sc2_logger.warning(f"text: {r1.text}") - return "", metadata - - if (force_download is False) and (metadata == latest_metadata): - sc2_logger.info("Latest version already installed.") - return "", metadata - - sc2_logger.info(f"Attempting to download latest version of API version {api_version} of {repo}.") - download_url = r1.json()["assets"][0]["browser_download_url"] - - r2 = requests.get(download_url, headers=headers) - if r2.status_code == 200 and zipfile.is_zipfile(io.BytesIO(r2.content)): - tempdir = tempfile.gettempdir() - file = tempdir + os.sep + f"{repo}.zip" - with open(file, "wb") as fh: - fh.write(r2.content) - sc2_logger.info(f"Successfully downloaded {repo}.zip.") - return file, latest_metadata - else: - sc2_logger.warning(f"Status code: {r2.status_code}") - sc2_logger.warning("Download failed.") - sc2_logger.warning(f"text: {r2.text}") - return "", metadata - - -def cleanup_downloaded_metadata(medatada_json: dict) -> None: - for asset in medatada_json['assets']: - del asset['download_count'] - - -def is_mod_update_available(owner: str, repo: str, api_version: str, metadata: str) -> bool: - import requests - - headers = {"Accept": 'application/vnd.github.v3+json'} - url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}" - - r1 = requests.get(url, headers=headers) - if r1.status_code == 200: - latest_metadata = r1.json() - cleanup_downloaded_metadata(latest_metadata) - latest_metadata = str(latest_metadata) - if metadata != latest_metadata: - return True - else: - return False - - else: - sc2_logger.warning(f"Failed to reach GitHub while checking for updates.") - sc2_logger.warning(f"Status code: {r1.status_code}") - sc2_logger.warning(f"text: {r1.text}") - return False - - -def get_location_offset(mission_id): - return SC2WOL_LOC_ID_OFFSET if mission_id <= SC2Mission.ALL_IN.id \ - else (SC2HOTS_LOC_ID_OFFSET - SC2Mission.ALL_IN.id * VICTORY_MODULO) - - -def launch(): - colorama.just_fix_windows_console() - asyncio.run(main()) - colorama.deinit() diff --git a/worlds/sc2/ClientGui.py b/worlds/sc2/ClientGui.py deleted file mode 100644 index d16acad83d..0000000000 --- a/worlds/sc2/ClientGui.py +++ /dev/null @@ -1,306 +0,0 @@ -from typing import * -import asyncio - -from NetUtils import JSONMessagePart -from kvui import GameManager, HoverBehavior, ServerToolTip, KivyJSONtoTextParser -from kivy.app import App -from kivy.clock import Clock -from kivy.uix.gridlayout import GridLayout -from kivy.lang import Builder -from kivy.uix.label import Label -from kivy.uix.button import Button -from kivymd.uix.tooltip import MDTooltip -from kivy.uix.scrollview import ScrollView -from kivy.properties import StringProperty - -from .Client import SC2Context, calc_unfinished_missions, parse_unlock -from .MissionTables import (lookup_id_to_mission, lookup_name_to_mission, campaign_race_exceptions, SC2Mission, SC2Race, - SC2Campaign) -from .Locations import LocationType, lookup_location_id_to_type -from .Options import LocationInclusion -from . import SC2World, get_first_mission - - -class HoverableButton(HoverBehavior, Button): - pass - - -class MissionButton(HoverableButton, MDTooltip): - tooltip_text = StringProperty("Test") - - def __init__(self, *args, **kwargs): - super(HoverableButton, self).__init__(**kwargs) - self._tooltip = ServerToolTip(text=self.text, markup=True) - self._tooltip.padding = [5, 2, 5, 2] - - def on_enter(self): - self._tooltip.text = self.tooltip_text - - if self.tooltip_text != "": - self.display_tooltip() - - def on_leave(self): - self.remove_tooltip() - - @property - def ctx(self) -> SC2Context: - return App.get_running_app().ctx - -class CampaignScroll(ScrollView): - pass - -class MultiCampaignLayout(GridLayout): - pass - -class CampaignLayout(GridLayout): - pass - -class MissionLayout(GridLayout): - pass - -class MissionCategory(GridLayout): - pass - - -class SC2JSONtoKivyParser(KivyJSONtoTextParser): - def _handle_text(self, node: JSONMessagePart): - if node.get("keep_markup", False): - for ref in node.get("refs", []): - node["text"] = f"[ref={self.ref_count}|{ref}]{node['text']}[/ref]" - self.ref_count += 1 - return super(KivyJSONtoTextParser, self)._handle_text(node) - else: - return super()._handle_text(node) - - -class SC2Manager(GameManager): - logging_pairs = [ - ("Client", "Archipelago"), - ("Starcraft2", "Starcraft2"), - ] - base_title = "Archipelago Starcraft 2 Client" - - campaign_panel: Optional[CampaignLayout] = None - last_checked_locations: Set[int] = set() - mission_id_to_button: Dict[int, MissionButton] = {} - launching: Union[bool, int] = False # if int -> mission ID - refresh_from_launching = True - first_check = True - first_mission = "" - ctx: SC2Context - - def __init__(self, ctx) -> None: - super().__init__(ctx) - self.json_to_kivy_parser = SC2JSONtoKivyParser(ctx) - - def clear_tooltip(self) -> None: - if self.ctx.current_tooltip: - App.get_running_app().root.remove_widget(self.ctx.current_tooltip) - - self.ctx.current_tooltip = None - - def build(self): - container = super().build() - - panel = self.add_client_tab("Starcraft 2 Launcher", CampaignScroll()) - self.campaign_panel = MultiCampaignLayout() - panel.content.add_widget(self.campaign_panel) - - Clock.schedule_interval(self.build_mission_table, 0.5) - - return container - - def build_mission_table(self, dt) -> None: - if (not self.launching and (not self.last_checked_locations == self.ctx.checked_locations or - not self.refresh_from_launching)) or self.first_check: - assert self.campaign_panel is not None - self.refresh_from_launching = True - - self.campaign_panel.clear_widgets() - if self.ctx.mission_req_table: - self.last_checked_locations = self.ctx.checked_locations.copy() - self.first_check = False - self.first_mission = get_first_mission(self.ctx.mission_req_table) - - self.mission_id_to_button = {} - - available_missions, unfinished_missions = calc_unfinished_missions(self.ctx) - - multi_campaign_layout_height = 0 - - for campaign, missions in sorted(self.ctx.mission_req_table.items(), key=lambda item: item[0].id): - categories: Dict[str, List[str]] = {} - - # separate missions into categories - for mission_index in missions: - mission_info = self.ctx.mission_req_table[campaign][mission_index] - if mission_info.category not in categories: - categories[mission_info.category] = [] - - categories[mission_info.category].append(mission_index) - - max_mission_count = max(len(categories[category]) for category in categories) - if max_mission_count == 1: - campaign_layout_height = 115 - else: - campaign_layout_height = (max_mission_count + 2) * 50 - multi_campaign_layout_height += campaign_layout_height - campaign_layout = CampaignLayout(size_hint_y=None, height=campaign_layout_height) - if campaign != SC2Campaign.GLOBAL: - campaign_layout.add_widget( - Label(text=campaign.campaign_name, size_hint_y=None, height=25, outline_width=1) - ) - mission_layout = MissionLayout() - - for category in categories: - category_name_height = 0 - category_spacing = 3 - if category.startswith('_'): - category_display_name = '' - else: - category_display_name = category - category_name_height += 25 - category_spacing = 10 - category_panel = MissionCategory(padding=[category_spacing,6,category_spacing,6]) - category_panel.add_widget( - Label(text=category_display_name, size_hint_y=None, height=category_name_height, outline_width=1)) - - for mission in categories[category]: - text: str = mission - tooltip: str = "" - mission_obj: SC2Mission = lookup_name_to_mission[mission] - mission_id: int = mission_obj.id - mission_data = self.ctx.mission_req_table[campaign][mission] - remaining_locations, plando_locations, remaining_count = self.sort_unfinished_locations(mission) - # Map has uncollected locations - if mission in unfinished_missions: - if self.any_valuable_locations(remaining_locations): - text = f"[color=6495ED]{text}[/color]" - else: - text = f"[color=A0BEF4]{text}[/color]" - elif mission in available_missions: - text = f"[color=FFFFFF]{text}[/color]" - # Map requirements not met - else: - text = f"[color=a9a9a9]{text}[/color]" - tooltip = f"Requires: " - if mission_data.required_world: - tooltip += ", ".join(list(self.ctx.mission_req_table[parse_unlock(req_mission).campaign])[parse_unlock(req_mission).connect_to - 1] for - req_mission in - mission_data.required_world) - - if mission_data.number: - tooltip += " and " - if mission_data.number: - tooltip += f"{self.ctx.mission_req_table[campaign][mission].number} missions completed" - - if mission_id == self.ctx.final_mission: - if mission in available_missions: - text = f"[color=FFBC95]{mission}[/color]" - else: - text = f"[color=D0C0BE]{mission}[/color]" - if tooltip: - tooltip += "\n" - tooltip += "Final Mission" - - if remaining_count > 0: - if tooltip: - tooltip += "\n\n" - tooltip += f"-- Uncollected locations --" - for loctype in LocationType: - if len(remaining_locations[loctype]) > 0: - if loctype == LocationType.VICTORY: - tooltip += f"\n- {remaining_locations[loctype][0]}" - else: - tooltip += f"\n{self.get_location_type_title(loctype)}:\n- " - tooltip += "\n- ".join(remaining_locations[loctype]) - if len(plando_locations) > 0: - tooltip += f"\nPlando:\n- " - tooltip += "\n- ".join(plando_locations) - - MISSION_BUTTON_HEIGHT = 50 - for pad in range(mission_data.ui_vertical_padding): - column_spacer = Label(text='', size_hint_y=None, height=MISSION_BUTTON_HEIGHT) - category_panel.add_widget(column_spacer) - mission_button = MissionButton(text=text, size_hint_y=None, height=MISSION_BUTTON_HEIGHT) - mission_race = mission_obj.race - if mission_race == SC2Race.ANY: - mission_race = mission_obj.campaign.race - race = campaign_race_exceptions.get(mission_obj, mission_race) - racial_colors = { - SC2Race.TERRAN: (0.24, 0.84, 0.68), - SC2Race.ZERG: (1, 0.65, 0.37), - SC2Race.PROTOSS: (0.55, 0.7, 1) - } - if race in racial_colors: - mission_button.background_color = racial_colors[race] - mission_button.tooltip_text = tooltip - mission_button.bind(on_press=self.mission_callback) - self.mission_id_to_button[mission_id] = mission_button - category_panel.add_widget(mission_button) - - category_panel.add_widget(Label(text="")) - mission_layout.add_widget(category_panel) - campaign_layout.add_widget(mission_layout) - self.campaign_panel.add_widget(campaign_layout) - self.campaign_panel.height = multi_campaign_layout_height - - elif self.launching: - assert self.campaign_panel is not None - self.refresh_from_launching = False - - self.campaign_panel.clear_widgets() - self.campaign_panel.add_widget(Label(text="Launching Mission: " + - lookup_id_to_mission[self.launching].mission_name)) - if self.ctx.ui: - self.ctx.ui.clear_tooltip() - - def mission_callback(self, button: MissionButton) -> None: - if not self.launching: - mission_id: int = next(k for k, v in self.mission_id_to_button.items() if v == button) - if self.ctx.play_mission(mission_id): - self.launching = mission_id - Clock.schedule_once(self.finish_launching, 10) - - def finish_launching(self, dt): - self.launching = False - - def sort_unfinished_locations(self, mission_name: str) -> Tuple[Dict[LocationType, List[str]], List[str], int]: - locations: Dict[LocationType, List[str]] = {loctype: [] for loctype in LocationType} - count = 0 - for loc in self.ctx.locations_for_mission(mission_name): - if loc in self.ctx.missing_locations: - count += 1 - locations[lookup_location_id_to_type[loc]].append(self.ctx.location_names.lookup_in_game(loc)) - - plando_locations = [] - for plando_loc in self.ctx.plando_locations: - for loctype in LocationType: - if plando_loc in locations[loctype]: - locations[loctype].remove(plando_loc) - plando_locations.append(plando_loc) - - return locations, plando_locations, count - - def any_valuable_locations(self, locations: Dict[LocationType, List[str]]) -> bool: - for loctype in LocationType: - if len(locations[loctype]) > 0 and self.ctx.location_inclusions[loctype] == LocationInclusion.option_enabled: - return True - return False - - def get_location_type_title(self, location_type: LocationType) -> str: - title = location_type.name.title().replace("_", " ") - if self.ctx.location_inclusions[location_type] == LocationInclusion.option_disabled: - title += " (Nothing)" - elif self.ctx.location_inclusions[location_type] == LocationInclusion.option_resources: - title += " (Resources)" - else: - title += "" - return title - -def start_gui(context: SC2Context): - context.ui = SC2Manager(context) - context.ui_task = asyncio.create_task(context.ui.async_run(), name="UI") - import pkgutil - data = pkgutil.get_data(SC2World.__module__, "Starcraft2.kv").decode() - Builder.load_string(data) diff --git a/worlds/sc2/ItemGroups.py b/worlds/sc2/ItemGroups.py deleted file mode 100644 index 3a37330445..0000000000 --- a/worlds/sc2/ItemGroups.py +++ /dev/null @@ -1,100 +0,0 @@ -import typing -from . import Items, ItemNames -from .MissionTables import campaign_mission_table, SC2Campaign, SC2Mission - -""" -Item name groups, given to Archipelago and used in YAMLs and /received filtering. -For non-developers the following will be useful: -* Items with a bracket get groups named after the unbracketed part - * eg. "Advanced Healing AI (Medivac)" is accessible as "Advanced Healing AI" - * The exception to this are item names that would be ambiguous (eg. "Resource Efficiency") -* Item flaggroups get unique groups as well as combined groups for numbered flaggroups - * eg. "Unit" contains all units, "Armory" contains "Armory 1" through "Armory 6" - * The best place to look these up is at the bottom of Items.py -* Items that have a parent are grouped together - * eg. "Zergling Items" contains all items that have "Zergling" as a parent - * These groups do NOT contain the parent item - * This currently does not include items with multiple potential parents, like some LotV unit upgrades -* All items are grouped by their race ("Terran", "Protoss", "Zerg", "Any") -* Hand-crafted item groups can be found at the bottom of this file -""" - -item_name_groups: typing.Dict[str, typing.List[str]] = {} - -# Groups for use in world logic -item_name_groups["Missions"] = ["Beat " + mission.mission_name for mission in SC2Mission] -item_name_groups["WoL Missions"] = ["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.WOL]] + \ - ["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.PROPHECY]] - -# These item name groups should not show up in documentation -unlisted_item_name_groups = { - "Missions", "WoL Missions" -} - -# Some item names only differ in bracketed parts -# These items are ambiguous for short-hand name groups -bracketless_duplicates: typing.Set[str] -# This is a list of names in ItemNames with bracketed parts removed, for internal use -_shortened_names = [(name[:name.find(' (')] if '(' in name else name) - for name in [ItemNames.__dict__[name] for name in ItemNames.__dir__() if not name.startswith('_')]] -# Remove the first instance of every short-name from the full item list -bracketless_duplicates = set(_shortened_names) -for name in bracketless_duplicates: - _shortened_names.remove(name) -# The remaining short-names are the duplicates -bracketless_duplicates = set(_shortened_names) -del _shortened_names - -# All items get sorted into their data type -for item, data in Items.get_full_item_list().items(): - # Items get assigned to their flaggroup's type - item_name_groups.setdefault(data.type, []).append(item) - # Numbered flaggroups get sorted into an unnumbered group - # Currently supports numbers of one or two digits - if data.type[-2:].strip().isnumeric(): - type_group = data.type[:-2].strip() - item_name_groups.setdefault(type_group, []).append(item) - # Flaggroups with numbers are unlisted - unlisted_item_name_groups.add(data.type) - # Items with a bracket get a short-hand name group for ease of use in YAMLs - if '(' in item: - short_name = item[:item.find(' (')] - # Ambiguous short-names are dropped - if short_name not in bracketless_duplicates: - item_name_groups[short_name] = [item] - # Short-name groups are unlisted - unlisted_item_name_groups.add(short_name) - # Items with a parent get assigned to their parent's group - if data.parent_item: - # The parent groups need a special name, otherwise they are ambiguous with the parent - parent_group = f"{data.parent_item} Items" - item_name_groups.setdefault(parent_group, []).append(item) - # Parent groups are unlisted - unlisted_item_name_groups.add(parent_group) - # All items get assigned to their race's group - race_group = data.race.name.capitalize() - item_name_groups.setdefault(race_group, []).append(item) - - -# Hand-made groups -item_name_groups["Aiur"] = [ - ItemNames.ZEALOT, ItemNames.DRAGOON, ItemNames.SENTRY, ItemNames.AVENGER, ItemNames.HIGH_TEMPLAR, - ItemNames.IMMORTAL, ItemNames.REAVER, - ItemNames.PHOENIX, ItemNames.SCOUT, ItemNames.ARBITER, ItemNames.CARRIER, -] -item_name_groups["Nerazim"] = [ - ItemNames.CENTURION, ItemNames.STALKER, ItemNames.DARK_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.DARK_ARCHON, - ItemNames.ANNIHILATOR, - ItemNames.CORSAIR, ItemNames.ORACLE, ItemNames.VOID_RAY, -] -item_name_groups["Tal'Darim"] = [ - ItemNames.SUPPLICANT, ItemNames.SLAYER, ItemNames.HAVOC, ItemNames.BLOOD_HUNTER, ItemNames.ASCENDANT, - ItemNames.VANGUARD, ItemNames.WRATHWALKER, - ItemNames.DESTROYER, ItemNames.MOTHERSHIP, - ItemNames.WARP_PRISM_PHASE_BLASTER, -] -item_name_groups["Purifier"] = [ - ItemNames.SENTINEL, ItemNames.ADEPT, ItemNames.INSTIGATOR, ItemNames.ENERGIZER, - ItemNames.COLOSSUS, ItemNames.DISRUPTOR, - ItemNames.MIRAGE, ItemNames.TEMPEST, -] \ No newline at end of file diff --git a/worlds/sc2/ItemNames.py b/worlds/sc2/ItemNames.py deleted file mode 100644 index 10c7139103..0000000000 --- a/worlds/sc2/ItemNames.py +++ /dev/null @@ -1,661 +0,0 @@ -""" -A complete collection of Starcraft 2 item names as strings. -Users of this data may make some assumptions about the structure of a name: -* The upgrade for a unit will end with the unit's name in parentheses -* Weapon / armor upgrades may be grouped by a common prefix specified within this file -""" - -# Terran Units -MARINE = "Marine" -MEDIC = "Medic" -FIREBAT = "Firebat" -MARAUDER = "Marauder" -REAPER = "Reaper" -HELLION = "Hellion" -VULTURE = "Vulture" -GOLIATH = "Goliath" -DIAMONDBACK = "Diamondback" -SIEGE_TANK = "Siege Tank" -MEDIVAC = "Medivac" -WRAITH = "Wraith" -VIKING = "Viking" -BANSHEE = "Banshee" -BATTLECRUISER = "Battlecruiser" -GHOST = "Ghost" -SPECTRE = "Spectre" -THOR = "Thor" -RAVEN = "Raven" -SCIENCE_VESSEL = "Science Vessel" -PREDATOR = "Predator" -HERCULES = "Hercules" -# Extended units -LIBERATOR = "Liberator" -VALKYRIE = "Valkyrie" -WIDOW_MINE = "Widow Mine" -CYCLONE = "Cyclone" -HERC = "HERC" -WARHOUND = "Warhound" - -# Terran Buildings -BUNKER = "Bunker" -MISSILE_TURRET = "Missile Turret" -SENSOR_TOWER = "Sensor Tower" -PLANETARY_FORTRESS = "Planetary Fortress" -PERDITION_TURRET = "Perdition Turret" -HIVE_MIND_EMULATOR = "Hive Mind Emulator" -PSI_DISRUPTER = "Psi Disrupter" - -# Terran Weapon / Armor Upgrades -TERRAN_UPGRADE_PREFIX = "Progressive Terran" -TERRAN_INFANTRY_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Infantry" -TERRAN_VEHICLE_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Vehicle" -TERRAN_SHIP_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Ship" - -PROGRESSIVE_TERRAN_INFANTRY_WEAPON = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Weapon" -PROGRESSIVE_TERRAN_INFANTRY_ARMOR = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Armor" -PROGRESSIVE_TERRAN_VEHICLE_WEAPON = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Weapon" -PROGRESSIVE_TERRAN_VEHICLE_ARMOR = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Armor" -PROGRESSIVE_TERRAN_SHIP_WEAPON = f"{TERRAN_SHIP_UPGRADE_PREFIX} Weapon" -PROGRESSIVE_TERRAN_SHIP_ARMOR = f"{TERRAN_SHIP_UPGRADE_PREFIX} Armor" -PROGRESSIVE_TERRAN_WEAPON_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Weapon Upgrade" -PROGRESSIVE_TERRAN_ARMOR_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Armor Upgrade" -PROGRESSIVE_TERRAN_INFANTRY_UPGRADE = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_TERRAN_VEHICLE_UPGRADE = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_TERRAN_SHIP_UPGRADE = f"{TERRAN_SHIP_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Weapon/Armor Upgrade" - -# Mercenaries -WAR_PIGS = "War Pigs" -DEVIL_DOGS = "Devil Dogs" -HAMMER_SECURITIES = "Hammer Securities" -SPARTAN_COMPANY = "Spartan Company" -SIEGE_BREAKERS = "Siege Breakers" -HELS_ANGELS = "Hel's Angels" -DUSK_WINGS = "Dusk Wings" -JACKSONS_REVENGE = "Jackson's Revenge" -SKIBIS_ANGELS = "Skibi's Angels" -DEATH_HEADS = "Death Heads" -WINGED_NIGHTMARES = "Winged Nightmares" -MIDNIGHT_RIDERS = "Midnight Riders" -BRYNHILDS = "Brynhilds" -JOTUN = "Jotun" - -# Lab / Global -ULTRA_CAPACITORS = "Ultra-Capacitors" -VANADIUM_PLATING = "Vanadium Plating" -ORBITAL_DEPOTS = "Orbital Depots" -MICRO_FILTERING = "Micro-Filtering" -AUTOMATED_REFINERY = "Automated Refinery" -COMMAND_CENTER_REACTOR = "Command Center Reactor" -TECH_REACTOR = "Tech Reactor" -ORBITAL_STRIKE = "Orbital Strike" -CELLULAR_REACTOR = "Cellular Reactor" -PROGRESSIVE_REGENERATIVE_BIO_STEEL = "Progressive Regenerative Bio-Steel" -PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM = "Progressive Fire-Suppression System" -PROGRESSIVE_ORBITAL_COMMAND = "Progressive Orbital Command" -STRUCTURE_ARMOR = "Structure Armor" -HI_SEC_AUTO_TRACKING = "Hi-Sec Auto Tracking" -ADVANCED_OPTICS = "Advanced Optics" -ROGUE_FORCES = "Rogue Forces" - -# Terran Unit Upgrades -BANSHEE_HYPERFLIGHT_ROTORS = "Hyperflight Rotors (Banshee)" -BANSHEE_INTERNAL_TECH_MODULE = "Internal Tech Module (Banshee)" -BANSHEE_LASER_TARGETING_SYSTEM = "Laser Targeting System (Banshee)" -BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS = "Progressive Cross-Spectrum Dampeners (Banshee)" -BANSHEE_SHOCKWAVE_MISSILE_BATTERY = "Shockwave Missile Battery (Banshee)" -BANSHEE_SHAPED_HULL = "Shaped Hull (Banshee)" -BANSHEE_ADVANCED_TARGETING_OPTICS = "Advanced Targeting Optics (Banshee)" -BANSHEE_DISTORTION_BLASTERS = "Distortion Blasters (Banshee)" -BANSHEE_ROCKET_BARRAGE = "Rocket Barrage (Banshee)" -BATTLECRUISER_ATX_LASER_BATTERY = "ATX Laser Battery (Battlecruiser)" -BATTLECRUISER_CLOAK = "Cloak (Battlecruiser)" -BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX = "Progressive Defensive Matrix (Battlecruiser)" -BATTLECRUISER_INTERNAL_TECH_MODULE = "Internal Tech Module (Battlecruiser)" -BATTLECRUISER_PROGRESSIVE_MISSILE_PODS = "Progressive Missile Pods (Battlecruiser)" -BATTLECRUISER_OPTIMIZED_LOGISTICS = "Optimized Logistics (Battlecruiser)" -BATTLECRUISER_TACTICAL_JUMP = "Tactical Jump (Battlecruiser)" -BATTLECRUISER_BEHEMOTH_PLATING = "Behemoth Plating (Battlecruiser)" -BATTLECRUISER_COVERT_OPS_ENGINES = "Covert Ops Engines (Battlecruiser)" -BUNKER_NEOSTEEL_BUNKER = "Neosteel Bunker (Bunker)" -BUNKER_PROJECTILE_ACCELERATOR = "Projectile Accelerator (Bunker)" -BUNKER_SHRIKE_TURRET = "Shrike Turret (Bunker)" -BUNKER_FORTIFIED_BUNKER = "Fortified Bunker (Bunker)" -CYCLONE_MAG_FIELD_ACCELERATORS = "Mag-Field Accelerators (Cyclone)" -CYCLONE_MAG_FIELD_LAUNCHERS = "Mag-Field Launchers (Cyclone)" -CYCLONE_RAPID_FIRE_LAUNCHERS = "Rapid Fire Launchers (Cyclone)" -CYCLONE_TARGETING_OPTICS = "Targeting Optics (Cyclone)" -CYCLONE_RESOURCE_EFFICIENCY = "Resource Efficiency (Cyclone)" -CYCLONE_INTERNAL_TECH_MODULE = "Internal Tech Module (Cyclone)" -DIAMONDBACK_BURST_CAPACITORS = "Burst Capacitors (Diamondback)" -DIAMONDBACK_HYPERFLUXOR = "Hyperfluxor (Diamondback)" -DIAMONDBACK_RESOURCE_EFFICIENCY = "Resource Efficiency (Diamondback)" -DIAMONDBACK_SHAPED_HULL = "Shaped Hull (Diamondback)" -DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL = "Progressive Tri-Lithium Power Cell (Diamondback)" -DIAMONDBACK_ION_THRUSTERS = "Ion Thrusters (Diamondback)" -FIREBAT_INCINERATOR_GAUNTLETS = "Incinerator Gauntlets (Firebat)" -FIREBAT_JUGGERNAUT_PLATING = "Juggernaut Plating (Firebat)" -FIREBAT_RESOURCE_EFFICIENCY = "Resource Efficiency (Firebat)" -FIREBAT_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Firebat)" -FIREBAT_INFERNAL_PRE_IGNITER = "Infernal Pre-Igniter (Firebat)" -FIREBAT_KINETIC_FOAM = "Kinetic Foam (Firebat)" -FIREBAT_NANO_PROJECTORS = "Nano Projectors (Firebat)" -GHOST_CRIUS_SUIT = "Crius Suit (Ghost)" -GHOST_EMP_ROUNDS = "EMP Rounds (Ghost)" -GHOST_LOCKDOWN = "Lockdown (Ghost)" -GHOST_OCULAR_IMPLANTS = "Ocular Implants (Ghost)" -GHOST_RESOURCE_EFFICIENCY = "Resource Efficiency (Ghost)" -GOLIATH_ARES_CLASS_TARGETING_SYSTEM = "Ares-Class Targeting System (Goliath)" -GOLIATH_JUMP_JETS = "Jump Jets (Goliath)" -GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM = "Multi-Lock Weapons System (Goliath)" -GOLIATH_OPTIMIZED_LOGISTICS = "Optimized Logistics (Goliath)" -GOLIATH_SHAPED_HULL = "Shaped Hull (Goliath)" -GOLIATH_RESOURCE_EFFICIENCY = "Resource Efficiency (Goliath)" -GOLIATH_INTERNAL_TECH_MODULE = "Internal Tech Module (Goliath)" -HELLION_HELLBAT_ASPECT = "Hellbat Aspect (Hellion)" -HELLION_JUMP_JETS = "Jump Jets (Hellion)" -HELLION_OPTIMIZED_LOGISTICS = "Optimized Logistics (Hellion)" -HELLION_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Hellion)" -HELLION_SMART_SERVOS = "Smart Servos (Hellion)" -HELLION_THERMITE_FILAMENTS = "Thermite Filaments (Hellion)" -HELLION_TWIN_LINKED_FLAMETHROWER = "Twin-Linked Flamethrower (Hellion)" -HELLION_INFERNAL_PLATING = "Infernal Plating (Hellion)" -HERC_JUGGERNAUT_PLATING = "Juggernaut Plating (HERC)" -HERC_KINETIC_FOAM = "Kinetic Foam (HERC)" -HERC_RESOURCE_EFFICIENCY = "Resource Efficiency (HERC)" -HERCULES_INTERNAL_FUSION_MODULE = "Internal Fusion Module (Hercules)" -HERCULES_TACTICAL_JUMP = "Tactical Jump (Hercules)" -LIBERATOR_ADVANCED_BALLISTICS = "Advanced Ballistics (Liberator)" -LIBERATOR_CLOAK = "Cloak (Liberator)" -LIBERATOR_LASER_TARGETING_SYSTEM = "Laser Targeting System (Liberator)" -LIBERATOR_OPTIMIZED_LOGISTICS = "Optimized Logistics (Liberator)" -LIBERATOR_RAID_ARTILLERY = "Raid Artillery (Liberator)" -LIBERATOR_SMART_SERVOS = "Smart Servos (Liberator)" -LIBERATOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Liberator)" -MARAUDER_CONCUSSIVE_SHELLS = "Concussive Shells (Marauder)" -MARAUDER_INTERNAL_TECH_MODULE = "Internal Tech Module (Marauder)" -MARAUDER_KINETIC_FOAM = "Kinetic Foam (Marauder)" -MARAUDER_LASER_TARGETING_SYSTEM = "Laser Targeting System (Marauder)" -MARAUDER_MAGRAIL_MUNITIONS = "Magrail Munitions (Marauder)" -MARAUDER_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Marauder)" -MARAUDER_JUGGERNAUT_PLATING = "Juggernaut Plating (Marauder)" -MARINE_COMBAT_SHIELD = "Combat Shield (Marine)" -MARINE_LASER_TARGETING_SYSTEM = "Laser Targeting System (Marine)" -MARINE_MAGRAIL_MUNITIONS = "Magrail Munitions (Marine)" -MARINE_OPTIMIZED_LOGISTICS = "Optimized Logistics (Marine)" -MARINE_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Marine)" -MEDIC_ADVANCED_MEDIC_FACILITIES = "Advanced Medic Facilities (Medic)" -MEDIC_OPTICAL_FLARE = "Optical Flare (Medic)" -MEDIC_RESOURCE_EFFICIENCY = "Resource Efficiency (Medic)" -MEDIC_RESTORATION = "Restoration (Medic)" -MEDIC_STABILIZER_MEDPACKS = "Stabilizer Medpacks (Medic)" -MEDIC_ADAPTIVE_MEDPACKS = "Adaptive Medpacks (Medic)" -MEDIC_NANO_PROJECTOR = "Nano Projector (Medic)" -MEDIVAC_ADVANCED_HEALING_AI = "Advanced Healing AI (Medivac)" -MEDIVAC_AFTERBURNERS = "Afterburners (Medivac)" -MEDIVAC_EXPANDED_HULL = "Expanded Hull (Medivac)" -MEDIVAC_RAPID_DEPLOYMENT_TUBE = "Rapid Deployment Tube (Medivac)" -MEDIVAC_SCATTER_VEIL = "Scatter Veil (Medivac)" -MEDIVAC_ADVANCED_CLOAKING_FIELD = "Advanced Cloaking Field (Medivac)" -MISSILE_TURRET_HELLSTORM_BATTERIES = "Hellstorm Batteries (Missile Turret)" -MISSILE_TURRET_TITANIUM_HOUSING = "Titanium Housing (Missile Turret)" -PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS = "Progressive Augmented Thrusters (Planetary Fortress)" -PLANETARY_FORTRESS_ADVANCED_TARGETING = "Advanced Targeting (Planetary Fortress)" -PREDATOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Predator)" -PREDATOR_CLOAK = "Cloak (Predator)" -PREDATOR_CHARGE = "Charge (Predator)" -PREDATOR_PREDATOR_S_FURY = "Predator's Fury (Predator)" -RAVEN_ANTI_ARMOR_MISSILE = "Anti-Armor Missile (Raven)" -RAVEN_BIO_MECHANICAL_REPAIR_DRONE = "Bio Mechanical Repair Drone (Raven)" -RAVEN_HUNTER_SEEKER_WEAPON = "Hunter-Seeker Weapon (Raven)" -RAVEN_INTERFERENCE_MATRIX = "Interference Matrix (Raven)" -RAVEN_INTERNAL_TECH_MODULE = "Internal Tech Module (Raven)" -RAVEN_RAILGUN_TURRET = "Railgun Turret (Raven)" -RAVEN_SPIDER_MINES = "Spider Mines (Raven)" -RAVEN_RESOURCE_EFFICIENCY = "Resource Efficiency (Raven)" -RAVEN_DURABLE_MATERIALS = "Durable Materials (Raven)" -REAPER_ADVANCED_CLOAKING_FIELD = "Advanced Cloaking Field (Reaper)" -REAPER_COMBAT_DRUGS = "Combat Drugs (Reaper)" -REAPER_G4_CLUSTERBOMB = "G-4 Clusterbomb (Reaper)" -REAPER_LASER_TARGETING_SYSTEM = "Laser Targeting System (Reaper)" -REAPER_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Reaper)" -REAPER_SPIDER_MINES = "Spider Mines (Reaper)" -REAPER_U238_ROUNDS = "U-238 Rounds (Reaper)" -REAPER_JET_PACK_OVERDRIVE = "Jet Pack Overdrive (Reaper)" -SCIENCE_VESSEL_DEFENSIVE_MATRIX = "Defensive Matrix (Science Vessel)" -SCIENCE_VESSEL_EMP_SHOCKWAVE = "EMP Shockwave (Science Vessel)" -SCIENCE_VESSEL_IMPROVED_NANO_REPAIR = "Improved Nano-Repair (Science Vessel)" -SCIENCE_VESSEL_ADVANCED_AI_SYSTEMS = "Advanced AI Systems (Science Vessel)" -SCV_ADVANCED_CONSTRUCTION = "Advanced Construction (SCV)" -SCV_DUAL_FUSION_WELDERS = "Dual-Fusion Welders (SCV)" -SCV_HOSTILE_ENVIRONMENT_ADAPTATION = "Hostile Environment Adaptation (SCV)" -SIEGE_TANK_ADVANCED_SIEGE_TECH = "Advanced Siege Tech (Siege Tank)" -SIEGE_TANK_GRADUATING_RANGE = "Graduating Range (Siege Tank)" -SIEGE_TANK_INTERNAL_TECH_MODULE = "Internal Tech Module (Siege Tank)" -SIEGE_TANK_JUMP_JETS = "Jump Jets (Siege Tank)" -SIEGE_TANK_LASER_TARGETING_SYSTEM = "Laser Targeting System (Siege Tank)" -SIEGE_TANK_MAELSTROM_ROUNDS = "Maelstrom Rounds (Siege Tank)" -SIEGE_TANK_SHAPED_BLAST = "Shaped Blast (Siege Tank)" -SIEGE_TANK_SMART_SERVOS = "Smart Servos (Siege Tank)" -SIEGE_TANK_SPIDER_MINES = "Spider Mines (Siege Tank)" -SIEGE_TANK_SHAPED_HULL = "Shaped Hull (Siege Tank)" -SIEGE_TANK_RESOURCE_EFFICIENCY = "Resource Efficiency (Siege Tank)" -SPECTRE_IMPALER_ROUNDS = "Impaler Rounds (Spectre)" -SPECTRE_NYX_CLASS_CLOAKING_MODULE = "Nyx-Class Cloaking Module (Spectre)" -SPECTRE_PSIONIC_LASH = "Psionic Lash (Spectre)" -SPECTRE_RESOURCE_EFFICIENCY = "Resource Efficiency (Spectre)" -SPIDER_MINE_CERBERUS_MINE = "Cerberus Mine (Spider Mine)" -SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION = "High Explosive Munition (Spider Mine)" -THOR_330MM_BARRAGE_CANNON = "330mm Barrage Cannon (Thor)" -THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL = "Progressive Immortality Protocol (Thor)" -THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD = "Progressive High Impact Payload (Thor)" -THOR_BUTTON_WITH_A_SKULL_ON_IT = "Button With a Skull on It (Thor)" -THOR_LASER_TARGETING_SYSTEM = "Laser Targeting System (Thor)" -THOR_LARGE_SCALE_FIELD_CONSTRUCTION = "Large Scale Field Construction (Thor)" -VALKYRIE_AFTERBURNERS = "Afterburners (Valkyrie)" -VALKYRIE_FLECHETTE_MISSILES = "Flechette Missiles (Valkyrie)" -VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS = "Enhanced Cluster Launchers (Valkyrie)" -VALKYRIE_SHAPED_HULL = "Shaped Hull (Valkyrie)" -VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR = "Launching Vector Compensator (Valkyrie)" -VALKYRIE_RESOURCE_EFFICIENCY = "Resource Efficiency (Valkyrie)" -VIKING_ANTI_MECHANICAL_MUNITION = "Anti-Mechanical Munition (Viking)" -VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM = "Phobos-Class Weapons System (Viking)" -VIKING_RIPWAVE_MISSILES = "Ripwave Missiles (Viking)" -VIKING_SMART_SERVOS = "Smart Servos (Viking)" -VIKING_SHREDDER_ROUNDS = "Shredder Rounds (Viking)" -VIKING_WILD_MISSILES = "W.I.L.D. Missiles (Viking)" -VULTURE_AUTO_LAUNCHERS = "Auto Launchers (Vulture)" -VULTURE_ION_THRUSTERS = "Ion Thrusters (Vulture)" -VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE = "Progressive Replenishable Magazine (Vulture)" -VULTURE_AUTO_REPAIR = "Auto-Repair (Vulture)" -WARHOUND_RESOURCE_EFFICIENCY = "Resource Efficiency (Warhound)" -WARHOUND_REINFORCED_PLATING = "Reinforced Plating (Warhound)" -WIDOW_MINE_BLACK_MARKET_LAUNCHERS = "Black Market Launchers (Widow Mine)" -WIDOW_MINE_CONCEALMENT = "Concealment (Widow Mine)" -WIDOW_MINE_DRILLING_CLAWS = "Drilling Claws (Widow Mine)" -WIDOW_MINE_EXECUTIONER_MISSILES = "Executioner Missiles (Widow Mine)" -WRAITH_ADVANCED_LASER_TECHNOLOGY = "Advanced Laser Technology (Wraith)" -WRAITH_DISPLACEMENT_FIELD = "Displacement Field (Wraith)" -WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS = "Progressive Tomahawk Power Cells (Wraith)" -WRAITH_TRIGGER_OVERRIDE = "Trigger Override (Wraith)" -WRAITH_INTERNAL_TECH_MODULE = "Internal Tech Module (Wraith)" -WRAITH_RESOURCE_EFFICIENCY = "Resource Efficiency (Wraith)" - -# Nova -NOVA_GHOST_VISOR = "Ghost Visor (Nova Equipment)" -NOVA_RANGEFINDER_OCULUS = "Rangefinder Oculus (Nova Equipment)" -NOVA_DOMINATION = "Domination (Nova Ability)" -NOVA_BLINK = "Blink (Nova Ability)" -NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE = "Progressive Stealth Suit Module (Nova Suit Module)" -NOVA_ENERGY_SUIT_MODULE = "Energy Suit Module (Nova Suit Module)" -NOVA_ARMORED_SUIT_MODULE = "Armored Suit Module (Nova Suit Module)" -NOVA_JUMP_SUIT_MODULE = "Jump Suit Module (Nova Suit Module)" -NOVA_C20A_CANISTER_RIFLE = "C20A Canister Rifle (Nova Weapon)" -NOVA_HELLFIRE_SHOTGUN = "Hellfire Shotgun (Nova Weapon)" -NOVA_PLASMA_RIFLE = "Plasma Rifle (Nova Weapon)" -NOVA_MONOMOLECULAR_BLADE = "Monomolecular Blade (Nova Weapon)" -NOVA_BLAZEFIRE_GUNBLADE = "Blazefire Gunblade (Nova Weapon)" -NOVA_STIM_INFUSION = "Stim Infusion (Nova Gadget)" -NOVA_PULSE_GRENADES = "Pulse Grenades (Nova Gadget)" -NOVA_FLASHBANG_GRENADES = "Flashbang Grenades (Nova Gadget)" -NOVA_IONIC_FORCE_FIELD = "Ionic Force Field (Nova Gadget)" -NOVA_HOLO_DECOY = "Holo Decoy (Nova Gadget)" -NOVA_NUKE = "Tac Nuke Strike (Nova Ability)" - -# Zerg Units -ZERGLING = "Zergling" -SWARM_QUEEN = "Swarm Queen" -ROACH = "Roach" -HYDRALISK = "Hydralisk" -ABERRATION = "Aberration" -MUTALISK = "Mutalisk" -SWARM_HOST = "Swarm Host" -INFESTOR = "Infestor" -ULTRALISK = "Ultralisk" -CORRUPTOR = "Corruptor" -SCOURGE = "Scourge" -BROOD_QUEEN = "Brood Queen" -DEFILER = "Defiler" - -# Zerg Buildings -SPORE_CRAWLER = "Spore Crawler" -SPINE_CRAWLER = "Spine Crawler" - -# Zerg Weapon / Armor Upgrades -ZERG_UPGRADE_PREFIX = "Progressive Zerg" -ZERG_FLYER_UPGRADE_PREFIX = f"{ZERG_UPGRADE_PREFIX} Flyer" - -PROGRESSIVE_ZERG_MELEE_ATTACK = f"{ZERG_UPGRADE_PREFIX} Melee Attack" -PROGRESSIVE_ZERG_MISSILE_ATTACK = f"{ZERG_UPGRADE_PREFIX} Missile Attack" -PROGRESSIVE_ZERG_GROUND_CARAPACE = f"{ZERG_UPGRADE_PREFIX} Ground Carapace" -PROGRESSIVE_ZERG_FLYER_ATTACK = f"{ZERG_FLYER_UPGRADE_PREFIX} Attack" -PROGRESSIVE_ZERG_FLYER_CARAPACE = f"{ZERG_FLYER_UPGRADE_PREFIX} Carapace" -PROGRESSIVE_ZERG_WEAPON_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Weapon Upgrade" -PROGRESSIVE_ZERG_ARMOR_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Armor Upgrade" -PROGRESSIVE_ZERG_GROUND_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Ground Upgrade" -PROGRESSIVE_ZERG_FLYER_UPGRADE = f"{ZERG_FLYER_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Weapon/Armor Upgrade" - -# Zerg Unit Upgrades -ZERGLING_HARDENED_CARAPACE = "Hardened Carapace (Zergling)" -ZERGLING_ADRENAL_OVERLOAD = "Adrenal Overload (Zergling)" -ZERGLING_METABOLIC_BOOST = "Metabolic Boost (Zergling)" -ZERGLING_SHREDDING_CLAWS = "Shredding Claws (Zergling)" -ROACH_HYDRIODIC_BILE = "Hydriodic Bile (Roach)" -ROACH_ADAPTIVE_PLATING = "Adaptive Plating (Roach)" -ROACH_TUNNELING_CLAWS = "Tunneling Claws (Roach)" -ROACH_GLIAL_RECONSTITUTION = "Glial Reconstitution (Roach)" -ROACH_ORGANIC_CARAPACE = "Organic Carapace (Roach)" -HYDRALISK_FRENZY = "Frenzy (Hydralisk)" -HYDRALISK_ANCILLARY_CARAPACE = "Ancillary Carapace (Hydralisk)" -HYDRALISK_GROOVED_SPINES = "Grooved Spines (Hydralisk)" -HYDRALISK_MUSCULAR_AUGMENTS = "Muscular Augments (Hydralisk)" -HYDRALISK_RESOURCE_EFFICIENCY = "Resource Efficiency (Hydralisk)" -BANELING_CORROSIVE_ACID = "Corrosive Acid (Baneling)" -BANELING_RUPTURE = "Rupture (Baneling)" -BANELING_REGENERATIVE_ACID = "Regenerative Acid (Baneling)" -BANELING_CENTRIFUGAL_HOOKS = "Centrifugal Hooks (Baneling)" -BANELING_TUNNELING_JAWS = "Tunneling Jaws (Baneling)" -BANELING_RAPID_METAMORPH = "Rapid Metamorph (Baneling)" -MUTALISK_VICIOUS_GLAIVE = "Vicious Glaive (Mutalisk)" -MUTALISK_RAPID_REGENERATION = "Rapid Regeneration (Mutalisk)" -MUTALISK_SUNDERING_GLAIVE = "Sundering Glaive (Mutalisk)" -MUTALISK_SEVERING_GLAIVE = "Severing Glaive (Mutalisk)" -MUTALISK_AERODYNAMIC_GLAIVE_SHAPE = "Aerodynamic Glaive Shape (Mutalisk)" -SWARM_HOST_BURROW = "Burrow (Swarm Host)" -SWARM_HOST_RAPID_INCUBATION = "Rapid Incubation (Swarm Host)" -SWARM_HOST_PRESSURIZED_GLANDS = "Pressurized Glands (Swarm Host)" -SWARM_HOST_LOCUST_METABOLIC_BOOST = "Locust Metabolic Boost (Swarm Host)" -SWARM_HOST_ENDURING_LOCUSTS = "Enduring Locusts (Swarm Host)" -SWARM_HOST_ORGANIC_CARAPACE = "Organic Carapace (Swarm Host)" -SWARM_HOST_RESOURCE_EFFICIENCY = "Resource Efficiency (Swarm Host)" -ULTRALISK_BURROW_CHARGE = "Burrow Charge (Ultralisk)" -ULTRALISK_TISSUE_ASSIMILATION = "Tissue Assimilation (Ultralisk)" -ULTRALISK_MONARCH_BLADES = "Monarch Blades (Ultralisk)" -ULTRALISK_ANABOLIC_SYNTHESIS = "Anabolic Synthesis (Ultralisk)" -ULTRALISK_CHITINOUS_PLATING = "Chitinous Plating (Ultralisk)" -ULTRALISK_ORGANIC_CARAPACE = "Organic Carapace (Ultralisk)" -ULTRALISK_RESOURCE_EFFICIENCY = "Resource Efficiency (Ultralisk)" -CORRUPTOR_CORRUPTION = "Corruption (Corruptor)" -CORRUPTOR_CAUSTIC_SPRAY = "Caustic Spray (Corruptor)" -SCOURGE_VIRULENT_SPORES = "Virulent Spores (Scourge)" -SCOURGE_RESOURCE_EFFICIENCY = "Resource Efficiency (Scourge)" -SCOURGE_SWARM_SCOURGE = "Swarm Scourge (Scourge)" -DEVOURER_CORROSIVE_SPRAY = "Corrosive Spray (Devourer)" -DEVOURER_GAPING_MAW = "Gaping Maw (Devourer)" -DEVOURER_IMPROVED_OSMOSIS = "Improved Osmosis (Devourer)" -DEVOURER_PRESCIENT_SPORES = "Prescient Spores (Devourer)" -GUARDIAN_PROLONGED_DISPERSION = "Prolonged Dispersion (Guardian)" -GUARDIAN_PRIMAL_ADAPTATION = "Primal Adaptation (Guardian)" -GUARDIAN_SORONAN_ACID = "Soronan Acid (Guardian)" -IMPALER_ADAPTIVE_TALONS = "Adaptive Talons (Impaler)" -IMPALER_SECRETION_GLANDS = "Secretion Glands (Impaler)" -IMPALER_HARDENED_TENTACLE_SPINES = "Hardened Tentacle Spines (Impaler)" -LURKER_SEISMIC_SPINES = "Seismic Spines (Lurker)" -LURKER_ADAPTED_SPINES = "Adapted Spines (Lurker)" -RAVAGER_POTENT_BILE = "Potent Bile (Ravager)" -RAVAGER_BLOATED_BILE_DUCTS = "Bloated Bile Ducts (Ravager)" -RAVAGER_DEEP_TUNNEL = "Deep Tunnel (Ravager)" -VIPER_PARASITIC_BOMB = "Parasitic Bomb (Viper)" -VIPER_PARALYTIC_BARBS = "Paralytic Barbs (Viper)" -VIPER_VIRULENT_MICROBES = "Virulent Microbes (Viper)" -BROOD_LORD_POROUS_CARTILAGE = "Porous Cartilage (Brood Lord)" -BROOD_LORD_EVOLVED_CARAPACE = "Evolved Carapace (Brood Lord)" -BROOD_LORD_SPLITTER_MITOSIS = "Splitter Mitosis (Brood Lord)" -BROOD_LORD_RESOURCE_EFFICIENCY = "Resource Efficiency (Brood Lord)" -INFESTOR_INFESTED_TERRAN = "Infested Terran (Infestor)" -INFESTOR_MICROBIAL_SHROUD = "Microbial Shroud (Infestor)" -SWARM_QUEEN_SPAWN_LARVAE = "Spawn Larvae (Swarm Queen)" -SWARM_QUEEN_DEEP_TUNNEL = "Deep Tunnel (Swarm Queen)" -SWARM_QUEEN_ORGANIC_CARAPACE = "Organic Carapace (Swarm Queen)" -SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION = "Bio-Mechanical Transfusion (Swarm Queen)" -SWARM_QUEEN_RESOURCE_EFFICIENCY = "Resource Efficiency (Swarm Queen)" -SWARM_QUEEN_INCUBATOR_CHAMBER = "Incubator Chamber (Swarm Queen)" -BROOD_QUEEN_FUNGAL_GROWTH = "Fungal Growth (Brood Queen)" -BROOD_QUEEN_ENSNARE = "Ensnare (Brood Queen)" -BROOD_QUEEN_ENHANCED_MITOCHONDRIA = "Enhanced Mitochondria (Brood Queen)" - -# Zerg Strains -ZERGLING_RAPTOR_STRAIN = "Raptor Strain (Zergling)" -ZERGLING_SWARMLING_STRAIN = "Swarmling Strain (Zergling)" -ROACH_VILE_STRAIN = "Vile Strain (Roach)" -ROACH_CORPSER_STRAIN = "Corpser Strain (Roach)" -BANELING_SPLITTER_STRAIN = "Splitter Strain (Baneling)" -BANELING_HUNTER_STRAIN = "Hunter Strain (Baneling)" -SWARM_HOST_CARRION_STRAIN = "Carrion Strain (Swarm Host)" -SWARM_HOST_CREEPER_STRAIN = "Creeper Strain (Swarm Host)" -ULTRALISK_NOXIOUS_STRAIN = "Noxious Strain (Ultralisk)" -ULTRALISK_TORRASQUE_STRAIN = "Torrasque Strain (Ultralisk)" - -# Morphs -ZERGLING_BANELING_ASPECT = "Baneling Aspect (Zergling)" -HYDRALISK_IMPALER_ASPECT = "Impaler Aspect (Hydralisk)" -HYDRALISK_LURKER_ASPECT = "Lurker Aspect (Hydralisk)" -MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT = "Brood Lord Aspect (Mutalisk/Corruptor)" -MUTALISK_CORRUPTOR_VIPER_ASPECT = "Viper Aspect (Mutalisk/Corruptor)" -MUTALISK_CORRUPTOR_GUARDIAN_ASPECT = "Guardian Aspect (Mutalisk/Corruptor)" -MUTALISK_CORRUPTOR_DEVOURER_ASPECT = "Devourer Aspect (Mutalisk/Corruptor)" -ROACH_RAVAGER_ASPECT = "Ravager Aspect (Roach)" - -# Zerg Mercs -INFESTED_MEDICS = "Infested Medics" -INFESTED_SIEGE_TANKS = "Infested Siege Tanks" -INFESTED_BANSHEES = "Infested Banshees" - -# Kerrigan Upgrades -KERRIGAN_KINETIC_BLAST = "Kinetic Blast (Kerrigan Tier 1)" -KERRIGAN_HEROIC_FORTITUDE = "Heroic Fortitude (Kerrigan Tier 1)" -KERRIGAN_LEAPING_STRIKE = "Leaping Strike (Kerrigan Tier 1)" -KERRIGAN_CRUSHING_GRIP = "Crushing Grip (Kerrigan Tier 2)" -KERRIGAN_CHAIN_REACTION = "Chain Reaction (Kerrigan Tier 2)" -KERRIGAN_PSIONIC_SHIFT = "Psionic Shift (Kerrigan Tier 2)" -KERRIGAN_WILD_MUTATION = "Wild Mutation (Kerrigan Tier 4)" -KERRIGAN_SPAWN_BANELINGS = "Spawn Banelings (Kerrigan Tier 4)" -KERRIGAN_MEND = "Mend (Kerrigan Tier 4)" -KERRIGAN_INFEST_BROODLINGS = "Infest Broodlings (Kerrigan Tier 6)" -KERRIGAN_FURY = "Fury (Kerrigan Tier 6)" -KERRIGAN_ABILITY_EFFICIENCY = "Ability Efficiency (Kerrigan Tier 6)" -KERRIGAN_APOCALYPSE = "Apocalypse (Kerrigan Tier 7)" -KERRIGAN_SPAWN_LEVIATHAN = "Spawn Leviathan (Kerrigan Tier 7)" -KERRIGAN_DROP_PODS = "Drop-Pods (Kerrigan Tier 7)" -KERRIGAN_PRIMAL_FORM = "Primal Form (Kerrigan)" - -# Misc Upgrades -KERRIGAN_ZERGLING_RECONSTITUTION = "Zergling Reconstitution (Kerrigan Tier 3)" -KERRIGAN_IMPROVED_OVERLORDS = "Improved Overlords (Kerrigan Tier 3)" -KERRIGAN_AUTOMATED_EXTRACTORS = "Automated Extractors (Kerrigan Tier 3)" -KERRIGAN_TWIN_DRONES = "Twin Drones (Kerrigan Tier 5)" -KERRIGAN_MALIGNANT_CREEP = "Malignant Creep (Kerrigan Tier 5)" -KERRIGAN_VESPENE_EFFICIENCY = "Vespene Efficiency (Kerrigan Tier 5)" -OVERLORD_VENTRAL_SACS = "Ventral Sacs (Overlord)" - -# Kerrigan Levels -KERRIGAN_LEVELS_1 = "1 Kerrigan Level" -KERRIGAN_LEVELS_2 = "2 Kerrigan Levels" -KERRIGAN_LEVELS_3 = "3 Kerrigan Levels" -KERRIGAN_LEVELS_4 = "4 Kerrigan Levels" -KERRIGAN_LEVELS_5 = "5 Kerrigan Levels" -KERRIGAN_LEVELS_6 = "6 Kerrigan Levels" -KERRIGAN_LEVELS_7 = "7 Kerrigan Levels" -KERRIGAN_LEVELS_8 = "8 Kerrigan Levels" -KERRIGAN_LEVELS_9 = "9 Kerrigan Levels" -KERRIGAN_LEVELS_10 = "10 Kerrigan Levels" -KERRIGAN_LEVELS_14 = "14 Kerrigan Levels" -KERRIGAN_LEVELS_35 = "35 Kerrigan Levels" -KERRIGAN_LEVELS_70 = "70 Kerrigan Levels" - -# Protoss Units -ZEALOT = "Zealot" -STALKER = "Stalker" -HIGH_TEMPLAR = "High Templar" -DARK_TEMPLAR = "Dark Templar" -IMMORTAL = "Immortal" -COLOSSUS = "Colossus" -PHOENIX = "Phoenix" -VOID_RAY = "Void Ray" -CARRIER = "Carrier" -OBSERVER = "Observer" -CENTURION = "Centurion" -SENTINEL = "Sentinel" -SUPPLICANT = "Supplicant" -INSTIGATOR = "Instigator" -SLAYER = "Slayer" -SENTRY = "Sentry" -ENERGIZER = "Energizer" -HAVOC = "Havoc" -SIGNIFIER = "Signifier" -ASCENDANT = "Ascendant" -AVENGER = "Avenger" -BLOOD_HUNTER = "Blood Hunter" -DRAGOON = "Dragoon" -DARK_ARCHON = "Dark Archon" -ADEPT = "Adept" -WARP_PRISM = "Warp Prism" -ANNIHILATOR = "Annihilator" -VANGUARD = "Vanguard" -WRATHWALKER = "Wrathwalker" -REAVER = "Reaver" -DISRUPTOR = "Disruptor" -MIRAGE = "Mirage" -CORSAIR = "Corsair" -DESTROYER = "Destroyer" -SCOUT = "Scout" -TEMPEST = "Tempest" -MOTHERSHIP = "Mothership" -ARBITER = "Arbiter" -ORACLE = "Oracle" - -# Upgrades -PROTOSS_UPGRADE_PREFIX = "Progressive Protoss" -PROTOSS_GROUND_UPGRADE_PREFIX = f"{PROTOSS_UPGRADE_PREFIX} Ground" -PROTOSS_AIR_UPGRADE_PREFIX = f"{PROTOSS_UPGRADE_PREFIX} Air" -PROGRESSIVE_PROTOSS_GROUND_WEAPON = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Weapon" -PROGRESSIVE_PROTOSS_GROUND_ARMOR = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Armor" -PROGRESSIVE_PROTOSS_SHIELDS = f"{PROTOSS_UPGRADE_PREFIX} Shields" -PROGRESSIVE_PROTOSS_AIR_WEAPON = f"{PROTOSS_AIR_UPGRADE_PREFIX} Weapon" -PROGRESSIVE_PROTOSS_AIR_ARMOR = f"{PROTOSS_AIR_UPGRADE_PREFIX} Armor" -PROGRESSIVE_PROTOSS_WEAPON_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Weapon Upgrade" -PROGRESSIVE_PROTOSS_ARMOR_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Armor Upgrade" -PROGRESSIVE_PROTOSS_GROUND_UPGRADE = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_PROTOSS_AIR_UPGRADE = f"{PROTOSS_AIR_UPGRADE_PREFIX} Upgrade" -PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Weapon/Armor Upgrade" - -# Buildings -PHOTON_CANNON = "Photon Cannon" -KHAYDARIN_MONOLITH = "Khaydarin Monolith" -SHIELD_BATTERY = "Shield Battery" - -# Unit Upgrades -SUPPLICANT_BLOOD_SHIELD = "Blood Shield (Supplicant)" -SUPPLICANT_SOUL_AUGMENTATION = "Soul Augmentation (Supplicant)" -SUPPLICANT_SHIELD_REGENERATION = "Shield Regeneration (Supplicant)" -ADEPT_SHOCKWAVE = "Shockwave (Adept)" -ADEPT_RESONATING_GLAIVES = "Resonating Glaives (Adept)" -ADEPT_PHASE_BULWARK = "Phase Bulwark (Adept)" -STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES = "Disintegrating Particles (Stalker/Instigator/Slayer)" -STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION = "Particle Reflection (Stalker/Instigator/Slayer)" -DRAGOON_HIGH_IMPACT_PHASE_DISRUPTORS = "High Impact Phase Disruptor (Dragoon)" -DRAGOON_TRILLIC_COMPRESSION_SYSTEM = "Trillic Compression System (Dragoon)" -DRAGOON_SINGULARITY_CHARGE = "Singularity Charge (Dragoon)" -DRAGOON_ENHANCED_STRIDER_SERVOS = "Enhanced Strider Servos (Dragoon)" -SCOUT_COMBAT_SENSOR_ARRAY = "Combat Sensor Array (Scout)" -SCOUT_APIAL_SENSORS = "Apial Sensors (Scout)" -SCOUT_GRAVITIC_THRUSTERS = "Gravitic Thrusters (Scout)" -SCOUT_ADVANCED_PHOTON_BLASTERS = "Advanced Photon Blasters (Scout)" -TEMPEST_TECTONIC_DESTABILIZERS = "Tectonic Destabilizers (Tempest)" -TEMPEST_QUANTIC_REACTOR = "Quantic Reactor (Tempest)" -TEMPEST_GRAVITY_SLING = "Gravity Sling (Tempest)" -PHOENIX_MIRAGE_IONIC_WAVELENGTH_FLUX = "Ionic Wavelength Flux (Phoenix/Mirage)" -PHOENIX_MIRAGE_ANION_PULSE_CRYSTALS = "Anion Pulse-Crystals (Phoenix/Mirage)" -CORSAIR_STEALTH_DRIVE = "Stealth Drive (Corsair)" -CORSAIR_ARGUS_JEWEL = "Argus Jewel (Corsair)" -CORSAIR_SUSTAINING_DISRUPTION = "Sustaining Disruption (Corsair)" -CORSAIR_NEUTRON_SHIELDS = "Neutron Shields (Corsair)" -ORACLE_STEALTH_DRIVE = "Stealth Drive (Oracle)" -ORACLE_STASIS_CALIBRATION = "Stasis Calibration (Oracle)" -ORACLE_TEMPORAL_ACCELERATION_BEAM = "Temporal Acceleration Beam (Oracle)" -ARBITER_CHRONOSTATIC_REINFORCEMENT = "Chronostatic Reinforcement (Arbiter)" -ARBITER_KHAYDARIN_CORE = "Khaydarin Core (Arbiter)" -ARBITER_SPACETIME_ANCHOR = "Spacetime Anchor (Arbiter)" -ARBITER_RESOURCE_EFFICIENCY = "Resource Efficiency (Arbiter)" -ARBITER_ENHANCED_CLOAK_FIELD = "Enhanced Cloak Field (Arbiter)" -CARRIER_GRAVITON_CATAPULT = "Graviton Catapult (Carrier)" -CARRIER_HULL_OF_PAST_GLORIES = "Hull of Past Glories (Carrier)" -VOID_RAY_DESTROYER_FLUX_VANES = "Flux Vanes (Void Ray/Destroyer)" -DESTROYER_REFORGED_BLOODSHARD_CORE = "Reforged Bloodshard Core (Destroyer)" -WARP_PRISM_GRAVITIC_DRIVE = "Gravitic Drive (Warp Prism)" -WARP_PRISM_PHASE_BLASTER = "Phase Blaster (Warp Prism)" -WARP_PRISM_WAR_CONFIGURATION = "War Configuration (Warp Prism)" -OBSERVER_GRAVITIC_BOOSTERS = "Gravitic Boosters (Observer)" -OBSERVER_SENSOR_ARRAY = "Sensor Array (Observer)" -REAVER_SCARAB_DAMAGE = "Scarab Damage (Reaver)" -REAVER_SOLARITE_PAYLOAD = "Solarite Payload (Reaver)" -REAVER_REAVER_CAPACITY = "Reaver Capacity (Reaver)" -REAVER_RESOURCE_EFFICIENCY = "Resource Efficiency (Reaver)" -VANGUARD_AGONY_LAUNCHERS = "Agony Launchers (Vanguard)" -VANGUARD_MATTER_DISPERSION = "Matter Dispersion (Vanguard)" -IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE = "Singularity Charge (Immortal/Annihilator)" -IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS = "Advanced Targeting Mechanics (Immortal/Annihilator)" -COLOSSUS_PACIFICATION_PROTOCOL = "Pacification Protocol (Colossus)" -WRATHWALKER_RAPID_POWER_CYCLING = "Rapid Power Cycling (Wrathwalker)" -WRATHWALKER_EYE_OF_WRATH = "Eye of Wrath (Wrathwalker)" -DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN = "Shroud of Adun (Dark Templar/Avenger/Blood Hunter)" -DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING = "Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)" -DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK = "Blink (Dark Templar/Avenger/Blood Hunter)" -DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY = "Resource Efficiency (Dark Templar/Avenger/Blood Hunter)" -DARK_TEMPLAR_DARK_ARCHON_MELD = "Dark Archon Meld (Dark Templar)" -HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM = "Unshackled Psionic Storm (High Templar/Signifier)" -HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION = "Hallucination (High Templar/Signifier)" -HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET = "Khaydarin Amulet (High Templar/Signifier)" -ARCHON_HIGH_ARCHON = "High Archon (Archon)" -DARK_ARCHON_FEEDBACK = "Feedback (Dark Archon)" -DARK_ARCHON_MAELSTROM = "Maelstrom (Dark Archon)" -DARK_ARCHON_ARGUS_TALISMAN = "Argus Talisman (Dark Archon)" -ASCENDANT_POWER_OVERWHELMING = "Power Overwhelming (Ascendant)" -ASCENDANT_CHAOTIC_ATTUNEMENT = "Chaotic Attunement (Ascendant)" -ASCENDANT_BLOOD_AMULET = "Blood Amulet (Ascendant)" -SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE = "Cloaking Module (Sentry/Energizer/Havoc)" -SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING = "Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)" -SENTRY_FORCE_FIELD = "Force Field (Sentry)" -SENTRY_HALLUCINATION = "Hallucination (Sentry)" -ENERGIZER_RECLAMATION = "Reclamation (Energizer)" -ENERGIZER_FORGED_CHASSIS = "Forged Chassis (Energizer)" -HAVOC_DETECT_WEAKNESS = "Detect Weakness (Havoc)" -HAVOC_BLOODSHARD_RESONANCE = "Bloodshard Resonance (Havoc)" -ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS = "Leg Enhancements (Zealot/Sentinel/Centurion)" -ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY = "Shield Capacity (Zealot/Sentinel/Centurion)" - -# Spear Of Adun -SOA_CHRONO_SURGE = "Chrono Surge (Spear of Adun Calldown)" -SOA_PROGRESSIVE_PROXY_PYLON = "Progressive Proxy Pylon (Spear of Adun Calldown)" -SOA_PYLON_OVERCHARGE = "Pylon Overcharge (Spear of Adun Calldown)" -SOA_ORBITAL_STRIKE = "Orbital Strike (Spear of Adun Calldown)" -SOA_TEMPORAL_FIELD = "Temporal Field (Spear of Adun Calldown)" -SOA_SOLAR_LANCE = "Solar Lance (Spear of Adun Calldown)" -SOA_MASS_RECALL = "Mass Recall (Spear of Adun Calldown)" -SOA_SHIELD_OVERCHARGE = "Shield Overcharge (Spear of Adun Calldown)" -SOA_DEPLOY_FENIX = "Deploy Fenix (Spear of Adun Calldown)" -SOA_PURIFIER_BEAM = "Purifier Beam (Spear of Adun Calldown)" -SOA_TIME_STOP = "Time Stop (Spear of Adun Calldown)" -SOA_SOLAR_BOMBARDMENT = "Solar Bombardment (Spear of Adun Calldown)" - -# Generic upgrades -MATRIX_OVERLOAD = "Matrix Overload" -QUATRO = "Quatro" -NEXUS_OVERCHARGE = "Nexus Overcharge" -ORBITAL_ASSIMILATORS = "Orbital Assimilators" -WARP_HARMONIZATION = "Warp Harmonization" -GUARDIAN_SHELL = "Guardian Shell" -RECONSTRUCTION_BEAM = "Reconstruction Beam (Spear of Adun Auto-Cast)" -OVERWATCH = "Overwatch (Spear of Adun Auto-Cast)" -SUPERIOR_WARP_GATES = "Superior Warp Gates" -ENHANCED_TARGETING = "Enhanced Targeting" -OPTIMIZED_ORDNANCE = "Optimized Ordnance" -KHALAI_INGENUITY = "Khalai Ingenuity" -AMPLIFIED_ASSIMILATORS = "Amplified Assimilators" - -# Filler items -STARTING_MINERALS = "Additional Starting Minerals" -STARTING_VESPENE = "Additional Starting Vespene" -STARTING_SUPPLY = "Additional Starting Supply" -NOTHING = "Nothing" diff --git a/worlds/sc2/Items.py b/worlds/sc2/Items.py deleted file mode 100644 index ee1f34d75b..0000000000 --- a/worlds/sc2/Items.py +++ /dev/null @@ -1,2554 +0,0 @@ -import inspect -from pydoc import describe - -from BaseClasses import Item, ItemClassification, MultiWorld -import typing - -from .Options import get_option_value, RequiredTactics -from .MissionTables import SC2Mission, SC2Race, SC2Campaign, campaign_mission_table -from . import ItemNames -from worlds.AutoWorld import World - - -class ItemData(typing.NamedTuple): - code: int - type: str - number: int # Important for bot commands to send the item into the game - race: SC2Race - classification: ItemClassification = ItemClassification.useful - quantity: int = 1 - parent_item: typing.Optional[str] = None - origin: typing.Set[str] = {"wol"} - description: typing.Optional[str] = None - important_for_filtering: bool = False - - def is_important_for_filtering(self): - return self.important_for_filtering \ - or self.classification == ItemClassification.progression \ - or self.classification == ItemClassification.progression_skip_balancing - - -class StarcraftItem(Item): - game: str = "Starcraft 2" - - -def get_full_item_list(): - return item_table - - -SC2WOL_ITEM_ID_OFFSET = 1000 -SC2HOTS_ITEM_ID_OFFSET = SC2WOL_ITEM_ID_OFFSET + 1000 -SC2LOTV_ITEM_ID_OFFSET = SC2HOTS_ITEM_ID_OFFSET + 1000 - -# Descriptions -WEAPON_ARMOR_UPGRADE_NOTE = inspect.cleandoc(""" - Must be researched during the mission if the mission type isn't set to auto-unlock generic upgrades. -""") -LASER_TARGETING_SYSTEMS_DESCRIPTION = "Increases vision by 2 and weapon range by 1." -STIMPACK_SMALL_COST = 10 -STIMPACK_SMALL_HEAL = 30 -STIMPACK_LARGE_COST = 20 -STIMPACK_LARGE_HEAL = 60 -STIMPACK_TEMPLATE = inspect.cleandoc(""" - Level 1: Stimpack: Increases unit movement and attack speed for 15 seconds. Injures the unit for {} life. - Level 2: Super Stimpack: Instead of injuring the unit, heals the unit for {} life instead. -""") -STIMPACK_SMALL_DESCRIPTION = STIMPACK_TEMPLATE.format(STIMPACK_SMALL_COST, STIMPACK_SMALL_HEAL) -STIMPACK_LARGE_DESCRIPTION = STIMPACK_TEMPLATE.format(STIMPACK_LARGE_COST, STIMPACK_LARGE_HEAL) -SMART_SERVOS_DESCRIPTION = "Increases transformation speed between modes." -INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE = "{} can be trained from a {} without an attached Tech Lab." -RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE = "Reduces {} resource and supply cost." -RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE = "Reduces {} resource cost." -CLOAK_DESCRIPTION_TEMPLATE = "Allows {} to use the Cloak ability." - - -# The items are sorted by their IDs. The IDs shall be kept for compatibility with older games. -item_table = { - # WoL - ItemNames.MARINE: - ItemData(0 + SC2WOL_ITEM_ID_OFFSET, "Unit", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="General-purpose infantry."), - ItemNames.MEDIC: - ItemData(1 + SC2WOL_ITEM_ID_OFFSET, "Unit", 1, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Support trooper. Heals nearby biological units."), - ItemNames.FIREBAT: - ItemData(2 + SC2WOL_ITEM_ID_OFFSET, "Unit", 2, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Specialized anti-infantry attacker."), - ItemNames.MARAUDER: - ItemData(3 + SC2WOL_ITEM_ID_OFFSET, "Unit", 3, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Heavy assault infantry."), - ItemNames.REAPER: - ItemData(4 + SC2WOL_ITEM_ID_OFFSET, "Unit", 4, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Raider. Capable of jumping up and down cliffs. Throws explosive mines."), - ItemNames.HELLION: - ItemData(5 + SC2WOL_ITEM_ID_OFFSET, "Unit", 5, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Fast scout. Has a flame attack that damages all enemy units in its line of fire."), - ItemNames.VULTURE: - ItemData(6 + SC2WOL_ITEM_ID_OFFSET, "Unit", 6, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Fast skirmish unit. Can use the Spider Mine ability."), - ItemNames.GOLIATH: - ItemData(7 + SC2WOL_ITEM_ID_OFFSET, "Unit", 7, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Heavy-fire support unit."), - ItemNames.DIAMONDBACK: - ItemData(8 + SC2WOL_ITEM_ID_OFFSET, "Unit", 8, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Fast, high-damage hovertank. Rail Gun can fire while the Diamondback is moving."), - ItemNames.SIEGE_TANK: - ItemData(9 + SC2WOL_ITEM_ID_OFFSET, "Unit", 9, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Heavy tank. Long-range artillery in Siege Mode."), - ItemNames.MEDIVAC: - ItemData(10 + SC2WOL_ITEM_ID_OFFSET, "Unit", 10, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Air transport. Heals nearby biological units."), - ItemNames.WRAITH: - ItemData(11 + SC2WOL_ITEM_ID_OFFSET, "Unit", 11, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Highly mobile flying unit. Excellent at surgical strikes."), - ItemNames.VIKING: - ItemData(12 + SC2WOL_ITEM_ID_OFFSET, "Unit", 12, SC2Race.TERRAN, - classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Durable support flyer. Loaded with strong anti-capital air missiles. - Can switch into Assault Mode to attack ground units. - """ - )), - ItemNames.BANSHEE: - ItemData(13 + SC2WOL_ITEM_ID_OFFSET, "Unit", 13, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Tactical-strike aircraft."), - ItemNames.BATTLECRUISER: - ItemData(14 + SC2WOL_ITEM_ID_OFFSET, "Unit", 14, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Powerful warship."), - ItemNames.GHOST: - ItemData(15 + SC2WOL_ITEM_ID_OFFSET, "Unit", 15, SC2Race.TERRAN, - classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Infiltration unit. Can use Snipe and Cloak abilities. Can also call down Tactical Nukes. - """ - )), - ItemNames.SPECTRE: - ItemData(16 + SC2WOL_ITEM_ID_OFFSET, "Unit", 16, SC2Race.TERRAN, - classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Infiltration unit. Can use Ultrasonic Pulse, Psionic Lash, and Cloak. - Can also call down Tactical Nukes. - """ - )), - ItemNames.THOR: - ItemData(17 + SC2WOL_ITEM_ID_OFFSET, "Unit", 17, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Heavy assault mech."), - # EE units - ItemNames.LIBERATOR: - ItemData(18 + SC2WOL_ITEM_ID_OFFSET, "Unit", 18, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"nco", "ext"}, - description=inspect.cleandoc( - """ - Artillery fighter. Loaded with missiles that deal area damage to enemy air targets. - Can switch into Defender Mode to provide siege support. - """ - )), - ItemNames.VALKYRIE: - ItemData(19 + SC2WOL_ITEM_ID_OFFSET, "Unit", 19, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"bw"}, - description=inspect.cleandoc( - """ - Advanced anti-aircraft fighter. - Able to use cluster missiles that deal area damage to air targets. - """ - )), - ItemNames.WIDOW_MINE: - ItemData(20 + SC2WOL_ITEM_ID_OFFSET, "Unit", 20, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description=inspect.cleandoc( - """ - Robotic mine. Launches missiles at nearby enemy units while burrowed. - Attacks deal splash damage in a small area around the target. - Widow Mine is revealed when Sentinel Missile is on cooldown. - """ - )), - ItemNames.CYCLONE: - ItemData(21 + SC2WOL_ITEM_ID_OFFSET, "Unit", 21, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description=inspect.cleandoc( - """ - Mobile assault vehicle. Can use Lock On to quickly fire while moving. - """ - )), - ItemNames.HERC: - ItemData(22 + SC2WOL_ITEM_ID_OFFSET, "Unit", 26, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description=inspect.cleandoc( - """ - Front-line infantry. Can use Grapple. - """ - )), - ItemNames.WARHOUND: - ItemData(23 + SC2WOL_ITEM_ID_OFFSET, "Unit", 27, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description=inspect.cleandoc( - """ - Anti-vehicle mech. Haywire missiles do bonus damage to mechanical units. - """ - )), - - # Some other items are moved to Upgrade group because of the way how the bot message is parsed - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_WEAPON: - ItemData(100 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases damage of Terran infantry units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_ARMOR: - ItemData(102 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases armor of Terran infantry units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_WEAPON: - ItemData(103 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases damage of Terran vehicle units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_ARMOR: - ItemData(104 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases armor of Terran vehicle units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - ItemNames.PROGRESSIVE_TERRAN_SHIP_WEAPON: - ItemData(105 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases damage of Terran starship units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - ItemNames.PROGRESSIVE_TERRAN_SHIP_ARMOR: - ItemData(106 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 10, SC2Race.TERRAN, - quantity=3, - description=inspect.cleandoc( - f""" - Increases armor of Terran starship units. - {WEAPON_ARMOR_UPGRADE_NOTE} - """ - )), - # Upgrade bundle 'number' values are used as indices to get affected 'number's - ItemNames.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: ItemData(107 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.TERRAN, quantity=3), - ItemNames.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: ItemData(108 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 1, SC2Race.TERRAN, quantity=3), - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: ItemData(109 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.TERRAN, quantity=3), - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: ItemData(110 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 3, SC2Race.TERRAN, quantity=3), - ItemNames.PROGRESSIVE_TERRAN_SHIP_UPGRADE: ItemData(111 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.TERRAN, quantity=3), - ItemNames.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: ItemData(112 + SC2WOL_ITEM_ID_OFFSET, "Upgrade", 5, SC2Race.TERRAN, quantity=3), - - # Unit and structure upgrades - ItemNames.BUNKER_PROJECTILE_ACCELERATOR: - ItemData(200 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 0, SC2Race.TERRAN, - parent_item=ItemNames.BUNKER, - description="Increases range of all units in the Bunker by 1."), - ItemNames.BUNKER_NEOSTEEL_BUNKER: - ItemData(201 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 1, SC2Race.TERRAN, - parent_item=ItemNames.BUNKER, - description="Increases the number of Bunker slots by 2."), - ItemNames.MISSILE_TURRET_TITANIUM_HOUSING: - ItemData(202 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MISSILE_TURRET, - description="Increases Missile Turret life by 75."), - ItemNames.MISSILE_TURRET_HELLSTORM_BATTERIES: - ItemData(203 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 3, SC2Race.TERRAN, - parent_item=ItemNames.MISSILE_TURRET, - description="The Missile Turret unleashes an additional flurry of missiles with each attack."), - ItemNames.SCV_ADVANCED_CONSTRUCTION: - ItemData(204 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 4, SC2Race.TERRAN, - description="Multiple SCVs can construct a structure, reducing its construction time."), - ItemNames.SCV_DUAL_FUSION_WELDERS: - ItemData(205 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 5, SC2Race.TERRAN, - description="SCVs repair twice as fast."), - ItemNames.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM: - ItemData(206 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 24, SC2Race.TERRAN, - quantity=2, - description=inspect.cleandoc( - """ - Level 1: While on low health, Terran structures are repaired to half health instead of burning down. - Level 2: Terran structures are repaired to full health instead of half health - """ - )), - ItemNames.PROGRESSIVE_ORBITAL_COMMAND: - ItemData(207 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 26, SC2Race.TERRAN, - quantity=2, classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Level 1: Allows Command Centers to use Scanner Sweep and Calldown: MULE abilities. - Level 2: Orbital Command abilities work even in Planetary Fortress mode. - """ - )), - ItemNames.MARINE_PROGRESSIVE_STIMPACK: - ItemData(208 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.MARINE, quantity=2, - description=STIMPACK_SMALL_DESCRIPTION), - ItemNames.MARINE_COMBAT_SHIELD: - ItemData(209 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 9, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.MARINE, - description="Increases Marine life by 10."), - ItemNames.MEDIC_ADVANCED_MEDIC_FACILITIES: - ItemData(210 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 10, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Medics", "Barracks")), - ItemNames.MEDIC_STABILIZER_MEDPACKS: - ItemData(211 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 11, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.MEDIC, - description="Increases Medic heal speed. Reduces the amount of energy required for each heal."), - ItemNames.FIREBAT_INCINERATOR_GAUNTLETS: - ItemData(212 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 12, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.FIREBAT, - description="Increases Firebat's damage radius by 40%"), - ItemNames.FIREBAT_JUGGERNAUT_PLATING: - ItemData(213 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 13, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, - description="Increases Firebat's armor by 2."), - ItemNames.MARAUDER_CONCUSSIVE_SHELLS: - ItemData(214 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 14, SC2Race.TERRAN, - parent_item=ItemNames.MARAUDER, - description="Marauder attack temporarily slows all units in target area."), - ItemNames.MARAUDER_KINETIC_FOAM: - ItemData(215 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 15, SC2Race.TERRAN, - parent_item=ItemNames.MARAUDER, - description="Increases Marauder life by 25."), - ItemNames.REAPER_U238_ROUNDS: - ItemData(216 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 16, SC2Race.TERRAN, - parent_item=ItemNames.REAPER, - description=inspect.cleandoc( - """ - Increases Reaper pistol attack range by 1. - Reaper pistols do additional 3 damage to Light Armor. - """ - )), - ItemNames.REAPER_G4_CLUSTERBOMB: - ItemData(217 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 17, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.REAPER, - description="Timed explosive that does heavy area damage."), - ItemNames.CYCLONE_MAG_FIELD_ACCELERATORS: - ItemData(218 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 18, SC2Race.TERRAN, - parent_item=ItemNames.CYCLONE, origin={"ext"}, - description="Increases Cyclone Lock On damage"), - ItemNames.CYCLONE_MAG_FIELD_LAUNCHERS: - ItemData(219 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 19, SC2Race.TERRAN, - parent_item=ItemNames.CYCLONE, origin={"ext"}, - description="Increases Cyclone attack range by 2."), - ItemNames.MARINE_LASER_TARGETING_SYSTEM: - ItemData(220 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 8, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MARINE, origin={"nco"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.MARINE_MAGRAIL_MUNITIONS: - ItemData(221 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 20, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.MARINE, origin={"nco"}, - description="Deals 20 damage to target unit. Autocast on attack with a cooldown."), - ItemNames.MARINE_OPTIMIZED_LOGISTICS: - ItemData(222 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 21, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MARINE, origin={"nco"}, - description="Increases Marine training speed."), - ItemNames.MEDIC_RESTORATION: - ItemData(223 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 22, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"bw"}, - description="Removes negative status effects from target allied unit."), - ItemNames.MEDIC_OPTICAL_FLARE: - ItemData(224 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 23, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"bw"}, - description="Reduces vision range of target enemy unit. Disables detection."), - ItemNames.MEDIC_RESOURCE_EFFICIENCY: - ItemData(225 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"bw"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Medic")), - ItemNames.FIREBAT_PROGRESSIVE_STIMPACK: - ItemData(226 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 6, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, quantity=2, origin={"bw"}, - description=STIMPACK_LARGE_DESCRIPTION), - ItemNames.FIREBAT_RESOURCE_EFFICIENCY: - ItemData(227 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 25, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, origin={"bw"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Firebat")), - ItemNames.MARAUDER_PROGRESSIVE_STIMPACK: - ItemData(228 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 8, SC2Race.TERRAN, - parent_item=ItemNames.MARAUDER, quantity=2, origin={"nco"}, - description=STIMPACK_LARGE_DESCRIPTION), - ItemNames.MARAUDER_LASER_TARGETING_SYSTEM: - ItemData(229 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 26, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MARAUDER, origin={"nco"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.MARAUDER_MAGRAIL_MUNITIONS: - ItemData(230 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 27, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MARAUDER, origin={"nco"}, - description="Deals 20 damage to target unit. Autocast on attack with a cooldown."), - ItemNames.MARAUDER_INTERNAL_TECH_MODULE: - ItemData(231 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 28, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MARAUDER, origin={"nco"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Marauders", "Barracks")), - ItemNames.SCV_HOSTILE_ENVIRONMENT_ADAPTATION: - ItemData(232 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 29, SC2Race.TERRAN, - classification=ItemClassification.filler, origin={"bw"}, - description="Increases SCV life by 15 and attack speed slightly."), - ItemNames.MEDIC_ADAPTIVE_MEDPACKS: - ItemData(233 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.MEDIC, origin={"ext"}, - description="Allows Medics to heal mechanical and air units."), - ItemNames.MEDIC_NANO_PROJECTOR: - ItemData(234 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIC, origin={"ext"}, - description="Increases Medic heal range by 2."), - ItemNames.FIREBAT_INFERNAL_PRE_IGNITER: - ItemData(235 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 2, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, origin={"bw"}, - description="Firebats do an additional 4 damage to Light Armor."), - ItemNames.FIREBAT_KINETIC_FOAM: - ItemData(236 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 3, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, origin={"ext"}, - description="Increases Firebat life by 100."), - ItemNames.FIREBAT_NANO_PROJECTORS: - ItemData(237 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 4, SC2Race.TERRAN, - parent_item=ItemNames.FIREBAT, origin={"ext"}, - description="Increases Firebat attack range by 2"), - ItemNames.MARAUDER_JUGGERNAUT_PLATING: - ItemData(238 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 5, SC2Race.TERRAN, - parent_item=ItemNames.MARAUDER, origin={"ext"}, - description="Increases Marauder's armor by 2."), - ItemNames.REAPER_JET_PACK_OVERDRIVE: - ItemData(239 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 6, SC2Race.TERRAN, - parent_item=ItemNames.REAPER, origin={"ext"}, - description=inspect.cleandoc( - """ - Allows the Reaper to fly for 10 seconds. - While flying, the Reaper can attack air units. - """ - )), - ItemNames.HELLION_INFERNAL_PLATING: - ItemData(240 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 7, SC2Race.TERRAN, - parent_item=ItemNames.HELLION, origin={"ext"}, - description="Increases Hellion and Hellbat armor by 2."), - ItemNames.VULTURE_AUTO_REPAIR: - ItemData(241 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 8, SC2Race.TERRAN, - parent_item=ItemNames.VULTURE, origin={"ext"}, - description="Vultures regenerate life."), - ItemNames.GOLIATH_SHAPED_HULL: - ItemData(242 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 9, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.GOLIATH, origin={"nco", "ext"}, - description="Increases Goliath life by 25."), - ItemNames.GOLIATH_RESOURCE_EFFICIENCY: - ItemData(243 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 10, SC2Race.TERRAN, - parent_item=ItemNames.GOLIATH, origin={"nco", "bw"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Goliath")), - ItemNames.GOLIATH_INTERNAL_TECH_MODULE: - ItemData(244 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 11, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.GOLIATH, origin={"nco", "bw"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Goliaths", "Factory")), - ItemNames.SIEGE_TANK_SHAPED_HULL: - ItemData(245 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 12, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco", "ext"}, - description="Increases Siege Tank life by 25."), - ItemNames.SIEGE_TANK_RESOURCE_EFFICIENCY: - ItemData(246 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 13, SC2Race.TERRAN, - parent_item=ItemNames.SIEGE_TANK, origin={"bw"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Siege Tank")), - ItemNames.PREDATOR_CLOAK: - ItemData(247 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 14, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.PREDATOR, origin={"ext"}, - description=CLOAK_DESCRIPTION_TEMPLATE.format("Predators")), - ItemNames.PREDATOR_CHARGE: - ItemData(248 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 15, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.PREDATOR, origin={"ext"}, - description="Allows Predators to intercept enemy ground units."), - ItemNames.MEDIVAC_SCATTER_VEIL: - ItemData(249 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 16, SC2Race.TERRAN, - parent_item=ItemNames.MEDIVAC, origin={"ext"}, - description="Medivacs get 100 shields."), - ItemNames.REAPER_PROGRESSIVE_STIMPACK: - ItemData(250 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 10, SC2Race.TERRAN, - parent_item=ItemNames.REAPER, quantity=2, origin={"nco"}, - description=STIMPACK_SMALL_DESCRIPTION), - ItemNames.REAPER_LASER_TARGETING_SYSTEM: - ItemData(251 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 17, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.REAPER, origin={"nco"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.REAPER_ADVANCED_CLOAKING_FIELD: - ItemData(252 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 18, SC2Race.TERRAN, - parent_item=ItemNames.REAPER, origin={"nco"}, - description="Reapers are permanently cloaked."), - ItemNames.REAPER_SPIDER_MINES: - ItemData(253 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 19, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.REAPER, origin={"nco"}, - important_for_filtering=True, - description="Allows Reapers to lay Spider Mines. 3 charges per Reaper."), - ItemNames.REAPER_COMBAT_DRUGS: - ItemData(254 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 20, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.REAPER, origin={"ext"}, - description="Reapers regenerate life while out of combat."), - ItemNames.HELLION_HELLBAT_ASPECT: - ItemData(255 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 21, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.HELLION, origin={"nco"}, - description="Allows Hellions to transform into Hellbats."), - ItemNames.HELLION_SMART_SERVOS: - ItemData(256 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 22, SC2Race.TERRAN, - parent_item=ItemNames.HELLION, origin={"nco"}, - description="Transforms faster between modes. Hellions can attack while moving."), - ItemNames.HELLION_OPTIMIZED_LOGISTICS: - ItemData(257 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 23, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.HELLION, origin={"nco"}, - description="Increases Hellion training speed."), - ItemNames.HELLION_JUMP_JETS: - ItemData(258 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.HELLION, origin={"nco"}, - description=inspect.cleandoc( - """ - Increases movement speed in Hellion mode. - In Hellbat mode, launches the Hellbat toward enemy ground units and briefly stuns them. - """ - )), - ItemNames.HELLION_PROGRESSIVE_STIMPACK: - ItemData(259 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 12, SC2Race.TERRAN, - parent_item=ItemNames.HELLION, quantity=2, origin={"nco"}, - description=STIMPACK_LARGE_DESCRIPTION), - ItemNames.VULTURE_ION_THRUSTERS: - ItemData(260 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.VULTURE, origin={"bw"}, - description="Increases Vulture movement speed."), - ItemNames.VULTURE_AUTO_LAUNCHERS: - ItemData(261 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 26, SC2Race.TERRAN, - parent_item=ItemNames.VULTURE, origin={"bw"}, - description="Allows Vultures to attack while moving."), - ItemNames.SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION: - ItemData(262 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 27, SC2Race.TERRAN, - origin={"bw"}, - description="Increases Spider mine damage."), - ItemNames.GOLIATH_JUMP_JETS: - ItemData(263 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 28, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.GOLIATH, origin={"nco"}, - description="Allows Goliaths to jump up and down cliffs."), - ItemNames.GOLIATH_OPTIMIZED_LOGISTICS: - ItemData(264 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 29, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.GOLIATH, origin={"nco"}, - description="Increases Goliath training speed."), - ItemNames.DIAMONDBACK_HYPERFLUXOR: - ItemData(265 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 0, SC2Race.TERRAN, - parent_item=ItemNames.DIAMONDBACK, origin={"ext"}, - description="Increases Diamondback attack speed."), - ItemNames.DIAMONDBACK_BURST_CAPACITORS: - ItemData(266 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.DIAMONDBACK, origin={"ext"}, - description=inspect.cleandoc( - """ - While not attacking, the Diamondback charges its weapon. - The next attack does 10 additional damage. - """ - )), - ItemNames.DIAMONDBACK_RESOURCE_EFFICIENCY: - ItemData(267 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 2, SC2Race.TERRAN, - parent_item=ItemNames.DIAMONDBACK, origin={"ext"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Diamondback")), - ItemNames.SIEGE_TANK_JUMP_JETS: - ItemData(268 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 3, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.SIEGE_TANK, origin={"nco"}, - description=inspect.cleandoc( - """ - Repositions Siege Tank to a target location. - Can be used in either mode and to jump up and down cliffs. - """ - )), - ItemNames.SIEGE_TANK_SPIDER_MINES: - ItemData(269 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 4, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco"}, - important_for_filtering=True, - description=inspect.cleandoc( - """ - Allows Siege Tanks to lay Spider Mines. - Lays 3 Spider Mines at once. 3 charges - """ - )), - ItemNames.SIEGE_TANK_SMART_SERVOS: - ItemData(270 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 5, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco"}, - description=SMART_SERVOS_DESCRIPTION), - ItemNames.SIEGE_TANK_GRADUATING_RANGE: - ItemData(271 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 6, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.SIEGE_TANK, origin={"ext"}, - description=inspect.cleandoc( - """ - Increases the Siege Tank's attack range by 1 every 3 seconds while in Siege Mode, - up to a maximum of 5 additional range. - """ - )), - ItemNames.SIEGE_TANK_LASER_TARGETING_SYSTEM: - ItemData(272 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 7, SC2Race.TERRAN, - parent_item=ItemNames.SIEGE_TANK, origin={"nco"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.SIEGE_TANK_ADVANCED_SIEGE_TECH: - ItemData(273 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 8, SC2Race.TERRAN, - parent_item=ItemNames.SIEGE_TANK, origin={"ext"}, - description="Siege Tanks gain +3 armor in Siege Mode."), - ItemNames.SIEGE_TANK_INTERNAL_TECH_MODULE: - ItemData(274 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 9, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.SIEGE_TANK, origin={"nco"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Siege Tanks", "Factory")), - ItemNames.PREDATOR_RESOURCE_EFFICIENCY: - ItemData(275 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 10, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.PREDATOR, origin={"ext"}, - description="Decreases Predator resource and supply cost."), - ItemNames.MEDIVAC_EXPANDED_HULL: - ItemData(276 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 11, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC, origin={"ext"}, - description="Increases Medivac cargo space by 4."), - ItemNames.MEDIVAC_AFTERBURNERS: - ItemData(277 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 12, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC, origin={"ext"}, - description="Ability. Temporarily increases the Medivac's movement speed by 70%."), - ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY: - ItemData(278 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 13, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.WRAITH, origin={"ext"}, - description=inspect.cleandoc( - """ - Burst Lasers do more damage and can hit both ground and air targets. - Replaces Gemini Missiles weapon. - """ - )), - ItemNames.VIKING_SMART_SERVOS: - ItemData(279 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 14, SC2Race.TERRAN, - parent_item=ItemNames.VIKING, origin={"ext"}, - description=SMART_SERVOS_DESCRIPTION), - ItemNames.VIKING_ANTI_MECHANICAL_MUNITION: - ItemData(280 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 15, SC2Race.TERRAN, - parent_item=ItemNames.VIKING, origin={"ext"}, - description="Increases Viking damage to mechanical units while in Assault Mode."), - ItemNames.DIAMONDBACK_ION_THRUSTERS: - ItemData(281 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 21, SC2Race.TERRAN, - parent_item=ItemNames.DIAMONDBACK, origin={"ext"}, - description="Increases Diamondback movement speed."), - ItemNames.WARHOUND_RESOURCE_EFFICIENCY: - ItemData(282 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 13, SC2Race.TERRAN, - parent_item=ItemNames.WARHOUND, origin={"ext"}, - description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Warhound")), - ItemNames.WARHOUND_REINFORCED_PLATING: - ItemData(283 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 14, SC2Race.TERRAN, - parent_item=ItemNames.WARHOUND, origin={"ext"}, - description="Increases Warhound armor by 2."), - ItemNames.HERC_RESOURCE_EFFICIENCY: - ItemData(284 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 15, SC2Race.TERRAN, - parent_item=ItemNames.HERC, origin={"ext"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("HERC")), - ItemNames.HERC_JUGGERNAUT_PLATING: - ItemData(285 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 16, SC2Race.TERRAN, - parent_item=ItemNames.HERC, origin={"ext"}, - description="Increases HERC armor by 2."), - ItemNames.HERC_KINETIC_FOAM: - ItemData(286 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 17, SC2Race.TERRAN, - parent_item=ItemNames.HERC, origin={"ext"}, - description="Increases HERC life by 50."), - - ItemNames.HELLION_TWIN_LINKED_FLAMETHROWER: - ItemData(300 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 16, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.HELLION, - description="Doubles the width of the Hellion's flame attack."), - ItemNames.HELLION_THERMITE_FILAMENTS: - ItemData(301 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 17, SC2Race.TERRAN, - parent_item=ItemNames.HELLION, - description="Hellions do an additional 10 damage to Light Armor."), - ItemNames.SPIDER_MINE_CERBERUS_MINE: - ItemData(302 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 18, SC2Race.TERRAN, - classification=ItemClassification.filler, - description="Increases trigger and blast radius of Spider Mines."), - ItemNames.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE: - ItemData(303 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 16, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.VULTURE, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Allows Vultures to replace used Spider Mines. Costs 15 minerals. - Level 2: Replacing used Spider Mines no longer costs minerals. - """ - )), - ItemNames.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM: - ItemData(304 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 19, SC2Race.TERRAN, - parent_item=ItemNames.GOLIATH, - description="Goliaths can attack both ground and air targets simultaneously."), - ItemNames.GOLIATH_ARES_CLASS_TARGETING_SYSTEM: - ItemData(305 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 20, SC2Race.TERRAN, - parent_item=ItemNames.GOLIATH, - description="Increases Goliath ground attack range by 1 and air by 3."), - ItemNames.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL: - ItemData(306 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade 2", 4, SC2Race.TERRAN, - parent_item=ItemNames.DIAMONDBACK, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Tri-Lithium Power Cell: Increases Diamondback attack range by 1. - Level 2: Tungsten Spikes: Increases Diamondback attack range by 3. - """ - )), - ItemNames.DIAMONDBACK_SHAPED_HULL: - ItemData(307 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 22, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.DIAMONDBACK, - description="Increases Diamondback life by 50."), - ItemNames.SIEGE_TANK_MAELSTROM_ROUNDS: - ItemData(308 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 23, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.SIEGE_TANK, - description="Siege Tanks do an additional 40 damage to the primary target in Siege Mode."), - ItemNames.SIEGE_TANK_SHAPED_BLAST: - ItemData(309 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 24, SC2Race.TERRAN, - parent_item=ItemNames.SIEGE_TANK, - description="Reduces splash damage to friendly targets while in Siege Mode by 75%."), - ItemNames.MEDIVAC_RAPID_DEPLOYMENT_TUBE: - ItemData(310 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC, - description="Medivacs deploy loaded troops almost instantly."), - ItemNames.MEDIVAC_ADVANCED_HEALING_AI: - ItemData(311 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 26, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.MEDIVAC, - description="Medivacs can heal two targets at once."), - ItemNames.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS: - ItemData(312 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 18, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.WRAITH, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Tomahawk Power Cells: Increases Wraith starting energy by 100. - Level 2: Unregistered Cloaking Module: Wraiths do not require energy to cloak and remain cloaked. - """ - )), - ItemNames.WRAITH_DISPLACEMENT_FIELD: - ItemData(313 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 27, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.WRAITH, - description="Wraiths evade 20% of incoming attacks while cloaked."), - ItemNames.VIKING_RIPWAVE_MISSILES: - ItemData(314 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 28, SC2Race.TERRAN, - parent_item=ItemNames.VIKING, - description="Vikings do area damage while in Fighter Mode"), - ItemNames.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM: - ItemData(315 + SC2WOL_ITEM_ID_OFFSET, "Armory 3", 29, SC2Race.TERRAN, - parent_item=ItemNames.VIKING, - description="Increases Viking attack range by 1 in Assault mode and 2 in Fighter mode."), - ItemNames.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS: - ItemData(316 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Banshees can remain cloaked twice as long. - Level 2: Banshees do not require energy to cloak and remain cloaked. - """ - )), - ItemNames.BANSHEE_SHOCKWAVE_MISSILE_BATTERY: - ItemData(317 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.BANSHEE, - description="Banshees do area damage in a straight line."), - ItemNames.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS: - ItemData(318 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade 2", 2, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, quantity=2, - description="Spell. Missile Pods do damage to air targets in a target area."), - ItemNames.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX: - ItemData(319 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 20, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Spell. For 20 seconds the Battlecruiser gains a shield that can absorb up to 200 damage. - Level 2: Passive. Battlecruiser gets 200 shields. - """ - )), - ItemNames.GHOST_OCULAR_IMPLANTS: - ItemData(320 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 2, SC2Race.TERRAN, - parent_item=ItemNames.GHOST, - description="Increases Ghost sight range by 3 and attack range by 2."), - ItemNames.GHOST_CRIUS_SUIT: - ItemData(321 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 3, SC2Race.TERRAN, - parent_item=ItemNames.GHOST, - description="Cloak no longer requires energy to activate or maintain."), - ItemNames.SPECTRE_PSIONIC_LASH: - ItemData(322 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 4, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.SPECTRE, - description="Spell. Deals 200 damage to a single target."), - ItemNames.SPECTRE_NYX_CLASS_CLOAKING_MODULE: - ItemData(323 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 5, SC2Race.TERRAN, - parent_item=ItemNames.SPECTRE, - description="Cloak no longer requires energy to activate or maintain."), - ItemNames.THOR_330MM_BARRAGE_CANNON: - ItemData(324 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 6, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.THOR, - description=inspect.cleandoc( - """ - Improves 250mm Strike Cannons ability to deal area damage and stun units in a small area. - Can be also freely aimed on ground. - """ - )), - ItemNames.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL: - ItemData(325 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 22, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.THOR, quantity=2, - description=inspect.cleandoc(""" - Level 1: Allows destroyed Thors to be reconstructed on the field. Costs Vespene Gas. - Level 2: Thors are automatically reconstructed after falling for free. - """ - )), - ItemNames.LIBERATOR_ADVANCED_BALLISTICS: - ItemData(326 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 7, SC2Race.TERRAN, - parent_item=ItemNames.LIBERATOR, origin={"ext"}, - description="Increases Liberator range by 3 in Defender Mode."), - ItemNames.LIBERATOR_RAID_ARTILLERY: - ItemData(327 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 8, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.LIBERATOR, origin={"nco"}, - description="Allows Liberators to attack structures while in Defender Mode."), - ItemNames.WIDOW_MINE_DRILLING_CLAWS: - ItemData(328 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 9, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.WIDOW_MINE, origin={"ext"}, - description="Allows Widow Mines to burrow and unburrow faster."), - ItemNames.WIDOW_MINE_CONCEALMENT: - ItemData(329 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 10, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.WIDOW_MINE, origin={"ext"}, - description="Burrowed Widow Mines are no longer revealed when the Sentinel Missile is on cooldown."), - ItemNames.MEDIVAC_ADVANCED_CLOAKING_FIELD: - ItemData(330 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 11, SC2Race.TERRAN, - parent_item=ItemNames.MEDIVAC, origin={"ext"}, - description="Medivacs are permanently cloaked."), - ItemNames.WRAITH_TRIGGER_OVERRIDE: - ItemData(331 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 12, SC2Race.TERRAN, - parent_item=ItemNames.WRAITH, origin={"ext"}, - description="Wraith attack speed increases by 10% with each attack, up to a maximum of 100%."), - ItemNames.WRAITH_INTERNAL_TECH_MODULE: - ItemData(332 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 13, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.WRAITH, origin={"bw"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Wraiths", "Starport")), - ItemNames.WRAITH_RESOURCE_EFFICIENCY: - ItemData(333 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 14, SC2Race.TERRAN, - parent_item=ItemNames.WRAITH, origin={"bw"}, - description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Wraith")), - ItemNames.VIKING_SHREDDER_ROUNDS: - ItemData(334 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 15, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.VIKING, origin={"ext"}, - description="Attacks in Assault mode do line splash damage."), - ItemNames.VIKING_WILD_MISSILES: - ItemData(335 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 16, SC2Race.TERRAN, - parent_item=ItemNames.VIKING, origin={"ext"}, - description="Launches 5 rockets at the target unit. Each rocket does 25 (40 vs armored) damage."), - ItemNames.BANSHEE_SHAPED_HULL: - ItemData(336 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 17, SC2Race.TERRAN, - parent_item=ItemNames.BANSHEE, origin={"ext"}, - description="Increases Banshee life by 100."), - ItemNames.BANSHEE_ADVANCED_TARGETING_OPTICS: - ItemData(337 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 18, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.BANSHEE, origin={"ext"}, - description="Increases Banshee attack range by 2 while cloaked."), - ItemNames.BANSHEE_DISTORTION_BLASTERS: - ItemData(338 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 19, SC2Race.TERRAN, - parent_item=ItemNames.BANSHEE, origin={"ext"}, - description="Increases Banshee attack damage by 25% while cloaked."), - ItemNames.BANSHEE_ROCKET_BARRAGE: - ItemData(339 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 20, SC2Race.TERRAN, - parent_item=ItemNames.BANSHEE, origin={"ext"}, - description="Deals 75 damage to enemy ground units in the target area."), - ItemNames.GHOST_RESOURCE_EFFICIENCY: - ItemData(340 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 21, SC2Race.TERRAN, - parent_item=ItemNames.GHOST, origin={"bw"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Ghost")), - ItemNames.SPECTRE_RESOURCE_EFFICIENCY: - ItemData(341 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 22, SC2Race.TERRAN, - parent_item=ItemNames.SPECTRE, origin={"ext"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Spectre")), - ItemNames.THOR_BUTTON_WITH_A_SKULL_ON_IT: - ItemData(342 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 23, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.THOR, origin={"ext"}, - description="Allows Thors to launch nukes."), - ItemNames.THOR_LASER_TARGETING_SYSTEM: - ItemData(343 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.THOR, origin={"ext"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.THOR_LARGE_SCALE_FIELD_CONSTRUCTION: - ItemData(344 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.THOR, origin={"ext"}, - description="Allows Thors to be built by SCVs like a structure."), - ItemNames.RAVEN_RESOURCE_EFFICIENCY: - ItemData(345 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 26, SC2Race.TERRAN, - parent_item=ItemNames.RAVEN, origin={"ext"}, - description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Raven")), - ItemNames.RAVEN_DURABLE_MATERIALS: - ItemData(346 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 27, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.RAVEN, origin={"ext"}, - description="Extends timed life duration of Raven's summoned objects."), - ItemNames.SCIENCE_VESSEL_IMPROVED_NANO_REPAIR: - ItemData(347 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 28, SC2Race.TERRAN, - parent_item=ItemNames.SCIENCE_VESSEL, origin={"ext"}, - description="Nano-Repair no longer requires energy to use."), - ItemNames.SCIENCE_VESSEL_ADVANCED_AI_SYSTEMS: - ItemData(348 + SC2WOL_ITEM_ID_OFFSET, "Armory 4", 29, SC2Race.TERRAN, - parent_item=ItemNames.SCIENCE_VESSEL, origin={"ext"}, - description="Science Vessel can use Nano-Repair at two targets at once."), - ItemNames.CYCLONE_RESOURCE_EFFICIENCY: - ItemData(349 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 0, SC2Race.TERRAN, - parent_item=ItemNames.CYCLONE, origin={"ext"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Cyclone")), - ItemNames.BANSHEE_HYPERFLIGHT_ROTORS: - ItemData(350 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, origin={"ext"}, - description="Increases Banshee movement speed."), - ItemNames.BANSHEE_LASER_TARGETING_SYSTEM: - ItemData(351 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, origin={"nco"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.BANSHEE_INTERNAL_TECH_MODULE: - ItemData(352 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 3, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BANSHEE, origin={"nco"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Banshees", "Starport")), - ItemNames.BATTLECRUISER_TACTICAL_JUMP: - ItemData(353 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 4, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, origin={"nco", "ext"}, - description=inspect.cleandoc( - """ - Allows Battlecruisers to warp to a target location anywhere on the map. - """ - )), - ItemNames.BATTLECRUISER_CLOAK: - ItemData(354 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 5, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, origin={"nco"}, - description=CLOAK_DESCRIPTION_TEMPLATE.format("Battlecruisers")), - ItemNames.BATTLECRUISER_ATX_LASER_BATTERY: - ItemData(355 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 6, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.BATTLECRUISER, origin={"nco"}, - description=inspect.cleandoc( - """ - Battlecruisers can attack while moving, - do the same damage to both ground and air targets, and fire faster. - """ - )), - ItemNames.BATTLECRUISER_OPTIMIZED_LOGISTICS: - ItemData(356 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 7, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BATTLECRUISER, origin={"ext"}, - description="Increases Battlecruiser training speed."), - ItemNames.BATTLECRUISER_INTERNAL_TECH_MODULE: - ItemData(357 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 8, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.BATTLECRUISER, origin={"nco"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Battlecruisers", "Starport")), - ItemNames.GHOST_EMP_ROUNDS: - ItemData(358 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 9, SC2Race.TERRAN, - parent_item=ItemNames.GHOST, origin={"ext"}, - description=inspect.cleandoc( - """ - Spell. Does 100 damage to shields and drains all energy from units in the targeted area. - Cloaked units hit by EMP are revealed for a short time. - """ - )), - ItemNames.GHOST_LOCKDOWN: - ItemData(359 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 10, SC2Race.TERRAN, - parent_item=ItemNames.GHOST, origin={"bw"}, - description="Spell. Stuns a target mechanical unit for a long time."), - ItemNames.SPECTRE_IMPALER_ROUNDS: - ItemData(360 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 11, SC2Race.TERRAN, - parent_item=ItemNames.SPECTRE, origin={"ext"}, - description="Spectres do additional damage to armored targets."), - ItemNames.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD: - ItemData(361 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 14, SC2Race.TERRAN, - parent_item=ItemNames.THOR, quantity=2, origin={"ext"}, - description=inspect.cleandoc( - f""" - Level 1: Allows Thors to transform in order to use an alternative air attack. - Level 2: {SMART_SERVOS_DESCRIPTION} - """ - )), - ItemNames.RAVEN_BIO_MECHANICAL_REPAIR_DRONE: - ItemData(363 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 12, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.RAVEN, origin={"nco"}, - description="Spell. Deploys a drone that can heal biological or mechanical units."), - ItemNames.RAVEN_SPIDER_MINES: - ItemData(364 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 13, SC2Race.TERRAN, - parent_item=ItemNames.RAVEN, origin={"nco"}, important_for_filtering=True, - description="Spell. Deploys 3 Spider Mines to a target location."), - ItemNames.RAVEN_RAILGUN_TURRET: - ItemData(365 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 14, SC2Race.TERRAN, - parent_item=ItemNames.RAVEN, origin={"nco"}, - description=inspect.cleandoc( - """ - Spell. Allows Ravens to deploy an advanced Auto-Turret, - that can attack enemy ground units in a straight line. - """ - )), - ItemNames.RAVEN_HUNTER_SEEKER_WEAPON: - ItemData(366 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 15, SC2Race.TERRAN, - classification=ItemClassification.progression, parent_item=ItemNames.RAVEN, origin={"nco"}, - description="Allows Ravens to attack with a Hunter-Seeker weapon."), - ItemNames.RAVEN_INTERFERENCE_MATRIX: - ItemData(367 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 16, SC2Race.TERRAN, - parent_item=ItemNames.RAVEN, origin={"ext"}, - description=inspect.cleandoc( - """ - Spell. Target enemy Mechanical or Psionic unit can't attack or use abilities for a short duration. - """ - )), - ItemNames.RAVEN_ANTI_ARMOR_MISSILE: - ItemData(368 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 17, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.RAVEN, origin={"ext"}, - description="Spell. Decreases target and nearby enemy units armor by 2."), - ItemNames.RAVEN_INTERNAL_TECH_MODULE: - ItemData(369 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 18, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.RAVEN, origin={"nco"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Ravens", "Starport")), - ItemNames.SCIENCE_VESSEL_EMP_SHOCKWAVE: - ItemData(370 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 19, SC2Race.TERRAN, - parent_item=ItemNames.SCIENCE_VESSEL, origin={"bw"}, - description="Spell. Depletes all energy and shields of all units in a target area."), - ItemNames.SCIENCE_VESSEL_DEFENSIVE_MATRIX: - ItemData(371 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 20, SC2Race.TERRAN, - parent_item=ItemNames.SCIENCE_VESSEL, origin={"bw"}, - description=inspect.cleandoc( - """ - Spell. Provides a target unit with a defensive barrier that can absorb up to 250 damage - """ - )), - ItemNames.CYCLONE_TARGETING_OPTICS: - ItemData(372 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 21, SC2Race.TERRAN, - parent_item=ItemNames.CYCLONE, origin={"ext"}, - description="Increases Cyclone Lock On casting range and the range while Locked On."), - ItemNames.CYCLONE_RAPID_FIRE_LAUNCHERS: - ItemData(373 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 22, SC2Race.TERRAN, - parent_item=ItemNames.CYCLONE, origin={"ext"}, - description="The first 12 shots of Lock On are fired more quickly."), - ItemNames.LIBERATOR_CLOAK: - ItemData(374 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 23, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"nco"}, - description=CLOAK_DESCRIPTION_TEMPLATE.format("Liberators")), - ItemNames.LIBERATOR_LASER_TARGETING_SYSTEM: - ItemData(375 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 24, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"ext"}, - description=LASER_TARGETING_SYSTEMS_DESCRIPTION), - ItemNames.LIBERATOR_OPTIMIZED_LOGISTICS: - ItemData(376 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 25, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"nco"}, - description="Increases Liberator training speed."), - ItemNames.WIDOW_MINE_BLACK_MARKET_LAUNCHERS: - ItemData(377 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 26, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.WIDOW_MINE, origin={"ext"}, - description="Increases Widow Mine Sentinel Missile range."), - ItemNames.WIDOW_MINE_EXECUTIONER_MISSILES: - ItemData(378 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 27, SC2Race.TERRAN, - parent_item=ItemNames.WIDOW_MINE, origin={"ext"}, - description=inspect.cleandoc( - """ - Reduces Sentinel Missile cooldown. - When killed, Widow Mines will launch several missiles at random enemy targets. - """ - )), - ItemNames.VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS: - ItemData(379 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 28, - SC2Race.TERRAN, parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description="Valkyries fire 2 additional rockets each volley."), - ItemNames.VALKYRIE_SHAPED_HULL: - ItemData(380 + SC2WOL_ITEM_ID_OFFSET, "Armory 5", 29, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description="Increases Valkyrie life by 50."), - ItemNames.VALKYRIE_FLECHETTE_MISSILES: - ItemData(381 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 0, SC2Race.TERRAN, - parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description="Equips Valkyries with Air-to-Surface missiles to attack ground units."), - ItemNames.VALKYRIE_AFTERBURNERS: - ItemData(382 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 1, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description="Ability. Temporarily increases the Valkyries's movement speed by 70%."), - ItemNames.CYCLONE_INTERNAL_TECH_MODULE: - ItemData(383 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 2, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.CYCLONE, origin={"ext"}, - description=INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Cyclones", "Factory")), - ItemNames.LIBERATOR_SMART_SERVOS: - ItemData(384 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 3, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"nco"}, - description=SMART_SERVOS_DESCRIPTION), - ItemNames.LIBERATOR_RESOURCE_EFFICIENCY: - ItemData(385 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 4, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.LIBERATOR, origin={"ext"}, - description=RESOURCE_EFFICIENCY_NO_SUPPLY_DESCRIPTION_TEMPLATE.format("Liberator")), - ItemNames.HERCULES_INTERNAL_FUSION_MODULE: - ItemData(386 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 5, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.HERCULES, origin={"ext"}, - description="Hercules can be trained from a Starport without having a Fusion Core."), - ItemNames.HERCULES_TACTICAL_JUMP: - ItemData(387 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 6, SC2Race.TERRAN, - parent_item=ItemNames.HERCULES, origin={"ext"}, - description=inspect.cleandoc( - """ - Allows Hercules to warp to a target location anywhere on the map. - """ - )), - ItemNames.PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS: - ItemData(388 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 28, SC2Race.TERRAN, - parent_item=ItemNames.PLANETARY_FORTRESS, origin={"ext"}, quantity=2, - description=inspect.cleandoc( - """ - Level 1: Lift Off - Planetary Fortress can lift off. - Level 2: Armament Stabilizers - Planetary Fortress can attack while lifted off. - """ - )), - ItemNames.PLANETARY_FORTRESS_ADVANCED_TARGETING: - ItemData(389 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 7, SC2Race.TERRAN, - parent_item=ItemNames.PLANETARY_FORTRESS, origin={"ext"}, - description="Planetary Fortress can attack air units."), - ItemNames.VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR: - ItemData(390 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 8, SC2Race.TERRAN, - classification=ItemClassification.filler, parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description="Allows Valkyries to shoot air while moving."), - ItemNames.VALKYRIE_RESOURCE_EFFICIENCY: - ItemData(391 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 9, SC2Race.TERRAN, - parent_item=ItemNames.VALKYRIE, origin={"ext"}, - description=RESOURCE_EFFICIENCY_DESCRIPTION_TEMPLATE.format("Valkyrie")), - ItemNames.PREDATOR_PREDATOR_S_FURY: - ItemData(392 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 10, SC2Race.TERRAN, - parent_item=ItemNames.PREDATOR, origin={"ext"}, - description="Predators can use an attack that jumps between targets."), - ItemNames.BATTLECRUISER_BEHEMOTH_PLATING: - ItemData(393 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 11, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, origin={"ext"}, - description="Increases Battlecruiser armor by 2."), - ItemNames.BATTLECRUISER_COVERT_OPS_ENGINES: - ItemData(394 + SC2WOL_ITEM_ID_OFFSET, "Armory 6", 12, SC2Race.TERRAN, - parent_item=ItemNames.BATTLECRUISER, origin={"nco"}, - description="Increases Battlecruiser movement speed."), - - #Buildings - ItemNames.BUNKER: - ItemData(400 + SC2WOL_ITEM_ID_OFFSET, "Building", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Defensive structure. Able to load infantry units, giving them +1 range to their attacks."), - ItemNames.MISSILE_TURRET: - ItemData(401 + SC2WOL_ITEM_ID_OFFSET, "Building", 1, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Anti-air defensive structure."), - ItemNames.SENSOR_TOWER: - ItemData(402 + SC2WOL_ITEM_ID_OFFSET, "Building", 2, SC2Race.TERRAN, - description="Reveals locations of enemy units at long range."), - - ItemNames.WAR_PIGS: - ItemData(500 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 0, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Mercenary Marines"), - ItemNames.DEVIL_DOGS: - ItemData(501 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 1, SC2Race.TERRAN, - classification=ItemClassification.filler, - description="Mercenary Firebats"), - ItemNames.HAMMER_SECURITIES: - ItemData(502 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 2, SC2Race.TERRAN, - description="Mercenary Marauders"), - ItemNames.SPARTAN_COMPANY: - ItemData(503 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 3, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Mercenary Goliaths"), - ItemNames.SIEGE_BREAKERS: - ItemData(504 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 4, SC2Race.TERRAN, - description="Mercenary Siege Tanks"), - ItemNames.HELS_ANGELS: - ItemData(505 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 5, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Mercenary Vikings"), - ItemNames.DUSK_WINGS: - ItemData(506 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 6, SC2Race.TERRAN, - description="Mercenary Banshees"), - ItemNames.JACKSONS_REVENGE: - ItemData(507 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 7, SC2Race.TERRAN, - description="Mercenary Battlecruiser"), - ItemNames.SKIBIS_ANGELS: - ItemData(508 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 8, SC2Race.TERRAN, - origin={"ext"}, - description="Mercenary Medics"), - ItemNames.DEATH_HEADS: - ItemData(509 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 9, SC2Race.TERRAN, - origin={"ext"}, - description="Mercenary Reapers"), - ItemNames.WINGED_NIGHTMARES: - ItemData(510 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 10, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description="Mercenary Wraiths"), - ItemNames.MIDNIGHT_RIDERS: - ItemData(511 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 11, SC2Race.TERRAN, - origin={"ext"}, - description="Mercenary Liberators"), - ItemNames.BRYNHILDS: - ItemData(512 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 12, SC2Race.TERRAN, - classification=ItemClassification.progression, origin={"ext"}, - description="Mercenary Valkyries"), - ItemNames.JOTUN: - ItemData(513 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 13, SC2Race.TERRAN, - origin={"ext"}, - description="Mercenary Thor"), - - ItemNames.ULTRA_CAPACITORS: - ItemData(600 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 0, SC2Race.TERRAN, - description="Increases attack speed of units by 5% per weapon upgrade."), - ItemNames.VANADIUM_PLATING: - ItemData(601 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 1, SC2Race.TERRAN, - description="Increases the life of units by 5% per armor upgrade."), - ItemNames.ORBITAL_DEPOTS: - ItemData(602 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 2, SC2Race.TERRAN, - description="Supply depots are built instantly."), - ItemNames.MICRO_FILTERING: - ItemData(603 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 3, SC2Race.TERRAN, - description="Refineries produce Vespene gas 25% faster."), - ItemNames.AUTOMATED_REFINERY: - ItemData(604 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 4, SC2Race.TERRAN, - description="Eliminates the need for SCVs in vespene gas production."), - ItemNames.COMMAND_CENTER_REACTOR: - ItemData(605 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 5, SC2Race.TERRAN, - description="Command Centers can train two SCVs at once."), - ItemNames.RAVEN: - ItemData(606 + SC2WOL_ITEM_ID_OFFSET, "Unit", 22, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Aerial Caster unit."), - ItemNames.SCIENCE_VESSEL: - ItemData(607 + SC2WOL_ITEM_ID_OFFSET, "Unit", 23, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Aerial Caster unit. Can repair mechanical units."), - ItemNames.TECH_REACTOR: - ItemData(608 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 6, SC2Race.TERRAN, - description="Merges Tech Labs and Reactors into one add on structure to provide both functions."), - ItemNames.ORBITAL_STRIKE: - ItemData(609 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 7, SC2Race.TERRAN, - description="Trained units from Barracks are instantly deployed on rally point."), - ItemNames.BUNKER_SHRIKE_TURRET: - ItemData(610 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 6, SC2Race.TERRAN, - parent_item=ItemNames.BUNKER, - description="Adds an automated turret to Bunkers."), - ItemNames.BUNKER_FORTIFIED_BUNKER: - ItemData(611 + SC2WOL_ITEM_ID_OFFSET, "Armory 1", 7, SC2Race.TERRAN, - parent_item=ItemNames.BUNKER, - description="Bunkers have more life."), - ItemNames.PLANETARY_FORTRESS: - ItemData(612 + SC2WOL_ITEM_ID_OFFSET, "Building", 3, SC2Race.TERRAN, - classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Allows Command Centers to upgrade into a defensive structure with a turret and additional armor. - Planetary Fortresses cannot Lift Off, or cast Orbital Command spells. - """ - )), - ItemNames.PERDITION_TURRET: - ItemData(613 + SC2WOL_ITEM_ID_OFFSET, "Building", 4, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Automated defensive turret. Burrows down while no enemies are nearby."), - ItemNames.PREDATOR: - ItemData(614 + SC2WOL_ITEM_ID_OFFSET, "Unit", 24, SC2Race.TERRAN, - classification=ItemClassification.filler, - description="Anti-infantry specialist that deals area damage with each attack."), - ItemNames.HERCULES: - ItemData(615 + SC2WOL_ITEM_ID_OFFSET, "Unit", 25, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Massive transport ship."), - ItemNames.CELLULAR_REACTOR: - ItemData(616 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 8, SC2Race.TERRAN, - description="All Terran spellcasters get +100 starting and maximum energy."), - ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL: - ItemData(617 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade", 4, SC2Race.TERRAN, quantity=3, - classification= ItemClassification.progression, - description=inspect.cleandoc( - """ - Allows Terran mechanical units to regenerate health while not in combat. - Each level increases life regeneration speed. - """ - )), - ItemNames.HIVE_MIND_EMULATOR: - ItemData(618 + SC2WOL_ITEM_ID_OFFSET, "Building", 5, SC2Race.TERRAN, - ItemClassification.progression, - description="Defensive structure. Can permanently Mind Control Zerg units."), - ItemNames.PSI_DISRUPTER: - ItemData(619 + SC2WOL_ITEM_ID_OFFSET, "Building", 6, SC2Race.TERRAN, - classification=ItemClassification.progression, - description="Defensive structure. Slows the attack and movement speeds of all nearby Zerg units."), - ItemNames.STRUCTURE_ARMOR: - ItemData(620 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 9, SC2Race.TERRAN, - description="Increases armor of all Terran structures by 2.", origin={"ext"}), - ItemNames.HI_SEC_AUTO_TRACKING: - ItemData(621 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 10, SC2Race.TERRAN, - description="Increases attack range of all Terran structures by 1.", origin={"ext"}), - ItemNames.ADVANCED_OPTICS: - ItemData(622 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 11, SC2Race.TERRAN, - description="Increases attack range of all Terran mechanical units by 1.", origin={"ext"}), - ItemNames.ROGUE_FORCES: - ItemData(623 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 12, SC2Race.TERRAN, - description="Mercenary calldowns are no longer limited by charges.", origin={"ext"}), - - ItemNames.ZEALOT: - ItemData(700 + SC2WOL_ITEM_ID_OFFSET, "Unit", 0, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Powerful melee warrior. Can use the charge ability."), - ItemNames.STALKER: - ItemData(701 + SC2WOL_ITEM_ID_OFFSET, "Unit", 1, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Ranged attack strider. Can use the Blink ability."), - ItemNames.HIGH_TEMPLAR: - ItemData(702 + SC2WOL_ITEM_ID_OFFSET, "Unit", 2, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Potent psionic master. Can use the Feedback and Psionic Storm abilities. Can merge into an Archon."), - ItemNames.DARK_TEMPLAR: - ItemData(703 + SC2WOL_ITEM_ID_OFFSET, "Unit", 3, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Deadly warrior-assassin. Permanently cloaked. Can use the Shadow Fury ability."), - ItemNames.IMMORTAL: - ItemData(704 + SC2WOL_ITEM_ID_OFFSET, "Unit", 4, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Assault strider. Can use Barrier to absorb damage."), - ItemNames.COLOSSUS: - ItemData(705 + SC2WOL_ITEM_ID_OFFSET, "Unit", 5, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Battle strider with a powerful area attack. Can walk up and down cliffs. Attacks set fire to the ground, dealing extra damage to enemies over time."), - ItemNames.PHOENIX: - ItemData(706 + SC2WOL_ITEM_ID_OFFSET, "Unit", 6, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Air superiority starfighter. Can use Graviton Beam and Phasing Armor abilities."), - ItemNames.VOID_RAY: - ItemData(707 + SC2WOL_ITEM_ID_OFFSET, "Unit", 7, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Surgical strike craft. Has the Prismatic Alignment and Prismatic Range abilities."), - ItemNames.CARRIER: - ItemData(708 + SC2WOL_ITEM_ID_OFFSET, "Unit", 8, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"wol", "lotv"}, - description="Capital ship. Builds and launches Interceptors that attack enemy targets. Repair Drones heal nearby mechanical units."), - - # Filler items to fill remaining spots - ItemNames.STARTING_MINERALS: - ItemData(800 + SC2WOL_ITEM_ID_OFFSET, "Minerals", 15, SC2Race.ANY, quantity=0, - classification=ItemClassification.filler, - description="Increases the starting minerals for all missions."), - ItemNames.STARTING_VESPENE: - ItemData(801 + SC2WOL_ITEM_ID_OFFSET, "Vespene", 15, SC2Race.ANY, quantity=0, - classification=ItemClassification.filler, - description="Increases the starting vespene for all missions."), - ItemNames.STARTING_SUPPLY: - ItemData(802 + SC2WOL_ITEM_ID_OFFSET, "Supply", 2, SC2Race.ANY, quantity=0, - classification=ItemClassification.filler, - description="Increases the starting supply for all missions."), - # This item is used to "remove" location from the game. Never placed unless plando'd - ItemNames.NOTHING: - ItemData(803 + SC2WOL_ITEM_ID_OFFSET, "Nothing Group", 2, SC2Race.ANY, quantity=0, - classification=ItemClassification.trap, - description="Does nothing. Used to remove a location from the game."), - - # Nova gear - ItemNames.NOVA_GHOST_VISOR: - ItemData(900 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 0, SC2Race.TERRAN, origin={"nco"}, - description="Reveals the locations of enemy units in the fog of war around Nova. Can detect cloaked units."), - ItemNames.NOVA_RANGEFINDER_OCULUS: - ItemData(901 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 1, SC2Race.TERRAN, origin={"nco"}, - description="Increaases Nova's vision range and non-melee weapon attack range by 2. Also increases range of melee weapons by 1."), - ItemNames.NOVA_DOMINATION: - ItemData(902 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 2, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to mind-control a target enemy unit."), - ItemNames.NOVA_BLINK: - ItemData(903 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 3, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to teleport a short distance and cloak for 10s."), - ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE: - ItemData(904 + SC2WOL_ITEM_ID_OFFSET, "Progressive Upgrade 2", 0, SC2Race.TERRAN, quantity=2, origin={"nco"}, - classification=ItemClassification.progression, - description=inspect.cleandoc( - """ - Level 1: Gives Nova the ability to cloak. - Level 2: Nova is permanently cloaked. - """ - )), - ItemNames.NOVA_ENERGY_SUIT_MODULE: - ItemData(905 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 4, SC2Race.TERRAN, origin={"nco"}, - description="Increases Nova's maximum energy and energy regeneration rate."), - ItemNames.NOVA_ARMORED_SUIT_MODULE: - ItemData(906 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 5, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Increases Nova's health by 100 and armour by 1. Nova also regenerates life quickly out of combat."), - ItemNames.NOVA_JUMP_SUIT_MODULE: - ItemData(907 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 6, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Increases Nova's movement speed and allows her to jump up and down cliffs."), - ItemNames.NOVA_C20A_CANISTER_RIFLE: - ItemData(908 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 7, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Allows Nova to equip the C20A Canister Rifle, which has a ranged attack and allows Nova to cast Snipe."), - ItemNames.NOVA_HELLFIRE_SHOTGUN: - ItemData(909 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 8, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Allows Nova to equip the Hellfire Shotgun, which has a short-range area attack in a cone and allows Nova to cast Penetrating Blast."), - ItemNames.NOVA_PLASMA_RIFLE: - ItemData(910 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 9, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Allows Nova to equip the Plasma Rifle, which has a rapidfire ranged attack and allows Nova to cast Plasma Shot."), - ItemNames.NOVA_MONOMOLECULAR_BLADE: - ItemData(911 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 10, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Allows Nova to equip the Monomolecular Blade, which has a melee attack and allows Nova to cast Dash Attack."), - ItemNames.NOVA_BLAZEFIRE_GUNBLADE: - ItemData(912 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 11, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Allows Nova to equip the Blazefire Gunblade, which has a melee attack and allows Nova to cast Fury of One."), - ItemNames.NOVA_STIM_INFUSION: - ItemData(913 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 12, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to heal herself and temporarily increase her movement and attack speeds."), - ItemNames.NOVA_PULSE_GRENADES: - ItemData(914 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 13, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to throw a grenade dealing large damage in an area."), - ItemNames.NOVA_FLASHBANG_GRENADES: - ItemData(915 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 14, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to throw a grenade to stun enemies and disable detection in a large area."), - ItemNames.NOVA_IONIC_FORCE_FIELD: - ItemData(916 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 15, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to shield herself temporarily."), - ItemNames.NOVA_HOLO_DECOY: - ItemData(917 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 16, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to summon a decoy unit which enemies will prefer to target and takes reduced damage."), - ItemNames.NOVA_NUKE: - ItemData(918 + SC2WOL_ITEM_ID_OFFSET, "Nova Gear", 17, SC2Race.TERRAN, origin={"nco"}, - classification=ItemClassification.progression, - description="Gives Nova the ability to launch tactical nukes built from the Shadow Ops."), - - # HotS - ItemNames.ZERGLING: - ItemData(0 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 0, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Fast inexpensive melee attacker. Hatches in pairs from a single larva. Can morph into a Baneling."), - ItemNames.SWARM_QUEEN: - ItemData(1 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 1, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Ranged support caster. Can use the Spawn Creep Tumor and Rapid Transfusion abilities."), - ItemNames.ROACH: - ItemData(2 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 2, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Durable short ranged attacker. Regenerates life quickly when burrowed."), - ItemNames.HYDRALISK: - ItemData(3 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 3, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="High-damage generalist ranged attacker."), - ItemNames.ZERGLING_BANELING_ASPECT: - ItemData(4 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 5, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Anti-ground suicide unit. Does damage over a small area on death."), - ItemNames.ABERRATION: - ItemData(5 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 5, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Durable melee attacker that deals heavy damage and can walk over other units."), - ItemNames.MUTALISK: - ItemData(6 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 6, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Fragile flying attacker. Attacks bounce between targets."), - ItemNames.SWARM_HOST: - ItemData(7 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 7, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Siege unit that attacks by rooting in place and continually spawning Locusts."), - ItemNames.INFESTOR: - ItemData(8 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 8, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Support caster that can move while burrowed. Can use the Fungal Growth, Parasitic Domination, and Consumption abilities."), - ItemNames.ULTRALISK: - ItemData(9 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 9, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Massive melee attacker. Has an area-damage cleave attack."), - ItemNames.SPORE_CRAWLER: - ItemData(10 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 10, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Anti-air defensive structure that can detect cloaked units."), - ItemNames.SPINE_CRAWLER: - ItemData(11 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 11, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"hots"}, - description="Anti-ground defensive structure."), - ItemNames.CORRUPTOR: - ItemData(12 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 12, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"ext"}, - description="Anti-air flying attacker specializing in taking down enemy capital ships."), - ItemNames.SCOURGE: - ItemData(13 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 13, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"bw", "ext"}, - description="Flying anti-air suicide unit. Hatches in pairs from a single larva."), - ItemNames.BROOD_QUEEN: - ItemData(14 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 4, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"bw", "ext"}, - description="Flying support caster. Can cast the Ocular Symbiote and Spawn Broodlings abilities."), - ItemNames.DEFILER: - ItemData(15 + SC2HOTS_ITEM_ID_OFFSET, "Unit", 14, SC2Race.ZERG, - classification=ItemClassification.progression, origin={"bw"}, - description="Support caster. Can use the Dark Swarm, Consume, and Plague abilities."), - - ItemNames.PROGRESSIVE_ZERG_MELEE_ATTACK: ItemData(100 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_MISSILE_ATTACK: ItemData(101 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_GROUND_CARAPACE: ItemData(102 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_FLYER_ATTACK: ItemData(103 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_FLYER_CARAPACE: ItemData(104 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.ZERG, quantity=3, origin={"hots"}), - # Upgrade bundle 'number' values are used as indices to get affected 'number's - ItemNames.PROGRESSIVE_ZERG_WEAPON_UPGRADE: ItemData(105 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_ARMOR_UPGRADE: ItemData(106 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 7, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_GROUND_UPGRADE: ItemData(107 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_FLYER_UPGRADE: ItemData(108 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 9, SC2Race.ZERG, quantity=3, origin={"hots"}), - ItemNames.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2HOTS_ITEM_ID_OFFSET, "Upgrade", 10, SC2Race.ZERG, quantity=3, origin={"hots"}), - - ItemNames.ZERGLING_HARDENED_CARAPACE: - ItemData(200 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 0, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"hots"}, description="Increases Zergling health by +10."), - ItemNames.ZERGLING_ADRENAL_OVERLOAD: - ItemData(201 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 1, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"hots"}, description="Increases Zergling attack speed."), - ItemNames.ZERGLING_METABOLIC_BOOST: - ItemData(202 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 2, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"hots"}, classification=ItemClassification.filler, - description="Increases Zergling movement speed."), - ItemNames.ROACH_HYDRIODIC_BILE: - ItemData(203 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 3, SC2Race.ZERG, parent_item=ItemNames.ROACH, - origin={"hots"}, description="Roaches deal +8 damage to light targets."), - ItemNames.ROACH_ADAPTIVE_PLATING: - ItemData(204 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 4, SC2Race.ZERG, parent_item=ItemNames.ROACH, - origin={"hots"}, description="Roaches gain +3 armour when their life is below 50%."), - ItemNames.ROACH_TUNNELING_CLAWS: - ItemData(205 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 5, SC2Race.ZERG, parent_item=ItemNames.ROACH, - origin={"hots"}, classification=ItemClassification.filler, - description="Allows Roaches to move while burrowed."), - ItemNames.HYDRALISK_FRENZY: - ItemData(206 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 6, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK, - origin={"hots"}, - description="Allows Hydralisks to use the Frenzy ability, which increases their attack speed by 50%."), - ItemNames.HYDRALISK_ANCILLARY_CARAPACE: - ItemData(207 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 7, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK, - origin={"hots"}, classification=ItemClassification.filler, description="Hydralisks gain +20 health."), - ItemNames.HYDRALISK_GROOVED_SPINES: - ItemData(208 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 8, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK, - origin={"hots"}, description="Hydralisks gain +1 range."), - ItemNames.BANELING_CORROSIVE_ACID: - ItemData(209 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 9, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"}, - description="Increases the damage banelings deal to their primary target. Splash damage remains the same."), - ItemNames.BANELING_RUPTURE: - ItemData(210 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 10, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"}, - classification=ItemClassification.filler, - description="Increases the splash radius of baneling attacks."), - ItemNames.BANELING_REGENERATIVE_ACID: - ItemData(211 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 11, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"}, - classification=ItemClassification.filler, - description="Banelings will heal nearby friendly units when they explode."), - ItemNames.MUTALISK_VICIOUS_GLAIVE: - ItemData(212 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 12, SC2Race.ZERG, parent_item=ItemNames.MUTALISK, - origin={"hots"}, description="Mutalisks attacks will bounce an additional 3 times."), - ItemNames.MUTALISK_RAPID_REGENERATION: - ItemData(213 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 13, SC2Race.ZERG, parent_item=ItemNames.MUTALISK, - origin={"hots"}, description="Mutalisks will regenerate quickly when out of combat."), - ItemNames.MUTALISK_SUNDERING_GLAIVE: - ItemData(214 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 14, SC2Race.ZERG, parent_item=ItemNames.MUTALISK, - origin={"hots"}, description="Mutalisks deal increased damage to their primary target."), - ItemNames.SWARM_HOST_BURROW: - ItemData(215 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 15, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"hots"}, classification=ItemClassification.filler, - description="Allows Swarm Hosts to burrow instead of root to spawn locusts."), - ItemNames.SWARM_HOST_RAPID_INCUBATION: - ItemData(216 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 16, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"hots"}, description="Swarm Hosts will spawn locusts 20% faster."), - ItemNames.SWARM_HOST_PRESSURIZED_GLANDS: - ItemData(217 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 17, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"hots"}, classification=ItemClassification.progression, - description="Allows Swarm Host Locusts to attack air targets."), - ItemNames.ULTRALISK_BURROW_CHARGE: - ItemData(218 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 18, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"hots"}, - description="Allows Ultralisks to burrow and charge at enemy units, knocking back and stunning units when it emerges."), - ItemNames.ULTRALISK_TISSUE_ASSIMILATION: - ItemData(219 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 19, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"hots"}, description="Ultralisks recover health when they deal damage."), - ItemNames.ULTRALISK_MONARCH_BLADES: - ItemData(220 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 20, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"hots"}, description="Ultralisks gain increased splash damage."), - ItemNames.CORRUPTOR_CAUSTIC_SPRAY: - ItemData(221 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 21, SC2Race.ZERG, parent_item=ItemNames.CORRUPTOR, - origin={"ext"}, - description="Allows Corruptors to use the Caustic Spray ability, which deals ramping damage to buildings over time."), - ItemNames.CORRUPTOR_CORRUPTION: - ItemData(222 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 22, SC2Race.ZERG, parent_item=ItemNames.CORRUPTOR, - origin={"ext"}, - description="Allows Corruptors to use the Corruption ability, which causes a target enemy unit to take increased damage."), - ItemNames.SCOURGE_VIRULENT_SPORES: - ItemData(223 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 23, SC2Race.ZERG, parent_item=ItemNames.SCOURGE, - origin={"ext"}, description="Scourge will deal splash damage."), - ItemNames.SCOURGE_RESOURCE_EFFICIENCY: - ItemData(224 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 24, SC2Race.ZERG, parent_item=ItemNames.SCOURGE, - origin={"ext"}, classification=ItemClassification.progression, - description="Reduces the cost of Scourge by 50 gas per egg."), - ItemNames.SCOURGE_SWARM_SCOURGE: - ItemData(225 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 25, SC2Race.ZERG, parent_item=ItemNames.SCOURGE, - origin={"ext"}, description="An extra Scourge will be built from each egg at no additional cost."), - ItemNames.ZERGLING_SHREDDING_CLAWS: - ItemData(226 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 26, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"ext"}, description="Zergling attacks will temporarily reduce their target's armour to 0."), - ItemNames.ROACH_GLIAL_RECONSTITUTION: - ItemData(227 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 27, SC2Race.ZERG, parent_item=ItemNames.ROACH, - origin={"ext"}, description="Increases Roach movement speed."), - ItemNames.ROACH_ORGANIC_CARAPACE: - ItemData(228 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 28, SC2Race.ZERG, parent_item=ItemNames.ROACH, - origin={"ext"}, description="Increases Roach health by +25."), - ItemNames.HYDRALISK_MUSCULAR_AUGMENTS: - ItemData(229 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 1", 29, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK, - origin={"bw"}, description="Increases Hydralisk movement speed."), - ItemNames.HYDRALISK_RESOURCE_EFFICIENCY: - ItemData(230 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 0, SC2Race.ZERG, parent_item=ItemNames.HYDRALISK, - origin={"bw"}, description="Reduces Hydralisk resource cost by 25/25 and supply cost by 1."), - ItemNames.BANELING_CENTRIFUGAL_HOOKS: - ItemData(231 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 1, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"ext"}, - description="Increases the movement speed of Banelings."), - ItemNames.BANELING_TUNNELING_JAWS: - ItemData(232 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 2, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"ext"}, - description="Allows Banelings to move while burrowed."), - ItemNames.BANELING_RAPID_METAMORPH: - ItemData(233 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 3, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"ext"}, description="Banelings morph faster."), - ItemNames.MUTALISK_SEVERING_GLAIVE: - ItemData(234 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 4, SC2Race.ZERG, parent_item=ItemNames.MUTALISK, - origin={"ext"}, description="Mutalisk bounce attacks will deal full damage."), - ItemNames.MUTALISK_AERODYNAMIC_GLAIVE_SHAPE: - ItemData(235 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 5, SC2Race.ZERG, parent_item=ItemNames.MUTALISK, - origin={"ext"}, description="Increases the attack range of Mutalisks by 2."), - ItemNames.SWARM_HOST_LOCUST_METABOLIC_BOOST: - ItemData(236 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 6, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"ext"}, classification=ItemClassification.filler, - description="Increases Locust movement speed."), - ItemNames.SWARM_HOST_ENDURING_LOCUSTS: - ItemData(237 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 7, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"ext"}, description="Increases the duration of Swarm Hosts' Locusts by 10s."), - ItemNames.SWARM_HOST_ORGANIC_CARAPACE: - ItemData(238 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 8, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"ext"}, description="Increases Swarm Host health by +40."), - ItemNames.SWARM_HOST_RESOURCE_EFFICIENCY: - ItemData(239 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 9, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"ext"}, description="Reduces Swarm Host resource cost by 100/25."), - ItemNames.ULTRALISK_ANABOLIC_SYNTHESIS: - ItemData(240 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 10, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"bw"}, classification=ItemClassification.filler), - ItemNames.ULTRALISK_CHITINOUS_PLATING: - ItemData(241 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 11, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"bw"}), - ItemNames.ULTRALISK_ORGANIC_CARAPACE: - ItemData(242 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 12, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"ext"}), - ItemNames.ULTRALISK_RESOURCE_EFFICIENCY: - ItemData(243 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 13, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"bw"}), - ItemNames.DEVOURER_CORROSIVE_SPRAY: - ItemData(244 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 14, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"}), - ItemNames.DEVOURER_GAPING_MAW: - ItemData(245 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 15, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"}), - ItemNames.DEVOURER_IMPROVED_OSMOSIS: - ItemData(246 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 16, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"}, - classification=ItemClassification.filler), - ItemNames.DEVOURER_PRESCIENT_SPORES: - ItemData(247 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 17, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, origin={"ext"}), - ItemNames.GUARDIAN_PROLONGED_DISPERSION: - ItemData(248 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 18, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, origin={"ext"}), - ItemNames.GUARDIAN_PRIMAL_ADAPTATION: - ItemData(249 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 19, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, origin={"ext"}), - ItemNames.GUARDIAN_SORONAN_ACID: - ItemData(250 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 20, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, origin={"ext"}), - ItemNames.IMPALER_ADAPTIVE_TALONS: - ItemData(251 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 21, SC2Race.ZERG, - parent_item=ItemNames.HYDRALISK_IMPALER_ASPECT, origin={"ext"}, - classification=ItemClassification.filler), - ItemNames.IMPALER_SECRETION_GLANDS: - ItemData(252 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 22, SC2Race.ZERG, - parent_item=ItemNames.HYDRALISK_IMPALER_ASPECT, origin={"ext"}), - ItemNames.IMPALER_HARDENED_TENTACLE_SPINES: - ItemData(253 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 23, SC2Race.ZERG, - parent_item=ItemNames.HYDRALISK_IMPALER_ASPECT, origin={"ext"}), - ItemNames.LURKER_SEISMIC_SPINES: - ItemData(254 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 24, SC2Race.ZERG, - parent_item=ItemNames.HYDRALISK_LURKER_ASPECT, origin={"ext"}), - ItemNames.LURKER_ADAPTED_SPINES: - ItemData(255 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 25, SC2Race.ZERG, - parent_item=ItemNames.HYDRALISK_LURKER_ASPECT, origin={"ext"}), - ItemNames.RAVAGER_POTENT_BILE: - ItemData(256 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 26, SC2Race.ZERG, - parent_item=ItemNames.ROACH_RAVAGER_ASPECT, origin={"ext"}), - ItemNames.RAVAGER_BLOATED_BILE_DUCTS: - ItemData(257 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 27, SC2Race.ZERG, - parent_item=ItemNames.ROACH_RAVAGER_ASPECT, origin={"ext"}), - ItemNames.RAVAGER_DEEP_TUNNEL: - ItemData(258 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 28, SC2Race.ZERG, - parent_item=ItemNames.ROACH_RAVAGER_ASPECT, origin={"ext"}), - ItemNames.VIPER_PARASITIC_BOMB: - ItemData(259 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 2", 29, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, origin={"ext"}), - ItemNames.VIPER_PARALYTIC_BARBS: - ItemData(260 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 0, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, origin={"ext"}), - ItemNames.VIPER_VIRULENT_MICROBES: - ItemData(261 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 1, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, origin={"ext"}), - ItemNames.BROOD_LORD_POROUS_CARTILAGE: - ItemData(262 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 2, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}), - ItemNames.BROOD_LORD_EVOLVED_CARAPACE: - ItemData(263 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 3, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}), - ItemNames.BROOD_LORD_SPLITTER_MITOSIS: - ItemData(264 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 4, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}), - ItemNames.BROOD_LORD_RESOURCE_EFFICIENCY: - ItemData(265 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 5, SC2Race.ZERG, - parent_item=ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, origin={"ext"}), - ItemNames.INFESTOR_INFESTED_TERRAN: - ItemData(266 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 6, SC2Race.ZERG, parent_item=ItemNames.INFESTOR, - origin={"ext"}), - ItemNames.INFESTOR_MICROBIAL_SHROUD: - ItemData(267 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 7, SC2Race.ZERG, parent_item=ItemNames.INFESTOR, - origin={"ext"}), - ItemNames.SWARM_QUEEN_SPAWN_LARVAE: - ItemData(268 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 8, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}), - ItemNames.SWARM_QUEEN_DEEP_TUNNEL: - ItemData(269 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 9, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}), - ItemNames.SWARM_QUEEN_ORGANIC_CARAPACE: - ItemData(270 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 10, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}, classification=ItemClassification.filler), - ItemNames.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION: - ItemData(271 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 11, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}), - ItemNames.SWARM_QUEEN_RESOURCE_EFFICIENCY: - ItemData(272 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 12, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}), - ItemNames.SWARM_QUEEN_INCUBATOR_CHAMBER: - ItemData(273 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 13, SC2Race.ZERG, parent_item=ItemNames.SWARM_QUEEN, - origin={"ext"}), - ItemNames.BROOD_QUEEN_FUNGAL_GROWTH: - ItemData(274 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 14, SC2Race.ZERG, parent_item=ItemNames.BROOD_QUEEN, - origin={"ext"}), - ItemNames.BROOD_QUEEN_ENSNARE: - ItemData(275 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 15, SC2Race.ZERG, parent_item=ItemNames.BROOD_QUEEN, - origin={"ext"}), - ItemNames.BROOD_QUEEN_ENHANCED_MITOCHONDRIA: - ItemData(276 + SC2HOTS_ITEM_ID_OFFSET, "Mutation 3", 16, SC2Race.ZERG, parent_item=ItemNames.BROOD_QUEEN, - origin={"ext"}), - - ItemNames.ZERGLING_RAPTOR_STRAIN: - ItemData(300 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 0, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"hots"}, - description="Allows Zerglings to jump up and down cliffs and leap onto enemies. Also increases Zergling attack damage by 2."), - ItemNames.ZERGLING_SWARMLING_STRAIN: - ItemData(301 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 1, SC2Race.ZERG, parent_item=ItemNames.ZERGLING, - origin={"hots"}, - description="Zerglings will spawn instantly and with an extra Zergling per egg at no additional cost."), - ItemNames.ROACH_VILE_STRAIN: - ItemData(302 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 2, SC2Race.ZERG, parent_item=ItemNames.ROACH, origin={"hots"}, - description="Roach attacks will slow the movement and attack speed of enemies."), - ItemNames.ROACH_CORPSER_STRAIN: - ItemData(303 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 3, SC2Race.ZERG, parent_item=ItemNames.ROACH, origin={"hots"}, - description="Units killed after being attacked by Roaches will spawn 2 Roachlings."), - ItemNames.HYDRALISK_IMPALER_ASPECT: - ItemData(304 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 0, SC2Race.ZERG, origin={"hots"}, - classification=ItemClassification.progression, - description="Allows Hydralisks to morph into Impalers."), - ItemNames.HYDRALISK_LURKER_ASPECT: - ItemData(305 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 1, SC2Race.ZERG, origin={"hots"}, - classification=ItemClassification.progression, description="Allows Hydralisks to morph into Lurkers."), - ItemNames.BANELING_SPLITTER_STRAIN: - ItemData(306 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 6, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"}, - description="Banelings will split into two smaller Splitterlings on exploding."), - ItemNames.BANELING_HUNTER_STRAIN: - ItemData(307 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 7, SC2Race.ZERG, - parent_item=ItemNames.ZERGLING_BANELING_ASPECT, origin={"hots"}, - description="Allows Banelings to jump up and down cliffs and leap onto enemies."), - ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT: - ItemData(308 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 2, SC2Race.ZERG, origin={"hots"}, - classification=ItemClassification.progression, - description="Allows Mutalisks and Corruptors to morph into Brood Lords."), - ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT: - ItemData(309 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 3, SC2Race.ZERG, origin={"hots"}, - classification=ItemClassification.progression, - description="Allows Mutalisks and Corruptors to morph into Vipers."), - ItemNames.SWARM_HOST_CARRION_STRAIN: - ItemData(310 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 10, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"hots"}, description="Swarm Hosts will spawn Flying Locusts."), - ItemNames.SWARM_HOST_CREEPER_STRAIN: - ItemData(311 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 11, SC2Race.ZERG, parent_item=ItemNames.SWARM_HOST, - origin={"hots"}, classification=ItemClassification.filler, - description="Allows Swarm Hosts to teleport to any creep on the map in vision. Swarm Hosts will spread creep around them when rooted or burrowed."), - ItemNames.ULTRALISK_NOXIOUS_STRAIN: - ItemData(312 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 12, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"hots"}, classification=ItemClassification.filler, - description="Ultralisks will periodically spread poison, damaging nearby biological enemies."), - ItemNames.ULTRALISK_TORRASQUE_STRAIN: - ItemData(313 + SC2HOTS_ITEM_ID_OFFSET, "Strain", 13, SC2Race.ZERG, parent_item=ItemNames.ULTRALISK, - origin={"hots"}, description="Ultralisks will revive after being killed."), - - ItemNames.KERRIGAN_KINETIC_BLAST: ItemData(400 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 0, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_HEROIC_FORTITUDE: ItemData(401 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 1, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEAPING_STRIKE: ItemData(402 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 2, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_CRUSHING_GRIP: ItemData(403 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 3, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_CHAIN_REACTION: ItemData(404 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 4, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_PSIONIC_SHIFT: ItemData(405 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 5, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_ZERGLING_RECONSTITUTION: ItemData(406 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 0, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.filler), - ItemNames.KERRIGAN_IMPROVED_OVERLORDS: ItemData(407 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 1, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_AUTOMATED_EXTRACTORS: ItemData(408 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 2, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_WILD_MUTATION: ItemData(409 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 6, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_SPAWN_BANELINGS: ItemData(410 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 7, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_MEND: ItemData(411 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 8, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_TWIN_DRONES: ItemData(412 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 3, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_MALIGNANT_CREEP: ItemData(413 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 4, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_VESPENE_EFFICIENCY: ItemData(414 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 5, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_INFEST_BROODLINGS: ItemData(415 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 9, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_FURY: ItemData(416 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 10, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_ABILITY_EFFICIENCY: ItemData(417 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 11, SC2Race.ZERG, origin={"hots"}), - ItemNames.KERRIGAN_APOCALYPSE: ItemData(418 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 12, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_SPAWN_LEVIATHAN: ItemData(419 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 13, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - ItemNames.KERRIGAN_DROP_PODS: ItemData(420 + SC2HOTS_ITEM_ID_OFFSET, "Ability", 14, SC2Race.ZERG, origin={"hots"}, classification=ItemClassification.progression), - # Handled separately from other abilities - ItemNames.KERRIGAN_PRIMAL_FORM: ItemData(421 + SC2HOTS_ITEM_ID_OFFSET, "Primal Form", 0, SC2Race.ZERG, origin={"hots"}), - - ItemNames.KERRIGAN_LEVELS_10: ItemData(500 + SC2HOTS_ITEM_ID_OFFSET, "Level", 10, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_9: ItemData(501 + SC2HOTS_ITEM_ID_OFFSET, "Level", 9, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_8: ItemData(502 + SC2HOTS_ITEM_ID_OFFSET, "Level", 8, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_7: ItemData(503 + SC2HOTS_ITEM_ID_OFFSET, "Level", 7, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_6: ItemData(504 + SC2HOTS_ITEM_ID_OFFSET, "Level", 6, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_5: ItemData(505 + SC2HOTS_ITEM_ID_OFFSET, "Level", 5, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_4: ItemData(506 + SC2HOTS_ITEM_ID_OFFSET, "Level", 4, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing), - ItemNames.KERRIGAN_LEVELS_3: ItemData(507 + SC2HOTS_ITEM_ID_OFFSET, "Level", 3, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing), - ItemNames.KERRIGAN_LEVELS_2: ItemData(508 + SC2HOTS_ITEM_ID_OFFSET, "Level", 2, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing), - ItemNames.KERRIGAN_LEVELS_1: ItemData(509 + SC2HOTS_ITEM_ID_OFFSET, "Level", 1, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression_skip_balancing), - ItemNames.KERRIGAN_LEVELS_14: ItemData(510 + SC2HOTS_ITEM_ID_OFFSET, "Level", 14, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_35: ItemData(511 + SC2HOTS_ITEM_ID_OFFSET, "Level", 35, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - ItemNames.KERRIGAN_LEVELS_70: ItemData(512 + SC2HOTS_ITEM_ID_OFFSET, "Level", 70, SC2Race.ZERG, origin={"hots"}, quantity=0, classification=ItemClassification.progression), - - # Zerg Mercs - ItemNames.INFESTED_MEDICS: ItemData(600 + SC2HOTS_ITEM_ID_OFFSET, "Mercenary", 0, SC2Race.ZERG, origin={"ext"}), - ItemNames.INFESTED_SIEGE_TANKS: ItemData(601 + SC2HOTS_ITEM_ID_OFFSET, "Mercenary", 1, SC2Race.ZERG, origin={"ext"}), - ItemNames.INFESTED_BANSHEES: ItemData(602 + SC2HOTS_ITEM_ID_OFFSET, "Mercenary", 2, SC2Race.ZERG, origin={"ext"}), - - # Misc Upgrades - ItemNames.OVERLORD_VENTRAL_SACS: ItemData(700 + SC2HOTS_ITEM_ID_OFFSET, "Evolution Pit", 6, SC2Race.ZERG, origin={"bw"}), - - # Morphs - ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: ItemData(800 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 6, SC2Race.ZERG, origin={"bw"}), - ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: ItemData(801 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 7, SC2Race.ZERG, origin={"bw"}), - ItemNames.ROACH_RAVAGER_ASPECT: ItemData(802 + SC2HOTS_ITEM_ID_OFFSET, "Morph", 8, SC2Race.ZERG, origin={"ext"}), - - - # Protoss Units (those that aren't as items in WoL (Prophecy)) - ItemNames.OBSERVER: ItemData(0 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 9, SC2Race.PROTOSS, - classification=ItemClassification.filler, origin={"wol"}, - description="Flying spy. Cloak renders the unit invisible to enemies without detection."), - ItemNames.CENTURION: ItemData(1 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 10, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Powerful melee warrior. Has the Shadow Charge and Darkcoil abilities."), - ItemNames.SENTINEL: ItemData(2 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 11, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Powerful melee warrior. Has the Charge and Reconstruction abilities."), - ItemNames.SUPPLICANT: ItemData(3 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 12, SC2Race.PROTOSS, - classification=ItemClassification.filler, important_for_filtering=True, origin={"ext"}, - description="Powerful melee warrior. Has powerful damage resistant shields."), - ItemNames.INSTIGATOR: ItemData(4 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 13, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Ranged support strider. Can store multiple Blink charges."), - ItemNames.SLAYER: ItemData(5 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 14, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Ranged attack strider. Can use the Phase Blink and Phasing Armor abilities."), - ItemNames.SENTRY: ItemData(6 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 15, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Robotic support unit can use the Guardian Shield ability and restore the shields of nearby Protoss units."), - ItemNames.ENERGIZER: ItemData(7 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 16, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Robotic support unit. Can use the Chrono Beam ability and become stationary to power nearby structures."), - ItemNames.HAVOC: ItemData(8 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 17, SC2Race.PROTOSS, - origin={"lotv"}, important_for_filtering=True, - description="Robotic support unit. Can use the Target Lock and Force Field abilities and increase the range of nearby Protoss units."), - ItemNames.SIGNIFIER: ItemData(9 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 18, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Potent permanently cloaked psionic master. Can use the Feedback and Crippling Psionic Storm abilities. Can merge into an Archon."), - ItemNames.ASCENDANT: ItemData(10 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 19, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Potent psionic master. Can use the Psionic Orb, Mind Blast, and Sacrifice abilities."), - ItemNames.AVENGER: ItemData(11 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 20, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Deadly warrior-assassin. Permanently cloaked. Recalls to the nearest Dark Shrine upon death."), - ItemNames.BLOOD_HUNTER: ItemData(12 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 21, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Deadly warrior-assassin. Permanently cloaked. Can use the Void Stasis ability."), - ItemNames.DRAGOON: ItemData(13 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 22, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Ranged assault strider. Has enhanced health and damage."), - ItemNames.DARK_ARCHON: ItemData(14 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 23, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Potent psionic master. Can use the Confuse and Mind Control abilities."), - ItemNames.ADEPT: ItemData(15 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 24, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Ranged specialist. Can use the Psionic Transfer ability."), - ItemNames.WARP_PRISM: ItemData(16 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 25, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Flying transport. Can carry units and become stationary to deploy a power field."), - ItemNames.ANNIHILATOR: ItemData(17 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 26, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Assault Strider. Can use the Shadow Cannon ability to damage air and ground units."), - ItemNames.VANGUARD: ItemData(18 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 27, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Assault Strider. Deals splash damage around the primary target."), - ItemNames.WRATHWALKER: ItemData(19 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 28, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Battle strider with a powerful single target attack. Can walk up and down cliffs."), - ItemNames.REAVER: ItemData(20 + SC2LOTV_ITEM_ID_OFFSET, "Unit", 29, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Area damage siege unit. Builds and launches explosive Scarabs for high burst damage."), - ItemNames.DISRUPTOR: ItemData(21 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 0, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Robotic disruption unit. Can use the Purification Nova ability to deal heavy area damage."), - ItemNames.MIRAGE: ItemData(22 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 1, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Air superiority starfighter. Can use Graviton Beam and Phasing Armor abilities."), - ItemNames.CORSAIR: ItemData(23 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 2, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Air superiority starfighter. Can use the Disruption Web ability."), - ItemNames.DESTROYER: ItemData(24 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 3, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Area assault craft. Can use the Destruction Beam ability to attack multiple units at once."), - ItemNames.SCOUT: ItemData(25 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 4, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Versatile high-speed fighter."), - ItemNames.TEMPEST: ItemData(26 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 5, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Siege artillery craft. Attacks from long range. Can use the Disintegration ability."), - ItemNames.MOTHERSHIP: ItemData(27 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 6, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Ultimate Protoss vessel, Can use the Vortex and Mass Recall abilities. Cloaks nearby units and structures."), - ItemNames.ARBITER: ItemData(28 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 7, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="Army support craft. Has the Stasis Field and Recall abilities. Cloaks nearby units."), - ItemNames.ORACLE: ItemData(29 + SC2LOTV_ITEM_ID_OFFSET, "Unit 2", 8, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, - description="Flying caster. Can use the Revelation and Stasis Ward abilities."), - - # Protoss Upgrades - ItemNames.PROGRESSIVE_PROTOSS_GROUND_WEAPON: ItemData(100 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 0, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_GROUND_ARMOR: ItemData(101 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 2, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_SHIELDS: ItemData(102 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 4, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_AIR_WEAPON: ItemData(103 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 6, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_AIR_ARMOR: ItemData(104 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 8, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - # Upgrade bundle 'number' values are used as indices to get affected 'number's - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: ItemData(105 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 11, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: ItemData(106 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 12, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: ItemData(107 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 13, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_AIR_UPGRADE: ItemData(108 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 14, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2LOTV_ITEM_ID_OFFSET, "Upgrade", 15, SC2Race.PROTOSS, quantity=3, origin={"wol", "lotv"}), - - # Protoss Buildings - ItemNames.PHOTON_CANNON: ItemData(200 + SC2LOTV_ITEM_ID_OFFSET, "Building", 0, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"wol", "lotv"}), - ItemNames.KHAYDARIN_MONOLITH: ItemData(201 + SC2LOTV_ITEM_ID_OFFSET, "Building", 1, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}), - ItemNames.SHIELD_BATTERY: ItemData(202 + SC2LOTV_ITEM_ID_OFFSET, "Building", 2, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}), - - # Protoss Unit Upgrades - ItemNames.SUPPLICANT_BLOOD_SHIELD: ItemData(300 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 0, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SUPPLICANT), - ItemNames.SUPPLICANT_SOUL_AUGMENTATION: ItemData(301 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 1, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SUPPLICANT), - ItemNames.SUPPLICANT_SHIELD_REGENERATION: ItemData(302 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 2, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SUPPLICANT), - ItemNames.ADEPT_SHOCKWAVE: ItemData(303 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 3, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ADEPT), - ItemNames.ADEPT_RESONATING_GLAIVES: ItemData(304 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 4, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ADEPT), - ItemNames.ADEPT_PHASE_BULWARK: ItemData(305 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 5, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ADEPT), - ItemNames.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES: ItemData(306 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 6, SC2Race.PROTOSS, origin={"ext"}, classification=ItemClassification.progression), - ItemNames.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION: ItemData(307 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 7, SC2Race.PROTOSS, origin={"ext"}, classification=ItemClassification.progression), - ItemNames.DRAGOON_HIGH_IMPACT_PHASE_DISRUPTORS: ItemData(308 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 8, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.DRAGOON), - ItemNames.DRAGOON_TRILLIC_COMPRESSION_SYSTEM: ItemData(309 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 9, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.DRAGOON), - ItemNames.DRAGOON_SINGULARITY_CHARGE: ItemData(310 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 10, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.DRAGOON), - ItemNames.DRAGOON_ENHANCED_STRIDER_SERVOS: ItemData(311 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 11, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.DRAGOON), - ItemNames.SCOUT_COMBAT_SENSOR_ARRAY: ItemData(312 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 12, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.SCOUT), - ItemNames.SCOUT_APIAL_SENSORS: ItemData(313 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 13, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.SCOUT), - ItemNames.SCOUT_GRAVITIC_THRUSTERS: ItemData(314 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 14, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.SCOUT), - ItemNames.SCOUT_ADVANCED_PHOTON_BLASTERS: ItemData(315 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 15, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.SCOUT), - ItemNames.TEMPEST_TECTONIC_DESTABILIZERS: ItemData(316 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 16, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.TEMPEST), - ItemNames.TEMPEST_QUANTIC_REACTOR: ItemData(317 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 17, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.TEMPEST), - ItemNames.TEMPEST_GRAVITY_SLING: ItemData(318 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 18, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.TEMPEST), - ItemNames.PHOENIX_MIRAGE_IONIC_WAVELENGTH_FLUX: ItemData(319 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 19, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.PHOENIX_MIRAGE_ANION_PULSE_CRYSTALS: ItemData(320 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 20, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.CORSAIR_STEALTH_DRIVE: ItemData(321 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 21, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.CORSAIR), - ItemNames.CORSAIR_ARGUS_JEWEL: ItemData(322 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 22, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.CORSAIR), - ItemNames.CORSAIR_SUSTAINING_DISRUPTION: ItemData(323 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 23, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.CORSAIR), - ItemNames.CORSAIR_NEUTRON_SHIELDS: ItemData(324 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 24, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.CORSAIR), - ItemNames.ORACLE_STEALTH_DRIVE: ItemData(325 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 25, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ORACLE), - ItemNames.ORACLE_STASIS_CALIBRATION: ItemData(326 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 26, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ORACLE), - ItemNames.ORACLE_TEMPORAL_ACCELERATION_BEAM: ItemData(327 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 27, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ORACLE), - ItemNames.ARBITER_CHRONOSTATIC_REINFORCEMENT: ItemData(328 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 28, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.ARBITER), - ItemNames.ARBITER_KHAYDARIN_CORE: ItemData(329 + SC2LOTV_ITEM_ID_OFFSET, "Forge 1", 29, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.ARBITER), - ItemNames.ARBITER_SPACETIME_ANCHOR: ItemData(330 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 0, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.ARBITER), - ItemNames.ARBITER_RESOURCE_EFFICIENCY: ItemData(331 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 1, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.ARBITER), - ItemNames.ARBITER_ENHANCED_CLOAK_FIELD: ItemData(332 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 2, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.ARBITER), - ItemNames.CARRIER_GRAVITON_CATAPULT: - ItemData(333 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 3, SC2Race.PROTOSS, origin={"wol"}, - parent_item=ItemNames.CARRIER, - description="Carriers can launch Interceptors more quickly."), - ItemNames.CARRIER_HULL_OF_PAST_GLORIES: - ItemData(334 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 4, SC2Race.PROTOSS, origin={"bw"}, - parent_item=ItemNames.CARRIER, - description="Carriers gain +2 armour."), - ItemNames.VOID_RAY_DESTROYER_FLUX_VANES: - ItemData(335 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 5, SC2Race.PROTOSS, classification=ItemClassification.filler, - origin={"ext"}, - description="Increases Void Ray and Destroyer movement speed."), - ItemNames.DESTROYER_REFORGED_BLOODSHARD_CORE: - ItemData(336 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 6, SC2Race.PROTOSS, origin={"ext"}, - parent_item=ItemNames.DESTROYER, - description="When fully charged, the Destroyer's Destruction Beam weapon does full damage to secondary targets."), - ItemNames.WARP_PRISM_GRAVITIC_DRIVE: - ItemData(337 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 7, SC2Race.PROTOSS, classification=ItemClassification.filler, - origin={"ext"}, parent_item=ItemNames.WARP_PRISM, - description="Increases the movement speed of Warp Prisms."), - ItemNames.WARP_PRISM_PHASE_BLASTER: - ItemData(338 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 8, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"ext"}, parent_item=ItemNames.WARP_PRISM, - description="Equips Warp Prisms with an auto-attack that can hit ground and air targets."), - ItemNames.WARP_PRISM_WAR_CONFIGURATION: ItemData(339 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 9, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.WARP_PRISM), - ItemNames.OBSERVER_GRAVITIC_BOOSTERS: ItemData(340 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 10, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.OBSERVER), - ItemNames.OBSERVER_SENSOR_ARRAY: ItemData(341 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 11, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.OBSERVER), - ItemNames.REAVER_SCARAB_DAMAGE: ItemData(342 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 12, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.REAVER), - ItemNames.REAVER_SOLARITE_PAYLOAD: ItemData(343 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 13, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.REAVER), - ItemNames.REAVER_REAVER_CAPACITY: ItemData(344 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 14, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}, parent_item=ItemNames.REAVER), - ItemNames.REAVER_RESOURCE_EFFICIENCY: ItemData(345 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 15, SC2Race.PROTOSS, origin={"bw"}, parent_item=ItemNames.REAVER), - ItemNames.VANGUARD_AGONY_LAUNCHERS: ItemData(346 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 16, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.VANGUARD), - ItemNames.VANGUARD_MATTER_DISPERSION: ItemData(347 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 17, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.VANGUARD), - ItemNames.IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE: ItemData(348 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 18, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS: ItemData(349 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 19, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"ext"}), - ItemNames.COLOSSUS_PACIFICATION_PROTOCOL: ItemData(350 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 20, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.COLOSSUS), - ItemNames.WRATHWALKER_RAPID_POWER_CYCLING: ItemData(351 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 21, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.WRATHWALKER), - ItemNames.WRATHWALKER_EYE_OF_WRATH: ItemData(352 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 22, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.WRATHWALKER), - ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN: ItemData(353 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 23, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING: ItemData(354 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 24, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK: ItemData(355 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 25, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"ext"}), - ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY: ItemData(356 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 26, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.DARK_TEMPLAR_DARK_ARCHON_MELD: ItemData(357 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 27, SC2Race.PROTOSS, origin={"bw"}, important_for_filtering=True ,parent_item=ItemNames.DARK_TEMPLAR), - ItemNames.HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM: ItemData(358 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 28, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION: ItemData(359 + SC2LOTV_ITEM_ID_OFFSET, "Forge 2", 29, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"bw"}), - ItemNames.HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET: ItemData(360 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 0, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.ARCHON_HIGH_ARCHON: ItemData(361 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 1, SC2Race.PROTOSS, origin={"ext"}, important_for_filtering=True), - ItemNames.DARK_ARCHON_FEEDBACK: ItemData(362 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 2, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.DARK_ARCHON_MAELSTROM: ItemData(363 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 3, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.DARK_ARCHON_ARGUS_TALISMAN: ItemData(364 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 4, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.ASCENDANT_POWER_OVERWHELMING: ItemData(365 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 5, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ASCENDANT), - ItemNames.ASCENDANT_CHAOTIC_ATTUNEMENT: ItemData(366 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 6, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ASCENDANT), - ItemNames.ASCENDANT_BLOOD_AMULET: ItemData(367 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 7, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ASCENDANT), - ItemNames.SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE: ItemData(368 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 8, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING: ItemData(369 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 9, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.SENTRY_FORCE_FIELD: ItemData(370 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 10, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SENTRY), - ItemNames.SENTRY_HALLUCINATION: ItemData(371 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 11, SC2Race.PROTOSS, classification=ItemClassification.filler, origin={"ext"}, parent_item=ItemNames.SENTRY), - ItemNames.ENERGIZER_RECLAMATION: ItemData(372 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 12, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ENERGIZER), - ItemNames.ENERGIZER_FORGED_CHASSIS: ItemData(373 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 13, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.ENERGIZER), - ItemNames.HAVOC_DETECT_WEAKNESS: ItemData(374 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 14, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.HAVOC), - ItemNames.HAVOC_BLOODSHARD_RESONANCE: ItemData(375 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 15, SC2Race.PROTOSS, origin={"ext"}, parent_item=ItemNames.HAVOC), - ItemNames.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS: ItemData(376 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 16, SC2Race.PROTOSS, origin={"bw"}), - ItemNames.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY: ItemData(377 + SC2LOTV_ITEM_ID_OFFSET, "Forge 3", 17, SC2Race.PROTOSS, origin={"bw"}), - - # SoA Calldown powers - ItemNames.SOA_CHRONO_SURGE: ItemData(700 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 0, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_PROGRESSIVE_PROXY_PYLON: ItemData(701 + SC2LOTV_ITEM_ID_OFFSET, "Progressive Upgrade", 0, SC2Race.PROTOSS, origin={"lotv"}, quantity=2), - ItemNames.SOA_PYLON_OVERCHARGE: ItemData(702 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 1, SC2Race.PROTOSS, origin={"ext"}), - ItemNames.SOA_ORBITAL_STRIKE: ItemData(703 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 2, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_TEMPORAL_FIELD: ItemData(704 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 3, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_SOLAR_LANCE: ItemData(705 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 4, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}), - ItemNames.SOA_MASS_RECALL: ItemData(706 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 5, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_SHIELD_OVERCHARGE: ItemData(707 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 6, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_DEPLOY_FENIX: ItemData(708 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 7, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}), - ItemNames.SOA_PURIFIER_BEAM: ItemData(709 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 8, SC2Race.PROTOSS, origin={"lotv"}), - ItemNames.SOA_TIME_STOP: ItemData(710 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 9, SC2Race.PROTOSS, classification=ItemClassification.progression, origin={"lotv"}), - ItemNames.SOA_SOLAR_BOMBARDMENT: ItemData(711 + SC2LOTV_ITEM_ID_OFFSET, "Spear of Adun", 10, SC2Race.PROTOSS, origin={"lotv"}), - - # Generic Protoss Upgrades - ItemNames.MATRIX_OVERLOAD: - ItemData(800 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 0, SC2Race.PROTOSS, origin={"lotv"}, - description=r"All friendly units gain 25% movement speed and 15% attack speed within a Pylon's power field and for 15 seconds after leaving it."), - ItemNames.QUATRO: - ItemData(801 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 1, SC2Race.PROTOSS, origin={"ext"}, - description="All friendly Protoss units gain the equivalent of their +1 armour, attack, and shield upgrades."), - ItemNames.NEXUS_OVERCHARGE: - ItemData(802 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 2, SC2Race.PROTOSS, origin={"lotv"}, - important_for_filtering=True, description="The Protoss Nexus gains a long-range auto-attack."), - ItemNames.ORBITAL_ASSIMILATORS: - ItemData(803 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 3, SC2Race.PROTOSS, origin={"lotv"}, - description="Assimilators automatically harvest Vespene Gas without the need for Probes."), - ItemNames.WARP_HARMONIZATION: - ItemData(804 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 4, SC2Race.PROTOSS, origin={"lotv"}, - description=r"Stargates and Robotics Facilities can transform to utilize Warp In technology. Warp In cooldowns are 20% faster than original build times."), - ItemNames.GUARDIAN_SHELL: - ItemData(805 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 5, SC2Race.PROTOSS, origin={"lotv"}, - description="The Spear of Adun passively shields friendly Protoss units before death, making them invulnerable for 5 seconds. Each unit can only be shielded once every 60 seconds."), - ItemNames.RECONSTRUCTION_BEAM: - ItemData(806 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 6, SC2Race.PROTOSS, - classification=ItemClassification.progression, origin={"lotv"}, - description="The Spear of Adun will passively heal mechanical units for 5 and non-biological structures for 10 life per second. Up to 3 targets can be repaired at once."), - ItemNames.OVERWATCH: - ItemData(807 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 7, SC2Race.PROTOSS, origin={"ext"}, - description="Once per second, the Spear of Adun will last-hit a damaged enemy unit that is below 50 health."), - ItemNames.SUPERIOR_WARP_GATES: - ItemData(808 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 8, SC2Race.PROTOSS, origin={"ext"}, - description="Protoss Warp Gates can hold up to 3 charges of unit warp-ins."), - ItemNames.ENHANCED_TARGETING: - ItemData(809 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 9, SC2Race.PROTOSS, origin={"ext"}, - description="Protoss defensive structures gain +2 range."), - ItemNames.OPTIMIZED_ORDNANCE: - ItemData(810 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 10, SC2Race.PROTOSS, origin={"ext"}, - description="Increases the attack speed of Protoss defensive structures by 25%."), - ItemNames.KHALAI_INGENUITY: - ItemData(811 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 11, SC2Race.PROTOSS, origin={"ext"}, - description="Pylons, Photon Cannons, Monoliths, and Shield Batteries warp in near-instantly."), - ItemNames.AMPLIFIED_ASSIMILATORS: - ItemData(812 + SC2LOTV_ITEM_ID_OFFSET, "Solarite Core", 12, SC2Race.PROTOSS, origin={"ext"}, - description=r"Assimilators produce Vespene gas 25% faster."), -} - - -def get_item_table(): - return item_table - - -basic_units = { - SC2Race.TERRAN: { - ItemNames.MARINE, - ItemNames.MARAUDER, - ItemNames.GOLIATH, - ItemNames.HELLION, - ItemNames.VULTURE, - ItemNames.WARHOUND, - }, - SC2Race.ZERG: { - ItemNames.ZERGLING, - ItemNames.SWARM_QUEEN, - ItemNames.ROACH, - ItemNames.HYDRALISK, - }, - SC2Race.PROTOSS: { - ItemNames.ZEALOT, - ItemNames.CENTURION, - ItemNames.SENTINEL, - ItemNames.STALKER, - ItemNames.INSTIGATOR, - ItemNames.SLAYER, - ItemNames.DRAGOON, - ItemNames.ADEPT, - } -} - -advanced_basic_units = { - SC2Race.TERRAN: basic_units[SC2Race.TERRAN].union({ - ItemNames.REAPER, - ItemNames.DIAMONDBACK, - ItemNames.VIKING, - ItemNames.SIEGE_TANK, - ItemNames.BANSHEE, - ItemNames.THOR, - ItemNames.BATTLECRUISER, - ItemNames.CYCLONE - }), - SC2Race.ZERG: basic_units[SC2Race.ZERG].union({ - ItemNames.INFESTOR, - ItemNames.ABERRATION, - }), - SC2Race.PROTOSS: basic_units[SC2Race.PROTOSS].union({ - ItemNames.DARK_TEMPLAR, - ItemNames.BLOOD_HUNTER, - ItemNames.AVENGER, - ItemNames.IMMORTAL, - ItemNames.ANNIHILATOR, - ItemNames.VANGUARD, - }) -} - -no_logic_starting_units = { - SC2Race.TERRAN: advanced_basic_units[SC2Race.TERRAN].union({ - ItemNames.FIREBAT, - ItemNames.GHOST, - ItemNames.SPECTRE, - ItemNames.WRAITH, - ItemNames.RAVEN, - ItemNames.PREDATOR, - ItemNames.LIBERATOR, - ItemNames.HERC, - }), - SC2Race.ZERG: advanced_basic_units[SC2Race.ZERG].union({ - ItemNames.ULTRALISK, - ItemNames.SWARM_HOST - }), - SC2Race.PROTOSS: advanced_basic_units[SC2Race.PROTOSS].union({ - ItemNames.CARRIER, - ItemNames.TEMPEST, - ItemNames.VOID_RAY, - ItemNames.DESTROYER, - ItemNames.COLOSSUS, - ItemNames.WRATHWALKER, - ItemNames.SCOUT, - ItemNames.HIGH_TEMPLAR, - ItemNames.SIGNIFIER, - ItemNames.ASCENDANT, - ItemNames.DARK_ARCHON, - ItemNames.SUPPLICANT, - }) -} - -not_balanced_starting_units = { - ItemNames.SIEGE_TANK, - ItemNames.THOR, - ItemNames.BANSHEE, - ItemNames.BATTLECRUISER, - ItemNames.ULTRALISK, - ItemNames.CARRIER, - ItemNames.TEMPEST, -} - - -def get_basic_units(world: World, race: SC2Race) -> typing.Set[str]: - logic_level = get_option_value(world, 'required_tactics') - if logic_level == RequiredTactics.option_no_logic: - return no_logic_starting_units[race] - elif logic_level == RequiredTactics.option_advanced: - return advanced_basic_units[race] - else: - return basic_units[race] - - -# Items that can be placed before resources if not already in -# General upgrades and Mercs -second_pass_placeable_items: typing.Tuple[str, ...] = ( - # Global weapon/armor upgrades - ItemNames.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_SHIELDS, - # Terran Buildings without upgrades - ItemNames.SENSOR_TOWER, - ItemNames.HIVE_MIND_EMULATOR, - ItemNames.PSI_DISRUPTER, - ItemNames.PERDITION_TURRET, - # Terran units without upgrades - ItemNames.HERC, - ItemNames.WARHOUND, - # General Terran upgrades without any dependencies - ItemNames.SCV_ADVANCED_CONSTRUCTION, - ItemNames.SCV_DUAL_FUSION_WELDERS, - ItemNames.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, - ItemNames.PROGRESSIVE_ORBITAL_COMMAND, - ItemNames.ULTRA_CAPACITORS, - ItemNames.VANADIUM_PLATING, - ItemNames.ORBITAL_DEPOTS, - ItemNames.MICRO_FILTERING, - ItemNames.AUTOMATED_REFINERY, - ItemNames.COMMAND_CENTER_REACTOR, - ItemNames.TECH_REACTOR, - ItemNames.CELLULAR_REACTOR, - ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL, # Place only L1 - ItemNames.STRUCTURE_ARMOR, - ItemNames.HI_SEC_AUTO_TRACKING, - ItemNames.ADVANCED_OPTICS, - ItemNames.ROGUE_FORCES, - # Mercenaries (All races) - *[item_name for item_name, item_data in get_full_item_list().items() - if item_data.type == "Mercenary"], - # Kerrigan and Nova levels, abilities and generally useful stuff - *[item_name for item_name, item_data in get_full_item_list().items() - if item_data.type in ("Level", "Ability", "Evolution Pit", "Nova Gear")], - ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, - # Zerg static defenses - ItemNames.SPORE_CRAWLER, - ItemNames.SPINE_CRAWLER, - # Defiler, Aberration (no upgrades) - ItemNames.DEFILER, - ItemNames.ABERRATION, - # Spear of Adun Abilities - ItemNames.SOA_CHRONO_SURGE, - ItemNames.SOA_PROGRESSIVE_PROXY_PYLON, - ItemNames.SOA_PYLON_OVERCHARGE, - ItemNames.SOA_ORBITAL_STRIKE, - ItemNames.SOA_TEMPORAL_FIELD, - ItemNames.SOA_SOLAR_LANCE, - ItemNames.SOA_MASS_RECALL, - ItemNames.SOA_SHIELD_OVERCHARGE, - ItemNames.SOA_DEPLOY_FENIX, - ItemNames.SOA_PURIFIER_BEAM, - ItemNames.SOA_TIME_STOP, - ItemNames.SOA_SOLAR_BOMBARDMENT, - # Protoss generic upgrades - ItemNames.MATRIX_OVERLOAD, - ItemNames.QUATRO, - ItemNames.NEXUS_OVERCHARGE, - ItemNames.ORBITAL_ASSIMILATORS, - ItemNames.WARP_HARMONIZATION, - ItemNames.GUARDIAN_SHELL, - ItemNames.RECONSTRUCTION_BEAM, - ItemNames.OVERWATCH, - ItemNames.SUPERIOR_WARP_GATES, - ItemNames.KHALAI_INGENUITY, - ItemNames.AMPLIFIED_ASSIMILATORS, - # Protoss static defenses - ItemNames.PHOTON_CANNON, - ItemNames.KHAYDARIN_MONOLITH, - ItemNames.SHIELD_BATTERY -) - - -filler_items: typing.Tuple[str, ...] = ( - ItemNames.STARTING_MINERALS, - ItemNames.STARTING_VESPENE, - ItemNames.STARTING_SUPPLY, -) - -# Defense rating table -# Commented defense ratings are handled in LogicMixin -defense_ratings = { - ItemNames.SIEGE_TANK: 5, - # "Maelstrom Rounds": 2, - ItemNames.PLANETARY_FORTRESS: 3, - # Bunker w/ Marine/Marauder: 3, - ItemNames.PERDITION_TURRET: 2, - ItemNames.VULTURE: 1, - ItemNames.BANSHEE: 1, - ItemNames.BATTLECRUISER: 1, - ItemNames.LIBERATOR: 4, - ItemNames.WIDOW_MINE: 1, - # "Concealment (Widow Mine)": 1 -} -zerg_defense_ratings = { - ItemNames.PERDITION_TURRET: 2, - # Bunker w/ Firebat: 2, - ItemNames.LIBERATOR: -2, - ItemNames.HIVE_MIND_EMULATOR: 3, - ItemNames.PSI_DISRUPTER: 3, -} -air_defense_ratings = { - ItemNames.MISSILE_TURRET: 2, -} - -kerrigan_levels = [item_name for item_name, item_data in get_full_item_list().items() - if item_data.type == "Level" and item_data.race == SC2Race.ZERG] - -spider_mine_sources = { - ItemNames.VULTURE, - ItemNames.REAPER_SPIDER_MINES, - ItemNames.SIEGE_TANK_SPIDER_MINES, - ItemNames.RAVEN_SPIDER_MINES, -} - -progressive_if_nco = { - ItemNames.MARINE_PROGRESSIVE_STIMPACK, - ItemNames.FIREBAT_PROGRESSIVE_STIMPACK, - ItemNames.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS, - ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL, -} - -progressive_if_ext = { - ItemNames.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE, - ItemNames.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS, - ItemNames.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX, - ItemNames.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS, - ItemNames.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL, - ItemNames.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, - ItemNames.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL, - ItemNames.PROGRESSIVE_ORBITAL_COMMAND -} - -kerrigan_actives: typing.List[typing.Set[str]] = [ - {ItemNames.KERRIGAN_KINETIC_BLAST, ItemNames.KERRIGAN_LEAPING_STRIKE}, - {ItemNames.KERRIGAN_CRUSHING_GRIP, ItemNames.KERRIGAN_PSIONIC_SHIFT}, - set(), - {ItemNames.KERRIGAN_WILD_MUTATION, ItemNames.KERRIGAN_SPAWN_BANELINGS, ItemNames.KERRIGAN_MEND}, - set(), - set(), - {ItemNames.KERRIGAN_APOCALYPSE, ItemNames.KERRIGAN_SPAWN_LEVIATHAN, ItemNames.KERRIGAN_DROP_PODS}, -] - -kerrigan_passives: typing.List[typing.Set[str]] = [ - {ItemNames.KERRIGAN_HEROIC_FORTITUDE}, - {ItemNames.KERRIGAN_CHAIN_REACTION}, - {ItemNames.KERRIGAN_ZERGLING_RECONSTITUTION, ItemNames.KERRIGAN_IMPROVED_OVERLORDS, ItemNames.KERRIGAN_AUTOMATED_EXTRACTORS}, - set(), - {ItemNames.KERRIGAN_TWIN_DRONES, ItemNames.KERRIGAN_MALIGNANT_CREEP, ItemNames.KERRIGAN_VESPENE_EFFICIENCY}, - {ItemNames.KERRIGAN_INFEST_BROODLINGS, ItemNames.KERRIGAN_FURY, ItemNames.KERRIGAN_ABILITY_EFFICIENCY}, - set(), -] - -kerrigan_only_passives = { - ItemNames.KERRIGAN_HEROIC_FORTITUDE, ItemNames.KERRIGAN_CHAIN_REACTION, - ItemNames.KERRIGAN_INFEST_BROODLINGS, ItemNames.KERRIGAN_FURY, ItemNames.KERRIGAN_ABILITY_EFFICIENCY, -} - -spear_of_adun_calldowns = { - ItemNames.SOA_CHRONO_SURGE, - ItemNames.SOA_PROGRESSIVE_PROXY_PYLON, - ItemNames.SOA_PYLON_OVERCHARGE, - ItemNames.SOA_ORBITAL_STRIKE, - ItemNames.SOA_TEMPORAL_FIELD, - ItemNames.SOA_SOLAR_LANCE, - ItemNames.SOA_MASS_RECALL, - ItemNames.SOA_SHIELD_OVERCHARGE, - ItemNames.SOA_DEPLOY_FENIX, - ItemNames.SOA_PURIFIER_BEAM, - ItemNames.SOA_TIME_STOP, - ItemNames.SOA_SOLAR_BOMBARDMENT -} - -spear_of_adun_castable_passives = { - ItemNames.RECONSTRUCTION_BEAM, - ItemNames.OVERWATCH, -} - -nova_equipment = { - *[item_name for item_name, item_data in get_full_item_list().items() - if item_data.type == "Nova Gear"], - ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE -} - -# 'number' values of upgrades for upgrade bundle items -upgrade_numbers = [ - # Terran - {0, 4, 8}, # Weapon - {2, 6, 10}, # Armor - {0, 2}, # Infantry - {4, 6}, # Vehicle - {8, 10}, # Starship - {0, 2, 4, 6, 8, 10}, # All - # Zerg - {0, 2, 6}, # Weapon - {4, 8}, # Armor - {0, 2, 4}, # Ground - {6, 8}, # Flyer - {0, 2, 4, 6, 8}, # All - # Protoss - {0, 6}, # Weapon - {2, 4, 8}, # Armor - {0, 2}, # Ground, Shields are handled specially - {6, 8}, # Air, Shields are handled specially - {0, 2, 4, 6, 8}, # All -] -# 'upgrade_numbers' indices for all upgrades -upgrade_numbers_all = { - SC2Race.TERRAN: 5, - SC2Race.ZERG: 10, - SC2Race.PROTOSS: 15, -} - -# Names of upgrades to be included for different options -upgrade_included_names = [ - { # Individual Items - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, - ItemNames.PROGRESSIVE_TERRAN_SHIP_WEAPON, - ItemNames.PROGRESSIVE_TERRAN_SHIP_ARMOR, - ItemNames.PROGRESSIVE_ZERG_MELEE_ATTACK, - ItemNames.PROGRESSIVE_ZERG_MISSILE_ATTACK, - ItemNames.PROGRESSIVE_ZERG_GROUND_CARAPACE, - ItemNames.PROGRESSIVE_ZERG_FLYER_ATTACK, - ItemNames.PROGRESSIVE_ZERG_FLYER_CARAPACE, - ItemNames.PROGRESSIVE_PROTOSS_GROUND_WEAPON, - ItemNames.PROGRESSIVE_PROTOSS_GROUND_ARMOR, - ItemNames.PROGRESSIVE_PROTOSS_SHIELDS, - ItemNames.PROGRESSIVE_PROTOSS_AIR_WEAPON, - ItemNames.PROGRESSIVE_PROTOSS_AIR_ARMOR, - }, - { # Bundle Weapon And Armor - ItemNames.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE, - }, - { # Bundle Unit Class - ItemNames.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE, - ItemNames.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE, - ItemNames.PROGRESSIVE_TERRAN_SHIP_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_GROUND_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_FLYER_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_AIR_UPGRADE, - }, - { # Bundle All - ItemNames.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, - ItemNames.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, - } -] - -lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in get_full_item_list().items() if - data.code} - -# Map type to expected int -type_flaggroups: typing.Dict[SC2Race, typing.Dict[str, int]] = { - SC2Race.ANY: { - "Minerals": 0, - "Vespene": 1, - "Supply": 2, - "Goal": 3, - "Nothing Group": 4, - }, - SC2Race.TERRAN: { - "Armory 1": 0, - "Armory 2": 1, - "Armory 3": 2, - "Armory 4": 3, - "Armory 5": 4, - "Armory 6": 5, - "Progressive Upgrade": 6, # Unit upgrades that exist multiple times (Stimpack / Super Stimpack) - "Laboratory": 7, - "Upgrade": 8, # Weapon / Armor upgrades - "Unit": 9, - "Building": 10, - "Mercenary": 11, - "Nova Gear": 12, - "Progressive Upgrade 2": 13, - }, - SC2Race.ZERG: { - "Ability": 0, - "Mutation 1": 1, - "Strain": 2, - "Morph": 3, - "Upgrade": 4, - "Mercenary": 5, - "Unit": 6, - "Level": 7, - "Primal Form": 8, - "Evolution Pit": 9, - "Mutation 2": 10, - "Mutation 3": 11 - }, - SC2Race.PROTOSS: { - "Unit": 0, - "Unit 2": 1, - "Upgrade": 2, # Weapon / Armor upgrades - "Building": 3, - "Progressive Upgrade": 4, - "Spear of Adun": 5, - "Solarite Core": 6, - "Forge 1": 7, - "Forge 2": 8, - "Forge 3": 9, - } -} diff --git a/worlds/sc2/Locations.py b/worlds/sc2/Locations.py deleted file mode 100644 index 42b1dd4d4e..0000000000 --- a/worlds/sc2/Locations.py +++ /dev/null @@ -1,1635 +0,0 @@ -from enum import IntEnum -from typing import List, Tuple, Optional, Callable, NamedTuple, Set, Any -from BaseClasses import MultiWorld -from . import ItemNames -from .Options import get_option_value, kerrigan_unit_available, RequiredTactics, GrantStoryTech, LocationInclusion, \ - EnableHotsMissions -from .Rules import SC2Logic - -from BaseClasses import Location -from worlds.AutoWorld import World - -SC2WOL_LOC_ID_OFFSET = 1000 -SC2HOTS_LOC_ID_OFFSET = 20000000 # Avoid clashes with The Legend of Zelda -SC2LOTV_LOC_ID_OFFSET = SC2HOTS_LOC_ID_OFFSET + 2000 -SC2NCO_LOC_ID_OFFSET = SC2LOTV_LOC_ID_OFFSET + 2500 - - -class SC2Location(Location): - game: str = "Starcraft2" - - -class LocationType(IntEnum): - VICTORY = 0 # Winning a mission - VANILLA = 1 # Objectives that provided metaprogression in the original campaign, along with a few other locations for a balanced experience - EXTRA = 2 # Additional locations based on mission progression, collecting in-mission rewards, etc. that do not significantly increase the challenge. - CHALLENGE = 3 # Challenging objectives, often harder than just completing a mission, and often associated with Achievements - MASTERY = 4 # Extremely challenging objectives often associated with Masteries and Feats of Strength in the original campaign - - -class LocationData(NamedTuple): - region: str - name: str - code: Optional[int] - type: LocationType - rule: Optional[Callable[[Any], bool]] = Location.access_rule - - -def get_location_types(world: World, inclusion_type: LocationInclusion) -> Set[LocationType]: - """ - - :param multiworld: - :param player: - :param inclusion_type: Level of inclusion to check for - :return: A list of location types that match the inclusion type - """ - exclusion_options = [ - ("vanilla_locations", LocationType.VANILLA), - ("extra_locations", LocationType.EXTRA), - ("challenge_locations", LocationType.CHALLENGE), - ("mastery_locations", LocationType.MASTERY) - ] - excluded_location_types = set() - for option_name, location_type in exclusion_options: - if get_option_value(world, option_name) is inclusion_type: - excluded_location_types.add(location_type) - return excluded_location_types - - -def get_plando_locations(world: World) -> List[str]: - """ - - :param multiworld: - :param player: - :return: A list of locations affected by a plando in a world - """ - if world is None: - return [] - plando_locations = [] - for plando_setting in world.options.plando_items: - plando_locations += plando_setting.locations - - return plando_locations - - -def get_locations(world: Optional[World]) -> Tuple[LocationData, ...]: - # Note: rules which are ended with or True are rules identified as needed later when restricted units is an option - logic_level = get_option_value(world, 'required_tactics') - adv_tactics = logic_level != RequiredTactics.option_standard - kerriganless = get_option_value(world, 'kerrigan_presence') not in kerrigan_unit_available \ - or get_option_value(world, "enable_hots_missions") == EnableHotsMissions.option_false - story_tech_granted = get_option_value(world, "grant_story_tech") == GrantStoryTech.option_true - logic = SC2Logic(world) - player = None if world is None else world.player - location_table: List[LocationData] = [ - # WoL - LocationData("Liberation Day", "Liberation Day: Victory", SC2WOL_LOC_ID_OFFSET + 100, LocationType.VICTORY), - LocationData("Liberation Day", "Liberation Day: First Statue", SC2WOL_LOC_ID_OFFSET + 101, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Second Statue", SC2WOL_LOC_ID_OFFSET + 102, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Third Statue", SC2WOL_LOC_ID_OFFSET + 103, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Fourth Statue", SC2WOL_LOC_ID_OFFSET + 104, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Fifth Statue", SC2WOL_LOC_ID_OFFSET + 105, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Sixth Statue", SC2WOL_LOC_ID_OFFSET + 106, LocationType.VANILLA), - LocationData("Liberation Day", "Liberation Day: Special Delivery", SC2WOL_LOC_ID_OFFSET + 107, LocationType.EXTRA), - LocationData("Liberation Day", "Liberation Day: Transport", SC2WOL_LOC_ID_OFFSET + 108, LocationType.EXTRA), - LocationData("The Outlaws", "The Outlaws: Victory", SC2WOL_LOC_ID_OFFSET + 200, LocationType.VICTORY, - lambda state: logic.terran_early_tech(state)), - LocationData("The Outlaws", "The Outlaws: Rebel Base", SC2WOL_LOC_ID_OFFSET + 201, LocationType.VANILLA, - lambda state: logic.terran_early_tech(state)), - LocationData("The Outlaws", "The Outlaws: North Resource Pickups", SC2WOL_LOC_ID_OFFSET + 202, LocationType.EXTRA, - lambda state: logic.terran_early_tech(state)), - LocationData("The Outlaws", "The Outlaws: Bunker", SC2WOL_LOC_ID_OFFSET + 203, LocationType.VANILLA, - lambda state: logic.terran_early_tech(state)), - LocationData("The Outlaws", "The Outlaws: Close Resource Pickups", SC2WOL_LOC_ID_OFFSET + 204, LocationType.EXTRA), - LocationData("Zero Hour", "Zero Hour: Victory", SC2WOL_LOC_ID_OFFSET + 300, LocationType.VICTORY, - lambda state: logic.terran_common_unit(state) and - logic.terran_defense_rating(state, True) >= 2 and - (adv_tactics or logic.terran_basic_anti_air(state))), - LocationData("Zero Hour", "Zero Hour: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 301, LocationType.VANILLA), - LocationData("Zero Hour", "Zero Hour: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 302, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state)), - LocationData("Zero Hour", "Zero Hour: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 303, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_defense_rating(state, True) >= 2), - LocationData("Zero Hour", "Zero Hour: First Hatchery", SC2WOL_LOC_ID_OFFSET + 304, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state)), - LocationData("Zero Hour", "Zero Hour: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 305, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state)), - LocationData("Zero Hour", "Zero Hour: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 306, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state)), - LocationData("Zero Hour", "Zero Hour: Fourth Hatchery", SC2WOL_LOC_ID_OFFSET + 307, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state)), - LocationData("Zero Hour", "Zero Hour: Ride's on its Way", SC2WOL_LOC_ID_OFFSET + 308, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state)), - LocationData("Zero Hour", "Zero Hour: Hold Just a Little Longer", SC2WOL_LOC_ID_OFFSET + 309, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_defense_rating(state, True) >= 2), - LocationData("Zero Hour", "Zero Hour: Cavalry's on the Way", SC2WOL_LOC_ID_OFFSET + 310, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_defense_rating(state, True) >= 2), - LocationData("Evacuation", "Evacuation: Victory", SC2WOL_LOC_ID_OFFSET + 400, LocationType.VICTORY, - lambda state: logic.terran_early_tech(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Evacuation", "Evacuation: North Chrysalis", SC2WOL_LOC_ID_OFFSET + 401, LocationType.VANILLA), - LocationData("Evacuation", "Evacuation: West Chrysalis", SC2WOL_LOC_ID_OFFSET + 402, LocationType.VANILLA, - lambda state: logic.terran_early_tech(state)), - LocationData("Evacuation", "Evacuation: East Chrysalis", SC2WOL_LOC_ID_OFFSET + 403, LocationType.VANILLA, - lambda state: logic.terran_early_tech(state)), - LocationData("Evacuation", "Evacuation: Reach Hanson", SC2WOL_LOC_ID_OFFSET + 404, LocationType.EXTRA), - LocationData("Evacuation", "Evacuation: Secret Resource Stash", SC2WOL_LOC_ID_OFFSET + 405, LocationType.EXTRA), - LocationData("Evacuation", "Evacuation: Flawless", SC2WOL_LOC_ID_OFFSET + 406, LocationType.CHALLENGE, - lambda state: logic.terran_early_tech(state) and - logic.terran_defense_rating(state, True, False) >= 2 and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Outbreak", "Outbreak: Victory", SC2WOL_LOC_ID_OFFSET + 500, LocationType.VICTORY, - lambda state: logic.terran_defense_rating(state, True, False) >= 4 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: Left Infestor", SC2WOL_LOC_ID_OFFSET + 501, LocationType.VANILLA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: Right Infestor", SC2WOL_LOC_ID_OFFSET + 502, LocationType.VANILLA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: North Infested Command Center", SC2WOL_LOC_ID_OFFSET + 503, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: South Infested Command Center", SC2WOL_LOC_ID_OFFSET + 504, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: Northwest Bar", SC2WOL_LOC_ID_OFFSET + 505, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: North Bar", SC2WOL_LOC_ID_OFFSET + 506, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Outbreak", "Outbreak: South Bar", SC2WOL_LOC_ID_OFFSET + 507, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, True, False) >= 2 and - (logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Safe Haven", "Safe Haven: Victory", SC2WOL_LOC_ID_OFFSET + 600, LocationType.VICTORY, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: North Nexus", SC2WOL_LOC_ID_OFFSET + 601, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: East Nexus", SC2WOL_LOC_ID_OFFSET + 602, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: South Nexus", SC2WOL_LOC_ID_OFFSET + 603, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: First Terror Fleet", SC2WOL_LOC_ID_OFFSET + 604, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: Second Terror Fleet", SC2WOL_LOC_ID_OFFSET + 605, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Safe Haven", "Safe Haven: Third Terror Fleet", SC2WOL_LOC_ID_OFFSET + 606, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state)), - LocationData("Haven's Fall", "Haven's Fall: Victory", SC2WOL_LOC_ID_OFFSET + 700, LocationType.VICTORY, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: North Hive", SC2WOL_LOC_ID_OFFSET + 701, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: East Hive", SC2WOL_LOC_ID_OFFSET + 702, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: South Hive", SC2WOL_LOC_ID_OFFSET + 703, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: Northeast Colony Base", SC2WOL_LOC_ID_OFFSET + 704, LocationType.CHALLENGE, - lambda state: logic.terran_respond_to_colony_infestations(state)), - LocationData("Haven's Fall", "Haven's Fall: East Colony Base", SC2WOL_LOC_ID_OFFSET + 705, LocationType.CHALLENGE, - lambda state: logic.terran_respond_to_colony_infestations(state)), - LocationData("Haven's Fall", "Haven's Fall: Middle Colony Base", SC2WOL_LOC_ID_OFFSET + 706, LocationType.CHALLENGE, - lambda state: logic.terran_respond_to_colony_infestations(state)), - LocationData("Haven's Fall", "Haven's Fall: Southeast Colony Base", SC2WOL_LOC_ID_OFFSET + 707, LocationType.CHALLENGE, - lambda state: logic.terran_respond_to_colony_infestations(state)), - LocationData("Haven's Fall", "Haven's Fall: Southwest Colony Base", SC2WOL_LOC_ID_OFFSET + 708, LocationType.CHALLENGE, - lambda state: logic.terran_respond_to_colony_infestations(state)), - LocationData("Haven's Fall", "Haven's Fall: Southwest Gas Pickups", SC2WOL_LOC_ID_OFFSET + 709, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: East Gas Pickups", SC2WOL_LOC_ID_OFFSET + 710, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Haven's Fall", "Haven's Fall: Southeast Gas Pickups", SC2WOL_LOC_ID_OFFSET + 711, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - logic.terran_competent_anti_air(state) and - logic.terran_defense_rating(state, True) >= 3), - LocationData("Smash and Grab", "Smash and Grab: Victory", SC2WOL_LOC_ID_OFFSET + 800, LocationType.VICTORY, - lambda state: logic.terran_common_unit(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Smash and Grab", "Smash and Grab: First Relic", SC2WOL_LOC_ID_OFFSET + 801, LocationType.VANILLA), - LocationData("Smash and Grab", "Smash and Grab: Second Relic", SC2WOL_LOC_ID_OFFSET + 802, LocationType.VANILLA), - LocationData("Smash and Grab", "Smash and Grab: Third Relic", SC2WOL_LOC_ID_OFFSET + 803, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Smash and Grab", "Smash and Grab: Fourth Relic", SC2WOL_LOC_ID_OFFSET + 804, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Smash and Grab", "Smash and Grab: First Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 805, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("Smash and Grab", "Smash and Grab: Second Forcefield Area Busted", SC2WOL_LOC_ID_OFFSET + 806, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state) and - (adv_tactics and logic.terran_basic_anti_air(state) - or logic.terran_competent_anti_air(state))), - LocationData("The Dig", "The Dig: Victory", SC2WOL_LOC_ID_OFFSET + 900, LocationType.VICTORY, - lambda state: logic.terran_basic_anti_air(state) - and logic.terran_defense_rating(state, False, True) >= 8 - and logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Left Relic", SC2WOL_LOC_ID_OFFSET + 901, LocationType.VANILLA, - lambda state: logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Right Ground Relic", SC2WOL_LOC_ID_OFFSET + 902, LocationType.VANILLA, - lambda state: logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Right Cliff Relic", SC2WOL_LOC_ID_OFFSET + 903, LocationType.VANILLA, - lambda state: logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Moebius Base", SC2WOL_LOC_ID_OFFSET + 904, LocationType.EXTRA, - lambda state: logic.marine_medic_upgrade(state) or adv_tactics), - LocationData("The Dig", "The Dig: Door Outer Layer", SC2WOL_LOC_ID_OFFSET + 905, LocationType.EXTRA, - lambda state: logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Door Thermal Barrier", SC2WOL_LOC_ID_OFFSET + 906, LocationType.EXTRA, - lambda state: logic.terran_basic_anti_air(state) - and logic.terran_defense_rating(state, False, True) >= 8 - and logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Cutting Through the Core", SC2WOL_LOC_ID_OFFSET + 907, LocationType.EXTRA, - lambda state: logic.terran_basic_anti_air(state) - and logic.terran_defense_rating(state, False, True) >= 8 - and logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Dig", "The Dig: Structure Access Imminent", SC2WOL_LOC_ID_OFFSET + 908, LocationType.EXTRA, - lambda state: logic.terran_basic_anti_air(state) - and logic.terran_defense_rating(state, False, True) >= 8 - and logic.terran_defense_rating(state, False, False) >= 6 - and logic.terran_common_unit(state) - and (logic.marine_medic_upgrade(state) or adv_tactics)), - LocationData("The Moebius Factor", "The Moebius Factor: Victory", SC2WOL_LOC_ID_OFFSET + 1000, LocationType.VICTORY, - lambda state: logic.terran_basic_anti_air(state) and - (logic.terran_air(state) - or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player) - and logic.terran_common_unit(state))), - LocationData("The Moebius Factor", "The Moebius Factor: 1st Data Core", SC2WOL_LOC_ID_OFFSET + 1001, LocationType.VANILLA), - LocationData("The Moebius Factor", "The Moebius Factor: 2nd Data Core", SC2WOL_LOC_ID_OFFSET + 1002, LocationType.VANILLA, - lambda state: (logic.terran_air(state) - or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player) - and logic.terran_common_unit(state))), - LocationData("The Moebius Factor", "The Moebius Factor: South Rescue", SC2WOL_LOC_ID_OFFSET + 1003, LocationType.EXTRA, - lambda state: logic.terran_can_rescue(state)), - LocationData("The Moebius Factor", "The Moebius Factor: Wall Rescue", SC2WOL_LOC_ID_OFFSET + 1004, LocationType.EXTRA, - lambda state: logic.terran_can_rescue(state)), - LocationData("The Moebius Factor", "The Moebius Factor: Mid Rescue", SC2WOL_LOC_ID_OFFSET + 1005, LocationType.EXTRA, - lambda state: logic.terran_can_rescue(state)), - LocationData("The Moebius Factor", "The Moebius Factor: Nydus Roof Rescue", SC2WOL_LOC_ID_OFFSET + 1006, LocationType.EXTRA, - lambda state: logic.terran_can_rescue(state)), - LocationData("The Moebius Factor", "The Moebius Factor: Alive Inside Rescue", SC2WOL_LOC_ID_OFFSET + 1007, LocationType.EXTRA, - lambda state: logic.terran_can_rescue(state)), - LocationData("The Moebius Factor", "The Moebius Factor: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1008, LocationType.VANILLA, - lambda state: logic.terran_basic_anti_air(state) and - (logic.terran_air(state) - or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player) - and logic.terran_common_unit(state))), - LocationData("The Moebius Factor", "The Moebius Factor: 3rd Data Core", SC2WOL_LOC_ID_OFFSET + 1009, LocationType.VANILLA, - lambda state: logic.terran_basic_anti_air(state) and - (logic.terran_air(state) - or state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES}, player) - and logic.terran_common_unit(state))), - LocationData("Supernova", "Supernova: Victory", SC2WOL_LOC_ID_OFFSET + 1100, LocationType.VICTORY, - lambda state: logic.terran_beats_protoss_deathball(state)), - LocationData("Supernova", "Supernova: West Relic", SC2WOL_LOC_ID_OFFSET + 1101, LocationType.VANILLA), - LocationData("Supernova", "Supernova: North Relic", SC2WOL_LOC_ID_OFFSET + 1102, LocationType.VANILLA), - LocationData("Supernova", "Supernova: South Relic", SC2WOL_LOC_ID_OFFSET + 1103, LocationType.VANILLA, - lambda state: logic.terran_beats_protoss_deathball(state)), - LocationData("Supernova", "Supernova: East Relic", SC2WOL_LOC_ID_OFFSET + 1104, LocationType.VANILLA, - lambda state: logic.terran_beats_protoss_deathball(state)), - LocationData("Supernova", "Supernova: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1105, LocationType.EXTRA), - LocationData("Supernova", "Supernova: Middle Base", SC2WOL_LOC_ID_OFFSET + 1106, LocationType.EXTRA, - lambda state: logic.terran_beats_protoss_deathball(state)), - LocationData("Supernova", "Supernova: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1107, LocationType.EXTRA, - lambda state: logic.terran_beats_protoss_deathball(state)), - LocationData("Maw of the Void", "Maw of the Void: Victory", SC2WOL_LOC_ID_OFFSET + 1200, LocationType.VICTORY, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1201, LocationType.EXTRA), - LocationData("Maw of the Void", "Maw of the Void: Expansion Prisoners", SC2WOL_LOC_ID_OFFSET + 1202, LocationType.VANILLA, - lambda state: adv_tactics or logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: South Close Prisoners", SC2WOL_LOC_ID_OFFSET + 1203, LocationType.VANILLA, - lambda state: adv_tactics or logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: South Far Prisoners", SC2WOL_LOC_ID_OFFSET + 1204, LocationType.VANILLA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: North Prisoners", SC2WOL_LOC_ID_OFFSET + 1205, LocationType.VANILLA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Mothership", SC2WOL_LOC_ID_OFFSET + 1206, LocationType.EXTRA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Expansion Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1207, LocationType.EXTRA, - lambda state: adv_tactics or logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Middle Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1208, LocationType.EXTRA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Southeast Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1209, LocationType.EXTRA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Stargate Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1210, LocationType.EXTRA, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Northwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1211, LocationType.CHALLENGE, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: West Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1212, LocationType.CHALLENGE, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Maw of the Void", "Maw of the Void: Southwest Rip Field Generator", SC2WOL_LOC_ID_OFFSET + 1213, LocationType.CHALLENGE, - lambda state: logic.terran_survives_rip_field(state)), - LocationData("Devil's Playground", "Devil's Playground: Victory", SC2WOL_LOC_ID_OFFSET + 1300, LocationType.VICTORY, - lambda state: adv_tactics or - logic.terran_basic_anti_air(state) and ( - logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Devil's Playground", "Devil's Playground: Tosh's Miners", SC2WOL_LOC_ID_OFFSET + 1301, LocationType.VANILLA), - LocationData("Devil's Playground", "Devil's Playground: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1302, LocationType.VANILLA, - lambda state: adv_tactics or logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player)), - LocationData("Devil's Playground", "Devil's Playground: North Reapers", SC2WOL_LOC_ID_OFFSET + 1303, LocationType.EXTRA), - LocationData("Devil's Playground", "Devil's Playground: Middle Reapers", SC2WOL_LOC_ID_OFFSET + 1304, LocationType.EXTRA, - lambda state: adv_tactics or logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player)), - LocationData("Devil's Playground", "Devil's Playground: Southwest Reapers", SC2WOL_LOC_ID_OFFSET + 1305, LocationType.EXTRA, - lambda state: adv_tactics or logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player)), - LocationData("Devil's Playground", "Devil's Playground: Southeast Reapers", SC2WOL_LOC_ID_OFFSET + 1306, LocationType.EXTRA, - lambda state: adv_tactics or - logic.terran_basic_anti_air(state) and ( - logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Devil's Playground", "Devil's Playground: East Reapers", SC2WOL_LOC_ID_OFFSET + 1307, LocationType.CHALLENGE, - lambda state: logic.terran_basic_anti_air(state) and - (adv_tactics or - logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Devil's Playground", "Devil's Playground: Zerg Cleared", SC2WOL_LOC_ID_OFFSET + 1308, LocationType.CHALLENGE, - lambda state: logic.terran_competent_anti_air(state) and ( - logic.terran_common_unit(state) or state.has(ItemNames.REAPER, player))), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Victory", SC2WOL_LOC_ID_OFFSET + 1400, LocationType.VICTORY, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Close Relic", SC2WOL_LOC_ID_OFFSET + 1401, LocationType.VANILLA), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: West Relic", SC2WOL_LOC_ID_OFFSET + 1402, LocationType.VANILLA, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: North-East Relic", SC2WOL_LOC_ID_OFFSET + 1403, LocationType.VANILLA, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Middle Base", SC2WOL_LOC_ID_OFFSET + 1404, LocationType.EXTRA, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Main Base", SC2WOL_LOC_ID_OFFSET + 1405, - LocationType.MASTERY, - lambda state: logic.welcome_to_the_jungle_requirement(state) - and logic.terran_beats_protoss_deathball(state) - and logic.terran_base_trasher(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: No Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1406, LocationType.CHALLENGE, - lambda state: logic.welcome_to_the_jungle_requirement(state) - and logic.terran_competent_ground_to_air(state) - and logic.terran_beats_protoss_deathball(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 1 Terrazine Node Sealed", SC2WOL_LOC_ID_OFFSET + 1407, LocationType.CHALLENGE, - lambda state: logic.welcome_to_the_jungle_requirement(state) - and logic.terran_competent_ground_to_air(state) - and logic.terran_beats_protoss_deathball(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 2 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1408, LocationType.CHALLENGE, - lambda state: logic.welcome_to_the_jungle_requirement(state) - and logic.terran_beats_protoss_deathball(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 3 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1409, LocationType.CHALLENGE, - lambda state: logic.welcome_to_the_jungle_requirement(state) - and logic.terran_competent_comp(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 4 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1410, LocationType.EXTRA, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Welcome to the Jungle", "Welcome to the Jungle: Up to 5 Terrazine Nodes Sealed", SC2WOL_LOC_ID_OFFSET + 1411, LocationType.EXTRA, - lambda state: logic.welcome_to_the_jungle_requirement(state)), - LocationData("Breakout", "Breakout: Victory", SC2WOL_LOC_ID_OFFSET + 1500, LocationType.VICTORY), - LocationData("Breakout", "Breakout: Diamondback Prison", SC2WOL_LOC_ID_OFFSET + 1501, LocationType.VANILLA), - LocationData("Breakout", "Breakout: Siege Tank Prison", SC2WOL_LOC_ID_OFFSET + 1502, LocationType.VANILLA), - LocationData("Breakout", "Breakout: First Checkpoint", SC2WOL_LOC_ID_OFFSET + 1503, LocationType.EXTRA), - LocationData("Breakout", "Breakout: Second Checkpoint", SC2WOL_LOC_ID_OFFSET + 1504, LocationType.EXTRA), - LocationData("Ghost of a Chance", "Ghost of a Chance: Victory", SC2WOL_LOC_ID_OFFSET + 1600, LocationType.VICTORY), - LocationData("Ghost of a Chance", "Ghost of a Chance: Terrazine Tank", SC2WOL_LOC_ID_OFFSET + 1601, LocationType.EXTRA), - LocationData("Ghost of a Chance", "Ghost of a Chance: Jorium Stockpile", SC2WOL_LOC_ID_OFFSET + 1602, LocationType.EXTRA), - LocationData("Ghost of a Chance", "Ghost of a Chance: First Island Spectres", SC2WOL_LOC_ID_OFFSET + 1603, LocationType.VANILLA), - LocationData("Ghost of a Chance", "Ghost of a Chance: Second Island Spectres", SC2WOL_LOC_ID_OFFSET + 1604, LocationType.VANILLA), - LocationData("Ghost of a Chance", "Ghost of a Chance: Third Island Spectres", SC2WOL_LOC_ID_OFFSET + 1605, LocationType.VANILLA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Victory", SC2WOL_LOC_ID_OFFSET + 1700, LocationType.VICTORY, - lambda state: logic.great_train_robbery_train_stopper(state) and - logic.terran_basic_anti_air(state)), - LocationData("The Great Train Robbery", "The Great Train Robbery: North Defiler", SC2WOL_LOC_ID_OFFSET + 1701, LocationType.VANILLA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Mid Defiler", SC2WOL_LOC_ID_OFFSET + 1702, LocationType.VANILLA), - LocationData("The Great Train Robbery", "The Great Train Robbery: South Defiler", SC2WOL_LOC_ID_OFFSET + 1703, LocationType.VANILLA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Close Diamondback", SC2WOL_LOC_ID_OFFSET + 1704, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Northwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1705, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: North Diamondback", SC2WOL_LOC_ID_OFFSET + 1706, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Northeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1707, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Southwest Diamondback", SC2WOL_LOC_ID_OFFSET + 1708, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Southeast Diamondback", SC2WOL_LOC_ID_OFFSET + 1709, LocationType.EXTRA), - LocationData("The Great Train Robbery", "The Great Train Robbery: Kill Team", SC2WOL_LOC_ID_OFFSET + 1710, LocationType.CHALLENGE, - lambda state: (adv_tactics or logic.terran_common_unit(state)) and - logic.great_train_robbery_train_stopper(state) and - logic.terran_basic_anti_air(state)), - LocationData("The Great Train Robbery", "The Great Train Robbery: Flawless", SC2WOL_LOC_ID_OFFSET + 1711, LocationType.CHALLENGE, - lambda state: logic.great_train_robbery_train_stopper(state) and - logic.terran_basic_anti_air(state)), - LocationData("The Great Train Robbery", "The Great Train Robbery: 2 Trains Destroyed", SC2WOL_LOC_ID_OFFSET + 1712, LocationType.EXTRA, - lambda state: logic.great_train_robbery_train_stopper(state)), - LocationData("The Great Train Robbery", "The Great Train Robbery: 4 Trains Destroyed", SC2WOL_LOC_ID_OFFSET + 1713, LocationType.EXTRA, - lambda state: logic.great_train_robbery_train_stopper(state) and - logic.terran_basic_anti_air(state)), - LocationData("The Great Train Robbery", "The Great Train Robbery: 6 Trains Destroyed", SC2WOL_LOC_ID_OFFSET + 1714, LocationType.EXTRA, - lambda state: logic.great_train_robbery_train_stopper(state) and - logic.terran_basic_anti_air(state)), - LocationData("Cutthroat", "Cutthroat: Victory", SC2WOL_LOC_ID_OFFSET + 1800, LocationType.VICTORY, - lambda state: logic.terran_common_unit(state) and - (adv_tactics or logic.terran_basic_anti_air)), - LocationData("Cutthroat", "Cutthroat: Mira Han", SC2WOL_LOC_ID_OFFSET + 1801, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state)), - LocationData("Cutthroat", "Cutthroat: North Relic", SC2WOL_LOC_ID_OFFSET + 1802, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state)), - LocationData("Cutthroat", "Cutthroat: Mid Relic", SC2WOL_LOC_ID_OFFSET + 1803, LocationType.VANILLA), - LocationData("Cutthroat", "Cutthroat: Southwest Relic", SC2WOL_LOC_ID_OFFSET + 1804, LocationType.VANILLA, - lambda state: logic.terran_common_unit(state)), - LocationData("Cutthroat", "Cutthroat: North Command Center", SC2WOL_LOC_ID_OFFSET + 1805, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state)), - LocationData("Cutthroat", "Cutthroat: South Command Center", SC2WOL_LOC_ID_OFFSET + 1806, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state)), - LocationData("Cutthroat", "Cutthroat: West Command Center", SC2WOL_LOC_ID_OFFSET + 1807, LocationType.EXTRA, - lambda state: logic.terran_common_unit(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Victory", SC2WOL_LOC_ID_OFFSET + 1900, LocationType.VICTORY, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Odin", SC2WOL_LOC_ID_OFFSET + 1901, LocationType.EXTRA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Loki", SC2WOL_LOC_ID_OFFSET + 1902, - LocationType.CHALLENGE, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Lab Devourer", SC2WOL_LOC_ID_OFFSET + 1903, LocationType.VANILLA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Engine of Destruction", "Engine of Destruction: North Devourer", SC2WOL_LOC_ID_OFFSET + 1904, LocationType.VANILLA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Southeast Devourer", SC2WOL_LOC_ID_OFFSET + 1905, LocationType.VANILLA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: West Base", SC2WOL_LOC_ID_OFFSET + 1906, LocationType.EXTRA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Northwest Base", SC2WOL_LOC_ID_OFFSET + 1907, LocationType.EXTRA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Northeast Base", SC2WOL_LOC_ID_OFFSET + 1908, LocationType.EXTRA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Engine of Destruction", "Engine of Destruction: Southeast Base", SC2WOL_LOC_ID_OFFSET + 1909, LocationType.EXTRA, - lambda state: logic.engine_of_destruction_requirement(state)), - LocationData("Media Blitz", "Media Blitz: Victory", SC2WOL_LOC_ID_OFFSET + 2000, LocationType.VICTORY, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Tower 1", SC2WOL_LOC_ID_OFFSET + 2001, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Tower 2", SC2WOL_LOC_ID_OFFSET + 2002, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Tower 3", SC2WOL_LOC_ID_OFFSET + 2003, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Science Facility", SC2WOL_LOC_ID_OFFSET + 2004, LocationType.VANILLA), - LocationData("Media Blitz", "Media Blitz: All Barracks", SC2WOL_LOC_ID_OFFSET + 2005, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: All Factories", SC2WOL_LOC_ID_OFFSET + 2006, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: All Starports", SC2WOL_LOC_ID_OFFSET + 2007, LocationType.EXTRA, - lambda state: adv_tactics or logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Odin Not Trashed", SC2WOL_LOC_ID_OFFSET + 2008, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state)), - LocationData("Media Blitz", "Media Blitz: Surprise Attack Ends", SC2WOL_LOC_ID_OFFSET + 2009, LocationType.EXTRA), - LocationData("Piercing the Shroud", "Piercing the Shroud: Victory", SC2WOL_LOC_ID_OFFSET + 2100, LocationType.VICTORY, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Holding Cell Relic", SC2WOL_LOC_ID_OFFSET + 2101, LocationType.VANILLA), - LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk Relic", SC2WOL_LOC_ID_OFFSET + 2102, LocationType.VANILLA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: First Escape Relic", SC2WOL_LOC_ID_OFFSET + 2103, LocationType.VANILLA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Second Escape Relic", SC2WOL_LOC_ID_OFFSET + 2104, LocationType.VANILLA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk", SC2WOL_LOC_ID_OFFSET + 2105, LocationType.VANILLA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Fusion Reactor", SC2WOL_LOC_ID_OFFSET + 2106, LocationType.EXTRA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Piercing the Shroud", "Piercing the Shroud: Entrance Holding Pen", SC2WOL_LOC_ID_OFFSET + 2107, LocationType.EXTRA), - LocationData("Piercing the Shroud", "Piercing the Shroud: Cargo Bay Warbot", SC2WOL_LOC_ID_OFFSET + 2108, LocationType.EXTRA), - LocationData("Piercing the Shroud", "Piercing the Shroud: Escape Warbot", SC2WOL_LOC_ID_OFFSET + 2109, LocationType.EXTRA, - lambda state: logic.marine_medic_upgrade(state)), - LocationData("Whispers of Doom", "Whispers of Doom: Victory", SC2WOL_LOC_ID_OFFSET + 2200, LocationType.VICTORY), - LocationData("Whispers of Doom", "Whispers of Doom: First Hatchery", SC2WOL_LOC_ID_OFFSET + 2201, LocationType.VANILLA), - LocationData("Whispers of Doom", "Whispers of Doom: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 2202, LocationType.VANILLA), - LocationData("Whispers of Doom", "Whispers of Doom: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 2203, LocationType.VANILLA), - LocationData("Whispers of Doom", "Whispers of Doom: First Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2204, LocationType.EXTRA), - LocationData("Whispers of Doom", "Whispers of Doom: Second Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2205, LocationType.EXTRA), - LocationData("Whispers of Doom", "Whispers of Doom: Third Prophecy Fragment", SC2WOL_LOC_ID_OFFSET + 2206, LocationType.EXTRA), - LocationData("A Sinister Turn", "A Sinister Turn: Victory", SC2WOL_LOC_ID_OFFSET + 2300, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Robotics Facility", SC2WOL_LOC_ID_OFFSET + 2301, LocationType.VANILLA, - lambda state: adv_tactics or logic.protoss_common_unit(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Dark Shrine", SC2WOL_LOC_ID_OFFSET + 2302, LocationType.VANILLA, - lambda state: adv_tactics or logic.protoss_common_unit(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Templar Archives", SC2WOL_LOC_ID_OFFSET + 2303, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Northeast Base", SC2WOL_LOC_ID_OFFSET + 2304, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Southwest Base", SC2WOL_LOC_ID_OFFSET + 2305, LocationType.CHALLENGE, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Maar", SC2WOL_LOC_ID_OFFSET + 2306, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Northwest Preserver", SC2WOL_LOC_ID_OFFSET + 2307, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: Southwest Preserver", SC2WOL_LOC_ID_OFFSET + 2308, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("A Sinister Turn", "A Sinister Turn: East Preserver", SC2WOL_LOC_ID_OFFSET + 2309, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("Echoes of the Future", "Echoes of the Future: Victory", SC2WOL_LOC_ID_OFFSET + 2400, LocationType.VICTORY, - lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state) and logic.protoss_competent_anti_air(state)), - LocationData("Echoes of the Future", "Echoes of the Future: Close Obelisk", SC2WOL_LOC_ID_OFFSET + 2401, LocationType.VANILLA), - LocationData("Echoes of the Future", "Echoes of the Future: West Obelisk", SC2WOL_LOC_ID_OFFSET + 2402, LocationType.VANILLA, - lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)), - LocationData("Echoes of the Future", "Echoes of the Future: Base", SC2WOL_LOC_ID_OFFSET + 2403, LocationType.EXTRA), - LocationData("Echoes of the Future", "Echoes of the Future: Southwest Tendril", SC2WOL_LOC_ID_OFFSET + 2404, LocationType.EXTRA), - LocationData("Echoes of the Future", "Echoes of the Future: Southeast Tendril", SC2WOL_LOC_ID_OFFSET + 2405, LocationType.EXTRA, - lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)), - LocationData("Echoes of the Future", "Echoes of the Future: Northeast Tendril", SC2WOL_LOC_ID_OFFSET + 2406, LocationType.EXTRA, - lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)), - LocationData("Echoes of the Future", "Echoes of the Future: Northwest Tendril", SC2WOL_LOC_ID_OFFSET + 2407, LocationType.EXTRA, - lambda state: adv_tactics and logic.protoss_static_defense(state) or logic.protoss_common_unit(state)), - LocationData("In Utter Darkness", "In Utter Darkness: Defeat", SC2WOL_LOC_ID_OFFSET + 2500, LocationType.VICTORY), - LocationData("In Utter Darkness", "In Utter Darkness: Protoss Archive", SC2WOL_LOC_ID_OFFSET + 2501, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state)), - LocationData("In Utter Darkness", "In Utter Darkness: Kills", SC2WOL_LOC_ID_OFFSET + 2502, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state)), - LocationData("In Utter Darkness", "In Utter Darkness: Urun", SC2WOL_LOC_ID_OFFSET + 2503, LocationType.EXTRA), - LocationData("In Utter Darkness", "In Utter Darkness: Mohandar", SC2WOL_LOC_ID_OFFSET + 2504, LocationType.EXTRA, - lambda state: logic.last_stand_requirement(state)), - LocationData("In Utter Darkness", "In Utter Darkness: Selendis", SC2WOL_LOC_ID_OFFSET + 2505, LocationType.EXTRA, - lambda state: logic.last_stand_requirement(state)), - LocationData("In Utter Darkness", "In Utter Darkness: Artanis", SC2WOL_LOC_ID_OFFSET + 2506, LocationType.EXTRA, - lambda state: logic.last_stand_requirement(state)), - LocationData("Gates of Hell", "Gates of Hell: Victory", SC2WOL_LOC_ID_OFFSET + 2600, LocationType.VICTORY, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Large Army", SC2WOL_LOC_ID_OFFSET + 2601, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: 2 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2602, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: 4 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2603, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: 6 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2604, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: 8 Drop Pods", SC2WOL_LOC_ID_OFFSET + 2605, LocationType.CHALLENGE, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Southwest Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2606, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Northwest Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2607, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Northeast Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2608, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: East Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2609, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Southeast Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2610, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Gates of Hell", "Gates of Hell: Expansion Spore Cannon", SC2WOL_LOC_ID_OFFSET + 2611, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state) and - logic.terran_defense_rating(state, True) > 6), - LocationData("Belly of the Beast", "Belly of the Beast: Victory", SC2WOL_LOC_ID_OFFSET + 2700, LocationType.VICTORY), - LocationData("Belly of the Beast", "Belly of the Beast: First Charge", SC2WOL_LOC_ID_OFFSET + 2701, LocationType.EXTRA), - LocationData("Belly of the Beast", "Belly of the Beast: Second Charge", SC2WOL_LOC_ID_OFFSET + 2702, LocationType.EXTRA), - LocationData("Belly of the Beast", "Belly of the Beast: Third Charge", SC2WOL_LOC_ID_OFFSET + 2703, LocationType.EXTRA), - LocationData("Belly of the Beast", "Belly of the Beast: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 2704, LocationType.VANILLA), - LocationData("Belly of the Beast", "Belly of the Beast: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 2705, LocationType.VANILLA), - LocationData("Belly of the Beast", "Belly of the Beast: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 2706, LocationType.VANILLA), - LocationData("Shatter the Sky", "Shatter the Sky: Victory", SC2WOL_LOC_ID_OFFSET + 2800, LocationType.VICTORY, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Close Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2801, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Northwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2802, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Southeast Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2803, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Southwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2804, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Leviathan", SC2WOL_LOC_ID_OFFSET + 2805, LocationType.VANILLA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: East Hatchery", SC2WOL_LOC_ID_OFFSET + 2806, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: North Hatchery", SC2WOL_LOC_ID_OFFSET + 2807, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state)), - LocationData("Shatter the Sky", "Shatter the Sky: Mid Hatchery", SC2WOL_LOC_ID_OFFSET + 2808, LocationType.EXTRA, - lambda state: logic.terran_competent_comp(state)), - LocationData("All-In", "All-In: Victory", SC2WOL_LOC_ID_OFFSET + 2900, LocationType.VICTORY, - lambda state: logic.all_in_requirement(state)), - LocationData("All-In", "All-In: First Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2901, LocationType.EXTRA, - lambda state: logic.all_in_requirement(state)), - LocationData("All-In", "All-In: Second Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2902, LocationType.EXTRA, - lambda state: logic.all_in_requirement(state)), - LocationData("All-In", "All-In: Third Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2903, LocationType.EXTRA, - lambda state: logic.all_in_requirement(state)), - LocationData("All-In", "All-In: Fourth Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2904, LocationType.EXTRA, - lambda state: logic.all_in_requirement(state)), - LocationData("All-In", "All-In: Fifth Kerrigan Attack", SC2WOL_LOC_ID_OFFSET + 2905, LocationType.EXTRA, - lambda state: logic.all_in_requirement(state)), - - # HotS - LocationData("Lab Rat", "Lab Rat: Victory", SC2HOTS_LOC_ID_OFFSET + 100, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state)), - LocationData("Lab Rat", "Lab Rat: Gather Minerals", SC2HOTS_LOC_ID_OFFSET + 101, LocationType.VANILLA), - LocationData("Lab Rat", "Lab Rat: South Zergling Group", SC2HOTS_LOC_ID_OFFSET + 102, LocationType.VANILLA, - lambda state: adv_tactics or logic.zerg_common_unit(state)), - LocationData("Lab Rat", "Lab Rat: East Zergling Group", SC2HOTS_LOC_ID_OFFSET + 103, LocationType.VANILLA, - lambda state: adv_tactics or logic.zerg_common_unit(state)), - LocationData("Lab Rat", "Lab Rat: West Zergling Group", SC2HOTS_LOC_ID_OFFSET + 104, LocationType.VANILLA, - lambda state: adv_tactics or logic.zerg_common_unit(state)), - LocationData("Lab Rat", "Lab Rat: Hatchery", SC2HOTS_LOC_ID_OFFSET + 105, LocationType.EXTRA), - LocationData("Lab Rat", "Lab Rat: Overlord", SC2HOTS_LOC_ID_OFFSET + 106, LocationType.EXTRA), - LocationData("Lab Rat", "Lab Rat: Gas Turrets", SC2HOTS_LOC_ID_OFFSET + 107, LocationType.EXTRA, - lambda state: adv_tactics or logic.zerg_common_unit(state)), - LocationData("Back in the Saddle", "Back in the Saddle: Victory", SC2HOTS_LOC_ID_OFFSET + 200, LocationType.VICTORY, - lambda state: logic.basic_kerrigan(state) or kerriganless or logic.story_tech_granted), - LocationData("Back in the Saddle", "Back in the Saddle: Defend the Tram", SC2HOTS_LOC_ID_OFFSET + 201, LocationType.EXTRA, - lambda state: logic.basic_kerrigan(state) or kerriganless or logic.story_tech_granted), - LocationData("Back in the Saddle", "Back in the Saddle: Kinetic Blast", SC2HOTS_LOC_ID_OFFSET + 202, LocationType.VANILLA), - LocationData("Back in the Saddle", "Back in the Saddle: Crushing Grip", SC2HOTS_LOC_ID_OFFSET + 203, LocationType.VANILLA), - LocationData("Back in the Saddle", "Back in the Saddle: Reach the Sublevel", SC2HOTS_LOC_ID_OFFSET + 204, LocationType.EXTRA), - LocationData("Back in the Saddle", "Back in the Saddle: Door Section Cleared", SC2HOTS_LOC_ID_OFFSET + 205, LocationType.EXTRA, - lambda state: logic.basic_kerrigan(state) or kerriganless or logic.story_tech_granted), - LocationData("Rendezvous", "Rendezvous: Victory", SC2HOTS_LOC_ID_OFFSET + 300, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Rendezvous", "Rendezvous: Right Queen", SC2HOTS_LOC_ID_OFFSET + 301, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Rendezvous", "Rendezvous: Center Queen", SC2HOTS_LOC_ID_OFFSET + 302, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Rendezvous", "Rendezvous: Left Queen", SC2HOTS_LOC_ID_OFFSET + 303, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Rendezvous", "Rendezvous: Hold Out Finished", SC2HOTS_LOC_ID_OFFSET + 304, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Harvest of Screams", "Harvest of Screams: Victory", SC2HOTS_LOC_ID_OFFSET + 400, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state)), - LocationData("Harvest of Screams", "Harvest of Screams: First Ursadon Matriarch", SC2HOTS_LOC_ID_OFFSET + 401, LocationType.VANILLA), - LocationData("Harvest of Screams", "Harvest of Screams: North Ursadon Matriarch", SC2HOTS_LOC_ID_OFFSET + 402, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Harvest of Screams", "Harvest of Screams: West Ursadon Matriarch", SC2HOTS_LOC_ID_OFFSET + 403, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Harvest of Screams", "Harvest of Screams: Lost Brood", SC2HOTS_LOC_ID_OFFSET + 404, LocationType.EXTRA), - LocationData("Harvest of Screams", "Harvest of Screams: Northeast Psi-link Spire", SC2HOTS_LOC_ID_OFFSET + 405, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Harvest of Screams", "Harvest of Screams: Northwest Psi-link Spire", SC2HOTS_LOC_ID_OFFSET + 406, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state)), - LocationData("Harvest of Screams", "Harvest of Screams: Southwest Psi-link Spire", SC2HOTS_LOC_ID_OFFSET + 407, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state)), - LocationData("Harvest of Screams", "Harvest of Screams: Nafash", SC2HOTS_LOC_ID_OFFSET + 408, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: Victory", SC2HOTS_LOC_ID_OFFSET + 500, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: East Stasis Chamber", SC2HOTS_LOC_ID_OFFSET + 501, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: Center Stasis Chamber", SC2HOTS_LOC_ID_OFFSET + 502, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) or adv_tactics), - LocationData("Shoot the Messenger", "Shoot the Messenger: West Stasis Chamber", SC2HOTS_LOC_ID_OFFSET + 503, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: Destroy 4 Shuttles", SC2HOTS_LOC_ID_OFFSET + 504, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: Frozen Expansion", SC2HOTS_LOC_ID_OFFSET + 505, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: Southwest Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 506, LocationType.EXTRA), - LocationData("Shoot the Messenger", "Shoot the Messenger: Southeast Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 507, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) or adv_tactics), - LocationData("Shoot the Messenger", "Shoot the Messenger: West Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 508, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Shoot the Messenger", "Shoot the Messenger: East Frozen Zerg", SC2HOTS_LOC_ID_OFFSET + 509, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state)), - LocationData("Enemy Within", "Enemy Within: Victory", SC2HOTS_LOC_ID_OFFSET + 600, LocationType.VICTORY, - lambda state: logic.zerg_pass_vents(state) - and (logic.story_tech_granted - or state.has_any({ItemNames.ZERGLING_RAPTOR_STRAIN, ItemNames.ROACH, - ItemNames.HYDRALISK, ItemNames.INFESTOR}, player)) - ), - LocationData("Enemy Within", "Enemy Within: Infest Giant Ursadon", SC2HOTS_LOC_ID_OFFSET + 601, LocationType.VANILLA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Enemy Within", "Enemy Within: First Niadra Evolution", SC2HOTS_LOC_ID_OFFSET + 602, LocationType.VANILLA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Enemy Within", "Enemy Within: Second Niadra Evolution", SC2HOTS_LOC_ID_OFFSET + 603, LocationType.VANILLA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Enemy Within", "Enemy Within: Third Niadra Evolution", SC2HOTS_LOC_ID_OFFSET + 604, LocationType.VANILLA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Enemy Within", "Enemy Within: Warp Drive", SC2HOTS_LOC_ID_OFFSET + 605, LocationType.EXTRA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Enemy Within", "Enemy Within: Stasis Quadrant", SC2HOTS_LOC_ID_OFFSET + 606, LocationType.EXTRA, - lambda state: logic.zerg_pass_vents(state)), - LocationData("Domination", "Domination: Victory", SC2HOTS_LOC_ID_OFFSET + 700, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Domination", "Domination: Center Infested Command Center", SC2HOTS_LOC_ID_OFFSET + 701, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Domination", "Domination: North Infested Command Center", SC2HOTS_LOC_ID_OFFSET + 702, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Domination", "Domination: Repel Zagara", SC2HOTS_LOC_ID_OFFSET + 703, LocationType.EXTRA), - LocationData("Domination", "Domination: Close Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 704, LocationType.EXTRA), - LocationData("Domination", "Domination: South Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 705, LocationType.EXTRA, - lambda state: adv_tactics or logic.zerg_common_unit(state)), - LocationData("Domination", "Domination: Southwest Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 706, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Domination", "Domination: Southeast Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 707, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and logic.zerg_basic_anti_air(state)), - LocationData("Domination", "Domination: North Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 708, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Domination", "Domination: Northeast Baneling Nest", SC2HOTS_LOC_ID_OFFSET + 709, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Fire in the Sky", "Fire in the Sky: Victory", SC2HOTS_LOC_ID_OFFSET + 800, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: West Biomass", SC2HOTS_LOC_ID_OFFSET + 801, LocationType.VANILLA), - LocationData("Fire in the Sky", "Fire in the Sky: North Biomass", SC2HOTS_LOC_ID_OFFSET + 802, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: South Biomass", SC2HOTS_LOC_ID_OFFSET + 803, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: Destroy 3 Gorgons", SC2HOTS_LOC_ID_OFFSET + 804, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: Close Zerg Rescue", SC2HOTS_LOC_ID_OFFSET + 805, LocationType.EXTRA), - LocationData("Fire in the Sky", "Fire in the Sky: South Zerg Rescue", SC2HOTS_LOC_ID_OFFSET + 806, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state)), - LocationData("Fire in the Sky", "Fire in the Sky: North Zerg Rescue", SC2HOTS_LOC_ID_OFFSET + 807, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: West Queen Rescue", SC2HOTS_LOC_ID_OFFSET + 808, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Fire in the Sky", "Fire in the Sky: East Queen Rescue", SC2HOTS_LOC_ID_OFFSET + 809, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Old Soldiers", "Old Soldiers: Victory", SC2HOTS_LOC_ID_OFFSET + 900, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Old Soldiers", "Old Soldiers: East Science Lab", SC2HOTS_LOC_ID_OFFSET + 901, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Old Soldiers", "Old Soldiers: North Science Lab", SC2HOTS_LOC_ID_OFFSET + 902, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Old Soldiers", "Old Soldiers: Get Nuked", SC2HOTS_LOC_ID_OFFSET + 903, LocationType.EXTRA), - LocationData("Old Soldiers", "Old Soldiers: Entrance Gate", SC2HOTS_LOC_ID_OFFSET + 904, LocationType.EXTRA), - LocationData("Old Soldiers", "Old Soldiers: Citadel Gate", SC2HOTS_LOC_ID_OFFSET + 905, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Old Soldiers", "Old Soldiers: South Expansion", SC2HOTS_LOC_ID_OFFSET + 906, LocationType.EXTRA), - LocationData("Old Soldiers", "Old Soldiers: Rich Mineral Expansion", SC2HOTS_LOC_ID_OFFSET + 907, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: Victory", SC2HOTS_LOC_ID_OFFSET + 1000, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: Center Essence Pool", SC2HOTS_LOC_ID_OFFSET + 1001, LocationType.VANILLA), - LocationData("Waking the Ancient", "Waking the Ancient: East Essence Pool", SC2HOTS_LOC_ID_OFFSET + 1002, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - (adv_tactics and logic.zerg_basic_anti_air(state) - or logic.zerg_competent_anti_air(state))), - LocationData("Waking the Ancient", "Waking the Ancient: South Essence Pool", SC2HOTS_LOC_ID_OFFSET + 1003, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - (adv_tactics and logic.zerg_basic_anti_air(state) - or logic.zerg_competent_anti_air(state))), - LocationData("Waking the Ancient", "Waking the Ancient: Finish Feeding", SC2HOTS_LOC_ID_OFFSET + 1004, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: South Proxy Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1005, LocationType.CHALLENGE, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: East Proxy Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1006, LocationType.CHALLENGE, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: South Main Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1007, LocationType.CHALLENGE, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Waking the Ancient", "Waking the Ancient: East Main Primal Hive", SC2HOTS_LOC_ID_OFFSET + 1008, LocationType.CHALLENGE, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: Victory", SC2HOTS_LOC_ID_OFFSET + 1100, LocationType.VICTORY, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: Tyrannozor", SC2HOTS_LOC_ID_OFFSET + 1101, LocationType.VANILLA, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: Reach the Pool", SC2HOTS_LOC_ID_OFFSET + 1102, LocationType.VANILLA), - LocationData("The Crucible", "The Crucible: 15 Minutes Remaining", SC2HOTS_LOC_ID_OFFSET + 1103, LocationType.EXTRA, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: 5 Minutes Remaining", SC2HOTS_LOC_ID_OFFSET + 1104, LocationType.EXTRA, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: Pincer Attack", SC2HOTS_LOC_ID_OFFSET + 1105, LocationType.EXTRA, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Crucible", "The Crucible: Yagdra Claims Brakk's Pack", SC2HOTS_LOC_ID_OFFSET + 1106, LocationType.EXTRA, - lambda state: logic.zerg_competent_defense(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Supreme", "Supreme: Victory", SC2HOTS_LOC_ID_OFFSET + 1200, LocationType.VICTORY, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: First Relic", SC2HOTS_LOC_ID_OFFSET + 1201, LocationType.VANILLA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Second Relic", SC2HOTS_LOC_ID_OFFSET + 1202, LocationType.VANILLA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Third Relic", SC2HOTS_LOC_ID_OFFSET + 1203, LocationType.VANILLA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Fourth Relic", SC2HOTS_LOC_ID_OFFSET + 1204, LocationType.VANILLA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Yagdra", SC2HOTS_LOC_ID_OFFSET + 1205, LocationType.EXTRA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Kraith", SC2HOTS_LOC_ID_OFFSET + 1206, LocationType.EXTRA, - lambda state: logic.supreme_requirement(state)), - LocationData("Supreme", "Supreme: Slivan", SC2HOTS_LOC_ID_OFFSET + 1207, LocationType.EXTRA, - lambda state: logic.supreme_requirement(state)), - LocationData("Infested", "Infested: Victory", SC2HOTS_LOC_ID_OFFSET + 1300, LocationType.VICTORY, - lambda state: logic.zerg_common_unit(state) and - ((logic.zerg_competent_anti_air(state) and state.has(ItemNames.INFESTOR, player)) or - (adv_tactics and logic.zerg_basic_anti_air(state)))), - LocationData("Infested", "Infested: East Science Facility", SC2HOTS_LOC_ID_OFFSET + 1301, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Infested", "Infested: Center Science Facility", SC2HOTS_LOC_ID_OFFSET + 1302, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Infested", "Infested: West Science Facility", SC2HOTS_LOC_ID_OFFSET + 1303, LocationType.VANILLA, - lambda state: logic.zerg_common_unit(state) and - logic.zerg_basic_anti_air(state) and - logic.spread_creep(state)), - LocationData("Infested", "Infested: First Intro Garrison", SC2HOTS_LOC_ID_OFFSET + 1304, LocationType.EXTRA), - LocationData("Infested", "Infested: Second Intro Garrison", SC2HOTS_LOC_ID_OFFSET + 1305, LocationType.EXTRA), - LocationData("Infested", "Infested: Base Garrison", SC2HOTS_LOC_ID_OFFSET + 1306, LocationType.EXTRA), - LocationData("Infested", "Infested: East Garrison", SC2HOTS_LOC_ID_OFFSET + 1307, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state) - and (adv_tactics or state.has(ItemNames.INFESTOR, player))), - LocationData("Infested", "Infested: Mid Garrison", SC2HOTS_LOC_ID_OFFSET + 1308, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state) - and (adv_tactics or state.has(ItemNames.INFESTOR, player))), - LocationData("Infested", "Infested: North Garrison", SC2HOTS_LOC_ID_OFFSET + 1309, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state) - and (adv_tactics or state.has(ItemNames.INFESTOR, player))), - LocationData("Infested", "Infested: Close Southwest Garrison", SC2HOTS_LOC_ID_OFFSET + 1310, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state) - and (adv_tactics or state.has(ItemNames.INFESTOR, player))), - LocationData("Infested", "Infested: Far Southwest Garrison", SC2HOTS_LOC_ID_OFFSET + 1311, LocationType.EXTRA, - lambda state: logic.zerg_common_unit(state) - and logic.zerg_basic_anti_air(state) - and (adv_tactics or state.has(ItemNames.INFESTOR, player))), - LocationData("Hand of Darkness", "Hand of Darkness: Victory", SC2HOTS_LOC_ID_OFFSET + 1400, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: North Brutalisk", SC2HOTS_LOC_ID_OFFSET + 1401, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: South Brutalisk", SC2HOTS_LOC_ID_OFFSET + 1402, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 1 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1403, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 2 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1404, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 3 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1405, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 4 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1406, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 5 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1407, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 6 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1408, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Hand of Darkness", "Hand of Darkness: Kill 7 Hybrid", SC2HOTS_LOC_ID_OFFSET + 1409, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_basic_anti_air(state)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Victory", SC2HOTS_LOC_ID_OFFSET + 1500, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Northwest Crystal", SC2HOTS_LOC_ID_OFFSET + 1501, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Northeast Crystal", SC2HOTS_LOC_ID_OFFSET + 1502, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: South Crystal", SC2HOTS_LOC_ID_OFFSET + 1503, LocationType.VANILLA), - LocationData("Phantoms of the Void", "Phantoms of the Void: Base Established", SC2HOTS_LOC_ID_OFFSET + 1504, LocationType.EXTRA), - LocationData("Phantoms of the Void", "Phantoms of the Void: Close Temple", SC2HOTS_LOC_ID_OFFSET + 1505, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Mid Temple", SC2HOTS_LOC_ID_OFFSET + 1506, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Southeast Temple", SC2HOTS_LOC_ID_OFFSET + 1507, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Northeast Temple", SC2HOTS_LOC_ID_OFFSET + 1508, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("Phantoms of the Void", "Phantoms of the Void: Northwest Temple", SC2HOTS_LOC_ID_OFFSET + 1509, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - (logic.zerg_competent_anti_air(state) or adv_tactics)), - LocationData("With Friends Like These", "With Friends Like These: Victory", SC2HOTS_LOC_ID_OFFSET + 1600, LocationType.VICTORY), - LocationData("With Friends Like These", "With Friends Like These: Pirate Capital Ship", SC2HOTS_LOC_ID_OFFSET + 1601, LocationType.VANILLA), - LocationData("With Friends Like These", "With Friends Like These: First Mineral Patch", SC2HOTS_LOC_ID_OFFSET + 1602, LocationType.VANILLA), - LocationData("With Friends Like These", "With Friends Like These: Second Mineral Patch", SC2HOTS_LOC_ID_OFFSET + 1603, LocationType.VANILLA), - LocationData("With Friends Like These", "With Friends Like These: Third Mineral Patch", SC2HOTS_LOC_ID_OFFSET + 1604, LocationType.VANILLA), - LocationData("Conviction", "Conviction: Victory", SC2HOTS_LOC_ID_OFFSET + 1700, LocationType.VICTORY, - lambda state: logic.two_kerrigan_actives(state) and - (logic.basic_kerrigan(state) or logic.story_tech_granted) or kerriganless), - LocationData("Conviction", "Conviction: First Secret Documents", SC2HOTS_LOC_ID_OFFSET + 1701, LocationType.VANILLA, - lambda state: logic.two_kerrigan_actives(state) or kerriganless), - LocationData("Conviction", "Conviction: Second Secret Documents", SC2HOTS_LOC_ID_OFFSET + 1702, LocationType.VANILLA, - lambda state: logic.two_kerrigan_actives(state) and - (logic.basic_kerrigan(state) or logic.story_tech_granted) or kerriganless), - LocationData("Conviction", "Conviction: Power Coupling", SC2HOTS_LOC_ID_OFFSET + 1703, LocationType.EXTRA, - lambda state: logic.two_kerrigan_actives(state) or kerriganless), - LocationData("Conviction", "Conviction: Door Blasted", SC2HOTS_LOC_ID_OFFSET + 1704, LocationType.EXTRA, - lambda state: logic.two_kerrigan_actives(state) or kerriganless), - LocationData("Planetfall", "Planetfall: Victory", SC2HOTS_LOC_ID_OFFSET + 1800, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: East Gate", SC2HOTS_LOC_ID_OFFSET + 1801, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: Northwest Gate", SC2HOTS_LOC_ID_OFFSET + 1802, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: North Gate", SC2HOTS_LOC_ID_OFFSET + 1803, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: 1 Bile Launcher Deployed", SC2HOTS_LOC_ID_OFFSET + 1804, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: 2 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1805, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: 3 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1806, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: 4 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1807, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: 5 Bile Launchers Deployed", SC2HOTS_LOC_ID_OFFSET + 1808, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: Sons of Korhal", SC2HOTS_LOC_ID_OFFSET + 1809, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: Night Wolves", SC2HOTS_LOC_ID_OFFSET + 1810, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: West Expansion", SC2HOTS_LOC_ID_OFFSET + 1811, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Planetfall", "Planetfall: Mid Expansion", SC2HOTS_LOC_ID_OFFSET + 1812, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Death From Above", "Death From Above: Victory", SC2HOTS_LOC_ID_OFFSET + 1900, LocationType.VICTORY, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Death From Above", "Death From Above: First Power Link", SC2HOTS_LOC_ID_OFFSET + 1901, LocationType.VANILLA), - LocationData("Death From Above", "Death From Above: Second Power Link", SC2HOTS_LOC_ID_OFFSET + 1902, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Death From Above", "Death From Above: Third Power Link", SC2HOTS_LOC_ID_OFFSET + 1903, LocationType.VANILLA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Death From Above", "Death From Above: Expansion Command Center", SC2HOTS_LOC_ID_OFFSET + 1904, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("Death From Above", "Death From Above: Main Path Command Center", SC2HOTS_LOC_ID_OFFSET + 1905, LocationType.EXTRA, - lambda state: logic.zerg_competent_comp(state) and - logic.zerg_competent_anti_air(state)), - LocationData("The Reckoning", "The Reckoning: Victory", SC2HOTS_LOC_ID_OFFSET + 2000, LocationType.VICTORY, - lambda state: logic.the_reckoning_requirement(state)), - LocationData("The Reckoning", "The Reckoning: South Lane", SC2HOTS_LOC_ID_OFFSET + 2001, LocationType.VANILLA, - lambda state: logic.the_reckoning_requirement(state)), - LocationData("The Reckoning", "The Reckoning: North Lane", SC2HOTS_LOC_ID_OFFSET + 2002, LocationType.VANILLA, - lambda state: logic.the_reckoning_requirement(state)), - LocationData("The Reckoning", "The Reckoning: East Lane", SC2HOTS_LOC_ID_OFFSET + 2003, LocationType.VANILLA, - lambda state: logic.the_reckoning_requirement(state)), - LocationData("The Reckoning", "The Reckoning: Odin", SC2HOTS_LOC_ID_OFFSET + 2004, LocationType.EXTRA, - lambda state: logic.the_reckoning_requirement(state)), - - # LotV Prologue - LocationData("Dark Whispers", "Dark Whispers: Victory", SC2LOTV_LOC_ID_OFFSET + 100, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_basic_anti_air(state)), - LocationData("Dark Whispers", "Dark Whispers: First Prisoner Group", SC2LOTV_LOC_ID_OFFSET + 101, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_basic_anti_air(state)), - LocationData("Dark Whispers", "Dark Whispers: Second Prisoner Group", SC2LOTV_LOC_ID_OFFSET + 102, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_basic_anti_air(state)), - LocationData("Dark Whispers", "Dark Whispers: First Pylon", SC2LOTV_LOC_ID_OFFSET + 103, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_basic_anti_air(state)), - LocationData("Dark Whispers", "Dark Whispers: Second Pylon", SC2LOTV_LOC_ID_OFFSET + 104, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_basic_anti_air(state)), - LocationData("Ghosts in the Fog", "Ghosts in the Fog: Victory", SC2LOTV_LOC_ID_OFFSET + 200, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Ghosts in the Fog", "Ghosts in the Fog: South Rock Formation", SC2LOTV_LOC_ID_OFFSET + 201, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Ghosts in the Fog", "Ghosts in the Fog: West Rock Formation", SC2LOTV_LOC_ID_OFFSET + 202, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Ghosts in the Fog", "Ghosts in the Fog: East Rock Formation", SC2LOTV_LOC_ID_OFFSET + 203, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) \ - and logic.protoss_anti_armor_anti_air(state) \ - and logic.protoss_can_attack_behind_chasm(state)), - LocationData("Evil Awoken", "Evil Awoken: Victory", SC2LOTV_LOC_ID_OFFSET + 300, LocationType.VICTORY, - lambda state: adv_tactics or logic.protoss_stalker_upgrade(state)), - LocationData("Evil Awoken", "Evil Awoken: Temple Investigated", SC2LOTV_LOC_ID_OFFSET + 301, LocationType.EXTRA), - LocationData("Evil Awoken", "Evil Awoken: Void Catalyst", SC2LOTV_LOC_ID_OFFSET + 302, LocationType.EXTRA), - LocationData("Evil Awoken", "Evil Awoken: First Particle Cannon", SC2LOTV_LOC_ID_OFFSET + 303, LocationType.VANILLA), - LocationData("Evil Awoken", "Evil Awoken: Second Particle Cannon", SC2LOTV_LOC_ID_OFFSET + 304, LocationType.VANILLA), - LocationData("Evil Awoken", "Evil Awoken: Third Particle Cannon", SC2LOTV_LOC_ID_OFFSET + 305, LocationType.VANILLA), - - - # LotV - LocationData("For Aiur!", "For Aiur!: Victory", SC2LOTV_LOC_ID_OFFSET + 400, LocationType.VICTORY), - LocationData("For Aiur!", "For Aiur!: Southwest Hive", SC2LOTV_LOC_ID_OFFSET + 401, LocationType.VANILLA), - LocationData("For Aiur!", "For Aiur!: Northwest Hive", SC2LOTV_LOC_ID_OFFSET + 402, LocationType.VANILLA), - LocationData("For Aiur!", "For Aiur!: Northeast Hive", SC2LOTV_LOC_ID_OFFSET + 403, LocationType.VANILLA), - LocationData("For Aiur!", "For Aiur!: East Hive", SC2LOTV_LOC_ID_OFFSET + 404, LocationType.VANILLA), - LocationData("For Aiur!", "For Aiur!: West Conduit", SC2LOTV_LOC_ID_OFFSET + 405, LocationType.EXTRA), - LocationData("For Aiur!", "For Aiur!: Middle Conduit", SC2LOTV_LOC_ID_OFFSET + 406, LocationType.EXTRA), - LocationData("For Aiur!", "For Aiur!: Northeast Conduit", SC2LOTV_LOC_ID_OFFSET + 407, LocationType.EXTRA), - LocationData("The Growing Shadow", "The Growing Shadow: Victory", SC2LOTV_LOC_ID_OFFSET + 500, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("The Growing Shadow", "The Growing Shadow: Close Pylon", SC2LOTV_LOC_ID_OFFSET + 501, LocationType.VANILLA), - LocationData("The Growing Shadow", "The Growing Shadow: East Pylon", SC2LOTV_LOC_ID_OFFSET + 502, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("The Growing Shadow", "The Growing Shadow: West Pylon", SC2LOTV_LOC_ID_OFFSET + 503, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("The Growing Shadow", "The Growing Shadow: Nexus", SC2LOTV_LOC_ID_OFFSET + 504, LocationType.EXTRA), - LocationData("The Growing Shadow", "The Growing Shadow: Templar Base", SC2LOTV_LOC_ID_OFFSET + 505, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: Victory", SC2LOTV_LOC_ID_OFFSET + 600, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: Close Warp Gate", SC2LOTV_LOC_ID_OFFSET + 601, LocationType.VANILLA), - LocationData("The Spear of Adun", "The Spear of Adun: West Warp Gate", SC2LOTV_LOC_ID_OFFSET + 602, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: North Warp Gate", SC2LOTV_LOC_ID_OFFSET + 603, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: North Power Cell", SC2LOTV_LOC_ID_OFFSET + 604, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: East Power Cell", SC2LOTV_LOC_ID_OFFSET + 605, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: South Power Cell", SC2LOTV_LOC_ID_OFFSET + 606, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("The Spear of Adun", "The Spear of Adun: Southeast Power Cell", SC2LOTV_LOC_ID_OFFSET + 607, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Victory", SC2LOTV_LOC_ID_OFFSET + 700, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Mid EMP Scrambler", SC2LOTV_LOC_ID_OFFSET + 701, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Southeast EMP Scrambler", SC2LOTV_LOC_ID_OFFSET + 702, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: North EMP Scrambler", SC2LOTV_LOC_ID_OFFSET + 703, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Mid Stabilizer", SC2LOTV_LOC_ID_OFFSET + 704, LocationType.EXTRA), - LocationData("Sky Shield", "Sky Shield: Southwest Stabilizer", SC2LOTV_LOC_ID_OFFSET + 705, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Northwest Stabilizer", SC2LOTV_LOC_ID_OFFSET + 706, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Northeast Stabilizer", SC2LOTV_LOC_ID_OFFSET + 707, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: Southeast Stabilizer", SC2LOTV_LOC_ID_OFFSET + 708, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: West Raynor Base", SC2LOTV_LOC_ID_OFFSET + 709, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Sky Shield", "Sky Shield: East Raynor Base", SC2LOTV_LOC_ID_OFFSET + 710, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_basic_anti_air(state)), - LocationData("Brothers in Arms", "Brothers in Arms: Victory", SC2LOTV_LOC_ID_OFFSET + 800, LocationType.VICTORY, - lambda state: logic.brothers_in_arms_requirement(state)), - LocationData("Brothers in Arms", "Brothers in Arms: Mid Science Facility", SC2LOTV_LOC_ID_OFFSET + 801, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) or logic.take_over_ai_allies), - LocationData("Brothers in Arms", "Brothers in Arms: North Science Facility", SC2LOTV_LOC_ID_OFFSET + 802, LocationType.VANILLA, - lambda state: logic.brothers_in_arms_requirement(state) - or logic.take_over_ai_allies - and logic.advanced_tactics - and ( - logic.terran_common_unit(state) - or logic.protoss_common_unit(state) - ) - ), - LocationData("Brothers in Arms", "Brothers in Arms: South Science Facility", SC2LOTV_LOC_ID_OFFSET + 803, LocationType.VANILLA, - lambda state: logic.brothers_in_arms_requirement(state)), - LocationData("Amon's Reach", "Amon's Reach: Victory", SC2LOTV_LOC_ID_OFFSET + 900, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: Close Solarite Reserve", SC2LOTV_LOC_ID_OFFSET + 901, LocationType.VANILLA), - LocationData("Amon's Reach", "Amon's Reach: North Solarite Reserve", SC2LOTV_LOC_ID_OFFSET + 902, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: East Solarite Reserve", SC2LOTV_LOC_ID_OFFSET + 903, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: West Launch Bay", SC2LOTV_LOC_ID_OFFSET + 904, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: South Launch Bay", SC2LOTV_LOC_ID_OFFSET + 905, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: Northwest Launch Bay", SC2LOTV_LOC_ID_OFFSET + 906, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Amon's Reach", "Amon's Reach: East Launch Bay", SC2LOTV_LOC_ID_OFFSET + 907, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Last Stand", "Last Stand: Victory", SC2LOTV_LOC_ID_OFFSET + 1000, LocationType.VICTORY, - lambda state: logic.last_stand_requirement(state)), - LocationData("Last Stand", "Last Stand: West Zenith Stone", SC2LOTV_LOC_ID_OFFSET + 1001, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state)), - LocationData("Last Stand", "Last Stand: North Zenith Stone", SC2LOTV_LOC_ID_OFFSET + 1002, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state)), - LocationData("Last Stand", "Last Stand: East Zenith Stone", SC2LOTV_LOC_ID_OFFSET + 1003, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state)), - LocationData("Last Stand", "Last Stand: 1 Billion Zerg", SC2LOTV_LOC_ID_OFFSET + 1004, LocationType.EXTRA, - lambda state: logic.last_stand_requirement(state)), - LocationData("Last Stand", "Last Stand: 1.5 Billion Zerg", SC2LOTV_LOC_ID_OFFSET + 1005, LocationType.VANILLA, - lambda state: logic.last_stand_requirement(state) and ( - state.has_all({ItemNames.KHAYDARIN_MONOLITH, ItemNames.PHOTON_CANNON, ItemNames.SHIELD_BATTERY}, player) - or state.has_any({ItemNames.SOA_SOLAR_LANCE, ItemNames.SOA_DEPLOY_FENIX}, player) - )), - LocationData("Forbidden Weapon", "Forbidden Weapon: Victory", SC2LOTV_LOC_ID_OFFSET + 1100, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Forbidden Weapon", "Forbidden Weapon: South Solarite", SC2LOTV_LOC_ID_OFFSET + 1101, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Forbidden Weapon", "Forbidden Weapon: North Solarite", SC2LOTV_LOC_ID_OFFSET + 1102, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Forbidden Weapon", "Forbidden Weapon: Northwest Solarite", SC2LOTV_LOC_ID_OFFSET + 1103, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: Victory", SC2LOTV_LOC_ID_OFFSET + 1200, LocationType.VICTORY, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: Mid Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1201, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: West Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1202, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: South Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1203, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: East Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1204, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: North Celestial Lock", SC2LOTV_LOC_ID_OFFSET + 1205, LocationType.EXTRA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("Temple of Unification", "Temple of Unification: Titanic Warp Prism", SC2LOTV_LOC_ID_OFFSET + 1206, LocationType.VANILLA, - lambda state: logic.protoss_common_unit(state) - and logic.protoss_anti_armor_anti_air(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: Victory", SC2LOTV_LOC_ID_OFFSET + 1300, LocationType.VICTORY, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: First Hall of Revelation", SC2LOTV_LOC_ID_OFFSET + 1301, LocationType.EXTRA, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: Second Hall of Revelation", SC2LOTV_LOC_ID_OFFSET + 1302, LocationType.EXTRA, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: First Xel'Naga Device", SC2LOTV_LOC_ID_OFFSET + 1303, LocationType.VANILLA, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: Second Xel'Naga Device", SC2LOTV_LOC_ID_OFFSET + 1304, LocationType.VANILLA, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("The Infinite Cycle", "The Infinite Cycle: Third Xel'Naga Device", SC2LOTV_LOC_ID_OFFSET + 1305, LocationType.VANILLA, - lambda state: logic.the_infinite_cycle_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Victory", SC2LOTV_LOC_ID_OFFSET + 1400, LocationType.VICTORY, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Artanis", SC2LOTV_LOC_ID_OFFSET + 1401, LocationType.EXTRA), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Northwest Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1402, LocationType.EXTRA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Northeast Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1403, LocationType.EXTRA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Southwest Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1404, LocationType.EXTRA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Southeast Void Crystal", SC2LOTV_LOC_ID_OFFSET + 1405, LocationType.EXTRA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: South Xel'Naga Vessel", SC2LOTV_LOC_ID_OFFSET + 1406, LocationType.VANILLA), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: Mid Xel'Naga Vessel", SC2LOTV_LOC_ID_OFFSET + 1407, LocationType.VANILLA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Harbinger of Oblivion", "Harbinger of Oblivion: North Xel'Naga Vessel", SC2LOTV_LOC_ID_OFFSET + 1408, LocationType.VANILLA, - lambda state: logic.harbinger_of_oblivion_requirement(state)), - LocationData("Unsealing the Past", "Unsealing the Past: Victory", SC2LOTV_LOC_ID_OFFSET + 1500, LocationType.VICTORY, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: Zerg Cleared", SC2LOTV_LOC_ID_OFFSET + 1501, LocationType.EXTRA), - LocationData("Unsealing the Past", "Unsealing the Past: First Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1502, LocationType.EXTRA, - lambda state: logic.advanced_tactics \ - or logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: Second Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1503, LocationType.EXTRA, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: Third Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1504, LocationType.EXTRA, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: Fourth Stasis Lock", SC2LOTV_LOC_ID_OFFSET + 1505, LocationType.EXTRA, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: South Power Core", SC2LOTV_LOC_ID_OFFSET + 1506, LocationType.VANILLA, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Unsealing the Past", "Unsealing the Past: East Power Core", SC2LOTV_LOC_ID_OFFSET + 1507, LocationType.VANILLA, - lambda state: logic.protoss_basic_splash(state) - and logic.protoss_anti_light_anti_air(state)), - LocationData("Purification", "Purification: Victory", SC2LOTV_LOC_ID_OFFSET + 1600, LocationType.VICTORY, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: North Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1601, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: North Sector: Northeast Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1602, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: North Sector: Southeast Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1603, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: South Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1604, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: South Sector: North Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1605, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: South Sector: East Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1606, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: West Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1607, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: West Sector: Mid Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1608, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: West Sector: East Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1609, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: East Sector: North Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1610, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: East Sector: West Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1611, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: East Sector: South Null Circuit", SC2LOTV_LOC_ID_OFFSET + 1612, LocationType.EXTRA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Purification", "Purification: Purifier Warden", SC2LOTV_LOC_ID_OFFSET + 1613, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Steps of the Rite", "Steps of the Rite: Victory", SC2LOTV_LOC_ID_OFFSET + 1700, LocationType.VICTORY, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: First Terrazine Fog", SC2LOTV_LOC_ID_OFFSET + 1701, LocationType.EXTRA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: Southwest Guardian", SC2LOTV_LOC_ID_OFFSET + 1702, LocationType.EXTRA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: West Guardian", SC2LOTV_LOC_ID_OFFSET + 1703, LocationType.EXTRA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: Northwest Guardian", SC2LOTV_LOC_ID_OFFSET + 1704, LocationType.EXTRA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: Northeast Guardian", SC2LOTV_LOC_ID_OFFSET + 1705, LocationType.EXTRA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: North Mothership", SC2LOTV_LOC_ID_OFFSET + 1706, LocationType.VANILLA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Steps of the Rite", "Steps of the Rite: South Mothership", SC2LOTV_LOC_ID_OFFSET + 1707, LocationType.VANILLA, - lambda state: logic.steps_of_the_rite_requirement(state)), - LocationData("Rak'Shir", "Rak'Shir: Victory", SC2LOTV_LOC_ID_OFFSET + 1800, LocationType.VICTORY, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Rak'Shir", "Rak'Shir: North Slayn Elemental", SC2LOTV_LOC_ID_OFFSET + 1801, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Rak'Shir", "Rak'Shir: Southwest Slayn Elemental", SC2LOTV_LOC_ID_OFFSET + 1802, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Rak'Shir", "Rak'Shir: East Slayn Elemental", SC2LOTV_LOC_ID_OFFSET + 1803, LocationType.VANILLA, - lambda state: logic.protoss_competent_comp(state)), - LocationData("Templar's Charge", "Templar's Charge: Victory", SC2LOTV_LOC_ID_OFFSET + 1900, LocationType.VICTORY, - lambda state: logic.templars_charge_requirement(state)), - LocationData("Templar's Charge", "Templar's Charge: Northwest Power Core", SC2LOTV_LOC_ID_OFFSET + 1901, LocationType.EXTRA, - lambda state: logic.templars_charge_requirement(state)), - LocationData("Templar's Charge", "Templar's Charge: Northeast Power Core", SC2LOTV_LOC_ID_OFFSET + 1902, LocationType.EXTRA, - lambda state: logic.templars_charge_requirement(state)), - LocationData("Templar's Charge", "Templar's Charge: Southeast Power Core", SC2LOTV_LOC_ID_OFFSET + 1903, LocationType.EXTRA, - lambda state: logic.templars_charge_requirement(state)), - LocationData("Templar's Charge", "Templar's Charge: West Hybrid Stasis Chamber", SC2LOTV_LOC_ID_OFFSET + 1904, LocationType.VANILLA, - lambda state: logic.templars_charge_requirement(state)), - LocationData("Templar's Charge", "Templar's Charge: Southeast Hybrid Stasis Chamber", SC2LOTV_LOC_ID_OFFSET + 1905, LocationType.VANILLA, - lambda state: logic.protoss_fleet(state)), - LocationData("Templar's Return", "Templar's Return: Victory", SC2LOTV_LOC_ID_OFFSET + 2000, LocationType.VICTORY, - lambda state: logic.templars_return_requirement(state)), - LocationData("Templar's Return", "Templar's Return: Citadel: First Gate", SC2LOTV_LOC_ID_OFFSET + 2001, LocationType.EXTRA), - LocationData("Templar's Return", "Templar's Return: Citadel: Second Gate", SC2LOTV_LOC_ID_OFFSET + 2002, LocationType.EXTRA), - LocationData("Templar's Return", "Templar's Return: Citadel: Power Structure", SC2LOTV_LOC_ID_OFFSET + 2003, LocationType.VANILLA), - LocationData("Templar's Return", "Templar's Return: Temple Grounds: Gather Army", SC2LOTV_LOC_ID_OFFSET + 2004, LocationType.VANILLA, - lambda state: logic.templars_return_requirement(state)), - LocationData("Templar's Return", "Templar's Return: Temple Grounds: Power Structure", SC2LOTV_LOC_ID_OFFSET + 2005, LocationType.VANILLA, - lambda state: logic.templars_return_requirement(state)), - LocationData("Templar's Return", "Templar's Return: Caverns: Purifier", SC2LOTV_LOC_ID_OFFSET + 2006, LocationType.EXTRA, - lambda state: logic.templars_return_requirement(state)), - LocationData("Templar's Return", "Templar's Return: Caverns: Dark Templar", SC2LOTV_LOC_ID_OFFSET + 2007, LocationType.EXTRA, - lambda state: logic.templars_return_requirement(state)), - LocationData("The Host", "The Host: Victory", SC2LOTV_LOC_ID_OFFSET + 2100, LocationType.VICTORY, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Southeast Void Shard", SC2LOTV_LOC_ID_OFFSET + 2101, LocationType.EXTRA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: South Void Shard", SC2LOTV_LOC_ID_OFFSET + 2102, LocationType.EXTRA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Southwest Void Shard", SC2LOTV_LOC_ID_OFFSET + 2103, LocationType.EXTRA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: North Void Shard", SC2LOTV_LOC_ID_OFFSET + 2104, LocationType.EXTRA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Northwest Void Shard", SC2LOTV_LOC_ID_OFFSET + 2105, LocationType.EXTRA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Nerazim Warp in Zone", SC2LOTV_LOC_ID_OFFSET + 2106, LocationType.VANILLA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Tal'darim Warp in Zone", SC2LOTV_LOC_ID_OFFSET + 2107, LocationType.VANILLA, - lambda state: logic.the_host_requirement(state)), - LocationData("The Host", "The Host: Purifier Warp in Zone", SC2LOTV_LOC_ID_OFFSET + 2108, LocationType.VANILLA, - lambda state: logic.the_host_requirement(state)), - LocationData("Salvation", "Salvation: Victory", SC2LOTV_LOC_ID_OFFSET + 2200, LocationType.VICTORY, - lambda state: logic.salvation_requirement(state)), - LocationData("Salvation", "Salvation: Fabrication Matrix", SC2LOTV_LOC_ID_OFFSET + 2201, LocationType.EXTRA, - lambda state: logic.salvation_requirement(state)), - LocationData("Salvation", "Salvation: Assault Cluster", SC2LOTV_LOC_ID_OFFSET + 2202, LocationType.EXTRA, - lambda state: logic.salvation_requirement(state)), - LocationData("Salvation", "Salvation: Hull Breach", SC2LOTV_LOC_ID_OFFSET + 2203, LocationType.EXTRA, - lambda state: logic.salvation_requirement(state)), - LocationData("Salvation", "Salvation: Core Critical", SC2LOTV_LOC_ID_OFFSET + 2204, LocationType.EXTRA, - lambda state: logic.salvation_requirement(state)), - - # Epilogue - LocationData("Into the Void", "Into the Void: Victory", SC2LOTV_LOC_ID_OFFSET + 2300, LocationType.VICTORY, - lambda state: logic.into_the_void_requirement(state)), - LocationData("Into the Void", "Into the Void: Corruption Source", SC2LOTV_LOC_ID_OFFSET + 2301, LocationType.EXTRA), - LocationData("Into the Void", "Into the Void: Southwest Forward Position", SC2LOTV_LOC_ID_OFFSET + 2302, LocationType.VANILLA, - lambda state: logic.into_the_void_requirement(state)), - LocationData("Into the Void", "Into the Void: Northwest Forward Position", SC2LOTV_LOC_ID_OFFSET + 2303, LocationType.VANILLA, - lambda state: logic.into_the_void_requirement(state)), - LocationData("Into the Void", "Into the Void: Southeast Forward Position", SC2LOTV_LOC_ID_OFFSET + 2304, LocationType.VANILLA, - lambda state: logic.into_the_void_requirement(state)), - LocationData("Into the Void", "Into the Void: Northeast Forward Position", SC2LOTV_LOC_ID_OFFSET + 2305, LocationType.VANILLA), - LocationData("The Essence of Eternity", "The Essence of Eternity: Victory", SC2LOTV_LOC_ID_OFFSET + 2400, LocationType.VICTORY, - lambda state: logic.essence_of_eternity_requirement(state)), - LocationData("The Essence of Eternity", "The Essence of Eternity: Void Trashers", SC2LOTV_LOC_ID_OFFSET + 2401, LocationType.EXTRA), - LocationData("Amon's Fall", "Amon's Fall: Victory", SC2LOTV_LOC_ID_OFFSET + 2500, LocationType.VICTORY, - lambda state: logic.amons_fall_requirement(state)), - - # Nova Covert Ops - LocationData("The Escape", "The Escape: Victory", SC2NCO_LOC_ID_OFFSET + 100, LocationType.VICTORY, - lambda state: logic.the_escape_requirement(state)), - LocationData("The Escape", "The Escape: Rifle", SC2NCO_LOC_ID_OFFSET + 101, LocationType.VANILLA, - lambda state: logic.the_escape_first_stage_requirement(state)), - LocationData("The Escape", "The Escape: Grenades", SC2NCO_LOC_ID_OFFSET + 102, LocationType.VANILLA, - lambda state: logic.the_escape_first_stage_requirement(state)), - LocationData("The Escape", "The Escape: Agent Delta", SC2NCO_LOC_ID_OFFSET + 103, LocationType.VANILLA, - lambda state: logic.the_escape_requirement(state)), - LocationData("The Escape", "The Escape: Agent Pierce", SC2NCO_LOC_ID_OFFSET + 104, LocationType.VANILLA, - lambda state: logic.the_escape_requirement(state)), - LocationData("The Escape", "The Escape: Agent Stone", SC2NCO_LOC_ID_OFFSET + 105, LocationType.VANILLA, - lambda state: logic.the_escape_requirement(state)), - LocationData("Sudden Strike", "Sudden Strike: Victory", SC2NCO_LOC_ID_OFFSET + 200, LocationType.VICTORY, - lambda state: logic.sudden_strike_requirement(state)), - LocationData("Sudden Strike", "Sudden Strike: Research Center", SC2NCO_LOC_ID_OFFSET + 201, LocationType.VANILLA, - lambda state: logic.sudden_strike_can_reach_objectives(state)), - LocationData("Sudden Strike", "Sudden Strike: Weaponry Labs", SC2NCO_LOC_ID_OFFSET + 202, LocationType.VANILLA, - lambda state: logic.sudden_strike_can_reach_objectives(state)), - LocationData("Sudden Strike", "Sudden Strike: Brutalisk", SC2NCO_LOC_ID_OFFSET + 203, LocationType.EXTRA, - lambda state: logic.sudden_strike_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Victory", SC2NCO_LOC_ID_OFFSET + 300, LocationType.VICTORY, - lambda state: logic.enemy_intelligence_third_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: West Garrison", SC2NCO_LOC_ID_OFFSET + 301, LocationType.EXTRA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Close Garrison", SC2NCO_LOC_ID_OFFSET + 302, LocationType.EXTRA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Northeast Garrison", SC2NCO_LOC_ID_OFFSET + 303, LocationType.EXTRA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Southeast Garrison", SC2NCO_LOC_ID_OFFSET + 304, LocationType.EXTRA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state) - and logic.enemy_intelligence_cliff_garrison(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: South Garrison", SC2NCO_LOC_ID_OFFSET + 305, LocationType.EXTRA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: All Garrisons", SC2NCO_LOC_ID_OFFSET + 306, LocationType.VANILLA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state) - and logic.enemy_intelligence_cliff_garrison(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Forces Rescued", SC2NCO_LOC_ID_OFFSET + 307, LocationType.VANILLA, - lambda state: logic.enemy_intelligence_first_stage_requirement(state)), - LocationData("Enemy Intelligence", "Enemy Intelligence: Communications Hub", SC2NCO_LOC_ID_OFFSET + 308, LocationType.VANILLA, - lambda state: logic.enemy_intelligence_second_stage_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: Victory", SC2NCO_LOC_ID_OFFSET + 400, LocationType.VICTORY, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: North Base: West Hatchery", SC2NCO_LOC_ID_OFFSET + 401, LocationType.VANILLA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: North Base: North Hatchery", SC2NCO_LOC_ID_OFFSET + 402, LocationType.VANILLA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: North Base: East Hatchery", SC2NCO_LOC_ID_OFFSET + 403, LocationType.VANILLA), - LocationData("Trouble In Paradise", "Trouble In Paradise: South Base: Northwest Hatchery", SC2NCO_LOC_ID_OFFSET + 404, LocationType.VANILLA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: South Base: Southwest Hatchery", SC2NCO_LOC_ID_OFFSET + 405, LocationType.VANILLA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: South Base: East Hatchery", SC2NCO_LOC_ID_OFFSET + 406, LocationType.VANILLA), - LocationData("Trouble In Paradise", "Trouble In Paradise: North Shield Projector", SC2NCO_LOC_ID_OFFSET + 407, LocationType.EXTRA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: East Shield Projector", SC2NCO_LOC_ID_OFFSET + 408, LocationType.EXTRA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: South Shield Projector", SC2NCO_LOC_ID_OFFSET + 409, LocationType.EXTRA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: West Shield Projector", SC2NCO_LOC_ID_OFFSET + 410, LocationType.EXTRA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Trouble In Paradise", "Trouble In Paradise: Fleet Beacon", SC2NCO_LOC_ID_OFFSET + 411, LocationType.VANILLA, - lambda state: logic.trouble_in_paradise_requirement(state)), - LocationData("Night Terrors", "Night Terrors: Victory", SC2NCO_LOC_ID_OFFSET + 500, LocationType.VICTORY, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: 1 Terrazine Node Collected", SC2NCO_LOC_ID_OFFSET + 501, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: 2 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 502, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: 3 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 503, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: 4 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 504, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: 5 Terrazine Nodes Collected", SC2NCO_LOC_ID_OFFSET + 505, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: HERC Outpost", SC2NCO_LOC_ID_OFFSET + 506, LocationType.VANILLA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: Umojan Mine", SC2NCO_LOC_ID_OFFSET + 507, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: Blightbringer", SC2NCO_LOC_ID_OFFSET + 508, LocationType.VANILLA, - lambda state: logic.night_terrors_requirement(state) - and logic.nova_ranged_weapon(state) - and state.has_any( - {ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_PULSE_GRENADES, ItemNames.NOVA_STIM_INFUSION, - ItemNames.NOVA_HOLO_DECOY}, player)), - LocationData("Night Terrors", "Night Terrors: Science Facility", SC2NCO_LOC_ID_OFFSET + 509, LocationType.EXTRA, - lambda state: logic.night_terrors_requirement(state)), - LocationData("Night Terrors", "Night Terrors: Eradicators", SC2NCO_LOC_ID_OFFSET + 510, LocationType.VANILLA, - lambda state: logic.night_terrors_requirement(state) - and logic.nova_any_weapon(state)), - LocationData("Flashpoint", "Flashpoint: Victory", SC2NCO_LOC_ID_OFFSET + 600, LocationType.VICTORY, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Close North Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 601, LocationType.EXTRA, - lambda state: state.has_any( - {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player) - or logic.terran_common_unit(state)), - LocationData("Flashpoint", "Flashpoint: Close East Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 602, LocationType.EXTRA, - lambda state: state.has_any( - {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player) - or logic.terran_common_unit(state)), - LocationData("Flashpoint", "Flashpoint: Far North Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 603, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Far East Evidence Coordinates", SC2NCO_LOC_ID_OFFSET + 604, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Experimental Weapon", SC2NCO_LOC_ID_OFFSET + 605, LocationType.VANILLA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Northwest Subway Entrance", SC2NCO_LOC_ID_OFFSET + 606, LocationType.VANILLA, - lambda state: state.has_any( - {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player) - and logic.terran_common_unit(state) - or logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Southeast Subway Entrance", SC2NCO_LOC_ID_OFFSET + 607, LocationType.VANILLA, - lambda state: state.has_any( - {ItemNames.LIBERATOR_RAID_ARTILLERY, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, player) - and logic.terran_common_unit(state) - or logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Northeast Subway Entrance", SC2NCO_LOC_ID_OFFSET + 608, LocationType.VANILLA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Expansion Hatchery", SC2NCO_LOC_ID_OFFSET + 609, LocationType.EXTRA, - lambda state: state.has(ItemNames.LIBERATOR_RAID_ARTILLERY, player) and logic.terran_common_unit(state) - or logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Baneling Spawns", SC2NCO_LOC_ID_OFFSET + 610, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Mutalisk Spawns", SC2NCO_LOC_ID_OFFSET + 611, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Nydus Worm Spawns", SC2NCO_LOC_ID_OFFSET + 612, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Lurker Spawns", SC2NCO_LOC_ID_OFFSET + 613, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Brood Lord Spawns", SC2NCO_LOC_ID_OFFSET + 614, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("Flashpoint", "Flashpoint: Ultralisk Spawns", SC2NCO_LOC_ID_OFFSET + 615, LocationType.EXTRA, - lambda state: logic.flashpoint_far_requirement(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Victory", SC2NCO_LOC_ID_OFFSET + 700, LocationType.VICTORY, - lambda state: logic.enemy_shadow_victory(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Sewers: Domination Visor", SC2NCO_LOC_ID_OFFSET + 701, LocationType.VANILLA, - lambda state: logic.enemy_shadow_domination(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Sewers: Resupply Crate", SC2NCO_LOC_ID_OFFSET + 702, LocationType.EXTRA, - lambda state: logic.enemy_shadow_first_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Sewers: Facility Access", SC2NCO_LOC_ID_OFFSET + 703, LocationType.VANILLA, - lambda state: logic.enemy_shadow_first_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Northwest Door Lock", SC2NCO_LOC_ID_OFFSET + 704, LocationType.VANILLA, - lambda state: logic.enemy_shadow_door_controls(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Southeast Door Lock", SC2NCO_LOC_ID_OFFSET + 705, LocationType.VANILLA, - lambda state: logic.enemy_shadow_door_controls(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Blazefire Gunblade", SC2NCO_LOC_ID_OFFSET + 706, LocationType.VANILLA, - lambda state: logic.enemy_shadow_second_stage(state) - and (story_tech_granted - or state.has(ItemNames.NOVA_BLINK, player) - or (adv_tactics and state.has_all({ItemNames.NOVA_DOMINATION, ItemNames.NOVA_HOLO_DECOY, ItemNames.NOVA_JUMP_SUIT_MODULE}, player)) - ) - ), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Blink Suit", SC2NCO_LOC_ID_OFFSET + 707, LocationType.VANILLA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Advanced Weaponry", SC2NCO_LOC_ID_OFFSET + 708, LocationType.VANILLA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: Entrance Resupply Crate", SC2NCO_LOC_ID_OFFSET + 709, LocationType.EXTRA, - lambda state: logic.enemy_shadow_first_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: West Resupply Crate", SC2NCO_LOC_ID_OFFSET + 710, LocationType.EXTRA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: North Resupply Crate", SC2NCO_LOC_ID_OFFSET + 711, LocationType.EXTRA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: East Resupply Crate", SC2NCO_LOC_ID_OFFSET + 712, LocationType.EXTRA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("In the Enemy's Shadow", "In the Enemy's Shadow: Facility: South Resupply Crate", SC2NCO_LOC_ID_OFFSET + 713, LocationType.EXTRA, - lambda state: logic.enemy_shadow_second_stage(state)), - LocationData("Dark Skies", "Dark Skies: Victory", SC2NCO_LOC_ID_OFFSET + 800, LocationType.VICTORY, - lambda state: logic.dark_skies_requirement(state)), - LocationData("Dark Skies", "Dark Skies: First Squadron of Dominion Fleet", SC2NCO_LOC_ID_OFFSET + 801, LocationType.EXTRA, - lambda state: logic.dark_skies_requirement(state)), - LocationData("Dark Skies", "Dark Skies: Remainder of Dominion Fleet", SC2NCO_LOC_ID_OFFSET + 802, LocationType.EXTRA, - lambda state: logic.dark_skies_requirement(state)), - LocationData("Dark Skies", "Dark Skies: Ji'nara", SC2NCO_LOC_ID_OFFSET + 803, LocationType.EXTRA, - lambda state: logic.dark_skies_requirement(state)), - LocationData("Dark Skies", "Dark Skies: Science Facility", SC2NCO_LOC_ID_OFFSET + 804, LocationType.VANILLA, - lambda state: logic.dark_skies_requirement(state)), - LocationData("End Game", "End Game: Victory", SC2NCO_LOC_ID_OFFSET + 900, LocationType.VICTORY, - lambda state: logic.end_game_requirement(state) and logic.nova_any_weapon(state)), - LocationData("End Game", "End Game: Xanthos", SC2NCO_LOC_ID_OFFSET + 901, LocationType.VANILLA, - lambda state: logic.end_game_requirement(state)), - ] - - beat_events = [] - # Filtering out excluded locations - if world is not None: - excluded_location_types = get_location_types(world, LocationInclusion.option_disabled) - plando_locations = get_plando_locations(world) - exclude_locations = get_option_value(world, "exclude_locations") - location_table = [location for location in location_table - if (location.type is LocationType.VICTORY or location.name not in exclude_locations) - and location.type not in excluded_location_types - or location.name in plando_locations] - for i, location_data in enumerate(location_table): - # Removing all item-based logic on No Logic - if logic_level == RequiredTactics.option_no_logic: - location_data = location_data._replace(rule=Location.access_rule) - location_table[i] = location_data - # Generating Beat event locations - if location_data.name.endswith((": Victory", ": Defeat")): - beat_events.append( - location_data._replace(name="Beat " + location_data.name.rsplit(": ", 1)[0], code=None) - ) - return tuple(location_table + beat_events) - -lookup_location_id_to_type = {loc.code: loc.type for loc in get_locations(None) if loc.code is not None} \ No newline at end of file diff --git a/worlds/sc2/MissionTables.py b/worlds/sc2/MissionTables.py deleted file mode 100644 index 08e1f133de..0000000000 --- a/worlds/sc2/MissionTables.py +++ /dev/null @@ -1,739 +0,0 @@ -from typing import NamedTuple, Dict, List, Set, Union, Literal, Iterable, Callable -from enum import IntEnum, Enum - - -class SC2Race(IntEnum): - ANY = 0 - TERRAN = 1 - ZERG = 2 - PROTOSS = 3 - - -class MissionPools(IntEnum): - STARTER = 0 - EASY = 1 - MEDIUM = 2 - HARD = 3 - VERY_HARD = 4 - FINAL = 5 - - -class SC2CampaignGoalPriority(IntEnum): - """ - Campaign's priority to goal election - """ - NONE = 0 - MINI_CAMPAIGN = 1 # A goal shouldn't be in a mini-campaign if there's at least one 'big' campaign - HARD = 2 # A campaign ending with a hard mission - VERY_HARD = 3 # A campaign ending with a very hard mission - EPILOGUE = 4 # Epilogue shall be always preferred as the goal if present - - -class SC2Campaign(Enum): - - def __new__(cls, *args, **kwargs): - value = len(cls.__members__) + 1 - obj = object.__new__(cls) - obj._value_ = value - return obj - - def __init__(self, campaign_id: int, name: str, goal_priority: SC2CampaignGoalPriority, race: SC2Race): - self.id = campaign_id - self.campaign_name = name - self.goal_priority = goal_priority - self.race = race - - def __lt__(self, other: "SC2Campaign"): - return self.id < other.id - - GLOBAL = 0, "Global", SC2CampaignGoalPriority.NONE, SC2Race.ANY - WOL = 1, "Wings of Liberty", SC2CampaignGoalPriority.VERY_HARD, SC2Race.TERRAN - PROPHECY = 2, "Prophecy", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS - HOTS = 3, "Heart of the Swarm", SC2CampaignGoalPriority.HARD, SC2Race.ZERG - PROLOGUE = 4, "Whispers of Oblivion (Legacy of the Void: Prologue)", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS - LOTV = 5, "Legacy of the Void", SC2CampaignGoalPriority.VERY_HARD, SC2Race.PROTOSS - EPILOGUE = 6, "Into the Void (Legacy of the Void: Epilogue)", SC2CampaignGoalPriority.EPILOGUE, SC2Race.ANY - NCO = 7, "Nova Covert Ops", SC2CampaignGoalPriority.HARD, SC2Race.TERRAN - - -class SC2Mission(Enum): - - def __new__(cls, *args, **kwargs): - value = len(cls.__members__) + 1 - obj = object.__new__(cls) - obj._value_ = value - return obj - - def __init__(self, mission_id: int, name: str, campaign: SC2Campaign, area: str, race: SC2Race, pool: MissionPools, map_file: str, build: bool = True): - self.id = mission_id - self.mission_name = name - self.campaign = campaign - self.area = area - self.race = race - self.pool = pool - self.map_file = map_file - self.build = build - - # Wings of Liberty - LIBERATION_DAY = 1, "Liberation Day", SC2Campaign.WOL, "Mar Sara", SC2Race.ANY, MissionPools.STARTER, "ap_liberation_day", False - THE_OUTLAWS = 2, "The Outlaws", SC2Campaign.WOL, "Mar Sara", SC2Race.TERRAN, MissionPools.EASY, "ap_the_outlaws" - ZERO_HOUR = 3, "Zero Hour", SC2Campaign.WOL, "Mar Sara", SC2Race.TERRAN, MissionPools.EASY, "ap_zero_hour" - EVACUATION = 4, "Evacuation", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.EASY, "ap_evacuation" - OUTBREAK = 5, "Outbreak", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.EASY, "ap_outbreak" - SAFE_HAVEN = 6, "Safe Haven", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_safe_haven" - HAVENS_FALL = 7, "Haven's Fall", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_havens_fall" - SMASH_AND_GRAB = 8, "Smash and Grab", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.EASY, "ap_smash_and_grab" - THE_DIG = 9, "The Dig", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_dig" - THE_MOEBIUS_FACTOR = 10, "The Moebius Factor", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_moebius_factor" - SUPERNOVA = 11, "Supernova", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.HARD, "ap_supernova" - MAW_OF_THE_VOID = 12, "Maw of the Void", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.HARD, "ap_maw_of_the_void" - DEVILS_PLAYGROUND = 13, "Devil's Playground", SC2Campaign.WOL, "Covert", SC2Race.TERRAN, MissionPools.EASY, "ap_devils_playground" - WELCOME_TO_THE_JUNGLE = 14, "Welcome to the Jungle", SC2Campaign.WOL, "Covert", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_welcome_to_the_jungle" - BREAKOUT = 15, "Breakout", SC2Campaign.WOL, "Covert", SC2Race.ANY, MissionPools.STARTER, "ap_breakout", False - GHOST_OF_A_CHANCE = 16, "Ghost of a Chance", SC2Campaign.WOL, "Covert", SC2Race.ANY, MissionPools.STARTER, "ap_ghost_of_a_chance", False - THE_GREAT_TRAIN_ROBBERY = 17, "The Great Train Robbery", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_great_train_robbery" - CUTTHROAT = 18, "Cutthroat", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_cutthroat" - ENGINE_OF_DESTRUCTION = 19, "Engine of Destruction", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.HARD, "ap_engine_of_destruction" - MEDIA_BLITZ = 20, "Media Blitz", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_media_blitz" - PIERCING_OF_THE_SHROUD = 21, "Piercing the Shroud", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.STARTER, "ap_piercing_the_shroud", False - GATES_OF_HELL = 26, "Gates of Hell", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.HARD, "ap_gates_of_hell" - BELLY_OF_THE_BEAST = 27, "Belly of the Beast", SC2Campaign.WOL, "Char", SC2Race.ANY, MissionPools.STARTER, "ap_belly_of_the_beast", False - SHATTER_THE_SKY = 28, "Shatter the Sky", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.HARD, "ap_shatter_the_sky" - ALL_IN = 29, "All-In", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_all_in" - - # Prophecy - WHISPERS_OF_DOOM = 22, "Whispers of Doom", SC2Campaign.PROPHECY, "_1", SC2Race.ANY, MissionPools.STARTER, "ap_whispers_of_doom", False - A_SINISTER_TURN = 23, "A Sinister Turn", SC2Campaign.PROPHECY, "_2", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_a_sinister_turn" - ECHOES_OF_THE_FUTURE = 24, "Echoes of the Future", SC2Campaign.PROPHECY, "_3", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_echoes_of_the_future" - IN_UTTER_DARKNESS = 25, "In Utter Darkness", SC2Campaign.PROPHECY, "_4", SC2Race.PROTOSS, MissionPools.HARD, "ap_in_utter_darkness" - - # Heart of the Swarm - LAB_RAT = 30, "Lab Rat", SC2Campaign.HOTS, "Umoja", SC2Race.ZERG, MissionPools.STARTER, "ap_lab_rat" - BACK_IN_THE_SADDLE = 31, "Back in the Saddle", SC2Campaign.HOTS, "Umoja", SC2Race.ANY, MissionPools.STARTER, "ap_back_in_the_saddle", False - RENDEZVOUS = 32, "Rendezvous", SC2Campaign.HOTS, "Umoja", SC2Race.ZERG, MissionPools.EASY, "ap_rendezvous" - HARVEST_OF_SCREAMS = 33, "Harvest of Screams", SC2Campaign.HOTS, "Kaldir", SC2Race.ZERG, MissionPools.EASY, "ap_harvest_of_screams" - SHOOT_THE_MESSENGER = 34, "Shoot the Messenger", SC2Campaign.HOTS, "Kaldir", SC2Race.ZERG, MissionPools.EASY, "ap_shoot_the_messenger" - ENEMY_WITHIN = 35, "Enemy Within", SC2Campaign.HOTS, "Kaldir", SC2Race.ANY, MissionPools.EASY, "ap_enemy_within", False - DOMINATION = 36, "Domination", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.EASY, "ap_domination" - FIRE_IN_THE_SKY = 37, "Fire in the Sky", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.MEDIUM, "ap_fire_in_the_sky" - OLD_SOLDIERS = 38, "Old Soldiers", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.MEDIUM, "ap_old_soldiers" - WAKING_THE_ANCIENT = 39, "Waking the Ancient", SC2Campaign.HOTS, "Zerus", SC2Race.ZERG, MissionPools.MEDIUM, "ap_waking_the_ancient" - THE_CRUCIBLE = 40, "The Crucible", SC2Campaign.HOTS, "Zerus", SC2Race.ZERG, MissionPools.MEDIUM, "ap_the_crucible" - SUPREME = 41, "Supreme", SC2Campaign.HOTS, "Zerus", SC2Race.ANY, MissionPools.MEDIUM, "ap_supreme", False - INFESTED = 42, "Infested", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.MEDIUM, "ap_infested" - HAND_OF_DARKNESS = 43, "Hand of Darkness", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.HARD, "ap_hand_of_darkness" - PHANTOMS_OF_THE_VOID = 44, "Phantoms of the Void", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.HARD, "ap_phantoms_of_the_void" - WITH_FRIENDS_LIKE_THESE = 45, "With Friends Like These", SC2Campaign.HOTS, "Dominion Space", SC2Race.ANY, MissionPools.STARTER, "ap_with_friends_like_these", False - CONVICTION = 46, "Conviction", SC2Campaign.HOTS, "Dominion Space", SC2Race.ANY, MissionPools.MEDIUM, "ap_conviction", False - PLANETFALL = 47, "Planetfall", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_planetfall" - DEATH_FROM_ABOVE = 48, "Death From Above", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_death_from_above" - THE_RECKONING = 49, "The Reckoning", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_the_reckoning" - - # Prologue - DARK_WHISPERS = 50, "Dark Whispers", SC2Campaign.PROLOGUE, "_1", SC2Race.PROTOSS, MissionPools.EASY, "ap_dark_whispers" - GHOSTS_IN_THE_FOG = 51, "Ghosts in the Fog", SC2Campaign.PROLOGUE, "_2", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_ghosts_in_the_fog" - EVIL_AWOKEN = 52, "Evil Awoken", SC2Campaign.PROLOGUE, "_3", SC2Race.PROTOSS, MissionPools.STARTER, "ap_evil_awoken", False - - # LotV - FOR_AIUR = 53, "For Aiur!", SC2Campaign.LOTV, "Aiur", SC2Race.ANY, MissionPools.STARTER, "ap_for_aiur", False - THE_GROWING_SHADOW = 54, "The Growing Shadow", SC2Campaign.LOTV, "Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_growing_shadow" - THE_SPEAR_OF_ADUN = 55, "The Spear of Adun", SC2Campaign.LOTV, "Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_spear_of_adun" - SKY_SHIELD = 56, "Sky Shield", SC2Campaign.LOTV, "Korhal", SC2Race.PROTOSS, MissionPools.EASY, "ap_sky_shield" - BROTHERS_IN_ARMS = 57, "Brothers in Arms", SC2Campaign.LOTV, "Korhal", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_brothers_in_arms" - AMON_S_REACH = 58, "Amon's Reach", SC2Campaign.LOTV, "Shakuras", SC2Race.PROTOSS, MissionPools.EASY, "ap_amon_s_reach" - LAST_STAND = 59, "Last Stand", SC2Campaign.LOTV, "Shakuras", SC2Race.PROTOSS, MissionPools.HARD, "ap_last_stand" - FORBIDDEN_WEAPON = 60, "Forbidden Weapon", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_forbidden_weapon" - TEMPLE_OF_UNIFICATION = 61, "Temple of Unification", SC2Campaign.LOTV, "Ulnar", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_temple_of_unification" - THE_INFINITE_CYCLE = 62, "The Infinite Cycle", SC2Campaign.LOTV, "Ulnar", SC2Race.ANY, MissionPools.HARD, "ap_the_infinite_cycle", False - HARBINGER_OF_OBLIVION = 63, "Harbinger of Oblivion", SC2Campaign.LOTV, "Ulnar", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_harbinger_of_oblivion" - UNSEALING_THE_PAST = 64, "Unsealing the Past", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_unsealing_the_past" - PURIFICATION = 65, "Purification", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.HARD, "ap_purification" - STEPS_OF_THE_RITE = 66, "Steps of the Rite", SC2Campaign.LOTV, "Tal'darim", SC2Race.PROTOSS, MissionPools.HARD, "ap_steps_of_the_rite" - RAK_SHIR = 67, "Rak'Shir", SC2Campaign.LOTV, "Tal'darim", SC2Race.PROTOSS, MissionPools.HARD, "ap_rak_shir" - TEMPLAR_S_CHARGE = 68, "Templar's Charge", SC2Campaign.LOTV, "Moebius", SC2Race.PROTOSS, MissionPools.HARD, "ap_templar_s_charge" - TEMPLAR_S_RETURN = 69, "Templar's Return", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_templar_s_return", False - THE_HOST = 70, "The Host", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.HARD, "ap_the_host", - SALVATION = 71, "Salvation", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_salvation" - - # Epilogue - INTO_THE_VOID = 72, "Into the Void", SC2Campaign.EPILOGUE, "_1", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_into_the_void" - THE_ESSENCE_OF_ETERNITY = 73, "The Essence of Eternity", SC2Campaign.EPILOGUE, "_2", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_the_essence_of_eternity" - AMON_S_FALL = 74, "Amon's Fall", SC2Campaign.EPILOGUE, "_3", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_amon_s_fall" - - # Nova Covert Ops - THE_ESCAPE = 75, "The Escape", SC2Campaign.NCO, "_1", SC2Race.ANY, MissionPools.MEDIUM, "ap_the_escape", False - SUDDEN_STRIKE = 76, "Sudden Strike", SC2Campaign.NCO, "_1", SC2Race.TERRAN, MissionPools.EASY, "ap_sudden_strike" - ENEMY_INTELLIGENCE = 77, "Enemy Intelligence", SC2Campaign.NCO, "_1", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_enemy_intelligence" - TROUBLE_IN_PARADISE = 78, "Trouble In Paradise", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_trouble_in_paradise" - NIGHT_TERRORS = 79, "Night Terrors", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_night_terrors" - FLASHPOINT = 80, "Flashpoint", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_flashpoint" - IN_THE_ENEMY_S_SHADOW = 81, "In the Enemy's Shadow", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_in_the_enemy_s_shadow", False - DARK_SKIES = 82, "Dark Skies", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.HARD, "ap_dark_skies" - END_GAME = 83, "End Game", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_end_game" - - -class MissionConnection: - campaign: SC2Campaign - connect_to: int # -1 connects to Menu - - def __init__(self, connect_to, campaign = SC2Campaign.GLOBAL): - self.campaign = campaign - self.connect_to = connect_to - - def _asdict(self): - return { - "campaign": self.campaign.id, - "connect_to": self.connect_to - } - - -class MissionInfo(NamedTuple): - mission: SC2Mission - required_world: List[Union[MissionConnection, Dict[Literal["campaign", "connect_to"], int]]] - category: str - number: int = 0 # number of worlds need beaten - completion_critical: bool = False # missions needed to beat game - or_requirements: bool = False # true if the requirements should be or-ed instead of and-ed - ui_vertical_padding: int = 0 - - -class FillMission(NamedTuple): - type: MissionPools - connect_to: List[MissionConnection] - category: str - number: int = 0 # number of worlds need beaten - completion_critical: bool = False # missions needed to beat game - or_requirements: bool = False # true if the requirements should be or-ed instead of and-ed - removal_priority: int = 0 # how many missions missing from the pool required to remove this mission - - - -def vanilla_shuffle_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.WOL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.WOL)], "Mar Sara", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.WOL)], "Mar Sara", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.WOL)], "Mar Sara", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.WOL)], "Colonist"), - FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.WOL)], "Colonist"), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.WOL)], "Colonist", number=7), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.WOL)], "Colonist", number=7, removal_priority=1), - FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.WOL)], "Artifact", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(7, SC2Campaign.WOL)], "Artifact", number=8, completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(8, SC2Campaign.WOL)], "Artifact", number=11, completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(9, SC2Campaign.WOL)], "Artifact", number=14, completion_critical=True, removal_priority=7), - FillMission(MissionPools.HARD, [MissionConnection(10, SC2Campaign.WOL)], "Artifact", completion_critical=True, removal_priority=6), - FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.WOL)], "Covert", number=4), - FillMission(MissionPools.MEDIUM, [MissionConnection(12, SC2Campaign.WOL)], "Covert"), - FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.WOL)], "Covert", number=8, removal_priority=3), - FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.WOL)], "Covert", number=8, removal_priority=2), - FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.WOL)], "Rebellion", number=6), - FillMission(MissionPools.HARD, [MissionConnection(16, SC2Campaign.WOL)], "Rebellion"), - FillMission(MissionPools.HARD, [MissionConnection(17, SC2Campaign.WOL)], "Rebellion"), - FillMission(MissionPools.HARD, [MissionConnection(18, SC2Campaign.WOL)], "Rebellion", removal_priority=8), - FillMission(MissionPools.HARD, [MissionConnection(19, SC2Campaign.WOL)], "Rebellion", removal_priority=5), - FillMission(MissionPools.HARD, [MissionConnection(11, SC2Campaign.WOL)], "Char", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(21, SC2Campaign.WOL)], "Char", completion_critical=True, removal_priority=4), - FillMission(MissionPools.HARD, [MissionConnection(21, SC2Campaign.WOL)], "Char", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(22, SC2Campaign.WOL), MissionConnection(23, SC2Campaign.WOL)], "Char", completion_critical=True, or_requirements=True) - ], - SC2Campaign.PROPHECY: [ - FillMission(MissionPools.MEDIUM, [MissionConnection(8, SC2Campaign.WOL)], "_1"), - FillMission(MissionPools.HARD, [MissionConnection(0, SC2Campaign.PROPHECY)], "_2", removal_priority=2), - FillMission(MissionPools.HARD, [MissionConnection(1, SC2Campaign.PROPHECY)], "_3", removal_priority=1), - FillMission(MissionPools.FINAL, [MissionConnection(2, SC2Campaign.PROPHECY)], "_4"), - ], - SC2Campaign.HOTS: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.HOTS)], "Umoja", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.HOTS)], "Umoja", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.HOTS)], "Umoja", completion_critical=True, removal_priority=1), - FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.HOTS)], "Kaldir", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.HOTS)], "Kaldir", completion_critical=True, removal_priority=2), - FillMission(MissionPools.MEDIUM, [MissionConnection(4, SC2Campaign.HOTS)], "Kaldir", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(2, SC2Campaign.HOTS)], "Char", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(6, SC2Campaign.HOTS)], "Char", completion_critical=True, removal_priority=3), - FillMission(MissionPools.MEDIUM, [MissionConnection(7, SC2Campaign.HOTS)], "Char", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS), MissionConnection(8, SC2Campaign.HOTS)], "Zerus", completion_critical=True, or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(9, SC2Campaign.HOTS)], "Zerus", completion_critical=True, removal_priority=4), - FillMission(MissionPools.MEDIUM, [MissionConnection(10, SC2Campaign.HOTS)], "Zerus", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS), MissionConnection(8, SC2Campaign.HOTS), MissionConnection(11, SC2Campaign.HOTS)], "Skygeirr Station", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(12, SC2Campaign.HOTS)], "Skygeirr Station", completion_critical=True, removal_priority=5), - FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.HOTS)], "Skygeirr Station", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS), MissionConnection(8, SC2Campaign.HOTS), MissionConnection(11, SC2Campaign.HOTS)], "Dominion Space", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(15, SC2Campaign.HOTS)], "Dominion Space", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(14, SC2Campaign.HOTS), MissionConnection(16, SC2Campaign.HOTS)], "Korhal", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(17, SC2Campaign.HOTS)], "Korhal", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(18, SC2Campaign.HOTS)], "Korhal", completion_critical=True), - ], - SC2Campaign.PROLOGUE: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.PROLOGUE)], "_1"), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.PROLOGUE)], "_2", removal_priority=1), - FillMission(MissionPools.FINAL, [MissionConnection(1, SC2Campaign.PROLOGUE)], "_3") - ], - SC2Campaign.LOTV: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.LOTV)], "Aiur", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.LOTV)], "Aiur", completion_critical=True, removal_priority=3), - FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.LOTV)], "Aiur", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.LOTV)], "Korhal", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.LOTV)], "Korhal", completion_critical=True, removal_priority=7), - FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.LOTV)], "Shakuras", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.LOTV)], "Shakuras", completion_critical=True, removal_priority=6), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.LOTV), MissionConnection(6, SC2Campaign.LOTV)], "Purifier", completion_critical=True, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.LOTV), MissionConnection(6, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV)], "Ulnar", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(8, SC2Campaign.LOTV)], "Ulnar", completion_critical=True, removal_priority=1), - FillMission(MissionPools.HARD, [MissionConnection(9, SC2Campaign.LOTV)], "Ulnar", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(10, SC2Campaign.LOTV)], "Purifier", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(11, SC2Campaign.LOTV)], "Purifier", completion_critical=True, removal_priority=5), - FillMission(MissionPools.HARD, [MissionConnection(10, SC2Campaign.LOTV)], "Tal'darim", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(13, SC2Campaign.LOTV)], "Tal'darim", completion_critical=True, removal_priority=4), - FillMission(MissionPools.HARD, [MissionConnection(12, SC2Campaign.LOTV), MissionConnection(14, SC2Campaign.LOTV)], "Moebius", completion_critical=True, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(12, SC2Campaign.LOTV), MissionConnection(14, SC2Campaign.LOTV), MissionConnection(15, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(16, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True, removal_priority=2), - FillMission(MissionPools.FINAL, [MissionConnection(17, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True), - ], - SC2Campaign.EPILOGUE: [ - FillMission(MissionPools.VERY_HARD, [MissionConnection(24, SC2Campaign.WOL), MissionConnection(19, SC2Campaign.HOTS), MissionConnection(18, SC2Campaign.LOTV)], "_1", completion_critical=True), - FillMission(MissionPools.VERY_HARD, [MissionConnection(0, SC2Campaign.EPILOGUE)], "_2", completion_critical=True, removal_priority=1), - FillMission(MissionPools.FINAL, [MissionConnection(1, SC2Campaign.EPILOGUE)], "_3", completion_critical=True), - ], - SC2Campaign.NCO: [ - FillMission(MissionPools.EASY, [MissionConnection(-1, SC2Campaign.NCO)], "_1", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.NCO)], "_1", completion_critical=True, removal_priority=6), - FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.NCO)], "_1", completion_critical=True, removal_priority=5), - FillMission(MissionPools.HARD, [MissionConnection(2, SC2Campaign.NCO)], "_2", completion_critical=True, removal_priority=7), - FillMission(MissionPools.HARD, [MissionConnection(3, SC2Campaign.NCO)], "_2", completion_critical=True, removal_priority=4), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.NCO)], "_2", completion_critical=True, removal_priority=3), - FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.NCO)], "_3", completion_critical=True, removal_priority=2), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.NCO)], "_3", completion_critical=True, removal_priority=1), - FillMission(MissionPools.FINAL, [MissionConnection(7, SC2Campaign.NCO)], "_3", completion_critical=True), - ] - } - - -def mini_campaign_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.WOL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.WOL)], "Mar Sara", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.WOL)], "Colonist"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.WOL)], "Colonist"), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.WOL)], "Artifact", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.WOL)], "Artifact", number=4, completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.WOL)], "Artifact", number=8, completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.WOL)], "Covert", number=2), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.WOL)], "Covert"), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.WOL)], "Rebellion", number=3), - FillMission(MissionPools.HARD, [MissionConnection(8, SC2Campaign.WOL)], "Rebellion"), - FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.WOL)], "Char", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.WOL)], "Char", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(10, SC2Campaign.WOL), MissionConnection(11, SC2Campaign.WOL)], "Char", completion_critical=True, or_requirements=True) - ], - SC2Campaign.PROPHECY: [ - FillMission(MissionPools.MEDIUM, [MissionConnection(4, SC2Campaign.WOL)], "_1"), - FillMission(MissionPools.FINAL, [MissionConnection(0, SC2Campaign.PROPHECY)], "_2"), - ], - SC2Campaign.HOTS: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.HOTS)], "Umoja", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.HOTS)], "Kaldir"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.HOTS)], "Kaldir"), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.HOTS)], "Char"), - FillMission(MissionPools.MEDIUM, [MissionConnection(3, SC2Campaign.HOTS)], "Char"), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.HOTS)], "Zerus", number=3), - FillMission(MissionPools.MEDIUM, [MissionConnection(5, SC2Campaign.HOTS)], "Zerus"), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.HOTS)], "Skygeirr Station", number=5), - FillMission(MissionPools.HARD, [MissionConnection(7, SC2Campaign.HOTS)], "Skygeirr Station"), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.HOTS)], "Dominion Space", number=5), - FillMission(MissionPools.HARD, [MissionConnection(9, SC2Campaign.HOTS)], "Dominion Space"), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.HOTS)], "Korhal", completion_critical=True, number=8), - FillMission(MissionPools.FINAL, [MissionConnection(11, SC2Campaign.HOTS)], "Korhal", completion_critical=True), - ], - SC2Campaign.PROLOGUE: [ - FillMission(MissionPools.EASY, [MissionConnection(-1, SC2Campaign.PROLOGUE)], "_1"), - FillMission(MissionPools.FINAL, [MissionConnection(0, SC2Campaign.PROLOGUE)], "_2") - ], - SC2Campaign.LOTV: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1, SC2Campaign.LOTV)], "Aiur",completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0, SC2Campaign.LOTV)], "Aiur", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(1, SC2Campaign.LOTV)], "Korhal", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.LOTV)], "Shakuras", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(2, SC2Campaign.LOTV), MissionConnection(3, SC2Campaign.LOTV)], "Purifier", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.LOTV)], "Purifier", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(4, SC2Campaign.LOTV)], "Ulnar", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(6, SC2Campaign.LOTV)], "Tal'darim", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(5, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(8, SC2Campaign.LOTV)], "Return to Aiur", completion_critical=True), - ], - SC2Campaign.EPILOGUE: [ - FillMission(MissionPools.VERY_HARD, [MissionConnection(12, SC2Campaign.WOL), MissionConnection(12, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.LOTV)], "_1", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(0, SC2Campaign.EPILOGUE)], "_2", completion_critical=True), - ], - SC2Campaign.NCO: [ - FillMission(MissionPools.EASY, [MissionConnection(-1, SC2Campaign.NCO)], "_1", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0, SC2Campaign.NCO)], "_1", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(1, SC2Campaign.NCO)], "_2", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(2, SC2Campaign.NCO)], "_3", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(3, SC2Campaign.NCO)], "_3", completion_critical=True), - ] - } - - -def gauntlet_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "I", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0)], "II", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(1)], "III", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(2)], "IV", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(3)], "V", completion_critical=True), - FillMission(MissionPools.HARD, [MissionConnection(4)], "VI", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(5)], "Final", completion_critical=True) - ] - } - - -def mini_gauntlet_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "I", completion_critical=True), - FillMission(MissionPools.EASY, [MissionConnection(0)], "II", completion_critical=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(1)], "III", completion_critical=True), - FillMission(MissionPools.FINAL, [MissionConnection(2)], "Final", completion_critical=True) - ] - } - - -def grid_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "_1"), - FillMission(MissionPools.EASY, [MissionConnection(0)], "_1"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(6), MissionConnection( 3)], "_1", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(2), MissionConnection(7)], "_1", or_requirements=True), - FillMission(MissionPools.EASY, [MissionConnection(0)], "_2"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(4)], "_2", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(2), MissionConnection(5), MissionConnection(10), MissionConnection(7)], "_2", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(3), MissionConnection(6), MissionConnection(11)], "_2", or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(4), MissionConnection(9), MissionConnection(12)], "_3", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(5), MissionConnection(8), MissionConnection(10), MissionConnection(13)], "_3", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(6), MissionConnection(9), MissionConnection(11), MissionConnection(14)], "_3", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(7), MissionConnection(10)], "_3", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(8), MissionConnection(13)], "_4", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(9), MissionConnection(12), MissionConnection(14)], "_4", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(10), MissionConnection(13)], "_4", or_requirements=True), - FillMission(MissionPools.FINAL, [MissionConnection(11), MissionConnection(14)], "_4", or_requirements=True) - ] - } - -def mini_grid_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "_1"), - FillMission(MissionPools.EASY, [MissionConnection(0)], "_1"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(5)], "_1", or_requirements=True), - FillMission(MissionPools.EASY, [MissionConnection(0)], "_2"), - FillMission(MissionPools.MEDIUM, [MissionConnection(1), MissionConnection(3)], "_2", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(2), MissionConnection(4)], "_2", or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(3), MissionConnection(7)], "_3", or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(4), MissionConnection(6)], "_3", or_requirements=True), - FillMission(MissionPools.FINAL, [MissionConnection(5), MissionConnection(7)], "_3", or_requirements=True) - ] - } - -def tiny_grid_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "_1"), - FillMission(MissionPools.MEDIUM, [MissionConnection(0)], "_1"), - FillMission(MissionPools.EASY, [MissionConnection(0)], "_2"), - FillMission(MissionPools.FINAL, [MissionConnection(1), MissionConnection(2)], "_2", or_requirements=True), - ] - } - -def blitz_order() -> Dict[SC2Campaign, List[FillMission]]: - return { - SC2Campaign.GLOBAL: [ - FillMission(MissionPools.STARTER, [MissionConnection(-1)], "I"), - FillMission(MissionPools.EASY, [MissionConnection(-1)], "I"), - FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "II", number=1, or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "II", number=1, or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "III", number=2, or_requirements=True), - FillMission(MissionPools.MEDIUM, [MissionConnection(0), MissionConnection(1)], "III", number=2, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "IV", number=3, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "IV", number=3, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "V", number=4, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "V", number=4, or_requirements=True), - FillMission(MissionPools.HARD, [MissionConnection(0), MissionConnection(1)], "Final", number=5, or_requirements=True), - FillMission(MissionPools.FINAL, [MissionConnection(0), MissionConnection(1)], "Final", number=5, or_requirements=True) - ] - } - - -mission_orders: List[Callable[[], Dict[SC2Campaign, List[FillMission]]]] = [ - vanilla_shuffle_order, - vanilla_shuffle_order, - mini_campaign_order, - grid_order, - mini_grid_order, - blitz_order, - gauntlet_order, - mini_gauntlet_order, - tiny_grid_order -] - - -vanilla_mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = { - SC2Campaign.WOL: { - SC2Mission.LIBERATION_DAY.mission_name: MissionInfo(SC2Mission.LIBERATION_DAY, [], SC2Mission.LIBERATION_DAY.area, completion_critical=True), - SC2Mission.THE_OUTLAWS.mission_name: MissionInfo(SC2Mission.THE_OUTLAWS, [MissionConnection(1, SC2Campaign.WOL)], SC2Mission.THE_OUTLAWS.area, completion_critical=True), - SC2Mission.ZERO_HOUR.mission_name: MissionInfo(SC2Mission.ZERO_HOUR, [MissionConnection(2, SC2Campaign.WOL)], SC2Mission.ZERO_HOUR.area, completion_critical=True), - SC2Mission.EVACUATION.mission_name: MissionInfo(SC2Mission.EVACUATION, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.EVACUATION.area), - SC2Mission.OUTBREAK.mission_name: MissionInfo(SC2Mission.OUTBREAK, [MissionConnection(4, SC2Campaign.WOL)], SC2Mission.OUTBREAK.area), - SC2Mission.SAFE_HAVEN.mission_name: MissionInfo(SC2Mission.SAFE_HAVEN, [MissionConnection(5, SC2Campaign.WOL)], SC2Mission.SAFE_HAVEN.area, number=7), - SC2Mission.HAVENS_FALL.mission_name: MissionInfo(SC2Mission.HAVENS_FALL, [MissionConnection(5, SC2Campaign.WOL)], SC2Mission.HAVENS_FALL.area, number=7), - SC2Mission.SMASH_AND_GRAB.mission_name: MissionInfo(SC2Mission.SMASH_AND_GRAB, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.SMASH_AND_GRAB.area, completion_critical=True), - SC2Mission.THE_DIG.mission_name: MissionInfo(SC2Mission.THE_DIG, [MissionConnection(8, SC2Campaign.WOL)], SC2Mission.THE_DIG.area, number=8, completion_critical=True), - SC2Mission.THE_MOEBIUS_FACTOR.mission_name: MissionInfo(SC2Mission.THE_MOEBIUS_FACTOR, [MissionConnection(9, SC2Campaign.WOL)], SC2Mission.THE_MOEBIUS_FACTOR.area, number=11, completion_critical=True), - SC2Mission.SUPERNOVA.mission_name: MissionInfo(SC2Mission.SUPERNOVA, [MissionConnection(10, SC2Campaign.WOL)], SC2Mission.SUPERNOVA.area, number=14, completion_critical=True), - SC2Mission.MAW_OF_THE_VOID.mission_name: MissionInfo(SC2Mission.MAW_OF_THE_VOID, [MissionConnection(11, SC2Campaign.WOL)], SC2Mission.MAW_OF_THE_VOID.area, completion_critical=True), - SC2Mission.DEVILS_PLAYGROUND.mission_name: MissionInfo(SC2Mission.DEVILS_PLAYGROUND, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.DEVILS_PLAYGROUND.area, number=4), - SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name: MissionInfo(SC2Mission.WELCOME_TO_THE_JUNGLE, [MissionConnection(13, SC2Campaign.WOL)], SC2Mission.WELCOME_TO_THE_JUNGLE.area), - SC2Mission.BREAKOUT.mission_name: MissionInfo(SC2Mission.BREAKOUT, [MissionConnection(14, SC2Campaign.WOL)], SC2Mission.BREAKOUT.area, number=8), - SC2Mission.GHOST_OF_A_CHANCE.mission_name: MissionInfo(SC2Mission.GHOST_OF_A_CHANCE, [MissionConnection(14, SC2Campaign.WOL)], SC2Mission.GHOST_OF_A_CHANCE.area, number=8), - SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name: MissionInfo(SC2Mission.THE_GREAT_TRAIN_ROBBERY, [MissionConnection(3, SC2Campaign.WOL)], SC2Mission.THE_GREAT_TRAIN_ROBBERY.area, number=6), - SC2Mission.CUTTHROAT.mission_name: MissionInfo(SC2Mission.CUTTHROAT, [MissionConnection(17, SC2Campaign.WOL)], SC2Mission.THE_GREAT_TRAIN_ROBBERY.area), - SC2Mission.ENGINE_OF_DESTRUCTION.mission_name: MissionInfo(SC2Mission.ENGINE_OF_DESTRUCTION, [MissionConnection(18, SC2Campaign.WOL)], SC2Mission.ENGINE_OF_DESTRUCTION.area), - SC2Mission.MEDIA_BLITZ.mission_name: MissionInfo(SC2Mission.MEDIA_BLITZ, [MissionConnection(19, SC2Campaign.WOL)], SC2Mission.MEDIA_BLITZ.area), - SC2Mission.PIERCING_OF_THE_SHROUD.mission_name: MissionInfo(SC2Mission.PIERCING_OF_THE_SHROUD, [MissionConnection(20, SC2Campaign.WOL)], SC2Mission.PIERCING_OF_THE_SHROUD.area), - SC2Mission.GATES_OF_HELL.mission_name: MissionInfo(SC2Mission.GATES_OF_HELL, [MissionConnection(12, SC2Campaign.WOL)], SC2Mission.GATES_OF_HELL.area, completion_critical=True), - SC2Mission.BELLY_OF_THE_BEAST.mission_name: MissionInfo(SC2Mission.BELLY_OF_THE_BEAST, [MissionConnection(22, SC2Campaign.WOL)], SC2Mission.BELLY_OF_THE_BEAST.area, completion_critical=True), - SC2Mission.SHATTER_THE_SKY.mission_name: MissionInfo(SC2Mission.SHATTER_THE_SKY, [MissionConnection(22, SC2Campaign.WOL)], SC2Mission.SHATTER_THE_SKY.area, completion_critical=True), - SC2Mission.ALL_IN.mission_name: MissionInfo(SC2Mission.ALL_IN, [MissionConnection(23, SC2Campaign.WOL), MissionConnection(24, SC2Campaign.WOL)], SC2Mission.ALL_IN.area, or_requirements=True, completion_critical=True) - }, - SC2Campaign.PROPHECY: { - SC2Mission.WHISPERS_OF_DOOM.mission_name: MissionInfo(SC2Mission.WHISPERS_OF_DOOM, [MissionConnection(9, SC2Campaign.WOL)], SC2Mission.WHISPERS_OF_DOOM.area), - SC2Mission.A_SINISTER_TURN.mission_name: MissionInfo(SC2Mission.A_SINISTER_TURN, [MissionConnection(1, SC2Campaign.PROPHECY)], SC2Mission.A_SINISTER_TURN.area), - SC2Mission.ECHOES_OF_THE_FUTURE.mission_name: MissionInfo(SC2Mission.ECHOES_OF_THE_FUTURE, [MissionConnection(2, SC2Campaign.PROPHECY)], SC2Mission.ECHOES_OF_THE_FUTURE.area), - SC2Mission.IN_UTTER_DARKNESS.mission_name: MissionInfo(SC2Mission.IN_UTTER_DARKNESS, [MissionConnection(3, SC2Campaign.PROPHECY)], SC2Mission.IN_UTTER_DARKNESS.area) - }, - SC2Campaign.HOTS: { - SC2Mission.LAB_RAT.mission_name: MissionInfo(SC2Mission.LAB_RAT, [], SC2Mission.LAB_RAT.area, completion_critical=True), - SC2Mission.BACK_IN_THE_SADDLE.mission_name: MissionInfo(SC2Mission.BACK_IN_THE_SADDLE, [MissionConnection(1, SC2Campaign.HOTS)], SC2Mission.BACK_IN_THE_SADDLE.area, completion_critical=True), - SC2Mission.RENDEZVOUS.mission_name: MissionInfo(SC2Mission.RENDEZVOUS, [MissionConnection(2, SC2Campaign.HOTS)], SC2Mission.RENDEZVOUS.area, completion_critical=True), - SC2Mission.HARVEST_OF_SCREAMS.mission_name: MissionInfo(SC2Mission.HARVEST_OF_SCREAMS, [MissionConnection(3, SC2Campaign.HOTS)], SC2Mission.HARVEST_OF_SCREAMS.area), - SC2Mission.SHOOT_THE_MESSENGER.mission_name: MissionInfo(SC2Mission.SHOOT_THE_MESSENGER, [MissionConnection(4, SC2Campaign.HOTS)], SC2Mission.SHOOT_THE_MESSENGER.area), - SC2Mission.ENEMY_WITHIN.mission_name: MissionInfo(SC2Mission.ENEMY_WITHIN, [MissionConnection(5, SC2Campaign.HOTS)], SC2Mission.ENEMY_WITHIN.area), - SC2Mission.DOMINATION.mission_name: MissionInfo(SC2Mission.DOMINATION, [MissionConnection(3, SC2Campaign.HOTS)], SC2Mission.DOMINATION.area), - SC2Mission.FIRE_IN_THE_SKY.mission_name: MissionInfo(SC2Mission.FIRE_IN_THE_SKY, [MissionConnection(7, SC2Campaign.HOTS)], SC2Mission.FIRE_IN_THE_SKY.area), - SC2Mission.OLD_SOLDIERS.mission_name: MissionInfo(SC2Mission.OLD_SOLDIERS, [MissionConnection(8, SC2Campaign.HOTS)], SC2Mission.OLD_SOLDIERS.area), - SC2Mission.WAKING_THE_ANCIENT.mission_name: MissionInfo(SC2Mission.WAKING_THE_ANCIENT, [MissionConnection(6, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.HOTS)], SC2Mission.WAKING_THE_ANCIENT.area, completion_critical=True, or_requirements=True), - SC2Mission.THE_CRUCIBLE.mission_name: MissionInfo(SC2Mission.THE_CRUCIBLE, [MissionConnection(10, SC2Campaign.HOTS)], SC2Mission.THE_CRUCIBLE.area, completion_critical=True), - SC2Mission.SUPREME.mission_name: MissionInfo(SC2Mission.SUPREME, [MissionConnection(11, SC2Campaign.HOTS)], SC2Mission.SUPREME.area, completion_critical=True), - SC2Mission.INFESTED.mission_name: MissionInfo(SC2Mission.INFESTED, [MissionConnection(6, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.HOTS), MissionConnection(12, SC2Campaign.HOTS)], SC2Mission.INFESTED.area), - SC2Mission.HAND_OF_DARKNESS.mission_name: MissionInfo(SC2Mission.HAND_OF_DARKNESS, [MissionConnection(13, SC2Campaign.HOTS)], SC2Mission.HAND_OF_DARKNESS.area), - SC2Mission.PHANTOMS_OF_THE_VOID.mission_name: MissionInfo(SC2Mission.PHANTOMS_OF_THE_VOID, [MissionConnection(14, SC2Campaign.HOTS)], SC2Mission.PHANTOMS_OF_THE_VOID.area), - SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name: MissionInfo(SC2Mission.WITH_FRIENDS_LIKE_THESE, [MissionConnection(6, SC2Campaign.HOTS), MissionConnection(9, SC2Campaign.HOTS), MissionConnection(12, SC2Campaign.HOTS)], SC2Mission.WITH_FRIENDS_LIKE_THESE.area), - SC2Mission.CONVICTION.mission_name: MissionInfo(SC2Mission.CONVICTION, [MissionConnection(16, SC2Campaign.HOTS)], SC2Mission.CONVICTION.area), - SC2Mission.PLANETFALL.mission_name: MissionInfo(SC2Mission.PLANETFALL, [MissionConnection(15, SC2Campaign.HOTS), MissionConnection(17, SC2Campaign.HOTS)], SC2Mission.PLANETFALL.area, completion_critical=True), - SC2Mission.DEATH_FROM_ABOVE.mission_name: MissionInfo(SC2Mission.DEATH_FROM_ABOVE, [MissionConnection(18, SC2Campaign.HOTS)], SC2Mission.DEATH_FROM_ABOVE.area, completion_critical=True), - SC2Mission.THE_RECKONING.mission_name: MissionInfo(SC2Mission.THE_RECKONING, [MissionConnection(19, SC2Campaign.HOTS)], SC2Mission.THE_RECKONING.area, completion_critical=True), - }, - SC2Campaign.PROLOGUE: { - SC2Mission.DARK_WHISPERS.mission_name: MissionInfo(SC2Mission.DARK_WHISPERS, [], SC2Mission.DARK_WHISPERS.area), - SC2Mission.GHOSTS_IN_THE_FOG.mission_name: MissionInfo(SC2Mission.GHOSTS_IN_THE_FOG, [MissionConnection(1, SC2Campaign.PROLOGUE)], SC2Mission.GHOSTS_IN_THE_FOG.area), - SC2Mission.EVIL_AWOKEN.mission_name: MissionInfo(SC2Mission.EVIL_AWOKEN, [MissionConnection(2, SC2Campaign.PROLOGUE)], SC2Mission.EVIL_AWOKEN.area) - }, - SC2Campaign.LOTV: { - SC2Mission.FOR_AIUR.mission_name: MissionInfo(SC2Mission.FOR_AIUR, [], SC2Mission.FOR_AIUR.area, completion_critical=True), - SC2Mission.THE_GROWING_SHADOW.mission_name: MissionInfo(SC2Mission.THE_GROWING_SHADOW, [MissionConnection(1, SC2Campaign.LOTV)], SC2Mission.THE_GROWING_SHADOW.area, completion_critical=True), - SC2Mission.THE_SPEAR_OF_ADUN.mission_name: MissionInfo(SC2Mission.THE_SPEAR_OF_ADUN, [MissionConnection(2, SC2Campaign.LOTV)], SC2Mission.THE_SPEAR_OF_ADUN.area, completion_critical=True), - SC2Mission.SKY_SHIELD.mission_name: MissionInfo(SC2Mission.SKY_SHIELD, [MissionConnection(3, SC2Campaign.LOTV)], SC2Mission.SKY_SHIELD.area, completion_critical=True), - SC2Mission.BROTHERS_IN_ARMS.mission_name: MissionInfo(SC2Mission.BROTHERS_IN_ARMS, [MissionConnection(4, SC2Campaign.LOTV)], SC2Mission.BROTHERS_IN_ARMS.area, completion_critical=True), - SC2Mission.AMON_S_REACH.mission_name: MissionInfo(SC2Mission.AMON_S_REACH, [MissionConnection(3, SC2Campaign.LOTV)], SC2Mission.AMON_S_REACH.area, completion_critical=True), - SC2Mission.LAST_STAND.mission_name: MissionInfo(SC2Mission.LAST_STAND, [MissionConnection(6, SC2Campaign.LOTV)], SC2Mission.LAST_STAND.area, completion_critical=True), - SC2Mission.FORBIDDEN_WEAPON.mission_name: MissionInfo(SC2Mission.FORBIDDEN_WEAPON, [MissionConnection(5, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV)], SC2Mission.FORBIDDEN_WEAPON.area, completion_critical=True, or_requirements=True), - SC2Mission.TEMPLE_OF_UNIFICATION.mission_name: MissionInfo(SC2Mission.TEMPLE_OF_UNIFICATION, [MissionConnection(5, SC2Campaign.LOTV), MissionConnection(7, SC2Campaign.LOTV), MissionConnection(8, SC2Campaign.LOTV)], SC2Mission.TEMPLE_OF_UNIFICATION.area, completion_critical=True), - SC2Mission.THE_INFINITE_CYCLE.mission_name: MissionInfo(SC2Mission.THE_INFINITE_CYCLE, [MissionConnection(9, SC2Campaign.LOTV)], SC2Mission.THE_INFINITE_CYCLE.area, completion_critical=True), - SC2Mission.HARBINGER_OF_OBLIVION.mission_name: MissionInfo(SC2Mission.HARBINGER_OF_OBLIVION, [MissionConnection(10, SC2Campaign.LOTV)], SC2Mission.HARBINGER_OF_OBLIVION.area, completion_critical=True), - SC2Mission.UNSEALING_THE_PAST.mission_name: MissionInfo(SC2Mission.UNSEALING_THE_PAST, [MissionConnection(11, SC2Campaign.LOTV)], SC2Mission.UNSEALING_THE_PAST.area, completion_critical=True), - SC2Mission.PURIFICATION.mission_name: MissionInfo(SC2Mission.PURIFICATION, [MissionConnection(12, SC2Campaign.LOTV)], SC2Mission.PURIFICATION.area, completion_critical=True), - SC2Mission.STEPS_OF_THE_RITE.mission_name: MissionInfo(SC2Mission.STEPS_OF_THE_RITE, [MissionConnection(11, SC2Campaign.LOTV)], SC2Mission.STEPS_OF_THE_RITE.area, completion_critical=True), - SC2Mission.RAK_SHIR.mission_name: MissionInfo(SC2Mission.RAK_SHIR, [MissionConnection(14, SC2Campaign.LOTV)], SC2Mission.RAK_SHIR.area, completion_critical=True), - SC2Mission.TEMPLAR_S_CHARGE.mission_name: MissionInfo(SC2Mission.TEMPLAR_S_CHARGE, [MissionConnection(13, SC2Campaign.LOTV), MissionConnection(15, SC2Campaign.LOTV)], SC2Mission.TEMPLAR_S_CHARGE.area, completion_critical=True, or_requirements=True), - SC2Mission.TEMPLAR_S_RETURN.mission_name: MissionInfo(SC2Mission.TEMPLAR_S_RETURN, [MissionConnection(13, SC2Campaign.LOTV), MissionConnection(15, SC2Campaign.LOTV), MissionConnection(16, SC2Campaign.LOTV)], SC2Mission.TEMPLAR_S_RETURN.area, completion_critical=True), - SC2Mission.THE_HOST.mission_name: MissionInfo(SC2Mission.THE_HOST, [MissionConnection(17, SC2Campaign.LOTV)], SC2Mission.THE_HOST.area, completion_critical=True), - SC2Mission.SALVATION.mission_name: MissionInfo(SC2Mission.SALVATION, [MissionConnection(18, SC2Campaign.LOTV)], SC2Mission.SALVATION.area, completion_critical=True), - }, - SC2Campaign.EPILOGUE: { - SC2Mission.INTO_THE_VOID.mission_name: MissionInfo(SC2Mission.INTO_THE_VOID, [MissionConnection(25, SC2Campaign.WOL), MissionConnection(20, SC2Campaign.HOTS), MissionConnection(19, SC2Campaign.LOTV)], SC2Mission.INTO_THE_VOID.area, completion_critical=True), - SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name: MissionInfo(SC2Mission.THE_ESSENCE_OF_ETERNITY, [MissionConnection(1, SC2Campaign.EPILOGUE)], SC2Mission.THE_ESSENCE_OF_ETERNITY.area, completion_critical=True), - SC2Mission.AMON_S_FALL.mission_name: MissionInfo(SC2Mission.AMON_S_FALL, [MissionConnection(2, SC2Campaign.EPILOGUE)], SC2Mission.AMON_S_FALL.area, completion_critical=True), - }, - SC2Campaign.NCO: { - SC2Mission.THE_ESCAPE.mission_name: MissionInfo(SC2Mission.THE_ESCAPE, [], SC2Mission.THE_ESCAPE.area, completion_critical=True), - SC2Mission.SUDDEN_STRIKE.mission_name: MissionInfo(SC2Mission.SUDDEN_STRIKE, [MissionConnection(1, SC2Campaign.NCO)], SC2Mission.SUDDEN_STRIKE.area, completion_critical=True), - SC2Mission.ENEMY_INTELLIGENCE.mission_name: MissionInfo(SC2Mission.ENEMY_INTELLIGENCE, [MissionConnection(2, SC2Campaign.NCO)], SC2Mission.ENEMY_INTELLIGENCE.area, completion_critical=True), - SC2Mission.TROUBLE_IN_PARADISE.mission_name: MissionInfo(SC2Mission.TROUBLE_IN_PARADISE, [MissionConnection(3, SC2Campaign.NCO)], SC2Mission.TROUBLE_IN_PARADISE.area, completion_critical=True), - SC2Mission.NIGHT_TERRORS.mission_name: MissionInfo(SC2Mission.NIGHT_TERRORS, [MissionConnection(4, SC2Campaign.NCO)], SC2Mission.NIGHT_TERRORS.area, completion_critical=True), - SC2Mission.FLASHPOINT.mission_name: MissionInfo(SC2Mission.FLASHPOINT, [MissionConnection(5, SC2Campaign.NCO)], SC2Mission.FLASHPOINT.area, completion_critical=True), - SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name: MissionInfo(SC2Mission.IN_THE_ENEMY_S_SHADOW, [MissionConnection(6, SC2Campaign.NCO)], SC2Mission.IN_THE_ENEMY_S_SHADOW.area, completion_critical=True), - SC2Mission.DARK_SKIES.mission_name: MissionInfo(SC2Mission.DARK_SKIES, [MissionConnection(7, SC2Campaign.NCO)], SC2Mission.DARK_SKIES.area, completion_critical=True), - SC2Mission.END_GAME.mission_name: MissionInfo(SC2Mission.END_GAME, [MissionConnection(8, SC2Campaign.NCO)], SC2Mission.END_GAME.area, completion_critical=True), - } -} - -lookup_id_to_mission: Dict[int, SC2Mission] = { - mission.id: mission for mission in SC2Mission -} - -lookup_name_to_mission: Dict[str, SC2Mission] = { - mission.mission_name: mission for mission in SC2Mission -} - -lookup_id_to_campaign: Dict[int, SC2Campaign] = { - campaign.id: campaign for campaign in SC2Campaign -} - - -campaign_mission_table: Dict[SC2Campaign, Set[SC2Mission]] = { - campaign: set() for campaign in SC2Campaign -} -for mission in SC2Mission: - campaign_mission_table[mission.campaign].add(mission) - - -def get_campaign_difficulty(campaign: SC2Campaign, excluded_missions: Iterable[SC2Mission] = ()) -> MissionPools: - """ - - :param campaign: - :param excluded_missions: - :return: Campaign's the most difficult non-excluded mission - """ - excluded_mission_set = set(excluded_missions) - included_missions = campaign_mission_table[campaign].difference(excluded_mission_set) - return max([mission.pool for mission in included_missions]) - - -def get_campaign_goal_priority(campaign: SC2Campaign, excluded_missions: Iterable[SC2Mission] = ()) -> SC2CampaignGoalPriority: - """ - Gets a modified campaign goal priority. - If all the campaign's goal missions are excluded, it's ineligible to have the goal - If the campaign's very hard missions are excluded, the priority is lowered to hard - :param campaign: - :param excluded_missions: - :return: - """ - if excluded_missions is None: - return campaign.goal_priority - else: - goal_missions = set(get_campaign_potential_goal_missions(campaign)) - excluded_mission_set = set(excluded_missions) - remaining_goals = goal_missions.difference(excluded_mission_set) - if remaining_goals == set(): - # All potential goals are excluded, the campaign can't be a goal - return SC2CampaignGoalPriority.NONE - elif campaign.goal_priority == SC2CampaignGoalPriority.VERY_HARD: - # Check if a very hard campaign doesn't get rid of it's last very hard mission - difficulty = get_campaign_difficulty(campaign, excluded_missions) - if difficulty == MissionPools.VERY_HARD: - return SC2CampaignGoalPriority.VERY_HARD - else: - return SC2CampaignGoalPriority.HARD - else: - return campaign.goal_priority - - -class SC2CampaignGoal(NamedTuple): - mission: SC2Mission - location: str - - -campaign_final_mission_locations: Dict[SC2Campaign, SC2CampaignGoal] = { - SC2Campaign.WOL: SC2CampaignGoal(SC2Mission.ALL_IN, "All-In: Victory"), - SC2Campaign.PROPHECY: SC2CampaignGoal(SC2Mission.IN_UTTER_DARKNESS, "In Utter Darkness: Kills"), - SC2Campaign.HOTS: None, - SC2Campaign.PROLOGUE: SC2CampaignGoal(SC2Mission.EVIL_AWOKEN, "Evil Awoken: Victory"), - SC2Campaign.LOTV: SC2CampaignGoal(SC2Mission.SALVATION, "Salvation: Victory"), - SC2Campaign.EPILOGUE: None, - SC2Campaign.NCO: SC2CampaignGoal(SC2Mission.END_GAME, "End Game: Victory"), -} - -campaign_alt_final_mission_locations: Dict[SC2Campaign, Dict[SC2Mission, str]] = { - SC2Campaign.WOL: { - SC2Mission.MAW_OF_THE_VOID: "Maw of the Void: Victory", - SC2Mission.ENGINE_OF_DESTRUCTION: "Engine of Destruction: Victory", - SC2Mission.SUPERNOVA: "Supernova: Victory", - SC2Mission.GATES_OF_HELL: "Gates of Hell: Victory", - SC2Mission.SHATTER_THE_SKY: "Shatter the Sky: Victory" - }, - SC2Campaign.PROPHECY: None, - SC2Campaign.HOTS: { - SC2Mission.THE_RECKONING: "The Reckoning: Victory", - SC2Mission.THE_CRUCIBLE: "The Crucible: Victory", - SC2Mission.HAND_OF_DARKNESS: "Hand of Darkness: Victory", - SC2Mission.PHANTOMS_OF_THE_VOID: "Phantoms of the Void: Victory", - SC2Mission.PLANETFALL: "Planetfall: Victory", - SC2Mission.DEATH_FROM_ABOVE: "Death From Above: Victory" - }, - SC2Campaign.PROLOGUE: { - SC2Mission.GHOSTS_IN_THE_FOG: "Ghosts in the Fog: Victory" - }, - SC2Campaign.LOTV: { - SC2Mission.THE_HOST: "The Host: Victory", - SC2Mission.TEMPLAR_S_CHARGE: "Templar's Charge: Victory" - }, - SC2Campaign.EPILOGUE: { - SC2Mission.AMON_S_FALL: "Amon's Fall: Victory", - SC2Mission.INTO_THE_VOID: "Into the Void: Victory", - SC2Mission.THE_ESSENCE_OF_ETERNITY: "The Essence of Eternity: Victory", - }, - SC2Campaign.NCO: { - SC2Mission.FLASHPOINT: "Flashpoint: Victory", - SC2Mission.DARK_SKIES: "Dark Skies: Victory", - SC2Mission.NIGHT_TERRORS: "Night Terrors: Victory", - SC2Mission.TROUBLE_IN_PARADISE: "Trouble In Paradise: Victory" - } -} - -campaign_race_exceptions: Dict[SC2Mission, SC2Race] = { - SC2Mission.WITH_FRIENDS_LIKE_THESE: SC2Race.TERRAN -} - - -def get_goal_location(mission: SC2Mission) -> Union[str, None]: - """ - - :param mission: - :return: Goal location assigned to the goal mission - """ - campaign = mission.campaign - primary_campaign_goal = campaign_final_mission_locations[campaign] - if primary_campaign_goal is not None: - if primary_campaign_goal.mission == mission: - return primary_campaign_goal.location - - campaign_alt_goals = campaign_alt_final_mission_locations[campaign] - if campaign_alt_goals is not None and mission in campaign_alt_goals: - return campaign_alt_goals.get(mission) - - return mission.mission_name + ": Victory" - - -def get_campaign_potential_goal_missions(campaign: SC2Campaign) -> List[SC2Mission]: - """ - - :param campaign: - :return: All missions that can be the campaign's goal - """ - missions: List[SC2Mission] = list() - primary_goal_mission = campaign_final_mission_locations[campaign] - if primary_goal_mission is not None: - missions.append(primary_goal_mission.mission) - alt_goal_locations = campaign_alt_final_mission_locations[campaign] - if alt_goal_locations is not None: - for mission in alt_goal_locations.keys(): - missions.append(mission) - - return missions - - -def get_no_build_missions() -> List[SC2Mission]: - return [mission for mission in SC2Mission if not mission.build] diff --git a/worlds/sc2/Options.py b/worlds/sc2/Options.py deleted file mode 100644 index 88febb7096..0000000000 --- a/worlds/sc2/Options.py +++ /dev/null @@ -1,908 +0,0 @@ -from dataclasses import dataclass, fields, Field -from typing import FrozenSet, Union, Set - -from Options import Choice, Toggle, DefaultOnToggle, ItemSet, OptionSet, Range, PerGameCommonOptions -from .MissionTables import SC2Campaign, SC2Mission, lookup_name_to_mission, MissionPools, get_no_build_missions, \ - campaign_mission_table -from worlds.AutoWorld import World - - -class GameDifficulty(Choice): - """ - The difficulty of the campaign, affects enemy AI, starting units, and game speed. - - For those unfamiliar with the Archipelago randomizer, the recommended settings are one difficulty level - lower than the vanilla game - """ - display_name = "Game Difficulty" - option_casual = 0 - option_normal = 1 - option_hard = 2 - option_brutal = 3 - default = 1 - - -class GameSpeed(Choice): - """Optional setting to override difficulty-based game speed.""" - display_name = "Game Speed" - option_default = 0 - option_slower = 1 - option_slow = 2 - option_normal = 3 - option_fast = 4 - option_faster = 5 - default = option_default - - -class DisableForcedCamera(Toggle): - """ - Prevents the game from moving or locking the camera without the player's consent. - """ - display_name = "Disable Forced Camera Movement" - - -class SkipCutscenes(Toggle): - """ - Skips all cutscenes and prevents dialog from blocking progress. - """ - display_name = "Skip Cutscenes" - - -class AllInMap(Choice): - """Determines what version of All-In (WoL final map) that will be generated for the campaign.""" - display_name = "All In Map" - option_ground = 0 - option_air = 1 - - -class MissionOrder(Choice): - """ - Determines the order the missions are played in. The last three mission orders end in a random mission. - Vanilla (83 total if all campaigns enabled): Keeps the standard mission order and branching from the vanilla Campaigns. - Vanilla Shuffled (83 total if all campaigns enabled): Keeps same branching paths from the vanilla Campaigns but randomizes the order of missions within. - Mini Campaign (47 total if all campaigns enabled): Shorter version of the campaign with randomized missions and optional branches. - Medium Grid (16): A 4x4 grid of random missions. Start at the top-left and forge a path towards bottom-right mission to win. - Mini Grid (9): A 3x3 version of Grid. Complete the bottom-right mission to win. - Blitz (12): 12 random missions that open up very quickly. Complete the bottom-right mission to win. - Gauntlet (7): Linear series of 7 random missions to complete the campaign. - Mini Gauntlet (4): Linear series of 4 random missions to complete the campaign. - Tiny Grid (4): A 2x2 version of Grid. Complete the bottom-right mission to win. - Grid (variable): A grid that will resize to use all non-excluded missions. Corners may be omitted to make the grid more square. Complete the bottom-right mission to win. - """ - display_name = "Mission Order" - option_vanilla = 0 - option_vanilla_shuffled = 1 - option_mini_campaign = 2 - option_medium_grid = 3 - option_mini_grid = 4 - option_blitz = 5 - option_gauntlet = 6 - option_mini_gauntlet = 7 - option_tiny_grid = 8 - option_grid = 9 - - -class MaximumCampaignSize(Range): - """ - Sets an upper bound on how many missions to include when a variable-size mission order is selected. - If a set-size mission order is selected, does nothing. - """ - display_name = "Maximum Campaign Size" - range_start = 1 - range_end = 83 - default = 83 - - -class GridTwoStartPositions(Toggle): - """ - If turned on and 'grid' mission order is selected, removes a mission from the starting - corner sets the adjacent two missions as the starter missions. - """ - display_name = "Start with two unlocked missions on grid" - default = Toggle.option_false - - -class ColorChoice(Choice): - option_white = 0 - option_red = 1 - option_blue = 2 - option_teal = 3 - option_purple = 4 - option_yellow = 5 - option_orange = 6 - option_green = 7 - option_light_pink = 8 - option_violet = 9 - option_light_grey = 10 - option_dark_green = 11 - option_brown = 12 - option_light_green = 13 - option_dark_grey = 14 - option_pink = 15 - option_rainbow = 16 - option_default = 17 - default = option_default - - -class PlayerColorTerranRaynor(ColorChoice): - """Determines in-game team color for playable Raynor's Raiders (Terran) factions.""" - display_name = "Terran Player Color (Raynor)" - - -class PlayerColorProtoss(ColorChoice): - """Determines in-game team color for playable Protoss factions.""" - display_name = "Protoss Player Color" - - -class PlayerColorZerg(ColorChoice): - """Determines in-game team color for playable Zerg factions before Kerrigan becomes Primal Kerrigan.""" - display_name = "Zerg Player Color" - - -class PlayerColorZergPrimal(ColorChoice): - """Determines in-game team color for playable Zerg factions after Kerrigan becomes Primal Kerrigan.""" - display_name = "Zerg Player Color (Primal)" - - -class EnableWolMissions(DefaultOnToggle): - """ - Enables missions from main Wings of Liberty campaign. - """ - display_name = "Enable Wings of Liberty missions" - - -class EnableProphecyMissions(DefaultOnToggle): - """ - Enables missions from Prophecy mini-campaign. - """ - display_name = "Enable Prophecy missions" - - -class EnableHotsMissions(DefaultOnToggle): - """ - Enables missions from Heart of the Swarm campaign. - """ - display_name = "Enable Heart of the Swarm missions" - - -class EnableLotVPrologueMissions(DefaultOnToggle): - """ - Enables missions from Prologue campaign. - """ - display_name = "Enable Prologue (Legacy of the Void) missions" - - -class EnableLotVMissions(DefaultOnToggle): - """ - Enables missions from Legacy of the Void campaign. - """ - display_name = "Enable Legacy of the Void (main campaign) missions" - - -class EnableEpilogueMissions(DefaultOnToggle): - """ - Enables missions from Epilogue campaign. - These missions are considered very hard. - - Enabling Wings of Liberty, Heart of the Swarm and Legacy of the Void is strongly recommended in order to play Epilogue. - Not recommended for short mission orders. - See also: Exclude Very Hard Missions - """ - display_name = "Enable Epilogue missions" - - -class EnableNCOMissions(DefaultOnToggle): - """ - Enables missions from Nova Covert Ops campaign. - - Note: For best gameplay experience it's recommended to also enable Wings of Liberty campaign. - """ - display_name = "Enable Nova Covert Ops missions" - - -class ShuffleCampaigns(DefaultOnToggle): - """ - Shuffles the missions between campaigns if enabled. - Only available for Vanilla Shuffled and Mini Campaign mission order - """ - display_name = "Shuffle Campaigns" - - -class ShuffleNoBuild(DefaultOnToggle): - """ - Determines if the no-build missions are included in the shuffle. - If turned off, the no-build missions will not appear. Has no effect for Vanilla mission order. - """ - display_name = "Shuffle No-Build Missions" - - -class StarterUnit(Choice): - """ - Unlocks a random unit at the start of the game. - - Off: No units are provided, the first unit must be obtained from the randomizer - Balanced: A unit that doesn't give the player too much power early on is given - Any Starter Unit: Any starter unit can be given - """ - display_name = "Starter Unit" - option_off = 0 - option_balanced = 1 - option_any_starter_unit = 2 - - -class RequiredTactics(Choice): - """ - Determines the maximum tactical difficulty of the world (separate from mission difficulty). Higher settings - increase randomness. - - Standard: All missions can be completed with good micro and macro. - Advanced: Completing missions may require relying on starting units and micro-heavy units. - No Logic: Units and upgrades may be placed anywhere. LIKELY TO RENDER THE RUN IMPOSSIBLE ON HARDER DIFFICULTIES! - Locks Grant Story Tech option to true. - """ - display_name = "Required Tactics" - option_standard = 0 - option_advanced = 1 - option_no_logic = 2 - - -class GenericUpgradeMissions(Range): - """Determines the percentage of missions in the mission order that must be completed before - level 1 of all weapon and armor upgrades is unlocked. Level 2 upgrades require double the amount of missions, - and level 3 requires triple the amount. The required amounts are always rounded down. - If set to 0, upgrades are instead added to the item pool and must be found to be used.""" - display_name = "Generic Upgrade Missions" - range_start = 0 - range_end = 100 - default = 0 - - -class GenericUpgradeResearch(Choice): - """Determines how weapon and armor upgrades affect missions once unlocked. - - Vanilla: Upgrades must be researched as normal. - Auto In No-Build: In No-Build missions, upgrades are automatically researched. - In all other missions, upgrades must be researched as normal. - Auto In Build: In No-Build missions, upgrades are unavailable as normal. - In all other missions, upgrades are automatically researched. - Always Auto: Upgrades are automatically researched in all missions.""" - display_name = "Generic Upgrade Research" - option_vanilla = 0 - option_auto_in_no_build = 1 - option_auto_in_build = 2 - option_always_auto = 3 - - -class GenericUpgradeItems(Choice): - """Determines how weapon and armor upgrades are split into items. All options produce 3 levels of each item. - Does nothing if upgrades are unlocked by completed mission counts. - - Individual Items: All weapon and armor upgrades are each an item, - resulting in 18 total upgrade items for Terran and 15 total items for Zerg and Protoss each. - Bundle Weapon And Armor: All types of weapon upgrades are one item per race, - and all types of armor upgrades are one item per race, - resulting in 18 total items. - Bundle Unit Class: Weapon and armor upgrades are merged, - but upgrades are bundled separately for each race: - Infantry, Vehicle, and Starship upgrades for Terran (9 items), - Ground and Flyer upgrades for Zerg (6 items), - Ground and Air upgrades for Protoss (6 items), - resulting in 21 total items. - Bundle All: All weapon and armor upgrades are one item per race, - resulting in 9 total items.""" - display_name = "Generic Upgrade Items" - option_individual_items = 0 - option_bundle_weapon_and_armor = 1 - option_bundle_unit_class = 2 - option_bundle_all = 3 - - -class NovaCovertOpsItems(Toggle): - """ - If turned on, the equipment upgrades from Nova Covert Ops may be present in the world. - - If Nova Covert Ops campaign is enabled, this option is locked to be turned on. - """ - display_name = "Nova Covert Ops Items" - default = Toggle.option_true - - -class BroodWarItems(Toggle): - """If turned on, returning items from StarCraft: Brood War may appear in the world.""" - display_name = "Brood War Items" - default = Toggle.option_true - - -class ExtendedItems(Toggle): - """If turned on, original items that did not appear in Campaign mode may appear in the world.""" - display_name = "Extended Items" - default = Toggle.option_true - - -# Current maximum number of upgrades for a unit -MAX_UPGRADES_OPTION = 12 - - -class EnsureGenericItems(Range): - """ - Specifies a minimum percentage of the generic item pool that will be present for the slot. - The generic item pool is the pool of all generically useful items after all exclusions. - Generically-useful items include: Worker upgrades, Building upgrades, economy upgrades, - Mercenaries, Kerrigan levels and abilities, and Spear of Adun abilities - Increasing this percentage will make units less common. - """ - display_name = "Ensure Generic Items" - range_start = 0 - range_end = 100 - default = 25 - - -class MinNumberOfUpgrades(Range): - """ - Set a minimum to the number of upgrades a unit/structure can have. - Note that most units have 4 or 6 upgrades. - If a unit has fewer upgrades than the minimum, it will have all of its upgrades. - - Doesn't affect shared unit upgrades. - """ - display_name = "Minimum number of upgrades per unit/structure" - range_start = 0 - range_end = MAX_UPGRADES_OPTION - default = 2 - - -class MaxNumberOfUpgrades(Range): - """ - Set a maximum to the number of upgrades a unit/structure can have. -1 is used to define unlimited. - Note that most unit have 4 to 6 upgrades. - - Doesn't affect shared unit upgrades. - """ - display_name = "Maximum number of upgrades per unit/structure" - range_start = -1 - range_end = MAX_UPGRADES_OPTION - default = -1 - - -class KerriganPresence(Choice): - """ - Determines whether Kerrigan is playable outside of missions that require her. - - Vanilla: Kerrigan is playable as normal, appears in the same missions as in vanilla game. - Not Present: Kerrigan is not playable, unless the mission requires her to be present. Other hero units stay playable, - and locations normally requiring Kerrigan can be checked by any unit. - Kerrigan level items, active abilities and passive abilities affecting her will not appear. - In missions where the Kerrigan unit is required, story abilities are given in same way as Grant Story Tech is set to true - Not Present And No Passives: In addition to the above, Kerrigan's passive abilities affecting other units (such as Twin Drones) will not appear. - - Note: Always set to "Not Present" if Heart of the Swarm campaign is disabled. - """ - display_name = "Kerrigan Presence" - option_vanilla = 0 - option_not_present = 1 - option_not_present_and_no_passives = 2 - - -class KerriganLevelsPerMissionCompleted(Range): - """ - Determines how many levels Kerrigan gains when a mission is beaten. - - NOTE: Setting this too low can result in generation failures if The Infinite Cycle or Supreme are in the mission pool. - """ - display_name = "Levels Per Mission Beaten" - range_start = 0 - range_end = 20 - default = 0 - - -class KerriganLevelsPerMissionCompletedCap(Range): - """ - Limits how many total levels Kerrigan can gain from beating missions. This does not affect levels gained from items. - Set to -1 to disable this limit. - - NOTE: The following missions have these level requirements: - Supreme: 35 - The Infinite Cycle: 70 - See Grant Story Levels for more details. - """ - display_name = "Levels Per Mission Beaten Cap" - range_start = -1 - range_end = 140 - default = -1 - - -class KerriganLevelItemSum(Range): - """ - Determines the sum of the level items in the world. This does not affect levels gained from beating missions. - - NOTE: The following missions have these level requirements: - Supreme: 35 - The Infinite Cycle: 70 - See Grant Story Levels for more details. - """ - display_name = "Kerrigan Level Item Sum" - range_start = 0 - range_end = 140 - default = 70 - - -class KerriganLevelItemDistribution(Choice): - """Determines the amount and size of Kerrigan level items. - - Vanilla: Uses the distribution in the vanilla campaign. - This entails 32 individual levels and 6 packs of varying sizes. - This distribution always adds up to 70, ignoring the Level Item Sum setting. - Smooth: Uses a custom, condensed distribution of 10 items between sizes 4 and 10, - intended to fit more levels into settings with little room for filler while keeping some variance in level gains. - This distribution always adds up to 70, ignoring the Level Item Sum setting. - Size 70: Uses items worth 70 levels each. - Size 35: Uses items worth 35 levels each. - Size 14: Uses items worth 14 levels each. - Size 10: Uses items worth 10 levels each. - Size 7: Uses items worth 7 levels each. - Size 5: Uses items worth 5 levels each. - Size 2: Uses items worth 2 level eachs. - Size 1: Uses individual levels. As there are not enough locations in the game for this distribution, - this will result in a greatly reduced total level, and is likely to remove many other items.""" - display_name = "Kerrigan Level Item Distribution" - option_vanilla = 0 - option_smooth = 1 - option_size_70 = 2 - option_size_35 = 3 - option_size_14 = 4 - option_size_10 = 5 - option_size_7 = 6 - option_size_5 = 7 - option_size_2 = 8 - option_size_1 = 9 - default = option_smooth - - -class KerriganTotalLevelCap(Range): - """ - Limits how many total levels Kerrigan can gain from any source. Depending on your other settings, - there may be more levels available in the world, but they will not affect Kerrigan. - Set to -1 to disable this limit. - - NOTE: The following missions have these level requirements: - Supreme: 35 - The Infinite Cycle: 70 - See Grant Story Levels for more details. - """ - display_name = "Total Level Cap" - range_start = -1 - range_end = 140 - default = -1 - - -class StartPrimaryAbilities(Range): - """Number of Primary Abilities (Kerrigan Tier 1, 2, and 4) to start the game with. - If set to 4, a Tier 7 ability is also included.""" - display_name = "Starting Primary Abilities" - range_start = 0 - range_end = 4 - default = 0 - - -class KerriganPrimalStatus(Choice): - """Determines when Kerrigan appears in her Primal Zerg form. - This greatly increases her energy regeneration. - - Vanilla: Kerrigan is human in missions that canonically appear before The Crucible, - and zerg thereafter. - Always Zerg: Kerrigan is always zerg. - Always Human: Kerrigan is always human. - Level 35: Kerrigan is human until reaching level 35, and zerg thereafter. - Half Completion: Kerrigan is human until half of the missions in the world are completed, - and zerg thereafter. - Item: Kerrigan's Primal Form is an item. She is human until it is found, and zerg thereafter.""" - display_name = "Kerrigan Primal Status" - option_vanilla = 0 - option_always_zerg = 1 - option_always_human = 2 - option_level_35 = 3 - option_half_completion = 4 - option_item = 5 - - -class SpearOfAdunPresence(Choice): - """ - Determines in which missions Spear of Adun calldowns will be available. - Affects only abilities used from Spear of Adun top menu. - - Not Present: Spear of Adun calldowns are unavailable. - LotV Protoss: Spear of Adun calldowns are only available in LotV main campaign - Protoss: Spear od Adun calldowns are available in any Protoss mission - Everywhere: Spear od Adun calldowns are available in any mission of any race - """ - display_name = "Spear of Adun Presence" - option_not_present = 0 - option_lotv_protoss = 1 - option_protoss = 2 - option_everywhere = 3 - default = option_lotv_protoss - - # Fix case - @classmethod - def get_option_name(cls, value: int) -> str: - if value == SpearOfAdunPresence.option_lotv_protoss: - return "LotV Protoss" - else: - return super().get_option_name(value) - - -class SpearOfAdunPresentInNoBuild(Toggle): - """ - Determines if Spear of Adun calldowns are available in no-build missions. - - If turned on, Spear of Adun calldown powers are available in missions specified under "Spear of Adun Presence". - If turned off, Spear of Adun calldown powers are unavailable in all no-build missions - """ - display_name = "Spear of Adun Present in No-Build" - - -class SpearOfAdunAutonomouslyCastAbilityPresence(Choice): - """ - Determines availability of Spear of Adun powers, that are autonomously cast. - Affects abilities like Reconstruction Beam or Overwatch - - Not Presents: Autocasts are not available. - LotV Protoss: Spear of Adun autocasts are only available in LotV main campaign - Protoss: Spear od Adun autocasts are available in any Protoss mission - Everywhere: Spear od Adun autocasts are available in any mission of any race - """ - display_name = "Spear of Adun Autonomously Cast Powers Presence" - option_not_present = 0 - option_lotv_protoss = 1 - option_protoss = 2 - option_everywhere = 3 - default = option_lotv_protoss - - # Fix case - @classmethod - def get_option_name(cls, value: int) -> str: - if value == SpearOfAdunPresence.option_lotv_protoss: - return "LotV Protoss" - else: - return super().get_option_name(value) - - -class SpearOfAdunAutonomouslyCastPresentInNoBuild(Toggle): - """ - Determines if Spear of Adun autocasts are available in no-build missions. - - If turned on, Spear of Adun autocasts are available in missions specified under "Spear of Adun Autonomously Cast Powers Presence". - If turned off, Spear of Adun autocasts are unavailable in all no-build missions - """ - display_name = "Spear of Adun Autonomously Cast Powers Present in No-Build" - - -class GrantStoryTech(Toggle): - """ - If set true, grants special tech required for story mission completion for duration of the mission. - Otherwise, you need to find these tech by a normal means as items. - Affects story missions like Back in the Saddle and Supreme - - Locked to true if Required Tactics is set to no logic. - """ - display_name = "Grant Story Tech" - - -class GrantStoryLevels(Choice): - """ - If enabled, grants Kerrigan the required minimum levels for the following missions: - Supreme: 35 - The Infinite Cycle: 70 - The bonus levels only apply during the listed missions, and can exceed the Total Level Cap. - - If disabled, either of these missions is included, and there are not enough levels in the world, generation may fail. - To prevent this, either increase the amount of levels in the world, or enable this option. - - If disabled and Required Tactics is set to no logic, this option is forced to Minimum. - - Disabled: Kerrigan does not get bonus levels for these missions, - instead the levels must be gained from items or beating missions. - Additive: Kerrigan gains bonus levels equal to the mission's required level. - Minimum: Kerrigan is either at her real level, or at the mission's required level, - depending on which is higher. - """ - display_name = "Grant Story Levels" - option_disabled = 0 - option_additive = 1 - option_minimum = 2 - default = option_minimum - - -class TakeOverAIAllies(Toggle): - """ - On maps supporting this feature allows you to take control over an AI Ally. - """ - display_name = "Take Over AI Allies" - - -class LockedItems(ItemSet): - """Guarantees that these items will be unlockable""" - display_name = "Locked Items" - - -class ExcludedItems(ItemSet): - """Guarantees that these items will not be unlockable""" - display_name = "Excluded Items" - - -class ExcludedMissions(OptionSet): - """Guarantees that these missions will not appear in the campaign - Doesn't apply to vanilla mission order. - It may be impossible to build a valid campaign if too many missions are excluded.""" - display_name = "Excluded Missions" - valid_keys = {mission.mission_name for mission in SC2Mission} - - -class ExcludeVeryHardMissions(Choice): - """ - Excludes Very Hard missions outside of Epilogue campaign (All-In, Salvation, and all Epilogue missions are considered Very Hard). - Doesn't apply to "Vanilla" mission order. - - Default: Not excluded for mission orders "Vanilla Shuffled" or "Grid" with Maximum Campaign Size >= 20, - excluded for any other order - Yes: Non-Epilogue Very Hard missions are excluded and won't be generated - No: Non-Epilogue Very Hard missions can appear normally. Not recommended for too short mission orders. - - See also: Excluded Missions, Enable Epilogue Missions, Maximum Campaign Size - """ - display_name = "Exclude Very Hard Missions" - option_default = 0 - option_true = 1 - option_false = 2 - - @classmethod - def get_option_name(cls, value): - return ["Default", "Yes", "No"][int(value)] - - -class LocationInclusion(Choice): - option_enabled = 0 - option_resources = 1 - option_disabled = 2 - - -class VanillaLocations(LocationInclusion): - """ - Enables or disables item rewards for completing vanilla objectives. - Vanilla objectives are bonus objectives from the vanilla game, - along with some additional objectives to balance the missions. - Enable these locations for a balanced experience. - - Enabled: All locations fitting into this do their normal rewards - Resources: Forces these locations to contain Starting Resources - Disabled: Removes item rewards from these locations. - - Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. - See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) - """ - display_name = "Vanilla Locations" - - -class ExtraLocations(LocationInclusion): - """ - Enables or disables item rewards for mission progress and minor objectives. - This includes mandatory mission objectives, - collecting reinforcements and resource pickups, - destroying structures, and overcoming minor challenges. - Enables these locations to add more checks and items to your world. - - Enabled: All locations fitting into this do their normal rewards - Resources: Forces these locations to contain Starting Resources - Disabled: Removes item rewards from these locations. - - Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. - See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) - """ - display_name = "Extra Locations" - - -class ChallengeLocations(LocationInclusion): - """ - Enables or disables item rewards for completing challenge tasks. - Challenges are tasks that are more difficult than completing the mission, and are often based on achievements. - You might be required to visit the same mission later after getting stronger in order to finish these tasks. - Enable these locations to increase the difficulty of completing the multiworld. - - Enabled: All locations fitting into this do their normal rewards - Resources: Forces these locations to contain Starting Resources - Disabled: Removes item rewards from these locations. - - Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. - See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) - """ - display_name = "Challenge Locations" - - -class MasteryLocations(LocationInclusion): - """ - Enables or disables item rewards for overcoming especially difficult challenges. - These challenges are often based on Mastery achievements and Feats of Strength. - Enable these locations to add the most difficult checks to the world. - - Enabled: All locations fitting into this do their normal rewards - Resources: Forces these locations to contain Starting Resources - Disabled: Removes item rewards from these locations. - - Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. - See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) - """ - display_name = "Mastery Locations" - - -class MineralsPerItem(Range): - """ - Configures how many minerals are given per resource item. - """ - display_name = "Minerals Per Item" - range_start = 0 - range_end = 500 - default = 25 - - -class VespenePerItem(Range): - """ - Configures how much vespene gas is given per resource item. - """ - display_name = "Vespene Per Item" - range_start = 0 - range_end = 500 - default = 25 - - -class StartingSupplyPerItem(Range): - """ - Configures how much starting supply per is given per item. - """ - display_name = "Starting Supply Per Item" - range_start = 0 - range_end = 200 - default = 5 - - -@dataclass -class Starcraft2Options(PerGameCommonOptions): - game_difficulty: GameDifficulty - game_speed: GameSpeed - disable_forced_camera: DisableForcedCamera - skip_cutscenes: SkipCutscenes - all_in_map: AllInMap - mission_order: MissionOrder - maximum_campaign_size: MaximumCampaignSize - grid_two_start_positions: GridTwoStartPositions - player_color_terran_raynor: PlayerColorTerranRaynor - player_color_protoss: PlayerColorProtoss - player_color_zerg: PlayerColorZerg - player_color_zerg_primal: PlayerColorZergPrimal - enable_wol_missions: EnableWolMissions - enable_prophecy_missions: EnableProphecyMissions - enable_hots_missions: EnableHotsMissions - enable_lotv_prologue_missions: EnableLotVPrologueMissions - enable_lotv_missions: EnableLotVMissions - enable_epilogue_missions: EnableEpilogueMissions - enable_nco_missions: EnableNCOMissions - shuffle_campaigns: ShuffleCampaigns - shuffle_no_build: ShuffleNoBuild - starter_unit: StarterUnit - required_tactics: RequiredTactics - ensure_generic_items: EnsureGenericItems - min_number_of_upgrades: MinNumberOfUpgrades - max_number_of_upgrades: MaxNumberOfUpgrades - generic_upgrade_missions: GenericUpgradeMissions - generic_upgrade_research: GenericUpgradeResearch - generic_upgrade_items: GenericUpgradeItems - kerrigan_presence: KerriganPresence - kerrigan_levels_per_mission_completed: KerriganLevelsPerMissionCompleted - kerrigan_levels_per_mission_completed_cap: KerriganLevelsPerMissionCompletedCap - kerrigan_level_item_sum: KerriganLevelItemSum - kerrigan_level_item_distribution: KerriganLevelItemDistribution - kerrigan_total_level_cap: KerriganTotalLevelCap - start_primary_abilities: StartPrimaryAbilities - kerrigan_primal_status: KerriganPrimalStatus - spear_of_adun_presence: SpearOfAdunPresence - spear_of_adun_present_in_no_build: SpearOfAdunPresentInNoBuild - spear_of_adun_autonomously_cast_ability_presence: SpearOfAdunAutonomouslyCastAbilityPresence - spear_of_adun_autonomously_cast_present_in_no_build: SpearOfAdunAutonomouslyCastPresentInNoBuild - grant_story_tech: GrantStoryTech - grant_story_levels: GrantStoryLevels - take_over_ai_allies: TakeOverAIAllies - locked_items: LockedItems - excluded_items: ExcludedItems - excluded_missions: ExcludedMissions - exclude_very_hard_missions: ExcludeVeryHardMissions - nco_items: NovaCovertOpsItems - bw_items: BroodWarItems - ext_items: ExtendedItems - vanilla_locations: VanillaLocations - extra_locations: ExtraLocations - challenge_locations: ChallengeLocations - mastery_locations: MasteryLocations - minerals_per_item: MineralsPerItem - vespene_per_item: VespenePerItem - starting_supply_per_item: StartingSupplyPerItem - - -def get_option_value(world: World, name: str) -> Union[int, FrozenSet]: - if world is None: - field: Field = [class_field for class_field in fields(Starcraft2Options) if class_field.name == name][0] - return field.type.default - - player_option = getattr(world.options, name) - - return player_option.value - - -def get_enabled_campaigns(world: World) -> Set[SC2Campaign]: - enabled_campaigns = set() - if get_option_value(world, "enable_wol_missions"): - enabled_campaigns.add(SC2Campaign.WOL) - if get_option_value(world, "enable_prophecy_missions"): - enabled_campaigns.add(SC2Campaign.PROPHECY) - if get_option_value(world, "enable_hots_missions"): - enabled_campaigns.add(SC2Campaign.HOTS) - if get_option_value(world, "enable_lotv_prologue_missions"): - enabled_campaigns.add(SC2Campaign.PROLOGUE) - if get_option_value(world, "enable_lotv_missions"): - enabled_campaigns.add(SC2Campaign.LOTV) - if get_option_value(world, "enable_epilogue_missions"): - enabled_campaigns.add(SC2Campaign.EPILOGUE) - if get_option_value(world, "enable_nco_missions"): - enabled_campaigns.add(SC2Campaign.NCO) - return enabled_campaigns - - -def get_disabled_campaigns(world: World) -> Set[SC2Campaign]: - all_campaigns = set(SC2Campaign) - enabled_campaigns = get_enabled_campaigns(world) - disabled_campaigns = all_campaigns.difference(enabled_campaigns) - disabled_campaigns.remove(SC2Campaign.GLOBAL) - return disabled_campaigns - - -def get_excluded_missions(world: World) -> Set[SC2Mission]: - mission_order_type = get_option_value(world, "mission_order") - excluded_mission_names = get_option_value(world, "excluded_missions") - shuffle_no_build = get_option_value(world, "shuffle_no_build") - disabled_campaigns = get_disabled_campaigns(world) - - excluded_missions: Set[SC2Mission] = set([lookup_name_to_mission[name] for name in excluded_mission_names]) - - # Excluding Very Hard missions depending on options - if (get_option_value(world, "exclude_very_hard_missions") == ExcludeVeryHardMissions.option_true - ) or ( - get_option_value(world, "exclude_very_hard_missions") == ExcludeVeryHardMissions.option_default - and ( - mission_order_type not in [MissionOrder.option_vanilla_shuffled, MissionOrder.option_grid] - or ( - mission_order_type == MissionOrder.option_grid - and get_option_value(world, "maximum_campaign_size") < 20 - ) - ) - ): - excluded_missions = excluded_missions.union( - [mission for mission in SC2Mission if - mission.pool == MissionPools.VERY_HARD and mission.campaign != SC2Campaign.EPILOGUE] - ) - # Omitting No-Build missions if not shuffling no-build - if not shuffle_no_build: - excluded_missions = excluded_missions.union(get_no_build_missions()) - # Omitting missions not in enabled campaigns - for campaign in disabled_campaigns: - excluded_missions = excluded_missions.union(campaign_mission_table[campaign]) - - return excluded_missions - - -campaign_depending_orders = [ - MissionOrder.option_vanilla, - MissionOrder.option_vanilla_shuffled, - MissionOrder.option_mini_campaign -] - -kerrigan_unit_available = [ - KerriganPresence.option_vanilla, -] \ No newline at end of file diff --git a/worlds/sc2/PoolFilter.py b/worlds/sc2/PoolFilter.py deleted file mode 100644 index f5f6faa96d..0000000000 --- a/worlds/sc2/PoolFilter.py +++ /dev/null @@ -1,661 +0,0 @@ -from typing import Callable, Dict, List, Set, Union, Tuple, Optional -from BaseClasses import Item, Location -from .Items import get_full_item_list, spider_mine_sources, second_pass_placeable_items, progressive_if_nco, \ - progressive_if_ext, spear_of_adun_calldowns, spear_of_adun_castable_passives, nova_equipment -from .MissionTables import mission_orders, MissionInfo, MissionPools, \ - get_campaign_goal_priority, campaign_final_mission_locations, campaign_alt_final_mission_locations, \ - SC2Campaign, SC2Race, SC2CampaignGoalPriority, SC2Mission -from .Options import get_option_value, MissionOrder, \ - get_enabled_campaigns, get_disabled_campaigns, RequiredTactics, kerrigan_unit_available, GrantStoryTech, \ - TakeOverAIAllies, SpearOfAdunPresence, SpearOfAdunAutonomouslyCastAbilityPresence, campaign_depending_orders, \ - ShuffleCampaigns, get_excluded_missions, ShuffleNoBuild, ExtraLocations, GrantStoryLevels -from . import ItemNames -from worlds.AutoWorld import World - -# Items with associated upgrades -UPGRADABLE_ITEMS = {item.parent_item for item in get_full_item_list().values() if item.parent_item} - -BARRACKS_UNITS = { - ItemNames.MARINE, ItemNames.MEDIC, ItemNames.FIREBAT, ItemNames.MARAUDER, - ItemNames.REAPER, ItemNames.GHOST, ItemNames.SPECTRE, ItemNames.HERC, -} -FACTORY_UNITS = { - ItemNames.HELLION, ItemNames.VULTURE, ItemNames.GOLIATH, ItemNames.DIAMONDBACK, - ItemNames.SIEGE_TANK, ItemNames.THOR, ItemNames.PREDATOR, ItemNames.WIDOW_MINE, - ItemNames.CYCLONE, ItemNames.WARHOUND, -} -STARPORT_UNITS = { - ItemNames.MEDIVAC, ItemNames.WRAITH, ItemNames.VIKING, ItemNames.BANSHEE, - ItemNames.BATTLECRUISER, ItemNames.HERCULES, ItemNames.SCIENCE_VESSEL, ItemNames.RAVEN, - ItemNames.LIBERATOR, ItemNames.VALKYRIE, -} - - -def filter_missions(world: World) -> Dict[MissionPools, List[SC2Mission]]: - - """ - Returns a semi-randomly pruned tuple of no-build, easy, medium, and hard mission sets - """ - world: World = world - mission_order_type = get_option_value(world, "mission_order") - shuffle_no_build = get_option_value(world, "shuffle_no_build") - enabled_campaigns = get_enabled_campaigns(world) - grant_story_tech = get_option_value(world, "grant_story_tech") == GrantStoryTech.option_true - grant_story_levels = get_option_value(world, "grant_story_levels") != GrantStoryLevels.option_disabled - extra_locations = get_option_value(world, "extra_locations") - excluded_missions: Set[SC2Mission] = get_excluded_missions(world) - mission_pools: Dict[MissionPools, List[SC2Mission]] = {} - for mission in SC2Mission: - if not mission_pools.get(mission.pool): - mission_pools[mission.pool] = list() - mission_pools[mission.pool].append(mission) - # A bit of safeguard: - for mission_pool in MissionPools: - if not mission_pools.get(mission_pool): - mission_pools[mission_pool] = [] - - if mission_order_type == MissionOrder.option_vanilla: - # Vanilla uses the entire mission pool - goal_priorities: Dict[SC2Campaign, SC2CampaignGoalPriority] = {campaign: get_campaign_goal_priority(campaign) for campaign in enabled_campaigns} - goal_level = max(goal_priorities.values()) - candidate_campaigns: List[SC2Campaign] = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level] - candidate_campaigns.sort(key=lambda it: it.id) - goal_campaign = world.random.choice(candidate_campaigns) - if campaign_final_mission_locations[goal_campaign] is not None: - mission_pools[MissionPools.FINAL] = [campaign_final_mission_locations[goal_campaign].mission] - else: - mission_pools[MissionPools.FINAL] = [list(campaign_alt_final_mission_locations[goal_campaign].keys())[0]] - remove_final_mission_from_other_pools(mission_pools) - return mission_pools - - # Finding the goal map - goal_mission: Optional[SC2Mission] = None - if mission_order_type in campaign_depending_orders: - # Prefer long campaigns over shorter ones and harder missions over easier ones - goal_priorities = {campaign: get_campaign_goal_priority(campaign, excluded_missions) for campaign in enabled_campaigns} - goal_level = max(goal_priorities.values()) - candidate_campaigns: List[SC2Campaign] = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level] - candidate_campaigns.sort(key=lambda it: it.id) - - goal_campaign = world.random.choice(candidate_campaigns) - primary_goal = campaign_final_mission_locations[goal_campaign] - if primary_goal is None or primary_goal.mission in excluded_missions: - # No primary goal or its mission is excluded - candidate_missions = list(campaign_alt_final_mission_locations[goal_campaign].keys()) - candidate_missions = [mission for mission in candidate_missions if mission not in excluded_missions] - if len(candidate_missions) == 0: - raise Exception("There are no valid goal missions. Please exclude fewer missions.") - goal_mission = world.random.choice(candidate_missions) - else: - goal_mission = primary_goal.mission - else: - # Find one of the missions with the hardest difficulty - available_missions: List[SC2Mission] = \ - [mission for mission in SC2Mission - if (mission not in excluded_missions and mission.campaign in enabled_campaigns)] - available_missions.sort(key=lambda it: it.id) - # Loop over pools, from hardest to easiest - for mission_pool in range(MissionPools.VERY_HARD, MissionPools.STARTER - 1, -1): - pool_missions: List[SC2Mission] = [mission for mission in available_missions if mission.pool == mission_pool] - if pool_missions: - goal_mission = world.random.choice(pool_missions) - break - if goal_mission is None: - raise Exception("There are no valid goal missions. Please exclude fewer missions.") - - # Excluding missions - for difficulty, mission_pool in mission_pools.items(): - mission_pools[difficulty] = [mission for mission in mission_pool if mission not in excluded_missions] - mission_pools[MissionPools.FINAL] = [goal_mission] - - # Mission pool changes - adv_tactics = get_option_value(world, "required_tactics") != RequiredTactics.option_standard - - def move_mission(mission: SC2Mission, current_pool, new_pool): - if mission in mission_pools[current_pool]: - mission_pools[current_pool].remove(mission) - mission_pools[new_pool].append(mission) - # WoL - if shuffle_no_build == ShuffleNoBuild.option_false or adv_tactics: - # Replacing No Build missions with Easy missions - # WoL - move_mission(SC2Mission.ZERO_HOUR, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.EVACUATION, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.DEVILS_PLAYGROUND, MissionPools.EASY, MissionPools.STARTER) - # LotV - move_mission(SC2Mission.THE_GROWING_SHADOW, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.THE_SPEAR_OF_ADUN, MissionPools.EASY, MissionPools.STARTER) - if extra_locations == ExtraLocations.option_enabled: - move_mission(SC2Mission.SKY_SHIELD, MissionPools.EASY, MissionPools.STARTER) - # Pushing this to Easy - move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY, MissionPools.MEDIUM, MissionPools.EASY) - if shuffle_no_build == ShuffleNoBuild.option_false: - # Pushing Outbreak to Normal, as it cannot be placed as the second mission on Build-Only - move_mission(SC2Mission.OUTBREAK, MissionPools.EASY, MissionPools.MEDIUM) - # Pushing extra Normal missions to Easy - move_mission(SC2Mission.ECHOES_OF_THE_FUTURE, MissionPools.MEDIUM, MissionPools.EASY) - move_mission(SC2Mission.CUTTHROAT, MissionPools.MEDIUM, MissionPools.EASY) - # Additional changes on Advanced Tactics - if adv_tactics: - # WoL - move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.SMASH_AND_GRAB, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.THE_MOEBIUS_FACTOR, MissionPools.MEDIUM, MissionPools.EASY) - move_mission(SC2Mission.WELCOME_TO_THE_JUNGLE, MissionPools.MEDIUM, MissionPools.EASY) - move_mission(SC2Mission.ENGINE_OF_DESTRUCTION, MissionPools.HARD, MissionPools.MEDIUM) - # LotV - move_mission(SC2Mission.AMON_S_REACH, MissionPools.EASY, MissionPools.STARTER) - # Prophecy needs to be adjusted on tiny grid - if enabled_campaigns == {SC2Campaign.PROPHECY} and mission_order_type == MissionOrder.option_tiny_grid: - move_mission(SC2Mission.A_SINISTER_TURN, MissionPools.MEDIUM, MissionPools.EASY) - # Prologue's only valid starter is the goal mission - if enabled_campaigns == {SC2Campaign.PROLOGUE} \ - or mission_order_type in campaign_depending_orders \ - and get_option_value(world, "shuffle_campaigns") == ShuffleCampaigns.option_false: - move_mission(SC2Mission.DARK_WHISPERS, MissionPools.EASY, MissionPools.STARTER) - # HotS - kerriganless = get_option_value(world, "kerrigan_presence") not in kerrigan_unit_available \ - or SC2Campaign.HOTS not in enabled_campaigns - if adv_tactics: - # Medium -> Easy - for mission in (SC2Mission.FIRE_IN_THE_SKY, SC2Mission.WAKING_THE_ANCIENT, SC2Mission.CONVICTION): - move_mission(mission, MissionPools.MEDIUM, MissionPools.EASY) - # Hard -> Medium - move_mission(SC2Mission.PHANTOMS_OF_THE_VOID, MissionPools.HARD, MissionPools.MEDIUM) - if not kerriganless: - # Additional starter mission assuming player starts with minimal anti-air - move_mission(SC2Mission.WAKING_THE_ANCIENT, MissionPools.EASY, MissionPools.STARTER) - if grant_story_tech: - # Additional starter mission if player is granted story tech - move_mission(SC2Mission.ENEMY_WITHIN, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.TEMPLAR_S_RETURN, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.THE_ESCAPE, MissionPools.MEDIUM, MissionPools.STARTER) - move_mission(SC2Mission.IN_THE_ENEMY_S_SHADOW, MissionPools.MEDIUM, MissionPools.STARTER) - if (grant_story_tech and grant_story_levels) or kerriganless: - # The player has, all the stuff he needs, provided under these settings - move_mission(SC2Mission.SUPREME, MissionPools.MEDIUM, MissionPools.STARTER) - move_mission(SC2Mission.THE_INFINITE_CYCLE, MissionPools.HARD, MissionPools.STARTER) - if get_option_value(world, "take_over_ai_allies") == TakeOverAIAllies.option_true: - move_mission(SC2Mission.HARBINGER_OF_OBLIVION, MissionPools.MEDIUM, MissionPools.STARTER) - if len(mission_pools[MissionPools.STARTER]) < 2 and not kerriganless or adv_tactics: - # Conditionally moving Easy missions to Starter - move_mission(SC2Mission.HARVEST_OF_SCREAMS, MissionPools.EASY, MissionPools.STARTER) - move_mission(SC2Mission.DOMINATION, MissionPools.EASY, MissionPools.STARTER) - if len(mission_pools[MissionPools.STARTER]) < 2: - move_mission(SC2Mission.TEMPLAR_S_RETURN, MissionPools.EASY, MissionPools.STARTER) - if len(mission_pools[MissionPools.STARTER]) + len(mission_pools[MissionPools.EASY]) < 2: - # Flashpoint needs just a few items at start but competent comp at the end - move_mission(SC2Mission.FLASHPOINT, MissionPools.HARD, MissionPools.EASY) - - remove_final_mission_from_other_pools(mission_pools) - return mission_pools - - -def remove_final_mission_from_other_pools(mission_pools: Dict[MissionPools, List[SC2Mission]]): - final_missions = mission_pools[MissionPools.FINAL] - for pool, missions in mission_pools.items(): - if pool == MissionPools.FINAL: - continue - for final_mission in final_missions: - while final_mission in missions: - missions.remove(final_mission) - - -def get_item_upgrades(inventory: List[Item], parent_item: Union[Item, str]) -> List[Item]: - item_name = parent_item.name if isinstance(parent_item, Item) else parent_item - return [ - inv_item for inv_item in inventory - if get_full_item_list()[inv_item.name].parent_item == item_name - ] - - -def get_item_quantity(item: Item, world: World): - if (not get_option_value(world, "nco_items")) \ - and SC2Campaign.NCO in get_disabled_campaigns(world) \ - and item.name in progressive_if_nco: - return 1 - if (not get_option_value(world, "ext_items")) \ - and item.name in progressive_if_ext: - return 1 - return get_full_item_list()[item.name].quantity - - -def copy_item(item: Item): - return Item(item.name, item.classification, item.code, item.player) - - -def num_missions(world: World) -> int: - mission_order_type = get_option_value(world, "mission_order") - if mission_order_type != MissionOrder.option_grid: - mission_order = mission_orders[mission_order_type]() - misssions = [mission for campaign in mission_order for mission in mission_order[campaign]] - return len(misssions) - 1 # Menu - else: - mission_pools = filter_missions(world) - return sum(len(pool) for _, pool in mission_pools.items()) - - -class ValidInventory: - - def has(self, item: str, player: int): - return item in self.logical_inventory - - def has_any(self, items: Set[str], player: int): - return any(item in self.logical_inventory for item in items) - - def has_all(self, items: Set[str], player: int): - return all(item in self.logical_inventory for item in items) - - def has_group(self, item_group: str, player: int, count: int = 1): - return False # Deliberately fails here, as item pooling is not aware about mission layout - - def count_group(self, item_name_group: str, player: int) -> int: - return 0 # For item filtering assume no missions are beaten - - def count(self, item: str, player: int) -> int: - return len([inventory_item for inventory_item in self.logical_inventory if inventory_item == item]) - - def has_units_per_structure(self) -> bool: - return len(BARRACKS_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure and \ - len(FACTORY_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure and \ - len(STARPORT_UNITS.intersection(self.logical_inventory)) > self.min_units_per_structure - - def generate_reduced_inventory(self, inventory_size: int, mission_requirements: List[Tuple[str, Callable]]) -> List[Item]: - """Attempts to generate a reduced inventory that can fulfill the mission requirements.""" - inventory: List[Item] = list(self.item_pool) - locked_items: List[Item] = list(self.locked_items) - item_list = get_full_item_list() - self.logical_inventory = [ - item.name for item in inventory + locked_items + self.existing_items - if item_list[item.name].is_important_for_filtering() # Track all Progression items and those with complex rules for filtering - ] - requirements = mission_requirements - parent_items = self.item_children.keys() - parent_lookup = {child: parent for parent, children in self.item_children.items() for child in children} - minimum_upgrades = get_option_value(self.world, "min_number_of_upgrades") - - def attempt_removal(item: Item) -> bool: - inventory.remove(item) - # Only run logic checks when removing logic items - if item.name in self.logical_inventory: - self.logical_inventory.remove(item.name) - if not all(requirement(self) for (_, requirement) in mission_requirements): - # If item cannot be removed, lock or revert - self.logical_inventory.append(item.name) - for _ in range(get_item_quantity(item, self.world)): - locked_items.append(copy_item(item)) - return False - return True - - # Limit the maximum number of upgrades - maxNbUpgrade = get_option_value(self.world, "max_number_of_upgrades") - if maxNbUpgrade != -1: - unit_avail_upgrades = {} - # Needed to take into account locked/existing items - unit_nb_upgrades = {} - for item in inventory: - cItem = item_list[item.name] - if item.name in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades: - unit_avail_upgrades[item.name] = [] - unit_nb_upgrades[item.name] = 0 - elif cItem.parent_item is not None: - if cItem.parent_item not in unit_avail_upgrades: - unit_avail_upgrades[cItem.parent_item] = [item] - unit_nb_upgrades[cItem.parent_item] = 1 - else: - unit_avail_upgrades[cItem.parent_item].append(item) - unit_nb_upgrades[cItem.parent_item] += 1 - # For those two categories, we count them but dont include them in removal - for item in locked_items + self.existing_items: - cItem = item_list[item.name] - if item.name in UPGRADABLE_ITEMS and item.name not in unit_avail_upgrades: - unit_avail_upgrades[item.name] = [] - unit_nb_upgrades[item.name] = 0 - elif cItem.parent_item is not None: - if cItem.parent_item not in unit_avail_upgrades: - unit_nb_upgrades[cItem.parent_item] = 1 - else: - unit_nb_upgrades[cItem.parent_item] += 1 - # Making sure that the upgrades being removed is random - shuffled_unit_upgrade_list = list(unit_avail_upgrades.keys()) - self.world.random.shuffle(shuffled_unit_upgrade_list) - for unit in shuffled_unit_upgrade_list: - while (unit_nb_upgrades[unit] > maxNbUpgrade) \ - and (len(unit_avail_upgrades[unit]) > 0): - itemCandidate = self.world.random.choice(unit_avail_upgrades[unit]) - success = attempt_removal(itemCandidate) - # Whatever it succeed to remove the iventory or it fails and thus - # lock it, the upgrade is no longer available for removal - unit_avail_upgrades[unit].remove(itemCandidate) - if success: - unit_nb_upgrades[unit] -= 1 - - # Locking minimum upgrades for items that have already been locked/placed when minimum required - if minimum_upgrades > 0: - known_items = self.existing_items + locked_items - known_parents = [item for item in known_items if item in parent_items] - for parent in known_parents: - child_items = self.item_children[parent] - removable_upgrades = [item for item in inventory if item in child_items] - locked_upgrade_count = sum(1 if item in child_items else 0 for item in known_items) - self.world.random.shuffle(removable_upgrades) - while len(removable_upgrades) > 0 and locked_upgrade_count < minimum_upgrades: - item_to_lock = removable_upgrades.pop() - inventory.remove(item_to_lock) - locked_items.append(copy_item(item_to_lock)) - locked_upgrade_count += 1 - - if self.min_units_per_structure > 0 and self.has_units_per_structure(): - requirements.append(("Minimum units per structure", lambda state: state.has_units_per_structure())) - - # Determining if the full-size inventory can complete campaign - failed_locations: List[str] = [location for (location, requirement) in requirements if not requirement(self)] - if len(failed_locations) > 0: - raise Exception(f"Too many items excluded - couldn't satisfy access rules for the following locations:\n{failed_locations}") - - # Optionally locking generic items - generic_items = [item for item in inventory if item.name in second_pass_placeable_items] - reserved_generic_percent = get_option_value(self.world, "ensure_generic_items") / 100 - reserved_generic_amount = int(len(generic_items) * reserved_generic_percent) - removable_generic_items = [] - self.world.random.shuffle(generic_items) - for item in generic_items[:reserved_generic_amount]: - locked_items.append(copy_item(item)) - inventory.remove(item) - if item.name not in self.logical_inventory and item.name not in self.locked_items: - removable_generic_items.append(item) - - # Main cull process - unused_items: List[str] = [] # Reusable items for the second pass - while len(inventory) + len(locked_items) > inventory_size: - if len(inventory) == 0: - # There are more items than locations and all of them are already locked due to YAML or logic. - # First, drop non-logic generic items to free up space - while len(removable_generic_items) > 0 and len(locked_items) > inventory_size: - removed_item = removable_generic_items.pop() - locked_items.remove(removed_item) - # If there still isn't enough space, push locked items into start inventory - self.world.random.shuffle(locked_items) - while len(locked_items) > inventory_size: - item: Item = locked_items.pop() - self.multiworld.push_precollected(item) - break - # Select random item from removable items - item = self.world.random.choice(inventory) - # Do not remove item if it would drop upgrades below minimum - if minimum_upgrades > 0: - parent_item = parent_lookup.get(item, None) - if parent_item: - count = sum(1 if item in self.item_children[parent_item] else 0 for item in inventory + locked_items) - if count <= minimum_upgrades: - if parent_item in inventory: - # Attempt to remove parent instead, if possible - item = parent_item - else: - # Lock remaining upgrades - for item in self.item_children[parent_item]: - if item in inventory: - inventory.remove(item) - locked_items.append(copy_item(item)) - continue - - # Drop child items when removing a parent - if item in parent_items: - items_to_remove = [item for item in self.item_children[item] if item in inventory] - success = attempt_removal(item) - if success: - while len(items_to_remove) > 0: - item_to_remove = items_to_remove.pop() - if item_to_remove not in inventory: - continue - attempt_removal(item_to_remove) - else: - # Unimportant upgrades may be added again in the second pass - if attempt_removal(item): - unused_items.append(item.name) - - pool_items: List[str] = [item.name for item in (inventory + locked_items + self.existing_items)] - unused_items = [ - unused_item for unused_item in unused_items - if item_list[unused_item].parent_item is None - or item_list[unused_item].parent_item in pool_items - ] - - # Removing extra dependencies - # WoL - logical_inventory_set = set(self.logical_inventory) - if not spider_mine_sources & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Spider Mine)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Spider Mine)")] - if not BARRACKS_UNITS & logical_inventory_set: - inventory = [ - item for item in inventory - if not (item.name.startswith(ItemNames.TERRAN_INFANTRY_UPGRADE_PREFIX) - or item.name == ItemNames.ORBITAL_STRIKE)] - unused_items = [ - item_name for item_name in unused_items - if not (item_name.startswith( - ItemNames.TERRAN_INFANTRY_UPGRADE_PREFIX) - or item_name == ItemNames.ORBITAL_STRIKE)] - if not FACTORY_UNITS & logical_inventory_set: - inventory = [item for item in inventory if not item.name.startswith(ItemNames.TERRAN_VEHICLE_UPGRADE_PREFIX)] - unused_items = [item_name for item_name in unused_items if not item_name.startswith(ItemNames.TERRAN_VEHICLE_UPGRADE_PREFIX)] - if not STARPORT_UNITS & logical_inventory_set: - inventory = [item for item in inventory if not item.name.startswith(ItemNames.TERRAN_SHIP_UPGRADE_PREFIX)] - unused_items = [item_name for item_name in unused_items if not item_name.startswith(ItemNames.TERRAN_SHIP_UPGRADE_PREFIX)] - # HotS - # Baneling without sources => remove Baneling and upgrades - if (ItemNames.ZERGLING_BANELING_ASPECT in self.logical_inventory - and ItemNames.ZERGLING not in self.logical_inventory - and ItemNames.KERRIGAN_SPAWN_BANELINGS not in self.logical_inventory - ): - inventory = [item for item in inventory if item.name != ItemNames.ZERGLING_BANELING_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.ZERGLING_BANELING_ASPECT] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.ZERGLING_BANELING_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.ZERGLING_BANELING_ASPECT] - # Spawn Banelings without Zergling => remove Baneling unit, keep upgrades except macro ones - if (ItemNames.ZERGLING_BANELING_ASPECT in self.logical_inventory - and ItemNames.ZERGLING not in self.logical_inventory - and ItemNames.KERRIGAN_SPAWN_BANELINGS in self.logical_inventory - ): - inventory = [item for item in inventory if item.name != ItemNames.ZERGLING_BANELING_ASPECT] - inventory = [item for item in inventory if item.name != ItemNames.BANELING_RAPID_METAMORPH] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.ZERGLING_BANELING_ASPECT] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.BANELING_RAPID_METAMORPH] - if not {ItemNames.MUTALISK, ItemNames.CORRUPTOR, ItemNames.SCOURGE} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.startswith(ItemNames.ZERG_FLYER_UPGRADE_PREFIX)] - locked_items = [item for item in locked_items if not item.name.startswith(ItemNames.ZERG_FLYER_UPGRADE_PREFIX)] - unused_items = [item_name for item_name in unused_items if not item_name.startswith(ItemNames.ZERG_FLYER_UPGRADE_PREFIX)] - # T3 items removal rules - remove morph and its upgrades if the basic unit isn't in - if not {ItemNames.MUTALISK, ItemNames.CORRUPTOR} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Mutalisk/Corruptor)")] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Mutalisk/Corruptor)")] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.MUTALISK_CORRUPTOR_DEVOURER_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT] - if ItemNames.ROACH not in logical_inventory_set: - inventory = [item for item in inventory if item.name != ItemNames.ROACH_RAVAGER_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.ROACH_RAVAGER_ASPECT] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.ROACH_RAVAGER_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.ROACH_RAVAGER_ASPECT] - if ItemNames.HYDRALISK not in logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Hydralisk)")] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.HYDRALISK_LURKER_ASPECT] - inventory = [item for item in inventory if item_list[item.name].parent_item != ItemNames.HYDRALISK_IMPALER_ASPECT] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Hydralisk)")] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.HYDRALISK_LURKER_ASPECT] - unused_items = [item_name for item_name in unused_items if item_list[item_name].parent_item != ItemNames.HYDRALISK_IMPALER_ASPECT] - # LotV - # Shared unit upgrades between several units - if not {ItemNames.STALKER, ItemNames.INSTIGATOR, ItemNames.SLAYER} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Stalker/Instigator/Slayer)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Stalker/Instigator/Slayer)")] - if not {ItemNames.PHOENIX, ItemNames.MIRAGE} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Phoenix/Mirage)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Phoenix/Mirage)")] - if not {ItemNames.VOID_RAY, ItemNames.DESTROYER} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Void Ray/Destroyer)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Void Ray/Destroyer)")] - if not {ItemNames.IMMORTAL, ItemNames.ANNIHILATOR} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Immortal/Annihilator)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Immortal/Annihilator)")] - if not {ItemNames.DARK_TEMPLAR, ItemNames.AVENGER, ItemNames.BLOOD_HUNTER} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Dark Templar/Avenger/Blood Hunter)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Dark Templar/Avenger/Blood Hunter)")] - if not {ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.ASCENDANT, ItemNames.DARK_TEMPLAR} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Archon)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Archon)")] - logical_inventory_set.difference_update([item_name for item_name in logical_inventory_set if item_name.endswith("(Archon)")]) - if not {ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.ARCHON_HIGH_ARCHON} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(High Templar/Signifier)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(High Templar/Signifier)")] - if ItemNames.SUPPLICANT not in logical_inventory_set: - inventory = [item for item in inventory if item.name != ItemNames.ASCENDANT_POWER_OVERWHELMING] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.ASCENDANT_POWER_OVERWHELMING] - if not {ItemNames.DARK_ARCHON, ItemNames.DARK_TEMPLAR_DARK_ARCHON_MELD} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Dark Archon)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Dark Archon)")] - if not {ItemNames.SENTRY, ItemNames.ENERGIZER, ItemNames.HAVOC} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Sentry/Energizer/Havoc)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Sentry/Energizer/Havoc)")] - if not {ItemNames.SENTRY, ItemNames.ENERGIZER, ItemNames.HAVOC, ItemNames.SHIELD_BATTERY} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Sentry/Energizer/Havoc/Shield Battery)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Sentry/Energizer/Havoc/Shield Battery)")] - if not {ItemNames.ZEALOT, ItemNames.CENTURION, ItemNames.SENTINEL} & logical_inventory_set: - inventory = [item for item in inventory if not item.name.endswith("(Zealot/Sentinel/Centurion)")] - unused_items = [item_name for item_name in unused_items if not item_name.endswith("(Zealot/Sentinel/Centurion)")] - # Static defense upgrades only if static defense present - if not {ItemNames.PHOTON_CANNON, ItemNames.KHAYDARIN_MONOLITH, ItemNames.NEXUS_OVERCHARGE, ItemNames.SHIELD_BATTERY} & logical_inventory_set: - inventory = [item for item in inventory if item.name != ItemNames.ENHANCED_TARGETING] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.ENHANCED_TARGETING] - if not {ItemNames.PHOTON_CANNON, ItemNames.KHAYDARIN_MONOLITH, ItemNames.NEXUS_OVERCHARGE} & logical_inventory_set: - inventory = [item for item in inventory if item.name != ItemNames.OPTIMIZED_ORDNANCE] - unused_items = [item_name for item_name in unused_items if item_name != ItemNames.OPTIMIZED_ORDNANCE] - - # Cull finished, adding locked items back into inventory - inventory += locked_items - - # Replacing empty space with generically useful items - replacement_items = [item for item in self.item_pool - if (item not in inventory - and item not in self.locked_items - and ( - item.name in second_pass_placeable_items - or item.name in unused_items))] - self.world.random.shuffle(replacement_items) - while len(inventory) < inventory_size and len(replacement_items) > 0: - item = replacement_items.pop() - inventory.append(item) - - return inventory - - def __init__(self, world: World , - item_pool: List[Item], existing_items: List[Item], locked_items: List[Item], - used_races: Set[SC2Race], nova_equipment_used: bool): - self.multiworld = world.multiworld - self.player = world.player - self.world: World = world - self.logical_inventory = list() - self.locked_items = locked_items[:] - self.existing_items = existing_items - soa_presence = get_option_value(world, "spear_of_adun_presence") - soa_autocast_presence = get_option_value(world, "spear_of_adun_autonomously_cast_ability_presence") - # Initial filter of item pool - self.item_pool = [] - item_quantities: dict[str, int] = dict() - # Inventory restrictiveness based on number of missions with checks - mission_count = num_missions(world) - self.min_units_per_structure = int(mission_count / 7) - min_upgrades = 1 if mission_count < 10 else 2 - for item in item_pool: - item_info = get_full_item_list()[item.name] - if item_info.race != SC2Race.ANY and item_info.race not in used_races: - if soa_presence == SpearOfAdunPresence.option_everywhere \ - and item.name in spear_of_adun_calldowns: - # Add SoA powers regardless of used races as it's present everywhere - self.item_pool.append(item) - if soa_autocast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_everywhere \ - and item.name in spear_of_adun_castable_passives: - self.item_pool.append(item) - # Drop any item belonging to a race not used in the campaign - continue - if item.name in nova_equipment and not nova_equipment_used: - # Drop Nova equipment if there's no NCO mission generated - continue - if item_info.type == "Upgrade": - # Locking upgrades based on mission duration - if item.name not in item_quantities: - item_quantities[item.name] = 0 - item_quantities[item.name] += 1 - if item_quantities[item.name] <= min_upgrades: - self.locked_items.append(item) - else: - self.item_pool.append(item) - elif item_info.type == "Goal": - self.locked_items.append(item) - else: - self.item_pool.append(item) - self.item_children: Dict[Item, List[Item]] = dict() - for item in self.item_pool + locked_items + existing_items: - if item.name in UPGRADABLE_ITEMS: - self.item_children[item] = get_item_upgrades(self.item_pool, item) - - -def filter_items(world: World, mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]], location_cache: List[Location], - item_pool: List[Item], existing_items: List[Item], locked_items: List[Item]) -> List[Item]: - """ - Returns a semi-randomly pruned set of items based on number of available locations. - The returned inventory must be capable of logically accessing every location in the world. - """ - open_locations = [location for location in location_cache if location.item is None] - inventory_size = len(open_locations) - used_races = get_used_races(mission_req_table, world) - nova_equipment_used = is_nova_equipment_used(mission_req_table) - mission_requirements = [(location.name, location.access_rule) for location in location_cache] - valid_inventory = ValidInventory(world, item_pool, existing_items, locked_items, used_races, nova_equipment_used) - - valid_items = valid_inventory.generate_reduced_inventory(inventory_size, mission_requirements) - return valid_items - - -def get_used_races(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]], world: World) -> Set[SC2Race]: - grant_story_tech = get_option_value(world, "grant_story_tech") - take_over_ai_allies = get_option_value(world, "take_over_ai_allies") - kerrigan_presence = get_option_value(world, "kerrigan_presence") in kerrigan_unit_available \ - and SC2Campaign.HOTS in get_enabled_campaigns(world) - missions = missions_in_mission_table(mission_req_table) - - # By missions - races = set([mission.race for mission in missions]) - - # Conditionally logic-less no-builds (They're set to SC2Race.ANY): - if grant_story_tech == GrantStoryTech.option_false: - if SC2Mission.ENEMY_WITHIN in missions: - # Zerg units need to be unlocked - races.add(SC2Race.ZERG) - if kerrigan_presence \ - and not missions.isdisjoint({SC2Mission.BACK_IN_THE_SADDLE, SC2Mission.SUPREME, SC2Mission.CONVICTION, SC2Mission.THE_INFINITE_CYCLE}): - # You need some Kerrigan abilities (they're granted if Kerriganless or story tech granted) - races.add(SC2Race.ZERG) - - # If you take over the AI Ally, you need to have its race stuff - if take_over_ai_allies == TakeOverAIAllies.option_true \ - and not missions.isdisjoint({SC2Mission.THE_RECKONING}): - # Jimmy in The Reckoning - races.add(SC2Race.TERRAN) - - return races - -def is_nova_equipment_used(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]]) -> bool: - missions = missions_in_mission_table(mission_req_table) - return any([mission.campaign == SC2Campaign.NCO for mission in missions]) - - -def missions_in_mission_table(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]]) -> Set[SC2Mission]: - return set([mission.mission for campaign_missions in mission_req_table.values() for mission in - campaign_missions.values()]) diff --git a/worlds/sc2/Regions.py b/worlds/sc2/Regions.py deleted file mode 100644 index 273bc4a5e8..0000000000 --- a/worlds/sc2/Regions.py +++ /dev/null @@ -1,691 +0,0 @@ -from typing import List, Dict, Tuple, Optional, Callable, NamedTuple, Union -import math - -from BaseClasses import MultiWorld, Region, Entrance, Location, CollectionState -from .Locations import LocationData -from .Options import get_option_value, MissionOrder, get_enabled_campaigns, campaign_depending_orders, \ - GridTwoStartPositions -from .MissionTables import MissionInfo, mission_orders, vanilla_mission_req_table, \ - MissionPools, SC2Campaign, get_goal_location, SC2Mission, MissionConnection -from .PoolFilter import filter_missions -from worlds.AutoWorld import World - - -class SC2MissionSlot(NamedTuple): - campaign: SC2Campaign - slot: Union[MissionPools, SC2Mission, None] - - -def create_regions( - world: World, locations: Tuple[LocationData, ...], location_cache: List[Location] -) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]: - """ - Creates region connections by calling the multiworld's `connect()` methods - Returns a 3-tuple containing: - * dict[SC2Campaign, Dict[str, MissionInfo]] mapping a campaign and mission name to its data - * int The number of missions in the world - * str The name of the goal location - """ - mission_order_type: int = get_option_value(world, "mission_order") - - if mission_order_type == MissionOrder.option_vanilla: - return create_vanilla_regions(world, locations, location_cache) - elif mission_order_type == MissionOrder.option_grid: - return create_grid_regions(world, locations, location_cache) - else: - return create_structured_regions(world, locations, location_cache, mission_order_type) - -def create_vanilla_regions( - world: World, - locations: Tuple[LocationData, ...], - location_cache: List[Location], -) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]: - locations_per_region = get_locations_per_region(locations) - regions = [create_region(world, locations_per_region, location_cache, "Menu")] - - mission_pools: Dict[MissionPools, List[SC2Mission]] = filter_missions(world) - final_mission = mission_pools[MissionPools.FINAL][0] - - enabled_campaigns = get_enabled_campaigns(world) - names: Dict[str, int] = {} - - # Generating all regions and locations for each enabled campaign - for campaign in sorted(enabled_campaigns): - for region_name in vanilla_mission_req_table[campaign].keys(): - regions.append(create_region(world, locations_per_region, location_cache, region_name)) - world.multiworld.regions += regions - vanilla_mission_reqs = {campaign: missions for campaign, missions in vanilla_mission_req_table.items() if campaign in enabled_campaigns} - - def wol_cleared_missions(state: CollectionState, mission_count: int) -> bool: - return state.has_group("WoL Missions", world.player, mission_count) - - player: int = world.player - if SC2Campaign.WOL in enabled_campaigns: - connect(world, names, 'Menu', 'Liberation Day') - connect(world, names, 'Liberation Day', 'The Outlaws', - lambda state: state.has("Beat Liberation Day", player)) - connect(world, names, 'The Outlaws', 'Zero Hour', - lambda state: state.has("Beat The Outlaws", player)) - connect(world, names, 'Zero Hour', 'Evacuation', - lambda state: state.has("Beat Zero Hour", player)) - connect(world, names, 'Evacuation', 'Outbreak', - lambda state: state.has("Beat Evacuation", player)) - connect(world, names, "Outbreak", "Safe Haven", - lambda state: wol_cleared_missions(state, 7) and state.has("Beat Outbreak", player)) - connect(world, names, "Outbreak", "Haven's Fall", - lambda state: wol_cleared_missions(state, 7) and state.has("Beat Outbreak", player)) - connect(world, names, 'Zero Hour', 'Smash and Grab', - lambda state: state.has("Beat Zero Hour", player)) - connect(world, names, 'Smash and Grab', 'The Dig', - lambda state: wol_cleared_missions(state, 8) and state.has("Beat Smash and Grab", player)) - connect(world, names, 'The Dig', 'The Moebius Factor', - lambda state: wol_cleared_missions(state, 11) and state.has("Beat The Dig", player)) - connect(world, names, 'The Moebius Factor', 'Supernova', - lambda state: wol_cleared_missions(state, 14) and state.has("Beat The Moebius Factor", player)) - connect(world, names, 'Supernova', 'Maw of the Void', - lambda state: state.has("Beat Supernova", player)) - connect(world, names, 'Zero Hour', "Devil's Playground", - lambda state: wol_cleared_missions(state, 4) and state.has("Beat Zero Hour", player)) - connect(world, names, "Devil's Playground", 'Welcome to the Jungle', - lambda state: state.has("Beat Devil's Playground", player)) - connect(world, names, "Welcome to the Jungle", 'Breakout', - lambda state: wol_cleared_missions(state, 8) and state.has("Beat Welcome to the Jungle", player)) - connect(world, names, "Welcome to the Jungle", 'Ghost of a Chance', - lambda state: wol_cleared_missions(state, 8) and state.has("Beat Welcome to the Jungle", player)) - connect(world, names, "Zero Hour", 'The Great Train Robbery', - lambda state: wol_cleared_missions(state, 6) and state.has("Beat Zero Hour", player)) - connect(world, names, 'The Great Train Robbery', 'Cutthroat', - lambda state: state.has("Beat The Great Train Robbery", player)) - connect(world, names, 'Cutthroat', 'Engine of Destruction', - lambda state: state.has("Beat Cutthroat", player)) - connect(world, names, 'Engine of Destruction', 'Media Blitz', - lambda state: state.has("Beat Engine of Destruction", player)) - connect(world, names, 'Media Blitz', 'Piercing the Shroud', - lambda state: state.has("Beat Media Blitz", player)) - connect(world, names, 'Maw of the Void', 'Gates of Hell', - lambda state: state.has("Beat Maw of the Void", player)) - connect(world, names, 'Gates of Hell', 'Belly of the Beast', - lambda state: state.has("Beat Gates of Hell", player)) - connect(world, names, 'Gates of Hell', 'Shatter the Sky', - lambda state: state.has("Beat Gates of Hell", player)) - connect(world, names, 'Gates of Hell', 'All-In', - lambda state: state.has('Beat Gates of Hell', player) and ( - state.has('Beat Shatter the Sky', player) or state.has('Beat Belly of the Beast', player))) - - if SC2Campaign.PROPHECY in enabled_campaigns: - if SC2Campaign.WOL in enabled_campaigns: - connect(world, names, 'The Dig', 'Whispers of Doom', - lambda state: state.has("Beat The Dig", player)), - else: - vanilla_mission_reqs[SC2Campaign.PROPHECY] = vanilla_mission_reqs[SC2Campaign.PROPHECY].copy() - vanilla_mission_reqs[SC2Campaign.PROPHECY][SC2Mission.WHISPERS_OF_DOOM.mission_name] = MissionInfo( - SC2Mission.WHISPERS_OF_DOOM, [], SC2Mission.WHISPERS_OF_DOOM.area) - connect(world, names, 'Menu', 'Whispers of Doom'), - connect(world, names, 'Whispers of Doom', 'A Sinister Turn', - lambda state: state.has("Beat Whispers of Doom", player)) - connect(world, names, 'A Sinister Turn', 'Echoes of the Future', - lambda state: state.has("Beat A Sinister Turn", player)) - connect(world, names, 'Echoes of the Future', 'In Utter Darkness', - lambda state: state.has("Beat Echoes of the Future", player)) - - if SC2Campaign.HOTS in enabled_campaigns: - connect(world, names, 'Menu', 'Lab Rat'), - connect(world, names, 'Lab Rat', 'Back in the Saddle', - lambda state: state.has("Beat Lab Rat", player)), - connect(world, names, 'Back in the Saddle', 'Rendezvous', - lambda state: state.has("Beat Back in the Saddle", player)), - connect(world, names, 'Rendezvous', 'Harvest of Screams', - lambda state: state.has("Beat Rendezvous", player)), - connect(world, names, 'Harvest of Screams', 'Shoot the Messenger', - lambda state: state.has("Beat Harvest of Screams", player)), - connect(world, names, 'Shoot the Messenger', 'Enemy Within', - lambda state: state.has("Beat Shoot the Messenger", player)), - connect(world, names, 'Rendezvous', 'Domination', - lambda state: state.has("Beat Rendezvous", player)), - connect(world, names, 'Domination', 'Fire in the Sky', - lambda state: state.has("Beat Domination", player)), - connect(world, names, 'Fire in the Sky', 'Old Soldiers', - lambda state: state.has("Beat Fire in the Sky", player)), - connect(world, names, 'Old Soldiers', 'Waking the Ancient', - lambda state: state.has("Beat Old Soldiers", player)), - connect(world, names, 'Enemy Within', 'Waking the Ancient', - lambda state: state.has("Beat Enemy Within", player)), - connect(world, names, 'Waking the Ancient', 'The Crucible', - lambda state: state.has("Beat Waking the Ancient", player)), - connect(world, names, 'The Crucible', 'Supreme', - lambda state: state.has("Beat The Crucible", player)), - connect(world, names, 'Supreme', 'Infested', - lambda state: state.has("Beat Supreme", player) and - state.has("Beat Old Soldiers", player) and - state.has("Beat Enemy Within", player)), - connect(world, names, 'Infested', 'Hand of Darkness', - lambda state: state.has("Beat Infested", player)), - connect(world, names, 'Hand of Darkness', 'Phantoms of the Void', - lambda state: state.has("Beat Hand of Darkness", player)), - connect(world, names, 'Supreme', 'With Friends Like These', - lambda state: state.has("Beat Supreme", player) and - state.has("Beat Old Soldiers", player) and - state.has("Beat Enemy Within", player)), - connect(world, names, 'With Friends Like These', 'Conviction', - lambda state: state.has("Beat With Friends Like These", player)), - connect(world, names, 'Conviction', 'Planetfall', - lambda state: state.has("Beat Conviction", player) and - state.has("Beat Phantoms of the Void", player)), - connect(world, names, 'Planetfall', 'Death From Above', - lambda state: state.has("Beat Planetfall", player)), - connect(world, names, 'Death From Above', 'The Reckoning', - lambda state: state.has("Beat Death From Above", player)), - - if SC2Campaign.PROLOGUE in enabled_campaigns: - connect(world, names, "Menu", "Dark Whispers") - connect(world, names, "Dark Whispers", "Ghosts in the Fog", - lambda state: state.has("Beat Dark Whispers", player)) - connect(world, names, "Ghosts in the Fog", "Evil Awoken", - lambda state: state.has("Beat Ghosts in the Fog", player)) - - if SC2Campaign.LOTV in enabled_campaigns: - connect(world, names, "Menu", "For Aiur!") - connect(world, names, "For Aiur!", "The Growing Shadow", - lambda state: state.has("Beat For Aiur!", player)), - connect(world, names, "The Growing Shadow", "The Spear of Adun", - lambda state: state.has("Beat The Growing Shadow", player)), - connect(world, names, "The Spear of Adun", "Sky Shield", - lambda state: state.has("Beat The Spear of Adun", player)), - connect(world, names, "Sky Shield", "Brothers in Arms", - lambda state: state.has("Beat Sky Shield", player)), - connect(world, names, "Brothers in Arms", "Forbidden Weapon", - lambda state: state.has("Beat Brothers in Arms", player)), - connect(world, names, "The Spear of Adun", "Amon's Reach", - lambda state: state.has("Beat The Spear of Adun", player)), - connect(world, names, "Amon's Reach", "Last Stand", - lambda state: state.has("Beat Amon's Reach", player)), - connect(world, names, "Last Stand", "Forbidden Weapon", - lambda state: state.has("Beat Last Stand", player)), - connect(world, names, "Forbidden Weapon", "Temple of Unification", - lambda state: state.has("Beat Brothers in Arms", player) - and state.has("Beat Last Stand", player) - and state.has("Beat Forbidden Weapon", player)), - connect(world, names, "Temple of Unification", "The Infinite Cycle", - lambda state: state.has("Beat Temple of Unification", player)), - connect(world, names, "The Infinite Cycle", "Harbinger of Oblivion", - lambda state: state.has("Beat The Infinite Cycle", player)), - connect(world, names, "Harbinger of Oblivion", "Unsealing the Past", - lambda state: state.has("Beat Harbinger of Oblivion", player)), - connect(world, names, "Unsealing the Past", "Purification", - lambda state: state.has("Beat Unsealing the Past", player)), - connect(world, names, "Purification", "Templar's Charge", - lambda state: state.has("Beat Purification", player)), - connect(world, names, "Harbinger of Oblivion", "Steps of the Rite", - lambda state: state.has("Beat Harbinger of Oblivion", player)), - connect(world, names, "Steps of the Rite", "Rak'Shir", - lambda state: state.has("Beat Steps of the Rite", player)), - connect(world, names, "Rak'Shir", "Templar's Charge", - lambda state: state.has("Beat Rak'Shir", player)), - connect(world, names, "Templar's Charge", "Templar's Return", - lambda state: state.has("Beat Purification", player) - and state.has("Beat Rak'Shir", player) - and state.has("Beat Templar's Charge", player)), - connect(world, names, "Templar's Return", "The Host", - lambda state: state.has("Beat Templar's Return", player)), - connect(world, names, "The Host", "Salvation", - lambda state: state.has("Beat The Host", player)), - - if SC2Campaign.EPILOGUE in enabled_campaigns: - # TODO: Make this aware about excluded campaigns - connect(world, names, "Salvation", "Into the Void", - lambda state: state.has("Beat Salvation", player) - and state.has("Beat The Reckoning", player) - and state.has("Beat All-In", player)), - connect(world, names, "Into the Void", "The Essence of Eternity", - lambda state: state.has("Beat Into the Void", player)), - connect(world, names, "The Essence of Eternity", "Amon's Fall", - lambda state: state.has("Beat The Essence of Eternity", player)), - - if SC2Campaign.NCO in enabled_campaigns: - connect(world, names, "Menu", "The Escape") - connect(world, names, "The Escape", "Sudden Strike", - lambda state: state.has("Beat The Escape", player)) - connect(world, names, "Sudden Strike", "Enemy Intelligence", - lambda state: state.has("Beat Sudden Strike", player)) - connect(world, names, "Enemy Intelligence", "Trouble In Paradise", - lambda state: state.has("Beat Enemy Intelligence", player)) - connect(world, names, "Trouble In Paradise", "Night Terrors", - lambda state: state.has("Beat Trouble In Paradise", player)) - connect(world, names, "Night Terrors", "Flashpoint", - lambda state: state.has("Beat Night Terrors", player)) - connect(world, names, "Flashpoint", "In the Enemy's Shadow", - lambda state: state.has("Beat Flashpoint", player)) - connect(world, names, "In the Enemy's Shadow", "Dark Skies", - lambda state: state.has("Beat In the Enemy's Shadow", player)) - connect(world, names, "Dark Skies", "End Game", - lambda state: state.has("Beat Dark Skies", player)) - - goal_location = get_goal_location(final_mission) - assert goal_location, f"Unable to find a goal location for mission {final_mission}" - setup_final_location(goal_location, location_cache) - - return (vanilla_mission_reqs, final_mission.id, goal_location) - - -def create_grid_regions( - world: World, - locations: Tuple[LocationData, ...], - location_cache: List[Location], -) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]: - locations_per_region = get_locations_per_region(locations) - - mission_pools = filter_missions(world) - final_mission = mission_pools[MissionPools.FINAL][0] - - mission_pool = [mission for mission_pool in mission_pools.values() for mission in mission_pool] - - num_missions = min(len(mission_pool), get_option_value(world, "maximum_campaign_size")) - remove_top_left: bool = get_option_value(world, "grid_two_start_positions") == GridTwoStartPositions.option_true - - regions = [create_region(world, locations_per_region, location_cache, "Menu")] - names: Dict[str, int] = {} - missions: Dict[Tuple[int, int], SC2Mission] = {} - - grid_size_x, grid_size_y, num_corners_to_remove = get_grid_dimensions(num_missions + remove_top_left) - # pick missions in order along concentric diagonals - # each diagonal will have the same difficulty - # this keeps long sides from possibly stealing lower-difficulty missions from future columns - num_diagonals = grid_size_x + grid_size_y - 1 - diagonal_difficulty = MissionPools.STARTER - missions_to_add = mission_pools[MissionPools.STARTER] - for diagonal in range(num_diagonals): - if diagonal == num_diagonals - 1: - diagonal_difficulty = MissionPools.FINAL - grid_coords = (grid_size_x-1, grid_size_y-1) - missions[grid_coords] = final_mission - break - if diagonal == 0 and remove_top_left: - continue - diagonal_length = min(diagonal + 1, num_diagonals - diagonal, grid_size_x, grid_size_y) - if len(missions_to_add) < diagonal_length: - raise Exception(f"There are not enough {diagonal_difficulty.name} missions to fill the campaign. Please exclude fewer missions.") - for i in range(diagonal_length): - # (0,0) + (0,1)*diagonal + (1,-1)*i + (1,-1)*max(diagonal - grid_size_y + 1, 0) - grid_coords = (i + max(diagonal - grid_size_y + 1, 0), diagonal - i - max(diagonal - grid_size_y + 1, 0)) - if grid_coords == (grid_size_x - 1, 0) and num_corners_to_remove >= 2: - pass - elif grid_coords == (0, grid_size_y - 1) and num_corners_to_remove >= 1: - pass - else: - mission_index = world.random.randint(0, len(missions_to_add) - 1) - missions[grid_coords] = missions_to_add.pop(mission_index) - - if diagonal_difficulty < MissionPools.VERY_HARD: - diagonal_difficulty = MissionPools(diagonal_difficulty.value + 1) - missions_to_add.extend(mission_pools[diagonal_difficulty]) - - # Generating regions and locations from selected missions - for x in range(grid_size_x): - for y in range(grid_size_y): - if missions.get((x, y)): - regions.append(create_region(world, locations_per_region, location_cache, missions[(x, y)].mission_name)) - world.multiworld.regions += regions - - # This pattern is horrifying, why are we using the dict as an ordered dict??? - slot_map: Dict[Tuple[int, int], int] = {} - for index, coords in enumerate(missions): - slot_map[coords] = index + 1 - - mission_req_table: Dict[str, MissionInfo] = {} - for coords, mission in missions.items(): - prepend_vertical = 0 - if not mission: - continue - connections: List[MissionConnection] = [] - if coords == (0, 0) or (remove_top_left and sum(coords) == 1): - # Connect to the "Menu" starting region - connect(world, names, "Menu", mission.mission_name) - else: - for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)): - connected_coords = (coords[0] + dx, coords[1] + dy) - if connected_coords in missions: - # connections.append(missions[connected_coords]) - connections.append(MissionConnection(slot_map[connected_coords])) - connect(world, names, missions[connected_coords].mission_name, mission.mission_name, - make_grid_connect_rule(missions, connected_coords, world.player), - ) - if coords[1] == 1 and not missions.get((coords[0], 0)): - prepend_vertical = 1 - mission_req_table[mission.mission_name] = MissionInfo( - mission, - connections, - category=f'_{coords[0] + 1}', - or_requirements=True, - ui_vertical_padding=prepend_vertical, - ) - - final_mission_id = final_mission.id - # Changing the completion condition for alternate final missions into an event - final_location = get_goal_location(final_mission) - setup_final_location(final_location, location_cache) - - return {SC2Campaign.GLOBAL: mission_req_table}, final_mission_id, final_location - - -def make_grid_connect_rule( - missions: Dict[Tuple[int, int], SC2Mission], - connected_coords: Tuple[int, int], - player: int -) -> Callable[[CollectionState], bool]: - return lambda state: state.has(f"Beat {missions[connected_coords].mission_name}", player) - - -def create_structured_regions( - world: World, - locations: Tuple[LocationData, ...], - location_cache: List[Location], - mission_order_type: int, -) -> Tuple[Dict[SC2Campaign, Dict[str, MissionInfo]], int, str]: - locations_per_region = get_locations_per_region(locations) - - mission_order = mission_orders[mission_order_type]() - enabled_campaigns = get_enabled_campaigns(world) - shuffle_campaigns = get_option_value(world, "shuffle_campaigns") - - mission_pools: Dict[MissionPools, List[SC2Mission]] = filter_missions(world) - final_mission = mission_pools[MissionPools.FINAL][0] - - regions = [create_region(world, locations_per_region, location_cache, "Menu")] - - names: Dict[str, int] = {} - - mission_slots: List[SC2MissionSlot] = [] - mission_pool = [mission for mission_pool in mission_pools.values() for mission in mission_pool] - - if mission_order_type in campaign_depending_orders: - # Do slot removal per campaign - for campaign in enabled_campaigns: - campaign_mission_pool = [mission for mission in mission_pool if mission.campaign == campaign] - campaign_mission_pool_size = len(campaign_mission_pool) - - removals = len(mission_order[campaign]) - campaign_mission_pool_size - - for mission in mission_order[campaign]: - # Removing extra missions if mission pool is too small - if 0 < mission.removal_priority <= removals: - mission_slots.append(SC2MissionSlot(campaign, None)) - elif mission.type == MissionPools.FINAL: - if campaign == final_mission.campaign: - # Campaign is elected to be goal - mission_slots.append(SC2MissionSlot(campaign, final_mission)) - else: - # Not the goal, find the most difficult mission in the pool and set the difficulty - campaign_difficulty = max(mission.pool for mission in campaign_mission_pool) - mission_slots.append(SC2MissionSlot(campaign, campaign_difficulty)) - else: - mission_slots.append(SC2MissionSlot(campaign, mission.type)) - else: - order = mission_order[SC2Campaign.GLOBAL] - # Determining if missions must be removed - mission_pool_size = sum(len(mission_pool) for mission_pool in mission_pools.values()) - removals = len(order) - mission_pool_size - - # Initial fill out of mission list and marking All-In mission - for mission in order: - # Removing extra missions if mission pool is too small - if 0 < mission.removal_priority <= removals: - mission_slots.append(SC2MissionSlot(SC2Campaign.GLOBAL, None)) - elif mission.type == MissionPools.FINAL: - mission_slots.append(SC2MissionSlot(SC2Campaign.GLOBAL, final_mission)) - else: - mission_slots.append(SC2MissionSlot(SC2Campaign.GLOBAL, mission.type)) - - no_build_slots = [] - easy_slots = [] - medium_slots = [] - hard_slots = [] - very_hard_slots = [] - - # Search through missions to find slots needed to fill - for i in range(len(mission_slots)): - mission_slot = mission_slots[i] - if mission_slot is None: - continue - if isinstance(mission_slot, SC2MissionSlot): - if mission_slot.slot is None: - continue - if mission_slot.slot == MissionPools.STARTER: - no_build_slots.append(i) - elif mission_slot.slot == MissionPools.EASY: - easy_slots.append(i) - elif mission_slot.slot == MissionPools.MEDIUM: - medium_slots.append(i) - elif mission_slot.slot == MissionPools.HARD: - hard_slots.append(i) - elif mission_slot.slot == MissionPools.VERY_HARD: - very_hard_slots.append(i) - - def pick_mission(slot): - if shuffle_campaigns or mission_order_type not in campaign_depending_orders: - # Pick a mission from any campaign - filler = world.random.randint(0, len(missions_to_add) - 1) - mission = missions_to_add.pop(filler) - slot_campaign = mission_slots[slot].campaign - mission_slots[slot] = SC2MissionSlot(slot_campaign, mission) - else: - # Pick a mission from required campaign - slot_campaign = mission_slots[slot].campaign - campaign_mission_candidates = [mission for mission in missions_to_add if mission.campaign == slot_campaign] - mission = world.random.choice(campaign_mission_candidates) - missions_to_add.remove(mission) - mission_slots[slot] = SC2MissionSlot(slot_campaign, mission) - - # Add no_build missions to the pool and fill in no_build slots - missions_to_add: List[SC2Mission] = mission_pools[MissionPools.STARTER] - if len(no_build_slots) > len(missions_to_add): - raise Exception("There are no valid No-Build missions. Please exclude fewer missions.") - for slot in no_build_slots: - pick_mission(slot) - - # Add easy missions into pool and fill in easy slots - missions_to_add = missions_to_add + mission_pools[MissionPools.EASY] - if len(easy_slots) > len(missions_to_add): - raise Exception("There are not enough Easy missions to fill the campaign. Please exclude fewer missions.") - for slot in easy_slots: - pick_mission(slot) - - # Add medium missions into pool and fill in medium slots - missions_to_add = missions_to_add + mission_pools[MissionPools.MEDIUM] - if len(medium_slots) > len(missions_to_add): - raise Exception("There are not enough Easy and Medium missions to fill the campaign. Please exclude fewer missions.") - for slot in medium_slots: - pick_mission(slot) - - # Add hard missions into pool and fill in hard slots - missions_to_add = missions_to_add + mission_pools[MissionPools.HARD] - if len(hard_slots) > len(missions_to_add): - raise Exception("There are not enough missions to fill the campaign. Please exclude fewer missions.") - for slot in hard_slots: - pick_mission(slot) - - # Add very hard missions into pool and fill in very hard slots - missions_to_add = missions_to_add + mission_pools[MissionPools.VERY_HARD] - if len(very_hard_slots) > len(missions_to_add): - raise Exception("There are not enough missions to fill the campaign. Please exclude fewer missions.") - for slot in very_hard_slots: - pick_mission(slot) - - # Generating regions and locations from selected missions - for mission_slot in mission_slots: - if isinstance(mission_slot.slot, SC2Mission): - regions.append(create_region(world, locations_per_region, location_cache, mission_slot.slot.mission_name)) - world.multiworld.regions += regions - - campaigns: List[SC2Campaign] - if mission_order_type in campaign_depending_orders: - campaigns = list(enabled_campaigns) - else: - campaigns = [SC2Campaign.GLOBAL] - - mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = {} - campaign_mission_slots: Dict[SC2Campaign, List[SC2MissionSlot]] = \ - { - campaign: [mission_slot for mission_slot in mission_slots if campaign == mission_slot.campaign] - for campaign in campaigns - } - - slot_map: Dict[SC2Campaign, List[int]] = dict() - - for campaign in campaigns: - mission_req_table.update({campaign: dict()}) - - # Mapping original mission slots to shifted mission slots when missions are removed - slot_map[campaign] = [] - slot_offset = 0 - for position, mission in enumerate(campaign_mission_slots[campaign]): - slot_map[campaign].append(position - slot_offset + 1) - if mission is None or mission.slot is None: - slot_offset += 1 - - def build_connection_rule(mission_names: List[str], missions_req: int) -> Callable: - player = world.player - if len(mission_names) > 1: - return lambda state: state.has_all({f"Beat {name}" for name in mission_names}, player) \ - and state.has_group("Missions", player, missions_req) - else: - return lambda state: state.has(f"Beat {mission_names[0]}", player) \ - and state.has_group("Missions", player, missions_req) - - for campaign in campaigns: - # Loop through missions to create requirements table and connect regions - for i, mission in enumerate(campaign_mission_slots[campaign]): - if mission is None or mission.slot is None: - continue - connections: List[MissionConnection] = [] - all_connections: List[SC2MissionSlot] = [] - connection: MissionConnection - for connection in mission_order[campaign][i].connect_to: - if connection.connect_to == -1: - continue - # If mission normally connects to an excluded campaign, connect to menu instead - if connection.campaign not in campaign_mission_slots: - connection.connect_to = -1 - continue - while campaign_mission_slots[connection.campaign][connection.connect_to].slot is None: - connection.connect_to -= 1 - all_connections.append(campaign_mission_slots[connection.campaign][connection.connect_to]) - for connection in mission_order[campaign][i].connect_to: - if connection.connect_to == -1: - connect(world, names, "Menu", mission.slot.mission_name) - else: - required_mission = campaign_mission_slots[connection.campaign][connection.connect_to] - if ((required_mission is None or required_mission.slot is None) - and not mission_order[campaign][i].completion_critical): # Drop non-critical null slots - continue - while required_mission is None or required_mission.slot is None: # Substituting null slot with prior slot - connection.connect_to -= 1 - required_mission = campaign_mission_slots[connection.campaign][connection.connect_to] - required_missions = [required_mission] if mission_order[campaign][i].or_requirements else all_connections - if isinstance(required_mission.slot, SC2Mission): - required_mission_name = required_mission.slot.mission_name - required_missions_names = [mission.slot.mission_name for mission in required_missions] - connect(world, names, required_mission_name, mission.slot.mission_name, - build_connection_rule(required_missions_names, mission_order[campaign][i].number)) - connections.append(MissionConnection(slot_map[connection.campaign][connection.connect_to], connection.campaign)) - - mission_req_table[campaign].update({mission.slot.mission_name: MissionInfo( - mission.slot, connections, mission_order[campaign][i].category, - number=mission_order[campaign][i].number, - completion_critical=mission_order[campaign][i].completion_critical, - or_requirements=mission_order[campaign][i].or_requirements)}) - - final_mission_id = final_mission.id - # Changing the completion condition for alternate final missions into an event - final_location = get_goal_location(final_mission) - setup_final_location(final_location, location_cache) - - return mission_req_table, final_mission_id, final_location - - -def setup_final_location(final_location, location_cache): - # Final location should be near the end of the cache - for i in range(len(location_cache) - 1, -1, -1): - if location_cache[i].name == final_location: - location_cache[i].address = None - break - - -def create_location(player: int, location_data: LocationData, region: Region, - location_cache: List[Location]) -> Location: - location = Location(player, location_data.name, location_data.code, region) - location.access_rule = location_data.rule - - location_cache.append(location) - - return location - - -def create_region(world: World, locations_per_region: Dict[str, List[LocationData]], - location_cache: List[Location], name: str) -> Region: - region = Region(name, world.player, world.multiworld) - - if name in locations_per_region: - for location_data in locations_per_region[name]: - location = create_location(world.player, location_data, region, location_cache) - region.locations.append(location) - - return region - - -def connect(world: World, used_names: Dict[str, int], source: str, target: str, - rule: Optional[Callable] = None): - source_region = world.get_region(source) - target_region = world.get_region(target) - - if target not in used_names: - used_names[target] = 1 - name = target - else: - used_names[target] += 1 - name = target + (' ' * used_names[target]) - - connection = Entrance(world.player, name, source_region) - - if rule: - connection.access_rule = rule - - source_region.exits.append(connection) - connection.connect(target_region) - - -def get_locations_per_region(locations: Tuple[LocationData, ...]) -> Dict[str, List[LocationData]]: - per_region: Dict[str, List[LocationData]] = {} - - for location in locations: - per_region.setdefault(location.region, []).append(location) - - return per_region - - -def get_factors(number: int) -> Tuple[int, int]: - """ - Simple factorization into pairs of numbers (x, y) using a sieve method. - Returns the factorization that is most square, i.e. where x + y is minimized. - Factor order is such that x <= y. - """ - assert number > 0 - for divisor in range(math.floor(math.sqrt(number)), 1, -1): - quotient = number // divisor - if quotient * divisor == number: - return divisor, quotient - return 1, number - - -def get_grid_dimensions(size: int) -> Tuple[int, int, int]: - """ - Get the dimensions of a grid mission order from the number of missions, int the format (x, y, error). - * Error will always be 0, 1, or 2, so the missions can be removed from the corners that aren't the start or end. - * Dimensions are chosen such that x <= y, as buttons in the UI are wider than they are tall. - * Dimensions are chosen to be maximally square. That is, x + y + error is minimized. - * If multiple options of the same rating are possible, the one with the larger error is chosen, - as it will appear more square. Compare 3x11 to 5x7-2 for an example of this. - """ - dimension_candidates: List[Tuple[int, int, int]] = [(*get_factors(size + x), x) for x in (2, 1, 0)] - best_dimension = min(dimension_candidates, key=sum) - return best_dimension - diff --git a/worlds/sc2/Rules.py b/worlds/sc2/Rules.py deleted file mode 100644 index 8b9097ea1d..0000000000 --- a/worlds/sc2/Rules.py +++ /dev/null @@ -1,952 +0,0 @@ -from typing import Set - -from BaseClasses import CollectionState -from .Options import get_option_value, RequiredTactics, kerrigan_unit_available, AllInMap, \ - GrantStoryTech, GrantStoryLevels, TakeOverAIAllies, SpearOfAdunAutonomouslyCastAbilityPresence, \ - get_enabled_campaigns, MissionOrder -from .Items import get_basic_units, defense_ratings, zerg_defense_ratings, kerrigan_actives, air_defense_ratings, \ - kerrigan_levels, get_full_item_list -from .MissionTables import SC2Race, SC2Campaign -from . import ItemNames -from worlds.AutoWorld import World - - -class SC2Logic: - - def lock_any_item(self, state: CollectionState, items: Set[str]) -> bool: - """ - Guarantees that at least one of these items will remain in the world. Doesn't affect placement. - Needed for cases when the dynamic pool filtering could remove all the item prerequisites - :param state: - :param items: - :return: - """ - return self.is_item_placement(state) \ - or state.has_any(items, self.player) - - def is_item_placement(self, state): - """ - Tells if it's item placement or item pool filter - :param state: - :return: True for item placement, False for pool filter - """ - # has_group with count = 0 is always true for item placement and always false for SC2 item filtering - return state.has_group("Missions", self.player, 0) - - # WoL - def terran_common_unit(self, state: CollectionState) -> bool: - return state.has_any(self.basic_terran_units, self.player) - - def terran_early_tech(self, state: CollectionState): - """ - Basic combat unit that can be deployed quickly from mission start - :param state - :return: - """ - return ( - state.has_any({ItemNames.MARINE, ItemNames.FIREBAT, ItemNames.MARAUDER, ItemNames.REAPER, ItemNames.HELLION}, self.player) - or (self.advanced_tactics and state.has_any({ItemNames.GOLIATH, ItemNames.DIAMONDBACK, ItemNames.VIKING, ItemNames.BANSHEE}, self.player)) - ) - - def terran_air(self, state: CollectionState) -> bool: - """ - Air units or drops on advanced tactics - :param state: - :return: - """ - return (state.has_any({ItemNames.VIKING, ItemNames.WRAITH, ItemNames.BANSHEE, ItemNames.BATTLECRUISER}, self.player) or self.advanced_tactics - and state.has_any({ItemNames.HERCULES, ItemNames.MEDIVAC}, self.player) and self.terran_common_unit(state) - ) - - def terran_air_anti_air(self, state: CollectionState) -> bool: - """ - Air-to-air - :param state: - :return: - """ - return ( - state.has(ItemNames.VIKING, self.player) - or state.has_all({ItemNames.WRAITH, ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) - or state.has_all({ItemNames.BATTLECRUISER, ItemNames.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) - or self.advanced_tactics and state.has_any({ItemNames.WRAITH, ItemNames.VALKYRIE, ItemNames.BATTLECRUISER}, self.player) - ) - - def terran_competent_ground_to_air(self, state: CollectionState) -> bool: - """ - Ground-to-air - :param state: - :return: - """ - return ( - state.has(ItemNames.GOLIATH, self.player) - or state.has(ItemNames.MARINE, self.player) and self.terran_bio_heal(state) - or self.advanced_tactics and state.has(ItemNames.CYCLONE, self.player) - ) - - def terran_competent_anti_air(self, state: CollectionState) -> bool: - """ - Good AA unit - :param state: - :return: - """ - return ( - self.terran_competent_ground_to_air(state) - or self.terran_air_anti_air(state) - ) - - def welcome_to_the_jungle_requirement(self, state: CollectionState) -> bool: - """ - Welcome to the Jungle requirements - able to deal with Scouts, Void Rays, Zealots and Stalkers - :param state: - :return: - """ - return ( - self.terran_common_unit(state) - and self.terran_competent_ground_to_air(state) - ) or ( - self.advanced_tactics - and state.has_any({ItemNames.MARINE, ItemNames.VULTURE}, self.player) - and self.terran_air_anti_air(state) - ) - - def terran_basic_anti_air(self, state: CollectionState) -> bool: - """ - Basic AA to deal with few air units - :param state: - :return: - """ - return ( - state.has_any({ - ItemNames.MISSILE_TURRET, ItemNames.THOR, ItemNames.WAR_PIGS, ItemNames.SPARTAN_COMPANY, - ItemNames.HELS_ANGELS, ItemNames.BATTLECRUISER, ItemNames.MARINE, ItemNames.WRAITH, - ItemNames.VALKYRIE, ItemNames.CYCLONE, ItemNames.WINGED_NIGHTMARES, ItemNames.BRYNHILDS - }, self.player) - or self.terran_competent_anti_air(state) - or self.advanced_tactics and state.has_any({ItemNames.GHOST, ItemNames.SPECTRE, ItemNames.WIDOW_MINE, ItemNames.LIBERATOR}, self.player) - ) - - def terran_defense_rating(self, state: CollectionState, zerg_enemy: bool, air_enemy: bool = True) -> int: - """ - Ability to handle defensive missions - :param state: - :param zerg_enemy: - :param air_enemy: - :return: - """ - defense_score = sum((defense_ratings[item] for item in defense_ratings if state.has(item, self.player))) - # Manned Bunker - if state.has_any({ItemNames.MARINE, ItemNames.MARAUDER}, self.player) and state.has(ItemNames.BUNKER, self.player): - defense_score += 3 - elif zerg_enemy and state.has(ItemNames.FIREBAT, self.player) and state.has(ItemNames.BUNKER, self.player): - defense_score += 2 - # Siege Tank upgrades - if state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_MAELSTROM_ROUNDS}, self.player): - defense_score += 2 - if state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_GRADUATING_RANGE}, self.player): - defense_score += 1 - # Widow Mine upgrade - if state.has_all({ItemNames.WIDOW_MINE, ItemNames.WIDOW_MINE_CONCEALMENT}, self.player): - defense_score += 1 - # Viking with splash - if state.has_all({ItemNames.VIKING, ItemNames.VIKING_SHREDDER_ROUNDS}, self.player): - defense_score += 2 - - # General enemy-based rules - if zerg_enemy: - defense_score += sum((zerg_defense_ratings[item] for item in zerg_defense_ratings if state.has(item, self.player))) - if air_enemy: - defense_score += sum((air_defense_ratings[item] for item in air_defense_ratings if state.has(item, self.player))) - if air_enemy and zerg_enemy and state.has(ItemNames.VALKYRIE, self.player): - # Valkyries shred mass Mutas, most common air enemy that's massed in these cases - defense_score += 2 - # Advanced Tactics bumps defense rating requirements down by 2 - if self.advanced_tactics: - defense_score += 2 - return defense_score - - def terran_competent_comp(self, state: CollectionState) -> bool: - """ - Ability to deal with most of hard missions - :param state: - :return: - """ - return ( - ( - (state.has_any({ItemNames.MARINE, ItemNames.MARAUDER}, self.player) and self.terran_bio_heal(state)) - or state.has_any({ItemNames.THOR, ItemNames.BANSHEE, ItemNames.SIEGE_TANK}, self.player) - or state.has_all({ItemNames.LIBERATOR, ItemNames.LIBERATOR_RAID_ARTILLERY}, self.player) - ) - and self.terran_competent_anti_air(state) - ) or ( - state.has(ItemNames.BATTLECRUISER, self.player) and self.terran_common_unit(state) - ) - - def great_train_robbery_train_stopper(self, state: CollectionState) -> bool: - """ - Ability to deal with trains (moving target with a lot of HP) - :param state: - :return: - """ - return ( - state.has_any({ItemNames.SIEGE_TANK, ItemNames.DIAMONDBACK, ItemNames.MARAUDER, ItemNames.CYCLONE, ItemNames.BANSHEE}, self.player) - or self.advanced_tactics - and ( - state.has_all({ItemNames.REAPER, ItemNames.REAPER_G4_CLUSTERBOMB}, self.player) - or state.has_all({ItemNames.SPECTRE, ItemNames.SPECTRE_PSIONIC_LASH}, self.player) - or state.has_any({ItemNames.VULTURE, ItemNames.LIBERATOR}, self.player) - ) - ) - - def terran_can_rescue(self, state) -> bool: - """ - Rescuing in The Moebius Factor - :param state: - :return: - """ - return state.has_any({ItemNames.MEDIVAC, ItemNames.HERCULES, ItemNames.RAVEN, ItemNames.VIKING}, self.player) or self.advanced_tactics - - def terran_beats_protoss_deathball(self, state: CollectionState) -> bool: - """ - Ability to deal with Immortals, Colossi with some air support - :param state: - :return: - """ - return ( - ( - state.has_any({ItemNames.BANSHEE, ItemNames.BATTLECRUISER}, self.player) - or state.has_all({ItemNames.LIBERATOR, ItemNames.LIBERATOR_RAID_ARTILLERY}, self.player) - ) and self.terran_competent_anti_air(state) - or self.terran_competent_comp(state) and self.terran_air_anti_air(state) - ) - - def marine_medic_upgrade(self, state: CollectionState) -> bool: - """ - Infantry upgrade to infantry-only no-build segments - :param state: - :return: - """ - return state.has_any({ - ItemNames.MARINE_COMBAT_SHIELD, ItemNames.MARINE_MAGRAIL_MUNITIONS, ItemNames.MEDIC_STABILIZER_MEDPACKS - }, self.player) \ - or (state.count(ItemNames.MARINE_PROGRESSIVE_STIMPACK, self.player) >= 2 - and state.has_group("Missions", self.player, 1)) - - def terran_survives_rip_field(self, state: CollectionState) -> bool: - """ - Ability to deal with large areas with environment damage - :param state: - :return: - """ - return (state.has(ItemNames.BATTLECRUISER, self.player) - or self.terran_air(state) and self.terran_competent_anti_air(state) and self.terran_sustainable_mech_heal(state)) - - def terran_sustainable_mech_heal(self, state: CollectionState) -> bool: - """ - Can heal mech units without spending resources - :param state: - :return: - """ - return state.has(ItemNames.SCIENCE_VESSEL, self.player) \ - or state.has_all({ItemNames.MEDIC, ItemNames.MEDIC_ADAPTIVE_MEDPACKS}, self.player) \ - or state.count(ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 3 \ - or (self.advanced_tactics - and ( - state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player) - or state.count(ItemNames.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 2) - ) - - def terran_bio_heal(self, state: CollectionState) -> bool: - """ - Ability to heal bio units - :param state: - :return: - """ - return state.has_any({ItemNames.MEDIC, ItemNames.MEDIVAC}, self.player) \ - or self.advanced_tactics and state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player) - - def terran_base_trasher(self, state: CollectionState) -> bool: - """ - Can attack heavily defended bases - :param state: - :return: - """ - return state.has(ItemNames.SIEGE_TANK, self.player) \ - or state.has_all({ItemNames.BATTLECRUISER, ItemNames.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) \ - or state.has_all({ItemNames.LIBERATOR, ItemNames.LIBERATOR_RAID_ARTILLERY}, self.player) \ - or (self.advanced_tactics - and ((state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, self.player) - or self.can_nuke(state)) - and ( - state.has_all({ItemNames.VIKING, ItemNames.VIKING_SHREDDER_ROUNDS}, self.player) - or state.has_all({ItemNames.BANSHEE, ItemNames.BANSHEE_SHOCKWAVE_MISSILE_BATTERY}, self.player)) - ) - ) - - def terran_mobile_detector(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.RAVEN, ItemNames.SCIENCE_VESSEL, ItemNames.PROGRESSIVE_ORBITAL_COMMAND}, self.player) - - def can_nuke(self, state: CollectionState) -> bool: - """ - Ability to launch nukes - :param state: - :return: - """ - return (self.advanced_tactics - and (state.has_any({ItemNames.GHOST, ItemNames.SPECTRE}, self.player) - or state.has_all({ItemNames.THOR, ItemNames.THOR_BUTTON_WITH_A_SKULL_ON_IT}, self.player))) - - def terran_respond_to_colony_infestations(self, state: CollectionState) -> bool: - """ - Can deal quickly with Brood Lords and Mutas in Haven's Fall and being able to progress the mission - :param state: - :return: - """ - return ( - self.terran_common_unit(state) - and self.terran_competent_anti_air(state) - and ( - self.terran_air_anti_air(state) - or state.has_any({ItemNames.BATTLECRUISER, ItemNames.VALKYRIE}, self.player) - ) - and self.terran_defense_rating(state, True) >= 3 - ) - - def engine_of_destruction_requirement(self, state: CollectionState): - return self.marine_medic_upgrade(state) \ - and ( - self.terran_competent_anti_air(state) - and self.terran_common_unit(state) or state.has(ItemNames.WRAITH, self.player) - ) - - def all_in_requirement(self, state: CollectionState): - """ - All-in - :param state: - :return: - """ - beats_kerrigan = state.has_any({ItemNames.MARINE, ItemNames.BANSHEE, ItemNames.GHOST}, self.player) or self.advanced_tactics - if get_option_value(self.world, 'all_in_map') == AllInMap.option_ground: - # Ground - defense_rating = self.terran_defense_rating(state, True, False) - if state.has_any({ItemNames.BATTLECRUISER, ItemNames.BANSHEE}, self.player): - defense_rating += 2 - return defense_rating >= 13 and beats_kerrigan - else: - # Air - defense_rating = self.terran_defense_rating(state, True, True) - return defense_rating >= 9 and beats_kerrigan \ - and state.has_any({ItemNames.VIKING, ItemNames.BATTLECRUISER, ItemNames.VALKYRIE}, self.player) \ - and state.has_any({ItemNames.HIVE_MIND_EMULATOR, ItemNames.PSI_DISRUPTER, ItemNames.MISSILE_TURRET}, self.player) - - # HotS - def zerg_common_unit(self, state: CollectionState) -> bool: - return state.has_any(self.basic_zerg_units, self.player) - - def zerg_competent_anti_air(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.HYDRALISK, ItemNames.MUTALISK, ItemNames.CORRUPTOR, ItemNames.BROOD_QUEEN}, self.player) \ - or state.has_all({ItemNames.SWARM_HOST, ItemNames.SWARM_HOST_PRESSURIZED_GLANDS}, self.player) \ - or state.has_all({ItemNames.SCOURGE, ItemNames.SCOURGE_RESOURCE_EFFICIENCY}, self.player) \ - or (self.advanced_tactics and state.has(ItemNames.INFESTOR, self.player)) - - def zerg_basic_anti_air(self, state: CollectionState) -> bool: - return self.zerg_competent_anti_air(state) or self.kerrigan_unit_available in kerrigan_unit_available or \ - state.has_any({ItemNames.SWARM_QUEEN, ItemNames.SCOURGE}, self.player) or (self.advanced_tactics and state.has(ItemNames.SPORE_CRAWLER, self.player)) - - def morph_brood_lord(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.MUTALISK, ItemNames.CORRUPTOR}, self.player) \ - and state.has(ItemNames.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, self.player) - - def morph_viper(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.MUTALISK, ItemNames.CORRUPTOR}, self.player) \ - and state.has(ItemNames.MUTALISK_CORRUPTOR_VIPER_ASPECT, self.player) - - def morph_impaler_or_lurker(self, state: CollectionState) -> bool: - return state.has(ItemNames.HYDRALISK, self.player) and state.has_any({ItemNames.HYDRALISK_IMPALER_ASPECT, ItemNames.HYDRALISK_LURKER_ASPECT}, self.player) - - def zerg_competent_comp(self, state: CollectionState) -> bool: - advanced = self.advanced_tactics - core_unit = state.has_any({ItemNames.ROACH, ItemNames.ABERRATION, ItemNames.ZERGLING}, self.player) - support_unit = state.has_any({ItemNames.SWARM_QUEEN, ItemNames.HYDRALISK}, self.player) \ - or self.morph_brood_lord(state) \ - or advanced and (state.has_any({ItemNames.INFESTOR, ItemNames.DEFILER}, self.player) or self.morph_viper(state)) - if core_unit and support_unit: - return True - vespene_unit = state.has_any({ItemNames.ULTRALISK, ItemNames.ABERRATION}, self.player) \ - or advanced and self.morph_viper(state) - return vespene_unit and state.has_any({ItemNames.ZERGLING, ItemNames.SWARM_QUEEN}, self.player) - - def spread_creep(self, state: CollectionState) -> bool: - return self.advanced_tactics or state.has(ItemNames.SWARM_QUEEN, self.player) - - def zerg_competent_defense(self, state: CollectionState) -> bool: - return ( - self.zerg_common_unit(state) - and ( - ( - state.has(ItemNames.SWARM_HOST, self.player) - or self.morph_brood_lord(state) - or self.morph_impaler_or_lurker(state) - ) or ( - self.advanced_tactics - and (self.morph_viper(state) - or state.has(ItemNames.SPINE_CRAWLER, self.player)) - ) - ) - ) - - def basic_kerrigan(self, state: CollectionState) -> bool: - # One active ability that can be used to defeat enemies directly on Standard - if not self.advanced_tactics and \ - not state.has_any({ItemNames.KERRIGAN_KINETIC_BLAST, ItemNames.KERRIGAN_LEAPING_STRIKE, - ItemNames.KERRIGAN_CRUSHING_GRIP, ItemNames.KERRIGAN_PSIONIC_SHIFT, - ItemNames.KERRIGAN_SPAWN_BANELINGS}, self.player): - return False - # Two non-ultimate abilities - count = 0 - for item in (ItemNames.KERRIGAN_KINETIC_BLAST, ItemNames.KERRIGAN_LEAPING_STRIKE, ItemNames.KERRIGAN_HEROIC_FORTITUDE, - ItemNames.KERRIGAN_CHAIN_REACTION, ItemNames.KERRIGAN_CRUSHING_GRIP, ItemNames.KERRIGAN_PSIONIC_SHIFT, - ItemNames.KERRIGAN_SPAWN_BANELINGS, ItemNames.KERRIGAN_INFEST_BROODLINGS, ItemNames.KERRIGAN_FURY): - if state.has(item, self.player): - count += 1 - if count >= 2: - return True - return False - - def two_kerrigan_actives(self, state: CollectionState) -> bool: - count = 0 - for i in range(7): - if state.has_any(kerrigan_actives[i], self.player): - count += 1 - return count >= 2 - - def zerg_pass_vents(self, state: CollectionState) -> bool: - return self.story_tech_granted \ - or state.has_any({ItemNames.ZERGLING, ItemNames.HYDRALISK, ItemNames.ROACH}, self.player) \ - or (self.advanced_tactics and state.has(ItemNames.INFESTOR, self.player)) - - def supreme_requirement(self, state: CollectionState) -> bool: - return self.story_tech_granted \ - or not self.kerrigan_unit_available \ - or ( - state.has_all({ItemNames.KERRIGAN_LEAPING_STRIKE, ItemNames.KERRIGAN_MEND}, self.player) - and self.kerrigan_levels(state, 35) - ) - - def kerrigan_levels(self, state: CollectionState, target: int) -> bool: - if self.story_levels_granted or not self.kerrigan_unit_available: - return True # Levels are granted - if self.kerrigan_levels_per_mission_completed > 0 \ - and self.kerrigan_levels_per_mission_completed_cap > 0 \ - and not self.is_item_placement(state): - # Levels can be granted from mission completion. - # Item pool filtering isn't aware of missions beaten. Assume that missions beaten will fulfill this rule. - return True - # Levels from missions beaten - levels = self.kerrigan_levels_per_mission_completed * state.count_group("Missions", self.player) - if self.kerrigan_levels_per_mission_completed_cap != -1: - levels = min(levels, self.kerrigan_levels_per_mission_completed_cap) - # Levels from items - for kerrigan_level_item in kerrigan_levels: - level_amount = get_full_item_list()[kerrigan_level_item].number - item_count = state.count(kerrigan_level_item, self.player) - levels += item_count * level_amount - # Total level cap - if self.kerrigan_total_level_cap != -1: - levels = min(levels, self.kerrigan_total_level_cap) - - return levels >= target - - - def the_reckoning_requirement(self, state: CollectionState) -> bool: - if self.take_over_ai_allies: - return self.terran_competent_comp(state) \ - and self.zerg_competent_comp(state) \ - and (self.zerg_competent_anti_air(state) - or self.terran_competent_anti_air(state)) - else: - return self.zerg_competent_comp(state) \ - and self.zerg_competent_anti_air(state) - - # LotV - - def protoss_common_unit(self, state: CollectionState) -> bool: - return state.has_any(self.basic_protoss_units, self.player) - - def protoss_basic_anti_air(self, state: CollectionState) -> bool: - return self.protoss_competent_anti_air(state) \ - or state.has_any({ItemNames.PHOENIX, ItemNames.MIRAGE, ItemNames.CORSAIR, ItemNames.CARRIER, ItemNames.SCOUT, - ItemNames.DARK_ARCHON, ItemNames.WRATHWALKER, ItemNames.MOTHERSHIP}, self.player) \ - or state.has_all({ItemNames.WARP_PRISM, ItemNames.WARP_PRISM_PHASE_BLASTER}, self.player) \ - or self.advanced_tactics and state.has_any( - {ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER, ItemNames.ASCENDANT, ItemNames.DARK_TEMPLAR, - ItemNames.SENTRY, ItemNames.ENERGIZER}, self.player) - - def protoss_anti_armor_anti_air(self, state: CollectionState) -> bool: - return self.protoss_competent_anti_air(state) \ - or state.has_any({ItemNames.SCOUT, ItemNames.WRATHWALKER}, self.player) \ - or (state.has_any({ItemNames.IMMORTAL, ItemNames.ANNIHILATOR}, self.player) - and state.has(ItemNames.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS, self.player)) - - def protoss_anti_light_anti_air(self, state: CollectionState) -> bool: - return self.protoss_competent_anti_air(state) \ - or state.has_any({ItemNames.PHOENIX, ItemNames.MIRAGE, ItemNames.CORSAIR, ItemNames.CARRIER}, self.player) - - def protoss_competent_anti_air(self, state: CollectionState) -> bool: - return state.has_any( - {ItemNames.STALKER, ItemNames.SLAYER, ItemNames.INSTIGATOR, ItemNames.DRAGOON, ItemNames.ADEPT, - ItemNames.VOID_RAY, ItemNames.DESTROYER, ItemNames.TEMPEST}, self.player) \ - or (state.has_any({ItemNames.PHOENIX, ItemNames.MIRAGE, ItemNames.CORSAIR, ItemNames.CARRIER}, self.player) - and state.has_any({ItemNames.SCOUT, ItemNames.WRATHWALKER}, self.player)) \ - or (self.advanced_tactics - and state.has_any({ItemNames.IMMORTAL, ItemNames.ANNIHILATOR}, self.player) - and state.has(ItemNames.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING_MECHANICS, self.player)) - - def protoss_has_blink(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.STALKER, ItemNames.INSTIGATOR, ItemNames.SLAYER}, self.player) \ - or ( - state.has(ItemNames.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK, self.player) - and state.has_any({ItemNames.DARK_TEMPLAR, ItemNames.BLOOD_HUNTER, ItemNames.AVENGER}, self.player) - ) - - def protoss_can_attack_behind_chasm(self, state: CollectionState) -> bool: - return state.has_any( - {ItemNames.SCOUT, ItemNames.TEMPEST, - ItemNames.CARRIER, ItemNames.VOID_RAY, ItemNames.DESTROYER, ItemNames.MOTHERSHIP}, self.player) \ - or self.protoss_has_blink(state) \ - or (state.has(ItemNames.WARP_PRISM, self.player) - and (self.protoss_common_unit(state) or state.has(ItemNames.WARP_PRISM_PHASE_BLASTER, self.player))) \ - or (self.advanced_tactics - and state.has_any({ItemNames.ORACLE, ItemNames.ARBITER}, self.player)) - - def protoss_fleet(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.CARRIER, ItemNames.TEMPEST, ItemNames.VOID_RAY, ItemNames.DESTROYER}, self.player) - - def templars_return_requirement(self, state: CollectionState) -> bool: - return self.story_tech_granted \ - or ( - state.has_any({ItemNames.IMMORTAL, ItemNames.ANNIHILATOR}, self.player) - and state.has_any({ItemNames.COLOSSUS, ItemNames.VANGUARD, ItemNames.REAVER, ItemNames.DARK_TEMPLAR}, self.player) - and state.has_any({ItemNames.SENTRY, ItemNames.HIGH_TEMPLAR}, self.player) - ) - - def brothers_in_arms_requirement(self, state: CollectionState) -> bool: - return ( - self.protoss_common_unit(state) - and self.protoss_anti_armor_anti_air(state) - and self.protoss_hybrid_counter(state) - ) or ( - self.take_over_ai_allies - and ( - self.terran_common_unit(state) - or self.protoss_common_unit(state) - ) - and ( - self.terran_competent_anti_air(state) - or self.protoss_anti_armor_anti_air(state) - ) - and ( - self.protoss_hybrid_counter(state) - or state.has_any({ItemNames.BATTLECRUISER, ItemNames.LIBERATOR, ItemNames.SIEGE_TANK}, self.player) - or state.has_all({ItemNames.SPECTRE, ItemNames.SPECTRE_PSIONIC_LASH}, self.player) - or (state.has(ItemNames.IMMORTAL, self.player) - and state.has_any({ItemNames.MARINE, ItemNames.MARAUDER}, self.player) - and self.terran_bio_heal(state)) - ) - ) - - def protoss_hybrid_counter(self, state: CollectionState) -> bool: - """ - Ground Hybrids - """ - return state.has_any( - {ItemNames.ANNIHILATOR, ItemNames.ASCENDANT, ItemNames.TEMPEST, ItemNames.CARRIER, ItemNames.VOID_RAY, - ItemNames.WRATHWALKER, ItemNames.VANGUARD}, self.player) \ - or (state.has(ItemNames.IMMORTAL, self.player) or self.advanced_tactics) and state.has_any( - {ItemNames.STALKER, ItemNames.DRAGOON, ItemNames.ADEPT, ItemNames.INSTIGATOR, ItemNames.SLAYER}, self.player) - - def the_infinite_cycle_requirement(self, state: CollectionState) -> bool: - return self.story_tech_granted \ - or not self.kerrigan_unit_available \ - or ( - self.two_kerrigan_actives(state) - and self.basic_kerrigan(state) - and self.kerrigan_levels(state, 70) - ) - - def protoss_basic_splash(self, state: CollectionState) -> bool: - return state.has_any( - {ItemNames.ZEALOT, ItemNames.COLOSSUS, ItemNames.VANGUARD, ItemNames.HIGH_TEMPLAR, ItemNames.SIGNIFIER, - ItemNames.DARK_TEMPLAR, ItemNames.REAVER, ItemNames.ASCENDANT}, self.player) - - def protoss_static_defense(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.PHOTON_CANNON, ItemNames.KHAYDARIN_MONOLITH}, self.player) - - def last_stand_requirement(self, state: CollectionState) -> bool: - return self.protoss_common_unit(state) \ - and self.protoss_competent_anti_air(state) \ - and self.protoss_static_defense(state) \ - and ( - self.advanced_tactics - or self.protoss_basic_splash(state) - ) - - def harbinger_of_oblivion_requirement(self, state: CollectionState) -> bool: - return self.protoss_anti_armor_anti_air(state) and ( - self.take_over_ai_allies - or ( - self.protoss_common_unit(state) - and self.protoss_hybrid_counter(state) - ) - ) - - def protoss_competent_comp(self, state: CollectionState) -> bool: - return self.protoss_common_unit(state) \ - and self.protoss_competent_anti_air(state) \ - and self.protoss_hybrid_counter(state) \ - and self.protoss_basic_splash(state) - - def protoss_stalker_upgrade(self, state: CollectionState) -> bool: - return ( - state.has_any( - { - ItemNames.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, - ItemNames.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION - }, self.player) - and self.lock_any_item(state, {ItemNames.STALKER, ItemNames.INSTIGATOR, ItemNames.SLAYER}) - ) - - def steps_of_the_rite_requirement(self, state: CollectionState) -> bool: - return self.protoss_competent_comp(state) \ - or ( - self.protoss_common_unit(state) - and self.protoss_competent_anti_air(state) - and self.protoss_static_defense(state) - ) - - def protoss_heal(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.CARRIER, ItemNames.SENTRY, ItemNames.SHIELD_BATTERY, ItemNames.RECONSTRUCTION_BEAM}, self.player) - - def templars_charge_requirement(self, state: CollectionState) -> bool: - return self.protoss_heal(state) \ - and self.protoss_anti_armor_anti_air(state) \ - and ( - self.protoss_fleet(state) - or (self.advanced_tactics - and self.protoss_competent_comp(state) - ) - ) - - def the_host_requirement(self, state: CollectionState) -> bool: - return (self.protoss_fleet(state) - and self.protoss_static_defense(state) - ) or ( - self.protoss_competent_comp(state) - and state.has(ItemNames.SOA_TIME_STOP, self.player) - ) - - def salvation_requirement(self, state: CollectionState) -> bool: - return [ - self.protoss_competent_comp(state), - self.protoss_fleet(state), - self.protoss_static_defense(state) - ].count(True) >= 2 - - def into_the_void_requirement(self, state: CollectionState) -> bool: - return self.protoss_competent_comp(state) \ - or ( - self.take_over_ai_allies - and ( - state.has(ItemNames.BATTLECRUISER, self.player) - or ( - state.has(ItemNames.ULTRALISK, self.player) - and self.protoss_competent_anti_air(state) - ) - ) - ) - - def essence_of_eternity_requirement(self, state: CollectionState) -> bool: - defense_score = self.terran_defense_rating(state, False, True) - if self.take_over_ai_allies and self.protoss_static_defense(state): - defense_score += 2 - return defense_score >= 10 \ - and ( - self.terran_competent_anti_air(state) - or self.take_over_ai_allies - and self.protoss_competent_anti_air(state) - ) \ - and ( - state.has(ItemNames.BATTLECRUISER, self.player) - or (state.has(ItemNames.BANSHEE, self.player) and state.has_any({ItemNames.VIKING, ItemNames.VALKYRIE}, - self.player)) - or self.take_over_ai_allies and self.protoss_fleet(state) - ) \ - and state.has_any({ItemNames.SIEGE_TANK, ItemNames.LIBERATOR}, self.player) - - def amons_fall_requirement(self, state: CollectionState) -> bool: - if self.take_over_ai_allies: - return ( - ( - state.has_any({ItemNames.BATTLECRUISER, ItemNames.CARRIER}, self.player) - ) - or (state.has(ItemNames.ULTRALISK, self.player) - and self.protoss_competent_anti_air(state) - and ( - state.has_any({ItemNames.LIBERATOR, ItemNames.BANSHEE, ItemNames.VALKYRIE, ItemNames.VIKING}, self.player) - or state.has_all({ItemNames.WRAITH, ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) - or self.protoss_fleet(state) - ) - and (self.terran_sustainable_mech_heal(state) - or (self.spear_of_adun_autonomously_cast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_everywhere - and state.has(ItemNames.RECONSTRUCTION_BEAM, self.player)) - ) - ) - ) \ - and self.terran_competent_anti_air(state) \ - and self.protoss_competent_comp(state) \ - and self.zerg_competent_comp(state) - else: - return state.has(ItemNames.MUTALISK, self.player) and self.zerg_competent_comp(state) - - def nova_any_weapon(self, state: CollectionState) -> bool: - return state.has_any( - {ItemNames.NOVA_C20A_CANISTER_RIFLE, ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_PLASMA_RIFLE, - ItemNames.NOVA_MONOMOLECULAR_BLADE, ItemNames.NOVA_BLAZEFIRE_GUNBLADE}, self.player) - - def nova_ranged_weapon(self, state: CollectionState) -> bool: - return state.has_any( - {ItemNames.NOVA_C20A_CANISTER_RIFLE, ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_PLASMA_RIFLE}, - self.player) - - def nova_splash(self, state: CollectionState) -> bool: - return state.has_any({ - ItemNames.NOVA_HELLFIRE_SHOTGUN, ItemNames.NOVA_BLAZEFIRE_GUNBLADE, ItemNames.NOVA_PULSE_GRENADES - }, self.player) \ - or self.advanced_tactics and state.has_any( - {ItemNames.NOVA_PLASMA_RIFLE, ItemNames.NOVA_MONOMOLECULAR_BLADE}, self.player) - - def nova_dash(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.NOVA_MONOMOLECULAR_BLADE, ItemNames.NOVA_BLINK}, self.player) - - def nova_full_stealth(self, state: CollectionState) -> bool: - return state.count(ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player) >= 2 - - def nova_heal(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.NOVA_ARMORED_SUIT_MODULE, ItemNames.NOVA_STIM_INFUSION}, self.player) - - def nova_escape_assist(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.NOVA_BLINK, ItemNames.NOVA_HOLO_DECOY, ItemNames.NOVA_IONIC_FORCE_FIELD}, self.player) - - def the_escape_stuff_granted(self) -> bool: - """ - The NCO first mission requires having too much stuff first before actually able to do anything - :return: - """ - return self.story_tech_granted \ - or (self.mission_order == MissionOrder.option_vanilla and self.enabled_campaigns == {SC2Campaign.NCO}) - - def the_escape_first_stage_requirement(self, state: CollectionState) -> bool: - return self.the_escape_stuff_granted() \ - or (self.nova_ranged_weapon(state) and (self.nova_full_stealth(state) or self.nova_heal(state))) - - def the_escape_requirement(self, state: CollectionState) -> bool: - return self.the_escape_first_stage_requirement(state) \ - and (self.the_escape_stuff_granted() or self.nova_splash(state)) - - def terran_cliffjumper(self, state: CollectionState) -> bool: - return state.has(ItemNames.REAPER, self.player) \ - or state.has_all({ItemNames.GOLIATH, ItemNames.GOLIATH_JUMP_JETS}, self.player) \ - or state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_JUMP_JETS}, self.player) - - def terran_able_to_snipe_defiler(self, state: CollectionState) -> bool: - return state.has_all({ItemNames.NOVA_JUMP_SUIT_MODULE, ItemNames.NOVA_C20A_CANISTER_RIFLE}, self.player) \ - or state.has_all({ItemNames.SIEGE_TANK, ItemNames.SIEGE_TANK_MAELSTROM_ROUNDS, ItemNames.SIEGE_TANK_JUMP_JETS}, self.player) - - def sudden_strike_requirement(self, state: CollectionState) -> bool: - return self.sudden_strike_can_reach_objectives(state) \ - and self.terran_able_to_snipe_defiler(state) \ - and state.has_any({ItemNames.SIEGE_TANK, ItemNames.VULTURE}, self.player) \ - and self.nova_splash(state) \ - and (self.terran_defense_rating(state, True, False) >= 2 - or state.has(ItemNames.NOVA_JUMP_SUIT_MODULE, self.player)) - - def sudden_strike_can_reach_objectives(self, state: CollectionState) -> bool: - return self.terran_cliffjumper(state) \ - or state.has_any({ItemNames.BANSHEE, ItemNames.VIKING}, self.player) \ - or ( - self.advanced_tactics - and state.has(ItemNames.MEDIVAC, self.player) - and state.has_any({ItemNames.MARINE, ItemNames.MARAUDER, ItemNames.VULTURE, ItemNames.HELLION, - ItemNames.GOLIATH}, self.player) - ) - - def enemy_intelligence_garrisonable_unit(self, state: CollectionState) -> bool: - """ - Has unit usable as a Garrison in Enemy Intelligence - :param state: - :return: - """ - return state.has_any( - {ItemNames.MARINE, ItemNames.REAPER, ItemNames.MARAUDER, ItemNames.GHOST, ItemNames.SPECTRE, - ItemNames.HELLION, ItemNames.GOLIATH, ItemNames.WARHOUND, ItemNames.DIAMONDBACK, ItemNames.VIKING}, - self.player) - - def enemy_intelligence_cliff_garrison(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.REAPER, ItemNames.VIKING, ItemNames.MEDIVAC, ItemNames.HERCULES}, self.player) \ - or state.has_all({ItemNames.GOLIATH, ItemNames.GOLIATH_JUMP_JETS}, self.player) \ - or self.advanced_tactics and state.has_any({ItemNames.HELS_ANGELS, ItemNames.BRYNHILDS}, self.player) - - def enemy_intelligence_first_stage_requirement(self, state: CollectionState) -> bool: - return self.enemy_intelligence_garrisonable_unit(state) \ - and (self.terran_competent_comp(state) - or ( - self.terran_common_unit(state) - and self.terran_competent_anti_air(state) - and state.has(ItemNames.NOVA_NUKE, self.player) - ) - ) \ - and self.terran_defense_rating(state, True, True) >= 5 - - def enemy_intelligence_second_stage_requirement(self, state: CollectionState) -> bool: - return self.enemy_intelligence_first_stage_requirement(state) \ - and self.enemy_intelligence_cliff_garrison(state) \ - and ( - self.story_tech_granted - or ( - self.nova_any_weapon(state) - and ( - self.nova_full_stealth(state) - or (self.nova_heal(state) - and self.nova_splash(state) - and self.nova_ranged_weapon(state)) - ) - ) - ) - - def enemy_intelligence_third_stage_requirement(self, state: CollectionState) -> bool: - return self.enemy_intelligence_second_stage_requirement(state) \ - and ( - self.story_tech_granted - or ( - state.has(ItemNames.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player) - and self.nova_dash(state) - ) - ) - - def trouble_in_paradise_requirement(self, state: CollectionState) -> bool: - return self.nova_any_weapon(state) \ - and self.nova_splash(state) \ - and self.terran_beats_protoss_deathball(state) \ - and self.terran_defense_rating(state, True, True) >= 7 - - def night_terrors_requirement(self, state: CollectionState) -> bool: - return self.terran_common_unit(state) \ - and self.terran_competent_anti_air(state) \ - and ( - # These can handle the waves of infested, even volatile ones - state.has(ItemNames.SIEGE_TANK, self.player) - or state.has_all({ItemNames.VIKING, ItemNames.VIKING_SHREDDER_ROUNDS}, self.player) - or ( - ( - # Regular infesteds - state.has(ItemNames.FIREBAT, self.player) - or state.has_all({ItemNames.HELLION, ItemNames.HELLION_HELLBAT_ASPECT}, self.player) - or ( - self.advanced_tactics - and state.has_any({ItemNames.PERDITION_TURRET, ItemNames.PLANETARY_FORTRESS}, self.player) - ) - ) - and self.terran_bio_heal(state) - and ( - # Volatile infesteds - state.has(ItemNames.LIBERATOR, self.player) - or ( - self.advanced_tactics - and state.has_any({ItemNames.HERC, ItemNames.VULTURE}, self.player) - ) - ) - ) - ) - - def flashpoint_far_requirement(self, state: CollectionState) -> bool: - return self.terran_competent_comp(state) \ - and self.terran_mobile_detector(state) \ - and self.terran_defense_rating(state, True, False) >= 6 - - def enemy_shadow_tripwires_tool(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.NOVA_FLASHBANG_GRENADES, ItemNames.NOVA_BLINK, ItemNames.NOVA_DOMINATION}, - self.player) - - def enemy_shadow_door_unlocks_tool(self, state: CollectionState) -> bool: - return state.has_any({ItemNames.NOVA_DOMINATION, ItemNames.NOVA_BLINK, ItemNames.NOVA_JUMP_SUIT_MODULE}, - self.player) - - def enemy_shadow_domination(self, state: CollectionState) -> bool: - return self.story_tech_granted \ - or (self.nova_ranged_weapon(state) - and (self.nova_full_stealth(state) - or state.has(ItemNames.NOVA_JUMP_SUIT_MODULE, self.player) - or (self.nova_heal(state) and self.nova_splash(state)) - ) - ) - - def enemy_shadow_first_stage(self, state: CollectionState) -> bool: - return self.enemy_shadow_domination(state) \ - and (self.story_tech_granted - or ((self.nova_full_stealth(state) and self.enemy_shadow_tripwires_tool(state)) - or (self.nova_heal(state) and self.nova_splash(state)) - ) - ) - - def enemy_shadow_second_stage(self, state: CollectionState) -> bool: - return self.enemy_shadow_first_stage(state) \ - and (self.story_tech_granted - or self.nova_splash(state) - or self.nova_heal(state) - or self.nova_escape_assist(state) - ) - - def enemy_shadow_door_controls(self, state: CollectionState) -> bool: - return self.enemy_shadow_second_stage(state) \ - and (self.story_tech_granted or self.enemy_shadow_door_unlocks_tool(state)) - - def enemy_shadow_victory(self, state: CollectionState) -> bool: - return self.enemy_shadow_door_controls(state) \ - and (self.story_tech_granted or self.nova_heal(state)) - - def dark_skies_requirement(self, state: CollectionState) -> bool: - return self.terran_common_unit(state) \ - and self.terran_beats_protoss_deathball(state) \ - and self.terran_defense_rating(state, False, True) >= 8 - - def end_game_requirement(self, state: CollectionState) -> bool: - return self.terran_competent_comp(state) \ - and self.terran_mobile_detector(state) \ - and ( - state.has_any({ItemNames.BATTLECRUISER, ItemNames.LIBERATOR, ItemNames.BANSHEE}, self.player) - or state.has_all({ItemNames.WRAITH, ItemNames.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) - ) \ - and (state.has_any({ItemNames.BATTLECRUISER, ItemNames.VIKING, ItemNames.LIBERATOR}, self.player) - or (self.advanced_tactics - and state.has_all({ItemNames.RAVEN, ItemNames.RAVEN_HUNTER_SEEKER_WEAPON}, self.player) - ) - ) - - def __init__(self, world: World): - self.world: World = world - self.player = None if world is None else world.player - self.logic_level = get_option_value(world, 'required_tactics') - self.advanced_tactics = self.logic_level != RequiredTactics.option_standard - self.take_over_ai_allies = get_option_value(world, "take_over_ai_allies") == TakeOverAIAllies.option_true - self.kerrigan_unit_available = get_option_value(world, 'kerrigan_presence') in kerrigan_unit_available \ - and SC2Campaign.HOTS in get_enabled_campaigns(world) - self.kerrigan_levels_per_mission_completed = get_option_value(world, "kerrigan_levels_per_mission_completed") - self.kerrigan_levels_per_mission_completed_cap = get_option_value(world, "kerrigan_levels_per_mission_completed_cap") - self.kerrigan_total_level_cap = get_option_value(world, "kerrigan_total_level_cap") - self.story_tech_granted = get_option_value(world, "grant_story_tech") == GrantStoryTech.option_true - self.story_levels_granted = get_option_value(world, "grant_story_levels") != GrantStoryLevels.option_disabled - self.basic_terran_units = get_basic_units(world, SC2Race.TERRAN) - self.basic_zerg_units = get_basic_units(world, SC2Race.ZERG) - self.basic_protoss_units = get_basic_units(world, SC2Race.PROTOSS) - self.spear_of_adun_autonomously_cast_presence = get_option_value(world, "spear_of_adun_autonomously_cast_ability_presence") - self.enabled_campaigns = get_enabled_campaigns(world) - self.mission_order = get_option_value(world, "mission_order") diff --git a/worlds/sc2/Starcraft2.kv b/worlds/sc2/Starcraft2.kv deleted file mode 100644 index 6b112c2f00..0000000000 --- a/worlds/sc2/Starcraft2.kv +++ /dev/null @@ -1,28 +0,0 @@ - - scroll_type: ["content", "bars"] - bar_width: dp(12) - effect_cls: "ScrollEffect" - - - cols: 1 - size_hint_y: None - height: self.minimum_height + 15 - padding: [5,0,dp(12),0] - -: - cols: 1 - -: - rows: 1 - -: - cols: 1 - spacing: [0,5] - -: - text_size: self.size - markup: True - halign: 'center' - valign: 'middle' - padding: [5,0,5,0] - outline_width: 1 diff --git a/worlds/sc2/__init__.py b/worlds/sc2/__init__.py index f11059a54e..9bf2f79104 100644 --- a/worlds/sc2/__init__.py +++ b/worlds/sc2/__init__.py @@ -1,25 +1,49 @@ -import typing from dataclasses import fields +import logging -from typing import List, Set, Iterable, Sequence, Dict, Callable, Union +from typing import * from math import floor, ceil -from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification +from BaseClasses import Item, MultiWorld, Location, Tutorial, ItemClassification, CollectionState +from Options import Accessibility, OptionError from worlds.AutoWorld import WebWorld, World -from . import ItemNames -from .Items import StarcraftItem, filler_items, get_item_table, get_full_item_list, \ - get_basic_units, ItemData, upgrade_included_names, progressive_if_nco, kerrigan_actives, kerrigan_passives, \ - kerrigan_only_passives, progressive_if_ext, not_balanced_starting_units, spear_of_adun_calldowns, \ - spear_of_adun_castable_passives, nova_equipment -from .ItemGroups import item_name_groups -from .Locations import get_locations, LocationType, get_location_types, get_plando_locations -from .Regions import create_regions -from .Options import get_option_value, LocationInclusion, KerriganLevelItemDistribution, \ - KerriganPresence, KerriganPrimalStatus, RequiredTactics, kerrigan_unit_available, StarterUnit, SpearOfAdunPresence, \ - get_enabled_campaigns, SpearOfAdunAutonomouslyCastAbilityPresence, Starcraft2Options -from .PoolFilter import filter_items, get_item_upgrades, UPGRADABLE_ITEMS, missions_in_mission_table, get_used_races -from .MissionTables import MissionInfo, SC2Campaign, lookup_name_to_mission, SC2Mission, \ - SC2Race +from . import location_groups +from .item.item_groups import unreleased_items, war_council_upgrades +from .item.item_tables import ( + get_full_item_list, + not_balanced_starting_units, WEAPON_ARMOR_UPGRADE_MAX_LEVEL, +) +from .item import FilterItem, ItemFilterFlags, StarcraftItem, item_groups, item_names, item_tables, item_parents, \ + ZergItemType, ProtossItemType, ItemData +from .locations import ( + get_locations, DEFAULT_LOCATION_LIST, get_location_types, get_location_flags, + get_plando_locations, LocationType, lookup_location_id_to_type +) +from .mission_order.layout_types import Gauntlet +from .options import ( + get_option_value, LocationInclusion, KerriganLevelItemDistribution, + KerriganPresence, KerriganPrimalStatus, kerrigan_unit_available, StarterUnit, SpearOfAdunPresence, + get_enabled_campaigns, SpearOfAdunPassiveAbilityPresence, Starcraft2Options, + GrantStoryTech, GenericUpgradeResearch, RequiredTactics, + upgrade_included_names, EnableVoidTrade, FillerItemsDistribution, MissionOrderScouting, option_groups, + NovaGhostOfAChanceVariant, MissionOrder, VanillaItemsOnly, ExcludeOverpoweredItems, + is_mission_in_soa_presence, +) +from .rules import get_basic_units, SC2Logic +from . import settings +from .pool_filter import filter_items +from .mission_tables import SC2Campaign, SC2Mission, SC2Race, MissionFlag +from .regions import create_mission_order +from .mission_order import SC2MissionOrder +from worlds.LauncherComponents import components, Component, launch as launch_component +logger = logging.getLogger("Starcraft 2") +VICTORY_MODULO = 100 + +def launch_client(*args: str): + from .client import launch + launch_component(launch, name="Starcraft 2 Client", args=args) + +components.append(Component('Starcraft 2 Client', func=launch_client, game_name='Starcraft 2', supports_uri=True)) class Starcraft2WebWorld(WebWorld): setup_en = Tutorial( @@ -40,8 +64,18 @@ class Starcraft2WebWorld(WebWorld): ["Neocerber"] ) - tutorials = [setup_en, setup_fr] + custom_mission_orders_en = Tutorial( + "Custom Mission Order Usage Guide", + "Documentation for the custom_mission_order YAML option", + "English", + "custom_mission_orders_en.md", + "custom_mission_orders/en", + ["Salzkorn"] + ) + + tutorials = [setup_en, setup_fr, custom_mission_orders_en] game_info_languages = ["en", "fr"] + option_groups = option_groups class SC2World(World): @@ -52,90 +86,279 @@ class SC2World(World): game = "Starcraft 2" web = Starcraft2WebWorld() + settings: ClassVar[settings.Starcraft2Settings] item_name_to_id = {name: data.code for name, data in get_full_item_list().items()} - location_name_to_id = {location.name: location.code for location in get_locations(None)} + location_name_to_id = {location.name: location.code for location in DEFAULT_LOCATION_LIST} options_dataclass = Starcraft2Options options: Starcraft2Options - item_name_groups = item_name_groups - locked_locations: typing.List[str] - location_cache: typing.List[Location] - mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = {} - final_mission_id: int - victory_item: str - required_client_version = 0, 4, 5 + item_name_groups = item_groups.item_name_groups # type: ignore + location_name_groups = location_groups.get_location_groups() + locked_locations: List[str] + """Locations locked to contain specific items, such as victory events or forced resources""" + location_cache: List[Location] + final_missions: List[int] + required_client_version = 0, 6, 4 + custom_mission_order: SC2MissionOrder + logic: Optional['SC2Logic'] + filler_items_distribution: Dict[str, int] def __init__(self, multiworld: MultiWorld, player: int): super(SC2World, self).__init__(multiworld, player) self.location_cache = [] self.locked_locations = [] + self.filler_items_distribution = FillerItemsDistribution.default + self.logic = None - def create_item(self, name: str) -> Item: + def create_item(self, name: str) -> StarcraftItem: data = get_full_item_list()[name] return StarcraftItem(name, data.classification, data.code, self.player) def create_regions(self): - self.mission_req_table, self.final_mission_id, self.victory_item = create_regions( + self.logic = SC2Logic(self) + self.custom_mission_order = create_mission_order( self, get_locations(self), self.location_cache ) + self.logic.nova_used = ( + MissionFlag.Nova in self.custom_mission_order.get_used_flags() + or ( + MissionFlag.WoLNova in self.custom_mission_order.get_used_flags() + and self.options.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_nco + ) + ) + + def create_items(self) -> None: + # Starcraft 2-specific item setup: + # * Filter item pool based on player options + # * Plando starter units + # * Start-inventory units if necessary for logic + # * Plando filler items based on location exclusions + # * If the item pool is less than the location count, add some filler items - def create_items(self): setup_events(self.player, self.locked_locations, self.location_cache) + set_up_filler_items_distribution(self) - excluded_items = get_excluded_items(self) + item_list: List[FilterItem] = create_and_flag_explicit_item_locks_and_excludes(self) + flag_excludes_by_faction_presence(self, item_list) + flag_mission_based_item_excludes(self, item_list) + flag_allowed_orphan_items(self, item_list) + flag_start_inventory(self, item_list) + flag_unused_upgrade_types(self, item_list) + flag_unreleased_items(item_list) + flag_user_excluded_item_sets(self, item_list) + flag_war_council_items(self, item_list) + flag_and_add_resource_locations(self, item_list) + flag_mission_order_required_items(self, item_list) + pruned_items: List[StarcraftItem] = prune_item_pool(self, item_list) - starter_items = assign_starter_items(self, excluded_items, self.locked_locations, self.location_cache) + start_inventory = [item for item in pruned_items if ItemFilterFlags.StartInventory in item.filter_flags] + pool = [item for item in pruned_items if ItemFilterFlags.StartInventory not in item.filter_flags] - fill_resource_locations(self, self.locked_locations, self.location_cache) + # Tell the logic which unit classes are used for required W/A upgrades + used_item_names: Set[str] = {item.name for item in pruned_items} + used_item_names = used_item_names.union(item.name for item in self.multiworld.itempool if item.player == self.player) + assert self.logic is not None + if used_item_names.isdisjoint(item_groups.barracks_wa_group): + self.logic.has_barracks_unit = False + if used_item_names.isdisjoint(item_groups.factory_wa_group): + self.logic.has_factory_unit = False + if used_item_names.isdisjoint(item_groups.starport_wa_group): + self.logic.has_starport_unit = False + if used_item_names.isdisjoint(item_groups.zerg_melee_wa): + self.logic.has_zerg_melee_unit = False + if used_item_names.isdisjoint(item_groups.zerg_ranged_wa): + self.logic.has_zerg_ranged_unit = False + if used_item_names.isdisjoint(item_groups.zerg_air_units): + self.logic.has_zerg_air_unit = False + if used_item_names.isdisjoint(item_groups.protoss_ground_wa): + self.logic.has_protoss_ground_unit = False + if used_item_names.isdisjoint(item_groups.protoss_air_wa): + self.logic.has_protoss_air_unit = False - pool = get_item_pool(self, self.mission_req_table, starter_items, excluded_items, self.location_cache) + pad_item_pool_with_filler(self, len(self.location_cache) - len(self.locked_locations) - len(pool), pool) - fill_item_pool_with_dummy_items(self, self.locked_locations, self.location_cache, pool) + push_precollected_items_to_multiworld(self, start_inventory) self.multiworld.itempool += pool - def set_rules(self): - self.multiworld.completion_condition[self.player] = lambda state: state.has(self.victory_item, self.player) + def set_rules(self) -> None: + if self.options.required_tactics == RequiredTactics.option_no_logic: + # Forcing completed goal and minimal accessibility on no logic + self.options.accessibility.value = Accessibility.option_minimal + required_items = self.custom_mission_order.get_items_to_lock() + self.multiworld.completion_condition[self.player] = lambda state, required_items=required_items: all( # type: ignore + state.has(item, self.player, amount) for (item, amount) in required_items.items() + ) + else: + self.multiworld.completion_condition[self.player] = self.custom_mission_order.get_completion_condition(self.player) def get_filler_item_name(self) -> str: - return self.random.choice(filler_items) + # Assume `self.filler_items_distribution` is validated and has at least one non-zero entry + return self.random.choices(tuple(self.filler_items_distribution), weights=self.filler_items_distribution.values())[0] # type: ignore - def fill_slot_data(self): - slot_data = {} + def fill_slot_data(self) -> Mapping[str, Any]: + slot_data: Dict[str, Any] = {} for option_name in [field.name for field in fields(Starcraft2Options)]: option = get_option_value(self, option_name) if type(option) in {str, int}: slot_data[option_name] = int(option) - slot_req_table = {} - - # Serialize data - for campaign in self.mission_req_table: - slot_req_table[campaign.id] = {} - for mission in self.mission_req_table[campaign]: - slot_req_table[campaign.id][mission] = self.mission_req_table[campaign][mission]._asdict() - # Replace mission objects with mission IDs - slot_req_table[campaign.id][mission]["mission"] = slot_req_table[campaign.id][mission]["mission"].id - - for index in range(len(slot_req_table[campaign.id][mission]["required_world"])): - # TODO this is a band-aid, sometimes the mission_req_table already contains dicts - # as far as I can tell it's related to having multiple vanilla mission orders - if not isinstance(slot_req_table[campaign.id][mission]["required_world"][index], dict): - slot_req_table[campaign.id][mission]["required_world"][index] = slot_req_table[campaign.id][mission]["required_world"][index]._asdict() enabled_campaigns = get_enabled_campaigns(self) slot_data["plando_locations"] = get_plando_locations(self) - slot_data["nova_covert_ops_only"] = (enabled_campaigns == {SC2Campaign.NCO}) - slot_data["mission_req"] = slot_req_table - slot_data["final_mission"] = self.final_mission_id - slot_data["version"] = 3 + slot_data["use_nova_nco_fallback"] = ( + enabled_campaigns == {SC2Campaign.NCO} + and self.options.mission_order == MissionOrder.option_vanilla + ) + if (self.options.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_nco + or ( + self.options.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_auto + and MissionFlag.Nova in self.custom_mission_order.get_used_flags().keys() + ) + ): + slot_data["use_nova_wol_fallback"] = False + else: + slot_data["use_nova_wol_fallback"] = True + slot_data["final_mission_ids"] = self.custom_mission_order.get_final_mission_ids() + slot_data["custom_mission_order"] = self.custom_mission_order.get_slot_data() + slot_data["version"] = 4 if SC2Campaign.HOTS not in enabled_campaigns: slot_data["kerrigan_presence"] = KerriganPresence.option_not_present + + if self.options.mission_order_scouting != MissionOrderScouting.option_none: + mission_item_classification: Dict[str, int] = {} + for location in self.multiworld.get_locations(self.player): + # Event do not hold items + if not location.is_event: + assert location.address is not None + assert location.item is not None + if lookup_location_id_to_type[location.address] == LocationType.VICTORY_CACHE: + # Ensure that if there are multiple items given for finishing a mission and that at least + # one is progressive, the flag kept is progressive. + location_name = self.location_id_to_name[(location.address // VICTORY_MODULO) * VICTORY_MODULO] + old_classification = mission_item_classification.get(location_name, 0) + mission_item_classification[location_name] = old_classification | location.item.classification.as_flag() + else: + mission_item_classification[location.name] = location.item.classification.as_flag() + slot_data["mission_item_classification"] = mission_item_classification + + # Disable trade if there is no trade partner + traders = [ + world + for world in self.multiworld.worlds.values() + if world.game == self.game and world.options.enable_void_trade == EnableVoidTrade.option_true # type: ignore + ] + if len(traders) < 2: + slot_data["enable_void_trade"] = EnableVoidTrade.option_false + return slot_data + def pre_fill(self) -> None: + assert self.logic is not None + self.logic.total_mission_count = self.custom_mission_order.get_mission_count() + if ( + self.options.generic_upgrade_missions > 0 + and self.options.required_tactics != RequiredTactics.option_no_logic + ): + # Attempt to resolve a situation when the option is too high for the mission order rolled + weapon_armor_item_names = [ + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE + ] + def state_with_kerrigan_levels() -> CollectionState: + state: CollectionState = self.multiworld.get_all_state(False) + # Ignore dead ends caused by Kerrigan -> solve those in the next stage + state.collect(self.create_item(item_names.KERRIGAN_LEVELS_70)) + state.update_reachable_regions(self.player) + return state -def setup_events(player: int, locked_locations: typing.List[str], location_cache: typing.List[Location]): + self._fill_needed_items(state_with_kerrigan_levels, weapon_armor_item_names, WEAPON_ARMOR_UPGRADE_MAX_LEVEL) + if ( + self.options.kerrigan_levels_per_mission_completed > 0 + and self.options.required_tactics != RequiredTactics.option_no_logic + ): + # Attempt to solve being locked by Kerrigan level requirements + self._fill_needed_items(lambda: self.multiworld.get_all_state(False), [item_names.KERRIGAN_LEVELS_1], 70) + + + def _fill_needed_items(self, all_state_getter: Callable[[],CollectionState], items_to_use: List[str], max_attempts: int) -> None: + """ + Helper for pre-fill, seeks if the world is actually solvable and inserts items to start inventory if necessary. + :param all_state_getter: + :param items_to_use: + :param max_attempts: + :return: + """ + for attempt in range(0, max_attempts): + all_state: CollectionState = all_state_getter() + location_failed = False + for location in self.location_cache: + if not (all_state.can_reach_location(location.name, self.player) + and all_state.can_reach_region(location.parent_region.name, self.player)): + location_failed = True + break + if location_failed: + for item_name in items_to_use: + item = self.multiworld.create_item(item_name, self.player) + self.multiworld.push_precollected(item) + else: + return + + + def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]) -> None: + """ + Generate information to hint where each mission is actually located in the mission order + :param hint_data: + """ + hint_data[self.player] = {} + for campaign in self.custom_mission_order.mission_order_node.campaigns: + for layout in campaign.layouts: + columns = layout.layout_type.get_visual_layout() + is_single_row_layout = max([len(column) for column in columns]) == 1 + for column_index, column in enumerate(columns): + for row_index, layout_mission in enumerate(column): + slot = layout.missions[layout_mission] + if hasattr(slot, "mission") and slot.mission is not None: + mission = slot.mission + campaign_name = campaign.get_visual_name() + layout_name = layout.get_visual_name() + if isinstance(layout.layout_type, Gauntlet): + # Linearize Gauntlet + column_name = str( + layout_mission + 1 + if layout_mission >= 0 + else layout.layout_type.size + layout_mission + 1 + ) + row_name = "" + else: + column_name = "" if len(columns) == 1 else _get_column_display(column_index, is_single_row_layout) + row_name = "" if is_single_row_layout else str(1 + row_index) + mission_position_name: str = campaign_name + " " + layout_name + " " + column_name + row_name + mission_position_name = mission_position_name.strip().replace(" ", " ") + if mission_position_name != "": + for location in self.get_region(mission.mission_name).get_locations(): + if location.address is not None: + hint_data[self.player][location.address] = mission_position_name + + +def _get_column_display(index: int, single_row_layout: bool) -> str: + """ + Helper function to display column name + :param index: + :param single_row_layout: + :return: + """ + if single_row_layout: + return str(index + 1) + else: + # Convert column name to a letter, from Z continue with AA and so on + f: Callable[[int], str] = lambda x: "" if x == 0 else f((x - 1) // 26) + chr((x - 1) % 26 + ord("A")) + return f(index + 1) + + +def setup_events(player: int, locked_locations: List[str], location_cache: List[Location]) -> None: for location in location_cache: if location.address is None: item = Item(location.name, ItemClassification.progression, None, player) @@ -145,319 +368,663 @@ def setup_events(player: int, locked_locations: typing.List[str], location_cache location.place_locked_item(item) -def get_excluded_items(world: World) -> Set[str]: - excluded_items: Set[str] = set(get_option_value(world, 'excluded_items')) - for item in world.multiworld.precollected_items[world.player]: - excluded_items.add(item.name) - locked_items: Set[str] = set(get_option_value(world, 'locked_items')) - # Starter items are also excluded items - starter_items: Set[str] = set(get_option_value(world, 'start_inventory')) - item_table = get_full_item_list() - soa_presence = get_option_value(world, "spear_of_adun_presence") - soa_autocast_presence = get_option_value(world, "spear_of_adun_autonomously_cast_ability_presence") - enabled_campaigns = get_enabled_campaigns(world) +def create_and_flag_explicit_item_locks_and_excludes(world: SC2World) -> List[FilterItem]: + """ + Handles `excluded_items`, `locked_items`, and `start_inventory` + Returns a list of all possible non-filler items that can be added, with an accompanying flags bitfield. + """ + excluded_items = world.options.excluded_items + unexcluded_items = world.options.unexcluded_items + locked_items = world.options.locked_items + start_inventory = world.options.start_inventory + key_items = world.custom_mission_order.get_items_to_lock() - # Ensure no item is both guaranteed and excluded - invalid_items = excluded_items.intersection(locked_items) - invalid_count = len(invalid_items) - # Don't count starter items that can appear multiple times - invalid_count -= len([item for item in starter_items.intersection(locked_items) if item_table[item].quantity != 1]) - if invalid_count > 0: - raise Exception(f"{invalid_count} item{'s are' if invalid_count > 1 else ' is'} both locked and excluded from generation. Please adjust your excluded items and locked items.") + def resolve_count(count: Optional[int], max_count: int) -> int: + if count == 0: + return max_count + if count is None: + return 0 + if max_count == 0: + return count + return min(count, max_count) + + auto_excludes = {item_name: 1 for item_name in item_groups.legacy_items} + if world.options.exclude_overpowered_items.value == ExcludeOverpoweredItems.option_true: + for item_name in item_groups.overpowered_items: + auto_excludes[item_name] = 1 - def smart_exclude(item_choices: Set[str], choices_to_keep: int): - expected_choices = len(item_choices) - if expected_choices == 0: - return - item_choices = set(item_choices) - starter_choices = item_choices.intersection(starter_items) - excluded_choices = item_choices.intersection(excluded_items) - item_choices.difference_update(excluded_choices) - item_choices.difference_update(locked_items) - candidates = sorted(item_choices) - exclude_amount = min(expected_choices - choices_to_keep - len(excluded_choices) + len(starter_choices), len(candidates)) - if exclude_amount > 0: - excluded_items.update(world.random.sample(candidates, exclude_amount)) + result: List[FilterItem] = [] + for item_name, item_data in item_tables.item_table.items(): + max_count = item_data.quantity + auto_excluded_count = auto_excludes.get(item_name) + excluded_count = excluded_items.get(item_name, auto_excluded_count) + unexcluded_count = unexcluded_items.get(item_name) + locked_count = locked_items.get(item_name) + start_count: Optional[int] = start_inventory.get(item_name) + key_count = key_items.get(item_name, 0) + # specifying 0 in the yaml means exclude / lock all + # start_inventory doesn't allow specifying 0 + # not specifying means don't exclude/lock/start + excluded_count = resolve_count(excluded_count, max_count) + unexcluded_count = resolve_count(unexcluded_count, max_count) + locked_count = resolve_count(locked_count, max_count) + start_count = resolve_count(start_count, max_count) - # Nova gear exclusion if NCO not in campaigns - if SC2Campaign.NCO not in enabled_campaigns: - excluded_items = excluded_items.union(nova_equipment) + excluded_count = max(0, excluded_count - unexcluded_count) - kerrigan_presence = get_option_value(world, "kerrigan_presence") - # Exclude Primal Form item if option is not set or Kerrigan is unavailable - if get_option_value(world, "kerrigan_primal_status") != KerriganPrimalStatus.option_item or \ - (kerrigan_presence in {KerriganPresence.option_not_present, KerriganPresence.option_not_present_and_no_passives}): - excluded_items.add(ItemNames.KERRIGAN_PRIMAL_FORM) + # Priority: start_inventory >> locked_items >> excluded_items >> unspecified + if max_count == 0: + if excluded_count: + logger.warning(f"Item {item_name} was listed as excluded, but as a filler item, it cannot be explicitly excluded.") + excluded_count = 0 + max_count = start_count + locked_count + elif start_count > max_count: + logger.warning(f"Item {item_name} had start amount greater than maximum amount ({start_count} > {max_count}). Capping start amount to max.") + start_count = max_count + locked_count = 0 + excluded_count = 0 + elif locked_count + start_count > max_count: + logger.warning(f"Item {item_name} had locked + start amount greater than maximum amount " + f"({locked_count} + {start_count} > {max_count}). Capping locked amount to max - start.") + locked_count = max_count - start_count + excluded_count = 0 + elif excluded_count + locked_count + start_count > max_count: + logger.warning(f"Item {item_name} had excluded + locked + start amounts greater than maximum amount " + f"({excluded_count} + {locked_count} + {start_count} > {max_count}). Decreasing excluded amount.") + excluded_count = max_count - start_count - locked_count + # Make sure the final count creates enough items to satisfy key requirements + final_count = max(max_count, key_count) + for index in range(final_count): + result.append(FilterItem(item_name, item_data, index)) + if index < start_count: + result[-1].flags |= ItemFilterFlags.StartInventory + if index < locked_count + start_count: + result[-1].flags |= ItemFilterFlags.Locked + if item_name in world.options.non_local_items: + result[-1].flags |= ItemFilterFlags.NonLocal + if index >= max(max_count - excluded_count, key_count): + result[-1].flags |= ItemFilterFlags.UserExcluded + return result - # no Kerrigan & remove all passives => remove all abilities - if kerrigan_presence == KerriganPresence.option_not_present_and_no_passives: - for tier in range(7): - smart_exclude(kerrigan_actives[tier].union(kerrigan_passives[tier]), 0) + +def flag_excludes_by_faction_presence(world: SC2World, item_list: List[FilterItem]) -> None: + """Excludes items based on if their faction has a mission present where they can be used""" + missions = get_all_missions(world.custom_mission_order) + if world.options.take_over_ai_allies.value: + terran_missions = [mission for mission in missions if (MissionFlag.Terran|MissionFlag.AiTerranAlly) & mission.flags] + zerg_missions = [mission for mission in missions if (MissionFlag.Zerg|MissionFlag.AiZergAlly) & mission.flags] + protoss_missions = [mission for mission in missions if (MissionFlag.Protoss|MissionFlag.AiProtossAlly) & mission.flags] else: - # no Kerrigan, but keep non-Kerrigan passives - if kerrigan_presence == KerriganPresence.option_not_present: - smart_exclude(kerrigan_only_passives, 0) - for tier in range(7): - smart_exclude(kerrigan_actives[tier], 0) + terran_missions = [mission for mission in missions if MissionFlag.Terran in mission.flags] + zerg_missions = [mission for mission in missions if MissionFlag.Zerg in mission.flags] + protoss_missions = [mission for mission in missions if MissionFlag.Protoss in mission.flags] + terran_build_missions = [mission for mission in terran_missions if MissionFlag.NoBuild not in mission.flags] + zerg_build_missions = [mission for mission in zerg_missions if MissionFlag.NoBuild not in mission.flags] + protoss_build_missions = [mission for mission in protoss_missions if MissionFlag.NoBuild not in mission.flags] + auto_upgrades_in_nobuilds = ( + world.options.generic_upgrade_research.value + in (GenericUpgradeResearch.option_always_auto, GenericUpgradeResearch.option_auto_in_no_build) + ) - # SOA exclusion, other cases are handled by generic race logic - if (soa_presence == SpearOfAdunPresence.option_lotv_protoss and SC2Campaign.LOTV not in enabled_campaigns) \ - or soa_presence == SpearOfAdunPresence.option_not_present: - excluded_items.update(spear_of_adun_calldowns) - if (soa_autocast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_lotv_protoss \ - and SC2Campaign.LOTV not in enabled_campaigns) \ - or soa_autocast_presence == SpearOfAdunAutonomouslyCastAbilityPresence.option_not_present: - excluded_items.update(spear_of_adun_castable_passives) + for item in item_list: + # Catch-all for all of a faction's items + # Unit upgrades required for no-builds will get the FilterExcluded lifted when flagging AllowedOrphan + if not terran_build_missions and item.data.race == SC2Race.TERRAN: + if item.name not in item_groups.nova_equipment: + item.flags |= ItemFilterFlags.FilterExcluded + continue + if not zerg_missions and item.data.race == SC2Race.ZERG: + if item.data.type != item_tables.ZergItemType.Ability \ + and item.data.type != ZergItemType.Level: + item.flags |= ItemFilterFlags.FilterExcluded + continue + if not protoss_missions and item.data.race == SC2Race.PROTOSS: + if item.name not in item_groups.soa_items: + item.flags |= ItemFilterFlags.FilterExcluded + continue - return excluded_items + # Faction units + if (not zerg_build_missions + and item.data.type in (item_tables.ZergItemType.Unit, item_tables.ZergItemType.Mercenary, item_tables.ZergItemType.Evolution_Pit) + ): + if (SC2Mission.ENEMY_WITHIN not in missions + or world.options.grant_story_tech.value == GrantStoryTech.option_grant + or item.name not in (item_names.ZERGLING, item_names.ROACH, item_names.HYDRALISK, item_names.INFESTOR) + ): + item.flags |= ItemFilterFlags.FilterExcluded + if (not protoss_build_missions + and item.data.type in ( + item_tables.ProtossItemType.Unit, + item_tables.ProtossItemType.Unit_2, + item_tables.ProtossItemType.Building, + ) + ): + # Note(mm): This doesn't exclude things like automated assimilators or warp gate improvements + # because that item type is mixed in with e.g. Reconstruction Beam and Overwatch + if (SC2Mission.TEMPLAR_S_RETURN not in missions + or world.options.grant_story_tech.value == GrantStoryTech.option_grant + or item.name not in ( + item_names.IMMORTAL, item_names.ANNIHILATOR, + item_names.COLOSSUS, item_names.VANGUARD, item_names.REAVER, item_names.DARK_TEMPLAR, + item_names.SENTRY, item_names.HIGH_TEMPLAR, + ) + ): + item.flags |= ItemFilterFlags.FilterExcluded + + # Faction +attack/armour upgrades + if (item.data.type == item_tables.TerranItemType.Upgrade + and not terran_build_missions + and not auto_upgrades_in_nobuilds + ): + item.flags |= ItemFilterFlags.FilterExcluded + if (item.data.type == item_tables.ZergItemType.Upgrade + and not zerg_build_missions + and not auto_upgrades_in_nobuilds + ): + item.flags |= ItemFilterFlags.FilterExcluded + if (item.data.type == item_tables.ProtossItemType.Upgrade + and not protoss_build_missions + and not auto_upgrades_in_nobuilds + ): + item.flags |= ItemFilterFlags.FilterExcluded -def assign_starter_items(world: World, excluded_items: Set[str], locked_locations: List[str], location_cache: typing.List[Location]) -> List[Item]: - starter_items: List[Item] = [] - non_local_items = get_option_value(world, "non_local_items") - starter_unit = get_option_value(world, "starter_unit") - enabled_campaigns = get_enabled_campaigns(world) - first_mission = get_first_mission(world.mission_req_table) - # Ensuring that first mission is completable +def flag_mission_based_item_excludes(world: SC2World, item_list: List[FilterItem]) -> None: + """ + Excludes items based on mission / campaign presence: Nova Gear, Kerrigan abilities, SOA + """ + missions = get_all_missions(world.custom_mission_order) + + kerrigan_missions = [mission for mission in missions if MissionFlag.Kerrigan in mission.flags] + kerrigan_build_missions = [mission for mission in kerrigan_missions if MissionFlag.NoBuild not in mission.flags] + nova_missions = [ + mission for mission in missions + if MissionFlag.Nova in mission.flags + or ( + world.options.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_nco + and MissionFlag.WoLNova in mission.flags + ) + ] + + kerrigan_is_present = ( + len(kerrigan_missions) > 0 + and world.options.kerrigan_presence in kerrigan_unit_available + and SC2Campaign.HOTS in get_enabled_campaigns(world) # TODO: Kerrigan available all Zerg/Everywhere + ) + + # TvX build missions -- check flags + if world.options.take_over_ai_allies: + terran_build_missions = [mission for mission in missions if ( + (MissionFlag.Terran in mission.flags or MissionFlag.AiTerranAlly in mission.flags) + and MissionFlag.NoBuild not in mission.flags + )] + else: + terran_build_missions = [mission for mission in missions if ( + MissionFlag.Terran in mission.flags + and MissionFlag.NoBuild not in mission.flags + )] + tvz_build_missions = [mission for mission in terran_build_missions if MissionFlag.VsZerg in mission.flags] + tvp_build_missions = [mission for mission in terran_build_missions if MissionFlag.VsProtoss in mission.flags] + tvt_build_missions = [mission for mission in terran_build_missions if MissionFlag.VsTerran in mission.flags] + + # Check if SOA actives should be present + if world.options.spear_of_adun_presence != SpearOfAdunPresence.option_not_present: + soa_missions = missions + soa_missions = [ + m for m in soa_missions + if is_mission_in_soa_presence(world.options.spear_of_adun_presence.value, m) + ] + if not world.options.spear_of_adun_present_in_no_build: + soa_missions = [m for m in soa_missions if MissionFlag.NoBuild not in m.flags] + soa_presence = len(soa_missions) > 0 + else: + soa_presence = False + + # Check if SOA passives should be present + if world.options.spear_of_adun_passive_ability_presence != SpearOfAdunPassiveAbilityPresence.option_not_present: + soa_missions = missions + soa_missions = [ + m for m in soa_missions + if is_mission_in_soa_presence( + world.options.spear_of_adun_passive_ability_presence.value, + m, + SpearOfAdunPassiveAbilityPresence + ) + ] + if not world.options.spear_of_adun_passive_present_in_no_build: + soa_missions = [m for m in soa_missions if MissionFlag.NoBuild not in m.flags] + soa_passive_presence = len(soa_missions) > 0 + else: + soa_passive_presence = False + + remove_kerrigan_abils = ( + # TODO: Kerrigan presence Zerg/Everywhere + not kerrigan_is_present + or (world.options.grant_story_tech.value == GrantStoryTech.option_grant and not kerrigan_build_missions) + or ( + world.options.grant_story_tech.value == GrantStoryTech.option_allow_substitutes + and len(kerrigan_missions) == 1 + and kerrigan_missions[0] == SC2Mission.SUPREME + ) + ) + + for item in item_list: + # Filter Nova equipment if you never get Nova + if not nova_missions and (item.name in item_groups.nova_equipment): + item.flags |= ItemFilterFlags.FilterExcluded + + # Todo(mm): How should no-build only / grant_story_tech affect excluding Kerrigan items? + # Exclude Primal form based on Kerrigan presence or primal form option + if (item.data.type == item_tables.ZergItemType.Primal_Form + and ((not kerrigan_is_present) or world.options.kerrigan_primal_status != KerriganPrimalStatus.option_item) + ): + item.flags |= ItemFilterFlags.FilterExcluded + + # Remove Kerrigan abilities if there's no kerrigan + if item.data.type == item_tables.ZergItemType.Ability and remove_kerrigan_abils: + item.flags |= ItemFilterFlags.FilterExcluded + + # Remove Spear of Adun if it's off + if item.name in item_tables.spear_of_adun_calldowns and not soa_presence: + item.flags |= ItemFilterFlags.FilterExcluded + + # Remove Spear of Adun passives + if item.name in item_tables.spear_of_adun_castable_passives and not soa_passive_presence: + item.flags |= ItemFilterFlags.FilterExcluded + + # Remove matchup-specific items if you don't play that matchup + if (item.name in (item_names.HIVE_MIND_EMULATOR, item_names.PSI_DISRUPTER) + and not tvz_build_missions + ): + item.flags |= ItemFilterFlags.FilterExcluded + if (item.name in (item_names.PSI_INDOCTRINATOR, item_names.SONIC_DISRUPTER) + and not tvt_build_missions + ): + item.flags |= ItemFilterFlags.FilterExcluded + if (item.name in (item_names.PSI_SCREEN, item_names.ARGUS_AMPLIFIER) + and not tvp_build_missions + ): + item.flags |= ItemFilterFlags.FilterExcluded + return + + +def flag_allowed_orphan_items(world: SC2World, item_list: List[FilterItem]) -> None: + """Adds the `Allowed_Orphan` flag to items that shouldn't be filtered with their parents, like combat shield""" + missions = get_all_missions(world.custom_mission_order) + if SC2Mission.PIERCING_OF_THE_SHROUD in missions: + for item in item_list: + if item.name in ( + item_names.MARINE_COMBAT_SHIELD, item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MARINE_MAGRAIL_MUNITIONS, + item_names.MEDIC_STABILIZER_MEDPACKS, item_names.MARINE_LASER_TARGETING_SYSTEM, + ): + item.flags |= ItemFilterFlags.AllowedOrphan + item.flags &= ~ItemFilterFlags.FilterExcluded + # These rules only trigger on Standard tactics + if SC2Mission.BELLY_OF_THE_BEAST in missions and world.options.required_tactics == RequiredTactics.option_standard: + for item in item_list: + if item.name in ( + item_names.MARINE_COMBAT_SHIELD, item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MARINE_MAGRAIL_MUNITIONS, + item_names.MEDIC_STABILIZER_MEDPACKS, item_names.MARINE_LASER_TARGETING_SYSTEM, + item_names.FIREBAT_NANO_PROJECTORS, item_names.FIREBAT_JUGGERNAUT_PLATING, item_names.FIREBAT_PROGRESSIVE_STIMPACK + ): + item.flags |= ItemFilterFlags.AllowedOrphan + item.flags &= ~ItemFilterFlags.FilterExcluded + if SC2Mission.EVIL_AWOKEN in missions and world.options.required_tactics == RequiredTactics.option_standard: + for item in item_list: + if item.name in (item_names.STALKER_PHASE_REACTOR, item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION): + item.flags |= ItemFilterFlags.AllowedOrphan + + +def flag_start_inventory(world: SC2World, item_list: List[FilterItem]) -> None: + """Adds items to start_inventory based on first mission logic and options like `starter_unit` and `start_primary_abilities`""" + potential_starters = world.custom_mission_order.get_starting_missions() + starter_mission_names = [mission.mission_name for mission in potential_starters] + starter_unit = int(world.options.starter_unit) + + # If starter_unit is off and the first mission doesn't have a no-logic location, force starter_unit on if starter_unit == StarterUnit.option_off: - starter_mission_locations = [location.name for location in location_cache - if location.parent_region.name == first_mission - and location.access_rule == Location.access_rule] + start_collection_state = CollectionState(world.multiworld) + starter_mission_locations = [location.name for location in world.location_cache + if location.parent_region + and location.parent_region.name in starter_mission_names + and location.access_rule(start_collection_state)] if not starter_mission_locations: # Force early unit if first mission is impossible without one starter_unit = StarterUnit.option_any_starter_unit if starter_unit != StarterUnit.option_off: - first_race = lookup_name_to_mission[first_mission].race + flag_start_unit(world, item_list, starter_unit) - if first_race == SC2Race.ANY: - # If the first mission is a logic-less no-build - mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]] = world.mission_req_table - races = get_used_races(mission_req_table, world) - races.remove(SC2Race.ANY) - if lookup_name_to_mission[first_mission].race in races: - # The campaign's race is in (At least one mission that's not logic-less no-build exists) - first_race = lookup_name_to_mission[first_mission].campaign.race - elif len(races) > 0: - # The campaign only has logic-less no-build missions. Find any other valid race - first_race = world.random.choice(list(races)) - - if first_race != SC2Race.ANY: - # The race of the early unit has been chosen - basic_units = get_basic_units(world, first_race) - if starter_unit == StarterUnit.option_balanced: - basic_units = basic_units.difference(not_balanced_starting_units) - if first_mission == SC2Mission.DARK_WHISPERS.mission_name: - # Special case - you don't have a logicless location but need an AA - basic_units = basic_units.difference( - {ItemNames.ZEALOT, ItemNames.CENTURION, ItemNames.SENTINEL, ItemNames.BLOOD_HUNTER, - ItemNames.AVENGER, ItemNames.IMMORTAL, ItemNames.ANNIHILATOR, ItemNames.VANGUARD}) - if first_mission == SC2Mission.SUDDEN_STRIKE.mission_name: - # Special case - cliffjumpers - basic_units = {ItemNames.REAPER, ItemNames.GOLIATH, ItemNames.SIEGE_TANK, ItemNames.VIKING, ItemNames.BANSHEE} - local_basic_unit = sorted(item for item in basic_units if item not in non_local_items and item not in excluded_items) - if not local_basic_unit: - # Drop non_local_items constraint - local_basic_unit = sorted(item for item in basic_units if item not in excluded_items) - if not local_basic_unit: - raise Exception("Early Unit: At least one basic unit must be included") - - unit: Item = add_starter_item(world, excluded_items, local_basic_unit) - starter_items.append(unit) - - # NCO-only specific rules - if first_mission == SC2Mission.SUDDEN_STRIKE.mission_name: - support_item: Union[str, None] = None - if unit.name == ItemNames.REAPER: - support_item = ItemNames.REAPER_SPIDER_MINES - elif unit.name == ItemNames.GOLIATH: - support_item = ItemNames.GOLIATH_JUMP_JETS - elif unit.name == ItemNames.SIEGE_TANK: - support_item = ItemNames.SIEGE_TANK_JUMP_JETS - elif unit.name == ItemNames.VIKING: - support_item = ItemNames.VIKING_SMART_SERVOS - if support_item is not None: - starter_items.append(add_starter_item(world, excluded_items, [support_item])) - starter_items.append(add_starter_item(world, excluded_items, [ItemNames.NOVA_JUMP_SUIT_MODULE])) - starter_items.append( - add_starter_item(world, excluded_items, - [ - ItemNames.NOVA_HELLFIRE_SHOTGUN, - ItemNames.NOVA_PLASMA_RIFLE, - ItemNames.NOVA_PULSE_GRENADES - ])) - if enabled_campaigns == {SC2Campaign.NCO}: - starter_items.append(add_starter_item(world, excluded_items, [ItemNames.LIBERATOR_RAID_ARTILLERY])) - - starter_abilities = get_option_value(world, 'start_primary_abilities') - assert isinstance(starter_abilities, int) - if starter_abilities: - ability_count = starter_abilities - ability_tiers = [0, 1, 3] - world.random.shuffle(ability_tiers) - if ability_count > 3: - ability_tiers.append(6) - for tier in ability_tiers: - abilities = kerrigan_actives[tier].union(kerrigan_passives[tier]).difference(excluded_items, non_local_items) - if not abilities: - abilities = kerrigan_actives[tier].union(kerrigan_passives[tier]).difference(excluded_items) - if abilities: - ability_count -= 1 - starter_items.append(add_starter_item(world, excluded_items, list(abilities))) - if ability_count == 0: - break - - return starter_items + flag_start_abilities(world, item_list) -def get_first_mission(mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]]) -> str: - # The first world should also be the starting world - campaigns = mission_req_table.keys() - lowest_id = min([campaign.id for campaign in campaigns]) - first_campaign = [campaign for campaign in campaigns if campaign.id == lowest_id][0] - first_mission = list(mission_req_table[first_campaign])[0] - return first_mission +def flag_start_unit(world: SC2World, item_list: List[FilterItem], starter_unit: int) -> None: + first_mission = get_random_first_mission(world, world.custom_mission_order) + first_race = first_mission.race + + if first_race == SC2Race.ANY: + # If the first mission is a logic-less no-build + missions = get_all_missions(world.custom_mission_order) + build_missions = [mission for mission in missions if MissionFlag.NoBuild not in mission.flags] + races = {mission.race for mission in build_missions if mission.race != SC2Race.ANY} + if races: + first_race = world.random.choice(list(races)) + + if first_race != SC2Race.ANY: + possible_starter_items = { + item.name: item for item in item_list if (ItemFilterFlags.Plando|ItemFilterFlags.UserExcluded|ItemFilterFlags.FilterExcluded) & item.flags == 0 + } + + # The race of the early unit has been chosen + basic_units = get_basic_units(world.options.required_tactics.value, first_race) + if starter_unit == StarterUnit.option_balanced: + basic_units = basic_units.difference(not_balanced_starting_units) + if first_mission == SC2Mission.DARK_WHISPERS: + # Special case - you don't have a logicless location but need an AA + basic_units = basic_units.difference( + {item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, item_names.BLOOD_HUNTER, + item_names.AVENGER, item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD}) + if first_mission == SC2Mission.SUDDEN_STRIKE: + # Special case - cliffjumpers + basic_units = {item_names.REAPER, item_names.GOLIATH, item_names.SIEGE_TANK, item_names.VIKING, item_names.BANSHEE} + basic_unit_options = [ + item for item in possible_starter_items.values() + if item.name in basic_units + and ItemFilterFlags.StartInventory not in item.flags + ] + + # For Sudden Strike, starter units need an upgrade to help them get around + nco_support_items = { + item_names.REAPER: item_names.REAPER_SPIDER_MINES, + item_names.GOLIATH: item_names.GOLIATH_JUMP_JETS, + item_names.SIEGE_TANK: item_names.SIEGE_TANK_JUMP_JETS, + item_names.VIKING: item_names.VIKING_SMART_SERVOS, + } + if first_mission == SC2Mission.SUDDEN_STRIKE: + basic_unit_options = [ + item for item in basic_unit_options + if item.name not in nco_support_items + or nco_support_items[item.name] in possible_starter_items + and ((ItemFilterFlags.Plando|ItemFilterFlags.UserExcluded|ItemFilterFlags.FilterExcluded) & possible_starter_items[nco_support_items[item.name]].flags) == 0 + ] + if not basic_unit_options: + raise OptionError("Early Unit: At least one basic unit must be included") + local_basic_unit = [item for item in basic_unit_options if ItemFilterFlags.NonLocal not in item.flags] + if local_basic_unit: + basic_unit_options = local_basic_unit + + unit = world.random.choice(basic_unit_options) + unit.flags |= ItemFilterFlags.StartInventory + + # NCO-only specific rules + if first_mission == SC2Mission.SUDDEN_STRIKE: + if unit.name in nco_support_items: + support_item = possible_starter_items[nco_support_items[unit.name]] + support_item.flags |= ItemFilterFlags.StartInventory + if item_names.NOVA_JUMP_SUIT_MODULE in possible_starter_items: + possible_starter_items[item_names.NOVA_JUMP_SUIT_MODULE].flags |= ItemFilterFlags.StartInventory + if MissionFlag.Nova in first_mission.flags: + possible_starter_weapons = ( + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_PLASMA_RIFLE, + item_names.NOVA_PULSE_GRENADES, + ) + starter_weapon_options = [item for item in possible_starter_items.values() if item.name in possible_starter_weapons] + starter_weapon = world.random.choice(starter_weapon_options) + starter_weapon.flags |= ItemFilterFlags.StartInventory -def add_starter_item(world: World, excluded_items: Set[str], item_list: Sequence[str]) -> Item: - - item_name = world.random.choice(sorted(item_list)) - - excluded_items.add(item_name) - - item = create_item_with_correct_settings(world.player, item_name) - - world.multiworld.push_precollected(item) - - return item +def flag_start_abilities(world: SC2World, item_list: List[FilterItem]) -> None: + starter_abilities = world.options.start_primary_abilities + if not starter_abilities: + return + assert starter_abilities <= 4 + ability_count = int(starter_abilities) + available_abilities = item_groups.kerrigan_non_ulimates + for i in range(ability_count): + potential_starter_abilities = [ + item for item in item_list + if item.name in available_abilities + and (ItemFilterFlags.UserExcluded|ItemFilterFlags.StartInventory|ItemFilterFlags.Plando) & item.flags == 0 + ] + if len(potential_starter_abilities) == 0 or i >= 3: + # Avoid picking an ultimate unless 4 starter abilities were asked for. + # Without this check, it would be possible to pick an ultimate if a previous tier failed + # to pick due to exclusions + available_abilities = item_groups.kerrigan_abilities + potential_starter_abilities = [ + item for item in item_list + if item.name in available_abilities + and (ItemFilterFlags.UserExcluded|ItemFilterFlags.StartInventory|ItemFilterFlags.Plando) & item.flags == 0 + ] + # Try to avoid giving non-local items unless there is no alternative + abilities = [item for item in potential_starter_abilities if ItemFilterFlags.NonLocal not in item.flags] + if not abilities: + abilities = potential_starter_abilities + if abilities: + ability = world.random.choice(abilities) + ability.flags |= ItemFilterFlags.StartInventory -def get_item_pool(world: World, mission_req_table: Dict[SC2Campaign, Dict[str, MissionInfo]], - starter_items: List[Item], excluded_items: Set[str], location_cache: List[Location]) -> List[Item]: - pool: List[Item] = [] - - # For the future: goal items like Artifact Shards go here - locked_items = [] - - # YAML items - yaml_locked_items = get_option_value(world, 'locked_items') - assert not isinstance(yaml_locked_items, int) - - # Adjust generic upgrade availability based on options - include_upgrades = get_option_value(world, 'generic_upgrade_missions') == 0 - upgrade_items = get_option_value(world, 'generic_upgrade_items') - assert isinstance(upgrade_items, int) - - # Include items from outside main campaigns - item_sets = {'wol', 'hots', 'lotv'} - if get_option_value(world, 'nco_items') \ - or SC2Campaign.NCO in get_enabled_campaigns(world): - item_sets.add('nco') - if get_option_value(world, 'bw_items'): - item_sets.add('bw') - if get_option_value(world, 'ext_items'): - item_sets.add('ext') - - def allowed_quantity(name: str, data: ItemData) -> int: - if name in excluded_items \ - or data.type == "Upgrade" and (not include_upgrades or name not in upgrade_included_names[upgrade_items]) \ - or not data.origin.intersection(item_sets): - return 0 - elif name in progressive_if_nco and 'nco' not in item_sets: - return 1 - elif name in progressive_if_ext and 'ext' not in item_sets: - return 1 - else: - return data.quantity - - for name, data in get_item_table().items(): - for _ in range(allowed_quantity(name, data)): - item = create_item_with_correct_settings(world.player, name) - if name in yaml_locked_items: - locked_items.append(item) +def flag_unused_upgrade_types(world: SC2World, item_list: List[FilterItem]) -> None: + """Excludes +armour/attack upgrades based on generic upgrade strategy. + Caps upgrade items based on `max_upgrade_level`.""" + include_upgrades = world.options.generic_upgrade_missions == 0 + upgrade_items = world.options.generic_upgrade_items.value + upgrade_included_counts: Dict[str, int] = {} + for item in item_list: + if item.data.type in item_tables.upgrade_item_types: + if not include_upgrades or (item.name not in upgrade_included_names[upgrade_items]): + item.flags |= ItemFilterFlags.Removed else: - pool.append(item) + included = upgrade_included_counts.get(item.name, 0) + if ( + included >= world.options.max_upgrade_level + and not (ItemFilterFlags.Locked|ItemFilterFlags.StartInventory) & item.flags + ): + item.flags |= ItemFilterFlags.FilterExcluded + elif ItemFilterFlags.UserExcluded not in item.flags: + upgrade_included_counts[item.name] = included + 1 - existing_items = starter_items + [item for item in world.multiworld.precollected_items[world.player] if item not in starter_items] - existing_names = [item.name for item in existing_items] - - # Check the parent item integrity, exclude items - pool[:] = [item for item in pool if pool_contains_parent(item, pool + locked_items + existing_items)] - - # Removing upgrades for excluded items - for item_name in excluded_items: - if item_name in existing_names: - continue - invalid_upgrades = get_item_upgrades(pool, item_name) - for invalid_upgrade in invalid_upgrades: - pool.remove(invalid_upgrade) - - fill_pool_with_kerrigan_levels(world, pool) - filtered_pool = filter_items(world, mission_req_table, location_cache, pool, existing_items, locked_items) - return filtered_pool +def flag_unreleased_items(item_list: List[FilterItem]) -> None: + """Remove all unreleased items unless they're explicitly locked""" + for item in item_list: + if (item.name in unreleased_items + and not (ItemFilterFlags.Locked|ItemFilterFlags.StartInventory) & item.flags): + item.flags |= ItemFilterFlags.Removed -def fill_item_pool_with_dummy_items(self: SC2World, locked_locations: List[str], - location_cache: List[Location], pool: List[Item]): - for _ in range(len(location_cache) - len(locked_locations) - len(pool)): - item = create_item_with_correct_settings(self.player, self.get_filler_item_name()) - pool.append(item) +def flag_user_excluded_item_sets(world: SC2World, item_list: List[FilterItem]) -> None: + """Excludes items based on item set options (`only_vanilla_items`)""" + vanilla_nonprogressive_count = { + item_name: 0 for item_name in item_groups.terran_original_progressive_upgrades + } + if world.options.vanilla_items_only.value == VanillaItemsOnly.option_true: + vanilla_items = item_groups.vanilla_items + item_groups.nova_equipment + for item in item_list: + if ItemFilterFlags.UserExcluded in item.flags: + continue + if item.name not in vanilla_items: + item.flags |= ItemFilterFlags.UserExcluded + if item.name in item_groups.terran_original_progressive_upgrades: + if vanilla_nonprogressive_count[item.name]: + item.flags |= ItemFilterFlags.UserExcluded + vanilla_nonprogressive_count[item.name] += 1 + + excluded_count: Dict[str, int] = dict() -def create_item_with_correct_settings(player: int, name: str) -> Item: - data = get_full_item_list()[name] +def flag_war_council_items(world: SC2World, item_list: List[FilterItem]) -> None: + """Excludes / start-inventories items based on `nerf_unit_baselines` option. + Will skip items that are excluded by other sources.""" + if world.options.war_council_nerfs: + return - item = Item(name, data.classification, data.code, player) - - return item + flagged_item_names = [] + for item in item_list: + if ( + item.name in war_council_upgrades + and not ItemFilterFlags.Excluded & item.flags + and item.name not in flagged_item_names + ): + flagged_item_names.append(item.name) + item.flags |= ItemFilterFlags.StartInventory -def pool_contains_parent(item: Item, pool: Iterable[Item]): - item_data = get_full_item_list().get(item.name) - if item_data.parent_item is None: - # The item has not associated parent, the item is valid - return True - parent_item = item_data.parent_item - # Check if the pool contains the parent item - return parent_item in [pool_item.name for pool_item in pool] - - -def fill_resource_locations(world: World, locked_locations: List[str], location_cache: List[Location]): +def flag_and_add_resource_locations(world: SC2World, item_list: List[FilterItem]) -> None: """ Filters the locations in the world using a trash or Nothing item - :param multiworld: - :param player: - :param locked_locations: - :param location_cache: - :return: + :param world: The sc2 world object + :param item_list: The current list of items to append to """ - open_locations = [location for location in location_cache if location.item is None] + open_locations = [location for location in world.location_cache if location.item is None] plando_locations = get_plando_locations(world) - resource_location_types = get_location_types(world, LocationInclusion.option_resources) - location_data = {sc2_location.name: sc2_location for sc2_location in get_locations(world)} + filler_location_types = get_location_types(world, LocationInclusion.option_filler) + filler_location_flags = get_location_flags(world, LocationInclusion.option_filler) + location_data = {sc2_location.name: sc2_location for sc2_location in DEFAULT_LOCATION_LIST} for location in open_locations: # Go through the locations that aren't locked yet (early unit, etc) if location.name not in plando_locations: # The location is not plando'd sc2_location = location_data[location.name] - if sc2_location.type in resource_location_types: - item_name = world.random.choice(filler_items) + if (sc2_location.type in filler_location_types + or (sc2_location.flags & filler_location_flags) + ): + item_name = world.get_filler_item_name() item = create_item_with_correct_settings(world.player, item_name) + if item.classification & ItemClassification.progression: + # Scouting shall show Filler (or a trap) + item.classification = ItemClassification.filler location.place_locked_item(item) - locked_locations.append(location.name) + world.locked_locations.append(location.name) -def place_exclusion_item(item_name, location, locked_locations, player): - item = create_item_with_correct_settings(player, item_name) - location.place_locked_item(item) - locked_locations.append(location.name) +def flag_mission_order_required_items(world: SC2World, item_list: List[FilterItem]) -> None: + """Marks items that are necessary for item rules in the mission order and forces them to be progression.""" + locks_required = world.custom_mission_order.get_items_to_lock() + locks_done = {item: 0 for item in locks_required} + for item in item_list: + if item.name in locks_required and locks_done[item.name] < locks_required[item.name]: + item.flags |= ItemFilterFlags.Locked + item.flags |= ItemFilterFlags.ForceProgression + locks_done[item.name] += 1 -def fill_pool_with_kerrigan_levels(world: World, item_pool: List[Item]): - total_levels = get_option_value(world, "kerrigan_level_item_sum") - if get_option_value(world, "kerrigan_presence") not in kerrigan_unit_available \ - or total_levels == 0 \ - or SC2Campaign.HOTS not in get_enabled_campaigns(world): +def prune_item_pool(world: SC2World, item_list: List[FilterItem]) -> List[StarcraftItem]: + """Prunes the item pool size to be less than the number of available locations""" + + item_list = [ + item for item in item_list + if (ItemFilterFlags.Removed not in item.flags) + and (ItemFilterFlags.Unexcludable & item.flags or ItemFilterFlags.FilterExcluded not in item.flags) + ] + num_items = len(item_list) + last_num_items = -1 + while num_items != last_num_items: + # Remove orphan items until there are no more being removed + item_name_list = [item.name for item in item_list] + item_list = [item for item in item_list + if (ItemFilterFlags.Unexcludable|ItemFilterFlags.AllowedOrphan) & item.flags + or item_list_contains_parent(world, item.data, item_name_list)] + last_num_items = num_items + num_items = len(item_list) + + pool: List[StarcraftItem] = [] + for item in item_list: + ap_item = create_item_with_correct_settings(world.player, item.name, item.flags) + if ItemFilterFlags.ForceProgression in item.flags: + ap_item.classification = ItemClassification.progression + pool.append(ap_item) + + fill_pool_with_kerrigan_levels(world, pool) + filtered_pool = filter_items(world, world.location_cache, pool) + return filtered_pool + + +def item_list_contains_parent(world: SC2World, item_data: ItemData, item_name_list: List[str]) -> bool: + if item_data.parent is None: + # The item has no associated parent, the item is valid + return True + return item_parents.parent_present[item_data.parent](item_name_list, world.options) + + +def pad_item_pool_with_filler(world: SC2World, num_items: int, pool: List[StarcraftItem]): + for _ in range(num_items): + item = create_item_with_correct_settings(world.player, world.get_filler_item_name()) + pool.append(item) + + +def set_up_filler_items_distribution(world: SC2World) -> None: + world.filler_items_distribution = world.options.filler_items_distribution.value.copy() + + prune_fillers(world) + if sum(world.filler_items_distribution.values()) == 0: + world.filler_items_distribution = FillerItemsDistribution.default.copy() + prune_fillers(world) + + +def prune_fillers(world): + mission_flags = world.custom_mission_order.get_used_flags() + include_protoss = ( + MissionFlag.Protoss in mission_flags + or (world.options.take_over_ai_allies and (MissionFlag.AiProtossAlly in mission_flags)) + ) + include_kerrigan = ( + MissionFlag.Kerrigan in mission_flags + and world.options.kerrigan_presence in kerrigan_unit_available + ) + generic_upgrade_research = world.options.generic_upgrade_research + if not include_protoss: + world.filler_items_distribution.pop(item_names.SHIELD_REGENERATION, 0) + if not include_kerrigan: + world.filler_items_distribution.pop(item_names.KERRIGAN_LEVELS_1, 0) + if (generic_upgrade_research in + [ + GenericUpgradeResearch.option_always_auto, + GenericUpgradeResearch.option_auto_in_build + ] + ): + world.filler_items_distribution.pop(item_names.UPGRADE_RESEARCH_SPEED, 0) + world.filler_items_distribution.pop(item_names.UPGRADE_RESEARCH_COST, 0) + + +def get_random_first_mission(world: SC2World, mission_order: SC2MissionOrder) -> SC2Mission: + # Pick an arbitrary lowest-difficulty starer mission + starting_missions = mission_order.get_starting_missions() + mission_difficulties = [ + (mission_order.mission_pools.get_modified_mission_difficulty(mission), mission) + for mission in starting_missions + ] + mission_difficulties.sort(key = lambda difficulty_mission_tuple: difficulty_mission_tuple[0]) + (lowest_difficulty, _) = mission_difficulties[0] + first_mission_candidates = [mission for (difficulty, mission) in mission_difficulties if difficulty == lowest_difficulty] + return world.random.choice(first_mission_candidates) + + +def get_all_missions(mission_order: SC2MissionOrder) -> List[SC2Mission]: + return mission_order.get_used_missions() + + +def create_item_with_correct_settings(player: int, name: str, filter_flags: ItemFilterFlags = ItemFilterFlags.Available) -> StarcraftItem: + data = item_tables.item_table[name] + + item = StarcraftItem(name, data.classification, data.code, player, filter_flags) + if ItemFilterFlags.ForceProgression & filter_flags: + item.classification = ItemClassification.progression + + return item + + +def fill_pool_with_kerrigan_levels(world: SC2World, item_pool: List[StarcraftItem]): + total_levels = world.options.kerrigan_level_item_sum.value + missions = get_all_missions(world.custom_mission_order) + kerrigan_missions = [mission for mission in missions if MissionFlag.Kerrigan in mission.flags] + kerrigan_build_missions = [mission for mission in kerrigan_missions if MissionFlag.NoBuild not in mission.flags] + if (world.options.kerrigan_presence.value not in kerrigan_unit_available + or total_levels == 0 + or not kerrigan_missions + or (world.options.grant_story_levels and not kerrigan_build_missions) + ): return def add_kerrigan_level_items(level_amount: int, item_amount: int): @@ -468,7 +1035,7 @@ def fill_pool_with_kerrigan_levels(world: World, item_pool: List[Item]): item_pool.append(create_item_with_correct_settings(world.player, name)) sizes = [70, 35, 14, 10, 7, 5, 2, 1] - option = get_option_value(world, "kerrigan_level_item_distribution") + option = world.options.kerrigan_level_item_distribution.value assert isinstance(option, int) assert isinstance(total_levels, int) @@ -489,3 +1056,17 @@ def fill_pool_with_kerrigan_levels(world: World, item_pool: List[Item]): else: round_func = ceil add_kerrigan_level_items(size, round_func(float(total_levels) / size)) + + +def push_precollected_items_to_multiworld(world: SC2World, item_list: List[StarcraftItem]) -> None: + # Clear the pre-collected items, as AP will try to do this for us, + # and we want to be able to filer out precollected items in the case of upgrade packages. + auto_precollected_items = world.multiworld.precollected_items[world.player].copy() + world.multiworld.precollected_items[world.player].clear() + for item in auto_precollected_items: + world.multiworld.state.remove(item) + + for item in item_list: + if ItemFilterFlags.StartInventory not in item.filter_flags: + continue + world.multiworld.push_precollected(create_item_with_correct_settings(world.player, item.name, item.filter_flags)) diff --git a/worlds/sc2/client.py b/worlds/sc2/client.py new file mode 100644 index 0000000000..e9f46f93b7 --- /dev/null +++ b/worlds/sc2/client.py @@ -0,0 +1,2348 @@ +from __future__ import annotations + +import asyncio +import collections +import copy +import ctypes +import enum +import functools +import inspect +import logging +import multiprocessing +import os.path +import re +import sys +import tempfile +import typing +import queue +import zipfile +import io +import random +import concurrent.futures +import time +import uuid +import argparse +from pathlib import Path + +# CommonClient import first to trigger ModuleUpdater +from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser, handle_url_arg +from Utils import init_logging, is_windows, async_start +from .item import item_names, item_parents, race_to_item_type +from .item.item_annotations import ITEM_NAME_ANNOTATIONS +from .item.item_groups import item_name_groups, unlisted_item_name_groups, ItemGroupNames +from . import options, VICTORY_MODULO +from .options import ( + MissionOrder, KerriganPrimalStatus, kerrigan_unit_available, KerriganPresence, EnableMorphling, GameDifficulty, + GameSpeed, GenericUpgradeItems, GenericUpgradeResearch, ColorChoice, GenericUpgradeMissions, MaxUpgradeLevel, + LocationInclusion, ExtraLocations, MasteryLocations, SpeedrunLocations, PreventativeLocations, ChallengeLocations, + VanillaLocations, + DisableForcedCamera, SkipCutscenes, GrantStoryTech, GrantStoryLevels, TakeOverAIAllies, RequiredTactics, + SpearOfAdunPresence, SpearOfAdunPresentInNoBuild, SpearOfAdunPassiveAbilityPresence, + SpearOfAdunPassivesPresentInNoBuild, EnableVoidTrade, VoidTradeAgeLimit, void_trade_age_limits_ms, VoidTradeWorkers, + DifficultyDamageModifier, MissionOrderScouting, GenericUpgradeResearchSpeedup, MercenaryHighlanders, WarCouncilNerfs, + is_mission_in_soa_presence, +) +from .mission_order.slot_data import CampaignSlotData, LayoutSlotData, MissionSlotData, MissionOrderObjectSlotData +from .mission_order.entry_rules import SubRuleRuleData, CountMissionsRuleData, MissionEntryRules +from .mission_tables import MissionFlag +from .transfer_data import normalized_unit_types, worker_units +from . import SC2World + + +if __name__ == "__main__": + init_logging("SC2Client", exception_logger="Client") + +logger = logging.getLogger("Client") +sc2_logger = logging.getLogger("Starcraft2") + +import nest_asyncio +from worlds._sc2common import bot +from worlds._sc2common.bot.data import Race +from worlds._sc2common.bot.main import run_game +from worlds._sc2common.bot.player import Bot +from .item.item_tables import ( + lookup_id_to_name, get_full_item_list, ItemData, + ZergItemType, upgrade_bundles, + WEAPON_ARMOR_UPGRADE_MAX_LEVEL, +) +from .locations import SC2WOL_LOC_ID_OFFSET, LocationType, LocationFlag, SC2HOTS_LOC_ID_OFFSET, VICTORY_CACHE_OFFSET +from .mission_tables import ( + lookup_id_to_mission, SC2Campaign, MissionInfo, + lookup_id_to_campaign, SC2Mission, campaign_mission_table, SC2Race +) + +import colorama +from .options import Option, upgrade_included_names +from NetUtils import ClientStatus, NetworkItem, JSONtoTextParser, JSONMessagePart, add_json_item, add_json_location, add_json_text, JSONTypes +from MultiServer import mark_raw + +pool = concurrent.futures.ThreadPoolExecutor(1) +loop = asyncio.get_event_loop_policy().new_event_loop() +nest_asyncio.apply(loop) +MAX_BONUS: int = 28 + +# GitHub repo where the Map/mod data is hosted for /download_data command +DATA_REPO_OWNER = "Ziktofel" +DATA_REPO_NAME = "Archipelago-SC2-data" +DATA_API_VERSION = "API4" + +# Bot controller +CONTROLLER_HEALTH: int = 38281 +CONTROLLER2_HEALTH: int = 38282 + +# Void Trade +TRADE_UNIT = "AP_TradeStructure" # ID of the unit +TRADE_SEND_BUTTON = "AP_TradeStructureDummySend" # ID of the button +TRADE_RECEIVE_1_BUTTON = "AP_TradeStructureDummyReceive" # ID of the button +TRADE_RECEIVE_5_BUTTON = "AP_TradeStructureDummyReceive5" # ID of the button +TRADE_DATASTORAGE_TEAM = "SC2_VoidTrade_" # + Team +TRADE_DATASTORAGE_SLOT = "slot_" # + Slot +TRADE_DATASTORAGE_LOCK = "_lock" +TRADE_LOCK_TIME = 5 # Time in seconds that the DataStorage may be considered safe to edit +TRADE_LOCK_WAIT_LIMIT = 540000 / 1.4 # Time in ms that the client may spend trying to get a lock (540000 = 9 minutes, 1.4 is 'faster' game speed's time scale) + +# Games +STARCRAFT2 = "Starcraft 2" +STARCRAFT2_WOL = "Starcraft 2 Wings of Liberty" + + +# Data version file path. +# This file is used to tell if the downloaded data are outdated +# Associated with /download_data command +def get_metadata_file() -> str: + return os.environ["SC2PATH"] + os.sep + "ArchipelagoSC2Metadata.txt" + + +def _remap_color_option(slot_data_version: int, color: int) -> int: + """Remap colour options for backwards compatibility with older slot data""" + if slot_data_version < 4 and color == ColorChoice.option_mengsk: + return ColorChoice.option_default + return color + + +class ConfigurableOptionType(enum.Enum): + INTEGER = enum.auto() + ENUM = enum.auto() + +class ConfigurableOptionInfo(typing.NamedTuple): + name: str + variable_name: str + option_class: typing.Type[Option] + option_type: ConfigurableOptionType = ConfigurableOptionType.ENUM + can_break_logic: bool = False + + +class ColouredMessage: + def __init__(self, text: str = '', *, keep_markup: bool = False) -> None: + self.parts: typing.List[dict] = [] + if text: + self(text, keep_markup=keep_markup) + def __call__(self, text: str, *, keep_markup: bool = False) -> 'ColouredMessage': + add_json_text(self.parts, text, keep_markup=keep_markup) + return self + def coloured(self, text: str, colour: str, *, keep_markup: bool = False) -> 'ColouredMessage': + add_json_text(self.parts, text, type="color", color=colour, keep_markup=keep_markup) + return self + def location(self, location_id: int, player_id: int) -> 'ColouredMessage': + add_json_location(self.parts, location_id, player_id) + return self + def item(self, item_id: int, player_id: int, flags: int = 0) -> 'ColouredMessage': + add_json_item(self.parts, item_id, player_id, flags) + return self + def player(self, player_id: int) -> 'ColouredMessage': + add_json_text(self.parts, str(player_id), type=JSONTypes.player_id) + return self + def send(self, ctx: SC2Context) -> None: + ctx.on_print_json({"data": self.parts, "cmd": "PrintJSON"}) + + +class StarcraftClientProcessor(ClientCommandProcessor): + ctx: SC2Context + + def formatted_print(self, text: str) -> None: + """Prints with kivy formatting to the GUI, and also prints to command-line and to all logs""" + # Note(mm): Bold/underline can help readability, but unfortunately the CommonClient does not filter bold tags from command-line output. + # Regardless, using `on_print_json` to get formatted text in the GUI and output in the command-line and in the logs, + # without having to branch code from CommonClient + self.ctx.on_print_json({"data": [{"text": text, "keep_markup": True}]}) + + def _cmd_difficulty(self, difficulty: str = "") -> bool: + """Overrides the current difficulty set for the world. Takes the argument casual, normal, hard, or brutal""" + arguments = difficulty.split() + num_arguments = len(arguments) + + if num_arguments > 0: + difficulty_choice = arguments[0].lower() + if difficulty_choice == "casual": + self.ctx.difficulty_override = 0 + elif difficulty_choice == "normal": + self.ctx.difficulty_override = 1 + elif difficulty_choice == "hard": + self.ctx.difficulty_override = 2 + elif difficulty_choice == "brutal": + self.ctx.difficulty_override = 3 + else: + self.output("Unable to parse difficulty '" + arguments[0] + "'") + return False + + self.output("Difficulty set to " + arguments[0]) + return True + + else: + if self.ctx.difficulty == -1: + self.output("Please connect to a seed before checking difficulty.") + else: + current_difficulty = self.ctx.difficulty + if self.ctx.difficulty_override >= 0: + current_difficulty = self.ctx.difficulty_override + self.output("Current difficulty: " + ["Casual", "Normal", "Hard", "Brutal"][current_difficulty]) + self.output("To change the difficulty, add the name of the difficulty after the command.") + return False + + + def _cmd_game_speed(self, game_speed: str = "") -> bool: + """Overrides the current game speed for the world. + Takes the arguments default, slower, slow, normal, fast, faster""" + arguments = game_speed.split() + num_arguments = len(arguments) + + if num_arguments > 0: + speed_choice = arguments[0].lower() + if speed_choice == "default": + self.ctx.game_speed_override = 0 + elif speed_choice == "slower": + self.ctx.game_speed_override = 1 + elif speed_choice == "slow": + self.ctx.game_speed_override = 2 + elif speed_choice == "normal": + self.ctx.game_speed_override = 3 + elif speed_choice == "fast": + self.ctx.game_speed_override = 4 + elif speed_choice == "faster": + self.ctx.game_speed_override = 5 + else: + self.output("Unable to parse game speed '" + arguments[0] + "'") + return False + + self.output("Game speed set to " + arguments[0]) + return True + + else: + if self.ctx.game_speed == -1: + self.output("Please connect to a seed before checking game speed.") + else: + current_speed = self.ctx.game_speed + if self.ctx.game_speed_override >= 0: + current_speed = self.ctx.game_speed_override + self.output("Current game speed: " + + ["Default", "Slower", "Slow", "Normal", "Fast", "Faster"][current_speed]) + self.output("To change the game speed, add the name of the speed after the command," + " or Default to select based on difficulty.") + return False + + @mark_raw + def _cmd_received(self, filter_search: str = "") -> bool: + """List received items. + Pass in a parameter to filter the search by partial item name or exact item group. + Use '/received recent ' to list the last 'number' items received (default 20).""" + if self.ctx.slot is None: + self.formatted_print("Connect to a slot to view what items are received.") + return True + if filter_search.casefold().startswith('recent'): + return self._received_recent(filter_search[len('recent'):].strip()) + # Groups must be matched case-sensitively, so we properly capitalize the search term + # eg. "Spear of Adun" over "Spear Of Adun" or "spear of adun" + # This fails a lot of item name matches, but those should be found by partial name match + group_filter = '' + for group_name in item_name_groups: + if group_name in unlisted_item_name_groups: + continue + if filter_search.casefold() == group_name.casefold(): + group_filter = group_name + break + + def item_matches_filter(item_name: str) -> bool: + # The filter can be an exact group name or a partial item name + # Partial item name can be matched case-insensitively + if filter_search.casefold() in item_name.casefold(): + return True + # The search term should already be formatted as a group name + if group_filter and item_name in item_name_groups[group_filter]: + return True + return False + + items = get_full_item_list() + categorized_items: typing.Dict[SC2Race, typing.List[typing.Union[int, str]]] = {} + parent_to_child: typing.Dict[typing.Union[int, str], typing.List[int]] = {} + items_received: typing.Dict[int, typing.List[NetworkItem]] = {} + for item in self.ctx.items_received: + items_received.setdefault(item.item, []).append(item) + items_received_set = set(items_received) + for item_data in items.values(): + if item_data.parent: + parent_rule = item_parents.parent_present[item_data.parent] + if parent_rule.constraint_group is not None and parent_rule.constraint_group in items: + parent_to_child.setdefault(items[parent_rule.constraint_group].code, []).append(item_data.code) + continue + race = items[parent_rule.parent_items()[0]].race + categorized_items.setdefault(race, []) + if parent_rule.display_string not in categorized_items[race]: + categorized_items[race].append(parent_rule.display_string) + parent_to_child.setdefault(parent_rule.display_string, []).append(item_data.code) + else: + categorized_items.setdefault(item_data.race, []).append(item_data.code) + + def display_info(element: typing.Union[SC2Race, str, int]) -> tuple: + """Return (should display, name, type, children, sum(obtained), sum(matching filter))""" + have_item = isinstance(element, int) and element in items_received_set + if isinstance(element, SC2Race): + children: typing.Sequence[typing.Union[str, int]] = categorized_items[faction] + name = element.name + elif isinstance(element, int): + children = parent_to_child.get(element, []) + name = self.ctx.item_names.lookup_in_game(element) + else: + assert isinstance(element, str) + children = parent_to_child[element] + name = element + matches_filter = item_matches_filter(name) + child_states = [display_info(child) for child in children] + return ( + (have_item and matches_filter) or any(child_state[0] for child_state in child_states), + name, + element, + child_states, + sum(child_state[4] for child_state in child_states) + have_item, + sum(child_state[5] for child_state in child_states) + (have_item and matches_filter), + ) + + def display_tree( + should_display: bool, name: str, element: typing.Union[SC2Race, str, int], child_states: tuple, indent: int = 0 + ) -> None: + if not should_display: + return + assert self.ctx.slot is not None + indent_str = " " * indent + if isinstance(element, SC2Race): + self.formatted_print(f" [u]{name}[/u] ") + for child in child_states: + display_tree(*child[:4]) + elif isinstance(element, str): + ColouredMessage(indent_str)("- ").coloured(name, "white").send(self.ctx) + for child in child_states: + display_tree(*child[:4], indent=indent+2) + elif isinstance(element, int): + items = items_received.get(element, []) + if not items: + ColouredMessage(indent_str)("- ").coloured(name, "red")(" - not obtained").send(self.ctx) + for item in items: + (ColouredMessage(indent_str)('- ') + .item(item.item, self.ctx.slot, flags=item.flags) + (" from ").location(item.location, item.player) + (" by ").player(item.player) + ).send(self.ctx) + for child in child_states: + display_tree(*child[:4], indent=indent+2) + non_matching_descendents = sum(child[5] - child[4] for child in children) + if non_matching_descendents > 0: + self.formatted_print(f"{indent_str} + {non_matching_descendents} child items that don't match the filter") + + + item_types_obtained = 0 + items_obtained_matching_filter = 0 + for faction in SC2Race: + should_display, name, element, children, faction_items_obtained, faction_items_matching_filter = display_info(faction) + item_types_obtained += faction_items_obtained + items_obtained_matching_filter += faction_items_matching_filter + display_tree(should_display, name, element, children) + if filter_search == "": + self.formatted_print(f"[b]Obtained: {len(self.ctx.items_received)} items ({item_types_obtained} types)[/b]") + else: + self.formatted_print(f"[b]Filter \"{filter_search}\" found {items_obtained_matching_filter} out of {item_types_obtained} obtained item types[/b]") + return True + + def _received_recent(self, amount: str) -> bool: + assert self.ctx.slot is not None + try: + display_amount = int(amount) + except ValueError: + display_amount = 20 + display_amount = min(display_amount, len(self.ctx.items_received)) + self.formatted_print(f"Last {display_amount} of {len(self.ctx.items_received)} items received (most recent last):") + for item in self.ctx.items_received[-display_amount:]: + ( + ColouredMessage() + .item(item.item, self.ctx.slot, item.flags) + (" from ").location(item.location, item.player) + (" by ").player(item.player) + ).send(self.ctx) + return True + + def _cmd_option(self, option_name: str = "", option_value: str = "") -> None: + """Sets a Starcraft game option that can be changed after generation. Use "/option list" to see all options.""" + + LOGIC_WARNING = " *Note changing this may result in logically unbeatable games*\n" + + configurable_options = ( + ConfigurableOptionInfo('speed', 'game_speed', options.GameSpeed), + ConfigurableOptionInfo('kerrigan_presence', 'kerrigan_presence', options.KerriganPresence, can_break_logic=True), + ConfigurableOptionInfo('kerrigan_level_cap', 'kerrigan_total_level_cap', options.KerriganTotalLevelCap, ConfigurableOptionType.INTEGER, can_break_logic=True), + ConfigurableOptionInfo('kerrigan_mission_level_cap', 'kerrigan_levels_per_mission_completed_cap', options.KerriganLevelsPerMissionCompletedCap, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('kerrigan_levels_per_mission', 'kerrigan_levels_per_mission_completed', options.KerriganLevelsPerMissionCompleted, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('grant_story_levels', 'grant_story_levels', options.GrantStoryLevels, can_break_logic=True), + ConfigurableOptionInfo('grant_story_tech', 'grant_story_tech', options.GrantStoryTech, can_break_logic=True), + ConfigurableOptionInfo('control_ally', 'take_over_ai_allies', options.TakeOverAIAllies, can_break_logic=True), + ConfigurableOptionInfo('soa_presence', 'spear_of_adun_presence', options.SpearOfAdunPresence, can_break_logic=True), + ConfigurableOptionInfo('soa_in_nobuilds', 'spear_of_adun_present_in_no_build', options.SpearOfAdunPresentInNoBuild, can_break_logic=True), + # Note(mm): Technically SOA passive presence is in the logic for Amon's Fall if Takeover AI Allies is true, + # but that's edge case enough I don't think we should warn about it. + ConfigurableOptionInfo('soa_passive_presence', 'spear_of_adun_passive_ability_presence', options.SpearOfAdunPassiveAbilityPresence), + ConfigurableOptionInfo('soa_passives_in_nobuilds', 'spear_of_adun_passive_present_in_no_build', options.SpearOfAdunPassivesPresentInNoBuild), + ConfigurableOptionInfo('max_upgrade_level', 'max_upgrade_level', options.MaxUpgradeLevel, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('generic_upgrade_research', 'generic_upgrade_research', options.GenericUpgradeResearch), + ConfigurableOptionInfo('generic_upgrade_research_speedup', 'generic_upgrade_research_speedup', options.GenericUpgradeResearchSpeedup), + ConfigurableOptionInfo('minerals_per_item', 'minerals_per_item', options.MineralsPerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('gas_per_item', 'vespene_per_item', options.VespenePerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('supply_per_item', 'starting_supply_per_item', options.StartingSupplyPerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('max_supply_per_item', 'maximum_supply_per_item', options.MaximumSupplyPerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('reduced_supply_per_item', 'maximum_supply_reduction_per_item', options.MaximumSupplyReductionPerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('lowest_max_supply', 'lowest_maximum_supply', options.LowestMaximumSupply, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('research_cost_per_item', 'research_cost_reduction_per_item', options.ResearchCostReductionPerItem, ConfigurableOptionType.INTEGER), + ConfigurableOptionInfo('no_forced_camera', 'disable_forced_camera', options.DisableForcedCamera), + ConfigurableOptionInfo('skip_cutscenes', 'skip_cutscenes', options.SkipCutscenes), + ConfigurableOptionInfo('enable_morphling', 'enable_morphling', options.EnableMorphling, can_break_logic=True), + ConfigurableOptionInfo('difficulty_damage_modifier', 'difficulty_damage_modifier', options.DifficultyDamageModifier), + ConfigurableOptionInfo('void_trade_age_limit', 'trade_age_limit', options.VoidTradeAgeLimit), + ConfigurableOptionInfo('void_trade_workers', 'trade_workers_allowed', options.VoidTradeWorkers), + ConfigurableOptionInfo('mercenary_highlanders', 'mercenary_highlanders', options.MercenaryHighlanders), + ) + + WARNING_COLOUR = "salmon" + CMD_COLOUR = "slateblue" + boolean_option_map = { + 'y': 'true', 'yes': 'true', 'n': 'false', 'no': 'false', 'true': 'true', 'false': 'false', + } + + help_message = ColouredMessage(inspect.cleandoc(""" + Options + -------------------- + """))('\n') + for option in configurable_options: + option_help_text = inspect.cleandoc(option.option_class.__doc__ or "No description provided.").split('\n', 1)[0] + help_message.coloured(option.name, CMD_COLOUR)(": " + " | ".join(option.option_class.options) + + f" -- {option_help_text}\n") + if option.can_break_logic: + help_message.coloured(LOGIC_WARNING, WARNING_COLOUR) + help_message("--------------------\nEnter an option without arguments to see its current value.\n") + + if not option_name or option_name == 'list' or option_name == 'help': + help_message.send(self.ctx) + return + for option in configurable_options: + if option_name == option.name: + option_value = boolean_option_map.get(option_value.lower(), option_value) + if not option_value: + pass + elif option.option_type == ConfigurableOptionType.ENUM and option_value in option.option_class.options: + self.ctx.__dict__[option.variable_name] = option.option_class.options[option_value] + elif option.option_type == ConfigurableOptionType.INTEGER: + try: + self.ctx.__dict__[option.variable_name] = int(option_value, base=0) + except: + self.output(f"{option_value} is not a valid integer") + else: + self.output(f"Unknown option value '{option_value}'") + ColouredMessage(f"{option.name} is '{option.option_class.get_option_name(self.ctx.__dict__[option.variable_name])}'").send(self.ctx) + break + else: + self.output(f"Unknown option '{option_name}'") + help_message.send(self.ctx) + + def _cmd_color(self, faction: str = "", color: str = "") -> None: + """Changes the player color for a given faction.""" + player_colors = [ + "White", "Red", "Blue", "Teal", + "Purple", "Yellow", "Orange", "Green", + "LightPink", "Violet", "LightGrey", "DarkGreen", + "Brown", "LightGreen", "DarkGrey", "Pink", + "Rainbow", "Mengsk", "BrightLime", "Arcane", "Ember", "HotPink", + "Random", "Default" + ] + var_names = { + 'raynor': 'player_color_raynor', + 'kerrigan': 'player_color_zerg', + 'primal': 'player_color_zerg_primal', + 'protoss': 'player_color_protoss', + 'nova': 'player_color_nova', + } + faction = faction.lower() + if not faction: + for faction_name, key in var_names.items(): + self.output(f"Current player color for {faction_name}: {player_colors[self.ctx.__dict__[key]]}") + self.output("To change your color, add the faction name and color after the command.") + self.output("Available factions: " + ', '.join(var_names)) + self.output("Available colors: " + ', '.join(player_colors)) + return + elif faction not in var_names: + self.output(f"Unknown faction '{faction}'.") + self.output("Available factions: " + ', '.join(var_names)) + return + match_colors = [player_color.lower() for player_color in player_colors] + if not color: + self.output(f"Current player color for {faction}: {player_colors[self.ctx.__dict__[var_names[faction]]]}") + self.output("To change this faction's colors, add the name of the color after the command.") + self.output("Available colors: " + ', '.join(player_colors)) + else: + if color.lower() not in match_colors: + self.output(color + " is not a valid color. Available colors: " + ', '.join(player_colors)) + return + if color.lower() == "random": + color = random.choice(player_colors[:-2]) + self.ctx.__dict__[var_names[faction]] = match_colors.index(color.lower()) + self.ctx.pending_color_update = True + self.output(f"Color for {faction} set to " + player_colors[self.ctx.__dict__[var_names[faction]]]) + + def _cmd_windowed_mode(self, value="") -> None: + """Controls whether sc2 will launch in Windowed mode. Persists across sessions.""" + if not value: + sc2_logger.info("Use `/windowed_mode [true|false]` to set the windowed mode") + elif value.casefold() in ('t', 'true', 'yes', 'y'): + SC2World.settings.game_windowed_mode = True + force_settings_save_on_close() + else: + SC2World.settings.game_windowed_mode = False + force_settings_save_on_close() + sc2_logger.info(f"Windowed mode is: {SC2World.settings.game_windowed_mode}") + + def _cmd_disable_mission_check(self) -> bool: + """Disables the check to see if a mission is available to play. Meant for co-op runs where one player can play + the next mission in a chain the other player is doing.""" + self.ctx.missions_unlocked = True + sc2_logger.info("Mission check has been disabled") + return True + + @mark_raw + def _cmd_set_path(self, path: str = '') -> bool: + """Manually set the SC2 install directory (if the automatic detection fails).""" + if path: + os.environ["SC2PATH"] = path + is_mod_installed_correctly() + return True + else: + sc2_logger.warning("When using set_path, you must type the path to your SC2 install directory.") + return False + + def _cmd_download_data(self) -> bool: + """Download the most recent release of the necessary files for playing SC2 with + Archipelago. Will overwrite existing files.""" + pool.submit(self._download_data, self.ctx) + return True + + @staticmethod + def _download_data(ctx: SC2Context) -> bool: + if "SC2PATH" not in os.environ: + check_game_install_path() + + if os.path.exists(get_metadata_file()): + with open(get_metadata_file(), "r") as f: + metadata = f.read() + else: + metadata = None + + tempzip, metadata = download_latest_release_zip( + DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, metadata=metadata, force_download=True) + + if tempzip: + try: + zipfile.ZipFile(tempzip).extractall(path=os.environ["SC2PATH"]) + sc2_logger.info("Download complete. Package installed.") + if metadata is not None: + with open(get_metadata_file(), "w") as f: + f.write(metadata) + finally: + os.remove(tempzip) + else: + sc2_logger.warning("Download aborted/failed. Read the log for more information.") + return False + ctx.data_out_of_date = False + return True + + +class SC2JSONtoTextParser(JSONtoTextParser): + def __init__(self, ctx: SC2Context) -> None: + self.handlers = { + "ItemSend": self._handle_color, + "ItemCheat": self._handle_color, + "Hint": self._handle_color, + } + super().__init__(ctx) + + def _handle_color(self, node: JSONMessagePart) -> str: + codes = node["color"].split(";") + buffer = "".join(self.color_code(code) for code in codes if code in self.color_codes) + return buffer + self._handle_text(node) + '
' + + def _handle_item_name(self, node: JSONMessagePart) -> str: + if self.ctx.slot_info[node["player"]].game == STARCRAFT2: + annotation = ITEM_NAME_ANNOTATIONS.get(node["text"]) + if annotation is not None: + node["text"] += f" {annotation}" + return super()._handle_item_name(node) + + def color_code(self, code: str) -> str: + return '' + + +class SC2Context(CommonContext): + command_processor = StarcraftClientProcessor + game = STARCRAFT2 + items_handling = 0b111 + + def __init__(self, *args, **kwargs) -> None: + super(SC2Context, self).__init__(*args, **kwargs) + self.raw_text_parser = SC2JSONtoTextParser(self) + + self.data_out_of_date: bool = False + self.difficulty = -1 + self.game_speed = -1 + self.disable_forced_camera = 0 + self.skip_cutscenes = 0 + self.all_in_choice = 0 + self.mission_order = 0 + self.player_color_raynor = ColorChoice.option_blue + self.player_color_zerg = ColorChoice.option_orange + self.player_color_zerg_primal = ColorChoice.option_purple + self.player_color_protoss = ColorChoice.option_blue + self.player_color_nova = ColorChoice.option_dark_grey + self.pending_color_update = False + self.kerrigan_presence: int = KerriganPresence.default + self.kerrigan_primal_status = 0 + self.enable_morphling = EnableMorphling.default + self.custom_mission_order: typing.List[CampaignSlotData] = [] + self.mission_id_to_entry_rules: typing.Dict[int, MissionEntryRules] + self.final_mission_ids: typing.List[int] = [29] + self.final_locations: typing.List[int] = [] + self.announcements: queue.Queue = queue.Queue() + self.sc2_run_task: typing.Optional[asyncio.Task] = None + self.missions_unlocked: bool = False # allow launching missions ignoring requirements + self.max_upgrade_level: int = MaxUpgradeLevel.default + self.generic_upgrade_missions = 0 + self.generic_upgrade_research = 0 + self.generic_upgrade_research_speedup: int = GenericUpgradeResearchSpeedup.default + self.generic_upgrade_items = 0 + self.location_inclusions: typing.Dict[LocationType, int] = {} + self.location_inclusions_by_flag: typing.Dict[LocationFlag, int] = {} + self.plando_locations: typing.List[str] = [] + self.difficulty_override = -1 + self.game_speed_override = -1 + self.mission_id_to_location_ids: typing.Dict[int, typing.List[int]] = {} + self.last_bot: typing.Optional[ArchipelagoBot] = None + self.slot_data_version = 2 + self.required_tactics: int = RequiredTactics.default + self.grant_story_tech: int = GrantStoryTech.default + self.grant_story_levels: int = GrantStoryLevels.default + self.take_over_ai_allies: int = TakeOverAIAllies.default + self.spear_of_adun_presence = SpearOfAdunPresence.option_not_present + self.spear_of_adun_present_in_no_build = SpearOfAdunPresentInNoBuild.option_false + self.spear_of_adun_passive_ability_presence = SpearOfAdunPassiveAbilityPresence.option_not_present + self.spear_of_adun_passive_present_in_no_build = SpearOfAdunPassivesPresentInNoBuild.option_false + self.minerals_per_item: int = 15 # For backwards compat with games generated pre-0.4.5 + self.vespene_per_item: int = 15 # For backwards compat with games generated pre-0.4.5 + self.starting_supply_per_item: int = 2 # For backwards compat with games generated pre-0.4.5 + self.maximum_supply_per_item: int = 2 + self.maximum_supply_reduction_per_item: int = options.MaximumSupplyReductionPerItem.default + self.lowest_maximum_supply: int = options.LowestMaximumSupply.default + self.research_cost_reduction_per_item: int = options.ResearchCostReductionPerItem.default + self.use_nova_wol_fallback: bool = False + self.use_nova_nco_fallback: bool = False + self.mercenary_highlanders: bool = False + self.kerrigan_levels_per_mission_completed = 0 + self.trade_enabled: int = EnableVoidTrade.default + self.trade_age_limit: int = VoidTradeAgeLimit.default + self.trade_workers_allowed: int = VoidTradeWorkers.default + self.trade_underway: bool = False + self.trade_latest_reply: typing.Optional[dict] = None + self.trade_reply_event = asyncio.Event() + self.trade_lock_wait: int = 0 + self.trade_lock_start: typing.Optional[float] = None + self.trade_response: typing.Optional[str] = None + self.difficulty_damage_modifier: int = DifficultyDamageModifier.default + self.mission_order_scouting = MissionOrderScouting.option_none + self.mission_item_classification: typing.Optional[typing.Dict[str, int]] = None + self.war_council_nerfs: bool = False + + async def server_auth(self, password_requested: bool = False) -> None: + self.game = STARCRAFT2 + if password_requested and not self.password: + await super(SC2Context, self).server_auth(password_requested) + await self.get_username() + await self.send_connect() + if self.ui: + self.ui.first_check = True + + def is_legacy_game(self): + return self.game == STARCRAFT2_WOL + + def event_invalid_game(self): + if self.is_legacy_game(): + self.game = STARCRAFT2 + super().event_invalid_game() + else: + self.game = STARCRAFT2_WOL + async_start(self.send_connect()) + + def trade_storage_team(self) -> str: + return f"{TRADE_DATASTORAGE_TEAM}{self.team}" + + def trade_storage_slot(self) -> str: + return f"{TRADE_DATASTORAGE_SLOT}{self.slot}" + + def _apply_host_settings_to_options(self) -> None: + if str(SC2World.settings.game_difficulty).casefold() == 'casual': + self.difficulty = GameDifficulty.option_casual + elif str(SC2World.settings.game_difficulty).casefold() == 'normal': + self.difficulty = GameDifficulty.option_normal + elif str(SC2World.settings.game_difficulty).casefold() == 'hard': + self.difficulty = GameDifficulty.option_hard + elif str(SC2World.settings.game_difficulty).casefold() == 'brutal': + self.difficulty = GameDifficulty.option_brutal + + if str(SC2World.settings.game_speed).casefold() == 'slower': + self.game_speed = GameSpeed.option_slower + elif str(SC2World.settings.game_speed).casefold() == 'slow': + self.game_speed = GameSpeed.option_slow + elif str(SC2World.settings.game_speed).casefold() == 'normal': + self.game_speed = GameSpeed.option_normal + elif str(SC2World.settings.game_speed).casefold() == 'fast': + self.game_speed = GameSpeed.option_fast + elif str(SC2World.settings.game_speed).casefold() == 'faster': + self.game_speed = GameSpeed.option_faster + + if str(SC2World.settings.disable_forced_camera).casefold() == 'true': + self.disable_forced_camera = DisableForcedCamera.option_true + elif str(SC2World.settings.disable_forced_camera).casefold() == 'false': + self.disable_forced_camera = DisableForcedCamera.option_false + + if str(SC2World.settings.skip_cutscenes).casefold() == 'true': + self.skip_cutscenes = SkipCutscenes.option_true + elif str(SC2World.settings.skip_cutscenes).casefold() == 'false': + self.skip_cutscenes = SkipCutscenes.option_false + + def on_package(self, cmd: str, args: dict) -> None: + if cmd == "Connected": + # Set up the trade storage + async_start(self.send_msgs([ + { # We want to know about other clients' Set commands for locking + "cmd": "SetNotify", + "keys": [self.trade_storage_team()], + }, + { + "cmd": "Set", + "key": self.trade_storage_team(), + "default": { TRADE_DATASTORAGE_LOCK: 0 }, + "operations": [{"operation": "default", "value": None}] # value is ignored + } + ])) + + self.difficulty = args["slot_data"]["game_difficulty"] + self.game_speed = args["slot_data"].get("game_speed", GameSpeed.option_default) + self.disable_forced_camera = args["slot_data"].get("disable_forced_camera", DisableForcedCamera.default) + self.skip_cutscenes = args["slot_data"].get("skip_cutscenes", SkipCutscenes.default) + self.all_in_choice = args["slot_data"]["all_in_map"] + self.slot_data_version = args["slot_data"].get("version", 2) + + self._apply_host_settings_to_options() + + if self.slot_data_version < 4: + # Maintaining backwards compatibility with older slot data + slot_req_table: dict = args["slot_data"]["mission_req"] + + first_item = list(slot_req_table.keys())[0] + if first_item in [str(campaign.id) for campaign in SC2Campaign]: + # Multi-campaign + mission_req_table = {} + for campaign_id in slot_req_table: + campaign = lookup_id_to_campaign[int(campaign_id)] + mission_req_table[campaign] = { + mission: self.parse_mission_info(mission_info) + for mission, mission_info in slot_req_table[campaign_id].items() + } + else: + # Old format + mission_req_table = {SC2Campaign.GLOBAL: { + mission: self.parse_mission_info(mission_info) + for mission, mission_info in slot_req_table.items() + } + } + + self.custom_mission_order = self.parse_mission_req_table(mission_req_table) + + if self.slot_data_version >= 4: + self.custom_mission_order = [ + CampaignSlotData( + **{field:value for field, value in campaign_data.items() if field not in ["layouts", "entry_rule"]}, + entry_rule = SubRuleRuleData.parse_from_dict(campaign_data["entry_rule"]), + layouts = [ + LayoutSlotData( + **{field:value for field, value in layout_data.items() if field not in ["missions", "entry_rule"]}, + entry_rule = SubRuleRuleData.parse_from_dict(layout_data["entry_rule"]), + missions = [ + [ + MissionSlotData( + **{field:value for field, value in mission_data.items() if field != "entry_rule"}, + entry_rule = SubRuleRuleData.parse_from_dict(mission_data["entry_rule"]) + ) for mission_data in column + ] for column in layout_data["missions"] + ] + ) for layout_data in campaign_data["layouts"] + ] + ) for campaign_data in args["slot_data"]["custom_mission_order"] + ] + self.mission_id_to_entry_rules = { + mission.mission_id: MissionEntryRules(mission.entry_rule, layout.entry_rule, campaign.entry_rule) + for campaign in self.custom_mission_order for layout in campaign.layouts + for column in layout.missions for mission in column + } + + self.mission_order = args["slot_data"].get("mission_order", MissionOrder.option_vanilla) + if self.slot_data_version < 4: + self.final_mission_ids = [args["slot_data"].get("final_mission", SC2Mission.ALL_IN.id)] + else: + self.final_mission_ids = args["slot_data"].get("final_mission_ids", [SC2Mission.ALL_IN.id]) + self.final_locations = [get_location_id(mission_id, 0) for mission_id in self.final_mission_ids] + + self.player_color_raynor = _remap_color_option( + self.slot_data_version, + args["slot_data"].get("player_color_terran_raynor", ColorChoice.option_blue) + ) + self.player_color_zerg = _remap_color_option( + self.slot_data_version, + args["slot_data"].get("player_color_zerg", ColorChoice.option_orange) + ) + self.player_color_zerg_primal = _remap_color_option( + self.slot_data_version, + args["slot_data"].get("player_color_zerg_primal", ColorChoice.option_purple) + ) + self.player_color_protoss = _remap_color_option( + self.slot_data_version, + args["slot_data"].get("player_color_protoss", ColorChoice.option_blue) + ) + self.player_color_nova = _remap_color_option( + self.slot_data_version, + args["slot_data"].get("player_color_nova", ColorChoice.option_dark_grey) + ) + self.war_council_nerfs = args["slot_data"].get("war_council_nerfs", WarCouncilNerfs.option_false) + self.mercenary_highlanders = args["slot_data"].get("mercenary_highlanders", MercenaryHighlanders.option_false) + self.generic_upgrade_missions = args["slot_data"].get("generic_upgrade_missions", GenericUpgradeMissions.default) + self.max_upgrade_level = args["slot_data"].get("max_upgrade_level", MaxUpgradeLevel.default) + self.generic_upgrade_items = args["slot_data"].get("generic_upgrade_items", GenericUpgradeItems.option_individual_items) + self.generic_upgrade_research = args["slot_data"].get("generic_upgrade_research", GenericUpgradeResearch.option_vanilla) + self.generic_upgrade_research_speedup = args["slot_data"].get("generic_upgrade_research_speedup", GenericUpgradeResearchSpeedup.default) + self.kerrigan_presence = args["slot_data"].get("kerrigan_presence", KerriganPresence.option_vanilla) + self.kerrigan_primal_status = args["slot_data"].get("kerrigan_primal_status", KerriganPrimalStatus.option_vanilla) + self.kerrigan_levels_per_mission_completed = args["slot_data"].get("kerrigan_levels_per_mission_completed", 0) + self.kerrigan_levels_per_mission_completed_cap = args["slot_data"].get("kerrigan_levels_per_mission_completed_cap", -1) + self.kerrigan_total_level_cap = args["slot_data"].get("kerrigan_total_level_cap", -1) + self.enable_morphling = args["slot_data"].get("enable_morphling", EnableMorphling.option_false) + self.grant_story_tech = args["slot_data"].get("grant_story_tech", GrantStoryTech.option_no_grant) + self.grant_story_levels = args["slot_data"].get("grant_story_levels", GrantStoryLevels.option_additive) + self.required_tactics = args["slot_data"].get("required_tactics", RequiredTactics.option_standard) + self.take_over_ai_allies = args["slot_data"].get("take_over_ai_allies", TakeOverAIAllies.option_false) + self.spear_of_adun_presence = args["slot_data"].get("spear_of_adun_presence", SpearOfAdunPresence.option_not_present) + self.spear_of_adun_present_in_no_build = args["slot_data"].get("spear_of_adun_present_in_no_build", SpearOfAdunPresentInNoBuild.option_false) + if self.slot_data_version < 4: + self.spear_of_adun_passive_ability_presence = args["slot_data"].get("spear_of_adun_autonomously_cast_ability_presence", SpearOfAdunPassiveAbilityPresence.option_not_present) + self.spear_of_adun_passive_present_in_no_build = args["slot_data"].get("spear_of_adun_autonomously_cast_present_in_no_build", SpearOfAdunPassivesPresentInNoBuild.option_false) + else: + self.spear_of_adun_passive_ability_presence = args["slot_data"].get("spear_of_adun_passive_ability_presence", SpearOfAdunPassiveAbilityPresence.option_not_present) + self.spear_of_adun_passive_present_in_no_build = args["slot_data"].get("spear_of_adun_passive_present_in_no_build", SpearOfAdunPassivesPresentInNoBuild.option_false) + self.minerals_per_item = args["slot_data"].get("minerals_per_item", 15) + self.vespene_per_item = args["slot_data"].get("vespene_per_item", 15) + self.starting_supply_per_item = args["slot_data"].get("starting_supply_per_item", 2) + self.maximum_supply_per_item = args["slot_data"].get("maximum_supply_per_item", options.MaximumSupplyPerItem.default) + self.maximum_supply_reduction_per_item = args["slot_data"].get("maximum_supply_reduction_per_item", options.MaximumSupplyReductionPerItem.default) + self.lowest_maximum_supply = args["slot_data"].get("lowest_maximum_supply", options.LowestMaximumSupply.default) + self.research_cost_reduction_per_item = args["slot_data"].get("research_cost_reduction_per_item", options.ResearchCostReductionPerItem.default) + self.use_nova_wol_fallback = args["slot_data"].get("use_nova_wol_fallback", True) + if self.slot_data_version < 4: + self.use_nova_nco_fallback = args["slot_data"].get("nova_covert_ops_only", False) and self.mission_order == MissionOrder.option_vanilla + else: + self.use_nova_nco_fallback = args["slot_data"].get("use_nova_nco_fallback", False) + self.trade_enabled = args["slot_data"].get("enable_void_trade", EnableVoidTrade.option_false) + self.trade_age_limit = args["slot_data"].get("void_trade_age_limit", VoidTradeAgeLimit.default) + self.trade_workers_allowed = args["slot_data"].get("void_trade_workers", VoidTradeWorkers.default) + self.difficulty_damage_modifier = args["slot_data"].get("difficulty_damage_modifier", DifficultyDamageModifier.option_true) + self.mission_order_scouting = args["slot_data"].get("mission_order_scouting", MissionOrderScouting.option_none) + self.mission_item_classification = args["slot_data"].get("mission_item_classification") + + if self.required_tactics == RequiredTactics.option_no_logic: + # Locking Grant Story Tech/Levels if no logic + self.grant_story_tech = GrantStoryTech.option_grant + self.grant_story_levels = GrantStoryLevels.option_minimum + + self.location_inclusions = { + LocationType.VICTORY: LocationInclusion.option_enabled, # Victory checks are always enabled + LocationType.VICTORY_CACHE: LocationInclusion.option_enabled, # Victory checks are always enabled + LocationType.VANILLA: args["slot_data"].get("vanilla_locations", VanillaLocations.default), + LocationType.EXTRA: args["slot_data"].get("extra_locations", ExtraLocations.default), + LocationType.CHALLENGE: args["slot_data"].get("challenge_locations", ChallengeLocations.default), + LocationType.MASTERY: args["slot_data"].get("mastery_locations", MasteryLocations.default), + } + self.location_inclusions_by_flag = { + LocationFlag.SPEEDRUN: args["slot_data"].get("speedrun_locations", SpeedrunLocations.default), + LocationFlag.PREVENTATIVE: args["slot_data"].get("preventative_locations", PreventativeLocations.default), + } + self.plando_locations = args["slot_data"].get("plando_locations", []) + + self.build_location_to_mission_mapping() + + # Looks for the required maps and mods for SC2. Runs check_game_install_path. + maps_present = is_mod_installed_correctly() + if os.path.exists(get_metadata_file()): + with open(get_metadata_file(), "r") as f: + current_ver = f.read() + sc2_logger.debug(f"Current version: {current_ver}") + if is_mod_update_available(DATA_REPO_OWNER, DATA_REPO_NAME, DATA_API_VERSION, current_ver): + ( + ColouredMessage().coloured("NOTICE: Update for required files found. ", colour="red") + ("Run ").coloured("/download_data", colour="slateblue") + (" to install.") + ).send(self) + self.data_out_of_date = True + elif maps_present: + ( + ColouredMessage() + .coloured("NOTICE: Your map files may be outdated (version number not found). ", colour="red") + ("Run ").coloured("/download_data", colour="slateblue") + (" to install.") + ).send(self) + self.data_out_of_date = True + + ColouredMessage("[b]Check the Launcher tab to start playing.[/b]", keep_markup=True).send(self) + + elif cmd == "SetReply": + # Currently can only be Void Trade reply + self.trade_latest_reply = args + self.trade_reply_event.set() + + @staticmethod + def parse_mission_info(mission_info: dict[str, typing.Any]) -> MissionInfo: + if mission_info.get("id") is not None: + mission_info["mission"] = lookup_id_to_mission[mission_info["id"]] + elif isinstance(mission_info["mission"], int): + mission_info["mission"] = lookup_id_to_mission[mission_info["mission"]] + + return MissionInfo( + **{field: value for field, value in mission_info.items() if field in MissionInfo._fields} + ) + + @staticmethod + def parse_mission_req_table(mission_req_table: typing.Dict[SC2Campaign, typing.Dict[typing.Any, MissionInfo]]) -> typing.List[CampaignSlotData]: + campaigns: typing.List[typing.Tuple[int, CampaignSlotData]] = [] + rolling_rule_id = 0 + for (campaign, campaign_data) in mission_req_table.items(): + if campaign.campaign_name == "Global": + campaign_name = "" + else: + campaign_name = campaign.campaign_name + + categories: typing.Dict[str, typing.List[MissionSlotData]] = {} + for mission in campaign_data.values(): + if mission.category not in categories: + categories[mission.category] = [] + mission_id = mission.mission.id + sub_rules: typing.List[CountMissionsRuleData] = [] + missions: typing.List[int] + if mission.number: + amount = mission.number + missions = [ + mission.mission.id + for mission in mission_req_table[campaign].values() + ] + sub_rules.append(CountMissionsRuleData(missions, amount, [campaign_name])) + prev_missions: typing.List[int] = [] + if len(mission.required_world) > 0: + missions = [] + for connection in mission.required_world: + if isinstance(connection, dict): + required_campaign = {} + for camp, camp_data in mission_req_table.items(): + if camp.id == connection["campaign"]: + required_campaign = camp_data + break + required_mission_id = connection["connect_to"] + else: + required_campaign = mission_req_table[connection.campaign] + required_mission_id = connection.connect_to + required_mission = list(required_campaign.values())[required_mission_id - 1] + missions.append(required_mission.mission.id) + if required_mission.category == mission.category: + prev_missions.append(required_mission.mission.id) + if mission.or_requirements: + amount = 1 + else: + amount = len(missions) + sub_rules.append(CountMissionsRuleData(missions, amount, missions)) + entry_rule = SubRuleRuleData(rolling_rule_id, sub_rules, len(sub_rules)) + rolling_rule_id += 1 + categories[mission.category].append(MissionSlotData.legacy(mission_id, prev_missions, entry_rule)) + + layouts: typing.List[LayoutSlotData] = [] + for (layout, mission_slots) in categories.items(): + if layout.startswith("_"): + layout_name = "" + else: + layout_name = layout + layouts.append(LayoutSlotData.legacy(layout_name, [mission_slots])) + campaigns.append((campaign.id, CampaignSlotData.legacy(campaign_name, layouts))) + return [data for (_, data) in sorted(campaigns)] + + + def on_print_json(self, args: dict) -> None: + # goes to this world + if "receiving" in args and self.slot_concerns_self(args["receiving"]): + relevant = True + # found in this world + elif "item" in args and self.slot_concerns_self(args["item"].player): + relevant = True + # not related + else: + relevant = False + + if relevant: + self.announcements.put(self.raw_text_parser(copy.deepcopy(args["data"]))) + + super(SC2Context, self).on_print_json(args) + + def run_gui(self) -> None: + from .client_gui import start_gui + start_gui(self) + + async def shutdown(self) -> None: + await super(SC2Context, self).shutdown() + if self.last_bot: + self.last_bot.want_close = True + # If the client is not set up yet, the game is not done loading and must be force-closed + if not hasattr(self.last_bot, "client"): + bot.sc2process.kill_switch.kill_all() + if self.sc2_run_task: + self.sc2_run_task.cancel() + + async def disconnect(self, allow_autoreconnect: bool = False): + self.finished_game = False + await super(SC2Context, self).disconnect(allow_autoreconnect=allow_autoreconnect) + + def play_mission(self, mission_id: int) -> bool: + if self.missions_unlocked or is_mission_available(self, mission_id): + if self.sc2_run_task: + if not self.sc2_run_task.done(): + sc2_logger.warning("Starcraft 2 Client is still running!") + self.sc2_run_task.cancel() # doesn't actually close the game, just stops the python task + if self.slot is None: + sc2_logger.warning("Launching Mission without Archipelago authentication, " + "checks will not be registered to server.") + self.sc2_run_task = asyncio.create_task(starcraft_launch(self, mission_id), + name="Starcraft 2 Launch") + return True + else: + sc2_logger.info(f"{lookup_id_to_mission[mission_id].mission_name} is not currently unlocked.") + return False + + def build_location_to_mission_mapping(self) -> None: + mission_id_to_location_ids: typing.Dict[int, typing.Set[int]] = { + mission.mission_id: set() + for campaign in self.custom_mission_order for layout in campaign.layouts + for column in layout.missions for mission in column + } + + for loc in self.server_locations: + offset = ( + SC2WOL_LOC_ID_OFFSET + if loc < SC2HOTS_LOC_ID_OFFSET + else (SC2HOTS_LOC_ID_OFFSET - SC2Mission.ALL_IN.id * VICTORY_MODULO) + ) + mission_id, objective = divmod(loc - offset, VICTORY_MODULO) + mission_id_to_location_ids[mission_id].add(objective) + self.mission_id_to_location_ids = { + mission_id: sorted(objectives) + for mission_id, objectives in mission_id_to_location_ids.items() + } + + def locations_for_mission(self, mission: SC2Mission) -> typing.Iterable[int]: + mission_id: int = mission.id + objectives = self.mission_id_to_location_ids[mission_id] + for objective in objectives: + yield get_location_id(mission_id, objective) + + def locations_for_mission_id(self, mission_id: int) -> typing.Iterable[int]: + objectives = self.mission_id_to_location_ids[mission_id] + for objective in objectives: + yield get_location_id(mission_id, objective) + + def uncollected_locations_in_mission(self, mission: SC2Mission) -> typing.Iterable[int]: + for location_id in self.locations_for_mission(mission): + if location_id in self.missing_locations: + yield location_id + + def is_mission_completed(self, mission_id: int) -> bool: + return get_location_id(mission_id, 0) in self.checked_locations + + + async def trade_acquire_storage(self, keep_trying: bool = False) -> typing.Optional[dict]: + # This function was largely taken from the Pokemon Emerald client + """ + Acquires a lock on the Void Trade DataStorage. + Locking the key means you have exclusive access + to modifying the value until you unlock it or the key expires (5 seconds). + + If `keep_trying` is `True`, it will keep trying to acquire the lock + until successful. Otherwise it will return `None` if it fails to + acquire the lock. + """ + while not self.exit_event.is_set() and self.last_bot and self.last_bot.game_running: + lock = int(time.time_ns() / 1000000000) # in seconds + + # Make sure we're not past the waiting limit + # SC2 needs to be notified within 10 minutes of game time (training time of the dummy units) + if self.trade_lock_start is not None: + if self.last_bot.time - self.trade_lock_start >= TRADE_LOCK_WAIT_LIMIT: + self.trade_lock_wait = 0 + self.trade_lock_start = None + return None + elif keep_trying: + self.trade_lock_start = self.last_bot.time + + message_uuid = str(uuid.uuid4()) + await self.send_msgs([{ + "cmd": "Set", + "key": self.trade_storage_team(), + "default": { TRADE_DATASTORAGE_LOCK: 0 }, + "want_reply": True, + "operations": [{ "operation": "update", "value": { TRADE_DATASTORAGE_LOCK: lock } }], + "uuid": message_uuid, + }]) + + self.trade_reply_event.clear() + try: + await asyncio.wait_for(self.trade_reply_event.wait(), 5) + except asyncio.TimeoutError: + if not keep_trying: + return None + continue + + assert self.trade_latest_reply is not None + reply = copy.deepcopy(self.trade_latest_reply) + + # Make sure the most recently received update was triggered by our lock attempt + if reply.get("uuid", None) != message_uuid: + if not keep_trying: + return None + await asyncio.sleep(TRADE_LOCK_TIME) + continue + + # Make sure the current value of the lock is what we set it to + # (I think this should theoretically never run) + if reply["value"][TRADE_DATASTORAGE_LOCK] != lock: + if not keep_trying: + return None + await asyncio.sleep(TRADE_LOCK_TIME) + continue + + # Make sure that the lock value we replaced is at least 5 seconds old + # If it was unlocked before our change, its value was 0 and it will look decades old + if lock - reply["original_value"][TRADE_DATASTORAGE_LOCK] < TRADE_LOCK_TIME: + if not keep_trying: + return None + + # Multiple clients trying to lock the key may get stuck in a loop of checking the lock + # by trying to set it, which will extend its expiration. So if we see that the lock was + # too new when we replaced it, we should wait for increasingly longer periods so that + # eventually the lock will expire and a client will acquire it. + self.trade_lock_wait += TRADE_LOCK_TIME + self.trade_lock_wait += random.randrange(100, 500) / 1000 + + await asyncio.sleep(self.trade_lock_wait) + continue + + # We have the lock, reset the waiting period and return + self.trade_lock_wait = 0 + self.trade_lock_start = None + return reply + return None + + + async def trade_receive(self, amount: int = 1): + """ + Tries to pop `amount` units out of the trade storage. + """ + reply = await self.trade_acquire_storage(True) + + if reply is None: + self.trade_response = "?TradeFail Void Trade failed: Could not communicate with server. Trade cost refunded." + return None + + # Find available units + # Ignore units we sent ourselves + allowed_slots: typing.List[str] = [ + slot for slot in reply["value"] + if slot != TRADE_DATASTORAGE_LOCK \ + and slot != self.trade_storage_slot() + ] + # Filter out trades that are too old + if self.trade_age_limit != VoidTradeAgeLimit.option_disabled: + trade_time = reply["value"][TRADE_DATASTORAGE_LOCK] + allowed_age = void_trade_age_limits_ms[self.trade_age_limit] + is_young_enough = lambda send_time: trade_time - send_time <= allowed_age + else: + is_young_enough = lambda _: True + # Filter out banned units + if self.trade_workers_allowed == VoidTradeWorkers.option_false: + is_unit_allowed = lambda unit: unit not in worker_units + else: + is_unit_allowed = lambda _: True + + available_units: typing.List[typing.Tuple[str, str, int]] = [] + available_counts: typing.List[int] = [] + for slot in allowed_slots: + for (send_time, units) in reply["value"][slot].items(): + if is_young_enough(int(send_time)): + for (unit, count) in units.items(): + if is_unit_allowed(str(unit)): + available_units.append((unit, slot, send_time)) + available_counts.append(count) + + # Pick units to receive + # If there's not enough units in total, just pick as many as possible + # SC2 should handle the refund + available = sum(available_counts) + refunds = 0 + if available < amount: + refunds = amount - available + amount = available + if available == 0: + # random.sample crashes if counts is an empty list + units = [] + else: + units = random.sample(available_units, amount, counts = available_counts) + + # Build response data + unit_counts: typing.Dict[str, int] = {} + slots_to_update: typing.Dict[str, typing.Dict[int, typing.Dict[str, int]]] = {} + for (unit, slot, send_time) in units: + unit_counts[unit] = unit_counts.get(unit, 0) + 1 + if slot not in slots_to_update: + slots_to_update[slot] = copy.deepcopy(reply["value"][slot]) + slots_to_update[slot][send_time][unit] -= 1 + # Clean up units that were removed completely + if slots_to_update[slot][send_time][unit] == 0: + slots_to_update[slot][send_time].pop(unit) + # Clean up trades that were completely exhausted + if len(slots_to_update[slot][send_time]) == 0: + slots_to_update[slot].pop(send_time) + + await self.send_msgs([ + { # Update server storage + "cmd": "Set", + "key": self.trade_storage_team(), + "operations": [{ "operation": "update", "value": slots_to_update }] + }, + { # Release the lock + "cmd": "Set", + "key": self.trade_storage_team(), + "operations": [{ "operation": "update", "value": { TRADE_DATASTORAGE_LOCK: 0 } }] + } + ]) + + # Give units to bot + self.trade_response = f"?Trade {refunds} " + " ".join(f"{unit} {count}" for (unit, count) in unit_counts.items()) + + + async def trade_send(self, units: typing.List[str]): + """ + Tries to upload `units` to the trade DataStorage. + """ + reply = await self.trade_acquire_storage(True) + + if reply is None: + self.trade_response = "?TradeFail Void Trade failed: Could not communicate with server. Your units remain." + return None + + # Create a storage entry for the time the trade was confirmed + trade_time = reply["value"][TRADE_DATASTORAGE_LOCK] + storage_entry = {} + for unit in units: + storage_entry[unit] = storage_entry.get(unit, 0) + 1 + + # Update the storage with the new units + data: typing.Dict[int, typing.Dict[str, int]] = copy.deepcopy(reply["value"].get(self.trade_storage_slot(), {})) + data[trade_time] = storage_entry + + await self.send_msgs([ + { # Send the updated data + "cmd": "Set", + "key": self.trade_storage_team(), + "operations": [{ "operation": "update", "value": { self.trade_storage_slot(): data } }] + }, + { # Release the lock + "cmd": "Set", + "key": self.trade_storage_team(), + "operations": [{ "operation": "update", "value": { TRADE_DATASTORAGE_LOCK: 0 } }] + } + ]) + + # Notify the game + self.trade_response = "?TradeSuccess Void Trade successful: Units sent!" + + +class CompatItemHolder(typing.NamedTuple): + name: str + quantity: int = 1 + + +async def main(args: typing.Sequence[str] | None): + multiprocessing.freeze_support() + parser = get_base_parser() + parser.add_argument('--name', default=None, help="Slot Name to connect as.") + args, uri = parser.parse_known_args(args) + + if uri and uri[0].startswith('archipelago://'): + args.url = uri[0] + handle_url_arg(args, parser) + + ctx = SC2Context(args.connect, args.password) + ctx.auth = args.name + if ctx.server_task is None: + ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop") + + if gui_enabled: + ctx.run_gui() + ctx.run_cli() + + await ctx.exit_event.wait() + + await ctx.shutdown() + +# These items must be given to the player if the game is generated on older versions +API2_TO_API3_COMPAT_ITEMS: typing.Set[CompatItemHolder] = { + CompatItemHolder(item_names.PHOTON_CANNON), + CompatItemHolder(item_names.OBSERVER), + CompatItemHolder(item_names.WARP_HARMONIZATION), + CompatItemHolder(item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, 3) +} +API3_TO_API4_COMPAT_ITEMS: typing.Set[CompatItemHolder] = { + # War Council + CompatItemHolder(item_names.ZEALOT_WHIRLWIND), + CompatItemHolder(item_names.CENTURION_RESOURCE_EFFICIENCY), + CompatItemHolder(item_names.SENTINEL_RESOURCE_EFFICIENCY), + CompatItemHolder(item_names.STALKER_PHASE_REACTOR), + CompatItemHolder(item_names.DRAGOON_PHALANX_SUIT), + CompatItemHolder(item_names.INSTIGATOR_MODERNIZED_SERVOS), + CompatItemHolder(item_names.ADEPT_DISRUPTIVE_TRANSFER), + CompatItemHolder(item_names.SLAYER_PHASE_BLINK), + CompatItemHolder(item_names.AVENGER_KRYHAS_CLOAK), + CompatItemHolder(item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY), + CompatItemHolder(item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY), + CompatItemHolder(item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY), + CompatItemHolder(item_names.SENTRY_DOUBLE_SHIELD_RECHARGE), + CompatItemHolder(item_names.ENERGIZER_MOBILE_CHRONO_BEAM), + CompatItemHolder(item_names.HAVOC_ENDURING_SIGHT), + CompatItemHolder(item_names.HIGH_TEMPLAR_PLASMA_SURGE), + CompatItemHolder(item_names.SIGNIFIER_FEEDBACK), + CompatItemHolder(item_names.ASCENDANT_BREATH_OF_CREATION), + CompatItemHolder(item_names.DARK_ARCHON_INDOMITABLE_WILL), + CompatItemHolder(item_names.IMMORTAL_IMPROVED_BARRIER), + CompatItemHolder(item_names.VANGUARD_RAPIDFIRE_CANNON), + CompatItemHolder(item_names.VANGUARD_FUSION_MORTARS), + CompatItemHolder(item_names.ANNIHILATOR_TWILIGHT_CHASSIS), + CompatItemHolder(item_names.COLOSSUS_FIRE_LANCE), + CompatItemHolder(item_names.WRATHWALKER_AERIAL_TRACKING), + CompatItemHolder(item_names.REAVER_KHALAI_REPLICATORS), + CompatItemHolder(item_names.PHOENIX_DOUBLE_GRAVITON_BEAM), + CompatItemHolder(item_names.CORSAIR_NETWORK_DISRUPTION), + CompatItemHolder(item_names.MIRAGE_GRAVITON_BEAM), + CompatItemHolder(item_names.VOID_RAY_PRISMATIC_RANGE), + CompatItemHolder(item_names.CARRIER_REPAIR_DRONES), + CompatItemHolder(item_names.TEMPEST_DISINTEGRATION), + CompatItemHolder(item_names.ARBITER_VESSEL_OF_THE_CONCLAVE), + CompatItemHolder(item_names.MOTHERSHIP_INTEGRATED_POWER), + # Other items + CompatItemHolder(item_names.ASCENDANT_ARCHON_MERGE), + CompatItemHolder(item_names.DARK_TEMPLAR_ARCHON_MERGE), + CompatItemHolder(item_names.SPORE_CRAWLER_BIO_BONUS), +} + +def compat_item_to_network_items(compat_item: CompatItemHolder) -> typing.List[NetworkItem]: + item_id = get_full_item_list()[compat_item.name].code + network_item = NetworkItem(item_id, 0, 0, 0) + return compat_item.quantity * [network_item] + + +def calculate_items(ctx: SC2Context) -> typing.Dict[SC2Race, typing.List[int]]: + items = ctx.items_received.copy() + item_list = get_full_item_list() + def create_network_item(item_name: str) -> NetworkItem: + return NetworkItem(item_list[item_name].code, 0, 0, 0) + + # Items unlocked in earlier generator versions by default (Prophecy defaults, war council, rebalances) + if ctx.slot_data_version < 3: + for compat_item in API2_TO_API3_COMPAT_ITEMS: + items.extend(compat_item_to_network_items(compat_item)) + if ctx.slot_data_version < 4: + for compat_item in API3_TO_API4_COMPAT_ITEMS: + items.extend(compat_item_to_network_items(compat_item)) + received_item_ids = set(item.item for item in ctx.items_received) + if item_list[item_names.GHOST_RESOURCE_EFFICIENCY].code in received_item_ids: + items.append(create_network_item(item_names.GHOST_BARGAIN_BIN_PRICES)) + if item_list[item_names.SPECTRE_RESOURCE_EFFICIENCY].code in received_item_ids: + items.append(create_network_item(item_names.SPECTRE_BARGAIN_BIN_PRICES)) + if item_list[item_names.ROGUE_FORCES].code in received_item_ids: + items.append(create_network_item(item_names.UNRESTRICTED_MUTATION)) + if item_list[item_names.SCOUT_RESOURCE_EFFICIENCY].code in received_item_ids: + items.append(create_network_item(item_names.SCOUT_SUPPLY_EFFICIENCY)) + if item_list[item_names.REAVER_RESOURCE_EFFICIENCY].code in received_item_ids: + items.append(create_network_item(item_names.REAVER_BARGAIN_BIN_PRICES)) + + # API < 4 Orbital Command Count (Deprecated item) + orbital_command_count: int = 0 + + network_item: NetworkItem + accumulators: typing.Dict[SC2Race, typing.List[int]] = { + race: [0 for element in item_type_enum_class if element.flag_word >= 0] + for race, item_type_enum_class in race_to_item_type.items() + } + + # Protoss Shield grouped item specific logic + shields_from_ground_upgrade: int = 0 + shields_from_air_upgrade: int = 0 + + for network_item in items: + name = lookup_id_to_name.get(network_item.item) + if name is None: + continue + item_data: ItemData = item_list[name] + + if item_data.type.flag_word < 0: + continue + + # exists exactly once + if item_data.quantity == 1 or name in item_name_groups[ItemGroupNames.UNRELEASED_ITEMS]: + accumulators[item_data.race][item_data.type.flag_word] |= 1 << item_data.number + + # exists multiple times + elif item_data.quantity > 1: + flaggroup = item_data.type.flag_word + + # Generic upgrades apply only to Weapon / Armor upgrades + if item_data.number >= 0: + accumulators[item_data.race][flaggroup] += 1 << item_data.number + else: + if name == item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: + shields_from_ground_upgrade += 1 + if name == item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: + shields_from_air_upgrade += 1 + for bundled_number in get_bundle_upgrade_member_numbers(name): + accumulators[item_data.race][flaggroup] += 1 << bundled_number + + # Regen bio-steel nerf with API3 - undo for older games + if ctx.slot_data_version < 3 and name == item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: + current_level = (accumulators[item_data.race][flaggroup] >> item_data.number) % 4 + if current_level == 2: + # Switch from level 2 to level 3 for compatibility + accumulators[item_data.race][flaggroup] += 1 << item_data.number + # sum + # Fillers, deprecated items + else: + if name == item_names.PROGRESSIVE_ORBITAL_COMMAND: + orbital_command_count += 1 + elif item_data.type == ZergItemType.Level: + accumulators[item_data.race][item_data.type.flag_word] += item_data.number + elif name == item_names.STARTING_MINERALS: + accumulators[item_data.race][item_data.type.flag_word] += ctx.minerals_per_item + elif name == item_names.STARTING_VESPENE: + accumulators[item_data.race][item_data.type.flag_word] += ctx.vespene_per_item + elif name == item_names.STARTING_SUPPLY: + accumulators[item_data.race][item_data.type.flag_word] += ctx.starting_supply_per_item + elif name == item_names.UPGRADE_RESEARCH_COST: + accumulators[item_data.race][item_data.type.flag_word] += ctx.research_cost_reduction_per_item + else: + accumulators[item_data.race][item_data.type.flag_word] += 1 + + # Fix Shields from generic upgrades by unit class (Maximum of ground/air upgrades) + if shields_from_ground_upgrade > 0 or shields_from_air_upgrade > 0: + shield_upgrade_level = max(shields_from_ground_upgrade, shields_from_air_upgrade) + shield_upgrade_item = item_list[item_names.PROGRESSIVE_PROTOSS_SHIELDS] + for _ in range(0, shield_upgrade_level): + accumulators[shield_upgrade_item.race][shield_upgrade_item.type.flag_word] += 1 << shield_upgrade_item.number + + # Deprecated Orbital Command handling (Backwards compatibility): + if orbital_command_count > 0: + orbital_command_replacement_items: typing.List[str] = [ + item_names.COMMAND_CENTER_SCANNER_SWEEP, + item_names.COMMAND_CENTER_MULE, + item_names.COMMAND_CENTER_EXTRA_SUPPLIES, + item_names.PLANETARY_FORTRESS_ORBITAL_MODULE + ] + replacement_item_ids = [get_full_item_list()[item_name].code for item_name in orbital_command_replacement_items] + if sum(item_id in replacement_item_ids for item_id in items) > 0: + logger.warning(inspect.cleandoc(""" + Both old Orbital Command and its replacements are present in the world. Skipping compatibility handling. + """)) + else: + # None of replacement items are present + # L1: MULE and Scanner Sweep + scanner_sweep_data = get_full_item_list()[item_names.COMMAND_CENTER_SCANNER_SWEEP] + mule_data = get_full_item_list()[item_names.COMMAND_CENTER_MULE] + accumulators[scanner_sweep_data.race][scanner_sweep_data.type.flag_word] += 1 << scanner_sweep_data.number + accumulators[mule_data.race][mule_data.type.flag_word] += 1 << mule_data.number + if orbital_command_count >= 2: + # L2 MULE and Scanner Sweep usable even in Planetary Fortress Mode + planetary_orbital_module_data = get_full_item_list()[item_names.PLANETARY_FORTRESS_ORBITAL_MODULE] + accumulators[planetary_orbital_module_data.race][planetary_orbital_module_data.type.flag_word] += \ + 1 << planetary_orbital_module_data.number + + # Upgrades from completed missions + if ctx.generic_upgrade_missions > 0: + total_missions = sum(len(column) for campaign in ctx.custom_mission_order for layout in campaign.layouts for column in layout.missions) + num_missions = int((ctx.generic_upgrade_missions / 100) * total_missions) + completed = len([mission_id for mission_id in ctx.mission_id_to_location_ids if ctx.is_mission_completed(mission_id)]) + upgrade_count = min(completed // num_missions, ctx.max_upgrade_level) if num_missions > 0 else ctx.max_upgrade_level + upgrade_count = min(upgrade_count, WEAPON_ARMOR_UPGRADE_MAX_LEVEL) + + # Equivalent to "Progressive Weapon/Armor Upgrade" item + global_upgrades: typing.Set[str] = upgrade_included_names[GenericUpgradeItems.option_bundle_all] + for global_upgrade in global_upgrades: + race = get_full_item_list()[global_upgrade].race + upgrade_flaggroup = race_to_item_type[race]["Upgrade"].flag_word + for bundled_number in get_bundle_upgrade_member_numbers(global_upgrade): + accumulators[race][upgrade_flaggroup] += upgrade_count << bundled_number + + return accumulators + + +def get_bundle_upgrade_member_numbers(bundled_item: str) -> typing.List[int]: + upgrade_elements: typing.List[str] = upgrade_bundles[bundled_item] + if bundled_item in (item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE): + # Shields are handled as a maximum of those two + upgrade_elements = [item_name for item_name in upgrade_elements if item_name != item_names.PROGRESSIVE_PROTOSS_SHIELDS] + return [get_full_item_list()[item_name].number for item_name in upgrade_elements] + + +def calc_difficulty(difficulty: int): + if difficulty == 0: + return 'C' + elif difficulty == 1: + return 'N' + elif difficulty == 2: + return 'H' + elif difficulty == 3: + return 'B' + + return 'X' + + +def get_kerrigan_level(ctx: SC2Context, items: typing.Dict[SC2Race, typing.List[int]], missions_beaten: int) -> int: + item_value = items[SC2Race.ZERG][ZergItemType.Level.flag_word] + mission_value = missions_beaten * ctx.kerrigan_levels_per_mission_completed + if ctx.kerrigan_levels_per_mission_completed_cap != -1: + mission_value = min(mission_value, ctx.kerrigan_levels_per_mission_completed_cap) + total_value = item_value + mission_value + if ctx.kerrigan_total_level_cap != -1: + total_value = min(total_value, ctx.kerrigan_total_level_cap) + return total_value + + +def calculate_kerrigan_options(ctx: SC2Context) -> int: + result = 0 + + # Bits 0, 1 + # Kerrigan unit available + if ctx.kerrigan_presence in kerrigan_unit_available: + result |= 1 << 0 + + # Bit 2 + # Kerrigan primal status by map + if ctx.kerrigan_primal_status == KerriganPrimalStatus.option_vanilla: + result |= 1 << 2 + + return result + + +def caclulate_soa_options(ctx: SC2Context, mission: SC2Mission) -> int: + """ + Pack SOA options into a single integer with bitflags. + 0b000011 = SOA presence + 0b000100 = SOA in no-builds + 0b011000 = Passives presence + 0b100000 = PAssives in no-builds + """ + result = 0 + + # Bits 0, 1 + # SoA Calldowns available + soa_presence_value = 0 + if is_mission_in_soa_presence(ctx.spear_of_adun_presence, mission): + soa_presence_value = 3 + result |= soa_presence_value << 0 + + # Bit 2 + # SoA Calldowns for no-builds + if ctx.spear_of_adun_present_in_no_build == SpearOfAdunPresentInNoBuild.option_true: + result |= 1 << 2 + + # Bits 3,4 + # Autocasts + soa_autocasts_presence_value = 0 + if is_mission_in_soa_presence(ctx.spear_of_adun_passive_ability_presence, mission, SpearOfAdunPassiveAbilityPresence): + soa_autocasts_presence_value = 3 + # Guardian Shell breaks without SoA on version 4+, but can be generated without SoA on version 3 + if ctx.slot_data_version < 4 and MissionFlag.Protoss in mission.flags: + soa_autocasts_presence_value = 3 + result |= soa_autocasts_presence_value << 3 + + # Bit 5 + # Autocasts in no-builds + if ctx.spear_of_adun_passive_present_in_no_build == SpearOfAdunPassivesPresentInNoBuild.option_true: + result |= 1 << 5 + + return result + +def calculate_generic_upgrade_options(ctx: SC2Context) -> int: + result = 0 + + # Bits 0,1 + # Research mode + research_mode_value = 0 + if ctx.generic_upgrade_research == GenericUpgradeResearch.option_vanilla: + research_mode_value = 0 + elif ctx.generic_upgrade_research == GenericUpgradeResearch.option_auto_in_no_build: + research_mode_value = 1 + elif ctx.generic_upgrade_research == GenericUpgradeResearch.option_auto_in_build: + research_mode_value = 2 + elif ctx.generic_upgrade_research == GenericUpgradeResearch.option_always_auto: + research_mode_value = 3 + result |= research_mode_value << 0 + + # Bit 2 + # Speedup + if ctx.generic_upgrade_research_speedup == GenericUpgradeResearchSpeedup.option_true: + result |= 1 << 2 + + return result + +def calculate_trade_options(ctx: SC2Context) -> int: + result = 0 + + # Bit 0 + # Trade enabled + if ctx.trade_enabled: + result |= 1 << 0 + + # Bit 1 + # Workers allowed + if ctx.trade_workers_allowed == VoidTradeWorkers.option_true: + result |= 1 << 1 + + return result + +def kerrigan_primal(ctx: SC2Context, kerrigan_level: int) -> bool: + if ctx.kerrigan_primal_status == KerriganPrimalStatus.option_always_zerg: + return True + elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_always_human: + return False + elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_level_35: + return kerrigan_level >= 35 + elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_half_completion: + total_missions = len(ctx.mission_id_to_location_ids) + completed = sum(ctx.is_mission_completed(mission_id) + for mission_id in ctx.mission_id_to_location_ids) + return completed >= (total_missions / 2) + elif ctx.kerrigan_primal_status == KerriganPrimalStatus.option_item: + codes = [item.item for item in ctx.items_received] + return get_full_item_list()[item_names.KERRIGAN_PRIMAL_FORM].code in codes + return False + + +def get_mission_variant(mission_id: int) -> int: + mission_flags = lookup_id_to_mission[mission_id].flags + if MissionFlag.RaceSwap not in mission_flags: + return 0 + if MissionFlag.Terran in mission_flags: + return 1 + elif MissionFlag.Zerg in mission_flags: + return 2 + elif MissionFlag.Protoss in mission_flags: + return 3 + return 0 + + +def get_item_flag_word(item_name: str) -> int: + return get_full_item_list()[item_name].type.flag_word + + +async def starcraft_launch(ctx: SC2Context, mission_id: int): + sc2_logger.info(f"Launching {lookup_id_to_mission[mission_id].mission_name}. If game does not launch check log file for errors.") + + with DllDirectory(None): + run_game( + bot.maps.get(lookup_id_to_mission[mission_id].map_file), + [Bot(Race.Terran, ArchipelagoBot(ctx, mission_id), name="Archipelago", fullscreen=not SC2World.settings.game_windowed_mode)], + realtime=True, + ) + + +class ArchipelagoBot(bot.bot_ai.BotAI): + __slots__ = [ + 'game_running', + 'mission_completed', + 'boni', + 'setup_done', + 'ctx', + 'mission_id', + 'want_close', + 'can_read_game', + 'last_received_update', + 'last_trade_cargo', + 'last_supply_used' + ] + ctx: SC2Context + # defined in bot_ai_internal.py; seems to be mis-annotated as a float and later re-annotated as an int + supply_used: int + + def __init__(self, ctx: SC2Context, mission_id: int): + self.game_running = False + self.mission_completed = False + self.want_close = False + self.can_read_game = False + self.last_received_update: int = 0 + self.last_trade_cargo: set = set() + self.last_supply_used: int = 0 + self.trade_reply_cooldown: int = 0 + self.setup_done = False + self.ctx = ctx + self.ctx.last_bot = self + self.mission_id = mission_id + self.boni = [False for _ in range(MAX_BONUS)] + + super(ArchipelagoBot, self).__init__() + + async def on_step(self, iteration: int): + if self.want_close: + self.want_close = False + await self._client.leave() + return + game_state = 0 + if not self.setup_done: + self.setup_done = True + mission = lookup_id_to_mission[self.mission_id] + start_items = calculate_items(self.ctx) + missions_beaten = self.missions_beaten_count() + kerrigan_level = get_kerrigan_level(self.ctx, start_items, missions_beaten) + kerrigan_options = calculate_kerrigan_options(self.ctx) + soa_options = caclulate_soa_options(self.ctx, mission) + generic_upgrade_options = calculate_generic_upgrade_options(self.ctx) + trade_options = calculate_trade_options(self.ctx) + mission_variant = get_mission_variant(self.mission_id) # 0/1/2/3 for unchanged/Terran/Zerg/Protoss + nova_fallback: bool + if MissionFlag.Nova in mission.flags: + nova_fallback = self.ctx.use_nova_nco_fallback + elif MissionFlag.WoLNova in mission.flags: + nova_fallback = self.ctx.use_nova_wol_fallback + else: + nova_fallback = False + uncollected_objectives: typing.List[int] = self.get_uncollected_objectives() + if self.ctx.difficulty_override >= 0: + difficulty = calc_difficulty(self.ctx.difficulty_override) + else: + difficulty = calc_difficulty(self.ctx.difficulty) + if self.ctx.game_speed_override >= 0: + game_speed = self.ctx.game_speed_override + else: + game_speed = self.ctx.game_speed + await self.chat_send( + "?SetOptions" + f" {difficulty}" + f" {generic_upgrade_options}" + f" {self.ctx.all_in_choice}" + f" {game_speed}" + f" {self.ctx.disable_forced_camera}" + f" {self.ctx.skip_cutscenes}" + f" {kerrigan_options}" + f" {self.ctx.grant_story_tech}" + f" {self.ctx.take_over_ai_allies}" + f" {soa_options}" + f" {self.ctx.mission_order}" + f" {int(nova_fallback)}" + f" {self.ctx.grant_story_levels}" + f" {self.ctx.enable_morphling}" + f" {mission_variant}" + f" {trade_options}" + f" {self.ctx.difficulty_damage_modifier}" + f" {self.ctx.mercenary_highlanders}" # TODO: Possibly rework it into unit options in the next cycle + f" {self.ctx.war_council_nerfs}" + ) + await self.update_resources(start_items) + await self.update_terran_tech(start_items) + await self.update_zerg_tech(start_items, kerrigan_level) + await self.update_protoss_tech(start_items) + await self.update_misc_tech(start_items) + await self.update_colors() + if uncollected_objectives: + await self.chat_send("?UncollectedLocations {}".format( + functools.reduce(lambda a, b: a + " " + b, [str(x) for x in uncollected_objectives]) + )) + await self.chat_send("?LoadFinished") + self.last_received_update = len(self.ctx.items_received) + + else: + if self.ctx.pending_color_update: + await self.update_colors() + + if not self.ctx.announcements.empty(): + message = self.ctx.announcements.get(timeout=1) + await self.chat_send("?SendMessage " + message) + self.ctx.announcements.task_done() + + # Archipelago reads the health + controller1_state = 0 + controller2_state = 0 + for unit in self.all_own_units(): + if unit.health_max == CONTROLLER_HEALTH: + controller1_state = int(CONTROLLER_HEALTH - unit.health) + self.can_read_game = True + elif unit.health_max == CONTROLLER2_HEALTH: + controller2_state = int(CONTROLLER2_HEALTH - unit.health) + self.can_read_game = True + elif unit.name == TRADE_UNIT: + # Handle Void Trade requests + # Check for orders (for buildings this is usually research or training) + if not unit.is_idle and not self.ctx.trade_underway: + button = unit.orders[0].ability.button_name + if button == TRADE_SEND_BUTTON and len(self.last_trade_cargo) > 0: + units_to_send: typing.List[str] = [] + non_ap_units: typing.Set[str] = set() + for passenger in self.last_trade_cargo: + # Alternatively passenger._type_data.name but passenger.name seems to always match + unit_name = passenger.name + if unit_name.startswith("AP_"): + units_to_send.append(normalized_unit_types.get(unit_name, unit_name)) + else: + non_ap_units.add(unit_name) + if len(non_ap_units) > 0: + sc2_logger.info(f"Void Trade tried to send non-AP units: {', '.join(non_ap_units)}") + self.ctx.trade_response = "?TradeFail Void Trade rejected: Trade contains invalid units." + self.ctx.trade_underway = True + else: + self.ctx.trade_response = None + self.ctx.trade_underway = True + async_start(self.ctx.trade_send(units_to_send)) + elif button == TRADE_RECEIVE_1_BUTTON: + self.ctx.trade_underway = True + if self.supply_used != self.last_supply_used: + self.ctx.trade_response = None + async_start(self.ctx.trade_receive(1)) + else: + self.ctx.trade_response = "?TradeFail Void Trade rejected: Not enough supply." + elif button == TRADE_RECEIVE_5_BUTTON: + self.ctx.trade_underway = True + if self.supply_used != self.last_supply_used: + self.ctx.trade_response = None + async_start(self.ctx.trade_receive(5)) + else: + self.ctx.trade_response = "?TradeFail Void Trade rejected: Not enough supply." + elif not unit.is_idle and self.trade_reply_cooldown > 0: + self.trade_reply_cooldown -= 1 + elif unit.is_idle and self.trade_reply_cooldown > 0: + self.trade_reply_cooldown = 0 + self.ctx.trade_response = None + self.ctx.trade_underway = False + else: + # The API returns no passengers for researching/training buildings, + # so we need to buffer the passengers each frame + self.last_trade_cargo = unit.passengers + # SC2 has no good means of detecting when a unit is queued while supply capped, + # so a supply buffer here is the best we can do + self.last_supply_used = self.supply_used + game_state = controller1_state + (controller2_state << 15) + + if iteration == 160 and not game_state & 1: + await self.chat_send("?SendMessage Warning: Archipelago unable to connect or has lost connection to " + + "Starcraft 2 (This is likely a map issue)") + + if self.last_received_update < len(self.ctx.items_received): + current_items = calculate_items(self.ctx) + missions_beaten = self.missions_beaten_count() + kerrigan_level = get_kerrigan_level(self.ctx, current_items, missions_beaten) + await self.update_resources(current_items) + await self.update_terran_tech(current_items) + await self.update_zerg_tech(current_items, kerrigan_level) + await self.update_protoss_tech(current_items) + await self.update_misc_tech(current_items) + self.last_received_update = len(self.ctx.items_received) + + if game_state & 1: + if not self.game_running: + print("Archipelago Connected") + self.game_running = True + + if self.can_read_game: + if game_state & (1 << 1) and not self.mission_completed: + victory_locations = [get_location_id(self.mission_id, 0)] + send_victory = ( + self.mission_id in self.ctx.final_mission_ids and + len(self.ctx.final_locations) == len(self.ctx.checked_locations.union(victory_locations).intersection(self.ctx.final_locations)) + ) + + # Old slots don't have locations on goal + if not send_victory or self.ctx.slot_data_version >= 4: + sc2_logger.info("Mission Completed") + location_ids = self.ctx.mission_id_to_location_ids[self.mission_id] + victory_locations += sorted([ + get_location_id(self.mission_id, location_id) + for location_id in location_ids + if (location_id % VICTORY_MODULO) >= VICTORY_CACHE_OFFSET + ]) + await self.ctx.send_msgs( + [{"cmd": 'LocationChecks', + "locations": victory_locations}]) + self.mission_completed = True + + if send_victory: + print("Game Complete") + await self.ctx.send_msgs([{"cmd": 'StatusUpdate', "status": ClientStatus.CLIENT_GOAL}]) + self.mission_completed = True + self.ctx.finished_game = True + + for x, completed in enumerate(self.boni): + if not completed and game_state & (1 << (x + 2)): + await self.ctx.send_msgs( + [{"cmd": 'LocationChecks', + "locations": [get_location_id(self.mission_id, x + 1)]}]) + self.boni[x] = True + + # Send Void Trade results + if self.ctx.trade_response is not None and self.trade_reply_cooldown == 0: + await self.chat_send(self.ctx.trade_response) + # Wait an arbitrary amount of frames before trying again + self.trade_reply_cooldown = 60 + else: + await self.chat_send("?SendMessage LostConnection - Lost connection to game.") + + def get_uncollected_objectives(self) -> typing.List[int]: + result = [ + location % VICTORY_MODULO + for location in self.ctx.uncollected_locations_in_mission(lookup_id_to_mission[self.mission_id]) + if (location % VICTORY_MODULO) < VICTORY_CACHE_OFFSET + ] + return result + + def missions_beaten_count(self) -> int: + return len([location for location in self.ctx.checked_locations if location % VICTORY_MODULO == 0]) + + async def update_colors(self): + await self.chat_send("?SetColor rr " + str(self.ctx.player_color_raynor)) + await self.chat_send("?SetColor ks " + str(self.ctx.player_color_zerg)) + await self.chat_send("?SetColor pz " + str(self.ctx.player_color_zerg_primal)) + await self.chat_send("?SetColor da " + str(self.ctx.player_color_protoss)) + await self.chat_send("?SetColor nova " + str(self.ctx.player_color_nova)) + self.ctx.pending_color_update = False + + async def update_resources(self, current_items: typing.Dict[SC2Race, typing.List[int]]): + DEFAULT_MAX_SUPPLY = 200 + max_supply_amount = max( + DEFAULT_MAX_SUPPLY + + ( + current_items[SC2Race.ANY][get_item_flag_word(item_names.MAX_SUPPLY)] + * self.ctx.maximum_supply_per_item + ) + - ( + current_items[SC2Race.ANY][get_item_flag_word(item_names.REDUCED_MAX_SUPPLY)] + * self.ctx.maximum_supply_reduction_per_item + ), + self.ctx.lowest_maximum_supply, + ) + await self.chat_send("?GiveResources {} {} {} {}".format( + current_items[SC2Race.ANY][get_item_flag_word(item_names.STARTING_MINERALS)], + current_items[SC2Race.ANY][get_item_flag_word(item_names.STARTING_VESPENE)], + current_items[SC2Race.ANY][get_item_flag_word(item_names.STARTING_SUPPLY)], + max_supply_amount - DEFAULT_MAX_SUPPLY, + )) + + async def update_terran_tech(self, current_items: typing.Dict[SC2Race, typing.List[int]]): + terran_items = current_items[SC2Race.TERRAN] + await self.chat_send("?GiveTerranTech " + " ".join(map(str, terran_items))) + + async def update_zerg_tech(self, current_items: typing.Dict[SC2Race, typing.List[int]], kerrigan_level: int): + zerg_items = current_items[SC2Race.ZERG] + zerg_items = [value for index, value in enumerate(zerg_items) if index not in [ZergItemType.Level.flag_word, ZergItemType.Primal_Form.flag_word]] + kerrigan_primal_by_items = kerrigan_primal(self.ctx, kerrigan_level) + kerrigan_primal_bot_value = 1 if kerrigan_primal_by_items else 0 + await self.chat_send(f"?GiveZergTech {kerrigan_level} {kerrigan_primal_bot_value} " + ' '.join(map(str, zerg_items))) + + async def update_protoss_tech(self, current_items: typing.Dict[SC2Race, typing.List[int]]): + protoss_items = current_items[SC2Race.PROTOSS] + await self.chat_send("?GiveProtossTech " + " ".join(map(str, protoss_items))) + + async def update_misc_tech(self, current_items: typing.Dict[SC2Race, typing.List[int]]): + await self.chat_send("?GiveMiscTech {} {} {}".format( + current_items[SC2Race.ANY][get_item_flag_word(item_names.BUILDING_CONSTRUCTION_SPEED)], + current_items[SC2Race.ANY][get_item_flag_word(item_names.UPGRADE_RESEARCH_SPEED)], + current_items[SC2Race.ANY][get_item_flag_word(item_names.UPGRADE_RESEARCH_COST)], + )) + +def calc_unfinished_nodes( + ctx: SC2Context +) -> typing.Tuple[typing.List[int], typing.Dict[int, typing.List[int]], typing.List[int], typing.Set[int]]: + unfinished_missions: typing.Set[int] = set() + + available_missions, available_layouts, available_campaigns = calc_available_nodes(ctx) + + for mission_id in available_missions: + objectives = set(ctx.locations_for_mission_id(mission_id)) + if objectives: + objectives_completed = ctx.checked_locations & objectives + if len(objectives_completed) < len(objectives): + unfinished_missions.add(mission_id) + + return available_missions, available_layouts, available_campaigns, unfinished_missions + +def is_mission_available(ctx: SC2Context, mission_id_to_check: int) -> bool: + available_missions, _, _ = calc_available_nodes(ctx) + + return mission_id_to_check in available_missions + +def calc_available_nodes(ctx: SC2Context) -> typing.Tuple[typing.List[int], typing.Dict[int, typing.List[int]], typing.List[int]]: + beaten_missions: typing.Set[int] = {mission_id for mission_id in ctx.mission_id_to_entry_rules if ctx.is_mission_completed(mission_id)} + received_items = compute_received_items(ctx) + + mission_order_objects: typing.List[MissionOrderObjectSlotData] = [] + parent_objects: typing.List[typing.List[MissionOrderObjectSlotData]] = [] + for campaign in ctx.custom_mission_order: + mission_order_objects.append(campaign) + parent_objects.append([]) + for layout in campaign.layouts: + mission_order_objects.append(layout) + parent_objects.append([campaign]) + for column in layout.missions: + for mission in column: + if mission.mission_id == -1: + continue + mission_order_objects.append(mission) + parent_objects.append([campaign, layout]) + + candidate_accessible_objects: typing.List[MissionOrderObjectSlotData] = [ + mission_order_object for mission_order_object in mission_order_objects + if mission_order_object.entry_rule.is_accessible(beaten_missions, received_items) + ] + + accessible_objects: typing.List[MissionOrderObjectSlotData] = [] + + while len(candidate_accessible_objects) > 0: + accessible_missions: typing.List[MissionSlotData] = [mission_order_object for mission_order_object in accessible_objects if isinstance(mission_order_object, MissionSlotData)] + beaten_accessible_missions: typing.Set[int] = {mission.mission_id for mission in accessible_missions if mission.mission_id in beaten_missions} + accessible_objects_to_add: typing.List[MissionOrderObjectSlotData] = [] + for mission_order_object in candidate_accessible_objects: + if ( + mission_order_object.entry_rule.is_accessible(beaten_accessible_missions, received_items) + and all([ + parent_object.entry_rule.is_accessible(beaten_accessible_missions, received_items) + for parent_object in parent_objects[mission_order_objects.index(mission_order_object)] + ]) + ): + accessible_objects_to_add.append(mission_order_object) + if len(accessible_objects_to_add) > 0: + accessible_objects.extend(accessible_objects_to_add) + candidate_accessible_objects = [ + mission_order_object for mission_order_object in candidate_accessible_objects + if mission_order_object not in accessible_objects_to_add + ] + else: + break + + accessible_missions: typing.List[MissionSlotData] = [mission_order_object for mission_order_object in accessible_objects if isinstance(mission_order_object, MissionSlotData)] + beaten_accessible_missions: typing.Set[int] = {mission.mission_id for mission in accessible_missions if mission.mission_id in beaten_missions} + for mission_order_object in mission_order_objects: + # re-generate tooltip accessibility + for sub_rule in mission_order_object.entry_rule.sub_rules: + sub_rule.was_accessible = False + mission_order_object.entry_rule.is_accessible(beaten_accessible_missions, received_items) + + available_missions: typing.List[int] = [ + mission_order_object.mission_id for mission_order_object in accessible_objects + if isinstance(mission_order_object, MissionSlotData) + ] + available_campaign_objects: typing.List[CampaignSlotData] = [ + mission_order_object for mission_order_object in accessible_objects + if isinstance(mission_order_object, CampaignSlotData) + ] + available_campaigns: typing.List[int] = [ + campaign_idx for campaign_idx, campaign in enumerate(ctx.custom_mission_order) + if campaign in available_campaign_objects + ] + available_layout_objects: typing.List[LayoutSlotData] = [ + mission_order_object for mission_order_object in accessible_objects + if isinstance(mission_order_object, LayoutSlotData) + ] + available_layouts: typing.Dict[int, typing.List[int]] = { + campaign_idx: [ + layout_idx for layout_idx, layout in enumerate(campaign.layouts) if layout in available_layout_objects + ] + for campaign_idx, campaign in enumerate(ctx.custom_mission_order) + } + + return available_missions, available_layouts, available_campaigns + +def compute_received_items(ctx: SC2Context) -> typing.Counter[int]: + received_items: typing.Counter[int] = collections.Counter() + for network_item in ctx.items_received: + received_items[network_item.item] += 1 + return received_items + +def check_game_install_path() -> bool: + # First thing: go to the default location for ExecuteInfo. + # An exception for Windows is included because it's very difficult to find ~\Documents if the user moved it. + if is_windows: + # The next five lines of utterly inscrutable code are brought to you by copy-paste from Stack Overflow. + # https://stackoverflow.com/questions/6227590/finding-the-users-my-documents-path/30924555# + import ctypes.wintypes + CSIDL_PERSONAL = 5 # My Documents + SHGFP_TYPE_CURRENT = 0 # Get current, not default value + + buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) + ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_PERSONAL, None, SHGFP_TYPE_CURRENT, buf) + documentspath: str = buf.value + einfo = str(documentspath / Path("StarCraft II\\ExecuteInfo.txt")) + else: + einfo = str(bot.paths.get_home() / Path(bot.paths.USERPATH[bot.paths.PF])) + + # Check if the file exists. + if os.path.isfile(einfo): + + # Open the file and read it, picking out the latest executable's path. + with open(einfo) as f: + content = f.read() + if content: + search_result = re.search(r" = (.*)Versions", content) + if not search_result: + sc2_logger.warning(f"Found {einfo}, but it was empty. Run SC2 through the Blizzard launcher, " + "then try again.") + return False + base = search_result.group(1) + + if os.path.exists(base): + executable = bot.paths.latest_executeble(Path(base).expanduser() / "Versions") + + # Finally, check the path for an actual executable. + # If we find one, great. Set up the SC2PATH. + if os.path.isfile(executable): + sc2_logger.info(f"Found an SC2 install at {base}!") + sc2_logger.debug(f"Latest executable at {executable}.") + os.environ["SC2PATH"] = base + sc2_logger.debug(f"SC2PATH set to {base}.") + return True + else: + sc2_logger.warning(f"We may have found an SC2 install at {base}, but couldn't find {executable}.") + else: + sc2_logger.warning(f"{einfo} pointed to {base}, but we could not find an SC2 install there.") + else: + sc2_logger.warning(f"Couldn't find {einfo}. Run SC2 through the Blizzard launcher, then try again. " + f"If that fails, please run /set_path with your SC2 install directory.") + return False + + +def is_mod_installed_correctly() -> bool: + """Searches for all required files.""" + if "SC2PATH" not in os.environ: + check_game_install_path() + sc2_path: str = os.environ["SC2PATH"] + mapdir = sc2_path / Path('Maps/ArchipelagoCampaign') + mods = ["ArchipelagoCore", "ArchipelagoPlayer", "ArchipelagoPlayerSuper", "ArchipelagoPatches", + "ArchipelagoTriggers", "ArchipelagoPlayerWoL", "ArchipelagoPlayerHotS", + "ArchipelagoPlayerLotV", "ArchipelagoPlayerLotVPrologue", "ArchipelagoPlayerNCO"] + modfiles = [sc2_path / Path("Mods/" + mod + ".SC2Mod") for mod in mods] + wol_required_maps: typing.List[str] = ["WoL" + os.sep + mission.map_file + ".SC2Map" for mission in SC2Mission + if mission.campaign in (SC2Campaign.WOL, SC2Campaign.PROPHECY)] + hots_required_maps: typing.List[str] = ["HotS" + os.sep + mission.map_file + ".SC2Map" for mission in campaign_mission_table[SC2Campaign.HOTS]] + lotv_required_maps: typing.List[str] = ["LotV" + os.sep + mission.map_file + ".SC2Map" for mission in SC2Mission + if mission.campaign in (SC2Campaign.LOTV, SC2Campaign.PROLOGUE, SC2Campaign.EPILOGUE)] + nco_required_maps: typing.List[str] = ["NCO" + os.sep + mission.map_file + ".SC2Map" for mission in campaign_mission_table[SC2Campaign.NCO]] + required_maps = wol_required_maps + hots_required_maps + lotv_required_maps + nco_required_maps + needs_files = False + + # Check for maps. + missing_maps: typing.List[str] = [] + for mapfile in required_maps: + if not os.path.isfile(mapdir / mapfile): + missing_maps.append(mapfile) + if len(missing_maps) >= 19: + sc2_logger.warning(f"All map files missing from {mapdir}.") + needs_files = True + elif len(missing_maps) > 0: + for map in missing_maps: + sc2_logger.debug(f"Missing {map} from {mapdir}.") + sc2_logger.warning(f"Missing {len(missing_maps)} map files.") + needs_files = True + else: # Must be no maps missing + sc2_logger.debug(f"All maps found in {mapdir}.") + + # Check for mods. + for modfile in modfiles: + if os.path.isfile(modfile) or os.path.isdir(modfile): + sc2_logger.debug(f"Archipelago mod found at {modfile}.") + else: + sc2_logger.warning(f"Archipelago mod could not be found at {modfile}.") + needs_files = True + + # Final verdict. + if needs_files: + sc2_logger.warning("Required files are missing. Run /download_data to acquire them.") + return False + else: + sc2_logger.debug("All map/mod files are properly installed.") + return True + + +class DllDirectory: + # Credit to Black Sliver for this code. + # More info: https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectoryw + _old: typing.Optional[str] = None + _new: typing.Optional[str] = None + + def __init__(self, new: typing.Optional[str]): + self._new = new + + def __enter__(self): + old = self.get() + if self.set(self._new): + self._old = old + + def __exit__(self, *args): + if self._old is not None: + self.set(self._old) + + @staticmethod + def get() -> typing.Optional[str]: + if sys.platform == "win32": + n = ctypes.windll.kernel32.GetDllDirectoryW(0, None) + buf = ctypes.create_unicode_buffer(n) + ctypes.windll.kernel32.GetDllDirectoryW(n, buf) + return buf.value + # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific + return None + + @staticmethod + def set(s: typing.Optional[str]) -> bool: + if sys.platform == "win32": + return ctypes.windll.kernel32.SetDllDirectoryW(s) != 0 + # NOTE: other OS may support os.environ["LD_LIBRARY_PATH"], but this fix is windows-specific + return False + + +def download_latest_release_zip( + owner: str, + repo: str, + api_version: str, + metadata: typing.Optional[str] = None, + force_download=False +) -> typing.Tuple[str, typing.Optional[str]]: + """Downloads the latest release of a GitHub repo to the current directory as a .zip file.""" + import requests + + headers = {"Accept": 'application/vnd.github.v3+json'} + url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}" + + try: + r1 = requests.get(url, headers=headers) + if r1.status_code == 200: + latest_metadata = r1.json() + cleanup_downloaded_metadata(latest_metadata) + latest_metadata = str(latest_metadata) + # sc2_logger.info(f"Latest version: {latest_metadata}.") + else: + sc2_logger.warning(f"Status code: {r1.status_code}") + sc2_logger.warning("Failed to reach GitHub. Could not find download link.") + sc2_logger.warning(f"text: {r1.text}") + return "", metadata + + if (force_download is False) and (metadata == latest_metadata): + sc2_logger.info("Latest version already installed.") + return "", metadata + + sc2_logger.info(f"Attempting to download latest version of API version {api_version} of {repo}.") + download_url = r1.json()["assets"][0]["browser_download_url"] + + r2 = requests.get(download_url, headers=headers) + if r2.status_code == 200 and zipfile.is_zipfile(io.BytesIO(r2.content)): + tempdir = tempfile.gettempdir() + file = tempdir + os.sep + f"{repo}.zip" + with open(file, "wb") as fh: + fh.write(r2.content) + sc2_logger.info(f"Successfully downloaded {repo}.zip. Installing...") + return file, latest_metadata + else: + sc2_logger.warning(f"Status code: {r2.status_code}") + sc2_logger.warning("Download failed.") + sc2_logger.warning(f"text: {r2.text}") + return "", metadata + except requests.ConnectionError: + sc2_logger.warning("Failed to reach GitHub. Could not find download link.") + return "", metadata + + +def cleanup_downloaded_metadata(medatada_json: dict) -> None: + for asset in medatada_json['assets']: + del asset['download_count'] + + +def is_mod_update_available(owner: str, repo: str, api_version: str, metadata: str) -> bool: + import requests + + headers = {"Accept": 'application/vnd.github.v3+json'} + url = f"https://api.github.com/repos/{owner}/{repo}/releases/tags/{api_version}" + + try: + r1 = requests.get(url, headers=headers) + if r1.status_code == 200: + latest_metadata = r1.json() + cleanup_downloaded_metadata(latest_metadata) + latest_metadata = str(latest_metadata) + if metadata != latest_metadata: + return True + else: + return False + + else: + sc2_logger.warning("Failed to reach GitHub while checking for updates.") + sc2_logger.warning(f"Status code: {r1.status_code}") + sc2_logger.warning(f"text: {r1.text}") + return False + except requests.ConnectionError: + sc2_logger.warning("Failed to reach GitHub while checking for updates.") + return False + + +def get_location_offset(mission_id: int) -> int: + return SC2WOL_LOC_ID_OFFSET if mission_id <= SC2Mission.ALL_IN.id \ + else (SC2HOTS_LOC_ID_OFFSET - SC2Mission.ALL_IN.id * VICTORY_MODULO) + +def get_location_id(mission_id: int, objective_id: int) -> int: + return get_location_offset(mission_id) + mission_id * VICTORY_MODULO + objective_id + + +_has_forced_save = False +def force_settings_save_on_close() -> None: + """ + Settings has an existing auto-save feature, but it only triggers if a new key was introduced. + Force it to mark things as changed by introducing a new key and then cleaning up. + """ + global _has_forced_save + if _has_forced_save: + return + SC2World.settings.update({'invalid_attribute': True}) + del SC2World.settings.invalid_attribute + _has_forced_save = True + + +def launch(*args: str): + colorama.just_fix_windows_console() + asyncio.run(main(args)) + colorama.deinit() diff --git a/worlds/sc2/client_gui.py b/worlds/sc2/client_gui.py new file mode 100644 index 0000000000..6b2abcd9e9 --- /dev/null +++ b/worlds/sc2/client_gui.py @@ -0,0 +1,655 @@ +from typing import * +import asyncio +import logging + +from BaseClasses import ItemClassification +from NetUtils import JSONMessagePart +from kvui import GameManager, HoverBehavior, ServerToolTip, KivyJSONtoTextParser, LogtoUI +from kivy.app import App +from kivy.clock import Clock +from kivy.core.clipboard import Clipboard +from kivy.uix.gridlayout import GridLayout +from kivy.lang import Builder +from kivy.metrics import dp +from kivy.uix.label import Label +from kivy.uix.button import Button +from kivymd.uix.menu import MDDropdownMenu +from kivymd.uix.tooltip import MDTooltip +from kivy.uix.scrollview import ScrollView +from kivy.properties import StringProperty, BooleanProperty, NumericProperty + +from .client import SC2Context, calc_unfinished_nodes, is_mission_available, compute_received_items, STARCRAFT2 +from .item.item_descriptions import item_descriptions +from .item.item_annotations import ITEM_NAME_ANNOTATIONS +from .mission_order.entry_rules import RuleData, SubRuleRuleData, ItemRuleData +from .mission_tables import lookup_id_to_mission, campaign_race_exceptions, \ + SC2Mission, SC2Race +from .locations import LocationType, lookup_location_id_to_type, lookup_location_id_to_flags +from .options import LocationInclusion, MissionOrderScouting +from . import SC2World + + +class HoverableButton(HoverBehavior, Button): + pass + + +class MissionButton(HoverableButton, MDTooltip): + tooltip_text = StringProperty("Test") + mission_id = NumericProperty(-1) + is_exit = BooleanProperty(False) + is_goal = BooleanProperty(False) + showing_tooltip = BooleanProperty(False) + + def __init__(self, *args, **kwargs): + super(HoverableButton, self).__init__(**kwargs) + self._tooltip = ServerToolTip(text=self.text, markup=True) + self._tooltip.padding = [5, 2, 5, 2] + + def on_enter(self): + self._tooltip.text = self.tooltip_text + + if self.tooltip_text != "": + self.display_tooltip() + + def on_leave(self): + self.remove_tooltip() + + def display_tooltip(self, *args): + self.showing_tooltip = True + return super().display_tooltip(*args) + + def remove_tooltip(self, *args): + self.showing_tooltip = False + return super().remove_tooltip(*args) + + @property + def ctx(self) -> SC2Context: + return App.get_running_app().ctx + +class CampaignScroll(ScrollView): + border_on = BooleanProperty(False) + +class MultiCampaignLayout(GridLayout): + pass + +class DownloadDataWarningMessage(Label): + pass + +class CampaignLayout(GridLayout): + pass + +class RegionLayout(GridLayout): + pass + +class ColumnLayout(GridLayout): + pass + +class MissionLayout(GridLayout): + pass + +class MissionCategory(GridLayout): + pass + + +class SC2JSONtoKivyParser(KivyJSONtoTextParser): + def _handle_item_name(self, node: JSONMessagePart): + item_name = node["text"] + if self.ctx.slot_info[node["player"]].game != STARCRAFT2 or item_name not in item_descriptions: + return super()._handle_item_name(node) + + flags = node.get("flags", 0) + item_types = [] + if flags & ItemClassification.progression: + item_types.append("progression") + if flags & ItemClassification.useful: + item_types.append("useful") + if flags & ItemClassification.trap: + item_types.append("trap") + if not item_types: + item_types.append("normal") + + # TODO: Some descriptions are too long and get cut off. Is there a general solution or does someone need to manually check every description? + desc = item_descriptions[item_name].replace(". \n", ".
").replace(". ", ".
").replace("\n", "
") + annotation = ITEM_NAME_ANNOTATIONS.get(item_name) + if annotation is not None: + desc = f"{annotation}
{desc}" + ref = "Item Class: " + ", ".join(item_types) + "

" + desc + node.setdefault("refs", []).append(ref) + return super(KivyJSONtoTextParser, self)._handle_item_name(node) + + def _handle_text(self, node: JSONMessagePart): + if node.get("keep_markup", False): + for ref in node.get("refs", []): + node["text"] = f"[ref={self.ref_count}|{ref}]{node['text']}[/ref]" + self.ref_count += 1 + return super(KivyJSONtoTextParser, self)._handle_text(node) + else: + return super()._handle_text(node) + + +class SC2Manager(GameManager): + base_title = "Archipelago Starcraft 2 Client" + + campaign_panel: Optional[MultiCampaignLayout] = None + campaign_scroll_panel: Optional[CampaignScroll] = None + last_checked_locations: Set[int] = set() + last_items_received: List[int] = [] + last_shown_tooltip: int = -1 + last_data_out_of_date = False + mission_buttons: List[MissionButton] = [] + launching: Union[bool, int] = False # if int -> mission ID + refresh_from_launching = True + first_check = True + first_mission = "" + button_colors: Dict[SC2Race, Tuple[float, float, float]] = {} + ctx: SC2Context + + def __init__(self, ctx: SC2Context) -> None: + super().__init__(ctx) + self.json_to_kivy_parser = SC2JSONtoKivyParser(ctx) + self.minimized = False + + def on_start(self) -> None: + from . import gui_config + warnings, window_width, window_height = gui_config.get_window_defaults() + from kivy.core.window import Window + original_size_x, original_size_y = Window.size + Window.size = window_width, window_height + Window.left -= max((window_width - original_size_x) // 2, 0) + Window.top -= max((window_height - original_size_y) // 2, 0) + # Add the logging handler manually here instead of using `logging_pairs` to avoid adding 2 unnecessary tabs + logging.getLogger("Starcraft2").addHandler(LogtoUI(self.log_panels["All"].on_log)) + for startup_warning in warnings: + logging.getLogger("Starcraft2").warning(f"Startup WARNING: {startup_warning}") + for race in (SC2Race.TERRAN, SC2Race.PROTOSS, SC2Race.ZERG): + errors, color = gui_config.get_button_color(race.name) + self.button_colors[race] = color + for error in errors: + logging.getLogger("Starcraft2").warning(f"{race.name.title()} button color setting: {error}") + + def clear_tooltip(self) -> None: + for button in self.mission_buttons: + button.remove_tooltip() + + def shown_tooltip(self) -> int: + for button in self.mission_buttons: + if button.showing_tooltip: + return button.mission_id + return -1 + + def build(self): + container = super().build() + + panel = self.add_client_tab("Starcraft 2 Launcher", CampaignScroll()) + self.campaign_scroll_panel = panel.content + self.campaign_panel = MultiCampaignLayout() + panel.content.add_widget(self.campaign_panel) + + Clock.schedule_interval(self.build_mission_table, 0.5) + + return container + + def build_mission_table(self, dt) -> None: + if self.launching: + assert self.campaign_panel is not None + self.refresh_from_launching = False + + self.campaign_panel.clear_widgets() + self.campaign_panel.add_widget(Label( + text="Launching Mission: " + lookup_id_to_mission[self.launching].mission_name + )) + if self.ctx.ui: + self.ctx.ui.clear_tooltip() + return + + sorted_items_received = sorted([item.item for item in self.ctx.items_received]) + shown_tooltip = self.shown_tooltip() + hovering_tooltip = ( + self.last_shown_tooltip != -1 + and self.last_shown_tooltip == shown_tooltip + ) + data_changed = ( + self.last_checked_locations != self.ctx.checked_locations + or self.last_items_received != sorted_items_received + ) + needs_redraw = ( + data_changed + and not hovering_tooltip + or not self.refresh_from_launching + or self.last_data_out_of_date != self.ctx.data_out_of_date + or self.first_check + ) + self.last_shown_tooltip = shown_tooltip + if not needs_redraw: + return + + assert self.campaign_panel is not None + self.refresh_from_launching = True + + self.clear_tooltip() + self.campaign_panel.clear_widgets() + if self.ctx.data_out_of_date: + self.campaign_panel.add_widget(Label(text="", padding=[0, 5, 0, 5])) + warning_label = DownloadDataWarningMessage( + text="Map/Mod data is out of date. Run /download_data in the client", + padding=[0, 25, 0, 25], + ) + self.campaign_scroll_panel.border_on = True + self.campaign_panel.add_widget(warning_label) + else: + self.campaign_scroll_panel.border_on = False + self.last_data_out_of_date = self.ctx.data_out_of_date + if len(self.ctx.custom_mission_order) == 0: + self.campaign_panel.add_widget(Label(text="Connect to a world to see a mission layout here.")) + return + + self.last_checked_locations = self.ctx.checked_locations.copy() + self.last_items_received = sorted_items_received + self.first_check = False + + self.mission_buttons = [] + + available_missions, available_layouts, available_campaigns, unfinished_missions = calc_unfinished_nodes(self.ctx) + + # The MultiCampaignLayout widget needs a default height of 15 (set in the .kv) to display the above Labels correctly + multi_campaign_layout_height = 15 + + # Fetching IDs of all the locations with hints + self.hints_to_highlight = [] + hints = self.ctx.stored_data.get(f"_read_hints_{self.ctx.team}_{self.ctx.slot}") + if hints: + for hint in hints: + if hint['finding_player'] == self.ctx.slot and not hint['found']: + self.hints_to_highlight.append(hint['location']) + + MISSION_BUTTON_HEIGHT = 50 + MISSION_BUTTON_PADDING = 6 + for campaign_idx, campaign in enumerate(self.ctx.custom_mission_order): + longest_column = max(len(col) for layout in campaign.layouts for col in layout.missions) + if longest_column == 1: + campaign_layout_height = 115 + else: + campaign_layout_height = (longest_column + 2) * (MISSION_BUTTON_HEIGHT + MISSION_BUTTON_PADDING) + multi_campaign_layout_height += campaign_layout_height + campaign_layout = CampaignLayout(size_hint_y=None, height=campaign_layout_height) + campaign_layout.add_widget( + Label(text=campaign.name, size_hint_y=None, height=25, outline_width=1) + ) + mission_layout = MissionLayout(padding=[10,0,10,0]) + for layout_idx, layout in enumerate(campaign.layouts): + layout_panel = RegionLayout() + layout_panel.add_widget( + Label(text=layout.name, size_hint_y=None, height=25, outline_width=1)) + column_panel = ColumnLayout() + + for column in layout.missions: + category_panel = MissionCategory(padding=[3,MISSION_BUTTON_PADDING,3,MISSION_BUTTON_PADDING]) + + for mission in column: + mission_id = mission.mission_id + + # Empty mission slots + if mission_id == -1: + column_spacer = Label(text='', size_hint_y=None, height=MISSION_BUTTON_HEIGHT) + category_panel.add_widget(column_spacer) + continue + + mission_obj = lookup_id_to_mission[mission_id] + mission_finished = self.ctx.is_mission_completed(mission_id) + is_layout_exit = mission_id in layout.exits and not mission_finished + is_campaign_exit = mission_id in campaign.exits and not mission_finished + + text, tooltip = self.mission_text( + self.ctx, mission_id, mission_obj, + layout_idx, is_layout_exit, layout.name, + campaign_idx, is_campaign_exit, campaign.name, + available_missions, available_layouts, available_campaigns, unfinished_missions + ) + + mission_button = MissionButton(text=text, size_hint_y=None, height=MISSION_BUTTON_HEIGHT) + + mission_button.mission_id = mission_id + + if mission_id in self.ctx.final_mission_ids: + mission_button.is_goal = True + if is_layout_exit or is_campaign_exit: + mission_button.is_exit = True + + mission_race = mission_obj.race + if mission_race == SC2Race.ANY: + mission_race = mission_obj.campaign.race + race = campaign_race_exceptions.get(mission_obj, mission_race) + if race in self.button_colors: + mission_button.background_color = self.button_colors[race] + mission_button.tooltip_text = tooltip + mission_button.bind(on_press=self.mission_callback) + self.mission_buttons.append(mission_button) + category_panel.add_widget(mission_button) + + # layout_panel.add_widget(Label(text="")) + column_panel.add_widget(category_panel) + layout_panel.add_widget(column_panel) + mission_layout.add_widget(layout_panel) + campaign_layout.add_widget(mission_layout) + self.campaign_panel.add_widget(campaign_layout) + self.campaign_panel.height = multi_campaign_layout_height + + # For some reason the AP HoverBehavior won't send an enter event if a button spawns under the cursor, + # so manually send an enter event if a button is hovered immediately + for button in self.mission_buttons: + if button.hovered: + button.dispatch("on_enter") + break + + def mission_text( + self, ctx: SC2Context, mission_id: int, mission_obj: SC2Mission, + layout_id: int, is_layout_exit: bool, layout_name: str, campaign_id: int, is_campaign_exit: bool, campaign_name: str, + available_missions: List[int], available_layouts: Dict[int, List[int]], available_campaigns: List[int], + unfinished_missions: List[int] + ) -> Tuple[str, str]: + COLOR_MISSION_IMPORTANT = "6495ED" # blue + COLOR_MISSION_UNIMPORTANT = "A0BEF4" # lighter blue + COLOR_MISSION_CLEARED = "FFFFFF" # white + COLOR_MISSION_LOCKED = "A9A9A9" # gray + COLOR_PARENT_LOCKED = "848484" # darker gray + COLOR_MISSION_FINAL = "FFBC95" # orange + COLOR_MISSION_FINAL_LOCKED = "D0C0BE" # gray + orange + COLOR_FINAL_PARENT_LOCKED = "D0C0BE" # gray + orange + COLOR_FINAL_MISSION_REMINDER = "FF5151" # light red + COLOR_VICTORY_LOCATION = "FFC156" # gold + COLOR_TOOLTIP_DONE = "51FF51" # light green + COLOR_TOOLTIP_NOT_DONE = "FF5151" # light red + + text = mission_obj.mission_name + tooltip: str = "" + remaining_locations, plando_locations, remaining_count = self.sort_unfinished_locations(mission_id) + campaign_locked = campaign_id not in available_campaigns + layout_locked = layout_id not in available_layouts[campaign_id] + + # Map has uncollected locations + if mission_id in unfinished_missions: + if self.any_valuable_locations(remaining_locations): + text = f"[color={COLOR_MISSION_IMPORTANT}]{text}[/color]" + else: + text = f"[color={COLOR_MISSION_UNIMPORTANT}]{text}[/color]" + elif mission_id in available_missions: + text = f"[color={COLOR_MISSION_CLEARED}]{text}[/color]" + # Map requirements not met + else: + mission_rule, layout_rule, campaign_rule = ctx.mission_id_to_entry_rules[mission_id] + mission_has_rule = mission_rule.amount > 0 + layout_has_rule = layout_rule.amount > 0 + extra_reqs = False + if campaign_locked: + text = f"[color={COLOR_PARENT_LOCKED}]{text}[/color]" + tooltip += "To unlock this campaign, " + shown_rule = campaign_rule + extra_reqs = layout_has_rule or mission_has_rule + elif layout_locked: + text = f"[color={COLOR_PARENT_LOCKED}]{text}[/color]" + tooltip += "To unlock this questline, " + shown_rule = layout_rule + extra_reqs = mission_has_rule + else: + text = f"[color={COLOR_MISSION_LOCKED}]{text}[/color]" + tooltip += "To unlock this mission, " + shown_rule = mission_rule + rule_tooltip = shown_rule.tooltip(0, lookup_id_to_mission, COLOR_TOOLTIP_DONE, COLOR_TOOLTIP_NOT_DONE) + tooltip += rule_tooltip.replace(rule_tooltip[0], rule_tooltip[0].lower(), 1) + extra_word = "are" + if shown_rule.shows_single_rule(): + extra_word = "is" + tooltip += "." + if extra_reqs: + tooltip += f"\nThis mission has additional requirements\nthat will be shown once the above {extra_word} met." + + # Mark exit missions + exit_for: str = "" + if is_layout_exit: + exit_for += layout_name if layout_name else "this questline" + if is_campaign_exit: + if exit_for: + exit_for += " and " + exit_for += campaign_name if campaign_name else "this campaign" + if exit_for: + if tooltip: + tooltip += "\n\n" + tooltip += f"Required to beat {exit_for}" + + # Mark goal missions + if mission_id in self.ctx.final_mission_ids: + if mission_id in available_missions: + text = f"[color={COLOR_MISSION_FINAL}]{mission_obj.mission_name}[/color]" + elif campaign_locked or layout_locked: + text = f"[color={COLOR_FINAL_PARENT_LOCKED}]{mission_obj.mission_name}[/color]" + else: + text = f"[color={COLOR_MISSION_FINAL_LOCKED}]{mission_obj.mission_name}[/color]" + if tooltip and not exit_for: + tooltip += "\n\n" + elif exit_for: + tooltip += "\n" + if any(location_type == LocationType.VICTORY for (location_type, _, _) in remaining_locations): + tooltip += f"[color={COLOR_FINAL_MISSION_REMINDER}]Required to beat the world[/color]" + else: + tooltip += "This goal mission is already beaten.\nBeat the remaining goal missions to beat the world." + + # Populate remaining location list + if remaining_count > 0: + if tooltip: + tooltip += "\n\n" + tooltip += f"[b][color={COLOR_MISSION_IMPORTANT}]Uncollected locations[/color][/b]" + last_location_type = LocationType.VICTORY + victory_printed = False + + if self.ctx.mission_order_scouting != MissionOrderScouting.option_none: + mission_available = mission_id in available_missions + + scoutable = self.is_scoutable(remaining_locations, mission_available, layout_locked, campaign_locked) + else: + scoutable = False + + for location_type, location_name, _ in remaining_locations: + if location_type in (LocationType.VICTORY, LocationType.VICTORY_CACHE) and victory_printed: + continue + if location_type != last_location_type: + tooltip += f"\n[color={COLOR_MISSION_IMPORTANT}]{self.get_location_type_title(location_type)}:[/color]" + last_location_type = location_type + if location_type == LocationType.VICTORY: + victory_count = len([loc for loc in remaining_locations if loc[0] in (LocationType.VICTORY, LocationType.VICTORY_CACHE)]) + victory_loc = location_name.replace(":", f":[color={COLOR_VICTORY_LOCATION}]") + if victory_count > 1: + victory_loc += f' ({victory_count})' + tooltip += f"\n- {victory_loc}[/color]" + victory_printed = True + else: + tooltip += f"\n- {location_name}" + if scoutable: + tooltip += self.handle_scout_display(location_name) + if len(plando_locations) > 0: + tooltip += "\n[b]Plando:[/b]\n- " + tooltip += "\n- ".join(plando_locations) + + tooltip = f"[b]{text}[/b]\n" + tooltip + + #If the mission has any hints pointing to a check, add asterisks around the mission name + if any(tuple(x in self.hints_to_highlight for x in self.ctx.locations_for_mission_id(mission_id))): + text = "* " + text + " *" + + return text, tooltip + + + def mission_callback(self, button: MissionButton) -> None: + if button.last_touch.button == 'right': + self.open_mission_menu(button) + return + if not self.launching: + mission_id: int = button.mission_id + if self.ctx.play_mission(mission_id): + self.launching = mission_id + Clock.schedule_once(self.finish_launching, 10) + + def open_mission_menu(self, button: MissionButton) -> None: + # Will be assigned later, used to close menu in callbacks + menu = None + mission_id = button.mission_id + + def copy_mission_name(): + Clipboard.copy(lookup_id_to_mission[mission_id].mission_name) + menu.dismiss() + + menu_items = [ + { + "text": "Copy Mission Name", + "on_release": copy_mission_name, + } + ] + width_override = None + + hinted_item_ids = Counter() + hints = self.ctx.stored_data.get(f"_read_hints_{self.ctx.team}_{self.ctx.slot}") + if hints: + for hint in hints: + if hint['receiving_player'] == self.ctx.slot and not hint['found']: + hinted_item_ids[hint['item']] += 1 + + if not self.ctx.is_mission_completed(mission_id) and not is_mission_available(self.ctx, mission_id): + # Uncompleted and inaccessible missions can have items hinted if they're needed + # The inaccessible restriction is to ensure users don't waste hints on missions that they can already access + items_needed = self.resolve_items_needed(mission_id) + received_items = compute_received_items(self.ctx) + for item_id, amount in items_needed.items(): + # If we have already received or hinted enough of this item, skip it + if received_items[item_id] + hinted_item_ids[item_id] >= amount: + continue + if width_override is None: + width_override = dp(500) + item_name = self.ctx.item_names.lookup_in_game(item_id) + label_text = f"Hint Required Item: {item_name}" + + def hint_and_close(): + self.ctx.command_processor(self.ctx)(f"!hint {item_name}") + menu.dismiss() + + menu_items.append({ + "text": label_text, + "on_release": hint_and_close, + }) + + menu = MDDropdownMenu( + caller=button, + items=menu_items, + **({"width": width_override} if width_override else {}), + ) + menu.open() + + def resolve_items_needed(self, mission_id: int) -> Counter[int]: + def resolve_rule_to_items(rule: RuleData) -> Counter[int]: + if isinstance(rule, SubRuleRuleData): + all_items = Counter() + for sub_rule in rule.sub_rules: + # Take max of each item across all sub-rules + all_items |= resolve_rule_to_items(sub_rule) + return all_items + elif isinstance(rule, ItemRuleData): + return Counter(rule.item_ids) + else: + return Counter() + + rules = self.ctx.mission_id_to_entry_rules[mission_id] + # Take max value of each item across all rules using '|' + return (resolve_rule_to_items(rules.mission_rule) | + resolve_rule_to_items(rules.layout_rule) | + resolve_rule_to_items(rules.campaign_rule)) + + def finish_launching(self, dt): + self.launching = False + + def sort_unfinished_locations(self, mission_id: int) -> Tuple[List[Tuple[LocationType, str, int]], List[str], int]: + locations: List[Tuple[LocationType, str, int]] = [] + location_name_to_index: Dict[str, int] = {} + for loc in self.ctx.locations_for_mission_id(mission_id): + if loc in self.ctx.missing_locations: + location_name = self.ctx.location_names.lookup_in_game(loc) + location_name_to_index[location_name] = len(locations) + locations.append(( + lookup_location_id_to_type[loc], + location_name, + loc, + )) + count = len(locations) + + plando_locations = [] + elements_to_remove: Set[Tuple[LocationType, str, int]] = set() + for plando_loc_name in self.ctx.plando_locations: + if plando_loc_name in location_name_to_index: + elements_to_remove.add(locations[location_name_to_index[plando_loc_name]]) + plando_locations.append(plando_loc_name) + for element in elements_to_remove: + locations.remove(element) + + return sorted(locations), plando_locations, count + + def any_valuable_locations(self, locations: List[Tuple[LocationType, str, int]]) -> bool: + for location_type, _, location_id in locations: + if (self.ctx.location_inclusions[location_type] == LocationInclusion.option_enabled + and all( + self.ctx.location_inclusions_by_flag[flag] == LocationInclusion.option_enabled + for flag in lookup_location_id_to_flags[location_id].values() + ) + ): + return True + return False + + def get_location_type_title(self, location_type: LocationType) -> str: + title = location_type.name.title().replace("_", " ") + if self.ctx.location_inclusions[location_type] == LocationInclusion.option_disabled: + title += " (Nothing)" + elif self.ctx.location_inclusions[location_type] == LocationInclusion.option_filler: + title += " (Filler)" + else: + title += "" + return title + + def is_scoutable(self, remaining_locations, mission_available: bool, layout_locked: bool, campaign_locked: bool) -> bool: + if self.ctx.mission_order_scouting == MissionOrderScouting.option_all: + return True + elif self.ctx.mission_order_scouting == MissionOrderScouting.option_campaign and not campaign_locked: + return True + elif self.ctx.mission_order_scouting == MissionOrderScouting.option_layout and not layout_locked: + return True + elif self.ctx.mission_order_scouting == MissionOrderScouting.option_available and mission_available: + return True + elif self.ctx.mission_order_scouting == MissionOrderScouting.option_completed and len([loc for loc in remaining_locations if loc[0] in (LocationType.VICTORY, LocationType.VICTORY_CACHE)]) == 0: + # Assuming that when a mission is completed, all victory location are removed + return True + else: + return False + + def handle_scout_display(self, location_name: str) -> str: + if self.ctx.mission_item_classification is None: + return "" + # Only one information is provided for the victory locations of a mission + if " Cache (" in location_name: + location_name = location_name.split(" Cache")[0] + item_classification_key = self.ctx.mission_item_classification[location_name] + if ((ItemClassification.progression & item_classification_key) + and (ItemClassification.useful & item_classification_key) + ): + # Uncommon, but some games do this to show off that an item is super-important + # This can also happen on a victory display if the cache holds both progression and useful + return " [color=AF99EF](Useful+Progression)[/color]" + if ItemClassification.progression & item_classification_key: + return " [color=AF99EF](Progression)[/color]" + if ItemClassification.useful & item_classification_key: + return " [color=6D8BE8](Useful)[/color]" + if SC2World.settings.show_traps and ItemClassification.trap & item_classification_key: + return " [color=FA8072](Trap)[/color]" + return " [color=00EEEE](Filler)[/color]" + + +def start_gui(context: SC2Context): + context.ui = SC2Manager(context) + context.ui_task = asyncio.create_task(context.ui.async_run(), name="UI") + import pkgutil + data = pkgutil.get_data(SC2World.__module__, "starcraft2.kv").decode() + Builder.load_string(data) diff --git a/worlds/sc2/docs/contributors.md b/worlds/sc2/docs/contributors.md index 5b62466d7e..b1e7e65511 100644 --- a/worlds/sc2/docs/contributors.md +++ b/worlds/sc2/docs/contributors.md @@ -1,19 +1,66 @@ # Contributors -Contibutors are listed with preferred or Discord names first, with github usernames prepended with an `@` +Contributors are listed with preferred or Discord names first, with GitHub usernames prepended with an `@`. +Within an update, contributors for earlier sections are not repeated for their contributions in later sections; +code contributors also reported bugs and participated in beta testing. -## Update 2024.0 +## Update 2025 ### Code Changes * Ziktofel (@Ziktofel) * Salzkorn (@Salzkorn) * EnvyDragon (@EnvyDragon) -* Phanerus (@MatthewMarinets) +* Phaneros (@MatthewMarinets) +* Magnemania (@Magnemania) +* Bones (@itsjustbones) +* Gemster (@Gemster312) +* SirChuckOfTheChuckles (@SirChuckOfTheChuckles) +* Snarky (@Snarky) +* MindHawk (@MindHawk) +* Cristall (@Cristall) +* WaikinDN (@WaikinDN) +* blorp77 (@blorp77) +* Dikhovinka (@AYaroslavskiy91) +* Subsourian (@Subsourian) + +### Additional Assets +* Alice Voltaire + +### Voice Acting +@-handles in this section are social media contacts rather than specifically GitHub in this section. + +* Subsourian (@Subsourian) - Signifier, Slayer +* GiantGrantGames (@GiantGrantGames) - Trireme +* Phaneros (@MatthewMarinets)- Skirmisher +* Durygathn - Dawnbringer +* 7thAce (@7thAce) - Pulsar +* Panicmoon (@panicmoon.bsky.social) - Skylord +* JayborinoPlays (@Jayborino) - Oppressor + +## Maintenance of 2024 release +* Ziktofel (@Ziktofel) +* Phaneros (@MatthewMarinets) +* Salzkorn (@Salzkorn) +* neocerber (@neocerber) +* Alchav (@Alchav) +* Berserker (@Berserker66) +* Exempt-Medic (@Exempt-Medic) + +And many members of the greater Archipelago community for core changes that affected the StarCraft 2 apworld. + +## Update 2024 +### Code Changes +* Ziktofel (@Ziktofel) +* Salzkorn (@Salzkorn) +* EnvyDragon (@EnvyDragon) +* Phaneros (@MatthewMarinets) * Madi Sylveon (@MadiMadsen) * Magnemania (@Magnemania) * Subsourian (@Subsourian) +* neocerber (@neocerber) * Hopop (@hopop201) * Alice Voltaire (@AliceVoltaire) * Genderdruid (@ArchonofFail) * CrazedCollie (@FoxOfWar) +* Bones (@itsjustbones) ### Additional Beta testing and bug reports * Varcklen (@Varcklen) diff --git a/worlds/sc2/docs/custom_mission_orders_en.md b/worlds/sc2/docs/custom_mission_orders_en.md new file mode 100644 index 0000000000..6aba753b69 --- /dev/null +++ b/worlds/sc2/docs/custom_mission_orders_en.md @@ -0,0 +1,1092 @@ +# Custom Mission Orders for Starcraft 2 + +
+ Table of Contents + +- [Custom Mission Orders for Starcraft 2](#custom-mission-orders-for-starcraft-2) + - [What is this?](#what-is-this) + - [Basic structure](#basic-structure) + - [Interactions with other YAML options](#interactions-with-other-yaml-options) + - [Instructions for building a mission order](#instructions-for-building-a-mission-order) + - [Shared options](#shared-options) + - [Display Name](#display-name) + - [Unique name](#unique-name) + - [Goal](#goal) + - [Exit](#exit) + - [Entry rules](#entry-rules) + - [Unique progression track](#unique-progression-track) + - [Difficulty](#difficulty) + - [Mission Pool](#mission-pool) + - [Campaign Options](#campaign-options) + - [Preset](#preset) + - [Campaign Presets](#campaign-presets) + - [Static Presets](#static-presets) + - [Preset Options](#preset-options) + - [Missions](#missions) + - [Shuffle Raceswaps](#shuffle-raceswaps) + - [Keys](#keys) + - [Golden Path](#golden-path) + - [Layout Options](#layout-options) + - [Type](#type) + - [Size](#size) + - [Missions](#missions-1) + - [Mission Slot Options](#mission-slot-options) + - [Entrance](#entrance) + - [Empty](#empty) + - [Next](#next) + - [Victory Cache](#victory-cache) + - [Layout Types](#layout-types) + - [Column](#column) + - [Grid](#grid) + - [Grid Index Functions](#grid-index-functions) + - [point(x, y)](#pointx-y) + - [rect(x, y, width, height)](#rectx-y-width-height) + - [Canvas](#canvas) + - [Canvas Index Functions](#canvas-index-functions) + - [group(character)](#groupcharacter) + - [Hopscotch](#hopscotch) + - [Hopscotch Index Functions](#hopscotch-index-functions) + - [top](#top) + - [bottom](#bottom) + - [middle](#middle) + - [corner(index)](#cornerindex) + - [Gauntlet](#gauntlet) + - [Blitz](#blitz) + - [Blitz Index Functions](#blitz-index-functions) + - [row(height)](#rowheight) +
+ +## What is this? + +This is usage documentation for the `custom_mission_order` YAML option for Starcraft 2. You can enable Custom Mission Orders by setting `mission_order: custom` in your YAML. + +You will need to know how to write a YAML before engaging with this feature, and should read the [Archipelago YAML documentation](https://archipelago.gg/tutorial/Archipelago/advanced_settings/en) before continuing here. + +Every example in this document should be valid to generate. + +## Basic structure + +Custom Mission Orders consist of three kinds of structures: +- The mission order itself contains campaigns (like Wings of Liberty) +- Campaigns contain layouts (like Mar Sara) +- Layouts contain mission slots (like Liberation Day) + +As a note, layouts are also called questlines in the UI. Layouts and questlines refer to the same thing, though this document will only use layouts. + +To illustrate, the following is what the default custom mission order currently looks like. If you're not sure what some options mean, they will be explained in more depth later. +```yaml + custom_mission_order: + # This is a campaign, defined by its name + Default Campaign: + # The campaign's name as displayed in the client + display_name: "null" + # Whether this campaign must have a unique name in the client + unique_name: false + # Conditions that must be fulfilled to access this campaign + entry_rules: [] + # Whether beating this campaign is part of the world's goal + goal: true + # The lowest difficulty of missions in this campaign + min_difficulty: relative + # The highest difficulty of missions in this campaign + max_difficulty: relative + # This is a special layout that defines defaults + # for other layouts in the campaign + global: + # The layout's name as displayed in the client + display_name: "null" + # Whether this layout must have a unique name in the client + unique_name: false + # Whether beating this layout is part of the world's goal + goal: false + # Whether this layout must be beaten to beat the campaign + exit: false + # Conditions that must be fulfilled to access this layout + entry_rules: [] + # Which missions are allowed to appear in this layout + mission_pool: + - all missions + # The lowest difficulty of missions in this layout + min_difficulty: relative + # The highest difficulty of missions in this layout + max_difficulty: relative + # Used for overwriting default options of mission slots, + # which are set by the layout type (see Default Layout) + missions: [] + # This is a regular layout, defined by its name + Default Layout: + # This defines how missions in the layout are organized, + # as well as how they connect to one another + type: grid + # How many total missions should appear in this layout + size: 9 +``` +This default option also defines default values (though you won't get the Default Campaign and Default Layout), so you can omit the options you don't want to change in your own YAML. + +Notably however, layouts are required to have both a `type` and a `size`, but neither have defaults. You must define both of them for every layout, either through your own `global` layout, or in the options of every individual layout. + +If you want multiple campaigns or layouts, it would look like this: +```yaml + custom_mission_order: + My first campaign!: + # Campaign options here + global: # Can be omitted if the above defaults work for you + # Makes all the other layouts only have Terran missions + mission_pool: + - terran missions + # Other layout options here + My first layout: + # Defining at least type and size of a layout is mandatory + type: column + size: 3 + # Other layout options here + my second layout: + type: grid + size: 4 + layout number 3: + type: column + size: 3 + # etc. + Second campaign: + the other first layout: + type: grid + size: 10 + # etc. +``` +If you don't want to have a campaign container for your layouts, you can also forego the campaign layer like this: +```yaml + custom_mission_order: + Example campaign-level layout: + # Make sure to always declare these two, like with regular layouts + type: column + size: 3 + + # Regular campaigns and campaign-less layouts + # can be mixed however you want + Some Campaign: + Some Layout: + type: column + size: 3 +``` +It is also possible to access mission slots by their index, which is defined by the type of the layout they are in. The below shows an example of how to access a mission slot, as well as the defaults for their options. + +However, keep in mind that layout types will set their own options for specific slots, overwriting the below defaults, and using this option in turn overwrites the values set by layout types. As before, the options are explained in more depth later. +```yaml + custom_mission_order: + My Campaign: + My Layout: + type: column + size: 5 + missions: + # 0 is often the layout's starting mission + # Any index between 0 and (size - 1) is accessible + - index: 0 + # Whether this mission is part of the world's goal + goal: false + # Whether this mission is accessible as soon as the + # layout is accessible + entrance: false + # Whether this mission is required to beat the layout + exit: false + # Whether this slot contains a mission at all + empty: false + # Conditions that must be fulfilled to access this mission + entry_rules: [] + # Which missions in the layout are unlocked by this mission + # This is normally set by the layout's type + next: [] + # Which missions are allowed to appear in this slot + # If not defined, the slot inherits the layout's pool + mission_pool: + - all missions + # Which specific difficulty this mission should have + difficulty: relative +``` +## Interactions with other YAML options + +Custom Mission Orders respect all the options that change which missions can appear as if the options' relevant missions had been excluded. For example, `selected_races: protoss` is equivalent to excluding all Zerg and Terran missions, and `enabled_campaigns: ["Wings of Liberty"]` is equivalent to excluding all but WoL missions. + +This means that if you want total control over available missions in your mission order via `mission_pool`s, you should enable all races and campaigns and leave your `excluded_missions` list empty, but you can also use these options to get rid of particular missions you never want and can then ignore those missions in your `mission_pool`s. + +There are, however, several options that are ignored by Custom Mission Orders: +- `mission_order`, because it has to be `custom` for your Custom Mission Order to apply +- `maximum_campaign_size`, because you determine the size of the mission order via layout `size` attributes +- `two_start_positions`, which you can instead determine in individual layouts of the appropriate `type`s (see Grid and Hopscotch sections below) +- `key_mode`, which you can still specify for presets (see Campaign Presets section), and can otherwise manually set up using Item entry rules + +## Instructions for building a mission order + +Normally when you play a Starcraft 2 world, you have a table of missions in the Archipelago SC2 Client, and hovering over a mission tells you what missions are required to access it. This is still true for custom mission orders, but you now have control over the way missions are visually organized, as well as their access requirements. + +This section is meant to offer some guidance when making your own mission order for the first time. + +To begin making your own mission order, think about how you visually want your missions laid out. This should inform the layout `type`s you want to use, and give you some idea about the overall structure of your mission order. + +For example, if you want to make a custom campaign like the vanilla ones, you will want a lot of layouts of [`type: column`](#column). If you want a Hopscotch layout with certain missions or races, a single layout with [`type: hopscotch`](#hopscotch) will suffice. If you want to play through a funny shape, you will want to draw with a [`type: canvas`](#canvas). If you just want to make a minor change to a vanilla campaign, you will want to start with a [`preset` campaign](#preset). + +The natural flow of a mission order is defined by the types of its layouts. It makes sense for a mission to unlock its neighbors, it makes sense for a Hopscotch layout to wrap around the sides, and it makes sense for a Column's final mission to be at the bottom. Layout types create their flow by setting [`next`](#next), [`entrance`](#entrance), [`exit`](#exit), and [`entry_rules`](#entry-rules) on missions. More on these in a little bit. + +Layout types dictate their own visual structure, and will only rarely make mission slots with `empty: true`. If you want a certain shape that's not exactly like an existing type, you can pick a type with more slots than you want and remove the extras by setting `empty: true` on them. + +With the basic setup in place, you should decide on what the goal of your mission order is. By default every campaign has `goal: true`, meaning all campaigns must be beaten to complete the world. You can additionally set `goal: true` on layouts and mission slots to require them to be beaten as well. If you set `goal: false` on everything, the mission order will default to setting the last campaign (lowest in your YAML) as the goal. + +After deciding on a goal, you can complicate your way towards it. At the start of a world, the only accessible missions in the mission order are all the missions marked `entrance: true`. When you beat one of these missions, it unlocks all the missions in the beaten mission's `next` list. This process repeats until all the missions are accessible. + +If this behavior isn't enough for your planned mission order, you can interrupt the natural flow of layout types using `entry_rules` in combination with `exit`. + +When this document refers to "beating" something, it means the following: +- A mission is beaten if it is accessible and its victory location is checked. +- Beating a layout means beating all the missions in the layout with `exit: true` +- Beating a campaign means beating all the layouts in the campaign with `exit: true` + +Note victory checks may be claimed by someone else running `!collect` in a multiworld and receiving an item on a victory check. Collecting victory cache checks do not count, only victory checks. + +Layouts will have their default exit missions set by the layout type. If you don't want to use this default, you will have to manually set `exit: false` on the default exits. Campaigns default to using the last layout in them (the lowest in your YAML) as their exit, but only if you don't manually set `exit: true` on a layout. + +Using `entry_rules`, you can make a mission require beating things other than those missions whose `next` points to it, and you can make layouts and campaigns not available from the start. + +Note that `entry_rules` are an addition to the `next` behavior. If you want a mission to completely ignore the natural flow and only use your `entry_rules`, simply set `entrance: true` on it. + +Please see the [`entry_rules`](#entry-rules) section below for available rules and examples. + +With your playthrough sufficiently complicated, it only remains to add flavor to your mission order by changing [`mission_pool`](#mission-pool) and [`difficulty`](#difficulty) options as you like them. These options are also explained below. + +To summarize: +- Start by setting up campaigns and layouts with appropriate layout `type`s and `size`s +- Decide the mission order's `goal`s +- Customize access requirements as desired: + - Use `entrance`, `next`, and `empty` on mission slots to change the unlocking order of missions within a layout + - Use `entry_rules` in combination with `exit` to add additional restrictions to missions, layouts, and campaigns +- Use the `mission_pool` and `difficulty` options to add flavor +- Finally, generate and have fun! + +## Shared options + +These are the options that are shared between at least two of campaigns, layouts and missions. All the options below are listed with their defaults. + +--- +### Display Name +```yaml +# For campaigns and layouts +display_name: "null" +``` +As shown in the examples, every campaign and layout is defined with a name in your YAML. This name is used to find campaigns and layouts within the mission order (see `entry_rules` section), and by default (meaning with `display_name: "null"`) it is also shown in the client. + +This option changes the name shown in the client without affecting the definition name. + +There are two special use cases for this option: +```yaml +# This means the campaign or layout +# will not have a title in the client +display_name: "" +``` +```yaml +# This will randomly pick a name from the given list of options +display_name: + - My First Choice + - My Second Choice + - My Third Choice +``` + +--- +### Unique name +```yaml +# For campaigns and layouts +unique_name: false +``` +This option prevents names from showing up multiple times in the client. It is recommended to be used in combination with lists of `display_name`s to prevent the generator from picking duplicate names. + +--- +### Goal +```yaml +# For campaigns +goal: true +``` +```yaml +# For layouts and missions +goal: false +``` +This determines whether the campaign, layout or mission is required to beat the world. If you turn this off for everything, the last defined campaign (meaning the lowest one in your YAML) is chosen by default. + +--- +### Exit +```yaml +# For layouts and missions +exit: false +``` +This determines whether beating the mission is required to beat its parent layout, and whether beating the layout is required to beat its parent campaign. + +--- +### Entry rules +```yaml +# For campaigns, layouts, and missions +entry_rules: [] +``` +This defines access restrictions for parts of the mission order. + +These are the available rules: +```yaml +entry_rules: + # Beat these things ("Beat rule") + - scope: [] + # Beat X amount of missions from these things ("Count rule") + - scope: [] + amount: -1 + # Find these items ("Item rule") + - items: {} + # Fulfill X amount of other conditions ("Subrule rule") + - rules: [] + amount: -1 +``` +Note that Item rules take both a name and amount for each item (see the example below). In general this rule treats items like the `locked_items` option, including that it will override `excluded_items`, but as a notable difference all items required for Item rules are marked as progression. If multiple Item rules require the same item, the largest required amount will be locked, **not** the sum of all amounts. + +Additionally, Item rules accept a special item: +```yaml +entry_rules: + - items: + Key: 1 +``` +This is a generic item that is converted to a key item for the specific scope it is under. Missions get Mission Keys, layouts get Questline Keys, and campaigns get Campaign Keys. If you want to know which specific key is created (for example to tie multiple unlocks to the same key), you can generate a test game and check in the client. + +You can also use one of the following key items for this purpose: +
+ Custom keys + + - `Terran Key` + - `Zerg Key` + - `Protoss Key` + - `Raynor Key` + - `Tychus Key` + - `Swann Key` + - `Stetmann Key` + - `Hanson Key` + - `Nova Key` + - `Tosh Key` + - `Valerian Key` + - `Warfield Key` + - `Mengsk Key` + - `Han Key` + - `Horner Key` + - `Kerrigan Key` + - `Zagara Key` + - `Abathur Key` + - `Yagdra Key` + - `Kraith Key` + - `Slivan Key` + - `Zurvan Key` + - `Brakk Key` + - `Stukov Key` + - `Dehaka Key` + - `Niadra Key` + - `Izsha Key` + - `Artanis Key` + - `Zeratul Key` + - `Tassadar Key` + - `Karax Key` + - `Vorazun Key` + - `Alarak Key` + - `Fenix Key` + - `Urun Key` + - `Mohandar Key` + - `Selendis Key` + - `Rohana Key` + - `Reigel Key` + - `Davis Key` + - `Ji'nara Key` + +
+ +These keys will never be used by the generator unless you specify them yourself. + +There is also a special type of key: +```yaml +entry_rules: + - items: + # These two forms are equivalent + Progressive Key: 5 + Progressive Key 5: 1 +``` +Progressive keys come in two forms: `Progressive Key: ` and `Progressive Key : 1`. In the latter form the item amount is ignored. Their track is used to group them, so all progressive keys with track 1 belong together, as do all with track 2, and so on. Item rules using progressive keys are sorted by how far into the mission order they appear and have their required amounts set automatically so that deeper rules require more keys, with each track of progressive keys performing its own sorting. + +Note that if any Item rule within a track belongs to a mission, the generator will accept ties, in which case the affected rules will require the same number of progressive keys. If a track only contains Item rules belonging to layouts and campaigns, the track will be sorted in definition order (top to bottom in your YAML), so there will be no ties. + +If you prefer not to manually specify the track, use the [`unique_progression_track`](#unique-progression-track) option. + +The Beat and Count rules both require a list of scopes. This list accepts addresses towards other parts of the mission order. + +The basic form of an address is `//`, where `` and `` are the definition names (not `display_names`!) of a campaign and a layout within that campaign, and `` is the index of a mission slot in that layout or an index function for the layout's type. See the section on your layout's type to find valid indices and functions. + +If you don't want to point all the way down to a mission slot, you can omit the later parts. `` and `/` are valid addresses, and will point to the entire specified campaign or layout. + +Futhermore, you can generically refer to the parent of an object using `..`, so if you are creating entry rules for a given layout and want to point at a different `` in the same ``, the following are identical: +- `../` +- `/` + +You can also chain these, so for a given mission `../..` will point to its parent campaign. + +Lastly, you can point to the whole mission order via `/..` (or the equivalent number of `..`s from a given layer), but this is only supported for Count rules and not Beat rules. + +Note that if you have a campaign-less layout, you will not require a `` part to find it, and `..` will skip the campaign layer. + +Below are examples of the available entry rules: +```yaml + custom_mission_order: + Some Missions: + type: grid + size: 9 + entry_rules: + # Item rule: + # To access the Some Missions layout, + # you have to find or receive your Marine + - items: + Marine: 1 + + Wings of Liberty: + Mar Sara: + type: column + size: 3 + Artifact: + type: column + size: 3 + entry_rules: + # Beat rule: + # To access the Artifact layout, + # you have to first beat Mar Sara + - scope: ../Mar Sara + Prophecy: + type: column + size: 3 + entry_rules: + # Beat rule: + # Beat the mission at index 1 in the Artifact layout + - scope: ../Artifact/1 + # This is identical to the above + # because this layout is already in Wings of Liberty + - scope: Wings of Liberty/Artifact/1 + Covert: + type: column + size: 3 + entry_rules: + # Count rule: + # Beat any 7 missions from Wings of Liberty + - scope: Wings of Liberty + amount: 7 + + Complicated Access: + type: column + size: 3 + entry_rules: + # Subrule rule: + # To access this layout, + # fulfill any 1 of the nested rules + # (See amount value at the bottom) + - rules: + # Nested Subrule rule: + # Fulfill all of the nested rules + # Amount can be at the top if you prefer + - amount: -1 # -1 means "all of them" + rules: + # Count rule: + # Beat any 5 missions from Wings of Liberty + - scope: Wings of Liberty + amount: 5 + # Count rule: + # Beat any 5 missions from Some Missions + - scope: Some Missions + amount: 5 + # Count rule: + # Beat any 10 combined missions from + # Wings of Liberty or Some Missions + - scope: + - Wings of Liberty + - Some Missions + amount: 10 + amount: 1 +``` +As this last example shows, the Subrule rule is a powerful tool for making arbitrarily complex requirements. Put plainly, the example accomplishes the following: To unlock the `Complicated Access` layout, either beat 5 missions in both the `Wings of Liberty` campaign and the `Some Missions` layout, or beat 10 missions across both of them. + +--- +### Unique progression track +```yaml +# For campaigns and layouts +unique_progression_track: 0 +``` +This option specifically affects Item entry rules using progressive keys. Progressive keys used by children of this campaign/layout that are on the given track will automatically be put on a track that is unique to the container instead. +```yaml + custom_mission_order: + First Column: + type: column + size: 3 + unique_progression_track: 0 # Default + missions: + - index: [1, 2] + entry_rules: + - items: + Progressive Key: 0 + Second Column: + type: column + size: 3 + unique_progression_track: 0 # Default + missions: + - index: [1, 2] + entry_rules: + - items: + Progressive Key: 0 +``` +In this example the two columns will use separate progressive keys for their missions. + +In the case that a mission slot uses a progressive key whose track matches the `unique_progression_track` of both its containing layout and campaign, the key will use the layout's unique track and not the campaign's. To avoid this behavior simply use different `unique_progression_track` values for the layout and campaign. + +--- +### Difficulty +```yaml +# These two apply to campaigns and layouts +min_difficulty: relative +max_difficulty: relative +# This one applies to missions +difficulty: relative +``` +Valid values are: +- Relative +- Starter +- Easy +- Medium +- Hard +- Very Hard + +These determine the difficulty of missions within campaigns, layouts, or specific mission slots. + +On `relative`, the difficulty of mission slots is dynamically scaled based on earliest possible access to that mission. By default, this scales the entire mission order to go from Starter missions at the start to Very Hard missions at the end. + +Campaigns can override these limits, layouts can likewise override the limits set by their campaigns, and missions can simply define their desired difficulty. + +In every case, if a mission's mission pool does not contain missions of an appropriate difficulty, it will attempt to find a mission of a nearby difficulty, preferring lower ones. + +```yaml + custom_mission_order: + Campaign: + min_difficulty: easy + max_difficulty: medium + Layout 1: + max_difficulty: hard + type: column + size: 3 + Layout 2: + type: column + size: 3 + missions: + - index: 0 + difficulty: starter +``` +In this example, `Campaign` is restricted to missions between Easy and Medium. `Layout 1` overrides Medium to be Hard instead, so its 3 missions will go from Easy to Hard. `Layout 2` keeps the campaign's limits, but its first mission is set to Starter. In this case, the first mission will be a Starter mission, but the other two missions will scale towards Medium as if the first had been an Easy one. + +--- +### Mission Pool +```yaml +# For layouts and missions +mission_pool: + - all missions +``` +Valid values are names of specific missions and names of mission groups. Group names can be looked up here: [APSC2 Mission Groups](https://matthewmarinets.github.io/ap_sc2_icons/missiongroups) + +If a mission defines this, it ignores the pool of its containing layout. To define a pool for a full campaign, define it in the `global` layout. + +This is a list of instructions for constructing a mission pool, executed from top to bottom, so the order of values is important. + +There are three available instructions: +- Addition: ``, `+` or `+ ` + - This adds the missions of the specified group into the pool +- Subtraction: `~` or `~ ` + - This removes the missions of the specified group from the pool + - Note that the operator is `~` and not `-`, because the latter is a reserved symbol in YAML. +- Intersection: `^` or `^ ` + - This removes all the missions from the pool that are not in the specified group. + +As a reminder, `` can also be the name of a specific mission. + +The first instruction in a pool must always be an addition. + +```yaml + custom_mission_order: + Campaign: + global: + type: column + size: 3 + mission_pool: + - terran missions + - ~ no-build missions + Layout A-1: + mission_pool: + - zerg missions + - ^ kerrigan missions + - + Lab Rat + Layout A-2: + missions: + - index: 0 + mission_pool: + - For Aiur! + - Liberation Day +``` +The following pools are constructed in this example: +- `Campaign` defines a pool that contains Terran missions, and then removes all No-Build missions from it. +- `Layout A-1` overrides this pool with Zerg missions, then keeps only the ones with Kerrigan in them, and then adds Lab Rat back to it. + - Lab Rat does not contain Kerrigan, but because the instruction to add it is placed after the instruction to remove non-Kerrigan missions, it is added regardless. +- The pool for the first mission of `Layout A-2` contains For Aiur! and Liberation Day. The remaining missions of `Layout A-2` use the Terran pool set by the `global` layout. + +## Campaign Options + +These options can only be used in campaigns. + +--- +### Preset +```yaml +preset: none +``` +This option loads a pre-built campaign into your mission order. Presets may accept additional options in addition to regular campaign options. + +With all presets, you can override their layout options by defining the layouts like normal in your YAML. +```yaml + custom_mission_order: + My Campaign: + preset: wol + prophecy + missions: random # Optional + shuffle_raceswaps: false # Optional + keys: none # Optional + Prophecy: + mission_pool: + - zerg missions +``` +This example loads the Wol + Prophecy preset and then changes Prophecy's missions to be Zerg instead of Protoss. + +See the following section for available presets. + +## Campaign Presets + +There are two kinds of presets: Static presets that are based on vanilla campaigns, and scripted presets that dynamically create a complex campaign based on extra required options. + +--- +### Static Presets +Available static presets are the following: +- `WoL + Prophecy` +- `WoL` +- `Prophecy` +- `HotS` +- `Prologue`, `LotV Prologue` +- `LotV` +- `Epilogue`, `LotV Epilogue` +- `NCO` +- `Mini WoL + Prophecy` +- `Mini WoL` +- `Mini Prophecy` +- `Mini HotS` +- `Mini Prologue`, `Mini LotV Prologue` +- `Mini LotV` +- `Mini Epilogue`, `Mini LotV Epilogue` +- `Mini NCO` + +For these presets, the layout names used to override settings match the names shown in the client, with some exceptions: +- Prophecy, Prologue and Epilogue contain a single Gauntlet each, which are named `Prophecy`, `Prologue` and `Epilogue` respectively. +- The Gauntlets in the Mini variants of the above are also named `Prophecy`, `Prologue` and `Epilogue`. +- NCO and Mini NCO contain three columns each, named `Mission Pack 1`, `Mission Pack 2` and `Mission Pack 3`. + +#### Preset Options +All static presets accept these options, as shown in the example above: + +##### Missions +The `missions` option accepts these possible values: +- `random` (default), which removes pre-defined `mission_pool` options from layouts and missions, meaning all missions will follow the pool defined in your campaign's `global` layout. This is the default if you don't define the `missions` option. +- `vanilla_shuffled`, which will leave `mission_pool`s on layouts to shuffle vanilla missions within their respective campaigns. +- `vanilla`, which will leave all missions as they are in the vanilla campaigns. + +##### Shuffle Raceswaps +The `shuffle_raceswaps` option accepts `true` and `false` (default). If enabled, the missions pools in the preset will contain raceswapped missions. This means `missions: vanilla_shuffled` will shuffle raceswaps alongside their regular variants, and `missions: vanilla` will allow a random variant of the mission in each slot. This option does nothing if `missions` is set to `random`. + +##### Keys +The `keys` option accepts these possible values: +- `none` (default), which does not add any Key Item rules to the preset. +- `layouts`, which adds Key Item rules to layouts besides the preset's left-most layout, in addition to their regular entry rules. +- `missions`, which adds Key Item rules to missions besides the preset's starter mission, in addition to their regular entry rules. +- `progressive_layouts`, which adds Progressive Key Item rules to layouts besides the preset's left-most layout, in addition to their regular entry rules. These progressive keys use track 0, with presets using the default `unique_progression_track: 0`. +- `progressive_missions`, which adds Progressive Key Item rules to missions besides the preset's starter mission, in addition to their regular entry rules. These progressive keys use track 1 and do not make use of `unique_progression_track`. +- `progressive_per_layout`, which adds Progressive Key Item rules to all missions within each layout besides the preset's left-most one. These progressive keys use track 0, with presets and their layouts using the default `unique_progression_track: 0`. + +--- +### Golden Path +```yaml +preset: golden path +size: # Required, no default, accepts positive numbers +two_start_positions: false +keys: none # Optional +``` +Golden Path aims to create a dynamically-sized campaign with branching paths to create a similar experience to the Wings of Liberty campaign. It accomplishes this by having a main column that requires an increasing number of missions to be beaten to advance, and a number of side columns that require progressing the main column to advance. The exit of a Golden Path campaign is the last mission of the main column. + +The `size` option defines the number of missions in the campaign. + +If `two_start_positions`, the first mission will be skipped, and the first two branches will be available from the start instead. + +The columns in a Golden Path get random names from a `display_name` list and have `unique_name: true` set on them. Their definition names for overriding options are `"0"`, `"1"`, `"2"`, etc., with `"0"` always being the main column, `"1"` being the left-most side column, and so on. + +Since the number of side columns depends on the number of missions, it is best to generate a test game for a given size to see how many columns are generated. + +Golden Path also accepts a `keys` option, which works like the same option for static presets, and accepts the following values: +- `none` (default), which does not add any Key Item rules to the preset. +- `layouts`, which adds Key Item rules to all side columns, in addition to their regular entry rules. +- `missions`, which adds Key Item rules to missions besides the preset's starter mission, in addition to their regular entry rules. +- `progressive_layouts`, which adds Progressive Key Item rules to all side columns, in addition to their regular entry rules. These progressive keys use track 0, with this preset using the default `unique_progression_track: 0`. +- `progressive_missions`, which adds Progressive Key Item rules to missions besides the preset's starter mission, in addition to their regular entry rules. These progressive keys use track 1 and do not make use of `unique_progression_track`. +- `progressive_per_layout`, which adds Progressive Key Item rules to all missions within each side column. These progressive keys use track 0, with this preset and its layouts using the default `unique_progression_track: 0`. + +## Layout Options + +Layouts may have special options depending on their `type`. These are covered in the section on Layout Types. +Below are the options that apply to every layout. + +--- +### Type +```yaml +type: # There is no default +``` +Determines how missions are placed relative to one another within a layout, as well as how they connect to each other. + +Currently, valid values are: +- Column +- Grid +- Hopscotch +- Gauntlet +- Blitz + +Details about specific layout types are covered at the end of this document. + +--- +### Size +```yaml +size: # There is no default +``` +Determines how many missions a layout contains. Valid values are positive numbers. + +### Missions +```yaml +missions: [] +``` +This is used to access mission slots and overwrite the options that the layout type set for them. Valid options for mission slots are covered below, but the `index` option used to find mission slots is explained here. + +Note that this list is evaluated from top to bottom, meaning if you perform conflicting changes on the same mission slot, the last defined operation (lowest in your YAML) will be the one that takes effect. + +The following example shows ways to access and modify missions: +```yaml + custom_mission_order: + My Example: + type: grid + size: 4 + missions: + # Indices can be a numerical value + # This sets the mission at index 1 to be an exit + - index: 1 + exit: true + # Indices can be special index functions + # Valid functions are 'exits', 'entrances', and 'all' + # These are available for all types of layouts + # This takes all exits, including the one set above, + # and turns them into non-exits + - index: exits + exit: false + # Indices can be index functions + # Available functions depend on the layout's type + # In this case the function will return the indices 1 and 3 + # and then mark those two slots as empty + - index: rect(1, 0, 1, 2) + empty: true + # Indices can be a list of valid values + # This takes all entrances as well as the mission at index 2 + # and marks all of them as both entrances and exits + - index: + - entrances + - 2 + entrance: true + exit: true +``` +The result of this example will be a grid where the two missions on the right are empty, and the two missions on the left are both entrances and exits. + +## Mission Slot Options + +For all options in mission slots, the layout type containing the mission slot choses the defaults, and any values you define override the type's defaults. + +--- +### Entrance +```yaml +entrance: false +``` +Determines whether this mission is an entrance for its containing layout. An entrance mission becomes available its parent layout's and campaign's `entry_rules` are fulfilled, but may further be restricted by its own `entry_rules`. + +If for any reason a mission cannot be unlocked by beating other missions, meaning that there is no mission whose `next` points at this mission, then this missions will be automatically marked as entrances. However, this cannot detect circular dependencies, for example if you cut off a section of a grid, so make sure to manually set entrances as appropriate in those cases. + +--- +### Empty +```yaml +empty: false +``` +Determines whether this mission slot contains a mission at all. If set to `true`, the slot is empty and will show up as a blank space in the client. + +Layout types have their own means of creating blank spaces in the client, and so rarely use this option. If you want complete control over a layout's slots, use a layout of `type: grid`. + +--- +### Next +```yaml +next: [] +``` +Valid values are indices of other missions within the same layout and index functions for the layout's type. Note that this does not accept addresses. + +This is the mechanism layout types use to establish mission flow. Overriding this will break the intended order of missions within a type. If you wish to add on to the type's flow rather than replace it, you must manually include the indices intended by the type. + +Mechanically, a mission is unlocked when any other mission that contains the former in its `next` list is beaten. If a mission is not present in any other mission's `next` list, it is automatically marked as an entrance. +```yaml + custom_mission_order: + Wings of Liberty: + Char: + type: column + size: 4 + missions: + - index: 0 + next: + - 1 + - 2 + - index: 1 + next: + - 3 + # The below two are default for a column + # and could be removed from this list + - index: 2 + next: + - 3 + - index: 3 + next: [] + +``` +This example creates the branching path within `Char` in the Vanilla mission order. + +--- +### Victory Cache +```yaml +victory_cache: 0 +``` +Valid values are integers in the range 0 to 10. Sets the number of extra locations given for victory on a mission. + +By default, when this value is not set, the option is set to 0 for goal missions and to the global `victory_cache` option for all other missions. + +## Layout Types + +The below types are listed with their custom options and their defaults. + +--- +### Column +```yaml +type: column +``` + +This is a linear order going from top to bottom. + +A `size: 5` column has the following indices: +```yaml +0 # This is the default entrance +1 +2 +3 +4 # This is the default exit (size - 1) +``` + +--- +### Grid +```yaml +type: grid +width: 0 # Accepts positive numbers +two_start_positions: false # Accepts true/false +``` +This is a rectangular order. Beating a mission unlocks adjacent missions in cardinal directions. + +`width` sets the width of the grid, and height is determined via `size` and `width`. If `width` is set to 0, the width and height are determined automatically. + +If `two_start_positions`, the top left corner will be set to `empty: true`, and its two neighbors will be entrances instead. + +If `size` is too small for the determined width and height, then slots in the bottom left and top right corners will be removed to fit the given `size`. These empty slots are still accessible by index. + +A `size: 25`, `width: 5` grid has the following indices: +```yaml + 0 1 2 3 4 + 5 6 7 8 9 +10 11 12 13 14 +15 16 17 18 19 +20 21 22 23 24 +``` +The top left corner (index `0`) is the default entrance. The bottom right corner (index `size - 1`) is the default exit. + +#### Grid Index Functions +Grid supports the following index functions: + +##### point(x, y) +`point(x, y)` returns the index at the given zero-based X and Y coordinates. In the above example, `point(2, 4)` is index `22`. + +##### rect(x, y, width, height) +`rect(x, y, width, height)` returns the indices within the rectangle defined by the starting point at the X and Y coordinates and the width and height arguments. In the above example, `rect(1, 2, 3, 2)` returns the indices `11, 12, 13, 16, 17, 18`. + +--- +### Canvas +```yaml +type: canvas +canvas: # No default +jump_distance_orthogonal: 1 # Accepts numbers >= 1 +jump_distance_diagonal: 1 # Accepts numbers >= 0 +``` + +This is a special type of grid that is created from a drawn canvas. For this type of layout `canvas` is required and `size` is ignored if specified. + +`canvas` is a list of strings that form a rectangular grid, from which the layout's `size` is determined automatically. Every space in the canvas creates an empty slot, while every character that is not a space creates a filled mission slot. The resulting grid determines its indices like [Grid](#Grid). + +```yaml +type: canvas +canvas: +- ' ggg ' # 0 +- ' ggggg ' # 1 +- ' ggggg ' # 2 +- ' bbb ggg rrr ' # 3 +- 'bbbbb g rrrrr' # 4 +- 'bbbbb rrrrr' # 5 +- ' ggg bbb ' # 6 +- 'ggggg bbbbb' # 7 +- 'gggg bbbb' # 8 +- 'ggg rrr bbb' # 9 +- ' gg rrrrr bb ' # 10 +- ' rrrrr ' # 11 +- ' rrrrr ' # 12 +- ' rrr ' # 13 +jump_distance_orthogonal: 2 +jump_distance_diagonal: 1 +missions: +- index: group(g) + mission_pool: Terran Missions +- index: group(b) + mission_pool: Protoss Missions +- index: group(r) + mission_pool: Zerg Missions +``` +This example draws the Archipelago logo using missions of different races as its colors. Note that while this example fits into 13 lines, there is no set limit for how many lines you may use, and likewise lines may be as long as you need them to be. Short lines are padded with spaces to match the longest line in the canvas, so lines are left-aligned in this case. + +You may have noticed that the above example has gaps between missions. Canvas layouts support jumping over gaps via `jump_distance_orthogonal` and `jump_distance_diagonal`, which determine the maximum distance over which two missions may be connected, in orthogonal and diagonal directions respectively. Missions at higher distances will only connect if there is no other mission in front of them. + +```yaml +type: canvas +canvas: +- 'A A' +- 'B XB' +jump_distance_orthogonal: 3 +jump_distance_diagonal: 0 +``` +In this example the two `A`s will connect because they are less than 3 missions apart, but the two `B`s will not connect because `X` is between them, and both `B`s will connect to `X` instead. Both sets of `AB`s will also connect because they are neighbors. + +Diagonal jumps function identically, with one exception: +```yaml +type: canvas +canvas: +- 'A ' +- ' B ' +- ' XC' +jump_distance_orthogonal: 1 +jump_distance_diagonal: 1 +``` +Missions that are diagonal neighbors only connect if they do not already share an orthogonal neighbor. In this example `A` and `B` connect, but `B` and `C` don't because `X` already connects them. No such restriction exists for higher-distance diagonal jumps, so it is recommended to keep `jump_distance_diagonal` low. + +Finally, the default entrance and exit on a canvas are dynamically set to be the non-empty slots that are closest to the top left and bottom right corner respectively, but only if you don't set any entrances or exits yourself. It is highly recommended to set your own entrance and exit. + +#### Canvas Index Functions +Canvas supports all of [Grid's index functions](#grid-index-functions), as well as the following: + +##### group(character) +`group(character)` returns the indices which match the given character on the canvas. In the Archipelago logo example, `group(g)` gives the indices of all the `g`s on the canvas. Note that there is no group for spaces, so `group(" ")` does not work. + +--- +### Hopscotch +```yaml +type: hopscotch +width: 7 # Accepts numbers >= 4 +spacer: 2 # Accepts numbers >= 1 +two_start_positions: false # Accepts true/false +``` + +This order alternates between one and two missions becoming available at a time. + +`width` determines how many mini columns are allowed to be next to one another before they wrap around the sides. `spacer` determines the amount of empty slots between diagonals in the client. + +If `two_start_positions`, the top left corner will be set to `empty: true`, and its two neighbors will be entrances instead. + +A `size: 23`, `width: 4`, `spacer: 1` Hopscotch layout has the following indices: +```yaml + 0 2 + 1 3 5 + 4 6 8 +11 7 9 +12 14 10 +13 15 17 + 16 18 20 + 19 21 + 22 +``` +The top left corner (index `0`) is the default entrance. The bottom-most mission of the lowest column (index `size - 1`) is the default exit. + +#### Hopscotch Index Functions +Hopscotch supports the following index functions: + +##### top +`top()` (or `top`) returns the indices of all the top-right corners. In the above example, it returns the indices `2, 5, 8, 11, 14, 17, 20`. + +##### bottom +`bottom()` (or `bottom`) returns the indices of all the bottom-left corners. In the above example, it returns the indices `1, 4, 7, 10, 13, 16, 19, 22`. + +##### middle +`middle()` (or `middle`) returns the indices of all the middle slots. In the above example, it returns the indices `0, 3, 6, 9, 12, 15, 18, 21`. + +##### corner(index) +`corner(index)` returns the indices within the given corner. A corner is a slot in the middle and the slots to the bottom and right of it. `corner(0)` would return `0, 1, 2`, `corner(1)` would return `3, 4, 5`, and so on. In the above example, `corner(7)` will only return `21, 22` because it does not have a right mission. + +--- +### Gauntlet +```yaml +type: gauntlet +width: 7 # Accepts positive numbers +``` +This type works the same way as column, but it goes horizontally instead of vertically. + +`width` is the maximum allowed missions on a row before it wraps around into a new row. + +A `size: 21`, `width: 7` gauntlet has the following indices: +```yaml + 0 1 2 3 4 5 6 + + 7 8 9 10 11 12 13 + +14 15 16 17 18 19 20 +``` +The left-most mission on the top row (index `0`) is the default entrance. The right-most mission on the bottom row (index `size - 1`) is the default exit. + +--- +### Blitz +```yaml +type: blitz +width: 0 # Accepts positive numbers +``` +This type features rows of missions, where beating a mission in a row unlocks the entire next row. + +`width` determines how many missions there are in a row. If set to 0, the width is determined automatically based on the total number of missions (the layout's `size`), but limited to be between 2 and 5. + +A `size: 20`, `width: 5` Blitz layout has the following indices: +```yaml + 0 1 2 3 4 + 5 6 7 8 9 +10 11 12 13 14 +15 16 17 18 19 +``` +The top left corner (index `0`) is the default entrance. The right-most mission on the bottom row (index `size - 1`) is the default exit. + +#### Blitz Index Functions +Blitz supports the following index function: + +##### row(height) +`row(height)` returns the indices of the row at the given zero-based height. In the above example, `row(1)` would return `5, 6, 7, 8, 9`. diff --git a/worlds/sc2/docs/en_Starcraft 2.md b/worlds/sc2/docs/en_Starcraft 2.md index e860e8a6b6..74ba46c31d 100644 --- a/worlds/sc2/docs/en_Starcraft 2.md +++ b/worlds/sc2/docs/en_Starcraft 2.md @@ -12,7 +12,7 @@ The following unlocks are randomized as items: 1. Your ability to build any non-worker unit. 2. Unit specific upgrades including some combinations not available in the vanilla campaigns, such as both strain choices simultaneously for Zerg and every Spear of Adun upgrade simultaneously for Protoss! -3. Your ability to get the generic unit upgrades, such as attack and armour upgrades. +3. Your ability to get the generic unit upgrades, such as attack and armor upgrades. 4. Other miscellaneous upgrades such as laboratory upgrades and mercenaries for Terran, Kerrigan levels and upgrades for Zerg, and Spear of Adun upgrades for Protoss. 5. Small boosts to your starting mineral, vespene gas, and supply totals on each mission. @@ -94,22 +94,31 @@ Will overwrite existing files * Run without arguments to list all factions and colors that are available. * `/option [option_name] [option_value]` Sets an option normally controlled by your yaml after generation. * Run without arguments to list all options. + * Run without `option_value` to check the current value of the option * Options pertain to automatic cutscene skipping, Kerrigan presence, Spear of Adun presence, starting resource amounts, controlling AI allies, etc. * `/disable_mission_check` Disables the check to see if a mission is available to play. Meant for co-op runs where one player can play the next mission in a chain the other player is doing. -* `/play [mission_id]` Starts a StarCraft 2 mission based off of the mission_id provided -* `/available` Get what missions are currently available to play -* `/unfinished` Get what missions are currently available to play and have not had all locations checked * `/set_path [path]` Manually set the SC2 install directory (if the automatic detection fails) +* `/windowed_mode [true|false]` to toggle whether the game will start in windowed mode. Note that the behavior of the command `/received` was modified in the StarCraft 2 client. -In the Common client of Archipelago, the command returns the list of items received in the reverse order they were -received. -In the StarCraft 2 client, the returned list will be divided by races (i.e., Any, Protoss, Terran, and Zerg). -Additionally, upgrades are grouped beneath their corresponding units or buildings. -A filter parameter can be provided, e.g., `/received Thor`, to limit the number of items shown. -Every item whose name, race, or group name contains the provided parameter will be shown. + +* In the Common client of Archipelago, the command returns the list of items received in the reverse order they were + received. +* In the StarCraft 2 client, the returned list will be divided by races (i.e., Any, Protoss, Terran, and Zerg). + Additionally, upgrades are grouped beneath their corresponding units or buildings. +* A filter parameter can be provided, e.g., `/received Thor`, to limit the number of items shown. + * Every item whose name, race, or group name contains the provided parameter will be shown. +* Use `/received recent [amount]` to display the last `amount` items received in chronological order + * `amount` defaults to 20 if not specified + +## Client-side settings +Some settings can be set or overridden on the client side rather than within a world's options. +This can allow, for example, overriding difficulty to always be `hard` no matter what the world specified. +It can also modify display properties, like the client's window size on startup or the launcher button colours. + +Modify these within the `sc2_options` section of the host.yaml file within the Archipelago directory. ## Particularities in a multiworld @@ -118,9 +127,9 @@ Every item whose name, race, or group name contains the provided parameter will One of the default options of multiworlds is that once a world has achieved its goal, it collects its items from all other worlds. If you do not want this to happen, you should ask the person generating the multiworld to set the `Collect Permission` -option to something else, e.g., manual. +option to something else, such as "Manual" or "Allow on goal completion." If the generation is not done via the website, the person that does the generation should modify the `collect_mode` -option in their `host.yaml` file prior to generation. +option in their `host.yaml` file prior to generation. If the multiworld has already been generated, the host can use the command `/option collect_mode [value]` to change this option. @@ -135,4 +144,6 @@ This does not affect the game and can be ignored. - Currently, the StarCraft 2 client uses the Victory locations to determine which missions have been completed. As a result, the Archipelago collect feature can sometime grant access to missions that are connected to a mission that you did not complete. + - If all victory locations are collected in this manner, victory is not sent until the player replays a final mission + and recollects the victory location. diff --git a/worlds/sc2/docs/fr_Starcraft 2.md b/worlds/sc2/docs/fr_Starcraft 2.md index 190802e91b..c340ecc204 100644 --- a/worlds/sc2/docs/fr_Starcraft 2.md +++ b/worlds/sc2/docs/fr_Starcraft 2.md @@ -112,10 +112,6 @@ supplémentaires données au début des missions, la capacité de contrôler les * `/disable_mission_check` Désactive les requit pour lancer les missions. Cette option a pour but de permettre de jouer en mode coopératif en permettant à un joueur de jouer à la prochaine mission de la chaîne qu'un autre joueur est en train d'entamer. -* `/play [mission_id]` Lance la mission correspondant à l'identifiant donné. -* `/available` Affiche les missions qui sont présentement accessibles. -* `/unfinished` Affiche les missions qui sont présentement accessibles et dont certains des objectifs permettant -l'accès à un *item* n'ont pas été accomplis. * `/set_path [path]` Permet de définir manuellement où *StarCraft 2* est installé ce qui est pertinent seulement si la détection automatique de cette dernière échoue. @@ -151,4 +147,4 @@ Cela n'affecte pas le jeu et peut être ignoré. - Actuellement, le client de *StarCraft 2* utilise la *location* associée à la victoire d'une mission pour déterminer si celle-ci a été complétée. En conséquence, la fonctionnalité *collect* d'*Archipelago* peut rendre accessible des missions connectées à une -mission que vous n'avez pas terminée. \ No newline at end of file +mission que vous n'avez pas terminée. diff --git a/worlds/sc2/docs/setup_en.md b/worlds/sc2/docs/setup_en.md index 4364008b58..a8d03d5a3d 100644 --- a/worlds/sc2/docs/setup_en.md +++ b/worlds/sc2/docs/setup_en.md @@ -62,69 +62,128 @@ If the Progression Balancing of one world is greater than that of others, items obtained early, and vice versa if its value is smaller. However, StarCraft 2 is more permissive regarding the items that can be used to progress, so this option has little influence on progression in a StarCraft 2 world. -StarCraft 2. Since this option increases the time required to generate a MultiWorld, we recommend deactivating it (i.e., setting it to zero) for a StarCraft 2 world. -#### How do I specify items in a list, like in excluded items? +#### What does Tactics Level do? + +Tactics level allows controlling the difficulty through what items you're likely to get early. +This is independent of game difficulty like causal, normal, hard, or brutal. + +"Standard" and "Advanced" levels are guaranteed to be beatable with the items you are given. +The logic is a little more restrictive than a player's creativity, so an advanced player is likely to have +more items than they need in any situation. These levels are entirely safe to use in a multiworld. + +The "Any Units" level only guarantees that a minimum number of faction-appropriate units or buildings are reachable +early on, with minimal restrictions on what those units are. +Generation will guarantee a number of faction-appropriate units are reachable before starting a mission, +based on the depth of that mission. For example, if the third mission is a zerg mission, it is guaranteed that 2 +zerg units are somewhere in the preceding 2 missions. This logic level is not guaranteed to be beatable, and may +require lowering the difficulty level (`/difficulty` in the client) if many no-build missions are excluded. + +The "No Logic" level provides no logical safeguards for beatability. It is only safe to use in a multiworld if the player curates +a start inventory or the organizer is okay with the possibility of the StarCraft 2 world being unbeatable. +Safeguards exist so that other games' items placed in the StarCraft 2 world are reachable under "Advanced" logic rules. + +#### How do I specify items in a list, like in enabled campaigns? You can look up the syntax for yaml collections in the [YAML specification](https://yaml.org/spec/1.2.2/#21-collections). -For lists, every item goes on its own line, started with a hyphen: +For lists, every item goes on its own line, started with a hyphen. +Putting each element on its own line makes it easy to toggle elements by commenting +(ie adding a `#` character at the start of the line). ```yaml -excluded_items: - - Battlecruiser - - Drop-Pods (Kerrigan Tier 7) + enabled_campaigns: + - Wings of Liberty + # - Heart of the Swarm + - Legacy of the Void + - Nova Covert Ops + - Prophecy + - 'Whispers of Oblivion (Legacy of the Void: Prologue)' + # - 'Into the Void (Legacy of the Void: Epilogue)' +``` + +An inline syntax may also be used for short lists: + +```yaml + enabled_campaigns: ['Wings of Liberty', 'Nova Covert Ops'] ``` An empty list is just a matching pair of square brackets: `[]`. -That's the default value in the template, which should let you know to use this syntax. +That's often the default value in the template, which should let you know to use this syntax. -#### How do I specify items for the starting inventory? +#### How do I specify items for key-value mappings, like starting inventory or filler item distribution? -The starting inventory is a YAML mapping rather than a list, which associates an item with the amount you start with. -The syntax looks like the item name, followed by a colon, then a whitespace character, and then the value: +Many options pertaining to the item pool are yaml mappings. +These are several lines, where each line looks like a name, followed by a colon, then a space, then a value. ```yaml -start_inventory: - Micro-Filtering: 1 - Additional Starting Vespene: 5 + start_inventory: + Micro-Filtering: 1 + Additional Starting Vespene: 5 + + locked_items: + MULE (Command Center): 1 ``` +For options like `start_inventory`, `locked_items`, `excluded_items`, and `unexcluded_items`, the value +is a number specifying how many copies of an item to start with/exclude/lock. +Note the name can also be an item group, and the value will then be added to the values for all the items +within the group. A value of `0` will exclude all copies of an item, but will add +0 if the value +is also specified by another name. + +For options like `filler_items_distribution`, the value is a number specifying the relative weight of +a filler item being that particular item. + +For the `custom_mission_order` option, the value is a nested structure of other mapppings to specify the structure +of the mission order. See the [Custom Mission Order documentation](/tutorial/Starcraft%202/custom_mission_orders_en) + An empty mapping is just a matching pair of curly braces: `{}`. That's the default value in the template, which should let you know to use this syntax. #### How do I know the exact names of items and locations? -The [*datapackage*](/datapackage) page of the Archipelago website provides a complete list of the items and locations -for each game that it currently supports, including StarCraft 2. - -You can also look up a complete list of the item names in the +You can look up a complete list of the item names in the [Icon Repository](https://matthewmarinets.github.io/ap_sc2_icons/) page. This page also contains supplementary information of each item. -However, the items shown in that page might differ from those shown in the datapackage page of Archipelago since the -former is generated, most of the time, from beta versions of StarCraft 2 Archipelago undergoing development. -As for the locations, you can see all the locations associated to a mission in your world by placing your cursor over -the mission in the 'StarCraft 2 Launcher' tab in the client. +Locations are of the format `: `. Names are most easily looked up by hovering +your mouse over a mission in the launcher tab of a client. Note this requires already generating a game connect to. + +This information can also be found in the [*datapackage*](/datapackage) page of the Archipelago website. +This page includes all data associated with all games. ## How do I join a MultiWorld game? 1. Run ArchipelagoStarcraft2Client.exe. - macOS users should instead follow the instructions found at ["Running in macOS"](#running-in-macos) for this step only. -2. Type `/connect [server ip]`. +2. In the Archipelago tab, type `/connect [server IP]`. - If you're running through the website, the server IP should be displayed near the top of the room page. + - The server IP may also be typed into the top bar, and then clicking "Connect" 3. Type your slot name from your YAML when prompted. 4. If the server has a password, enter that when prompted. 5. Once connected, switch to the 'StarCraft 2 Launcher' tab in the client. There, you can see all the missions in your -world. -Unreachable missions will have greyed-out text. Just click on an available mission to start it! +world. + +Unreachable missions will have greyed-out text. Completed missions (all locations collected) will have white text. +Accessible but incomplete missions will have blue text. Goal missions will have a gold border. +Mission buttons will have a color corresponding to the faction you play as in that mission. + +Click on an available mission to start it. ## The game isn't launching when I try to start a mission. -First, check the log file for issues (stored at `[Archipelago Directory]/logs/SC2Client.txt`). +Usually, this is caused by the mod files not being downloaded. +Make sure you have run `/download_data` in the Archipelago tab before playing. +You should only have to run `/download_data` again to pick up bugfixes and updates. + +Make sure that you are running an up-to-date version of the client. +Check the [Archipelago Releases Page](https://github.com/ArchipelagoMW/Archipelago/releases) to +look up what the latest version is (RC releases are not necessary; that stands for "Release Candidate"). + +If these things are in order, check the log file for issues (stored at `[Archipelago Directory]/logs/Starcraft2Client.txt`). If you can't figure out the log file, visit our [Discord's](https://discord.com/invite/8Z65BR2) tech-support channel for help. Please include a specific description of what's going wrong and attach your log file to your message. @@ -150,16 +209,15 @@ Note: to launch the client, you will need to run the command `python3 Starcraft2 ## Running in Linux -To run StarCraft 2 through Archipelago in Linux, you will need to install the game using Wine, then run the Linux build +To run StarCraft 2 through Archipelago on Linux, you will need to install the game using Wine, then run the Linux build of the Archipelago client. -Make sure you have StarCraft 2 installed using Wine, and that you have followed the -[installation procedures](#how-do-i-install-this-randomizer?) to add the Archipelago maps to the correct location. -You will not need to copy the `.dll` files. -If you're having trouble installing or running StarCraft 2 on Linux, it is recommend to use the Lutris installer. +Make sure you have StarCraft 2 installed using Wine, and you know where Wine and Starcraft 2 are installed. +If you're having trouble installing or running StarCraft 2 on Linux, it is recommended to use the Lutris installer. -Copy the following into a .sh file, replacing the values of **WINE** and **SC2PATH** variables with the relevant -locations, as well as setting **PATH_TO_ARCHIPELAGO** to the directory containing the AppImage if it is not in the same +Copy the following into a .sh file, preferably within your Archipelago directory, +replacing the values of **WINE** and **SC2PATH** variables with the relevant locations, +as well as setting **PATH_TO_ARCHIPELAGO** to the directory containing the AppImage if it is not in the same folder as the script. ```sh @@ -170,6 +228,13 @@ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python # FIXME Replace with path to the version of Wine used to run SC2 export WINE="/usr/bin/wine" +# FIXME If using nondefault wineprefix for SC2 install (usual for Lutris installs), uncomment the next line and change the path +#export WINEPREFIX="/path/to/wineprefix" + +# FIXME Uncomment the following lines if experiencing issues with DXVK (like DDRAW.ddl does not exist) +#export WINEDLLOVERRIDES=d3d10core,d3d11,d3d12,d3d12core,d3d9,d3dcompiler_33,d3dcompiler_34,d3dcompiler_35,d3dcompiler_36,d3dcompiler_37,d3dcompiler_38,d3dcompiler_39,d3dcompiler_40,d3dcompiler_41,d3dcompiler_42,d3dcompiler_43,d3dcompiler_46,d3dcompiler_47,d3dx10,d3dx10_33,d3dx10_34,d3dx10_35,d3dx10_36,d3dx10_37,d3dx10_38,d3dx10_39,d3dx10_40,d3dx10_41,d3dx10_42,d3dx10_43,d3dx11_42,d3dx11_43,d3dx9_24,d3dx9_25,d3dx9_26,d3dx9_27,d3dx9_28,d3dx9_29,d3dx9_30,d3dx9_31,d3dx9_32,d3dx9_33,d3dx9_34,d3dx9_35,d3dx9_36,d3dx9_37,d3dx9_38,d3dx9_39,d3dx9_40,d3dx9_41,d3dx9_42,d3dx9_43,dxgi,nvapi,nvapi64 +#export DXVK_ENABLE_NVAPI=1 + # FIXME Replace with path to StarCraft II install folder export SC2PATH="/home/user/Games/starcraft-ii/drive_c/Program Files (x86)/StarCraft II/" @@ -182,7 +247,7 @@ PATH_TO_ARCHIPELAGO= ARCHIPELAGO="$(ls ${PATH_TO_ARCHIPELAGO:-$(dirname $0)}/Archipelago_*.AppImage | sort -r | head -1)" # Start the Archipelago client -$ARCHIPELAGO Starcraft2Client +$ARCHIPELAGO "Starcraft 2 Client" ``` For Lutris installs, you can run `lutris -l` to get the numerical ID of your StarCraft II install, then run the command @@ -193,3 +258,6 @@ below, replacing **${ID}** with the numerical ID. This will get all of the relevant environment variables Lutris sets to run StarCraft 2 in a script, including the path to the Wine binary that Lutris uses. You can then remove the line that runs the Battle.Net launcher and copy the code above into the existing script. + +Finally, you can run the script to start your Archipelago client, +and it should be able to launch Starcraft 2 when you start a mission. diff --git a/worlds/sc2/docs/setup_fr.md b/worlds/sc2/docs/setup_fr.md index 7cdb7225b4..4e7a9663aa 100644 --- a/worlds/sc2/docs/setup_fr.md +++ b/worlds/sc2/docs/setup_fr.md @@ -87,7 +87,7 @@ Pour les listes, chaque *item* doit être sur sa propre ligne et doit être pré ```yaml excluded_items: - Battlecruiser - - Drop-Pods (Kerrigan Tier 7) + - Drop-Pods (Kerrigan Ability) ``` Une liste vide est représentée par une paire de crochets: `[]`. @@ -203,7 +203,7 @@ PATH_TO_ARCHIPELAGO= ARCHIPELAGO="$(ls ${PATH_TO_ARCHIPELAGO:-$(dirname $0)}/Archipelago_*.AppImage | sort -r | head -1)" # Lance le client de Archipelago -$ARCHIPELAGO Starcraft2Client +$ARCHIPELAGO "Starcraft 2 Client" ``` Pour une installation via Lutris, vous pouvez exécuter `lutris -l` pour obtenir l'identifiant numérique de votre diff --git a/worlds/sc2/gui_config.py b/worlds/sc2/gui_config.py new file mode 100644 index 0000000000..b3039da19e --- /dev/null +++ b/worlds/sc2/gui_config.py @@ -0,0 +1,98 @@ +""" +Import this before importing client_gui.py to set window defaults from world settings. +""" +from .settings import Starcraft2Settings +from typing import List, Tuple, Any + + +def get_window_defaults() -> Tuple[List[str], int, int]: + """ + Gets the window size options from the sc2 settings. + Returns a list of warnings to be printed once the GUI is started, followed by the window width and height + """ + from . import SC2World + + # validate settings + warnings: List[str] = [] + if isinstance(SC2World.settings.window_height, int) and SC2World.settings.window_height > 0: + window_height = SC2World.settings.window_height + else: + warnings.append(f"Invalid value for options.yaml key sc2_options.window_height: '{SC2World.settings.window_height}'. Expected a positive integer.") + window_height = Starcraft2Settings.window_height + if isinstance(SC2World.settings.window_width, int) and SC2World.settings.window_width > 0: + window_width = SC2World.settings.window_width + else: + warnings.append(f"Invalid value for options.yaml key sc2_options.window_width: '{SC2World.settings.window_width}'. Expected a positive integer.") + window_width = Starcraft2Settings.window_width + + return warnings, window_width, window_height + + +def validate_color(color: Any, default: Tuple[float, float, float]) -> Tuple[Tuple[str, ...], Tuple[float, float, float]]: + if isinstance(color, int): + if color < 0: + return ('Integer color was negative; expected a value from 0 to 0xffffff',), default + return (), ( + ((color >> 8) & 0xff) / 255, + ((color >> 4) & 0xff) / 255, + ((color >> 0) & 0xff) / 255, + ) + elif color == 'default': + return (), default + elif color == 'white': + return (), (0.9, 0.9, 0.9) + elif color == 'black': + return (), (0.0, 0.0, 0.0) + elif color == 'grey': + return (), (0.345, 0.345, 0.345) + elif color == 'red': + return (), (0.85, 0.2, 0.1) + elif color == 'orange': + return (), (1.0, 0.65, 0.37) + elif color == 'green': + return (), (0.24, 0.84, 0.55) + elif color == 'blue': + return (), (0.3, 0.4, 1.0) + elif color == 'pink': + return (), (0.886, 0.176, 0.843) + elif not isinstance(color, list): + return (f'Invalid type {type(color)}; expected 3-element list or integer',), default + elif len(color) != 3: + return (f'Wrong number of elements in color; expected 3, got {len(color)}',), default + result: List[float] = [0.0, 0.0, 0.0] + errors: List[str] = [] + expected = 'expected a number from 0 to 1' + for index, element in enumerate(color): + if isinstance(element, int): + element = float(element) + if not isinstance(element, float): + errors.append(f'Invalid type {type(element)} at index {index}; {expected}') + continue + if element < 0: + errors.append(f'Negative element {element} at index {index}; {expected}') + continue + if element > 1: + errors.append(f'Element {element} at index {index} is greater than 1; {expected}') + result[index] = 1.0 + continue + result[index] = element + return tuple(errors), tuple(result) + + +def get_button_color(race: str) -> Tuple[Tuple[str, ...], Tuple[float, float, float]]: + from . import SC2World + baseline_color = 0.345 # the button graphic is grey, with this value in each color channel + if race == 'TERRAN': + user_color: list = SC2World.settings.terran_button_color + default_color = (0.0838, 0.2898, 0.2346) + elif race == 'PROTOSS': + user_color = SC2World.settings.protoss_button_color + default_color = (0.345, 0.22425, 0.12765) + elif race == 'ZERG': + user_color = SC2World.settings.zerg_button_color + default_color = (0.18975, 0.2415, 0.345) + else: + user_color = [baseline_color, baseline_color, baseline_color] + default_color = (baseline_color, baseline_color, baseline_color) + errors, color = validate_color(user_color, default_color) + return errors, tuple(x / baseline_color for x in color) diff --git a/worlds/sc2/item/__init__.py b/worlds/sc2/item/__init__.py new file mode 100644 index 0000000000..7316a5f113 --- /dev/null +++ b/worlds/sc2/item/__init__.py @@ -0,0 +1,173 @@ +import enum +import typing +from dataclasses import dataclass +from typing import Optional, Union, Dict, Type + +from BaseClasses import Item, ItemClassification +from ..mission_tables import SC2Race + + +class ItemFilterFlags(enum.IntFlag): + """Removed > Start Inventory > Locked > Excluded > Requested > Culled""" + Available = 0 + StartInventory = enum.auto() + Locked = enum.auto() + """Used to flag items that are never allowed to be culled.""" + LogicLocked = enum.auto() + """Locked by item cull logic checks; logic-locked w/a upgrades may be removed if all parents are removed""" + Requested = enum.auto() + """Soft-locked items by item count checks during item culling; may be re-added""" + Removed = enum.auto() + """Marked for immediate removal""" + UserExcluded = enum.auto() + """Excluded by the user; display an error message if failing to exclude""" + FilterExcluded = enum.auto() + """Excluded by item filtering""" + Culled = enum.auto() + """Soft-removed by the item culling""" + NonLocal = enum.auto() + Plando = enum.auto() + AllowedOrphan = enum.auto() + """Used to flag items that shouldn't be filtered out with their parents""" + ForceProgression = enum.auto() + """Used to flag items that aren't classified as progression by default""" + + Unexcludable = StartInventory|Plando|Locked|LogicLocked + UnexcludableUpgrade = StartInventory|Plando|Locked + Uncullable = StartInventory|Plando|Locked|LogicLocked|Requested + Excluded = UserExcluded|FilterExcluded + RequestedOrBetter = StartInventory|Locked|LogicLocked|Requested + CulledOrBetter = Removed|Excluded|Culled + + +class StarcraftItem(Item): + game: str = "Starcraft 2" + filter_flags: ItemFilterFlags = ItemFilterFlags.Available + + def __init__(self, name: str, classification: ItemClassification, code: Optional[int], player: int, filter_flags: ItemFilterFlags = ItemFilterFlags.Available): + super().__init__(name, classification, code, player) + self.filter_flags = filter_flags + +class ItemTypeEnum(enum.Enum): + def __new__(cls, *args, **kwargs): + value = len(cls.__members__) + 1 + obj = object.__new__(cls) + obj._value_ = value + return obj + + def __init__(self, name: str, flag_word: int): + self.display_name = name + self.flag_word = flag_word + + +class TerranItemType(ItemTypeEnum): + Armory_1 = "Armory", 0 + """General Terran unit upgrades""" + Armory_2 = "Armory", 1 + Armory_3 = "Armory", 2 + Armory_4 = "Armory", 3 + Armory_5 = "Armory", 4 + Armory_6 = "Armory", 5 + Armory_7 = "Armory", 6 + Progressive = "Progressive Upgrade", 7 + Laboratory = "Laboratory", 8 + Upgrade = "Upgrade", 9 + Unit = "Unit", 10 + Building = "Building", 11 + Mercenary = "Mercenary", 12 + Nova_Gear = "Nova Gear", 13 + Progressive_2 = "Progressive Upgrade", 14 + Unit_2 = "Unit", 15 + + +class ZergItemType(ItemTypeEnum): + Ability = "Ability", 0 + """Kerrigan abilities""" + Mutation_1 = "Mutation", 1 + Strain = "Strain", 2 + Morph = "Morph", 3 + Upgrade = "Upgrade", 4 + Mercenary = "Mercenary", 5 + Unit = "Unit", 6 + Level = "Level", 7 + """Kerrigan level packs""" + Primal_Form = "Primal Form", 8 + Evolution_Pit = "Evolution Pit", 9 + """Zerg global economy upgrades, like automated extractors""" + Mutation_2 = "Mutation", 10 + Mutation_3 = "Mutation", 11 + Mutation_4 = "Mutation", 12 + Progressive = "Progressive Upgrade", 13 + Mutation_5 = "Mutation", 14 + + +class ProtossItemType(ItemTypeEnum): + Unit = "Unit", 0 + Unit_2 = "Unit", 1 + Upgrade = "Upgrade", 2 + Building = "Building", 3 + Progressive = "Progressive Upgrade", 4 + Spear_Of_Adun = "Spear of Adun", 5 + Solarite_Core = "Solarite Core", 6 + """Protoss global effects, such as reconstruction beam or automated assimilators""" + Forge_1 = "Forge", 7 + """General Protoss unit upgrades""" + Forge_2 = "Forge", 8 + """General Protoss unit upgrades""" + Forge_3 = "Forge", 9 + """General Protoss unit upgrades""" + Forge_4 = "Forge", 10 + """General Protoss unit upgrades""" + Forge_5 = "Forge", 11 + """General Protoss unit upgrades""" + War_Council = "War Council", 12 + War_Council_2 = "War Council", 13 + ShieldRegeneration = "Shield Regeneration Group", 14 + + +class FactionlessItemType(ItemTypeEnum): + Minerals = "Minerals", 0 + Vespene = "Vespene", 1 + Supply = "Supply", 2 + MaxSupply = "Max Supply", 3 + BuildingSpeed = "Building Speed", 4 + Nothing = "Nothing Group", 5 + Deprecated = "Deprecated", 6 + MaxSupplyTrap = "Max Supply Trap", 7 + ResearchSpeed = "Research Speed", 8 + ResearchCost = "Research Cost", 9 + Keys = "Keys", -1 + + +ItemType = Union[TerranItemType, ZergItemType, ProtossItemType, FactionlessItemType] +race_to_item_type: Dict[SC2Race, Type[ItemTypeEnum]] = { + SC2Race.ANY: FactionlessItemType, + SC2Race.TERRAN: TerranItemType, + SC2Race.ZERG: ZergItemType, + SC2Race.PROTOSS: ProtossItemType, +} + + +class ItemData(typing.NamedTuple): + code: int + type: ItemType + number: int # Important for bot commands to send the item into the game + race: SC2Race + classification: ItemClassification = ItemClassification.useful + quantity: int = 1 + parent: typing.Optional[str] = None + important_for_filtering: bool = False + + def is_important_for_filtering(self): + return ( + self.important_for_filtering + or self.classification == ItemClassification.progression + or self.classification == ItemClassification.progression_skip_balancing + ) + +@dataclass +class FilterItem: + name: str + data: ItemData + index: int = 0 + flags: ItemFilterFlags = ItemFilterFlags.Available diff --git a/worlds/sc2/item/item_annotations.py b/worlds/sc2/item/item_annotations.py new file mode 100644 index 0000000000..cd28e071b5 --- /dev/null +++ b/worlds/sc2/item/item_annotations.py @@ -0,0 +1,178 @@ +""" +Annotations to add to item names sent to the in-game message panel +""" +from . import item_names + +ITEM_NAME_ANNOTATIONS = { + item_names.MARINE: "(Barracks)", + item_names.MEDIC: "(Barracks)", + item_names.FIREBAT: "(Barracks)", + item_names.MARAUDER: "(Barracks)", + item_names.REAPER: "(Barracks)", + item_names.HELLION: "(Factory)", + item_names.VULTURE: "(Factory)", + item_names.GOLIATH: "(Factory)", + item_names.DIAMONDBACK: "(Factory)", + item_names.SIEGE_TANK: "(Factory)", + item_names.MEDIVAC: "(Starport)", + item_names.WRAITH: "(Starport)", + item_names.VIKING: "(Starport)", + item_names.BANSHEE: "(Starport)", + item_names.BATTLECRUISER: "(Starport)", + item_names.GHOST: "(Barracks)", + item_names.SPECTRE: "(Barracks)", + item_names.THOR: "(Factory)", + item_names.RAVEN: "(Starport)", + item_names.SCIENCE_VESSEL: "(Starport)", + item_names.PREDATOR: "(Factory)", + item_names.HERCULES: "(Starport)", + + item_names.HERC: "(Barracks)", + item_names.DOMINION_TROOPER: "(Barracks)", + item_names.WIDOW_MINE: "(Factory)", + item_names.CYCLONE: "(Factory)", + item_names.WARHOUND: "(Factory)", + item_names.LIBERATOR: "(Starport)", + item_names.VALKYRIE: "(Starport)", + + item_names.SON_OF_KORHAL: "(Elite Barracks)", + item_names.AEGIS_GUARD: "(Elite Barracks)", + item_names.FIELD_RESPONSE_THETA: "(Elite Barracks)", + item_names.EMPERORS_SHADOW: "(Elite Barracks)", + item_names.BULWARK_COMPANY: "(Elite Factory)", + item_names.SHOCK_DIVISION: "(Elite Factory)", + item_names.BLACKHAMMER: "(Elite Factory)", + item_names.SKY_FURY: "(Elite Starport)", + item_names.NIGHT_HAWK: "(Elite Starport)", + item_names.NIGHT_WOLF: "(Elite Starport)", + item_names.EMPERORS_GUARDIAN: "(Elite Starport)", + item_names.PRIDE_OF_AUGUSTRGRAD: "(Elite Starport)", + + item_names.WAR_PIGS: "(Terran Mercenary)", + item_names.DEVIL_DOGS: "(Terran Mercenary)", + item_names.HAMMER_SECURITIES: "(Terran Mercenary)", + item_names.SPARTAN_COMPANY: "(Terran Mercenary)", + item_names.SIEGE_BREAKERS: "(Terran Mercenary)", + item_names.HELS_ANGELS: "(Terran Mercenary)", + item_names.DUSK_WINGS: "(Terran Mercenary)", + item_names.JACKSONS_REVENGE: "(Terran Mercenary)", + item_names.SKIBIS_ANGELS: "(Terran Mercenary)", + item_names.DEATH_HEADS: "(Terran Mercenary)", + item_names.WINGED_NIGHTMARES: "(Terran Mercenary)", + item_names.MIDNIGHT_RIDERS: "(Terran Mercenary)", + item_names.BRYNHILDS: "(Terran Mercenary)", + item_names.JOTUN: "(Terran Mercenary)", + + item_names.BUNKER: "(Terran Building)", + item_names.MISSILE_TURRET: "(Terran Building)", + item_names.SENSOR_TOWER: "(Terran Building)", + item_names.PLANETARY_FORTRESS: "(Terran Building)", + item_names.PERDITION_TURRET: "(Terran Building)", + item_names.DEVASTATOR_TURRET: "(Terran Building)", + item_names.PSI_DISRUPTER: "(Terran Building)", + item_names.HIVE_MIND_EMULATOR: "(Terran Building)", + + item_names.ZERGLING: "(Larva)", + item_names.SWARM_QUEEN: "(Hatchery)", + item_names.ROACH: "(Larva)", + item_names.HYDRALISK: "(Larva)", + item_names.ABERRATION: "(Larva)", + item_names.MUTALISK: "(Larva)", + item_names.SWARM_HOST: "(Larva)", + item_names.INFESTOR: "(Larva)", + item_names.ULTRALISK: "(Larva)", + item_names.PYGALISK: "(Larva)", + item_names.CORRUPTOR: "(Larva)", + item_names.SCOURGE: "(Larva)", + item_names.BROOD_QUEEN: "(Larva)", + item_names.DEFILER: "(Larva)", + item_names.INFESTED_MARINE: "(Infested Barracks)", + item_names.INFESTED_SIEGE_TANK: "(Infested Factory)", + item_names.INFESTED_DIAMONDBACK: "(Infested Factory)", + item_names.BULLFROG: "(Infested Factory)", + item_names.INFESTED_BANSHEE: "(Infested Starport)", + item_names.INFESTED_LIBERATOR: "(Infested Starport)", + + item_names.ZERGLING_BANELING_ASPECT: "(Zergling Morph)", + item_names.HYDRALISK_IMPALER_ASPECT: "(Hydralisk Morph)", + item_names.HYDRALISK_LURKER_ASPECT: "(Hydralisk Morph)", + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT: "(Mutalisk/Corruptor Morph)", + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT: "(Mutalisk/Corruptor Morph)", + item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: "(Mutalisk/Corruptor Morph)", + item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: "(Mutalisk/Corruptor Morph)", + item_names.ROACH_RAVAGER_ASPECT: "(Roach Morph)", + item_names.OVERLORD_OVERSEER_ASPECT: "(Overlord Morph)", + item_names.ROACH_PRIMAL_IGNITER_ASPECT: "(Roach Morph)", + item_names.ULTRALISK_TYRANNOZOR_ASPECT: "(Ultralisk Morph)", + + item_names.INFESTED_MEDICS: "(Zerg Mercenary)", + item_names.INFESTED_SIEGE_BREAKERS: "(Zerg Mercenary)", + item_names.INFESTED_DUSK_WINGS: "(Zerg Mercenary)", + item_names.DEVOURING_ONES: "(Zerg Mercenary)", + item_names.HUNTER_KILLERS: "(Zerg Mercenary)", + item_names.TORRASQUE_MERC: "(Zerg Mercenary)", + item_names.HUNTERLING: "(Zerg Mercenary)", + item_names.YGGDRASIL: "(Zerg Mercenary)", + item_names.CAUSTIC_HORRORS: "(Zerg Mercenary)", + + item_names.SPORE_CRAWLER: "(Zerg Building)", + item_names.SPINE_CRAWLER: "(Zerg Building)", + item_names.BILE_LAUNCHER: "(Zerg Building)", + item_names.INFESTED_BUNKER: "(Zerg Building)", + item_names.INFESTED_MISSILE_TURRET: "(Zerg Building)", + item_names.NYDUS_WORM: "(Nydus Network)", + item_names.ECHIDNA_WORM: "(Nydus Network)", + + item_names.ZEALOT: "(Gateway, Aiur)", + item_names.CENTURION: "(Gateway, Nerazim)", + item_names.SENTINEL: "(Gateway, Purifier)", + item_names.SUPPLICANT: "(Gateway, Tal'darim)", + item_names.STALKER: "(Gateway, Nerazim)", + item_names.INSTIGATOR: "(Gateway, Purifier)", + item_names.SLAYER: "(Gateway, Tal'darim)", + item_names.SENTRY: "(Gateway, Aiur)", + item_names.ENERGIZER: "(Gateway, Purifier)", + item_names.HAVOC: "(Gateway, Tal'darim)", + item_names.HIGH_TEMPLAR: "(Gateway, Aiur)", + item_names.SIGNIFIER: "(Gateway, Nerazim)", + item_names.ASCENDANT: "(Gateway, Tal'darim)", + item_names.DARK_TEMPLAR: "(Gateway, Nerazim)", + item_names.AVENGER: "(Gateway, Aiur)", + item_names.BLOOD_HUNTER: "(Gateway, Tal'darim)", + item_names.DRAGOON: "(Gateway, Aiur)", + item_names.DARK_ARCHON: "(Gateway, Nerazim)", + item_names.ADEPT: "(Gateway, Purifier)", + item_names.OBSERVER: "(Robotics Facility)", + item_names.WARP_PRISM: "(Robotics Facility)", + item_names.IMMORTAL: "(Robotics Facility, Aiur)", + item_names.ANNIHILATOR: "(Robotics Facility, Nerazim)", + item_names.VANGUARD: "(Robotics Facility, Tal'darim)", + item_names.STALWART: "(Robotics Facility, Purifier)", + item_names.COLOSSUS: "(Robotics Facility, Purifier)", + item_names.WRATHWALKER: "(Robotics Facility, Tal'darim)", + item_names.REAVER: "(Robotics Facility, Aiur)", + item_names.DISRUPTOR: "(Robotics Facility, Purifier)", + item_names.PHOENIX: "(Stargate, Aiur)", + item_names.MIRAGE: "(Stargate, Purifier)", + item_names.SKIRMISHER: "(Stargate, Tal'darim)", + item_names.CORSAIR: "(Stargate, Nerazim)", + item_names.VOID_RAY: "(Stargate, Nerazim)", + item_names.DESTROYER: "(Stargate, Tal'darim)", + item_names.PULSAR: "(Stargate, Aiur)", + item_names.DAWNBRINGER: "(Stargate, Purifier)", + item_names.SCOUT: "(Stargate, Aiur)", + item_names.OPPRESSOR: "(Stargate, Tal'darim)", + item_names.CALADRIUS: "(Stargate, Purifier)", + item_names.MISTWING: "(Stargate, Nerazim)", + item_names.CARRIER: "(Stargate, Aiur)", + item_names.SKYLORD: "(Stargate, Tal'darim)", + item_names.TRIREME: "(Stargate, Purifier)", + item_names.TEMPEST: "(Stargate, Purifier)", + item_names.MOTHERSHIP: "(Stargate, Tal'darim)", + item_names.ARBITER: "(Stargate, Aiur)", + item_names.ORACLE: "(Stargate, Nerazim)", + + item_names.PHOTON_CANNON: "(Protoss Building)", + item_names.KHAYDARIN_MONOLITH: "(Protoss Building)", + item_names.SHIELD_BATTERY: "(Protoss Building)", +} \ No newline at end of file diff --git a/worlds/sc2/item/item_descriptions.py b/worlds/sc2/item/item_descriptions.py new file mode 100644 index 0000000000..f1520df142 --- /dev/null +++ b/worlds/sc2/item/item_descriptions.py @@ -0,0 +1,1127 @@ +""" +Contains descriptions for Starcraft 2 items. +""" +import inspect + +from . import item_tables, item_names + +WEAPON_ARMOR_UPGRADE_NOTE = inspect.cleandoc(""" + Must be researched during the mission if the mission type isn't set to auto-unlock generic upgrades. +""") +GENERIC_UPGRADE_TEMPLATE = "Increases {} of {} {}.\n" + WEAPON_ARMOR_UPGRADE_NOTE +TERRAN = "Terran" +ZERG = "Zerg" +PROTOSS = "Protoss" + +LASER_TARGETING_SYSTEMS_DESCRIPTION = "Increases vision by 2 and weapon range by 1." +STIMPACK_SMALL_COST = 10 +STIMPACK_SMALL_HEAL = 30 +STIMPACK_LARGE_COST = 20 +STIMPACK_LARGE_HEAL = 60 +STIMPACK_TEMPLATE = inspect.cleandoc(""" + Level 1: Stimpack: Increases unit movement and attack speed for 15 seconds. Injures the unit for {} life. + Level 2: Super Stimpack: Instead of injuring the unit, heals the unit for {} life instead. +""") +STIMPACK_SMALL_DESCRIPTION = STIMPACK_TEMPLATE.format(STIMPACK_SMALL_COST, STIMPACK_SMALL_HEAL) +STIMPACK_LARGE_DESCRIPTION = STIMPACK_TEMPLATE.format(STIMPACK_LARGE_COST, STIMPACK_LARGE_HEAL) +SMART_SERVOS_DESCRIPTION = "Increases transformation speed between modes." +INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE = "{} can be trained from a {} without an attached Tech Lab." +CLOAK_DESCRIPTION_TEMPLATE = "Allows {} to use the Cloak ability." + +DISPLAY_NAME_BROOD_LORD = "Brood Lord" +DISPLAY_NAME_CLOAKED_ASSASSIN = "Dark Templar, Avenger, and Blood Hunter" +DISPLAY_NAME_WORMS = "Nydus Worm and Echidna Worm" + +GENERIC_KEY_DESC = "Unlocks a part of the mission order." + +resource_efficiency_cost_reduction = { + item_names.REAPER: (0, 50, 0), + item_names.MEDIC: (25, 25, 1), + item_names.FIREBAT: (50, 0, 1), + item_names.GOLIATH: (50, 0, 1), + item_names.SIEGE_TANK: (0, 25, 1), + item_names.DIAMONDBACK: (0, 50, 1), + item_names.PREDATOR: (0, 75, 1), + item_names.WARHOUND: (75, 0, 0), + item_names.HERC: (25, 25, 1), + item_names.WRAITH: (0, 50, 0), + item_names.GHOST: (25, 25, 0), + item_names.SPECTRE: (25, 25, 0), + item_names.RAVEN: (0, 50, 0), + item_names.CYCLONE: (25, 50, 1), + item_names.WIDOW_MINE: (0, 25, 1), + item_names.LIBERATOR: (0, 25, 0), + item_names.VALKYRIE: (100, 25, 1), + item_names.MEDIVAC: (0, 50, 0), + item_names.DEVASTATOR_TURRET: (50, 0, 0), + item_names.MISSILE_TURRET: (25, 0, 0), + item_names.SCOURGE: (0, 50, 0), + item_names.HYDRALISK: (25, 25, 1), + item_names.SWARM_HOST: (100, 25, 0), + item_names.ULTRALISK: (100, 0, 2), + item_names.ABERRATION: (50, 25, 0), + item_names.CORRUPTOR: (50, 25, 0), + DISPLAY_NAME_BROOD_LORD: (0, 75, 0), + item_names.SWARM_QUEEN: (0, 50, 0), + item_names.ARBITER: (50, 0, 0), + item_names.REAVER: (50, 25, 1), + DISPLAY_NAME_CLOAKED_ASSASSIN: (0, 50, 0), + item_names.SCOUT: (75, 25, 0), + item_names.DESTROYER: (50, 25, 1), + DISPLAY_NAME_WORMS: (50, 75, 0), + + # Frightful Fleshwelder + item_names.INFESTED_SIEGE_TANK: (0, 25, 0), + item_names.INFESTED_DIAMONDBACK: (50, 0, 0), + item_names.INFESTED_BANSHEE: (25, 0, 0), + item_names.INFESTED_LIBERATOR: (0, 25, 0), + + # War Council + item_names.CENTURION: (0, 40, 0), + item_names.SENTINEL: (60, 0, 1), +} + +op_re_cost_reduction = { + item_names.GHOST: (100, 50, 1), + item_names.SPECTRE: (100, 50, 1), + item_names.REAVER: (50, 75, 1), + item_names.SCOUT: (50, 0, 1), +} + + +def _get_resource_efficiency_desc(item_name: str, reduction_map: dict = resource_efficiency_cost_reduction) -> str: + cost = reduction_map[item_name] + parts = [f"{cost[0]} minerals"] if cost[0] else [] + parts += [f"{cost[1]} gas"] if cost[1] else [] + parts += [f"{cost[2]} supply"] if cost[2] else [] + assert parts, f"{item_name} doesn't reduce cost by anything" + if len(parts) == 1: + amount = parts[0] + elif len(parts) == 2: + amount = " and ".join(parts) + else: + amount = ", ".join(parts[:-1]) + ", and " + parts[-1] + return (f"Reduces {item_name} cost by {amount}.") + + + +def _get_start_and_max_energy_desc(unit_name_plural: str, starting_amount_increase: int = 150, maximum_amount_increase: int = 50) -> str: + return f"{unit_name_plural} gain +{starting_amount_increase} starting energy and +{maximum_amount_increase} maximum energy." + + +def _ability_desc(unit_name_plural: str, ability_name: str, ability_description: str = '') -> str: + if ability_description: + suffix = f", \nwhich {ability_description}" + else: + suffix = "" + return f"{unit_name_plural} gain the {ability_name} ability{suffix}." + + +item_descriptions = { + item_names.MARINE: "General-purpose infantry.", + item_names.MEDIC: "Support trooper. Heals nearby biological units.", + item_names.FIREBAT: "Specialized anti-infantry attacker.", + item_names.MARAUDER: "Heavy assault infantry.", + item_names.REAPER: "Raider. Capable of jumping up and down cliffs. Throws explosive mines.", + item_names.HELLION: "Fast scout. Has a flame attack that damages all enemy units in its line of fire.", + item_names.VULTURE: "Fast skirmish unit. Can use the Spider Mine ability.", + item_names.GOLIATH: "Heavy-fire support unit.", + item_names.DIAMONDBACK: "Fast, high-damage hovertank. Rail Gun can fire while the Diamondback is moving.", + item_names.SIEGE_TANK: "Heavy tank. Long-range artillery in Siege Mode.", + item_names.MEDIVAC: "Air transport. Heals nearby biological units.", + item_names.WRAITH: "Highly mobile flying unit. Excellent at surgical strikes.", + item_names.VIKING: inspect.cleandoc(""" + Durable support flyer. Loaded with strong anti-capital air missiles. + Can switch into Assault Mode to attack ground units. + """), + item_names.BANSHEE: "Tactical-strike aircraft.", + item_names.BATTLECRUISER: "Powerful warship.", + item_names.GHOST: + "Infiltration unit. Can use Snipe and Cloak abilities. Can also call down Tactical Nukes.", + item_names.SPECTRE: inspect.cleandoc(""" + Infiltration unit. Can use Ultrasonic Pulse, Psionic Lash, and Cloak. + Can also call down Tactical Nukes. + """), + item_names.THOR: "Heavy assault mech.", + item_names.LIBERATOR: inspect.cleandoc(""" + Artillery fighter. Loaded with missiles that deal area damage to enemy air targets. + Can switch into Defender Mode to provide siege support. + """), + item_names.VALKYRIE: inspect.cleandoc(""" + Advanced anti-aircraft fighter. + Able to use cluster missiles that deal area damage to air targets. + """), + item_names.WIDOW_MINE: inspect.cleandoc(""" + Robotic mine. Launches missiles at nearby enemy units while burrowed. + Attacks deal splash damage in a small area around the target. + Widow Mine is revealed when Sentinel Missile is on cooldown. + """), + item_names.CYCLONE: "Mobile assault vehicle. Can use Lock On to quickly fire while moving.", + item_names.HERC: "Front-line infantry. Can use Grapple.", + item_names.WARHOUND: "Anti-vehicle mech. Haywire missiles do bonus damage to mechanical units.", + item_names.DOMINION_TROOPER: + "General-purpose infantry. Can be outfitted with weapons for different combat situations.", + item_names.PRIDE_OF_AUGUSTRGRAD: "Powerful Royal Guard warship.", + item_names.SKY_FURY: inspect.cleandoc(""" + Durable Royal Guard support flyer. Loaded with strong anti-capital air missiles. + Can switch into Assault Mode to attack ground units. + """), + item_names.SHOCK_DIVISION: "Royal Guard heavy tank. Long-range artillery in Siege Mode.", + item_names.BLACKHAMMER: "Royal Guard heavy assault mech.", + item_names.AEGIS_GUARD: "Royal Guard heavy assault infantry.", + item_names.EMPERORS_SHADOW: "Royal Guard specialist. Can use Pyrokinetic Immolation and EMP Blast abilities. Can call down Tactical missiles.", + item_names.SON_OF_KORHAL: "Royal Guard general-purpose infantry.", + item_names.BULWARK_COMPANY: "Royal Guard heavy-fire support unit.", + item_names.FIELD_RESPONSE_THETA: "Royal Guard support trooper. Heals nearby biological units.", + item_names.EMPERORS_GUARDIAN: inspect.cleandoc(""" + Royal Guard artillery fighter. Loaded with missiles that deal area damage to enemy air targets. + Can switch into Defender Mode to provide siege support. + """), + item_names.NIGHT_HAWK: "Royal Guard highly mobile flying unit. Excellent at surgical strikes.", + item_names.NIGHT_WOLF: "Royal Guard tactical-strike aircraft.", + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON: GENERIC_UPGRADE_TEMPLATE.format("damage", TERRAN, "infantry"), + item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR: GENERIC_UPGRADE_TEMPLATE.format("armor", TERRAN, "infantry"), + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON: GENERIC_UPGRADE_TEMPLATE.format("damage", TERRAN, "vehicles"), + item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR: GENERIC_UPGRADE_TEMPLATE.format("armor", TERRAN, "vehicles"), + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON: GENERIC_UPGRADE_TEMPLATE.format("damage", TERRAN, "starships"), + item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR: GENERIC_UPGRADE_TEMPLATE.format("armor", TERRAN, "starships"), + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage", TERRAN, "units"), + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("armor", TERRAN, "units"), + item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", TERRAN, "infantry"), + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", TERRAN, "vehicles"), + item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", TERRAN, "starships"), + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", TERRAN, "units"), + item_names.BUNKER_PROJECTILE_ACCELERATOR: "Increases range of all units in the Bunker by 1.", + item_names.BUNKER_NEOSTEEL_BUNKER: "Increases the number of Bunker slots by 2.", + item_names.MISSILE_TURRET_TITANIUM_HOUSING: "Increases Missile Turret life by 75.", + item_names.MISSILE_TURRET_HELLSTORM_BATTERIES: "The Missile Turret unleashes an additional flurry of missiles with each attack.", + item_names.SCV_ADVANCED_CONSTRUCTION: "Multiple SCVs can construct a structure, reducing its construction time.", + item_names.SCV_DUAL_FUSION_WELDERS: "SCVs repair twice as fast.", + item_names.SCV_CONSTRUCTION_JUMP_JETS: "Allows SCVs to jump up and down cliffs.", + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM: inspect.cleandoc(""" + Level 1: While on low health, Terran structures are repaired to half health instead of burning down. + Level 2: Terran structures are repaired to full health instead of half health. + """), + item_names.PROGRESSIVE_ORBITAL_COMMAND: inspect.cleandoc(""" + Deprecated. Replaced by Scanner Sweep, MULE, and Orbital Module (Planetary Fortress) + Level 1: Allows Command Centers to use Scanner Sweep and Calldown: MULE abilities. + Level 2: Orbital Command abilities work even in Planetary Fortress mode. + """), + item_names.MARINE_PROGRESSIVE_STIMPACK: STIMPACK_SMALL_DESCRIPTION, + item_names.MARINE_COMBAT_SHIELD: "Increases Marine life by 10.", + item_names.MEDIC_ADVANCED_MEDIC_FACILITIES: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Medics", "Barracks"), + item_names.MEDIC_STABILIZER_MEDPACKS: "Increases Medic heal speed. Reduces the amount of energy required for each heal.", + item_names.FIREBAT_INCINERATOR_GAUNTLETS: "Increases Firebat's damage radius by 40%.", + item_names.FIREBAT_JUGGERNAUT_PLATING: "Increases Firebat's armor by 2.", + item_names.MARAUDER_CONCUSSIVE_SHELLS: "Marauder attack temporarily slows all units in target area.", + item_names.MARAUDER_KINETIC_FOAM: "Increases Marauder life by 25.", + item_names.REAPER_U238_ROUNDS: inspect.cleandoc(""" + Increases Reaper pistol attack range by 1. + Reaper pistols do additional 3 damage to Light Armor. + """), + item_names.REAPER_G4_CLUSTERBOMB: "Timed explosive that does heavy area damage.", + item_names.CYCLONE_MAG_FIELD_ACCELERATORS: "Increases Cyclone Lock-On damage.", + item_names.CYCLONE_MAG_FIELD_LAUNCHERS: "Increases Cyclone attack range by 2.", + item_names.MARINE_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.MARINE_MAGRAIL_MUNITIONS: "Deals 20 damage to target unit. Autocast on attack with a cooldown.", + item_names.MARINE_OPTIMIZED_LOGISTICS: "Increases Marine training speed.", + item_names.MEDIC_RESTORATION: _ability_desc("Medics", "Restoration", "removes negative status effects from a target allied unit"), + item_names.MEDIC_OPTICAL_FLARE: _ability_desc("Medics", "Optical Flare", "reduces vision range of target enemy unit. Disables detection"), + item_names.MEDIC_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.MEDIC), + item_names.FIREBAT_PROGRESSIVE_STIMPACK: STIMPACK_LARGE_DESCRIPTION, + item_names.FIREBAT_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.FIREBAT), + item_names.MARAUDER_PROGRESSIVE_STIMPACK: STIMPACK_LARGE_DESCRIPTION, + item_names.MARAUDER_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.MARAUDER_MAGRAIL_MUNITIONS: "Deals 20 damage to target unit. Autocast on attack with a cooldown.", + item_names.MARAUDER_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Marauders", "Barracks"), + item_names.SCV_HOSTILE_ENVIRONMENT_ADAPTATION: "Increases SCV life by 15 and attack speed slightly.", + item_names.MEDIC_ADAPTIVE_MEDPACKS: "Allows Medics to heal mechanical and air units.", + item_names.MEDIC_NANO_PROJECTOR: "Increases Medic heal range by 2.", + item_names.FIREBAT_INFERNAL_PRE_IGNITER: "Firebats do an additional 4 damage to Light Armor.", + item_names.FIREBAT_KINETIC_FOAM: "Increases Firebat life by 100.", + item_names.FIREBAT_NANO_PROJECTORS: "Increases Firebat attack range by 2.", + item_names.MARAUDER_JUGGERNAUT_PLATING: "Increases Marauder's armor by 2.", + item_names.REAPER_JET_PACK_OVERDRIVE: inspect.cleandoc(""" + Allows the Reaper to fly for 10 seconds. + While flying, the Reaper can attack air units. + """), + item_names.HELLION_INFERNAL_PLATING: "Increases Hellion and Hellbat armor by 2.", + item_names.VULTURE_JERRYRIGGED_PATCHUP: "Vultures regenerate life.", + item_names.GOLIATH_SHAPED_HULL: "Increases Goliath life by 25.", + item_names.GOLIATH_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.GOLIATH), + item_names.GOLIATH_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Goliaths", "Factory"), + item_names.SIEGE_TANK_SHAPED_HULL: "Increases Siege Tank life by 25.", + item_names.SIEGE_TANK_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SIEGE_TANK), + item_names.PREDATOR_CLOAK: "Allows Predators to briefly cloak. Predators ignore unit collision while cloaked.", + item_names.PREDATOR_CHARGE: "Allows Predators to intercept enemy ground units, and applies an AoE slow on arrival.", + item_names.MEDIVAC_SCATTER_VEIL: "Medivacs get 100 shields.", + item_names.REAPER_PROGRESSIVE_STIMPACK: STIMPACK_SMALL_DESCRIPTION, + item_names.REAPER_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.REAPER_ADVANCED_CLOAKING_FIELD: "Reapers are permanently cloaked.", + item_names.REAPER_SPIDER_MINES: "Allows Reapers to lay Spider Mines. 3 charges per Reaper.", + item_names.REAPER_COMBAT_DRUGS: "Reapers regenerate life while out of combat.", + item_names.HELLION_HELLBAT: "Allows Hellions to transform into Hellbats.", + item_names.HELLION_SMART_SERVOS: "Transforms faster between modes. Hellions can attack while moving.", + item_names.HELLION_OPTIMIZED_LOGISTICS: "Increases Hellion training speed.", + item_names.HELLION_JUMP_JETS: inspect.cleandoc(""" + Increases movement speed in Hellion mode. + In Hellbat mode, launches the Hellbat toward enemy ground units and briefly stuns them. + """), + item_names.HELLION_PROGRESSIVE_STIMPACK: STIMPACK_LARGE_DESCRIPTION, + item_names.VULTURE_ION_THRUSTERS: "Increases Vulture movement speed.", + item_names.VULTURE_AUTO_LAUNCHERS: "Allows Vultures to attack while moving.", + item_names.SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION: "Increases Spider mine damage.", + item_names.GOLIATH_JUMP_JETS: "Allows Goliaths to jump up and down cliffs.", + item_names.GOLIATH_OPTIMIZED_LOGISTICS: "Increases Goliath training speed.", + item_names.DIAMONDBACK_HYPERFLUXOR: "Increases Diamondback attack speed.", + item_names.DIAMONDBACK_BURST_CAPACITORS: inspect.cleandoc(""" + While not attacking, the Diamondback charges its weapon. + The next attack does 10 additional damage. + """), + item_names.DIAMONDBACK_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.DIAMONDBACK), + item_names.SIEGE_TANK_JUMP_JETS: inspect.cleandoc(""" + Repositions Siege Tank to a target location. + Can be used in either mode and to jump up and down cliffs. + """), + item_names.SIEGE_TANK_SPIDER_MINES: inspect.cleandoc(""" + Allows Siege Tanks to lay Spider Mines. + Lays 3 Spider Mines at once. 3 charges. + """), + item_names.SIEGE_TANK_SMART_SERVOS: SMART_SERVOS_DESCRIPTION, + item_names.SIEGE_TANK_GRADUATING_RANGE: inspect.cleandoc(""" + Increases the Siege Tank's attack range by 1 every 3 seconds while in Siege Mode, + up to a maximum of 5 additional range. + """), + item_names.SIEGE_TANK_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.SIEGE_TANK_ADVANCED_SIEGE_TECH: "Siege Tanks gain +3 armor in Siege Mode.", + item_names.SIEGE_TANK_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Siege Tanks", "Factory"), + item_names.PREDATOR_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.PREDATOR), + item_names.MEDIVAC_EXPANDED_HULL: "Increases Medivac cargo space by 4.", + item_names.MEDIVAC_AFTERBURNERS: "Ability. Temporarily increases the Medivac's movement speed by 70%.", + item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY: inspect.cleandoc(""" + Burst Lasers do more damage and can hit both ground and air targets. + Replaces Gemini Missiles weapon. + """), + item_names.VIKING_SMART_SERVOS: SMART_SERVOS_DESCRIPTION, + item_names.VIKING_ANTI_MECHANICAL_MUNITION: "Increases Viking damage to mechanical units while in Assault Mode.", + item_names.DIAMONDBACK_MAGLEV_PROPULSION: "Increases Diamondback movement speed.", + item_names.WARHOUND_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.WARHOUND), + item_names.WARHOUND_AXIOM_PLATING: "Increases Warhound armor by 2.", + item_names.WARHOUND_DEPLOY_TURRET: "Each Warhound can deploy a single-use Auto-Turret.", + item_names.HERC_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.HERC), + item_names.HERC_JUGGERNAUT_PLATING: "Increases HERC armor by 2.", + item_names.HERC_KINETIC_FOAM: "Increases HERC life by 50.", + item_names.REAPER_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.REAPER), + item_names.REAPER_BALLISTIC_FLIGHTSUIT: "Increases Reaper life by 10.", + item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK: inspect.cleandoc(""" + Level 1: Allows Siege Tanks to be transported in Siege Mode. + Level 2: Siege Tanks in Siege Mode can attack air units while transported by a Medivac. + """), + item_names.SIEGE_TANK_ALLTERRAIN_TREADS: "Increases movement speed of Siege Tanks in Tank Mode.", + item_names.MEDIVAC_RAPID_REIGNITION_SYSTEMS: inspect.cleandoc(""" + Slightly increases Medivac movement speed. + Reduces Medivac's Afterburners ability cooldown. + """), + item_names.BATTLECRUISER_BEHEMOTH_REACTOR: "All Battlecruiser spells require 25 less energy to cast.", + item_names.THOR_RAPID_RELOAD: "Increases Thor's ground attack speed.", + item_names.LIBERATOR_GUERILLA_MISSILES: "Liberators in Fighter Mode apply an attack and movement debuff to enemies they attack.", + item_names.WIDOW_MINE_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.WIDOW_MINE), + item_names.HERC_GRAPPLE_PULL: "Allows HERCs to use their grappling gun to pull a ground unit towards the HERC.", + item_names.COMMAND_CENTER_SCANNER_SWEEP: "Temporarily reveals an area of the map, detecting cloaked and burrowed units.", + item_names.COMMAND_CENTER_MULE: "Summons a unit that gathers minerals more quickly than regular SCVs. Has timed life.", + item_names.COMMAND_CENTER_EXTRA_SUPPLIES: "Drops additional supplies, permanently increasing the supply output of the target Supply Depot by 8.", + item_names.HELLION_TWIN_LINKED_FLAMETHROWER: "Doubles the width of the Hellion's flame attack.", + item_names.HELLION_THERMITE_FILAMENTS: "Hellions do an additional 10 damage to Light Armor.", + item_names.SPIDER_MINE_CERBERUS_MINE: "Increases trigger and blast radius of Spider Mines.", + item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE: inspect.cleandoc(""" + Level 1: Allows Vultures to replace used Spider Mines. Costs 15 minerals. + Level 2: Replacing used Spider Mines no longer costs minerals. + """), + item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM: "Goliaths can attack both ground and air targets simultaneously.", + item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM: "Increases Goliath ground attack range by 1 and air by 3.", + item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL: inspect.cleandoc(""" + Level 1: Tri-Lithium Power Cell: Increases Diamondback attack range by 1. + Level 2: Tungsten Spikes: Increases Diamondback attack range by 3. + """), + item_names.DIAMONDBACK_SHAPED_HULL: "Increases Diamondback life by 50.", + item_names.SIEGE_TANK_MAELSTROM_ROUNDS: "Siege Tanks do an additional 40 damage to the primary target in Siege Mode.", + item_names.SIEGE_TANK_SHAPED_BLAST: "Reduces splash damage to friendly targets while in Siege Mode by 75%.", + item_names.MEDIVAC_RAPID_DEPLOYMENT_TUBE: "Medivacs deploy loaded troops almost instantly.", + item_names.MEDIVAC_ADVANCED_HEALING_AI: "Medivacs can heal two targets at once.", + item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS: inspect.cleandoc(""" + Level 1: Tomahawk Power Cells: Increases Wraith starting energy by 100. + Level 2: Unregistered Cloaking Module: Wraiths do not require energy to cloak and remain cloaked. + """), + item_names.WRAITH_DISPLACEMENT_FIELD: "Wraiths evade 20% of incoming attacks while cloaked.", + item_names.VIKING_RIPWAVE_MISSILES: "Vikings do area damage while in Fighter Mode.", + item_names.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM: "Increases Viking attack range by 1 in Assault mode and 2 in Fighter mode.", + item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS: inspect.cleandoc(""" + Level 1: Banshees can remain cloaked twice as long. + Level 2: Banshees do not require energy to cloak and remain cloaked. + """), + item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY: "Banshees do area damage in a straight line.", + item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS: inspect.cleandoc(f""" + {_ability_desc('Battlecruisers', 'Missile Pods', 'deals damage to air units in a target area')} + Level 1: Deals 40 damage (+50 vs light). + Level 2: Deals 110 damage and costs -50 less energy. + """), + item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX: inspect.cleandoc(""" + Level 1: Spell. For 20 seconds the Battlecruiser gains a shield that can absorb up to 200 damage. + Level 2: Passive. Battlecruiser gets 200 shields. Can spend energy to fully recharge shields. + """), + item_names.GHOST_OCULAR_IMPLANTS: "Increases Ghost sight range by 3 and attack range by 2.", + item_names.GHOST_CRIUS_SUIT: "Cloak no longer requires energy to activate or maintain.", + item_names.SPECTRE_PSIONIC_LASH: "Spell. Deals 200 damage to a single target.", + item_names.SPECTRE_NYX_CLASS_CLOAKING_MODULE: "Cloak no longer requires energy to activate or maintain.", + item_names.THOR_330MM_BARRAGE_CANNON: inspect.cleandoc(""" + Improves 250mm Strike Cannons ability to deal area damage and stun units in a small area. + Can be also freely aimed on ground. + """), + item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL: inspect.cleandoc(""" + Level 1: Allows destroyed Thors to be reconstructed on the field. Costs Vespene Gas. + Level 2: Thors are automatically reconstructed after falling for free. + """), + item_names.LIBERATOR_ADVANCED_BALLISTICS: "Increases Liberator range by 3 in Defender Mode.", + item_names.LIBERATOR_RAID_ARTILLERY: "Allows Liberators to attack structures while in Defender Mode.", + item_names.WIDOW_MINE_DRILLING_CLAWS: "Allows Widow Mines to burrow and unburrow faster.", + item_names.WIDOW_MINE_CONCEALMENT: "Burrowed Widow Mines are no longer revealed when the Sentinel Missile is on cooldown.", + item_names.WIDOW_MINE_DEMOLITION_PAYLOAD: "Allows Widow Mines to attack and damage structures.", + item_names.MEDIVAC_ADVANCED_CLOAKING_FIELD: "Medivacs are permanently cloaked.", + item_names.WRAITH_TRIGGER_OVERRIDE: "Wraith attack speed increases by 10% with each attack, up to a maximum of 100%.", + item_names.WRAITH_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Wraiths", "Starport"), + item_names.WRAITH_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.WRAITH), + item_names.VIKING_SHREDDER_ROUNDS: "Attacks in Assault mode do line splash damage.", + item_names.VIKING_WILD_MISSILES: "Launches 5 rockets at the target unit. Each rocket does 25 (40 vs armored) damage.", + item_names.BANSHEE_SHAPED_HULL: "Increases Banshee life by 100.", + item_names.BANSHEE_ADVANCED_TARGETING_OPTICS: "Increases Banshee attack range by 2 while cloaked.", + item_names.BANSHEE_DISTORTION_BLASTERS: "Increases Banshee attack damage by 25% while cloaked.", + item_names.BANSHEE_ROCKET_BARRAGE: _ability_desc("Banshees", "Rocket Barrage", "deals 75 damage to enemy ground units in the target area"), + item_names.GHOST_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.GHOST), + item_names.GHOST_BARGAIN_BIN_PRICES: _get_resource_efficiency_desc(item_names.GHOST, op_re_cost_reduction), + item_names.SPECTRE_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SPECTRE), + item_names.SPECTRE_BARGAIN_BIN_PRICES: _get_resource_efficiency_desc(item_names.SPECTRE, op_re_cost_reduction), + item_names.THOR_BUTTON_WITH_A_SKULL_ON_IT: "Allows Thors to launch nukes.", + item_names.THOR_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.THOR_LARGE_SCALE_FIELD_CONSTRUCTION: "Allows Thors to be built by SCVs like a structure.", + item_names.RAVEN_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.RAVEN), + item_names.RAVEN_DURABLE_MATERIALS: "Extends timed life duration of Raven's summoned objects.", + item_names.SCIENCE_VESSEL_IMPROVED_NANO_REPAIR: "Nano-Repair no longer requires energy to use.", + item_names.SCIENCE_VESSEL_MAGELLAN_COMPUTATION_SYSTEMS: "Science Vessel can use Nano-Repair at two targets at once.", + item_names.CYCLONE_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.CYCLONE), + item_names.BANSHEE_HYPERFLIGHT_ROTORS: "Increases Banshee movement speed.", + item_names.BANSHEE_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.BANSHEE_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Banshees", "Starport"), + item_names.BATTLECRUISER_TACTICAL_JUMP: inspect.cleandoc(""" + Allows Battlecruisers to warp to a target location anywhere on the map. + """), + item_names.BATTLECRUISER_CLOAK: CLOAK_DESCRIPTION_TEMPLATE.format("Battlecruisers"), + item_names.BATTLECRUISER_ATX_LASER_BATTERY: inspect.cleandoc(""" + Battlecruisers can attack while moving, + do the same damage to both ground and air targets, and fire faster. + """), + item_names.BATTLECRUISER_OPTIMIZED_LOGISTICS: "Increases Battlecruiser training speed.", + item_names.BATTLECRUISER_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Battlecruisers", "Starport"), + item_names.GHOST_EMP_ROUNDS: inspect.cleandoc(""" + Spell. Does 100 damage to shields and drains all energy from units in the targeted area. + Cloaked units hit by EMP are revealed for a short time. + """), + item_names.GHOST_LOCKDOWN: "Spell. Stuns a target mechanical unit for a long time.", + item_names.SPECTRE_IMPALER_ROUNDS: "Spectres do additional damage to armored targets.", + item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD: inspect.cleandoc(f""" + Level 1: Allows Thors to transform in order to use an alternative air attack. + Level 2: {SMART_SERVOS_DESCRIPTION} + """), + item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE: "Spell. Deploys a drone that can heal biological or mechanical units.", + item_names.RAVEN_SPIDER_MINES: "Spell. Deploys 3 Spider Mines to a target location.", + item_names.RAVEN_RAILGUN_TURRET: inspect.cleandoc(""" + Spell. Allows Ravens to deploy an advanced Auto-Turret, that can attack enemy ground units in a straight line. + """), + item_names.RAVEN_HUNTER_SEEKER_WEAPON: "Allows Ravens to attack with a Hunter-Seeker weapon.", + item_names.RAVEN_INTERFERENCE_MATRIX: inspect.cleandoc(""" + Spell. Target enemy Mechanical or Psionic unit can't attack or use abilities for a short duration. + """), + item_names.RAVEN_ANTI_ARMOR_MISSILE: "Spell. Decreases target and nearby enemy units armor by 2.", + item_names.RAVEN_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Ravens", "Starport"), + item_names.SCIENCE_VESSEL_EMP_SHOCKWAVE: "Spell. Depletes all energy and shields of all units in a target area.", + item_names.SCIENCE_VESSEL_DEFENSIVE_MATRIX: inspect.cleandoc(""" + Spell. Provides a target unit with a defensive barrier that can absorb up to 250 damage. + """), + item_names.CYCLONE_TARGETING_OPTICS: "Increases Cyclone Lock On casting range and the range while Locked On.", + item_names.CYCLONE_RAPID_FIRE_LAUNCHERS: "The first 12 shots of Lock On are fired more quickly.", + item_names.LIBERATOR_CLOAK: CLOAK_DESCRIPTION_TEMPLATE.format("Liberators"), + item_names.LIBERATOR_LASER_TARGETING_SYSTEM: LASER_TARGETING_SYSTEMS_DESCRIPTION, + item_names.LIBERATOR_OPTIMIZED_LOGISTICS: "Increases Liberator training speed.", + item_names.WIDOW_MINE_BLACK_MARKET_LAUNCHERS: "Increases Widow Mine Sentinel Missile range.", + item_names.WIDOW_MINE_EXECUTIONER_MISSILES: inspect.cleandoc(""" + Reduces Sentinel Missile cooldown. + When killed, Widow Mines will launch several missiles at random enemy targets. + """), + item_names.VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS: "Valkyries fire 2 additional rockets each volley.", + item_names.VALKYRIE_SHAPED_HULL: "Increases Valkyrie life by 50.", + item_names.VALKYRIE_FLECHETTE_MISSILES: "Equips Valkyries with Air-to-Surface missiles to attack ground units.", + item_names.VALKYRIE_AFTERBURNERS: "Ability. Temporarily increases the Valkyries's movement speed by 70%.", + item_names.CYCLONE_INTERNAL_TECH_MODULE: INTERNAL_TECH_MODULE_DESCRIPTION_TEMPLATE.format("Cyclones", "Factory"), + item_names.LIBERATOR_SMART_SERVOS: SMART_SERVOS_DESCRIPTION, + item_names.LIBERATOR_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.LIBERATOR), + item_names.HERCULES_INTERNAL_FUSION_MODULE: "Hercules can be trained from a Starport without having a Fusion Core.", + item_names.HERCULES_TACTICAL_JUMP: inspect.cleandoc(""" + Allows Hercules to warp to a target location anywhere on the map. + """), + item_names.PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS: inspect.cleandoc(""" + Level 1: Lift Off - Planetary Fortress can lift off. + Level 2: Armament Stabilizers - Planetary Fortress can attack while lifted off. + """), + item_names.PLANETARY_FORTRESS_IBIKS_TRACKING_SCANNERS: "Planetary Fortress can attack air units.", + item_names.VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR: "Allows Valkyries to shoot air while moving.", + item_names.VALKYRIE_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.VALKYRIE), + item_names.PREDATOR_VESPENE_SYNTHESIS: "Gives 1 free Vespene per target hit with Lightning Field.", + item_names.PREDATOR_ADAPTIVE_DEFENSES: "Predators gain a shield that halves incoming ranged and splash damage while active.", + item_names.BATTLECRUISER_BEHEMOTH_PLATING: "Increases Battlecruiser armor by 2.", + item_names.BATTLECRUISER_MOIRAI_IMPULSE_DRIVE: "Increases Battlecruiser movement speed.", + item_names.PLANETARY_FORTRESS_ORBITAL_MODULE: inspect.cleandoc(""" + Allows Planetary Fortresses to use Scanner Sweep, MULE, and Extra Supplies if those abilities are owned. + """), + item_names.DEVASTATOR_TURRET_CONCUSSIVE_GRENADES: "Devastator Turrets slow enemies they hit. Does not stack with Marauder Concussive Shells.", + item_names.DEVASTATOR_TURRET_ANTI_ARMOR_MUNITIONS: "Increases Devastator Turret damage to armored targets by 10.", + item_names.DEVASTATOR_TURRET_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.DEVASTATOR_TURRET), + item_names.MISSILE_TURRET_RESOURCE_EFFICENCY: _get_resource_efficiency_desc(item_names.MISSILE_TURRET), + item_names.SENSOR_TOWER_ASSISTIVE_TARGETING: "Sensor Towers increase the attack range of defensive buildings in their direct sight range.", + item_names.SENSOR_TOWER_MUILTISPECTRUM_DOPPLER: "Sensor Towers gain +10 sight range and +5 radar range.", + item_names.SCIENCE_VESSEL_TACTICAL_JUMP: "Allows Science Vessels to warp to a target location anywhere on the map.", + item_names.LIBERATOR_UED_MISSILE_TECHNOLOGY: "Increases Liberator attack range in Fighter mode by 4.", + item_names.BATTLECRUISER_FIELD_ASSIST_TARGETING_SYSTEM: "Battlecruisers increase the attack range of nearby friendly ground units by 1.", + item_names.VIKING_AESIR_TURBINES: "Increases Viking movement speed by 55%.", + item_names.MEDIVAC_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.MEDIVAC), + item_names.EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES: "Tactical Missile Strikes no longer need to be channeled.", + item_names.DOMINION_TROOPER_B2_HIGH_CAL_LMG: "Allows the Troopers to arm with a more powerful weapon, effective against all unit types.", + item_names.DOMINION_TROOPER_HAILSTORM_LAUNCHER: "Allows the Troopers to arm with a more powerful weapon, especially effective against armored air units.", + item_names.DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER: "Allows the Troopers to arm with a more powerful weapon, especially effective against light ground units.", + item_names.DOMINION_TROOPER_ADVANCED_ALLOYS: "Trooper weapons cost 20 fewer gas and now last for 5 minutes when dropped on death.", + item_names.DOMINION_TROOPER_OPTIMIZED_LOGISTICS: "Increases Dominion Trooper training speed.", + item_names.BUNKER: "Defensive structure. Able to load infantry units, giving them +1 range to their attacks.", + item_names.MISSILE_TURRET: "Anti-air defensive structure.", + item_names.SENSOR_TOWER: "Reveals locations of enemy units at long range.", + item_names.WAR_PIGS: "Mercenary Marines.", + item_names.DEVIL_DOGS: "Mercenary Firebats.", + item_names.HAMMER_SECURITIES: "Mercenary Marauders.", + item_names.SPARTAN_COMPANY: "Mercenary Goliaths.", + item_names.SIEGE_BREAKERS: "Mercenary Siege Tanks.", + item_names.HELS_ANGELS: "Mercenary Vikings.", + item_names.DUSK_WINGS: "Mercenary Banshees.", + item_names.JACKSONS_REVENGE: "Mercenary Battlecruiser.", + item_names.SKIBIS_ANGELS: "Mercenary Medics.", + item_names.DEATH_HEADS: "Mercenary Reapers.", + item_names.WINGED_NIGHTMARES: "Mercenary Wraiths.", + item_names.MIDNIGHT_RIDERS: "Mercenary Liberators.", + item_names.BRYNHILDS: "Mercenary Valkyries.", + item_names.JOTUN: "Mercenary Thor.", + item_names.ULTRA_CAPACITORS: "Increases attack speed of units by 5% per weapon upgrade.", + item_names.VANADIUM_PLATING: "Increases the life of units by 5% per armor upgrade.", + item_names.ORBITAL_DEPOTS: "Supply depots are built instantly.", + item_names.MICRO_FILTERING: "Refineries produce Vespene gas 25% faster.", + item_names.AUTOMATED_REFINERY: "Eliminates the need for SCVs in vespene gas production.", + item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR: "Command Centers can train two SCVs at once.", + item_names.RAVEN: "Aerial Caster unit.", + item_names.SCIENCE_VESSEL: "Aerial Caster unit. Can repair mechanical units.", + item_names.TECH_REACTOR: "Merges Tech Labs and Reactors into one add on structure to provide both functions.", + item_names.ORBITAL_STRIKE: "Trained units from Barracks are instantly deployed on rally point.", + item_names.BUNKER_SHRIKE_TURRET: "Adds an automated turret to Bunkers.", + item_names.BUNKER_FORTIFIED_BUNKER: "Bunkers have more life.", + item_names.PLANETARY_FORTRESS: inspect.cleandoc(""" + Allows Command Centers to upgrade into a defensive structure with a turret and additional armor. + Planetary Fortresses cannot Lift Off, or cast Orbital Command spells. + """), + item_names.PERDITION_TURRET: "Automated defensive turret. Burrows down while no enemies are nearby.", + item_names.PREDATOR: "Anti-infantry specialist that deals area damage with each attack.", + item_names.HERCULES: "Massive transport ship.", + item_names.CELLULAR_REACTOR: "All Terran spellcasters get +100 starting and maximum energy.", + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: inspect.cleandoc(""" + Allows Terran mechanical units to regenerate health while not in combat. + Each level increases life regeneration speed. + """), + item_names.HIVE_MIND_EMULATOR: "Unlocks the Hive Mind Emulator defensive structure, and allows it to permanently Mind Control Zerg units.", + item_names.ARGUS_AMPLIFIER: "Unlocks the Hive Mind Emulator defensive structure, and allows it to permanently Mind Control Protoss units.", + item_names.PSI_INDOCTRINATOR: "Unlocks the Hive Mind Emulator defensive structure, and allows it to permanently Mind Control Terran units.", + item_names.PSI_DISRUPTER: "Unlocks the Psi Disrupter defensive structure, and allows it to slow the attack and movement speeds of all nearby Zerg units.", + item_names.PSI_SCREEN: "Unlocks the Psi Disrupter defensive structure, and allows it to slow the attack and movement speeds of all nearby Protoss units.", + item_names.SONIC_DISRUPTER: "Unlocks the Psi Disrupter defensive structure, and allows it to slow the attack and movement speeds of all nearby Terran units.", + item_names.DEVASTATOR_TURRET: "Defensive structure. Deals increased damage to armored targets. Attacks ground units.", + item_names.STRUCTURE_ARMOR: "Increases armor of all Terran structures by 2.", + item_names.HI_SEC_AUTO_TRACKING: "Increases attack range of all Terran structures by 1.", + item_names.ADVANCED_OPTICS: "Increases attack range of all Terran mechanical units by 1.", + item_names.ROGUE_FORCES: "Terran Mercenary calldowns are no longer limited by charges.", + item_names.MECHANICAL_KNOW_HOW: "Increases mechanical unit life by 20%.", + item_names.MERCENARY_MUNITIONS: "Increases attack speed of all Terran combat units by 15%.", + item_names.PROGRESSIVE_FAST_DELIVERY: "At level 1, you can request one Mercenary unit immediately at the start of a mission. Level 2 allows you to calldown 3 Mercenary units immediately.", + item_names.RAPID_REINFORCEMENT: "Reduces cooldowns of all Terran Mercenary calldowns by 60s.", + item_names.SIGNAL_BEACON: "Terran Mercenary Calldowns are instantly deployed on rally point.", + item_names.FUSION_CORE_FUSION_REACTOR: "Fusion Cores increase the energy regeneration of nearby units by +1 energy per second.", + item_names.ZEALOT: "Powerful melee warrior. Can use the charge ability.", + item_names.STALKER: "Ranged attack strider. Can use the Blink ability.", + item_names.HIGH_TEMPLAR: "Potent psionic master. Can use the Feedback and Psionic Storm abilities. Can merge into an Archon.", + item_names.DARK_TEMPLAR: "Deadly warrior-assassin. Permanently cloaked. Can use the Shadow Fury ability.", + item_names.IMMORTAL: "Assault strider. Can use Barrier to absorb damage.", + item_names.COLOSSUS: "Battle strider with a powerful area attack. Can walk up and down cliffs. Attacks set fire to the ground, dealing extra damage to enemies over time.", + item_names.PHOENIX: "Air superiority starfighter. Can use Graviton Beam and Phasing Armor abilities.", + item_names.VOID_RAY: "Surgical strike craft. Has the Prismatic Alignment and Prismatic Range abilities.", + item_names.CARRIER: "Capital ship. Builds and launches Interceptors that attack enemy targets. Repair Drones heal nearby mechanical units.", + item_names.STARTING_MINERALS: "Increases the starting minerals for all missions.", + item_names.STARTING_VESPENE: "Increases the starting vespene for all missions.", + item_names.STARTING_SUPPLY: "Increases the starting supply for all missions.", + item_names.NOTHING: "Does nothing. Used to remove a location from the game.", + item_names.MAX_SUPPLY: "Increases the maximum supply cap for all missions.", + item_names.REDUCED_MAX_SUPPLY: "Trap Item. Decreases the maximum supply cap for all missions.", + item_names.SHIELD_REGENERATION: "Increases shield regeneration of all own units.", + item_names.BUILDING_CONSTRUCTION_SPEED: "Increases building construction speed.", + item_names.UPGRADE_RESEARCH_SPEED: "Increases weapon and armor research speed.", + item_names.UPGRADE_RESEARCH_COST: "Decreases weapon and armor upgrade research cost.", + item_names.NOVA_GHOST_VISOR: "Reveals the locations of enemy units in the fog of war around Nova. Can detect cloaked units.", + item_names.NOVA_RANGEFINDER_OCULUS: "Increases Nova's vision range and non-melee weapon attack range by 2. Also increases range of melee weapons by 1.", + item_names.NOVA_DOMINATION: "Gives Nova the ability to mind-control a target enemy unit.", + item_names.NOVA_BLINK: "Gives Nova the ability to teleport a short distance and cloak for 10s.", + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE: inspect.cleandoc(""" + Level 1: Gives Nova the ability to cloak. + Level 2: Nova is permanently cloaked. + """), + item_names.NOVA_ENERGY_SUIT_MODULE: "Increases Nova's maximum energy and energy regeneration rate.", + item_names.NOVA_ARMORED_SUIT_MODULE: "Increases Nova's health by 100 and armor by 1. Nova also regenerates life quickly out of combat.", + item_names.NOVA_JUMP_SUIT_MODULE: "Increases Nova's movement speed and allows her to jump up and down cliffs.", + item_names.NOVA_C20A_CANISTER_RIFLE: "Allows Nova to equip the C20A Canister Rifle, which has a ranged attack and allows Nova to cast Snipe.", + item_names.NOVA_HELLFIRE_SHOTGUN: "Allows Nova to equip the Hellfire Shotgun, which has a short-range area attack in a cone and allows Nova to cast Penetrating Blast.", + item_names.NOVA_PLASMA_RIFLE: "Allows Nova to equip the Plasma Rifle, which has a rapidfire ranged attack and allows Nova to cast Plasma Shot.", + item_names.NOVA_MONOMOLECULAR_BLADE: "Allows Nova to equip the Monomolecular Blade, which has a melee attack and allows Nova to cast Dash Attack.", + item_names.NOVA_BLAZEFIRE_GUNBLADE: "Allows Nova to equip the Blazefire Gunblade, which has a melee attack and allows Nova to cast Fury of One.", + item_names.NOVA_STIM_INFUSION: "Gives Nova the ability to heal herself and temporarily increase her movement and attack speeds.", + item_names.NOVA_PULSE_GRENADES: "Gives Nova the ability to throw a grenade dealing large damage in an area.", + item_names.NOVA_FLASHBANG_GRENADES: "Gives Nova the ability to throw a grenade to stun enemies and disable detection in a large area.", + item_names.NOVA_IONIC_FORCE_FIELD: "Gives Nova the ability to shield herself temporarily.", + item_names.NOVA_HOLO_DECOY: "Gives Nova the ability to summon a decoy unit which enemies will prefer to target and takes reduced damage.", + item_names.NOVA_NUKE: "Gives Nova the ability to launch tactical nukes built from the Shadow Ops.", + item_names.ZERGLING: "Fast inexpensive melee attacker. Hatches in pairs from a single larva. Can morph into a Baneling.", + item_names.SWARM_QUEEN: "Ranged support caster. Can use the Spawn Creep Tumor and Rapid Transfusion abilities.", + item_names.ROACH: "Durable short ranged attacker. Regenerates life quickly when burrowed.", + item_names.HYDRALISK: "High-damage generalist ranged attacker.", + item_names.ZERGLING_BANELING_ASPECT: "Anti-ground suicide unit. Does damage over a small area on death. Morphed from the Zergling.", + item_names.ABERRATION: "Durable melee attacker that deals heavy damage and can walk over other units.", + item_names.MUTALISK: "Fragile flying attacker. Attacks bounce between targets.", + item_names.SWARM_HOST: "Siege unit that attacks by rooting in place and continually spawning Locusts.", + item_names.INFESTOR: "Support caster that can move while burrowed. Can use the Fungal Growth, Parasitic Domination, and Consumption abilities.", + item_names.ULTRALISK: "Massive melee attacker. Has an area-damage cleave attack.", + item_names.PYGALISK: "Miniature melee attacker.", + item_names.SPORE_CRAWLER: "Anti-air defensive structure. Detects cloaked units and can uproot.", + item_names.SPINE_CRAWLER: "Anti-ground defensive structure. Can uproot to reposition itself.", + item_names.BILE_LAUNCHER: "Long-range anti-ground bombardment structure.", + item_names.CORRUPTOR: "Anti-air flying attacker specializing in taking down enemy capital ships.", + item_names.SCOURGE: "Flying anti-air suicide unit. Hatches in pairs from a single larva.", + item_names.BROOD_QUEEN: "Flying support caster. Can cast the Ocular Symbiote and Spawn Broodlings abilities.", + item_names.DEFILER: "Support caster. Can use the Dark Swarm, Consume, and Plague abilities.", + item_names.INFESTED_MARINE: "General-purpose Infested infantry. Has a timed life of 90 seconds.", + item_names.INFESTED_BUNKER: "Defensive structure. Periodically spawns Infested infantry that fight from inside. Acts as a mobile ground transport while uprooted.", + item_names.INFESTED_MISSILE_TURRET: "Anti-air defensive structure. Detects cloaked units and can uproot.", + item_names.INFESTED_SIEGE_TANK: "Siege tank. Can uproot itself to provide mobile tank support.", + item_names.INFESTED_DIAMONDBACK: "Fast, high-damage attacker. Can attack while moving and can bring flying units to the ground.", + item_names.BULLFROG: "Grounded transport. Launches itself through the air, dealing damage and unloading cargo on impact.", + item_names.INFESTED_BANSHEE: "Tactical-strike aircraft. Can cloak and can be upgraded to burrow.", + item_names.INFESTED_LIBERATOR: "Anti-Air flying attacker. Attacks deal high area-damage.", + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK: GENERIC_UPGRADE_TEMPLATE.format("damage", ZERG, "melee ground units"), + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK: GENERIC_UPGRADE_TEMPLATE.format("damage", ZERG, "ranged ground units"), + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE: GENERIC_UPGRADE_TEMPLATE.format("armor", ZERG, "ground units"), + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK: GENERIC_UPGRADE_TEMPLATE.format("damage", ZERG, "flyers"), + item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE: GENERIC_UPGRADE_TEMPLATE.format("armor", ZERG, "flyers"), + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage", ZERG, "units"), + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("armor", ZERG, "units"), + item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", ZERG, "ground units"), + item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", ZERG, "flyers"), + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", ZERG, "units"), + item_names.ZERGLING_HARDENED_CARAPACE: "Increases Zergling health by +10.", + item_names.ZERGLING_ADRENAL_OVERLOAD: "Increases Zergling attack speed.", + item_names.ZERGLING_METABOLIC_BOOST: "Increases Zergling movement speed.", + item_names.ROACH_HYDRIODIC_BILE: "Roaches deal +8 damage to light targets.", + item_names.ROACH_ADAPTIVE_PLATING: "Roaches gain +3 armor when their life is below 50%.", + item_names.ROACH_TUNNELING_CLAWS: "Allows Roaches to move while burrowed.", + item_names.HYDRALISK_FRENZY: "Allows Hydralisks to use the Frenzy ability, which increases their attack speed by 50%.", + item_names.HYDRALISK_ANCILLARY_CARAPACE: "Hydralisks gain +20 health.", + item_names.HYDRALISK_GROOVED_SPINES: "Hydralisks gain +1 range.", + item_names.BANELING_CORROSIVE_ACID: "Increases the damage banelings deal to their primary target. Splash damage remains the same.", + item_names.BANELING_RUPTURE: "Increases the splash radius of baneling attacks.", + item_names.BANELING_REGENERATIVE_ACID: "Banelings will heal nearby friendly units when they explode.", + item_names.MUTALISK_VICIOUS_GLAIVE: "Mutalisks attacks will bounce an additional 3 times.", + item_names.MUTALISK_RAPID_REGENERATION: "Mutalisks will regenerate quickly when out of combat.", + item_names.MUTALISK_SUNDERING_GLAIVE: "Mutalisks deal increased damage to their primary target.", + item_names.SWARM_HOST_BURROW: "Allows Swarm Hosts to burrow instead of root to spawn locusts.", + item_names.SWARM_HOST_RAPID_INCUBATION: "Swarm Hosts will spawn locusts 20% faster.", + item_names.SWARM_HOST_PRESSURIZED_GLANDS: "Allows Swarm Host Locusts to attack air targets.", + item_names.ULTRALISK_BURROW_CHARGE: "Allows Ultralisks to burrow and charge at enemy units, knocking back and stunning units when it emerges.", + item_names.ULTRALISK_TISSUE_ASSIMILATION: "Ultralisks recover health when they deal damage.", + item_names.ULTRALISK_MONARCH_BLADES: "Ultralisks gain increased splash damage.", + item_names.PYGALISK_STIM: _ability_desc("Pygalisks", "Stimpack", f"temporarily increases movement and attack speed at the cost of {STIMPACK_SMALL_COST} health"), + item_names.PYGALISK_DUCAL_BLADES: "Pygalisks do splash damage.", + item_names.PYGALISK_COMBAT_CARAPACE: "Increases Pygalisk health by +25.", + item_names.CORRUPTOR_CAUSTIC_SPRAY: "Allows Corruptors to use the Caustic Spray ability, which deals ramping damage to buildings over time.", + item_names.CORRUPTOR_CORRUPTION: "Allows Corruptors to use the Corruption ability, which causes a target enemy unit to take increased damage.", + item_names.SCOURGE_VIRULENT_SPORES: "Scourge will deal splash damage.", + item_names.SCOURGE_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SCOURGE), + item_names.SCOURGE_SWARM_SCOURGE: "An extra Scourge will be built from each egg at no additional cost.", + item_names.ZERGLING_SHREDDING_CLAWS: "Zergling attacks will temporarily reduce their target's armor to 0.", + item_names.ROACH_GLIAL_RECONSTITUTION: "Increases Roach movement speed.", + item_names.ROACH_ORGANIC_CARAPACE: "Increases Roach health by +25.", + item_names.HYDRALISK_MUSCULAR_AUGMENTS: "Increases Hydralisk movement speed.", + item_names.HYDRALISK_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.HYDRALISK), + item_names.BANELING_CENTRIFUGAL_HOOKS: "Increases the movement speed of Banelings.", + item_names.BANELING_TUNNELING_JAWS: "Allows Banelings to move while burrowed.", + item_names.BANELING_RAPID_METAMORPH: "Banelings morph faster and no longer cost vespene gas to morph.", + item_names.MUTALISK_SEVERING_GLAIVE: "Mutalisk bounce attacks will deal full damage.", + item_names.MUTALISK_AERODYNAMIC_GLAIVE_SHAPE: "Increases the attack range of Mutalisks by 2.", + item_names.SWARM_HOST_LOCUST_METABOLIC_BOOST: "Increases Locust movement speed.", + item_names.SWARM_HOST_ENDURING_LOCUSTS: "Increases the duration of Swarm Hosts' Locusts by 10s.", + item_names.SWARM_HOST_ORGANIC_CARAPACE: "Increases Swarm Host health by +40.", + item_names.SWARM_HOST_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SWARM_HOST), + item_names.ULTRALISK_ANABOLIC_SYNTHESIS: "Ultralisks gain increased movement speed.", + item_names.ULTRALISK_CHITINOUS_PLATING: "Ultralisks gain +2 armor.", + item_names.ULTRALISK_ORGANIC_CARAPACE: "Ultralisks gain +100 life.", + item_names.ULTRALISK_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.ULTRALISK), + item_names.DEVOURER_CORROSIVE_SPRAY: "Devourer attacks will now deal area damage.", + item_names.DEVOURER_GAPING_MAW: "Devourer's attack speed increased by 25%.", + item_names.DEVOURER_IMPROVED_OSMOSIS: "Devourer's Acid Spores duration increased by 50%.", + item_names.DEVOURER_PRESCIENT_SPORES: "Allows Devourers to attack ground targets.", + item_names.GUARDIAN_PROLONGED_DISPERSION: "Guardians gain +3 range.", + item_names.GUARDIAN_PRIMAL_ADAPTATION: "Allows Guardians to attack air units with a decreased attack damage.", + item_names.GUARDIAN_SORONAN_ACID: "Guardians deal +10 increased base damage to ground targets.", + item_names.GUARDIAN_PROPELLANT_SACS: "Guardians gain increased movement speed.", + item_names.GUARDIAN_EXPLOSIVE_SPORES: "Allows Guardians to launch an explosive spore at ground targets, dealing damage and knocking them back in an area.", + item_names.GUARDIAN_PRIMORDIAL_FURY: "Guardians gain increasing attack speed as they attack.", + item_names.IMPALER_ADAPTIVE_TALONS: "Impalers burrow faster.", + item_names.IMPALER_SECRETION_GLANDS: "Impalers generate creep while standing still or burrowed.", + item_names.IMPALER_SUNKEN_SPINES: "Impalers deal increased damage.", + item_names.LURKER_SEISMIC_SPINES: "Lurkers gain +6 range.", + item_names.LURKER_ADAPTED_SPINES: "Lurkers deal increased damage to non-light targets.", + item_names.RAVAGER_POTENT_BILE: "Ravager Corrosive Bile deals an additional +40 damage.", + item_names.RAVAGER_BLOATED_BILE_DUCTS: "Ravager Corrosive Bile hits a much larger area.", + item_names.RAVAGER_DEEP_TUNNEL: _ability_desc("Ravagers", "Deep Tunnel", "allows them to burrow to any visible location on the map"), + item_names.VIPER_PARASITIC_BOMB: _ability_desc("Vipers", "Parasitic Bomb", "inflicts an area-damaging effect on an enemy air unit"), + item_names.VIPER_PARALYTIC_BARBS: "Viper Abduct stuns units for an additional 5 seconds.", + item_names.VIPER_VIRULENT_MICROBES: "All Viper abilities gain +4 range.", + item_names.BROOD_LORD_POROUS_CARTILAGE: "Brood Lords gain increased movement speed.", + item_names.BROOD_LORD_BEHEMOTH_STELLARSKIN: "Brood Lords gain +100 life and +1 armor.", + item_names.BROOD_LORD_SPLITTER_MITOSIS: "Brood Lord attacks spawn twice as many broodlings.", + item_names.BROOD_LORD_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(DISPLAY_NAME_BROOD_LORD), + item_names.INFESTOR_INFESTED_TERRAN: _ability_desc("Infestors", "Spawn Infested Terran"), + item_names.INFESTOR_MICROBIAL_SHROUD: _ability_desc("Infestors", "Microbial Shroud", "reduces incoming damage from air units in an area"), + item_names.SPORE_CRAWLER_BIO_BONUS: "Spore Crawler gain +30 bonus damage against biological units.", + item_names.SWARM_QUEEN_SPAWN_LARVAE: _ability_desc("Swarm Queens", "Spawn Larvae"), + item_names.SWARM_QUEEN_DEEP_TUNNEL: _ability_desc("Swarm Queens", "Deep Tunnel"), + item_names.SWARM_QUEEN_ORGANIC_CARAPACE: "Swarm Queens gain +25 life.", + item_names.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION: "Swarm Queen Burst Heal heals an additional +10 life and can now target mechanical units.", + item_names.SWARM_QUEEN_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_INCUBATOR_CHAMBER: "Swarm Queens may now be built two at a time from the Hatchery, Lair, or Hive.", + item_names.BROOD_QUEEN_FUNGAL_GROWTH: _ability_desc("Brood Queens", "Fungal Growth"), + item_names.BROOD_QUEEN_ENSNARE: _ability_desc("Brood Queens", "Ensnare"), + item_names.BROOD_QUEEN_ENHANCED_MITOCHONDRIA: "Brood Queens start with maximum energy and gain increased energy regeneration. Like powerhouses (of the cell).", + item_names.DEFILER_PATHOGEN_PROJECTORS: "Defilers gain +4 cast range for Dark Swarm and Plague.", + item_names.DEFILER_TRAPDOOR_ADAPTATION: "Defilers can now use abilities while burrowed.", + item_names.DEFILER_PREDATORY_CONSUMPTION: "Defilers can now use Consume on any non-heroic biological unit, not just friendly Zerg.", + item_names.DEFILER_COMORBIDITY: "Plague now stacks up to three times, and depletes energy as well as health.", + item_names.ABERRATION_MONSTROUS_RESILIENCE: "Aberrations gain +140 life.", + item_names.ABERRATION_CONSTRUCT_REGENERATION: "Aberrations gain increased life regeneration.", + item_names.ABERRATION_PROTECTIVE_COVER: "Aberrations grant damage reduction to allied units directly beneath them.", + item_names.ABERRATION_BANELING_INCUBATION: "Aberrations spawn 2 Banelings upon death.", + item_names.ABERRATION_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.ABERRATION), + item_names.ABERRATION_PROGRESSIVE_BANELING_LAUNCH: inspect.cleandoc(""" + Level 1: Allows Aberrations to periodically throw generated Banelings at air targets. + Level 2: Can store up to 3 Banelings. Can consume Banelings to recharge faster. Thrown Banelings benefit from Baneling upgrades. + """), + item_names.CORRUPTOR_MONSTROUS_RESILIENCE: "Corruptors gain +100 life.", + item_names.CORRUPTOR_CONSTRUCT_REGENERATION: "Corruptors gain increased life regeneration.", + item_names.CORRUPTOR_SCOURGE_INCUBATION: "Corruptors spawn 2 Scourge upon death (3 with Swarm Scourge).", + item_names.CORRUPTOR_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.CORRUPTOR), + item_names.PRIMAL_IGNITER_CONCENTRATED_FIRE: "Primal Igniters deal +15 damage vs light armor.", + item_names.PRIMAL_IGNITER_PRIMAL_TENACITY: "Primal Igniters gain +100 health and +1 armor.", + item_names.INFESTED_SCV_BUILD_CHARGES: "Starting Infested SCV charges increased to 3. Maximum charges increased to 5.", + item_names.INFESTED_MARINE_PLAGUED_MUNITIONS: "Infested Marines deal an extra 50 damage over 15 seconds to targets they attack.", + item_names.INFESTED_MARINE_RETINAL_AUGMENTATION: "Infested Marines gain +1 range.", + item_names.INFESTED_BUNKER_CALCIFIED_ARMOR: "Infested Bunkers gain +3 armor.", + item_names.INFESTED_BUNKER_REGENERATIVE_PLATING: "Infested Bunkers gain increased life regeneration while rooted.", + item_names.INFESTED_BUNKER_ENGORGED_BUNKERS: "Infested Bunkers gain +2 cargo slots. Infested Trooper spawn cooldown is reduced by 20%.", + item_names.INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD: "Increases anti-mechanical damage of Infested Missile Turrets by +6 per missile.", + item_names.INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS: "Infested Missile Turrets gain a secondary weapon that applies Devourer Acid Spores in an area around the target.", + item_names.TYRANNOZOR_TYRANTS_PROTECTION: "Tyrannozors grant nearby friendly units 1 armor.", + item_names.TYRANNOZOR_BARRAGE_OF_SPIKES: _ability_desc("Tyrannozors", "Barrage of Spikes", "deals 60 damage to enemy ground units around the Tyrannozor"), + item_names.TYRANNOZOR_IMPALING_STRIKE: "Tyrannozor melee attacks have a 20% chance to stun for 2 seconds.", + item_names.TYRANNOZOR_HEALING_ADAPTATION: "Tyrannozors regenerate life quickly when out of combat.", + item_names.BILE_LAUNCHER_ARTILLERY_DUCTS: "Increases Bile Launcher range by +8.", + item_names.BILE_LAUNCHER_RAPID_BOMBARMENT: "Bile Launchers attack 40% faster.", + item_names.NYDUS_WORM_ECHIDNA_WORM_SUBTERRANEAN_SCALES: f"Increases {DISPLAY_NAME_WORMS} maximum health by 250 and armor by 1.", + item_names.NYDUS_WORM_ECHIDNA_WORM_JORMUNGANDR_STRAIN: f"Removes emerge time for {DISPLAY_NAME_WORMS}, and allows them to be salvaged to return the resources spent on them.", + item_names.NYDUS_WORM_RAVENOUS_APPETITE: "Allows Nydus Worms to unload and load units nearly instantly.", + item_names.NYDUS_WORM_ECHIDNA_WORM_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(DISPLAY_NAME_WORMS), + item_names.ECHIDNA_WORM_OUROBOROS_STRAIN: "Allows Echidna Worms to train a limited assortment of combat units (Zerglings, Roaches, Hydralisks, and Aberrations) at a reduced time and cost.", + item_names.INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS: inspect.cleandoc(""" + Level 1: Infested Siege Tanks generate 1 Volatile Biomass every 30 seconds. + Level 2: Infested Siege Tanks generate 1 Volatile Biomass every 10 seconds. + """), + item_names.INFESTED_SIEGE_TANK_ACIDIC_ENZYMES: "Infested Siege Tanks deal an additional 15 damage to armored units and structures in both modes.", + item_names.INFESTED_SIEGE_TANK_DEEP_TUNNEL: _ability_desc("Infested Siege Tanks", "Deep Tunnel", "allows them to burrow to any visible location on the map covered in creep"), + item_names.INFESTED_SIEGE_TANK_SEISMIC_SONAR: "Infested Siege Tank Tentacle weapon gains +1 range. Volatile Burst weapon gains +3 range.", + item_names.INFESTED_SIEGE_TANK_BALANCED_ROOTS: "Allows Infested Siege Tanks to attack while moving with their Tentacle weapons.", + item_names.INFESTED_DIAMONDBACK_CAUSTIC_MUCUS: "Infested Diamondbacks leave behind a trail of acid when moving that deals 12 damage per second to enemy units.", + item_names.INFESTED_DIAMONDBACK_VIOLENT_ENZYMES: "Infested Diamondbacks deal an additional +8 damage.", + item_names.INFESTED_DIAMONDBACK_CONCENTRATED_SPEW: "Infested Diamondbacks gain +2 weapon range. Fungal Snare gains +2 range.", + item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE: inspect.cleandoc(""" + Level 1: Infested Diamondbacks gain the Fungal Snare ability, allowing them to temporarily ground flying units. + Level 2: Infested Diamondback Fungal Snare ability cooldown reduced by 15 seconds. + """), + item_names.BULLFROG_WILD_MUTATION: "Bullfrogs grant themselves and their cargo temporary health and an attack speed boost on impact.", + item_names.BULLFROG_RANGE: "Bullfrog leap gains +4 range, and unload-leap gains +6 range.", + item_names.BULLFROG_BROODLINGS: "Bullfrogs spawn two broodlings on impact, in addition to unloading their cargo.", + item_names.BULLFROG_HARD_IMPACT: "Bullfrogs deal more damage and stun longer on impact.", + item_names.INFESTED_BANSHEE_BRACED_EXOSKELETON: "Infested Banshees gain +100 life.", + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION: "Infested Banshees regenerate 20 life and energy per second while burrowed.", + item_names.INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS: "Infested Banshees gain +2 range while cloaked.", + item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL: "Infested Liberators instantly transform into a cloud of microscopic organisms while attacking, reducing the damage they take by 85%.", + item_names.INFESTED_LIBERATOR_VIRAL_CONTAMINATION: "Increases the damage Infested Liberators deal to their primary target by 100%.", + item_names.INFESTED_LIBERATOR_DEFENDER_MODE: "Allows Infested Liberators to deploy into Defender Mode to attack ground units. Weapon knocks back the attack target and damages units behind it.", + item_names.INFESTED_SIEGE_TANK_FRIGHTFUL_FLESHWELDER: _get_resource_efficiency_desc(item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_DIAMONDBACK_FRIGHTFUL_FLESHWELDER: _get_resource_efficiency_desc(item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_BANSHEE_FRIGHTFUL_FLESHWELDER: _get_resource_efficiency_desc(item_names.INFESTED_BANSHEE), + item_names.INFESTED_LIBERATOR_FRIGHTFUL_FLESHWELDER: _get_resource_efficiency_desc(item_names.INFESTED_LIBERATOR), + item_names.ZERG_EXCAVATING_CLAWS: "Increases movement speed of uprooted Zerg structures, especially off creep. Also increases root speed.", + item_names.HIVE_CLUSTER_MATURATION: "Lairs are replaced with Hives, and Hatcheries can now upgrade directly to Hives at the Lair's original cost.", + item_names.MACROSCOPIC_RECUPERATION: "Zerg structures regenerate health rapidly while on creep and out of combat. Does not apply to uprooted structures, or structures with the Mechanical tag.", + item_names.BIOMECHANICAL_STOCKPILING: "Infested Factories and Starports can store 3 additional unit charges.", + item_names.BROODLING_SPORE_SATURATION: "Zerg buildings release twice as many broodlings on death. Zerg defensive structures release 4 broodlings on death.", + item_names.UNRESTRICTED_MUTATION: "Zerg Mercenary units are no longer limited by charges.", + item_names.CELL_DIVISION: "Adds additional units to Zerg Mercenary calldowns.", + item_names.EVOLUTIONARY_LEAP: "Halves the initial cooldown for all Zerg Mercenaries.", + item_names.SELF_SUFFICIENT: "Zerg Mercenaries no longer use supply.", + item_names.ZERGLING_RAPTOR_STRAIN: "Allows Zerglings to jump up and down cliffs and leap onto enemies. Also increases Zergling attack damage by 2.", + item_names.ZERGLING_SWARMLING_STRAIN: "Zerglings will spawn instantly and with an extra Zergling per egg at no additional cost.", + item_names.ROACH_VILE_STRAIN: "Roach attacks will slow the movement and attack speed of enemies.", + item_names.ROACH_CORPSER_STRAIN: "Units killed after being attacked by Roaches will spawn 2 Roachlings.", + item_names.HYDRALISK_IMPALER_ASPECT: "Allows Hydralisks to morph into Impalers.", + item_names.HYDRALISK_LURKER_ASPECT: "Allows Hydralisks to morph into Lurkers.", + item_names.BANELING_SPLITTER_STRAIN: "Banelings will split into two smaller Splitterlings on exploding.", + item_names.BANELING_HUNTER_STRAIN: "Allows Banelings to jump up and down cliffs and leap onto enemies.", + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT: "Allows Mutalisks and Corruptors to morph into Brood Lords.", + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT: "Allows Mutalisks and Corruptors to morph into Vipers.", + item_names.SWARM_HOST_CARRION_STRAIN: "Swarm Hosts will spawn Flying Locusts.", + item_names.SWARM_HOST_CREEPER_STRAIN: "Allows Swarm Hosts to teleport to any creep on the map in vision. Swarm Hosts will spread creep around them when rooted or burrowed.", + item_names.ULTRALISK_NOXIOUS_STRAIN: "Ultralisks will periodically spread poison, damaging nearby biological enemies.", + item_names.ULTRALISK_TORRASQUE_STRAIN: "Ultralisks will revive after being killed.", + item_names.KERRIGAN_KINETIC_BLAST: "Kerrigan deals 300 damage to target unit or structure from long range.", + item_names.KERRIGAN_HEROIC_FORTITUDE: "Kerrigan gains +200 maximum life and double life regeneration rate.", + item_names.KERRIGAN_LEAPING_STRIKE: "Kerrigan leaps to her target and deals 150 damage.", + item_names.KERRIGAN_CRUSHING_GRIP: "Kerrigan stuns enemies in a target area for 3 seconds and deals 30 damage over time. Heroic units are not stunned.", + item_names.KERRIGAN_CHAIN_REACTION: "Kerrigan's attacks deal normal damage to her target then jump to additional nearby enemies.", + item_names.KERRIGAN_PSIONIC_SHIFT: "Kerrigan dashes through enemies, dealing 50 damage to all enemies in her path.", + item_names.ZERGLING_RECONSTITUTION: "Killed Zerglings respawn from your primary Hatchery at no cost.", + item_names.OVERLORD_IMPROVED_OVERLORDS: "Overlords morph instantly and provide 50% more supply.", + item_names.AUTOMATED_EXTRACTORS: "Extractors automatically harvest Vespene Gas without the need for Drones.", + item_names.KERRIGAN_WILD_MUTATION: "Kerrigan gives all units in an area +200 max life and double attack speed for 10 seconds.", + item_names.KERRIGAN_SPAWN_BANELINGS: "Kerrigan spawns six Banelings with timed life.", + item_names.KERRIGAN_MEND: "Kerrigan heals for 150 life and heals nearby friendly units for 50 life. An additional +50% life is healed over 15 seconds.", + item_names.TWIN_DRONES: "Drones morph in groups of two at no additional cost and require less supply.", + item_names.MALIGNANT_CREEP: "Your units and structures gain increased life regeneration and 30% increased attack speed while on creep. Creep Tumors also spread creep faster and farther.", + item_names.VESPENE_EFFICIENCY: "Extractors produce Vespene gas 25% faster.", + item_names.ZERG_CREEP_STOMACH: "Zerg buildings no longer take damage off-creep. Defensive structures can now root off-creep.", + item_names.KERRIGAN_INFEST_BROODLINGS: "Enemies damaged by Kerrigan become infested and will spawn Broodlings with timed life if killed quickly.", + item_names.KERRIGAN_FURY: "Each of Kerrigan's attacks temporarily increase her attack speed by 15%. Can stack up to 75%.", + item_names.KERRIGAN_ABILITY_EFFICIENCY: "Kerrigan's abilities have their cooldown and energy cost reduced by 20%.", + item_names.KERRIGAN_APOCALYPSE: "Kerrigan deals 300 damage (+400 vs Structure) to enemies in a large area.", + item_names.KERRIGAN_SPAWN_LEVIATHAN: "Kerrigan summons a mighty flying Leviathan with timed life. Deals massive damage and has energy-based abilities.", + item_names.KERRIGAN_DROP_PODS: "Kerrigan drops Primal Zerg forces with timed life to the battlefield.", + item_names.KERRIGAN_PRIMAL_FORM: "Kerrigan takes on her Primal Zerg form and gains greatly increased energy regeneration.", + item_names.KERRIGAN_ASSIMILATION_AURA: "Causes all nearby enemies to drop resources when killed.", + item_names.KERRIGAN_IMMOBILIZATION_WAVE: "Deals 100 damage to enemies around a large area and stuns them for 10 seconds.", + item_names.KERRIGAN_LEVELS_10: "Gives Kerrigan +10 Levels.", + item_names.KERRIGAN_LEVELS_9: "Gives Kerrigan +9 Levels.", + item_names.KERRIGAN_LEVELS_8: "Gives Kerrigan +8 Levels.", + item_names.KERRIGAN_LEVELS_7: "Gives Kerrigan +7 Levels.", + item_names.KERRIGAN_LEVELS_6: "Gives Kerrigan +6 Levels.", + item_names.KERRIGAN_LEVELS_5: "Gives Kerrigan +5 Levels.", + item_names.KERRIGAN_LEVELS_4: "Gives Kerrigan +4 Levels.", + item_names.KERRIGAN_LEVELS_3: "Gives Kerrigan +3 Levels.", + item_names.KERRIGAN_LEVELS_2: "Gives Kerrigan +2 Levels.", + item_names.KERRIGAN_LEVELS_1: "Gives Kerrigan +1 Level.", + item_names.KERRIGAN_LEVELS_14: "Gives Kerrigan +14 Levels.", + item_names.KERRIGAN_LEVELS_35: "Gives Kerrigan +35 Levels.", + item_names.KERRIGAN_LEVELS_70: "Gives Kerrigan +70 Levels.", + item_names.INFESTED_MEDICS: "Mercenary infested Medics that may be called in from the Predator Nest.", + item_names.INFESTED_SIEGE_BREAKERS: "Mercenary infested Siege Breakers that may be called in from the Predator Nest.", + item_names.INFESTED_DUSK_WINGS: "Mercenary infested Dusk Wings that may be called in from the Predator Nest.", + item_names.HUNTER_KILLERS: "Elite Hydralisk strain. Summoned at the Predator Nest.", + item_names.DEVOURING_ONES: "Elite Zergling strain. Summoned at the Predator Nest.", + item_names.TORRASQUE_MERC: "Elite Ultralisk strain. Summoned at the Predator Nest.", + item_names.HUNTERLING: "Elite strain. Can jump up and down cliffs and stun enemies by jumping on them. Summoned at the Predator Nest.", + item_names.YGGDRASIL: "Elite Overlord strain that has the ability to transport buildings and ground units. Summoned at the Predator Nest.", + item_names.CAUSTIC_HORRORS: "Elite Roach Strain that has the ability to attack air units. Summoned at the Predator Nest.", + item_names.OVERLORD_VENTRAL_SACS: "Overlords gain the ability to transport ground units.", + item_names.OVERLORD_GENERATE_CREEP: "Overlords gain the ability to generate creep while standing still.", + item_names.OVERLORD_ANTENNAE: "Increases Overlord sight range.", + item_names.OVERLORD_PNEUMATIZED_CARAPACE: "Increases Overlord movement speed.", + item_names.OVERLORD_OVERSEER_ASPECT: "Allows Overlords to morph into Overseers. Overseers can use the Spawn Creep Tumor and Contaminate abilities.", + item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: "Long-range anti-ground flyer. Can attack ground units. Morphed from the Mutalisk or Corruptor.", + item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: "Anti-air flyer. Attack inflict Acid Spores. Can attack air units. Morphed from the Mutalisk or Corruptor.", + item_names.ROACH_RAVAGER_ASPECT: "Ranged artillery. Can use Corrosive Bile. Can attack ground units. Morphed from the Roach.", + item_names.ROACH_PRIMAL_IGNITER_ASPECT: "Assault unit. Has an area-damage attack. Regenerates life quickly when burrowed. Can attack ground units. Morphed by merging two Roaches.", + item_names.NYDUS_WORM: "Long-range transport network. Nydus Worms and Nydus Networks can load friendly ground units to be unloaded to any other Nydus structure on the map.", + item_names.ECHIDNA_WORM: "Long-range deployable base. Unable to load and unload units, but can generate Creep and Creep Tumors. Can also serve as a dropoff point for resources and can create Drones.", + item_names.ULTRALISK_TYRANNOZOR_ASPECT: "Heavy assault beast. Has a ground-area attack, and powerful anti-air attack. Morphed by merging two Ultralisks.", + item_names.OBSERVER: "Flying spy. Cloak renders the unit invisible to enemies without detection.", + item_names.CENTURION: "Powerful melee warrior. Has the Shadow Charge and Darkcoil abilities.", + item_names.SENTINEL: "Powerful melee warrior. Has the Charge and Reconstruction abilities.", + item_names.SUPPLICANT: "Powerful melee warrior. Has powerful damage-resistant shields.", + item_names.INSTIGATOR: "Ranged support strider. Can store multiple Blink charges.", + item_names.SLAYER: "Ranged attack strider. Can use the Phase Blink and Phasing Armor abilities.", + item_names.SENTRY: "Robotic support unit. Can use the Guardian Shield ability and can restore the shields of nearby Protoss units.", + item_names.ENERGIZER: "Robotic support unit. Can use the Chrono Beam ability and can become stationary to power nearby structures.", + item_names.HAVOC: "Robotic support unit. Can use the Target Lock and Force Field abilities and increases the range of nearby Protoss units.", + item_names.SIGNIFIER: "Potent permanently cloaked psionic master. Can use the Feedback and Crippling Psionic Storm abilities. Can merge into an Archon.", + item_names.ASCENDANT: "Potent psionic master. Can use the Psionic Orb, Mind Blast, and Sacrifice abilities.", + item_names.AVENGER: "Deadly warrior-assassin. Permanently cloaked. Recalls to the nearest Dark Shrine upon death.", + item_names.BLOOD_HUNTER: "Deadly warrior-assassin. Permanently cloaked. Can use the Void Stasis ability.", + item_names.DRAGOON: "Ranged assault strider. Has enhanced health and damage.", + item_names.DARK_ARCHON: "Potent psionic master. Can use the Confuse and Mind Control abilities.", + item_names.ADEPT: "Ranged specialist. Can use the Psionic Transfer ability.", + item_names.WARP_PRISM: "Flying transport. Can carry units and become stationary to deploy a power field.", + item_names.ANNIHILATOR: "Assault Strider. Can use the Shadow Cannon ability to damage air and ground units.", + item_names.STALWART: "Assault strider. Has shields that deflect high-damage attacks.", + item_names.VANGUARD: "Assault Strider. Deals splash damage around the primary target.", + item_names.WRATHWALKER: "Battle strider with a powerful single-target attack. Can walk up and down cliffs.", + item_names.REAVER: "Area damage siege unit. Builds and launches explosive Scarabs for high burst damage.", + item_names.DISRUPTOR: "Robotic disruption unit. Can use the Purification Nova ability to deal heavy area damage.", + item_names.MIRAGE: "Air superiority starfighter. Can use Graviton Beam and Phasing Armor abilities.", + item_names.SKIRMISHER: "Fast skirmish starfighter. Can target ground units.", + item_names.CORSAIR: "Air superiority starfighter. Can use the Disruption Web ability.", + item_names.DESTROYER: "Area assault craft. Can use the Destruction Beam ability to attack multiple units at once.", + item_names.PULSAR: "Support craft. Applies a stacking slow to targets.", + item_names.DAWNBRINGER: "Flying Anti-Surface Assault Ship. Attacks in an area around the target. Attack count increases as it continues firing.", + item_names.SCOUT: "Versatile high-speed fighter. Has a powerful anti-armored air attack and a weaker anti-ground attack.", + item_names.OPPRESSOR: "Tal'Darim Scout variant. Has a weaker air attack, but a stronger ground attack. Can use the Vulcan Blaster ability.", + item_names.CALADRIUS: "Purifier Scout variant. Has no ground attack, but a stronger air attack, which can be upgraded to hit multiple targets. Can use the Corona Beam ability.", + item_names.MISTWING: "Nerazim Scout variant. Specialized stealth fighter. Can use the Cloak, Phantom Dash and Pilot (Transport) abilities.", + item_names.TEMPEST: "Siege artillery craft. Attacks from long range. Can use the Disintegration ability.", + item_names.MOTHERSHIP: "Ultimate Protoss vessel. Can use the Vortex and Mass Recall abilities.", + item_names.ARBITER: "Army support craft. Has the Stasis Field and Recall abilities. Cloaks nearby units.", + item_names.ORACLE: "Flying caster. Can use the Revelation and Stasis Ward abilities.", + item_names.SKYLORD: "Capital ship. Fires a powerful laser that deals damage in a line. Can use Tactical Jump ability.", + item_names.TRIREME: "Capital ship. Builds and launches Bombers that attack enemy targets.", + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON: GENERIC_UPGRADE_TEMPLATE.format("damage", PROTOSS, "ground units"), + item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR: GENERIC_UPGRADE_TEMPLATE.format("armor", PROTOSS, "ground units"), + item_names.PROGRESSIVE_PROTOSS_SHIELDS: GENERIC_UPGRADE_TEMPLATE.format("shields", PROTOSS, "units"), + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON: GENERIC_UPGRADE_TEMPLATE.format("damage", PROTOSS, "starships"), + item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR: GENERIC_UPGRADE_TEMPLATE.format("armor", PROTOSS, "starships"), + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage", PROTOSS, "units"), + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("armor", PROTOSS, "units"), + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", PROTOSS, "ground units"), + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", PROTOSS, "starships"), + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: GENERIC_UPGRADE_TEMPLATE.format("damage and armor", PROTOSS, "units"), + item_names.PHOTON_CANNON: "Protoss defensive structure. Can attack ground and air units.", + item_names.KHAYDARIN_MONOLITH: "Advanced Protoss defensive structure. Has superior range and damage, but is very expensive and attacks slowly.", + item_names.SHIELD_BATTERY: "Protoss defensive structure. Restores shields to nearby friendly units and structures.", + item_names.SUPPLICANT_BLOOD_SHIELD: "Increases the armor value of Supplicant shields.", + item_names.SUPPLICANT_SOUL_AUGMENTATION: "Increases Supplicant max shields by +25.", + item_names.SUPPLICANT_ENDLESS_SERVITUDE: "Increases Supplicant shield regeneration rate.", + item_names.SUPPLICANT_ZENITH_PITCH: "Allows Supplicants to attack air units.", + item_names.ADEPT_SHOCKWAVE: "When Adepts deal a finishing blow, their projectiles can jump onto 2 additional targets.", + item_names.ADEPT_RESONATING_GLAIVES: "Increases Adept attack speed.", + item_names.ADEPT_PHASE_BULWARK: "Increases Adept shield maximum by +50.", + item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES: "Increases weapon damage of Stalkers, Instigators, and Slayers.", + item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION: "Attacks fired by Stalkers, Instigators, and Slayers have a chance to bounce to additional targets for reduced damage.", + item_names.INSTIGATOR_BLINK_OVERDRIVE: "Instigators gain +2 maximum blink charges and +1 blink range.", + item_names.INSTIGATOR_RECONSTRUCTION: "Instigators gain the Reconstruction ability, allowing them to be reconstructed on death with a 240 seconds cooldown. Using Blink reduces the cooldown.", + item_names.DRAGOON_CONCENTRATED_ANTIMATTER: "Dragoons deal increased damage.", + item_names.DRAGOON_TRILLIC_COMPRESSION_SYSTEM: "Dragoons gain +20 life and their shield regeneration rate is doubled. Allows Dragoons to regenerate shields in combat.", + item_names.DRAGOON_SINGULARITY_CHARGE: "Increases Dragoon range by +2.", + item_names.DRAGOON_ENHANCED_STRIDER_SERVOS: "Increases Dragoon movement speed.", + item_names.SCOUT_COMBAT_SENSOR_ARRAY: "All Scout variants gain increased range against air and ground.", + item_names.SCOUT_APIAL_SENSORS: "Scouts gain increased sight range.", + item_names.SCOUT_GRAVITIC_THRUSTERS: "All Scout variants gain increased movement speed.", + item_names.SCOUT_ADVANCED_PHOTON_BLASTERS: "Scouts, Oppressors and Mist Wings gain increased damage against ground targets.", + item_names.SCOUT_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.SCOUT), + item_names.SCOUT_SUPPLY_EFFICIENCY: _get_resource_efficiency_desc(item_names.SCOUT, op_re_cost_reduction), + item_names.OPPRESSOR_ACCELERATED_WARP: "Oppressors gain increased training and warp-in speed.", + item_names.OPPRESSOR_ARMOR_MELTING_BLASTERS: "Oppressor ground weapons gain bonus damage to armored targets. Allows Vulcan Blaster to hit structures.", + item_names.CALADRIUS_SIDE_MISSILES: "Caladrius can hit up to 4 additional air targets with their missiles.", + item_names.CALADRIUS_STRUCTURE_TARGETING: "Allows Caladrius to hit ground structures with their anti-air missiles.", + item_names.CALADRIUS_SOLARITE_REACTOR: "If the Caladrius is low on shields, it recovers shields quickly for a short time.", + item_names.MISTWING_NULL_SHROUD: "Cloak no longer drains energy (but still prevents base energy regeneration). The Mist Wing becomes undetectable for 5 seconds upon cloaking.", + item_names.MISTWING_PILOT: _ability_desc("Mistwings", "Pilot", "can transport one unit as an additional co-pilot. A pilot grants a small bonus to damage and armor"), + item_names.TEMPEST_TECTONIC_DESTABILIZERS: "Tempests deal increased damage to buildings.", + item_names.TEMPEST_QUANTIC_REACTOR: "Tempests deal increased damage to massive units.", + item_names.TEMPEST_GRAVITY_SLING: "Tempests gain +8 range against air targets and +8 cast range.", + item_names.TEMPEST_INTERPLANETARY_RANGE: "Tempests gain +8 weapon range against all targets.", + item_names.PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX: "Increases Phoenix, Mirage, and Skirmisher weapon damage by +2.", + item_names.PHOENIX_CLASS_ANION_PULSE_CRYSTALS: "Increases Phoenix, Mirage, and Skirmiser range by +2.", + item_names.CORSAIR_STEALTH_DRIVE: "Corsairs become permanently cloaked.", + item_names.CORSAIR_ARGUS_JEWEL: "Corsairs can store 2 charges of disruption web.", + item_names.CORSAIR_SUSTAINING_DISRUPTION: "Corsair disruption webs last longer.", + item_names.CORSAIR_NEUTRON_SHIELDS: "Increases corsair maximum shields by +20.", + item_names.ORACLE_STEALTH_DRIVE: "Oracles become permanently cloaked.", + item_names.ORACLE_SKYWARD_CHRONOANOMALY: "The Oracle's Stasis Ward can affect air units.", + item_names.ORACLE_TEMPORAL_ACCELERATION_BEAM: "Oracles no longer need to to spend energy to attack.", + item_names.ORACLE_BOSONIC_CORE: "Increases starting energy by 150 and maximum energy by 50.", + item_names.ARBITER_CHRONOSTATIC_REINFORCEMENT: "Arbiters gain +50 maximum life and +1 armor.", + item_names.ARBITER_KHAYDARIN_CORE: _get_start_and_max_energy_desc("Arbiters"), + item_names.ARBITER_SPACETIME_ANCHOR: "Allows Arbiters to use an alternate version of Stasis Field which lasts 50 seconds longer.", + item_names.ARBITER_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.ARBITER), + item_names.ARBITER_JUDICATORS_VEIL: "Increases Arbiter Cloaking Field range.", + item_names.CARRIER_TRIREME_GRAVITON_CATAPULT: "Carriers and Triremes can launch Interceptors and Bombers more quickly.", + item_names.CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES: "Carrier-class ships gain +2 armor.", + item_names.VOID_RAY_DESTROYER_PULSAR_DAWNBRINGER_FLUX_VANES: "Increases movement speed of Void Ray variants.", + item_names.DAWNBRINGER_ANTI_SURFACE_COUNTERMEASURES: "Dawnbringers take reduced damage from non-spell ground sources.", + item_names.DAWNBRINGER_ENHANCED_SHIELD_GENERATOR: "Increases Dawnbringer maximum shields by +50.", + item_names.PULSAR_CHRONOCLYSM: "Pulsar slow effect is also applied in an area around the primary target.", + item_names.PULSAR_ENTROPIC_REVERSAL: "Pulsars now regenerate life when out of combat.", + item_names.DESTROYER_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.DESTROYER), + item_names.WARP_PRISM_GRAVITIC_DRIVE: "Increases the movement speed of Warp Prisms.", + item_names.WARP_PRISM_PHASE_BLASTER: "Equips Warp Prisms with an auto-attack that can hit ground and air targets.", + item_names.WARP_PRISM_WAR_CONFIGURATION: "Warp Prisms transform faster and gain increased power radius in Phasing Mode.", + item_names.OBSERVER_GRAVITIC_BOOSTERS: "Increases Observer movement speed.", + item_names.OBSERVER_SENSOR_ARRAY: "Increases Observer sight range.", + item_names.REAVER_SCARAB_DAMAGE: "Reaver Scarabs deal +25 damage.", + item_names.REAVER_SOLARITE_PAYLOAD: "Reaver Scarabs gain increased splash damage radius.", + item_names.REAVER_REAVER_CAPACITY: "Reavers can store 10 Scarabs.", + item_names.REAVER_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(item_names.REAVER), + item_names.REAVER_BARGAIN_BIN_PRICES: _get_resource_efficiency_desc(item_names.REAVER, op_re_cost_reduction), + item_names.VANGUARD_AGONY_LAUNCHERS: "Increases Vanguard attack range by +2.", + item_names.VANGUARD_MATTER_DISPERSION: "Increases Vanguard attack area.", + item_names.IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE: "Increases Immortal and Annihilator attack range by +2.", + item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING: "Immortals and Annihilators can attack air units.", + item_names.IMMORTAL_ANNIHILATOR_DISRUPTOR_DISPERSION: "Immortals and Annihilators deal minor splash damage.", + item_names.STALWART_HIGH_VOLTAGE_CAPACITORS: "Increases Stalwart attack bounce range by +1.", + item_names.STALWART_REINTEGRATED_FRAMEWORK: "Increases the movement speed of Stalwarts.", + item_names.STALWART_STABILIZED_ELECTRODES: "Allows Stalwarts to attack while moving, and increases attack range by +1.", + item_names.STALWART_LATTICED_SHIELDING: "Increases Stalwart max shields by +50.", + item_names.DISRUPTOR_CLOAKING_MODULE: "Disruptors are permanently cloaked.", + item_names.DISRUPTOR_PERFECTED_POWER: "Allows Purification Nova to hit air units. Bonus damage to shields is now baseline for enemies (friendly damage unaffected).", + item_names.DISRUPTOR_RESTRAINED_DESTRUCTION: "Purification Nova does 50% reduced damage to friendly units and structures.", + item_names.COLOSSUS_PACIFICATION_PROTOCOL: "Increases Colossus attack speed.", + item_names.WRATHWALKER_RAPID_POWER_CYCLING: "Reduces the charging time and increases attack speed of the Wrathwalker's Charged Blast.", + item_names.WRATHWALKER_EYE_OF_WRATH: "Increases Wrathwalker weapon range by +1.", + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN: f"Increases {DISPLAY_NAME_CLOAKED_ASSASSIN} maximum shields by +80.", + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING: f"Increases {DISPLAY_NAME_CLOAKED_ASSASSIN} maximum life by +40.", + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK: _ability_desc("Dark Templar, Avengers, and Blood Hunters", "Blink"), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY: _get_resource_efficiency_desc(DISPLAY_NAME_CLOAKED_ASSASSIN), + item_names.DARK_TEMPLAR_DARK_ARCHON_MELD: "Allows 2 Dark Templar to meld into a Dark Archon.", + item_names.DARK_TEMPLAR_ARCHON_MERGE: "Allows 2 Dark Templar to merge into a Archon.", + item_names.HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM: "High Templar and Signifiers deal increased damage with Psi Storm.", + item_names.HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION: _ability_desc("High Templar and Signifiers", "Hallucination", "creates 2 hallucinated copies of a target unit"), + item_names.HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET: _get_start_and_max_energy_desc("High Templar and Signifiers"), + item_names.ARCHON_HIGH_ARCHON: "Archons can use High Templar abilities.", + item_names.ARCHON_TRANSCENDENCE: "Archons can float in the air. Can traverse cliffs and phase through most units. Increases Archon attack range by 1.", + item_names.ARCHON_POWER_SIPHON: _ability_desc("Archons", "Power Siphon", "deals damage to a target and replenishes shields over 2 seconds"), + item_names.ARCHON_ERADICATE: "On death, Archons launch towards nearby enemy ground units, dealing damage on impact.", + item_names.ARCHON_OBLITERATE: "Archon attacks get increased area of effect, and deal their biological bonus damage to all targets.", + item_names.DARK_ARCHON_FEEDBACK: _ability_desc("Dark Archons", "Feedback", "drains all energy from a target and deals 1 damage per point of energy drained"), + item_names.DARK_ARCHON_MAELSTROM: _ability_desc("Dark Archons", "Maelstrom", "stuns biological units in an area"), + item_names.DARK_ARCHON_ARGUS_TALISMAN: _get_start_and_max_energy_desc("Dark Archons"), + item_names.ASCENDANT_POWER_OVERWHELMING: "Ascendants gain the ability to sacrifice Supplicants for increased shields and spell damage.", + item_names.ASCENDANT_CHAOTIC_ATTUNEMENT: "Ascendants' Psionic Orbs gain 25% increased travel distance.", + item_names.ASCENDANT_BLOOD_AMULET: _get_start_and_max_energy_desc("Ascendants"), + item_names.ASCENDANT_ARCHON_MERGE: "Allows 2 Ascendants to merge into a Archon.", + item_names.SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE: "Sentries, Energizers, and Havocs become permanently cloaked.", + item_names.SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING: "Sentries, Energizers, and Havocs gain +100% energy regeneration rate.", + item_names.SENTRY_FORCE_FIELD: _ability_desc("Sentries", "Force Field", "creates a force field that blocks units from walking through"), + item_names.SENTRY_HALLUCINATION: _ability_desc("Sentries", "Hallucination", "creates hallucinated versions of Protoss units"), + item_names.ENERGIZER_RECLAMATION: _ability_desc("Energizers", "Reclamation", "temporarily takes control of an enemy mechanical unit. When the ability expires, the enemy unit self-destructs"), + item_names.ENERGIZER_FORGED_CHASSIS: "Increases Energizer Life by +20.", + item_names.HAVOC_DETECT_WEAKNESS: "Havocs' Target Lock gives an additional +15% damage bonus.", + item_names.HAVOC_BLOODSHARD_RESONANCE: "Havocs gain increased range for Squad Sight, Target Lock, and Force Field.", + item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS: "Zealots, Sentinels, and Centurions gain increased movement speed.", + item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY: "Zealots, Sentinels, and Centurions gain +30 maximum shields.", + item_names.ZEALOT_WHIRLWIND: "Zealot War Council ability.\nGives Zealots the whirlwind ability, dealing damage in an area over 3 seconds.", + item_names.CENTURION_RESOURCE_EFFICIENCY: "Centurion War Council upgrade.\n" + _get_resource_efficiency_desc( + item_names.CENTURION), + item_names.SENTINEL_RESOURCE_EFFICIENCY: "Sentinel War Council upgrade.\n" + _get_resource_efficiency_desc( + item_names.SENTINEL), + item_names.STALKER_PHASE_REACTOR: "Stalker War Council upgrade.\nStalkers restore 80 shields over 5 seconds after they Blink.", + item_names.DRAGOON_PHALANX_SUIT: "Dragoon War Council upgrade.\nDragoons gain +1 range, move slightly faster, and can form tighter formations.", + item_names.INSTIGATOR_MODERNIZED_SERVOS: "Instigator War Council upgrade.\nInstigators move 28% faster.", + item_names.ADEPT_DISRUPTIVE_TRANSFER: "Adept War Council upgrade.\nAdept shades apply a debuff to enemies they touch, increasing damage taken by +5.", + item_names.SLAYER_PHASE_BLINK: "Slayer War Council ability.\nSlayers can now blink. After blinking, the Slayer's next attack within 8 seconds deals double damage.", + item_names.AVENGER_KRYHAS_CLOAK: "Avenger War Council upgrade.\nAvengers are now permanently cloaked.", + item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY: "Dark Templar War Council ability.\nDark Templar gain two strikes of their Shadow Fury ability.", + item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY: "Dark Templar War Council ability.\nDark Templar gain three strikes of their Shadow Fury ability.", + item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY: "Blood Hunter War Council upgrade.\nBlood Hunters attack twice as quickly.", + item_names.SENTRY_DOUBLE_SHIELD_RECHARGE: "Sentry War Council upgrade.\nSentries can heal the shields of two targets at once.", + item_names.ENERGIZER_MOBILE_CHRONO_BEAM: "Energizer War Council upgrade.\nAllows Energizers to use Chrono Beam in Mobile Mode.", + item_names.HAVOC_ENDURING_SIGHT: "Havoc War Council upgrade.\nHavoc Squad Sight stays up indefinitely and no longer takes energy.", + item_names.HIGH_TEMPLAR_PLASMA_SURGE: "High Templar War Council upgrade.\nHigh Templar Psionic Storm will heal fiendly protoss shields under it.", + item_names.SIGNIFIER_FEEDBACK: "Signifier War Council ability.\n" + _ability_desc("Signifiers", "Feedback", "drains all energy from a target and deals 1 damage per point of energy drained"), + item_names.ASCENDANT_BREATH_OF_CREATION: "Ascendant War Council upgrade.\nAscendant spells cost -25 energy.", + item_names.DARK_ARCHON_INDOMITABLE_WILL: "Dark Archon War Council upgrade.\nCasting Mind Control will no longer deplete the Dark Archon's shields.", + item_names.IMMORTAL_IMPROVED_BARRIER: "Immortal War Council upgrade.\nThe Immortal's Barrier ability absorbs an additional +100 damage.", + item_names.VANGUARD_RAPIDFIRE_CANNON: "Vanguard War Council upgrade.\nVanguards attack 60% faster.", + item_names.VANGUARD_FUSION_MORTARS: "Vanguard War Council upgrade.\nVanguards deal +7 damage to armored targets per attack.", + item_names.ANNIHILATOR_TWILIGHT_CHASSIS: "Annihilator War Council upgrade.\nThe Annihilator gains +100 maximum life.", + item_names.STALWART_ARC_INDUCERS: "Stalwart War Council upgrade.\nStalwarts damage up to 3 additional units when attacking.", + item_names.COLOSSUS_FIRE_LANCE: "Colossus War Council upgrade.\nColossi set the ground on fire with their attacks, dealing damage to enemies over time.", + item_names.WRATHWALKER_AERIAL_TRACKING: "Wrathwalker War Council upgrade.\nWrathwalkers can now target air units.", + item_names.REAVER_KHALAI_REPLICATORS: "Reaver War Council upgrade.\nReaver Scarabs no longer cost minerals.", + item_names.DISRUPTOR_MOBILITY_PROTOCOLS: "Disruptor War Council upgrade.\nAllows the Disruptor to move while casting Purification Nova. Also allows the Disruptor to Blink.", + item_names.WARP_PRISM_WARP_REFRACTION: "Warp Prism War Council upgrade.\nWarp Prisms gain +5 pickup range and unload units 10 times faster.", + item_names.OBSERVER_INDUCE_SCOPOPHOBIA: "Observer War Council ability.\n" + _ability_desc("Observers", "Induce Scopophobia", "reduces the attack and movement speed of an enemy by 20%"), + item_names.PHOENIX_DOUBLE_GRAVITON_BEAM: "Phoenix War Council upgrade.\nPhoenixes can now use Graviton Beam to lift two targets at once.", + item_names.CORSAIR_NETWORK_DISRUPTION: "Corsair War Council upgrade.\nTriples the radius of Disruption Web.", + item_names.MIRAGE_GRAVITON_BEAM: "Mirage War Council ability.\nAllows Mirages to use Graviton Beam.", + item_names.SKIRMISHER_PEER_CONTEMPT: "Skirmisher War Council upgrade.\nAllows Skirmishers to target air units.", + item_names.VOID_RAY_PRISMATIC_RANGE: "Void Ray War Council upgrade.\nVoid Rays gain increased range as they charge their beam.", + item_names.DESTROYER_REFORGED_BLOODSHARD_CORE: "Destroyer War Council upgrade.\nIncreases the Destroyer's bounce attack damage to 3 (+2 vs armored) at all charge levels, and allows the bounces to benefit from protoss air weapon upgrades.", + item_names.PULSAR_CHRONO_SHEAR: "Pulsar War Council upgrade.\nFully-stacked slow on non-heroic targets also applies a defense debuff.", + item_names.DAWNBRINGER_SOLARITE_LENS: "Dawnbringer War Council upgrade.\nDawnbringers gain +2 range.", + item_names.CARRIER_REPAIR_DRONES: "Carrier War Council upgrade.\nCarriers gain 2 repair drones which heal nearby mechanical units.", + item_names.SKYLORD_JUMP: "Skylord War Council ability.\n" + _ability_desc("Skylords", "Jump", "instantly teleports the Skylord a short distance"), + item_names.TRIREME_SOLAR_BEAM: "Trireme War Council weapon.\nTriremes gain an anti-air laser attack that deals more damage over time.", + item_names.TEMPEST_DISINTEGRATION: "Tempest War Council ability.\n" + _ability_desc("Tempests", "Disintegration", "deals 500 damage to a target unit or structure over 20 seconds"), + item_names.SCOUT_EXPEDITIONARY_HULL: "Scout War Council upgrade.\nScouts gain +25 shields, +50 health, +1 shield armor, and reduced shield regeneration delay.", + item_names.ARBITER_VESSEL_OF_THE_CONCLAVE: "Arbiter War Council upgrade.\nReduces the energy cost of Recall by 50 and Stasis Field by 100.", + item_names.ORACLE_STASIS_CALIBRATION: "Oracle War Council upgrade.\nEnemies caught by the Oracle's Stasis Ward may now be attacked for the first 5 seconds of stasis.", + item_names.MOTHERSHIP_INTEGRATED_POWER: "Mothership War Council upgrade.\nAllows Motherships to move at full speed outside pylon power.", + item_names.OPPRESSOR_VULCAN_BLASTER: "Oppressor War Council ability.\n" + _ability_desc("Oppressors", "Vulcan Blaster", "activates a powerful short range anti-ground weapon for a limited time. Greatly reduces movement and turning speed, and disables other weapons while active"), + item_names.CALADRIUS_CORONA_BEAM: "Caladrius War Council ability.\n" + _ability_desc("Caladrius", "Corona Beam", "channels a beam that drains up to 100 of the Caladrius' shields to deal up to 200 damage over time to a single target"), + item_names.MISTWING_PHANTOM_DASH: "Mist Wing War Council ability.\n" + _ability_desc("Mist Wings", "Phantom Dash", "dashes forward to cover some distance quickly. Deals damage in a line if the Mist Wing is cloaked"), + item_names.SUPPLICANT_SACRIFICE: "Supplicant War Council ability.\nAllows Supplicants to sacrifice themselves to save nearby units from death.", + + + item_names.SOA_CHRONO_SURGE: "The Spear of Adun increases a target structure's unit warp in and research speeds by +1000% for 20 seconds.", + item_names.SOA_PROGRESSIVE_PROXY_PYLON: inspect.cleandoc(""" + Level 1: The Spear of Adun quickly warps in a Pylon to a target location. + Level 2: The Spear of Adun warps in a Pylon, 2 melee warriors, and 2 ranged warriors to a target location. + """), + item_names.SOA_PYLON_OVERCHARGE: "The Spear of Adun temporarily gives a target Pylon increased shields and a powerful attack.", + item_names.SOA_ORBITAL_STRIKE: "The Spear of Adun fires 5 laser blasts from orbit.", + item_names.SOA_TEMPORAL_FIELD: "The Spear of Adun creates 3 temporal fields that freeze enemy units and structures in time.", + item_names.SOA_SOLAR_LANCE: "The Spear of Adun strafes a target area with 3 laser beams.", + item_names.SOA_MASS_RECALL: "The Spear of Adun warps all units in a target area back to the primary Nexus and gives them a temporary shield.", + item_names.SOA_SHIELD_OVERCHARGE: "The Spear of Adun gives all friendly units a shield that absorbs 200 damage. Lasts 20 seconds.", + item_names.SOA_DEPLOY_FENIX: "The Spear of Adun drops Fenix onto the battlefield. Fenix is a powerful warrior who will fight for 30 seconds.", + item_names.SOA_PURIFIER_BEAM: "The Spear of Adun fires a wide laser that deals large amounts of damage in a moveable area. Lasts 15 seconds.", + item_names.SOA_TIME_STOP: "The Spear of Adun freezes all enemy units and structures in time for 20 seconds.", + item_names.SOA_SOLAR_BOMBARDMENT: "The Spear of Adun fires 200 laser blasts randomly over a wide area.", + item_names.MATRIX_OVERLOAD: "All friendly units gain 25% movement speed and 15% attack speed within a Pylon's power field and for 15 seconds after leaving it.", + item_names.QUATRO: "All friendly Protoss units gain the equivalent of their +1 armor, attack, and shield upgrades.", + item_names.NEXUS_OVERCHARGE: "The Protoss Nexus gains a long-range auto-attack.", + item_names.ORBITAL_ASSIMILATORS: "Assimilators automatically harvest Vespene Gas without the need for Probes.", + item_names.WARP_HARMONIZATION: "Stargates and Robotics Facilities can transform to utilize Warp In technology. Warp In cooldowns are 20% faster than original build times.", + item_names.GUARDIAN_SHELL: "The Spear of Adun passively shields friendly Protoss units before death, making them invulnerable for 5 seconds. Each unit can only be shielded once every 60 seconds.", + item_names.RECONSTRUCTION_BEAM: "The Spear of Adun will passively heal mechanical units for 5 and non-biological structures for 10 life per second. Up to 3 targets can be repaired at once.", + item_names.OVERWATCH: "Once per second, the Spear of Adun will last-hit a damaged enemy unit that is below 50 health.", + item_names.SUPERIOR_WARP_GATES: "Protoss Warp Gates can hold up to 3 charges of unit warp-ins.", + item_names.ENHANCED_TARGETING: "Protoss defensive structures gain +2 range.", + item_names.OPTIMIZED_ORDNANCE: "Increases the attack speed of Protoss defensive structures by 25%.", + item_names.KHALAI_INGENUITY: "Pylons, Photon Cannons, Monoliths, and Shield Batteries warp in near-instantly.", + item_names.AMPLIFIED_ASSIMILATORS: "Assimilators produce Vespene gas 25% faster.", + item_names.PROGRESSIVE_WARP_RELOCATE: inspect.cleandoc(""" + Level 1: Protoss structures can be moved anywhere within pylon power after a brief delay. Max 3 charges, shared globally. + Level 2: No longer consumes or requires charges. + """), + item_names.PROBE_WARPIN: "You can warp in additonal Probes from your Nexus to any visible location within a Pylon's power field. Has a 30 second cooldown and can store up to 2 charges.", + item_names.ELDER_PROBES: "You can warp in a group of 5 Elder Probes, tough builders from the Brood War. Elder Probes can provide a Power Field and get reconstructed on death. Can only be used once per mission.", +} + +# Key descriptions +key_descriptions = { + key: GENERIC_KEY_DESC + for key in item_tables.key_item_table.keys() +} +item_descriptions.update(key_descriptions) diff --git a/worlds/sc2/item/item_groups.py b/worlds/sc2/item/item_groups.py new file mode 100644 index 0000000000..ea65dc3e4a --- /dev/null +++ b/worlds/sc2/item/item_groups.py @@ -0,0 +1,902 @@ +import typing +from . import item_tables, item_names +from .item_tables import key_item_table +from ..mission_tables import campaign_mission_table, SC2Campaign, SC2Mission, SC2Race + +""" +Item name groups, given to Archipelago and used in YAMLs and /received filtering. +For non-developers the following will be useful: +* Items with a bracket get groups named after the unbracketed part + * eg. "Advanced Healing AI (Medivac)" is accessible as "Advanced Healing AI" + * The exception to this are item names that would be ambiguous (eg. "Resource Efficiency") +* Item flaggroups get unique groups as well as combined groups for numbered flaggroups + * eg. "Unit" contains all units, "Armory" contains "Armory 1" through "Armory 6" + * The best place to look these up is at the bottom of Items.py +* Items that have a parent are grouped together + * eg. "Zergling Items" contains all items that have "Zergling" as a parent + * These groups do NOT contain the parent item + * This currently does not include items with multiple potential parents, like some LotV unit upgrades +* All items are grouped by their race ("Terran", "Protoss", "Zerg", "Any") +* Hand-crafted item groups can be found at the bottom of this file +""" + +item_name_groups: typing.Dict[str, typing.List[str]] = {} + +# Groups for use in world logic +item_name_groups["Missions"] = ["Beat " + mission.mission_name for mission in SC2Mission] +item_name_groups["WoL Missions"] = ["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.WOL]] + \ + ["Beat " + mission.mission_name for mission in campaign_mission_table[SC2Campaign.PROPHECY]] + +# These item name groups should not show up in documentation +unlisted_item_name_groups = { + "Missions", "WoL Missions", + item_tables.TerranItemType.Progressive.display_name, + item_tables.TerranItemType.Nova_Gear.display_name, + item_tables.TerranItemType.Mercenary.display_name, + item_tables.ZergItemType.Ability.display_name, + item_tables.ZergItemType.Morph.display_name, + item_tables.ZergItemType.Strain.display_name, +} + +# Some item names only differ in bracketed parts +# These items are ambiguous for short-hand name groups +bracketless_duplicates: typing.Set[str] +# This is a list of names in ItemNames with bracketed parts removed, for internal use +_shortened_names = [(name[:name.find(' (')] if '(' in name else name) + for name in [item_names.__dict__[name] for name in item_names.__dir__() if not name.startswith('_')]] +# Remove the first instance of every short-name from the full item list +bracketless_duplicates = set(_shortened_names) +for name in bracketless_duplicates: + _shortened_names.remove(name) +# The remaining short-names are the duplicates +bracketless_duplicates = set(_shortened_names) +del _shortened_names + +# All items get sorted into their data type +for item, data in item_tables.get_full_item_list().items(): + # Items get assigned to their flaggroup's display type + item_name_groups.setdefault(data.type.display_name, []).append(item) + # Items with a bracket get a short-hand name group for ease of use in YAMLs + if '(' in item: + short_name = item[:item.find(' (')] + # Ambiguous short-names are dropped + if short_name not in bracketless_duplicates: + item_name_groups[short_name] = [item] + # Short-name groups are unlisted + unlisted_item_name_groups.add(short_name) + # Items with a parent get assigned to their parent's group + if data.parent: + # The parent groups need a special name, otherwise they are ambiguous with the parent + parent_group = f"{data.parent} Items" + item_name_groups.setdefault(parent_group, []).append(item) + # Parent groups are unlisted + unlisted_item_name_groups.add(parent_group) + # All items get assigned to their race's group + race_group = data.race.name.capitalize() + item_name_groups.setdefault(race_group, []).append(item) + + +# Hand-made groups +class ItemGroupNames: + TERRAN_ITEMS = "Terran Items" + """All Terran items""" + TERRAN_UNITS = "Terran Units" + TERRAN_GENERIC_UPGRADES = "Terran Generic Upgrades" + """+attack/armour upgrades""" + BARRACKS_UNITS = "Barracks Units" + FACTORY_UNITS = "Factory Units" + STARPORT_UNITS = "Starport Units" + WOL_UNITS = "WoL Units" + WOL_MERCS = "WoL Mercenaries" + WOL_BUILDINGS = "WoL Buildings" + WOL_UPGRADES = "WoL Upgrades" + WOL_ITEMS = "WoL Items" + """All items from vanilla WoL. Note some items are progressive where level 2 is not vanilla.""" + NCO_UNITS = "NCO Units" + NCO_BUILDINGS = "NCO Buildings" + NCO_UNIT_TECHNOLOGY = "NCO Unit Technology" + NCO_BASELINE_UPGRADES = "NCO Baseline Upgrades" + NCO_UPGRADES = "NCO Upgrades" + NOVA_EQUIPMENT = "Nova Equipment" + NOVA_WEAPONS = "Nova Weapons" + NOVA_GADGETS = "Nova Gadgets" + NCO_MAX_PROGRESSIVE_ITEMS = "NCO +Items" + """NCO item groups that should be set to maximum progressive amounts""" + NCO_MIN_PROGRESSIVE_ITEMS = "NCO -Items" + """NCO item groups that should be set to minimum progressive amounts (1)""" + TERRAN_BUILDINGS = "Terran Buildings" + TERRAN_MERCENARIES = "Terran Mercenaries" + TERRAN_STIMPACKS = "Terran Stimpacks" + TERRAN_PROGRESSIVE_UPGRADES = "Terran Progressive Upgrades" + TERRAN_ORIGINAL_PROGRESSIVE_UPGRADES = "Terran Original Progressive Upgrades" + """Progressive items where level 1 appeared in WoL""" + MENGSK_UNITS = "Mengsk Units" + TERRAN_VETERANCY_UNITS = "Terran Veterancy Units" + ORBITAL_COMMAND_ABILITIES = "Orbital Command Abilities" + WOL_ORBITAL_COMMAND_ABILITIES = "WoL Command Center Abilities" + + ZERG_ITEMS = "Zerg Items" + ZERG_UNITS = "Zerg Units" + ZERG_NONMORPH_UNITS = "Zerg Non-morph Units" + ZERG_GENERIC_UPGRADES = "Zerg Generic Upgrades" + """+attack/armour upgrades""" + HOTS_UNITS = "HotS Units" + HOTS_BUILDINGS = "HotS Buildings" + HOTS_STRAINS = "HotS Strains" + """Vanilla HotS strains (the upgrades you play a mini-mission for)""" + HOTS_MUTATIONS = "HotS Mutations" + """Vanilla HotS Mutations (basic toggleable unit upgrades)""" + HOTS_GLOBAL_UPGRADES = "HotS Global Upgrades" + HOTS_MORPHS = "HotS Morphs" + KERRIGAN_ABILITIES = "Kerrigan Abilities" + KERRIGAN_HOTS_ABILITIES = "Kerrigan HotS Abilities" + KERRIGAN_ACTIVE_ABILITIES = "Kerrigan Active Abilities" + KERRIGAN_LOGIC_ACTIVE_ABILITIES = "Kerrigan Logic Active Abilities" + KERRIGAN_PASSIVES = "Kerrigan Passives" + KERRIGAN_TIER_1 = "Kerrigan Tier 1" + KERRIGAN_TIER_2 = "Kerrigan Tier 2" + KERRIGAN_TIER_3 = "Kerrigan Tier 3" + KERRIGAN_TIER_4 = "Kerrigan Tier 4" + KERRIGAN_TIER_5 = "Kerrigan Tier 5" + KERRIGAN_TIER_6 = "Kerrigan Tier 6" + KERRIGAN_TIER_7 = "Kerrigan Tier 7" + KERRIGAN_ULTIMATES = "Kerrigan Ultimates" + KERRIGAN_LOGIC_ULTIMATES = "Kerrigan Logic Ultimates" + KERRIGAN_NON_ULTIMATES = "Kerrigan Non-Ultimates" + KERRIGAN_NON_ULTIMATE_ACTIVE_ABILITIES = "Kerrigan Non-Ultimate Active Abilities" + HOTS_ITEMS = "HotS Items" + """All items from vanilla HotS""" + OVERLORD_UPGRADES = "Overlord Upgrades" + ZERG_MORPHS = "Zerg Morphs" + ZERG_MERCENARIES = "Zerg Mercenaries" + ZERG_BUILDINGS = "Zerg Buildings" + INF_TERRAN_ITEMS = "Infested Terran Items" + """All items from Stukov co-op subfaction""" + INF_TERRAN_UNITS = "Infested Terran Units" + INF_TERRAN_UPGRADES = "Infested Terran Upgrades" + + PROTOSS_ITEMS = "Protoss Items" + PROTOSS_UNITS = "Protoss Units" + PROTOSS_GENERIC_UPGRADES = "Protoss Generic Upgrades" + """+attack/armour upgrades""" + GATEWAY_UNITS = "Gateway Units" + ROBO_UNITS = "Robo Units" + STARGATE_UNITS = "Stargate Units" + PROPHECY_UNITS = "Prophecy Units" + PROPHECY_BUILDINGS = "Prophecy Buildings" + LOTV_UNITS = "LotV Units" + LOTV_ITEMS = "LotV Items" + LOTV_GLOBAL_UPGRADES = "LotV Global Upgrades" + SOA_ITEMS = "SOA" + PROTOSS_GLOBAL_UPGRADES = "Protoss Global Upgrades" + PROTOSS_BUILDINGS = "Protoss Buildings" + WAR_COUNCIL = "Protoss War Council Upgrades" + AIUR_UNITS = "Aiur" + NERAZIM_UNITS = "Nerazim" + TAL_DARIM_UNITS = "Tal'Darim" + PURIFIER_UNITS = "Purifier" + + VANILLA_ITEMS = "Vanilla Items" + OVERPOWERED_ITEMS = "Overpowered Items" + UNRELEASED_ITEMS = "Unreleased Items" + LEGACY_ITEMS = "Legacy Items" + + KEYS = "Keys" + + @classmethod + def get_all_group_names(cls) -> typing.Set[str]: + return { + name for identifier, name in cls.__dict__.items() + if not identifier.startswith('_') + and not identifier.startswith('get_') + } + + +# Terran +item_name_groups[ItemGroupNames.TERRAN_ITEMS] = terran_items = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.race == SC2Race.TERRAN +] +item_name_groups[ItemGroupNames.TERRAN_UNITS] = terran_units = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type in ( + item_tables.TerranItemType.Unit, item_tables.TerranItemType.Unit_2, item_tables.TerranItemType.Mercenary) +] +item_name_groups[ItemGroupNames.TERRAN_GENERIC_UPGRADES] = terran_generic_upgrades = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.TerranItemType.Upgrade +] +barracks_wa_group = [ + item_names.MARINE, item_names.FIREBAT, item_names.MARAUDER, + item_names.REAPER, item_names.GHOST, item_names.SPECTRE, item_names.HERC, item_names.AEGIS_GUARD, + item_names.EMPERORS_SHADOW, item_names.DOMINION_TROOPER, item_names.SON_OF_KORHAL, +] +item_name_groups[ItemGroupNames.BARRACKS_UNITS] = barracks_units = (barracks_wa_group + [ + item_names.MEDIC, + item_names.FIELD_RESPONSE_THETA, +]) +factory_wa_group = [ + item_names.HELLION, item_names.VULTURE, item_names.GOLIATH, item_names.DIAMONDBACK, + item_names.SIEGE_TANK, item_names.THOR, item_names.PREDATOR, + item_names.CYCLONE, item_names.WARHOUND, item_names.SHOCK_DIVISION, item_names.BLACKHAMMER, + item_names.BULWARK_COMPANY, +] +item_name_groups[ItemGroupNames.FACTORY_UNITS] = factory_units = (factory_wa_group + [ + item_names.WIDOW_MINE, +]) +starport_wa_group = [ + item_names.WRAITH, item_names.VIKING, item_names.BANSHEE, + item_names.BATTLECRUISER, item_names.RAVEN_HUNTER_SEEKER_WEAPON, + item_names.LIBERATOR, item_names.VALKYRIE, item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY, + item_names.EMPERORS_GUARDIAN, item_names.NIGHT_HAWK, item_names.NIGHT_WOLF, +] +item_name_groups[ItemGroupNames.STARPORT_UNITS] = starport_units = [ + item_names.MEDIVAC, item_names.WRAITH, item_names.VIKING, item_names.BANSHEE, + item_names.BATTLECRUISER, item_names.HERCULES, item_names.SCIENCE_VESSEL, item_names.RAVEN, + item_names.LIBERATOR, item_names.VALKYRIE, item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY, + item_names.EMPERORS_GUARDIAN, item_names.NIGHT_HAWK, item_names.NIGHT_WOLF, +] +item_name_groups[ItemGroupNames.TERRAN_MERCENARIES] = terran_mercenaries = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.TerranItemType.Mercenary +] +item_name_groups[ItemGroupNames.NCO_UNITS] = nco_units = [ + item_names.MARINE, item_names.MARAUDER, item_names.REAPER, + item_names.HELLION, item_names.GOLIATH, item_names.SIEGE_TANK, + item_names.RAVEN, item_names.LIBERATOR, item_names.BANSHEE, item_names.BATTLECRUISER, + item_names.HERC, # From that one bonus objective in mission 5 +] +item_name_groups[ItemGroupNames.NCO_BUILDINGS] = nco_buildings = [ + item_names.BUNKER, item_names.MISSILE_TURRET, item_names.PLANETARY_FORTRESS, +] +item_name_groups[ItemGroupNames.NOVA_EQUIPMENT] = nova_equipment = [ + *[item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.TerranItemType.Nova_Gear], + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, +] +item_name_groups[ItemGroupNames.NOVA_WEAPONS] = nova_weapons = [ + item_names.NOVA_C20A_CANISTER_RIFLE, + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_PLASMA_RIFLE, + item_names.NOVA_MONOMOLECULAR_BLADE, + item_names.NOVA_BLAZEFIRE_GUNBLADE, +] +item_name_groups[ItemGroupNames.NOVA_GADGETS] = nova_gadgets = [ + item_names.NOVA_STIM_INFUSION, + item_names.NOVA_PULSE_GRENADES, + item_names.NOVA_FLASHBANG_GRENADES, + item_names.NOVA_IONIC_FORCE_FIELD, + item_names.NOVA_HOLO_DECOY, +] +item_name_groups[ItemGroupNames.WOL_UNITS] = wol_units = [ + item_names.MARINE, item_names.MEDIC, item_names.FIREBAT, item_names.MARAUDER, item_names.REAPER, + item_names.HELLION, item_names.VULTURE, item_names.GOLIATH, item_names.DIAMONDBACK, item_names.SIEGE_TANK, + item_names.MEDIVAC, item_names.WRAITH, item_names.VIKING, item_names.BANSHEE, item_names.BATTLECRUISER, + item_names.GHOST, item_names.SPECTRE, item_names.THOR, + item_names.PREDATOR, item_names.HERCULES, + item_names.SCIENCE_VESSEL, item_names.RAVEN, +] +item_name_groups[ItemGroupNames.WOL_MERCS] = wol_mercs = [ + item_names.WAR_PIGS, item_names.DEVIL_DOGS, item_names.HAMMER_SECURITIES, + item_names.SPARTAN_COMPANY, item_names.SIEGE_BREAKERS, + item_names.HELS_ANGELS, item_names.DUSK_WINGS, item_names.JACKSONS_REVENGE, +] +item_name_groups[ItemGroupNames.WOL_BUILDINGS] = wol_buildings = [ + item_names.BUNKER, item_names.MISSILE_TURRET, item_names.SENSOR_TOWER, + item_names.PERDITION_TURRET, item_names.PLANETARY_FORTRESS, + item_names.HIVE_MIND_EMULATOR, item_names.PSI_DISRUPTER, +] +item_name_groups[ItemGroupNames.TERRAN_BUILDINGS] = terran_buildings = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.TerranItemType.Building or item_name in wol_buildings +] +item_name_groups[ItemGroupNames.MENGSK_UNITS] = [ + item_names.AEGIS_GUARD, item_names.EMPERORS_SHADOW, + item_names.SHOCK_DIVISION, item_names.BLACKHAMMER, + item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY, + item_names.DOMINION_TROOPER, +] +item_name_groups[ItemGroupNames.TERRAN_VETERANCY_UNITS] = [ + item_names.AEGIS_GUARD, item_names.EMPERORS_SHADOW, item_names.SHOCK_DIVISION, item_names.BLACKHAMMER, + item_names.PRIDE_OF_AUGUSTRGRAD, item_names.SKY_FURY, item_names.SON_OF_KORHAL, item_names.FIELD_RESPONSE_THETA, + item_names.BULWARK_COMPANY, item_names.NIGHT_HAWK, item_names.EMPERORS_GUARDIAN, item_names.NIGHT_WOLF, +] +item_name_groups[ItemGroupNames.ORBITAL_COMMAND_ABILITIES] = orbital_command_abilities = [ + item_names.COMMAND_CENTER_SCANNER_SWEEP, + item_names.COMMAND_CENTER_MULE, + item_names.COMMAND_CENTER_EXTRA_SUPPLIES, +] +item_name_groups[ItemGroupNames.WOL_ORBITAL_COMMAND_ABILITIES] = wol_orbital_command_abilities = [ + item_names.COMMAND_CENTER_SCANNER_SWEEP, + item_names.COMMAND_CENTER_MULE, +] +spider_mine_sources = [ + item_names.VULTURE, + item_names.REAPER_SPIDER_MINES, + item_names.SIEGE_TANK_SPIDER_MINES, + item_names.RAVEN_SPIDER_MINES, +] + +# Terran Upgrades +item_name_groups[ItemGroupNames.WOL_UPGRADES] = wol_upgrades = [ + # Armory Base + item_names.BUNKER_PROJECTILE_ACCELERATOR, item_names.BUNKER_NEOSTEEL_BUNKER, + item_names.MISSILE_TURRET_TITANIUM_HOUSING, item_names.MISSILE_TURRET_HELLSTORM_BATTERIES, + item_names.SCV_ADVANCED_CONSTRUCTION, item_names.SCV_DUAL_FUSION_WELDERS, + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, item_names.COMMAND_CENTER_MULE, item_names.COMMAND_CENTER_SCANNER_SWEEP, + # Armory Infantry + item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MARINE_COMBAT_SHIELD, + item_names.MEDIC_ADVANCED_MEDIC_FACILITIES, item_names.MEDIC_STABILIZER_MEDPACKS, + item_names.FIREBAT_INCINERATOR_GAUNTLETS, item_names.FIREBAT_JUGGERNAUT_PLATING, + item_names.MARAUDER_CONCUSSIVE_SHELLS, item_names.MARAUDER_KINETIC_FOAM, + item_names.REAPER_U238_ROUNDS, item_names.REAPER_G4_CLUSTERBOMB, + # Armory Vehicles + item_names.HELLION_TWIN_LINKED_FLAMETHROWER, item_names.HELLION_THERMITE_FILAMENTS, + item_names.SPIDER_MINE_CERBERUS_MINE, item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE, + item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM, item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM, + item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL, item_names.DIAMONDBACK_SHAPED_HULL, + item_names.SIEGE_TANK_MAELSTROM_ROUNDS, item_names.SIEGE_TANK_SHAPED_BLAST, + # Armory Starships + item_names.MEDIVAC_RAPID_DEPLOYMENT_TUBE, item_names.MEDIVAC_ADVANCED_HEALING_AI, + item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS, item_names.WRAITH_DISPLACEMENT_FIELD, + item_names.VIKING_RIPWAVE_MISSILES, item_names.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM, + item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS, item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY, + item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS, item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX, + # Armory Dominion + item_names.GHOST_OCULAR_IMPLANTS, item_names.GHOST_CRIUS_SUIT, + item_names.SPECTRE_PSIONIC_LASH, item_names.SPECTRE_NYX_CLASS_CLOAKING_MODULE, + item_names.THOR_330MM_BARRAGE_CANNON, item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL, + # Lab Zerg + item_names.BUNKER_FORTIFIED_BUNKER, item_names.BUNKER_SHRIKE_TURRET, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, item_names.CELLULAR_REACTOR, + # Other 3 levels are units/buildings (Perdition, PF, Hercules, Predator, HME, Psi Disrupter) + # Lab Protoss + item_names.VANADIUM_PLATING, item_names.ULTRA_CAPACITORS, + item_names.AUTOMATED_REFINERY, item_names.MICRO_FILTERING, + item_names.ORBITAL_DEPOTS, item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR, + item_names.ORBITAL_STRIKE, item_names.TECH_REACTOR, + # Other level is units (Raven, Science Vessel) +] +item_name_groups[ItemGroupNames.TERRAN_STIMPACKS] = terran_stimpacks = [ + item_names.MARINE_PROGRESSIVE_STIMPACK, + item_names.MARAUDER_PROGRESSIVE_STIMPACK, + item_names.REAPER_PROGRESSIVE_STIMPACK, + item_names.FIREBAT_PROGRESSIVE_STIMPACK, + item_names.HELLION_PROGRESSIVE_STIMPACK, +] +item_name_groups[ItemGroupNames.TERRAN_ORIGINAL_PROGRESSIVE_UPGRADES] = terran_original_progressive_upgrades = [ + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, + item_names.MARINE_PROGRESSIVE_STIMPACK, + item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE, + item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL, + item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS, + item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS, + item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS, + item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX, + item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, +] +item_name_groups[ItemGroupNames.NCO_BASELINE_UPGRADES] = nco_baseline_upgrades = [ + item_names.BUNKER_NEOSTEEL_BUNKER, # Baseline from mission 2 + item_names.BUNKER_FORTIFIED_BUNKER, # Baseline from mission 2 + item_names.MARINE_COMBAT_SHIELD, # Baseline from mission 2 + item_names.MARAUDER_KINETIC_FOAM, # Baseline outside WOL + item_names.MARAUDER_CONCUSSIVE_SHELLS, # Baseline from mission 2 + item_names.REAPER_BALLISTIC_FLIGHTSUIT, # Baseline from mission 2 + item_names.HELLION_HELLBAT, # Baseline from mission 3 + item_names.GOLIATH_INTERNAL_TECH_MODULE, # Baseline from mission 4 + item_names.GOLIATH_SHAPED_HULL, + # ItemNames.GOLIATH_RESOURCE_EFFICIENCY, # Supply savings baseline in NCO, mineral savings is non-NCO + item_names.SIEGE_TANK_SHAPED_HULL, # Baseline NCO gives +10; this upgrade gives +25 + item_names.SIEGE_TANK_SHAPED_BLAST, # Baseline from mission 3 + item_names.LIBERATOR_RAID_ARTILLERY, # Baseline in mission 5 + item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE, # Baseline in mission 5 + item_names.BATTLECRUISER_TACTICAL_JUMP, + item_names.BATTLECRUISER_MOIRAI_IMPULSE_DRIVE, + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, # Baseline from mission 2 + item_names.ORBITAL_DEPOTS, # Baseline from mission 2 + item_names.COMMAND_CENTER_SCANNER_SWEEP, # In NCO you must actually morph Command Center into Orbital Command + item_names.COMMAND_CENTER_EXTRA_SUPPLIES, # But in AP this works WoL-style +] + nco_buildings +item_name_groups[ItemGroupNames.NCO_UNIT_TECHNOLOGY] = nco_unit_technology = [ + item_names.MARINE_LASER_TARGETING_SYSTEM, + item_names.MARINE_PROGRESSIVE_STIMPACK, + item_names.MARINE_MAGRAIL_MUNITIONS, + item_names.MARINE_OPTIMIZED_LOGISTICS, + item_names.MARAUDER_LASER_TARGETING_SYSTEM, + item_names.MARAUDER_INTERNAL_TECH_MODULE, + item_names.MARAUDER_PROGRESSIVE_STIMPACK, + item_names.MARAUDER_MAGRAIL_MUNITIONS, + item_names.REAPER_SPIDER_MINES, + item_names.REAPER_LASER_TARGETING_SYSTEM, + item_names.REAPER_PROGRESSIVE_STIMPACK, + item_names.REAPER_ADVANCED_CLOAKING_FIELD, + # Reaper special ordnance gives anti-building attack, which is baseline in AP + item_names.HELLION_JUMP_JETS, + item_names.HELLION_PROGRESSIVE_STIMPACK, + item_names.HELLION_SMART_SERVOS, + item_names.HELLION_OPTIMIZED_LOGISTICS, + item_names.HELLION_THERMITE_FILAMENTS, # Called Infernal Pre-Igniter in NCO + item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM, # Called Laser Targeting System in NCO + item_names.GOLIATH_JUMP_JETS, + item_names.GOLIATH_OPTIMIZED_LOGISTICS, + item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM, + item_names.SIEGE_TANK_SPIDER_MINES, + item_names.SIEGE_TANK_JUMP_JETS, + item_names.SIEGE_TANK_INTERNAL_TECH_MODULE, + item_names.SIEGE_TANK_SMART_SERVOS, + # Tanks can't get Laser targeting system in NCO + item_names.BANSHEE_INTERNAL_TECH_MODULE, + item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS, + item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY, # Banshee Special Ordnance + # Banshees can't get laser targeting systems in NCO + item_names.LIBERATOR_CLOAK, + item_names.LIBERATOR_SMART_SERVOS, + item_names.LIBERATOR_OPTIMIZED_LOGISTICS, + # Liberators can't get laser targeting system in NCO + item_names.RAVEN_SPIDER_MINES, + item_names.RAVEN_INTERNAL_TECH_MODULE, + item_names.RAVEN_RAILGUN_TURRET, # Raven Magrail Munitions + item_names.RAVEN_HUNTER_SEEKER_WEAPON, # Raven Special Ordnance + item_names.BATTLECRUISER_INTERNAL_TECH_MODULE, + item_names.BATTLECRUISER_CLOAK, + item_names.BATTLECRUISER_ATX_LASER_BATTERY, # Battlecruiser Special Ordnance + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, +] +item_name_groups[ItemGroupNames.NCO_UPGRADES] = nco_upgrades = nco_baseline_upgrades + nco_unit_technology +item_name_groups[ItemGroupNames.NCO_MAX_PROGRESSIVE_ITEMS] = nco_unit_technology + nova_equipment + terran_generic_upgrades +item_name_groups[ItemGroupNames.NCO_MIN_PROGRESSIVE_ITEMS] = nco_units + nco_baseline_upgrades +item_name_groups[ItemGroupNames.TERRAN_PROGRESSIVE_UPGRADES] = terran_progressive_items = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type in (item_tables.TerranItemType.Progressive, item_tables.TerranItemType.Progressive_2) +] +item_name_groups[ItemGroupNames.WOL_ITEMS] = vanilla_wol_items = ( + wol_units + + wol_buildings + + wol_mercs + + wol_upgrades + + orbital_command_abilities + + terran_generic_upgrades +) + +# Zerg +item_name_groups[ItemGroupNames.ZERG_ITEMS] = zerg_items = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.race == SC2Race.ZERG +] +item_name_groups[ItemGroupNames.ZERG_BUILDINGS] = zerg_buildings = [ + item_names.SPINE_CRAWLER, + item_names.SPORE_CRAWLER, + item_names.BILE_LAUNCHER, + item_names.INFESTED_BUNKER, + item_names.INFESTED_MISSILE_TURRET, + item_names.NYDUS_WORM, + item_names.ECHIDNA_WORM] +item_name_groups[ItemGroupNames.ZERG_NONMORPH_UNITS] = zerg_nonmorph_units = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type in ( + item_tables.ZergItemType.Unit, item_tables.ZergItemType.Mercenary + ) + and item_name not in zerg_buildings +] +item_name_groups[ItemGroupNames.ZERG_MORPHS] = zerg_morphs = [ + item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Morph +] +item_name_groups[ItemGroupNames.ZERG_UNITS] = zerg_units = zerg_nonmorph_units + zerg_morphs +# For W/A upgrades +zerg_ground_units = [ + item_names.ZERGLING, item_names.SWARM_QUEEN, item_names.ROACH, item_names.HYDRALISK, item_names.ABERRATION, + item_names.SWARM_HOST, item_names.INFESTOR, item_names.ULTRALISK, item_names.ZERGLING_BANELING_ASPECT, + item_names.HYDRALISK_LURKER_ASPECT, item_names.HYDRALISK_IMPALER_ASPECT, item_names.ULTRALISK_TYRANNOZOR_ASPECT, + item_names.ROACH_RAVAGER_ASPECT, item_names.DEFILER, item_names.ROACH_PRIMAL_IGNITER_ASPECT, + item_names.PYGALISK, + item_names.INFESTED_MARINE, item_names.INFESTED_BUNKER, item_names.INFESTED_DIAMONDBACK, + item_names.INFESTED_SIEGE_TANK, +] +zerg_melee_wa = [ + item_names.ZERGLING, item_names.ABERRATION, item_names.ULTRALISK, item_names.ZERGLING_BANELING_ASPECT, + item_names.ULTRALISK_TYRANNOZOR_ASPECT, item_names.INFESTED_BUNKER, item_names.PYGALISK, +] +zerg_ranged_wa = [ + item_names.SWARM_QUEEN, item_names.ROACH, item_names.HYDRALISK, item_names.SWARM_HOST, + item_names.HYDRALISK_LURKER_ASPECT, item_names.HYDRALISK_IMPALER_ASPECT, item_names.ULTRALISK_TYRANNOZOR_ASPECT, + item_names.ROACH_RAVAGER_ASPECT, item_names.ROACH_PRIMAL_IGNITER_ASPECT, item_names.INFESTED_MARINE, + item_names.INFESTED_BUNKER, item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_SIEGE_TANK, +] +zerg_air_units = [ + item_names.MUTALISK, item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, + item_names.CORRUPTOR, item_names.BROOD_QUEEN, item_names.SCOURGE, item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, + item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, item_names.INFESTED_BANSHEE, item_names.INFESTED_LIBERATOR, +] +item_name_groups[ItemGroupNames.ZERG_GENERIC_UPGRADES] = zerg_generic_upgrades = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.ZergItemType.Upgrade +] +item_name_groups[ItemGroupNames.HOTS_UNITS] = hots_units = [ + item_names.ZERGLING, item_names.SWARM_QUEEN, item_names.ROACH, item_names.HYDRALISK, + item_names.ABERRATION, item_names.SWARM_HOST, item_names.MUTALISK, + item_names.INFESTOR, item_names.ULTRALISK, + item_names.ZERGLING_BANELING_ASPECT, + item_names.HYDRALISK_LURKER_ASPECT, + item_names.HYDRALISK_IMPALER_ASPECT, + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, +] +item_name_groups[ItemGroupNames.HOTS_BUILDINGS] = hots_buildings = [ + item_names.SPINE_CRAWLER, + item_names.SPORE_CRAWLER, +] +item_name_groups[ItemGroupNames.HOTS_MORPHS] = hots_morphs = [ + item_names.ZERGLING_BANELING_ASPECT, + item_names.HYDRALISK_IMPALER_ASPECT, + item_names.HYDRALISK_LURKER_ASPECT, + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, +] +item_name_groups[ItemGroupNames.ZERG_MERCENARIES] = zerg_mercenaries = [ + item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Mercenary +] +item_name_groups[ItemGroupNames.KERRIGAN_ABILITIES] = kerrigan_abilities = [ + item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Ability +] +item_name_groups[ItemGroupNames.KERRIGAN_PASSIVES] = kerrigan_passives = [ + item_names.KERRIGAN_HEROIC_FORTITUDE, item_names.KERRIGAN_CHAIN_REACTION, + item_names.KERRIGAN_INFEST_BROODLINGS, item_names.KERRIGAN_FURY, item_names.KERRIGAN_ABILITY_EFFICIENCY, +] +item_name_groups[ItemGroupNames.KERRIGAN_ACTIVE_ABILITIES] = kerrigan_active_abilities = [ + item_name for item_name in kerrigan_abilities if item_name not in kerrigan_passives +] +item_name_groups[ItemGroupNames.KERRIGAN_LOGIC_ACTIVE_ABILITIES] = kerrigan_logic_active_abilities = [ + item_name for item_name in kerrigan_active_abilities if item_name != item_names.KERRIGAN_ASSIMILATION_AURA +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_1] = kerrigan_tier_1 = [ + item_names.KERRIGAN_CRUSHING_GRIP, item_names.KERRIGAN_HEROIC_FORTITUDE, item_names.KERRIGAN_LEAPING_STRIKE +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_2] = kerrigan_tier_2= [ + item_names.KERRIGAN_CRUSHING_GRIP, item_names.KERRIGAN_CHAIN_REACTION, item_names.KERRIGAN_PSIONIC_SHIFT +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_3] = kerrigan_tier_3 = [ + item_names.TWIN_DRONES, item_names.AUTOMATED_EXTRACTORS, item_names.ZERGLING_RECONSTITUTION +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_4] = kerrigan_tier_4 = [ + item_names.KERRIGAN_MEND, item_names.KERRIGAN_SPAWN_BANELINGS, item_names.KERRIGAN_WILD_MUTATION +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_5] = kerrigan_tier_5 = [ + item_names.MALIGNANT_CREEP, item_names.VESPENE_EFFICIENCY, item_names.OVERLORD_IMPROVED_OVERLORDS +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_6] = kerrigan_tier_6 = [ + item_names.KERRIGAN_INFEST_BROODLINGS, item_names.KERRIGAN_FURY, item_names.KERRIGAN_ABILITY_EFFICIENCY +] +item_name_groups[ItemGroupNames.KERRIGAN_TIER_7] = kerrigan_tier_7 = [ + item_names.KERRIGAN_APOCALYPSE, item_names.KERRIGAN_SPAWN_LEVIATHAN, item_names.KERRIGAN_DROP_PODS +] +item_name_groups[ItemGroupNames.KERRIGAN_ULTIMATES] = kerrigan_ultimates = [ + *kerrigan_tier_7, item_names.KERRIGAN_ASSIMILATION_AURA, item_names.KERRIGAN_IMMOBILIZATION_WAVE +] +item_name_groups[ItemGroupNames.KERRIGAN_NON_ULTIMATES] = kerrigan_non_ulimates = [ + item for item in kerrigan_abilities if item not in kerrigan_ultimates +] +item_name_groups[ItemGroupNames.KERRIGAN_LOGIC_ULTIMATES] = kerrigan_logic_ultimates = [ + item for item in kerrigan_ultimates if item != item_names.KERRIGAN_ASSIMILATION_AURA +] +item_name_groups[ItemGroupNames.KERRIGAN_NON_ULTIMATE_ACTIVE_ABILITIES] = kerrigan_non_ulimate_active_abilities = [ + item for item in kerrigan_non_ulimates if item in kerrigan_active_abilities +] +item_name_groups[ItemGroupNames.KERRIGAN_HOTS_ABILITIES] = kerrigan_hots_abilities = [ + ability for tiers in [ + kerrigan_tier_1, kerrigan_tier_2, kerrigan_tier_4, kerrigan_tier_6, kerrigan_tier_7 + ] for ability in tiers +] + +item_name_groups[ItemGroupNames.OVERLORD_UPGRADES] = [ + item_names.OVERLORD_ANTENNAE, + item_names.OVERLORD_VENTRAL_SACS, + item_names.OVERLORD_GENERATE_CREEP, + item_names.OVERLORD_PNEUMATIZED_CARAPACE, + item_names.OVERLORD_IMPROVED_OVERLORDS, + item_names.OVERLORD_OVERSEER_ASPECT, +] + +# Zerg Upgrades +item_name_groups[ItemGroupNames.HOTS_STRAINS] = hots_strains = [ + item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ZergItemType.Strain +] +item_name_groups[ItemGroupNames.HOTS_MUTATIONS] = hots_mutations = [ + item_names.ZERGLING_HARDENED_CARAPACE, item_names.ZERGLING_ADRENAL_OVERLOAD, item_names.ZERGLING_METABOLIC_BOOST, + item_names.BANELING_CORROSIVE_ACID, item_names.BANELING_RUPTURE, item_names.BANELING_REGENERATIVE_ACID, + item_names.ROACH_HYDRIODIC_BILE, item_names.ROACH_ADAPTIVE_PLATING, item_names.ROACH_TUNNELING_CLAWS, + item_names.HYDRALISK_FRENZY, item_names.HYDRALISK_ANCILLARY_CARAPACE, item_names.HYDRALISK_GROOVED_SPINES, + item_names.SWARM_HOST_BURROW, item_names.SWARM_HOST_RAPID_INCUBATION, item_names.SWARM_HOST_PRESSURIZED_GLANDS, + item_names.MUTALISK_VICIOUS_GLAIVE, item_names.MUTALISK_RAPID_REGENERATION, item_names.MUTALISK_SUNDERING_GLAIVE, + item_names.ULTRALISK_BURROW_CHARGE, item_names.ULTRALISK_TISSUE_ASSIMILATION, item_names.ULTRALISK_MONARCH_BLADES, +] +item_name_groups[ItemGroupNames.HOTS_GLOBAL_UPGRADES] = hots_global_upgrades = [ + item_names.ZERGLING_RECONSTITUTION, + item_names.OVERLORD_IMPROVED_OVERLORDS, + item_names.AUTOMATED_EXTRACTORS, + item_names.TWIN_DRONES, + item_names.MALIGNANT_CREEP, + item_names.VESPENE_EFFICIENCY, +] +item_name_groups[ItemGroupNames.HOTS_ITEMS] = vanilla_hots_items = ( + hots_units + + hots_buildings + + kerrigan_hots_abilities + + hots_mutations + + hots_strains + + hots_global_upgrades + + zerg_generic_upgrades +) + +# Zerg - Infested Terran (Stukov Co-op) +item_name_groups[ItemGroupNames.INF_TERRAN_UNITS] = infterr_units = [ + item_names.INFESTED_MARINE, + item_names.INFESTED_BUNKER, + item_names.BULLFROG, + item_names.INFESTED_DIAMONDBACK, + item_names.INFESTED_SIEGE_TANK, + item_names.INFESTED_LIBERATOR, + item_names.INFESTED_BANSHEE, +] +item_name_groups[ItemGroupNames.INF_TERRAN_UPGRADES] = infterr_upgrades = [ + item_names.INFESTED_SCV_BUILD_CHARGES, + item_names.INFESTED_MARINE_PLAGUED_MUNITIONS, + item_names.INFESTED_MARINE_RETINAL_AUGMENTATION, + item_names.INFESTED_BUNKER_CALCIFIED_ARMOR, + item_names.INFESTED_BUNKER_REGENERATIVE_PLATING, + item_names.INFESTED_BUNKER_ENGORGED_BUNKERS, + item_names.BULLFROG_WILD_MUTATION, + item_names.BULLFROG_BROODLINGS, + item_names.BULLFROG_HARD_IMPACT, + item_names.BULLFROG_RANGE, + item_names.INFESTED_DIAMONDBACK_CAUSTIC_MUCUS, + item_names.INFESTED_DIAMONDBACK_CONCENTRATED_SPEW, + item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE, + item_names.INFESTED_DIAMONDBACK_VIOLENT_ENZYMES, + item_names.INFESTED_SIEGE_TANK_ACIDIC_ENZYMES, + item_names.INFESTED_SIEGE_TANK_BALANCED_ROOTS, + item_names.INFESTED_SIEGE_TANK_DEEP_TUNNEL, + item_names.INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS, + item_names.INFESTED_SIEGE_TANK_SEISMIC_SONAR, + item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL, + item_names.INFESTED_LIBERATOR_DEFENDER_MODE, + item_names.INFESTED_LIBERATOR_VIRAL_CONTAMINATION, + item_names.INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS, + item_names.INFESTED_BANSHEE_BRACED_EXOSKELETON, + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION, + item_names.INFESTED_DIAMONDBACK_FRIGHTFUL_FLESHWELDER, + item_names.INFESTED_SIEGE_TANK_FRIGHTFUL_FLESHWELDER, + item_names.INFESTED_LIBERATOR_FRIGHTFUL_FLESHWELDER, + item_names.INFESTED_BANSHEE_FRIGHTFUL_FLESHWELDER, + item_names.INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD, + item_names.INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS, +] +item_name_groups[ItemGroupNames.INF_TERRAN_ITEMS] = ( + infterr_units + + infterr_upgrades + + [item_names.INFESTED_MISSILE_TURRET] +) + +# Protoss +item_name_groups[ItemGroupNames.PROTOSS_ITEMS] = protoss_items = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.race == SC2Race.PROTOSS +] +item_name_groups[ItemGroupNames.PROTOSS_UNITS] = protoss_units = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type in (item_tables.ProtossItemType.Unit, item_tables.ProtossItemType.Unit_2) +] +protoss_ground_wa = [ + item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, item_names.SUPPLICANT, + item_names.SENTRY, item_names.ENERGIZER, + item_names.STALKER, item_names.INSTIGATOR, item_names.SLAYER, item_names.DRAGOON, item_names.ADEPT, + item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.ASCENDANT, + item_names.DARK_TEMPLAR, item_names.BLOOD_HUNTER, item_names.AVENGER, + item_names.DARK_ARCHON, + item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD, item_names.STALWART, + item_names.COLOSSUS, item_names.WRATHWALKER, + item_names.REAVER, +] +protoss_air_wa = [ + item_names.WARP_PRISM_PHASE_BLASTER, + item_names.PHOENIX, item_names.MIRAGE, item_names.CORSAIR, item_names.SKIRMISHER, + item_names.VOID_RAY, item_names.DESTROYER, item_names.PULSAR, item_names.DAWNBRINGER, + item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME, + item_names.SCOUT, item_names.TEMPEST, item_names.MOTHERSHIP, + item_names.ARBITER, item_names.ORACLE, item_names.OPPRESSOR, + item_names.CALADRIUS, item_names.MISTWING, +] +item_name_groups[ItemGroupNames.PROTOSS_GENERIC_UPGRADES] = protoss_generic_upgrades = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.ProtossItemType.Upgrade +] +item_name_groups[ItemGroupNames.LOTV_UNITS] = lotv_units = [ + item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, + item_names.STALKER, item_names.DRAGOON, item_names.ADEPT, + item_names.SENTRY, item_names.HAVOC, item_names.ENERGIZER, + item_names.HIGH_TEMPLAR, item_names.DARK_ARCHON, item_names.ASCENDANT, + item_names.DARK_TEMPLAR, item_names.AVENGER, item_names.BLOOD_HUNTER, + item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD, + item_names.COLOSSUS, item_names.WRATHWALKER, item_names.REAVER, + item_names.PHOENIX, item_names.MIRAGE, item_names.CORSAIR, + item_names.VOID_RAY, item_names.DESTROYER, item_names.ARBITER, + item_names.CARRIER, item_names.TEMPEST, item_names.MOTHERSHIP, +] +item_name_groups[ItemGroupNames.PROPHECY_UNITS] = prophecy_units = [ + item_names.ZEALOT, item_names.STALKER, item_names.HIGH_TEMPLAR, item_names.DARK_TEMPLAR, + item_names.OBSERVER, item_names.COLOSSUS, + item_names.PHOENIX, item_names.VOID_RAY, item_names.CARRIER, +] +item_name_groups[ItemGroupNames.PROPHECY_BUILDINGS] = prophecy_buildings = [ + item_names.PHOTON_CANNON, +] +item_name_groups[ItemGroupNames.GATEWAY_UNITS] = gateway_units = [ + item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, item_names.SUPPLICANT, + item_names.STALKER, item_names.INSTIGATOR, item_names.SLAYER, + item_names.SENTRY, item_names.HAVOC, item_names.ENERGIZER, + item_names.DRAGOON, item_names.ADEPT, item_names.DARK_ARCHON, + item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.ASCENDANT, + item_names.DARK_TEMPLAR, item_names.AVENGER, item_names.BLOOD_HUNTER, +] +item_name_groups[ItemGroupNames.ROBO_UNITS] = robo_units = [ + item_names.WARP_PRISM, item_names.OBSERVER, + item_names.IMMORTAL, item_names.ANNIHILATOR, item_names.VANGUARD, item_names.STALWART, + item_names.COLOSSUS, item_names.WRATHWALKER, + item_names.REAVER, item_names.DISRUPTOR, +] +item_name_groups[ItemGroupNames.STARGATE_UNITS] = stargate_units = [ + item_names.PHOENIX, item_names.SKIRMISHER, item_names.MIRAGE, item_names.CORSAIR, + item_names.VOID_RAY, item_names.DESTROYER, item_names.PULSAR, item_names.DAWNBRINGER, + item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME, + item_names.TEMPEST, item_names.SCOUT, item_names.MOTHERSHIP, + item_names.ARBITER, item_names.ORACLE, item_names.OPPRESSOR, + item_names.CALADRIUS, item_names.MISTWING, +] +item_name_groups[ItemGroupNames.PROTOSS_BUILDINGS] = protoss_buildings = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type == item_tables.ProtossItemType.Building +] +item_name_groups[ItemGroupNames.AIUR_UNITS] = [ + item_names.ZEALOT, item_names.DRAGOON, item_names.SENTRY, item_names.AVENGER, item_names.HIGH_TEMPLAR, + item_names.IMMORTAL, item_names.REAVER, + item_names.PHOENIX, item_names.SCOUT, item_names.ARBITER, item_names.CARRIER, +] +item_name_groups[ItemGroupNames.NERAZIM_UNITS] = [ + item_names.CENTURION, item_names.STALKER, item_names.DARK_TEMPLAR, item_names.SIGNIFIER, item_names.DARK_ARCHON, + item_names.ANNIHILATOR, + item_names.CORSAIR, item_names.ORACLE, item_names.VOID_RAY, item_names.MISTWING, +] +item_name_groups[ItemGroupNames.TAL_DARIM_UNITS] = [ + item_names.SUPPLICANT, item_names.SLAYER, item_names.HAVOC, item_names.BLOOD_HUNTER, item_names.ASCENDANT, + item_names.VANGUARD, item_names.WRATHWALKER, + item_names.SKIRMISHER, item_names.DESTROYER, item_names.SKYLORD, item_names.MOTHERSHIP, item_names.OPPRESSOR, +] +item_name_groups[ItemGroupNames.PURIFIER_UNITS] = [ + item_names.SENTINEL, item_names.ADEPT, item_names.INSTIGATOR, item_names.ENERGIZER, + item_names.STALWART, item_names.COLOSSUS, item_names.DISRUPTOR, + item_names.MIRAGE, item_names.DAWNBRINGER, item_names.TRIREME, item_names.TEMPEST, + item_names.CALADRIUS, +] +item_name_groups[ItemGroupNames.SOA_ITEMS] = soa_items = [ + *[item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ProtossItemType.Spear_Of_Adun], + item_names.SOA_PROGRESSIVE_PROXY_PYLON, +] +lotv_soa_items = [item_name for item_name in soa_items if item_name != item_names.SOA_PYLON_OVERCHARGE] +item_name_groups[ItemGroupNames.PROTOSS_GLOBAL_UPGRADES] = [ + item_name for item_name, item_data in item_tables.item_table.items() if item_data.type == item_tables.ProtossItemType.Solarite_Core +] +item_name_groups[ItemGroupNames.LOTV_GLOBAL_UPGRADES] = lotv_global_upgrades = [ + item_names.NEXUS_OVERCHARGE, + item_names.ORBITAL_ASSIMILATORS, + item_names.WARP_HARMONIZATION, + item_names.MATRIX_OVERLOAD, + item_names.GUARDIAN_SHELL, + item_names.RECONSTRUCTION_BEAM, +] +item_name_groups[ItemGroupNames.WAR_COUNCIL] = war_council_upgrades = [ + item_name for item_name, item_data in item_tables.item_table.items() + if item_data.type in (item_tables.ProtossItemType.War_Council, item_tables.ProtossItemType.War_Council_2) +] + +lotv_war_council_upgrades = [ + item_name for item_name, item_data in item_tables.item_table.items() + if ( + item_name in war_council_upgrades + and item_data.parent in item_name_groups[ItemGroupNames.LOTV_UNITS] + # Destroyers get a custom (non-vanilla) buff, not a nerf over their vanilla council state + and item_name != item_names.DESTROYER_REFORGED_BLOODSHARD_CORE + ) +] +item_name_groups[ItemGroupNames.LOTV_ITEMS] = vanilla_lotv_items = ( + lotv_units + + protoss_buildings + + lotv_soa_items + + lotv_global_upgrades + + protoss_generic_upgrades + + lotv_war_council_upgrades +) + +item_name_groups[ItemGroupNames.VANILLA_ITEMS] = vanilla_items = ( + vanilla_wol_items + vanilla_hots_items + vanilla_lotv_items +) + +item_name_groups[ItemGroupNames.OVERPOWERED_ITEMS] = overpowered_items = [ + # Terran general + item_names.SIEGE_TANK_GRADUATING_RANGE, + item_names.RAVEN_HUNTER_SEEKER_WEAPON, + item_names.BATTLECRUISER_ATX_LASER_BATTERY, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, + item_names.MECHANICAL_KNOW_HOW, + item_names.MERCENARY_MUNITIONS, + + # Terran Mind Control + item_names.HIVE_MIND_EMULATOR, + item_names.PSI_INDOCTRINATOR, + item_names.ARGUS_AMPLIFIER, + + # Zerg Mind Control + item_names.INFESTOR, + + # Protoss Mind Control + item_names.DARK_ARCHON_INDOMITABLE_WILL, + + # Nova + item_names.NOVA_PLASMA_RIFLE, + + # Kerrigan + item_names.KERRIGAN_APOCALYPSE, + item_names.KERRIGAN_DROP_PODS, + item_names.KERRIGAN_SPAWN_LEVIATHAN, + item_names.KERRIGAN_IMMOBILIZATION_WAVE, + + # SOA + item_names.SOA_TIME_STOP, + item_names.SOA_SOLAR_LANCE, + item_names.SOA_DEPLOY_FENIX, + # Note: This is more an issue of having multiple ults at the same time, rather than solar bombardment in particular. + # Can be removed from the list if we get an SOA ult combined cooldown or energy cost on it. + item_names.SOA_SOLAR_BOMBARDMENT, + + # Protoss general + item_names.QUATRO, + item_names.MOTHERSHIP_INTEGRATED_POWER, + item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING, + + # Mindless Broodwar garbage + item_names.GHOST_BARGAIN_BIN_PRICES, + item_names.SPECTRE_BARGAIN_BIN_PRICES, + item_names.REAVER_BARGAIN_BIN_PRICES, + item_names.SCOUT_SUPPLY_EFFICIENCY, +] + +# Items not aimed to be officially released +# These need further balancing, and they shouldn't generate normally unless explicitly locked +# Added here to not confuse the client +item_name_groups[ItemGroupNames.UNRELEASED_ITEMS] = unreleased_items = [ + item_names.PRIDE_OF_AUGUSTRGRAD, + item_names.SKY_FURY, + item_names.SHOCK_DIVISION, + item_names.BLACKHAMMER, + item_names.AEGIS_GUARD, + item_names.EMPERORS_SHADOW, + item_names.SON_OF_KORHAL, + item_names.BULWARK_COMPANY, + item_names.FIELD_RESPONSE_THETA, + item_names.EMPERORS_GUARDIAN, + item_names.NIGHT_HAWK, + item_names.NIGHT_WOLF, + item_names.EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES, +] + +# A place for traits that were released before but are to be taken down by default. +# If an item gets split to multiple ones, the original one should be set deprecated instead (see Orbital Command for an example). +# This is a place if you want to nerf or disable by default a previously released trait. +# Currently, it disables only the topmost level of the progressives. +# Don't place here anything that's present in the vanilla campaigns (if it's overpowered, use overpowered items instead) +item_name_groups[ItemGroupNames.LEGACY_ITEMS] = legacy_items = [ + item_names.ASCENDANT_ARCHON_MERGE, +] + +item_name_groups[ItemGroupNames.KEYS] = keys = [ + item_name for item_name in key_item_table.keys() +] diff --git a/worlds/sc2/item/item_names.py b/worlds/sc2/item/item_names.py new file mode 100644 index 0000000000..2fbd64bd3a --- /dev/null +++ b/worlds/sc2/item/item_names.py @@ -0,0 +1,957 @@ +""" +A complete collection of Starcraft 2 item names as strings. +Users of this data may make some assumptions about the structure of a name: +* The upgrade for a unit will end with the unit's name in parentheses +* Weapon / armor upgrades may be grouped by a common prefix specified within this file +""" + +# Terran Units +MARINE = "Marine" +MEDIC = "Medic" +FIREBAT = "Firebat" +MARAUDER = "Marauder" +REAPER = "Reaper" +HELLION = "Hellion" +VULTURE = "Vulture" +GOLIATH = "Goliath" +DIAMONDBACK = "Diamondback" +SIEGE_TANK = "Siege Tank" +MEDIVAC = "Medivac" +WRAITH = "Wraith" +VIKING = "Viking" +BANSHEE = "Banshee" +BATTLECRUISER = "Battlecruiser" +GHOST = "Ghost" +SPECTRE = "Spectre" +THOR = "Thor" +RAVEN = "Raven" +SCIENCE_VESSEL = "Science Vessel" +PREDATOR = "Predator" +HERCULES = "Hercules" +# Extended units +LIBERATOR = "Liberator" +VALKYRIE = "Valkyrie" +WIDOW_MINE = "Widow Mine" +CYCLONE = "Cyclone" +HERC = "HERC" +WARHOUND = "Warhound" +DOMINION_TROOPER = "Dominion Trooper" +# Elites +PRIDE_OF_AUGUSTRGRAD = "Pride of Augustgrad" +SKY_FURY = "Sky Fury" +SHOCK_DIVISION = "Shock Division" +BLACKHAMMER = "Blackhammer" +AEGIS_GUARD = "Aegis Guard" +EMPERORS_SHADOW = "Emperor's Shadow" +SON_OF_KORHAL = "Son of Korhal" +BULWARK_COMPANY = "Bulwark Company" +FIELD_RESPONSE_THETA = "Field Response Theta" +EMPERORS_GUARDIAN = "Emperor's Guardian" +NIGHT_HAWK = "Night Hawk" +NIGHT_WOLF = "Night Wolf" + +# Terran Buildings +BUNKER = "Bunker" +MISSILE_TURRET = "Missile Turret" +SENSOR_TOWER = "Sensor Tower" +PLANETARY_FORTRESS = "Planetary Fortress" +PERDITION_TURRET = "Perdition Turret" +# HIVE_MIND_EMULATOR = "Hive Mind Emulator"# moved to Lab / Global upgrades +# PSI_DISRUPTER = "Psi Disrupter" # moved to Lab / Global upgrades +DEVASTATOR_TURRET = "Devastator Turret" + +# Terran Weapon / Armor Upgrades +TERRAN_UPGRADE_PREFIX = "Progressive Terran" +TERRAN_INFANTRY_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Infantry" +TERRAN_VEHICLE_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Vehicle" +TERRAN_SHIP_UPGRADE_PREFIX = f"{TERRAN_UPGRADE_PREFIX} Ship" + +PROGRESSIVE_TERRAN_INFANTRY_WEAPON = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Weapon" +PROGRESSIVE_TERRAN_INFANTRY_ARMOR = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Armor" +PROGRESSIVE_TERRAN_VEHICLE_WEAPON = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Weapon" +PROGRESSIVE_TERRAN_VEHICLE_ARMOR = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Armor" +PROGRESSIVE_TERRAN_SHIP_WEAPON = f"{TERRAN_SHIP_UPGRADE_PREFIX} Weapon" +PROGRESSIVE_TERRAN_SHIP_ARMOR = f"{TERRAN_SHIP_UPGRADE_PREFIX} Armor" +PROGRESSIVE_TERRAN_WEAPON_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Weapon Upgrade" +PROGRESSIVE_TERRAN_ARMOR_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Armor Upgrade" +PROGRESSIVE_TERRAN_INFANTRY_UPGRADE = f"{TERRAN_INFANTRY_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_TERRAN_VEHICLE_UPGRADE = f"{TERRAN_VEHICLE_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_TERRAN_SHIP_UPGRADE = f"{TERRAN_SHIP_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE = f"{TERRAN_UPGRADE_PREFIX} Weapon/Armor Upgrade" + +# Mercenaries +WAR_PIGS = "War Pigs" +DEVIL_DOGS = "Devil Dogs" +HAMMER_SECURITIES = "Hammer Securities" +SPARTAN_COMPANY = "Spartan Company" +SIEGE_BREAKERS = "Siege Breakers" +HELS_ANGELS = "Hel's Angels" +DUSK_WINGS = "Dusk Wings" +JACKSONS_REVENGE = "Jackson's Revenge" +SKIBIS_ANGELS = "Skibi's Angels" +DEATH_HEADS = "Death Heads" +WINGED_NIGHTMARES = "Winged Nightmares" +MIDNIGHT_RIDERS = "Midnight Riders" +BRYNHILDS = "Brynhilds" +JOTUN = "Jotun" + +# Lab / Global +ULTRA_CAPACITORS = "Ultra-Capacitors (Terran)" +VANADIUM_PLATING = "Vanadium Plating (Terran)" +ORBITAL_DEPOTS = "Orbital Depots (Terran)" +MICRO_FILTERING = "Micro-Filtering (Terran)" +AUTOMATED_REFINERY = "Automated Refinery (Terran)" +COMMAND_CENTER_COMMAND_CENTER_REACTOR = "Command Center Reactor (Command Center)" +COMMAND_CENTER_SCANNER_SWEEP = "Scanner Sweep (Command Center)" +COMMAND_CENTER_MULE = "MULE (Command Center)" +COMMAND_CENTER_EXTRA_SUPPLIES = "Extra Supplies (Command Center)" +TECH_REACTOR = "Tech Reactor (Terran)" +ORBITAL_STRIKE = "Orbital Strike (Barracks)" +CELLULAR_REACTOR = "Cellular Reactor (Terran)" +PROGRESSIVE_REGENERATIVE_BIO_STEEL = "Progressive Regenerative Bio-Steel (Terran)" +PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM = "Progressive Fire-Suppression System (Terran)" +STRUCTURE_ARMOR = "Structure Armor (Terran)" +HI_SEC_AUTO_TRACKING = "Hi-Sec Auto Tracking (Terran)" +ADVANCED_OPTICS = "Advanced Optics (Terran)" +ROGUE_FORCES = "Rogue Forces (Terran)" +MECHANICAL_KNOW_HOW = "Mechanical Know-how (Terran)" +MERCENARY_MUNITIONS = "Mercenary Munitions (Terran)" +PROGRESSIVE_FAST_DELIVERY = "Progressive Fast Delivery (Terran)" +RAPID_REINFORCEMENT = "Rapid Reinforcement (Terran)" +FUSION_CORE_FUSION_REACTOR = "Fusion Reactor (Fusion Core)" +PSI_DISRUPTER = "Psi Disrupter" +PSI_SCREEN = "Psi Screen (Psi Disrupter)" +SONIC_DISRUPTER = "Sonic Disrupter (Psi Disrupter)" +HIVE_MIND_EMULATOR = "Hive Mind Emulator" +PSI_INDOCTRINATOR = "Psi Indoctrinator (Hive Mind Emulator)" +ARGUS_AMPLIFIER = "Argus Amplifier (Hive Mind Emulator)" +SIGNAL_BEACON = "Signal Beacon (Terran)" + +# Terran Unit Upgrades +BANSHEE_HYPERFLIGHT_ROTORS = "Hyperflight Rotors (Banshee)" +BANSHEE_INTERNAL_TECH_MODULE = "Internal Tech Module (Banshee)" +BANSHEE_LASER_TARGETING_SYSTEM = "Laser Targeting System (Banshee)" +BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS = "Progressive Cross-Spectrum Dampeners (Banshee)" +BANSHEE_SHOCKWAVE_MISSILE_BATTERY = "Shockwave Missile Battery (Banshee)" +BANSHEE_SHAPED_HULL = "Shaped Hull (Banshee)" +BANSHEE_ADVANCED_TARGETING_OPTICS = "Advanced Targeting Optics (Banshee)" +BANSHEE_DISTORTION_BLASTERS = "Distortion Blasters (Banshee)" +BANSHEE_ROCKET_BARRAGE = "Rocket Barrage (Banshee)" +BATTLECRUISER_ATX_LASER_BATTERY = "ATX Laser Battery (Battlecruiser)" +BATTLECRUISER_CLOAK = "Cloak (Battlecruiser)" +BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX = "Progressive Defensive Matrix (Battlecruiser)" +BATTLECRUISER_INTERNAL_TECH_MODULE = "Internal Tech Module (Battlecruiser)" +BATTLECRUISER_PROGRESSIVE_MISSILE_PODS = "Progressive Missile Pods (Battlecruiser)" +BATTLECRUISER_OPTIMIZED_LOGISTICS = "Optimized Logistics (Battlecruiser)" +BATTLECRUISER_TACTICAL_JUMP = "Tactical Jump (Battlecruiser)" +BATTLECRUISER_BEHEMOTH_PLATING = "Behemoth Plating (Battlecruiser)" +BATTLECRUISER_MOIRAI_IMPULSE_DRIVE = "Moirai Impulse Drive (Battlecruiser)" +BATTLECRUISER_BEHEMOTH_REACTOR = "Behemoth Reactor (Battlecruiser)" +BATTLECRUISER_FIELD_ASSIST_TARGETING_SYSTEM = "Field-Assist Target System (Battlecruiser)" +CYCLONE_MAG_FIELD_ACCELERATORS = "Mag-Field Accelerators (Cyclone)" +CYCLONE_MAG_FIELD_LAUNCHERS = "Mag-Field Launchers (Cyclone)" +CYCLONE_RAPID_FIRE_LAUNCHERS = "Rapid Fire Launchers (Cyclone)" +CYCLONE_TARGETING_OPTICS = "Targeting Optics (Cyclone)" +CYCLONE_RESOURCE_EFFICIENCY = "Resource Efficiency (Cyclone)" +CYCLONE_INTERNAL_TECH_MODULE = "Internal Tech Module (Cyclone)" +DIAMONDBACK_BURST_CAPACITORS = "Burst Capacitors (Diamondback)" +DIAMONDBACK_HYPERFLUXOR = "Hyperfluxor (Diamondback)" +DIAMONDBACK_RESOURCE_EFFICIENCY = "Resource Efficiency (Diamondback)" +DIAMONDBACK_SHAPED_HULL = "Shaped Hull (Diamondback)" +DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL = "Progressive Tri-Lithium Power Cell (Diamondback)" +DIAMONDBACK_MAGLEV_PROPULSION = "Maglev Propulsion (Diamondback)" +DOMINION_TROOPER_B2_HIGH_CAL_LMG = "B-2 High-Cal LMG (Dominion Trooper)" +DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER = "CPO-7 Salamander Flamethrower (Dominion Trooper)" +DOMINION_TROOPER_HAILSTORM_LAUNCHER = "Hailstorm Launcher (Dominion Trooper)" +DOMINION_TROOPER_ADVANCED_ALLOYS = "Advanced Alloys (Dominion Trooper)" +DOMINION_TROOPER_OPTIMIZED_LOGISTICS = "Optimized Logistics (Dominion Trooper)" +EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES = "Sovereign Tactical Missiles (Emperor's Shadow)" +FIREBAT_INCINERATOR_GAUNTLETS = "Incinerator Gauntlets (Firebat)" +FIREBAT_JUGGERNAUT_PLATING = "Juggernaut Plating (Firebat)" +FIREBAT_RESOURCE_EFFICIENCY = "Resource Efficiency (Firebat)" +FIREBAT_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Firebat)" +FIREBAT_INFERNAL_PRE_IGNITER = "Infernal Pre-Igniter (Firebat)" +FIREBAT_KINETIC_FOAM = "Kinetic Foam (Firebat)" +FIREBAT_NANO_PROJECTORS = "Nano Projectors (Firebat)" +GHOST_CRIUS_SUIT = "Crius Suit (Ghost)" +GHOST_EMP_ROUNDS = "EMP Rounds (Ghost)" +GHOST_LOCKDOWN = "Lockdown (Ghost)" +GHOST_OCULAR_IMPLANTS = "Ocular Implants (Ghost)" +GHOST_RESOURCE_EFFICIENCY = "Resource Efficiency (Ghost)" +GHOST_BARGAIN_BIN_PRICES = "Bargain Bin Prices (Ghost)" +GOLIATH_ARES_CLASS_TARGETING_SYSTEM = "Ares-Class Targeting System (Goliath)" +GOLIATH_JUMP_JETS = "Jump Jets (Goliath)" +GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM = "Multi-Lock Weapons System (Goliath)" +GOLIATH_OPTIMIZED_LOGISTICS = "Optimized Logistics (Goliath)" +GOLIATH_SHAPED_HULL = "Shaped Hull (Goliath)" +GOLIATH_RESOURCE_EFFICIENCY = "Resource Efficiency (Goliath)" +GOLIATH_INTERNAL_TECH_MODULE = "Internal Tech Module (Goliath)" +HELLION_HELLBAT = "Hellbat (Hellion Morph)" +HELLION_JUMP_JETS = "Jump Jets (Hellion)" +HELLION_OPTIMIZED_LOGISTICS = "Optimized Logistics (Hellion)" +HELLION_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Hellion)" +HELLION_SMART_SERVOS = "Smart Servos (Hellion)" +HELLION_THERMITE_FILAMENTS = "Thermite Filaments (Hellion)" +HELLION_TWIN_LINKED_FLAMETHROWER = "Twin-Linked Flamethrower (Hellion)" +HELLION_INFERNAL_PLATING = "Infernal Plating (Hellion)" +HERC_JUGGERNAUT_PLATING = "Juggernaut Plating (HERC)" +HERC_KINETIC_FOAM = "Kinetic Foam (HERC)" +HERC_RESOURCE_EFFICIENCY = "Resource Efficiency (HERC)" +HERC_GRAPPLE_PULL = "Grapple Pull (HERC)" +HERCULES_INTERNAL_FUSION_MODULE = "Internal Fusion Module (Hercules)" +HERCULES_TACTICAL_JUMP = "Tactical Jump (Hercules)" +LIBERATOR_ADVANCED_BALLISTICS = "Advanced Ballistics (Liberator)" +LIBERATOR_CLOAK = "Cloak (Liberator)" +LIBERATOR_LASER_TARGETING_SYSTEM = "Laser Targeting System (Liberator)" +LIBERATOR_OPTIMIZED_LOGISTICS = "Optimized Logistics (Liberator)" +LIBERATOR_RAID_ARTILLERY = "Raid Artillery (Liberator)" +LIBERATOR_SMART_SERVOS = "Smart Servos (Liberator)" +LIBERATOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Liberator)" +LIBERATOR_GUERILLA_MISSILES = "Guerilla Missiles (Liberator)" +LIBERATOR_UED_MISSILE_TECHNOLOGY = "UED Missile Technology (Liberator)" +MARAUDER_CONCUSSIVE_SHELLS = "Concussive Shells (Marauder)" +MARAUDER_INTERNAL_TECH_MODULE = "Internal Tech Module (Marauder)" +MARAUDER_KINETIC_FOAM = "Kinetic Foam (Marauder)" +MARAUDER_LASER_TARGETING_SYSTEM = "Laser Targeting System (Marauder)" +MARAUDER_MAGRAIL_MUNITIONS = "Magrail Munitions (Marauder)" +MARAUDER_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Marauder)" +MARAUDER_JUGGERNAUT_PLATING = "Juggernaut Plating (Marauder)" +MARINE_COMBAT_SHIELD = "Combat Shield (Marine)" +MARINE_LASER_TARGETING_SYSTEM = "Laser Targeting System (Marine)" +MARINE_MAGRAIL_MUNITIONS = "Magrail Munitions (Marine)" +MARINE_OPTIMIZED_LOGISTICS = "Optimized Logistics (Marine)" +MARINE_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Marine)" +MEDIC_ADVANCED_MEDIC_FACILITIES = "Advanced Medic Facilities (Medic)" +MEDIC_OPTICAL_FLARE = "Optical Flare (Medic)" +MEDIC_RESOURCE_EFFICIENCY = "Resource Efficiency (Medic)" +MEDIC_RESTORATION = "Restoration (Medic)" +MEDIC_STABILIZER_MEDPACKS = "Stabilizer Medpacks (Medic)" +MEDIC_ADAPTIVE_MEDPACKS = "Adaptive Medpacks (Medic)" +MEDIC_NANO_PROJECTOR = "Nano Projector (Medic)" +MEDIVAC_ADVANCED_HEALING_AI = "Advanced Healing AI (Medivac)" +MEDIVAC_AFTERBURNERS = "Afterburners (Medivac)" +MEDIVAC_EXPANDED_HULL = "Expanded Hull (Medivac)" +MEDIVAC_RAPID_DEPLOYMENT_TUBE = "Rapid Deployment Tube (Medivac)" +MEDIVAC_SCATTER_VEIL = "Scatter Veil (Medivac)" +MEDIVAC_ADVANCED_CLOAKING_FIELD = "Advanced Cloaking Field (Medivac)" +MEDIVAC_RAPID_REIGNITION_SYSTEMS = "Rapid Reignition Systems (Medivac)" +MEDIVAC_RESOURCE_EFFICIENCY = "Resource Efficiency (Medivac)" +PREDATOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Predator)" +PREDATOR_CLOAK = "Phase Cloak (Predator)" +PREDATOR_CHARGE = "Concussive Charge (Predator)" +PREDATOR_VESPENE_SYNTHESIS = "Vespene Synthesis (Predator)" +PREDATOR_ADAPTIVE_DEFENSES = "Adaptive Defenses (Predator)" +RAVEN_ANTI_ARMOR_MISSILE = "Anti-Armor Missile (Raven)" +RAVEN_BIO_MECHANICAL_REPAIR_DRONE = "Bio Mechanical Repair Drone (Raven)" +RAVEN_HUNTER_SEEKER_WEAPON = "Hunter-Seeker Weapon (Raven)" +RAVEN_INTERFERENCE_MATRIX = "Interference Matrix (Raven)" +RAVEN_INTERNAL_TECH_MODULE = "Internal Tech Module (Raven)" +RAVEN_RAILGUN_TURRET = "Railgun Turret (Raven)" +RAVEN_SPIDER_MINES = "Spider Mines (Raven)" +RAVEN_RESOURCE_EFFICIENCY = "Resource Efficiency (Raven)" +RAVEN_DURABLE_MATERIALS = "Durable Materials (Raven)" +REAPER_ADVANCED_CLOAKING_FIELD = "Advanced Cloaking Field (Reaper)" +REAPER_COMBAT_DRUGS = "Combat Drugs (Reaper)" +REAPER_G4_CLUSTERBOMB = "G-4 Clusterbomb (Reaper)" +REAPER_LASER_TARGETING_SYSTEM = "Laser Targeting System (Reaper)" +REAPER_PROGRESSIVE_STIMPACK = "Progressive Stimpack (Reaper)" +REAPER_SPIDER_MINES = "Spider Mines (Reaper)" +REAPER_U238_ROUNDS = "U-238 Rounds (Reaper)" +REAPER_JET_PACK_OVERDRIVE = "Jet Pack Overdrive (Reaper)" +REAPER_RESOURCE_EFFICIENCY = "Resource Efficiency (Reaper)" +REAPER_BALLISTIC_FLIGHTSUIT = "Ballistic Flightsuit (Reaper)" +SCIENCE_VESSEL_DEFENSIVE_MATRIX = "Defensive Matrix (Science Vessel)" +SCIENCE_VESSEL_EMP_SHOCKWAVE = "EMP Shockwave (Science Vessel)" +SCIENCE_VESSEL_IMPROVED_NANO_REPAIR = "Improved Nano-Repair (Science Vessel)" +SCIENCE_VESSEL_MAGELLAN_COMPUTATION_SYSTEMS = "Magellan Computation Systems (Science Vessel)" +SCIENCE_VESSEL_TACTICAL_JUMP = "Tactical Jump (Science Vessel)" +SCV_ADVANCED_CONSTRUCTION = "Advanced Construction (SCV)" +SCV_DUAL_FUSION_WELDERS = "Dual-Fusion Welders (SCV)" +SCV_HOSTILE_ENVIRONMENT_ADAPTATION = "Hostile Environment Adaptation (SCV)" +SCV_CONSTRUCTION_JUMP_JETS = "Construction Jump Jets (SCV)" +SIEGE_TANK_ADVANCED_SIEGE_TECH = "Advanced Siege Tech (Siege Tank)" +SIEGE_TANK_GRADUATING_RANGE = "Graduating Range (Siege Tank)" +SIEGE_TANK_INTERNAL_TECH_MODULE = "Internal Tech Module (Siege Tank)" +SIEGE_TANK_JUMP_JETS = "Jump Jets (Siege Tank)" +SIEGE_TANK_LASER_TARGETING_SYSTEM = "Laser Targeting System (Siege Tank)" +SIEGE_TANK_MAELSTROM_ROUNDS = "Maelstrom Rounds (Siege Tank)" +SIEGE_TANK_SHAPED_BLAST = "Shaped Blast (Siege Tank)" +SIEGE_TANK_SMART_SERVOS = "Smart Servos (Siege Tank)" +SIEGE_TANK_SPIDER_MINES = "Spider Mines (Siege Tank)" +SIEGE_TANK_SHAPED_HULL = "Shaped Hull (Siege Tank)" +SIEGE_TANK_RESOURCE_EFFICIENCY = "Resource Efficiency (Siege Tank)" +SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK = "Progressive Transport Hook (Siege Tank)" +SIEGE_TANK_ALLTERRAIN_TREADS = "All-Terrain Treads (Siege Tank)" +SPECTRE_IMPALER_ROUNDS = "Impaler Rounds (Spectre)" +SPECTRE_NYX_CLASS_CLOAKING_MODULE = "Nyx-Class Cloaking Module (Spectre)" +SPECTRE_PSIONIC_LASH = "Psionic Lash (Spectre)" +SPECTRE_RESOURCE_EFFICIENCY = "Resource Efficiency (Spectre)" +SPECTRE_BARGAIN_BIN_PRICES = "Bargain Bin Prices (Spectre)" +SPIDER_MINE_CERBERUS_MINE = "Cerberus Mine (Spider Mine)" +SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION = "High Explosive Munition (Spider Mine)" +THOR_330MM_BARRAGE_CANNON = "330mm Barrage Cannon (Thor)" +THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL = "Progressive Immortality Protocol (Thor)" +THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD = "Progressive High Impact Payload (Thor)" +THOR_BUTTON_WITH_A_SKULL_ON_IT = "Button With a Skull on It (Thor)" +THOR_LASER_TARGETING_SYSTEM = "Laser Targeting System (Thor)" +THOR_LARGE_SCALE_FIELD_CONSTRUCTION = "Large Scale Field Construction (Thor)" +THOR_RAPID_RELOAD = "Rapid Reload (Thor)" +VALKYRIE_AFTERBURNERS = "Afterburners (Valkyrie)" +VALKYRIE_FLECHETTE_MISSILES = "Flechette Missiles (Valkyrie)" +VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS = "Enhanced Cluster Launchers (Valkyrie)" +VALKYRIE_SHAPED_HULL = "Shaped Hull (Valkyrie)" +VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR = "Launching Vector Compensator (Valkyrie)" +VALKYRIE_RESOURCE_EFFICIENCY = "Resource Efficiency (Valkyrie)" +VIKING_ANTI_MECHANICAL_MUNITION = "Anti-Mechanical Munition (Viking)" +VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM = "Phobos-Class Weapons System (Viking)" +VIKING_RIPWAVE_MISSILES = "Ripwave Missiles (Viking)" +VIKING_SMART_SERVOS = "Smart Servos (Viking)" +VIKING_SHREDDER_ROUNDS = "Shredder Rounds (Viking)" +VIKING_WILD_MISSILES = "W.I.L.D. Missiles (Viking)" +VIKING_AESIR_TURBINES = "Aesir Turbines (Viking)" +VULTURE_AUTO_LAUNCHERS = "Auto Launchers (Vulture)" +VULTURE_ION_THRUSTERS = "Ion Thrusters (Vulture)" +VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE = "Progressive Replenishable Magazine (Vulture)" +VULTURE_JERRYRIGGED_PATCHUP = "Jerry-Rigged Patchup (Vulture)" +WARHOUND_RESOURCE_EFFICIENCY = "Resource Efficiency (Warhound)" +WARHOUND_AXIOM_PLATING = "Axiom Plating (Warhound)" +WARHOUND_DEPLOY_TURRET = "Deploy Turret (Warhound)" +WIDOW_MINE_BLACK_MARKET_LAUNCHERS = "Black Market Launchers (Widow Mine)" +WIDOW_MINE_CONCEALMENT = "Concealment (Widow Mine)" +WIDOW_MINE_DEMOLITION_PAYLOAD = "Demolition Payload (Widow Mine)" +WIDOW_MINE_DRILLING_CLAWS = "Drilling Claws (Widow Mine)" +WIDOW_MINE_EXECUTIONER_MISSILES = "Executioner Missiles (Widow Mine)" +WIDOW_MINE_RESOURCE_EFFICIENCY = "Resource Efficiency (Widow Mine)" +WRAITH_ADVANCED_LASER_TECHNOLOGY = "Advanced Laser Technology (Wraith)" +WRAITH_DISPLACEMENT_FIELD = "Displacement Field (Wraith)" +WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS = "Progressive Tomahawk Power Cells (Wraith)" +WRAITH_TRIGGER_OVERRIDE = "Trigger Override (Wraith)" +WRAITH_INTERNAL_TECH_MODULE = "Internal Tech Module (Wraith)" +WRAITH_RESOURCE_EFFICIENCY = "Resource Efficiency (Wraith)" + +# Terran Building upgrades +BUNKER_NEOSTEEL_BUNKER = "Neosteel Bunker (Bunker)" +BUNKER_PROJECTILE_ACCELERATOR = "Projectile Accelerator (Bunker)" +BUNKER_SHRIKE_TURRET = "Shrike Turret (Bunker)" +BUNKER_FORTIFIED_BUNKER = "Fortified Bunker (Bunker)" +DEVASTATOR_TURRET_ANTI_ARMOR_MUNITIONS = "Anti-Armor Munitions (Devastator Turret)" +DEVASTATOR_TURRET_CONCUSSIVE_GRENADES = "Concussive Grenades (Devastator Turret)" +DEVASTATOR_TURRET_RESOURCE_EFFICIENCY = "Resource Efficiency (Devastator Turret)" +MISSILE_TURRET_HELLSTORM_BATTERIES = "Hellstorm Batteries (Missile Turret)" +MISSILE_TURRET_TITANIUM_HOUSING = "Titanium Housing (Missile Turret)" +MISSILE_TURRET_RESOURCE_EFFICENCY = "Resource Efficiency (Missile Turret)" +PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS = "Progressive Augmented Thrusters (Planetary Fortress)" +PLANETARY_FORTRESS_IBIKS_TRACKING_SCANNERS = "Ibiks Tracking Scanners (Planetary Fortress)" +PLANETARY_FORTRESS_ORBITAL_MODULE = "Orbital Module (Planetary Fortress)" +SENSOR_TOWER_ASSISTIVE_TARGETING = "Assistive Targeting (Sensor Tower)" +SENSOR_TOWER_MUILTISPECTRUM_DOPPLER = "Multispectrum Doppler (Sensor Tower)" + +# Nova +NOVA_GHOST_VISOR = "Ghost Visor (Nova Equipment)" +NOVA_RANGEFINDER_OCULUS = "Rangefinder Oculus (Nova Equipment)" +NOVA_DOMINATION = "Domination (Nova Ability)" +NOVA_BLINK = "Blink (Nova Ability)" +NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE = "Progressive Stealth Suit Module (Nova Suit Module)" +NOVA_ENERGY_SUIT_MODULE = "Energy Suit Module (Nova Suit Module)" +NOVA_ARMORED_SUIT_MODULE = "Armored Suit Module (Nova Suit Module)" +NOVA_JUMP_SUIT_MODULE = "Jump Suit Module (Nova Suit Module)" +NOVA_C20A_CANISTER_RIFLE = "C20A Canister Rifle (Nova Weapon)" +NOVA_HELLFIRE_SHOTGUN = "Hellfire Shotgun (Nova Weapon)" +NOVA_PLASMA_RIFLE = "Plasma Rifle (Nova Weapon)" +NOVA_MONOMOLECULAR_BLADE = "Monomolecular Blade (Nova Weapon)" +NOVA_BLAZEFIRE_GUNBLADE = "Blazefire Gunblade (Nova Weapon)" +NOVA_STIM_INFUSION = "Stim Infusion (Nova Gadget)" +NOVA_PULSE_GRENADES = "Pulse Grenades (Nova Gadget)" +NOVA_FLASHBANG_GRENADES = "Flashbang Grenades (Nova Gadget)" +NOVA_IONIC_FORCE_FIELD = "Ionic Force Field (Nova Gadget)" +NOVA_HOLO_DECOY = "Holo Decoy (Nova Gadget)" +NOVA_NUKE = "Tac Nuke Strike (Nova Ability)" + +# Zerg Units +ZERGLING = "Zergling" +SWARM_QUEEN = "Swarm Queen" +ROACH = "Roach" +HYDRALISK = "Hydralisk" +ABERRATION = "Aberration" +MUTALISK = "Mutalisk" +SWARM_HOST = "Swarm Host" +INFESTOR = "Infestor" +ULTRALISK = "Ultralisk" +PYGALISK = "Pygalisk" +CORRUPTOR = "Corruptor" +SCOURGE = "Scourge" +BROOD_QUEEN = "Brood Queen" +DEFILER = "Defiler" +INFESTED_MARINE = "Infested Marine" +INFESTED_SIEGE_TANK = "Infested Siege Tank" +INFESTED_DIAMONDBACK = "Infested Diamondback" +BULLFROG = "Bullfrog" +INFESTED_BANSHEE = "Infested Banshee" +INFESTED_LIBERATOR = "Infested Liberator" + +# Zerg Buildings +SPORE_CRAWLER = "Spore Crawler" +SPINE_CRAWLER = "Spine Crawler" +BILE_LAUNCHER = "Bile Launcher" +INFESTED_BUNKER = "Infested Bunker" +INFESTED_MISSILE_TURRET = "Infested Missile Turret" +NYDUS_WORM = "Nydus Worm" +ECHIDNA_WORM = "Echidna Worm" + +# Zerg Weapon / Armor Upgrades +ZERG_UPGRADE_PREFIX = "Progressive Zerg" +ZERG_FLYER_UPGRADE_PREFIX = f"{ZERG_UPGRADE_PREFIX} Flyer" + +PROGRESSIVE_ZERG_MELEE_ATTACK = f"{ZERG_UPGRADE_PREFIX} Melee Attack" +PROGRESSIVE_ZERG_MISSILE_ATTACK = f"{ZERG_UPGRADE_PREFIX} Missile Attack" +PROGRESSIVE_ZERG_GROUND_CARAPACE = f"{ZERG_UPGRADE_PREFIX} Ground Carapace" +PROGRESSIVE_ZERG_FLYER_ATTACK = f"{ZERG_FLYER_UPGRADE_PREFIX} Attack" +PROGRESSIVE_ZERG_FLYER_CARAPACE = f"{ZERG_FLYER_UPGRADE_PREFIX} Carapace" +PROGRESSIVE_ZERG_WEAPON_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Weapon Upgrade" +PROGRESSIVE_ZERG_ARMOR_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Armor Upgrade" +PROGRESSIVE_ZERG_GROUND_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Ground Upgrade" +PROGRESSIVE_ZERG_FLYER_UPGRADE = f"{ZERG_FLYER_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE = f"{ZERG_UPGRADE_PREFIX} Weapon/Armor Upgrade" + +# Zerg Unit Upgrades +ZERGLING_HARDENED_CARAPACE = "Hardened Carapace (Zergling)" +ZERGLING_ADRENAL_OVERLOAD = "Adrenal Overload (Zergling)" +ZERGLING_METABOLIC_BOOST = "Metabolic Boost (Zergling)" +ZERGLING_SHREDDING_CLAWS = "Shredding Claws (Zergling)" +ROACH_HYDRIODIC_BILE = "Hydriodic Bile (Roach)" +ROACH_ADAPTIVE_PLATING = "Adaptive Plating (Roach)" +ROACH_TUNNELING_CLAWS = "Tunneling Claws (Roach)" +ROACH_GLIAL_RECONSTITUTION = "Glial Reconstitution (Roach)" +ROACH_ORGANIC_CARAPACE = "Organic Carapace (Roach)" +HYDRALISK_FRENZY = "Frenzy (Hydralisk)" +HYDRALISK_ANCILLARY_CARAPACE = "Ancillary Carapace (Hydralisk)" +HYDRALISK_GROOVED_SPINES = "Grooved Spines (Hydralisk)" +HYDRALISK_MUSCULAR_AUGMENTS = "Muscular Augments (Hydralisk)" +HYDRALISK_RESOURCE_EFFICIENCY = "Resource Efficiency (Hydralisk)" +BANELING_CORROSIVE_ACID = "Corrosive Acid (Baneling)" +BANELING_RUPTURE = "Rupture (Baneling)" +BANELING_REGENERATIVE_ACID = "Regenerative Acid (Baneling)" +BANELING_CENTRIFUGAL_HOOKS = "Centrifugal Hooks (Baneling)" +BANELING_TUNNELING_JAWS = "Tunneling Jaws (Baneling)" +BANELING_RAPID_METAMORPH = "Rapid Metamorph (Baneling)" +MUTALISK_VICIOUS_GLAIVE = "Vicious Glaive (Mutalisk)" +MUTALISK_RAPID_REGENERATION = "Rapid Regeneration (Mutalisk)" +MUTALISK_SUNDERING_GLAIVE = "Sundering Glaive (Mutalisk)" +MUTALISK_SEVERING_GLAIVE = "Severing Glaive (Mutalisk)" +MUTALISK_AERODYNAMIC_GLAIVE_SHAPE = "Aerodynamic Glaive Shape (Mutalisk)" +SPORE_CRAWLER_BIO_BONUS = "Caustic Enzymes (Spore Crawler)" +SWARM_HOST_BURROW = "Burrow (Swarm Host)" +SWARM_HOST_RAPID_INCUBATION = "Rapid Incubation (Swarm Host)" +SWARM_HOST_PRESSURIZED_GLANDS = "Pressurized Glands (Swarm Host)" +SWARM_HOST_LOCUST_METABOLIC_BOOST = "Locust Metabolic Boost (Swarm Host)" +SWARM_HOST_ENDURING_LOCUSTS = "Enduring Locusts (Swarm Host)" +SWARM_HOST_ORGANIC_CARAPACE = "Organic Carapace (Swarm Host)" +SWARM_HOST_RESOURCE_EFFICIENCY = "Resource Efficiency (Swarm Host)" +ULTRALISK_BURROW_CHARGE = "Burrow Charge (Ultralisk)" +ULTRALISK_TISSUE_ASSIMILATION = "Tissue Assimilation (Ultralisk)" +ULTRALISK_MONARCH_BLADES = "Monarch Blades (Ultralisk)" +ULTRALISK_ANABOLIC_SYNTHESIS = "Anabolic Synthesis (Ultralisk)" +ULTRALISK_CHITINOUS_PLATING = "Chitinous Plating (Ultralisk)" +ULTRALISK_ORGANIC_CARAPACE = "Organic Carapace (Ultralisk)" +ULTRALISK_RESOURCE_EFFICIENCY = "Resource Efficiency (Ultralisk)" +PYGALISK_STIM = "Stimpack (Pygalisk)" +PYGALISK_DUCAL_BLADES = "Ducal Blades (Pygalisk)" +PYGALISK_COMBAT_CARAPACE = "Combat Carapace (Pygalisk)" +CORRUPTOR_CORRUPTION = "Corruption (Corruptor)" +CORRUPTOR_CAUSTIC_SPRAY = "Caustic Spray (Corruptor)" +SCOURGE_VIRULENT_SPORES = "Virulent Spores (Scourge)" +SCOURGE_RESOURCE_EFFICIENCY = "Resource Efficiency (Scourge)" +SCOURGE_SWARM_SCOURGE = "Swarm Scourge (Scourge)" +DEVOURER_CORROSIVE_SPRAY = "Corrosive Spray (Devourer)" +DEVOURER_GAPING_MAW = "Gaping Maw (Devourer)" +DEVOURER_IMPROVED_OSMOSIS = "Improved Osmosis (Devourer)" +DEVOURER_PRESCIENT_SPORES = "Prescient Spores (Devourer)" +GUARDIAN_PROLONGED_DISPERSION = "Prolonged Dispersion (Guardian)" +GUARDIAN_PRIMAL_ADAPTATION = "Primal Adaptation (Guardian)" +GUARDIAN_SORONAN_ACID = "Soronan Acid (Guardian)" +GUARDIAN_PROPELLANT_SACS = "Propellant Sacs (Guardian)" +GUARDIAN_EXPLOSIVE_SPORES = "Explosive Spores (Guardian)" +GUARDIAN_PRIMORDIAL_FURY = "Primordial Fury (Guardian)" +IMPALER_ADAPTIVE_TALONS = "Adaptive Talons (Impaler)" +IMPALER_SECRETION_GLANDS = "Secretion Glands (Impaler)" +IMPALER_SUNKEN_SPINES = "Sunken Spines (Impaler)" +LURKER_SEISMIC_SPINES = "Seismic Spines (Lurker)" +LURKER_ADAPTED_SPINES = "Adapted Spines (Lurker)" +RAVAGER_POTENT_BILE = "Potent Bile (Ravager)" +RAVAGER_BLOATED_BILE_DUCTS = "Bloated Bile Ducts (Ravager)" +RAVAGER_DEEP_TUNNEL = "Deep Tunnel (Ravager)" +VIPER_PARASITIC_BOMB = "Parasitic Bomb (Viper)" +VIPER_PARALYTIC_BARBS = "Paralytic Barbs (Viper)" +VIPER_VIRULENT_MICROBES = "Virulent Microbes (Viper)" +BROOD_LORD_POROUS_CARTILAGE = "Porous Cartilage (Brood Lord)" +BROOD_LORD_BEHEMOTH_STELLARSKIN = "Behemoth Stellarskin (Brood Lord)" +BROOD_LORD_SPLITTER_MITOSIS = "Splitter Mitosis (Brood Lord)" +BROOD_LORD_RESOURCE_EFFICIENCY = "Resource Efficiency (Brood Lord)" +INFESTOR_INFESTED_TERRAN = "Infested Terran (Infestor)" +INFESTOR_MICROBIAL_SHROUD = "Microbial Shroud (Infestor)" +SWARM_QUEEN_SPAWN_LARVAE = "Spawn Larvae (Swarm Queen)" +SWARM_QUEEN_DEEP_TUNNEL = "Deep Tunnel (Swarm Queen)" +SWARM_QUEEN_ORGANIC_CARAPACE = "Organic Carapace (Swarm Queen)" +SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION = "Bio-Mechanical Transfusion (Swarm Queen)" +SWARM_QUEEN_RESOURCE_EFFICIENCY = "Resource Efficiency (Swarm Queen)" +SWARM_QUEEN_INCUBATOR_CHAMBER = "Incubator Chamber (Swarm Queen)" +BROOD_QUEEN_FUNGAL_GROWTH = "Fungal Growth (Brood Queen)" +BROOD_QUEEN_ENSNARE = "Ensnare (Brood Queen)" +BROOD_QUEEN_ENHANCED_MITOCHONDRIA = "Enhanced Mitochondria (Brood Queen)" +DEFILER_PATHOGEN_PROJECTORS = "Pathogen Projectors (Defiler)" +DEFILER_TRAPDOOR_ADAPTATION = "Trapdoor Adaptation (Defiler)" +DEFILER_PREDATORY_CONSUMPTION = "Predatory Consumption (Defiler)" +DEFILER_COMORBIDITY = "Comorbidity (Defiler)" +ABERRATION_MONSTROUS_RESILIENCE = "Monstrous Resilience (Aberration)" +ABERRATION_CONSTRUCT_REGENERATION = "Construct Regeneration (Aberration)" +ABERRATION_BANELING_INCUBATION = "Baneling Incubation (Aberration)" +ABERRATION_PROTECTIVE_COVER = "Protective Cover (Aberration)" +ABERRATION_RESOURCE_EFFICIENCY = "Resource Efficiency (Aberration)" +ABERRATION_PROGRESSIVE_BANELING_LAUNCH = "Progressive Baneling Launch (Aberration)" +CORRUPTOR_MONSTROUS_RESILIENCE = "Monstrous Resilience (Corruptor)" +CORRUPTOR_CONSTRUCT_REGENERATION = "Construct Regeneration (Corruptor)" +CORRUPTOR_SCOURGE_INCUBATION = "Scourge Incubation (Corruptor)" +CORRUPTOR_RESOURCE_EFFICIENCY = "Resource Efficiency (Corruptor)" +PRIMAL_IGNITER_CONCENTRATED_FIRE = "Concentrated Fire (Primal Igniter)" +PRIMAL_IGNITER_PRIMAL_TENACITY = "Primal Tenacity (Primal Igniter)" +OVERLORD_IMPROVED_OVERLORDS = "Improved Overlords (Overlord)" +OVERLORD_VENTRAL_SACS = "Ventral Sacs (Overlord)" +OVERLORD_GENERATE_CREEP = "Generate Creep (Overlord)" +OVERLORD_PNEUMATIZED_CARAPACE = "Pneumatized Carapace (Overlord)" +OVERLORD_ANTENNAE = "Antennae (Overlord)" +INFESTED_SCV_BUILD_CHARGES = "Sustained Cultivation Ventricles (Infested SCV)" +INFESTED_MARINE_PLAGUED_MUNITIONS = "Plagued Munitions (Infested Marine)" +INFESTED_MARINE_RETINAL_AUGMENTATION = "Retinal Augmentation (Infested Marine)" +INFESTED_BUNKER_CALCIFIED_ARMOR = "Calcified Armor (Infested Bunker)" +INFESTED_BUNKER_REGENERATIVE_PLATING = "Regenerative Plating (Infested Bunker)" +INFESTED_BUNKER_ENGORGED_BUNKERS = "Engorged Bunkers (Infested Bunker)" +TYRANNOZOR_BARRAGE_OF_SPIKES = "Barrage of Spikes (Tyrannozor)" +TYRANNOZOR_TYRANTS_PROTECTION = "Tyrant's Protection (Tyrannozor)" +TYRANNOZOR_HEALING_ADAPTATION = "Healing Adaptation (Tyrannozor)" +TYRANNOZOR_IMPALING_STRIKE = "Impaling Strike (Tyrannozor)" +BILE_LAUNCHER_ARTILLERY_DUCTS = "Artillery Ducts (Bile Launcher)" +BILE_LAUNCHER_RAPID_BOMBARMENT = "Rapid Bombardment (Bile Launcher)" +NYDUS_WORM_ECHIDNA_WORM_SUBTERRANEAN_SCALES = "Subterranean Scales (Nydus Worm/Echidna Worm)" +NYDUS_WORM_ECHIDNA_WORM_JORMUNGANDR_STRAIN = "Jormungandr Strain (Nydus Worm/Echidna Worm)" +NYDUS_WORM_ECHIDNA_WORM_RESOURCE_EFFICIENCY = "Resource Efficiency (Nydus Worm/Echidna Worm)" +NYDUS_WORM_RAVENOUS_APPETITE = "Ravenous Appetite (Nydus Worm)" +ECHIDNA_WORM_OUROBOROS_STRAIN = "Ouroboros Strain (Echidna Worm)" +INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS = "Progressive Automated Mitosis (Infested Siege Tank)" +INFESTED_SIEGE_TANK_ACIDIC_ENZYMES = "Acidic Enzymes (Infested Siege Tank)" +INFESTED_SIEGE_TANK_DEEP_TUNNEL = "Deep Tunnel (Infested Siege Tank)" +INFESTED_SIEGE_TANK_SEISMIC_SONAR = "Seismic Sonar (Infested Siege Tank)" +INFESTED_SIEGE_TANK_BALANCED_ROOTS = "Balanced Roots (Infested Siege Tank)" +INFESTED_DIAMONDBACK_CAUSTIC_MUCUS = "Caustic Mucus (Infested Diamondback)" +INFESTED_DIAMONDBACK_VIOLENT_ENZYMES = "Violent Enzymes (Infested Diamondback)" +INFESTED_DIAMONDBACK_CONCENTRATED_SPEW = "Concentrated Spew (Infested Diamondback)" +INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE = "Progressive Fungal Snare (Infested Diamondback)" +INFESTED_BANSHEE_BRACED_EXOSKELETON = "Braced Exoskeleton (Infested Banshee)" +INFESTED_BANSHEE_RAPID_HIBERNATION = "Rapid Hibernation (Infested Banshee)" +INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS = "Fleshfused Targeting Optics (Infested Banshee)" +INFESTED_LIBERATOR_CLOUD_DISPERSAL = "Cloud Dispersal (Infested Liberator)" +INFESTED_LIBERATOR_VIRAL_CONTAMINATION = "Viral Contamination (Infested Liberator)" +INFESTED_LIBERATOR_DEFENDER_MODE = "Defender Mode (Infested Liberator)" +INFESTED_SIEGE_TANK_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Siege Tank)" +INFESTED_DIAMONDBACK_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Diamondback)" +INFESTED_BANSHEE_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Banshee)" +INFESTED_LIBERATOR_FRIGHTFUL_FLESHWELDER = "Frightful Fleshwelder (Infested Liberator)" +INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD = "Bioelectric Payload (Infested Missile Turret)" +INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS = "Acid Spore Vents (Infested Missile Turret)" +BULLFROG_WILD_MUTATION = "Mutagen Vents (Bullfrog)" +BULLFROG_BROODLINGS = "Suffused With Vermin (Bullfrog)" +BULLFROG_HARD_IMPACT = "Lethal Impact (Bullfrog)" +BULLFROG_RANGE = "Catalytic Boosters (Bullfrog)" + +# Zerg Strains +ZERGLING_RAPTOR_STRAIN = "Raptor Strain (Zergling)" +ZERGLING_SWARMLING_STRAIN = "Swarmling Strain (Zergling)" +ROACH_VILE_STRAIN = "Vile Strain (Roach)" +ROACH_CORPSER_STRAIN = "Corpser Strain (Roach)" +BANELING_SPLITTER_STRAIN = "Splitter Strain (Baneling)" +BANELING_HUNTER_STRAIN = "Hunter Strain (Baneling)" +SWARM_HOST_CARRION_STRAIN = "Carrion Strain (Swarm Host)" +SWARM_HOST_CREEPER_STRAIN = "Creeper Strain (Swarm Host)" +ULTRALISK_NOXIOUS_STRAIN = "Noxious Strain (Ultralisk)" +ULTRALISK_TORRASQUE_STRAIN = "Torrasque Strain (Ultralisk)" + +# Morphs +ZERGLING_BANELING_ASPECT = "Baneling" +HYDRALISK_IMPALER_ASPECT = "Impaler" +HYDRALISK_LURKER_ASPECT = "Lurker" +MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT = "Brood Lord" +MUTALISK_CORRUPTOR_VIPER_ASPECT = "Viper" +MUTALISK_CORRUPTOR_GUARDIAN_ASPECT = "Guardian" +MUTALISK_CORRUPTOR_DEVOURER_ASPECT = "Devourer" +ROACH_RAVAGER_ASPECT = "Ravager" +OVERLORD_OVERSEER_ASPECT = "Overseer" +ROACH_PRIMAL_IGNITER_ASPECT = "Primal Igniter" +ULTRALISK_TYRANNOZOR_ASPECT = "Tyrannozor" + +# Zerg Mercs +INFESTED_MEDICS = "Infested Medics" +INFESTED_SIEGE_BREAKERS = "Infested Siege Breakers" +INFESTED_DUSK_WINGS = "Infested Dusk Wings" +DEVOURING_ONES = "Devouring Ones" +HUNTER_KILLERS = "Hunter Killers" +TORRASQUE_MERC = "Wise Old Torrasque" +HUNTERLING = "Hunterling" +YGGDRASIL = "Yggdrasil" +CAUSTIC_HORRORS = "Caustic Horrors" + + +# Kerrigan Upgrades +KERRIGAN_KINETIC_BLAST = "Kinetic Blast (Kerrigan Ability)" +KERRIGAN_HEROIC_FORTITUDE = "Heroic Fortitude (Kerrigan Passive)" +KERRIGAN_LEAPING_STRIKE = "Leaping Strike (Kerrigan Ability)" +KERRIGAN_CRUSHING_GRIP = "Crushing Grip (Kerrigan Ability)" +KERRIGAN_CHAIN_REACTION = "Chain Reaction (Kerrigan Passive)" +KERRIGAN_PSIONIC_SHIFT = "Psionic Shift (Kerrigan Ability)" +KERRIGAN_WILD_MUTATION = "Wild Mutation (Kerrigan Ability)" +KERRIGAN_SPAWN_BANELINGS = "Spawn Banelings (Kerrigan Ability)" +KERRIGAN_MEND = "Mend (Kerrigan Ability)" +KERRIGAN_INFEST_BROODLINGS = "Infest Broodlings (Kerrigan Passive)" +KERRIGAN_FURY = "Fury (Kerrigan Passive)" +KERRIGAN_ABILITY_EFFICIENCY = "Ability Efficiency (Kerrigan Passive)" +KERRIGAN_APOCALYPSE = "Apocalypse (Kerrigan Ability)" +KERRIGAN_SPAWN_LEVIATHAN = "Spawn Leviathan (Kerrigan Ability)" +KERRIGAN_DROP_PODS = "Drop-Pods (Kerrigan Ability)" +KERRIGAN_ASSIMILATION_AURA = "Assimilation Aura (Kerrigan Ability)" +KERRIGAN_IMMOBILIZATION_WAVE = "Immobilization Wave (Kerrigan Ability)" +KERRIGAN_PRIMAL_FORM = "Primal Form (Kerrigan)" + +# Misc Upgrades +ZERGLING_RECONSTITUTION = "Zergling Reconstitution (Zerg)" +AUTOMATED_EXTRACTORS = "Automated Extractors (Zerg)" +TWIN_DRONES = "Twin Drones (Zerg)" +MALIGNANT_CREEP = "Malignant Creep (Zerg)" +VESPENE_EFFICIENCY = "Vespene Efficiency (Zerg)" +ZERG_CREEP_STOMACH = "Creep Stomach (Zerg)" +ZERG_EXCAVATING_CLAWS = "Excavating Claws (Zerg)" +HIVE_CLUSTER_MATURATION = "Hive Cluster Maturation (Zerg)" +MACROSCOPIC_RECUPERATION = "Macroscopic Recuperation (Zerg)" +BIOMECHANICAL_STOCKPILING = "Bio-Mechanical Stockpiling (Zerg)" +BROODLING_SPORE_SATURATION = "Broodling Spore Saturation (Zerg)" +UNRESTRICTED_MUTATION = "Unrestricted Mutation (Zerg)" +CELL_DIVISION = "Cell Division (Zerg)" +EVOLUTIONARY_LEAP = "Evolutionary Leap (Zerg)" +SELF_SUFFICIENT = "Self-Sufficient (Zerg)" + +# Kerrigan Levels +KERRIGAN_LEVELS_1 = "1 Kerrigan Level" +KERRIGAN_LEVELS_2 = "2 Kerrigan Levels" +KERRIGAN_LEVELS_3 = "3 Kerrigan Levels" +KERRIGAN_LEVELS_4 = "4 Kerrigan Levels" +KERRIGAN_LEVELS_5 = "5 Kerrigan Levels" +KERRIGAN_LEVELS_6 = "6 Kerrigan Levels" +KERRIGAN_LEVELS_7 = "7 Kerrigan Levels" +KERRIGAN_LEVELS_8 = "8 Kerrigan Levels" +KERRIGAN_LEVELS_9 = "9 Kerrigan Levels" +KERRIGAN_LEVELS_10 = "10 Kerrigan Levels" +KERRIGAN_LEVELS_14 = "14 Kerrigan Levels" +KERRIGAN_LEVELS_35 = "35 Kerrigan Levels" +KERRIGAN_LEVELS_70 = "70 Kerrigan Levels" + +# Protoss Units +ZEALOT = "Zealot" +STALKER = "Stalker" +HIGH_TEMPLAR = "High Templar" +DARK_TEMPLAR = "Dark Templar" +IMMORTAL = "Immortal" +COLOSSUS = "Colossus" +PHOENIX = "Phoenix" +VOID_RAY = "Void Ray" +CARRIER = "Carrier" +SKYLORD = "Skylord" +TRIREME = "Trireme" +OBSERVER = "Observer" +CENTURION = "Centurion" +SENTINEL = "Sentinel" +SUPPLICANT = "Supplicant" +INSTIGATOR = "Instigator" +SLAYER = "Slayer" +SENTRY = "Sentry" +ENERGIZER = "Energizer" +HAVOC = "Havoc" +SIGNIFIER = "Signifier" +ASCENDANT = "Ascendant" +AVENGER = "Avenger" +BLOOD_HUNTER = "Blood Hunter" +DRAGOON = "Dragoon" +DARK_ARCHON = "Dark Archon" +ADEPT = "Adept" +WARP_PRISM = "Warp Prism" +ANNIHILATOR = "Annihilator" +VANGUARD = "Vanguard" +STALWART = "Stalwart" +WRATHWALKER = "Wrathwalker" +REAVER = "Reaver" +DISRUPTOR = "Disruptor" +MIRAGE = "Mirage" +SKIRMISHER = "Skirmisher" +CORSAIR = "Corsair" +DESTROYER = "Destroyer" +PULSAR = "Pulsar" +DAWNBRINGER = "Dawnbringer" +SCOUT = "Scout" +OPPRESSOR = "Oppressor" +CALADRIUS = "Caladrius" +MISTWING = "Mist Wing" +TEMPEST = "Tempest" +MOTHERSHIP = "Mothership" +ARBITER = "Arbiter" +ORACLE = "Oracle" + +# Upgrades +PROTOSS_UPGRADE_PREFIX = "Progressive Protoss" +PROTOSS_GROUND_UPGRADE_PREFIX = f"{PROTOSS_UPGRADE_PREFIX} Ground" +PROTOSS_AIR_UPGRADE_PREFIX = f"{PROTOSS_UPGRADE_PREFIX} Air" +PROGRESSIVE_PROTOSS_GROUND_WEAPON = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Weapon" +PROGRESSIVE_PROTOSS_GROUND_ARMOR = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Armor" +PROGRESSIVE_PROTOSS_SHIELDS = f"{PROTOSS_UPGRADE_PREFIX} Shields" +PROGRESSIVE_PROTOSS_AIR_WEAPON = f"{PROTOSS_AIR_UPGRADE_PREFIX} Weapon" +PROGRESSIVE_PROTOSS_AIR_ARMOR = f"{PROTOSS_AIR_UPGRADE_PREFIX} Armor" +PROGRESSIVE_PROTOSS_WEAPON_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Weapon Upgrade" +PROGRESSIVE_PROTOSS_ARMOR_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Armor Upgrade" +PROGRESSIVE_PROTOSS_GROUND_UPGRADE = f"{PROTOSS_GROUND_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_PROTOSS_AIR_UPGRADE = f"{PROTOSS_AIR_UPGRADE_PREFIX} Upgrade" +PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE = f"{PROTOSS_UPGRADE_PREFIX} Weapon/Armor Upgrade" + +# Buildings +PHOTON_CANNON = "Photon Cannon" +KHAYDARIN_MONOLITH = "Khaydarin Monolith" +SHIELD_BATTERY = "Shield Battery" + +# Unit Upgrades +SUPPLICANT_BLOOD_SHIELD = "Blood Shield (Supplicant)" +SUPPLICANT_SOUL_AUGMENTATION = "Soul Augmentation (Supplicant)" +SUPPLICANT_ENDLESS_SERVITUDE = "Endless Servitude (Supplicant)" +SUPPLICANT_ZENITH_PITCH = "Zenith Pitch (Supplicant)" +SUPPLICANT_SACRIFICE = "Sacrifice (Supplicant)" +ADEPT_SHOCKWAVE = "Shockwave (Adept)" +ADEPT_RESONATING_GLAIVES = "Resonating Glaives (Adept)" +ADEPT_PHASE_BULWARK = "Phase Bulwark (Adept)" +STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES = "Disintegrating Particles (Stalker/Instigator/Slayer)" +STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION = "Particle Reflection (Stalker/Instigator/Slayer)" +INSTIGATOR_BLINK_OVERDRIVE = "Blink Overdrive (Instigator)" +INSTIGATOR_RECONSTRUCTION = "Reconstruction (Instigator)" +DRAGOON_CONCENTRATED_ANTIMATTER = "Concentrated Antimatter (Dragoon)" +DRAGOON_TRILLIC_COMPRESSION_SYSTEM = "Trillic Compression System (Dragoon)" +DRAGOON_SINGULARITY_CHARGE = "Singularity Charge (Dragoon)" +DRAGOON_ENHANCED_STRIDER_SERVOS = "Enhanced Strider Servos (Dragoon)" +SCOUT_COMBAT_SENSOR_ARRAY = "Combat Sensor Array (Scout/Oppressor/Caladrius/Mist Wing)" +SCOUT_APIAL_SENSORS = "Apial Sensors (Scout)" +SCOUT_GRAVITIC_THRUSTERS = "Gravitic Thrusters (Scout/Oppressor/Caladrius/Mist Wing)" +SCOUT_ADVANCED_PHOTON_BLASTERS = "Advanced Photon Blasters (Scout/Oppressor/Mist Wing)" +SCOUT_RESOURCE_EFFICIENCY = "Resource Efficiency (Scout)" +SCOUT_SUPPLY_EFFICIENCY = "Supply Efficiency (Scout)" +TEMPEST_TECTONIC_DESTABILIZERS = "Tectonic Destabilizers (Tempest)" +TEMPEST_QUANTIC_REACTOR = "Quantic Reactor (Tempest)" +TEMPEST_GRAVITY_SLING = "Gravity Sling (Tempest)" +TEMPEST_INTERPLANETARY_RANGE = "Interplanetary Range (Tempest)" +PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX = "Ionic Wavelength Flux (Phoenix/Mirage/Skirmisher)" +PHOENIX_CLASS_ANION_PULSE_CRYSTALS = "Anion Pulse-Crystals (Phoenix/Mirage/Skirmisher)" +CORSAIR_STEALTH_DRIVE = "Stealth Drive (Corsair)" +CORSAIR_ARGUS_JEWEL = "Argus Jewel (Corsair)" +CORSAIR_SUSTAINING_DISRUPTION = "Sustaining Disruption (Corsair)" +CORSAIR_NEUTRON_SHIELDS = "Neutron Shields (Corsair)" +ORACLE_STEALTH_DRIVE = "Stealth Drive (Oracle)" +ORACLE_SKYWARD_CHRONOANOMALY = "Skyward Chronoanomaly (Oracle)" +ORACLE_TEMPORAL_ACCELERATION_BEAM = "Temporal Acceleration Beam (Oracle)" +ORACLE_BOSONIC_CORE = "Bosonic Core (Oracle)" +ARBITER_CHRONOSTATIC_REINFORCEMENT = "Chronostatic Reinforcement (Arbiter)" +ARBITER_KHAYDARIN_CORE = "Khaydarin Core (Arbiter)" +ARBITER_SPACETIME_ANCHOR = "Spacetime Anchor (Arbiter)" +ARBITER_RESOURCE_EFFICIENCY = "Resource Efficiency (Arbiter)" +ARBITER_JUDICATORS_VEIL = "Judicator's Veil (Arbiter)" +CARRIER_TRIREME_GRAVITON_CATAPULT = "Graviton Catapult (Carrier/Trireme)" +CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES = "Hull of Past Glories (Carrier/Skylord/Trireme)" +VOID_RAY_DESTROYER_PULSAR_DAWNBRINGER_FLUX_VANES = "Flux Vanes (Void Ray/Destroyer/Pulsar/Dawnbringer)" +DAWNBRINGER_ANTI_SURFACE_COUNTERMEASURES = "Anti-Surface Countermeasures (Dawnbringer)" +DAWNBRINGER_ENHANCED_SHIELD_GENERATOR = "Enhanced Shield Generator (Dawnbringer)" +PULSAR_CHRONOCLYSM = "Chronoclysm (Pulsar)" +PULSAR_ENTROPIC_REVERSAL = "Entropic Reversal (Pulsar)" +DESTROYER_RESOURCE_EFFICIENCY = "Resource Efficiency (Destroyer)" +WARP_PRISM_GRAVITIC_DRIVE = "Gravitic Drive (Warp Prism)" +WARP_PRISM_PHASE_BLASTER = "Phase Blaster (Warp Prism)" +WARP_PRISM_WAR_CONFIGURATION = "War Configuration (Warp Prism)" +OBSERVER_GRAVITIC_BOOSTERS = "Gravitic Boosters (Observer)" +OBSERVER_SENSOR_ARRAY = "Sensor Array (Observer)" +REAVER_SCARAB_DAMAGE = "Scarab Damage (Reaver)" +REAVER_SOLARITE_PAYLOAD = "Solarite Payload (Reaver)" +REAVER_REAVER_CAPACITY = "Reaver Capacity (Reaver)" +REAVER_RESOURCE_EFFICIENCY = "Resource Efficiency (Reaver)" +REAVER_BARGAIN_BIN_PRICES = "Bargain Bin Prices (Reaver)" +VANGUARD_AGONY_LAUNCHERS = "Agony Launchers (Vanguard)" +VANGUARD_MATTER_DISPERSION = "Matter Dispersion (Vanguard)" +IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE = "Singularity Charge (Immortal/Annihilator)" +IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING = "Advanced Targeting (Immortal/Annihilator)" +IMMORTAL_ANNIHILATOR_DISRUPTOR_DISPERSION = "Disruptor Dispersion (Immortal/Annihilator)" +STALWART_HIGH_VOLTAGE_CAPACITORS = "High Voltage Capacitors (Stalwart)" +STALWART_REINTEGRATED_FRAMEWORK = "Reintegrated Framework (Stalwart)" +STALWART_STABILIZED_ELECTRODES = "Stabilized Electrodes (Stalwart)" +STALWART_LATTICED_SHIELDING = "Latticed Shielding (Stalwart)" +DISRUPTOR_CLOAKING_MODULE = "Cloaking Module (Disruptor)" +DISRUPTOR_PERFECTED_POWER = "Perfected Power (Disruptor)" +DISRUPTOR_RESTRAINED_DESTRUCTION = "Restrained Destruction (Disruptor)" +COLOSSUS_PACIFICATION_PROTOCOL = "Pacification Protocol (Colossus)" +WRATHWALKER_RAPID_POWER_CYCLING = "Rapid Power Cycling (Wrathwalker)" +WRATHWALKER_EYE_OF_WRATH = "Eye of Wrath (Wrathwalker)" +DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN = "Shroud of Adun (Dark Templar/Avenger/Blood Hunter)" +DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING = "Shadow Guard Training (Dark Templar/Avenger/Blood Hunter)" +DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK = "Blink (Dark Templar/Avenger/Blood Hunter)" +DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY = "Resource Efficiency (Dark Templar/Avenger/Blood Hunter)" +DARK_TEMPLAR_DARK_ARCHON_MELD = "Dark Archon Meld (Dark Templar)" +DARK_TEMPLAR_ARCHON_MERGE = "Archon Merge (Dark Templar)" +HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM = "Unshackled Psionic Storm (High Templar/Signifier)" +HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION = "Hallucination (High Templar/Signifier)" +HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET = "Khaydarin Amulet (High Templar/Signifier)" +ARCHON_HIGH_ARCHON = "High Archon (Archon)" +ARCHON_TRANSCENDENCE = "Transcendence (Archon)" +ARCHON_POWER_SIPHON = "Power Siphon (Archon)" +ARCHON_ERADICATE = "Eradicate (Archon)" +ARCHON_OBLITERATE = "Obliterate (Archon)" +DARK_ARCHON_FEEDBACK = "Feedback (Dark Archon)" +DARK_ARCHON_MAELSTROM = "Maelstrom (Dark Archon)" +DARK_ARCHON_ARGUS_TALISMAN = "Argus Talisman (Dark Archon)" +ASCENDANT_POWER_OVERWHELMING = "Power Overwhelming (Ascendant)" +ASCENDANT_CHAOTIC_ATTUNEMENT = "Chaotic Attunement (Ascendant)" +ASCENDANT_BLOOD_AMULET = "Blood Amulet (Ascendant)" +ASCENDANT_ARCHON_MERGE = "Archon Merge (Ascendant)" +SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE = "Cloaking Module (Sentry/Energizer/Havoc)" +SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING = "Rapid Recharging (Sentry/Energizer/Havoc/Shield Battery)" +SENTRY_FORCE_FIELD = "Force Field (Sentry)" +SENTRY_HALLUCINATION = "Hallucination (Sentry)" +ENERGIZER_RECLAMATION = "Reclamation (Energizer)" +ENERGIZER_FORGED_CHASSIS = "Forged Chassis (Energizer)" +HAVOC_DETECT_WEAKNESS = "Detect Weakness (Havoc)" +HAVOC_BLOODSHARD_RESONANCE = "Bloodshard Resonance (Havoc)" +ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS = "Leg Enhancements (Zealot/Sentinel/Centurion)" +ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY = "Shield Capacity (Zealot/Sentinel/Centurion)" +OPPRESSOR_ACCELERATED_WARP = "Accelerated Warp (Oppressor)" +OPPRESSOR_ARMOR_MELTING_BLASTERS = "Armor Melting Blasters (Oppressor)" +CALADRIUS_SIDE_MISSILES = "Side Missiles (Caladrius)" +CALADRIUS_STRUCTURE_TARGETING = "Structure Targeting (Caladrius)" +CALADRIUS_SOLARITE_REACTOR = "Solarite Reactor (Caladrius)" +MISTWING_NULL_SHROUD = "Null Shroud (Mist Wing)" +MISTWING_PILOT = "Pilot (Mist Wing)" + +# War Council +ZEALOT_WHIRLWIND = "Whirlwind (Zealot)" +CENTURION_RESOURCE_EFFICIENCY = "Resource Efficiency (Centurion)" +SENTINEL_RESOURCE_EFFICIENCY = "Resource Efficiency (Sentinel)" +STALKER_PHASE_REACTOR = "Phase Reactor (Stalker)" +DRAGOON_PHALANX_SUIT = "Phalanx Suit (Dragoon)" +INSTIGATOR_MODERNIZED_SERVOS = "Modernized Servos (Instigator)" +ADEPT_DISRUPTIVE_TRANSFER = "Disruptive Transfer (Adept)" +SLAYER_PHASE_BLINK = "Phase Blink (Slayer)" +AVENGER_KRYHAS_CLOAK = "Kryhas Cloak (Avenger)" +DARK_TEMPLAR_LESSER_SHADOW_FURY = "Lesser Shadow Fury (Dark Templar)" +DARK_TEMPLAR_GREATER_SHADOW_FURY = "Greater Shadow Fury (Dark Templar)" +BLOOD_HUNTER_BRUTAL_EFFICIENCY = "Brutal Efficiency (Blood Hunter)" +SENTRY_DOUBLE_SHIELD_RECHARGE = "Double Shield Recharge (Sentry)" +ENERGIZER_MOBILE_CHRONO_BEAM = "Mobile Chrono Beam (Energizer)" +HAVOC_ENDURING_SIGHT = "Enduring Sight (Havoc)" +HIGH_TEMPLAR_PLASMA_SURGE = "Plasma Surge (High Templar)" +SIGNIFIER_FEEDBACK = "Feedback (Signifier)" +ASCENDANT_BREATH_OF_CREATION = "Breath of Creation (Ascendant)" +DARK_ARCHON_INDOMITABLE_WILL = "Indomitable Will (Dark Archon)" +IMMORTAL_IMPROVED_BARRIER = "Improved Barrier (Immortal)" +VANGUARD_RAPIDFIRE_CANNON = "Rapid-Fire Cannon (Vanguard)" +VANGUARD_FUSION_MORTARS = "Fusion Mortars (Vanguard)" +ANNIHILATOR_TWILIGHT_CHASSIS = "Twilight Chassis (Annihilator)" +STALWART_ARC_INDUCERS = "Arc Inducers (Stalwart)" +COLOSSUS_FIRE_LANCE = "Fire Lance (Colossus)" +WRATHWALKER_AERIAL_TRACKING = "Aerial Tracking (Wrathwalker)" +REAVER_KHALAI_REPLICATORS = "Khalai Replicators (Reaver)" +DISRUPTOR_MOBILITY_PROTOCOLS = "Mobility Protocols (Disruptor)" +WARP_PRISM_WARP_REFRACTION = "Warp Refraction (Warp Prism)" +OBSERVER_INDUCE_SCOPOPHOBIA = "Induce Scopophobia (Observer)" +PHOENIX_DOUBLE_GRAVITON_BEAM = "Double Graviton Beam (Phoenix)" +CORSAIR_NETWORK_DISRUPTION = "Network Disruption (Corsair)" +MIRAGE_GRAVITON_BEAM = "Graviton Beam (Mirage)" +SKIRMISHER_PEER_CONTEMPT = "Peer Contempt (Skirmisher)" +VOID_RAY_PRISMATIC_RANGE = "Prismatic Range (Void Ray)" +DESTROYER_REFORGED_BLOODSHARD_CORE = "Reforged Bloodshard Core (Destroyer)" +PULSAR_CHRONO_SHEAR = "Chrono Shear (Pulsar)" +DAWNBRINGER_SOLARITE_LENS = "Solarite Lens (Dawnbringer)" +CARRIER_REPAIR_DRONES = "Repair Drones (Carrier)" +SKYLORD_JUMP = "Jump (Skylord)" +TRIREME_SOLAR_BEAM = "Solar Beam (Trireme)" +TEMPEST_DISINTEGRATION = "Disintegration (Tempest)" +SCOUT_EXPEDITIONARY_HULL = "Expeditionary Hull (Scout)" +ARBITER_VESSEL_OF_THE_CONCLAVE = "Vessel of the Conclave (Arbiter)" +ORACLE_STASIS_CALIBRATION = "Stasis Calibration (Oracle)" +MOTHERSHIP_INTEGRATED_POWER = "Integrated Power (Mothership)" +OPPRESSOR_VULCAN_BLASTER = "Vulcan Blaster (Oppressor)" +CALADRIUS_CORONA_BEAM = "Corona Beam (Caladrius)" +MISTWING_PHANTOM_DASH = "Phantom Dash (Mist Wing)" + +# Spear Of Adun +SOA_CHRONO_SURGE = "Chrono Surge (Spear of Adun)" +SOA_PROGRESSIVE_PROXY_PYLON = "Progressive Proxy Pylon (Spear of Adun)" +SOA_PYLON_OVERCHARGE = "Pylon Overcharge (Spear of Adun)" +SOA_ORBITAL_STRIKE = "Orbital Strike (Spear of Adun)" +SOA_TEMPORAL_FIELD = "Temporal Field (Spear of Adun)" +SOA_SOLAR_LANCE = "Solar Lance (Spear of Adun)" +SOA_MASS_RECALL = "Mass Recall (Spear of Adun)" +SOA_SHIELD_OVERCHARGE = "Shield Overcharge (Spear of Adun)" +SOA_DEPLOY_FENIX = "Deploy Fenix (Spear of Adun)" +SOA_PURIFIER_BEAM = "Purifier Beam (Spear of Adun)" +SOA_TIME_STOP = "Time Stop (Spear of Adun)" +SOA_SOLAR_BOMBARDMENT = "Solar Bombardment (Spear of Adun)" + +# Generic upgrades +MATRIX_OVERLOAD = "Matrix Overload (Protoss)" +QUATRO = "Quatro (Protoss)" +NEXUS_OVERCHARGE = "Nexus Overcharge (Protoss)" +ORBITAL_ASSIMILATORS = "Orbital Assimilators (Protoss)" +WARP_HARMONIZATION = "Warp Harmonization (Protoss)" +GUARDIAN_SHELL = "Guardian Shell (Spear of Adun)" +RECONSTRUCTION_BEAM = "Reconstruction Beam (Spear of Adun)" +OVERWATCH = "Overwatch (Spear of Adun)" +SUPERIOR_WARP_GATES = "Superior Warp Gates (Protoss)" +ENHANCED_TARGETING = "Enhanced Targeting (Protoss)" +OPTIMIZED_ORDNANCE = "Optimized Ordnance (Protoss)" +KHALAI_INGENUITY = "Khalai Ingenuity (Protoss)" +AMPLIFIED_ASSIMILATORS = "Amplified Assimilators (Protoss)" +PROGRESSIVE_WARP_RELOCATE = "Progressive Warp Relocate (Protoss)" +PROBE_WARPIN = "Probe Warp-In (Protoss)" +ELDER_PROBES = "Elder Probes (Protoss)" + +# Filler items +STARTING_MINERALS = "Additional Starting Minerals" +STARTING_VESPENE = "Additional Starting Vespene" +STARTING_SUPPLY = "Additional Starting Supply" +MAX_SUPPLY = "Additional Maximum Supply" +SHIELD_REGENERATION = "Increased Shield Regeneration" +BUILDING_CONSTRUCTION_SPEED = "Increased Building Construction Speed" +UPGRADE_RESEARCH_SPEED = "Increased Upgrade Research Speed" +UPGRADE_RESEARCH_COST = "Reduced Upgrade Research Cost" + +# Trap +REDUCED_MAX_SUPPLY = "Decreased Maximum Supply" +NOTHING = "Nothing" + +# Deprecated +PROGRESSIVE_ORBITAL_COMMAND = "Progressive Orbital Command (Deprecated)" + +# Keys +_TEMPLATE_MISSION_KEY = "{} Mission Key" +_TEMPLATE_NAMED_LAYOUT_KEY = "{} ({}) Questline Key" +_TEMPLATE_NUMBERED_LAYOUT_KEY = "Questline Key #{}" +_TEMPLATE_NAMED_CAMPAIGN_KEY = "{} Campaign Key" +_TEMPLATE_NUMBERED_CAMPAIGN_KEY = "Campaign Key #{}" +_TEMPLATE_FLAVOR_KEY = "{} Key" +PROGRESSIVE_MISSION_KEY = "Progressive Mission Key" +PROGRESSIVE_QUESTLINE_KEY = "Progressive Questline Key" +_TEMPLATE_PROGRESSIVE_KEY = "Progressive Key #{}" + +# Names for flavor keys, feel free to add more, but add them to the Custom Mission Order docs too +# These will never be randomly created by the generator +_flavor_key_names = [ + "Terran", "Zerg", "Protoss", + "Raynor", "Tychus", "Swann", "Stetmann", "Hanson", "Nova", "Tosh", "Valerian", "Warfield", "Mengsk", "Han", "Horner", + "Kerrigan", "Zagara", "Abathur", "Yagdra", "Kraith", "Slivan", "Zurvan", "Brakk", "Stukov", "Dehaka", "Niadra", "Izsha", + "Artanis", "Zeratul", "Tassadar", "Karax", "Vorazun", "Alarak", "Fenix", "Urun", "Mohandar", "Selendis", "Rohana", + "Reigel", "Davis", "Ji'nara" +] diff --git a/worlds/sc2/item/item_parents.py b/worlds/sc2/item/item_parents.py new file mode 100644 index 0000000000..18b27b79d2 --- /dev/null +++ b/worlds/sc2/item/item_parents.py @@ -0,0 +1,266 @@ +""" +Utilities for telling item parentage hierarchy. +ItemData in item_tables.py will point from child item -> parent rule. +Rules have a `parent_items()` method which links rule -> parent items. +Rules may be more complex than all or any items being present. Call them to determine if they are satisfied. +""" + +from typing import Dict, List, Iterable, Sequence, Optional, TYPE_CHECKING +import abc +from . import item_names, parent_names, item_tables, item_groups + +if TYPE_CHECKING: + from ..options import Starcraft2Options + + +class PresenceRule(abc.ABC): + """Contract for a parent presence rule. This should be a protocol in Python 3.10+""" + constraint_group: Optional[str] + """Identifies the group this item rule is a part of, subject to min/max upgrades per unit""" + display_string: str + """Main item to count as the parent for min/max upgrades per unit purposes""" + @abc.abstractmethod + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: ... + @abc.abstractmethod + def parent_items(self) -> Sequence[str]: ... + + +class ItemPresent(PresenceRule): + def __init__(self, item_name: str) -> None: + self.item_name = item_name + self.constraint_group = item_name + self.display_string = item_name + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return self.item_name in inventory + + def parent_items(self) -> List[str]: + return [self.item_name] + + +class AnyOf(PresenceRule): + def __init__(self, group: Iterable[str], main_item: Optional[str] = None, display_string: Optional[str] = None) -> None: + self.group = set(group) + self.constraint_group = main_item + self.display_string = display_string or main_item or ' | '.join(group) + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return len(self.group.intersection(inventory)) > 0 + + def parent_items(self) -> List[str]: + return sorted(self.group) + + +class AllOf(PresenceRule): + def __init__(self, group: Iterable[str], main_item: Optional[str] = None) -> None: + self.group = set(group) + self.constraint_group = main_item + self.display_string = main_item or ' & '.join(group) + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return len(self.group.intersection(inventory)) == len(self.group) + + def parent_items(self) -> List[str]: + return sorted(self.group) + + +class AnyOfGroupAndOneOtherItem(PresenceRule): + def __init__(self, group: Iterable[str], item_name: str) -> None: + self.group = set(group) + self.item_name = item_name + self.constraint_group = item_name + self.display_string = item_name + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return (len(self.group.intersection(inventory)) > 0) and self.item_name in inventory + + def parent_items(self) -> List[str]: + return sorted(self.group) + [self.item_name] + + +class MorphlingOrItem(PresenceRule): + def __init__(self, item_name: str, has_parent: bool = True) -> None: + self.item_name = item_name + self.constraint_group = None # Keep morphs from counting towards the parent unit's upgrade count + self.display_string = f'{item_name} Morphs' + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return (options.enable_morphling.value != 0) or self.item_name in inventory + + def parent_items(self) -> List[str]: + return [self.item_name] + + +class MorphlingOrAnyOf(PresenceRule): + def __init__(self, group: Iterable[str], display_string: str, main_item: Optional[str] = None) -> None: + self.group = set(group) + self.constraint_group = main_item + self.display_string = display_string + + def __call__(self, inventory: Iterable[str], options: 'Starcraft2Options') -> bool: + return (options.enable_morphling.value != 0) or (len(self.group.intersection(inventory)) > 0) + + def parent_items(self) -> List[str]: + return sorted(self.group) + + +parent_present: Dict[str, PresenceRule] = { + item_name: ItemPresent(item_name) + for item_name in item_tables.item_table +} + +# Terran +parent_present[parent_names.DOMINION_TROOPER_WEAPONS] = AnyOf([ + item_names.DOMINION_TROOPER_B2_HIGH_CAL_LMG, + item_names.DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER, + item_names.DOMINION_TROOPER_HAILSTORM_LAUNCHER, +], main_item=item_names.DOMINION_TROOPER) +parent_present[parent_names.INFANTRY_UNITS] = AnyOf(item_groups.barracks_units, display_string='Terran Infantry') +parent_present[parent_names.INFANTRY_WEAPON_UNITS] = AnyOf(item_groups.barracks_wa_group, display_string='Terran Infantry') +parent_present[parent_names.ORBITAL_COMMAND_AND_PLANETARY] = AnyOfGroupAndOneOtherItem( + item_groups.orbital_command_abilities, + item_names.PLANETARY_FORTRESS, +) +parent_present[parent_names.SIEGE_TANK_AND_TRANSPORT] = AnyOfGroupAndOneOtherItem( + (item_names.MEDIVAC, item_names.HERCULES), + item_names.SIEGE_TANK, +) +parent_present[parent_names.SIEGE_TANK_AND_MEDIVAC] = AllOf((item_names.SIEGE_TANK, item_names.MEDIVAC), item_names.SIEGE_TANK) +parent_present[parent_names.SPIDER_MINE_SOURCE] = AnyOf(item_groups.spider_mine_sources, display_string='Spider Mines') +parent_present[parent_names.STARSHIP_UNITS] = AnyOf(item_groups.starport_units, display_string='Terran Starships') +parent_present[parent_names.STARSHIP_WEAPON_UNITS] = AnyOf(item_groups.starport_wa_group, display_string='Terran Starships') +parent_present[parent_names.VEHICLE_UNITS] = AnyOf(item_groups.factory_units, display_string='Terran Vehicles') +parent_present[parent_names.VEHICLE_WEAPON_UNITS] = AnyOf(item_groups.factory_wa_group, display_string='Terran Vehicles') +parent_present[parent_names.TERRAN_MERCENARIES] = AnyOf(item_groups.terran_mercenaries, display_string='Terran Mercenaries') + +# Zerg +parent_present[parent_names.ANY_NYDUS_WORM] = AnyOf((item_names.NYDUS_WORM, item_names.ECHIDNA_WORM), item_names.NYDUS_WORM) +parent_present[parent_names.BANELING_SOURCE] = AnyOf( + (item_names.ZERGLING_BANELING_ASPECT, item_names.KERRIGAN_SPAWN_BANELINGS), + item_names.ZERGLING_BANELING_ASPECT, +) +parent_present[parent_names.INFESTED_UNITS] = AnyOf(item_groups.infterr_units, display_string='Infested') +parent_present[parent_names.INFESTED_FACTORY_OR_STARPORT] = AnyOf( + (item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_SIEGE_TANK, item_names.INFESTED_LIBERATOR, item_names.INFESTED_BANSHEE, item_names.BULLFROG) +) +parent_present[parent_names.MORPH_SOURCE_AIR] = MorphlingOrAnyOf((item_names.MUTALISK, item_names.CORRUPTOR), "Mutalisk/Corruptor Morphs") +parent_present[parent_names.MORPH_SOURCE_ROACH] = MorphlingOrItem(item_names.ROACH) +parent_present[parent_names.MORPH_SOURCE_ZERGLING] = MorphlingOrItem(item_names.ZERGLING) +parent_present[parent_names.MORPH_SOURCE_HYDRALISK] = MorphlingOrItem(item_names.HYDRALISK) +parent_present[parent_names.MORPH_SOURCE_ULTRALISK] = MorphlingOrItem(item_names.ULTRALISK) +parent_present[parent_names.ZERG_UPROOTABLE_BUILDINGS] = AnyOf( + (item_names.SPINE_CRAWLER, item_names.SPORE_CRAWLER, item_names.INFESTED_MISSILE_TURRET, item_names.INFESTED_BUNKER), +) +parent_present[parent_names.ZERG_MELEE_ATTACKER] = AnyOf(item_groups.zerg_melee_wa, display_string='Zerg Ground') +parent_present[parent_names.ZERG_MISSILE_ATTACKER] = AnyOf(item_groups.zerg_ranged_wa, display_string='Zerg Ground') +parent_present[parent_names.ZERG_CARAPACE_UNIT] = AnyOf(item_groups.zerg_ground_units, display_string='Zerg Flyers') +parent_present[parent_names.ZERG_FLYING_UNIT] = AnyOf(item_groups.zerg_air_units, display_string='Zerg Flyers') +parent_present[parent_names.ZERG_MERCENARIES] = AnyOf(item_groups.zerg_mercenaries, display_string='Zerg Mercenaries') +parent_present[parent_names.ZERG_OUROBOUROS_CONDITION] = AnyOfGroupAndOneOtherItem( + (item_names.ZERGLING, item_names.ROACH, item_names.HYDRALISK, item_names.ABERRATION), + item_names.ECHIDNA_WORM +) + +# Protoss +parent_present[parent_names.ARCHON_SOURCE] = AnyOf( + (item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.ASCENDANT_ARCHON_MERGE, item_names.DARK_TEMPLAR_ARCHON_MERGE), + main_item="Archon", +) +parent_present[parent_names.CARRIER_CLASS] = AnyOf( + (item_names.CARRIER, item_names.TRIREME, item_names.SKYLORD), + main_item=item_names.CARRIER, +) +parent_present[parent_names.CARRIER_OR_TRIREME] = AnyOf( + (item_names.CARRIER, item_names.TRIREME), + main_item=item_names.CARRIER, +) +parent_present[parent_names.DARK_ARCHON_SOURCE] = AnyOf( + (item_names.DARK_ARCHON, item_names.DARK_TEMPLAR_DARK_ARCHON_MELD), + main_item=item_names.DARK_ARCHON, +) +parent_present[parent_names.DARK_TEMPLAR_CLASS] = AnyOf( + (item_names.DARK_TEMPLAR, item_names.AVENGER, item_names.BLOOD_HUNTER), + main_item=item_names.DARK_TEMPLAR, +) +parent_present[parent_names.STORM_CASTER] = AnyOf( + (item_names.HIGH_TEMPLAR, item_names.SIGNIFIER), + main_item=item_names.HIGH_TEMPLAR, +) +parent_present[parent_names.IMMORTAL_OR_ANNIHILATOR] = AnyOf( + (item_names.IMMORTAL, item_names.ANNIHILATOR), + main_item=item_names.IMMORTAL, +) +parent_present[parent_names.PHOENIX_CLASS] = AnyOf( + (item_names.PHOENIX, item_names.MIRAGE, item_names.SKIRMISHER), + main_item=item_names.PHOENIX, +) +parent_present[parent_names.SENTRY_CLASS] = AnyOf( + (item_names.SENTRY, item_names.ENERGIZER, item_names.HAVOC), + main_item=item_names.SENTRY, +) +parent_present[parent_names.SENTRY_CLASS_OR_SHIELD_BATTERY] = AnyOf( + (item_names.SENTRY, item_names.ENERGIZER, item_names.HAVOC, item_names.SHIELD_BATTERY), + main_item=item_names.SENTRY, +) +parent_present[parent_names.STALKER_CLASS] = AnyOf( + (item_names.STALKER, item_names.SLAYER, item_names.INSTIGATOR), + main_item=item_names.STALKER, +) +parent_present[parent_names.SUPPLICANT_AND_ASCENDANT] = AllOf( + (item_names.SUPPLICANT, item_names.ASCENDANT), + main_item=item_names.ASCENDANT, +) +parent_present[parent_names.VOID_RAY_CLASS] = AnyOf( + (item_names.VOID_RAY, item_names.DESTROYER, item_names.PULSAR, item_names.DAWNBRINGER), + main_item=item_names.VOID_RAY, +) +parent_present[parent_names.ZEALOT_OR_SENTINEL_OR_CENTURION] = AnyOf( + (item_names.ZEALOT, item_names.SENTINEL, item_names.CENTURION), + main_item=item_names.ZEALOT, +) +parent_present[parent_names.SCOUT_CLASS] = AnyOf( + (item_names.SCOUT, item_names.OPPRESSOR, item_names.CALADRIUS, item_names.MISTWING), + main_item=item_names.SCOUT, +) +parent_present[parent_names.SCOUT_OR_OPPRESSOR_OR_MISTWING] = AnyOf( + (item_names.SCOUT, item_names.OPPRESSOR, item_names.MISTWING), + main_item=item_names.SCOUT, +) +parent_present[parent_names.PROTOSS_STATIC_DEFENSE] = AnyOf( + (item_names.NEXUS_OVERCHARGE, item_names.PHOTON_CANNON, item_names.KHAYDARIN_MONOLITH, item_names.SHIELD_BATTERY), + main_item=item_names.PHOTON_CANNON, +) +parent_present[parent_names.PROTOSS_ATTACKING_BUILDING] = AnyOf( + (item_names.NEXUS_OVERCHARGE, item_names.PHOTON_CANNON, item_names.KHAYDARIN_MONOLITH), + main_item=item_names.PHOTON_CANNON, +) + + +parent_id_to_children: Dict[str, Sequence[str]] = {} +"""Parent identifier to child items. Only contains parent rules with children.""" +child_item_to_parent_items: Dict[str, Sequence[str]] = {} +"""Child item name to all parent items that can possibly affect its presence rule. Populated for all item names.""" + +parent_item_to_ids: Dict[str, Sequence[str]] = {} +"""Parent item to parent identifiers it affects. Populated for all items and parent IDs.""" +parent_item_to_children: Dict[str, Sequence[str]] = {} +"""Parent item to child item names. Populated for all items and parent IDs.""" +item_upgrade_groups: Dict[str, Sequence[str]] = {} +"""Mapping of upgradable item group -> child items. Only populated for groups with child items.""" +# Note(mm): "All items" promise satisfied by the basic ItemPresent auto-generated rules + +def _init() -> None: + for item_name, item_data in item_tables.item_table.items(): + if item_data.parent is None: + continue + parent_id_to_children.setdefault(item_data.parent, []).append(item_name) # type: ignore + child_item_to_parent_items[item_name] = parent_present[item_data.parent].parent_items() + + for parent_id, presence_func in parent_present.items(): + for parent_item in presence_func.parent_items(): + parent_item_to_ids.setdefault(parent_item, []).append(parent_id) # type: ignore + parent_item_to_children.setdefault(parent_item, []).extend(parent_id_to_children.get(parent_id, [])) # type: ignore + if presence_func.constraint_group is not None and parent_id_to_children.get(parent_id): + item_upgrade_groups.setdefault(presence_func.constraint_group, []).extend(parent_id_to_children[parent_id]) # type: ignore + +_init() diff --git a/worlds/sc2/item/item_tables.py b/worlds/sc2/item/item_tables.py new file mode 100644 index 0000000000..d63b00489f --- /dev/null +++ b/worlds/sc2/item/item_tables.py @@ -0,0 +1,2415 @@ +from typing import * + +from BaseClasses import ItemClassification +import typing + +from ..mission_tables import SC2Mission, SC2Race, SC2Campaign +from ..item import parent_names, ItemData, TerranItemType, FactionlessItemType, ProtossItemType, ZergItemType +from ..mission_order.presets_static import get_used_layout_names +from . import item_names + + + +def get_full_item_list(): + return item_table + + +SC2WOL_ITEM_ID_OFFSET = 1000 +SC2HOTS_ITEM_ID_OFFSET = SC2WOL_ITEM_ID_OFFSET + 1000 +SC2LOTV_ITEM_ID_OFFSET = SC2HOTS_ITEM_ID_OFFSET + 1000 +SC2_KEY_ITEM_ID_OFFSET = SC2LOTV_ITEM_ID_OFFSET + 1000 +# Reserve this many IDs for missions, layouts, campaigns, and generic keys each +SC2_KEY_ITEM_SECTION_SIZE = 1000 + +WEAPON_ARMOR_UPGRADE_MAX_LEVEL = 5 + + +# The items are sorted by their IDs. The IDs shall be kept for compatibility with older games. +item_table = { + # WoL + item_names.MARINE: + ItemData(0 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 0, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MEDIC: + ItemData(1 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 1, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.FIREBAT: + ItemData(2 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 2, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MARAUDER: + ItemData(3 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.REAPER: + ItemData(4 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 4, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.HELLION: + ItemData(5 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 5, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.VULTURE: + ItemData(6 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 6, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.GOLIATH: + ItemData(7 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.DIAMONDBACK: + ItemData(8 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 8, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SIEGE_TANK: + ItemData(9 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 9, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MEDIVAC: + ItemData(10 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 10, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.WRAITH: + ItemData(11 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 11, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.VIKING: + ItemData(12 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 12, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BANSHEE: + ItemData(13 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 13, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BATTLECRUISER: + ItemData(14 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 14, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.GHOST: + ItemData(15 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 15, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SPECTRE: + ItemData(16 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 16, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.THOR: + ItemData(17 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 17, SC2Race.TERRAN, + classification=ItemClassification.progression), + # EE units + item_names.LIBERATOR: + ItemData(18 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 18, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.VALKYRIE: + ItemData(19 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 19, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.WIDOW_MINE: + ItemData(20 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 20, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.CYCLONE: + ItemData(21 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 21, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.HERC: + ItemData(22 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 26, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.WARHOUND: + ItemData(23 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 27, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.DOMINION_TROOPER: + ItemData(24 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 4, SC2Race.TERRAN, + classification=ItemClassification.progression), + # Elites, currently disabled for balance + item_names.PRIDE_OF_AUGUSTRGRAD: + ItemData(50 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 28, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SKY_FURY: + ItemData(51 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 29, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SHOCK_DIVISION: + ItemData(52 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 0, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BLACKHAMMER: + ItemData(53 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 1, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.AEGIS_GUARD: + ItemData(54 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 2, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.EMPERORS_SHADOW: + ItemData(55 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SON_OF_KORHAL: + ItemData(56 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 5, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.BULWARK_COMPANY: + ItemData(57 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 6, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.FIELD_RESPONSE_THETA: + ItemData(58 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.EMPERORS_GUARDIAN: + ItemData(59 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 8, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NIGHT_HAWK: + ItemData(60 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 9, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NIGHT_WOLF: + ItemData(61 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit_2, 10, SC2Race.TERRAN, + classification=ItemClassification.progression), + + # Some other items are moved to Upgrade group because of the way how the bot message is parsed + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON: ItemData(100 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 0, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.INFANTRY_WEAPON_UNITS), + item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR: ItemData(102 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 4, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.INFANTRY_UNITS), + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON: ItemData(103 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 8, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.VEHICLE_WEAPON_UNITS), + item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR: ItemData(104 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 12, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.VEHICLE_UNITS), + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON: ItemData(105 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 16, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.STARSHIP_WEAPON_UNITS), + item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR: ItemData(106 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, 20, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.STARSHIP_UNITS), + # Bundles + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: ItemData(107 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: ItemData(108 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: ItemData(109 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.INFANTRY_UNITS), + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: ItemData(110 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.VEHICLE_UNITS), + item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: ItemData(111 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.STARSHIP_UNITS), + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: ItemData(112 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Upgrade, -1, SC2Race.TERRAN, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + + # Unit and structure upgrades + item_names.BUNKER_PROJECTILE_ACCELERATOR: + ItemData(200 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 0, SC2Race.TERRAN, + parent=item_names.BUNKER), + item_names.BUNKER_NEOSTEEL_BUNKER: + ItemData(201 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 1, SC2Race.TERRAN, + parent=item_names.BUNKER), + item_names.MISSILE_TURRET_TITANIUM_HOUSING: + ItemData(202 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 2, SC2Race.TERRAN, + parent=item_names.MISSILE_TURRET), + item_names.MISSILE_TURRET_HELLSTORM_BATTERIES: + ItemData(203 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 3, SC2Race.TERRAN, + parent=item_names.MISSILE_TURRET), + item_names.SCV_ADVANCED_CONSTRUCTION: + ItemData(204 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 4, SC2Race.TERRAN), + item_names.SCV_DUAL_FUSION_WELDERS: + ItemData(205 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 5, SC2Race.TERRAN), + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM: + ItemData(206 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 24, SC2Race.TERRAN, + quantity=2), + item_names.PROGRESSIVE_ORBITAL_COMMAND: + ItemData(207 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Deprecated, -1, SC2Race.TERRAN, + quantity=0, classification=ItemClassification.progression), + item_names.MARINE_PROGRESSIVE_STIMPACK: + ItemData(208 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 0, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MARINE, quantity=2), + item_names.MARINE_COMBAT_SHIELD: + ItemData(209 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 9, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MARINE), + item_names.MEDIC_ADVANCED_MEDIC_FACILITIES: + ItemData(210 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 10, SC2Race.TERRAN, + parent=item_names.MEDIC), + item_names.MEDIC_STABILIZER_MEDPACKS: + ItemData(211 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 11, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MEDIC), + item_names.FIREBAT_INCINERATOR_GAUNTLETS: + ItemData(212 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 12, SC2Race.TERRAN, + parent=item_names.FIREBAT), + item_names.FIREBAT_JUGGERNAUT_PLATING: + ItemData(213 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 13, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.FIREBAT), + item_names.MARAUDER_CONCUSSIVE_SHELLS: + ItemData(214 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 14, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.MARAUDER_KINETIC_FOAM: + ItemData(215 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 15, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.REAPER_U238_ROUNDS: + ItemData(216 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 16, SC2Race.TERRAN, + parent=item_names.REAPER), + item_names.REAPER_G4_CLUSTERBOMB: + ItemData(217 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 17, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.REAPER), + item_names.CYCLONE_MAG_FIELD_ACCELERATORS: + ItemData(218 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 18, SC2Race.TERRAN, + parent=item_names.CYCLONE), + item_names.CYCLONE_MAG_FIELD_LAUNCHERS: + ItemData(219 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 19, SC2Race.TERRAN, + parent=item_names.CYCLONE), + item_names.MARINE_LASER_TARGETING_SYSTEM: + ItemData(220 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 8, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MARINE), + item_names.MARINE_MAGRAIL_MUNITIONS: + ItemData(221 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 20, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MARINE), + item_names.MARINE_OPTIMIZED_LOGISTICS: + ItemData(222 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 21, SC2Race.TERRAN, + parent=item_names.MARINE), + item_names.MEDIC_RESTORATION: + ItemData(223 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 22, SC2Race.TERRAN, + parent=item_names.MEDIC), + item_names.MEDIC_OPTICAL_FLARE: + ItemData(224 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 23, SC2Race.TERRAN, + parent=item_names.MEDIC), + item_names.MEDIC_RESOURCE_EFFICIENCY: + ItemData(225 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 24, SC2Race.TERRAN, + parent=item_names.MEDIC), + item_names.FIREBAT_PROGRESSIVE_STIMPACK: + ItemData(226 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 6, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.FIREBAT, quantity=2), + item_names.FIREBAT_RESOURCE_EFFICIENCY: + ItemData(227 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 25, SC2Race.TERRAN, + parent=item_names.FIREBAT), + item_names.MARAUDER_PROGRESSIVE_STIMPACK: + ItemData(228 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 8, SC2Race.TERRAN, + parent=item_names.MARAUDER, quantity=2), + item_names.MARAUDER_LASER_TARGETING_SYSTEM: + ItemData(229 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 26, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.MARAUDER_MAGRAIL_MUNITIONS: + ItemData(230 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 27, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.MARAUDER_INTERNAL_TECH_MODULE: + ItemData(231 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 28, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.SCV_HOSTILE_ENVIRONMENT_ADAPTATION: + ItemData(232 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 29, SC2Race.TERRAN), + item_names.MEDIC_ADAPTIVE_MEDPACKS: + ItemData(233 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 0, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.MEDIC), + item_names.MEDIC_NANO_PROJECTOR: + ItemData(234 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 1, SC2Race.TERRAN, + parent=item_names.MEDIC), + item_names.FIREBAT_INFERNAL_PRE_IGNITER: + ItemData(235 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 2, SC2Race.TERRAN, + parent=item_names.FIREBAT), + item_names.FIREBAT_KINETIC_FOAM: + ItemData(236 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 3, SC2Race.TERRAN, + parent=item_names.FIREBAT), + item_names.FIREBAT_NANO_PROJECTORS: + ItemData(237 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 4, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.FIREBAT), + item_names.MARAUDER_JUGGERNAUT_PLATING: + ItemData(238 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 5, SC2Race.TERRAN, + parent=item_names.MARAUDER), + item_names.REAPER_JET_PACK_OVERDRIVE: + ItemData(239 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 6, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing, parent=item_names.REAPER), + item_names.HELLION_INFERNAL_PLATING: + ItemData(240 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 7, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.VULTURE_JERRYRIGGED_PATCHUP: + ItemData(241 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 8, SC2Race.TERRAN, + parent=item_names.VULTURE), + item_names.GOLIATH_SHAPED_HULL: + ItemData(242 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 9, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.GOLIATH_RESOURCE_EFFICIENCY: + ItemData(243 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 10, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.GOLIATH_INTERNAL_TECH_MODULE: + ItemData(244 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 11, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.SIEGE_TANK_SHAPED_HULL: + ItemData(245 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 12, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_RESOURCE_EFFICIENCY: + ItemData(246 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 13, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.PREDATOR_CLOAK: + ItemData(247 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 14, SC2Race.TERRAN, + parent=item_names.PREDATOR), + item_names.PREDATOR_CHARGE: + ItemData(248 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 15, SC2Race.TERRAN, + parent=item_names.PREDATOR), + item_names.MEDIVAC_SCATTER_VEIL: + ItemData(249 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 16, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.REAPER_PROGRESSIVE_STIMPACK: + ItemData(250 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 10, SC2Race.TERRAN, + parent=item_names.REAPER, quantity=2), + item_names.REAPER_LASER_TARGETING_SYSTEM: + ItemData(251 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 17, SC2Race.TERRAN, + parent=item_names.REAPER), + item_names.REAPER_ADVANCED_CLOAKING_FIELD: + ItemData(252 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 18, SC2Race.TERRAN, + parent=item_names.REAPER), + item_names.REAPER_SPIDER_MINES: + ItemData(253 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 19, SC2Race.TERRAN, + parent=item_names.REAPER, + important_for_filtering=True), + item_names.REAPER_COMBAT_DRUGS: + ItemData(254 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 20, SC2Race.TERRAN, + parent=item_names.REAPER), + item_names.HELLION_HELLBAT: + ItemData(255 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 21, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.HELLION), + item_names.HELLION_SMART_SERVOS: + ItemData(256 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 22, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.HELLION_OPTIMIZED_LOGISTICS: + ItemData(257 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 23, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.HELLION_JUMP_JETS: + ItemData(258 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 24, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.HELLION_PROGRESSIVE_STIMPACK: + ItemData(259 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 12, SC2Race.TERRAN, + parent=item_names.HELLION, quantity=2), + item_names.VULTURE_ION_THRUSTERS: + ItemData(260 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 25, SC2Race.TERRAN, + parent=item_names.VULTURE), + item_names.VULTURE_AUTO_LAUNCHERS: + ItemData(261 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 26, SC2Race.TERRAN, + parent=item_names.VULTURE), + item_names.SPIDER_MINE_HIGH_EXPLOSIVE_MUNITION: + ItemData(262 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 27, SC2Race.TERRAN, + parent=parent_names.SPIDER_MINE_SOURCE), + item_names.GOLIATH_JUMP_JETS: + ItemData(263 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 28, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.GOLIATH), + item_names.GOLIATH_OPTIMIZED_LOGISTICS: + ItemData(264 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_2, 29, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.DIAMONDBACK_HYPERFLUXOR: + ItemData(265 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 0, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK), + item_names.DIAMONDBACK_BURST_CAPACITORS: + ItemData(266 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 1, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK), + item_names.DIAMONDBACK_RESOURCE_EFFICIENCY: + ItemData(267 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 2, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK), + item_names.SIEGE_TANK_JUMP_JETS: + ItemData(268 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 3, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_SPIDER_MINES: + ItemData(269 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 4, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK, + important_for_filtering=True), + item_names.SIEGE_TANK_SMART_SERVOS: + ItemData(270 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 5, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_GRADUATING_RANGE: + ItemData(271 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 6, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_LASER_TARGETING_SYSTEM: + ItemData(272 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 7, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_ADVANCED_SIEGE_TECH: + ItemData(273 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 8, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_INTERNAL_TECH_MODULE: + ItemData(274 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 9, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.PREDATOR_RESOURCE_EFFICIENCY: + ItemData(275 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 10, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.PREDATOR), + item_names.MEDIVAC_EXPANDED_HULL: + ItemData(276 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 11, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.MEDIVAC_AFTERBURNERS: + ItemData(277 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 12, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY: + ItemData(278 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 13, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.WRAITH), + item_names.VIKING_SMART_SERVOS: + ItemData(279 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 14, SC2Race.TERRAN, + parent=item_names.VIKING), + item_names.VIKING_ANTI_MECHANICAL_MUNITION: + ItemData(280 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 15, SC2Race.TERRAN, + parent=item_names.VIKING), + item_names.DIAMONDBACK_MAGLEV_PROPULSION: + ItemData(281 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 21, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK), + item_names.WARHOUND_RESOURCE_EFFICIENCY: + ItemData(282 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 13, SC2Race.TERRAN, + parent=item_names.WARHOUND), + item_names.WARHOUND_AXIOM_PLATING: + ItemData(283 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 14, SC2Race.TERRAN, + parent=item_names.WARHOUND), + item_names.HERC_RESOURCE_EFFICIENCY: + ItemData(284 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 15, SC2Race.TERRAN, + parent=item_names.HERC), + item_names.HERC_JUGGERNAUT_PLATING: + ItemData(285 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 16, SC2Race.TERRAN, + parent=item_names.HERC), + item_names.HERC_KINETIC_FOAM: + ItemData(286 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 17, SC2Race.TERRAN, + parent=item_names.HERC), + item_names.REAPER_RESOURCE_EFFICIENCY: + ItemData(287 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 18, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.REAPER), + item_names.REAPER_BALLISTIC_FLIGHTSUIT: + ItemData(288 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 19, SC2Race.TERRAN, + parent=item_names.REAPER), + item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK: + ItemData(289 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 6, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=parent_names.SIEGE_TANK_AND_TRANSPORT, quantity=2), + item_names.SIEGE_TANK_ALLTERRAIN_TREADS : + ItemData(290 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 20, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.MEDIVAC_RAPID_REIGNITION_SYSTEMS: + ItemData(291 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 21, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.BATTLECRUISER_BEHEMOTH_REACTOR: + ItemData(292 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 22, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.THOR_RAPID_RELOAD: + ItemData(293 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 23, SC2Race.TERRAN, + parent=item_names.THOR), + item_names.LIBERATOR_GUERILLA_MISSILES: + ItemData(294 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 24, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.WIDOW_MINE_RESOURCE_EFFICIENCY: + ItemData(295 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 25, SC2Race.TERRAN, + parent=item_names.WIDOW_MINE), + item_names.HERC_GRAPPLE_PULL: + ItemData(296 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 26, SC2Race.TERRAN, + parent=item_names.HERC), + item_names.COMMAND_CENTER_SCANNER_SWEEP: + ItemData(297 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 27, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.COMMAND_CENTER_MULE: + ItemData(298 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 28, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.COMMAND_CENTER_EXTRA_SUPPLIES: + ItemData(299 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 29, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.HELLION_TWIN_LINKED_FLAMETHROWER: + ItemData(300 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 16, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.HELLION_THERMITE_FILAMENTS: + ItemData(301 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 17, SC2Race.TERRAN, + parent=item_names.HELLION), + item_names.SPIDER_MINE_CERBERUS_MINE: + ItemData(302 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 18, SC2Race.TERRAN, + parent=parent_names.SPIDER_MINE_SOURCE), + item_names.VULTURE_PROGRESSIVE_REPLENISHABLE_MAGAZINE: + ItemData(303 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 16, SC2Race.TERRAN, + parent=item_names.VULTURE, quantity=2), + item_names.GOLIATH_MULTI_LOCK_WEAPONS_SYSTEM: + ItemData(304 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 19, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.GOLIATH_ARES_CLASS_TARGETING_SYSTEM: + ItemData(305 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 20, SC2Race.TERRAN, + parent=item_names.GOLIATH), + item_names.DIAMONDBACK_PROGRESSIVE_TRI_LITHIUM_POWER_CELL: + ItemData(306 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 4, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK, quantity=2), + item_names.DIAMONDBACK_SHAPED_HULL: + ItemData(307 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 22, SC2Race.TERRAN, + parent=item_names.DIAMONDBACK), + item_names.SIEGE_TANK_MAELSTROM_ROUNDS: + ItemData(308 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 23, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.SIEGE_TANK), + item_names.SIEGE_TANK_SHAPED_BLAST: + ItemData(309 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 24, SC2Race.TERRAN, + parent=item_names.SIEGE_TANK), + item_names.MEDIVAC_RAPID_DEPLOYMENT_TUBE: + ItemData(310 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 25, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.MEDIVAC_ADVANCED_HEALING_AI: + ItemData(311 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 26, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.WRAITH_PROGRESSIVE_TOMAHAWK_POWER_CELLS: + ItemData(312 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 18, SC2Race.TERRAN, + parent=item_names.WRAITH, quantity=2), + item_names.WRAITH_DISPLACEMENT_FIELD: + ItemData(313 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 27, SC2Race.TERRAN, + parent=item_names.WRAITH), + item_names.VIKING_RIPWAVE_MISSILES: + ItemData(314 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 28, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VIKING), + item_names.VIKING_PHOBOS_CLASS_WEAPONS_SYSTEM: + ItemData(315 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_3, 29, SC2Race.TERRAN, + parent=item_names.VIKING), + item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS: + ItemData(316 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 2, SC2Race.TERRAN, + parent=item_names.BANSHEE, quantity=2), + item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY: + ItemData(317 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 0, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BANSHEE), + item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS: + ItemData(318 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 2, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER, quantity=2), + item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX: + ItemData(319 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 20, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BATTLECRUISER, quantity=2), + item_names.GHOST_OCULAR_IMPLANTS: + ItemData(320 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 2, SC2Race.TERRAN, + parent=item_names.GHOST), + item_names.GHOST_CRIUS_SUIT: + ItemData(321 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 3, SC2Race.TERRAN, + parent=item_names.GHOST), + item_names.SPECTRE_PSIONIC_LASH: + ItemData(322 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 4, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.SPECTRE), + item_names.SPECTRE_NYX_CLASS_CLOAKING_MODULE: + ItemData(323 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 5, SC2Race.TERRAN, + parent=item_names.SPECTRE), + item_names.THOR_330MM_BARRAGE_CANNON: + ItemData(324 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 6, SC2Race.TERRAN, + parent=item_names.THOR), + item_names.THOR_PROGRESSIVE_IMMORTALITY_PROTOCOL: + ItemData(325 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 22, SC2Race.TERRAN, + parent=item_names.THOR, quantity=2), + item_names.LIBERATOR_ADVANCED_BALLISTICS: + ItemData(326 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 7, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.LIBERATOR_RAID_ARTILLERY: + ItemData(327 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 8, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.LIBERATOR), + item_names.WIDOW_MINE_DRILLING_CLAWS: + ItemData(328 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 9, SC2Race.TERRAN, + parent=item_names.WIDOW_MINE), + item_names.WIDOW_MINE_CONCEALMENT: + ItemData(329 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 10, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.WIDOW_MINE), + item_names.MEDIVAC_ADVANCED_CLOAKING_FIELD: + ItemData(330 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 11, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.WRAITH_TRIGGER_OVERRIDE: + ItemData(331 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 12, SC2Race.TERRAN, + parent=item_names.WRAITH), + item_names.WRAITH_INTERNAL_TECH_MODULE: + ItemData(332 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 13, SC2Race.TERRAN, + parent=item_names.WRAITH), + item_names.WRAITH_RESOURCE_EFFICIENCY: + ItemData(333 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 14, SC2Race.TERRAN, + parent=item_names.WRAITH), + item_names.VIKING_SHREDDER_ROUNDS: + ItemData(334 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 15, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VIKING), + item_names.VIKING_WILD_MISSILES: + ItemData(335 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 16, SC2Race.TERRAN, + parent=item_names.VIKING), + item_names.BANSHEE_SHAPED_HULL: + ItemData(336 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 17, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BANSHEE), + item_names.BANSHEE_ADVANCED_TARGETING_OPTICS: + ItemData(337 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 18, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BANSHEE), + item_names.BANSHEE_DISTORTION_BLASTERS: + ItemData(338 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 19, SC2Race.TERRAN, + parent=item_names.BANSHEE), + item_names.BANSHEE_ROCKET_BARRAGE: + ItemData(339 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 20, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BANSHEE), + item_names.GHOST_RESOURCE_EFFICIENCY: + ItemData(340 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 21, SC2Race.TERRAN, + parent=item_names.GHOST), + item_names.SPECTRE_RESOURCE_EFFICIENCY: + ItemData(341 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 22, SC2Race.TERRAN, + parent=item_names.SPECTRE), + item_names.THOR_BUTTON_WITH_A_SKULL_ON_IT: + ItemData(342 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 23, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.THOR), + item_names.THOR_LASER_TARGETING_SYSTEM: + ItemData(343 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 24, SC2Race.TERRAN, + parent=item_names.THOR), + item_names.THOR_LARGE_SCALE_FIELD_CONSTRUCTION: + ItemData(344 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 25, SC2Race.TERRAN, + parent=item_names.THOR), + item_names.RAVEN_RESOURCE_EFFICIENCY: + ItemData(345 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 26, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.RAVEN_DURABLE_MATERIALS: + ItemData(346 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 27, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.SCIENCE_VESSEL_IMPROVED_NANO_REPAIR: + ItemData(347 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 28, SC2Race.TERRAN, + parent=item_names.SCIENCE_VESSEL), + item_names.SCIENCE_VESSEL_MAGELLAN_COMPUTATION_SYSTEMS: + ItemData(348 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 29, SC2Race.TERRAN, + parent=item_names.SCIENCE_VESSEL), + item_names.CYCLONE_RESOURCE_EFFICIENCY: + ItemData(349 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 0, SC2Race.TERRAN, + parent=item_names.CYCLONE), + item_names.BANSHEE_HYPERFLIGHT_ROTORS: + ItemData(350 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 1, SC2Race.TERRAN, + parent=item_names.BANSHEE), + item_names.BANSHEE_LASER_TARGETING_SYSTEM: + ItemData(351 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 2, SC2Race.TERRAN, + parent=item_names.BANSHEE), + item_names.BANSHEE_INTERNAL_TECH_MODULE: + ItemData(352 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 3, SC2Race.TERRAN, + parent=item_names.BANSHEE), + item_names.BATTLECRUISER_TACTICAL_JUMP: + ItemData(353 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 4, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_CLOAK: + ItemData(354 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 5, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_ATX_LASER_BATTERY: + ItemData(355 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 6, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_OPTIMIZED_LOGISTICS: + ItemData(356 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 7, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_INTERNAL_TECH_MODULE: + ItemData(357 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 8, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.GHOST_EMP_ROUNDS: + ItemData(358 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 9, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.GHOST), + item_names.GHOST_LOCKDOWN: + ItemData(359 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 10, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.GHOST), + item_names.SPECTRE_IMPALER_ROUNDS: + ItemData(360 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 11, SC2Race.TERRAN, + parent=item_names.SPECTRE), + item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD: + ItemData(361 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 14, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.THOR, quantity=2), + item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE: + ItemData(363 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 12, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.RAVEN), + item_names.RAVEN_SPIDER_MINES: + ItemData(364 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 13, SC2Race.TERRAN, + parent=item_names.RAVEN, important_for_filtering=True), + item_names.RAVEN_RAILGUN_TURRET: + ItemData(365 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 14, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.RAVEN_HUNTER_SEEKER_WEAPON: + ItemData(366 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 15, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.RAVEN), + item_names.RAVEN_INTERFERENCE_MATRIX: + ItemData(367 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 16, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.RAVEN_ANTI_ARMOR_MISSILE: + ItemData(368 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 17, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.RAVEN_INTERNAL_TECH_MODULE: + ItemData(369 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 18, SC2Race.TERRAN, + parent=item_names.RAVEN), + item_names.SCIENCE_VESSEL_EMP_SHOCKWAVE: + ItemData(370 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 19, SC2Race.TERRAN, + parent=item_names.SCIENCE_VESSEL), + item_names.SCIENCE_VESSEL_DEFENSIVE_MATRIX: + ItemData(371 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 20, SC2Race.TERRAN, + parent=item_names.SCIENCE_VESSEL), + item_names.CYCLONE_TARGETING_OPTICS: + ItemData(372 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 21, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.CYCLONE), + item_names.CYCLONE_RAPID_FIRE_LAUNCHERS: + ItemData(373 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 22, SC2Race.TERRAN, + parent=item_names.CYCLONE), + item_names.LIBERATOR_CLOAK: + ItemData(374 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 23, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.LIBERATOR_LASER_TARGETING_SYSTEM: + ItemData(375 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 24, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.LIBERATOR_OPTIMIZED_LOGISTICS: + ItemData(376 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 25, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.WIDOW_MINE_BLACK_MARKET_LAUNCHERS: + ItemData(377 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 26, SC2Race.TERRAN, + parent=item_names.WIDOW_MINE), + item_names.WIDOW_MINE_EXECUTIONER_MISSILES: + ItemData(378 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 27, SC2Race.TERRAN, + parent=item_names.WIDOW_MINE), + item_names.VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS: + ItemData(379 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 28, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VALKYRIE), + item_names.VALKYRIE_SHAPED_HULL: + ItemData(380 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_5, 29, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VALKYRIE), + item_names.VALKYRIE_FLECHETTE_MISSILES: + ItemData(381 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 0, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VALKYRIE), + item_names.VALKYRIE_AFTERBURNERS: + ItemData(382 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 1, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.VALKYRIE), + item_names.CYCLONE_INTERNAL_TECH_MODULE: + ItemData(383 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 2, SC2Race.TERRAN, + parent=item_names.CYCLONE), + item_names.LIBERATOR_SMART_SERVOS: + ItemData(384 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 3, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.LIBERATOR), + item_names.LIBERATOR_RESOURCE_EFFICIENCY: + ItemData(385 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 4, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.HERCULES_INTERNAL_FUSION_MODULE: + ItemData(386 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 5, SC2Race.TERRAN, + parent=item_names.HERCULES), + item_names.HERCULES_TACTICAL_JUMP: + ItemData(387 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 6, SC2Race.TERRAN, + parent=item_names.HERCULES), + item_names.PLANETARY_FORTRESS_PROGRESSIVE_AUGMENTED_THRUSTERS: + ItemData(388 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 28, SC2Race.TERRAN, + parent=item_names.PLANETARY_FORTRESS, quantity=2), + item_names.PLANETARY_FORTRESS_IBIKS_TRACKING_SCANNERS: + ItemData(389 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 7, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.PLANETARY_FORTRESS), + item_names.VALKYRIE_LAUNCHING_VECTOR_COMPENSATOR: + ItemData(390 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 8, SC2Race.TERRAN, + parent=item_names.VALKYRIE), + item_names.VALKYRIE_RESOURCE_EFFICIENCY: + ItemData(391 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 9, SC2Race.TERRAN, + parent=item_names.VALKYRIE), + item_names.PREDATOR_VESPENE_SYNTHESIS: + ItemData(392 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 10, SC2Race.TERRAN, + parent=item_names.PREDATOR), + item_names.BATTLECRUISER_BEHEMOTH_PLATING: + ItemData(393 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 11, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.BATTLECRUISER_MOIRAI_IMPULSE_DRIVE: + ItemData(394 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_6, 12, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.BATTLECRUISER), + item_names.PLANETARY_FORTRESS_ORBITAL_MODULE: + ItemData(395 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_4, 1, SC2Race.TERRAN, + parent=parent_names.ORBITAL_COMMAND_AND_PLANETARY), + item_names.DEVASTATOR_TURRET_CONCUSSIVE_GRENADES: + ItemData(396 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 0, SC2Race.TERRAN, + parent=item_names.DEVASTATOR_TURRET), + item_names.DEVASTATOR_TURRET_ANTI_ARMOR_MUNITIONS: + ItemData(397 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 1, SC2Race.TERRAN, + parent=item_names.DEVASTATOR_TURRET), + item_names.DEVASTATOR_TURRET_RESOURCE_EFFICIENCY: + ItemData(398 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 2, SC2Race.TERRAN, + parent=item_names.DEVASTATOR_TURRET), + item_names.MISSILE_TURRET_RESOURCE_EFFICENCY: + ItemData(399 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 3, SC2Race.TERRAN, + parent=item_names.MISSILE_TURRET), + # Note(mm): WoL ID 400 collides with buildings; jump forward to leave buildings room + + #Buildings + item_names.BUNKER: + ItemData(400 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 0, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.MISSILE_TURRET: + ItemData(401 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 1, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SENSOR_TOWER: + ItemData(402 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 2, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.DEVASTATOR_TURRET: + ItemData(403 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + + item_names.WAR_PIGS: + ItemData(500 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 0, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.DEVIL_DOGS: + ItemData(501 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 1, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.HAMMER_SECURITIES: + ItemData(502 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 2, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.SPARTAN_COMPANY: + ItemData(503 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 3, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.SIEGE_BREAKERS: + ItemData(504 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 4, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.HELS_ANGELS: + ItemData(505 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 5, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.DUSK_WINGS: + ItemData(506 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 6, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.JACKSONS_REVENGE: + ItemData(507 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 7, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.SKIBIS_ANGELS: + ItemData(508 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 8, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.DEATH_HEADS: + ItemData(509 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 9, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.WINGED_NIGHTMARES: + ItemData(510 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 10, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.MIDNIGHT_RIDERS: + ItemData(511 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 11, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.BRYNHILDS: + ItemData(512 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 12, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + item_names.JOTUN: + ItemData(513 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Mercenary, 13, SC2Race.TERRAN, + classification=ItemClassification.progression_skip_balancing), + + item_names.ULTRA_CAPACITORS: + ItemData(600 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 0, SC2Race.TERRAN), + item_names.VANADIUM_PLATING: + ItemData(601 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 1, SC2Race.TERRAN), + item_names.ORBITAL_DEPOTS: + ItemData(602 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 2, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.MICRO_FILTERING: + ItemData(603 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 3, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.AUTOMATED_REFINERY: + ItemData(604 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 4, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR: + ItemData(605 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 5, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.RAVEN: + ItemData(606 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 22, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SCIENCE_VESSEL: + ItemData(607 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 23, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.TECH_REACTOR: + ItemData(608 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 6, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.ORBITAL_STRIKE: + ItemData(609 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 7, SC2Race.TERRAN, + parent=parent_names.INFANTRY_UNITS), + item_names.BUNKER_SHRIKE_TURRET: + ItemData(610 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 6, SC2Race.TERRAN, + parent=item_names.BUNKER), + item_names.BUNKER_FORTIFIED_BUNKER: + ItemData(611 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_1, 7, SC2Race.TERRAN, + parent=item_names.BUNKER), + item_names.PLANETARY_FORTRESS: + ItemData(612 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PERDITION_TURRET: + ItemData(613 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Building, 4, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PREDATOR: + ItemData(614 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 24, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.HERCULES: + ItemData(615 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Unit, 25, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.CELLULAR_REACTOR: + ItemData(616 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 8, SC2Race.TERRAN), + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: + ItemData(617 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive, 4, SC2Race.TERRAN, quantity=3, + classification= ItemClassification.progression), + item_names.HIVE_MIND_EMULATOR: + ItemData(618 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 21, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PSI_DISRUPTER: + ItemData(619 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 18, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.STRUCTURE_ARMOR: + ItemData(620 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 9, SC2Race.TERRAN), + item_names.HI_SEC_AUTO_TRACKING: + ItemData(621 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 10, SC2Race.TERRAN), + item_names.ADVANCED_OPTICS: + ItemData(622 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 11, SC2Race.TERRAN), + item_names.ROGUE_FORCES: + ItemData(623 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 12, SC2Race.TERRAN, classification=ItemClassification.progression, parent=parent_names.TERRAN_MERCENARIES), + item_names.MECHANICAL_KNOW_HOW: + ItemData(624 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 13, SC2Race.TERRAN), + item_names.MERCENARY_MUNITIONS: + ItemData(625 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 14, SC2Race.TERRAN), + item_names.PROGRESSIVE_FAST_DELIVERY: + ItemData(626 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 8, SC2Race.TERRAN, quantity=2, classification=ItemClassification.progression, parent=parent_names.TERRAN_MERCENARIES), + item_names.RAPID_REINFORCEMENT: + ItemData(627 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 16, SC2Race.TERRAN, classification=ItemClassification.progression, parent=parent_names.TERRAN_MERCENARIES), + item_names.FUSION_CORE_FUSION_REACTOR: + ItemData(628 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 17, SC2Race.TERRAN), + item_names.SONIC_DISRUPTER: + ItemData(629 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 19, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PSI_SCREEN: + ItemData(630 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 20, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.ARGUS_AMPLIFIER: + ItemData(631 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 22, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.PSI_INDOCTRINATOR: + ItemData(632 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 23, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.SIGNAL_BEACON: + ItemData(633 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Laboratory, 24, SC2Race.TERRAN, parent=parent_names.TERRAN_MERCENARIES), + + # WoL Protoss takes SC2WOL + 700~708 + + item_names.SCIENCE_VESSEL_TACTICAL_JUMP: + ItemData(750 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 4, SC2Race.TERRAN, + parent=item_names.SCIENCE_VESSEL), + item_names.LIBERATOR_UED_MISSILE_TECHNOLOGY: + ItemData(751 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 5, SC2Race.TERRAN, + parent=item_names.LIBERATOR), + item_names.BATTLECRUISER_FIELD_ASSIST_TARGETING_SYSTEM: + ItemData(752 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 6, SC2Race.TERRAN, + parent=item_names.BATTLECRUISER), + item_names.PREDATOR_ADAPTIVE_DEFENSES: + ItemData(753 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 7, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.PREDATOR), + item_names.VIKING_AESIR_TURBINES: + ItemData(754 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 8, SC2Race.TERRAN, + parent=item_names.VIKING), + item_names.MEDIVAC_RESOURCE_EFFICIENCY: + ItemData(755 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 9, SC2Race.TERRAN, + parent=item_names.MEDIVAC), + item_names.EMPERORS_SHADOW_SOVEREIGN_TACTICAL_MISSILES: + ItemData(756 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 10, SC2Race.TERRAN, + parent=item_names.EMPERORS_SHADOW), + item_names.DOMINION_TROOPER_B2_HIGH_CAL_LMG: + ItemData(757 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 11, SC2Race.TERRAN, + parent=item_names.DOMINION_TROOPER, important_for_filtering=True), + item_names.DOMINION_TROOPER_HAILSTORM_LAUNCHER: + ItemData(758 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 12, SC2Race.TERRAN, + parent=item_names.DOMINION_TROOPER, important_for_filtering=True), + item_names.DOMINION_TROOPER_CPO7_SALAMANDER_FLAMETHROWER: + ItemData(759 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 13, SC2Race.TERRAN, + parent=item_names.DOMINION_TROOPER, important_for_filtering=True), + item_names.DOMINION_TROOPER_ADVANCED_ALLOYS: + ItemData(760 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 14, SC2Race.TERRAN, + parent=parent_names.DOMINION_TROOPER_WEAPONS), + item_names.DOMINION_TROOPER_OPTIMIZED_LOGISTICS: + ItemData(761 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 15, SC2Race.TERRAN, + parent=item_names.DOMINION_TROOPER), + item_names.SCV_CONSTRUCTION_JUMP_JETS: + ItemData(762 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 16, SC2Race.TERRAN), + item_names.WIDOW_MINE_DEMOLITION_PAYLOAD: + ItemData(763 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 17, SC2Race.TERRAN, + classification=ItemClassification.progression, parent=item_names.WIDOW_MINE), + item_names.SENSOR_TOWER_ASSISTIVE_TARGETING: + ItemData(764 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 18, SC2Race.TERRAN, + parent=item_names.SENSOR_TOWER), + item_names.SENSOR_TOWER_MUILTISPECTRUM_DOPPLER: + ItemData(765 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 19, SC2Race.TERRAN, + parent=item_names.SENSOR_TOWER), + item_names.WARHOUND_DEPLOY_TURRET: + ItemData(766 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 20, SC2Race.TERRAN, + parent=item_names.WARHOUND), + item_names.GHOST_BARGAIN_BIN_PRICES: + ItemData(767 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 21, SC2Race.TERRAN, + parent=item_names.GHOST), + item_names.SPECTRE_BARGAIN_BIN_PRICES: + ItemData(768 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Armory_7, 22, SC2Race.TERRAN, + parent=item_names.SPECTRE), + + # Filler items to fill remaining spots + item_names.STARTING_MINERALS: + ItemData(800 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Minerals, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.STARTING_VESPENE: + ItemData(801 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Vespene, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.STARTING_SUPPLY: + ItemData(802 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Supply, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + # This item is used to "remove" location from the game. Never placed unless plando'd + item_names.NOTHING: + ItemData(803 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.Nothing, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.trap), + item_names.MAX_SUPPLY: + ItemData(804 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.MaxSupply, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.SHIELD_REGENERATION: + ItemData(805 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.ShieldRegeneration, 1, SC2Race.PROTOSS, quantity=0, + classification=ItemClassification.filler), + item_names.BUILDING_CONSTRUCTION_SPEED: + ItemData(806 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.BuildingSpeed, 1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.UPGRADE_RESEARCH_SPEED: + ItemData(807 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.ResearchSpeed, 1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + item_names.UPGRADE_RESEARCH_COST: + ItemData(808 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.ResearchCost, 1, SC2Race.ANY, quantity=0, + classification=ItemClassification.filler), + + # Trap Filler + item_names.REDUCED_MAX_SUPPLY: + ItemData(850 + SC2WOL_ITEM_ID_OFFSET, FactionlessItemType.MaxSupplyTrap, -1, SC2Race.ANY, quantity=0, + classification=ItemClassification.trap), + + + # Nova gear + item_names.NOVA_GHOST_VISOR: + ItemData(900 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 0, SC2Race.TERRAN, classification=ItemClassification.progression), + item_names.NOVA_RANGEFINDER_OCULUS: + ItemData(901 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 1, SC2Race.TERRAN), + item_names.NOVA_DOMINATION: + ItemData(902 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 2, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_BLINK: + ItemData(903 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 3, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE: + ItemData(904 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Progressive_2, 0, SC2Race.TERRAN, quantity=2, + classification=ItemClassification.progression), + item_names.NOVA_ENERGY_SUIT_MODULE: + ItemData(905 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 4, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_ARMORED_SUIT_MODULE: + ItemData(906 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 5, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_JUMP_SUIT_MODULE: + ItemData(907 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 6, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_C20A_CANISTER_RIFLE: + ItemData(908 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 7, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_HELLFIRE_SHOTGUN: + ItemData(909 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 8, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_PLASMA_RIFLE: + ItemData(910 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 9, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_MONOMOLECULAR_BLADE: + ItemData(911 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 10, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_BLAZEFIRE_GUNBLADE: + ItemData(912 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 11, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_STIM_INFUSION: + ItemData(913 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 12, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_PULSE_GRENADES: + ItemData(914 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 13, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_FLASHBANG_GRENADES: + ItemData(915 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 14, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_IONIC_FORCE_FIELD: + ItemData(916 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 15, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_HOLO_DECOY: + ItemData(917 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 16, SC2Race.TERRAN, + classification=ItemClassification.progression), + item_names.NOVA_NUKE: + ItemData(918 + SC2WOL_ITEM_ID_OFFSET, TerranItemType.Nova_Gear, 17, SC2Race.TERRAN, + classification=ItemClassification.progression), + + # HotS + item_names.ZERGLING: + ItemData(0 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 0, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SWARM_QUEEN: + ItemData(1 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 1, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ROACH: + ItemData(2 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 2, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.HYDRALISK: + ItemData(3 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 3, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ZERGLING_BANELING_ASPECT: + ItemData(4 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 5, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_ZERGLING), + item_names.ABERRATION: + ItemData(5 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 5, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.MUTALISK: + ItemData(6 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 6, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SWARM_HOST: + ItemData(7 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 7, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTOR: + ItemData(8 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 8, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ULTRALISK: + ItemData(9 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 9, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SPORE_CRAWLER: + ItemData(10 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 10, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SPINE_CRAWLER: + ItemData(11 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 11, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.CORRUPTOR: + ItemData(12 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 12, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.SCOURGE: + ItemData(13 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 13, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.BROOD_QUEEN: + ItemData(14 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 4, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.DEFILER: + ItemData(15 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 14, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_MARINE: + ItemData(16 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 15, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_BUNKER: + ItemData(17 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 16, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.NYDUS_WORM: + ItemData(18 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 17, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.ECHIDNA_WORM: + ItemData(19 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 18, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_SIEGE_TANK: + ItemData(20 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 19, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_DIAMONDBACK: + ItemData(21 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 20, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_BANSHEE: + ItemData(22 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 21, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_LIBERATOR: + ItemData(23 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 22, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.INFESTED_MISSILE_TURRET: + ItemData(24 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 23, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.PYGALISK: + ItemData(25 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 24, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.BILE_LAUNCHER: + ItemData(26 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 25, SC2Race.ZERG, + classification=ItemClassification.progression), + item_names.BULLFROG: + ItemData(27 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Unit, 26, SC2Race.ZERG, + classification=ItemClassification.progression), + + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK: ItemData(100 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 0, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_MELEE_ATTACKER), + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK: ItemData(101 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 4, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_MISSILE_ATTACKER), + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE: ItemData(102 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 8, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_CARAPACE_UNIT), + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK: ItemData(103 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 12, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_FLYING_UNIT), + item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE: ItemData(104 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, 16, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_FLYING_UNIT), + # Bundles + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: ItemData(105 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: ItemData(106 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: ItemData(107 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_CARAPACE_UNIT), + item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: ItemData(108 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL, parent=parent_names.ZERG_FLYING_UNIT), + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Upgrade, -1, SC2Race.ZERG, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + + item_names.ZERGLING_HARDENED_CARAPACE: + ItemData(200 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 0, SC2Race.ZERG, parent=item_names.ZERGLING), + item_names.ZERGLING_ADRENAL_OVERLOAD: + ItemData(201 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 1, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ZERGLING), + item_names.ZERGLING_METABOLIC_BOOST: + ItemData(202 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 2, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ZERGLING), + item_names.ROACH_HYDRIODIC_BILE: + ItemData(203 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 3, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ROACH), + item_names.ROACH_ADAPTIVE_PLATING: + ItemData(204 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 4, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ROACH), + item_names.ROACH_TUNNELING_CLAWS: + ItemData(205 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 5, SC2Race.ZERG, parent=item_names.ROACH), + item_names.HYDRALISK_FRENZY: + ItemData(206 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 6, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.HYDRALISK), + item_names.HYDRALISK_ANCILLARY_CARAPACE: + ItemData(207 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 7, SC2Race.ZERG, parent=item_names.HYDRALISK), + item_names.HYDRALISK_GROOVED_SPINES: + ItemData(208 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 8, SC2Race.ZERG, parent=item_names.HYDRALISK), + item_names.BANELING_CORROSIVE_ACID: + ItemData(209 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 9, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.BANELING_SOURCE), + item_names.BANELING_RUPTURE: + ItemData(210 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 10, SC2Race.ZERG, + parent=parent_names.BANELING_SOURCE), + item_names.BANELING_REGENERATIVE_ACID: + ItemData(211 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 11, SC2Race.ZERG, + parent=parent_names.BANELING_SOURCE), + item_names.MUTALISK_VICIOUS_GLAIVE: + ItemData(212 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 12, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK), + item_names.MUTALISK_RAPID_REGENERATION: + ItemData(213 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 13, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK), + item_names.MUTALISK_SUNDERING_GLAIVE: + ItemData(214 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 14, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK), + item_names.SWARM_HOST_BURROW: + ItemData(215 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 15, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_RAPID_INCUBATION: + ItemData(216 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 16, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_PRESSURIZED_GLANDS: + ItemData(217 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 17, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.SWARM_HOST), + item_names.ULTRALISK_BURROW_CHARGE: + ItemData(218 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 18, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.ULTRALISK_TISSUE_ASSIMILATION: + ItemData(219 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 19, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.ULTRALISK_MONARCH_BLADES: + ItemData(220 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 20, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ULTRALISK), + item_names.CORRUPTOR_CAUSTIC_SPRAY: + ItemData(221 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 21, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.CORRUPTOR_CORRUPTION: + ItemData(222 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 22, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.SCOURGE_VIRULENT_SPORES: + ItemData(223 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 23, SC2Race.ZERG, parent=item_names.SCOURGE), + item_names.SCOURGE_RESOURCE_EFFICIENCY: + ItemData(224 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 24, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.SCOURGE), + item_names.SCOURGE_SWARM_SCOURGE: + ItemData(225 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 25, SC2Race.ZERG, parent=item_names.SCOURGE), + item_names.ZERGLING_SHREDDING_CLAWS: + ItemData(226 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 26, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ZERGLING), + item_names.ROACH_GLIAL_RECONSTITUTION: + ItemData(227 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 27, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ROACH), + item_names.ROACH_ORGANIC_CARAPACE: + ItemData(228 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 28, SC2Race.ZERG, parent=item_names.ROACH), + item_names.HYDRALISK_MUSCULAR_AUGMENTS: + ItemData(229 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_1, 29, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.HYDRALISK), + item_names.HYDRALISK_RESOURCE_EFFICIENCY: + ItemData(230 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 0, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.HYDRALISK), + item_names.BANELING_CENTRIFUGAL_HOOKS: + ItemData(231 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 1, SC2Race.ZERG, + parent=parent_names.BANELING_SOURCE), + item_names.BANELING_TUNNELING_JAWS: + ItemData(232 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 2, SC2Race.ZERG, + parent=parent_names.BANELING_SOURCE), + item_names.BANELING_RAPID_METAMORPH: + ItemData(233 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 3, SC2Race.ZERG, + parent=item_names.ZERGLING_BANELING_ASPECT), + item_names.MUTALISK_SEVERING_GLAIVE: + ItemData(234 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 4, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK), + item_names.MUTALISK_AERODYNAMIC_GLAIVE_SHAPE: + ItemData(235 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 5, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK), + item_names.SWARM_HOST_LOCUST_METABOLIC_BOOST: + ItemData(236 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 6, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_ENDURING_LOCUSTS: + ItemData(237 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 7, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_ORGANIC_CARAPACE: + ItemData(238 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 8, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_RESOURCE_EFFICIENCY: + ItemData(239 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 9, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing, parent=item_names.SWARM_HOST), + item_names.ULTRALISK_ANABOLIC_SYNTHESIS: + ItemData(240 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 10, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.ULTRALISK_CHITINOUS_PLATING: + ItemData(241 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 11, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ULTRALISK), + item_names.ULTRALISK_ORGANIC_CARAPACE: + ItemData(242 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 12, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.ULTRALISK_RESOURCE_EFFICIENCY: + ItemData(243 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 13, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.DEVOURER_CORROSIVE_SPRAY: + ItemData(244 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 14, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), + item_names.DEVOURER_GAPING_MAW: + ItemData(245 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 15, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), + item_names.DEVOURER_IMPROVED_OSMOSIS: + ItemData(246 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 16, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT), + item_names.DEVOURER_PRESCIENT_SPORES: + ItemData(247 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 17, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, + classification=ItemClassification.progression), + item_names.GUARDIAN_PROLONGED_DISPERSION: + ItemData(248 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 18, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.GUARDIAN_PRIMAL_ADAPTATION: + ItemData(249 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 19, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, + classification=ItemClassification.progression), + item_names.GUARDIAN_SORONAN_ACID: + ItemData(250 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 20, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.IMPALER_ADAPTIVE_TALONS: + ItemData(251 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 21, SC2Race.ZERG, + parent=item_names.HYDRALISK_IMPALER_ASPECT), + item_names.IMPALER_SECRETION_GLANDS: + ItemData(252 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 22, SC2Race.ZERG, + parent=item_names.HYDRALISK_IMPALER_ASPECT), + item_names.IMPALER_SUNKEN_SPINES: + ItemData(253 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 23, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.HYDRALISK_IMPALER_ASPECT), + item_names.LURKER_SEISMIC_SPINES: + ItemData(254 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 24, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.HYDRALISK_LURKER_ASPECT), + item_names.LURKER_ADAPTED_SPINES: + ItemData(255 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 25, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.HYDRALISK_LURKER_ASPECT), + item_names.RAVAGER_POTENT_BILE: + ItemData(256 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 26, SC2Race.ZERG, + parent=item_names.ROACH_RAVAGER_ASPECT), + item_names.RAVAGER_BLOATED_BILE_DUCTS: + ItemData(257 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 27, SC2Race.ZERG, + parent=item_names.ROACH_RAVAGER_ASPECT), + item_names.RAVAGER_DEEP_TUNNEL: + ItemData(258 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 28, SC2Race.ZERG, + classification=ItemClassification.progression_skip_balancing, parent=item_names.ROACH_RAVAGER_ASPECT), + item_names.VIPER_PARASITIC_BOMB: + ItemData(259 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_2, 29, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, + classification=ItemClassification.progression), + item_names.VIPER_PARALYTIC_BARBS: + ItemData(260 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 0, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT), + item_names.VIPER_VIRULENT_MICROBES: + ItemData(261 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 1, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT), + item_names.BROOD_LORD_POROUS_CARTILAGE: + ItemData(262 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 2, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.BROOD_LORD_BEHEMOTH_STELLARSKIN: + ItemData(263 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 3, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.BROOD_LORD_SPLITTER_MITOSIS: + ItemData(264 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 4, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.BROOD_LORD_RESOURCE_EFFICIENCY: + ItemData(265 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 5, SC2Race.ZERG, + parent=item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT), + item_names.INFESTOR_INFESTED_TERRAN: + ItemData(266 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 6, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.INFESTOR), + item_names.INFESTOR_MICROBIAL_SHROUD: + ItemData(267 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 7, SC2Race.ZERG, parent=item_names.INFESTOR), + item_names.SWARM_QUEEN_SPAWN_LARVAE: + ItemData(268 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 8, SC2Race.ZERG, parent=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_DEEP_TUNNEL: + ItemData(269 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 9, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing, parent=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_ORGANIC_CARAPACE: + ItemData(270 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 10, SC2Race.ZERG, parent=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION: + ItemData(271 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 11, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_RESOURCE_EFFICIENCY: + ItemData(272 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 12, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.SWARM_QUEEN), + item_names.SWARM_QUEEN_INCUBATOR_CHAMBER: + ItemData(273 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 13, SC2Race.ZERG, parent=item_names.SWARM_QUEEN), + item_names.BROOD_QUEEN_FUNGAL_GROWTH: + ItemData(274 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 14, SC2Race.ZERG, parent=item_names.BROOD_QUEEN), + item_names.BROOD_QUEEN_ENSNARE: + ItemData(275 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 15, SC2Race.ZERG, parent=item_names.BROOD_QUEEN), + item_names.BROOD_QUEEN_ENHANCED_MITOCHONDRIA: + ItemData(276 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 16, SC2Race.ZERG, parent=item_names.BROOD_QUEEN), + item_names.DEFILER_PATHOGEN_PROJECTORS: + ItemData(277 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 17, SC2Race.ZERG, parent=item_names.DEFILER), + item_names.DEFILER_TRAPDOOR_ADAPTATION: + ItemData(278 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 18, SC2Race.ZERG, parent=item_names.DEFILER), + item_names.DEFILER_PREDATORY_CONSUMPTION: + ItemData(279 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 19, SC2Race.ZERG, parent=item_names.DEFILER), + item_names.DEFILER_COMORBIDITY: + ItemData(280 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 20, SC2Race.ZERG, parent=item_names.DEFILER), + item_names.ABERRATION_MONSTROUS_RESILIENCE: + ItemData(281 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 21, SC2Race.ZERG, parent=item_names.ABERRATION), + item_names.ABERRATION_CONSTRUCT_REGENERATION: + ItemData(282 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 22, SC2Race.ZERG, parent=item_names.ABERRATION), + item_names.ABERRATION_BANELING_INCUBATION: + ItemData(283 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 23, SC2Race.ZERG, parent=item_names.ABERRATION), + item_names.ABERRATION_PROTECTIVE_COVER: + ItemData(284 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 24, SC2Race.ZERG, parent=item_names.ABERRATION), + item_names.ABERRATION_RESOURCE_EFFICIENCY: + ItemData(285 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 25, SC2Race.ZERG, parent=item_names.ABERRATION), + item_names.CORRUPTOR_MONSTROUS_RESILIENCE: + ItemData(286 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 26, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.CORRUPTOR_CONSTRUCT_REGENERATION: + ItemData(287 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 27, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.CORRUPTOR_SCOURGE_INCUBATION: + ItemData(288 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 28, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.CORRUPTOR_RESOURCE_EFFICIENCY: + ItemData(289 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_3, 29, SC2Race.ZERG, parent=item_names.CORRUPTOR), + item_names.PRIMAL_IGNITER_CONCENTRATED_FIRE: + ItemData(290 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 0, SC2Race.ZERG, parent=item_names.ROACH_PRIMAL_IGNITER_ASPECT), + item_names.PRIMAL_IGNITER_PRIMAL_TENACITY: + ItemData(291 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 1, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ROACH_PRIMAL_IGNITER_ASPECT), + item_names.INFESTED_SCV_BUILD_CHARGES: + ItemData(292 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 2, SC2Race.ZERG, parent=parent_names.INFESTED_UNITS), + item_names.INFESTED_MARINE_PLAGUED_MUNITIONS: + ItemData(293 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 3, SC2Race.ZERG, parent=item_names.INFESTED_MARINE), + item_names.INFESTED_MARINE_RETINAL_AUGMENTATION: + ItemData(294 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 4, SC2Race.ZERG, parent=item_names.INFESTED_MARINE), + item_names.INFESTED_BUNKER_CALCIFIED_ARMOR: + ItemData(295 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 6, SC2Race.ZERG, parent=item_names.INFESTED_BUNKER), + item_names.INFESTED_BUNKER_REGENERATIVE_PLATING: + ItemData(296 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 5, SC2Race.ZERG, parent=item_names.INFESTED_BUNKER), + item_names.INFESTED_BUNKER_ENGORGED_BUNKERS: + ItemData(297 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 7, SC2Race.ZERG, parent=item_names.INFESTED_BUNKER), + item_names.INFESTED_MISSILE_TURRET_BIOELECTRIC_PAYLOAD: + ItemData(298 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 6, SC2Race.ZERG, parent=item_names.INFESTED_MISSILE_TURRET), + item_names.INFESTED_MISSILE_TURRET_ACID_SPORE_VENTS: + ItemData(299 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 7, SC2Race.ZERG, parent=item_names.INFESTED_MISSILE_TURRET), + + item_names.ZERGLING_RAPTOR_STRAIN: + ItemData(300 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 0, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ZERGLING), + item_names.ZERGLING_SWARMLING_STRAIN: + ItemData(301 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 1, SC2Race.ZERG, parent=item_names.ZERGLING), + item_names.ROACH_VILE_STRAIN: + ItemData(302 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 2, SC2Race.ZERG, parent=item_names.ROACH), + item_names.ROACH_CORPSER_STRAIN: + ItemData(303 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 3, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ROACH), + item_names.HYDRALISK_IMPALER_ASPECT: + ItemData(304 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 0, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_HYDRALISK), + item_names.HYDRALISK_LURKER_ASPECT: + ItemData(305 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 1, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_HYDRALISK), + item_names.BANELING_SPLITTER_STRAIN: + ItemData(306 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 6, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.BANELING_SOURCE), + item_names.BANELING_HUNTER_STRAIN: + ItemData(307 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 7, SC2Race.ZERG, parent=parent_names.BANELING_SOURCE), + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT: + ItemData(308 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 2, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_AIR), + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT: + ItemData(309 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 3, SC2Race.ZERG, + classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_AIR), + item_names.SWARM_HOST_CARRION_STRAIN: + ItemData(310 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 10, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.SWARM_HOST_CREEPER_STRAIN: + ItemData(311 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 11, SC2Race.ZERG, parent=item_names.SWARM_HOST), + item_names.ULTRALISK_NOXIOUS_STRAIN: + ItemData(312 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 12, SC2Race.ZERG, parent=item_names.ULTRALISK), + item_names.ULTRALISK_TORRASQUE_STRAIN: + ItemData(313 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Strain, 13, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ULTRALISK), + + item_names.TYRANNOZOR_TYRANTS_PROTECTION: + ItemData(350 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 8, SC2Race.ZERG, parent=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.TYRANNOZOR_BARRAGE_OF_SPIKES: + ItemData(351 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 9, SC2Race.ZERG, parent=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.TYRANNOZOR_IMPALING_STRIKE: + ItemData(352 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 10, SC2Race.ZERG, parent=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.TYRANNOZOR_HEALING_ADAPTATION: + ItemData(353 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 11, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ULTRALISK_TYRANNOZOR_ASPECT), + item_names.NYDUS_WORM_ECHIDNA_WORM_SUBTERRANEAN_SCALES: + ItemData(354 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 12, SC2Race.ZERG, parent=parent_names.ANY_NYDUS_WORM), + item_names.NYDUS_WORM_ECHIDNA_WORM_JORMUNGANDR_STRAIN: + ItemData(355 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 13, SC2Race.ZERG, parent=parent_names.ANY_NYDUS_WORM), + item_names.NYDUS_WORM_ECHIDNA_WORM_RESOURCE_EFFICIENCY: + ItemData(356 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 14, SC2Race.ZERG, parent=parent_names.ANY_NYDUS_WORM), + item_names.ECHIDNA_WORM_OUROBOROS_STRAIN: + ItemData(357 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 15, SC2Race.ZERG, parent=parent_names.ZERG_OUROBOUROS_CONDITION), + item_names.NYDUS_WORM_RAVENOUS_APPETITE: + ItemData(358 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 16, SC2Race.ZERG, parent=item_names.NYDUS_WORM), + item_names.INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS: + ItemData(359 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Progressive, 0, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.INFESTED_SIEGE_TANK, quantity=2), + item_names.INFESTED_SIEGE_TANK_ACIDIC_ENZYMES: + ItemData(360 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 17, SC2Race.ZERG, parent=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_SIEGE_TANK_DEEP_TUNNEL: + ItemData(361 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 18, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing, parent=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_DIAMONDBACK_CAUSTIC_MUCUS: + ItemData(362 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 19, SC2Race.ZERG, parent=item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_DIAMONDBACK_VIOLENT_ENZYMES: + ItemData(363 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 20, SC2Race.ZERG, parent=item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_BANSHEE_BRACED_EXOSKELETON: + ItemData(364 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 21, SC2Race.ZERG, parent=item_names.INFESTED_BANSHEE), + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION: + ItemData(365 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 22, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.INFESTED_BANSHEE), + item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL: + ItemData(366 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 23, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.INFESTED_LIBERATOR), + item_names.INFESTED_LIBERATOR_VIRAL_CONTAMINATION: + ItemData(367 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 24, SC2Race.ZERG, parent=item_names.INFESTED_LIBERATOR), + item_names.GUARDIAN_PROPELLANT_SACS: + ItemData(368 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 25, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.GUARDIAN_EXPLOSIVE_SPORES: + ItemData(369 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 26, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.GUARDIAN_PRIMORDIAL_FURY: + ItemData(370 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 27, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT), + item_names.INFESTED_SIEGE_TANK_SEISMIC_SONAR: + ItemData(371 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 28, SC2Race.ZERG, parent=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS: + ItemData(372 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_4, 29, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.INFESTED_BANSHEE), + item_names.INFESTED_SIEGE_TANK_BALANCED_ROOTS: + ItemData(373 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 0, SC2Race.ZERG, parent=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE: + ItemData(374 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Progressive, 2, SC2Race.ZERG, + classification=ItemClassification.progression, parent=item_names.INFESTED_DIAMONDBACK, quantity=2), + item_names.INFESTED_DIAMONDBACK_CONCENTRATED_SPEW: + ItemData(375 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 1, SC2Race.ZERG, parent=item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_SIEGE_TANK_FRIGHTFUL_FLESHWELDER: + ItemData(376 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 2, SC2Race.ZERG, parent=item_names.INFESTED_SIEGE_TANK), + item_names.INFESTED_DIAMONDBACK_FRIGHTFUL_FLESHWELDER: + ItemData(377 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 3, SC2Race.ZERG, parent=item_names.INFESTED_DIAMONDBACK), + item_names.INFESTED_BANSHEE_FRIGHTFUL_FLESHWELDER: + ItemData(378 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 4, SC2Race.ZERG, parent=item_names.INFESTED_BANSHEE), + item_names.INFESTED_LIBERATOR_FRIGHTFUL_FLESHWELDER: + ItemData(379 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 5, SC2Race.ZERG, parent=item_names.INFESTED_LIBERATOR), + item_names.INFESTED_LIBERATOR_DEFENDER_MODE: + ItemData(380 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 8, SC2Race.ZERG, parent=item_names.INFESTED_LIBERATOR, + classification=ItemClassification.progression), + item_names.ABERRATION_PROGRESSIVE_BANELING_LAUNCH: + ItemData(381 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Progressive, 4, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.ABERRATION, quantity=2), + item_names.PYGALISK_STIM: + ItemData(382 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 9, SC2Race.ZERG, parent=item_names.PYGALISK), + item_names.PYGALISK_DUCAL_BLADES: + ItemData(383 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 10, SC2Race.ZERG, parent=item_names.PYGALISK), + item_names.PYGALISK_COMBAT_CARAPACE: + ItemData(384 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 11, SC2Race.ZERG, parent=item_names.PYGALISK), + item_names.BILE_LAUNCHER_ARTILLERY_DUCTS: + ItemData(385 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 12, SC2Race.ZERG, parent=item_names.BILE_LAUNCHER), + item_names.BILE_LAUNCHER_RAPID_BOMBARMENT: + ItemData(386 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 13, SC2Race.ZERG, classification=ItemClassification.progression, parent=item_names.BILE_LAUNCHER), + item_names.BULLFROG_WILD_MUTATION: + ItemData(387 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 14, SC2Race.ZERG, parent=item_names.BULLFROG), + item_names.BULLFROG_BROODLINGS: + ItemData(388 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 15, SC2Race.ZERG, parent=item_names.BULLFROG), + item_names.BULLFROG_HARD_IMPACT: + ItemData(389 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 16, SC2Race.ZERG, parent=item_names.BULLFROG), + item_names.BULLFROG_RANGE: + ItemData(390 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 17, SC2Race.ZERG, parent=item_names.BULLFROG), + item_names.SPORE_CRAWLER_BIO_BONUS: + ItemData(391 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mutation_5, 18, SC2Race.ZERG, parent=item_names.SPORE_CRAWLER), + + item_names.KERRIGAN_KINETIC_BLAST: ItemData(400 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 0, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_HEROIC_FORTITUDE: ItemData(401 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 1, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_LEAPING_STRIKE: ItemData(402 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 2, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_CRUSHING_GRIP: ItemData(403 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 3, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_CHAIN_REACTION: ItemData(404 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 4, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_PSIONIC_SHIFT: ItemData(405 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 5, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.ZERGLING_RECONSTITUTION: ItemData(406 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 0, SC2Race.ZERG, parent=item_names.ZERGLING), + item_names.OVERLORD_IMPROVED_OVERLORDS: ItemData(407 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 1, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.AUTOMATED_EXTRACTORS: ItemData(408 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 2, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_WILD_MUTATION: ItemData(409 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 6, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_SPAWN_BANELINGS: ItemData(410 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 7, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_MEND: ItemData(411 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 8, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.TWIN_DRONES: ItemData(412 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 3, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.MALIGNANT_CREEP: ItemData(413 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 4, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.VESPENE_EFFICIENCY: ItemData(414 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 5, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_INFEST_BROODLINGS: ItemData(415 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 9, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_FURY: ItemData(416 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 10, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_ABILITY_EFFICIENCY: ItemData(417 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 11, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_APOCALYPSE: ItemData(418 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 12, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_SPAWN_LEVIATHAN: ItemData(419 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 13, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.KERRIGAN_DROP_PODS: ItemData(420 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 14, SC2Race.ZERG, classification=ItemClassification.progression), + # Handled separately from other abilities + item_names.KERRIGAN_PRIMAL_FORM: ItemData(421 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Primal_Form, 0, SC2Race.ZERG), + item_names.KERRIGAN_ASSIMILATION_AURA: ItemData(422 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 15, SC2Race.ZERG), + item_names.KERRIGAN_IMMOBILIZATION_WAVE: ItemData(423 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Ability, 16, SC2Race.ZERG, classification=ItemClassification.progression), + + item_names.KERRIGAN_LEVELS_10: ItemData(500 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 10, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_9: ItemData(501 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 9, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_8: ItemData(502 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 8, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_7: ItemData(503 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 7, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_6: ItemData(504 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 6, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_5: ItemData(505 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 5, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_4: ItemData(506 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 4, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_3: ItemData(507 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 3, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_2: ItemData(508 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 2, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_1: ItemData(509 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 1, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression_skip_balancing), + item_names.KERRIGAN_LEVELS_14: ItemData(510 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 14, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_35: ItemData(511 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 35, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + item_names.KERRIGAN_LEVELS_70: ItemData(512 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Level, 70, SC2Race.ZERG, quantity=0, classification=ItemClassification.progression), + + # Zerg Mercs + item_names.INFESTED_MEDICS: ItemData(600 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 0, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.INFESTED_SIEGE_BREAKERS: ItemData(601 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 1, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.INFESTED_DUSK_WINGS: ItemData(602 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 2, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.DEVOURING_ONES: ItemData(603 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 3, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.HUNTER_KILLERS: ItemData(604 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 4, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.TORRASQUE_MERC: ItemData(605 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 5, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.HUNTERLING: ItemData(606 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 6, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.YGGDRASIL: ItemData(607 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 7, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.CAUSTIC_HORRORS: ItemData(608 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Mercenary, 8, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + + + # Misc Upgrades + item_names.OVERLORD_VENTRAL_SACS: ItemData(700 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 6, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.OVERLORD_GENERATE_CREEP: ItemData(701 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 7, SC2Race.ZERG, classification=ItemClassification.progression_skip_balancing), + item_names.OVERLORD_ANTENNAE: ItemData(702 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 8, SC2Race.ZERG), + item_names.OVERLORD_PNEUMATIZED_CARAPACE: ItemData(703 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 9, SC2Race.ZERG), + item_names.ZERG_EXCAVATING_CLAWS: ItemData(704 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 11, SC2Race.ZERG, parent=parent_names.ZERG_UPROOTABLE_BUILDINGS), + item_names.ZERG_CREEP_STOMACH: ItemData(705 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 10, SC2Race.ZERG), + item_names.HIVE_CLUSTER_MATURATION: ItemData(706 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 12, SC2Race.ZERG), + item_names.MACROSCOPIC_RECUPERATION: ItemData(707 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 13, SC2Race.ZERG), + item_names.BIOMECHANICAL_STOCKPILING: ItemData(708 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 14, SC2Race.ZERG, parent=parent_names.INFESTED_FACTORY_OR_STARPORT), + item_names.BROODLING_SPORE_SATURATION: ItemData(709 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 15, SC2Race.ZERG), + item_names.CELL_DIVISION: ItemData(710 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 16, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.ZERG_MERCENARIES), + item_names.SELF_SUFFICIENT: ItemData(711 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 17, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.ZERG_MERCENARIES), + item_names.UNRESTRICTED_MUTATION: ItemData(712 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 18, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.ZERG_MERCENARIES), + item_names.EVOLUTIONARY_LEAP: ItemData(713 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Evolution_Pit, 19, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.ZERG_MERCENARIES), + + # Morphs + item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT: ItemData(800 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 6, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_AIR), + item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT: ItemData(801 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 7, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_AIR), + item_names.ROACH_RAVAGER_ASPECT: ItemData(802 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 8, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_ROACH), + item_names.OVERLORD_OVERSEER_ASPECT: ItemData(803 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 4, SC2Race.ZERG, classification=ItemClassification.progression), + item_names.ROACH_PRIMAL_IGNITER_ASPECT: ItemData(804 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 9, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_ROACH), + item_names.ULTRALISK_TYRANNOZOR_ASPECT: ItemData(805 + SC2HOTS_ITEM_ID_OFFSET, ZergItemType.Morph, 10, SC2Race.ZERG, classification=ItemClassification.progression, parent=parent_names.MORPH_SOURCE_ULTRALISK), + + # Protoss Units + # The first several are in SC2WOL offset for historical reasons (show up in prophecy) + item_names.ZEALOT: + ItemData(700 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 0, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.STALKER: + ItemData(701 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 1, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.HIGH_TEMPLAR: + ItemData(702 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 2, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DARK_TEMPLAR: + ItemData(703 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 3, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.IMMORTAL: + ItemData(704 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 4, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.COLOSSUS: + ItemData(705 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 5, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.PHOENIX: + ItemData(706 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 6, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.VOID_RAY: + ItemData(707 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 7, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.CARRIER: + ItemData(708 + SC2WOL_ITEM_ID_OFFSET, ProtossItemType.Unit, 8, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.OBSERVER: + ItemData(0 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 9, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.CENTURION: + ItemData(1 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 10, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SENTINEL: + ItemData(2 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 11, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SUPPLICANT: + ItemData(3 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 12, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.INSTIGATOR: + ItemData(4 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 13, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SLAYER: + ItemData(5 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 14, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SENTRY: + ItemData(6 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 15, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ENERGIZER: + ItemData(7 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 16, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.HAVOC: + ItemData(8 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 17, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SIGNIFIER: + ItemData(9 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 18, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ASCENDANT: + ItemData(10 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 19, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.AVENGER: + ItemData(11 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 20, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.BLOOD_HUNTER: + ItemData(12 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 21, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DRAGOON: + ItemData(13 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 22, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DARK_ARCHON: + ItemData(14 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 23, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ADEPT: + ItemData(15 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 24, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.WARP_PRISM: + ItemData(16 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 25, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ANNIHILATOR: + ItemData(17 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 26, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.VANGUARD: + ItemData(18 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 27, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.WRATHWALKER: + ItemData(19 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 28, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.REAVER: + ItemData(20 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit, 29, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DISRUPTOR: + ItemData(21 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 0, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.MIRAGE: + ItemData(22 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 1, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.CORSAIR: + ItemData(23 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 2, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DESTROYER: + ItemData(24 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 3, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SCOUT: + ItemData(25 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 4, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.TEMPEST: + ItemData(26 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 5, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.MOTHERSHIP: + ItemData(27 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 6, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ARBITER: + ItemData(28 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 7, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.ORACLE: + ItemData(29 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 8, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.STALWART: + ItemData(30 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 9, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.PULSAR: + ItemData(31 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 10, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.DAWNBRINGER: + ItemData(32 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 11, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SKYLORD: + ItemData(33 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 12, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.TRIREME: + ItemData(34 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 13, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.SKIRMISHER: + ItemData(35 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 14, SC2Race.PROTOSS, + classification=ItemClassification.progression), + # 36, 37 reserved for Mothership + item_names.OPPRESSOR: + ItemData(38 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 17, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.CALADRIUS: + ItemData(39 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 18, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.MISTWING: + ItemData(40 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Unit_2, 19, SC2Race.PROTOSS, + classification=ItemClassification.progression), + + # Protoss Upgrades + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON: ItemData(100 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 0, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR: ItemData(101 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 4, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_SHIELDS: ItemData(102 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 8, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON: ItemData(103 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 12, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR: ItemData(104 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, 16, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + # Bundles + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: ItemData(105 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: ItemData(106 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: ItemData(107 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: ItemData(108 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: ItemData(109 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Upgrade, -1, SC2Race.PROTOSS, classification=ItemClassification.progression, quantity=WEAPON_ARMOR_UPGRADE_MAX_LEVEL), + + # Protoss Buildings + item_names.PHOTON_CANNON: ItemData(200 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 0, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.KHAYDARIN_MONOLITH: ItemData(201 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SHIELD_BATTERY: ItemData(202 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Building, 2, SC2Race.PROTOSS, classification=ItemClassification.progression), + + # Protoss Unit Upgrades + item_names.SUPPLICANT_BLOOD_SHIELD: ItemData(300 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 0, SC2Race.PROTOSS, parent=item_names.SUPPLICANT), + item_names.SUPPLICANT_SOUL_AUGMENTATION: ItemData(301 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 1, SC2Race.PROTOSS, parent=item_names.SUPPLICANT), + item_names.SUPPLICANT_ENDLESS_SERVITUDE: ItemData(302 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 2, SC2Race.PROTOSS, parent=item_names.SUPPLICANT), + item_names.ADEPT_SHOCKWAVE: ItemData(303 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 3, SC2Race.PROTOSS, parent=item_names.ADEPT), + item_names.ADEPT_RESONATING_GLAIVES: ItemData(304 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 4, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.ADEPT), + item_names.ADEPT_PHASE_BULWARK: ItemData(305 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 5, SC2Race.PROTOSS, parent=item_names.ADEPT), + item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES: ItemData(306 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 6, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.STALKER_CLASS), + item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION: ItemData(307 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 7, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.STALKER_CLASS), + item_names.DRAGOON_CONCENTRATED_ANTIMATTER: ItemData(308 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 8, SC2Race.PROTOSS, parent=item_names.DRAGOON), + item_names.DRAGOON_TRILLIC_COMPRESSION_SYSTEM: ItemData(309 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 9, SC2Race.PROTOSS, parent=item_names.DRAGOON), + item_names.DRAGOON_SINGULARITY_CHARGE: ItemData(310 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 10, SC2Race.PROTOSS, parent=item_names.DRAGOON), + item_names.DRAGOON_ENHANCED_STRIDER_SERVOS: ItemData(311 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 11, SC2Race.PROTOSS, parent=item_names.DRAGOON), + item_names.SCOUT_COMBAT_SENSOR_ARRAY: ItemData(312 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 12, SC2Race.PROTOSS, parent=parent_names.SCOUT_CLASS), + item_names.SCOUT_APIAL_SENSORS: ItemData(313 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 13, SC2Race.PROTOSS, parent=item_names.SCOUT), + item_names.SCOUT_GRAVITIC_THRUSTERS: ItemData(314 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 14, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.SCOUT_CLASS), + item_names.SCOUT_ADVANCED_PHOTON_BLASTERS: ItemData(315 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 15, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.SCOUT_OR_OPPRESSOR_OR_MISTWING), + item_names.TEMPEST_TECTONIC_DESTABILIZERS: ItemData(316 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 16, SC2Race.PROTOSS, parent=item_names.TEMPEST), + item_names.TEMPEST_QUANTIC_REACTOR: ItemData(317 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 17, SC2Race.PROTOSS, parent=item_names.TEMPEST), + item_names.TEMPEST_GRAVITY_SLING: ItemData(318 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 18, SC2Race.PROTOSS, parent=item_names.TEMPEST), + item_names.PHOENIX_CLASS_IONIC_WAVELENGTH_FLUX: ItemData(319 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 19, SC2Race.PROTOSS, parent=parent_names.PHOENIX_CLASS), + item_names.PHOENIX_CLASS_ANION_PULSE_CRYSTALS: ItemData(320 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 20, SC2Race.PROTOSS, parent=parent_names.PHOENIX_CLASS), + item_names.CORSAIR_STEALTH_DRIVE: ItemData(321 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 21, SC2Race.PROTOSS, parent=item_names.CORSAIR), + item_names.CORSAIR_ARGUS_JEWEL: ItemData(322 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 22, SC2Race.PROTOSS, parent=item_names.CORSAIR), + item_names.CORSAIR_SUSTAINING_DISRUPTION: ItemData(323 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 23, SC2Race.PROTOSS, parent=item_names.CORSAIR), + item_names.CORSAIR_NEUTRON_SHIELDS: ItemData(324 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 24, SC2Race.PROTOSS, parent=item_names.CORSAIR), + item_names.ORACLE_STEALTH_DRIVE: ItemData(325 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 25, SC2Race.PROTOSS, parent=item_names.ORACLE), + item_names.ORACLE_SKYWARD_CHRONOANOMALY: ItemData(544 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 26, SC2Race.PROTOSS, parent=item_names.ORACLE), + item_names.ORACLE_TEMPORAL_ACCELERATION_BEAM: ItemData(327 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 27, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.ORACLE), + item_names.ARBITER_CHRONOSTATIC_REINFORCEMENT: ItemData(328 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 28, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.ARBITER_KHAYDARIN_CORE: ItemData(329 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_1, 29, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.ARBITER_SPACETIME_ANCHOR: ItemData(330 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 0, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.ARBITER_RESOURCE_EFFICIENCY: ItemData(331 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 1, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.ARBITER_JUDICATORS_VEIL: ItemData(332 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 2, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.CARRIER_TRIREME_GRAVITON_CATAPULT: + ItemData(333 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 3, SC2Race.PROTOSS, parent=parent_names.CARRIER_OR_TRIREME), + item_names.CARRIER_SKYLORD_TRIREME_HULL_OF_PAST_GLORIES: + ItemData(334 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 4, SC2Race.PROTOSS, parent=parent_names.CARRIER_CLASS), + item_names.VOID_RAY_DESTROYER_PULSAR_DAWNBRINGER_FLUX_VANES: + ItemData(335 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 5, SC2Race.PROTOSS, parent=parent_names.VOID_RAY_CLASS), + item_names.DESTROYER_RESOURCE_EFFICIENCY: ItemData(535 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 6, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DESTROYER), + item_names.WARP_PRISM_GRAVITIC_DRIVE: + ItemData(337 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 7, SC2Race.PROTOSS, parent=item_names.WARP_PRISM), + item_names.WARP_PRISM_PHASE_BLASTER: + ItemData(338 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 8, SC2Race.PROTOSS, + classification=ItemClassification.progression, parent=item_names.WARP_PRISM), + item_names.WARP_PRISM_WAR_CONFIGURATION: ItemData(339 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 9, SC2Race.PROTOSS, parent=item_names.WARP_PRISM), + item_names.OBSERVER_GRAVITIC_BOOSTERS: ItemData(340 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 10, SC2Race.PROTOSS, parent=item_names.OBSERVER), + item_names.OBSERVER_SENSOR_ARRAY: ItemData(341 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 11, SC2Race.PROTOSS, parent=item_names.OBSERVER), + item_names.REAVER_SCARAB_DAMAGE: ItemData(342 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 12, SC2Race.PROTOSS, parent=item_names.REAVER), + item_names.REAVER_SOLARITE_PAYLOAD: ItemData(343 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 13, SC2Race.PROTOSS, parent=item_names.REAVER), + item_names.REAVER_REAVER_CAPACITY: ItemData(344 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 14, SC2Race.PROTOSS, parent=item_names.REAVER), + item_names.REAVER_RESOURCE_EFFICIENCY: ItemData(345 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 15, SC2Race.PROTOSS, parent=item_names.REAVER), + item_names.VANGUARD_AGONY_LAUNCHERS: ItemData(346 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 16, SC2Race.PROTOSS, parent=item_names.VANGUARD), + item_names.VANGUARD_MATTER_DISPERSION: ItemData(347 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 17, SC2Race.PROTOSS, parent=item_names.VANGUARD), + item_names.IMMORTAL_ANNIHILATOR_SINGULARITY_CHARGE: ItemData(348 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 18, SC2Race.PROTOSS, parent=parent_names.IMMORTAL_OR_ANNIHILATOR), + item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING: ItemData(349 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 19, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.IMMORTAL_OR_ANNIHILATOR), + item_names.COLOSSUS_PACIFICATION_PROTOCOL: ItemData(350 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 20, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.COLOSSUS), + item_names.WRATHWALKER_RAPID_POWER_CYCLING: ItemData(351 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 21, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.WRATHWALKER), + item_names.WRATHWALKER_EYE_OF_WRATH: ItemData(352 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 22, SC2Race.PROTOSS, parent=item_names.WRATHWALKER), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHROUD_OF_ADUN: ItemData(353 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 23, SC2Race.PROTOSS, parent=parent_names.DARK_TEMPLAR_CLASS), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_SHADOW_GUARD_TRAINING: ItemData(354 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 24, SC2Race.PROTOSS, parent=parent_names.DARK_TEMPLAR_CLASS), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK: ItemData(355 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 25, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.DARK_TEMPLAR_CLASS), + item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_RESOURCE_EFFICIENCY: ItemData(356 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 26, SC2Race.PROTOSS, parent=parent_names.DARK_TEMPLAR_CLASS), + item_names.DARK_TEMPLAR_DARK_ARCHON_MELD: ItemData(357 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 27, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DARK_TEMPLAR), + item_names.HIGH_TEMPLAR_SIGNIFIER_UNSHACKLED_PSIONIC_STORM: ItemData(358 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 28, SC2Race.PROTOSS, parent=parent_names.STORM_CASTER), + item_names.HIGH_TEMPLAR_SIGNIFIER_HALLUCINATION: ItemData(359 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_2, 29, SC2Race.PROTOSS, parent=parent_names.STORM_CASTER), + item_names.HIGH_TEMPLAR_SIGNIFIER_KHAYDARIN_AMULET: ItemData(360 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 0, SC2Race.PROTOSS, parent=parent_names.STORM_CASTER), + item_names.ARCHON_HIGH_ARCHON: ItemData(361 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 1, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.ARCHON_SOURCE), + item_names.DARK_ARCHON_FEEDBACK: ItemData(362 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 2, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.DARK_ARCHON_SOURCE), + item_names.DARK_ARCHON_MAELSTROM: ItemData(363 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 3, SC2Race.PROTOSS, parent=parent_names.DARK_ARCHON_SOURCE), + item_names.DARK_ARCHON_ARGUS_TALISMAN: ItemData(364 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 4, SC2Race.PROTOSS, parent=parent_names.DARK_ARCHON_SOURCE), + item_names.ASCENDANT_POWER_OVERWHELMING: ItemData(365 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 5, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=parent_names.SUPPLICANT_AND_ASCENDANT), + item_names.ASCENDANT_CHAOTIC_ATTUNEMENT: ItemData(366 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 6, SC2Race.PROTOSS, parent=item_names.ASCENDANT), + item_names.ASCENDANT_BLOOD_AMULET: ItemData(367 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 7, SC2Race.PROTOSS, parent=item_names.ASCENDANT), + item_names.SENTRY_ENERGIZER_HAVOC_CLOAKING_MODULE: ItemData(368 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 8, SC2Race.PROTOSS, parent=parent_names.SENTRY_CLASS), + item_names.SENTRY_ENERGIZER_HAVOC_SHIELD_BATTERY_RAPID_RECHARGING: ItemData(369 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 9, SC2Race.PROTOSS, parent=parent_names.SENTRY_CLASS_OR_SHIELD_BATTERY), + item_names.SENTRY_FORCE_FIELD: ItemData(370 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 10, SC2Race.PROTOSS, parent=item_names.SENTRY), + item_names.SENTRY_HALLUCINATION: ItemData(371 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 11, SC2Race.PROTOSS, parent=item_names.SENTRY), + item_names.ENERGIZER_RECLAMATION: ItemData(372 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 12, SC2Race.PROTOSS, parent=item_names.ENERGIZER), + item_names.ENERGIZER_FORGED_CHASSIS: ItemData(373 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 13, SC2Race.PROTOSS, parent=item_names.ENERGIZER), + item_names.HAVOC_DETECT_WEAKNESS: ItemData(374 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 14, SC2Race.PROTOSS, parent=item_names.HAVOC), + item_names.HAVOC_BLOODSHARD_RESONANCE: ItemData(375 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 15, SC2Race.PROTOSS, parent=item_names.HAVOC), + item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS: ItemData(376 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 16, SC2Race.PROTOSS, parent=parent_names.ZEALOT_OR_SENTINEL_OR_CENTURION), + item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY: ItemData(377 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 17, SC2Race.PROTOSS, classification=ItemClassification.progression_skip_balancing, parent=parent_names.ZEALOT_OR_SENTINEL_OR_CENTURION), + item_names.ORACLE_BOSONIC_CORE: ItemData(378 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 18, SC2Race.PROTOSS, parent=item_names.ORACLE), + item_names.SCOUT_RESOURCE_EFFICIENCY: ItemData(379 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 19, SC2Race.PROTOSS, parent=item_names.SCOUT), + item_names.IMMORTAL_ANNIHILATOR_DISRUPTOR_DISPERSION: ItemData(380 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 20, SC2Race.PROTOSS, parent=parent_names.IMMORTAL_OR_ANNIHILATOR), + item_names.DISRUPTOR_CLOAKING_MODULE: ItemData(381 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 21, SC2Race.PROTOSS, parent=item_names.DISRUPTOR), + item_names.DISRUPTOR_PERFECTED_POWER: ItemData(382 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 22, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DISRUPTOR), + item_names.DISRUPTOR_RESTRAINED_DESTRUCTION: ItemData(383 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 23, SC2Race.PROTOSS, parent=item_names.DISRUPTOR), + item_names.TEMPEST_INTERPLANETARY_RANGE: ItemData(384 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 24, SC2Race.PROTOSS, parent=item_names.TEMPEST), + item_names.DAWNBRINGER_ANTI_SURFACE_COUNTERMEASURES: ItemData(385 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 25, SC2Race.PROTOSS, parent=item_names.DAWNBRINGER), + item_names.DAWNBRINGER_ENHANCED_SHIELD_GENERATOR: ItemData(386 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 26, SC2Race.PROTOSS, parent=item_names.DAWNBRINGER), + item_names.STALWART_HIGH_VOLTAGE_CAPACITORS: ItemData(387 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 27, SC2Race.PROTOSS, parent=item_names.STALWART), + item_names.STALWART_REINTEGRATED_FRAMEWORK: ItemData(388 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 28, SC2Race.PROTOSS, parent=item_names.STALWART), + item_names.STALWART_STABILIZED_ELECTRODES: ItemData(389 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_3, 29, SC2Race.PROTOSS, parent=item_names.STALWART), + item_names.STALWART_LATTICED_SHIELDING: ItemData(390 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 0, SC2Race.PROTOSS, parent=item_names.STALWART), + item_names.ARCHON_TRANSCENDENCE: ItemData(391 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 1, SC2Race.PROTOSS, parent=parent_names.ARCHON_SOURCE), + item_names.ARCHON_POWER_SIPHON: ItemData(392 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 2, SC2Race.PROTOSS, parent=parent_names.ARCHON_SOURCE), + item_names.ARCHON_ERADICATE: ItemData(393 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 3, SC2Race.PROTOSS, parent=parent_names.ARCHON_SOURCE), + item_names.ARCHON_OBLITERATE: ItemData(394 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 4, SC2Race.PROTOSS, parent=parent_names.ARCHON_SOURCE), + item_names.SUPPLICANT_ZENITH_PITCH: ItemData(395 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 5, SC2Race.PROTOSS, classification=ItemClassification.progression_skip_balancing, parent=item_names.SUPPLICANT), + item_names.PULSAR_CHRONOCLYSM: ItemData(396 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 6, SC2Race.PROTOSS, parent=item_names.PULSAR), + item_names.PULSAR_ENTROPIC_REVERSAL: ItemData(397 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 7, SC2Race.PROTOSS, parent=item_names.PULSAR), + # 398-407 reserved for Mothership + item_names.OPPRESSOR_ACCELERATED_WARP: ItemData(408 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 18, SC2Race.PROTOSS, parent=item_names.OPPRESSOR), + item_names.OPPRESSOR_ARMOR_MELTING_BLASTERS: ItemData(409 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 19, SC2Race.PROTOSS, parent=item_names.OPPRESSOR), + item_names.CALADRIUS_SIDE_MISSILES: ItemData(410 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 20, SC2Race.PROTOSS, parent=item_names.CALADRIUS), + item_names.CALADRIUS_STRUCTURE_TARGETING: ItemData(411 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 21, SC2Race.PROTOSS, parent=item_names.CALADRIUS), + item_names.CALADRIUS_SOLARITE_REACTOR: ItemData(412 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 22, SC2Race.PROTOSS, parent=item_names.CALADRIUS), + item_names.MISTWING_NULL_SHROUD: ItemData(413 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 23, SC2Race.PROTOSS, parent=item_names.MISTWING), + item_names.MISTWING_PILOT: ItemData(414 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 24, SC2Race.PROTOSS, classification=ItemClassification.progression_skip_balancing, parent=item_names.MISTWING), + item_names.INSTIGATOR_BLINK_OVERDRIVE: ItemData(415 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 25, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.INSTIGATOR), + item_names.INSTIGATOR_RECONSTRUCTION: ItemData(416 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 26, SC2Race.PROTOSS, parent=item_names.INSTIGATOR), + item_names.DARK_TEMPLAR_ARCHON_MERGE: ItemData(417 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 27, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DARK_TEMPLAR), + item_names.ASCENDANT_ARCHON_MERGE: ItemData(418 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 28, SC2Race.PROTOSS, classification=ItemClassification.progression_skip_balancing, parent=item_names.ASCENDANT), + item_names.SCOUT_SUPPLY_EFFICIENCY: ItemData(419 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_4, 29, SC2Race.PROTOSS, parent=item_names.SCOUT), + item_names.REAVER_BARGAIN_BIN_PRICES: ItemData(420 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Forge_5, 0, SC2Race.PROTOSS, parent=item_names.REAVER), + + + # War Council + item_names.ZEALOT_WHIRLWIND: ItemData(500 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 0, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.ZEALOT), + item_names.CENTURION_RESOURCE_EFFICIENCY: ItemData(501 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 1, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.CENTURION), + item_names.SENTINEL_RESOURCE_EFFICIENCY: ItemData(502 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 2, SC2Race.PROTOSS, parent=item_names.SENTINEL), + item_names.STALKER_PHASE_REACTOR: ItemData(503 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 3, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.STALKER), + item_names.DRAGOON_PHALANX_SUIT: ItemData(504 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 4, SC2Race.PROTOSS, parent=item_names.DRAGOON), + item_names.INSTIGATOR_MODERNIZED_SERVOS: ItemData(505 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 5, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.INSTIGATOR), + item_names.ADEPT_DISRUPTIVE_TRANSFER: ItemData(506 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 6, SC2Race.PROTOSS, parent=item_names.ADEPT), + item_names.SLAYER_PHASE_BLINK: ItemData(507 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 7, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.SLAYER), + item_names.AVENGER_KRYHAS_CLOAK: ItemData(508 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 8, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.AVENGER), + item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY: ItemData(509 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 9, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DARK_TEMPLAR), + item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY: ItemData(510 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 10, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DARK_TEMPLAR), + item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY: ItemData(511 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 11, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.BLOOD_HUNTER), + item_names.SENTRY_DOUBLE_SHIELD_RECHARGE: ItemData(512 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 12, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.SENTRY), + item_names.ENERGIZER_MOBILE_CHRONO_BEAM: ItemData(513 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 13, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.ENERGIZER), + item_names.HAVOC_ENDURING_SIGHT: ItemData(514 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 14, SC2Race.PROTOSS, parent=item_names.HAVOC), + item_names.HIGH_TEMPLAR_PLASMA_SURGE: ItemData(515 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 15, SC2Race.PROTOSS, parent=item_names.HIGH_TEMPLAR), + item_names.SIGNIFIER_FEEDBACK: ItemData(516 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 16, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.SIGNIFIER), + item_names.ASCENDANT_BREATH_OF_CREATION: ItemData(517 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 17, SC2Race.PROTOSS, parent=item_names.ASCENDANT), + item_names.DARK_ARCHON_INDOMITABLE_WILL: ItemData(518 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 18, SC2Race.PROTOSS, parent=parent_names.DARK_ARCHON_SOURCE), + item_names.IMMORTAL_IMPROVED_BARRIER: ItemData(519 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 19, SC2Race.PROTOSS, parent=item_names.IMMORTAL), + item_names.VANGUARD_RAPIDFIRE_CANNON: ItemData(520 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 20, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.VANGUARD), + item_names.VANGUARD_FUSION_MORTARS: ItemData(521 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 21, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.VANGUARD), + item_names.ANNIHILATOR_TWILIGHT_CHASSIS: ItemData(522 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 22, SC2Race.PROTOSS, parent=item_names.ANNIHILATOR), + item_names.STALWART_ARC_INDUCERS: ItemData(523 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 23, SC2Race.PROTOSS, parent=item_names.STALWART), + item_names.COLOSSUS_FIRE_LANCE: ItemData(524 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 24, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.COLOSSUS), + item_names.WRATHWALKER_AERIAL_TRACKING: ItemData(525 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 25, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.WRATHWALKER), + item_names.REAVER_KHALAI_REPLICATORS: ItemData(526 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 26, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.REAVER), + item_names.DISRUPTOR_MOBILITY_PROTOCOLS: ItemData(527 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 27, SC2Race.PROTOSS, parent=item_names.DISRUPTOR), + item_names.WARP_PRISM_WARP_REFRACTION: ItemData(528 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 28, SC2Race.PROTOSS, parent=item_names.WARP_PRISM), + item_names.OBSERVER_INDUCE_SCOPOPHOBIA: ItemData(529 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council, 29, SC2Race.PROTOSS, parent=item_names.OBSERVER), + item_names.PHOENIX_DOUBLE_GRAVITON_BEAM: ItemData(530 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 0, SC2Race.PROTOSS, parent=item_names.PHOENIX), + item_names.CORSAIR_NETWORK_DISRUPTION: ItemData(531 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 1, SC2Race.PROTOSS, parent=item_names.CORSAIR), + item_names.MIRAGE_GRAVITON_BEAM: ItemData(532 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 2, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.MIRAGE), + item_names.SKIRMISHER_PEER_CONTEMPT: ItemData(533 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 3, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.SKIRMISHER), + item_names.VOID_RAY_PRISMATIC_RANGE: ItemData(534 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 4, SC2Race.PROTOSS, parent=item_names.VOID_RAY), + item_names.DESTROYER_REFORGED_BLOODSHARD_CORE: ItemData(336 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 5, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DESTROYER), + item_names.PULSAR_CHRONO_SHEAR: ItemData(536 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 6, SC2Race.PROTOSS, parent=item_names.PULSAR), + item_names.DAWNBRINGER_SOLARITE_LENS: ItemData(537 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 7, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.DAWNBRINGER), + item_names.CARRIER_REPAIR_DRONES: ItemData(538 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 8, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.CARRIER), + item_names.SKYLORD_JUMP: ItemData(539 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 9, SC2Race.PROTOSS, parent=item_names.SKYLORD), + item_names.TRIREME_SOLAR_BEAM: ItemData(540 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 10, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.TRIREME), + item_names.TEMPEST_DISINTEGRATION: ItemData(541 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 11, SC2Race.PROTOSS, parent=item_names.TEMPEST), + item_names.SCOUT_EXPEDITIONARY_HULL: ItemData(542 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 12, SC2Race.PROTOSS, parent=item_names.SCOUT), + item_names.ARBITER_VESSEL_OF_THE_CONCLAVE: ItemData(543 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 13, SC2Race.PROTOSS, parent=item_names.ARBITER), + item_names.ORACLE_STASIS_CALIBRATION: ItemData(326 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 14, SC2Race.PROTOSS, parent=item_names.ORACLE), + item_names.MOTHERSHIP_INTEGRATED_POWER: ItemData(545 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 15, SC2Race.PROTOSS, parent=item_names.MOTHERSHIP), + # 546-549 reserved for Mothership + item_names.OPPRESSOR_VULCAN_BLASTER: ItemData(550 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 20, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.OPPRESSOR), + item_names.CALADRIUS_CORONA_BEAM: ItemData(551 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 21, SC2Race.PROTOSS, classification=ItemClassification.progression, parent=item_names.CALADRIUS), + item_names.MISTWING_PHANTOM_DASH: ItemData(552 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 22, SC2Race.PROTOSS, parent=item_names.MISTWING), + item_names.SUPPLICANT_SACRIFICE: ItemData(553 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.War_Council_2, 23, SC2Race.PROTOSS, parent=item_names.SUPPLICANT), + + # SoA Calldown powers + item_names.SOA_CHRONO_SURGE: ItemData(700 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 0, SC2Race.PROTOSS), + item_names.SOA_PROGRESSIVE_PROXY_PYLON: ItemData(701 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Progressive, 0, SC2Race.PROTOSS, quantity=2, classification=ItemClassification.progression), + item_names.SOA_PYLON_OVERCHARGE: ItemData(702 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_ORBITAL_STRIKE: ItemData(703 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 2, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_TEMPORAL_FIELD: ItemData(704 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 3, SC2Race.PROTOSS), + item_names.SOA_SOLAR_LANCE: ItemData(705 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 4, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_MASS_RECALL: ItemData(706 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 5, SC2Race.PROTOSS), + item_names.SOA_SHIELD_OVERCHARGE: ItemData(707 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 6, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_DEPLOY_FENIX: ItemData(708 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 7, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_PURIFIER_BEAM: ItemData(709 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 8, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_TIME_STOP: ItemData(710 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 9, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SOA_SOLAR_BOMBARDMENT: ItemData(711 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Spear_Of_Adun, 10, SC2Race.PROTOSS, classification=ItemClassification.progression), + + # Generic Protoss Upgrades + item_names.MATRIX_OVERLOAD: + ItemData(800 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 0, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.QUATRO: + ItemData(801 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 1, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.NEXUS_OVERCHARGE: + ItemData(802 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 2, SC2Race.PROTOSS, + classification=ItemClassification.progression, important_for_filtering=True), + item_names.ORBITAL_ASSIMILATORS: + ItemData(803 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 3, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.WARP_HARMONIZATION: + ItemData(804 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 4, SC2Race.PROTOSS, classification=ItemClassification.progression_skip_balancing), + item_names.GUARDIAN_SHELL: + ItemData(805 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 5, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.RECONSTRUCTION_BEAM: + ItemData(806 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 6, SC2Race.PROTOSS, + classification=ItemClassification.progression), + item_names.OVERWATCH: + ItemData(807 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 7, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.SUPERIOR_WARP_GATES: + ItemData(808 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 8, SC2Race.PROTOSS), + item_names.ENHANCED_TARGETING: + ItemData(809 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 9, SC2Race.PROTOSS, parent=parent_names.PROTOSS_STATIC_DEFENSE), + item_names.OPTIMIZED_ORDNANCE: + ItemData(810 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 10, SC2Race.PROTOSS, parent=parent_names.PROTOSS_ATTACKING_BUILDING), + item_names.KHALAI_INGENUITY: + ItemData(811 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 11, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.AMPLIFIED_ASSIMILATORS: + ItemData(812 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 12, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.PROGRESSIVE_WARP_RELOCATE: + ItemData(813 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Progressive, 2, SC2Race.PROTOSS, quantity=2, + classification=ItemClassification.progression), + item_names.PROBE_WARPIN: + ItemData(814 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 13, SC2Race.PROTOSS, classification=ItemClassification.progression), + item_names.ELDER_PROBES: + ItemData(815 + SC2LOTV_ITEM_ID_OFFSET, ProtossItemType.Solarite_Core, 14, SC2Race.PROTOSS, classification=ItemClassification.progression), +} + +# Add keys to item table +# Mission keys (key offset + 0-999) +# Mission IDs start at 1 so the item IDs are moved down a space +mission_key_item_table = { + item_names._TEMPLATE_MISSION_KEY.format(mission.mission_name): + ItemData(mission.id - 1 + SC2_KEY_ITEM_ID_OFFSET, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for mission in SC2Mission +} +# Numbered layout keys (key offset + 1000 - 1999) +numbered_layout_key_item_table = { + item_names._TEMPLATE_NUMBERED_LAYOUT_KEY.format(number + 1): + ItemData(number + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for number in range(len(SC2Mission)) +} +# Numbered campaign keys (key offset + 2000 - 2999) +numbered_campaign_key_item_table = { + item_names._TEMPLATE_NUMBERED_CAMPAIGN_KEY.format(number + 1): + ItemData(number + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 2, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for number in range(len(SC2Mission)) +} +# Flavor keys (key offset + 3000 - 3999) +flavor_key_item_table = { + item_names._TEMPLATE_FLAVOR_KEY.format(name): + ItemData(i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 3, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for (i, name) in enumerate(item_names._flavor_key_names) +} +# Named layout keys (key offset + 4000 - 4999) +campaign_to_layout_names = get_used_layout_names() +named_layout_key_item_table = { + item_names._TEMPLATE_NAMED_LAYOUT_KEY.format(layout_name, campaign.campaign_name): + ItemData(layout_start + i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 4, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for (campaign, (layout_start, layout_names)) in campaign_to_layout_names.items() for (i, layout_name) in enumerate(layout_names) +} +# Named campaign keys (key offset + 5000 - 5999) +campaign_names = [campaign.campaign_name for campaign in SC2Campaign if campaign != SC2Campaign.GLOBAL] +named_campaign_key_item_table = { + item_names._TEMPLATE_NAMED_CAMPAIGN_KEY.format(campaign_name): + ItemData(i + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 5, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for (i, campaign_name) in enumerate(campaign_names) +} +# Numbered progressive keys (key offset + 6000 - 6999) +numbered_progressive_keys = { + item_names._TEMPLATE_PROGRESSIVE_KEY.format(number + 1): + ItemData(number + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 6, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0) + for number in range(len(SC2Mission)) +} +# Special keys (key offset + 7000 - 7999) +special_keys = { + item_names.PROGRESSIVE_MISSION_KEY: + ItemData(0 + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 7, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0), + item_names.PROGRESSIVE_QUESTLINE_KEY: + ItemData(1 + SC2_KEY_ITEM_ID_OFFSET + SC2_KEY_ITEM_SECTION_SIZE * 7, FactionlessItemType.Keys, 0, SC2Race.ANY, + classification=ItemClassification.progression, quantity=0), +} +key_item_table = {} +key_item_table.update(mission_key_item_table) +key_item_table.update(numbered_layout_key_item_table) +key_item_table.update(numbered_campaign_key_item_table) +key_item_table.update(flavor_key_item_table) +key_item_table.update(named_layout_key_item_table) +key_item_table.update(named_campaign_key_item_table) +key_item_table.update(numbered_progressive_keys) +key_item_table.update(special_keys) +item_table.update(key_item_table) + +def get_item_table(): + return item_table + + +basic_units = { + SC2Race.TERRAN: { + item_names.MARINE, + item_names.MARAUDER, + item_names.DOMINION_TROOPER, + item_names.GOLIATH, + item_names.HELLION, + item_names.VULTURE, + item_names.WARHOUND, + }, + SC2Race.ZERG: { + item_names.SWARM_QUEEN, + item_names.ROACH, + item_names.HYDRALISK, + }, + SC2Race.PROTOSS: { + item_names.ZEALOT, + item_names.CENTURION, + item_names.SENTINEL, + item_names.STALKER, + item_names.INSTIGATOR, + item_names.SLAYER, + item_names.ADEPT, + } +} + +advanced_basic_units = { + SC2Race.TERRAN: basic_units[SC2Race.TERRAN].union({ + item_names.REAPER, + item_names.DIAMONDBACK, + item_names.VIKING, + item_names.SIEGE_TANK, + item_names.BANSHEE, + item_names.THOR, + item_names.BATTLECRUISER, + item_names.CYCLONE + }), + SC2Race.ZERG: basic_units[SC2Race.ZERG].union({ + item_names.INFESTED_BANSHEE, + item_names.INFESTED_DIAMONDBACK, + item_names.INFESTOR, + item_names.ABERRATION, + }), + SC2Race.PROTOSS: basic_units[SC2Race.PROTOSS].union({ + item_names.DARK_TEMPLAR, + item_names.DRAGOON, + item_names.AVENGER, + item_names.IMMORTAL, + item_names.ANNIHILATOR, + item_names.VANGUARD, + item_names.SKIRMISHER, + }) +} + +no_logic_basic_units = { + SC2Race.TERRAN: advanced_basic_units[SC2Race.TERRAN].union({ + item_names.FIREBAT, + item_names.GHOST, + item_names.SPECTRE, + item_names.WRAITH, + item_names.RAVEN, + item_names.PREDATOR, + item_names.LIBERATOR, + item_names.HERC, + }), + SC2Race.ZERG: advanced_basic_units[SC2Race.ZERG].union({ + item_names.ZERGLING, + item_names.PYGALISK, + item_names.INFESTED_SIEGE_TANK, + item_names.ULTRALISK, + item_names.SWARM_HOST + }), + SC2Race.PROTOSS: advanced_basic_units[SC2Race.PROTOSS].union({ + item_names.BLOOD_HUNTER, + item_names.STALWART, + item_names.CARRIER, + item_names.SKYLORD, + item_names.TRIREME, + item_names.TEMPEST, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.PULSAR, + item_names.DAWNBRINGER, + item_names.COLOSSUS, + item_names.WRATHWALKER, + item_names.SCOUT, + item_names.OPPRESSOR, + item_names.MISTWING, + item_names.HIGH_TEMPLAR, + item_names.SIGNIFIER, + item_names.ASCENDANT, + item_names.DARK_ARCHON, + item_names.SUPPLICANT, + }) +} + +not_balanced_starting_units = { + item_names.SIEGE_TANK, + item_names.THOR, + item_names.BANSHEE, + item_names.BATTLECRUISER, + item_names.ULTRALISK, + item_names.CARRIER, + item_names.TEMPEST, +} + + +# Defense rating table +# Commented defense ratings are handled in LogicMixin +tvx_defense_ratings = { + item_names.SIEGE_TANK: 5, + # "Graduating Range": 1, + item_names.PLANETARY_FORTRESS: 3, + # Bunker w/ Marine/Marauder: 3, + item_names.PERDITION_TURRET: 2, + item_names.DEVASTATOR_TURRET: 2, + item_names.VULTURE: 1, + item_names.BANSHEE: 1, + item_names.BATTLECRUISER: 1, + item_names.LIBERATOR: 4, + item_names.WIDOW_MINE: 1, + # "Concealment (Widow Mine)": 1 +} +tvz_defense_ratings = { + item_names.PERDITION_TURRET: 2, + # Bunker w/ Firebat: 2, + item_names.LIBERATOR: -2, + item_names.HIVE_MIND_EMULATOR: 3, + item_names.PSI_DISRUPTER: 3, +} +tvx_air_defense_ratings = { + item_names.MISSILE_TURRET: 2, +} +zvx_defense_ratings = { + # Note that this doesn't include Kerrigan because this is just for race swaps, which doesn't involve her (for now) + item_names.SPINE_CRAWLER: 3, + # w/ Twin Drones: 1 + item_names.SWARM_QUEEN: 1, + item_names.SWARM_HOST: 1, + # impaler: 3 + # "Hardened Tentacle Spines (Impaler)": 2 + # lurker: 1 + # "Seismic Spines (Lurker)": 2 + # "Adapted Spines (Lurker)": 1 + # brood lord : 2 + # corpser roach: 1 + # creep tumors (swarm queen or overseer): 1 + # w/ malignant creep: 1 + # tanks with ammo: 5 + item_names.INFESTED_BUNKER: 3, + item_names.BILE_LAUNCHER: 2, +} +# zvz_defense_ratings = { + # corpser roach: 1 + # primal igniter: 2 + # lurker: 1 + # w/ adapted spines: -1 + # impaler: -1 +# } +zvx_air_defense_ratings = { + item_names.SPORE_CRAWLER: 2, + # w/ Twin Drones: 1 + item_names.INFESTED_MISSILE_TURRET: 2, +} +pvx_defense_ratings = { + item_names.PHOTON_CANNON: 2, + item_names.KHAYDARIN_MONOLITH: 3, + item_names.SHIELD_BATTERY: 1, + item_names.NEXUS_OVERCHARGE: 2, + item_names.SKYLORD: 1, + item_names.MATRIX_OVERLOAD: 1, + item_names.COLOSSUS: 1, + item_names.VANGUARD: 1, + item_names.REAVER: 1, +} +pvz_defense_ratings = { + item_names.KHAYDARIN_MONOLITH: -2, + item_names.COLOSSUS: 1, +} + +terran_passive_ratings = { + item_names.AUTOMATED_REFINERY: 4, + item_names.COMMAND_CENTER_MULE: 4, + item_names.ORBITAL_DEPOTS: 2, + item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR: 2, + item_names.COMMAND_CENTER_EXTRA_SUPPLIES: 2, + item_names.MICRO_FILTERING: 2, + item_names.TECH_REACTOR: 2 +} + +zerg_passive_ratings = { + item_names.TWIN_DRONES: 7, + item_names.AUTOMATED_EXTRACTORS: 4, + item_names.VESPENE_EFFICIENCY: 3, + item_names.OVERLORD_IMPROVED_OVERLORDS: 4, + item_names.MALIGNANT_CREEP: 2 +} + +protoss_passive_ratings = { + item_names.QUATRO: 4, + item_names.ORBITAL_ASSIMILATORS: 4, + item_names.AMPLIFIED_ASSIMILATORS: 3, + item_names.PROBE_WARPIN: 2, + item_names.ELDER_PROBES: 2, + item_names.MATRIX_OVERLOAD: 2 +} + +soa_energy_ratings = { + item_names.SOA_SOLAR_LANCE: 8, + item_names.SOA_DEPLOY_FENIX: 7, + item_names.SOA_TEMPORAL_FIELD: 6, + item_names.SOA_PROGRESSIVE_PROXY_PYLON: 5, # Requires Lvl 2 (Warp in Reinforcements) + item_names.SOA_SHIELD_OVERCHARGE: 5, + item_names.SOA_ORBITAL_STRIKE: 4 +} + +soa_passive_ratings = { + item_names.GUARDIAN_SHELL: 4, + item_names.OVERWATCH: 2 +} + +soa_ultimate_ratings = { + item_names.SOA_TIME_STOP: 4, + item_names.SOA_PURIFIER_BEAM: 3, + item_names.SOA_SOLAR_BOMBARDMENT: 3 +} + +kerrigan_levels = [ + item_name for item_name, item_data in item_table.items() + if item_data.type == ZergItemType.Level and item_data.race == SC2Race.ZERG +] + + +spear_of_adun_calldowns = { + item_names.SOA_CHRONO_SURGE, + item_names.SOA_PROGRESSIVE_PROXY_PYLON, + item_names.SOA_PYLON_OVERCHARGE, + item_names.SOA_ORBITAL_STRIKE, + item_names.SOA_TEMPORAL_FIELD, + item_names.SOA_SOLAR_LANCE, + item_names.SOA_MASS_RECALL, + item_names.SOA_SHIELD_OVERCHARGE, + item_names.SOA_DEPLOY_FENIX, + item_names.SOA_PURIFIER_BEAM, + item_names.SOA_TIME_STOP, + item_names.SOA_SOLAR_BOMBARDMENT +} + +spear_of_adun_castable_passives = { + item_names.RECONSTRUCTION_BEAM, + item_names.OVERWATCH, + item_names.GUARDIAN_SHELL, +} + +nova_equipment = { + *[item_name for item_name, item_data in get_full_item_list().items() + if item_data.type == TerranItemType.Nova_Gear], + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE +} + +upgrade_bundles: Dict[str, List[str]] = { + # Terran + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON + ], + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, + item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, + item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR + ], + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR + ], + # Zerg + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK + ], + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE + ], + item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE + ], + item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE + ], + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, + item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE + ], + # Protoss + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON + ], + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE: + [ + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS + ], +} + +# Used for logic +upgrade_bundle_inverted_lookup: Dict[str, List[str]] = dict() +for key, values in upgrade_bundles.items(): + for value in values: + if upgrade_bundle_inverted_lookup.get(value) is None: + upgrade_bundle_inverted_lookup[value] = list() + if (value != item_names.PROGRESSIVE_PROTOSS_SHIELDS + or key not in [ + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE + ] + ): + # Shield handling is trickier as it's max of Ground/Air group, not their sum + upgrade_bundle_inverted_lookup[value].append(key) + +lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in get_full_item_list().items() if + data.code} + +upgrade_item_types = (TerranItemType.Upgrade, ZergItemType.Upgrade, ProtossItemType.Upgrade) diff --git a/worlds/sc2/item/parent_names.py b/worlds/sc2/item/parent_names.py new file mode 100644 index 0000000000..8bf33becdf --- /dev/null +++ b/worlds/sc2/item/parent_names.py @@ -0,0 +1,57 @@ +""" +Identifiers for complex item parent structures. +Defined separately from item_parents to avoid a circular import +item_names -> item_parent_names -> item_tables -> item_parents +""" + +# Terran +DOMINION_TROOPER_WEAPONS = "Dominion Trooper Weapons" +INFANTRY_UNITS = "Infantry Units" +INFANTRY_WEAPON_UNITS = "Infantry Weapon Units" +ORBITAL_COMMAND_AND_PLANETARY = "Orbital Command Abilities + Planetary Fortress" # MULE | Scan | Supply Drop +SIEGE_TANK_AND_TRANSPORT = "Siege Tank + Transport" +SIEGE_TANK_AND_MEDIVAC = "Siege Tank + Medivac" +SPIDER_MINE_SOURCE = "Spider Mine Source" +STARSHIP_UNITS = "Starship Units" +STARSHIP_WEAPON_UNITS = "Starship Weapon Units" +VEHICLE_UNITS = "Vehicle Units" +VEHICLE_WEAPON_UNITS = "Vehicle Weapon Units" +TERRAN_MERCENARIES = "Terran Mercenaries" + +# Zerg +ANY_NYDUS_WORM = "Any Nydus Worm" +BANELING_SOURCE = "Any Baneling Source" # Baneling aspect | Kerrigan Spawn Banelings +INFESTED_UNITS = "Infested Units" +INFESTED_FACTORY_OR_STARPORT = "Infested Factory or Starport" +MORPH_SOURCE_AIR = "Air Morph Source" # Morphling | Mutalisk | Corruptor +MORPH_SOURCE_ROACH = "Roach Morph Source" # Morphling | Roach +MORPH_SOURCE_ZERGLING = "Zergling Morph Source" # Morphling | Zergling +MORPH_SOURCE_HYDRALISK = "Hydralisk Morph Source" # Morphling | Hydralisk +MORPH_SOURCE_ULTRALISK = "Ultralisk Morph Source" # Morphling | Ultralisk +ZERG_UPROOTABLE_BUILDINGS = "Zerg Uprootable Buildings" +ZERG_MELEE_ATTACKER = "Zerg Melee Attacker" +ZERG_MISSILE_ATTACKER = "Zerg Missile Attacker" +ZERG_CARAPACE_UNIT = "Zerg Carapace Unit" +ZERG_FLYING_UNIT = "Zerg Flying Unit" +ZERG_MERCENARIES = "Zerg Mercenaries" +ZERG_OUROBOUROS_CONDITION = "Zerg Ourobouros Condition" + +# Protoss +ARCHON_SOURCE = "Any Archon Source" +CARRIER_CLASS = "Carrier Class" +CARRIER_OR_TRIREME = "Carrier | Trireme" +DARK_ARCHON_SOURCE = "Dark Archon Source" +DARK_TEMPLAR_CLASS = "Dark Templar Class" +STORM_CASTER = "Storm Caster" +IMMORTAL_OR_ANNIHILATOR = "Immortal | Annihilator" +PHOENIX_CLASS = "Phoenix Class" +SENTRY_CLASS = "Sentry Class" +SENTRY_CLASS_OR_SHIELD_BATTERY = "Sentry Class | Shield Battery" +STALKER_CLASS = "Stalker Class" +SUPPLICANT_AND_ASCENDANT = "Supplicant + Ascendant" +VOID_RAY_CLASS = "Void Ray Class" +ZEALOT_OR_SENTINEL_OR_CENTURION = "Zealot | Sentinel | Centurion" +PROTOSS_STATIC_DEFENSE = "Protoss Static Defense" +PROTOSS_ATTACKING_BUILDING = "Protoss Attacking Structure" +SCOUT_CLASS = "Scout Class" +SCOUT_OR_OPPRESSOR_OR_MISTWING = "Scout | Oppressor | Mist Wing" diff --git a/worlds/sc2/location_groups.py b/worlds/sc2/location_groups.py new file mode 100644 index 0000000000..c353558fb4 --- /dev/null +++ b/worlds/sc2/location_groups.py @@ -0,0 +1,40 @@ +""" +Location group definitions +""" + +from typing import Dict, Set, Iterable +from .locations import DEFAULT_LOCATION_LIST, LocationData +from .mission_tables import lookup_name_to_mission, MissionFlag + +def get_location_groups() -> Dict[str, Set[str]]: + result: Dict[str, Set[str]] = {} + locations: Iterable[LocationData] = DEFAULT_LOCATION_LIST + + for location in locations: + if location.code is None: + # Beat events + continue + mission = lookup_name_to_mission.get(location.region) + if mission is None: + continue + + if (MissionFlag.HasRaceSwap|MissionFlag.RaceSwap) & mission.flags: + # Location group including race-swapped variants of a location + agnostic_location_name = ( + location.name + .replace(' (Terran)', '') + .replace(' (Protoss)', '') + .replace(' (Zerg)', '') + ) + result.setdefault(agnostic_location_name, set()).add(location.name) + + # Location group including all locations in all raceswaps + result.setdefault(mission.mission_name[:mission.mission_name.find(' (')], set()).add(location.name) + + # Location group including all locations in a mission + result.setdefault(mission.mission_name, set()).add(location.name) + + # Location group by location category + result.setdefault(location.type.name.title(), set()).add(location.name) + + return result diff --git a/worlds/sc2/locations.py b/worlds/sc2/locations.py new file mode 100644 index 0000000000..34245d8637 --- /dev/null +++ b/worlds/sc2/locations.py @@ -0,0 +1,14178 @@ +import enum +from typing import List, Tuple, Optional, Callable, NamedTuple, Set, TYPE_CHECKING +from .item import item_names +from .item.item_groups import kerrigan_logic_ultimates +from .options import ( + get_option_value, + RequiredTactics, + LocationInclusion, + KerriganPresence, + GrantStoryTech, + get_enabled_campaigns, +) +from .mission_tables import SC2Mission, SC2Campaign + +from BaseClasses import Location +from worlds.AutoWorld import World + +if TYPE_CHECKING: + from BaseClasses import CollectionState + from . import SC2World + +SC2WOL_LOC_ID_OFFSET = 1000 +SC2HOTS_LOC_ID_OFFSET = 20000000 # Avoid clashes with The Legend of Zelda +SC2LOTV_LOC_ID_OFFSET = SC2HOTS_LOC_ID_OFFSET + 2000 +SC2NCO_LOC_ID_OFFSET = SC2LOTV_LOC_ID_OFFSET + 2500 +SC2_RACESWAP_LOC_ID_OFFSET = SC2NCO_LOC_ID_OFFSET + 900 +VICTORY_CACHE_OFFSET = 90 + + +class SC2Location(Location): + game: str = "Starcraft2" + + +class LocationType(enum.IntEnum): + VICTORY = 0 # Winning a mission + VANILLA = 1 # Objectives that provided metaprogression in the original campaign, along with a few other locations for a balanced experience + EXTRA = 2 # Additional locations based on mission progression, collecting in-mission rewards, etc. that do not significantly increase the challenge. + CHALLENGE = 3 # Challenging objectives, often harder than just completing a mission, and often associated with Achievements + MASTERY = 4 # Extremely challenging objectives often associated with Masteries and Feats of Strength in the original campaign + VICTORY_CACHE = 5 # Bonus locations for beating a mission + + +class LocationFlag(enum.IntFlag): + NONE = 0 + BASEBUST = enum.auto() + """Locations about killing challenging bases""" + SPEEDRUN = enum.auto() + """Locations that are about doing something fast""" + PREVENTATIVE = enum.auto() + """Locations that are about preventing something from happening""" + + def values(self): + """Hacky iterator for backwards-compatibility with Python <= 3.10. Not necessary on Python 3.11+""" + return tuple( + val + for val in ( + LocationFlag.SPEEDRUN, + LocationFlag.PREVENTATIVE, + ) + if val in self + ) + + +class LocationData(NamedTuple): + region: str + name: str + code: int + type: LocationType + rule: Callable[["CollectionState"], bool] = Location.access_rule + flags: LocationFlag = LocationFlag.NONE + hard_rule: Optional[Callable[["CollectionState"], bool]] = None + + +def make_location_data( + region: str, + name: str, + code: int, + type: LocationType, + rule: Callable[["CollectionState"], bool] = Location.access_rule, + flags: LocationFlag = LocationFlag.NONE, + hard_rule: Optional[Callable[["CollectionState"], bool]] = None, +) -> LocationData: + return LocationData(region, f"{region}: {name}", code, type, rule, flags, hard_rule) + + +def get_location_types(world: "SC2World", inclusion_type: int) -> Set[LocationType]: + """ + :param world: The starcraft 2 world object + :param inclusion_type: Level of inclusion to check for + :return: A list of location types that match the inclusion type + """ + exclusion_options = [ + ("vanilla_locations", LocationType.VANILLA), + ("extra_locations", LocationType.EXTRA), + ("challenge_locations", LocationType.CHALLENGE), + ("mastery_locations", LocationType.MASTERY), + ] + excluded_location_types = set() + for option_name, location_type in exclusion_options: + if get_option_value(world, option_name) is inclusion_type: + excluded_location_types.add(location_type) + return excluded_location_types + + +def get_location_flags(world: "SC2World", inclusion_type: int) -> LocationFlag: + """ + :param world: The starcraft 2 world object + :param inclusion_type: Level of inclusion to check for + :return: A list of location types that match the inclusion type + """ + matching_location_flags = LocationFlag.NONE + if world.options.basebust_locations.value == inclusion_type: + matching_location_flags |= LocationFlag.BASEBUST + if world.options.speedrun_locations.value == inclusion_type: + matching_location_flags |= LocationFlag.SPEEDRUN + if world.options.preventative_locations.value == inclusion_type: + matching_location_flags |= LocationFlag.PREVENTATIVE + return matching_location_flags + + +def get_plando_locations(world: World) -> List[str]: + """ + :param multiworld: + :param player: + :return: A list of locations affected by a plando in a world + """ + if world is None: + return [] + plando_locations = [] + for plando_setting in world.options.plando_items: + plando_locations += plando_setting.locations + + return plando_locations + + +def get_locations(world: Optional["SC2World"]) -> Tuple[LocationData, ...]: + # Note: rules which are ended with or True are rules identified as needed later when restricted units is an option + if world is None: + logic_level = int(RequiredTactics.default) + kerriganless = False + else: + logic_level = world.options.required_tactics.value + kerriganless = ( + world.options.kerrigan_presence.value != KerriganPresence.option_vanilla + or SC2Campaign.HOTS not in get_enabled_campaigns(world) + ) + adv_tactics = logic_level != RequiredTactics.option_standard + if world is not None and world.logic is not None: + logic = world.logic + else: + from .rules import SC2Logic + + logic = SC2Logic(world) + player = 1 if world is None else world.player + location_table: List[LocationData] = [ + # WoL + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 100, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "First Statue", + SC2WOL_LOC_ID_OFFSET + 101, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Second Statue", + SC2WOL_LOC_ID_OFFSET + 102, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Third Statue", + SC2WOL_LOC_ID_OFFSET + 103, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Fourth Statue", + SC2WOL_LOC_ID_OFFSET + 104, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Fifth Statue", + SC2WOL_LOC_ID_OFFSET + 105, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Sixth Statue", + SC2WOL_LOC_ID_OFFSET + 106, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Special Delivery", + SC2WOL_LOC_ID_OFFSET + 107, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LIBERATION_DAY.mission_name, + "Transport", + SC2WOL_LOC_ID_OFFSET + 108, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_OUTLAWS.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 200, + LocationType.VICTORY, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.THE_OUTLAWS.mission_name, + "Rebel Base", + SC2WOL_LOC_ID_OFFSET + 201, + LocationType.VANILLA, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.THE_OUTLAWS.mission_name, + "North Resource Pickups", + SC2WOL_LOC_ID_OFFSET + 202, + LocationType.EXTRA, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.THE_OUTLAWS.mission_name, + "Bunker", + SC2WOL_LOC_ID_OFFSET + 203, + LocationType.VANILLA, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.THE_OUTLAWS.mission_name, + "Close Resource Pickups", + SC2WOL_LOC_ID_OFFSET + 204, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 300, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True) >= 2 + and (adv_tactics or logic.terran_basic_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "First Group Rescued", + SC2WOL_LOC_ID_OFFSET + 301, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Second Group Rescued", + SC2WOL_LOC_ID_OFFSET + 302, + LocationType.VANILLA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Third Group Rescued", + SC2WOL_LOC_ID_OFFSET + 303, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True) >= 2 + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "First Hatchery", + SC2WOL_LOC_ID_OFFSET + 304, + LocationType.CHALLENGE, + logic.terran_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Second Hatchery", + SC2WOL_LOC_ID_OFFSET + 305, + LocationType.CHALLENGE, + logic.terran_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Third Hatchery", + SC2WOL_LOC_ID_OFFSET + 306, + LocationType.CHALLENGE, + logic.terran_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Fourth Hatchery", + SC2WOL_LOC_ID_OFFSET + 307, + LocationType.CHALLENGE, + logic.terran_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Ride's on its Way", + SC2WOL_LOC_ID_OFFSET + 308, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Hold Just a Little Longer", + SC2WOL_LOC_ID_OFFSET + 309, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True) >= 2 + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR.mission_name, + "Cavalry's on the Way", + SC2WOL_LOC_ID_OFFSET + 310, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True) >= 2 + ), + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 400, + LocationType.VICTORY, + lambda state: ( + logic.terran_early_tech(state) + and ( + (adv_tactics and logic.terran_basic_anti_air(state)) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "North Chrysalis", + SC2WOL_LOC_ID_OFFSET + 401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "West Chrysalis", + SC2WOL_LOC_ID_OFFSET + 402, + LocationType.VANILLA, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "East Chrysalis", + SC2WOL_LOC_ID_OFFSET + 403, + LocationType.VANILLA, + logic.terran_early_tech, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Reach Hanson", + SC2WOL_LOC_ID_OFFSET + 404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Secret Resource Stash", + SC2WOL_LOC_ID_OFFSET + 405, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Flawless", + SC2WOL_LOC_ID_OFFSET + 406, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_early_tech(state) + and logic.terran_defense_rating(state, True, False) >= 2 + and ( + (adv_tactics and logic.terran_basic_anti_air(state)) + or logic.terran_competent_anti_air(state) + ) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Western Zerg Base", + SC2WOL_LOC_ID_OFFSET + 407, + LocationType.MASTERY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_base_trasher(state) + and logic.terran_competent_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.EVACUATION.mission_name, + "Eastern Zerg Base", + SC2WOL_LOC_ID_OFFSET + 408, + LocationType.MASTERY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_base_trasher(state) + and logic.terran_competent_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 500, + LocationType.VICTORY, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "Left Infestor", + SC2WOL_LOC_ID_OFFSET + 501, + LocationType.VANILLA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "Right Infestor", + SC2WOL_LOC_ID_OFFSET + 502, + LocationType.VANILLA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "North Infested Command Center", + SC2WOL_LOC_ID_OFFSET + 503, + LocationType.EXTRA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "South Infested Command Center", + SC2WOL_LOC_ID_OFFSET + 504, + LocationType.EXTRA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "Northwest Bar", + SC2WOL_LOC_ID_OFFSET + 505, + LocationType.EXTRA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "North Bar", + SC2WOL_LOC_ID_OFFSET + 506, + LocationType.EXTRA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK.mission_name, + "South Bar", + SC2WOL_LOC_ID_OFFSET + 507, + LocationType.EXTRA, + logic.terran_outbreak_requirement, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 600, + LocationType.VICTORY, + logic.terran_safe_haven_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "North Nexus", + SC2WOL_LOC_ID_OFFSET + 601, + LocationType.EXTRA, + logic.terran_safe_haven_requirement, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "East Nexus", + SC2WOL_LOC_ID_OFFSET + 602, + LocationType.EXTRA, + logic.terran_safe_haven_requirement, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "South Nexus", + SC2WOL_LOC_ID_OFFSET + 603, + LocationType.EXTRA, + logic.terran_safe_haven_requirement, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "First Terror Fleet", + SC2WOL_LOC_ID_OFFSET + 604, + LocationType.VANILLA, + logic.terran_safe_haven_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "Second Terror Fleet", + SC2WOL_LOC_ID_OFFSET + 605, + LocationType.VANILLA, + logic.terran_safe_haven_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN.mission_name, + "Third Terror Fleet", + SC2WOL_LOC_ID_OFFSET + 606, + LocationType.VANILLA, + logic.terran_safe_haven_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 700, + LocationType.VICTORY, + logic.terran_havens_fall_requirement, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "North Hive", + SC2WOL_LOC_ID_OFFSET + 701, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "East Hive", + SC2WOL_LOC_ID_OFFSET + 702, + LocationType.VANILLA, + logic.terran_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "South Hive", + SC2WOL_LOC_ID_OFFSET + 703, + LocationType.VANILLA, + logic.terran_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Northeast Colony Base", + SC2WOL_LOC_ID_OFFSET + 704, + LocationType.CHALLENGE, + logic.terran_respond_to_colony_infestations, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "East Colony Base", + SC2WOL_LOC_ID_OFFSET + 705, + LocationType.CHALLENGE, + logic.terran_respond_to_colony_infestations, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Middle Colony Base", + SC2WOL_LOC_ID_OFFSET + 706, + LocationType.CHALLENGE, + logic.terran_respond_to_colony_infestations, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Southeast Colony Base", + SC2WOL_LOC_ID_OFFSET + 707, + LocationType.CHALLENGE, + logic.terran_respond_to_colony_infestations, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Southwest Colony Base", + SC2WOL_LOC_ID_OFFSET + 708, + LocationType.CHALLENGE, + logic.terran_respond_to_colony_infestations, + hard_rule=logic.terran_any_anti_air_or_science_vessels, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Southwest Gas Pickups", + SC2WOL_LOC_ID_OFFSET + 709, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "East Gas Pickups", + SC2WOL_LOC_ID_OFFSET + 710, + LocationType.EXTRA, + logic.terran_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL.mission_name, + "Southeast Gas Pickups", + SC2WOL_LOC_ID_OFFSET + 711, + LocationType.EXTRA, + logic.terran_havens_fall_requirement, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 800, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_moderate_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "First Relic", + SC2WOL_LOC_ID_OFFSET + 801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Second Relic", + SC2WOL_LOC_ID_OFFSET + 802, + LocationType.VANILLA, + lambda state: (adv_tactics or logic.terran_common_unit(state)), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Third Relic", + SC2WOL_LOC_ID_OFFSET + 803, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_moderate_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Fourth Relic", + SC2WOL_LOC_ID_OFFSET + 804, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_moderate_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "First Forcefield Area Busted", + SC2WOL_LOC_ID_OFFSET + 805, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_moderate_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Second Forcefield Area Busted", + SC2WOL_LOC_ID_OFFSET + 806, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_moderate_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB.mission_name, + "Defeat Kerrigan", + SC2WOL_LOC_ID_OFFSET + 807, + LocationType.MASTERY, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 900, + LocationType.VICTORY, + lambda state: ( + ( + logic.terran_competent_anti_air(state) + or adv_tactics + and logic.terran_moderate_anti_air(state) + ) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Left Relic", + SC2WOL_LOC_ID_OFFSET + 901, + LocationType.VANILLA, + lambda state: ( + logic.terran_defense_rating(state, False, False) >= 6 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Right Ground Relic", + SC2WOL_LOC_ID_OFFSET + 902, + LocationType.VANILLA, + lambda state: ( + logic.terran_defense_rating(state, False, False) >= 6 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Right Cliff Relic", + SC2WOL_LOC_ID_OFFSET + 903, + LocationType.VANILLA, + lambda state: ( + logic.terran_defense_rating(state, False, False) >= 6 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Moebius Base", + SC2WOL_LOC_ID_OFFSET + 904, + LocationType.EXTRA, + lambda state: logic.marine_medic_upgrade(state) or adv_tactics, + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Door Outer Layer", + SC2WOL_LOC_ID_OFFSET + 905, + LocationType.EXTRA, + lambda state: ( + logic.terran_defense_rating(state, False, False) >= 6 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Door Thermal Barrier", + SC2WOL_LOC_ID_OFFSET + 906, + LocationType.EXTRA, + lambda state: ( + ( + logic.terran_competent_anti_air(state) + or adv_tactics + and logic.terran_moderate_anti_air(state) + ) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Cutting Through the Core", + SC2WOL_LOC_ID_OFFSET + 907, + LocationType.EXTRA, + lambda state: ( + ( + logic.terran_competent_anti_air(state) + or adv_tactics + and logic.terran_moderate_anti_air(state) + ) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Structure Access Imminent", + SC2WOL_LOC_ID_OFFSET + 908, + LocationType.EXTRA, + lambda state: ( + ( + logic.terran_competent_anti_air(state) + or adv_tactics + and logic.terran_moderate_anti_air(state) + ) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + ), + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Northwestern Protoss Base", + SC2WOL_LOC_ID_OFFSET + 909, + LocationType.MASTERY, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Northeastern Protoss Base", + SC2WOL_LOC_ID_OFFSET + 910, + LocationType.MASTERY, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and (logic.marine_medic_upgrade(state) or adv_tactics) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG.mission_name, + "Eastern Protoss Base", + SC2WOL_LOC_ID_OFFSET + 911, + LocationType.MASTERY, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_defense_rating(state, False, True) >= 8 + and logic.terran_common_unit(state) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1000, + LocationType.VICTORY, + lambda state: ( + ( + logic.terran_moderate_anti_air(state) + and state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + or logic.terran_air_anti_air(state) + ) + and ( + logic.terran_air(state) + or state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + and logic.terran_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "1st Data Core", + SC2WOL_LOC_ID_OFFSET + 1001, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "2nd Data Core", + SC2WOL_LOC_ID_OFFSET + 1002, + LocationType.VANILLA, + lambda state: ( + logic.terran_air(state) + or ( + state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + and logic.terran_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "South Rescue", + SC2WOL_LOC_ID_OFFSET + 1003, + LocationType.EXTRA, + logic.terran_can_rescue, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Wall Rescue", + SC2WOL_LOC_ID_OFFSET + 1004, + LocationType.EXTRA, + logic.terran_can_rescue, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Mid Rescue", + SC2WOL_LOC_ID_OFFSET + 1005, + LocationType.EXTRA, + logic.terran_can_rescue, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Nydus Roof Rescue", + SC2WOL_LOC_ID_OFFSET + 1006, + LocationType.EXTRA, + logic.terran_can_rescue, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Alive Inside Rescue", + SC2WOL_LOC_ID_OFFSET + 1007, + LocationType.EXTRA, + logic.terran_can_rescue, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "Brutalisk", + SC2WOL_LOC_ID_OFFSET + 1008, + LocationType.VANILLA, + lambda state: ( + ( + logic.terran_moderate_anti_air(state) + and state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + or logic.terran_air_anti_air(state) + ) + and ( + logic.terran_air(state) + or state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + and logic.terran_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR.mission_name, + "3rd Data Core", + SC2WOL_LOC_ID_OFFSET + 1009, + LocationType.VANILLA, + lambda state: ( + ( + logic.terran_moderate_anti_air(state) + and state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + or logic.terran_air_anti_air(state) + ) + and ( + logic.terran_air(state) + or state.has_any({item_names.MEDIVAC, item_names.HERCULES}, player) + and logic.terran_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1100, + LocationType.VICTORY, + logic.terran_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "West Relic", + SC2WOL_LOC_ID_OFFSET + 1101, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "North Relic", + SC2WOL_LOC_ID_OFFSET + 1102, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "South Relic", + SC2WOL_LOC_ID_OFFSET + 1103, + LocationType.VANILLA, + logic.terran_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "East Relic", + SC2WOL_LOC_ID_OFFSET + 1104, + LocationType.VANILLA, + logic.terran_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "Landing Zone Cleared", + SC2WOL_LOC_ID_OFFSET + 1105, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "Middle Base", + SC2WOL_LOC_ID_OFFSET + 1106, + LocationType.EXTRA, + logic.terran_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA.mission_name, + "Southeast Base", + SC2WOL_LOC_ID_OFFSET + 1107, + LocationType.EXTRA, + logic.terran_supernova_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1200, + LocationType.VICTORY, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Landing Zone Cleared", + SC2WOL_LOC_ID_OFFSET + 1201, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Expansion Prisoners", + SC2WOL_LOC_ID_OFFSET + 1202, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "South Close Prisoners", + SC2WOL_LOC_ID_OFFSET + 1203, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "South Far Prisoners", + SC2WOL_LOC_ID_OFFSET + 1204, + LocationType.VANILLA, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "North Prisoners", + SC2WOL_LOC_ID_OFFSET + 1205, + LocationType.VANILLA, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Mothership", + SC2WOL_LOC_ID_OFFSET + 1206, + LocationType.EXTRA, + logic.terran_maw_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Expansion Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1207, + LocationType.EXTRA, + lambda state: adv_tactics or logic.terran_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Middle Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1208, + LocationType.EXTRA, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Southeast Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1209, + LocationType.EXTRA, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Stargate Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1210, + LocationType.EXTRA, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Northwest Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1211, + LocationType.CHALLENGE, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "West Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1212, + LocationType.CHALLENGE, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID.mission_name, + "Southwest Rip Field Generator", + SC2WOL_LOC_ID_OFFSET + 1213, + LocationType.CHALLENGE, + logic.terran_maw_requirement, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1300, + LocationType.VICTORY, + lambda state: ( + adv_tactics + or logic.terran_moderate_anti_air(state) + and ( + logic.terran_common_unit(state) + or state.has(item_names.REAPER, player) + ) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Tosh's Miners", + SC2WOL_LOC_ID_OFFSET + 1301, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Brutalisk", + SC2WOL_LOC_ID_OFFSET + 1302, + LocationType.VANILLA, + lambda state: adv_tactics + or logic.terran_common_unit(state) + or state.has(item_names.REAPER, player), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "North Reapers", + SC2WOL_LOC_ID_OFFSET + 1303, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Middle Reapers", + SC2WOL_LOC_ID_OFFSET + 1304, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Southwest Reapers", + SC2WOL_LOC_ID_OFFSET + 1305, + LocationType.EXTRA, + lambda state: adv_tactics + or logic.terran_common_unit(state) + or state.has(item_names.REAPER, player), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Southeast Reapers", + SC2WOL_LOC_ID_OFFSET + 1306, + LocationType.EXTRA, + lambda state: ( + adv_tactics + or logic.terran_moderate_anti_air(state) + and ( + logic.terran_common_unit(state) + or state.has(item_names.REAPER, player) + ) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "East Reapers", + SC2WOL_LOC_ID_OFFSET + 1307, + LocationType.EXTRA, + lambda state: ( + logic.terran_moderate_anti_air(state) + and ( + adv_tactics + or logic.terran_common_unit(state) + or state.has(item_names.REAPER, player) + ) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND.mission_name, + "Zerg Cleared", + SC2WOL_LOC_ID_OFFSET + 1308, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_anti_air(state) + and ( + logic.terran_common_unit(state) + or state.has(item_names.REAPER, player) + ) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1400, + LocationType.VICTORY, + logic.terran_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Close Relic", + SC2WOL_LOC_ID_OFFSET + 1401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "West Relic", + SC2WOL_LOC_ID_OFFSET + 1402, + LocationType.VANILLA, + logic.terran_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "North-East Relic", + SC2WOL_LOC_ID_OFFSET + 1403, + LocationType.VANILLA, + logic.terran_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Middle Base", + SC2WOL_LOC_ID_OFFSET + 1404, + LocationType.EXTRA, + logic.terran_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Protoss Cleared", + SC2WOL_LOC_ID_OFFSET + 1405, + LocationType.MASTERY, + lambda state: ( + logic.terran_welcome_to_the_jungle_requirement(state) + and logic.terran_beats_protoss_deathball(state) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "No Terrazine Nodes Sealed", + SC2WOL_LOC_ID_OFFSET + 1406, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_welcome_to_the_jungle_requirement(state) + and logic.terran_competent_ground_to_air(state) + and logic.terran_beats_protoss_deathball(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Up to 1 Terrazine Node Sealed", + SC2WOL_LOC_ID_OFFSET + 1407, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_welcome_to_the_jungle_requirement(state) + and logic.terran_competent_ground_to_air(state) + and logic.terran_beats_protoss_deathball(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Up to 2 Terrazine Nodes Sealed", + SC2WOL_LOC_ID_OFFSET + 1408, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_welcome_to_the_jungle_requirement(state) + and logic.terran_beats_protoss_deathball(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Up to 3 Terrazine Nodes Sealed", + SC2WOL_LOC_ID_OFFSET + 1409, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_welcome_to_the_jungle_requirement(state) + and logic.terran_competent_comp(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Up to 4 Terrazine Nodes Sealed", + SC2WOL_LOC_ID_OFFSET + 1410, + LocationType.EXTRA, + logic.terran_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + "Up to 5 Terrazine Nodes Sealed", + SC2WOL_LOC_ID_OFFSET + 1411, + LocationType.EXTRA, + logic.terran_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.BREAKOUT.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1500, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.BREAKOUT.mission_name, + "Diamondback Prison", + SC2WOL_LOC_ID_OFFSET + 1501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BREAKOUT.mission_name, + "Siege Tank Prison", + SC2WOL_LOC_ID_OFFSET + 1502, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BREAKOUT.mission_name, + "First Checkpoint", + SC2WOL_LOC_ID_OFFSET + 1503, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.BREAKOUT.mission_name, + "Second Checkpoint", + SC2WOL_LOC_ID_OFFSET + 1504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1600, + LocationType.VICTORY, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "Terrazine Tank", + SC2WOL_LOC_ID_OFFSET + 1601, + LocationType.EXTRA, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "Jorium Stockpile", + SC2WOL_LOC_ID_OFFSET + 1602, + LocationType.EXTRA, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "First Island Spectres", + SC2WOL_LOC_ID_OFFSET + 1603, + LocationType.VANILLA, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "Second Island Spectres", + SC2WOL_LOC_ID_OFFSET + 1604, + LocationType.VANILLA, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + "Third Island Spectres", + SC2WOL_LOC_ID_OFFSET + 1605, + LocationType.VANILLA, + logic.ghost_of_a_chance_requirement, + hard_rule=logic.ghost_of_a_chance_requirement, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1700, + LocationType.VICTORY, + lambda state: ( + logic.terran_great_train_robbery_train_stopper(state) + and logic.terran_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "North Defiler", + SC2WOL_LOC_ID_OFFSET + 1701, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Mid Defiler", + SC2WOL_LOC_ID_OFFSET + 1702, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "South Defiler", + SC2WOL_LOC_ID_OFFSET + 1703, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Close Diamondback", + SC2WOL_LOC_ID_OFFSET + 1704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Northwest Diamondback", + SC2WOL_LOC_ID_OFFSET + 1705, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "North Diamondback", + SC2WOL_LOC_ID_OFFSET + 1706, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Northeast Diamondback", + SC2WOL_LOC_ID_OFFSET + 1707, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Southwest Diamondback", + SC2WOL_LOC_ID_OFFSET + 1708, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Southeast Diamondback", + SC2WOL_LOC_ID_OFFSET + 1709, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Kill Team", + SC2WOL_LOC_ID_OFFSET + 1710, + LocationType.CHALLENGE, + lambda state: ( + (adv_tactics or logic.terran_common_unit(state)) + and logic.terran_great_train_robbery_train_stopper(state) + and logic.terran_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "Flawless", + SC2WOL_LOC_ID_OFFSET + 1711, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_great_train_robbery_train_stopper(state) + and logic.terran_basic_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "2 Trains Destroyed", + SC2WOL_LOC_ID_OFFSET + 1712, + LocationType.EXTRA, + logic.terran_great_train_robbery_train_stopper, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "4 Trains Destroyed", + SC2WOL_LOC_ID_OFFSET + 1713, + LocationType.EXTRA, + lambda state: ( + logic.terran_great_train_robbery_train_stopper(state) + and logic.terran_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name, + "6 Trains Destroyed", + SC2WOL_LOC_ID_OFFSET + 1714, + LocationType.EXTRA, + lambda state: ( + logic.terran_great_train_robbery_train_stopper(state) + and logic.terran_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1800, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and (adv_tactics or logic.terran_moderate_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "Mira Han", + SC2WOL_LOC_ID_OFFSET + 1801, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "North Relic", + SC2WOL_LOC_ID_OFFSET + 1802, + LocationType.VANILLA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "Mid Relic", + SC2WOL_LOC_ID_OFFSET + 1803, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "Southwest Relic", + SC2WOL_LOC_ID_OFFSET + 1804, + LocationType.VANILLA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "North Command Center", + SC2WOL_LOC_ID_OFFSET + 1805, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "South Command Center", + SC2WOL_LOC_ID_OFFSET + 1806, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT.mission_name, + "West Command Center", + SC2WOL_LOC_ID_OFFSET + 1807, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 1900, + LocationType.VICTORY, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Odin", + SC2WOL_LOC_ID_OFFSET + 1901, + LocationType.EXTRA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Loki", + SC2WOL_LOC_ID_OFFSET + 1902, + LocationType.CHALLENGE, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Lab Devourer", + SC2WOL_LOC_ID_OFFSET + 1903, + LocationType.VANILLA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "North Devourer", + SC2WOL_LOC_ID_OFFSET + 1904, + LocationType.VANILLA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Southeast Devourer", + SC2WOL_LOC_ID_OFFSET + 1905, + LocationType.VANILLA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "West Base", + SC2WOL_LOC_ID_OFFSET + 1906, + LocationType.EXTRA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Northwest Base", + SC2WOL_LOC_ID_OFFSET + 1907, + LocationType.EXTRA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Northeast Base", + SC2WOL_LOC_ID_OFFSET + 1908, + LocationType.EXTRA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION.mission_name, + "Southeast Base", + SC2WOL_LOC_ID_OFFSET + 1909, + LocationType.EXTRA, + logic.terran_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2000, + LocationType.VICTORY, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Tower 1", + SC2WOL_LOC_ID_OFFSET + 2001, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Tower 2", + SC2WOL_LOC_ID_OFFSET + 2002, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Tower 3", + SC2WOL_LOC_ID_OFFSET + 2003, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Science Facility", + SC2WOL_LOC_ID_OFFSET + 2004, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_competent_comp(state), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "All Barracks", + SC2WOL_LOC_ID_OFFSET + 2005, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "All Factories", + SC2WOL_LOC_ID_OFFSET + 2006, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "All Starports", + SC2WOL_LOC_ID_OFFSET + 2007, + LocationType.EXTRA, + lambda state: adv_tactics or logic.terran_competent_comp(state), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Odin Not Trashed", + SC2WOL_LOC_ID_OFFSET + 2008, + LocationType.CHALLENGE, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ.mission_name, + "Surprise Attack Ends", + SC2WOL_LOC_ID_OFFSET + 2009, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2100, + LocationType.VICTORY, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Holding Cell Relic", + SC2WOL_LOC_ID_OFFSET + 2101, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Brutalisk Relic", + SC2WOL_LOC_ID_OFFSET + 2102, + LocationType.VANILLA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "First Escape Relic", + SC2WOL_LOC_ID_OFFSET + 2103, + LocationType.VANILLA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Second Escape Relic", + SC2WOL_LOC_ID_OFFSET + 2104, + LocationType.VANILLA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Brutalisk", + SC2WOL_LOC_ID_OFFSET + 2105, + LocationType.VANILLA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Fusion Reactor", + SC2WOL_LOC_ID_OFFSET + 2106, + LocationType.EXTRA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Entrance Holding Pen", + SC2WOL_LOC_ID_OFFSET + 2107, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Cargo Bay Warbot", + SC2WOL_LOC_ID_OFFSET + 2108, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PIERCING_OF_THE_SHROUD.mission_name, + "Escape Warbot", + SC2WOL_LOC_ID_OFFSET + 2109, + LocationType.EXTRA, + logic.marine_medic_upgrade, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2200, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "First Hatchery", + SC2WOL_LOC_ID_OFFSET + 2201, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "Second Hatchery", + SC2WOL_LOC_ID_OFFSET + 2202, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "Third Hatchery", + SC2WOL_LOC_ID_OFFSET + 2203, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "First Prophecy Fragment", + SC2WOL_LOC_ID_OFFSET + 2204, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "Second Prophecy Fragment", + SC2WOL_LOC_ID_OFFSET + 2205, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.WHISPERS_OF_DOOM.mission_name, + "Third Prophecy Fragment", + SC2WOL_LOC_ID_OFFSET + 2206, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2300, + LocationType.VICTORY, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Robotics Facility", + SC2WOL_LOC_ID_OFFSET + 2301, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Dark Shrine", + SC2WOL_LOC_ID_OFFSET + 2302, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Templar Archives", + SC2WOL_LOC_ID_OFFSET + 2303, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Northeast Base", + SC2WOL_LOC_ID_OFFSET + 2304, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Southwest Base", + SC2WOL_LOC_ID_OFFSET + 2305, + LocationType.CHALLENGE, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Maar", + SC2WOL_LOC_ID_OFFSET + 2306, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Northwest Preserver", + SC2WOL_LOC_ID_OFFSET + 2307, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "Southwest Preserver", + SC2WOL_LOC_ID_OFFSET + 2308, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN.mission_name, + "East Preserver", + SC2WOL_LOC_ID_OFFSET + 2309, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2400, + LocationType.VICTORY, + lambda state: ( + (adv_tactics and logic.protoss_static_defense(state)) + or ( + logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Close Obelisk", + SC2WOL_LOC_ID_OFFSET + 2401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "West Obelisk", + SC2WOL_LOC_ID_OFFSET + 2402, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Base", + SC2WOL_LOC_ID_OFFSET + 2403, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Southwest Tendril", + SC2WOL_LOC_ID_OFFSET + 2404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Southeast Tendril", + SC2WOL_LOC_ID_OFFSET + 2405, + LocationType.EXTRA, + lambda state: adv_tactics + and logic.protoss_static_defense(state) + or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Northeast Tendril", + SC2WOL_LOC_ID_OFFSET + 2406, + LocationType.EXTRA, + lambda state: adv_tactics + and logic.protoss_static_defense(state) + or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + "Northwest Tendril", + SC2WOL_LOC_ID_OFFSET + 2407, + LocationType.EXTRA, + lambda state: adv_tactics + and logic.protoss_static_defense(state) + or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Defeat", + SC2WOL_LOC_ID_OFFSET + 2500, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Protoss Archive", + SC2WOL_LOC_ID_OFFSET + 2501, + LocationType.VANILLA, + logic.protoss_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Kills", + SC2WOL_LOC_ID_OFFSET + 2502, + LocationType.VANILLA, + logic.protoss_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Urun", + SC2WOL_LOC_ID_OFFSET + 2503, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Mohandar", + SC2WOL_LOC_ID_OFFSET + 2504, + LocationType.EXTRA, + logic.protoss_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Selendis", + SC2WOL_LOC_ID_OFFSET + 2505, + LocationType.EXTRA, + logic.protoss_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS.mission_name, + "Artanis", + SC2WOL_LOC_ID_OFFSET + 2506, + LocationType.EXTRA, + logic.protoss_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2600, + LocationType.VICTORY, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Large Army", + SC2WOL_LOC_ID_OFFSET + 2601, + LocationType.VANILLA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "2 Drop Pods", + SC2WOL_LOC_ID_OFFSET + 2602, + LocationType.VANILLA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "4 Drop Pods", + SC2WOL_LOC_ID_OFFSET + 2603, + LocationType.VANILLA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "6 Drop Pods", + SC2WOL_LOC_ID_OFFSET + 2604, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "8 Drop Pods", + SC2WOL_LOC_ID_OFFSET + 2605, + LocationType.CHALLENGE, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Southwest Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2606, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Northwest Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2607, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Northeast Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2608, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "East Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2609, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Southeast Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2610, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL.mission_name, + "Expansion Spore Cannon", + SC2WOL_LOC_ID_OFFSET + 2611, + LocationType.EXTRA, + logic.terran_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2700, + LocationType.VICTORY, + lambda state: adv_tactics or logic.marine_medic_firebat_upgrade(state), + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "First Charge", + SC2WOL_LOC_ID_OFFSET + 2701, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "Second Charge", + SC2WOL_LOC_ID_OFFSET + 2702, + LocationType.EXTRA, + lambda state: adv_tactics or logic.marine_medic_firebat_upgrade(state), + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "Third Charge", + SC2WOL_LOC_ID_OFFSET + 2703, + LocationType.EXTRA, + lambda state: adv_tactics or logic.marine_medic_firebat_upgrade(state), + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "First Group Rescued", + SC2WOL_LOC_ID_OFFSET + 2704, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "Second Group Rescued", + SC2WOL_LOC_ID_OFFSET + 2705, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + "Third Group Rescued", + SC2WOL_LOC_ID_OFFSET + 2706, + LocationType.VANILLA, + lambda state: adv_tactics or logic.marine_medic_firebat_upgrade(state), + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2800, + LocationType.VICTORY, + lambda state: logic.terran_competent_comp(state, 2), + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Close Coolant Tower", + SC2WOL_LOC_ID_OFFSET + 2801, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Northwest Coolant Tower", + SC2WOL_LOC_ID_OFFSET + 2802, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Southeast Coolant Tower", + SC2WOL_LOC_ID_OFFSET + 2803, + LocationType.VANILLA, + lambda state: logic.terran_competent_comp(state, 2), + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Southwest Coolant Tower", + SC2WOL_LOC_ID_OFFSET + 2804, + LocationType.VANILLA, + lambda state: logic.terran_competent_comp(state, 2), + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Leviathan", + SC2WOL_LOC_ID_OFFSET + 2805, + LocationType.VANILLA, + lambda state: logic.terran_competent_comp(state, 2), + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "East Hatchery", + SC2WOL_LOC_ID_OFFSET + 2806, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "North Hatchery", + SC2WOL_LOC_ID_OFFSET + 2807, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY.mission_name, + "Mid Hatchery", + SC2WOL_LOC_ID_OFFSET + 2808, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "Victory", + SC2WOL_LOC_ID_OFFSET + 2900, + LocationType.VICTORY, + logic.terran_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "First Kerrigan Attack", + SC2WOL_LOC_ID_OFFSET + 2901, + LocationType.EXTRA, + logic.terran_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "Second Kerrigan Attack", + SC2WOL_LOC_ID_OFFSET + 2902, + LocationType.EXTRA, + logic.terran_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "Third Kerrigan Attack", + SC2WOL_LOC_ID_OFFSET + 2903, + LocationType.EXTRA, + logic.terran_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "Fourth Kerrigan Attack", + SC2WOL_LOC_ID_OFFSET + 2904, + LocationType.EXTRA, + logic.terran_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN.mission_name, + "Fifth Kerrigan Attack", + SC2WOL_LOC_ID_OFFSET + 2905, + LocationType.EXTRA, + logic.terran_all_in_requirement, + ), + # HotS + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 100, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Gather Minerals", + SC2HOTS_LOC_ID_OFFSET + 101, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "South Zergling Group", + SC2HOTS_LOC_ID_OFFSET + 102, + LocationType.VANILLA, + lambda state: adv_tactics + or ( + logic.zerg_common_unit(state) + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "East Zergling Group", + SC2HOTS_LOC_ID_OFFSET + 103, + LocationType.VANILLA, + lambda state: adv_tactics + or ( + logic.zerg_common_unit(state) + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "West Zergling Group", + SC2HOTS_LOC_ID_OFFSET + 104, + LocationType.VANILLA, + lambda state: adv_tactics + or ( + logic.zerg_common_unit(state) + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Hatchery", + SC2HOTS_LOC_ID_OFFSET + 105, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Overlord", + SC2HOTS_LOC_ID_OFFSET + 106, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Gas Turrets", + SC2HOTS_LOC_ID_OFFSET + 107, + LocationType.EXTRA, + lambda state: adv_tactics + or ( + logic.zerg_common_unit(state) + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + ), + make_location_data( + SC2Mission.LAB_RAT.mission_name, + "Win In Under 10 Minutes", + SC2HOTS_LOC_ID_OFFSET + 108, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_common_unit(state) + or state.has_any((item_names.ZERGLING, item_names.PYGALISK), player) + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 200, + LocationType.VICTORY, + lambda state: logic.basic_kerrigan(state) + or kerriganless, + hard_rule=logic.zerg_any_units_back_in_the_saddle_requirement, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Defend the Tram", + SC2HOTS_LOC_ID_OFFSET + 201, + LocationType.EXTRA, + lambda state: logic.basic_kerrigan(state) + or kerriganless, + hard_rule=logic.zerg_any_units_back_in_the_saddle_requirement, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Kinetic Blast", + SC2HOTS_LOC_ID_OFFSET + 202, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Crushing Grip", + SC2HOTS_LOC_ID_OFFSET + 203, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Reach the Sublevel", + SC2HOTS_LOC_ID_OFFSET + 204, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.BACK_IN_THE_SADDLE.mission_name, + "Door Section Cleared", + SC2HOTS_LOC_ID_OFFSET + 205, + LocationType.EXTRA, + lambda state: logic.basic_kerrigan(state) + or kerriganless, + hard_rule=logic.zerg_any_units_back_in_the_saddle_requirement, + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 300, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_basic_anti_air(state) + and logic.zerg_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Right Queen", + SC2HOTS_LOC_ID_OFFSET + 301, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_basic_anti_air(state) + and logic.zerg_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Center Queen", + SC2HOTS_LOC_ID_OFFSET + 302, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_basic_anti_air(state) + and logic.zerg_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Left Queen", + SC2HOTS_LOC_ID_OFFSET + 303, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_basic_anti_air(state) + and logic.zerg_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Hold Out Finished", + SC2HOTS_LOC_ID_OFFSET + 304, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_basic_anti_air(state) + and logic.zerg_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS.mission_name, + "Kill All Buildings Before Reinforcements", + SC2HOTS_LOC_ID_OFFSET + 305, + LocationType.MASTERY, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state) + and (logic.basic_kerrigan(state, False) or kerriganless) + and logic.zerg_defense_rating(state, False, False) >= 3 + and logic.zerg_power_rating(state) >= 5 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 400, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "First Ursadon Matriarch", + SC2HOTS_LOC_ID_OFFSET + 401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "North Ursadon Matriarch", + SC2HOTS_LOC_ID_OFFSET + 402, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "West Ursadon Matriarch", + SC2HOTS_LOC_ID_OFFSET + 403, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Lost Brood", + SC2HOTS_LOC_ID_OFFSET + 404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Northeast Psi-link Spire", + SC2HOTS_LOC_ID_OFFSET + 405, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Northwest Psi-link Spire", + SC2HOTS_LOC_ID_OFFSET + 406, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Southwest Psi-link Spire", + SC2HOTS_LOC_ID_OFFSET + 407, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "Nafash", + SC2HOTS_LOC_ID_OFFSET + 408, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS.mission_name, + "20 Unfrozen Structures", + SC2HOTS_LOC_ID_OFFSET + 409, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "East Stasis Chamber", + SC2HOTS_LOC_ID_OFFSET + 501, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Center Stasis Chamber", + SC2HOTS_LOC_ID_OFFSET + 502, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "West Stasis Chamber", + SC2HOTS_LOC_ID_OFFSET + 503, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Destroy 4 Shuttles", + SC2HOTS_LOC_ID_OFFSET + 504, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Frozen Expansion", + SC2HOTS_LOC_ID_OFFSET + 505, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Southwest Frozen Zerg", + SC2HOTS_LOC_ID_OFFSET + 506, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Southeast Frozen Zerg", + SC2HOTS_LOC_ID_OFFSET + 507, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "West Frozen Zerg", + SC2HOTS_LOC_ID_OFFSET + 508, + LocationType.EXTRA, + logic.zerg_common_unit_competent_aa, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "East Frozen Zerg", + SC2HOTS_LOC_ID_OFFSET + 509, + LocationType.EXTRA, + logic.zerg_common_unit_competent_aa, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "West Launch Bay", + SC2HOTS_LOC_ID_OFFSET + 510, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_any_anti_air, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "Center Launch Bay", + SC2HOTS_LOC_ID_OFFSET + 511, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_any_anti_air, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER.mission_name, + "East Launch Bay", + SC2HOTS_LOC_ID_OFFSET + 512, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_any_anti_air, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 600, + LocationType.VICTORY, + lambda state: ( + logic.zerg_pass_vents(state) + and ( + logic.grant_story_tech == GrantStoryTech.option_grant + or state.has_any( + { + item_names.ZERGLING_RAPTOR_STRAIN, + item_names.ROACH, + item_names.HYDRALISK, + item_names.INFESTOR, + }, + player, + ) + ) + ), + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Infest Giant Ursadon", + SC2HOTS_LOC_ID_OFFSET + 601, + LocationType.VANILLA, + logic.zerg_pass_vents, + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "First Niadra Evolution", + SC2HOTS_LOC_ID_OFFSET + 602, + LocationType.VANILLA, + logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Second Niadra Evolution", + SC2HOTS_LOC_ID_OFFSET + 603, + LocationType.VANILLA, + logic.zerg_pass_vents, + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Third Niadra Evolution", + SC2HOTS_LOC_ID_OFFSET + 604, + LocationType.VANILLA, + logic.zerg_pass_vents, + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Warp Drive", + SC2HOTS_LOC_ID_OFFSET + 605, + LocationType.EXTRA, + logic.zerg_pass_vents, + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.ENEMY_WITHIN.mission_name, + "Stasis Quadrant", + SC2HOTS_LOC_ID_OFFSET + 606, + LocationType.EXTRA, + logic.zerg_pass_vents, + hard_rule=logic.zerg_pass_vents, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 700, + LocationType.VICTORY, + logic.zerg_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Center Infested Command Center", + SC2HOTS_LOC_ID_OFFSET + 701, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "North Infested Command Center", + SC2HOTS_LOC_ID_OFFSET + 702, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Repel Zagara", + SC2HOTS_LOC_ID_OFFSET + 703, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Close Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "South Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 705, + LocationType.EXTRA, + lambda state: adv_tactics or logic.zerg_common_unit(state), + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Southwest Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 706, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Southeast Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 707, + LocationType.EXTRA, + logic.zerg_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "North Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 708, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Northeast Baneling Nest", + SC2HOTS_LOC_ID_OFFSET + 709, + LocationType.EXTRA, + logic.zerg_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DOMINATION.mission_name, + "Win Without 100 Eggs", + SC2HOTS_LOC_ID_OFFSET + 710, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 800, + LocationType.VICTORY, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "West Biomass", + SC2HOTS_LOC_ID_OFFSET + 801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "North Biomass", + SC2HOTS_LOC_ID_OFFSET + 802, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "South Biomass", + SC2HOTS_LOC_ID_OFFSET + 803, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "Destroy 3 Gorgons", + SC2HOTS_LOC_ID_OFFSET + 804, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "Close Zerg Rescue", + SC2HOTS_LOC_ID_OFFSET + 805, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "South Zerg Rescue", + SC2HOTS_LOC_ID_OFFSET + 806, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "North Zerg Rescue", + SC2HOTS_LOC_ID_OFFSET + 807, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "West Queen Rescue", + SC2HOTS_LOC_ID_OFFSET + 808, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "East Queen Rescue", + SC2HOTS_LOC_ID_OFFSET + 809, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "South Orbital Command Center", + SC2HOTS_LOC_ID_OFFSET + 810, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_competent_comp(state) and logic.zerg_moderate_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "Northwest Orbital Command Center", + SC2HOTS_LOC_ID_OFFSET + 811, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_competent_comp(state) and logic.zerg_moderate_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY.mission_name, + "Southeast Orbital Command Center", + SC2HOTS_LOC_ID_OFFSET + 812, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_competent_comp(state) and logic.zerg_moderate_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 900, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "East Science Lab", + SC2HOTS_LOC_ID_OFFSET + 901, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "North Science Lab", + SC2HOTS_LOC_ID_OFFSET + 902, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "Get Nuked", + SC2HOTS_LOC_ID_OFFSET + 903, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "Entrance Gate", + SC2HOTS_LOC_ID_OFFSET + 904, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "Citadel Gate", + SC2HOTS_LOC_ID_OFFSET + 905, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "South Expansion", + SC2HOTS_LOC_ID_OFFSET + 906, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS.mission_name, + "Rich Mineral Expansion", + SC2HOTS_LOC_ID_OFFSET + 907, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1000, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "Center Essence Pool", + SC2HOTS_LOC_ID_OFFSET + 1001, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "East Essence Pool", + SC2HOTS_LOC_ID_OFFSET + 1002, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + adv_tactics + and logic.zerg_basic_anti_air(state) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "South Essence Pool", + SC2HOTS_LOC_ID_OFFSET + 1003, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + adv_tactics + and logic.zerg_basic_anti_air(state) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "Finish Feeding", + SC2HOTS_LOC_ID_OFFSET + 1004, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "South Proxy Primal Hive", + SC2HOTS_LOC_ID_OFFSET + 1005, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "East Proxy Primal Hive", + SC2HOTS_LOC_ID_OFFSET + 1006, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "South Main Primal Hive", + SC2HOTS_LOC_ID_OFFSET + 1007, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "East Main Primal Hive", + SC2HOTS_LOC_ID_OFFSET + 1008, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT.mission_name, + "Flawless", + SC2HOTS_LOC_ID_OFFSET + 1009, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.PREVENTATIVE, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1100, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "Tyrannozor", + SC2HOTS_LOC_ID_OFFSET + 1101, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "Reach the Pool", + SC2HOTS_LOC_ID_OFFSET + 1102, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "15 Minutes Remaining", + SC2HOTS_LOC_ID_OFFSET + 1103, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "5 Minutes Remaining", + SC2HOTS_LOC_ID_OFFSET + 1104, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "Pincer Attack", + SC2HOTS_LOC_ID_OFFSET + 1105, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE.mission_name, + "Yagdra Claims Brakk's Pack", + SC2HOTS_LOC_ID_OFFSET + 1106, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 7 + and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1200, + LocationType.VICTORY, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "First Relic", + SC2HOTS_LOC_ID_OFFSET + 1201, + LocationType.VANILLA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Second Relic", + SC2HOTS_LOC_ID_OFFSET + 1202, + LocationType.VANILLA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Third Relic", + SC2HOTS_LOC_ID_OFFSET + 1203, + LocationType.VANILLA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Fourth Relic", + SC2HOTS_LOC_ID_OFFSET + 1204, + LocationType.VANILLA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Yagdra", + SC2HOTS_LOC_ID_OFFSET + 1205, + LocationType.EXTRA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Kraith", + SC2HOTS_LOC_ID_OFFSET + 1206, + LocationType.EXTRA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.SUPREME.mission_name, + "Slivan", + SC2HOTS_LOC_ID_OFFSET + 1207, + LocationType.EXTRA, + logic.supreme_requirement, + hard_rule=logic.supreme_requirement, + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1300, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and ( + ( + logic.zerg_competent_anti_air(state) + and state.has(item_names.INFESTOR, player) + ) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "East Science Facility", + SC2HOTS_LOC_ID_OFFSET + 1301, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Center Science Facility", + SC2HOTS_LOC_ID_OFFSET + 1302, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "West Science Facility", + SC2HOTS_LOC_ID_OFFSET + 1303, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "First Intro Garrison", + SC2HOTS_LOC_ID_OFFSET + 1304, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Second Intro Garrison", + SC2HOTS_LOC_ID_OFFSET + 1305, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Base Garrison", + SC2HOTS_LOC_ID_OFFSET + 1306, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "East Garrison", + SC2HOTS_LOC_ID_OFFSET + 1307, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and (adv_tactics or state.has(item_names.INFESTOR, player)) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Mid Garrison", + SC2HOTS_LOC_ID_OFFSET + 1308, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and (adv_tactics or state.has(item_names.INFESTOR, player)) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "North Garrison", + SC2HOTS_LOC_ID_OFFSET + 1309, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and (adv_tactics or state.has(item_names.INFESTOR, player)) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Close Southwest Garrison", + SC2HOTS_LOC_ID_OFFSET + 1310, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and (adv_tactics or state.has(item_names.INFESTOR, player)) + ), + ), + make_location_data( + SC2Mission.INFESTED.mission_name, + "Far Southwest Garrison", + SC2HOTS_LOC_ID_OFFSET + 1311, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_moderate_anti_air(state) + and (adv_tactics or state.has(item_names.INFESTOR, player)) + ), + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1400, + LocationType.VICTORY, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "North Brutalisk", + SC2HOTS_LOC_ID_OFFSET + 1401, + LocationType.VANILLA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "South Brutalisk", + SC2HOTS_LOC_ID_OFFSET + 1402, + LocationType.VANILLA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 1 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1403, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 2 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1404, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 3 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1405, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 4 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1406, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 5 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1407, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 6 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1408, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS.mission_name, + "Kill 7 Hybrid", + SC2HOTS_LOC_ID_OFFSET + 1409, + LocationType.EXTRA, + logic.zerg_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Northwest Crystal", + SC2HOTS_LOC_ID_OFFSET + 1501, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Northeast Crystal", + SC2HOTS_LOC_ID_OFFSET + 1502, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "South Crystal", + SC2HOTS_LOC_ID_OFFSET + 1503, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Base Established", + SC2HOTS_LOC_ID_OFFSET + 1504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Close Temple", + SC2HOTS_LOC_ID_OFFSET + 1505, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Mid Temple", + SC2HOTS_LOC_ID_OFFSET + 1506, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Southeast Temple", + SC2HOTS_LOC_ID_OFFSET + 1507, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Northeast Temple", + SC2HOTS_LOC_ID_OFFSET + 1508, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID.mission_name, + "Northwest Temple", + SC2HOTS_LOC_ID_OFFSET + 1509, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_moderate_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1600, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name, + "Pirate Capital Ship", + SC2HOTS_LOC_ID_OFFSET + 1601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name, + "First Mineral Patch", + SC2HOTS_LOC_ID_OFFSET + 1602, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name, + "Second Mineral Patch", + SC2HOTS_LOC_ID_OFFSET + 1603, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name, + "Third Mineral Patch", + SC2HOTS_LOC_ID_OFFSET + 1604, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.CONVICTION.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1700, + LocationType.VICTORY, + lambda state: ( + kerriganless + or ( + logic.two_kerrigan_actives(state) + and logic.basic_kerrigan(state) + and logic.kerrigan_levels(state, 25) + ) + ), + ), + make_location_data( + SC2Mission.CONVICTION.mission_name, + "First Secret Documents", + SC2HOTS_LOC_ID_OFFSET + 1701, + LocationType.VANILLA, + lambda state: ( + logic.two_kerrigan_actives(state) and logic.kerrigan_levels(state, 25) + ) + or kerriganless, + ), + make_location_data( + SC2Mission.CONVICTION.mission_name, + "Second Secret Documents", + SC2HOTS_LOC_ID_OFFSET + 1702, + LocationType.VANILLA, + lambda state: ( + kerriganless + or ( + logic.two_kerrigan_actives(state) + and logic.basic_kerrigan(state) + and logic.kerrigan_levels(state, 25) + ) + ), + ), + make_location_data( + SC2Mission.CONVICTION.mission_name, + "Power Coupling", + SC2HOTS_LOC_ID_OFFSET + 1703, + LocationType.EXTRA, + lambda state: ( + logic.two_kerrigan_actives(state) and logic.kerrigan_levels(state, 25) + ) + or kerriganless, + ), + make_location_data( + SC2Mission.CONVICTION.mission_name, + "Door Blasted", + SC2HOTS_LOC_ID_OFFSET + 1704, + LocationType.EXTRA, + lambda state: ( + logic.two_kerrigan_actives(state) and logic.kerrigan_levels(state, 25) + ) + or kerriganless, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1800, + LocationType.VICTORY, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "East Gate", + SC2HOTS_LOC_ID_OFFSET + 1801, + LocationType.VANILLA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "Northwest Gate", + SC2HOTS_LOC_ID_OFFSET + 1802, + LocationType.VANILLA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "North Gate", + SC2HOTS_LOC_ID_OFFSET + 1803, + LocationType.VANILLA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "1 Bile Launcher Deployed", + SC2HOTS_LOC_ID_OFFSET + 1804, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "2 Bile Launchers Deployed", + SC2HOTS_LOC_ID_OFFSET + 1805, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "3 Bile Launchers Deployed", + SC2HOTS_LOC_ID_OFFSET + 1806, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "4 Bile Launchers Deployed", + SC2HOTS_LOC_ID_OFFSET + 1807, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "5 Bile Launchers Deployed", + SC2HOTS_LOC_ID_OFFSET + 1808, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "Sons of Korhal", + SC2HOTS_LOC_ID_OFFSET + 1809, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "Night Wolves", + SC2HOTS_LOC_ID_OFFSET + 1810, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "West Expansion", + SC2HOTS_LOC_ID_OFFSET + 1811, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL.mission_name, + "Mid Expansion", + SC2HOTS_LOC_ID_OFFSET + 1812, + LocationType.EXTRA, + logic.zerg_planetfall_requirement, + hard_rule=logic.zerg_kerrigan_or_any_anti_air, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 1900, + LocationType.VICTORY, + lambda state: logic.zerg_competent_comp_competent_aa(state) + and (adv_tactics or logic.zerg_base_buster(state)), + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "First Power Link", + SC2HOTS_LOC_ID_OFFSET + 1901, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "Second Power Link", + SC2HOTS_LOC_ID_OFFSET + 1902, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "Third Power Link", + SC2HOTS_LOC_ID_OFFSET + 1903, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "Expansion Command Center", + SC2HOTS_LOC_ID_OFFSET + 1904, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE.mission_name, + "Main Path Command Center", + SC2HOTS_LOC_ID_OFFSET + 1905, + LocationType.EXTRA, + lambda state: logic.zerg_competent_comp_competent_aa(state) + and (adv_tactics or logic.zerg_base_buster(state)), + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "Victory", + SC2HOTS_LOC_ID_OFFSET + 2000, + LocationType.VICTORY, + logic.zerg_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "South Lane", + SC2HOTS_LOC_ID_OFFSET + 2001, + LocationType.VANILLA, + logic.zerg_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "North Lane", + SC2HOTS_LOC_ID_OFFSET + 2002, + LocationType.VANILLA, + logic.zerg_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "East Lane", + SC2HOTS_LOC_ID_OFFSET + 2003, + LocationType.VANILLA, + logic.zerg_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "Odin", + SC2HOTS_LOC_ID_OFFSET + 2004, + LocationType.EXTRA, + logic.zerg_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING.mission_name, + "Trash the Odin Early", + SC2HOTS_LOC_ID_OFFSET + 2005, + LocationType.MASTERY, + lambda state: ( + logic.zerg_the_reckoning_requirement(state) + and ( + kerriganless + or ( + logic.kerrigan_levels(state, 50, False) + and state.has_any(kerrigan_logic_ultimates, player) + ) + ) + and logic.zerg_power_rating(state) >= 10 + ), + flags=LocationFlag.SPEEDRUN, + ), + # LotV Prologue + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 100, + LocationType.VICTORY, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "First Prisoner Group", + SC2LOTV_LOC_ID_OFFSET + 101, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "Second Prisoner Group", + SC2LOTV_LOC_ID_OFFSET + 102, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "First Pylon", + SC2LOTV_LOC_ID_OFFSET + 103, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "Second Pylon", + SC2LOTV_LOC_ID_OFFSET + 104, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.DARK_WHISPERS.mission_name, + "Zerg Base", + SC2LOTV_LOC_ID_OFFSET + 105, + LocationType.MASTERY, + lambda state: logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 200, + LocationType.VICTORY, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_mineral_dump(state), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG.mission_name, + "South Rock Formation", + SC2LOTV_LOC_ID_OFFSET + 201, + LocationType.VANILLA, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_mineral_dump(state), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG.mission_name, + "West Rock Formation", + SC2LOTV_LOC_ID_OFFSET + 202, + LocationType.VANILLA, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_mineral_dump(state), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG.mission_name, + "East Rock Formation", + SC2LOTV_LOC_ID_OFFSET + 203, + LocationType.VANILLA, + lambda state: ( + logic.protoss_competent_comp(state) + and logic.protoss_mineral_dump(state) + and logic.protoss_can_attack_behind_chasm(state) + ), + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 300, + LocationType.VICTORY, + lambda state: adv_tactics + or state.has_any(( + item_names.STALKER_PHASE_REACTOR, + item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, + item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION, + ), player), + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "Temple Investigated", + SC2LOTV_LOC_ID_OFFSET + 301, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "Void Catalyst", + SC2LOTV_LOC_ID_OFFSET + 302, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "First Particle Cannon", + SC2LOTV_LOC_ID_OFFSET + 303, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "Second Particle Cannon", + SC2LOTV_LOC_ID_OFFSET + 304, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.EVIL_AWOKEN.mission_name, + "Third Particle Cannon", + SC2LOTV_LOC_ID_OFFSET + 305, + LocationType.VANILLA, + ), + # LotV + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 400, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Southwest Hive", + SC2LOTV_LOC_ID_OFFSET + 401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Northwest Hive", + SC2LOTV_LOC_ID_OFFSET + 402, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Northeast Hive", + SC2LOTV_LOC_ID_OFFSET + 403, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "East Hive", + SC2LOTV_LOC_ID_OFFSET + 404, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "West Conduit", + SC2LOTV_LOC_ID_OFFSET + 405, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Middle Conduit", + SC2LOTV_LOC_ID_OFFSET + 406, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.FOR_AIUR.mission_name, + "Northeast Conduit", + SC2LOTV_LOC_ID_OFFSET + 407, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 500, + LocationType.VICTORY, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_moderate_anti_air(state)), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "Close Pylon", + SC2LOTV_LOC_ID_OFFSET + 501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "East Pylon", + SC2LOTV_LOC_ID_OFFSET + 502, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_moderate_anti_air(state)), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "West Pylon", + SC2LOTV_LOC_ID_OFFSET + 503, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_moderate_anti_air(state)), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "Nexus", + SC2LOTV_LOC_ID_OFFSET + 504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW.mission_name, + "Templar Base", + SC2LOTV_LOC_ID_OFFSET + 505, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_moderate_anti_air(state)), + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 600, + LocationType.VICTORY, + logic.protoss_spear_of_adun_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "Close Warp Gate", + SC2LOTV_LOC_ID_OFFSET + 601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "West Warp Gate", + SC2LOTV_LOC_ID_OFFSET + 602, + LocationType.VANILLA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "North Warp Gate", + SC2LOTV_LOC_ID_OFFSET + 603, + LocationType.VANILLA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "North Power Cell", + SC2LOTV_LOC_ID_OFFSET + 604, + LocationType.EXTRA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "East Power Cell", + SC2LOTV_LOC_ID_OFFSET + 605, + LocationType.EXTRA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "South Power Cell", + SC2LOTV_LOC_ID_OFFSET + 606, + LocationType.EXTRA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + "Southeast Power Cell", + SC2LOTV_LOC_ID_OFFSET + 607, + LocationType.EXTRA, + logic.protoss_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 700, + LocationType.VICTORY, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Mid EMP Scrambler", + SC2LOTV_LOC_ID_OFFSET + 701, + LocationType.VANILLA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Southeast EMP Scrambler", + SC2LOTV_LOC_ID_OFFSET + 702, + LocationType.VANILLA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "North EMP Scrambler", + SC2LOTV_LOC_ID_OFFSET + 703, + LocationType.VANILLA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Mid Stabilizer", + SC2LOTV_LOC_ID_OFFSET + 704, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Southwest Stabilizer", + SC2LOTV_LOC_ID_OFFSET + 705, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Northwest Stabilizer", + SC2LOTV_LOC_ID_OFFSET + 706, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Northeast Stabilizer", + SC2LOTV_LOC_ID_OFFSET + 707, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "Southeast Stabilizer", + SC2LOTV_LOC_ID_OFFSET + 708, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "West Raynor Base", + SC2LOTV_LOC_ID_OFFSET + 709, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD.mission_name, + "East Raynor Base", + SC2LOTV_LOC_ID_OFFSET + 710, + LocationType.EXTRA, + logic.protoss_sky_shield_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 800, + LocationType.VICTORY, + logic.protoss_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "Mid Science Facility", + SC2LOTV_LOC_ID_OFFSET + 801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "North Science Facility", + SC2LOTV_LOC_ID_OFFSET + 802, + LocationType.VANILLA, + lambda state: ( + logic.protoss_brothers_in_arms_requirement(state) + or ( + logic.take_over_ai_allies + and logic.advanced_tactics + and ( + logic.terran_common_unit(state) + or logic.protoss_common_unit(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "South Science Facility", + SC2LOTV_LOC_ID_OFFSET + 803, + LocationType.VANILLA, + logic.protoss_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "Raynor Forward Positions", + SC2LOTV_LOC_ID_OFFSET + 804, + LocationType.EXTRA, + logic.protoss_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "Valerian Forward Positions", + SC2LOTV_LOC_ID_OFFSET + 805, + LocationType.EXTRA, + logic.protoss_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS.mission_name, + "Win in under 15 minutes", + SC2LOTV_LOC_ID_OFFSET + 806, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_brothers_in_arms_requirement(state) + and logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 8 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 900, + LocationType.VICTORY, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "Close Solarite Reserve", + SC2LOTV_LOC_ID_OFFSET + 901, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "North Solarite Reserve", + SC2LOTV_LOC_ID_OFFSET + 902, + LocationType.VANILLA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "East Solarite Reserve", + SC2LOTV_LOC_ID_OFFSET + 903, + LocationType.VANILLA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "West Launch Bay", + SC2LOTV_LOC_ID_OFFSET + 904, + LocationType.EXTRA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "South Launch Bay", + SC2LOTV_LOC_ID_OFFSET + 905, + LocationType.EXTRA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "Northwest Launch Bay", + SC2LOTV_LOC_ID_OFFSET + 906, + LocationType.EXTRA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.AMON_S_REACH.mission_name, + "East Launch Bay", + SC2LOTV_LOC_ID_OFFSET + 907, + LocationType.EXTRA, + logic.protoss_common_unit_anti_light_air, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1000, + LocationType.VICTORY, + logic.protoss_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "West Zenith Stone", + SC2LOTV_LOC_ID_OFFSET + 1001, + LocationType.VANILLA, + logic.protoss_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "North Zenith Stone", + SC2LOTV_LOC_ID_OFFSET + 1002, + LocationType.VANILLA, + logic.protoss_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "East Zenith Stone", + SC2LOTV_LOC_ID_OFFSET + 1003, + LocationType.VANILLA, + logic.protoss_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "1 Billion Zerg", + SC2LOTV_LOC_ID_OFFSET + 1004, + LocationType.EXTRA, + logic.protoss_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND.mission_name, + "1.5 Billion Zerg", + SC2LOTV_LOC_ID_OFFSET + 1005, + LocationType.VANILLA, + lambda state: ( + logic.protoss_last_stand_requirement(state) + and ( + state.has_all( + { + item_names.KHAYDARIN_MONOLITH, + item_names.PHOTON_CANNON, + item_names.SHIELD_BATTERY, + }, + player, + ) + or state.has_any( + {item_names.SOA_SOLAR_LANCE, item_names.SOA_DEPLOY_FENIX}, + player, + ) + ) + and logic.protoss_defense_rating(state, False) >= 13 + ), + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1100, + LocationType.VICTORY, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "South Solarite", + SC2LOTV_LOC_ID_OFFSET + 1101, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "North Solarite", + SC2LOTV_LOC_ID_OFFSET + 1102, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "Northwest Solarite", + SC2LOTV_LOC_ID_OFFSET + 1103, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "Rescue Sentries", + SC2LOTV_LOC_ID_OFFSET + 1104, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON.mission_name, + "Destroy Gateways", + SC2LOTV_LOC_ID_OFFSET + 1105, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1200, + LocationType.VICTORY, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "Mid Celestial Lock", + SC2LOTV_LOC_ID_OFFSET + 1201, + LocationType.EXTRA, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "West Celestial Lock", + SC2LOTV_LOC_ID_OFFSET + 1202, + LocationType.EXTRA, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "South Celestial Lock", + SC2LOTV_LOC_ID_OFFSET + 1203, + LocationType.EXTRA, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "East Celestial Lock", + SC2LOTV_LOC_ID_OFFSET + 1204, + LocationType.EXTRA, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "North Celestial Lock", + SC2LOTV_LOC_ID_OFFSET + 1205, + LocationType.EXTRA, + logic.protoss_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "Titanic Warp Prism", + SC2LOTV_LOC_ID_OFFSET + 1206, + LocationType.VANILLA, + logic.protoss_temple_of_unification_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "Terran Main Base", + SC2LOTV_LOC_ID_OFFSET + 1207, + LocationType.MASTERY, + lambda state: logic.protoss_temple_of_unification_requirement(state) + and logic.protoss_deathball(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION.mission_name, + "Protoss Main Base", + SC2LOTV_LOC_ID_OFFSET + 1208, + LocationType.MASTERY, + lambda state: logic.protoss_temple_of_unification_requirement(state) + and logic.protoss_deathball(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1300, + LocationType.VICTORY, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "First Hall of Revelation", + SC2LOTV_LOC_ID_OFFSET + 1301, + LocationType.EXTRA, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "Second Hall of Revelation", + SC2LOTV_LOC_ID_OFFSET + 1302, + LocationType.EXTRA, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "First Xel'Naga Device", + SC2LOTV_LOC_ID_OFFSET + 1303, + LocationType.VANILLA, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "Second Xel'Naga Device", + SC2LOTV_LOC_ID_OFFSET + 1304, + LocationType.VANILLA, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.THE_INFINITE_CYCLE.mission_name, + "Third Xel'Naga Device", + SC2LOTV_LOC_ID_OFFSET + 1305, + LocationType.VANILLA, + logic.the_infinite_cycle_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1400, + LocationType.VICTORY, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Artanis", + SC2LOTV_LOC_ID_OFFSET + 1401, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Northwest Void Crystal", + SC2LOTV_LOC_ID_OFFSET + 1402, + LocationType.EXTRA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Northeast Void Crystal", + SC2LOTV_LOC_ID_OFFSET + 1403, + LocationType.EXTRA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Southwest Void Crystal", + SC2LOTV_LOC_ID_OFFSET + 1404, + LocationType.EXTRA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Southeast Void Crystal", + SC2LOTV_LOC_ID_OFFSET + 1405, + LocationType.EXTRA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "South Xel'Naga Vessel", + SC2LOTV_LOC_ID_OFFSET + 1406, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "Mid Xel'Naga Vessel", + SC2LOTV_LOC_ID_OFFSET + 1407, + LocationType.VANILLA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION.mission_name, + "North Xel'Naga Vessel", + SC2LOTV_LOC_ID_OFFSET + 1408, + LocationType.VANILLA, + logic.protoss_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1500, + LocationType.VICTORY, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "Zerg Cleared", + SC2LOTV_LOC_ID_OFFSET + 1501, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "First Stasis Lock", + SC2LOTV_LOC_ID_OFFSET + 1502, + LocationType.EXTRA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "Second Stasis Lock", + SC2LOTV_LOC_ID_OFFSET + 1503, + LocationType.EXTRA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "Third Stasis Lock", + SC2LOTV_LOC_ID_OFFSET + 1504, + LocationType.EXTRA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "Fourth Stasis Lock", + SC2LOTV_LOC_ID_OFFSET + 1505, + LocationType.EXTRA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "South Power Core", + SC2LOTV_LOC_ID_OFFSET + 1506, + LocationType.VANILLA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + and (adv_tactics or logic.protoss_unsealing_the_past_ledge_requirement(state)) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST.mission_name, + "East Power Core", + SC2LOTV_LOC_ID_OFFSET + 1507, + LocationType.VANILLA, + lambda state: ( + logic.protoss_deathball(state) + and logic.protoss_power_rating(state) >= 6 + and (adv_tactics or logic.protoss_unsealing_the_past_ledge_requirement(state)) + ), + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1600, + LocationType.VICTORY, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "North Sector: West Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1601, + LocationType.VANILLA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "North Sector: Northeast Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1602, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "North Sector: Southeast Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1603, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "South Sector: West Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1604, + LocationType.VANILLA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "South Sector: North Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1605, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "South Sector: East Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1606, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "West Sector: West Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1607, + LocationType.VANILLA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "West Sector: Mid Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1608, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "West Sector: East Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1609, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "East Sector: North Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1610, + LocationType.VANILLA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "East Sector: West Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1611, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "East Sector: South Null Circuit", + SC2LOTV_LOC_ID_OFFSET + 1612, + LocationType.EXTRA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.PURIFICATION.mission_name, + "Purifier Warden", + SC2LOTV_LOC_ID_OFFSET + 1613, + LocationType.VANILLA, + logic.protoss_deathball, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1700, + LocationType.VICTORY, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "First Terrazine Fog", + SC2LOTV_LOC_ID_OFFSET + 1701, + LocationType.EXTRA, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "Southwest Guardian", + SC2LOTV_LOC_ID_OFFSET + 1702, + LocationType.EXTRA, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "West Guardian", + SC2LOTV_LOC_ID_OFFSET + 1703, + LocationType.EXTRA, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "Northwest Guardian", + SC2LOTV_LOC_ID_OFFSET + 1704, + LocationType.EXTRA, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "Northeast Guardian", + SC2LOTV_LOC_ID_OFFSET + 1705, + LocationType.EXTRA, + logic.protoss_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "North Mothership", + SC2LOTV_LOC_ID_OFFSET + 1706, + LocationType.VANILLA, + logic.protoss_steps_of_the_rite_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE.mission_name, + "South Mothership", + SC2LOTV_LOC_ID_OFFSET + 1707, + LocationType.VANILLA, + logic.protoss_steps_of_the_rite_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1800, + LocationType.VICTORY, + logic.protoss_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "North Slayn Elemental", + SC2LOTV_LOC_ID_OFFSET + 1801, + LocationType.VANILLA, + logic.protoss_rak_shir_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "Southwest Slayn Elemental", + SC2LOTV_LOC_ID_OFFSET + 1802, + LocationType.VANILLA, + logic.protoss_rak_shir_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "East Slayn Elemental", + SC2LOTV_LOC_ID_OFFSET + 1803, + LocationType.VANILLA, + logic.protoss_rak_shir_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "Resource Pickups", + SC2LOTV_LOC_ID_OFFSET + 1804, + LocationType.EXTRA, + logic.protoss_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "Destroy Nexuses", + SC2LOTV_LOC_ID_OFFSET + 1805, + LocationType.CHALLENGE, + logic.protoss_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR.mission_name, + "Win in under 15 minutes", + SC2LOTV_LOC_ID_OFFSET + 1806, + LocationType.MASTERY, + logic.protoss_rak_shir_requirement, + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 1900, + LocationType.VICTORY, + logic.protoss_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "Northwest Power Core", + SC2LOTV_LOC_ID_OFFSET + 1901, + LocationType.EXTRA, + logic.protoss_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "Northeast Power Core", + SC2LOTV_LOC_ID_OFFSET + 1902, + LocationType.EXTRA, + logic.protoss_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "Southeast Power Core", + SC2LOTV_LOC_ID_OFFSET + 1903, + LocationType.EXTRA, + logic.protoss_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "West Hybrid Stasis Chamber", + SC2LOTV_LOC_ID_OFFSET + 1904, + LocationType.VANILLA, + logic.protoss_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE.mission_name, + "Southeast Hybrid Stasis Chamber", + SC2LOTV_LOC_ID_OFFSET + 1905, + LocationType.VANILLA, + logic.protoss_fleet, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2000, + LocationType.VICTORY, + logic.templars_return_phase_3_reach_dts_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Citadel: First Gate", + SC2LOTV_LOC_ID_OFFSET + 2001, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Citadel: Second Gate", + SC2LOTV_LOC_ID_OFFSET + 2002, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Citadel: Power Structure", + SC2LOTV_LOC_ID_OFFSET + 2003, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Temple Grounds: Gather Army", + SC2LOTV_LOC_ID_OFFSET + 2004, + LocationType.VANILLA, + logic.templars_return_phase_2_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Temple Grounds: Power Structure", + SC2LOTV_LOC_ID_OFFSET + 2005, + LocationType.VANILLA, + logic.templars_return_phase_2_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Caverns: Purifier", + SC2LOTV_LOC_ID_OFFSET + 2006, + LocationType.EXTRA, + logic.templars_return_phase_3_reach_colossus_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_RETURN.mission_name, + "Caverns: Dark Templar", + SC2LOTV_LOC_ID_OFFSET + 2007, + LocationType.EXTRA, + logic.templars_return_phase_3_reach_dts_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2100, + LocationType.VICTORY, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Southeast Void Shard", + SC2LOTV_LOC_ID_OFFSET + 2101, + LocationType.EXTRA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "South Void Shard", + SC2LOTV_LOC_ID_OFFSET + 2102, + LocationType.EXTRA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Southwest Void Shard", + SC2LOTV_LOC_ID_OFFSET + 2103, + LocationType.EXTRA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "North Void Shard", + SC2LOTV_LOC_ID_OFFSET + 2104, + LocationType.EXTRA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Northwest Void Shard", + SC2LOTV_LOC_ID_OFFSET + 2105, + LocationType.EXTRA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Nerazim Warp in Zone", + SC2LOTV_LOC_ID_OFFSET + 2106, + LocationType.VANILLA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Tal'darim Warp in Zone", + SC2LOTV_LOC_ID_OFFSET + 2107, + LocationType.VANILLA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST.mission_name, + "Purifier Warp in Zone", + SC2LOTV_LOC_ID_OFFSET + 2108, + LocationType.VANILLA, + logic.protoss_the_host_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2200, + LocationType.VICTORY, + logic.protoss_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Fabrication Matrix", + SC2LOTV_LOC_ID_OFFSET + 2201, + LocationType.EXTRA, + logic.protoss_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Assault Cluster", + SC2LOTV_LOC_ID_OFFSET + 2202, + LocationType.EXTRA, + logic.protoss_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Hull Breach", + SC2LOTV_LOC_ID_OFFSET + 2203, + LocationType.EXTRA, + logic.protoss_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Core Critical", + SC2LOTV_LOC_ID_OFFSET + 2204, + LocationType.EXTRA, + logic.protoss_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION.mission_name, + "Kill Brutalisk", + SC2LOTV_LOC_ID_OFFSET + 2205, + LocationType.MASTERY, + logic.protoss_salvation_requirement, + ), + # Epilogue + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2300, + LocationType.VICTORY, + logic.into_the_void_requirement, + ), + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Corruption Source", + SC2LOTV_LOC_ID_OFFSET + 2301, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Southwest Forward Position", + SC2LOTV_LOC_ID_OFFSET + 2302, + LocationType.VANILLA, + logic.into_the_void_requirement, + ), + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Northwest Forward Position", + SC2LOTV_LOC_ID_OFFSET + 2303, + LocationType.VANILLA, + logic.into_the_void_requirement, + ), + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Southeast Forward Position", + SC2LOTV_LOC_ID_OFFSET + 2304, + LocationType.VANILLA, + logic.into_the_void_requirement, + ), + make_location_data( + SC2Mission.INTO_THE_VOID.mission_name, + "Northeast Forward Position", + SC2LOTV_LOC_ID_OFFSET + 2305, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2400, + LocationType.VICTORY, + logic.essence_of_eternity_requirement, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Initial Void Thrashers", + SC2LOTV_LOC_ID_OFFSET + 2401, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Void Thrasher Wave 1", + SC2LOTV_LOC_ID_OFFSET + 2402, + LocationType.EXTRA, + logic.essence_of_eternity_requirement, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Void Thrasher Wave 2", + SC2LOTV_LOC_ID_OFFSET + 2403, + LocationType.EXTRA, + logic.essence_of_eternity_requirement, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Void Thrasher Wave 3", + SC2LOTV_LOC_ID_OFFSET + 2404, + LocationType.EXTRA, + logic.essence_of_eternity_requirement, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "Void Thrasher Wave 4", + SC2LOTV_LOC_ID_OFFSET + 2405, + LocationType.EXTRA, + logic.essence_of_eternity_requirement, + ), + make_location_data( + SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name, + "No more than 15 Kerrigan Kills", + SC2LOTV_LOC_ID_OFFSET + 2406, + LocationType.MASTERY, + logic.essence_of_eternity_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Victory", + SC2LOTV_LOC_ID_OFFSET + 2500, + LocationType.VICTORY, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 1 Crystal", + SC2LOTV_LOC_ID_OFFSET + 2501, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 2 Crystals", + SC2LOTV_LOC_ID_OFFSET + 2502, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 3 Crystals", + SC2LOTV_LOC_ID_OFFSET + 2503, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 4 Crystals", + SC2LOTV_LOC_ID_OFFSET + 2504, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 5 Crystals", + SC2LOTV_LOC_ID_OFFSET + 2505, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Destroy 6 Crystals", + SC2LOTV_LOC_ID_OFFSET + 2506, + LocationType.EXTRA, + logic.amons_fall_requirement, + ), + make_location_data( + SC2Mission.AMON_S_FALL.mission_name, + "Clear Void Chasms", + SC2LOTV_LOC_ID_OFFSET + 2507, + LocationType.MASTERY, + lambda state: logic.amons_fall_requirement(state) + and logic.spread_creep(state, False) + and logic.zerg_big_monsters(state), + ), + # Nova Covert Ops + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 100, + LocationType.VICTORY, + logic.the_escape_requirement, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Rifle", + SC2NCO_LOC_ID_OFFSET + 101, + LocationType.VANILLA, + logic.the_escape_first_stage_requirement, + ), + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Grenades", + SC2NCO_LOC_ID_OFFSET + 102, + LocationType.VANILLA, + logic.the_escape_first_stage_requirement, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Agent Delta", + SC2NCO_LOC_ID_OFFSET + 103, + LocationType.VANILLA, + logic.the_escape_requirement, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Agent Pierce", + SC2NCO_LOC_ID_OFFSET + 104, + LocationType.VANILLA, + logic.the_escape_requirement, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.THE_ESCAPE.mission_name, + "Agent Stone", + SC2NCO_LOC_ID_OFFSET + 105, + LocationType.VANILLA, + logic.the_escape_requirement, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 200, + LocationType.VICTORY, + logic.sudden_strike_requirement, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Research Center", + SC2NCO_LOC_ID_OFFSET + 201, + LocationType.VANILLA, + logic.sudden_strike_requirement, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Weaponry Labs", + SC2NCO_LOC_ID_OFFSET + 202, + LocationType.VANILLA, + logic.sudden_strike_requirement, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Brutalisk", + SC2NCO_LOC_ID_OFFSET + 203, + LocationType.EXTRA, + logic.sudden_strike_requirement, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Gas Pickups", + SC2NCO_LOC_ID_OFFSET + 204, + LocationType.EXTRA, + lambda state: ( + logic.advanced_tactics or logic.sudden_strike_requirement(state) + ), + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Protect Buildings", + SC2NCO_LOC_ID_OFFSET + 205, + LocationType.CHALLENGE, + logic.sudden_strike_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.SUDDEN_STRIKE.mission_name, + "Zerg Base", + SC2NCO_LOC_ID_OFFSET + 206, + LocationType.MASTERY, + lambda state: ( + logic.sudden_strike_requirement(state) + and logic.terran_competent_comp(state) + and logic.terran_base_trasher(state) + and logic.terran_power_rating(state) >= 8 + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 300, + LocationType.VICTORY, + logic.enemy_intelligence_third_stage_requirement, + hard_rule=logic.enemy_intelligence_cliff_garrison_and_nova_mobility, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "West Garrison", + SC2NCO_LOC_ID_OFFSET + 301, + LocationType.EXTRA, + logic.enemy_intelligence_first_stage_requirement, + hard_rule=logic.enemy_intelligence_garrisonable_unit, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Close Garrison", + SC2NCO_LOC_ID_OFFSET + 302, + LocationType.EXTRA, + logic.enemy_intelligence_first_stage_requirement, + hard_rule=logic.enemy_intelligence_garrisonable_unit, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Northeast Garrison", + SC2NCO_LOC_ID_OFFSET + 303, + LocationType.EXTRA, + logic.enemy_intelligence_first_stage_requirement, + hard_rule=logic.enemy_intelligence_garrisonable_unit, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Southeast Garrison", + SC2NCO_LOC_ID_OFFSET + 304, + LocationType.EXTRA, + lambda state: ( + logic.enemy_intelligence_first_stage_requirement(state) + and logic.enemy_intelligence_cliff_garrison(state) + ), + hard_rule=logic.enemy_intelligence_cliff_garrison, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "South Garrison", + SC2NCO_LOC_ID_OFFSET + 305, + LocationType.EXTRA, + logic.enemy_intelligence_first_stage_requirement, + hard_rule=logic.enemy_intelligence_garrisonable_unit, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "All Garrisons", + SC2NCO_LOC_ID_OFFSET + 306, + LocationType.VANILLA, + lambda state: ( + logic.enemy_intelligence_first_stage_requirement(state) + and logic.enemy_intelligence_cliff_garrison(state) + ), + hard_rule=logic.enemy_intelligence_cliff_garrison, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Forces Rescued", + SC2NCO_LOC_ID_OFFSET + 307, + LocationType.VANILLA, + logic.enemy_intelligence_first_stage_requirement, + ), + make_location_data( + SC2Mission.ENEMY_INTELLIGENCE.mission_name, + "Communications Hub", + SC2NCO_LOC_ID_OFFSET + 308, + LocationType.VANILLA, + logic.enemy_intelligence_second_stage_requirement, + hard_rule=logic.enemy_intelligence_cliff_garrison_and_nova_mobility, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 400, + LocationType.VICTORY, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "North Base: West Hatchery", + SC2NCO_LOC_ID_OFFSET + 401, + LocationType.VANILLA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "North Base: North Hatchery", + SC2NCO_LOC_ID_OFFSET + 402, + LocationType.VANILLA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "North Base: East Hatchery", + SC2NCO_LOC_ID_OFFSET + 403, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "South Base: Northwest Hatchery", + SC2NCO_LOC_ID_OFFSET + 404, + LocationType.VANILLA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "South Base: Southwest Hatchery", + SC2NCO_LOC_ID_OFFSET + 405, + LocationType.VANILLA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "South Base: East Hatchery", + SC2NCO_LOC_ID_OFFSET + 406, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "North Shield Projector", + SC2NCO_LOC_ID_OFFSET + 407, + LocationType.EXTRA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "East Shield Projector", + SC2NCO_LOC_ID_OFFSET + 408, + LocationType.EXTRA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "South Shield Projector", + SC2NCO_LOC_ID_OFFSET + 409, + LocationType.EXTRA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "West Shield Projector", + SC2NCO_LOC_ID_OFFSET + 410, + LocationType.EXTRA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + "Fleet Beacon", + SC2NCO_LOC_ID_OFFSET + 411, + LocationType.VANILLA, + logic.trouble_in_paradise_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 500, + LocationType.VICTORY, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "1 Terrazine Node Collected", + SC2NCO_LOC_ID_OFFSET + 501, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "2 Terrazine Nodes Collected", + SC2NCO_LOC_ID_OFFSET + 502, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "3 Terrazine Nodes Collected", + SC2NCO_LOC_ID_OFFSET + 503, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "4 Terrazine Nodes Collected", + SC2NCO_LOC_ID_OFFSET + 504, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "5 Terrazine Nodes Collected", + SC2NCO_LOC_ID_OFFSET + 505, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "HERC Outpost", + SC2NCO_LOC_ID_OFFSET + 506, + LocationType.VANILLA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "Umojan Mine", + SC2NCO_LOC_ID_OFFSET + 507, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "Blightbringer", + SC2NCO_LOC_ID_OFFSET + 508, + LocationType.VANILLA, + lambda state: ( + logic.night_terrors_requirement(state) + and logic.nova_ranged_weapon(state) + and state.has_any( + { + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_PULSE_GRENADES, + item_names.NOVA_STIM_INFUSION, + item_names.NOVA_HOLO_DECOY, + }, + player, + ) + ), + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "Science Facility", + SC2NCO_LOC_ID_OFFSET + 509, + LocationType.EXTRA, + logic.night_terrors_requirement, + ), + make_location_data( + SC2Mission.NIGHT_TERRORS.mission_name, + "Eradicators", + SC2NCO_LOC_ID_OFFSET + 510, + LocationType.VANILLA, + lambda state: ( + logic.night_terrors_requirement(state) and logic.nova_any_weapon(state) + ), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 600, + LocationType.VICTORY, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Close North Evidence Coordinates", + SC2NCO_LOC_ID_OFFSET + 601, + LocationType.EXTRA, + lambda state: ( + state.has_any( + { + item_names.LIBERATOR_RAID_ARTILLERY, + item_names.RAVEN_HUNTER_SEEKER_WEAPON, + }, + player, + ) + or logic.terran_common_unit(state) + ), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Close East Evidence Coordinates", + SC2NCO_LOC_ID_OFFSET + 602, + LocationType.EXTRA, + lambda state: ( + state.has_any( + { + item_names.LIBERATOR_RAID_ARTILLERY, + item_names.RAVEN_HUNTER_SEEKER_WEAPON, + }, + player, + ) + or logic.terran_common_unit(state) + ), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Far North Evidence Coordinates", + SC2NCO_LOC_ID_OFFSET + 603, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Far East Evidence Coordinates", + SC2NCO_LOC_ID_OFFSET + 604, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Experimental Weapon", + SC2NCO_LOC_ID_OFFSET + 605, + LocationType.VANILLA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Northwest Subway Entrance", + SC2NCO_LOC_ID_OFFSET + 606, + LocationType.VANILLA, + lambda state: ( + state.has_any( + { + item_names.LIBERATOR_RAID_ARTILLERY, + item_names.RAVEN_HUNTER_SEEKER_WEAPON, + }, + player, + ) + and logic.terran_common_unit(state) + or logic.flashpoint_far_requirement(state) + ), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Southeast Subway Entrance", + SC2NCO_LOC_ID_OFFSET + 607, + LocationType.VANILLA, + lambda state: state.has_any( + { + item_names.LIBERATOR_RAID_ARTILLERY, + item_names.RAVEN_HUNTER_SEEKER_WEAPON, + }, + player, + ) + and logic.terran_common_unit(state) + or logic.flashpoint_far_requirement(state), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Northeast Subway Entrance", + SC2NCO_LOC_ID_OFFSET + 608, + LocationType.VANILLA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Expansion Hatchery", + SC2NCO_LOC_ID_OFFSET + 609, + LocationType.EXTRA, + lambda state: state.has(item_names.LIBERATOR_RAID_ARTILLERY, player) + and logic.terran_common_unit(state) + or logic.flashpoint_far_requirement(state), + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Baneling Spawns", + SC2NCO_LOC_ID_OFFSET + 610, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Mutalisk Spawns", + SC2NCO_LOC_ID_OFFSET + 611, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Nydus Worm Spawns", + SC2NCO_LOC_ID_OFFSET + 612, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Lurker Spawns", + SC2NCO_LOC_ID_OFFSET + 613, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Brood Lord Spawns", + SC2NCO_LOC_ID_OFFSET + 614, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.FLASHPOINT.mission_name, + "Ultralisk Spawns", + SC2NCO_LOC_ID_OFFSET + 615, + LocationType.EXTRA, + logic.flashpoint_far_requirement, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 700, + LocationType.VICTORY, + logic.enemy_shadow_victory, + hard_rule=lambda state: logic.nova_beat_stone(state) + and logic.enemy_shadow_door_unlocks_tool(state), + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Sewers: Domination Visor", + SC2NCO_LOC_ID_OFFSET + 701, + LocationType.VANILLA, + logic.enemy_shadow_domination, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Sewers: Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 702, + LocationType.EXTRA, + logic.enemy_shadow_first_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Sewers: Facility Access", + SC2NCO_LOC_ID_OFFSET + 703, + LocationType.VANILLA, + logic.enemy_shadow_first_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Northwest Door Lock", + SC2NCO_LOC_ID_OFFSET + 704, + LocationType.VANILLA, + logic.enemy_shadow_door_controls, + hard_rule=lambda state: logic.nova_any_nobuild_damage(state) + and logic.enemy_shadow_door_unlocks_tool(state), + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Southeast Door Lock", + SC2NCO_LOC_ID_OFFSET + 705, + LocationType.VANILLA, + logic.enemy_shadow_door_controls, + hard_rule=lambda state: logic.nova_any_nobuild_damage(state) + and logic.enemy_shadow_door_unlocks_tool(state), + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Blazefire Gunblade", + SC2NCO_LOC_ID_OFFSET + 706, + LocationType.VANILLA, + lambda state: ( + logic.enemy_shadow_second_stage(state) + and ( + logic.grant_story_tech == GrantStoryTech.option_grant + or state.has(item_names.NOVA_BLINK, player) + or ( + adv_tactics + and state.has_all( + { + item_names.NOVA_DOMINATION, + item_names.NOVA_HOLO_DECOY, + item_names.NOVA_JUMP_SUIT_MODULE, + }, + player, + ) + ) + ) + ), + hard_rule=logic.enemy_shadow_nova_damage_and_blazefire_unlock, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Blink Suit", + SC2NCO_LOC_ID_OFFSET + 707, + LocationType.VANILLA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Advanced Weaponry", + SC2NCO_LOC_ID_OFFSET + 708, + LocationType.VANILLA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: Entrance Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 709, + LocationType.EXTRA, + logic.enemy_shadow_first_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: West Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 710, + LocationType.EXTRA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: North Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 711, + LocationType.EXTRA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: East Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 712, + LocationType.EXTRA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + "Facility: South Resupply Crate", + SC2NCO_LOC_ID_OFFSET + 713, + LocationType.EXTRA, + logic.enemy_shadow_second_stage, + hard_rule=logic.nova_any_nobuild_damage, + ), + make_location_data( + SC2Mission.DARK_SKIES.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 800, + LocationType.VICTORY, + logic.dark_skies_requirement, + ), + make_location_data( + SC2Mission.DARK_SKIES.mission_name, + "First Squadron of Dominion Fleet", + SC2NCO_LOC_ID_OFFSET + 801, + LocationType.EXTRA, + logic.dark_skies_requirement, + ), + make_location_data( + SC2Mission.DARK_SKIES.mission_name, + "Remainder of Dominion Fleet", + SC2NCO_LOC_ID_OFFSET + 802, + LocationType.EXTRA, + logic.dark_skies_requirement, + ), + make_location_data( + SC2Mission.DARK_SKIES.mission_name, + "Ji'nara", + SC2NCO_LOC_ID_OFFSET + 803, + LocationType.EXTRA, + logic.dark_skies_requirement, + ), + make_location_data( + SC2Mission.DARK_SKIES.mission_name, + "Science Facility", + SC2NCO_LOC_ID_OFFSET + 804, + LocationType.VANILLA, + logic.dark_skies_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Victory", + SC2NCO_LOC_ID_OFFSET + 900, + LocationType.VICTORY, + lambda state: logic.end_game_requirement(state) + and logic.nova_any_weapon(state), + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Destroy the Xanthos", + SC2NCO_LOC_ID_OFFSET + 901, + LocationType.VANILLA, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Disable Xanthos Railgun", + SC2NCO_LOC_ID_OFFSET + 902, + LocationType.EXTRA, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Disable Xanthos Flamethrower", + SC2NCO_LOC_ID_OFFSET + 903, + LocationType.EXTRA, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Disable Xanthos Fighter Bay", + SC2NCO_LOC_ID_OFFSET + 904, + LocationType.EXTRA, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Disable Xanthos Missile Pods", + SC2NCO_LOC_ID_OFFSET + 905, + LocationType.EXTRA, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Protect Hyperion", + SC2NCO_LOC_ID_OFFSET + 906, + LocationType.CHALLENGE, + logic.end_game_requirement, + ), + make_location_data( + SC2Mission.END_GAME.mission_name, + "Destroy Orbital Commands", + SC2NCO_LOC_ID_OFFSET + 907, + LocationType.CHALLENGE, + logic.end_game_requirement, + flags=LocationFlag.BASEBUST, + ), + # Mission Variants + # 10X/20X - Liberation Day + make_location_data( + SC2Mission.THE_OUTLAWS_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 300, + LocationType.VICTORY, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_Z.mission_name, + "Rebel Base", + SC2_RACESWAP_LOC_ID_OFFSET + 301, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_Z.mission_name, + "North Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 302, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_Z.mission_name, + "Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 303, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_Z.mission_name, + "Close Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 304, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 400, + LocationType.VICTORY, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_P.mission_name, + "Rebel Base", + SC2_RACESWAP_LOC_ID_OFFSET + 401, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_P.mission_name, + "North Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 402, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_P.mission_name, + "Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 403, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.THE_OUTLAWS_P.mission_name, + "Close Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 5 + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "First Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Second Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 502, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Third Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 503, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 5 + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "First Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 504, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Second Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 505, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Third Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 506, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Fourth Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 507, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Ride's on its Way", + SC2_RACESWAP_LOC_ID_OFFSET + 508, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 5 + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Hold Just a Little Longer", + SC2_RACESWAP_LOC_ID_OFFSET + 509, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 5 + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_Z.mission_name, + "Cavalry's on the Way", + SC2_RACESWAP_LOC_ID_OFFSET + 510, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, True) >= 5 + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 600, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + and ( + state.has(item_names.PHOTON_CANNON, player) + or logic.protoss_basic_splash(state) + ) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "First Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Second Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 602, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Third Group Rescued", + SC2_RACESWAP_LOC_ID_OFFSET + 603, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + and ( + state.has(item_names.PHOTON_CANNON, player) + or logic.protoss_basic_splash(state) + ) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "First Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 604, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Second Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 605, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Third Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 606, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Fourth Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 607, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Ride's on its Way", + SC2_RACESWAP_LOC_ID_OFFSET + 608, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + and ( + state.has(item_names.PHOTON_CANNON, player) + or logic.protoss_basic_splash(state) + ) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Hold Just a Little Longer", + SC2_RACESWAP_LOC_ID_OFFSET + 609, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + and ( + state.has(item_names.PHOTON_CANNON, player) + or logic.protoss_basic_splash(state) + ) + ), + ), + make_location_data( + SC2Mission.ZERO_HOUR_P.mission_name, + "Cavalry's on the Way", + SC2_RACESWAP_LOC_ID_OFFSET + 610, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + and ( + state.has(item_names.PHOTON_CANNON, player) + or logic.protoss_basic_splash(state) + ) + ), + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 700, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and ( + logic.zerg_competent_anti_air(state) + or (adv_tactics and logic.zerg_basic_kerriganless_anti_air(state)) + ) + ), + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "North Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 701, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "West Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 702, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "East Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 703, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Reach Hanson", + SC2_RACESWAP_LOC_ID_OFFSET + 704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Secret Resource Stash", + SC2_RACESWAP_LOC_ID_OFFSET + 705, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 706, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_common_unit(state) + and logic.zerg_defense_rating(state, True, False) >= 5 + and ( + (adv_tactics and logic.zerg_basic_kerriganless_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Western Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 707, + LocationType.MASTERY, + lambda state: ( + logic.zerg_common_unit_competent_aa(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.EVACUATION_Z.mission_name, + "Eastern Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 708, + LocationType.MASTERY, + lambda state: ( + logic.zerg_common_unit_competent_aa(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 800, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "North Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "West Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 802, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "East Chrysalis", + SC2_RACESWAP_LOC_ID_OFFSET + 803, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Reach Hanson", + SC2_RACESWAP_LOC_ID_OFFSET + 804, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Secret Resource Stash", + SC2_RACESWAP_LOC_ID_OFFSET + 805, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 806, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_defense_rating(state, True) >= 2 + and logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Western Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 807, + LocationType.MASTERY, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.EVACUATION_P.mission_name, + "Eastern Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 808, + LocationType.MASTERY, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 900, + LocationType.VICTORY, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "Left Infestor", + SC2_RACESWAP_LOC_ID_OFFSET + 901, + LocationType.VANILLA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "Right Infestor", + SC2_RACESWAP_LOC_ID_OFFSET + 902, + LocationType.VANILLA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "North Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 903, + LocationType.EXTRA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "South Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 904, + LocationType.EXTRA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "Northwest Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 905, + LocationType.EXTRA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "North Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 906, + LocationType.EXTRA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_Z.mission_name, + "South Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 907, + LocationType.EXTRA, + logic.zerg_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1000, + LocationType.VICTORY, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "Left Infestor", + SC2_RACESWAP_LOC_ID_OFFSET + 1001, + LocationType.VANILLA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "Right Infestor", + SC2_RACESWAP_LOC_ID_OFFSET + 1002, + LocationType.VANILLA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "North Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 1003, + LocationType.EXTRA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "South Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 1004, + LocationType.EXTRA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "Northwest Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 1005, + LocationType.EXTRA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "North Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 1006, + LocationType.EXTRA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.OUTBREAK_P.mission_name, + "South Bar", + SC2_RACESWAP_LOC_ID_OFFSET + 1007, + LocationType.EXTRA, + logic.protoss_outbreak_requirement, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1100, + LocationType.VICTORY, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "North Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1101, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "East Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1102, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "South Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1103, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "First Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1104, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "Second Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1105, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_Z.mission_name, + "Third Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1106, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1200, + LocationType.VICTORY, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "North Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1201, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "East Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1202, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "South Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 1203, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "First Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1204, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "Second Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1205, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.SAFE_HAVEN_P.mission_name, + "Third Terror Fleet", + SC2_RACESWAP_LOC_ID_OFFSET + 1206, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state), + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1300, + LocationType.VICTORY, + logic.zerg_havens_fall_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "North Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1301, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "East Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1302, + LocationType.VANILLA, + logic.zerg_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "South Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1303, + LocationType.VANILLA, + logic.zerg_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Northeast Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1304, + LocationType.CHALLENGE, + logic.zerg_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "East Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1305, + LocationType.CHALLENGE, + logic.zerg_respond_to_colony_infestations, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Middle Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1306, + LocationType.CHALLENGE, + logic.zerg_respond_to_colony_infestations, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Southeast Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1307, + LocationType.CHALLENGE, + logic.zerg_respond_to_colony_infestations, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Southwest Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1308, + LocationType.CHALLENGE, + logic.zerg_respond_to_colony_infestations, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Southwest Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1309, + LocationType.EXTRA, + lambda state: state.has_any( + (item_names.OVERLORD_VENTRAL_SACS, item_names.YGGDRASIL), player + ) + or adv_tactics + and state.has_all( + ( + item_names.INFESTED_BANSHEE, + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION, + ), + player, + ), + hard_rule=logic.zerg_can_collect_pickup_across_gap, + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "East Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1310, + LocationType.EXTRA, + lambda state: ( + logic.zerg_havens_fall_requirement(state) + and ( + state.has(item_names.OVERLORD_VENTRAL_SACS, player) + or adv_tactics + and ( + state.has_all( + ( + item_names.INFESTED_BANSHEE, + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION, + ), + player, + ) + or state.has(item_names.YGGDRASIL, player) + or logic.morph_viper(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.HAVENS_FALL_Z.mission_name, + "Southeast Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1311, + LocationType.EXTRA, + lambda state: ( + logic.zerg_havens_fall_requirement(state) + and ( + state.has(item_names.OVERLORD_VENTRAL_SACS, player) + or adv_tactics + and ( + state.has_all( + ( + item_names.INFESTED_BANSHEE, + item_names.INFESTED_BANSHEE_RAPID_HIBERNATION, + ), + player, + ) + or state.has(item_names.YGGDRASIL, player) + ) + ) + ), + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1400, + LocationType.VICTORY, + logic.protoss_havens_fall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "North Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1401, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "East Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1402, + LocationType.VANILLA, + logic.protoss_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "South Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 1403, + LocationType.VANILLA, + logic.protoss_havens_fall_requirement, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Northeast Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1404, + LocationType.CHALLENGE, + logic.protoss_respond_to_colony_infestations, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "East Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1405, + LocationType.CHALLENGE, + logic.protoss_respond_to_colony_infestations, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Middle Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1406, + LocationType.CHALLENGE, + logic.protoss_respond_to_colony_infestations, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Southeast Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1407, + LocationType.CHALLENGE, + logic.protoss_respond_to_colony_infestations, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Southwest Colony Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1408, + LocationType.CHALLENGE, + logic.protoss_respond_to_colony_infestations, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Southwest Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1409, + LocationType.EXTRA, + lambda state: ( + state.has(item_names.WARP_PRISM, player) + or adv_tactics + and ( + state.has_all( + (item_names.MISTWING, item_names.MISTWING_PILOT), player + ) + or state.has(item_names.ARBITER, player) + ) + ), + hard_rule=logic.protoss_any_gap_transport, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "East Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1410, + LocationType.EXTRA, + lambda state: ( + logic.protoss_havens_fall_requirement(state) + and ( + state.has(item_names.WARP_PRISM, player) + or adv_tactics + and ( + state.has_all( + (item_names.MISTWING, item_names.MISTWING_PILOT), player + ) + or state.has(item_names.ARBITER, player) + ) + ) + ), + hard_rule=logic.protoss_any_gap_transport, + ), + make_location_data( + SC2Mission.HAVENS_FALL_P.mission_name, + "Southeast Gas Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 1411, + LocationType.EXTRA, + lambda state: ( + logic.protoss_havens_fall_requirement(state) + and ( + state.has(item_names.WARP_PRISM, player) + or adv_tactics + and ( + state.has_all( + (item_names.MISTWING, item_names.MISTWING_PILOT), player + ) + or state.has(item_names.ARBITER, player) + ) + ) + ), + hard_rule=logic.protoss_any_gap_transport, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and ( + (adv_tactics and logic.zerg_moderate_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "First Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Second Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1502, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) + or state.has(item_names.OVERLORD_VENTRAL_SACS, player), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Third Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1503, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + (adv_tactics and logic.zerg_moderate_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Fourth Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1504, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + (adv_tactics and logic.zerg_moderate_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "First Forcefield Area Busted", + SC2_RACESWAP_LOC_ID_OFFSET + 1505, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + (adv_tactics and logic.zerg_moderate_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Second Forcefield Area Busted", + SC2_RACESWAP_LOC_ID_OFFSET + 1506, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) + and ( + (adv_tactics and logic.zerg_moderate_anti_air(state)) + or logic.zerg_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_Z.mission_name, + "Defeat Kerrigan", + SC2_RACESWAP_LOC_ID_OFFSET + 1507, + LocationType.MASTERY, + lambda state: ( + logic.zerg_common_unit_competent_aa(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1600, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "First Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Second Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1602, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Third Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1603, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Fourth Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1604, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "First Forcefield Area Busted", + SC2_RACESWAP_LOC_ID_OFFSET + 1605, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Second Forcefield Area Busted", + SC2_RACESWAP_LOC_ID_OFFSET + 1606, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and ( + (adv_tactics and logic.protoss_basic_anti_air(state)) + or logic.protoss_anti_light_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.SMASH_AND_GRAB_P.mission_name, + "Defeat Kerrigan", + SC2_RACESWAP_LOC_ID_OFFSET + 1607, + LocationType.MASTERY, + logic.protoss_deathball, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1700, + LocationType.VICTORY, + lambda state: ( + ( + logic.zerg_competent_anti_air(state) + or adv_tactics + and logic.zerg_moderate_anti_air(state) + ) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Left Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1701, + LocationType.VANILLA, + lambda state: ( + logic.zerg_defense_rating(state, False, False) >= 6 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Right Ground Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1702, + LocationType.VANILLA, + lambda state: ( + logic.zerg_defense_rating(state, False, False) >= 6 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Right Cliff Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1703, + LocationType.VANILLA, + lambda state: ( + logic.zerg_defense_rating(state, False, False) >= 6 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Moebius Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Door Outer Layer", + SC2_RACESWAP_LOC_ID_OFFSET + 1705, + LocationType.EXTRA, + lambda state: ( + logic.zerg_defense_rating(state, False, False) >= 6 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Door Thermal Barrier", + SC2_RACESWAP_LOC_ID_OFFSET + 1706, + LocationType.EXTRA, + lambda state: ( + ( + logic.zerg_competent_anti_air(state) + or adv_tactics + and logic.zerg_moderate_anti_air(state) + ) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Cutting Through the Core", + SC2_RACESWAP_LOC_ID_OFFSET + 1707, + LocationType.EXTRA, + lambda state: ( + ( + logic.zerg_competent_anti_air(state) + or adv_tactics + and logic.zerg_moderate_anti_air(state) + ) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Structure Access Imminent", + SC2_RACESWAP_LOC_ID_OFFSET + 1708, + LocationType.EXTRA, + lambda state: ( + ( + logic.zerg_competent_anti_air(state) + or adv_tactics + and logic.zerg_moderate_anti_air(state) + ) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Northwestern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1709, + LocationType.MASTERY, + lambda state: ( + logic.zerg_competent_anti_air(state) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Northeastern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1710, + LocationType.MASTERY, + lambda state: ( + logic.zerg_competent_anti_air(state) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_Z.mission_name, + "Eastern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1711, + LocationType.MASTERY, + lambda state: ( + logic.zerg_competent_anti_air(state) + and logic.zerg_defense_rating(state, False, True) >= 8 + and logic.zerg_common_unit(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1800, + LocationType.VICTORY, + lambda state: ( + ( + logic.protoss_anti_armor_anti_air(state) + or adv_tactics + and logic.protoss_moderate_anti_air(state) + ) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Left Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1801, + LocationType.VANILLA, + lambda state: ( + logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Right Ground Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1802, + LocationType.VANILLA, + lambda state: ( + logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Right Cliff Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 1803, + LocationType.VANILLA, + lambda state: ( + logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Moebius Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1804, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Door Outer Layer", + SC2_RACESWAP_LOC_ID_OFFSET + 1805, + LocationType.EXTRA, + lambda state: ( + logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Door Thermal Barrier", + SC2_RACESWAP_LOC_ID_OFFSET + 1806, + LocationType.EXTRA, + lambda state: ( + ( + logic.protoss_anti_armor_anti_air(state) + or adv_tactics + and logic.protoss_moderate_anti_air(state) + ) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Cutting Through the Core", + SC2_RACESWAP_LOC_ID_OFFSET + 1807, + LocationType.EXTRA, + lambda state: ( + ( + logic.protoss_anti_armor_anti_air(state) + or adv_tactics + and logic.protoss_moderate_anti_air(state) + ) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Structure Access Imminent", + SC2_RACESWAP_LOC_ID_OFFSET + 1808, + LocationType.EXTRA, + lambda state: ( + ( + logic.protoss_anti_armor_anti_air(state) + or adv_tactics + and logic.protoss_moderate_anti_air(state) + ) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Northwestern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1809, + LocationType.MASTERY, + lambda state: ( + logic.protoss_anti_armor_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + and logic.protoss_deathball(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Northeastern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1810, + LocationType.MASTERY, + lambda state: ( + logic.protoss_anti_armor_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + and logic.protoss_deathball(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_DIG_P.mission_name, + "Eastern Protoss Base", + SC2_RACESWAP_LOC_ID_OFFSET + 1811, + LocationType.MASTERY, + lambda state: ( + logic.protoss_anti_armor_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 6 + and logic.protoss_common_unit(state) + and logic.protoss_deathball(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 1900, + LocationType.VICTORY, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and ( + logic.zerg_versatile_air(state) + or state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ) + and logic.zerg_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "1st Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 1901, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "2nd Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 1902, + LocationType.VANILLA, + lambda state: ( + logic.zerg_versatile_air(state) + or state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ) + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "South Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 1903, + LocationType.EXTRA, + lambda state: state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Wall Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 1904, + LocationType.EXTRA, + lambda state: state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Mid Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 1905, + LocationType.EXTRA, + lambda state: state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Nydus Roof Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 1906, + LocationType.EXTRA, + lambda state: state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Alive Inside Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 1907, + LocationType.EXTRA, + lambda state: state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 1908, + LocationType.VANILLA, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and ( + logic.zerg_versatile_air(state) + or state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ) + and logic.zerg_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_Z.mission_name, + "3rd Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 1909, + LocationType.VANILLA, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and ( + logic.zerg_versatile_air(state) + or state.has_any( + { + item_names.YGGDRASIL, + item_names.OVERLORD_VENTRAL_SACS, + item_names.NYDUS_WORM, + item_names.BULLFROG, + }, + player, + ) + and logic.zerg_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2000, + LocationType.VICTORY, + lambda state: ( + logic.protoss_moderate_anti_air(state) + and ( + logic.protoss_fleet(state) + or state.has(item_names.WARP_PRISM, player) + and logic.protoss_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "1st Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 2001, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "2nd Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 2002, + LocationType.VANILLA, + lambda state: ( + logic.protoss_fleet(state) + or ( + state.has(item_names.WARP_PRISM, player) + and logic.protoss_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "South Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 2003, + LocationType.EXTRA, + lambda state: adv_tactics or state.has(item_names.WARP_PRISM, player), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Wall Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 2004, + LocationType.EXTRA, + lambda state: adv_tactics or state.has(item_names.WARP_PRISM, player), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Mid Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 2005, + LocationType.EXTRA, + lambda state: adv_tactics or state.has(item_names.WARP_PRISM, player), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Nydus Roof Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 2006, + LocationType.EXTRA, + lambda state: adv_tactics or state.has(item_names.WARP_PRISM, player), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Alive Inside Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 2007, + LocationType.EXTRA, + lambda state: adv_tactics or state.has(item_names.WARP_PRISM, player), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 2008, + LocationType.VANILLA, + lambda state: ( + logic.protoss_moderate_anti_air(state) + and ( + logic.protoss_fleet(state) + or state.has(item_names.WARP_PRISM, player) + and logic.protoss_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.THE_MOEBIUS_FACTOR_P.mission_name, + "3rd Data Core", + SC2_RACESWAP_LOC_ID_OFFSET + 2009, + LocationType.VANILLA, + lambda state: ( + logic.protoss_moderate_anti_air(state) + and ( + logic.protoss_fleet(state) + or state.has(item_names.WARP_PRISM, player) + and logic.protoss_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2100, + LocationType.VICTORY, + logic.zerg_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "West Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2101, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "North Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2102, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "South Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2103, + LocationType.VANILLA, + logic.zerg_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "East Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2104, + LocationType.VANILLA, + logic.zerg_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "Landing Zone Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2105, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "Middle Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2106, + LocationType.EXTRA, + logic.zerg_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_Z.mission_name, + "Southeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2107, + LocationType.EXTRA, + logic.zerg_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2200, + LocationType.VICTORY, + logic.protoss_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "West Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2201, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "North Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2202, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "South Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2203, + LocationType.VANILLA, + logic.protoss_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "East Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2204, + LocationType.VANILLA, + logic.protoss_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "Landing Zone Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2205, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "Middle Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2206, + LocationType.EXTRA, + logic.protoss_supernova_requirement, + ), + make_location_data( + SC2Mission.SUPERNOVA_P.mission_name, + "Southeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2207, + LocationType.EXTRA, + logic.protoss_supernova_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2300, + LocationType.VICTORY, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Landing Zone Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2301, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Expansion Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2302, + LocationType.VANILLA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "South Close Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2303, + LocationType.VANILLA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "South Far Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2304, + LocationType.VANILLA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "North Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2305, + LocationType.VANILLA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 2306, + LocationType.EXTRA, + logic.zerg_maw_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Expansion Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2307, + LocationType.EXTRA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Middle Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2308, + LocationType.EXTRA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Southeast Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2309, + LocationType.EXTRA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Stargate Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2310, + LocationType.EXTRA, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Northwest Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2311, + LocationType.CHALLENGE, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "West Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2312, + LocationType.CHALLENGE, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_Z.mission_name, + "Southwest Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2313, + LocationType.CHALLENGE, + logic.zerg_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2400, + LocationType.VICTORY, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Landing Zone Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2401, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Expansion Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2402, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "South Close Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2403, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "South Far Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2404, + LocationType.VANILLA, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "North Prisoners", + SC2_RACESWAP_LOC_ID_OFFSET + 2405, + LocationType.VANILLA, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 2406, + LocationType.EXTRA, + logic.protoss_maw_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Expansion Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2407, + LocationType.EXTRA, + lambda state: adv_tactics or logic.protoss_maw_requirement(state), + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Middle Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2408, + LocationType.EXTRA, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Southeast Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2409, + LocationType.EXTRA, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Stargate Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2410, + LocationType.EXTRA, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Northwest Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2411, + LocationType.CHALLENGE, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "West Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2412, + LocationType.CHALLENGE, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.MAW_OF_THE_VOID_P.mission_name, + "Southwest Rip Field Generator", + SC2_RACESWAP_LOC_ID_OFFSET + 2413, + LocationType.CHALLENGE, + logic.protoss_maw_requirement, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Tosh's Miners", + SC2_RACESWAP_LOC_ID_OFFSET + 2501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 2502, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "North Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2503, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Middle Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Southwest Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2505, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Southeast Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2506, + LocationType.EXTRA, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "East Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2507, + LocationType.EXTRA, + lambda state: ( + logic.zerg_moderate_anti_air(state) + and logic.zerg_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_Z.mission_name, + "Zerg Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2508, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_competent_anti_air(state) + and logic.zerg_common_unit(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2600, + LocationType.VICTORY, + lambda state: ( + adv_tactics + or logic.protoss_basic_anti_air(state) + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Tosh's Miners", + SC2_RACESWAP_LOC_ID_OFFSET + 2601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 2602, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "North Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2603, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Middle Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2604, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Southwest Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2605, + LocationType.EXTRA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Southeast Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2606, + LocationType.EXTRA, + lambda state: ( + adv_tactics + or logic.protoss_basic_anti_air(state) + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "East Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 2607, + LocationType.EXTRA, + lambda state: ( + adv_tactics + or logic.protoss_basic_anti_air(state) + and logic.protoss_common_unit(state) + ), + ), + make_location_data( + SC2Mission.DEVILS_PLAYGROUND_P.mission_name, + "Zerg Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2608, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_competent_anti_air(state) + and (logic.protoss_common_unit(state)) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2700, + LocationType.VICTORY, + logic.zerg_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Close Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2701, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "West Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2702, + LocationType.VANILLA, + logic.zerg_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "North-East Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2703, + LocationType.VANILLA, + logic.zerg_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Middle Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2704, + LocationType.EXTRA, + logic.zerg_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Protoss Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2705, + LocationType.MASTERY, + lambda state: ( + logic.zerg_welcome_to_the_jungle_requirement(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "No Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2706, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_welcome_to_the_jungle_requirement(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_big_monsters(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Up to 1 Terrazine Node Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2707, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_welcome_to_the_jungle_requirement(state) + and logic.zerg_competent_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Up to 2 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2708, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_welcome_to_the_jungle_requirement(state) + and logic.zerg_competent_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Up to 3 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2709, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_welcome_to_the_jungle_requirement(state) + and logic.zerg_competent_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Up to 4 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2710, + LocationType.EXTRA, + logic.zerg_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_Z.mission_name, + "Up to 5 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2711, + LocationType.EXTRA, + logic.zerg_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 2800, + LocationType.VICTORY, + logic.protoss_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Close Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "West Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2802, + LocationType.VANILLA, + logic.protoss_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "North-East Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 2803, + LocationType.VANILLA, + logic.protoss_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Middle Base", + SC2_RACESWAP_LOC_ID_OFFSET + 2804, + LocationType.EXTRA, + logic.protoss_welcome_to_the_jungle_requirement, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Protoss Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 2805, + LocationType.MASTERY, + lambda state: ( + logic.protoss_welcome_to_the_jungle_requirement(state) + and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "No Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2806, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_welcome_to_the_jungle_requirement(state) + and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Up to 1 Terrazine Node Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2807, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_welcome_to_the_jungle_requirement(state) + and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Up to 2 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2808, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_welcome_to_the_jungle_requirement(state) + and logic.protoss_basic_splash(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Up to 3 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2809, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_welcome_to_the_jungle_requirement(state) + and logic.protoss_basic_splash(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Up to 4 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2810, + LocationType.EXTRA, + logic.protoss_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.WELCOME_TO_THE_JUNGLE_P.mission_name, + "Up to 5 Terrazine Nodes Sealed", + SC2_RACESWAP_LOC_ID_OFFSET + 2811, + LocationType.EXTRA, + logic.protoss_welcome_to_the_jungle_requirement, + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3300, + LocationType.VICTORY, + lambda state: ( + logic.zerg_great_train_robbery_train_stopper(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "North Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3301, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Mid Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3302, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "South Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3303, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Close Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3304, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Northwest Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3305, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "North Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3306, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Northeast Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3307, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Southwest Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3308, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Southeast Infested Diamondback", + SC2_RACESWAP_LOC_ID_OFFSET + 3309, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Kill Team", + SC2_RACESWAP_LOC_ID_OFFSET + 3310, + LocationType.CHALLENGE, + lambda state: ( + (adv_tactics or logic.zerg_common_unit(state)) + and logic.zerg_great_train_robbery_train_stopper(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 3311, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_great_train_robbery_train_stopper(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "2 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3312, + LocationType.EXTRA, + logic.zerg_great_train_robbery_train_stopper, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "4 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3313, + LocationType.EXTRA, + lambda state: ( + logic.zerg_great_train_robbery_train_stopper(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z.mission_name, + "6 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3314, + LocationType.EXTRA, + lambda state: ( + logic.zerg_great_train_robbery_train_stopper(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3400, + LocationType.VICTORY, + lambda state: ( + logic.protoss_great_train_robbery_train_stopper(state) + and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "North Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Mid Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3402, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "South Defiler", + SC2_RACESWAP_LOC_ID_OFFSET + 3403, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Close Immortal", + SC2_RACESWAP_LOC_ID_OFFSET + 3404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Northwest Immortal", + SC2_RACESWAP_LOC_ID_OFFSET + 3405, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "North Instigator", + SC2_RACESWAP_LOC_ID_OFFSET + 3406, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Northeast Instigator", + SC2_RACESWAP_LOC_ID_OFFSET + 3407, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Southwest Instigator", + SC2_RACESWAP_LOC_ID_OFFSET + 3408, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Southeast Immortal", + SC2_RACESWAP_LOC_ID_OFFSET + 3409, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Kill Team", + SC2_RACESWAP_LOC_ID_OFFSET + 3410, + LocationType.CHALLENGE, + lambda state: ( + (adv_tactics or logic.protoss_common_unit(state)) + and logic.protoss_great_train_robbery_train_stopper(state) + and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 3411, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_great_train_robbery_train_stopper(state) + and logic.protoss_basic_anti_air(state) + ), + flags=LocationFlag.PREVENTATIVE, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "2 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3412, + LocationType.EXTRA, + logic.protoss_great_train_robbery_train_stopper, + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "4 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3413, + LocationType.EXTRA, + lambda state: ( + logic.protoss_great_train_robbery_train_stopper(state) + and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GREAT_TRAIN_ROBBERY_P.mission_name, + "6 Trains Destroyed", + SC2_RACESWAP_LOC_ID_OFFSET + 3414, + LocationType.EXTRA, + lambda state: ( + logic.protoss_great_train_robbery_train_stopper(state) + and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3500, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) + and (adv_tactics or logic.zerg_moderate_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "Mira Han", + SC2_RACESWAP_LOC_ID_OFFSET + 3501, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "North Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3502, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "Mid Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3503, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "Southwest Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3504, + LocationType.VANILLA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "North Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3505, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "South Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3506, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_Z.mission_name, + "West Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3507, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3600, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_basic_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "Mira Han", + SC2_RACESWAP_LOC_ID_OFFSET + 3601, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "North Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3602, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "Mid Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3603, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "Southwest Relic", + SC2_RACESWAP_LOC_ID_OFFSET + 3604, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "North Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3605, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "South Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3606, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.CUTTHROAT_P.mission_name, + "West Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 3607, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3700, + LocationType.VICTORY, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Odin", + SC2_RACESWAP_LOC_ID_OFFSET + 3701, + LocationType.EXTRA, + logic.zergling_hydra_roach_start, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Loki", + SC2_RACESWAP_LOC_ID_OFFSET + 3702, + LocationType.CHALLENGE, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Lab Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3703, + LocationType.VANILLA, + logic.zergling_hydra_roach_start, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "North Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3704, + LocationType.VANILLA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Southeast Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3705, + LocationType.VANILLA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "West Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3706, + LocationType.EXTRA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Northwest Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3707, + LocationType.EXTRA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Northeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3708, + LocationType.EXTRA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name, + "Southeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3709, + LocationType.EXTRA, + logic.zerg_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3800, + LocationType.VICTORY, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Odin", + SC2_RACESWAP_LOC_ID_OFFSET + 3801, + LocationType.EXTRA, + logic.zealot_sentry_slayer_start, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Loki", + SC2_RACESWAP_LOC_ID_OFFSET + 3802, + LocationType.CHALLENGE, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Lab Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3803, + LocationType.VANILLA, + logic.zealot_sentry_slayer_start, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "North Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3804, + LocationType.VANILLA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Southeast Devourer", + SC2_RACESWAP_LOC_ID_OFFSET + 3805, + LocationType.VANILLA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "West Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3806, + LocationType.EXTRA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Northwest Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3807, + LocationType.EXTRA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Northeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3808, + LocationType.EXTRA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name, + "Southeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 3809, + LocationType.EXTRA, + logic.protoss_engine_of_destruction_requirement, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 3900, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Tower 1", + SC2_RACESWAP_LOC_ID_OFFSET + 3901, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Tower 2", + SC2_RACESWAP_LOC_ID_OFFSET + 3902, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Tower 3", + SC2_RACESWAP_LOC_ID_OFFSET + 3903, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 3904, + LocationType.VANILLA, + lambda state: ( + logic.advanced_tactics or logic.zerg_competent_comp_competent_aa(state) + ), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "All Barracks", + SC2_RACESWAP_LOC_ID_OFFSET + 3905, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "All Factories", + SC2_RACESWAP_LOC_ID_OFFSET + 3906, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "All Starports", + SC2_RACESWAP_LOC_ID_OFFSET + 3907, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Odin Not Trashed", + SC2_RACESWAP_LOC_ID_OFFSET + 3908, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_competent_comp_competent_aa(state) + and logic.zerg_repair_odin(state) + ), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_Z.mission_name, + "Surprise Attack Ends", + SC2_RACESWAP_LOC_ID_OFFSET + 3909, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 4000, + LocationType.VICTORY, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Tower 1", + SC2_RACESWAP_LOC_ID_OFFSET + 4001, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Tower 2", + SC2_RACESWAP_LOC_ID_OFFSET + 4002, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Tower 3", + SC2_RACESWAP_LOC_ID_OFFSET + 4003, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 4004, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_competent_comp(state), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "All Barracks", + SC2_RACESWAP_LOC_ID_OFFSET + 4005, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "All Factories", + SC2_RACESWAP_LOC_ID_OFFSET + 4006, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "All Starports", + SC2_RACESWAP_LOC_ID_OFFSET + 4007, + LocationType.EXTRA, + lambda state: adv_tactics or logic.protoss_competent_comp(state), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Odin Not Trashed", + SC2_RACESWAP_LOC_ID_OFFSET + 4008, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_competent_comp(state) and logic.protoss_repair_odin(state) + ), + ), + make_location_data( + SC2Mission.MEDIA_BLITZ_P.mission_name, + "Surprise Attack Ends", + SC2_RACESWAP_LOC_ID_OFFSET + 4009, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 4500, + LocationType.VICTORY, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Factory", + SC2_RACESWAP_LOC_ID_OFFSET + 4501, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Armory", + SC2_RACESWAP_LOC_ID_OFFSET + 4502, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Shadow Ops", + SC2_RACESWAP_LOC_ID_OFFSET + 4503, + LocationType.VANILLA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Northeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4504, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Southwest Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4505, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Maar", + SC2_RACESWAP_LOC_ID_OFFSET + 4506, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Northwest Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4507, + LocationType.EXTRA, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "Southwest Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4508, + LocationType.EXTRA, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_T.mission_name, + "East Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4509, + LocationType.EXTRA, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 4600, + LocationType.VICTORY, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Ultralisk Cavern", + SC2_RACESWAP_LOC_ID_OFFSET + 4601, + LocationType.VANILLA, + lambda state: (adv_tactics or logic.zerg_common_unit(state)) + and logic.spread_creep(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Hydralisk Den", + SC2_RACESWAP_LOC_ID_OFFSET + 4602, + LocationType.VANILLA, + lambda state: (adv_tactics or logic.zerg_common_unit(state)) + and logic.spread_creep(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Infestation Pit", + SC2_RACESWAP_LOC_ID_OFFSET + 4603, + LocationType.VANILLA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state) + and logic.spread_creep(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Northeast Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4604, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Southwest Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4605, + LocationType.CHALLENGE, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Maar", + SC2_RACESWAP_LOC_ID_OFFSET + 4606, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Northwest Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4607, + LocationType.EXTRA, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "Southwest Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4608, + LocationType.EXTRA, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.A_SINISTER_TURN_Z.mission_name, + "East Preserver", + SC2_RACESWAP_LOC_ID_OFFSET + 4609, + LocationType.EXTRA, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 4700, + LocationType.VICTORY, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Close Obelisk", + SC2_RACESWAP_LOC_ID_OFFSET + 4701, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "West Obelisk", + SC2_RACESWAP_LOC_ID_OFFSET + 4702, + LocationType.VANILLA, + lambda state: adv_tactics + or (logic.terran_common_unit(state) and logic.terran_basic_anti_air(state)), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4703, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Southwest Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4704, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Southeast Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4705, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Northeast Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4706, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_T.mission_name, + "Northwest Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4707, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 4800, + LocationType.VICTORY, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Close Obelisk", + SC2_RACESWAP_LOC_ID_OFFSET + 4801, + LocationType.VANILLA, + lambda state: adv_tactics or logic.zerg_common_unit(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "West Obelisk", + SC2_RACESWAP_LOC_ID_OFFSET + 4802, + LocationType.VANILLA, + lambda state: ( + adv_tactics + or ( + logic.zerg_common_unit(state) + and logic.zerg_basic_kerriganless_anti_air(state) + and logic.spread_creep(state) + ) + ), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Base", + SC2_RACESWAP_LOC_ID_OFFSET + 4803, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Southwest Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4804, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Southeast Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4805, + LocationType.EXTRA, + logic.zerg_common_unit, + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Northeast Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4806, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.ECHOES_OF_THE_FUTURE_Z.mission_name, + "Northwest Tendril", + SC2_RACESWAP_LOC_ID_OFFSET + 4807, + LocationType.EXTRA, + lambda state: logic.zerg_common_unit(state) + and logic.zerg_competent_anti_air(state), + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Defeat", + SC2_RACESWAP_LOC_ID_OFFSET + 4900, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Protoss Archive", + SC2_RACESWAP_LOC_ID_OFFSET + 4901, + LocationType.VANILLA, + logic.terran_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Kills", + SC2_RACESWAP_LOC_ID_OFFSET + 4902, + LocationType.VANILLA, + logic.terran_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Urun", + SC2_RACESWAP_LOC_ID_OFFSET + 4903, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Mohandar", + SC2_RACESWAP_LOC_ID_OFFSET + 4904, + LocationType.EXTRA, + logic.terran_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Selendis", + SC2_RACESWAP_LOC_ID_OFFSET + 4905, + LocationType.EXTRA, + logic.terran_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_T.mission_name, + "Artanis", + SC2_RACESWAP_LOC_ID_OFFSET + 4906, + LocationType.EXTRA, + logic.terran_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Defeat", + SC2_RACESWAP_LOC_ID_OFFSET + 5000, + LocationType.VICTORY, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Protoss Archive", + SC2_RACESWAP_LOC_ID_OFFSET + 5001, + LocationType.VANILLA, + logic.zerg_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Kills", + SC2_RACESWAP_LOC_ID_OFFSET + 5002, + LocationType.VANILLA, + logic.zerg_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Urun", + SC2_RACESWAP_LOC_ID_OFFSET + 5003, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Mohandar", + SC2_RACESWAP_LOC_ID_OFFSET + 5004, + LocationType.EXTRA, + logic.zerg_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Selendis", + SC2_RACESWAP_LOC_ID_OFFSET + 5005, + LocationType.EXTRA, + logic.zerg_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.IN_UTTER_DARKNESS_Z.mission_name, + "Artanis", + SC2_RACESWAP_LOC_ID_OFFSET + 5006, + LocationType.EXTRA, + logic.zerg_in_utter_darkness_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5100, + LocationType.VICTORY, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Large Army", + SC2_RACESWAP_LOC_ID_OFFSET + 5101, + LocationType.VANILLA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "2 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5102, + LocationType.VANILLA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "4 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5103, + LocationType.VANILLA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "6 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5104, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "8 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5105, + LocationType.CHALLENGE, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Southwest Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5106, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Northwest Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5107, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Northeast Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5108, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "East Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5109, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Southeast Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5110, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_Z.mission_name, + "Expansion Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5111, + LocationType.EXTRA, + logic.zerg_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5200, + LocationType.VICTORY, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Large Army", + SC2_RACESWAP_LOC_ID_OFFSET + 5201, + LocationType.VANILLA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "2 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5202, + LocationType.VANILLA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "4 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5203, + LocationType.VANILLA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "6 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5204, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "8 Drop Pods", + SC2_RACESWAP_LOC_ID_OFFSET + 5205, + LocationType.CHALLENGE, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Southwest Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5206, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Northwest Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5207, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Northeast Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5208, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "East Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5209, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Southeast Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5210, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.GATES_OF_HELL_P.mission_name, + "Expansion Spore Cannon", + SC2_RACESWAP_LOC_ID_OFFSET + 5211, + LocationType.EXTRA, + logic.protoss_gates_of_hell_requirement, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5500, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Close Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5501, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Northwest Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5502, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Southeast Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5503, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Southwest Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5504, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Leviathan", + SC2_RACESWAP_LOC_ID_OFFSET + 5505, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "East Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5506, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "North Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5507, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_Z.mission_name, + "Mid Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5508, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5600, + LocationType.VICTORY, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_army_weapon_armor_upgrade_min_level(state) >= 2, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Close Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5601, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Northwest Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5602, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Southeast Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5603, + LocationType.VANILLA, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_army_weapon_armor_upgrade_min_level(state) >= 2, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Southwest Coolant Tower", + SC2_RACESWAP_LOC_ID_OFFSET + 5604, + LocationType.VANILLA, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_army_weapon_armor_upgrade_min_level(state) >= 2, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Leviathan", + SC2_RACESWAP_LOC_ID_OFFSET + 5605, + LocationType.VANILLA, + lambda state: logic.protoss_competent_comp(state) + and logic.protoss_army_weapon_armor_upgrade_min_level(state) >= 2, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "East Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5606, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "North Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5607, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.SHATTER_THE_SKY_P.mission_name, + "Mid Hatchery", + SC2_RACESWAP_LOC_ID_OFFSET + 5608, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5700, + LocationType.VICTORY, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "First Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5701, + LocationType.EXTRA, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "Second Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5702, + LocationType.EXTRA, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "Third Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5703, + LocationType.EXTRA, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "Fourth Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5704, + LocationType.EXTRA, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_Z.mission_name, + "Fifth Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5705, + LocationType.EXTRA, + logic.zerg_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5800, + LocationType.VICTORY, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "First Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5801, + LocationType.EXTRA, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "Second Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5802, + LocationType.EXTRA, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "Third Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5803, + LocationType.EXTRA, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "Fourth Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5804, + LocationType.EXTRA, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.ALL_IN_P.mission_name, + "Fifth Kerrigan Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 5805, + LocationType.EXTRA, + logic.protoss_all_in_requirement, + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 5900, + LocationType.VICTORY, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Gather Minerals", + SC2_RACESWAP_LOC_ID_OFFSET + 5901, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "South Marine Group", + SC2_RACESWAP_LOC_ID_OFFSET + 5902, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "East Marine Group", + SC2_RACESWAP_LOC_ID_OFFSET + 5903, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "West Marine Group", + SC2_RACESWAP_LOC_ID_OFFSET + 5904, + LocationType.VANILLA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 5905, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Supply Depot", + SC2_RACESWAP_LOC_ID_OFFSET + 5906, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Gas Turrets", + SC2_RACESWAP_LOC_ID_OFFSET + 5907, + LocationType.EXTRA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_T.mission_name, + "Win In Under 10 Minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 5908, + LocationType.CHALLENGE, + lambda state: logic.terran_common_unit(state) + and logic.terran_early_tech(state), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6000, + LocationType.VICTORY, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Gather Minerals", + SC2_RACESWAP_LOC_ID_OFFSET + 6001, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "South Zealot Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6002, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "East Zealot Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6003, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "West Zealot Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6004, + LocationType.VANILLA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Nexus", + SC2_RACESWAP_LOC_ID_OFFSET + 6005, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 6006, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Gas Turrets", + SC2_RACESWAP_LOC_ID_OFFSET + 6007, + LocationType.EXTRA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.LAB_RAT_P.mission_name, + "Win In Under 10 Minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 6008, + LocationType.CHALLENGE, + logic.protoss_common_unit, + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6300, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_basic_anti_air(state) + and logic.terran_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Right Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6301, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_basic_anti_air(state) + and logic.terran_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Center Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6302, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_basic_anti_air(state) + and logic.terran_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Left Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6303, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_basic_anti_air(state) + and logic.terran_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Hold Out Finished", + SC2_RACESWAP_LOC_ID_OFFSET + 6304, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_basic_anti_air(state) + and logic.terran_defense_rating(state, False, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_T.mission_name, + "Kill All Buildings Before Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 6305, + LocationType.MASTERY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_comp(state) + and logic.terran_defense_rating(state, False, False) >= 3 + and logic.terran_power_rating(state) >= 5 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6400, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Right Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6401, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Center Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6402, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Left Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6403, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Hold Out Finished", + SC2_RACESWAP_LOC_ID_OFFSET + 6404, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and logic.protoss_defense_rating(state, False) >= 3 + ), + ), + make_location_data( + SC2Mission.RENDEZVOUS_P.mission_name, + "Kill All Buildings Before Reinforcements", + SC2_RACESWAP_LOC_ID_OFFSET + 6405, + LocationType.MASTERY, + lambda state: ( + logic.protoss_competent_comp(state) + and logic.protoss_defense_rating(state, False) >= 3 + and logic.protoss_power_rating(state) >= 5 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6500, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "First Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "North Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6502, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "West Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6503, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Lost Base", + SC2_RACESWAP_LOC_ID_OFFSET + 6504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Northeast Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6505, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Northwest Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6506, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Southwest Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6507, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "Nafash", + SC2_RACESWAP_LOC_ID_OFFSET + 6508, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_T.mission_name, + "20 Unfrozen Structures", + SC2_RACESWAP_LOC_ID_OFFSET + 6509, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6600, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "First Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "North Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6602, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "West Ursadon Matriarch", + SC2_RACESWAP_LOC_ID_OFFSET + 6603, + LocationType.VANILLA, + logic.protoss_common_unit_basic_aa, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Lost Base", + SC2_RACESWAP_LOC_ID_OFFSET + 6604, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Northeast Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6605, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Northwest Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6606, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Southwest Psi-link Spire", + SC2_RACESWAP_LOC_ID_OFFSET + 6607, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "Nafash", + SC2_RACESWAP_LOC_ID_OFFSET + 6608, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.HARVEST_OF_SCREAMS_P.mission_name, + "20 Unfrozen Structures", + SC2_RACESWAP_LOC_ID_OFFSET + 6609, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6700, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "East Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6701, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Center Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6702, + LocationType.VANILLA, + lambda state: logic.terran_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "West Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6703, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Destroy 4 Shuttles", + SC2_RACESWAP_LOC_ID_OFFSET + 6704, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state) + ), + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Frozen Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 6705, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Southwest Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6706, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Southeast Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6707, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "West Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6708, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "East Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6709, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and logic.terran_competent_anti_air(state), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "West Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6710, + LocationType.CHALLENGE, + lambda state: logic.terran_beats_protoss_deathball(state) + and logic.terran_common_unit(state), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "Center Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6711, + LocationType.CHALLENGE, + lambda state: logic.terran_beats_protoss_deathball(state) + and logic.terran_competent_ground_to_air(state) + and logic.terran_common_unit(state), + hard_rule=logic.terran_any_anti_air, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_T.mission_name, + "East Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6712, + LocationType.CHALLENGE, + lambda state: logic.terran_beats_protoss_deathball(state) + and logic.terran_competent_ground_to_air(state) + and logic.terran_common_unit(state), + hard_rule=logic.terran_any_anti_air, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 6800, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "East Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6801, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Center Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6802, + LocationType.VANILLA, + lambda state: logic.protoss_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "West Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 6803, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Destroy 4 Shuttles", + SC2_RACESWAP_LOC_ID_OFFSET + 6804, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Frozen Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 6805, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Southwest Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6806, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Southeast Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6807, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) or adv_tactics, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "West Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6808, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "East Frozen Group", + SC2_RACESWAP_LOC_ID_OFFSET + 6809, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_armor_anti_air(state) + ), + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "West Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6810, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "Center Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6811, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.SHOOT_THE_MESSENGER_P.mission_name, + "East Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 6812, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7100, + LocationType.VICTORY, + lambda state: logic.terran_common_unit(state) + and (logic.terran_basic_anti_air(state) or adv_tactics), + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Center Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7101, + LocationType.VANILLA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "North Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7102, + LocationType.VANILLA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Repel Zagara", + SC2_RACESWAP_LOC_ID_OFFSET + 7103, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Close Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7104, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "South Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7105, + LocationType.EXTRA, + lambda state: adv_tactics or logic.terran_common_unit(state), + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Southwest Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7106, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Southeast Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7107, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and (logic.terran_basic_anti_air(state) or adv_tactics), + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "North Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7108, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Northeast Bunker", + SC2_RACESWAP_LOC_ID_OFFSET + 7109, + LocationType.EXTRA, + lambda state: logic.terran_common_unit(state) + and (logic.terran_basic_anti_air(state) or adv_tactics), + ), + make_location_data( + SC2Mission.DOMINATION_T.mission_name, + "Win Without 100 Eggs", + SC2_RACESWAP_LOC_ID_OFFSET + 7110, + LocationType.CHALLENGE, + logic.terran_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7200, + LocationType.VICTORY, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_basic_anti_air(state)), + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Center Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7201, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "North Infested Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7202, + LocationType.VANILLA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Repel Zagara", + SC2_RACESWAP_LOC_ID_OFFSET + 7203, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Close Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7204, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "South Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7205, + LocationType.EXTRA, + lambda state: adv_tactics or logic.protoss_common_unit(state), + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Southwest Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7206, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Southeast Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7207, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_basic_anti_air(state)), + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "North Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7208, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Northeast Templar", + SC2_RACESWAP_LOC_ID_OFFSET + 7209, + LocationType.EXTRA, + lambda state: logic.protoss_common_unit(state) + and (adv_tactics or logic.protoss_basic_anti_air(state)), + ), + make_location_data( + SC2Mission.DOMINATION_P.mission_name, + "Win Without 100 Eggs", + SC2_RACESWAP_LOC_ID_OFFSET + 7210, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7300, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "West Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7301, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "North Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7302, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "South Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7303, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "Destroy 3 Gorgons", + SC2_RACESWAP_LOC_ID_OFFSET + 7304, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "Close Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7305, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "South Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7306, + LocationType.EXTRA, + logic.terran_common_unit, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "North Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7307, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "West Medic Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7308, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "East Medic Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7309, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "South Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7310, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "Northwest Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7311, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_T.mission_name, + "Southeast Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7312, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7400, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "West Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "North Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7402, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "South Biomass", + SC2_RACESWAP_LOC_ID_OFFSET + 7403, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "Destroy 3 Gorgons", + SC2_RACESWAP_LOC_ID_OFFSET + 7404, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "Close Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7405, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "South Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7406, + LocationType.EXTRA, + logic.protoss_common_unit, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "North Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7407, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "West Energizer Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7408, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "East Energizer Rescue", + SC2_RACESWAP_LOC_ID_OFFSET + 7409, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "South Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7410, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "Northwest Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7411, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.FIRE_IN_THE_SKY_P.mission_name, + "Southeast Orbital Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 7412, + LocationType.CHALLENGE, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_competent_comp(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7500, + LocationType.VICTORY, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "East Science Lab", + SC2_RACESWAP_LOC_ID_OFFSET + 7501, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "North Science Lab", + SC2_RACESWAP_LOC_ID_OFFSET + 7502, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "Get Nuked", + SC2_RACESWAP_LOC_ID_OFFSET + 7503, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "Entrance Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 7504, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "Citadel Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 7505, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "South Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 7506, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_T.mission_name, + "Rich Mineral Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 7507, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7600, + LocationType.VICTORY, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "East Science Lab", + SC2_RACESWAP_LOC_ID_OFFSET + 7601, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "North Science Lab", + SC2_RACESWAP_LOC_ID_OFFSET + 7602, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "Get Nuked", + SC2_RACESWAP_LOC_ID_OFFSET + 7603, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "Entrance Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 7604, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "Citadel Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 7605, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "South Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 7606, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.OLD_SOLDIERS_P.mission_name, + "Rich Mineral Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 7607, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7700, + LocationType.VICTORY, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "Center Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7701, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "East Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7702, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_basic_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "South Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7703, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + and logic.terran_basic_anti_air(state) + or logic.terran_competent_anti_air(state) + ) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "Finish Feeding", + SC2_RACESWAP_LOC_ID_OFFSET + 7704, + LocationType.EXTRA, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "South Proxy Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7705, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "East Proxy Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7706, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "South Main Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7707, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + flags=LocationFlag.BASEBUST, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "East Main Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7708, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) and logic.terran_common_unit(state) + ), + flags=LocationFlag.BASEBUST, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_T.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 7709, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_common_unit(state) + and ( + # Fast unit + state.has_any( + ( + item_names.BANSHEE, + item_names.VULTURE, + item_names.DIAMONDBACK, + item_names.WARHOUND, + item_names.CYCLONE, + ), + player, + ) + or state.has_all( + (item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), + player, + ) + or state.has_all( + ( + item_names.WRAITH, + item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY, + ), + player, + ) + ) + ), + flags=LocationFlag.PREVENTATIVE, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7800, + LocationType.VICTORY, + logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "Center Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "East Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7802, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "South Essence Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7803, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_anti_light_anti_air(state) + ), + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "Finish Feeding", + SC2_RACESWAP_LOC_ID_OFFSET + 7804, + LocationType.EXTRA, + logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "South Proxy Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7805, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "East Proxy Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7806, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "South Main Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7807, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "East Main Primal Hive", + SC2_RACESWAP_LOC_ID_OFFSET + 7808, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.BASEBUST, + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.WAKING_THE_ANCIENT_P.mission_name, + "Flawless", + SC2_RACESWAP_LOC_ID_OFFSET + 7809, + LocationType.CHALLENGE, + logic.protoss_competent_comp, + flags=LocationFlag.PREVENTATIVE, + hard_rule=logic.protoss_any_anti_air_unit, + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 7900, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "Tyrannozor", + SC2_RACESWAP_LOC_ID_OFFSET + 7901, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "Reach the Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 7902, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "15 Minutes Remaining", + SC2_RACESWAP_LOC_ID_OFFSET + 7903, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "5 Minutes Remaining", + SC2_RACESWAP_LOC_ID_OFFSET + 7904, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "Pincer Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 7905, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_T.mission_name, + "Yagdra Claims Brakk's Pack", + SC2_RACESWAP_LOC_ID_OFFSET + 7906, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_defense_rating(state, True, True) >= 7 + and logic.terran_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8000, + LocationType.VICTORY, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "Tyrannozor", + SC2_RACESWAP_LOC_ID_OFFSET + 8001, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "Reach the Pool", + SC2_RACESWAP_LOC_ID_OFFSET + 8002, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "15 Minutes Remaining", + SC2_RACESWAP_LOC_ID_OFFSET + 8003, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "5 Minutes Remaining", + SC2_RACESWAP_LOC_ID_OFFSET + 8004, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "Pincer Attack", + SC2_RACESWAP_LOC_ID_OFFSET + 8005, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_CRUCIBLE_P.mission_name, + "Yagdra Claims Brakk's Pack", + SC2_RACESWAP_LOC_ID_OFFSET + 8006, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_defense_rating(state, True) >= 7 + and logic.protoss_competent_anti_air(state) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8300, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "East Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8301, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Center Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8302, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "West Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8303, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "First Intro Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8304, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Second Intro Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8305, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Base Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8306, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "East Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8307, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + and (adv_tactics or logic.terran_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Mid Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8308, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_moderate_anti_air(state) + and (adv_tactics or logic.terran_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "North Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8309, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_comp(state) + and (adv_tactics or logic.terran_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Close Southwest Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8310, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_comp(state) + and (adv_tactics or logic.terran_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_T.mission_name, + "Far Southwest Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8311, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_comp(state) + and (adv_tactics or logic.terran_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8400, + LocationType.VICTORY, + logic.protoss_competent_comp, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "East Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8401, + LocationType.VANILLA, + lambda state: ( + logic.protoss_common_unit(state) and logic.protoss_basic_anti_air(state) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Center Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8402, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "West Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 8403, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "First Intro Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8404, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Second Intro Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8405, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Base Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8406, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "East Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8407, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and (adv_tactics or logic.protoss_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Mid Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8408, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_basic_anti_air(state) + and (adv_tactics or logic.protoss_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "North Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8409, + LocationType.EXTRA, + lambda state: ( + logic.protoss_common_unit(state) + and logic.protoss_competent_anti_air(state) + and (adv_tactics or logic.protoss_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Close Southwest Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8410, + LocationType.EXTRA, + lambda state: ( + logic.protoss_competent_comp(state) + and (adv_tactics or logic.protoss_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.INFESTED_P.mission_name, + "Far Southwest Garrison", + SC2_RACESWAP_LOC_ID_OFFSET + 8411, + LocationType.EXTRA, + lambda state: ( + logic.protoss_competent_comp(state) + and (adv_tactics or logic.protoss_infested_garrison_claimer(state)) + ), + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8500, + LocationType.VICTORY, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "North War Bot", + SC2_RACESWAP_LOC_ID_OFFSET + 8501, + LocationType.VANILLA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "South War Bot", + SC2_RACESWAP_LOC_ID_OFFSET + 8502, + LocationType.VANILLA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 1 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8503, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 2 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8504, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 3 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8505, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 4 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8506, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 5 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8507, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 6 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8508, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_T.mission_name, + "Kill 7 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8509, + LocationType.EXTRA, + logic.terran_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8600, + LocationType.VICTORY, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "North Stone Zealot", + SC2_RACESWAP_LOC_ID_OFFSET + 8601, + LocationType.VANILLA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "South Stone Zealot", + SC2_RACESWAP_LOC_ID_OFFSET + 8602, + LocationType.VANILLA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 1 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8603, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 2 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8604, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 3 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8605, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 4 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8606, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 5 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8607, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 6 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8608, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.HAND_OF_DARKNESS_P.mission_name, + "Kill 7 Hybrid", + SC2_RACESWAP_LOC_ID_OFFSET + 8609, + LocationType.EXTRA, + logic.protoss_hand_of_darkness_requirement, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8700, + LocationType.VICTORY, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Northwest Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8701, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Northeast Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8702, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "South Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8703, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Base Established", + SC2_RACESWAP_LOC_ID_OFFSET + 8704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Close Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8705, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Mid Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8706, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Southeast Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8707, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Northeast Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8708, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name, + "Northwest Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8709, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 8800, + LocationType.VICTORY, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Northwest Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8801, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Northeast Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8802, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "South Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 8803, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Base Established", + SC2_RACESWAP_LOC_ID_OFFSET + 8804, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Close Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8805, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Mid Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8806, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Southeast Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8807, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Northeast Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8808, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name, + "Northwest Temple", + SC2_RACESWAP_LOC_ID_OFFSET + 8809, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9300, + LocationType.VICTORY, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "East Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9301, + LocationType.VANILLA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "Northwest Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9302, + LocationType.VANILLA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "North Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9303, + LocationType.VANILLA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "1 Laser Drill Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9304, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "2 Laser Drills Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9305, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "3 Laser Drills Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9306, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "4 Laser Drills Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9307, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "5 Laser Drills Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9308, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "Sons of Korhal", + SC2_RACESWAP_LOC_ID_OFFSET + 9309, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "Night Wolves", + SC2_RACESWAP_LOC_ID_OFFSET + 9310, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "West Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 9311, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_T.mission_name, + "Mid Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 9312, + LocationType.EXTRA, + logic.terran_planetfall_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9400, + LocationType.VICTORY, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "East Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9401, + LocationType.VANILLA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "Northwest Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9402, + LocationType.VANILLA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "North Gate", + SC2_RACESWAP_LOC_ID_OFFSET + 9403, + LocationType.VANILLA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "1 Particle Cannon Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9404, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "2 Particle Cannons Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9405, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "3 Particle Cannons Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9406, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "4 Particle Cannons Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9407, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "5 Particle Cannons Deployed", + SC2_RACESWAP_LOC_ID_OFFSET + 9408, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "Sons of Korhal", + SC2_RACESWAP_LOC_ID_OFFSET + 9409, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "Night Wolves", + SC2_RACESWAP_LOC_ID_OFFSET + 9410, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "West Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 9411, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.PLANETFALL_P.mission_name, + "Mid Expansion", + SC2_RACESWAP_LOC_ID_OFFSET + 9412, + LocationType.EXTRA, + logic.protoss_planetfall_requirement, + hard_rule=logic.protoss_any_anti_air_unit_or_soa_any_protoss, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9500, + LocationType.VICTORY, + logic.terran_base_trasher, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "First Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "Second Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9502, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "Third Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9503, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "Expansion Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 9504, + LocationType.EXTRA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_T.mission_name, + "Main Path Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 9505, + LocationType.EXTRA, + logic.terran_base_trasher, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9600, + LocationType.VICTORY, + lambda state: logic.protoss_deathball(state) + or (adv_tactics and logic.protoss_competent_comp(state)), + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "First Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "Second Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9602, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "Third Power Link", + SC2_RACESWAP_LOC_ID_OFFSET + 9603, + LocationType.VANILLA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "Expansion Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 9604, + LocationType.EXTRA, + logic.protoss_competent_comp, + ), + make_location_data( + SC2Mission.DEATH_FROM_ABOVE_P.mission_name, + "Main Path Command Center", + SC2_RACESWAP_LOC_ID_OFFSET + 9605, + LocationType.EXTRA, + lambda state: logic.protoss_deathball(state) + or (adv_tactics and logic.protoss_competent_comp(state)), + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9700, + LocationType.VICTORY, + logic.terran_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "South Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9701, + LocationType.VANILLA, + logic.terran_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "North Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9702, + LocationType.VANILLA, + logic.terran_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "East Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9703, + LocationType.VANILLA, + logic.terran_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "Odin", + SC2_RACESWAP_LOC_ID_OFFSET + 9704, + LocationType.EXTRA, + logic.terran_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_T.mission_name, + "Trash the Odin Early", + SC2_RACESWAP_LOC_ID_OFFSET + 9705, + LocationType.MASTERY, + lambda state: ( + logic.terran_the_reckoning_requirement(state) + and logic.terran_power_rating(state) >= 10 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9800, + LocationType.VICTORY, + logic.protoss_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "South Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9801, + LocationType.VANILLA, + logic.protoss_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "North Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9802, + LocationType.VANILLA, + logic.protoss_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "East Lane", + SC2_RACESWAP_LOC_ID_OFFSET + 9803, + LocationType.VANILLA, + logic.protoss_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "Odin", + SC2_RACESWAP_LOC_ID_OFFSET + 9804, + LocationType.EXTRA, + logic.protoss_the_reckoning_requirement, + ), + make_location_data( + SC2Mission.THE_RECKONING_P.mission_name, + "Trash the Odin Early", + SC2_RACESWAP_LOC_ID_OFFSET + 9805, + LocationType.MASTERY, + lambda state: ( + logic.protoss_the_reckoning_requirement(state) + and ( + logic.protoss_fleet(state) + or logic.protoss_power_rating(state) >= 10 + ) + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 9900, + LocationType.VICTORY, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "First Prisoner Group", + SC2_RACESWAP_LOC_ID_OFFSET + 9901, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "Second Prisoner Group", + SC2_RACESWAP_LOC_ID_OFFSET + 9902, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "First Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 9903, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "Second Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 9904, + LocationType.VANILLA, + logic.terran_competent_comp, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_T.mission_name, + "Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 9905, + LocationType.MASTERY, + lambda state: ( + logic.terran_competent_comp(state) + and logic.terran_base_trasher(state) + and logic.terran_power_rating(state) >= 6 + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10000, + LocationType.VICTORY, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state), + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "First Prisoner Group", + SC2_RACESWAP_LOC_ID_OFFSET + 10001, + LocationType.VANILLA, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state), + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "Second Prisoner Group", + SC2_RACESWAP_LOC_ID_OFFSET + 10002, + LocationType.VANILLA, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state), + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "First Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10003, + LocationType.VANILLA, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state), + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "Second Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10004, + LocationType.VANILLA, + lambda state: logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state), + ), + make_location_data( + SC2Mission.DARK_WHISPERS_Z.mission_name, + "Zerg Base", + SC2_RACESWAP_LOC_ID_OFFSET + 10005, + LocationType.MASTERY, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_moderate_anti_air(state) + and logic.zerg_base_buster(state) + and logic.zerg_power_rating(state) >= 6 + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10100, + LocationType.VICTORY, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_T.mission_name, + "South Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10101, + LocationType.VANILLA, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_T.mission_name, + "West Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10102, + LocationType.VANILLA, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_T.mission_name, + "East Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10103, + LocationType.VANILLA, + lambda state: ( + logic.terran_beats_protoss_deathball(state) + and logic.terran_mineral_dump(state) + and logic.terran_can_grab_ghosts_in_the_fog_east_rock_formation(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10200, + LocationType.VICTORY, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_Z.mission_name, + "South Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10201, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_Z.mission_name, + "West Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10202, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_mineral_dump(state) + ), + ), + make_location_data( + SC2Mission.GHOSTS_IN_THE_FOG_Z.mission_name, + "East Rock Formation", + SC2_RACESWAP_LOC_ID_OFFSET + 10203, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_competent_anti_air(state) + and logic.zerg_mineral_dump(state) + and logic.zerg_can_grab_ghosts_in_the_fog_east_rock_formation(state) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10700, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) + and (adv_tactics or logic.terran_moderate_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "Close Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10701, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "East Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10702, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and ( + adv_tactics + or ( + logic.terran_moderate_anti_air(state) + and logic.terran_any_air_unit(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "West Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10703, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and (adv_tactics or logic.terran_moderate_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "Base", + SC2_RACESWAP_LOC_ID_OFFSET + 10704, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_T.mission_name, + "Templar Base", + SC2_RACESWAP_LOC_ID_OFFSET + 10705, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) + and (adv_tactics or logic.terran_moderate_anti_air(state)) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10800, + LocationType.VICTORY, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "Close Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10801, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "East Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10802, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "West Pylon", + SC2_RACESWAP_LOC_ID_OFFSET + 10803, + LocationType.VANILLA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "Base", + SC2_RACESWAP_LOC_ID_OFFSET + 10804, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.THE_GROWING_SHADOW_Z.mission_name, + "Templar Base", + SC2_RACESWAP_LOC_ID_OFFSET + 10805, + LocationType.EXTRA, + lambda state: ( + logic.zerg_common_unit(state) and logic.zerg_moderate_anti_air(state) + ), + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 10900, + LocationType.VICTORY, + logic.terran_spear_of_adun_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "Factory", + SC2_RACESWAP_LOC_ID_OFFSET + 10901, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "Armory", + SC2_RACESWAP_LOC_ID_OFFSET + 10902, + LocationType.VANILLA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "Starport", + SC2_RACESWAP_LOC_ID_OFFSET + 10903, + LocationType.VANILLA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "North Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 10904, + LocationType.EXTRA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "East Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 10905, + LocationType.EXTRA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "South Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 10906, + LocationType.EXTRA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_T.mission_name, + "Southeast Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 10907, + LocationType.EXTRA, + logic.terran_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11000, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "Baneling Nest", + SC2_RACESWAP_LOC_ID_OFFSET + 11001, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "Roach Warren", + SC2_RACESWAP_LOC_ID_OFFSET + 11002, + LocationType.VANILLA, + lambda state: ( + logic.zerg_spear_of_adun_requirement(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "Infestation Pit", + SC2_RACESWAP_LOC_ID_OFFSET + 11003, + LocationType.VANILLA, + lambda state: ( + logic.zerg_spear_of_adun_requirement(state) + and logic.spread_creep(state) + ), + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "North Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 11004, + LocationType.EXTRA, + logic.zerg_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "East Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 11005, + LocationType.EXTRA, + logic.zerg_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "South Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 11006, + LocationType.EXTRA, + logic.zerg_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.THE_SPEAR_OF_ADUN_Z.mission_name, + "Southeast Power Cell", + SC2_RACESWAP_LOC_ID_OFFSET + 11007, + LocationType.EXTRA, + logic.zerg_spear_of_adun_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11100, + LocationType.VICTORY, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Mid EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11101, + LocationType.VANILLA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Southeast EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11102, + LocationType.VANILLA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "North EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11103, + LocationType.VANILLA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Mid Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11104, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Southwest Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11105, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Northwest Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11106, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Northeast Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11107, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "Southeast Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11108, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "West Raynor Base", + SC2_RACESWAP_LOC_ID_OFFSET + 11109, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_T.mission_name, + "East Raynor Base", + SC2_RACESWAP_LOC_ID_OFFSET + 11110, + LocationType.EXTRA, + logic.terran_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11200, + LocationType.VICTORY, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Mid EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11201, + LocationType.VANILLA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Southeast EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11202, + LocationType.VANILLA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "North EMP Scrambler", + SC2_RACESWAP_LOC_ID_OFFSET + 11203, + LocationType.VANILLA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Mid Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11204, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Southwest Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11205, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Northwest Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11206, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Northeast Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11207, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "Southeast Stabilizer", + SC2_RACESWAP_LOC_ID_OFFSET + 11208, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "West Raynor Base", + SC2_RACESWAP_LOC_ID_OFFSET + 11209, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.SKY_SHIELD_Z.mission_name, + "East Raynor Base", + SC2_RACESWAP_LOC_ID_OFFSET + 11210, + LocationType.EXTRA, + logic.zerg_sky_shield_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11300, + LocationType.VICTORY, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "Mid Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11301, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "North Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11302, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_competent_comp(state) + or ( + logic.take_over_ai_allies + and logic.advanced_tactics + and logic.terran_common_unit(state) + ) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "South Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11303, + LocationType.VANILLA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "Raynor Forward Positions", + SC2_RACESWAP_LOC_ID_OFFSET + 11304, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "Valerian Forward Positions", + SC2_RACESWAP_LOC_ID_OFFSET + 11305, + LocationType.EXTRA, + lambda state: ( + logic.terran_common_unit(state) and logic.terran_competent_comp(state) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_T.mission_name, + "Win in under 15 Minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 11306, + LocationType.CHALLENGE, + lambda state: ( + logic.terran_common_unit(state) + and logic.terran_base_trasher(state) + and logic.terran_power_rating(state) >= 8 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11400, + LocationType.VICTORY, + logic.zerg_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "Mid Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11401, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "North Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11402, + LocationType.VANILLA, + lambda state: ( + logic.zerg_brothers_in_arms_requirement(state) + or ( + logic.take_over_ai_allies + and logic.advanced_tactics + and ( + logic.zerg_common_unit(state) or logic.terran_common_unit(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "South Science Facility", + SC2_RACESWAP_LOC_ID_OFFSET + 11403, + LocationType.VANILLA, + logic.zerg_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "Raynor Forward Positions", + SC2_RACESWAP_LOC_ID_OFFSET + 11404, + LocationType.EXTRA, + logic.zerg_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "Valerian Forward Positions", + SC2_RACESWAP_LOC_ID_OFFSET + 11405, + LocationType.EXTRA, + logic.zerg_brothers_in_arms_requirement, + ), + make_location_data( + SC2Mission.BROTHERS_IN_ARMS_Z.mission_name, + "Win in under 15 Minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 11406, + LocationType.CHALLENGE, + lambda state: ( + logic.zerg_brothers_in_arms_requirement(state) + and logic.zerg_base_buster(state) + and logic.zerg_power_rating(state) >= 8 + ), + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11500, + LocationType.VICTORY, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "Close Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11501, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "North Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11502, + LocationType.VANILLA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "East Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11503, + LocationType.VANILLA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "West Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11504, + LocationType.EXTRA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "South Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11505, + LocationType.EXTRA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "Northwest Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11506, + LocationType.EXTRA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_T.mission_name, + "East Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11507, + LocationType.EXTRA, + lambda state: (logic.terran_competent_comp(state)), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11600, + LocationType.VICTORY, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "Close Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11601, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "North Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11602, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "East Solarite Reserve", + SC2_RACESWAP_LOC_ID_OFFSET + 11603, + LocationType.VANILLA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "West Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11604, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "South Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11605, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "Northwest Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11606, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.AMON_S_REACH_Z.mission_name, + "East Launch Bay", + SC2_RACESWAP_LOC_ID_OFFSET + 11607, + LocationType.EXTRA, + lambda state: ( + logic.zerg_competent_comp(state) + and logic.zerg_basic_kerriganless_anti_air(state) + ), + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11700, + LocationType.VICTORY, + logic.terran_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "West Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11701, + LocationType.VANILLA, + logic.terran_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "North Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11702, + LocationType.VANILLA, + logic.terran_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "East Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11703, + LocationType.VANILLA, + logic.terran_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "1 Billion Zerg", + SC2_RACESWAP_LOC_ID_OFFSET + 11704, + LocationType.EXTRA, + logic.terran_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_T.mission_name, + "1.5 Billion Zerg", + SC2_RACESWAP_LOC_ID_OFFSET + 11705, + LocationType.VANILLA, + lambda state: logic.terran_last_stand_requirement(state) + and logic.terran_defense_rating(state, True, True) >= 13, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11800, + LocationType.VICTORY, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "West Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11801, + LocationType.VANILLA, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "North Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11802, + LocationType.VANILLA, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "East Zenith Stone", + SC2_RACESWAP_LOC_ID_OFFSET + 11803, + LocationType.VANILLA, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "1 Billion Zerg", + SC2_RACESWAP_LOC_ID_OFFSET + 11804, + LocationType.EXTRA, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.LAST_STAND_Z.mission_name, + "1.5 Billion Zerg", + SC2_RACESWAP_LOC_ID_OFFSET + 11805, + LocationType.VANILLA, + logic.zerg_last_stand_requirement, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 11900, + LocationType.VICTORY, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "South Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 11901, + LocationType.VANILLA, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "North Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 11902, + LocationType.VANILLA, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "Northwest Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 11903, + LocationType.VANILLA, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "Rescue Medics", + SC2_RACESWAP_LOC_ID_OFFSET + 11904, + LocationType.EXTRA, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_T.mission_name, + "Destroy Gateways", + SC2_RACESWAP_LOC_ID_OFFSET + 11905, + LocationType.CHALLENGE, + logic.terran_beats_protoss_deathball, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12000, + LocationType.VICTORY, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "South Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 12001, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "North Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 12002, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "Northwest Solarite", + SC2_RACESWAP_LOC_ID_OFFSET + 12003, + LocationType.VANILLA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "Rescue Infested Medics", + SC2_RACESWAP_LOC_ID_OFFSET + 12004, + LocationType.EXTRA, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.FORBIDDEN_WEAPON_Z.mission_name, + "Destroy Gateways", + SC2_RACESWAP_LOC_ID_OFFSET + 12005, + LocationType.CHALLENGE, + logic.zerg_competent_comp_competent_aa, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12100, + LocationType.VICTORY, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "Mid Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12101, + LocationType.EXTRA, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "West Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12102, + LocationType.EXTRA, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "South Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12103, + LocationType.EXTRA, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "East Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12104, + LocationType.EXTRA, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "North Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12105, + LocationType.EXTRA, + logic.terran_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "Titanic Warp Prism", + SC2_RACESWAP_LOC_ID_OFFSET + 12106, + LocationType.VANILLA, + logic.terran_temple_of_unification_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "Terran Main Base", + SC2_RACESWAP_LOC_ID_OFFSET + 12107, + LocationType.MASTERY, + lambda state: ( + logic.terran_temple_of_unification_requirement(state) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_T.mission_name, + "Protoss Main Base", + SC2_RACESWAP_LOC_ID_OFFSET + 12108, + LocationType.MASTERY, + lambda state: ( + logic.terran_temple_of_unification_requirement(state) + and logic.terran_base_trasher(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12200, + LocationType.VICTORY, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "Mid Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12201, + LocationType.EXTRA, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "West Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12202, + LocationType.EXTRA, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "South Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12203, + LocationType.EXTRA, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "East Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12204, + LocationType.EXTRA, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "North Celestial Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12205, + LocationType.EXTRA, + logic.zerg_temple_of_unification_requirement, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "Titanic Warp Prism", + SC2_RACESWAP_LOC_ID_OFFSET + 12206, + LocationType.VANILLA, + logic.zerg_temple_of_unification_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "Terran Main Base", + SC2_RACESWAP_LOC_ID_OFFSET + 12207, + LocationType.MASTERY, + lambda state: ( + logic.zerg_temple_of_unification_requirement(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.TEMPLE_OF_UNIFICATION_Z.mission_name, + "Protoss Main Base", + SC2_RACESWAP_LOC_ID_OFFSET + 12208, + LocationType.MASTERY, + lambda state: ( + logic.zerg_temple_of_unification_requirement(state) + and logic.zerg_base_buster(state) + ), + flags=LocationFlag.BASEBUST, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12500, + LocationType.VICTORY, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Artanis", + SC2_RACESWAP_LOC_ID_OFFSET + 12501, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Northwest Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12502, + LocationType.EXTRA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Northeast Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12503, + LocationType.EXTRA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Southwest Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12504, + LocationType.EXTRA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Southeast Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12505, + LocationType.EXTRA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "South Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12506, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "Mid Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12507, + LocationType.VANILLA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_T.mission_name, + "North Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12508, + LocationType.VANILLA, + logic.terran_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12600, + LocationType.VICTORY, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Artanis", + SC2_RACESWAP_LOC_ID_OFFSET + 12601, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Northwest Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12602, + LocationType.EXTRA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Northeast Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12603, + LocationType.EXTRA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Southwest Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12604, + LocationType.EXTRA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Southeast Void Crystal", + SC2_RACESWAP_LOC_ID_OFFSET + 12605, + LocationType.EXTRA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "South Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12606, + LocationType.VANILLA, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "Mid Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12607, + LocationType.VANILLA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.HARBINGER_OF_OBLIVION_Z.mission_name, + "North Xel'Naga Vessel", + SC2_RACESWAP_LOC_ID_OFFSET + 12608, + LocationType.VANILLA, + logic.zerg_harbinger_of_oblivion_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12700, + LocationType.VICTORY, + logic.terran_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "Zerg Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 12701, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "First Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12702, + LocationType.EXTRA, + lambda state: ( + logic.advanced_tactics + or logic.terran_unsealing_the_past_requirement(state) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "Second Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12703, + LocationType.EXTRA, + logic.terran_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "Third Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12704, + LocationType.EXTRA, + logic.terran_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "Fourth Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12705, + LocationType.EXTRA, + logic.terran_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "South Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 12706, + LocationType.VANILLA, + lambda state: ( + logic.terran_unsealing_the_past_requirement(state) + and ( + adv_tactics + or logic.terran_air(state) + or state.has_all( + {item_names.GOLIATH, item_names.GOLIATH_JUMP_JETS}, player + ) + ) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_T.mission_name, + "East Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 12707, + LocationType.VANILLA, + lambda state: ( + logic.terran_unsealing_the_past_requirement(state) + and ( + adv_tactics + or logic.terran_air(state) + or state.has_all( + {item_names.GOLIATH, item_names.GOLIATH_JUMP_JETS}, player + ) + ) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12800, + LocationType.VICTORY, + logic.zerg_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "Zerg Cleared", + SC2_RACESWAP_LOC_ID_OFFSET + 12801, + LocationType.EXTRA, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "First Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12802, + LocationType.EXTRA, + lambda state: ( + logic.advanced_tactics + or logic.zerg_unsealing_the_past_requirement(state) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "Second Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12803, + LocationType.EXTRA, + logic.zerg_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "Third Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12804, + LocationType.EXTRA, + logic.zerg_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "Fourth Stasis Lock", + SC2_RACESWAP_LOC_ID_OFFSET + 12805, + LocationType.EXTRA, + logic.zerg_unsealing_the_past_requirement, + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "South Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 12806, + LocationType.VANILLA, + lambda state: ( + logic.zerg_unsealing_the_past_requirement(state) + and ( + adv_tactics + or ( + state.has(item_names.MUTALISK, player) + or logic.morph_brood_lord(state) + or logic.morph_guardian(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.UNSEALING_THE_PAST_Z.mission_name, + "East Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 12807, + LocationType.VANILLA, + lambda state: ( + logic.zerg_unsealing_the_past_requirement(state) + and ( + adv_tactics + or ( + state.has(item_names.MUTALISK, player) + or logic.morph_brood_lord(state) + or logic.morph_guardian(state) + ) + ) + ), + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 12900, + LocationType.VICTORY, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "North Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12901, + LocationType.VANILLA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "North Sector: Northeast Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12902, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "North Sector: Southeast Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12903, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "South Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12904, + LocationType.VANILLA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "South Sector: North Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12905, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "South Sector: East Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12906, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "West Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12907, + LocationType.VANILLA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "West Sector: Mid Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12908, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "West Sector: East Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12909, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "East Sector: North Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12910, + LocationType.VANILLA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "East Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12911, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "East Sector: South Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 12912, + LocationType.EXTRA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_T.mission_name, + "Purifier Warden", + SC2_RACESWAP_LOC_ID_OFFSET + 12913, + LocationType.VANILLA, + logic.terran_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13000, + LocationType.VICTORY, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "North Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13001, + LocationType.VANILLA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "North Sector: Northeast Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13002, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "North Sector: Southeast Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13003, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "South Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13004, + LocationType.VANILLA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "South Sector: North Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13005, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "South Sector: East Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13006, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "West Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13007, + LocationType.VANILLA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "West Sector: Mid Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13008, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "West Sector: East Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13009, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "East Sector: North Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13010, + LocationType.VANILLA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "East Sector: West Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13011, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "East Sector: South Null Circuit", + SC2_RACESWAP_LOC_ID_OFFSET + 13012, + LocationType.EXTRA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.PURIFICATION_Z.mission_name, + "Purifier Warden", + SC2_RACESWAP_LOC_ID_OFFSET + 13013, + LocationType.VANILLA, + logic.zerg_purification_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13100, + LocationType.VICTORY, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "First Terrazine Fog", + SC2_RACESWAP_LOC_ID_OFFSET + 13101, + LocationType.EXTRA, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "Southwest Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13102, + LocationType.EXTRA, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "West Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13103, + LocationType.EXTRA, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "Northwest Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13104, + LocationType.EXTRA, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "Northeast Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13105, + LocationType.EXTRA, + logic.terran_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "North Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 13106, + LocationType.VANILLA, + logic.terran_steps_of_the_rite_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_T.mission_name, + "South Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 13107, + LocationType.VANILLA, + logic.terran_steps_of_the_rite_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13200, + LocationType.VICTORY, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "First Terrazine Fog", + SC2_RACESWAP_LOC_ID_OFFSET + 13201, + LocationType.EXTRA, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "Southwest Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13202, + LocationType.EXTRA, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "West Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13203, + LocationType.EXTRA, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "Northwest Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13204, + LocationType.EXTRA, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "Northeast Guardian", + SC2_RACESWAP_LOC_ID_OFFSET + 13205, + LocationType.EXTRA, + logic.zerg_steps_of_the_rite_requirement, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "North Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 13206, + LocationType.VANILLA, + logic.zerg_steps_of_the_rite_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.STEPS_OF_THE_RITE_Z.mission_name, + "South Mothership", + SC2_RACESWAP_LOC_ID_OFFSET + 13207, + LocationType.VANILLA, + logic.zerg_steps_of_the_rite_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13300, + LocationType.VICTORY, + logic.terran_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "North Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13301, + LocationType.VANILLA, + logic.terran_rak_shir_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "Southwest Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13302, + LocationType.VANILLA, + logic.terran_rak_shir_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "East Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13303, + LocationType.VANILLA, + logic.terran_rak_shir_requirement, + hard_rule=logic.terran_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 13304, + LocationType.EXTRA, + logic.terran_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "Destroy Nexuses", + SC2_RACESWAP_LOC_ID_OFFSET + 13305, + LocationType.CHALLENGE, + logic.terran_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_T.mission_name, + "Win in under 15 minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 13306, + LocationType.MASTERY, + logic.terran_rak_shir_requirement, + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13400, + LocationType.VICTORY, + logic.zerg_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "North Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13401, + LocationType.VANILLA, + logic.zerg_rak_shir_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "Southwest Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13402, + LocationType.VANILLA, + logic.zerg_rak_shir_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "East Slayn Elemental", + SC2_RACESWAP_LOC_ID_OFFSET + 13403, + LocationType.VANILLA, + logic.zerg_rak_shir_requirement, + hard_rule=logic.zerg_any_anti_air, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "Resource Pickups", + SC2_RACESWAP_LOC_ID_OFFSET + 13404, + LocationType.EXTRA, + logic.zerg_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "Destroy Nexuses", + SC2_RACESWAP_LOC_ID_OFFSET + 13405, + LocationType.CHALLENGE, + logic.zerg_rak_shir_requirement, + ), + make_location_data( + SC2Mission.RAK_SHIR_Z.mission_name, + "Win in under 15 minutes", + SC2_RACESWAP_LOC_ID_OFFSET + 13406, + LocationType.MASTERY, + logic.zerg_rak_shir_requirement, + flags=LocationFlag.SPEEDRUN, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13500, + LocationType.VICTORY, + logic.terran_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "Northwest Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13501, + LocationType.EXTRA, + logic.terran_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "Northeast Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13502, + LocationType.EXTRA, + logic.terran_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "Southeast Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13503, + LocationType.EXTRA, + logic.terran_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "West Hybrid Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 13504, + LocationType.VANILLA, + logic.terran_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_T.mission_name, + "Southeast Hybrid Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 13505, + LocationType.VANILLA, + lambda state: ( + logic.terran_templars_charge_requirement(state) + and logic.terran_air(state) + ), + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13600, + LocationType.VICTORY, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "Northwest Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13601, + LocationType.EXTRA, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "Northeast Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13602, + LocationType.EXTRA, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "Southeast Power Core", + SC2_RACESWAP_LOC_ID_OFFSET + 13603, + LocationType.EXTRA, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "West Hybrid Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 13604, + LocationType.VANILLA, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name, + "Southeast Hybrid Stasis Chamber", + SC2_RACESWAP_LOC_ID_OFFSET + 13605, + LocationType.VANILLA, + logic.zerg_templars_charge_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 13900, + LocationType.VICTORY, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Southeast Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 13901, + LocationType.EXTRA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "South Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 13902, + LocationType.EXTRA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Southwest Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 13903, + LocationType.EXTRA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "North Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 13904, + LocationType.EXTRA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Northwest Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 13905, + LocationType.EXTRA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Nerazim Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 13906, + LocationType.VANILLA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Tal'darim Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 13907, + LocationType.VANILLA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_T.mission_name, + "Purifier Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 13908, + LocationType.VANILLA, + logic.terran_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 14000, + LocationType.VICTORY, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Southeast Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 14001, + LocationType.EXTRA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "South Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 14002, + LocationType.EXTRA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Southwest Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 14003, + LocationType.EXTRA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "North Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 14004, + LocationType.EXTRA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Northwest Void Shard", + SC2_RACESWAP_LOC_ID_OFFSET + 14005, + LocationType.EXTRA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Nerazim Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 14006, + LocationType.VANILLA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Tal'darim Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 14007, + LocationType.VANILLA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.THE_HOST_Z.mission_name, + "Purifier Warp in Zone", + SC2_RACESWAP_LOC_ID_OFFSET + 14008, + LocationType.VANILLA, + logic.zerg_the_host_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 14100, + LocationType.VICTORY, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Fabrication Matrix", + SC2_RACESWAP_LOC_ID_OFFSET + 14101, + LocationType.EXTRA, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Assault Cluster", + SC2_RACESWAP_LOC_ID_OFFSET + 14102, + LocationType.EXTRA, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Hull Breach", + SC2_RACESWAP_LOC_ID_OFFSET + 14103, + LocationType.EXTRA, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Core Critical", + SC2_RACESWAP_LOC_ID_OFFSET + 14104, + LocationType.EXTRA, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_T.mission_name, + "Kill Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 14105, + LocationType.MASTERY, + logic.terran_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Victory", + SC2_RACESWAP_LOC_ID_OFFSET + 14200, + LocationType.VICTORY, + logic.zerg_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Fabrication Matrix", + SC2_RACESWAP_LOC_ID_OFFSET + 14201, + LocationType.EXTRA, + logic.zerg_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Assault Cluster", + SC2_RACESWAP_LOC_ID_OFFSET + 14202, + LocationType.EXTRA, + logic.zerg_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Hull Breach", + SC2_RACESWAP_LOC_ID_OFFSET + 14203, + LocationType.EXTRA, + logic.zerg_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Core Critical", + SC2_RACESWAP_LOC_ID_OFFSET + 14204, + LocationType.EXTRA, + logic.zerg_salvation_requirement, + ), + make_location_data( + SC2Mission.SALVATION_Z.mission_name, + "Kill Brutalisk", + SC2_RACESWAP_LOC_ID_OFFSET + 14205, + LocationType.MASTERY, + logic.zerg_salvation_requirement, + ), + ] + + # Filtering out excluded locations + if world is not None: + excluded_location_types = get_location_types( + world, LocationInclusion.option_disabled + ) + excluded_location_flags = get_location_flags( + world, LocationInclusion.option_disabled + ) + chance_location_types = get_location_types( + world, LocationInclusion.option_half_chance + ) + chance_location_flags = get_location_flags( + world, LocationInclusion.option_half_chance + ) + plando_locations = get_plando_locations(world) + exclude_locations = world.options.exclude_locations.value + + def include_location(location: LocationData) -> bool: + if location.type is LocationType.VICTORY: + return True + if location.name in plando_locations: + return True + if location.name in exclude_locations: + return False + if location.flags & excluded_location_flags: + return False + if location.type in excluded_location_types: + return False + if location.flags & chance_location_flags: + if world.random.random() < 0.5: + return False + if location.type in chance_location_types: + if world.random.random() < 0.5: + return False + return True + + location_table = [ + location for location in location_table if include_location(location) + ] + beat_events: List[LocationData] = [] + victory_caches: List[LocationData] = [] + VICTORY_CACHE_SIZE = 10 + for location_data in location_table: + # Generating Beat event and Victory Cache locations + if location_data.type == LocationType.VICTORY: + beat_events.append( + location_data._replace(name="Beat " + location_data.region, code=None) # type: ignore + ) + for v in range(VICTORY_CACHE_SIZE): + victory_caches.append( + location_data._replace( + name=location_data.name + f" Cache ({v + 1})", + code=location_data.code + VICTORY_CACHE_OFFSET + v, + type=LocationType.VICTORY_CACHE, + ) + ) + + return tuple(location_table + beat_events + victory_caches) + + +DEFAULT_LOCATION_LIST = get_locations(None) +"""A location table with `None` as the input world; does not contain logic rules""" + +lookup_location_id_to_type = { + loc.code: loc.type for loc in DEFAULT_LOCATION_LIST if loc.code is not None +} +lookup_location_id_to_flags = { + loc.code: loc.flags for loc in DEFAULT_LOCATION_LIST if loc.code is not None +} diff --git a/worlds/sc2/mission_groups.py b/worlds/sc2/mission_groups.py new file mode 100644 index 0000000000..de6e7d349c --- /dev/null +++ b/worlds/sc2/mission_groups.py @@ -0,0 +1,194 @@ +""" +Mission group aliases for use in yaml options. +""" + +from typing import Dict, List, Set +from .mission_tables import SC2Mission, MissionFlag, SC2Campaign + + +class MissionGroupNames: + ALL_MISSIONS = "All Missions" + WOL_MISSIONS = "WoL Missions" + HOTS_MISSIONS = "HotS Missions" + LOTV_MISSIONS = "LotV Missions" + NCO_MISSIONS = "NCO Missions" + PROPHECY_MISSIONS = "Prophecy Missions" + PROLOGUE_MISSIONS = "Prologue Missions" + EPILOGUE_MISSIONS = "Epilogue Missions" + + TERRAN_MISSIONS = "Terran Missions" + ZERG_MISSIONS = "Zerg Missions" + PROTOSS_MISSIONS = "Protoss Missions" + NOBUILD_MISSIONS = "No-Build Missions" + DEFENSE_MISSIONS = "Defense Missions" + AUTO_SCROLLER_MISSIONS = "Auto-Scroller Missions" + COUNTDOWN_MISSIONS = "Countdown Missions" + KERRIGAN_MISSIONS = "Kerrigan Missions" + VANILLA_SOA_MISSIONS = "Vanilla SOA Missions" + TERRAN_ALLY_MISSIONS = "Controllable Terran Ally Missions" + ZERG_ALLY_MISSIONS = "Controllable Zerg Ally Missions" + PROTOSS_ALLY_MISSIONS = "Controllable Protoss Ally Missions" + VS_TERRAN_MISSIONS = "Vs Terran Missions" + VS_ZERG_MISSIONS = "Vs Zerg Missions" + VS_PROTOSS_MISSIONS = "Vs Protoss Missions" + RACESWAP_MISSIONS = "Raceswap Missions" + + # By planet + PLANET_MAR_SARA_MISSIONS = "Planet Mar Sara" + PLANET_CHAR_MISSIONS = "Planet Char" + PLANET_KORHAL_MISSIONS = "Planet Korhal" + PLANET_AIUR_MISSIONS = "Planet Aiur" + + # By quest chain + WOL_MAR_SARA_MISSIONS = "WoL Mar Sara" + WOL_COLONIST_MISSIONS = "WoL Colonist" + WOL_ARTIFACT_MISSIONS = "WoL Artifact" + WOL_COVERT_MISSIONS = "WoL Covert" + WOL_REBELLION_MISSIONS = "WoL Rebellion" + WOL_CHAR_MISSIONS = "WoL Char" + + HOTS_UMOJA_MISSIONS = "HotS Umoja" + HOTS_KALDIR_MISSIONS = "HotS Kaldir" + HOTS_CHAR_MISSIONS = "HotS Char" + HOTS_ZERUS_MISSIONS = "HotS Zerus" + HOTS_SKYGEIRR_MISSIONS = "HotS Skygeirr Station" + HOTS_DOMINION_SPACE_MISSIONS = "HotS Dominion Space" + HOTS_KORHAL_MISSIONS = "HotS Korhal" + + LOTV_AIUR_MISSIONS = "LotV Aiur" + LOTV_KORHAL_MISSIONS = "LotV Korhal" + LOTV_SHAKURAS_MISSIONS = "LotV Shakuras" + LOTV_ULNAR_MISSIONS = "LotV Ulnar" + LOTV_PURIFIER_MISSIONS = "LotV Purifier" + LOTV_TALDARIM_MISSIONS = "LotV Tal'darim" + LOTV_MOEBIUS_MISSIONS = "LotV Moebius" + LOTV_RETURN_TO_AIUR_MISSIONS = "LotV Return to Aiur" + + NCO_MISSION_PACK_1 = "NCO Mission Pack 1" + NCO_MISSION_PACK_2 = "NCO Mission Pack 2" + NCO_MISSION_PACK_3 = "NCO Mission Pack 3" + + @classmethod + def get_all_group_names(cls) -> Set[str]: + return { + name + for identifier, name in cls.__dict__.items() + if not identifier.startswith("_") and not identifier.startswith("get_") + } + + +mission_groups: Dict[str, List[str]] = {} + +mission_groups[MissionGroupNames.ALL_MISSIONS] = [mission.mission_name for mission in SC2Mission] +for group_name, campaign in ( + (MissionGroupNames.WOL_MISSIONS, SC2Campaign.WOL), + (MissionGroupNames.HOTS_MISSIONS, SC2Campaign.HOTS), + (MissionGroupNames.LOTV_MISSIONS, SC2Campaign.LOTV), + (MissionGroupNames.NCO_MISSIONS, SC2Campaign.NCO), + (MissionGroupNames.PROPHECY_MISSIONS, SC2Campaign.PROPHECY), + (MissionGroupNames.PROLOGUE_MISSIONS, SC2Campaign.PROLOGUE), + (MissionGroupNames.EPILOGUE_MISSIONS, SC2Campaign.EPILOGUE), +): + mission_groups[group_name] = [mission.mission_name for mission in SC2Mission if mission.campaign == campaign] + +for group_name, flags in ( + (MissionGroupNames.TERRAN_MISSIONS, MissionFlag.Terran), + (MissionGroupNames.ZERG_MISSIONS, MissionFlag.Zerg), + (MissionGroupNames.PROTOSS_MISSIONS, MissionFlag.Protoss), + (MissionGroupNames.NOBUILD_MISSIONS, MissionFlag.NoBuild), + (MissionGroupNames.DEFENSE_MISSIONS, MissionFlag.Defense), + (MissionGroupNames.AUTO_SCROLLER_MISSIONS, MissionFlag.AutoScroller), + (MissionGroupNames.COUNTDOWN_MISSIONS, MissionFlag.Countdown), + (MissionGroupNames.KERRIGAN_MISSIONS, MissionFlag.Kerrigan), + (MissionGroupNames.VANILLA_SOA_MISSIONS, MissionFlag.VanillaSoa), + (MissionGroupNames.TERRAN_ALLY_MISSIONS, MissionFlag.AiTerranAlly), + (MissionGroupNames.ZERG_ALLY_MISSIONS, MissionFlag.AiZergAlly), + (MissionGroupNames.PROTOSS_ALLY_MISSIONS, MissionFlag.AiProtossAlly), + (MissionGroupNames.VS_TERRAN_MISSIONS, MissionFlag.VsTerran), + (MissionGroupNames.VS_ZERG_MISSIONS, MissionFlag.VsZerg), + (MissionGroupNames.VS_PROTOSS_MISSIONS, MissionFlag.VsProtoss), + (MissionGroupNames.RACESWAP_MISSIONS, MissionFlag.RaceSwap), +): + mission_groups[group_name] = [mission.mission_name for mission in SC2Mission if flags in mission.flags] + +for group_name, campaign, chain_name in ( + (MissionGroupNames.WOL_MAR_SARA_MISSIONS, SC2Campaign.WOL, "Mar Sara"), + (MissionGroupNames.WOL_COLONIST_MISSIONS, SC2Campaign.WOL, "Colonist"), + (MissionGroupNames.WOL_ARTIFACT_MISSIONS, SC2Campaign.WOL, "Artifact"), + (MissionGroupNames.WOL_COVERT_MISSIONS, SC2Campaign.WOL, "Covert"), + (MissionGroupNames.WOL_REBELLION_MISSIONS, SC2Campaign.WOL, "Rebellion"), + (MissionGroupNames.WOL_CHAR_MISSIONS, SC2Campaign.WOL, "Char"), + (MissionGroupNames.HOTS_UMOJA_MISSIONS, SC2Campaign.HOTS, "Umoja"), + (MissionGroupNames.HOTS_KALDIR_MISSIONS, SC2Campaign.HOTS, "Kaldir"), + (MissionGroupNames.HOTS_CHAR_MISSIONS, SC2Campaign.HOTS, "Char"), + (MissionGroupNames.HOTS_ZERUS_MISSIONS, SC2Campaign.HOTS, "Zerus"), + (MissionGroupNames.HOTS_SKYGEIRR_MISSIONS, SC2Campaign.HOTS, "Skygeirr Station"), + (MissionGroupNames.HOTS_DOMINION_SPACE_MISSIONS, SC2Campaign.HOTS, "Dominion Space"), + (MissionGroupNames.HOTS_KORHAL_MISSIONS, SC2Campaign.HOTS, "Korhal"), + (MissionGroupNames.LOTV_AIUR_MISSIONS, SC2Campaign.LOTV, "Aiur"), + (MissionGroupNames.LOTV_KORHAL_MISSIONS, SC2Campaign.LOTV, "Korhal"), + (MissionGroupNames.LOTV_SHAKURAS_MISSIONS, SC2Campaign.LOTV, "Shakuras"), + (MissionGroupNames.LOTV_ULNAR_MISSIONS, SC2Campaign.LOTV, "Ulnar"), + (MissionGroupNames.LOTV_PURIFIER_MISSIONS, SC2Campaign.LOTV, "Purifier"), + (MissionGroupNames.LOTV_TALDARIM_MISSIONS, SC2Campaign.LOTV, "Tal'darim"), + (MissionGroupNames.LOTV_MOEBIUS_MISSIONS, SC2Campaign.LOTV, "Moebius"), + (MissionGroupNames.LOTV_RETURN_TO_AIUR_MISSIONS, SC2Campaign.LOTV, "Return to Aiur"), +): + mission_groups[group_name] = [ + mission.mission_name for mission in SC2Mission if mission.campaign == campaign and mission.area == chain_name + ] + +mission_groups[MissionGroupNames.NCO_MISSION_PACK_1] = [ + SC2Mission.THE_ESCAPE.mission_name, + SC2Mission.SUDDEN_STRIKE.mission_name, + SC2Mission.ENEMY_INTELLIGENCE.mission_name, +] +mission_groups[MissionGroupNames.NCO_MISSION_PACK_2] = [ + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + SC2Mission.NIGHT_TERRORS.mission_name, + SC2Mission.FLASHPOINT.mission_name, +] +mission_groups[MissionGroupNames.NCO_MISSION_PACK_3] = [ + SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name, + SC2Mission.DARK_SKIES.mission_name, + SC2Mission.END_GAME.mission_name, +] + +mission_groups[MissionGroupNames.PLANET_MAR_SARA_MISSIONS] = [ + SC2Mission.LIBERATION_DAY.mission_name, + SC2Mission.THE_OUTLAWS.mission_name, + SC2Mission.ZERO_HOUR.mission_name, +] +mission_groups[MissionGroupNames.PLANET_CHAR_MISSIONS] = [ + SC2Mission.GATES_OF_HELL.mission_name, + SC2Mission.BELLY_OF_THE_BEAST.mission_name, + SC2Mission.SHATTER_THE_SKY.mission_name, + SC2Mission.ALL_IN.mission_name, + SC2Mission.DOMINATION.mission_name, + SC2Mission.FIRE_IN_THE_SKY.mission_name, + SC2Mission.OLD_SOLDIERS.mission_name, +] +mission_groups[MissionGroupNames.PLANET_KORHAL_MISSIONS] = [ + SC2Mission.MEDIA_BLITZ.mission_name, + SC2Mission.PLANETFALL.mission_name, + SC2Mission.DEATH_FROM_ABOVE.mission_name, + SC2Mission.THE_RECKONING.mission_name, + SC2Mission.SKY_SHIELD.mission_name, + SC2Mission.BROTHERS_IN_ARMS.mission_name, +] +mission_groups[MissionGroupNames.PLANET_AIUR_MISSIONS] = [ + SC2Mission.ECHOES_OF_THE_FUTURE.mission_name, + SC2Mission.FOR_AIUR.mission_name, + SC2Mission.THE_GROWING_SHADOW.mission_name, + SC2Mission.THE_SPEAR_OF_ADUN.mission_name, + SC2Mission.TEMPLAR_S_RETURN.mission_name, + SC2Mission.THE_HOST.mission_name, + SC2Mission.SALVATION.mission_name, +] + +for mission in SC2Mission: + if mission.flags & MissionFlag.HasRaceSwap: + short_name = mission.get_short_name() + mission_groups[short_name] = [ + mission_var.mission_name for mission_var in SC2Mission if short_name in mission_var.mission_name + ] diff --git a/worlds/sc2/mission_order/__init__.py b/worlds/sc2/mission_order/__init__.py new file mode 100644 index 0000000000..ec533ccdd9 --- /dev/null +++ b/worlds/sc2/mission_order/__init__.py @@ -0,0 +1,66 @@ +from typing import List, Dict, Any, Callable, TYPE_CHECKING + +from BaseClasses import CollectionState +from ..mission_tables import SC2Mission, MissionFlag, get_goal_location +from .mission_pools import SC2MOGenMissionPools + +if TYPE_CHECKING: + from .nodes import SC2MOGenMissionOrder, SC2MOGenMission + +class SC2MissionOrder: + """ + Wrapper class for a generated mission order. Contains helper functions for getting data about generated missions. + """ + + def __init__(self, mission_order_node: 'SC2MOGenMissionOrder', mission_pools: SC2MOGenMissionPools): + self.mission_order_node: 'SC2MOGenMissionOrder' = mission_order_node + """Root node of the mission order structure.""" + self.mission_pools: SC2MOGenMissionPools = mission_pools + """Manager for missions in the mission order.""" + + def get_used_flags(self) -> Dict[MissionFlag, int]: + """Returns a dictionary of all used flags and their appearance count within the mission order. + Flags that don't appear in the mission order also don't appear in this dictionary.""" + return self.mission_pools.get_used_flags() + + def get_used_missions(self) -> List[SC2Mission]: + """Returns a list of all missions used in the mission order.""" + return self.mission_pools.get_used_missions() + + def get_mission_count(self) -> int: + """Returns the amount of missions in the mission order.""" + return sum( + len([mission for mission in layout.missions if not mission.option_empty]) + for campaign in self.mission_order_node.campaigns for layout in campaign.layouts + ) + + def get_starting_missions(self) -> List[SC2Mission]: + """Returns a list containing all the missions that are accessible without beating any other missions.""" + return [ + slot.mission + for campaign in self.mission_order_node.campaigns if campaign.is_always_unlocked() + for layout in campaign.layouts if layout.is_always_unlocked() + for slot in layout.missions if slot.is_always_unlocked() and not slot.option_empty + ] + + def get_completion_condition(self, player: int) -> Callable[[CollectionState], bool]: + """Returns a lambda to determine whether a state has beaten the mission order's required campaigns.""" + final_locations = [get_goal_location(mission.mission) for mission in self.get_final_missions()] + return lambda state, final_locations=final_locations: all(state.can_reach_location(loc, player) for loc in final_locations) + + def get_final_mission_ids(self) -> List[int]: + """Returns the IDs of all missions that are required to beat the mission order.""" + return [mission.mission.id for mission in self.get_final_missions()] + + def get_final_missions(self) -> List['SC2MOGenMission']: + """Returns the slots of all missions that are required to beat the mission order.""" + return self.mission_order_node.goal_missions + + def get_items_to_lock(self) -> Dict[str, int]: + """Returns a dict of item names and amounts that are required by Item entry rules.""" + return self.mission_order_node.items_to_lock + + def get_slot_data(self) -> List[Dict[str, Any]]: + """Parses the mission order into a format usable for slot data.""" + return self.mission_order_node.get_slot_data() + diff --git a/worlds/sc2/mission_order/entry_rules.py b/worlds/sc2/mission_order/entry_rules.py new file mode 100644 index 0000000000..afa872deb1 --- /dev/null +++ b/worlds/sc2/mission_order/entry_rules.py @@ -0,0 +1,454 @@ +from __future__ import annotations +from typing import Set, Callable, Dict, List, Union, TYPE_CHECKING, Any, NamedTuple +from abc import ABC, abstractmethod +from dataclasses import dataclass + +from ..mission_tables import SC2Mission +from ..item.item_tables import item_table +from BaseClasses import CollectionState + +if TYPE_CHECKING: + from .nodes import SC2MOGenMission + +def always_true(state: CollectionState) -> bool: + """Helper method to avoid creating trivial lambdas""" + return True + + +class EntryRule(ABC): + buffer_fulfilled: bool + buffer_depth: int + + def __init__(self) -> None: + self.buffer_fulfilled = False + self.buffer_depth = -1 + + def is_always_fulfilled(self, in_region_creation: bool = False) -> bool: + return self.is_fulfilled(set(), in_region_creation) + + @abstractmethod + def _is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_creation: bool) -> bool: + """Used during region creation to ensure a beatable mission order. + + `in_region_creation` should determine whether rules that cannot be handled during region creation (like Item rules) + report themselves as fulfilled or unfulfilled.""" + return False + + def is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_creation: bool) -> bool: + if len(beaten_missions) == 0: + # Special-cased to avoid the buffer + # This is used to determine starting missions + return self._is_fulfilled(beaten_missions, in_region_creation) + self.buffer_fulfilled = self.buffer_fulfilled or self._is_fulfilled(beaten_missions, in_region_creation) + return self.buffer_fulfilled + + @abstractmethod + def _get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + """Used during region creation to determine the minimum depth this entry rule can be cleared at.""" + return -1 + + def get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + if not self.is_fulfilled(beaten_missions, in_region_creation = True): + return -1 + if self.buffer_depth == -1: + self.buffer_depth = self._get_depth(beaten_missions) + return self.buffer_depth + + @abstractmethod + def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: + """Passed to Archipelago for use during item placement.""" + return lambda _: False + + @abstractmethod + def to_slot_data(self) -> RuleData: + """Used in the client to determine accessibility while playing and to populate tooltips.""" + pass + + @abstractmethod + def find_mandatory_mission(self) -> SC2MOGenMission | None: + """Should return any mission that is mandatory to fulfill the entry rule, or `None` if there is no such mission.""" + return None + + +@dataclass +class RuleData(ABC): + @abstractmethod + def tooltip(self, indents: int, missions: Dict[int, SC2Mission], done_color: str, not_done_color: str) -> str: + return "" + + @abstractmethod + def shows_single_rule(self) -> bool: + return False + + @abstractmethod + def is_accessible( + self, beaten_missions: Set[int], received_items: Dict[int, int] + ) -> bool: + return False + + +class BeatMissionsEntryRule(EntryRule): + missions_to_beat: List[SC2MOGenMission] + visual_reqs: List[Union[str, SC2MOGenMission]] + + def __init__(self, missions_to_beat: List[SC2MOGenMission], visual_reqs: List[Union[str, SC2MOGenMission]]): + super().__init__() + self.missions_to_beat = missions_to_beat + self.visual_reqs = visual_reqs + + def _is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_check: bool) -> bool: + return beaten_missions.issuperset(self.missions_to_beat) + + def _get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + return max(mission.min_depth for mission in self.missions_to_beat) + + def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: + return lambda state: state.has_all([mission.beat_item() for mission in self.missions_to_beat], player) + + def to_slot_data(self) -> RuleData: + resolved_reqs: List[Union[str, int]] = [req if isinstance(req, str) else req.mission.id for req in self.visual_reqs] + mission_ids = [mission.mission.id for mission in self.missions_to_beat] + return BeatMissionsRuleData( + mission_ids, + resolved_reqs + ) + + def find_mandatory_mission(self) -> SC2MOGenMission | None: + if len(self.missions_to_beat) > 0: + return self.missions_to_beat[0] + return None + + +@dataclass +class BeatMissionsRuleData(RuleData): + mission_ids: List[int] + visual_reqs: List[Union[str, int]] + + def tooltip(self, indents: int, missions: Dict[int, SC2Mission], done_color: str, not_done_color: str) -> str: + indent = " ".join("" for _ in range(indents)) + if len(self.visual_reqs) == 1: + req = self.visual_reqs[0] + return f"Beat {missions[req].mission_name if isinstance(req, int) else req}" + tooltip = f"Beat all of these:\n{indent}- " + reqs = [missions[req].mission_name if isinstance(req, int) else req for req in self.visual_reqs] + tooltip += f"\n{indent}- ".join(req for req in reqs) + return tooltip + + def shows_single_rule(self) -> bool: + return len(self.visual_reqs) == 1 + + def is_accessible( + self, beaten_missions: Set[int], received_items: Dict[int, int] + ) -> bool: + # Beat rules are accessible if all their missions are beaten and accessible + if not beaten_missions.issuperset(self.mission_ids): + return False + return True + + +class CountMissionsEntryRule(EntryRule): + missions_to_count: List[SC2MOGenMission] + target_amount: int + visual_reqs: List[Union[str, SC2MOGenMission]] + + def __init__(self, missions_to_count: List[SC2MOGenMission], target_amount: int, visual_reqs: List[Union[str, SC2MOGenMission]]): + super().__init__() + self.missions_to_count = missions_to_count + if target_amount <= -1 or target_amount > len(missions_to_count): + self.target_amount = len(missions_to_count) + else: + self.target_amount = target_amount + self.visual_reqs = visual_reqs + + def _is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_check: bool) -> bool: + return self.target_amount <= len(beaten_missions.intersection(self.missions_to_count)) + + def _get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + sorted_missions = sorted(beaten_missions.intersection(self.missions_to_count), key = lambda mission: mission.min_depth) + mission_depth = max(mission.min_depth for mission in sorted_missions[:self.target_amount]) + return max(mission_depth, self.target_amount - 1) # -1 because depth is zero-based but amount is one-based + + def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: + if self.target_amount == 0: + return always_true + + beat_items = [mission.beat_item() for mission in self.missions_to_count] + def count_missions(state: CollectionState) -> bool: + count = 0 + for mission in range(len(self.missions_to_count)): + if state.has(beat_items[mission], player): + count += 1 + if count == self.target_amount: + return True + return False + + return count_missions + + def to_slot_data(self) -> RuleData: + resolved_reqs: List[Union[str, int]] = [req if isinstance(req, str) else req.mission.id for req in self.visual_reqs] + mission_ids = [mission.mission.id for mission in sorted(self.missions_to_count, key = lambda mission: mission.min_depth)] + return CountMissionsRuleData( + mission_ids, + self.target_amount, + resolved_reqs + ) + + def find_mandatory_mission(self) -> SC2MOGenMission | None: + if self.target_amount > 0 and self.target_amount == len(self.missions_to_count): + return self.missions_to_count[0] + return None + + +@dataclass +class CountMissionsRuleData(RuleData): + mission_ids: List[int] + amount: int + visual_reqs: List[Union[str, int]] + + def tooltip(self, indents: int, missions: Dict[int, SC2Mission], done_color: str, not_done_color: str) -> str: + indent = " ".join("" for _ in range(indents)) + if self.amount == len(self.mission_ids): + amount = "all" + else: + amount = str(self.amount) + if len(self.visual_reqs) == 1: + req = self.visual_reqs[0] + req_str = missions[req].mission_name if isinstance(req, int) else req + if self.amount == 1: + if type(req) == int: + return f"Beat {req_str}" + return f"Beat any mission from {req_str}" + return f"Beat {amount} missions from {req_str}" + if self.amount == 1: + tooltip = f"Beat any mission from:\n{indent}- " + else: + tooltip = f"Beat {amount} missions from:\n{indent}- " + reqs = [missions[req].mission_name if isinstance(req, int) else req for req in self.visual_reqs] + tooltip += f"\n{indent}- ".join(req for req in reqs) + return tooltip + + def shows_single_rule(self) -> bool: + return len(self.visual_reqs) == 1 + + def is_accessible( + self, beaten_missions: Set[int], received_items: Dict[int, int] + ) -> bool: + # Count rules are accessible if enough of their missions are beaten and accessible + return len([mission_id for mission_id in self.mission_ids if mission_id in beaten_missions]) >= self.amount + + +class SubRuleEntryRule(EntryRule): + rule_id: int + rules_to_check: List[EntryRule] + target_amount: int + min_depth: int + + def __init__(self, rules_to_check: List[EntryRule], target_amount: int, rule_id: int): + super().__init__() + self.rule_id = rule_id + self.rules_to_check = rules_to_check + self.min_depth = -1 + if target_amount <= -1 or target_amount > len(rules_to_check): + self.target_amount = len(rules_to_check) + else: + self.target_amount = target_amount + + def _is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_check: bool) -> bool: + if len(self.rules_to_check) == 0: + return True + count = 0 + for rule in self.rules_to_check: + if rule.is_fulfilled(beaten_missions, in_region_check): + count += 1 + if count == self.target_amount: + return True + return False + + def _get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + if len(self.rules_to_check) == 0: + return self.min_depth + # It should be guaranteed by is_fulfilled that enough rules have a valid depth because they are fulfilled + filtered_rules = [rule for rule in self.rules_to_check if rule.get_depth(beaten_missions) > -1] + sorted_rules = sorted(filtered_rules, key = lambda rule: rule.get_depth(beaten_missions)) + required_depth = max(rule.get_depth(beaten_missions) for rule in sorted_rules[:self.target_amount]) + return max(required_depth, self.min_depth) + + def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: + sub_lambdas = [rule.to_lambda(player) for rule in self.rules_to_check] + if self.target_amount == 0: + return always_true + if len(sub_lambdas) == 1: + return sub_lambdas[0] + + def count_rules(state: CollectionState) -> bool: + count = 0 + for sub_lambda in sub_lambdas: + if sub_lambda(state): + count += 1 + if count == self.target_amount: + return True + return False + + return count_rules + + def to_slot_data(self) -> SubRuleRuleData: + sub_rules = [rule.to_slot_data() for rule in self.rules_to_check] + return SubRuleRuleData( + self.rule_id, + sub_rules, + self.target_amount + ) + + def find_mandatory_mission(self) -> SC2MOGenMission | None: + if self.target_amount > 0 and self.target_amount == len(self.rules_to_check): + for sub_rule in self.rules_to_check: + mandatory_mission = sub_rule.find_mandatory_mission() + if mandatory_mission is not None: + return mandatory_mission + return None + + +@dataclass +class SubRuleRuleData(RuleData): + rule_id: int + sub_rules: List[RuleData] + amount: int + + @staticmethod + def parse_from_dict(data: Dict[str, Any]) -> SubRuleRuleData: + amount = data["amount"] + rule_id = data["rule_id"] + sub_rules: List[RuleData] = [] + for rule_data in data["sub_rules"]: + if "sub_rules" in rule_data: + rule: RuleData = SubRuleRuleData.parse_from_dict(rule_data) + elif "item_ids" in rule_data: + # Slot data converts Dict[int, int] to Dict[str, int] for some reason + item_ids = {int(item): item_amount for (item, item_amount) in rule_data["item_ids"].items()} + rule = ItemRuleData( + item_ids, + rule_data["visual_reqs"] + ) + elif "amount" in rule_data: + rule = CountMissionsRuleData( + **{field: value for field, value in rule_data.items()} + ) + else: + rule = BeatMissionsRuleData( + **{field: value for field, value in rule_data.items()} + ) + sub_rules.append(rule) + rule = SubRuleRuleData( + rule_id, + sub_rules, + amount + ) + return rule + + @staticmethod + def empty() -> SubRuleRuleData: + return SubRuleRuleData(-1, [], 0) + + def tooltip(self, indents: int, missions: Dict[int, SC2Mission], done_color: str, not_done_color: str) -> str: + indent = " ".join("" for _ in range(indents)) + if self.amount == len(self.sub_rules): + if self.amount == 1: + return self.sub_rules[0].tooltip(indents, missions, done_color, not_done_color) + amount = "all" + elif self.amount == 1: + amount = "any" + else: + amount = str(self.amount) + tooltip = f"Fulfill {amount} of these conditions:\n{indent}- " + subrule_tooltips: List[str] = [] + for rule in self.sub_rules: + sub_tooltip = rule.tooltip(indents + 4, missions, done_color, not_done_color) + if getattr(rule, "was_accessible", False): + subrule_tooltips.append(f"[color={done_color}]{sub_tooltip}[/color]") + else: + subrule_tooltips.append(f"[color={not_done_color}]{sub_tooltip}[/color]") + tooltip += f"\n{indent}- ".join(sub_tooltip for sub_tooltip in subrule_tooltips) + return tooltip + + def shows_single_rule(self) -> bool: + return self.amount == len(self.sub_rules) == 1 and self.sub_rules[0].shows_single_rule() + + def is_accessible( + self, beaten_missions: Set[int], received_items: Dict[int, int] + ) -> bool: + # Sub-rule rules are accessible if enough of their child rules are accessible + accessible_count = 0 + success = accessible_count >= self.amount + if self.amount > 0: + for rule in self.sub_rules: + if rule.is_accessible(beaten_missions, received_items): + rule.was_accessible = True + accessible_count += 1 + if accessible_count >= self.amount: + success = True + break + else: + rule.was_accessible = False + + return success + +class MissionEntryRules(NamedTuple): + mission_rule: SubRuleRuleData + layout_rule: SubRuleRuleData + campaign_rule: SubRuleRuleData + + +class ItemEntryRule(EntryRule): + items_to_check: Dict[str, int] + + def __init__(self, items_to_check: Dict[str, int]) -> None: + super().__init__() + self.items_to_check = items_to_check + + def _is_fulfilled(self, beaten_missions: Set[SC2MOGenMission], in_region_check: bool) -> bool: + # Region creation should assume items can be placed, + # but later uses (eg. starter missions) should respect that this locks a mission + return in_region_check + + def _get_depth(self, beaten_missions: Set[SC2MOGenMission]) -> int: + # Depth 0 means this rule requires 0 prior beaten missions + return 0 + + def to_lambda(self, player: int) -> Callable[[CollectionState], bool]: + return lambda state: state.has_all_counts(self.items_to_check, player) + + def to_slot_data(self) -> RuleData: + item_ids = {item_table[item].code: amount for (item, amount) in self.items_to_check.items()} + visual_reqs = [item if amount == 1 else str(amount) + "x " + item for (item, amount) in self.items_to_check.items()] + return ItemRuleData( + item_ids, + visual_reqs + ) + + def find_mandatory_mission(self) -> SC2MOGenMission | None: + return None + + +@dataclass +class ItemRuleData(RuleData): + item_ids: Dict[int, int] + visual_reqs: List[str] + + def tooltip(self, indents: int, missions: Dict[int, SC2Mission], done_color: str, not_done_color: str) -> str: + indent = " ".join("" for _ in range(indents)) + if len(self.visual_reqs) == 1: + return f"Find {self.visual_reqs[0]}" + tooltip = f"Find all of these:\n{indent}- " + tooltip += f"\n{indent}- ".join(req for req in self.visual_reqs) + return tooltip + + def shows_single_rule(self) -> bool: + return len(self.visual_reqs) == 1 + + def is_accessible( + self, beaten_missions: Set[int], received_items: Dict[int, int] + ) -> bool: + return all( + item in received_items and received_items[item] >= amount + for (item, amount) in self.item_ids.items() + ) diff --git a/worlds/sc2/mission_order/generation.py b/worlds/sc2/mission_order/generation.py new file mode 100644 index 0000000000..928c0a4526 --- /dev/null +++ b/worlds/sc2/mission_order/generation.py @@ -0,0 +1,739 @@ +""" +Contains the complex data manipulation functions for mission order generation and Archipelago region creation. +Incoming data is validated to match specifications in .options.py. +The functions here are called from ..regions.py. +""" + +from typing import Set, Dict, Any, List, Tuple, Union, Optional, Callable, TYPE_CHECKING +import logging + +from BaseClasses import Location, Region, Entrance +from ..mission_tables import SC2Mission, MissionFlag, lookup_name_to_mission, lookup_id_to_mission +from ..item.item_tables import named_layout_key_item_table, named_campaign_key_item_table +from ..item import item_names +from .nodes import MissionOrderNode, SC2MOGenMissionOrder, SC2MOGenCampaign, SC2MOGenLayout, SC2MOGenMission +from .entry_rules import EntryRule, SubRuleEntryRule, ItemEntryRule, CountMissionsEntryRule, BeatMissionsEntryRule +from .mission_pools import ( + SC2MOGenMissionPools, Difficulty, modified_difficulty_thresholds, STANDARD_DIFFICULTY_FILL_ORDER +) +from .options import GENERIC_KEY_NAME, GENERIC_PROGRESSIVE_KEY_NAME + +if TYPE_CHECKING: + from ..locations import LocationData + from .. import SC2World + +def resolve_unlocks(mission_order: SC2MOGenMissionOrder): + """Parses a mission order's entry rule dicts into entry rule objects.""" + rolling_rule_id = 0 + for campaign in mission_order.campaigns: + entry_rule = { + "rules": campaign.option_entry_rules, + "amount": -1 + } + campaign.entry_rule = dict_to_entry_rule(mission_order, entry_rule, campaign, rolling_rule_id) + rolling_rule_id += 1 + for layout in campaign.layouts: + entry_rule = { + "rules": layout.option_entry_rules, + "amount": -1 + } + layout.entry_rule = dict_to_entry_rule(mission_order, entry_rule, layout, rolling_rule_id) + rolling_rule_id += 1 + for mission in layout.missions: + entry_rule = { + "rules": mission.option_entry_rules, + "amount": -1 + } + mission.entry_rule = dict_to_entry_rule(mission_order, entry_rule, mission, rolling_rule_id) + rolling_rule_id += 1 + # Manually make a rule for prev missions + if len(mission.prev) > 0: + mission.entry_rule.target_amount += 1 + mission.entry_rule.rules_to_check.append(CountMissionsEntryRule(mission.prev, 1, mission.prev)) + + +def dict_to_entry_rule(mission_order: SC2MOGenMissionOrder, data: Dict[str, Any], start_node: MissionOrderNode, rule_id: int = -1) -> EntryRule: + """Tries to create an entry rule object from an entry rule dict. The structure of these dicts is validated in .options.py.""" + if "items" in data: + items: Dict[str, int] = data["items"] + has_generic_key = False + for (item, amount) in items.items(): + if item.casefold() == GENERIC_KEY_NAME or item.casefold().startswith(GENERIC_PROGRESSIVE_KEY_NAME): + has_generic_key = True + continue # Don't try to lock the generic key + if item in mission_order.items_to_lock: + # Lock the greatest required amount of each item + mission_order.items_to_lock[item] = max(mission_order.items_to_lock[item], amount) + else: + mission_order.items_to_lock[item] = amount + rule = ItemEntryRule(items) + if has_generic_key: + mission_order.keys_to_resolve.setdefault(start_node, []).append(rule) + return rule + if "rules" in data: + rules = [dict_to_entry_rule(mission_order, subrule, start_node) for subrule in data["rules"]] + return SubRuleEntryRule(rules, data["amount"], rule_id) + if "scope" in data: + objects: List[Tuple[MissionOrderNode, str]] = [] + for address in data["scope"]: + resolved = resolve_address(mission_order, address, start_node) + objects.extend((obj, address) for obj in resolved) + visual_reqs = [obj.get_visual_requirement(start_node) for (obj, _) in objects] + missions: List[SC2MOGenMission] + if "amount" in data: + missions = [mission for (obj, _) in objects for mission in obj.get_missions() if not mission.option_empty] + if len(missions) == 0: + raise ValueError(f"Count rule did not find any missions at scopes: {data['scope']}") + return CountMissionsEntryRule(missions, data["amount"], visual_reqs) + missions = [] + for (obj, address) in objects: + obj.important_beat_event = True + exits = obj.get_exits() + if len(exits) == 0: + raise ValueError( + f"Address \"{address}\" found an unbeatable object. " + "This should mean the address contains \"..\" too often." + ) + missions.extend(exits) + return BeatMissionsEntryRule(missions, visual_reqs) + raise ValueError(f"Invalid data for entry rule: {data}") + + +def resolve_address(mission_order: SC2MOGenMissionOrder, address: str, start_node: MissionOrderNode) -> List[MissionOrderNode]: + """Tries to find a node in the mission order by following the given address.""" + if address.startswith("../") or address == "..": + # Relative address, starts from searching object + cursor = start_node + else: + # Absolute address, starts from the top + cursor = mission_order + address_so_far = "" + for term in address.split("/"): + if len(address_so_far) > 0: + address_so_far += "/" + address_so_far += term + if term == "..": + cursor = cursor.get_parent(address_so_far, address) + else: + result = cursor.search(term) + if result is None: + raise ValueError(f"Address \"{address_so_far}\" (from \"{address}\") tried to find a child for a mission.") + if len(result) == 0: + raise ValueError(f"Address \"{address_so_far}\" (from \"{address}\") could not find a {cursor.child_type_name()}.") + if len(result) > 1: + # Layouts are allowed to end with multiple missions via an index function + if type(result[0]) == SC2MOGenMission and address_so_far == address: + return result + raise ValueError((f"Address \"{address_so_far}\" (from \"{address}\") found more than one {cursor.child_type_name()}.")) + cursor = result[0] + if cursor == start_node: + raise ValueError( + f"Address \"{address_so_far}\" (from \"{address}\") returned to original object. " + "This is not allowed to avoid circular requirements." + ) + return [cursor] + + +######################## + + +def fill_depths(mission_order: SC2MOGenMissionOrder) -> None: + """ + Flood-fills the mission order by following its entry rules to determine the depth of all nodes. + This also ensures theoretical total accessibility of all nodes, but this is allowed to be violated by item placement and the accessibility setting. + """ + accessible_campaigns: Set[SC2MOGenCampaign] = {campaign for campaign in mission_order.campaigns if campaign.is_always_unlocked(in_region_creation=True)} + next_campaigns: Set[SC2MOGenCampaign] = set(mission_order.campaigns).difference(accessible_campaigns) + + accessible_layouts: Set[SC2MOGenLayout] = { + layout + for campaign in accessible_campaigns for layout in campaign.layouts + if layout.is_always_unlocked(in_region_creation=True) + } + next_layouts: Set[SC2MOGenLayout] = {layout for campaign in accessible_campaigns for layout in campaign.layouts}.difference(accessible_layouts) + + next_missions: Set[SC2MOGenMission] = {mission for layout in accessible_layouts for mission in layout.entrances} + beaten_missions: Set[SC2MOGenMission] = set() + + # Sanity check: Can any missions be accessed? + if len(next_missions) == 0: + raise Exception("Mission order has no possibly accessible missions") + + iterations = 0 + while len(next_missions) > 0: + # Check for accessible missions + cur_missions: Set[SC2MOGenMission] = { + mission for mission in next_missions + if mission.is_unlocked(beaten_missions, in_region_creation=True) + } + if len(cur_missions) == 0: + raise Exception(f"Mission order ran out of accessible missions during iteration {iterations}") + next_missions.difference_update(cur_missions) + # Set the depth counters of all currently accessible missions + new_beaten_missions: Set[SC2MOGenMission] = set() + while len(cur_missions) > 0: + mission = cur_missions.pop() + new_beaten_missions.add(mission) + # If the beaten missions at depth X unlock a mission, said mission can be beaten at depth X+1 + mission.min_depth = mission.entry_rule.get_depth(beaten_missions) + 1 + new_next = [ + next_mission for next_mission in mission.next if not ( + next_mission in cur_missions + or next_mission in beaten_missions + or next_mission in new_beaten_missions + ) + ] + next_missions.update(new_next) + + # Any campaigns/layouts/missions added after this point will be seen in the next iteration at the earliest + iterations += 1 + beaten_missions.update(new_beaten_missions) + + # Check for newly accessible campaigns & layouts + new_campaigns: Set[SC2MOGenCampaign] = set() + for campaign in next_campaigns: + if campaign.is_unlocked(beaten_missions, in_region_creation=True): + new_campaigns.add(campaign) + for campaign in new_campaigns: + accessible_campaigns.add(campaign) + next_layouts.update(campaign.layouts) + next_campaigns.remove(campaign) + for layout in campaign.layouts: + layout.entry_rule.min_depth = campaign.entry_rule.get_depth(beaten_missions) + new_layouts: Set[SC2MOGenLayout] = set() + for layout in next_layouts: + if layout.is_unlocked(beaten_missions, in_region_creation=True): + new_layouts.add(layout) + for layout in new_layouts: + accessible_layouts.add(layout) + next_missions.update(layout.entrances) + next_layouts.remove(layout) + for mission in layout.entrances: + mission.entry_rule.min_depth = layout.entry_rule.get_depth(beaten_missions) + + # Make sure we didn't miss anything + assert len(accessible_campaigns) == len(mission_order.campaigns) + assert len(accessible_layouts) == sum(len(campaign.layouts) for campaign in mission_order.campaigns) + total_missions = sum( + len([mission for mission in layout.missions if not mission.option_empty]) + for campaign in mission_order.campaigns for layout in campaign.layouts + ) + assert len(beaten_missions) == total_missions, f'Can only access {len(beaten_missions)} missions out of {total_missions}' + + # Fill campaign/layout depth values as min/max of their children + for campaign in mission_order.campaigns: + for layout in campaign.layouts: + depths = [mission.min_depth for mission in layout.missions if not mission.option_empty] + layout.min_depth = min(depths) + layout.max_depth = max(depths) + campaign.min_depth = min(layout.min_depth for layout in campaign.layouts) + campaign.max_depth = max(layout.max_depth for layout in campaign.layouts) + mission_order.max_depth = max(campaign.max_depth for campaign in mission_order.campaigns) + + +######################## + + +def resolve_difficulties(mission_order: SC2MOGenMissionOrder) -> None: + """Determines the concrete difficulty of all mission slots.""" + for campaign in mission_order.campaigns: + for layout in campaign.layouts: + if layout.option_min_difficulty == Difficulty.RELATIVE: + min_diff = campaign.option_min_difficulty + if min_diff == Difficulty.RELATIVE: + min_depth = 0 + else: + min_depth = campaign.min_depth + else: + min_diff = layout.option_min_difficulty + min_depth = layout.min_depth + + if layout.option_max_difficulty == Difficulty.RELATIVE: + max_diff = campaign.option_max_difficulty + if max_diff == Difficulty.RELATIVE: + max_depth = mission_order.max_depth + else: + max_depth = campaign.max_depth + else: + max_diff = layout.option_max_difficulty + max_depth = layout.max_depth + + depth_range = max_depth - min_depth + if depth_range == 0: + # This can happen if layout size is 1 or layout is all entrances + # Use minimum difficulty in this case + depth_range = 1 + # If min/max aren't relative, assume the limits are meant to show up + layout_thresholds = modified_difficulty_thresholds(min_diff, max_diff) + thresholds = sorted(layout_thresholds.keys()) + + for mission in layout.missions: + if mission.option_empty: + continue + if len(mission.option_mission_pool) == 1: + mission_order.fixed_missions.append(mission) + continue + if mission.option_difficulty == Difficulty.RELATIVE: + mission_thresh = int((mission.min_depth - min_depth) * 100 / depth_range) + for i in range(len(thresholds)): + if thresholds[i] > mission_thresh: + mission.option_difficulty = layout_thresholds[thresholds[i - 1]] + break + mission.option_difficulty = layout_thresholds[thresholds[-1]] + mission_order.sorted_missions[mission.option_difficulty].append(mission) + + +######################## + + +def fill_missions( + mission_order: SC2MOGenMissionOrder, mission_pools: SC2MOGenMissionPools, + world: 'SC2World', locked_missions: List[str], locations: Tuple['LocationData', ...], location_cache: List[Location] +) -> None: + """Places missions in all non-empty mission slots. Also responsible for creating Archipelago regions & locations for placed missions.""" + locations_per_region = get_locations_per_region(locations) + regions: List[Region] = [create_region(world, locations_per_region, location_cache, "Menu")] + locked_ids = [lookup_name_to_mission[mission].id for mission in locked_missions] + prefer_close_difficulty = world.options.difficulty_curve.value == world.options.difficulty_curve.option_standard + + def set_mission_in_slot(slot: SC2MOGenMission, mission: SC2Mission): + slot.mission = mission + slot.region = create_region(world, locations_per_region, location_cache, + mission.mission_name, slot) + + # Resolve slots with set mission names + for mission_slot in mission_order.fixed_missions: + mission_id = mission_slot.option_mission_pool.pop() + # Remove set mission from locked missions + locked_ids = [locked for locked in locked_ids if locked != mission_id] + mission = lookup_id_to_mission[mission_id] + if mission in mission_pools.get_used_missions(): + raise ValueError(f"Mission slot at address \"{mission_slot.get_address_to_node()}\" tried to plando an already plando'd mission.") + mission_pools.pull_specific_mission(mission) + set_mission_in_slot(mission_slot, mission) + regions.append(mission_slot.region) + + # Shuffle & sort all slots to pick from smallest to biggest pool with tie-breaks by difficulty (lowest to highest), then randomly + # Additionally sort goals by difficulty (highest to lowest) with random tie-breaks + sorted_goals: List[SC2MOGenMission] = [] + for difficulty in sorted(mission_order.sorted_missions.keys()): + world.random.shuffle(mission_order.sorted_missions[difficulty]) + sorted_goals.extend(mission for mission in mission_order.sorted_missions[difficulty] if mission in mission_order.goal_missions) + # Sort slots by difficulty, with difficulties sorted by fill order + # standard curve/close difficulty fills difficulties out->in, uneven fills easy->hard + if prefer_close_difficulty: + all_slots = [slot for diff in STANDARD_DIFFICULTY_FILL_ORDER for slot in mission_order.sorted_missions[diff]] + else: + all_slots = [slot for diff in sorted(mission_order.sorted_missions.keys()) for slot in mission_order.sorted_missions[diff]] + # Pick slots with a constrained mission pool first + all_slots.sort(key = lambda slot: len(slot.option_mission_pool.intersection(mission_pools.master_list))) + sorted_goals.reverse() + + # Randomly assign locked missions to appropriate difficulties + slots_for_locked: Dict[int, List[SC2MOGenMission]] = {locked: [] for locked in locked_ids} + for mission_slot in all_slots: + allowed_locked = mission_slot.option_mission_pool.intersection(locked_ids) + for locked in allowed_locked: + slots_for_locked[locked].append(mission_slot) + for (locked, allowed_slots) in slots_for_locked.items(): + locked_mission = lookup_id_to_mission[locked] + allowed_slots = [slot for slot in allowed_slots if slot in all_slots] + if len(allowed_slots) == 0: + logging.warning(f"SC2: Locked mission \"{locked_mission.mission_name}\" is not allowed in any remaining spot and will not be placed.") + continue + # This inherits the earlier sorting, but is now sorted again by relative difficulty + # The result is a sorting in order of nearest difficulty (preferring lower), then by smallest pool, then randomly + allowed_slots.sort(key = lambda slot: abs(slot.option_difficulty - locked_mission.pool + 1)) + # The first slot should be most appropriate + mission_slot = allowed_slots[0] + mission_pools.pull_specific_mission(locked_mission) + set_mission_in_slot(mission_slot, locked_mission) + regions.append(mission_slot.region) + all_slots.remove(mission_slot) + if mission_slot in sorted_goals: + sorted_goals.remove(mission_slot) + + # Pick goal missions first with stricter difficulty matching, and starting with harder goals + for goal_slot in sorted_goals: + try: + mission = mission_pools.pull_random_mission(world, goal_slot, prefer_close_difficulty=True) + set_mission_in_slot(goal_slot, mission) + regions.append(goal_slot.region) + all_slots.remove(goal_slot) + except IndexError: + raise IndexError( + f"Slot at address \"{goal_slot.get_address_to_node()}\" ran out of possible missions to place " + f"with {len(all_slots)} empty slots remaining." + ) + + # Pick random missions + remaining_count = len(all_slots) + for mission_slot in all_slots: + try: + mission = mission_pools.pull_random_mission(world, mission_slot, prefer_close_difficulty=prefer_close_difficulty) + set_mission_in_slot(mission_slot, mission) + regions.append(mission_slot.region) + remaining_count -= 1 + except IndexError: + raise IndexError( + f"Slot at address \"{mission_slot.get_address_to_node()}\" ran out of possible missions to place " + f"with {remaining_count} empty slots remaining." + ) + + world.multiworld.regions += regions + + +def get_locations_per_region(locations: Tuple['LocationData', ...]) -> Dict[str, List['LocationData']]: + per_region: Dict[str, List['LocationData']] = {} + + for location in locations: + per_region.setdefault(location.region, []).append(location) + + return per_region + + +def create_location(player: int, location_data: 'LocationData', region: Region, + location_cache: List[Location]) -> Location: + location = Location(player, location_data.name, location_data.code, region) + location.access_rule = location_data.rule + + location_cache.append(location) + return location + + +def create_minimal_logic_location( + world: 'SC2World', location_data: 'LocationData', region: Region, location_cache: List[Location], unit_count: int = 0, +) -> Location: + location = Location(world.player, location_data.name, location_data.code, region) + mission = lookup_name_to_mission.get(region.name) + if mission is None: + pass + elif location_data.hard_rule: + assert world.logic + unit_rule = world.logic.has_race_units(unit_count, mission.race) + location.access_rule = lambda state: unit_rule(state) and location_data.hard_rule(state) + else: + assert world.logic + location.access_rule = world.logic.has_race_units(unit_count, mission.race) + location_cache.append(location) + return location + + +def create_region( + world: 'SC2World', + locations_per_region: Dict[str, List['LocationData']], + location_cache: List[Location], + name: str, + slot: Optional[SC2MOGenMission] = None, +) -> Region: + MAX_UNIT_REQUIREMENT = 5 + region = Region(name, world.player, world.multiworld) + + from ..locations import LocationType + if slot is None: + target_victory_cache_locations = 0 + else: + target_victory_cache_locations = slot.option_victory_cache + victory_cache_locations = 0 + + # If the first mission is a build mission, + # require a unit everywhere except one location in the easiest category + mission_needs_unit = False + unit_given = False + easiest_category = LocationType.MASTERY + if slot is not None and slot.min_depth == 0: + mission = lookup_name_to_mission.get(region.name) + if mission is not None and MissionFlag.NoBuild not in mission.flags: + mission_needs_unit = True + for location_data in locations_per_region.get(name, ()): + if location_data.type == LocationType.VICTORY: + pass + elif location_data.type < easiest_category: + easiest_category = location_data.type + if easiest_category >= LocationType.CHALLENGE: + easiest_category = LocationType.VICTORY + + for location_data in locations_per_region.get(name, ()): + assert slot is not None + if location_data.type == LocationType.VICTORY_CACHE: + if victory_cache_locations >= target_victory_cache_locations: + continue + victory_cache_locations += 1 + if world.options.required_tactics.value == world.options.required_tactics.option_any_units: + if mission_needs_unit and not unit_given and location_data.type == easiest_category: + # Ensure there is at least one no-logic location if the first mission is a build mission + location = create_minimal_logic_location(world, location_data, region, location_cache, 0) + unit_given = True + elif location_data.type == LocationType.MASTERY: + # Mastery locations always require max units regardless of position in the ramp + location = create_minimal_logic_location(world, location_data, region, location_cache, MAX_UNIT_REQUIREMENT) + else: + # Required number of units = mission depth; +1 if it's a starting build mission; +1 if it's a challenge location + location = create_minimal_logic_location(world, location_data, region, location_cache, min( + slot.min_depth + mission_needs_unit + (location_data.type == LocationType.CHALLENGE), + MAX_UNIT_REQUIREMENT + )) + else: + location = create_location(world.player, location_data, region, location_cache) + region.locations.append(location) + + return region + + +######################## + + +def make_connections(mission_order: SC2MOGenMissionOrder, world: 'SC2World'): + """Creates Archipelago entrances between missions and creates access rules for the generator from entry rule objects.""" + names: Dict[str, int] = {} + player = world.player + for campaign in mission_order.campaigns: + for layout in campaign.layouts: + for mission in layout.missions: + if not mission.option_empty: + mission_uses_rule = mission.entry_rule.target_amount > 0 + mission_rule = mission.entry_rule.to_lambda(player) + mandatory_prereq = mission.entry_rule.find_mandatory_mission() + # Only layout entrances need to consider campaign & layout prerequisites + if mission.option_entrance: + campaign_uses_rule = campaign.entry_rule.target_amount > 0 + campaign_rule = campaign.entry_rule.to_lambda(player) + layout_uses_rule = layout.entry_rule.target_amount > 0 + layout_rule = layout.entry_rule.to_lambda(player) + + # Any mandatory prerequisite mission is good enough + mandatory_prereq = campaign.entry_rule.find_mandatory_mission() if mandatory_prereq is None else mandatory_prereq + mandatory_prereq = layout.entry_rule.find_mandatory_mission() if mandatory_prereq is None else mandatory_prereq + + # Avoid calling obviously unused lambdas + if campaign_uses_rule: + if layout_uses_rule: + if mission_uses_rule: + unlock_rule = lambda state, campaign_rule=campaign_rule, layout_rule=layout_rule, mission_rule=mission_rule: \ + campaign_rule(state) and layout_rule(state) and mission_rule(state) + else: + unlock_rule = lambda state, campaign_rule=campaign_rule, layout_rule=layout_rule: \ + campaign_rule(state) and layout_rule(state) + else: + if mission_uses_rule: + unlock_rule = lambda state, campaign_rule=campaign_rule, mission_rule=mission_rule: \ + campaign_rule(state) and mission_rule(state) + else: + unlock_rule = campaign_rule + elif layout_uses_rule: + if mission_uses_rule: + unlock_rule = lambda state, layout_rule=layout_rule, mission_rule=mission_rule: \ + layout_rule(state) and mission_rule(state) + else: + unlock_rule = layout_rule + elif mission_uses_rule: + unlock_rule = mission_rule + else: + unlock_rule = None + elif mission_uses_rule: + unlock_rule = mission_rule + else: + unlock_rule = None + + # Connect to a discovered mandatory mission if possible + if mandatory_prereq is not None: + connect(world, names, mandatory_prereq.mission.mission_name, mission.mission.mission_name, unlock_rule) + else: + # If no mission is known to be mandatory, connect to all previous missions instead + for prev_mission in mission.prev: + connect(world, names, prev_mission.mission.mission_name, mission.mission.mission_name, unlock_rule) + # As a last resort connect to Menu + if len(mission.prev) == 0: + connect(world, names, "Menu", mission.mission.mission_name, unlock_rule) + + +def connect(world: 'SC2World', used_names: Dict[str, int], source: str, target: str, + rule: Optional[Callable] = None): + source_region = world.get_region(source) + target_region = world.get_region(target) + + if target not in used_names: + used_names[target] = 1 + name = target + else: + used_names[target] += 1 + name = target + (' ' * used_names[target]) + + connection = Entrance(world.player, name, source_region) + + if rule: + connection.access_rule = rule + + source_region.exits.append(connection) + connection.connect(target_region) + + +######################## + + +def resolve_generic_keys(mission_order: SC2MOGenMissionOrder) -> None: + """ + Replaces placeholder keys in Item entry rules with their concrete counterparts. + Specifically this handles placing named keys into missions and vanilla campaigns/layouts, + and assigning correct progression tracks to progressive keys. + """ + layout_numbered_keys = 1 + campaign_numbered_keys = 1 + progression_tracks: Dict[int, List[Tuple[MissionOrderNode, ItemEntryRule]]] = {} + for (node, item_rules) in mission_order.keys_to_resolve.items(): + key_name = node.get_key_name() + # Generic keys in mission slots should always resolve to an existing key + # Layouts and campaigns may need to be switched for numbered keys + if isinstance(node, SC2MOGenLayout) and key_name not in named_layout_key_item_table: + key_name = item_names._TEMPLATE_NUMBERED_LAYOUT_KEY.format(layout_numbered_keys) + layout_numbered_keys += 1 + elif isinstance(node, SC2MOGenCampaign) and key_name not in named_campaign_key_item_table: + key_name = item_names._TEMPLATE_NUMBERED_CAMPAIGN_KEY.format(campaign_numbered_keys) + campaign_numbered_keys += 1 + + for item_rule in item_rules: + # Swap regular generic key names for the node's proper key name + item_rule.items_to_check = { + key_name if item_name.casefold() == GENERIC_KEY_NAME else item_name: amount + for (item_name, amount) in item_rule.items_to_check.items() + } + # Only lock the key if it was actually placed in this rule + if key_name in item_rule.items_to_check: + mission_order.items_to_lock[key_name] = max(item_rule.items_to_check[key_name], mission_order.items_to_lock.get(key_name, 0)) + + # Sort progressive keys by their given track + for (item_name, amount) in item_rule.items_to_check.items(): + if item_name.casefold() == GENERIC_PROGRESSIVE_KEY_NAME: + progression_tracks.setdefault(amount, []).append((node, item_rule)) + elif item_name.casefold().startswith(GENERIC_PROGRESSIVE_KEY_NAME): + track_string = item_name.split()[-1] + try: + track = int(track_string) + progression_tracks.setdefault(track, []).append((node, item_rule)) + except ValueError: + raise ValueError( + f"Progression track \"{track_string}\" for progressive key \"{item_name}: {amount}\" is not a valid number. " + "Valid formats are:\n" + f"- {GENERIC_PROGRESSIVE_KEY_NAME.title()}: X\n" + f"- {GENERIC_PROGRESSIVE_KEY_NAME.title()} X: 1" + ) + + def find_progressive_keys(item_rule: ItemEntryRule, track_to_find: int) -> List[str]: + return [ + item_name for (item_name, amount) in item_rule.items_to_check.items() + if (item_name.casefold() == GENERIC_PROGRESSIVE_KEY_NAME and amount == track_to_find) or ( + item_name.casefold().startswith(GENERIC_PROGRESSIVE_KEY_NAME) and + item_name.split()[-1] == str(track_to_find) + ) + ] + + def replace_progressive_keys(item_rule: ItemEntryRule, track_to_replace: int, new_key_name: str, new_key_amount: int): + keys_to_replace = find_progressive_keys(item_rule, track_to_replace) + new_items_to_check: Dict[str, int] = {} + for (item_name, amount) in item_rule.items_to_check.items(): + if item_name in keys_to_replace: + new_items_to_check[new_key_name] = new_key_amount + else: + new_items_to_check[item_name] = amount + item_rule.items_to_check = new_items_to_check + + # Change progressive keys to be unique for missions and layouts that request it + want_unique: Dict[MissionOrderNode, List[Tuple[MissionOrderNode, ItemEntryRule]]] = {} + empty_tracks: List[int] = [] + for track in progression_tracks: + # Sort keys to change by layout + new_unique_tracks: Dict[MissionOrderNode, List[Tuple[MissionOrderNode, ItemEntryRule]]] = {} + for (node, item_rule) in progression_tracks[track]: + if isinstance(node, SC2MOGenMission): + # Unique tracks for layouts take priority over campaigns + if node.parent().option_unique_progression_track == track: + new_unique_tracks.setdefault(node.parent(), []).append((node, item_rule)) + elif node.parent().parent().option_unique_progression_track == track: + new_unique_tracks.setdefault(node.parent().parent(), []).append((node, item_rule)) + elif isinstance(node, SC2MOGenLayout) and node.parent().option_unique_progression_track == track: + new_unique_tracks.setdefault(node.parent(), []).append((node, item_rule)) + # Remove found keys from their original progression track + for (container_node, rule_list) in new_unique_tracks.items(): + for node_and_rule in rule_list: + progression_tracks[track].remove(node_and_rule) + want_unique.setdefault(container_node, []).extend(rule_list) + if len(progression_tracks[track]) == 0: + empty_tracks.append(track) + for track in empty_tracks: + progression_tracks.pop(track) + + # Make sure all tracks that can't have keys have been taken care of + invalid_tracks: List[int] = [track for track in progression_tracks if track < 1 or track > len(SC2Mission)] + if len(invalid_tracks) > 0: + affected_key_list: Dict[MissionOrderNode, List[str]] = {} + for track in invalid_tracks: + for (node, item_rule) in progression_tracks[track]: + affected_key_list.setdefault(node, []).extend( + f"{key}: {item_rule.items_to_check[key]}" for key in find_progressive_keys(item_rule, track) + ) + affected_key_list_string = "\n- " + "\n- ".join( + f"{node.get_address_to_node()}: {affected_keys}" + for (node, affected_keys) in affected_key_list.items() + ) + raise ValueError( + "Some item rules contain progressive keys with invalid tracks:" + + affected_key_list_string + + f"\nPossible solutions are changing the tracks of affected keys to be in the range from 1 to {len(SC2Mission)}, " + "or changing the unique_progression_track of containing campaigns/layouts to match the invalid tracks." + ) + + # Assign new free progression tracks to nodes in definition order + next_free = 1 + nodes_to_assign = list(want_unique.keys()) + while len(want_unique) > 0: + while next_free in progression_tracks: + next_free += 1 + container_node = nodes_to_assign.pop(0) + progression_tracks[next_free] = want_unique.pop(container_node) + # Replace the affected keys in nodes with their correct counterparts + key_name = f"{GENERIC_PROGRESSIVE_KEY_NAME} {next_free}" + for (node, item_rule) in progression_tracks[next_free]: + # It's guaranteed by the sorting above that the container is either a layout or a campaign + replace_progressive_keys(item_rule, container_node.option_unique_progression_track, key_name, 1) + + # Give progressive keys a more fitting name if there's only one track and they all apply to the same type of node + progressive_flavor_name: Union[str, None] = None + if len(progression_tracks) == 1: + if all(isinstance(node, SC2MOGenLayout) for rule_list in progression_tracks.values() for (node, _) in rule_list): + progressive_flavor_name = item_names.PROGRESSIVE_QUESTLINE_KEY + elif all(isinstance(node, SC2MOGenMission) for rule_list in progression_tracks.values() for (node, _) in rule_list): + progressive_flavor_name = item_names.PROGRESSIVE_MISSION_KEY + + for (track, rule_list) in progression_tracks.items(): + key_name = item_names._TEMPLATE_PROGRESSIVE_KEY.format(track) if progressive_flavor_name is None else progressive_flavor_name + # Determine order in which the rules should unlock + ordered_item_rules: List[List[ItemEntryRule]] = [] + if not any(isinstance(node, SC2MOGenMission) for (node, _) in rule_list): + # No rule on this track belongs to a mission, so the rules can be kept in definition order + ordered_item_rules = [[item_rule] for (_, item_rule) in rule_list] + else: + # At least one rule belongs to a mission + # Sort rules by the depth of their nodes, ties get the same amount of keys + depth_to_rules: Dict[int, List[ItemEntryRule]] = {} + for (node, item_rule) in rule_list: + depth_to_rules.setdefault(node.get_min_depth(), []).append(item_rule) + ordered_item_rules = [depth_to_rules[depth] for depth in sorted(depth_to_rules.keys())] + + # Assign correct progressive keys to each rule + for (position, item_rules) in enumerate(ordered_item_rules): + for item_rule in item_rules: + keys_to_replace = [ + item_name for (item_name, amount) in item_rule.items_to_check.items() + if (item_name.casefold() == GENERIC_PROGRESSIVE_KEY_NAME and amount == track) or ( + item_name.casefold().startswith(GENERIC_PROGRESSIVE_KEY_NAME) and + item_name.split()[-1] == str(track) + ) + ] + new_items_to_check: Dict[str, int] = {} + for (item_name, amount) in item_rule.items_to_check.items(): + if item_name in keys_to_replace: + new_items_to_check[key_name] = position + 1 + else: + new_items_to_check[item_name] = amount + item_rule.items_to_check = new_items_to_check + mission_order.items_to_lock[key_name] = len(ordered_item_rules) diff --git a/worlds/sc2/mission_order/layout_types.py b/worlds/sc2/mission_order/layout_types.py new file mode 100644 index 0000000000..7581ac64f4 --- /dev/null +++ b/worlds/sc2/mission_order/layout_types.py @@ -0,0 +1,620 @@ +from __future__ import annotations +from typing import List, Callable, Set, Tuple, Union, TYPE_CHECKING, Dict, Any +import math +from abc import ABC, abstractmethod + +if TYPE_CHECKING: + from .nodes import SC2MOGenMission + +class LayoutType(ABC): + size: int + index_functions: List[str] = [] + """Names of available functions for mission indices. For list member `"my_fn"`, function should be called `idx_my_fn`.""" + + def __init__(self, size: int): + self.size = size + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + """Get type-specific options from the provided dict. Should return unused values.""" + return options + + @abstractmethod + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + """Use the provided `Callable` to create a one-dimensional list of mission slots and set up initial settings and connections. + + This should include at least one entrance and exit.""" + return [] + + def final_setup(self, missions: List[SC2MOGenMission]): + """Called after user changes to the layout are applied to make any final checks and changes. + + Implementers should make changes with caution, since it runs after a user's explicit commands are implemented.""" + return + + def parse_index(self, term: str) -> Union[Set[int], None]: + """From the given term, determine a list of desired target indices. The term is guaranteed to not be "entrances", "exits", or "all". + + If the term cannot be parsed, either raise an exception or return `None`.""" + return self.parse_index_as_function(term) + + def parse_index_as_function(self, term: str) -> Union[Set[int], None]: + """Helper function to interpret the term as a function call on the layout type, if it is declared in `self.index_functions`. + + Returns the function's return value if `term` is a valid function call, `None` otherwise.""" + left = term.find('(') + right = term.find(')') + if left == -1 and right == -1: + # Assume no args are desired + fn_name = term.strip() + fn_args = [] + elif left == -1 or right == -1: + return None + else: + fn_name = term[:left].strip() + fn_args_str = term[left + 1:right] + fn_args = [arg.strip() for arg in fn_args_str.split(',')] + + if fn_name in self.index_functions: + try: + return getattr(self, "idx_" + fn_name)(*fn_args) + except: + return None + else: + return None + + @abstractmethod + def get_visual_layout(self) -> List[List[int]]: + """Organize the mission slots into a list of columns from left to right and top to bottom. + The list should contain indices into the list created by `make_slots`. Intentionally empty spots should contain -1. + + The resulting 2D list should be rectangular.""" + pass + +class Column(LayoutType): + """Linear layout. Default entrance is index 0 at the top, default exit is index `size - 1` at the bottom.""" + + # 0 + # 1 + # 2 + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + missions = [mission_factory() for _ in range(self.size)] + missions[0].option_entrance = True + missions[-1].option_exit = True + for i in range(self.size - 1): + missions[i].next.append(missions[i + 1]) + return missions + + def get_visual_layout(self) -> List[List[int]]: + return [list(range(self.size))] + +class Grid(LayoutType): + """Rectangular grid. Default entrance is index 0 in the top left, default exit is index `size - 1` in the bottom right.""" + width: int + height: int + num_corners_to_remove: int + two_start_positions: bool + + index_functions = [ + "point", "rect" + ] + + # 0 1 2 + # 3 4 5 + # 6 7 8 + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + self.two_start_positions = options.pop("two_start_positions", False) and self.size >= 2 + if self.two_start_positions: + self.size += 1 + width: int = options.pop("width", 0) + if width < 1: + self.width, self.height, self.num_corners_to_remove = Grid.get_grid_dimensions(self.size) + else: + self.width = width + self.height = math.ceil(self.size / self.width) + self.num_corners_to_remove = self.height * width - self.size + return options + + @staticmethod + def get_factors(number: int) -> Tuple[int, int]: + """ + Simple factorization into pairs of numbers (x, y) using a sieve method. + Returns the factorization that is most square, i.e. where x + y is minimized. + Factor order is such that x <= y. + """ + assert number > 0 + for divisor in range(math.floor(math.sqrt(number)), 1, -1): + quotient = number // divisor + if quotient * divisor == number: + return divisor, quotient + return 1, number + + @staticmethod + def get_grid_dimensions(size: int) -> Tuple[int, int, int]: + """ + Get the dimensions of a grid mission order from the number of missions, int the format (x, y, error). + * Error will always be 0, 1, or 2, so the missions can be removed from the corners that aren't the start or end. + * Dimensions are chosen such that x <= y, as buttons in the UI are wider than they are tall. + * Dimensions are chosen to be maximally square. That is, x + y + error is minimized. + * If multiple options of the same rating are possible, the one with the larger error is chosen, + as it will appear more square. Compare 3x11 to 5x7-2 for an example of this. + """ + dimension_candidates: List[Tuple[int, int, int]] = [(*Grid.get_factors(size + x), x) for x in (2, 1, 0)] + best_dimension = min(dimension_candidates, key=sum) + return best_dimension + + @staticmethod + def manhattan_distance(point1: Tuple[int, int], point2: Tuple[int, int]) -> int: + return abs(point1[0] - point2[0]) + abs(point1[1] - point2[1]) + + @staticmethod + def euclidean_distance_squared(point1: Tuple[int, int], point2: Tuple[int, int]) -> int: + return (point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2 + + @staticmethod + def euclidean_distance(point1: Tuple[int, int], point2: Tuple[int, int]) -> float: + return math.sqrt(Grid.euclidean_distance_squared(point1, point2)) + + def get_grid_coordinates(self, idx: int) -> Tuple[int, int]: + return (idx % self.width), (idx // self.width) + + def get_grid_index(self, x: int, y: int) -> int: + return y * self.width + x + + def is_valid_coordinates(self, x: int, y: int) -> bool: + return ( + 0 <= x < self.width and + 0 <= y < self.height + ) + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + missions = [mission_factory() for _ in range(self.width * self.height)] + if self.two_start_positions: + missions[0].option_empty = True + missions[1].option_entrance = True + missions[self.get_grid_index(0, 1)].option_entrance = True + else: + missions[0].option_entrance = True + missions[-1].option_exit = True + + for x in range(self.width): + left = x - 1 + right = x + 1 + for y in range(self.height): + up = y - 1 + down = y + 1 + idx = self.get_grid_index(x, y) + neighbours = [ + self.get_grid_index(nb_x, nb_y) + for (nb_x, nb_y) in [(left, y), (right, y), (x, up), (x, down)] + if self.is_valid_coordinates(nb_x, nb_y) + ] + missions[idx].next = [missions[nb] for nb in neighbours] + + # Empty corners + top_corners = math.floor(self.num_corners_to_remove / 2) + bottom_corners = math.ceil(self.num_corners_to_remove / 2) + + # Bottom left corners + y = self.height - 1 + x = 0 + leading_x = 0 + placed = 0 + while placed < bottom_corners: + if x == -1 or y == 0: + leading_x += 1 + x = leading_x + y = self.height - 1 + missions[self.get_grid_index(x, y)].option_empty = True + placed += 1 + x -= 1 + y -= 1 + + # Top right corners + y = 0 + x = self.width - 1 + leading_x = self.width - 1 + placed = 0 + while placed < top_corners: + if x == self.width or y == self.height - 1: + leading_x -= 1 + x = leading_x + y = 0 + missions[self.get_grid_index(x, y)].option_empty = True + placed += 1 + x += 1 + y += 1 + + return missions + + def get_visual_layout(self) -> List[List[int]]: + columns = [ + [self.get_grid_index(x, y) for y in range(self.height)] + for x in range(self.width) + ] + return columns + + def idx_point(self, x: str, y: str) -> Union[Set[int], None]: + try: + x = int(x) + y = int(y) + except: + return None + if self.is_valid_coordinates(x, y): + return {self.get_grid_index(x, y)} + return None + + def idx_rect(self, x: str, y: str, width: str, height: str) -> Union[Set[int], None]: + try: + x = int(x) + y = int(y) + width = int(width) + height = int(height) + except: + return None + indices = { + self.get_grid_index(pt_x, pt_y) + for pt_y in range(y, y + height) + for pt_x in range(x, x + width) + if self.is_valid_coordinates(pt_x, pt_y) + } + return indices + + +class Canvas(Grid): + """Rectangular grid that determines size and filled slots based on special canvas option.""" + canvas: List[str] + groups: Dict[str, List[int]] + jump_distance_orthogonal: int + jump_distance_diagonal: int + + jumps_orthogonal = [(-1, 0), (0, 1), (1, 0), (0, -1)] + jumps_diagonal = [(-1, -1), (-1, 1), (1, 1), (1, -1)] + + index_functions = Grid.index_functions + ["group"] + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + self.width = options.pop("width") # Should be guaranteed by the option parser + self.height = math.ceil(self.size / self.width) + self.num_corners_to_remove = 0 + self.two_start_positions = False + self.jump_distance_orthogonal = max(options.pop("jump_distance_orthogonal", 1), 1) + self.jump_distance_diagonal = max(options.pop("jump_distance_diagonal", 1), 0) + + if "canvas" not in options: + raise KeyError("Canvas layout is missing required canvas option. Either create it or change type to Grid.") + self.canvas = options.pop("canvas") + # Pad short lines with spaces + longest_line = max(len(line) for line in self.canvas) + for idx in range(len(self.canvas)): + padding = ' ' * (longest_line - len(self.canvas[idx])) + self.canvas[idx] += padding + + self.groups = {} + for (line_idx, line) in enumerate(self.canvas): + for (char_idx, char) in enumerate(line): + self.groups.setdefault(char, []).append(self.get_grid_index(char_idx, line_idx)) + + return options + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + missions = super().make_slots(mission_factory) + missions[0].option_entrance = False + missions[-1].option_exit = False + + # Canvas spaces become empty slots + for idx in self.groups.get(" ", []): + missions[idx].option_empty = True + + # Raycast into jump directions to find nearest empty space + def jump(point: Tuple[int, int], direction: Tuple[int, int], distance: int) -> Tuple[int, int]: + return ( + point[0] + direction[0] * distance, + point[1] + direction[1] * distance + ) + + def raycast(point: Tuple[int, int], direction: Tuple[int, int], max_distance: int) -> Union[Tuple[int, SC2MOGenMission], None]: + for distance in range(1, max_distance + 1): + target = jump(point, direction, distance) + if self.is_valid_coordinates(*target): + target_mission = missions[self.get_grid_index(*target)] + if not target_mission.option_empty: + return (distance, target_mission) + else: + # Out of bounds + return None + return None + + for (idx, mission) in enumerate(missions): + if mission.option_empty: + continue + point = self.get_grid_coordinates(idx) + if self.jump_distance_orthogonal > 1: + for direction in Canvas.jumps_orthogonal: + target = raycast(point, direction, self.jump_distance_orthogonal) + if target is not None: + (distance, target_mission) = target + if distance > 1: + # Distance 1 orthogonal jumps already come from the base grid + mission.next.append(target[1]) + if self.jump_distance_diagonal > 0: + for direction in Canvas.jumps_diagonal: + target = raycast(point, direction, self.jump_distance_diagonal) + if target is not None: + (distance, target_mission) = target + if distance == 1: + # Keep distance 1 diagonal slots only if the orthogonal neighbours are empty + x_neighbour = jump(point, (direction[0], 0), 1) + y_neighbour = jump(point, (0, direction[1]), 1) + if ( + missions[self.get_grid_index(*x_neighbour)].option_empty and + missions[self.get_grid_index(*y_neighbour)].option_empty + ): + mission.next.append(target_mission) + else: + mission.next.append(target_mission) + + return missions + + def final_setup(self, missions: List[SC2MOGenMission]): + # Pick missions near the original start and end to set as default entrance/exit + # if the user didn't set one themselves + def distance_lambda(point: Tuple[int, int]) -> Callable[[Tuple[int, SC2MOGenMission]], int]: + return lambda idx_mission: Grid.euclidean_distance_squared(self.get_grid_coordinates(idx_mission[0]), point) + + if not any(mission.option_entrance for mission in missions): + top_left = self.get_grid_coordinates(0) + closest_to_top_left = sorted( + ((idx, mission) for (idx, mission) in enumerate(missions) if not mission.option_empty), + key = distance_lambda(top_left) + ) + closest_to_top_left[0][1].option_entrance = True + + if not any(mission.option_exit for mission in missions): + bottom_right = self.get_grid_coordinates(len(missions) - 1) + closest_to_bottom_right = sorted( + ((idx, mission) for (idx, mission) in enumerate(missions) if not mission.option_empty), + key = distance_lambda(bottom_right) + ) + closest_to_bottom_right[0][1].option_exit = True + + def idx_group(self, group: str) -> Union[Set[int], None]: + if group not in self.groups: + return None + return set(self.groups[group]) + + +class Hopscotch(LayoutType): + """Alternating between one and two available missions. + Default entrance is index 0 in the top left, default exit is index `size - 1` in the bottom right.""" + width: int + spacer: int + two_start_positions: bool + + index_functions = [ + "top", "bottom", "middle", "corner" + ] + + # 0 2 + # 1 3 5 + # 4 6 + # 7 + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + self.two_start_positions = options.pop("two_start_positions", False) and self.size >= 2 + if self.two_start_positions: + self.size += 1 + width: int = options.pop("width", 7) + self.width = max(width, 4) + spacer: int = options.pop("spacer", 2) + self.spacer = max(spacer, 1) + return options + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + slots = [mission_factory() for _ in range(self.size)] + if self.two_start_positions: + slots[0].option_empty = True + slots[1].option_entrance = True + slots[2].option_entrance = True + else: + slots[0].option_entrance = True + slots[-1].option_exit = True + + cycle = 0 + for idx in range(self.size): + if cycle == 0: + indices = [idx + 1, idx + 2] + cycle = 2 + elif cycle == 1: + indices = [idx + 1] + cycle -= 1 + else: + indices = [idx + 2] + cycle -= 1 + for next_idx in indices: + if next_idx < self.size: + slots[idx].next.append(slots[next_idx]) + + return slots + + @staticmethod + def space_at_column(idx: int) -> List[int]: + # -1 0 1 2 3 4 5 + amount = idx - 1 + if amount > 0: + return [-1 for _ in range(amount)] + else: + return [] + + def get_visual_layout(self) -> List[List[int]]: + # size offset by 1 to account for first column of two slots + cols: List[List[int]] = [] + col: List[int] = [] + col_size = 1 + for idx in range(self.size): + if col_size == 3: + col_size = 1 + cols.append(col) + col = [idx] + else: + col_size += 1 + col.append(idx) + if len(col) > 0: + cols.append(col) + + final_cols: List[List[int]] = [Hopscotch.space_at_column(idx) for idx in range(min(len(cols), self.width))] + for (col_idx, col) in enumerate(cols): + if col_idx >= self.width: + final_cols[col_idx % self.width].extend([-1 for _ in range(self.spacer)]) + final_cols[col_idx % self.width].extend(col) + + fill_to_longest(final_cols) + + return final_cols + + def idx_bottom(self) -> Set[int]: + corners = math.ceil(self.size / 3) + indices = [num * 3 + 1 for num in range(corners)] + return { + idx for idx in indices if idx < self.size + } + + def idx_top(self) -> Set[int]: + corners = math.ceil(self.size / 3) + indices = [num * 3 + 2 for num in range(corners)] + return { + idx for idx in indices if idx < self.size + } + + def idx_middle(self) -> Set[int]: + corners = math.ceil(self.size / 3) + indices = [num * 3 for num in range(corners)] + return { + idx for idx in indices if idx < self.size + } + + def idx_corner(self, number: str) -> Union[Set[int], None]: + try: + number = int(number) + except: + return None + corners = math.ceil(self.size / 3) + if number >= corners: + return None + indices = [number * 3 + n for n in range(3)] + return { + idx for idx in indices if idx < self.size + } + + +class Gauntlet(LayoutType): + """Long, linear layout. Goes horizontally and wraps around. + Default entrance is index 0 in the top left, default exit is index `size - 1` in the bottom right.""" + width: int + + # 0 1 2 3 + # + # 4 5 6 7 + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + width: int = options.pop("width", 7) + self.width = min(max(width, 4), self.size) + return options + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + missions = [mission_factory() for _ in range(self.size)] + missions[0].option_entrance = True + missions[-1].option_exit = True + for i in range(self.size - 1): + missions[i].next.append(missions[i + 1]) + return missions + + def get_visual_layout(self) -> List[List[int]]: + columns = [[] for _ in range(self.width)] + for idx in range(self.size): + if idx >= self.width: + columns[idx % self.width].append(-1) + columns[idx % self.width].append(idx) + + fill_to_longest(columns) + + return columns + +class Blitz(LayoutType): + """Rows of missions, one mission per row required. + Default entrances are every mission in the top row, default exit is a central mission in the bottom row.""" + width: int + + index_functions = [ + "row" + ] + + # 0 1 2 3 + # 4 5 6 7 + + def set_options(self, options: Dict[str, Any]) -> Dict[str, Any]: + width = options.pop("width", 0) + if width < 1: + min_width, max_width = 2, 5 + mission_divisor = 5 + self.width = min(max(self.size // mission_divisor, min_width), max_width) + else: + self.width = min(self.size, width) + return options + + def make_slots(self, mission_factory: Callable[[], SC2MOGenMission]) -> List[SC2MOGenMission]: + slots = [mission_factory() for _ in range(self.size)] + for idx in range(self.width): + slots[idx].option_entrance = True + + # TODO: this is copied from the original mission order and works, but I'm not sure on the intent + # middle_column = self.width // 2 + # if self.size % self.width > middle_column: + # final_row = self.width * (self.size // self.width) + # final_mission = final_row + middle_column + # else: + # final_mission = self.size - 1 + # slots[final_mission].option_exit = True + + rows = self.size // self.width + for row in range(rows): + for top in range(self.width): + idx = row * self.width + top + for bot in range(self.width): + other = (row + 1) * self.width + bot + if other < self.size: + slots[idx].next.append(slots[other]) + if row == rows-1: + slots[idx].option_exit = True + + return slots + + def get_visual_layout(self) -> List[List[int]]: + columns = [[] for _ in range(self.width)] + for idx in range(self.size): + columns[idx % self.width].append(idx) + + fill_to_longest(columns) + + return columns + + def idx_row(self, row: str) -> Union[Set[int], None]: + try: + row = int(row) + except: + return None + rows = math.ceil(self.size / self.width) + if row >= rows: + return None + indices = [row * self.width + col for col in range(self.width)] + return { + idx for idx in indices if idx < self.size + } + +def fill_to_longest(columns: List[List[int]]): + longest = max(len(col) for col in columns) + for idx in range(len(columns)): + length = len(columns[idx]) + if length < longest: + columns[idx].extend([-1 for _ in range(longest - length)]) \ No newline at end of file diff --git a/worlds/sc2/mission_order/mission_pools.py b/worlds/sc2/mission_order/mission_pools.py new file mode 100644 index 0000000000..a3ab99f461 --- /dev/null +++ b/worlds/sc2/mission_order/mission_pools.py @@ -0,0 +1,251 @@ +from enum import IntEnum +from typing import TYPE_CHECKING, Dict, Set, List, Iterable + +from Options import OptionError +from ..mission_tables import SC2Mission, lookup_id_to_mission, MissionFlag, SC2Campaign +from worlds.AutoWorld import World + +if TYPE_CHECKING: + from .nodes import SC2MOGenMission + +class Difficulty(IntEnum): + RELATIVE = 0 + STARTER = 1 + EASY = 2 + MEDIUM = 3 + HARD = 4 + VERY_HARD = 5 + +# TODO figure out an organic way to get these +DEFAULT_DIFFICULTY_THRESHOLDS = { + Difficulty.STARTER: 0, + Difficulty.EASY: 10, + Difficulty.MEDIUM: 35, + Difficulty.HARD: 65, + Difficulty.VERY_HARD: 90, + Difficulty.VERY_HARD + 1: 100 +} + +STANDARD_DIFFICULTY_FILL_ORDER = ( + Difficulty.VERY_HARD, + Difficulty.STARTER, + Difficulty.HARD, + Difficulty.EASY, + Difficulty.MEDIUM, +) +"""Fill mission slots outer->inner difficulties, +so if multiple pools get exhausted, they will tend to overflow towards the middle.""" + +def modified_difficulty_thresholds(min_difficulty: Difficulty, max_difficulty: Difficulty) -> Dict[int, Difficulty]: + if min_difficulty == Difficulty.RELATIVE: + min_difficulty = Difficulty.STARTER + if max_difficulty == Difficulty.RELATIVE: + max_difficulty = Difficulty.VERY_HARD + thresholds: Dict[int, Difficulty] = {} + min_thresh = DEFAULT_DIFFICULTY_THRESHOLDS[min_difficulty] + total_thresh = DEFAULT_DIFFICULTY_THRESHOLDS[max_difficulty + 1] - min_thresh + for difficulty in range(min_difficulty, max_difficulty + 1): + threshold = DEFAULT_DIFFICULTY_THRESHOLDS[difficulty] - min_thresh + threshold *= 100 // total_thresh + thresholds[threshold] = Difficulty(difficulty) + return thresholds + +class SC2MOGenMissionPools: + """ + Manages available and used missions for a mission order. + """ + master_list: Set[int] + difficulty_pools: Dict[Difficulty, Set[int]] + _used_flags: Dict[MissionFlag, int] + _used_missions: List[SC2Mission] + _updated_difficulties: Dict[int, Difficulty] + _flag_ratios: Dict[MissionFlag, float] + _flag_weights: Dict[MissionFlag, int] + + def __init__(self) -> None: + self.master_list = {mission.id for mission in SC2Mission} + self.difficulty_pools = { + diff: {mission.id for mission in SC2Mission if mission.pool + 1 == diff} + for diff in Difficulty if diff != Difficulty.RELATIVE + } + self._used_flags = {} + self._used_missions = [] + self._updated_difficulties = {} + self._flag_ratios = {} + self._flag_weights = {} + + def set_exclusions(self, excluded: Iterable[SC2Mission], unexcluded: Iterable[SC2Mission]) -> None: + """Prevents all the missions that appear in the `excluded` list, but not in the `unexcluded` list, + from appearing in the mission order.""" + total_exclusions = [mission.id for mission in excluded if mission not in unexcluded] + self.master_list.difference_update(total_exclusions) + + def get_allowed_mission_count(self) -> int: + return len(self.master_list) + + def count_allowed_missions(self, campaign: SC2Campaign) -> int: + allowed_missions = [ + mission_id + for mission_id in self.master_list + if lookup_id_to_mission[mission_id].campaign == campaign + ] + return len(allowed_missions) + + def move_mission(self, mission: SC2Mission, old_diff: Difficulty, new_diff: Difficulty) -> None: + """Changes the difficulty of the given `mission`. Does nothing if the mission is not allowed to appear + or if it isn't set to the `old_diff` difficulty.""" + if mission.id in self.master_list and mission.id in self.difficulty_pools[old_diff]: + self.difficulty_pools[old_diff].remove(mission.id) + self.difficulty_pools[new_diff].add(mission.id) + self._updated_difficulties[mission.id] = new_diff + + def get_modified_mission_difficulty(self, mission: SC2Mission) -> Difficulty: + if mission.id in self._updated_difficulties: + return self._updated_difficulties[mission.id] + return Difficulty(mission.pool + 1) + + def get_pool_size(self, diff: Difficulty) -> int: + """Returns the amount of missions of the given difficulty that are allowed to appear.""" + return len(self.difficulty_pools[diff]) + + def get_used_flags(self) -> Dict[MissionFlag, int]: + """Returns a dictionary of all used flags and their appearance count within the mission order. + Flags that don't appear in the mission order also don't appear in this dictionary.""" + return self._used_flags + + def get_used_missions(self) -> List[SC2Mission]: + """Returns a set of all missions used in the mission order.""" + return self._used_missions + + def set_flag_balances(self, flag_ratios: Dict[MissionFlag, int], flag_weights: Dict[MissionFlag, int]): + # Ensure the ratios are percentages + ratio_sum = sum(ratio for ratio in flag_ratios.values()) + self._flag_ratios = {flag: ratio / ratio_sum for flag, ratio in flag_ratios.items()} + self._flag_weights = flag_weights + + def pick_balanced_mission(self, world: World, pool: List[int]) -> int: + """Applies ratio-based and weight-based balancing to pick a preferred mission from a given mission pool.""" + # Currently only used for race balancing + # Untested for flags that may overlap or not be present at all, but should at least generate + balanced_pool = pool + if len(self._flag_ratios) > 0: + relevant_used_flag_count = max(sum(self._used_flags.get(flag, 0) for flag in self._flag_ratios), 1) + current_ratios = { + flag: self._used_flags.get(flag, 0) / relevant_used_flag_count + for flag in self._flag_ratios + } + # Desirability of missions is the difference between target and current ratios for relevant flags + flag_scores = { + flag: self._flag_ratios[flag] - current_ratios[flag] + for flag in self._flag_ratios + } + mission_scores = [ + sum( + flag_scores[flag] for flag in self._flag_ratios + if flag in lookup_id_to_mission[mission].flags + ) + for mission in balanced_pool + ] + # Only keep the missions that create the best balance + best_score = max(mission_scores) + balanced_pool = [mission for idx, mission in enumerate(balanced_pool) if mission_scores[idx] == best_score] + + balanced_weights = [1.0 for _ in balanced_pool] + if len(self._flag_weights) > 0: + relevant_used_flag_count = max(sum(self._used_flags.get(flag, 0) for flag in self._flag_weights), 1) + # Higher usage rate of relevant flags means lower desirability + flag_scores = { + flag: (relevant_used_flag_count - self._used_flags.get(flag, 0)) * self._flag_weights[flag] + for flag in self._flag_weights + } + # Mission scores are averaged across the mission's flags, + # else flags that aren't always present will inflate weights + mission_scores = [ + sum( + flag_scores[flag] for flag in self._flag_weights + if flag in lookup_id_to_mission[mission].flags + ) / sum(flag in lookup_id_to_mission[mission].flags for flag in self._flag_weights) + for mission in balanced_pool + ] + balanced_weights = mission_scores + + if sum(balanced_weights) == 0.0: + balanced_weights = [1.0 for _ in balanced_weights] + return world.random.choices(balanced_pool, balanced_weights, k=1)[0] + + def pull_specific_mission(self, mission: SC2Mission) -> None: + """Marks the given mission as present in the mission order.""" + # Remove the mission from the master list and whichever difficulty pool it is in + if mission.id in self.master_list: + self.master_list.remove(mission.id) + for diff in self.difficulty_pools: + if mission.id in self.difficulty_pools[diff]: + self.difficulty_pools[diff].remove(mission.id) + break + self._add_mission_stats(mission) + + def _add_mission_stats(self, mission: SC2Mission) -> None: + # Update used flag counts & missions + # Done weirdly for Python <= 3.10 compatibility + flag: MissionFlag + for flag in iter(MissionFlag): # type: ignore + if flag & mission.flags == flag: + self._used_flags.setdefault(flag, 0) + self._used_flags[flag] += 1 + self._used_missions.append(mission) + + def pull_random_mission(self, world: World, slot: 'SC2MOGenMission', *, prefer_close_difficulty: bool = False) -> SC2Mission: + """Picks a random mission from the mission pool of the given slot and marks it as present in the mission order. + + With `prefer_close_difficulty = True` the mission is picked to be as close to the slot's desired difficulty as possible.""" + pool = slot.option_mission_pool.intersection(self.master_list) + + difficulty_pools: Dict[int, List[int]] = { + diff: sorted(pool.intersection(self.difficulty_pools[diff])) + for diff in Difficulty if diff != Difficulty.RELATIVE + } + + if len(pool) == 0: + raise OptionError(f"No available mission to be picked for slot {slot.get_address_to_node()}.") + + desired_difficulty = slot.option_difficulty + if prefer_close_difficulty: + # Iteratively look up and down around the slot's desired difficulty + # Either a difficulty with valid missions is found, or an error is raised + difficulty_offset = 0 + final_pool = difficulty_pools[desired_difficulty] + while len(final_pool) == 0: + higher_diff = min(desired_difficulty + difficulty_offset + 1, Difficulty.VERY_HARD) + final_pool = difficulty_pools[higher_diff] + if len(final_pool) > 0: + break + lower_diff = max(desired_difficulty - difficulty_offset, Difficulty.STARTER) + final_pool = difficulty_pools[lower_diff] + if len(final_pool) > 0: + break + if lower_diff == Difficulty.STARTER and higher_diff == Difficulty.VERY_HARD: + raise IndexError() + difficulty_offset += 1 + + else: + # Consider missions from all lower difficulties as well the desired difficulty + # Only take from higher difficulties if no lower difficulty is possible + final_pool = [ + mission + for difficulty in range(Difficulty.STARTER, desired_difficulty + 1) + for mission in difficulty_pools[difficulty] + ] + difficulty_offset = 1 + while len(final_pool) == 0: + higher_difficulty = desired_difficulty + difficulty_offset + if higher_difficulty > Difficulty.VERY_HARD: + raise IndexError() + final_pool = difficulty_pools[higher_difficulty] + difficulty_offset += 1 + + # Remove the mission from the master list + mission = lookup_id_to_mission[self.pick_balanced_mission(world, final_pool)] + self.master_list.remove(mission.id) + self.difficulty_pools[self.get_modified_mission_difficulty(mission)].remove(mission.id) + self._add_mission_stats(mission) + return mission diff --git a/worlds/sc2/mission_order/nodes.py b/worlds/sc2/mission_order/nodes.py new file mode 100644 index 0000000000..a18a433c88 --- /dev/null +++ b/worlds/sc2/mission_order/nodes.py @@ -0,0 +1,606 @@ +""" +Contains the data structures that make up a mission order. +Data in these structures is validated in .options.py and manipulated by .generation.py. +""" + +from __future__ import annotations +from typing import Dict, Set, Callable, List, Any, Type, Optional, Union, TYPE_CHECKING +from weakref import ref, ReferenceType +from dataclasses import asdict +from abc import ABC, abstractmethod +import logging + +from BaseClasses import Region, CollectionState +from ..mission_tables import SC2Mission +from ..item import item_names +from .layout_types import LayoutType +from .entry_rules import SubRuleEntryRule, ItemEntryRule +from .mission_pools import Difficulty +from .slot_data import CampaignSlotData, LayoutSlotData, MissionSlotData + +if TYPE_CHECKING: + from .. import SC2World + +class MissionOrderNode(ABC): + parent: Optional[ReferenceType[MissionOrderNode]] + important_beat_event: bool + + def get_parent(self, address_so_far: str, full_address: str) -> MissionOrderNode: + if self.parent is None: + raise ValueError( + f"Address \"{address_so_far}\" (from \"{full_address}\") could not find a parent object. " + "This should mean the address contains \"..\" too often." + ) + return self.parent() + + @abstractmethod + def search(self, term: str) -> Union[List[MissionOrderNode], None]: + raise NotImplementedError + + @abstractmethod + def child_type_name(self) -> str: + raise NotImplementedError + + @abstractmethod + def get_missions(self) -> List[SC2MOGenMission]: + raise NotImplementedError + + @abstractmethod + def get_exits(self) -> List[SC2MOGenMission]: + raise NotImplementedError + + @abstractmethod + def get_visual_requirement(self, start_node: MissionOrderNode) -> Union[str, SC2MOGenMission]: + raise NotImplementedError + + @abstractmethod + def get_key_name(self) -> str: + raise NotImplementedError + + @abstractmethod + def get_min_depth(self) -> int: + raise NotImplementedError + + @abstractmethod + def get_address_to_node(self) -> str: + raise NotImplementedError + + +class SC2MOGenMissionOrder(MissionOrderNode): + """ + The top-level data structure for mission orders. + """ + campaigns: List[SC2MOGenCampaign] + sorted_missions: Dict[Difficulty, List[SC2MOGenMission]] + """All mission slots in the mission order sorted by their difficulty, but not their depth.""" + fixed_missions: List[SC2MOGenMission] + """All mission slots that have a plando'd mission.""" + items_to_lock: Dict[str, int] + keys_to_resolve: Dict[MissionOrderNode, List[ItemEntryRule]] + goal_missions: List[SC2MOGenMission] + max_depth: int + + def __init__(self, world: 'SC2World', data: Dict[str, Any]): + self.campaigns = [] + self.sorted_missions = {diff: [] for diff in Difficulty if diff != Difficulty.RELATIVE} + self.fixed_missions = [] + self.items_to_lock = {} + self.keys_to_resolve = {} + self.goal_missions = [] + self.parent = None + + for (campaign_name, campaign_data) in data.items(): + campaign = SC2MOGenCampaign(world, ref(self), campaign_name, campaign_data) + self.campaigns.append(campaign) + + # Check that the mission order actually has a goal + for campaign in self.campaigns: + if campaign.option_goal: + self.goal_missions.extend(mission for mission in campaign.exits) + for layout in campaign.layouts: + if layout.option_goal: + self.goal_missions.extend(layout.exits) + for mission in layout.missions: + if mission.option_goal and not mission.option_empty: + self.goal_missions.append(mission) + # Remove duplicates + for goal in self.goal_missions: + while self.goal_missions.count(goal) > 1: + self.goal_missions.remove(goal) + + # If not, set the last defined campaign as goal + if len(self.goal_missions) == 0: + self.campaigns[-1].option_goal = True + self.goal_missions.extend(mission for mission in self.campaigns[-1].exits) + + # Apply victory cache option wherever the value has not yet been defined; must happen after goal missions are decided + for mission in self.get_missions(): + if mission.option_victory_cache != -1: + # Already set + continue + if mission in self.goal_missions: + mission.option_victory_cache = 0 + else: + mission.option_victory_cache = world.options.victory_cache.value + + # Resolve names + used_names: Set[str] = set() + for campaign in self.campaigns: + names = [campaign.option_name] if len(campaign.option_display_name) == 0 else campaign.option_display_name + if campaign.option_unique_name: + names = [name for name in names if name not in used_names] + campaign.display_name = world.random.choice(names) + used_names.add(campaign.display_name) + for layout in campaign.layouts: + names = [layout.option_name] if len(layout.option_display_name) == 0 else layout.option_display_name + if layout.option_unique_name: + names = [name for name in names if name not in used_names] + layout.display_name = world.random.choice(names) + used_names.add(layout.display_name) + + def get_slot_data(self) -> List[Dict[str, Any]]: + # [(campaign data, [(layout data, [[(mission data)]] )] )] + return [asdict(campaign.get_slot_data()) for campaign in self.campaigns] + + def search(self, term: str) -> Union[List[MissionOrderNode], None]: + return [ + campaign.layouts[0] if campaign.option_single_layout_campaign else campaign + for campaign in self.campaigns + if campaign.option_name.casefold() == term.casefold() + ] + + def child_type_name(self) -> str: + return "Campaign" + + def get_missions(self) -> List[SC2MOGenMission]: + return [mission for campaign in self.campaigns for layout in campaign.layouts for mission in layout.missions] + + def get_exits(self) -> List[SC2MOGenMission]: + return [] + + def get_visual_requirement(self, _start_node: MissionOrderNode) -> Union[str, SC2MOGenMission]: + return "All Missions" + + def get_key_name(self) -> str: + return super().get_key_name() # type: ignore + + def get_min_depth(self) -> int: + return super().get_min_depth() # type: ignore + + def get_address_to_node(self): + return self.campaigns[0].get_address_to_node() + "/.." + + +class SC2MOGenCampaign(MissionOrderNode): + option_name: str # name of this campaign + option_display_name: List[str] + option_unique_name: bool + option_entry_rules: List[Dict[str, Any]] + option_unique_progression_track: int # progressive keys under this campaign and on this track will be changed to a unique track + option_goal: bool # whether this campaign is required to beat the game + # minimum difficulty of this campaign + # 'relative': based on the median distance of the first mission + option_min_difficulty: Difficulty + # maximum difficulty of this campaign + # 'relative': based on the median distance of the last mission + option_max_difficulty: Difficulty + option_single_layout_campaign: bool + + # layouts of this campaign in correct order + layouts: List[SC2MOGenLayout] + exits: List[SC2MOGenMission] # missions required to beat this campaign (missions marked "exit" in layouts marked "exit") + entry_rule: SubRuleEntryRule + display_name: str + + min_depth: int + max_depth: int + + def __init__(self, world: 'SC2World', parent: ReferenceType[SC2MOGenMissionOrder], name: str, data: Dict[str, Any]): + self.parent = parent + self.important_beat_event = False + self.option_name = name + self.option_display_name = data["display_name"] + self.option_unique_name = data["unique_name"] + self.option_goal = data["goal"] + self.option_entry_rules = data["entry_rules"] + self.option_unique_progression_track = data["unique_progression_track"] + self.option_min_difficulty = Difficulty(data["min_difficulty"]) + self.option_max_difficulty = Difficulty(data["max_difficulty"]) + self.option_single_layout_campaign = data["single_layout_campaign"] + self.layouts = [] + self.exits = [] + + for (layout_name, layout_data) in data.items(): + if type(layout_data) == dict: + layout = SC2MOGenLayout(world, ref(self), layout_name, layout_data) + self.layouts.append(layout) + + # Collect required missions (marked layouts' exits) + if layout.option_exit: + self.exits.extend(layout.exits) + + # If no exits are set, use the last defined layout + if len(self.exits) == 0: + self.layouts[-1].option_exit = True + self.exits.extend(self.layouts[-1].exits) + + def is_beaten(self, beaten_missions: Set[SC2MOGenMission]) -> bool: + return beaten_missions.issuperset(self.exits) + + def is_always_unlocked(self, in_region_creation = False) -> bool: + return self.entry_rule.is_always_fulfilled(in_region_creation) + + def is_unlocked(self, beaten_missions: Set[SC2MOGenMission], in_region_creation = False) -> bool: + return self.entry_rule.is_fulfilled(beaten_missions, in_region_creation) + + def search(self, term: str) -> Union[List[MissionOrderNode], None]: + return [ + layout + for layout in self.layouts + if layout.option_name.casefold() == term.casefold() + ] + + def child_type_name(self) -> str: + return "Layout" + + def get_missions(self) -> List[SC2MOGenMission]: + return [mission for layout in self.layouts for mission in layout.missions] + + def get_exits(self) -> List[SC2MOGenMission]: + return self.exits + + def get_visual_requirement(self, start_node: MissionOrderNode) -> Union[str, SC2MOGenMission]: + visual_name = self.get_visual_name() + # Needs special handling for double-parent, which is valid for missions but errors for campaigns + first_parent = start_node.get_parent("", "") + if ( + first_parent is self or ( + first_parent.parent is not None and first_parent.get_parent("", "") is self + ) + ) and visual_name == "": + return "this campaign" + return visual_name + + def get_visual_name(self) -> str: + return self.display_name + + def get_key_name(self) -> str: + return item_names._TEMPLATE_NAMED_CAMPAIGN_KEY.format(self.get_visual_name()) + + def get_min_depth(self) -> int: + return self.min_depth + + def get_address_to_node(self) -> str: + return f"{self.option_name}" + + def get_slot_data(self) -> CampaignSlotData: + if self.important_beat_event: + exits = [slot.mission.id for slot in self.exits] + else: + exits = [] + + return CampaignSlotData( + self.get_visual_name(), + asdict(self.entry_rule.to_slot_data()), + exits, + [asdict(layout.get_slot_data()) for layout in self.layouts] + ) + + +class SC2MOGenLayout(MissionOrderNode): + option_name: str # name of this layout + option_display_name: List[str] # visual name of this layout + option_unique_name: bool + option_type: Type[LayoutType] # type of this layout + option_size: int # amount of missions in this layout + option_goal: bool # whether this layout is required to beat the game + option_exit: bool # whether this layout is required to beat its parent campaign + option_mission_pool: List[int] # IDs of valid missions for this layout + option_missions: List[Dict[str, Any]] + + option_entry_rules: List[Dict[str, Any]] + option_unique_progression_track: int # progressive keys under this layout and on this track will be changed to a unique track + + # minimum difficulty of this layout + # 'relative': based on the median distance of the first mission + option_min_difficulty: Difficulty + # maximum difficulty of this layout + # 'relative': based on the median distance of the last mission + option_max_difficulty: Difficulty + + missions: List[SC2MOGenMission] + layout_type: LayoutType + entrances: List[SC2MOGenMission] + exits: List[SC2MOGenMission] + entry_rule: SubRuleEntryRule + display_name: str + + min_depth: int + max_depth: int + + def __init__(self, world: 'SC2World', parent: ReferenceType[SC2MOGenCampaign], name: str, data: Dict): + self.parent: ReferenceType[SC2MOGenCampaign] = parent + self.important_beat_event = False + self.option_name = name + self.option_display_name = data.pop("display_name") + self.option_unique_name = data.pop("unique_name") + self.option_type = data.pop("type") + self.option_size = data.pop("size") + self.option_goal = data.pop("goal") + self.option_exit = data.pop("exit") + self.option_mission_pool = data.pop("mission_pool") + self.option_missions = data.pop("missions") + self.option_entry_rules = data.pop("entry_rules") + self.option_unique_progression_track = data.pop("unique_progression_track") + self.option_min_difficulty = Difficulty(data.pop("min_difficulty")) + self.option_max_difficulty = Difficulty(data.pop("max_difficulty")) + self.missions = [] + self.entrances = [] + self.exits = [] + + # Check for positive size now instead of during YAML validation to actively error with default size + if self.option_size == 0: + raise ValueError(f"Layout \"{self.option_name}\" has a size of 0.") + + # Build base layout + from . import layout_types + self.layout_type: LayoutType = getattr(layout_types, self.option_type)(self.option_size) + unused = self.layout_type.set_options(data) + if len(unused) > 0: + logging.warning(f"SC2 ({world.player_name}): Layout \"{self.option_name}\" has unknown options: {list(unused.keys())}") + mission_factory = lambda: SC2MOGenMission(ref(self), set(self.option_mission_pool)) + self.missions = self.layout_type.make_slots(mission_factory) + + # Update missions with user data + for mission_data in self.option_missions: + indices: Set[int] = set() + index_terms: List[Union[int, str]] = mission_data["index"] + for term in index_terms: + result = self.resolve_index_term(term) + indices.update(result) + for idx in indices: + self.missions[idx].update_with_data(mission_data) + + # Let layout respond to user changes + self.layout_type.final_setup(self.missions) + + for mission in self.missions: + if mission.option_entrance: + self.entrances.append(mission) + if mission.option_exit: + self.exits.append(mission) + if mission.option_next is not None: + mission.next = [self.missions[idx] for term in mission.option_next for idx in sorted(self.resolve_index_term(term))] + + # Set up missions' prev data + for mission in self.missions: + for next_mission in mission.next: + next_mission.prev.append(mission) + + # Remove empty missions from access data + for mission in self.missions: + if mission.option_empty: + for next_mission in mission.next: + next_mission.prev.remove(mission) + mission.next.clear() + for prev_mission in mission.prev: + prev_mission.next.remove(mission) + mission.prev.clear() + + # Clean up data and options + all_empty = True + for mission in self.missions: + if mission.option_empty: + # Empty missions cannot be entrances, exits, or required + # This is done now instead of earlier to make "set all default entrances to empty" not fail + if mission in self.entrances: + self.entrances.remove(mission) + mission.option_entrance = False + if mission in self.exits: + self.exits.remove(mission) + mission.option_exit = False + mission.option_goal = False + # Empty missions are also not allowed to cause secondary effects via entry rules (eg. create key items) + mission.option_entry_rules = [] + else: + all_empty = False + # Establish the following invariant: + # A non-empty mission has no prev missions <=> A non-empty mission is an entrance + # This is mandatory to guarantee the entire layout is accessible via consecutive .nexts + # Note that the opposite is not enforced for exits to allow fully optional layouts + if len(mission.prev) == 0: + mission.option_entrance = True + self.entrances.append(mission) + elif mission.option_entrance: + for prev_mission in mission.prev: + prev_mission.next.remove(mission) + mission.prev.clear() + if all_empty: + raise Exception(f"Layout \"{self.option_name}\" only contains empty mission slots.") + + def is_beaten(self, beaten_missions: Set[SC2MOGenMission]) -> bool: + return beaten_missions.issuperset(self.exits) + + def is_always_unlocked(self, in_region_creation = False) -> bool: + return self.entry_rule.is_always_fulfilled(in_region_creation) + + def is_unlocked(self, beaten_missions: Set[SC2MOGenMission], in_region_creation = False) -> bool: + return self.entry_rule.is_fulfilled(beaten_missions, in_region_creation) + + def resolve_index_term(self, term: Union[str, int], *, ignore_out_of_bounds: bool = True, reject_none: bool = True) -> Union[Set[int], None]: + try: + result = {int(term)} + except ValueError: + if term == "entrances": + result = {idx for idx in range(len(self.missions)) if self.missions[idx].option_entrance} + elif term == "exits": + result = {idx for idx in range(len(self.missions)) if self.missions[idx].option_exit} + elif term == "all": + result = {idx for idx in range(len(self.missions))} + else: + result = self.layout_type.parse_index(term) + if result is None and reject_none: + raise ValueError(f"Layout \"{self.option_name}\" could not resolve mission index term \"{term}\".") + if ignore_out_of_bounds: + result = [index for index in result if index >= 0 and index < len(self.missions)] + return result + + def get_parent(self, _address_so_far: str, _full_address: str) -> MissionOrderNode: + if self.parent().option_single_layout_campaign: + parent = self.parent().parent + else: + parent = self.parent + return parent() + + def search(self, term: str) -> Union[List[MissionOrderNode], None]: + indices = self.resolve_index_term(term, reject_none=False) + if indices is None: + # Let the address parser handle the fail case + return [] + missions = [self.missions[index] for index in sorted(indices)] + return missions + + def child_type_name(self) -> str: + return "Mission" + + def get_missions(self) -> List[SC2MOGenMission]: + return [mission for mission in self.missions] + + def get_exits(self) -> List[SC2MOGenMission]: + return self.exits + + def get_visual_requirement(self, start_node: MissionOrderNode) -> Union[str, SC2MOGenMission]: + visual_name = self.get_visual_name() + if start_node.get_parent("", "") is self and visual_name == "": + return "this questline" + return visual_name + + def get_visual_name(self) -> str: + return self.display_name + + def get_key_name(self) -> str: + return item_names._TEMPLATE_NAMED_LAYOUT_KEY.format(self.get_visual_name(), self.parent().get_visual_name()) + + def get_min_depth(self) -> int: + return self.min_depth + + def get_address_to_node(self) -> str: + campaign = self.parent() + if campaign.option_single_layout_campaign: + return f"{self.option_name}" + return self.parent().get_address_to_node() + f"/{self.option_name}" + + def get_slot_data(self) -> LayoutSlotData: + mission_slots = [ + [ + asdict(self.missions[idx].get_slot_data() if (idx >= 0 and not self.missions[idx].option_empty) else MissionSlotData.empty()) + for idx in column + ] + for column in self.layout_type.get_visual_layout() + ] + if self.important_beat_event: + exits = [slot.mission.id for slot in self.exits] + else: + exits = [] + + return LayoutSlotData( + self.get_visual_name(), + asdict(self.entry_rule.to_slot_data()), + exits, + mission_slots + ) + + +class SC2MOGenMission(MissionOrderNode): + option_goal: bool # whether this mission is required to beat the game + option_entrance: bool # whether this mission is unlocked when the layout is unlocked + option_exit: bool # whether this mission is required to beat its parent layout + option_empty: bool # whether this slot contains a mission at all + option_next: Union[None, List[Union[int, str]]] # indices of internally connected missions + option_entry_rules: List[Dict[str, Any]] + option_difficulty: Difficulty # difficulty pool this mission pulls from + option_mission_pool: Set[int] # Allowed mission IDs for this slot + option_victory_cache: int # Number of victory cache locations tied to the mission name + + entry_rule: SubRuleEntryRule + min_depth: int # Smallest amount of missions to beat before this slot is accessible + + mission: SC2Mission + region: Region + + next: List[SC2MOGenMission] + prev: List[SC2MOGenMission] + + def __init__(self, parent: ReferenceType[SC2MOGenLayout], parent_mission_pool: Set[int]): + self.parent: ReferenceType[SC2MOGenLayout] = parent + self.important_beat_event = False + self.option_mission_pool = parent_mission_pool + self.option_goal = False + self.option_entrance = False + self.option_exit = False + self.option_empty = False + self.option_next = None + self.option_entry_rules = [] + self.option_difficulty = Difficulty.RELATIVE + self.next = [] + self.prev = [] + self.min_depth = -1 + self.option_victory_cache = -1 + + def update_with_data(self, data: Dict): + self.option_goal = data.get("goal", self.option_goal) + self.option_entrance = data.get("entrance", self.option_entrance) + self.option_exit = data.get("exit", self.option_exit) + self.option_empty = data.get("empty", self.option_empty) + self.option_next = data.get("next", self.option_next) + self.option_entry_rules = data.get("entry_rules", self.option_entry_rules) + self.option_difficulty = data.get("difficulty", self.option_difficulty) + self.option_mission_pool = data.get("mission_pool", self.option_mission_pool) + self.option_victory_cache = data.get("victory_cache", -1) + + def is_always_unlocked(self, in_region_creation = False) -> bool: + return self.entry_rule.is_always_fulfilled(in_region_creation) + + def is_unlocked(self, beaten_missions: Set[SC2MOGenMission], in_region_creation = False) -> bool: + return self.entry_rule.is_fulfilled(beaten_missions, in_region_creation) + + def beat_item(self) -> str: + return f"Beat {self.mission.mission_name}" + + def beat_rule(self, player) -> Callable[[CollectionState], bool]: + return lambda state: state.has(self.beat_item(), player) + + def search(self, term: str) -> Union[List[MissionOrderNode], None]: + return None + + def child_type_name(self) -> str: + return "" + + def get_missions(self) -> List[SC2MOGenMission]: + return [self] + + def get_exits(self) -> List[SC2MOGenMission]: + return [self] + + def get_visual_requirement(self, _start_node: MissionOrderNode) -> Union[str, SC2MOGenMission]: + return self + + def get_key_name(self) -> str: + return item_names._TEMPLATE_MISSION_KEY.format(self.mission.mission_name) + + def get_min_depth(self) -> int: + return self.min_depth + + def get_address_to_node(self) -> str: + layout = self.parent() + assert layout is not None + index = layout.missions.index(self) + return layout.get_address_to_node() + f"/{index}" + + def get_slot_data(self) -> MissionSlotData: + return MissionSlotData( + self.mission.id, + [mission.mission.id for mission in self.prev], + self.entry_rule.to_slot_data(), + self.option_victory_cache, + ) diff --git a/worlds/sc2/mission_order/options.py b/worlds/sc2/mission_order/options.py new file mode 100644 index 0000000000..84630ba13a --- /dev/null +++ b/worlds/sc2/mission_order/options.py @@ -0,0 +1,472 @@ +""" +Contains the Custom Mission Order option. Also validates the option value, so generation can assume the data matches the specification. +""" + +from __future__ import annotations +import random + +from Options import OptionDict, Visibility +from schema import Schema, Optional, And, Or +import typing +from typing import Any, Union, Dict, Set, List +import copy + +from ..mission_tables import lookup_name_to_mission +from ..mission_groups import mission_groups +from ..item.item_tables import item_table +from ..item.item_groups import item_name_groups +from . import layout_types +from .layout_types import LayoutType, Column, Grid, Hopscotch, Gauntlet, Blitz, Canvas +from .mission_pools import Difficulty +from .presets_static import ( + static_preset, preset_mini_wol_with_prophecy, preset_mini_wol, preset_mini_hots, preset_mini_prophecy, + preset_mini_lotv_prologue, preset_mini_lotv, preset_mini_lotv_epilogue, preset_mini_nco, + preset_wol_with_prophecy, preset_wol, preset_prophecy, preset_hots, preset_lotv_prologue, + preset_lotv_epilogue, preset_lotv, preset_nco +) +from .presets_scripted import make_golden_path + +GENERIC_KEY_NAME = "Key".casefold() +GENERIC_PROGRESSIVE_KEY_NAME = "Progressive Key".casefold() + +STR_OPTION_VALUES: Dict[str, Dict[str, Any]] = { + "type": { + "column": Column.__name__, "grid": Grid.__name__, "hopscotch": Hopscotch.__name__, "gauntlet": Gauntlet.__name__, "blitz": Blitz.__name__, + "canvas": Canvas.__name__, + }, + "difficulty": { + "relative": Difficulty.RELATIVE.value, "starter": Difficulty.STARTER.value, "easy": Difficulty.EASY.value, + "medium": Difficulty.MEDIUM.value, "hard": Difficulty.HARD.value, "very hard": Difficulty.VERY_HARD.value + }, + "preset": { + "none": lambda _: {}, + "wol + prophecy": static_preset(preset_wol_with_prophecy), + "wol": static_preset(preset_wol), + "prophecy": static_preset(preset_prophecy), + "hots": static_preset(preset_hots), + "prologue": static_preset(preset_lotv_prologue), + "lotv prologue": static_preset(preset_lotv_prologue), + "lotv": static_preset(preset_lotv), + "epilogue": static_preset(preset_lotv_epilogue), + "lotv epilogue": static_preset(preset_lotv_epilogue), + "nco": static_preset(preset_nco), + "mini wol + prophecy": static_preset(preset_mini_wol_with_prophecy), + "mini wol": static_preset(preset_mini_wol), + "mini prophecy": static_preset(preset_mini_prophecy), + "mini hots": static_preset(preset_mini_hots), + "mini prologue": static_preset(preset_mini_lotv_prologue), + "mini lotv prologue": static_preset(preset_mini_lotv_prologue), + "mini lotv": static_preset(preset_mini_lotv), + "mini epilogue": static_preset(preset_mini_lotv_epilogue), + "mini lotv epilogue": static_preset(preset_mini_lotv_epilogue), + "mini nco": static_preset(preset_mini_nco), + "golden path": make_golden_path + }, +} +STR_OPTION_VALUES["min_difficulty"] = STR_OPTION_VALUES["difficulty"] +STR_OPTION_VALUES["max_difficulty"] = STR_OPTION_VALUES["difficulty"] +GLOBAL_ENTRY = "global" + +StrOption = lambda cat: And(str, lambda val: val.lower() in STR_OPTION_VALUES[cat]) +IntNegOne = And(int, lambda val: val >= -1) +IntZero = And(int, lambda val: val >= 0) +IntOne = And(int, lambda val: val >= 1) +IntPercent = And(int, lambda val: 0 <= val <= 100) +IntZeroToTen = And(int, lambda val: 0 <= val <= 10) + +SubRuleEntryRule = { + "rules": [{str: object}], # recursive schema checking is too hard + "amount": IntNegOne, +} +MissionCountEntryRule = { + "scope": [str], + "amount": IntNegOne, +} +BeatMissionsEntryRule = { + "scope": [str], +} +ItemEntryRule = { + "items": {str: int} +} +EntryRule = Or(SubRuleEntryRule, MissionCountEntryRule, BeatMissionsEntryRule, ItemEntryRule) +SchemaDifficulty = Or(*[value.value for value in Difficulty]) + +class CustomMissionOrder(OptionDict): + """ + Used to generate a custom mission order. Please see documentation to understand usage. + Will do nothing unless `mission_order` is set to `custom`. + """ + display_name = "Custom Mission Order" + visibility = Visibility.template + value: Dict[str, Dict[str, Any]] + default = { + "Default Campaign": { + "display_name": "null", + "unique_name": False, + "entry_rules": [], + "unique_progression_track": 0, + "goal": True, + "min_difficulty": "relative", + "max_difficulty": "relative", + GLOBAL_ENTRY: { + "display_name": "null", + "unique_name": False, + "entry_rules": [], + "unique_progression_track": 0, + "goal": False, + "exit": False, + "mission_pool": ["all missions"], + "min_difficulty": "relative", + "max_difficulty": "relative", + "missions": [], + }, + "Default Layout": { + "type": "grid", + "size": 9, + }, + }, + } + schema = Schema({ + # Campaigns + str: { + "display_name": [str], + "unique_name": bool, + "entry_rules": [EntryRule], + "unique_progression_track": int, + "goal": bool, + "min_difficulty": SchemaDifficulty, + "max_difficulty": SchemaDifficulty, + "single_layout_campaign": bool, + # Layouts + str: { + "display_name": [str], + "unique_name": bool, + # Type options + "type": lambda val: issubclass(getattr(layout_types, val), LayoutType), + "size": IntOne, + # Link options + "exit": bool, + "goal": bool, + "entry_rules": [EntryRule], + "unique_progression_track": int, + # Mission pool options + "mission_pool": {int}, + "min_difficulty": SchemaDifficulty, + "max_difficulty": SchemaDifficulty, + # Allow arbitrary options for layout types + Optional(str): Or(int, str, bool, [Or(int, str, bool)]), + # Mission slots + "missions": [{ + "index": [Or(int, str)], + Optional("entrance"): bool, + Optional("exit"): bool, + Optional("goal"): bool, + Optional("empty"): bool, + Optional("next"): [Or(int, str)], + Optional("entry_rules"): [EntryRule], + Optional("mission_pool"): {int}, + Optional("difficulty"): SchemaDifficulty, + Optional("victory_cache"): IntZeroToTen, + }], + }, + } + }) + + def __init__(self, yaml_value: Dict[str, Dict[str, Any]]) -> None: + # This function constructs self.value by parts, + # so the parent constructor isn't called + self.value: Dict[str, Dict[str, Any]] = {} + if yaml_value == self.default: # If this option is default, it shouldn't mess with its own values + yaml_value = copy.deepcopy(self.default) + + for campaign in yaml_value: + self.value[campaign] = {} + + # Check if this campaign has a layout type, making it a campaign-level layout + single_layout_campaign = "type" in yaml_value[campaign] + if single_layout_campaign: + # Single-layout campaigns are not allowed to declare more layouts + single_layout = {key: val for (key, val) in yaml_value[campaign].items() if type(val) != dict} + yaml_value[campaign] = {campaign: single_layout} + # Campaign should inherit certain values from the layout + if "goal" not in single_layout or not single_layout["goal"]: + yaml_value[campaign]["goal"] = False + if "unique_progression_track" in single_layout: + yaml_value[campaign]["unique_progression_track"] = single_layout["unique_progression_track"] + # Hide campaign name for single-layout campaigns + yaml_value[campaign]["display_name"] = "" + yaml_value[campaign]["single_layout_campaign"] = single_layout_campaign + + # Check if this campaign has a global layout + global_dict = {} + for name in yaml_value[campaign]: + if name.lower() == GLOBAL_ENTRY: + global_dict = yaml_value[campaign].pop(name) + break + + # Strip layouts and unknown options from the campaign + # The latter are assumed to be preset options + preset_key: str = yaml_value[campaign].pop("preset", "none") + layout_keys = [key for (key, val) in yaml_value[campaign].items() if type(val) == dict] + layouts = {key: yaml_value[campaign].pop(key) for key in layout_keys} + preset_option_keys = [key for key in yaml_value[campaign] if key not in self.default["Default Campaign"]] + preset_option_keys.remove("single_layout_campaign") + preset_options = {key: yaml_value[campaign].pop(key) for key in preset_option_keys} + + # Resolve preset + preset: Dict[str, Any] = _resolve_string_option_single("preset", preset_key)(preset_options) + # Preset global is resolved internally to avoid conflict with user global + preset_global_dict = {} + for name in preset: + if name.lower() == GLOBAL_ENTRY: + preset_global_dict = preset.pop(name) + break + preset_layout_keys = [key for (key, val) in preset.items() if type(val) == dict] + preset_layouts = {key: preset.pop(key) for key in preset_layout_keys} + ordered_layouts = {key: copy.deepcopy(preset_global_dict) for key in preset_layout_keys} + for key in preset_layout_keys: + ordered_layouts[key].update(preset_layouts[key]) + # Final layouts are preset layouts (updated by same-name user layouts) followed by custom user layouts + for key in layouts: + if key in ordered_layouts: + # Mission slots for presets should go before user mission slots + if "missions" in layouts[key] and "missions" in ordered_layouts[key]: + layouts[key]["missions"] = ordered_layouts[key]["missions"] + layouts[key]["missions"] + ordered_layouts[key].update(layouts[key]) + else: + ordered_layouts[key] = layouts[key] + + # Campaign values = default options (except for default layouts) + preset options (except for layouts) + campaign options + self.value[campaign] = {key: value for (key, value) in self.default["Default Campaign"].items() if type(value) != dict} + self.value[campaign].update(preset) + self.value[campaign].update(yaml_value[campaign]) + _resolve_special_options(self.value[campaign]) + + for layout in ordered_layouts: + # Layout values = default options + campaign's global options + layout options + self.value[campaign][layout] = copy.deepcopy(self.default["Default Campaign"][GLOBAL_ENTRY]) + self.value[campaign][layout].update(global_dict) + self.value[campaign][layout].update(ordered_layouts[layout]) + _resolve_special_options(self.value[campaign][layout]) + + for mission_slot_index in range(len(self.value[campaign][layout]["missions"])): + # Defaults for mission slots are handled by the mission slot struct + _resolve_special_options(self.value[campaign][layout]["missions"][mission_slot_index]) + + # Overloaded to remove pre-init schema validation + # Schema is still validated after __init__ + @classmethod + def from_any(cls, data: Dict[str, Any]) -> CustomMissionOrder: + if type(data) == dict: + return cls(data) + else: + raise NotImplementedError(f"Cannot Convert from non-dictionary, got {type(data)}") + + +def _resolve_special_options(data: Dict[str, Any]): + # Handle range values & string-to-value conversions + for option in data: + option_value = data[option] + new_value = _resolve_special_option(option, option_value) + data[option] = new_value + + # Special case for canvas layouts determining their own size + if "type" in data and data["type"] == Canvas.__name__: + canvas: List[str] = data["canvas"] + longest_line = max(len(line) for line in canvas) + data["size"] = len(canvas) * longest_line + data["width"] = longest_line + + +def _resolve_special_option(option: str, option_value: Any) -> Any: + # Option values can be string representations of values + if option in STR_OPTION_VALUES: + return _resolve_string_option(option, option_value) + + if option == "mission_pool": + return _resolve_mission_pool(option_value) + + if option == "entry_rules": + rules = [_resolve_entry_rule(subrule) for subrule in option_value] + return rules + + if option == "display_name": + # Make sure all the values are strings + if type(option_value) == list: + names = [str(value) for value in option_value] + return names + elif option_value == "null": + # "null" means no custom display name + return [] + else: + return [str(option_value)] + + if option in ["index", "next"]: + # All index values could be ranges + if type(option_value) == list: + # Flatten any nested lists + indices = [idx for val in [idx if type(idx) == list else [idx] for idx in option_value] for idx in val] + indices = [_resolve_potential_range(index) for index in indices] + indices = [idx if type(idx) == int else str(idx) for idx in indices] + return indices + else: + idx = _resolve_potential_range(option_value) + return [idx if type(idx) == int else str(idx)] + + # Option values can be ranges + return _resolve_potential_range(option_value) + + +def _resolve_string_option_single(option: str, option_value: str) -> Any: + formatted_value = option_value.lower().replace("_", " ") + if formatted_value not in STR_OPTION_VALUES[option]: + raise ValueError( + f"Option \"{option}\" received unknown value \"{option_value}\".\n" + f"Allowed values are: {list(STR_OPTION_VALUES[option].keys())}" + ) + return STR_OPTION_VALUES[option][formatted_value] + + +def _resolve_string_option(option: str, option_value: Union[List[str], str]) -> Any: + if type(option_value) == list: + return [_resolve_string_option_single(option, val) for val in option_value] + else: + return _resolve_string_option_single(option, option_value) + + +def _resolve_entry_rule(option_value: Dict[str, Any]) -> Dict[str, Any]: + resolved: Dict[str, Any] = {} + mutually_exclusive: List[str] = [] + if "amount" in option_value: + resolved["amount"] = _resolve_potential_range(option_value["amount"]) + if "scope" in option_value: + mutually_exclusive.append("scope") + # A scope may be a list or a single address + if type(option_value["scope"]) == list: + resolved["scope"] = [str(subscope) for subscope in option_value["scope"]] + else: + resolved["scope"] = [str(option_value["scope"])] + if "rules" in option_value: + mutually_exclusive.append("rules") + resolved["rules"] = [_resolve_entry_rule(subrule) for subrule in option_value["rules"]] + # Make sure sub-rule rules have a specified amount + if "amount" not in option_value: + resolved["amount"] = -1 + if "items" in option_value: + mutually_exclusive.append("items") + option_items: Dict[str, Any] = option_value["items"] + resolved_items = {item: int(_resolve_potential_range(str(amount))) for (item, amount) in option_items.items()} + resolved_items = _resolve_item_names(resolved_items) + resolved["items"] = {} + for item in resolved_items: + if item not in item_table: + if item.casefold() == GENERIC_KEY_NAME or item.casefold().startswith(GENERIC_PROGRESSIVE_KEY_NAME): + resolved["items"][item] = max(0, resolved_items[item]) + continue + raise ValueError(f"Item rule contains \"{item}\", which is not a valid item name.") + amount = max(0, resolved_items[item]) + quantity = item_table[item].quantity + if amount == 0: + final_amount = quantity + elif quantity == 0: + final_amount = amount + else: + final_amount = amount + resolved["items"][item] = final_amount + if len(mutually_exclusive) > 1: + raise ValueError( + "Entry rule contains too many identifiers.\n" + f"Rule: {option_value}\n" + f"Remove all but one of these entries: {mutually_exclusive}" + ) + return resolved + + +def _resolve_potential_range(option_value: Union[Any, str]) -> Union[Any, int]: + # An option value may be a range + if type(option_value) == str and option_value.startswith("random-range-"): + resolved = _custom_range(option_value) + return resolved + else: + # As this is a catch-all function, + # assume non-range option values are handled elsewhere + # or intended to fall through + return option_value + + +def _resolve_mission_pool(option_value: Union[str, List[str]]) -> Set[int]: + if type(option_value) == str: + pool = _get_target_missions(option_value) + else: + pool: Set[int] = set() + for line in option_value: + if line.startswith("~"): + if len(pool) == 0: + raise ValueError(f"Mission Pool term {line} tried to remove missions from an empty pool.") + term = line[1:].strip() + missions = _get_target_missions(term) + pool.difference_update(missions) + elif line.startswith("^"): + if len(pool) == 0: + raise ValueError(f"Mission Pool term {line} tried to remove missions from an empty pool.") + term = line[1:].strip() + missions = _get_target_missions(term) + pool.intersection_update(missions) + else: + if line.startswith("+"): + term = line[1:].strip() + else: + term = line.strip() + missions = _get_target_missions(term) + pool.update(missions) + if len(pool) == 0: + raise ValueError(f"Mission pool evaluated to zero missions: {option_value}") + return pool + + +def _get_target_missions(term: str) -> Set[int]: + if term in lookup_name_to_mission: + return {lookup_name_to_mission[term].id} + else: + groups = [mission_groups[group] for group in mission_groups if group.casefold() == term.casefold()] + if len(groups) > 0: + return {lookup_name_to_mission[mission].id for mission in groups[0]} + else: + raise ValueError(f"Mission pool term \"{term}\" did not resolve to any specific mission or mission group.") + + +# Class-agnostic version of AP Options.Range.custom_range +def _custom_range(text: str) -> int: + textsplit = text.split("-") + try: + random_range = [int(textsplit[len(textsplit) - 2]), int(textsplit[len(textsplit) - 1])] + except ValueError: + raise ValueError(f"Invalid random range {text} for option {CustomMissionOrder.__name__}") + random_range.sort() + if text.startswith("random-range-low"): + return _triangular(random_range[0], random_range[1], random_range[0]) + elif text.startswith("random-range-middle"): + return _triangular(random_range[0], random_range[1]) + elif text.startswith("random-range-high"): + return _triangular(random_range[0], random_range[1], random_range[1]) + else: + return random.randint(random_range[0], random_range[1]) + + +def _triangular(lower: int, end: int, tri: typing.Optional[int] = None) -> int: + return int(round(random.triangular(lower, end, tri), 0)) + + +# Version of options.Sc2ItemDict.verify without World +def _resolve_item_names(value: Dict[str, int]) -> Dict[str, int]: + new_value: dict[str, int] = {} + case_insensitive_group_mapping = { + group_name.casefold(): group_value for group_name, group_value in item_name_groups.items() + } + case_insensitive_group_mapping.update({item.casefold(): {item} for item in item_table}) + for group_name in value: + item_names = case_insensitive_group_mapping.get(group_name.casefold(), {group_name}) + for item_name in item_names: + new_value[item_name] = new_value.get(item_name, 0) + value[group_name] + return new_value + \ No newline at end of file diff --git a/worlds/sc2/mission_order/presets_scripted.py b/worlds/sc2/mission_order/presets_scripted.py new file mode 100644 index 0000000000..010c7785a6 --- /dev/null +++ b/worlds/sc2/mission_order/presets_scripted.py @@ -0,0 +1,164 @@ +from typing import Dict, Any, List +import copy + +def _required_option(option: str, options: Dict[str, Any]) -> Any: + """Returns the option value, or raises an error if the option is not present.""" + if option not in options: + raise KeyError(f"Campaign preset is missing required option \"{option}\".") + return options.pop(option) + +def _validate_option(option: str, options: Dict[str, str], default: str, valid_values: List[str]) -> str: + """Returns the option value if it is present and valid, the default if it is not present, or raises an error if it is present but not valid.""" + result = options.pop(option, default) + if result not in valid_values: + raise ValueError(f"Preset option \"{option}\" received unknown value \"{result}\".") + return result + +def make_golden_path(options: Dict[str, Any]) -> Dict[str, Any]: + chain_name_options = ['Mar Sara', 'Agria', 'Redstone', 'Meinhoff', 'Haven', 'Tarsonis', 'Valhalla', 'Char', + 'Umoja', 'Kaldir', 'Zerus', 'Skygeirr Station', 'Dominion Space', 'Korhal', + 'Aiur', 'Glacius', 'Shakuras', 'Ulnar', 'Slayn', + 'Antiga', 'Braxis', 'Chau Sara', 'Moria', 'Tyrador', 'Xil', 'Zhakul', + 'Azeroth', 'Crouton', 'Draenor', 'Sanctuary'] + + size = max(_required_option("size", options), 4) + keys_option_values = ["none", "layouts", "missions", "progressive_layouts", "progressive_missions", "progressive_per_layout"] + keys_option = _validate_option("keys", options, "none", keys_option_values) + min_chains = 2 + max_chains = 6 + two_start_positions = options.pop("two_start_positions", False) + # Compensating for empty mission at start + if two_start_positions: + size += 1 + + class Campaign: + def __init__(self, missions_remaining: int): + self.chain_lengths = [1] + self.chain_padding = [0] + self.required_missions = [0] + self.padding = 0 + self.missions_remaining = missions_remaining + self.mission_counter = 1 + + def add_mission(self, chain: int, required_missions: int = 0, *, is_final: bool = False): + if self.missions_remaining == 0 and not is_final: + return + + self.mission_counter += 1 + self.chain_lengths[chain] += 1 + self.missions_remaining -= 1 + + if chain == 0: + self.padding += 1 + self.required_missions.append(required_missions) + + def add_chain(self): + self.chain_lengths.append(0) + self.chain_padding.append(self.padding) + + campaign = Campaign(size - 2) + current_required_missions = 0 + main_chain_length = 0 + while campaign.missions_remaining > 0: + main_chain_length += 1 + if main_chain_length % 2 == 1: # Adding branches + chains_to_make = 0 if len(campaign.chain_lengths) >= max_chains else min_chains if main_chain_length == 1 else 1 + for _ in range(chains_to_make): + campaign.add_chain() + # Updating branches + for side_chain in range(len(campaign.chain_lengths) - 1, 0, -1): + campaign.add_mission(side_chain) + # Adding main path mission + current_required_missions = (campaign.mission_counter * 3) // 4 + if two_start_positions: + # Compensating for skipped mission at start + current_required_missions -= 1 + campaign.add_mission(0, current_required_missions) + campaign.add_mission(0, current_required_missions, is_final = True) + + # Create mission order preset out of campaign + layout_base = { + "type": "column", + "display_name": chain_name_options, + "unique_name": True, + "missions": [], + } + # Optionally add key requirement to layouts + if keys_option == "layouts": + layout_base["entry_rules"] = [{ "items": { "Key": 1 }}] + elif keys_option == "progressive_layouts": + layout_base["entry_rules"] = [{ "items": { "Progressive Key": 0 }}] + preset = { + str(chain): copy.deepcopy(layout_base) for chain in range(len(campaign.chain_lengths)) + } + preset["0"]["exit"] = True + if not two_start_positions: + preset["0"].pop("entry_rules", []) + for chain in range(len(campaign.chain_lengths)): + length = campaign.chain_lengths[chain] + padding = campaign.chain_padding[chain] + preset[str(chain)]["size"] = padding + length + # Add padding to chain + if padding > 0: + preset[str(chain)]["missions"].append({ + "index": [pad for pad in range(padding)], + "empty": True + }) + + if chain == 0: + if two_start_positions: + preset["0"]["missions"].append({ + "index": 0, + "empty": True + }) + # Main path gets number requirements + for mission in range(1, len(campaign.required_missions)): + preset["0"]["missions"].append({ + "index": mission, + "entry_rules": [{ + "scope": "../..", + "amount": campaign.required_missions[mission] + }] + }) + # Optionally add key requirements except to the starter mission + if keys_option == "missions": + for slot in preset["0"]["missions"]: + if "entry_rules" in slot: + slot["entry_rules"].append({ "items": { "Key": 1 }}) + elif keys_option == "progressive_missions": + for slot in preset["0"]["missions"]: + if "entry_rules" in slot: + slot["entry_rules"].append({ "items": { "Progressive Key": 1 }}) + # No main chain keys for progressive_per_layout keys + else: + # Other paths get main path requirements + if two_start_positions and chain < 3: + preset[str(chain)].pop("entry_rules", []) + for mission in range(length): + target = padding + mission + if two_start_positions and mission == 0 and chain < 3: + preset[str(chain)]["missions"].append({ + "index": target, + "entrance": True + }) + else: + preset[str(chain)]["missions"].append({ + "index": target, + "entry_rules": [{ + "scope": f"../../0/{target}" + }] + }) + # Optionally add key requirements + if keys_option == "missions": + for slot in preset[str(chain)]["missions"]: + if "entry_rules" in slot: + slot["entry_rules"].append({ "items": { "Key": 1 }}) + elif keys_option == "progressive_missions": + for slot in preset[str(chain)]["missions"]: + if "entry_rules" in slot: + slot["entry_rules"].append({ "items": { "Progressive Key": 1 }}) + elif keys_option == "progressive_per_layout": + for slot in preset[str(chain)]["missions"]: + if "entry_rules" in slot: + slot["entry_rules"].append({ "items": { "Progressive Key": 0 }}) + return preset diff --git a/worlds/sc2/mission_order/presets_static.py b/worlds/sc2/mission_order/presets_static.py new file mode 100644 index 0000000000..b52e5f1359 --- /dev/null +++ b/worlds/sc2/mission_order/presets_static.py @@ -0,0 +1,916 @@ +from typing import Dict, Any, Callable, List, Tuple +import copy + +from ..mission_groups import MissionGroupNames +from ..mission_tables import SC2Mission, SC2Campaign + +preset_mini_wol_with_prophecy = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.WOL_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Mar Sara": { + "size": 1 + }, + "Colonist": { + "size": 2, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Artifact": { + "size": 3, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 1, "entry_rules": [{ "scope": "../..", "amount": 4 }, { "items": { "Key": 1 }}] }, + { "index": 2, "entry_rules": [{ "scope": "../..", "amount": 8 }, { "items": { "Key": 1 }}] } + ] + }, + "Prophecy": { + "size": 2, + "entry_rules": [ + { "scope": "../Artifact/1" }, + { "items": { "Key": 1 }} + ], + "mission_pool": [ + MissionGroupNames.PROPHECY_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Covert": { + "size": 2, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "scope": "..", "amount": 2 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Rebellion": { + "size": 2, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "scope": "..", "amount": 3 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Char": { + "size": 3, + "entry_rules": [ + { "scope": "../Artifact" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "next": [2] }, + { "index": 1, "entrance": True } + ] + } +} + +preset_mini_wol = copy.deepcopy(preset_mini_wol_with_prophecy) +preset_mini_prophecy = { "Prophecy": preset_mini_wol.pop("Prophecy") } +preset_mini_prophecy["Prophecy"].pop("entry_rules") +preset_mini_prophecy["Prophecy"]["type"] = "gauntlet" +preset_mini_prophecy["Prophecy"]["display_name"] = "" +preset_mini_prophecy["Prophecy"]["missions"].append({ "index": "entrances", "entry_rules": [] }) + +preset_mini_hots = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.HOTS_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Umoja": { + "size": 1, + }, + "Kaldir": { + "size": 2, + "entry_rules": [ + { "scope": "../Umoja" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Char": { + "size": 2, + "entry_rules": [ + { "scope": "../Umoja" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Zerus": { + "size": 2, + "entry_rules": [ + { "scope": "../Umoja" }, + { "scope": "..", "amount": 3 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Skygeirr Station": { + "size": 2, + "entry_rules": [ + { "scope": "../Zerus" }, + { "scope": "..", "amount": 5 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Dominion Space": { + "size": 2, + "entry_rules": [ + { "scope": "../Zerus" }, + { "scope": "..", "amount": 5 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Korhal": { + "size": 2, + "entry_rules": [ + { "scope": "../Zerus" }, + { "scope": "..", "amount": 8 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + } +} + +preset_mini_lotv_prologue = { + "min_difficulty": "easy", + "Prologue": { + "display_name": "", + "type": "gauntlet", + "size": 2, + "mission_pool": [ + MissionGroupNames.PROLOGUE_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": 1, "entry_rules": [{ "items": { "Key": 1 }}] } + ] + } +} + +preset_mini_lotv = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.LOTV_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Aiur": { + "size": 2, + "missions": [ + { "index": 1, "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Korhal": { + "size": 1, + "entry_rules": [ + { "scope": "../Aiur" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Shakuras": { + "size": 1, + "entry_rules": [ + { "scope": "../Aiur" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Purifier": { + "size": 2, + "entry_rules": [ + { "scope": "../Korhal" }, + { "scope": "../Shakuras" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 1, "entry_rules": [{ "scope": "../../Ulnar" }, { "items": { "Key": 1 }}] } + ] + }, + "Ulnar": { + "size": 1, + "entry_rules": [ + { "scope": "../Purifier/0" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Tal'darim": { + "size": 1, + "entry_rules": [ + { "scope": "../Ulnar" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Return to Aiur": { + "size": 2, + "entry_rules": [ + { "scope": "../Purifier" }, + { "scope": "../Tal'darim" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + } +} + +preset_mini_lotv_epilogue = { + "min_difficulty": "very hard", + "Epilogue": { + "display_name": "", + "type": "gauntlet", + "size": 2, + "mission_pool": [ + MissionGroupNames.EPILOGUE_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": 1, "entry_rules": [{ "items": { "Key": 1 }}] } + ] + } +} + +preset_mini_nco = { + "min_difficulty": "easy", + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.NCO_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Mission Pack 1": { + "size": 2, + "missions": [ + { "index": 1, "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Mission Pack 2": { + "size": 1, + "entry_rules": [ + { "scope": "../Mission Pack 1" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Mission Pack 3": { + "size": 2, + "entry_rules": [ + { "scope": "../Mission Pack 2" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, +} + +preset_wol_with_prophecy = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.WOL_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Mar Sara": { + "size": 3, + "missions": [ + { "index": 0, "mission_pool": SC2Mission.LIBERATION_DAY.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_OUTLAWS.mission_name }, + { "index": 2, "mission_pool": SC2Mission.ZERO_HOUR.mission_name }, + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] } + ] + }, + "Colonist": { + "size": 4, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": 1, "next": [2, 3] }, + { "index": 2, "next": [] }, + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": [2, 3], "entry_rules": [{ "scope": "../..", "amount": 7 }, { "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.EVACUATION.mission_name }, + { "index": 1, "mission_pool": SC2Mission.OUTBREAK.mission_name }, + { "index": 2, "mission_pool": SC2Mission.SAFE_HAVEN.mission_name }, + { "index": 3, "mission_pool": SC2Mission.HAVENS_FALL.mission_name }, + ] + }, + "Artifact": { + "size": 5, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 1, "entry_rules": [{ "scope": "../..", "amount": 8 }, { "items": { "Key": 1 }}] }, + { "index": 2, "entry_rules": [{ "scope": "../..", "amount": 11 }, { "items": { "Key": 1 }}] }, + { "index": 3, "entry_rules": [{ "scope": "../..", "amount": 14 }, { "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.SMASH_AND_GRAB.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_DIG.mission_name }, + { "index": 2, "mission_pool": SC2Mission.THE_MOEBIUS_FACTOR.mission_name }, + { "index": 3, "mission_pool": SC2Mission.SUPERNOVA.mission_name }, + { "index": 4, "mission_pool": SC2Mission.MAW_OF_THE_VOID.mission_name }, + ] + }, + "Prophecy": { + "size": 4, + "entry_rules": [ + { "scope": "../Artifact/1" }, + { "items": { "Key": 1 }} + ], + "mission_pool": [ + MissionGroupNames.PROPHECY_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.WHISPERS_OF_DOOM.mission_name }, + { "index": 1, "mission_pool": SC2Mission.A_SINISTER_TURN.mission_name }, + { "index": 2, "mission_pool": SC2Mission.ECHOES_OF_THE_FUTURE.mission_name }, + { "index": 3, "mission_pool": SC2Mission.IN_UTTER_DARKNESS.mission_name }, + ] + }, + "Covert": { + "size": 4, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "scope": "..", "amount": 4 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": 1, "next": [2, 3] }, + { "index": 2, "next": [] }, + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": [2, 3], "entry_rules": [{ "scope": "../..", "amount": 8 }, { "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.DEVILS_PLAYGROUND.mission_name }, + { "index": 1, "mission_pool": SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.BREAKOUT.mission_name }, + { "index": 3, "mission_pool": SC2Mission.GHOST_OF_A_CHANCE.mission_name }, + ] + }, + "Rebellion": { + "size": 5, + "entry_rules": [ + { "scope": "../Mar Sara" }, + { "scope": "..", "amount": 6 }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.THE_GREAT_TRAIN_ROBBERY.mission_name }, + { "index": 1, "mission_pool": SC2Mission.CUTTHROAT.mission_name }, + { "index": 2, "mission_pool": SC2Mission.ENGINE_OF_DESTRUCTION.mission_name }, + { "index": 3, "mission_pool": SC2Mission.MEDIA_BLITZ.mission_name }, + { "index": 4, "mission_pool": SC2Mission.PIERCING_OF_THE_SHROUD.mission_name }, + ] + }, + "Char": { + "size": 4, + "entry_rules": [ + { "scope": "../Artifact" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": 0, "next": [1, 2] }, + { "index": [1, 2], "next": [3] }, + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.GATES_OF_HELL.mission_name }, + { "index": 1, "mission_pool": SC2Mission.BELLY_OF_THE_BEAST.mission_name }, + { "index": 2, "mission_pool": SC2Mission.SHATTER_THE_SKY.mission_name }, + { "index": 3, "mission_pool": SC2Mission.ALL_IN.mission_name }, + ] + } +} + +preset_wol = copy.deepcopy(preset_wol_with_prophecy) +preset_prophecy = { "Prophecy": preset_wol.pop("Prophecy") } +preset_prophecy["Prophecy"].pop("entry_rules") +preset_prophecy["Prophecy"]["type"] = "gauntlet" +preset_prophecy["Prophecy"]["display_name"] = "" +preset_prophecy["Prophecy"]["missions"].append({ "index": "entrances", "entry_rules": [] }) + +preset_hots = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.HOTS_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Umoja": { + "size": 3, + "missions": [ + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.LAB_RAT.mission_name }, + { "index": 1, "mission_pool": SC2Mission.BACK_IN_THE_SADDLE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.RENDEZVOUS.mission_name }, + ] + }, + "Kaldir": { + "size": 3, + "entry_rules": [ + { "scope": "../Umoja" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.HARVEST_OF_SCREAMS.mission_name }, + { "index": 1, "mission_pool": SC2Mission.SHOOT_THE_MESSENGER.mission_name }, + { "index": 2, "mission_pool": SC2Mission.ENEMY_WITHIN.mission_name }, + ] + }, + "Char": { + "size": 3, + "entry_rules": [ + { "scope": "../Umoja" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.DOMINATION.mission_name }, + { "index": 1, "mission_pool": SC2Mission.FIRE_IN_THE_SKY.mission_name }, + { "index": 2, "mission_pool": SC2Mission.OLD_SOLDIERS.mission_name }, + ] + }, + "Zerus": { + "size": 3, + "entry_rules": [ + { + "rules": [ + { "scope": "../Kaldir" }, + { "scope": "../Char" } + ], + "amount": 1 + }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.WAKING_THE_ANCIENT.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_CRUCIBLE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.SUPREME.mission_name }, + ] + }, + "Skygeirr Station": { + "size": 3, + "entry_rules": [ + { "scope": ["../Kaldir", "../Char", "../Zerus"] }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.INFESTED.mission_name }, + { "index": 1, "mission_pool": SC2Mission.HAND_OF_DARKNESS.mission_name }, + { "index": 2, "mission_pool": SC2Mission.PHANTOMS_OF_THE_VOID.mission_name }, + ] + }, + "Dominion Space": { + "size": 2, + "entry_rules": [ + { "scope": ["../Kaldir", "../Char", "../Zerus"] }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.WITH_FRIENDS_LIKE_THESE.mission_name }, + { "index": 1, "mission_pool": SC2Mission.CONVICTION.mission_name }, + ] + }, + "Korhal": { + "size": 3, + "entry_rules": [ + { "scope": ["../Skygeirr Station", "../Dominion Space"] }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.PLANETFALL.mission_name }, + { "index": 1, "mission_pool": SC2Mission.DEATH_FROM_ABOVE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.THE_RECKONING.mission_name }, + ] + } +} + +preset_lotv_prologue = { + "min_difficulty": "easy", + "Prologue": { + "display_name": "", + "type": "gauntlet", + "size": 3, + "mission_pool": [ + MissionGroupNames.PROLOGUE_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.DARK_WHISPERS.mission_name }, + { "index": 1, "mission_pool": SC2Mission.GHOSTS_IN_THE_FOG.mission_name }, + { "index": 2, "mission_pool": SC2Mission.EVIL_AWOKEN.mission_name }, + ] + } +} + +preset_lotv = { + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.LOTV_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Aiur": { + "size": 3, + "missions": [ + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.FOR_AIUR.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_GROWING_SHADOW.mission_name }, + { "index": 2, "mission_pool": SC2Mission.THE_SPEAR_OF_ADUN.mission_name }, + ] + }, + "Korhal": { + "size": 2, + "entry_rules": [ + { "scope": "../Aiur" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.SKY_SHIELD.mission_name }, + { "index": 1, "mission_pool": SC2Mission.BROTHERS_IN_ARMS.mission_name }, + ] + }, + "Shakuras": { + "size": 2, + "entry_rules": [ + { "scope": "../Aiur" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.AMON_S_REACH.mission_name }, + { "index": 1, "mission_pool": SC2Mission.LAST_STAND.mission_name }, + ] + }, + "Purifier": { + "size": 3, + "entry_rules": [ + { + "rules": [ + { "scope": "../Korhal" }, + { "scope": "../Shakuras" } + ], + "amount": 1 + }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 1, "entry_rules": [{ "scope": "../../Ulnar" }, { "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.FORBIDDEN_WEAPON.mission_name }, + { "index": 1, "mission_pool": SC2Mission.UNSEALING_THE_PAST.mission_name }, + { "index": 2, "mission_pool": SC2Mission.PURIFICATION.mission_name }, + ] + }, + "Ulnar": { + "size": 3, + "entry_rules": [ + { + "scope": [ + "../Korhal", + "../Shakuras", + "../Purifier/0" + ] + }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.TEMPLE_OF_UNIFICATION.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_INFINITE_CYCLE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.HARBINGER_OF_OBLIVION.mission_name }, + ] + }, + "Tal'darim": { + "size": 2, + "entry_rules": [ + { "scope": "../Ulnar" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.STEPS_OF_THE_RITE.mission_name }, + { "index": 1, "mission_pool": SC2Mission.RAK_SHIR.mission_name }, + ] + }, + "Moebius": { + "size": 1, + "entry_rules": [ + { + "rules": [ + { "scope": "../Purifier" }, + { "scope": "../Tal'darim" } + ], + "amount": 1 + }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.TEMPLAR_S_CHARGE.mission_name }, + ] + }, + "Return to Aiur": { + "size": 3, + "entry_rules": [ + { "scope": "../Purifier" }, + { "scope": "../Tal'darim" }, + { "scope": "../Moebius" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.TEMPLAR_S_RETURN.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_HOST.mission_name }, + { "index": 2, "mission_pool": SC2Mission.SALVATION.mission_name }, + ] + } +} + +preset_lotv_epilogue = { + "min_difficulty": "very hard", + "Epilogue": { + "display_name": "", + "type": "gauntlet", + "size": 3, + "mission_pool": [ + MissionGroupNames.EPILOGUE_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ], + "missions": [ + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.INTO_THE_VOID.mission_name }, + { "index": 1, "mission_pool": SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name }, + { "index": 2, "mission_pool": SC2Mission.AMON_S_FALL.mission_name }, + ] + } +} + +preset_nco = { + "min_difficulty": "easy", + "global": { + "type": "column", + "mission_pool": [ + MissionGroupNames.NCO_MISSIONS, + "~ " + MissionGroupNames.RACESWAP_MISSIONS + ] + }, + "Mission Pack 1": { + "size": 3, + "missions": [ + { "index": [1, 2], "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.THE_ESCAPE.mission_name }, + { "index": 1, "mission_pool": SC2Mission.SUDDEN_STRIKE.mission_name }, + { "index": 2, "mission_pool": SC2Mission.ENEMY_INTELLIGENCE.mission_name }, + ] + }, + "Mission Pack 2": { + "size": 3, + "entry_rules": [ + { "scope": "../Mission Pack 1" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.TROUBLE_IN_PARADISE.mission_name }, + { "index": 1, "mission_pool": SC2Mission.NIGHT_TERRORS.mission_name }, + { "index": 2, "mission_pool": SC2Mission.FLASHPOINT.mission_name }, + ] + }, + "Mission Pack 3": { + "size": 3, + "entry_rules": [ + { "scope": "../Mission Pack 2" }, + { "items": { "Key": 1 }} + ], + "missions": [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": 0, "mission_pool": SC2Mission.IN_THE_ENEMY_S_SHADOW.mission_name }, + { "index": 1, "mission_pool": SC2Mission.DARK_SKIES.mission_name }, + { "index": 2, "mission_pool": SC2Mission.END_GAME.mission_name }, + ] + }, +} + +def _build_static_preset(preset: Dict[str, Any], options: Dict[str, Any]) -> Dict[str, Any]: + # Raceswap shuffling + raceswaps = options.pop("shuffle_raceswaps", False) + if not isinstance(raceswaps, bool): + raise ValueError( + f"Preset option \"shuffle_raceswaps\" received unknown value \"{raceswaps}\".\n" + "Valid values are: true, false" + ) + elif raceswaps == True: + # Remove "~ Raceswap Missions" operation from mission pool options + # Also add raceswap variants to plando'd vanilla missions + for layout in preset.values(): + if type(layout) == dict: + # Currently mission pools in layouts are always ["X campaign missions", "~ raceswap missions"] + layout_mission_pool: List[str] = layout.get("mission_pool", None) + if layout_mission_pool is not None: + layout_mission_pool.pop() + layout["mission_pool"] = layout_mission_pool + if "missions" in layout: + for slot in layout["missions"]: + # Currently mission pools in slots are always strings + slot_mission_pool: str = slot.get("mission_pool", None) + # Identify raceswappable missions by their race in brackets + if slot_mission_pool is not None and slot_mission_pool[-1] == ")": + mission_name = slot_mission_pool[:slot_mission_pool.rfind("(")] + new_mission_pool = [f"{mission_name}({race})" for race in ["Terran", "Zerg", "Protoss"]] + slot["mission_pool"] = new_mission_pool + # The presets are set up for no raceswaps, so raceswaps == False doesn't need to be covered + + # Mission pool selection + missions = options.pop("missions", "random") + if missions == "vanilla": + pass # use preset as it is + elif missions == "vanilla_shuffled": + # remove pre-set missions + for layout in preset.values(): + if type(layout) == dict and "missions" in layout: + for slot in layout["missions"]: + slot.pop("mission_pool", ()) + elif missions == "random": + # remove pre-set missions and mission pools + for layout in preset.values(): + if type(layout) == dict: + layout.pop("mission_pool", ()) + if "missions" in layout: + for slot in layout["missions"]: + slot.pop("mission_pool", ()) + else: + raise ValueError( + f"Preset option \"missions\" received unknown value \"{missions}\".\n" + "Valid values are: random, vanilla, vanilla_shuffled" + ) + + # Key rule selection + keys = options.pop("keys", "none") + if keys == "layouts": + # remove keys from mission entry rules + for layout in preset.values(): + if type(layout) == dict and "missions" in layout: + for slot in layout["missions"]: + if "entry_rules" in slot: + slot["entry_rules"] = _remove_key_rules(slot["entry_rules"]) + elif keys == "missions": + # remove keys from layout entry rules + for layout in preset.values(): + if type(layout) == dict and "entry_rules" in layout: + layout["entry_rules"] = _remove_key_rules(layout["entry_rules"]) + elif keys == "progressive_layouts": + # remove keys from mission entry rules, replace keys in layout entry rules with unique-track keys + for layout in preset.values(): + if type(layout) == dict: + if "entry_rules" in layout: + layout["entry_rules"] = _make_key_rules_progressive(layout["entry_rules"], 0) + if "missions" in layout: + for slot in layout["missions"]: + if "entry_rules" in slot: + slot["entry_rules"] = _remove_key_rules(slot["entry_rules"]) + elif keys == "progressive_missions": + # remove keys from layout entry rules, replace keys in mission entry rules + for layout in preset.values(): + if type(layout) == dict: + if "entry_rules" in layout: + layout["entry_rules"] = _remove_key_rules(layout["entry_rules"]) + if "missions" in layout: + for slot in layout["missions"]: + if "entry_rules" in slot: + slot["entry_rules"] = _make_key_rules_progressive(slot["entry_rules"], 1) + elif keys == "progressive_per_layout": + # remove keys from layout entry rules, replace keys in mission entry rules with unique-track keys + # specifically ignore layouts that have no entry rules (and are thus the first of their campaign) + for layout in preset.values(): + if type(layout) == dict and "entry_rules" in layout: + layout["entry_rules"] = _remove_key_rules(layout["entry_rules"]) + if "missions" in layout: + for slot in layout["missions"]: + if "entry_rules" in slot: + slot["entry_rules"] = _make_key_rules_progressive(slot["entry_rules"], 0) + elif keys == "none": + # remove keys from both layout and mission entry rules + for layout in preset.values(): + if type(layout) == dict: + if "entry_rules" in layout: + layout["entry_rules"] = _remove_key_rules(layout["entry_rules"]) + if "missions" in layout: + for slot in layout["missions"]: + if "entry_rules" in slot: + slot["entry_rules"] = _remove_key_rules(slot["entry_rules"]) + else: + raise ValueError( + f"Preset option \"keys\" received unknown value \"{keys}\".\n" + "Valid values are: none, missions, layouts, progressive_missions, progressive_layouts, progressive_per_layout" + ) + + return preset + +def _remove_key_rules(entry_rules: List[Dict[str, Any]]) -> List[Dict[str, Any]]: + return [rule for rule in entry_rules if not ("items" in rule and "Key" in rule["items"])] + +def _make_key_rules_progressive(entry_rules: List[Dict[str, Any]], track: int) -> List[Dict[str, Any]]: + for rule in entry_rules: + if "items" in rule and "Key" in rule["items"]: + new_items: Dict[str, Any] = {} + for (item, amount) in rule["items"].items(): + if item == "Key": + new_items["Progressive Key"] = track + else: + new_items[item] = amount + rule["items"] = new_items + return entry_rules + +def static_preset(preset: Dict[str, Any]) -> Callable[[Dict[str, Any]], Dict[str, Any]]: + return lambda options: _build_static_preset(copy.deepcopy(preset), options) + +def get_used_layout_names() -> Dict[SC2Campaign, Tuple[int, List[str]]]: + campaign_to_preset: Dict[SC2Campaign, Dict[str, Any]] = { + SC2Campaign.WOL: preset_wol_with_prophecy, + SC2Campaign.PROPHECY: preset_prophecy, + SC2Campaign.HOTS: preset_hots, + SC2Campaign.PROLOGUE: preset_lotv_prologue, + SC2Campaign.LOTV: preset_lotv, + SC2Campaign.EPILOGUE: preset_lotv_epilogue, + SC2Campaign.NCO: preset_nco + } + campaign_to_layout_names: Dict[SC2Campaign, Tuple[int, List[str]]] = { SC2Campaign.GLOBAL: (0, []) } + for campaign in SC2Campaign: + if campaign == SC2Campaign.GLOBAL: + continue + previous_campaign = [prev for prev in SC2Campaign if prev.id == campaign.id - 1][0] + previous_size = campaign_to_layout_names[previous_campaign][0] + preset = campaign_to_preset[campaign] + new_layouts = [value for value in preset.keys() if isinstance(preset[value], dict) and value != "global"] + campaign_to_layout_names[campaign] = (previous_size + len(campaign_to_layout_names[previous_campaign][1]), new_layouts) + campaign_to_layout_names.pop(SC2Campaign.GLOBAL) + return campaign_to_layout_names diff --git a/worlds/sc2/mission_order/slot_data.py b/worlds/sc2/mission_order/slot_data.py new file mode 100644 index 0000000000..44d4f40567 --- /dev/null +++ b/worlds/sc2/mission_order/slot_data.py @@ -0,0 +1,53 @@ +""" +Houses the data structures representing a mission order in slot data. +Creating these is handled by the nodes they represent in .nodes.py. +""" + +from __future__ import annotations +from typing import List, Protocol +from dataclasses import dataclass + +from .entry_rules import SubRuleRuleData + +class MissionOrderObjectSlotData(Protocol): + entry_rule: SubRuleRuleData + + +@dataclass +class CampaignSlotData: + name: str + entry_rule: SubRuleRuleData + exits: List[int] + layouts: List[LayoutSlotData] + + @staticmethod + def legacy(name: str, layouts: List[LayoutSlotData]) -> CampaignSlotData: + return CampaignSlotData(name, SubRuleRuleData.empty(), [], layouts) + + +@dataclass +class LayoutSlotData: + name: str + entry_rule: SubRuleRuleData + exits: List[int] + missions: List[List[MissionSlotData]] + + @staticmethod + def legacy(name: str, missions: List[List[MissionSlotData]]) -> LayoutSlotData: + return LayoutSlotData(name, SubRuleRuleData.empty(), [], missions) + + +@dataclass +class MissionSlotData: + mission_id: int + prev_mission_ids: List[int] + entry_rule: SubRuleRuleData + victory_cache_size: int = 0 + + @staticmethod + def empty() -> MissionSlotData: + return MissionSlotData(-1, [], SubRuleRuleData.empty()) + + @staticmethod + def legacy(mission_id: int, prev_mission_ids: List[int], entry_rule: SubRuleRuleData) -> MissionSlotData: + return MissionSlotData(mission_id, prev_mission_ids, entry_rule) diff --git a/worlds/sc2/mission_tables.py b/worlds/sc2/mission_tables.py new file mode 100644 index 0000000000..3dfe50ff2b --- /dev/null +++ b/worlds/sc2/mission_tables.py @@ -0,0 +1,577 @@ +from typing import NamedTuple, Dict, List, Set, Union, Literal, Iterable, Optional +from enum import IntEnum, Enum, IntFlag, auto + + +class SC2Race(IntEnum): + ANY = 0 + TERRAN = 1 + ZERG = 2 + PROTOSS = 3 + + def get_title(self): + return self.name.lower().capitalize() + + def get_mission_flag(self): + return MissionFlag.__getitem__(self.get_title()) + +class MissionPools(IntEnum): + STARTER = 0 + EASY = 1 + MEDIUM = 2 + HARD = 3 + VERY_HARD = 4 + FINAL = 5 + + +class MissionFlag(IntFlag): + none = 0 + Terran = auto() + Zerg = auto() + Protoss = auto() + NoBuild = auto() + Defense = auto() + AutoScroller = auto() # The mission is won by waiting out a timer or victory is gated behind a timer + Countdown = auto() # Overall, the mission must be beaten before a loss timer counts down + Kerrigan = auto() # The player controls Kerrigan in the mission + VanillaSoa = auto() # The player controls the Spear of Adun in the vanilla version of the mission + Nova = auto() # The player controls NCO Nova in the mission + AiTerranAlly = auto() # The mission has a Terran AI ally that can be taken over + AiZergAlly = auto() # The mission has a Zerg AI ally that can be taken over + AiProtossAlly = auto() # The mission has a Protoss AI ally that can be taken over + VsTerran = auto() + VsZerg = auto() + VsProtoss = auto() + HasRaceSwap = auto() # The mission has variants that use different factions from the vanilla experience. + RaceSwap = auto() # The mission uses different factions from the vanilla experience. + WoLNova = auto() # The player controls WoL Nova in the mission + + AiAlly = AiTerranAlly|AiZergAlly|AiProtossAlly + TimedDefense = AutoScroller|Defense + VsTZ = VsTerran|VsZerg + VsTP = VsTerran|VsProtoss + VsPZ = VsProtoss|VsZerg + VsAll = VsTerran|VsProtoss|VsZerg + + +class SC2CampaignGoalPriority(IntEnum): + """ + Campaign's priority to goal election + """ + NONE = 0 + MINI_CAMPAIGN = 1 # A goal shouldn't be in a mini-campaign if there's at least one 'big' campaign + HARD = 2 # A campaign ending with a hard mission + VERY_HARD = 3 # A campaign ending with a very hard mission + EPILOGUE = 4 # Epilogue shall be always preferred as the goal if present + + +class SC2Campaign(Enum): + + def __new__(cls, *args, **kwargs): + value = len(cls.__members__) + 1 + obj = object.__new__(cls) + obj._value_ = value + return obj + + def __init__(self, campaign_id: int, name: str, goal_priority: SC2CampaignGoalPriority, race: SC2Race): + self.id = campaign_id + self.campaign_name = name + self.goal_priority = goal_priority + self.race = race + + def __lt__(self, other: "SC2Campaign"): + return self.id < other.id + + GLOBAL = 0, "Global", SC2CampaignGoalPriority.NONE, SC2Race.ANY + WOL = 1, "Wings of Liberty", SC2CampaignGoalPriority.VERY_HARD, SC2Race.TERRAN + PROPHECY = 2, "Prophecy", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS + HOTS = 3, "Heart of the Swarm", SC2CampaignGoalPriority.VERY_HARD, SC2Race.ZERG + PROLOGUE = 4, "Whispers of Oblivion (Legacy of the Void: Prologue)", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS + LOTV = 5, "Legacy of the Void", SC2CampaignGoalPriority.VERY_HARD, SC2Race.PROTOSS + EPILOGUE = 6, "Into the Void (Legacy of the Void: Epilogue)", SC2CampaignGoalPriority.EPILOGUE, SC2Race.ANY + NCO = 7, "Nova Covert Ops", SC2CampaignGoalPriority.HARD, SC2Race.TERRAN + + +class SC2Mission(Enum): + + def __new__(cls, *args, **kwargs): + value = len(cls.__members__) + 1 + obj = object.__new__(cls) + obj._value_ = value + return obj + + def __init__(self, mission_id: int, name: str, campaign: SC2Campaign, area: str, race: SC2Race, pool: MissionPools, map_file: str, flags: MissionFlag): + self.id = mission_id + self.mission_name = name + self.campaign = campaign + self.area = area + self.race = race + self.pool = pool + self.map_file = map_file + self.flags = flags + + def get_short_name(self): + if self.mission_name.find(' (') == -1: + return self.mission_name + else: + return self.mission_name[:self.mission_name.find(' (')] + + # Wings of Liberty + LIBERATION_DAY = 1, "Liberation Day", SC2Campaign.WOL, "Mar Sara", SC2Race.ANY, MissionPools.STARTER, "ap_liberation_day", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsTerran + THE_OUTLAWS = 2, "The Outlaws (Terran)", SC2Campaign.WOL, "Mar Sara", SC2Race.TERRAN, MissionPools.EASY, "ap_the_outlaws", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + ZERO_HOUR = 3, "Zero Hour (Terran)", SC2Campaign.WOL, "Mar Sara", SC2Race.TERRAN, MissionPools.EASY, "ap_zero_hour", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + EVACUATION = 4, "Evacuation (Terran)", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.EASY, "ap_evacuation", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + OUTBREAK = 5, "Outbreak (Terran)", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.EASY, "ap_outbreak", MissionFlag.Terran|MissionFlag.Defense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + SAFE_HAVEN = 6, "Safe Haven (Terran)", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_safe_haven", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + HAVENS_FALL = 7, "Haven's Fall (Terran)", SC2Campaign.WOL, "Colonist", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_havens_fall", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + SMASH_AND_GRAB = 8, "Smash and Grab (Terran)", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.EASY, "ap_smash_and_grab", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsPZ|MissionFlag.HasRaceSwap + THE_DIG = 9, "The Dig (Terran)", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_dig", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + THE_MOEBIUS_FACTOR = 10, "The Moebius Factor (Terran)", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_moebius_factor", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + SUPERNOVA = 11, "Supernova (Terran)", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.HARD, "ap_supernova", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + MAW_OF_THE_VOID = 12, "Maw of the Void (Terran)", SC2Campaign.WOL, "Artifact", SC2Race.TERRAN, MissionPools.HARD, "ap_maw_of_the_void", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + DEVILS_PLAYGROUND = 13, "Devil's Playground (Terran)", SC2Campaign.WOL, "Covert", SC2Race.TERRAN, MissionPools.EASY, "ap_devils_playground", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + WELCOME_TO_THE_JUNGLE = 14, "Welcome to the Jungle (Terran)", SC2Campaign.WOL, "Covert", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_welcome_to_the_jungle", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + BREAKOUT = 15, "Breakout", SC2Campaign.WOL, "Covert", SC2Race.ANY, MissionPools.STARTER, "ap_breakout", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsTerran + GHOST_OF_A_CHANCE = 16, "Ghost of a Chance", SC2Campaign.WOL, "Covert", SC2Race.ANY, MissionPools.STARTER, "ap_ghost_of_a_chance", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsTerran|MissionFlag.WoLNova + THE_GREAT_TRAIN_ROBBERY = 17, "The Great Train Robbery (Terran)", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.EASY, "ap_the_great_train_robbery", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + CUTTHROAT = 18, "Cutthroat (Terran)", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_cutthroat", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + ENGINE_OF_DESTRUCTION = 19, "Engine of Destruction (Terran)", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.HARD, "ap_engine_of_destruction", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + MEDIA_BLITZ = 20, "Media Blitz (Terran)", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_media_blitz", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + PIERCING_OF_THE_SHROUD = 21, "Piercing the Shroud", SC2Campaign.WOL, "Rebellion", SC2Race.TERRAN, MissionPools.STARTER, "ap_piercing_the_shroud", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsAll + GATES_OF_HELL = 26, "Gates of Hell (Terran)", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.HARD, "ap_gates_of_hell", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + BELLY_OF_THE_BEAST = 27, "Belly of the Beast", SC2Campaign.WOL, "Char", SC2Race.ANY, MissionPools.STARTER, "ap_belly_of_the_beast", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsZerg + SHATTER_THE_SKY = 28, "Shatter the Sky (Terran)", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_shatter_the_sky", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + ALL_IN = 29, "All-In (Terran)", SC2Campaign.WOL, "Char", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_all_in", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + + # Prophecy + WHISPERS_OF_DOOM = 22, "Whispers of Doom", SC2Campaign.PROPHECY, "_1", SC2Race.ANY, MissionPools.STARTER, "ap_whispers_of_doom", MissionFlag.Protoss|MissionFlag.NoBuild|MissionFlag.VsZerg + A_SINISTER_TURN = 23, "A Sinister Turn (Protoss)", SC2Campaign.PROPHECY, "_2", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_a_sinister_turn", MissionFlag.Protoss|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + ECHOES_OF_THE_FUTURE = 24, "Echoes of the Future (Protoss)", SC2Campaign.PROPHECY, "_3", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_echoes_of_the_future", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + IN_UTTER_DARKNESS = 25, "In Utter Darkness (Protoss)", SC2Campaign.PROPHECY, "_4", SC2Race.PROTOSS, MissionPools.HARD, "ap_in_utter_darkness", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + + # Heart of the Swarm + LAB_RAT = 30, "Lab Rat (Zerg)", SC2Campaign.HOTS, "Umoja", SC2Race.ZERG, MissionPools.STARTER, "ap_lab_rat", MissionFlag.Zerg|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + BACK_IN_THE_SADDLE = 31, "Back in the Saddle", SC2Campaign.HOTS, "Umoja", SC2Race.ANY, MissionPools.STARTER, "ap_back_in_the_saddle", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.NoBuild|MissionFlag.VsTZ + RENDEZVOUS = 32, "Rendezvous (Zerg)", SC2Campaign.HOTS, "Umoja", SC2Race.ZERG, MissionPools.EASY, "ap_rendezvous", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + HARVEST_OF_SCREAMS = 33, "Harvest of Screams (Zerg)", SC2Campaign.HOTS, "Kaldir", SC2Race.ZERG, MissionPools.EASY, "ap_harvest_of_screams", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + SHOOT_THE_MESSENGER = 34, "Shoot the Messenger (Zerg)", SC2Campaign.HOTS, "Kaldir", SC2Race.ZERG, MissionPools.EASY, "ap_shoot_the_messenger", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.TimedDefense|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + ENEMY_WITHIN = 35, "Enemy Within", SC2Campaign.HOTS, "Kaldir", SC2Race.ANY, MissionPools.EASY, "ap_enemy_within", MissionFlag.Zerg|MissionFlag.NoBuild|MissionFlag.VsProtoss + DOMINATION = 36, "Domination (Zerg)", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.EASY, "ap_domination", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + FIRE_IN_THE_SKY = 37, "Fire in the Sky (Zerg)", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.MEDIUM, "ap_fire_in_the_sky", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + OLD_SOLDIERS = 38, "Old Soldiers (Zerg)", SC2Campaign.HOTS, "Char", SC2Race.ZERG, MissionPools.MEDIUM, "ap_old_soldiers", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + WAKING_THE_ANCIENT = 39, "Waking the Ancient (Zerg)", SC2Campaign.HOTS, "Zerus", SC2Race.ZERG, MissionPools.MEDIUM, "ap_waking_the_ancient", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + THE_CRUCIBLE = 40, "The Crucible (Zerg)", SC2Campaign.HOTS, "Zerus", SC2Race.ZERG, MissionPools.MEDIUM, "ap_the_crucible", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + SUPREME = 41, "Supreme", SC2Campaign.HOTS, "Zerus", SC2Race.ANY, MissionPools.MEDIUM, "ap_supreme", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.NoBuild|MissionFlag.VsZerg + INFESTED = 42, "Infested (Zerg)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.MEDIUM, "ap_infested", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + HAND_OF_DARKNESS = 43, "Hand of Darkness (Zerg)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.HARD, "ap_hand_of_darkness", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + PHANTOMS_OF_THE_VOID = 44, "Phantoms of the Void (Zerg)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.ZERG, MissionPools.MEDIUM, "ap_phantoms_of_the_void", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + WITH_FRIENDS_LIKE_THESE = 45, "With Friends Like These", SC2Campaign.HOTS, "Dominion Space", SC2Race.ANY, MissionPools.STARTER, "ap_with_friends_like_these", MissionFlag.Terran|MissionFlag.NoBuild|MissionFlag.VsTerran + CONVICTION = 46, "Conviction", SC2Campaign.HOTS, "Dominion Space", SC2Race.ANY, MissionPools.MEDIUM, "ap_conviction", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.NoBuild|MissionFlag.VsTerran + PLANETFALL = 47, "Planetfall (Zerg)", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_planetfall", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + DEATH_FROM_ABOVE = 48, "Death From Above (Zerg)", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.HARD, "ap_death_from_above", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + THE_RECKONING = 49, "The Reckoning (Zerg)", SC2Campaign.HOTS, "Korhal", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_the_reckoning", MissionFlag.Zerg|MissionFlag.Kerrigan|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.HasRaceSwap + + # Prologue + DARK_WHISPERS = 50, "Dark Whispers (Protoss)", SC2Campaign.PROLOGUE, "_1", SC2Race.PROTOSS, MissionPools.EASY, "ap_dark_whispers", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsTZ|MissionFlag.HasRaceSwap + GHOSTS_IN_THE_FOG = 51, "Ghosts in the Fog (Protoss)", SC2Campaign.PROLOGUE, "_2", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_ghosts_in_the_fog", MissionFlag.Protoss|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + EVIL_AWOKEN = 52, "Evil Awoken", SC2Campaign.PROLOGUE, "_3", SC2Race.PROTOSS, MissionPools.STARTER, "ap_evil_awoken", MissionFlag.Protoss|MissionFlag.NoBuild|MissionFlag.VsProtoss + + # LotV + FOR_AIUR = 53, "For Aiur!", SC2Campaign.LOTV, "Aiur", SC2Race.ANY, MissionPools.STARTER, "ap_for_aiur", MissionFlag.Protoss|MissionFlag.NoBuild|MissionFlag.VsZerg + THE_GROWING_SHADOW = 54, "The Growing Shadow (Protoss)", SC2Campaign.LOTV, "Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_growing_shadow", MissionFlag.Protoss|MissionFlag.VsPZ|MissionFlag.HasRaceSwap + THE_SPEAR_OF_ADUN = 55, "The Spear of Adun (Protoss)", SC2Campaign.LOTV, "Aiur", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_spear_of_adun", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsPZ|MissionFlag.HasRaceSwap + SKY_SHIELD = 56, "Sky Shield (Protoss)", SC2Campaign.LOTV, "Korhal", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_sky_shield", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.HasRaceSwap + BROTHERS_IN_ARMS = 57, "Brothers in Arms (Protoss)", SC2Campaign.LOTV, "Korhal", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_brothers_in_arms", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.HasRaceSwap + AMON_S_REACH = 58, "Amon's Reach (Protoss)", SC2Campaign.LOTV, "Shakuras", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_amon_s_reach", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + LAST_STAND = 59, "Last Stand (Protoss)", SC2Campaign.LOTV, "Shakuras", SC2Race.PROTOSS, MissionPools.HARD, "ap_last_stand", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + FORBIDDEN_WEAPON = 60, "Forbidden Weapon (Protoss)", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_forbidden_weapon", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + TEMPLE_OF_UNIFICATION = 61, "Temple of Unification (Protoss)", SC2Campaign.LOTV, "Ulnar", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_temple_of_unification", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsTP|MissionFlag.HasRaceSwap + THE_INFINITE_CYCLE = 62, "The Infinite Cycle", SC2Campaign.LOTV, "Ulnar", SC2Race.ANY, MissionPools.HARD, "ap_the_infinite_cycle", MissionFlag.Protoss|MissionFlag.Kerrigan|MissionFlag.NoBuild|MissionFlag.VsTP + HARBINGER_OF_OBLIVION = 63, "Harbinger of Oblivion (Protoss)", SC2Campaign.LOTV, "Ulnar", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_harbinger_of_oblivion", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.Countdown|MissionFlag.VsTP|MissionFlag.AiZergAlly|MissionFlag.HasRaceSwap + UNSEALING_THE_PAST = 64, "Unsealing the Past (Protoss)", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.HARD, "ap_unsealing_the_past", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + PURIFICATION = 65, "Purification (Protoss)", SC2Campaign.LOTV, "Purifier", SC2Race.PROTOSS, MissionPools.HARD, "ap_purification", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsZerg|MissionFlag.HasRaceSwap + STEPS_OF_THE_RITE = 66, "Steps of the Rite (Protoss)", SC2Campaign.LOTV, "Tal'darim", SC2Race.PROTOSS, MissionPools.HARD, "ap_steps_of_the_rite", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + RAK_SHIR = 67, "Rak'Shir (Protoss)", SC2Campaign.LOTV, "Tal'darim", SC2Race.PROTOSS, MissionPools.HARD, "ap_rak_shir", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsProtoss|MissionFlag.HasRaceSwap + TEMPLAR_S_CHARGE = 68, "Templar's Charge (Protoss)", SC2Campaign.LOTV, "Moebius", SC2Race.PROTOSS, MissionPools.HARD, "ap_templar_s_charge", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsTerran|MissionFlag.HasRaceSwap + TEMPLAR_S_RETURN = 69, "Templar's Return", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_templar_s_return", MissionFlag.Protoss|MissionFlag.NoBuild|MissionFlag.VsPZ + THE_HOST = 70, "The Host (Protoss)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_the_host", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsAll|MissionFlag.HasRaceSwap + SALVATION = 71, "Salvation (Protoss)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_salvation", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.TimedDefense|MissionFlag.VsPZ|MissionFlag.AiProtossAlly|MissionFlag.HasRaceSwap + + # Epilogue + INTO_THE_VOID = 72, "Into the Void", SC2Campaign.EPILOGUE, "_1", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_into_the_void", MissionFlag.Protoss|MissionFlag.VanillaSoa|MissionFlag.VsAll|MissionFlag.AiTerranAlly|MissionFlag.AiZergAlly + THE_ESSENCE_OF_ETERNITY = 73, "The Essence of Eternity", SC2Campaign.EPILOGUE, "_2", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_the_essence_of_eternity", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsAll|MissionFlag.AiZergAlly|MissionFlag.AiProtossAlly + AMON_S_FALL = 74, "Amon's Fall", SC2Campaign.EPILOGUE, "_3", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_amon_s_fall", MissionFlag.Zerg|MissionFlag.AutoScroller|MissionFlag.VsAll|MissionFlag.AiTerranAlly|MissionFlag.AiProtossAlly + + # Nova Covert Ops + THE_ESCAPE = 75, "The Escape", SC2Campaign.NCO, "_1", SC2Race.ANY, MissionPools.MEDIUM, "ap_the_escape", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.NoBuild|MissionFlag.VsTerran + SUDDEN_STRIKE = 76, "Sudden Strike", SC2Campaign.NCO, "_1", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_sudden_strike", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.TimedDefense|MissionFlag.VsZerg + ENEMY_INTELLIGENCE = 77, "Enemy Intelligence", SC2Campaign.NCO, "_1", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_enemy_intelligence", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.Defense|MissionFlag.VsZerg + TROUBLE_IN_PARADISE = 78, "Trouble In Paradise", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_trouble_in_paradise", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.Countdown|MissionFlag.VsPZ + NIGHT_TERRORS = 79, "Night Terrors", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_night_terrors", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.VsPZ + FLASHPOINT = 80, "Flashpoint", SC2Campaign.NCO, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_flashpoint", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.VsZerg + IN_THE_ENEMY_S_SHADOW = 81, "In the Enemy's Shadow", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_in_the_enemy_s_shadow", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.NoBuild|MissionFlag.VsTerran + DARK_SKIES = 82, "Dark Skies", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.HARD, "ap_dark_skies", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.TimedDefense|MissionFlag.VsProtoss + END_GAME = 83, "End Game", SC2Campaign.NCO, "_3", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_end_game", MissionFlag.Terran|MissionFlag.Nova|MissionFlag.Defense|MissionFlag.VsTerran + + # Race-Swapped Variants + # 84/85 - Liberation Day + THE_OUTLAWS_Z = 86, "The Outlaws (Zerg)", SC2Campaign.WOL, "Mar Sara", SC2Race.ZERG, MissionPools.EASY, "ap_the_outlaws", MissionFlag.Zerg|MissionFlag.VsTerran|MissionFlag.RaceSwap + THE_OUTLAWS_P = 87, "The Outlaws (Protoss)", SC2Campaign.WOL, "Mar Sara", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_outlaws", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + ZERO_HOUR_Z = 88, "Zero Hour (Zerg)", SC2Campaign.WOL, "Mar Sara", SC2Race.ZERG, MissionPools.MEDIUM, "ap_zero_hour", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + ZERO_HOUR_P = 89, "Zero Hour (Protoss)", SC2Campaign.WOL, "Mar Sara", SC2Race.PROTOSS, MissionPools.EASY, "ap_zero_hour", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + EVACUATION_Z = 90, "Evacuation (Zerg)", SC2Campaign.WOL, "Colonist", SC2Race.ZERG, MissionPools.EASY, "ap_evacuation", MissionFlag.Zerg|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.RaceSwap + EVACUATION_P = 91, "Evacuation (Protoss)", SC2Campaign.WOL, "Colonist", SC2Race.PROTOSS, MissionPools.EASY, "ap_evacuation", MissionFlag.Protoss|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.RaceSwap + OUTBREAK_Z = 92, "Outbreak (Zerg)", SC2Campaign.WOL, "Colonist", SC2Race.ZERG, MissionPools.MEDIUM, "ap_outbreak", MissionFlag.Zerg|MissionFlag.Defense|MissionFlag.VsZerg|MissionFlag.RaceSwap + OUTBREAK_P = 93, "Outbreak (Protoss)", SC2Campaign.WOL, "Colonist", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_outbreak", MissionFlag.Protoss|MissionFlag.Defense|MissionFlag.VsZerg|MissionFlag.RaceSwap + SAFE_HAVEN_Z = 94, "Safe Haven (Zerg)", SC2Campaign.WOL, "Colonist", SC2Race.ZERG, MissionPools.MEDIUM, "ap_safe_haven", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + SAFE_HAVEN_P = 95, "Safe Haven (Protoss)", SC2Campaign.WOL, "Colonist", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_safe_haven", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + HAVENS_FALL_Z = 96, "Haven's Fall (Zerg)", SC2Campaign.WOL, "Colonist", SC2Race.ZERG, MissionPools.MEDIUM, "ap_havens_fall", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + HAVENS_FALL_P = 97, "Haven's Fall (Protoss)", SC2Campaign.WOL, "Colonist", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_havens_fall", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.RaceSwap + SMASH_AND_GRAB_Z = 98, "Smash and Grab (Zerg)", SC2Campaign.WOL, "Artifact", SC2Race.ZERG, MissionPools.EASY, "ap_smash_and_grab", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsPZ|MissionFlag.RaceSwap + SMASH_AND_GRAB_P = 99, "Smash and Grab (Protoss)", SC2Campaign.WOL, "Artifact", SC2Race.PROTOSS, MissionPools.EASY, "ap_smash_and_grab", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsPZ|MissionFlag.RaceSwap + THE_DIG_Z = 100, "The Dig (Zerg)", SC2Campaign.WOL, "Artifact", SC2Race.ZERG, MissionPools.MEDIUM, "ap_the_dig", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsProtoss|MissionFlag.RaceSwap + THE_DIG_P = 101, "The Dig (Protoss)", SC2Campaign.WOL, "Artifact", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_the_dig", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.VsProtoss|MissionFlag.RaceSwap + THE_MOEBIUS_FACTOR_Z = 102, "The Moebius Factor (Zerg)", SC2Campaign.WOL, "Artifact", SC2Race.ZERG, MissionPools.MEDIUM, "ap_the_moebius_factor", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.RaceSwap + THE_MOEBIUS_FACTOR_P = 103, "The Moebius Factor (Protoss)", SC2Campaign.WOL, "Artifact", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_the_moebius_factor", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.RaceSwap + SUPERNOVA_Z = 104, "Supernova (Zerg)", SC2Campaign.WOL, "Artifact", SC2Race.ZERG, MissionPools.HARD, "ap_supernova", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + SUPERNOVA_P = 105, "Supernova (Protoss)", SC2Campaign.WOL, "Artifact", SC2Race.PROTOSS, MissionPools.HARD, "ap_supernova", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + MAW_OF_THE_VOID_Z = 106, "Maw of the Void (Zerg)", SC2Campaign.WOL, "Artifact", SC2Race.ZERG, MissionPools.HARD, "ap_maw_of_the_void", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + MAW_OF_THE_VOID_P = 107, "Maw of the Void (Protoss)", SC2Campaign.WOL, "Artifact", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_maw_of_the_void", MissionFlag.Protoss|MissionFlag.VsProtoss|MissionFlag.RaceSwap + DEVILS_PLAYGROUND_Z = 108, "Devil's Playground (Zerg)", SC2Campaign.WOL, "Covert", SC2Race.ZERG, MissionPools.EASY, "ap_devils_playground", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + DEVILS_PLAYGROUND_P = 109, "Devil's Playground (Protoss)", SC2Campaign.WOL, "Covert", SC2Race.PROTOSS, MissionPools.EASY, "ap_devils_playground", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.RaceSwap + WELCOME_TO_THE_JUNGLE_Z = 110, "Welcome to the Jungle (Zerg)", SC2Campaign.WOL, "Covert", SC2Race.ZERG, MissionPools.HARD, "ap_welcome_to_the_jungle", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + WELCOME_TO_THE_JUNGLE_P = 111, "Welcome to the Jungle (Protoss)", SC2Campaign.WOL, "Covert", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_welcome_to_the_jungle", MissionFlag.Protoss|MissionFlag.VsProtoss|MissionFlag.RaceSwap + # 112/113 - Breakout + # 114/115 - Ghost of a Chance + THE_GREAT_TRAIN_ROBBERY_Z = 116, "The Great Train Robbery (Zerg)", SC2Campaign.WOL, "Rebellion", SC2Race.ZERG, MissionPools.EASY, "ap_the_great_train_robbery", MissionFlag.Zerg|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + THE_GREAT_TRAIN_ROBBERY_P = 117, "The Great Train Robbery (Protoss)", SC2Campaign.WOL, "Rebellion", SC2Race.PROTOSS, MissionPools.EASY, "ap_the_great_train_robbery", MissionFlag.Protoss|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + CUTTHROAT_Z = 118, "Cutthroat (Zerg)", SC2Campaign.WOL, "Rebellion", SC2Race.ZERG, MissionPools.MEDIUM, "ap_cutthroat", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + CUTTHROAT_P = 119, "Cutthroat (Protoss)", SC2Campaign.WOL, "Rebellion", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_cutthroat", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + ENGINE_OF_DESTRUCTION_Z = 120, "Engine of Destruction (Zerg)", SC2Campaign.WOL, "Rebellion", SC2Race.ZERG, MissionPools.HARD, "ap_engine_of_destruction", MissionFlag.Zerg|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + ENGINE_OF_DESTRUCTION_P = 121, "Engine of Destruction (Protoss)", SC2Campaign.WOL, "Rebellion", SC2Race.PROTOSS, MissionPools.HARD, "ap_engine_of_destruction", MissionFlag.Protoss|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + MEDIA_BLITZ_Z = 122, "Media Blitz (Zerg)", SC2Campaign.WOL, "Rebellion", SC2Race.ZERG, MissionPools.HARD, "ap_media_blitz", MissionFlag.Zerg|MissionFlag.VsTerran|MissionFlag.RaceSwap + MEDIA_BLITZ_P = 123, "Media Blitz (Protoss)", SC2Campaign.WOL, "Rebellion", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_media_blitz", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + # 124/125 - Piercing the Shroud + # 126/127 - Whispers of Doom + A_SINISTER_TURN_T = 128, "A Sinister Turn (Terran)", SC2Campaign.PROPHECY, "_2", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_a_sinister_turn", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.RaceSwap + A_SINISTER_TURN_Z = 129, "A Sinister Turn (Zerg)", SC2Campaign.PROPHECY, "_2", SC2Race.ZERG, MissionPools.MEDIUM, "ap_a_sinister_turn", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + ECHOES_OF_THE_FUTURE_T = 130, "Echoes of the Future (Terran)", SC2Campaign.PROPHECY, "_3", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_echoes_of_the_future", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.RaceSwap + ECHOES_OF_THE_FUTURE_Z = 131, "Echoes of the Future (Zerg)", SC2Campaign.PROPHECY, "_3", SC2Race.ZERG, MissionPools.MEDIUM, "ap_echoes_of_the_future", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + IN_UTTER_DARKNESS_T = 132, "In Utter Darkness (Terran)", SC2Campaign.PROPHECY, "_4", SC2Race.TERRAN, MissionPools.HARD, "ap_in_utter_darkness", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + IN_UTTER_DARKNESS_Z = 133, "In Utter Darkness (Zerg)", SC2Campaign.PROPHECY, "_4", SC2Race.ZERG, MissionPools.HARD, "ap_in_utter_darkness", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + GATES_OF_HELL_Z = 134, "Gates of Hell (Zerg)", SC2Campaign.WOL, "Char", SC2Race.ZERG, MissionPools.HARD, "ap_gates_of_hell", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + GATES_OF_HELL_P = 135, "Gates of Hell (Protoss)", SC2Campaign.WOL, "Char", SC2Race.PROTOSS, MissionPools.HARD, "ap_gates_of_hell", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.RaceSwap + # 136/137 - Belly of the Beast + SHATTER_THE_SKY_Z = 138, "Shatter the Sky (Zerg)", SC2Campaign.WOL, "Char", SC2Race.ZERG, MissionPools.HARD, "ap_shatter_the_sky", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + SHATTER_THE_SKY_P = 139, "Shatter the Sky (Protoss)", SC2Campaign.WOL, "Char", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_shatter_the_sky", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.RaceSwap + ALL_IN_Z = 140, "All-In (Zerg)", SC2Campaign.WOL, "Char", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_all_in", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + ALL_IN_P = 141, "All-In (Protoss)", SC2Campaign.WOL, "Char", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_all_in", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + LAB_RAT_T = 142, "Lab Rat (Terran)", SC2Campaign.HOTS, "Umoja", SC2Race.TERRAN, MissionPools.STARTER, "ap_lab_rat", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.RaceSwap + LAB_RAT_P = 143, "Lab Rat (Protoss)", SC2Campaign.HOTS, "Umoja", SC2Race.PROTOSS, MissionPools.STARTER, "ap_lab_rat", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + # 144/145 - Back in the Saddle + RENDEZVOUS_T = 146, "Rendezvous (Terran)", SC2Campaign.HOTS, "Umoja", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_rendezvous", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + RENDEZVOUS_P = 147, "Rendezvous (Protoss)", SC2Campaign.HOTS, "Umoja", SC2Race.PROTOSS, MissionPools.EASY, "ap_rendezvous", MissionFlag.Protoss|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + HARVEST_OF_SCREAMS_T = 148, "Harvest of Screams (Terran)", SC2Campaign.HOTS, "Kaldir", SC2Race.TERRAN, MissionPools.EASY, "ap_harvest_of_screams", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.RaceSwap + HARVEST_OF_SCREAMS_P = 149, "Harvest of Screams (Protoss)", SC2Campaign.HOTS, "Kaldir", SC2Race.PROTOSS, MissionPools.EASY, "ap_harvest_of_screams", MissionFlag.Protoss|MissionFlag.VsProtoss|MissionFlag.RaceSwap + SHOOT_THE_MESSENGER_T = 150, "Shoot the Messenger (Terran)", SC2Campaign.HOTS, "Kaldir", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_shoot_the_messenger", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + SHOOT_THE_MESSENGER_P = 151, "Shoot the Messenger (Protoss)", SC2Campaign.HOTS, "Kaldir", SC2Race.PROTOSS, MissionPools.EASY, "ap_shoot_the_messenger", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + # 152/153 - Enemy Within + DOMINATION_T = 154, "Domination (Terran)", SC2Campaign.HOTS, "Char", SC2Race.TERRAN, MissionPools.EASY, "ap_domination", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.RaceSwap + DOMINATION_P = 155, "Domination (Protoss)", SC2Campaign.HOTS, "Char", SC2Race.PROTOSS, MissionPools.EASY, "ap_domination", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsZerg|MissionFlag.RaceSwap + FIRE_IN_THE_SKY_T = 156, "Fire in the Sky (Terran)", SC2Campaign.HOTS, "Char", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_fire_in_the_sky", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + FIRE_IN_THE_SKY_P = 157, "Fire in the Sky (Protoss)", SC2Campaign.HOTS, "Char", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_fire_in_the_sky", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + OLD_SOLDIERS_T = 158, "Old Soldiers (Terran)", SC2Campaign.HOTS, "Char", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_old_soldiers", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.RaceSwap + OLD_SOLDIERS_P = 159, "Old Soldiers (Protoss)", SC2Campaign.HOTS, "Char", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_old_soldiers", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + WAKING_THE_ANCIENT_T = 160, "Waking the Ancient (Terran)", SC2Campaign.HOTS, "Zerus", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_waking_the_ancient", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.RaceSwap + WAKING_THE_ANCIENT_P = 161, "Waking the Ancient (Protoss)", SC2Campaign.HOTS, "Zerus", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_waking_the_ancient", MissionFlag.Protoss|MissionFlag.VsZerg|MissionFlag.RaceSwap + THE_CRUCIBLE_T = 162, "The Crucible (Terran)", SC2Campaign.HOTS, "Zerus", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_crucible", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + THE_CRUCIBLE_P = 163, "The Crucible (Protoss)", SC2Campaign.HOTS, "Zerus", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_the_crucible", MissionFlag.Protoss|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + # 164/165 - Supreme + INFESTED_T = 166, "Infested (Terran)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_infested", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.RaceSwap + INFESTED_P = 167, "Infested (Protoss)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_infested", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + HAND_OF_DARKNESS_T = 168, "Hand of Darkness (Terran)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.TERRAN, MissionPools.HARD, "ap_hand_of_darkness", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + HAND_OF_DARKNESS_P = 169, "Hand of Darkness (Protoss)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.PROTOSS, MissionPools.HARD, "ap_hand_of_darkness", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.RaceSwap + PHANTOMS_OF_THE_VOID_T = 170, "Phantoms of the Void (Terran)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_phantoms_of_the_void", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + PHANTOMS_OF_THE_VOID_P = 171, "Phantoms of the Void (Protoss)", SC2Campaign.HOTS, "Skygeirr Station", SC2Race.PROTOSS, MissionPools.MEDIUM, "ap_phantoms_of_the_void", MissionFlag.Protoss|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + # 172/173 - With Friends Like These + # 174/175 - Conviction + PLANETFALL_T = 176, "Planetfall (Terran)", SC2Campaign.HOTS, "Korhal", SC2Race.TERRAN, MissionPools.HARD, "ap_planetfall", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + PLANETFALL_P = 177, "Planetfall (Protoss)", SC2Campaign.HOTS, "Korhal", SC2Race.PROTOSS, MissionPools.HARD, "ap_planetfall", MissionFlag.Protoss|MissionFlag.AutoScroller|MissionFlag.VsTerran|MissionFlag.RaceSwap + DEATH_FROM_ABOVE_T = 178, "Death From Above (Terran)", SC2Campaign.HOTS, "Korhal", SC2Race.TERRAN, MissionPools.HARD, "ap_death_from_above", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.RaceSwap + DEATH_FROM_ABOVE_P = 179, "Death From Above (Protoss)", SC2Campaign.HOTS, "Korhal", SC2Race.PROTOSS, MissionPools.HARD, "ap_death_from_above", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.RaceSwap + THE_RECKONING_T = 180, "The Reckoning (Terran)", SC2Campaign.HOTS, "Korhal", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_the_reckoning", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + THE_RECKONING_P = 181, "The Reckoning (Protoss)", SC2Campaign.HOTS, "Korhal", SC2Race.PROTOSS, MissionPools.VERY_HARD, "ap_the_reckoning", MissionFlag.Protoss|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + DARK_WHISPERS_T = 182, "Dark Whispers (Terran)", SC2Campaign.PROLOGUE, "_1", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_dark_whispers", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTZ|MissionFlag.RaceSwap + DARK_WHISPERS_Z = 183, "Dark Whispers (Zerg)", SC2Campaign.PROLOGUE, "_1", SC2Race.ZERG, MissionPools.MEDIUM, "ap_dark_whispers", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsTZ|MissionFlag.RaceSwap + GHOSTS_IN_THE_FOG_T = 184, "Ghosts in the Fog (Terran)", SC2Campaign.PROLOGUE, "_2", SC2Race.TERRAN, MissionPools.HARD, "ap_ghosts_in_the_fog", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.RaceSwap + GHOSTS_IN_THE_FOG_Z = 185, "Ghosts in the Fog (Zerg)", SC2Campaign.PROLOGUE, "_2", SC2Race.ZERG, MissionPools.HARD, "ap_ghosts_in_the_fog", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + # 186/187 - Evil Awoken + # 188/189 - For Aiur! + THE_GROWING_SHADOW_T = 190, "The Growing Shadow (Terran)", SC2Campaign.LOTV, "Aiur", SC2Race.TERRAN, MissionPools.EASY, "ap_the_growing_shadow", MissionFlag.Terran|MissionFlag.VsPZ|MissionFlag.RaceSwap + THE_GROWING_SHADOW_Z = 191, "The Growing Shadow (Zerg)", SC2Campaign.LOTV, "Aiur", SC2Race.ZERG, MissionPools.EASY, "ap_the_growing_shadow", MissionFlag.Zerg|MissionFlag.VsPZ|MissionFlag.RaceSwap + THE_SPEAR_OF_ADUN_T = 192, "The Spear of Adun (Terran)", SC2Campaign.LOTV, "Aiur", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_the_spear_of_adun", MissionFlag.Terran|MissionFlag.VsPZ|MissionFlag.RaceSwap + THE_SPEAR_OF_ADUN_Z = 193, "The Spear of Adun (Zerg)", SC2Campaign.LOTV, "Aiur", SC2Race.ZERG, MissionPools.MEDIUM, "ap_the_spear_of_adun", MissionFlag.Zerg|MissionFlag.VsPZ|MissionFlag.RaceSwap + SKY_SHIELD_T = 194, "Sky Shield (Terran)", SC2Campaign.LOTV, "Korhal", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_sky_shield", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + SKY_SHIELD_Z = 195, "Sky Shield (Zerg)", SC2Campaign.LOTV, "Korhal", SC2Race.ZERG, MissionPools.MEDIUM, "ap_sky_shield", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + BROTHERS_IN_ARMS_T = 196, "Brothers in Arms (Terran)", SC2Campaign.LOTV, "Korhal", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_brothers_in_arms", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + BROTHERS_IN_ARMS_Z = 197, "Brothers in Arms (Zerg)", SC2Campaign.LOTV, "Korhal", SC2Race.ZERG, MissionPools.MEDIUM, "ap_brothers_in_arms", MissionFlag.Zerg|MissionFlag.VsTerran|MissionFlag.AiTerranAlly|MissionFlag.RaceSwap + AMON_S_REACH_T = 198, "Amon's Reach (Terran)", SC2Campaign.LOTV, "Shakuras", SC2Race.TERRAN, MissionPools.MEDIUM, "ap_amon_s_reach", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.RaceSwap + AMON_S_REACH_Z = 199, "Amon's Reach (Zerg)", SC2Campaign.LOTV, "Shakuras", SC2Race.ZERG, MissionPools.MEDIUM, "ap_amon_s_reach", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + LAST_STAND_T = 200, "Last Stand (Terran)", SC2Campaign.LOTV, "Shakuras", SC2Race.TERRAN, MissionPools.HARD, "ap_last_stand", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + LAST_STAND_Z = 201, "Last Stand (Zerg)", SC2Campaign.LOTV, "Shakuras", SC2Race.ZERG, MissionPools.HARD, "ap_last_stand", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsZerg|MissionFlag.RaceSwap + FORBIDDEN_WEAPON_T = 202, "Forbidden Weapon (Terran)", SC2Campaign.LOTV, "Purifier", SC2Race.TERRAN, MissionPools.HARD, "ap_forbidden_weapon", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + FORBIDDEN_WEAPON_Z = 203, "Forbidden Weapon (Zerg)", SC2Campaign.LOTV, "Purifier", SC2Race.ZERG, MissionPools.HARD, "ap_forbidden_weapon", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsProtoss|MissionFlag.RaceSwap + TEMPLE_OF_UNIFICATION_T = 204, "Temple of Unification (Terran)", SC2Campaign.LOTV, "Ulnar", SC2Race.TERRAN, MissionPools.HARD, "ap_temple_of_unification", MissionFlag.Terran|MissionFlag.VsTP|MissionFlag.RaceSwap + TEMPLE_OF_UNIFICATION_Z = 205, "Temple of Unification (Zerg)", SC2Campaign.LOTV, "Ulnar", SC2Race.ZERG, MissionPools.HARD, "ap_temple_of_unification", MissionFlag.Zerg|MissionFlag.VsTP|MissionFlag.RaceSwap + # 206/207 - The Infinite Cycle + HARBINGER_OF_OBLIVION_T = 208, "Harbinger of Oblivion (Terran)", SC2Campaign.LOTV, "Ulnar", SC2Race.TERRAN, MissionPools.HARD, "ap_harbinger_of_oblivion", MissionFlag.Terran|MissionFlag.Countdown|MissionFlag.VsTP|MissionFlag.AiZergAlly|MissionFlag.RaceSwap + HARBINGER_OF_OBLIVION_Z = 209, "Harbinger of Oblivion (Zerg)", SC2Campaign.LOTV, "Ulnar", SC2Race.ZERG, MissionPools.HARD, "ap_harbinger_of_oblivion", MissionFlag.Zerg|MissionFlag.Countdown|MissionFlag.VsTP|MissionFlag.AiZergAlly|MissionFlag.RaceSwap + UNSEALING_THE_PAST_T = 210, "Unsealing the Past (Terran)", SC2Campaign.LOTV, "Purifier", SC2Race.TERRAN, MissionPools.HARD, "ap_unsealing_the_past", MissionFlag.Terran|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.RaceSwap + UNSEALING_THE_PAST_Z = 211, "Unsealing the Past (Zerg)", SC2Campaign.LOTV, "Purifier", SC2Race.ZERG, MissionPools.HARD, "ap_unsealing_the_past", MissionFlag.Zerg|MissionFlag.AutoScroller|MissionFlag.VsZerg|MissionFlag.RaceSwap + PURIFICATION_T = 212, "Purification (Terran)", SC2Campaign.LOTV, "Purifier", SC2Race.TERRAN, MissionPools.HARD, "ap_purification", MissionFlag.Terran|MissionFlag.VsZerg|MissionFlag.RaceSwap + PURIFICATION_Z = 213, "Purification (Zerg)", SC2Campaign.LOTV, "Purifier", SC2Race.ZERG, MissionPools.HARD, "ap_purification", MissionFlag.Zerg|MissionFlag.VsZerg|MissionFlag.RaceSwap + STEPS_OF_THE_RITE_T = 214, "Steps of the Rite (Terran)", SC2Campaign.LOTV, "Tal'darim", SC2Race.TERRAN, MissionPools.HARD, "ap_steps_of_the_rite", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.RaceSwap + STEPS_OF_THE_RITE_Z = 215, "Steps of the Rite (Zerg)", SC2Campaign.LOTV, "Tal'darim", SC2Race.ZERG, MissionPools.HARD, "ap_steps_of_the_rite", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + RAK_SHIR_T = 216, "Rak'Shir (Terran)", SC2Campaign.LOTV, "Tal'darim", SC2Race.TERRAN, MissionPools.HARD, "ap_rak_shir", MissionFlag.Terran|MissionFlag.VsProtoss|MissionFlag.RaceSwap + RAK_SHIR_Z = 217, "Rak'Shir (Zerg)", SC2Campaign.LOTV, "Tal'darim", SC2Race.ZERG, MissionPools.HARD, "ap_rak_shir", MissionFlag.Zerg|MissionFlag.VsProtoss|MissionFlag.RaceSwap + TEMPLAR_S_CHARGE_T = 218, "Templar's Charge (Terran)", SC2Campaign.LOTV, "Moebius", SC2Race.TERRAN, MissionPools.HARD, "ap_templar_s_charge", MissionFlag.Terran|MissionFlag.VsTerran|MissionFlag.RaceSwap + TEMPLAR_S_CHARGE_Z = 219, "Templar's Charge (Zerg)", SC2Campaign.LOTV, "Moebius", SC2Race.ZERG, MissionPools.HARD, "ap_templar_s_charge", MissionFlag.Zerg|MissionFlag.VsTerran|MissionFlag.RaceSwap + # 220/221 - Templar's Return + THE_HOST_T = 222, "The Host (Terran)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_the_host", MissionFlag.Terran|MissionFlag.VsAll|MissionFlag.RaceSwap + THE_HOST_Z = 223, "The Host (Zerg)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_the_host", MissionFlag.Zerg|MissionFlag.VsAll|MissionFlag.RaceSwap + SALVATION_T = 224, "Salvation (Terran)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.TERRAN, MissionPools.VERY_HARD, "ap_salvation", MissionFlag.Terran|MissionFlag.TimedDefense|MissionFlag.VsPZ|MissionFlag.AiProtossAlly|MissionFlag.RaceSwap + SALVATION_Z = 225, "Salvation (Zerg)", SC2Campaign.LOTV, "Return to Aiur", SC2Race.ZERG, MissionPools.VERY_HARD, "ap_salvation", MissionFlag.Zerg|MissionFlag.TimedDefense|MissionFlag.VsPZ|MissionFlag.AiProtossAlly|MissionFlag.RaceSwap + # 226/227 - Into the Void + # 228/229 - The Essence of Eternity + # 230/231 - Amon's Fall + # 232/233 - The Escape + # 234/235 - Sudden Strike + # 236/237 - Enemy Intelligence + # 238/239 - Trouble In Paradise + # 240/241 - Night Terrors + # 242/243 - Flashpoint + # 244/245 - In the Enemy's Shadow + # 246/247 - Dark Skies + # 248/249 - End Game + + +class MissionConnection: + campaign: SC2Campaign + connect_to: int # -1 connects to Menu + + def __init__(self, connect_to, campaign = SC2Campaign.GLOBAL): + self.campaign = campaign + self.connect_to = connect_to + + def _asdict(self): + return { + "campaign": self.campaign.id, + "connect_to": self.connect_to + } + + +class MissionInfo(NamedTuple): + mission: SC2Mission + required_world: List[Union[MissionConnection, Dict[Literal["campaign", "connect_to"], int]]] + category: str + number: int = 0 # number of worlds need beaten + completion_critical: bool = False # missions needed to beat game + or_requirements: bool = False # true if the requirements should be or-ed instead of and-ed + ui_vertical_padding: int = 0 # How many blank padding tiles go above this mission in the launcher + + + +lookup_id_to_mission: Dict[int, SC2Mission] = { + mission.id: mission for mission in SC2Mission +} + +lookup_name_to_mission: Dict[str, SC2Mission] = { + mission.mission_name: mission for mission in SC2Mission +} +for mission in SC2Mission: + if MissionFlag.HasRaceSwap in mission.flags and ' (' in mission.mission_name: + # Short names for non-race-swapped missions for client compatibility + short_name = mission.get_short_name() + lookup_name_to_mission[short_name] = mission + +lookup_id_to_campaign: Dict[int, SC2Campaign] = { + campaign.id: campaign for campaign in SC2Campaign +} + + +campaign_mission_table: Dict[SC2Campaign, Set[SC2Mission]] = { + campaign: set() for campaign in SC2Campaign +} +for mission in SC2Mission: + campaign_mission_table[mission.campaign].add(mission) + + +def get_campaign_difficulty(campaign: SC2Campaign, excluded_missions: Iterable[SC2Mission] = ()) -> MissionPools: + """ + + :param campaign: + :param excluded_missions: + :return: Campaign's the most difficult non-excluded mission + """ + excluded_mission_set = set(excluded_missions) + included_missions = campaign_mission_table[campaign].difference(excluded_mission_set) + return max([mission.pool for mission in included_missions]) + + +def get_campaign_goal_priority(campaign: SC2Campaign, excluded_missions: Iterable[SC2Mission] = ()) -> SC2CampaignGoalPriority: + """ + Gets a modified campaign goal priority. + If all the campaign's goal missions are excluded, it's ineligible to have the goal + If the campaign's very hard missions are excluded, the priority is lowered to hard + :param campaign: + :param excluded_missions: + :return: + """ + if excluded_missions is None: + return campaign.goal_priority + else: + goal_missions = set(get_campaign_potential_goal_missions(campaign)) + excluded_mission_set = set(excluded_missions) + remaining_goals = goal_missions.difference(excluded_mission_set) + if remaining_goals == set(): + # All potential goals are excluded, the campaign can't be a goal + return SC2CampaignGoalPriority.NONE + elif campaign.goal_priority == SC2CampaignGoalPriority.VERY_HARD: + # Check if a very hard campaign doesn't get rid of it's last very hard mission + difficulty = get_campaign_difficulty(campaign, excluded_missions) + if difficulty == MissionPools.VERY_HARD: + return SC2CampaignGoalPriority.VERY_HARD + else: + return SC2CampaignGoalPriority.HARD + else: + return campaign.goal_priority + + +class SC2CampaignGoal(NamedTuple): + mission: SC2Mission + location: str + + +campaign_final_mission_locations: Dict[SC2Campaign, Optional[SC2CampaignGoal]] = { + SC2Campaign.WOL: SC2CampaignGoal(SC2Mission.ALL_IN, f'{SC2Mission.ALL_IN.mission_name}: Victory'), + SC2Campaign.PROPHECY: SC2CampaignGoal(SC2Mission.IN_UTTER_DARKNESS, f'{SC2Mission.IN_UTTER_DARKNESS.mission_name}: Defeat'), + SC2Campaign.HOTS: SC2CampaignGoal(SC2Mission.THE_RECKONING, f'{SC2Mission.THE_RECKONING.mission_name}: Victory'), + SC2Campaign.PROLOGUE: SC2CampaignGoal(SC2Mission.EVIL_AWOKEN, f'{SC2Mission.EVIL_AWOKEN.mission_name}: Victory'), + SC2Campaign.LOTV: SC2CampaignGoal(SC2Mission.SALVATION, f'{SC2Mission.SALVATION.mission_name}: Victory'), + SC2Campaign.EPILOGUE: None, + SC2Campaign.NCO: SC2CampaignGoal(SC2Mission.END_GAME, f'{SC2Mission.END_GAME.mission_name}: Victory'), +} + +campaign_alt_final_mission_locations: Dict[SC2Campaign, Dict[SC2Mission, str]] = { + SC2Campaign.WOL: { + SC2Mission.MAW_OF_THE_VOID: f'{SC2Mission.MAW_OF_THE_VOID.mission_name}: Victory', + SC2Mission.ENGINE_OF_DESTRUCTION: f'{SC2Mission.ENGINE_OF_DESTRUCTION.mission_name}: Victory', + SC2Mission.SUPERNOVA: f'{SC2Mission.SUPERNOVA.mission_name}: Victory', + SC2Mission.GATES_OF_HELL: f'{SC2Mission.GATES_OF_HELL.mission_name}: Victory', + SC2Mission.SHATTER_THE_SKY: f'{SC2Mission.SHATTER_THE_SKY.mission_name}: Victory', + + SC2Mission.MAW_OF_THE_VOID_Z: f'{SC2Mission.MAW_OF_THE_VOID_Z.mission_name}: Victory', + SC2Mission.ENGINE_OF_DESTRUCTION_Z: f'{SC2Mission.ENGINE_OF_DESTRUCTION_Z.mission_name}: Victory', + SC2Mission.SUPERNOVA_Z: f'{SC2Mission.SUPERNOVA_Z.mission_name}: Victory', + SC2Mission.GATES_OF_HELL_Z: f'{SC2Mission.GATES_OF_HELL_Z.mission_name}: Victory', + SC2Mission.SHATTER_THE_SKY_Z: f'{SC2Mission.SHATTER_THE_SKY_Z.mission_name}: Victory', + + SC2Mission.MAW_OF_THE_VOID_P: f'{SC2Mission.MAW_OF_THE_VOID_P.mission_name}: Victory', + SC2Mission.ENGINE_OF_DESTRUCTION_P: f'{SC2Mission.ENGINE_OF_DESTRUCTION_P.mission_name}: Victory', + SC2Mission.SUPERNOVA_P: f'{SC2Mission.SUPERNOVA_P.mission_name}: Victory', + SC2Mission.GATES_OF_HELL_P: f'{SC2Mission.GATES_OF_HELL_P.mission_name}: Victory', + SC2Mission.SHATTER_THE_SKY_P: f'{SC2Mission.SHATTER_THE_SKY_P.mission_name}: Victory' + }, + SC2Campaign.PROPHECY: {}, + SC2Campaign.HOTS: { + SC2Mission.THE_CRUCIBLE: f'{SC2Mission.THE_CRUCIBLE.mission_name}: Victory', + SC2Mission.HAND_OF_DARKNESS: f'{SC2Mission.HAND_OF_DARKNESS.mission_name}: Victory', + SC2Mission.PHANTOMS_OF_THE_VOID: f'{SC2Mission.PHANTOMS_OF_THE_VOID.mission_name}: Victory', + SC2Mission.PLANETFALL: f'{SC2Mission.PLANETFALL.mission_name}: Victory', + SC2Mission.DEATH_FROM_ABOVE: f'{SC2Mission.DEATH_FROM_ABOVE.mission_name}: Victory', + + SC2Mission.THE_CRUCIBLE_T: f'{SC2Mission.THE_CRUCIBLE_T.mission_name}: Victory', + SC2Mission.HAND_OF_DARKNESS_T: f'{SC2Mission.HAND_OF_DARKNESS_T.mission_name}: Victory', + SC2Mission.PHANTOMS_OF_THE_VOID_T: f'{SC2Mission.PHANTOMS_OF_THE_VOID_T.mission_name}: Victory', + SC2Mission.PLANETFALL_T: f'{SC2Mission.PLANETFALL_T.mission_name}: Victory', + SC2Mission.DEATH_FROM_ABOVE_T: f'{SC2Mission.DEATH_FROM_ABOVE_T.mission_name}: Victory', + + SC2Mission.THE_CRUCIBLE_P: f'{SC2Mission.THE_CRUCIBLE_P.mission_name}: Victory', + SC2Mission.HAND_OF_DARKNESS_P: f'{SC2Mission.HAND_OF_DARKNESS_P.mission_name}: Victory', + SC2Mission.PHANTOMS_OF_THE_VOID_P: f'{SC2Mission.PHANTOMS_OF_THE_VOID_P.mission_name}: Victory', + SC2Mission.PLANETFALL_P: f'{SC2Mission.PLANETFALL_P.mission_name}: Victory', + SC2Mission.DEATH_FROM_ABOVE_P: f'{SC2Mission.DEATH_FROM_ABOVE_P.mission_name}: Victory' + }, + SC2Campaign.PROLOGUE: { + SC2Mission.GHOSTS_IN_THE_FOG: f'{SC2Mission.GHOSTS_IN_THE_FOG.mission_name}: Victory', + SC2Mission.GHOSTS_IN_THE_FOG_T: f'{SC2Mission.GHOSTS_IN_THE_FOG_T.mission_name}: Victory', + SC2Mission.GHOSTS_IN_THE_FOG_Z: f'{SC2Mission.GHOSTS_IN_THE_FOG_Z.mission_name}: Victory' + }, + SC2Campaign.LOTV: { + SC2Mission.THE_HOST: f'{SC2Mission.THE_HOST.mission_name}: Victory', + SC2Mission.TEMPLAR_S_CHARGE: f'{SC2Mission.TEMPLAR_S_CHARGE.mission_name}: Victory', + + SC2Mission.THE_HOST_T: f'{SC2Mission.THE_HOST_T.mission_name}: Victory', + SC2Mission.TEMPLAR_S_CHARGE_T: f'{SC2Mission.TEMPLAR_S_CHARGE_T.mission_name}: Victory', + + SC2Mission.THE_HOST_Z: f'{SC2Mission.THE_HOST_Z.mission_name}: Victory', + SC2Mission.TEMPLAR_S_CHARGE_Z: f'{SC2Mission.TEMPLAR_S_CHARGE_Z.mission_name}: Victory' + }, + SC2Campaign.EPILOGUE: { + SC2Mission.AMON_S_FALL: f'{SC2Mission.AMON_S_FALL.mission_name}: Victory', + SC2Mission.INTO_THE_VOID: f'{SC2Mission.INTO_THE_VOID.mission_name}: Victory', + SC2Mission.THE_ESSENCE_OF_ETERNITY: f'{SC2Mission.THE_ESSENCE_OF_ETERNITY.mission_name}: Victory', + }, + SC2Campaign.NCO: { + SC2Mission.FLASHPOINT: f'{SC2Mission.FLASHPOINT.mission_name}: Victory', + SC2Mission.DARK_SKIES: f'{SC2Mission.DARK_SKIES.mission_name}: Victory', + SC2Mission.NIGHT_TERRORS: f'{SC2Mission.NIGHT_TERRORS.mission_name}: Victory', + SC2Mission.TROUBLE_IN_PARADISE: f'{SC2Mission.TROUBLE_IN_PARADISE.mission_name}: Victory' + } +} + +campaign_race_exceptions: Dict[SC2Mission, SC2Race] = { + SC2Mission.WITH_FRIENDS_LIKE_THESE: SC2Race.TERRAN +} + + +def get_goal_location(mission: SC2Mission) -> Union[str, None]: + """ + + :param mission: + :return: Goal location assigned to the goal mission + """ + campaign = mission.campaign + primary_campaign_goal = campaign_final_mission_locations[campaign] + if primary_campaign_goal is not None: + if primary_campaign_goal.mission == mission: + return primary_campaign_goal.location + + campaign_alt_goals = campaign_alt_final_mission_locations[campaign] + if mission in campaign_alt_goals: + return campaign_alt_goals.get(mission) + + return (mission.mission_name + ": Defeat") \ + if mission in [SC2Mission.IN_UTTER_DARKNESS, SC2Mission.IN_UTTER_DARKNESS_T, SC2Mission.IN_UTTER_DARKNESS_Z] \ + else mission.mission_name + ": Victory" + + +def get_campaign_potential_goal_missions(campaign: SC2Campaign) -> List[SC2Mission]: + """ + + :param campaign: + :return: All missions that can be the campaign's goal + """ + missions: List[SC2Mission] = list() + primary_goal_mission = campaign_final_mission_locations[campaign] + if primary_goal_mission is not None: + missions.append(primary_goal_mission.mission) + alt_goal_locations = campaign_alt_final_mission_locations[campaign] + if alt_goal_locations: + for mission in alt_goal_locations.keys(): + missions.append(mission) + + return missions + + +def get_missions_with_any_flags_in_list(flags: MissionFlag) -> List[SC2Mission]: + return [mission for mission in SC2Mission if flags & mission.flags] diff --git a/worlds/sc2/options.py b/worlds/sc2/options.py new file mode 100644 index 0000000000..74ea67c0a3 --- /dev/null +++ b/worlds/sc2/options.py @@ -0,0 +1,1758 @@ +import functools +from dataclasses import fields, Field, dataclass +from typing import * +from datetime import timedelta + +from Options import ( + Choice, Toggle, DefaultOnToggle, OptionSet, Range, + PerGameCommonOptions, Option, VerifyKeys, StartInventory, + is_iterable_except_str, OptionGroup, Visibility, ItemDict +) +from Utils import get_fuzzy_results +from BaseClasses import PlandoOptions +from .item import item_names, item_tables +from .item.item_groups import kerrigan_active_abilities, kerrigan_passives, nova_weapons, nova_gadgets +from .mission_tables import ( + SC2Campaign, SC2Mission, lookup_name_to_mission, MissionPools, get_missions_with_any_flags_in_list, + campaign_mission_table, SC2Race, MissionFlag +) +from .mission_groups import mission_groups, MissionGroupNames +from .mission_order.options import CustomMissionOrder + +if TYPE_CHECKING: + from worlds.AutoWorld import World + from . import SC2World + + +class Sc2MissionSet(OptionSet): + """Option set made for handling missions and expanding mission groups""" + valid_keys: Iterable[str] = [x.mission_name for x in SC2Mission] + + @classmethod + def from_any(cls, data: Any): + if is_iterable_except_str(data): + return cls(data) + return cls.from_text(str(data)) + + def verify(self, world: Type['World'], player_name: str, plando_options: PlandoOptions) -> None: + """Overridden version of function from Options.VerifyKeys for a better error message""" + new_value: set[str] = set() + case_insensitive_group_mapping = { + group_name.casefold(): group_value for group_name, group_value in mission_groups.items() + } + case_insensitive_group_mapping.update({mission.mission_name.casefold(): [mission.mission_name] for mission in SC2Mission}) + for group_name in self.value: + item_names = case_insensitive_group_mapping.get(group_name.casefold(), {group_name}) + new_value.update(item_names) + self.value = new_value + for item_name in self.value: + if item_name not in self.valid_keys: + picks = get_fuzzy_results( + item_name, + list(self.valid_keys) + list(MissionGroupNames.get_all_group_names()), + limit=1, + ) + raise Exception(f"Mission {item_name} from option {self} " + f"is not a valid mission name from {world.game}. " + f"Did you mean '{picks[0][0]}' ({picks[0][1]}% sure)") + + def __iter__(self) -> Iterator[str]: + return self.value.__iter__() + + def __len__(self) -> int: + return self.value.__len__() + + +class SelectedRaces(OptionSet): + """ + Pick which factions' missions and items can be shuffled into the world. + """ + display_name = "Select Playable Races" + valid_keys = {race.get_title() for race in SC2Race if race != SC2Race.ANY} + default = valid_keys + + +class GameDifficulty(Choice): + """ + The difficulty of the campaign, affects enemy AI, starting units, and game speed. + + For those unfamiliar with the Archipelago randomizer, the recommended settings are one difficulty level + lower than the vanilla game + """ + display_name = "Game Difficulty" + option_casual = 0 + option_normal = 1 + option_hard = 2 + option_brutal = 3 + default = 1 + + +class DifficultyDamageModifier(DefaultOnToggle): + """ + Enables or disables vanilla difficulty-based damage received modifier + Handles the 1.25 Brutal damage modifier in HotS and Prologue and 0.5 Casual damage modifier outside WoL and Prophecy + """ + display_name = "Difficulty Damage Modifier" + + +class GameSpeed(Choice): + """Optional setting to override difficulty-based game speed.""" + display_name = "Game Speed" + option_default = 0 + option_slower = 1 + option_slow = 2 + option_normal = 3 + option_fast = 4 + option_faster = 5 + default = option_default + + +class DisableForcedCamera(DefaultOnToggle): + """ + Prevents the game from moving or locking the camera without the player's consent. + """ + display_name = "Disable Forced Camera Movement" + + +class SkipCutscenes(Toggle): + """ + Skips all cutscenes and prevents dialog from blocking progress. + """ + display_name = "Skip Cutscenes" + + +class AllInMap(Choice): + """Determines what version of All-In (WoL final map) that will be generated for the campaign.""" + display_name = "All In Map" + option_ground = 0 + option_air = 1 + default = 'random' + + +class MissionOrder(Choice): + """ + Determines the order the missions are played in. The first three mission orders ignore the Maximum Campaign Size option. + Vanilla (83 total if all campaigns enabled): Keeps the standard mission order and branching from the vanilla Campaigns. + Vanilla Shuffled (83 total if all campaigns enabled): Keeps same branching paths from the vanilla Campaigns but randomizes the order of missions within. + Mini Campaign (47 total if all campaigns enabled): Shorter version of the campaign with randomized missions and optional branches. + Blitz: Missions are divided into sets. Complete one mission from a set to advance to the next set. + Gauntlet: A linear path of missions to complete the campaign. + Grid: Missions are arranged into a grid. Completing a mission unlocks the adjacent missions. Corners may be omitted to make the grid more square. Complete the bottom-right mission to win. + Golden Path: A required line of missions with several optional branches, similar to the Wings of Liberty campaign. + Hopscotch: Missions alternate between mandatory missions and pairs of optional missions. + Custom: Uses the YAML's custom mission order option. See documentation for usage. + """ + display_name = "Mission Order" + option_vanilla = 0 + option_vanilla_shuffled = 1 + option_mini_campaign = 2 + option_blitz = 5 + option_gauntlet = 6 + option_grid = 9 + option_golden_path = 10 + option_hopscotch = 11 + option_custom = 99 + default = option_golden_path + + +class MaximumCampaignSize(Range): + """ + Sets an upper bound on how many missions to include when a variable-size mission order is selected. + If a set-size mission order is selected, does nothing. + """ + display_name = "Maximum Campaign Size" + range_start = 1 + range_end = len(SC2Mission) + default = 83 + + +class TwoStartPositions(Toggle): + """ + If turned on and 'grid', 'hopscotch', or 'golden_path' mission orders are selected, + removes the first mission and allows both of the next two missions to be played from the start. + """ + display_name = "Two start missions" + default = Toggle.option_false + + +class KeyMode(Choice): + """ + Optionally creates Key items that must be found in the multiworld to unlock parts of the mission order, + in addition to any regular requirements a mission may have. + + "Questline" options will only work for Vanilla, Vanilla Shuffled, Mini Campaign, and Golden Path mission orders. + + Disabled: Don't create any keys. + Questlines: Create keys for questlines besides the starter ones, eg. "Colonist (Wings of Liberty) Questline Key". + Missions: Create keys for missions besides the starter ones, eg. "Zero Hour Mission Key". + Progressive Questlines: Create one type of progressive key for questlines within each campaign, eg. "Progressive Key #1". + Progressive Missions: Create one type of progressive key for all missions, "Progressive Mission Key". + Progressive Per Questline: All questlines besides the starter ones get a unique progressive key for their missions, eg. "Progressive Key #1". + """ + display_name = "Key Mode" + option_disabled = 0 + option_questlines = 1 + option_missions = 2 + option_progressive_questlines = 3 + option_progressive_missions = 4 + option_progressive_per_questline = 5 + default = option_disabled + + +class ColorChoice(Choice): + option_white = 0 + option_red = 1 + option_blue = 2 + option_teal = 3 + option_purple = 4 + option_yellow = 5 + option_orange = 6 + option_green = 7 + option_light_pink = 8 + option_violet = 9 + option_light_grey = 10 + option_dark_green = 11 + option_brown = 12 + option_light_green = 13 + option_dark_grey = 14 + option_pink = 15 + option_rainbow = 16 + option_mengsk = 17 + option_bright_lime = 18 + option_arcane = 19 + option_ember = 20 + option_hot_pink = 21 + option_default = 22 + default = option_default + + +class PlayerColorTerranRaynor(ColorChoice): + """Determines in-game player team color in Wings of Liberty missions.""" + display_name = "Terran Player Color (Raynor)" + + +class PlayerColorProtoss(ColorChoice): + """Determines in-game player team color in Legacy of the Void missions.""" + display_name = "Protoss Player Color" + + +class PlayerColorZerg(ColorChoice): + """Determines in-game player team color in Heart of the Swarm missions before unlocking Primal Kerrigan.""" + display_name = "Zerg Player Color" + + +class PlayerColorZergPrimal(ColorChoice): + """Determines in-game player team color in Heart of the Swarm after unlocking Primal Kerrigan.""" + display_name = "Zerg Player Color (Primal)" + + +class PlayerColorNova(ColorChoice): + """Determines in-game player team color in Nova Covert Ops missions.""" + display_name = "Terran Player Color (Nova)" + + +class EnabledCampaigns(OptionSet): + """ + Determines which campaign's missions will be used. + Wings of Liberty, Prophecy, and Prologue are the only free-to-play campaigns. + Valid campaign names: + - 'Wings of Liberty' + - 'Prophecy' + - 'Heart of the Swarm' + - 'Whispers of Oblivion (Legacy of the Void: Prologue)' + - 'Legacy of the Void' + - 'Into the Void (Legacy of the Void: Epilogue)' + - 'Nova Covert Ops' + """ + display_name = "Enabled Campaigns" + valid_keys = {campaign.campaign_name for campaign in SC2Campaign if campaign != SC2Campaign.GLOBAL} + default = set((SC2Campaign.WOL.campaign_name,)) + + +class EnableRaceSwapVariants(Choice): + """ + Allow mission variants where you play a faction other than the one the map was initially + designed for. NOTE: Cutscenes are always skipped on race-swapped mission variants. + + Disabled: Don't shuffle any non-vanilla map variants into the pool. + Pick One: Shuffle up to 1 valid version of each map into the pool, depending on other settings. + Pick One Non-Vanilla: Shuffle up to 1 valid version other than the original one of each map into the pool, depending on other settings. + Shuffle All: Each version of a map can appear in the same pool (so a map can appear up to 3 times as different races) + Shuffle All Non-Vanilla: Each version of a map besides the original can appear in the same pool (so a map can appear up to 2 times as different races) + """ + display_name = "Enable Race-Swapped Mission Variants" + option_disabled = 0 + option_pick_one = 1 + option_pick_one_non_vanilla = 2 + option_shuffle_all = 3 + option_shuffle_all_non_vanilla = 4 + default = option_disabled + + +class EnableMissionRaceBalancing(Choice): + """ + If enabled, picks missions in such a way that the appearance rate of races is roughly equal. + The final rates may deviate if there are not enough missions enabled to accommodate each race. + + Disabled: Pick missions at random. + Semi Balanced: Use a weighting system to pick missions in a random, but roughly equal ratio. + Fully Balanced: Pick missions to preserve equal race counts whenever possible. + """ + display_name = "Enable Mission Race Balancing" + option_disabled = 0 + option_semi_balanced = 1 + option_fully_balanced = 2 + default = option_semi_balanced + + +class ShuffleCampaigns(DefaultOnToggle): + """ + Shuffles the missions between campaigns if enabled. + Only available for Vanilla Shuffled and Mini Campaign mission order + """ + display_name = "Shuffle Campaigns" + + +class ShuffleNoBuild(DefaultOnToggle): + """ + Determines if the no-build missions are included in the shuffle. + If turned off, the no-build missions will not appear. Has no effect for Vanilla mission order. + """ + display_name = "Shuffle No-Build Missions" + + +class StarterUnit(Choice): + """ + Unlocks a random unit at the start of the game. + + Off: No units are provided, the first unit must be obtained from the randomizer + Balanced: A unit that doesn't give the player too much power early on is given + Any Starter Unit: Any starter unit can be given + """ + display_name = "Starter Unit" + option_off = 0 + option_balanced = 1 + option_any_starter_unit = 2 + + +class RequiredTactics(Choice): + """ + Determines the maximum tactical difficulty of the world (separate from mission difficulty). + Higher settings increase randomness. + + Standard: All missions can be completed with good micro and macro. + Advanced: Completing missions may require relying on starting units and micro-heavy units. + Any Units: Logic guarantees faction-appropriate units appear early without regard to what those units are. + i.e. if the third mission is a protoss build mission, + logic guarantees at least 2 protoss units are reachable before starting it. + May render the run impossible on harder difficulties. + No Logic: Units and upgrades may be placed anywhere. LIKELY TO RENDER THE RUN IMPOSSIBLE ON HARDER DIFFICULTIES! + Locks Grant Story Tech option to true. + """ + display_name = "Required Tactics" + option_standard = 0 + option_advanced = 1 + option_any_units = 2 + option_no_logic = 3 + + +class EnableVoidTrade(Toggle): + """ + Enables the Void Trade Wormhole to be built from the Advanced Construction tab of SCVs, Drones and Probes. + This structure allows sending units to the Archipelago server, as well as buying random units from the server. + + Note: Always disabled if there is no other Starcraft II world with Void Trade enabled in the multiworld. You cannot receive units that you send. + """ + display_name = "Enable Void Trade" + + +class VoidTradeAgeLimit(Choice): + """ + Determines the maximum allowed age for units you can receive from Void Trade. + Units that are older than your choice will still be available to other players, but not to you. + + This does not put a time limit on units you send to other players. Your own units are only affected by other players' choices for this option. + """ + display_name = "Void Trade Age Limit" + option_disabled = 0 + option_1_week = 1 + option_1_day = 2 + option_4_hours = 3 + option_2_hours = 4 + option_1_hour = 5 + option_30_minutes = 6 + option_5_minutes = 7 + default = option_30_minutes + + +class VoidTradeWorkers(Toggle): + """ + If enabled, you are able to send and receive workers via Void Trade. + + Sending workers is a cheap way to get a lot of units from other players, + at the cost of reducing the strength of received units for other players. + + Receiving workers allows you to build units of other races, but potentially skips large parts of your multiworld progression. + """ + display_name = "Allow Workers in Void Trade" + + +class MaxUpgradeLevel(Range): + """Controls the maximum number of weapon/armor upgrades that can be found or unlocked.""" + display_name = "Maximum Upgrade Level" + range_start = 3 + range_end = 5 + default = 3 + + +class GenericUpgradeMissions(Range): + """ + Determines the percentage of missions in the mission order that must be completed before + level 1 of all weapon and armor upgrades is unlocked. Level 2 upgrades require double the amount of missions, + and level 3 requires triple the amount. The required amounts are always rounded down. + If set to 0, upgrades are instead added to the item pool and must be found to be used. + + If the mission order is unable to be beaten by this value (if above 0), the generator will place additional + weapon / armor upgrades into start inventory + """ + display_name = "Generic Upgrade Missions" + range_start = 0 + range_end = 100 # Higher values lead to fails often + default = 0 + + +class GenericUpgradeResearch(Choice): + """Determines how weapon and armor upgrades affect missions once unlocked. + + Vanilla: Upgrades must be researched as normal. + Auto In No-Build: In No-Build missions, upgrades are automatically researched. + In all other missions, upgrades must be researched as normal. + Auto In Build: In No-Build missions, upgrades are unavailable as normal. + In all other missions, upgrades are automatically researched. + Always Auto: Upgrades are automatically researched in all missions.""" + display_name = "Generic Upgrade Research" + option_vanilla = 0 + option_auto_in_no_build = 1 + option_auto_in_build = 2 + option_always_auto = 3 + + +class GenericUpgradeResearchSpeedup(Toggle): + """ + If turned on, the weapon and armor upgrades are researched more quickly if level 4 or higher is unlocked. + The research times of upgrades are cut proportionally, so you're able to hit the maximum available level + at the same time, as you'd hit level 3 normally. + + Turning this on will help you to be able to research level 4 or 5 upgrade levels in timed missions. + + Has no effect if Maximum Upgrade Level is set to 3 + or Generic Upgrade Research doesn't require you to research upgrades in build missions. + """ + display_name = "Generic Upgrade Research Speedup" + + +class GenericUpgradeItems(Choice): + """Determines how weapon and armor upgrades are split into items. + + All options produce a number of levels of each item equal to the Maximum Upgrade Level. + The examples below consider a Maximum Upgrade Level of 3. + + Does nothing if upgrades are unlocked by completed mission counts. + + Individual Items: All weapon and armor upgrades are each an item, + resulting in 18 total upgrade items for Terran and 15 total items for Zerg and Protoss each. + Bundle Weapon And Armor: All types of weapon upgrades are one item per race, + and all types of armor upgrades are one item per race, + resulting in 18 total items. + Bundle Unit Class: Weapon and armor upgrades are merged, + but upgrades are bundled separately for each race: + Infantry, Vehicle, and Starship upgrades for Terran (9 items), + Ground and Flyer upgrades for Zerg (6 items), + Ground and Air upgrades for Protoss (6 items), + resulting in 21 total items. + Bundle All: All weapon and armor upgrades are one item per race, + resulting in 9 total items.""" + display_name = "Generic Upgrade Items" + option_individual_items = 0 + option_bundle_weapon_and_armor = 1 + option_bundle_unit_class = 2 + option_bundle_all = 3 + + +class VanillaItemsOnly(Toggle): + """If turned on, the item pool is limited only to items that appear in the main 3 vanilla campaigns. + Weapon/Armor upgrades are unaffected; use max_upgrade_level to control maximum level. + Locked Items may override these exclusions.""" + display_name = "Vanilla Items Only" + + +class ExcludeOverpoweredItems(Toggle): + """ + If turned on, a curated list of very strong items are excluded. + These items were selected for promoting repetitive strategies, or for providing a lot of power in a boring way. + Recommended off for players looking for a challenge or for repeat playthroughs. + Excluding an OP item overrides the exclusion from this item rather than add to it. + OP items may be unexcluded or locked with Unexcluded Items or Locked Items options. + Enabling this can force a unit nerf even if Allow Unit Nerfs is set to false for some units. + """ + display_name = "Exclude Overpowered Items" + + +# Current maximum number of upgrades for a unit +MAX_UPGRADES_OPTION = 13 + + +class EnsureGenericItems(Range): + """ + Specifies a minimum percentage of the generic item pool that will be present for the slot. + The generic item pool is the pool of all generically useful items after all exclusions. + Generically-useful items include: Worker upgrades, Building upgrades, economy upgrades, + Mercenaries, Kerrigan levels and abilities, and Spear of Adun abilities + Increasing this percentage will make units less common. + """ + display_name = "Ensure Generic Items" + range_start = 0 + range_end = 100 + default = 25 + + +class MinNumberOfUpgrades(Range): + """ + Set a minimum to the number of upgrade items a unit/structure can have. + Note that most units have 4 to 6 upgrades. + If a unit has fewer upgrades than the minimum, it will have all of its upgrades. + + Doesn't affect shared unit upgrades. + """ + display_name = "Minimum number of upgrades per unit/structure" + range_start = 0 + range_end = MAX_UPGRADES_OPTION + default = 2 + + +class MaxNumberOfUpgrades(Range): + """ + Set a maximum to the number of upgrade items a unit/structure can have. + -1 is used to define unlimited. + Note that most units have 4 to 6 upgrades. + + Doesn't affect shared unit upgrades. + """ + display_name = "Maximum number of upgrades per unit/structure" + range_start = -1 + range_end = MAX_UPGRADES_OPTION + default = -1 + + +class MercenaryHighlanders(DefaultOnToggle): + """ + If enabled, it limits the controllable amount of certain mercenaries to 1, even if you have unlimited mercenaries upgrade. + With this upgrade you can still call the mercenary again if it dies. + + Affected mercenaries: Jackson's Revenge (Battlecruiser), Wise Old Torrasque (Ultralisk) + """ + display_name = "Mercenary Highlanders" + + +class KerriganPresence(Choice): + """ + Determines whether Kerrigan is playable outside of missions that require her. + + Vanilla: Kerrigan is playable as normal, appears in the same missions as in vanilla game. + Not Present: Kerrigan is not playable, unless the mission requires her to be present. Other hero units stay playable, + and locations normally requiring Kerrigan can be checked by any unit. + Kerrigan level items, active abilities and passive abilities affecting her will not appear. + In missions where the Kerrigan unit is required, story abilities are given in same way as Grant Story Tech is set to true + + Note: Always set to "Not Present" if Heart of the Swarm campaign is disabled. + """ + display_name = "Kerrigan Presence" + option_vanilla = 0 + option_not_present = 1 + + +class KerriganLevelsPerMissionCompleted(Range): + """ + Determines how many levels Kerrigan gains when a mission is beaten. + """ + display_name = "Levels Per Mission Beaten" + range_start = 0 + range_end = 20 + default = 0 + + +class KerriganLevelsPerMissionCompletedCap(Range): + """ + Limits how many total levels Kerrigan can gain from beating missions. This does not affect levels gained from items. + Set to -1 to disable this limit. + + NOTE: The following missions have these level requirements: + Supreme: 35 + The Infinite Cycle: 70 + See Grant Story Levels for more details. + """ + display_name = "Levels Per Mission Beaten Cap" + range_start = -1 + range_end = 140 + default = -1 + + +class KerriganLevelItemSum(Range): + """ + Determines the sum of the level items in the world. This does not affect levels gained from beating missions. + + NOTE: The following missions have these level requirements: + Supreme: 35 + The Infinite Cycle: 70 + See Grant Story Levels for more details. + """ + display_name = "Kerrigan Level Item Sum" + range_start = 0 + range_end = 140 + default = 70 + + +class KerriganLevelItemDistribution(Choice): + """Determines the amount and size of Kerrigan level items. + + Vanilla: Uses the distribution in the vanilla campaign. + This entails 32 individual levels and 6 packs of varying sizes. + This distribution always adds up to 70, ignoring the Level Item Sum setting. + Smooth: Uses a custom, condensed distribution of 10 items between sizes 4 and 10, + intended to fit more levels into settings with little room for filler while keeping some variance in level gains. + This distribution always adds up to 70, ignoring the Level Item Sum setting. + Size 70: Uses items worth 70 levels each. + Size 35: Uses items worth 35 levels each. + Size 14: Uses items worth 14 levels each. + Size 10: Uses items worth 10 levels each. + Size 7: Uses items worth 7 levels each. + Size 5: Uses items worth 5 levels each. + Size 2: Uses items worth 2 level eachs. + Size 1: Uses individual levels. As there are not enough locations in the game for this distribution, + this will result in a greatly reduced total level, and is likely to remove many other items.""" + display_name = "Kerrigan Level Item Distribution" + option_vanilla = 0 + option_smooth = 1 + option_size_70 = 2 + option_size_35 = 3 + option_size_14 = 4 + option_size_10 = 5 + option_size_7 = 6 + option_size_5 = 7 + option_size_2 = 8 + option_size_1 = 9 + default = option_smooth + + +class KerriganTotalLevelCap(Range): + """ + Limits how many total levels Kerrigan can gain from any source. + Depending on your other settings, there may be more levels available in the world, + but they will not affect Kerrigan. + Set to -1 to disable this limit. + + NOTE: The following missions have these level requirements: + Supreme: 35 + The Infinite Cycle: 70 + See Grant Story Levels for more details. + """ + display_name = "Total Level Cap" + range_start = -1 + range_end = 140 + default = -1 + + +class StartPrimaryAbilities(Range): + """Number of Primary Abilities (Kerrigan Tier 1, 2, and 4) to start the game with. + If set to 4, a Tier 7 ability is also included.""" + display_name = "Starting Primary Abilities" + range_start = 0 + range_end = 4 + default = 0 + + +class KerriganPrimalStatus(Choice): + """Determines when Kerrigan appears in her Primal Zerg form. + This greatly increases her energy regeneration. + + Vanilla: Kerrigan is human in missions that canonically appear before The Crucible, + and zerg thereafter. + Always Zerg: Kerrigan is always zerg. + Always Human: Kerrigan is always human. + Level 35: Kerrigan is human until reaching level 35, and zerg thereafter. + Half Completion: Kerrigan is human until half of the missions in the world are completed, + and zerg thereafter. + Item: Kerrigan's Primal Form is an item. She is human until it is found, and zerg thereafter.""" + display_name = "Kerrigan Primal Status" + option_vanilla = 0 + option_always_zerg = 1 + option_always_human = 2 + option_level_35 = 3 + option_half_completion = 4 + option_item = 5 + + +class KerriganMaxActiveAbilities(Range): + """ + Determines the maximum number of Kerrigan active abilities that can be present in the game + Additional abilities may spawn if those are required to beat the game. + """ + display_name = "Kerrigan Maximum Active Abilities" + range_start = 0 + range_end = len(kerrigan_active_abilities) + default = range_end + + +class KerriganMaxPassiveAbilities(Range): + """ + Determines the maximum number of Kerrigan passive abilities that can be present in the game + Additional abilities may spawn if those are required to beat the game. + """ + display_name = "Kerrigan Maximum Passive Abilities" + range_start = 0 + range_end = len(kerrigan_passives) + default = range_end + + +class EnableMorphling(Toggle): + """ + Determines whether the player can build Morphlings, which allow for inefficient morphing of advanced units + like Ravagers and Lurkers without requiring the base unit to be unlocked first. + """ + display_name = "Enable Morphling" + + +class WarCouncilNerfs(Toggle): + """ + Controls whether most Protoss units can initially be found in a nerfed state, with upgrades restoring their stronger power level. + For example, nerfed Zealots will lack the whirlwind upgrade until it is found as an item. + """ + display_name = "Allow Unit Nerfs" + + +class SpearOfAdunPresence(Choice): + """ + Determines in which missions Spear of Adun calldowns will be available. + Affects only abilities used from Spear of Adun top menu. + + Not Present: Spear of Adun calldowns are unavailable. + Vanilla: Spear of Adun calldowns are only available where they appear in the basegame (Protoss missions after The Growing Shadow) + Protoss: Spear of Adun calldowns are available in any Protoss mission + Everywhere: Spear of Adun calldowns are available in any mission of any race + Any Race LotV: Spear of Adun calldowns are available in any race-swapped variant of a LotV mission + """ + display_name = "Spear of Adun Presence" + option_not_present = 0 + option_vanilla = 4 + option_protoss = 2 + option_everywhere = 3 + option_any_race_lotv = 1 + default = option_vanilla + + # Fix case + @classmethod + def get_option_name(cls, value: int) -> str: + if value == SpearOfAdunPresence.option_any_race_lotv: + return "Any Race LotV" + else: + return super().get_option_name(value) + + +class SpearOfAdunPresentInNoBuild(Toggle): + """ + Determines if Spear of Adun calldowns are available in no-build missions. + + If turned on, Spear of Adun calldown powers are available in missions specified under "Spear of Adun Presence". + If turned off, Spear of Adun calldown powers are unavailable in all no-build missions + """ + display_name = "Spear of Adun Present in No-Build" + + +class SpearOfAdunPassiveAbilityPresence(Choice): + """ + Determines availability of Spear of Adun passive powers. + Affects abilities like Reconstruction Beam or Overwatch. + Does not affect building abilities like Orbital Assimilators or Warp Harmonization. + + Not Present: Autocasts are not available. + Vanilla: Spear of Adun calldowns are only available where it appears in the basegame (Protoss missions after The Growing Shadow) + Protoss: Spear of Adun autocasts are available in any Protoss mission + Everywhere: Spear of Adun autocasts are available in any mission of any race + Any Race LotV: Spear of Adun autocasts are available in any race-swapped variant of a LotV mission + """ + display_name = "Spear of Adun Passive Ability Presence" + option_not_present = 0 + option_any_race_lotv = 1 + option_protoss = 2 + option_everywhere = 3 + option_vanilla = 4 + default = option_vanilla + + # Fix case + @classmethod + def get_option_name(cls, value: int) -> str: + if value == SpearOfAdunPresence.option_any_race_lotv: + return "Any Race LotV" + else: + return super().get_option_name(value) + + +class SpearOfAdunPassivesPresentInNoBuild(Toggle): + """ + Determines if Spear of Adun autocasts are available in no-build missions. + + If turned on, Spear of Adun autocasts are available in missions specified under "Spear of Adun Passive Ability Presence". + If turned off, Spear of Adun autocasts are unavailable in all no-build missions + """ + display_name = "Spear of Adun Passive Abilities Present in No-Build" + + +class SpearOfAdunMaxActiveAbilities(Range): + """ + Determines the maximum number of Spear of Adun active abilities (top bar) that can be present in the game + Additional abilities may spawn if those are required to beat the game. + + Note: Warp in Reinforcements is treated as a second level of Warp in Pylon + """ + display_name = "Spear of Adun Maximum Active Abilities" + range_start = 0 + range_end = sum([item.quantity for item_name, item in item_tables.get_full_item_list().items() if item_name in item_tables.spear_of_adun_calldowns]) + default = range_end + + +class SpearOfAdunMaxAutocastAbilities(Range): + """ + Determines the maximum number of Spear of Adun passive abilities that can be present in the game + Additional abilities may spawn if those are required to beat the game. + Does not affect building abilities like Orbital Assimilators or Warp Harmonization. + """ + display_name = "Spear of Adun Maximum Passive Abilities" + range_start = 0 + range_end = sum(item.quantity for item_name, item in item_tables.get_full_item_list().items() if item_name in item_tables.spear_of_adun_castable_passives) + default = range_end + + +class GrantStoryTech(Choice): + """ + Controls handling of no-build missions that may require very specific items, such as Kerrigan or Nova abilities. + + no_grant: don't grant anything special; the player must find items to play the missions + grant: grant a minimal inventory that will allow the player to beat the mission, in addition to other items found + allow_substitutes: Reworks the most constrained mission - Supreme - to allow other items to substitute for Leaping Strike and Mend + + Locked to "grant" if Required Tactics is set to no logic. + """ + display_name = "Grant Story Tech" + option_no_grant = 0 + option_grant = 1 + option_allow_substitutes = 2 + + +class GrantStoryLevels(Choice): + """ + If enabled, grants Kerrigan the required minimum levels for the following missions: + Supreme: 35 + The Infinite Cycle: 70 + The bonus levels only apply during the listed missions, and can exceed the Total Level Cap. + + If disabled, either of these missions is included, and there are not enough levels in the world, generation may fail. + To prevent this, either increase the amount of levels in the world, or enable this option. + + If disabled and Required Tactics is set to no logic, this option is forced to Minimum. + + Disabled: Kerrigan does not get bonus levels for these missions, + instead the levels must be gained from items or beating missions. + Additive: Kerrigan gains bonus levels equal to the mission's required level. + Minimum: Kerrigan is either at her real level, or at the mission's required level, + depending on which is higher. + """ + display_name = "Grant Story Levels" + option_disabled = 0 + option_additive = 1 + option_minimum = 2 + default = option_minimum + + +class NovaMaxWeapons(Range): + """ + Determines maximum number of Nova weapons that can be present in the game + Additional weapons may spawn if those are required to beat the game. + + Note: Nova can swap between unlocked weapons anytime during the gameplay. + """ + display_name = "Nova Maximum Weapons" + range_start = 0 + range_end = len(nova_weapons) + default = range_end + + +class NovaMaxGadgets(Range): + """ + Determines maximum number of Nova gadgets that can be present in the game. + Gadgets are a vanilla category including 2 grenade abilities, Stim, Holo Decoy, and Ionic Force Field. + Additional gadgets may spawn if those are required to beat the game. + + Note: Nova can use any unlocked ability anytime during gameplay. + """ + display_name = "Nova Maximum Gadgets" + range_start = 0 + range_end = len(nova_gadgets) + default = range_end + + +class NovaGhostOfAChanceVariant(Choice): + """ + Determines which variant of Nova should be used in Ghost of a Chance mission. + + WoL: Uses Nova from Wings of Liberty campaign (vanilla) + NCO: Uses Nova from Nova Covert Ops campaign + Auto: Uses NCO if a mission from Nova Covert Ops is actually shuffled, if not uses WoL + """ + display_name = "Nova Ghost of Chance Variant" + option_wol = 0 + option_nco = 1 + option_auto = 2 + default = option_wol + + # Fix case + @classmethod + def get_option_name(cls, value: int) -> str: + if value == NovaGhostOfAChanceVariant.option_wol: + return "WoL" + elif value == NovaGhostOfAChanceVariant.option_nco: + return "NCO" + return super().get_option_name(value) + + +class TakeOverAIAllies(Toggle): + """ + On maps supporting this feature allows you to take control over an AI Ally. + """ + display_name = "Take Over AI Allies" + + +class Sc2ItemDict(Option[Dict[str, int]], VerifyKeys, Mapping[str, int]): + """A branch of ItemDict that supports item counts of 0""" + default = {} + supports_weighting = False + verify_item_name = True + # convert_name_groups = True + display_name = 'Unnamed dictionary' + minimum_value: int = 0 + + def __init__(self, value: Dict[str, int]): + self.value = {key: val for key, val in value.items()} + + @classmethod + def from_any(cls, data: Union[List[str], Dict[str, int]]) -> 'Sc2ItemDict': + if isinstance(data, list): + # This is a little default that gets us backwards compatibility with lists. + # It doesn't play nice with trigger merging dicts and lists together, though, so best not to advertise it overmuch. + data = {item: 0 for item in data} + if isinstance(data, dict): + for key, value in data.items(): + if not isinstance(value, int): + raise ValueError(f"Invalid type in '{cls.display_name}': element '{key}' maps to '{value}', expected an integer") + if value < cls.minimum_value: + raise ValueError(f"Invalid value for '{cls.display_name}': element '{key}' maps to {value}, which is less than the minimum ({cls.minimum_value})") + return cls(data) + else: + raise NotImplementedError(f"Cannot Convert from non-dictionary, got {type(data)}") + + def verify(self, world: Type['World'], player_name: str, plando_options: PlandoOptions) -> None: + """Overridden version of function from Options.VerifyKeys for a better error message""" + new_value: dict[str, int] = {} + case_insensitive_group_mapping = { + group_name.casefold(): group_value for group_name, group_value in world.item_name_groups.items() + } + case_insensitive_group_mapping.update({item.casefold(): {item} for item in world.item_names}) + for group_name in self.value: + item_names = case_insensitive_group_mapping.get(group_name.casefold(), {group_name}) + for item_name in item_names: + new_value[item_name] = new_value.get(item_name, 0) + self.value[group_name] + self.value = new_value + for item_name in self.value: + if item_name not in world.item_names: + from .item import item_groups + picks = get_fuzzy_results( + item_name, + list(world.item_names) + list(item_groups.ItemGroupNames.get_all_group_names()), + limit=1, + ) + raise Exception(f"Item {item_name} from option {self} " + f"is not a valid item name from {world.game}. " + f"Did you mean '{picks[0][0]}' ({picks[0][1]}% sure)") + + def get_option_name(self, value): + return ", ".join(f"{key}: {v}" for key, v in value.items()) + + def __getitem__(self, item: str) -> int: + return self.value.__getitem__(item) + + def __iter__(self) -> Iterator[str]: + return self.value.__iter__() + + def __len__(self) -> int: + return self.value.__len__() + + +class Sc2StartInventory(Sc2ItemDict): + """Start with these items.""" + display_name = StartInventory.display_name + + +class LockedItems(Sc2ItemDict): + """Guarantees that these items will be unlockable, in the amount specified. + Specify an amount of 0 to lock all copies of an item.""" + display_name = "Locked Items" + + +class ExcludedItems(Sc2ItemDict): + """Guarantees that these items will not be unlockable, in the amount specified. + Specify an amount of 0 to exclude all copies of an item.""" + display_name = "Excluded Items" + + +class UnexcludedItems(Sc2ItemDict): + """Undoes an item exclusion; useful for whitelisting or fine-tuning a category. + Specify an amount of 0 to unexclude all copies of an item.""" + display_name = "Unexcluded Items" + + +class ExcludedMissions(Sc2MissionSet): + """Guarantees that these missions will not appear in the campaign + Doesn't apply to vanilla mission order. + It may be impossible to build a valid campaign if too many missions are excluded.""" + display_name = "Excluded Missions" + valid_keys = {mission.mission_name for mission in SC2Mission} + + +class DifficultyCurve(Choice): + """ + Determines whether campaign missions will be placed with a smooth difficulty curve. + Standard: The campaign will start with easy missions and end with challenging missions. Short campaigns will be more difficult. + Uneven: The campaign will start with easy missions, but easy missions can still appear later in the campaign. Short campaigns will be easier. + """ + display_name = "Difficulty Curve" + option_standard = 0 + option_uneven = 1 + + +class ExcludeVeryHardMissions(Choice): + """ + Excludes Very Hard missions outside of Epilogue campaign (All-In, The Reckoning, Salvation, and all Epilogue missions are considered Very Hard). + Doesn't apply to "Vanilla" mission order. + + Default: Not excluded for mission orders "Vanilla Shuffled" or "Grid" with Maximum Campaign Size >= 20, + excluded for any other order + Yes: Non-Epilogue Very Hard missions are excluded and won't be generated + No: Non-Epilogue Very Hard missions can appear normally. Not recommended for too short mission orders. + + See also: Excluded Missions, Enabled Campaigns, Maximum Campaign Size + """ + display_name = "Exclude Very Hard Missions" + option_default = 0 + option_true = 1 + option_false = 2 + + @classmethod + def get_option_name(cls, value): + return ["Default", "Yes", "No"][int(value)] + + +class VictoryCache(Range): + """ + Controls how many additional checks are awarded for completing a mission. + Goal missions are unaffected by this option. + """ + display_name = "Victory Cache" + range_start = 0 + range_end = 10 + default = 0 + + +class LocationInclusion(Choice): + option_enabled = 0 + option_half_chance = 3 + option_filler = 1 + option_disabled = 2 + + +class VanillaLocations(LocationInclusion): + """ + Enables or disables checks for completing vanilla objectives. + Vanilla objectives are bonus objectives from the vanilla game, + along with some additional objectives to balance the missions. + Enable these locations for a balanced experience. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Vanilla Locations" + + +class ExtraLocations(LocationInclusion): + """ + Enables or disables checks for mission progress and minor objectives. + This includes mandatory mission objectives, + collecting reinforcements and resource pickups, + destroying structures, and overcoming minor challenges. + Enables these locations to add more checks and items to your world. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Extra Locations" + + +class ChallengeLocations(LocationInclusion): + """ + Enables or disables checks for completing challenge tasks. + Challenges are tasks that are more difficult than completing the mission, and are often based on achievements. + You might be required to visit the same mission later after getting stronger in order to finish these tasks. + Enable these locations to increase the difficulty of completing the multiworld. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Challenge Locations" + + +class MasteryLocations(LocationInclusion): + """ + Enables or disables checks for overcoming especially difficult challenges. + These challenges are often based on Mastery achievements and Feats of Strength. + Enable these locations to add the most difficult checks to the world. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Mastery Locations" + + +class BasebustLocations(LocationInclusion): + """ + Enables or disables checks for killing non-objective bases. + These challenges are about destroying enemy bases that you normally don't have to fight to win a mission. + Enable these locations if you like sieges or being rewarded for achieving alternate win conditions. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + *Note setting this for both challenge and basebust will have a 25% of a challenge-basebust location spawning. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Base-Bust Locations" + + +class SpeedrunLocations(LocationInclusion): + """ + Enables or disables checks for overcoming speedrun challenges. + These challenges are often based on speed achievements or community challenges. + Enable these locations if you want to be rewarded for going fast. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + *Note setting this for both challenge and speedrun will have a 25% of a challenge-speedrun location spawning. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Speedrun Locations" + + +class PreventativeLocations(LocationInclusion): + """ + Enables or disables checks for overcoming preventative challenges. + These challenges are about winning or achieving something while preventing something else from happening, + such as beating Evacuation without losing a colonist. + Enable these locations if you want to be rewarded for achieving a higher standard on some locations. + + Enabled: Locations of this type give normal rewards. + Half Chance: Locations of this type have a 50% chance of being excluded. + *Note setting this for both challenge and preventative will have a 25% of a challenge-preventative location spawning. + Filler: Forces these locations to contain filler items. + Disabled: Removes item rewards from these locations. + + Note: Individual locations subject to plando are always enabled, so the plando can be placed properly. + See also: Excluded Locations, Item Plando (https://archipelago.gg/tutorial/Archipelago/plando/en#item-plando) + """ + display_name = "Preventative Locations" + + +class MissionOrderScouting(Choice): + """ + Allow the Sc2 mission order client tabs to indicate the type of item (i.e., progression, useful, etc.) available at each location of a mission. + The option defines when this information will be available for the player. + By default, this option is deactivated. + + None: Never provide information + Completed: Only for missions that were completed + Available: Only for missions that are available to play + Layout: Only for missions that are in an accessible layout (e.g. Char, Mar Sara, etc.) + Campaign: Only for missions that are in an accessible campaign (e.g. WoL, HotS, etc.) + All: All missions + """ + display_name = "Mission Order Scouting" + option_none = 0 + option_completed = 1 + option_available = 2 + option_layout = 3 + option_campaign = 4 + option_all = 5 + + default = option_none + + +class FillerPercentage(Range): + """ + Percentage of the item pool filled with filler items. + If the world has more locations than items, additional filler items may be generated. + """ + display_name = "Filler Percentage" + range_start = 0 + range_end = 70 + default = 0 + + +class MineralsPerItem(Range): + """ + Configures how many minerals are given per resource item. + """ + display_name = "Minerals Per Item" + range_start = 0 + range_end = 200 + default = 25 + + +class VespenePerItem(Range): + """ + Configures how much vespene gas is given per resource item. + """ + display_name = "Vespene Per Item" + range_start = 0 + range_end = 200 + default = 25 + + +class StartingSupplyPerItem(Range): + """ + Configures how much starting supply per is given per item. + """ + display_name = "Starting Supply Per Item" + range_start = 0 + range_end = 16 + default = 2 + + +class MaximumSupplyPerItem(Range): + """ + Configures how much the maximum supply limit increases per item. + """ + display_name = "Maximum Supply Per Item" + range_start = 0 + range_end = 10 + default = 1 + + +class MaximumSupplyReductionPerItem(Range): + """ + Configures how much maximum supply is reduced per trap item. + """ + display_name = "Maximum Supply Reduction Per Item" + range_start = 1 + range_end = 10 + default = 1 + + +class LowestMaximumSupply(Range): + """Controls how far max supply reduction traps can reduce maximum supply.""" + display_name = "Lowest Maximum Supply" + range_start = 100 + range_end = 200 + default = 180 + +class ResearchCostReductionPerItem(Range): + """ + Controls how much weapon/armor research cost is cut per research cost filler item. + Affects both minerals and vespene. + """ + display_name = "Upgrade Cost Discount Per Item" + range_start = 0 + range_end = 10 + default = 2 + + +class FillerItemsDistribution(ItemDict): + """ + Controls the relative probability of each filler item being generated over others. + Items that are bound to specific race or option are automatically eliminated. + Kerrigan levels generated this way don't go against Kerrigan level item sum + """ + default = { + item_names.STARTING_MINERALS: 1, + item_names.STARTING_VESPENE: 1, + item_names.STARTING_SUPPLY: 1, + item_names.MAX_SUPPLY: 1, + item_names.SHIELD_REGENERATION: 1, + item_names.BUILDING_CONSTRUCTION_SPEED: 1, + item_names.KERRIGAN_LEVELS_1: 0, + item_names.UPGRADE_RESEARCH_SPEED: 1, + item_names.UPGRADE_RESEARCH_COST: 1, + item_names.REDUCED_MAX_SUPPLY: 0, + } + valid_keys = default.keys() + display_name = "Filler Items Distribution" + + def __init__(self, value: Dict[str, int]): + # Allow zeros that the parent class doesn't allow + if any(item_count < 0 for item_count in value.values()): + raise Exception("Cannot have negative item weight.") + super(ItemDict, self).__init__(value) + + +@dataclass +class Starcraft2Options(PerGameCommonOptions): + start_inventory: Sc2StartInventory # type: ignore + game_difficulty: GameDifficulty + difficulty_damage_modifier: DifficultyDamageModifier + game_speed: GameSpeed + disable_forced_camera: DisableForcedCamera + skip_cutscenes: SkipCutscenes + all_in_map: AllInMap + mission_order: MissionOrder + maximum_campaign_size: MaximumCampaignSize + two_start_positions: TwoStartPositions + key_mode: KeyMode + player_color_terran_raynor: PlayerColorTerranRaynor + player_color_protoss: PlayerColorProtoss + player_color_zerg: PlayerColorZerg + player_color_zerg_primal: PlayerColorZergPrimal + player_color_nova: PlayerColorNova + selected_races: SelectedRaces + enabled_campaigns: EnabledCampaigns + enable_race_swap: EnableRaceSwapVariants + mission_race_balancing: EnableMissionRaceBalancing + shuffle_campaigns: ShuffleCampaigns + shuffle_no_build: ShuffleNoBuild + starter_unit: StarterUnit + required_tactics: RequiredTactics + enable_void_trade: EnableVoidTrade + void_trade_age_limit: VoidTradeAgeLimit + void_trade_workers: VoidTradeWorkers + ensure_generic_items: EnsureGenericItems + min_number_of_upgrades: MinNumberOfUpgrades + max_number_of_upgrades: MaxNumberOfUpgrades + mercenary_highlanders: MercenaryHighlanders + max_upgrade_level: MaxUpgradeLevel + generic_upgrade_missions: GenericUpgradeMissions + generic_upgrade_research: GenericUpgradeResearch + generic_upgrade_research_speedup: GenericUpgradeResearchSpeedup + generic_upgrade_items: GenericUpgradeItems + kerrigan_presence: KerriganPresence + kerrigan_levels_per_mission_completed: KerriganLevelsPerMissionCompleted + kerrigan_levels_per_mission_completed_cap: KerriganLevelsPerMissionCompletedCap + kerrigan_level_item_sum: KerriganLevelItemSum + kerrigan_level_item_distribution: KerriganLevelItemDistribution + kerrigan_total_level_cap: KerriganTotalLevelCap + start_primary_abilities: StartPrimaryAbilities + kerrigan_primal_status: KerriganPrimalStatus + kerrigan_max_active_abilities: KerriganMaxActiveAbilities + kerrigan_max_passive_abilities: KerriganMaxPassiveAbilities + enable_morphling: EnableMorphling + war_council_nerfs: WarCouncilNerfs + spear_of_adun_presence: SpearOfAdunPresence + spear_of_adun_present_in_no_build: SpearOfAdunPresentInNoBuild + spear_of_adun_passive_ability_presence: SpearOfAdunPassiveAbilityPresence + spear_of_adun_passive_present_in_no_build: SpearOfAdunPassivesPresentInNoBuild + spear_of_adun_max_active_abilities: SpearOfAdunMaxActiveAbilities + spear_of_adun_max_passive_abilities: SpearOfAdunMaxAutocastAbilities + grant_story_tech: GrantStoryTech + grant_story_levels: GrantStoryLevels + nova_max_weapons: NovaMaxWeapons + nova_max_gadgets: NovaMaxGadgets + nova_ghost_of_a_chance_variant: NovaGhostOfAChanceVariant + take_over_ai_allies: TakeOverAIAllies + locked_items: LockedItems + excluded_items: ExcludedItems + unexcluded_items: UnexcludedItems + excluded_missions: ExcludedMissions + difficulty_curve: DifficultyCurve + exclude_very_hard_missions: ExcludeVeryHardMissions + vanilla_items_only: VanillaItemsOnly + exclude_overpowered_items: ExcludeOverpoweredItems + victory_cache: VictoryCache + vanilla_locations: VanillaLocations + extra_locations: ExtraLocations + challenge_locations: ChallengeLocations + mastery_locations: MasteryLocations + basebust_locations: BasebustLocations + speedrun_locations: SpeedrunLocations + preventative_locations: PreventativeLocations + filler_percentage: FillerPercentage + minerals_per_item: MineralsPerItem + vespene_per_item: VespenePerItem + starting_supply_per_item: StartingSupplyPerItem + maximum_supply_per_item: MaximumSupplyPerItem + maximum_supply_reduction_per_item: MaximumSupplyReductionPerItem + lowest_maximum_supply: LowestMaximumSupply + research_cost_reduction_per_item: ResearchCostReductionPerItem + filler_items_distribution: FillerItemsDistribution + mission_order_scouting: MissionOrderScouting + + custom_mission_order: CustomMissionOrder + +option_groups = [ + OptionGroup("Difficulty Settings", [ + GameDifficulty, + GameSpeed, + StarterUnit, + RequiredTactics, + WarCouncilNerfs, + DifficultyCurve, + ]), + OptionGroup("Primary Campaign Settings", [ + MissionOrder, + MaximumCampaignSize, + EnabledCampaigns, + EnableRaceSwapVariants, + ShuffleNoBuild, + ]), + OptionGroup("Optional Campaign Settings", [ + KeyMode, + ShuffleCampaigns, + AllInMap, + TwoStartPositions, + SelectedRaces, + ExcludeVeryHardMissions, + EnableMissionRaceBalancing, + ]), + OptionGroup("Unit Upgrades", [ + EnsureGenericItems, + MinNumberOfUpgrades, + MaxNumberOfUpgrades, + MaxUpgradeLevel, + GenericUpgradeMissions, + GenericUpgradeResearch, + GenericUpgradeResearchSpeedup, + GenericUpgradeItems, + ]), + OptionGroup("Kerrigan", [ + KerriganPresence, + GrantStoryLevels, + KerriganLevelsPerMissionCompleted, + KerriganLevelsPerMissionCompletedCap, + KerriganLevelItemSum, + KerriganLevelItemDistribution, + KerriganTotalLevelCap, + StartPrimaryAbilities, + KerriganPrimalStatus, + KerriganMaxActiveAbilities, + KerriganMaxPassiveAbilities, + ]), + OptionGroup("Spear of Adun", [ + SpearOfAdunPresence, + SpearOfAdunPresentInNoBuild, + SpearOfAdunPassiveAbilityPresence, + SpearOfAdunPassivesPresentInNoBuild, + SpearOfAdunMaxActiveAbilities, + SpearOfAdunMaxAutocastAbilities, + ]), + OptionGroup("Nova", [ + NovaMaxWeapons, + NovaMaxGadgets, + NovaGhostOfAChanceVariant, + ]), + OptionGroup("Race Specific Options", [ + EnableMorphling, + MercenaryHighlanders, + ]), + OptionGroup("Check Locations", [ + VictoryCache, + VanillaLocations, + ExtraLocations, + ChallengeLocations, + MasteryLocations, + BasebustLocations, + SpeedrunLocations, + PreventativeLocations, + ]), + OptionGroup("Filler Options", [ + FillerPercentage, + MineralsPerItem, + VespenePerItem, + StartingSupplyPerItem, + MaximumSupplyPerItem, + MaximumSupplyReductionPerItem, + LowestMaximumSupply, + ResearchCostReductionPerItem, + FillerItemsDistribution, + ]), + OptionGroup("Inclusions & Exclusions", [ + LockedItems, + ExcludedItems, + UnexcludedItems, + VanillaItemsOnly, + ExcludeOverpoweredItems, + ExcludedMissions, + ]), + OptionGroup("Advanced Gameplay", [ + MissionOrderScouting, + DifficultyDamageModifier, + TakeOverAIAllies, + EnableVoidTrade, + VoidTradeAgeLimit, + VoidTradeWorkers, + GrantStoryTech, + CustomMissionOrder, + ]), + OptionGroup("Cosmetics", [ + PlayerColorTerranRaynor, + PlayerColorProtoss, + PlayerColorZerg, + PlayerColorZergPrimal, + PlayerColorNova, + ]) +] + +def get_option_value(world: Union['SC2World', None], name: str) -> int: + """ + You should basically never use this unless `world` can be `None`. + Use `world.options..value` instead for better typing, autocomplete, and error messages. + """ + if world is None: + field: Field = [class_field for class_field in fields(Starcraft2Options) if class_field.name == name][0] + if isinstance(field.type, str): + if field.type in globals(): + return globals()[field.type].default + import Options + return Options.__dict__[field.type].default + return field.type.default + + player_option = getattr(world.options, name) + + return player_option.value + + +def get_enabled_races(world: Optional['SC2World']) -> Set[SC2Race]: + race_names = world.options.selected_races.value if world and len(world.options.selected_races.value) > 0 else SelectedRaces.valid_keys + return {race for race in SC2Race if race.get_title() in race_names} + + +def get_enabled_campaigns(world: Optional['SC2World']) -> Set[SC2Campaign]: + if world is None: + return {campaign for campaign in SC2Campaign if campaign.campaign_name in EnabledCampaigns.default} + campaign_names = world.options.enabled_campaigns + campaigns = {campaign for campaign in SC2Campaign if campaign.campaign_name in campaign_names} + if (world.options.mission_order.value == MissionOrder.option_vanilla + and get_enabled_races(world) != {SC2Race.TERRAN, SC2Race.ZERG, SC2Race.PROTOSS} + and SC2Campaign.EPILOGUE in campaigns + ): + campaigns.remove(SC2Campaign.EPILOGUE) + if len(campaigns) == 0: + # Everything is disabled, roll as everything enabled + return {campaign for campaign in SC2Campaign if campaign != SC2Campaign.GLOBAL} + return campaigns + + +def get_disabled_campaigns(world: 'SC2World') -> Set[SC2Campaign]: + all_campaigns = set(SC2Campaign) + enabled_campaigns = get_enabled_campaigns(world) + disabled_campaigns = all_campaigns.difference(enabled_campaigns) + disabled_campaigns.remove(SC2Campaign.GLOBAL) + return disabled_campaigns + + +def get_disabled_flags(world: 'SC2World') -> MissionFlag: + excluded = ( + (MissionFlag.Terran | MissionFlag.Zerg | MissionFlag.Protoss) + ^ functools.reduce(lambda a, b: a | b, [race.get_mission_flag() for race in get_enabled_races(world)]) + ) + # filter out no-build missions + if not world.options.shuffle_no_build.value: + excluded |= MissionFlag.NoBuild + raceswap_option = world.options.enable_race_swap.value + if raceswap_option == EnableRaceSwapVariants.option_disabled: + excluded |= MissionFlag.RaceSwap + elif raceswap_option in [EnableRaceSwapVariants.option_pick_one_non_vanilla, EnableRaceSwapVariants.option_shuffle_all_non_vanilla]: + excluded |= MissionFlag.HasRaceSwap + # TODO: add more flags to potentially exclude once we have a way to get that from the player + return MissionFlag(excluded) + + +def get_excluded_missions(world: 'SC2World') -> Set[SC2Mission]: + mission_order_type = world.options.mission_order.value + excluded_mission_names = world.options.excluded_missions.value + disabled_campaigns = get_disabled_campaigns(world) + disabled_flags = get_disabled_flags(world) + + excluded_missions: Set[SC2Mission] = set([lookup_name_to_mission[name] for name in excluded_mission_names]) + + # Excluding Very Hard missions depending on options + if (mission_order_type != MissionOrder.option_vanilla and + ( + world.options.exclude_very_hard_missions == ExcludeVeryHardMissions.option_true + or ( + world.options.exclude_very_hard_missions == ExcludeVeryHardMissions.option_default + and ( + ( + mission_order_type in dynamic_mission_orders + and world.options.maximum_campaign_size < 20 + ) + or mission_order_type == MissionOrder.option_mini_campaign + ) + ) + ) + ): + excluded_missions = excluded_missions.union( + [mission for mission in SC2Mission if + mission.pool == MissionPools.VERY_HARD and mission.campaign != SC2Campaign.EPILOGUE] + ) + # Omitting missions with flags we don't want + if disabled_flags: + excluded_missions = excluded_missions.union(get_missions_with_any_flags_in_list(disabled_flags)) + # Omitting missions not in enabled campaigns + for campaign in disabled_campaigns: + excluded_missions = excluded_missions.union(campaign_mission_table[campaign]) + # Omitting unwanted mission variants + if world.options.enable_race_swap.value in [EnableRaceSwapVariants.option_pick_one, EnableRaceSwapVariants.option_pick_one_non_vanilla]: + swaps = [ + mission for mission in SC2Mission + if mission not in excluded_missions + and mission.flags & (MissionFlag.HasRaceSwap|MissionFlag.RaceSwap) + ] + while len(swaps) > 0: + curr = swaps[0] + variants = [mission for mission in swaps if mission.map_file == curr.map_file] + variants.sort(key=lambda mission: mission.id) + swaps = [mission for mission in swaps if mission not in variants] + if len(variants) > 1: + variants.pop(world.random.randint(0, len(variants)-1)) + excluded_missions = excluded_missions.union(variants) + + return excluded_missions + + +def is_mission_in_soa_presence( + spear_of_adun_presence: int, + mission: SC2Mission, + option_class: Type[SpearOfAdunPresence] | Type[SpearOfAdunPassiveAbilityPresence] = SpearOfAdunPresence +) -> bool: + """ + Returns True if the mission can have Spear of Adun abilities. + No-build presence must be checked separately. + """ + return ( + (spear_of_adun_presence == option_class.option_everywhere) + or (spear_of_adun_presence == option_class.option_protoss and MissionFlag.Protoss in mission.flags) + or (spear_of_adun_presence == option_class.option_any_race_lotv + and (mission.campaign == SC2Campaign.LOTV or MissionFlag.VanillaSoa in mission.flags) + ) + or (spear_of_adun_presence == option_class.option_vanilla + and (MissionFlag.VanillaSoa in mission.flags # Keeps SOA off on Growing Shadow, as that's vanilla behaviour + or (MissionFlag.NoBuild in mission.flags and mission.campaign == SC2Campaign.LOTV) + ) + ) + ) + + + +static_mission_orders = [ + MissionOrder.option_vanilla, + MissionOrder.option_vanilla_shuffled, + MissionOrder.option_mini_campaign, +] + +dynamic_mission_orders = [ + MissionOrder.option_golden_path, + MissionOrder.option_grid, + MissionOrder.option_gauntlet, + MissionOrder.option_blitz, + MissionOrder.option_hopscotch, +] + +LEGACY_GRID_ORDERS = {3, 4, 8} # Medium Grid, Mini Grid, and Tiny Grid respectively + +kerrigan_unit_available = [ + KerriganPresence.option_vanilla, +] + +# Names of upgrades to be included for different options +upgrade_included_names: Dict[int, Set[str]] = { + GenericUpgradeItems.option_individual_items: { + item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, + item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, + item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, + item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, + item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR, + item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, + item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, + item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, + item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, + item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE, + item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, + item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, + item_names.PROGRESSIVE_PROTOSS_SHIELDS, + item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, + item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, + }, + GenericUpgradeItems.option_bundle_weapon_and_armor: { + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE, + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE, + }, + GenericUpgradeItems.option_bundle_unit_class: { + item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE, + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE, + item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE, + item_names.PROGRESSIVE_ZERG_GROUND_UPGRADE, + item_names.PROGRESSIVE_ZERG_FLYER_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE, + }, + GenericUpgradeItems.option_bundle_all: { + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, + } +} + +# Mapping trade age limit options to their millisecond equivalents +void_trade_age_limits_ms: Dict[int, int] = { + VoidTradeAgeLimit.option_5_minutes: 1000 * int(timedelta(minutes = 5).total_seconds()), + VoidTradeAgeLimit.option_30_minutes: 1000 * int(timedelta(minutes = 30).total_seconds()), + VoidTradeAgeLimit.option_1_hour: 1000 * int(timedelta(hours = 1).total_seconds()), + VoidTradeAgeLimit.option_2_hours: 1000 * int(timedelta(hours = 2).total_seconds()), + VoidTradeAgeLimit.option_4_hours: 1000 * int(timedelta(hours = 4).total_seconds()), + VoidTradeAgeLimit.option_1_day: 1000 * int(timedelta(days = 1).total_seconds()), + VoidTradeAgeLimit.option_1_week: 1000 * int(timedelta(weeks = 1).total_seconds()), +} diff --git a/worlds/sc2/pool_filter.py b/worlds/sc2/pool_filter.py new file mode 100644 index 0000000000..31e47934ee --- /dev/null +++ b/worlds/sc2/pool_filter.py @@ -0,0 +1,493 @@ +import logging +from typing import Callable, Dict, List, Set, Tuple, TYPE_CHECKING, Iterable + +from BaseClasses import Location, ItemClassification +from .item import StarcraftItem, ItemFilterFlags, item_names, item_parents, item_groups +from .item.item_tables import item_table, TerranItemType, ZergItemType, spear_of_adun_calldowns, \ + spear_of_adun_castable_passives +from .options import RequiredTactics + +if TYPE_CHECKING: + from . import SC2World + + +# Items that can be placed before resources if not already in +# General upgrades and Mercs +second_pass_placeable_items: Tuple[str, ...] = ( + # Global weapon/armor upgrades + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE, + item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_PROTOSS_SHIELDS, + # Terran Buildings without upgrades + item_names.SENSOR_TOWER, + item_names.HIVE_MIND_EMULATOR, + item_names.PSI_DISRUPTER, + item_names.PERDITION_TURRET, + # General Terran upgrades without any dependencies + item_names.SCV_ADVANCED_CONSTRUCTION, + item_names.SCV_DUAL_FUSION_WELDERS, + item_names.SCV_CONSTRUCTION_JUMP_JETS, + item_names.PROGRESSIVE_FIRE_SUPPRESSION_SYSTEM, + item_names.PROGRESSIVE_ORBITAL_COMMAND, + item_names.ULTRA_CAPACITORS, + item_names.VANADIUM_PLATING, + item_names.ORBITAL_DEPOTS, + item_names.MICRO_FILTERING, + item_names.AUTOMATED_REFINERY, + item_names.COMMAND_CENTER_COMMAND_CENTER_REACTOR, + item_names.COMMAND_CENTER_SCANNER_SWEEP, + item_names.COMMAND_CENTER_MULE, + item_names.COMMAND_CENTER_EXTRA_SUPPLIES, + item_names.TECH_REACTOR, + item_names.CELLULAR_REACTOR, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, # Place only L1 + item_names.STRUCTURE_ARMOR, + item_names.HI_SEC_AUTO_TRACKING, + item_names.ADVANCED_OPTICS, + item_names.ROGUE_FORCES, + # Mercenaries (All races) + *[item_name for item_name, item_data in item_table.items() + if item_data.type in (TerranItemType.Mercenary, ZergItemType.Mercenary)], + # Kerrigan and Nova levels, abilities and generally useful stuff + *[item_name for item_name, item_data in item_table.items() + if item_data.type in ( + ZergItemType.Level, + ZergItemType.Ability, + ZergItemType.Evolution_Pit, + TerranItemType.Nova_Gear + )], + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, + # Zerg static defenses + item_names.SPORE_CRAWLER, + item_names.SPINE_CRAWLER, + # Overseer + item_names.OVERLORD_OVERSEER_ASPECT, + # Spear of Adun Abilities + item_names.SOA_CHRONO_SURGE, + item_names.SOA_PROGRESSIVE_PROXY_PYLON, + item_names.SOA_PYLON_OVERCHARGE, + item_names.SOA_ORBITAL_STRIKE, + item_names.SOA_TEMPORAL_FIELD, + item_names.SOA_SOLAR_LANCE, + item_names.SOA_MASS_RECALL, + item_names.SOA_SHIELD_OVERCHARGE, + item_names.SOA_DEPLOY_FENIX, + item_names.SOA_PURIFIER_BEAM, + item_names.SOA_TIME_STOP, + item_names.SOA_SOLAR_BOMBARDMENT, + # Protoss generic upgrades + item_names.MATRIX_OVERLOAD, + item_names.QUATRO, + item_names.NEXUS_OVERCHARGE, + item_names.ORBITAL_ASSIMILATORS, + item_names.WARP_HARMONIZATION, + item_names.GUARDIAN_SHELL, + item_names.RECONSTRUCTION_BEAM, + item_names.OVERWATCH, + item_names.SUPERIOR_WARP_GATES, + item_names.KHALAI_INGENUITY, + item_names.AMPLIFIED_ASSIMILATORS, + # Protoss static defenses + item_names.PHOTON_CANNON, + item_names.KHAYDARIN_MONOLITH, + item_names.SHIELD_BATTERY, +) + + +def copy_item(item: StarcraftItem) -> StarcraftItem: + return StarcraftItem(item.name, item.classification, item.code, item.player, item.filter_flags) + + +class ValidInventory: + def __init__(self, world: 'SC2World', item_pool: List[StarcraftItem]) -> None: + self.multiworld = world.multiworld + self.player = world.player + self.world: 'SC2World' = world + # Track all Progression items and those with complex rules for filtering + self.logical_inventory: Dict[str, int] = {} + for item in item_pool: + if not item_table[item.name].is_important_for_filtering(): + continue + self.logical_inventory.setdefault(item.name, 0) + self.logical_inventory[item.name] += 1 + self.item_pool = item_pool + self.item_name_to_item: Dict[str, List[StarcraftItem]] = {} + self.item_name_to_child_items: Dict[str, List[StarcraftItem]] = {} + for item in item_pool: + self.item_name_to_item.setdefault(item.name, []).append(item) + for parent_item in item_parents.child_item_to_parent_items.get(item.name, []): + self.item_name_to_child_items.setdefault(parent_item, []).append(item) + + def has(self, item: str, player: int, count: int = 1) -> bool: + return self.logical_inventory.get(item, 0) >= count + + def has_any(self, items: Set[str], player: int) -> bool: + return any(self.logical_inventory.get(item) for item in items) + + def has_all(self, items: Set[str], player: int) -> bool: + return all(self.logical_inventory.get(item) for item in items) + + def has_group(self, item_group: str, player: int, count: int = 1) -> bool: + return False # Deliberately fails here, as item pooling is not aware about mission layout + + def count_group(self, item_name_group: str, player: int) -> int: + return 0 # For item filtering assume no missions are beaten + + def count(self, item: str, player: int) -> int: + return self.logical_inventory.get(item, 0) + + def count_from_list(self, items: Iterable[str], player: int) -> int: + return sum(self.logical_inventory.get(item, 0) for item in items) + + def count_from_list_unique(self, items: Iterable[str], player: int) -> int: + return sum(item in self.logical_inventory for item in items) + + def generate_reduced_inventory(self, inventory_size: int, filler_amount: int, mission_requirements: List[Tuple[str, Callable]]) -> List[StarcraftItem]: + """Attempts to generate a reduced inventory that can fulfill the mission requirements.""" + inventory: List[StarcraftItem] = list(self.item_pool) + requirements = mission_requirements + min_upgrades_per_unit = self.world.options.min_number_of_upgrades.value + max_upgrades_per_unit = self.world.options.max_number_of_upgrades.value + if max_upgrades_per_unit > -1 and min_upgrades_per_unit > max_upgrades_per_unit: + logging.getLogger("Starcraft 2").warning( + f"min upgrades per unit is greater than max upgrades per unit ({min_upgrades_per_unit} > {max_upgrades_per_unit}). " + f"Setting both to minimum value ({min_upgrades_per_unit})" + ) + max_upgrades_per_unit = min_upgrades_per_unit + + def attempt_removal( + item: StarcraftItem, + remove_flag: ItemFilterFlags = ItemFilterFlags.FilterExcluded, + ) -> str: + """ + Returns empty string and applies `remove_flag` if the item is removable, + else returns a string containing failed locations and applies ItemFilterFlags.LogicLocked + """ + # Only run logic checks when removing logic items + if self.logical_inventory.get(item.name, 0) > 0: + self.logical_inventory[item.name] -= 1 + failed_rules = [name for name, requirement in mission_requirements if not requirement(self)] + if failed_rules: + # If item cannot be removed, lock and revert + self.logical_inventory[item.name] += 1 + item.filter_flags |= ItemFilterFlags.LogicLocked + return f"{len(failed_rules)} rules starting with \"{failed_rules[0]}\"" + if not self.logical_inventory[item.name]: + del self.logical_inventory[item.name] + item.filter_flags |= remove_flag + return "" + + def remove_child_items( + parent_item: StarcraftItem, + remove_flag: ItemFilterFlags = ItemFilterFlags.FilterExcluded, + ) -> None: + child_items = self.item_name_to_child_items.get(parent_item.name, []) + for child_item in child_items: + if (ItemFilterFlags.AllowedOrphan|ItemFilterFlags.Unexcludable) & child_item.filter_flags: + continue + parent_id = item_table[child_item.name].parent + assert parent_id is not None + if item_parents.parent_present[parent_id](self.logical_inventory, self.world.options): + continue + if not attempt_removal(child_item, remove_flag): + remove_child_items(child_item, remove_flag) + + def cull_items_over_maximum(group: List[StarcraftItem], allowed_max: int) -> None: + for item in group: + if len([x for x in group if ItemFilterFlags.Culled not in x.filter_flags]) <= allowed_max: + break + if ItemFilterFlags.Uncullable & item.filter_flags: + continue + attempt_removal(item, remove_flag=ItemFilterFlags.Culled) + + def request_minimum_items(group: List[StarcraftItem], requested_minimum) -> None: + for item in group: + if len([x for x in group if ItemFilterFlags.RequestedOrBetter & x.filter_flags]) >= requested_minimum: + break + if ItemFilterFlags.Culled & item.filter_flags: + continue + item.filter_flags |= ItemFilterFlags.Requested + + # Process Excluded items, validate if the item can get actually excluded + excluded_items: List[StarcraftItem] = [starcraft_item for starcraft_item in inventory if ItemFilterFlags.Excluded & starcraft_item.filter_flags] + self.world.random.shuffle(excluded_items) + for excluded_item in excluded_items: + if ItemFilterFlags.Unexcludable & excluded_item.filter_flags: + continue + removal_failed = attempt_removal(excluded_item, remove_flag=ItemFilterFlags.Removed) + if removal_failed: + if ItemFilterFlags.UserExcluded in excluded_item.filter_flags: + logging.getLogger("Starcraft 2").warning( + f"Cannot exclude item {excluded_item.name} as it would break {removal_failed}" + ) + else: + assert False, f"Item filtering excluded an item which is logically required: {excluded_item.name}" + continue + remove_child_items(excluded_item, remove_flag=ItemFilterFlags.Removed) + inventory = [item for item in inventory if ItemFilterFlags.Removed not in item.filter_flags] + + # Clear excluded flags; all existing ones should be implemented or out-of-logic + for item in inventory: + item.filter_flags &= ~ItemFilterFlags.Excluded + + # Determine item groups to be constrained by min/max upgrades per unit + group_to_item: Dict[str, List[StarcraftItem]] = {} + group: str = "" + for group, group_member_names in item_parents.item_upgrade_groups.items(): + group_to_item[group] = [] + for item_name in group_member_names: + inventory_items = self.item_name_to_item.get(item_name, []) + group_to_item[group].extend(item for item in inventory_items if ItemFilterFlags.Removed not in item.filter_flags) + + # Limit the maximum number of upgrades + if max_upgrades_per_unit != -1: + for group_name, group_items in group_to_item.items(): + self.world.random.shuffle(group_to_item[group]) + cull_items_over_maximum(group_items, max_upgrades_per_unit) + + # Requesting minimum upgrades for items that have already been locked/placed when minimum required + if min_upgrades_per_unit != -1: + for group_name, group_items in group_to_item.items(): + self.world.random.shuffle(group_items) + request_minimum_items(group_items, min_upgrades_per_unit) + + # Kerrigan max abilities + kerrigan_actives = [item for item in inventory if item.name in item_groups.kerrigan_active_abilities] + self.world.random.shuffle(kerrigan_actives) + cull_items_over_maximum(kerrigan_actives, self.world.options.kerrigan_max_active_abilities.value) + + kerrigan_passives = [item for item in inventory if item.name in item_groups.kerrigan_passives] + self.world.random.shuffle(kerrigan_passives) + cull_items_over_maximum(kerrigan_passives, self.world.options.kerrigan_max_passive_abilities.value) + + # Spear of Adun max abilities + spear_of_adun_actives = [item for item in inventory if item.name in spear_of_adun_calldowns] + self.world.random.shuffle(spear_of_adun_actives) + cull_items_over_maximum(spear_of_adun_actives, self.world.options.spear_of_adun_max_active_abilities.value) + + spear_of_adun_autocasts = [item for item in inventory if item.name in spear_of_adun_castable_passives] + self.world.random.shuffle(spear_of_adun_autocasts) + cull_items_over_maximum(spear_of_adun_autocasts, self.world.options.spear_of_adun_max_passive_abilities.value) + + # Nova items + nova_weapon_items = [item for item in inventory if item.name in item_groups.nova_weapons] + self.world.random.shuffle(nova_weapon_items) + cull_items_over_maximum(nova_weapon_items, self.world.options.nova_max_weapons.value) + + nova_gadget_items = [item for item in inventory if item.name in item_groups.nova_gadgets] + self.world.random.shuffle(nova_gadget_items) + cull_items_over_maximum(nova_gadget_items, self.world.options.nova_max_gadgets.value) + + # Determining if the full-size inventory can complete campaign + # Note(mm): Now that user excludes are checked against logic, this can probably never fail unless there's a bug. + failed_locations: List[str] = [location for (location, requirement) in requirements if not requirement(self)] + if len(failed_locations) > 0: + raise Exception(f"Too many items excluded - couldn't satisfy access rules for the following locations:\n{failed_locations}") + + # Optionally locking generic items + generic_items: List[StarcraftItem] = [ + starcraft_item for starcraft_item in inventory + if starcraft_item.name in second_pass_placeable_items + and ( + not ItemFilterFlags.CulledOrBetter & starcraft_item.filter_flags + or ItemFilterFlags.RequestedOrBetter & starcraft_item.filter_flags + ) + ] + reserved_generic_percent = self.world.options.ensure_generic_items.value / 100 + reserved_generic_amount = int(len(generic_items) * reserved_generic_percent) + self.world.random.shuffle(generic_items) + for starcraft_item in generic_items[:reserved_generic_amount]: + starcraft_item.filter_flags |= ItemFilterFlags.Requested + + # Main cull process + def remove_random_item( + removable: List[StarcraftItem], + dont_remove_flags: ItemFilterFlags, + remove_flag: ItemFilterFlags = ItemFilterFlags.Removed, + ) -> bool: + if len(removable) == 0: + return False + item = self.world.random.choice(removable) + # Do not remove item if it would drop upgrades below minimum + if min_upgrades_per_unit > 0: + group_name = None + parent = item_table[item.name].parent + if parent is not None: + group_name = item_parents.parent_present[parent].constraint_group + if group_name is not None: + children = group_to_item.get(group_name, []) + children = [x for x in children if not (ItemFilterFlags.CulledOrBetter & x.filter_flags)] + if len(children) <= min_upgrades_per_unit: + # Attempt to remove a parent instead, if possible + dont_remove = ItemFilterFlags.Removed|dont_remove_flags + parent_items = [ + parent_item + for parent_name in item_parents.child_item_to_parent_items[item.name] + for parent_item in self.item_name_to_item.get(parent_name, []) + if not (dont_remove & parent_item.filter_flags) + ] + if parent_items: + item = self.world.random.choice(parent_items) + else: + # Lock remaining upgrades + for item in children: + item.filter_flags |= ItemFilterFlags.Locked + return False + if not attempt_removal(item, remove_flag): + remove_child_items(item, remove_flag) + return True + return False + + def item_included(item: StarcraftItem) -> bool: + return bool( + ItemFilterFlags.Removed not in item.filter_flags + and ((ItemFilterFlags.Unexcludable|ItemFilterFlags.Excluded) & item.filter_flags) != ItemFilterFlags.Excluded + ) + + # Actually remove culled items; we won't re-add them + inventory = [ + item for item in inventory + if (((ItemFilterFlags.Uncullable|ItemFilterFlags.Culled) & item.filter_flags) != ItemFilterFlags.Culled) + ] + + # Part 1: Remove items that are not requested + start_inventory_size = len([item for item in inventory if ItemFilterFlags.StartInventory in item.filter_flags]) + current_inventory_size = len([item for item in inventory if item_included(item)]) + cullable_items = [item for item in inventory if not (ItemFilterFlags.Uncullable & item.filter_flags)] + while current_inventory_size - start_inventory_size > inventory_size - filler_amount: + if len(cullable_items) == 0: + if filler_amount > 0: + filler_amount -= 1 + else: + break + if remove_random_item(cullable_items, ItemFilterFlags.Uncullable): + inventory = [item for item in inventory if ItemFilterFlags.Removed not in item.filter_flags] + current_inventory_size = len([item for item in inventory if item_included(item)]) + cullable_items = [ + item for item in cullable_items + if not ((ItemFilterFlags.Removed|ItemFilterFlags.Uncullable) & item.filter_flags) + ] + + # Handle too many requested + if current_inventory_size - start_inventory_size > inventory_size - filler_amount: + for item in inventory: + item.filter_flags &= ~ItemFilterFlags.Requested + + # Part 2: If we need to remove more, allow removing requested items + excludable_items = [item for item in inventory if not (ItemFilterFlags.Unexcludable & item.filter_flags)] + while current_inventory_size - start_inventory_size > inventory_size - filler_amount: + if len(excludable_items) == 0: + break + if remove_random_item(excludable_items, ItemFilterFlags.Unexcludable): + inventory = [item for item in inventory if ItemFilterFlags.Removed not in item.filter_flags] + current_inventory_size = len([item for item in inventory if item_included(item)]) + excludable_items = [ + item for item in inventory + if not ((ItemFilterFlags.Removed|ItemFilterFlags.Unexcludable) & item.filter_flags) + ] + + # Part 3: If it still doesn't fit, move locked items to start inventory until it fits + precollect_items = current_inventory_size - inventory_size - start_inventory_size - filler_amount + if precollect_items > 0: + promotable = [ + item + for item in inventory + if ItemFilterFlags.StartInventory not in item.filter_flags + and ItemFilterFlags.Locked in item.filter_flags + ] + self.world.random.shuffle(promotable) + for item in promotable[:precollect_items]: + item.filter_flags |= ItemFilterFlags.StartInventory + start_inventory_size += 1 + + # Removing extra dependencies + # Transport Hook + if not self.logical_inventory.get(item_names.MEDIVAC): + # Don't allow L2 Siege Tank Transport Hook without Medivac + inventory_transport_hooks = [item for item in inventory if item.name == item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK] + removable_transport_hooks = [item for item in inventory_transport_hooks if not (ItemFilterFlags.Unexcludable & item.filter_flags)] + if len(inventory_transport_hooks) > 1 and removable_transport_hooks: + inventory.remove(removable_transport_hooks[0]) + + # Weapon/Armour upgrades + def exclude_wa(prefix: str) -> List[StarcraftItem]: + return [ + item for item in inventory + if (ItemFilterFlags.UnexcludableUpgrade & item.filter_flags) + or not item.name.startswith(prefix) + ] + used_item_names: Set[str] = {item.name for item in inventory} + if used_item_names.isdisjoint(item_groups.barracks_wa_group): + inventory = exclude_wa(item_names.TERRAN_INFANTRY_UPGRADE_PREFIX) + if used_item_names.isdisjoint(item_groups.factory_wa_group): + inventory = exclude_wa(item_names.TERRAN_VEHICLE_UPGRADE_PREFIX) + if used_item_names.isdisjoint(item_groups.starport_wa_group): + inventory = exclude_wa(item_names.TERRAN_SHIP_UPGRADE_PREFIX) + if used_item_names.isdisjoint(item_groups.zerg_melee_wa): + inventory = exclude_wa(item_names.PROGRESSIVE_ZERG_MELEE_ATTACK) + if used_item_names.isdisjoint(item_groups.zerg_ranged_wa): + inventory = exclude_wa(item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK) + if used_item_names.isdisjoint(item_groups.zerg_air_units): + inventory = exclude_wa(item_names.ZERG_FLYER_UPGRADE_PREFIX) + if used_item_names.isdisjoint(item_groups.protoss_ground_wa): + inventory = exclude_wa(item_names.PROTOSS_GROUND_UPGRADE_PREFIX) + if used_item_names.isdisjoint(item_groups.protoss_air_wa): + inventory = exclude_wa(item_names.PROTOSS_AIR_UPGRADE_PREFIX) + + # Part 4: Last-ditch effort to reduce inventory size; upgrades can go in start inventory + current_inventory_size = len(inventory) + precollect_items = current_inventory_size - inventory_size - start_inventory_size - filler_amount + if precollect_items > 0: + promotable = [ + item + for item in inventory + if ItemFilterFlags.StartInventory not in item.filter_flags + ] + self.world.random.shuffle(promotable) + for item in promotable[:precollect_items]: + item.filter_flags |= ItemFilterFlags.StartInventory + start_inventory_size += 1 + + assert current_inventory_size - start_inventory_size <= inventory_size - filler_amount, ( + f"Couldn't reduce inventory to fit. target={inventory_size}, poolsize={current_inventory_size}, " + f"start_inventory={starcraft_item}, filler_amount={filler_amount}" + ) + + return inventory + + +def filter_items(world: 'SC2World', location_cache: List[Location], item_pool: List[StarcraftItem]) -> List[StarcraftItem]: + """ + Returns a semi-randomly pruned set of items based on number of available locations. + The returned inventory must be capable of logically accessing every location in the world. + """ + open_locations = [location for location in location_cache if location.item is None] + inventory_size = len(open_locations) + # Most of the excluded locations get actually removed but Victory ones are mandatory in order to allow the game + # to progress normally. Since regular items aren't flagged as filler, we need to generate enough filler for those + # locations as we need to have something that can be actually placed there. + # Therefore, we reserve those to be filler. + excluded_locations = [location for location in open_locations if location.name in world.options.exclude_locations.value] + reserved_filler_count = len(excluded_locations) + target_nonfiller_item_count = inventory_size - reserved_filler_count + filler_amount = (inventory_size * world.options.filler_percentage) // 100 + if world.options.required_tactics.value == RequiredTactics.option_no_logic: + mission_requirements = [] + else: + mission_requirements = [(location.name, location.access_rule) for location in location_cache] + valid_inventory = ValidInventory(world, item_pool) + + valid_items = valid_inventory.generate_reduced_inventory(target_nonfiller_item_count, filler_amount, mission_requirements) + for _ in range(reserved_filler_count): + filler_item = world.create_item(world.get_filler_item_name()) + if filler_item.classification & ItemClassification.progression: + filler_item.classification = ItemClassification.filler # Must be flagged as Filler, even if it's a Kerrigan level + valid_items.append(filler_item) + return valid_items diff --git a/worlds/sc2/regions.py b/worlds/sc2/regions.py new file mode 100644 index 0000000000..26d127a1c5 --- /dev/null +++ b/worlds/sc2/regions.py @@ -0,0 +1,532 @@ +from typing import TYPE_CHECKING, List, Dict, Any, Tuple, Optional + +from Options import OptionError +from .locations import LocationData, Location +from .mission_tables import ( + SC2Mission, SC2Campaign, MissionFlag, get_campaign_goal_priority, + campaign_final_mission_locations, campaign_alt_final_mission_locations +) +from .options import ( + ShuffleNoBuild, RequiredTactics, ShuffleCampaigns, + kerrigan_unit_available, TakeOverAIAllies, MissionOrder, get_excluded_missions, get_enabled_campaigns, + static_mission_orders, + TwoStartPositions, KeyMode, EnableMissionRaceBalancing, EnableRaceSwapVariants, NovaGhostOfAChanceVariant, + WarCouncilNerfs, GrantStoryTech +) +from .mission_order.options import CustomMissionOrder +from .mission_order import SC2MissionOrder +from .mission_order.nodes import SC2MOGenMissionOrder, Difficulty +from .mission_order.mission_pools import SC2MOGenMissionPools +from .mission_order.generation import resolve_unlocks, fill_depths, resolve_difficulties, fill_missions, make_connections, resolve_generic_keys + +if TYPE_CHECKING: + from . import SC2World + + +def create_mission_order( + world: 'SC2World', locations: Tuple[LocationData, ...], location_cache: List[Location] +): + # 'locations' contains both actual game locations and beat event locations for all mission regions + # When a region (mission) is accessible, all its locations are potentially accessible + # Accessible in this context always means "its access rule evaluates to True" + # This includes the beat events, which copy the access rules of the victory locations + # Beat events being added to logical inventory is auto-magic: + # Event locations contain an event item of (by default) identical name, + # which Archipelago's generator will consider part of the logical inventory + # whenever the event location becomes accessible + + # Set up mission pools + mission_pools = SC2MOGenMissionPools() + mission_pools.set_exclusions(get_excluded_missions(world), []) # TODO set unexcluded + adjust_mission_pools(world, mission_pools) + setup_mission_pool_balancing(world, mission_pools) + + mission_order_type = world.options.mission_order + if mission_order_type == MissionOrder.option_custom: + mission_order_dict = world.options.custom_mission_order.value + else: + mission_order_option = create_regular_mission_order(world, mission_pools) + if mission_order_type in static_mission_orders: + # Static orders get converted early to curate preset content, so it can be used as-is + mission_order_dict = mission_order_option + else: + mission_order_dict = CustomMissionOrder(mission_order_option).value + mission_order = SC2MOGenMissionOrder(world, mission_order_dict) + + # Set up requirements for individual parts of the mission order + resolve_unlocks(mission_order) + + # Ensure total accessibilty and resolve relative difficulties + fill_depths(mission_order) + resolve_difficulties(mission_order) + + # Build the mission order + fill_missions(mission_order, mission_pools, world, [], locations, location_cache) # TODO set locked missions + make_connections(mission_order, world) + + # Fill in Key requirements now that missions are placed + resolve_generic_keys(mission_order) + + return SC2MissionOrder(mission_order, mission_pools) + +def adjust_mission_pools(world: 'SC2World', pools: SC2MOGenMissionPools): + # Mission pool changes + mission_order_type = world.options.mission_order.value + enabled_campaigns = get_enabled_campaigns(world) + adv_tactics = world.options.required_tactics.value != RequiredTactics.option_standard + shuffle_no_build = world.options.shuffle_no_build.value + extra_locations = world.options.extra_locations.value + grant_story_tech = world.options.grant_story_tech.value + grant_story_levels = world.options.grant_story_levels.value + war_council_nerfs = world.options.war_council_nerfs.value == WarCouncilNerfs.option_true + + # WoL + if shuffle_no_build == ShuffleNoBuild.option_false or adv_tactics: + # Replacing No Build missions with Easy missions + # WoL + pools.move_mission(SC2Mission.ZERO_HOUR, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.EVACUATION, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.EVACUATION_Z, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.EVACUATION_P, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DEVILS_PLAYGROUND, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DEVILS_PLAYGROUND_Z, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DEVILS_PLAYGROUND_P, Difficulty.EASY, Difficulty.STARTER) + if world.options.required_tactics != RequiredTactics.option_any_units: + # Per playtester feedback: doing this mission with only one unit is flaky + # but there are enough viable comps that >= 2 random units is probably workable + pools.move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY_Z, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.THE_GREAT_TRAIN_ROBBERY_P, Difficulty.EASY, Difficulty.STARTER) + # LotV + pools.move_mission(SC2Mission.THE_GROWING_SHADOW, Difficulty.EASY, Difficulty.STARTER) + if shuffle_no_build == ShuffleNoBuild.option_false: + # Pushing Outbreak to Normal, as it cannot be placed as the second mission on Build-Only + pools.move_mission(SC2Mission.OUTBREAK, Difficulty.EASY, Difficulty.MEDIUM) + # Pushing extra Normal missions to Easy + pools.move_mission(SC2Mission.ECHOES_OF_THE_FUTURE, Difficulty.MEDIUM, Difficulty.EASY) + pools.move_mission(SC2Mission.CUTTHROAT, Difficulty.MEDIUM, Difficulty.EASY) + # Additional changes on Advanced Tactics + if adv_tactics: + # WoL + pools.move_mission(SC2Mission.SMASH_AND_GRAB, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.THE_MOEBIUS_FACTOR, Difficulty.MEDIUM, Difficulty.EASY) + pools.move_mission(SC2Mission.THE_MOEBIUS_FACTOR_Z, Difficulty.MEDIUM, Difficulty.EASY) + pools.move_mission(SC2Mission.THE_MOEBIUS_FACTOR_P, Difficulty.MEDIUM, Difficulty.EASY) + pools.move_mission(SC2Mission.WELCOME_TO_THE_JUNGLE, Difficulty.MEDIUM, Difficulty.EASY) + pools.move_mission(SC2Mission.ENGINE_OF_DESTRUCTION, Difficulty.HARD, Difficulty.MEDIUM) + # Prophecy needs to be adjusted if by itself + if enabled_campaigns == {SC2Campaign.PROPHECY}: + pools.move_mission(SC2Mission.A_SINISTER_TURN, Difficulty.MEDIUM, Difficulty.EASY) + # Prologue's only valid starter is the goal mission + if enabled_campaigns == {SC2Campaign.PROLOGUE} \ + or mission_order_type in static_mission_orders \ + and world.options.shuffle_campaigns.value == ShuffleCampaigns.option_false: + pools.move_mission(SC2Mission.DARK_WHISPERS, Difficulty.EASY, Difficulty.STARTER) + # HotS + kerriganless = world.options.kerrigan_presence.value not in kerrigan_unit_available \ + or SC2Campaign.HOTS not in enabled_campaigns + if grant_story_tech == GrantStoryTech.option_grant: + # Additional starter mission if player is granted story tech + pools.move_mission(SC2Mission.ENEMY_WITHIN, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.TEMPLAR_S_RETURN, Difficulty.MEDIUM, Difficulty.STARTER) + pools.move_mission(SC2Mission.THE_ESCAPE, Difficulty.MEDIUM, Difficulty.STARTER) + pools.move_mission(SC2Mission.IN_THE_ENEMY_S_SHADOW, Difficulty.MEDIUM, Difficulty.STARTER) + if not war_council_nerfs: + pools.move_mission(SC2Mission.TEMPLAR_S_RETURN, Difficulty.MEDIUM, Difficulty.STARTER) + if (grant_story_tech == GrantStoryTech.option_grant and grant_story_levels) or kerriganless: + # The player has, all the stuff he needs, provided under these settings + pools.move_mission(SC2Mission.SUPREME, Difficulty.MEDIUM, Difficulty.STARTER) + pools.move_mission(SC2Mission.THE_INFINITE_CYCLE, Difficulty.HARD, Difficulty.STARTER) + pools.move_mission(SC2Mission.CONVICTION, Difficulty.MEDIUM, Difficulty.STARTER) + if (grant_story_tech != GrantStoryTech.option_grant + and ( + world.options.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_nco + or ( + SC2Campaign.NCO in enabled_campaigns + and world.options.nova_ghost_of_a_chance_variant.value == NovaGhostOfAChanceVariant.option_auto + ) + ) + ): + # Using NCO tech for this mission that must be acquired + pools.move_mission(SC2Mission.GHOST_OF_A_CHANCE, Difficulty.STARTER, Difficulty.MEDIUM) + if world.options.take_over_ai_allies.value == TakeOverAIAllies.option_true: + pools.move_mission(SC2Mission.HARBINGER_OF_OBLIVION, Difficulty.MEDIUM, Difficulty.STARTER) + if pools.get_pool_size(Difficulty.STARTER) < 2 and not kerriganless or adv_tactics: + # Conditionally moving Easy missions to Starter + pools.move_mission(SC2Mission.HARVEST_OF_SCREAMS, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DOMINATION, Difficulty.EASY, Difficulty.STARTER) + if pools.get_pool_size(Difficulty.STARTER) < 2: + pools.move_mission(SC2Mission.DOMINATION, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DOMINATION_T, Difficulty.EASY, Difficulty.STARTER) + pools.move_mission(SC2Mission.DOMINATION_P, Difficulty.EASY, Difficulty.STARTER) + if pools.get_pool_size(Difficulty.STARTER) + pools.get_pool_size(Difficulty.EASY) < 2: + # Flashpoint needs just a few items at start but competent comp at the end + pools.move_mission(SC2Mission.FLASHPOINT, Difficulty.HARD, Difficulty.EASY) + +def setup_mission_pool_balancing(world: 'SC2World', pools: SC2MOGenMissionPools): + race_mission_balance = world.options.mission_race_balancing.value + flag_ratios: Dict[MissionFlag, int] = {} + flag_weights: Dict[MissionFlag, int] = {} + if race_mission_balance == EnableMissionRaceBalancing.option_semi_balanced: + flag_weights = { MissionFlag.Terran: 1, MissionFlag.Zerg: 1, MissionFlag.Protoss: 1 } + elif race_mission_balance == EnableMissionRaceBalancing.option_fully_balanced: + flag_ratios = { MissionFlag.Terran: 1, MissionFlag.Zerg: 1, MissionFlag.Protoss: 1 } + pools.set_flag_balances(flag_ratios, flag_weights) + +def create_regular_mission_order(world: 'SC2World', mission_pools: SC2MOGenMissionPools) -> Dict[str, Dict[str, Any]]: + mission_order_type = world.options.mission_order.value + + if mission_order_type in static_mission_orders: + return create_static_mission_order(world, mission_order_type, mission_pools) + else: + return create_dynamic_mission_order(world, mission_order_type, mission_pools) + +def create_static_mission_order(world: 'SC2World', mission_order_type: int, mission_pools: SC2MOGenMissionPools) -> Dict[str, Dict[str, Any]]: + mission_order: Dict[str, Dict[str, Any]] = {} + + enabled_campaigns = get_enabled_campaigns(world) + if mission_order_type == MissionOrder.option_vanilla: + missions = "vanilla" + elif world.options.shuffle_campaigns.value == ShuffleCampaigns.option_true: + missions = "random" + else: + missions = "vanilla_shuffled" + + if world.options.enable_race_swap.value == EnableRaceSwapVariants.option_disabled: + shuffle_raceswaps = False + else: + # Picking specific raceswap variants is handled by mission exclusion + shuffle_raceswaps = True + + key_mode_option = world.options.key_mode.value + if key_mode_option == KeyMode.option_missions: + keys = "missions" + elif key_mode_option == KeyMode.option_questlines: + keys = "layouts" + elif key_mode_option == KeyMode.option_progressive_missions: + keys = "progressive_missions" + elif key_mode_option == KeyMode.option_progressive_questlines: + keys = "progressive_layouts" + elif key_mode_option == KeyMode.option_progressive_per_questline: + keys = "progressive_per_layout" + else: + keys = "none" + + if mission_order_type == MissionOrder.option_mini_campaign: + prefix = "mini " + else: + prefix = "" + + def mission_order_preset(name: str) -> Dict[str, str]: + return { + "preset": prefix + name, + "missions": missions, + "shuffle_raceswaps": shuffle_raceswaps, + "keys": keys + } + + prophecy_enabled = SC2Campaign.PROPHECY in enabled_campaigns + wol_enabled = SC2Campaign.WOL in enabled_campaigns + if wol_enabled: + mission_order[SC2Campaign.WOL.campaign_name] = mission_order_preset("wol") + + if prophecy_enabled: + mission_order[SC2Campaign.PROPHECY.campaign_name] = mission_order_preset("prophecy") + + if SC2Campaign.HOTS in enabled_campaigns: + mission_order[SC2Campaign.HOTS.campaign_name] = mission_order_preset("hots") + + if SC2Campaign.PROLOGUE in enabled_campaigns: + mission_order[SC2Campaign.PROLOGUE.campaign_name] = mission_order_preset("prologue") + + if SC2Campaign.LOTV in enabled_campaigns: + mission_order[SC2Campaign.LOTV.campaign_name] = mission_order_preset("lotv") + + if SC2Campaign.EPILOGUE in enabled_campaigns: + mission_order[SC2Campaign.EPILOGUE.campaign_name] = mission_order_preset("epilogue") + entry_rules = [] + if SC2Campaign.WOL in enabled_campaigns: + entry_rules.append({ "scope": SC2Campaign.WOL.campaign_name }) + if SC2Campaign.HOTS in enabled_campaigns: + entry_rules.append({ "scope": SC2Campaign.HOTS.campaign_name }) + if SC2Campaign.LOTV in enabled_campaigns: + entry_rules.append({ "scope": SC2Campaign.LOTV.campaign_name }) + mission_order[SC2Campaign.EPILOGUE.campaign_name]["entry_rules"] = entry_rules + + if SC2Campaign.NCO in enabled_campaigns: + mission_order[SC2Campaign.NCO.campaign_name] = mission_order_preset("nco") + + # Resolve immediately so the layout updates are simpler + mission_order = CustomMissionOrder(mission_order).value + + # WoL requirements should count missions from Prophecy if both are enabled, and Prophecy should require a WoL mission + # There is a preset that already does this, but special-casing this way is easier to work with for other code + if wol_enabled and prophecy_enabled: + fix_wol_prophecy_entry_rules(mission_order) + + # Vanilla Shuffled is allowed to drop some slots + if mission_order_type == MissionOrder.option_vanilla_shuffled: + remove_missions(world, mission_order, mission_pools) + + # Curate final missions and goal campaigns + force_final_missions(world, mission_order, mission_order_type) + + return mission_order + + +def fix_wol_prophecy_entry_rules(mission_order: Dict[str, Dict[str, Any]]): + prophecy_name = SC2Campaign.PROPHECY.campaign_name + + # Make the mission count entry rules in WoL also count Prophecy + def fix_entry_rule(entry_rule: Dict[str, Any], local_campaign_scope: str): + # This appends Prophecy to any scope that points at the local campaign (WoL) + if "scope" in entry_rule: + if entry_rule["scope"] == local_campaign_scope: + entry_rule["scope"] = [local_campaign_scope, prophecy_name] + elif isinstance(entry_rule["scope"], list) and local_campaign_scope in entry_rule["scope"]: + entry_rule["scope"] = entry_rule["scope"] + [prophecy_name] + + for layout_dict in mission_order[SC2Campaign.WOL.campaign_name].values(): + if not isinstance(layout_dict, dict): + continue + if "entry_rules" in layout_dict: + for entry_rule in layout_dict["entry_rules"]: + fix_entry_rule(entry_rule, "..") + if "missions" in layout_dict: + for mission_dict in layout_dict["missions"]: + if "entry_rules" in mission_dict: + for entry_rule in mission_dict["entry_rules"]: + fix_entry_rule(entry_rule, "../..") + + # Make Prophecy require Artifact's second mission + mission_order[prophecy_name][prophecy_name]["entry_rules"] = [{ "scope": [f"{SC2Campaign.WOL.campaign_name}/Artifact/1"]}] + + +def force_final_missions(world: 'SC2World', mission_order: Dict[str, Dict[str, Any]], mission_order_type: int): + goal_mission: Optional[SC2Mission] = None + excluded_missions = get_excluded_missions(world) + enabled_campaigns = get_enabled_campaigns(world) + raceswap_variants = [mission for mission in SC2Mission if mission.flags & MissionFlag.RaceSwap] + # Prefer long campaigns over shorter ones and harder missions over easier ones + goal_priorities = {campaign: get_campaign_goal_priority(campaign, excluded_missions) for campaign in enabled_campaigns} + goal_level = max(goal_priorities.values()) + candidate_campaigns: List[SC2Campaign] = [campaign for campaign, goal_priority in goal_priorities.items() if goal_priority == goal_level] + candidate_campaigns.sort(key=lambda it: it.id) + + # Vanilla Shuffled & Mini Campaign get a curated final mission + if mission_order_type != MissionOrder.option_vanilla: + for goal_campaign in candidate_campaigns: + primary_goal = campaign_final_mission_locations[goal_campaign] + if primary_goal is None or primary_goal.mission in excluded_missions: + # No primary goal or its mission is excluded + candidate_missions = list(campaign_alt_final_mission_locations[goal_campaign].keys()) + # Also allow raceswaps of curated final missions, provided they're not excluded + for candidate_with_raceswaps in [mission for mission in candidate_missions if mission.flags & MissionFlag.HasRaceSwap]: + raceswap_candidates = [mission for mission in raceswap_variants if mission.map_file == candidate_with_raceswaps.map_file] + candidate_missions.extend(raceswap_candidates) + candidate_missions = [mission for mission in candidate_missions if mission not in excluded_missions] + if len(candidate_missions) == 0: + raise OptionError(f"There are no valid goal missions for campaign {goal_campaign.campaign_name}. Please exclude fewer missions.") + goal_mission = world.random.choice(candidate_missions) + else: + goal_mission = primary_goal.mission + + # The goal layout for static presets is the layout corresponding to the last key + goal_layout = list(mission_order[goal_campaign.campaign_name].keys())[-1] + goal_index = mission_order[goal_campaign.campaign_name][goal_layout]["size"] - 1 + mission_order[goal_campaign.campaign_name][goal_layout]["missions"].append({ + "index": [goal_index], + "mission_pool": [goal_mission.id] + }) + + # Remove goal status from lower priority campaigns + for campaign in enabled_campaigns: + if campaign not in candidate_campaigns: + mission_order[campaign.campaign_name]["goal"] = False + +def remove_missions(world: 'SC2World', mission_order: Dict[str, Dict[str, Any]], mission_pools: SC2MOGenMissionPools): + enabled_campaigns = get_enabled_campaigns(world) + removed_counts: Dict[SC2Campaign, Dict[str, int]] = {} + for campaign in enabled_campaigns: + # Count missing missions for each campaign individually + campaign_size = sum(layout["size"] for layout in mission_order[campaign.campaign_name].values() if type(layout) == dict) + allowed_missions = mission_pools.count_allowed_missions(campaign) + removal_count = campaign_size - allowed_missions + if removal_count > len(removal_priorities[campaign]): + raise OptionError(f"Too many missions of campaign {campaign.campaign_name} excluded, cannot fill vanilla shuffled mission order.") + for layout in removal_priorities[campaign][:removal_count]: + removed_counts.setdefault(campaign, {}).setdefault(layout, 0) + removed_counts[campaign][layout] += 1 + mission_order[campaign.campaign_name][layout]["size"] -= 1 + + # Fix mission indices & nexts + for (campaign, layouts) in removed_counts.items(): + for (layout, amount) in layouts.items(): + new_size = mission_order[campaign.campaign_name][layout]["size"] + original_size = new_size + amount + for removed_idx in range(new_size, original_size): + for mission in mission_order[campaign.campaign_name][layout]["missions"]: + if "index" in mission and removed_idx in mission["index"]: + mission["index"].remove(removed_idx) + if "next" in mission and removed_idx in mission["next"]: + mission["next"].remove(removed_idx) + + # Special cases + if SC2Campaign.WOL in removed_counts: + if "Char" in removed_counts[SC2Campaign.WOL]: + # Remove the first two mission changes that create the branching path + mission_order[SC2Campaign.WOL.campaign_name]["Char"]["missions"] = mission_order[SC2Campaign.WOL.campaign_name]["Char"]["missions"][2:] + if SC2Campaign.NCO in removed_counts: + # Remove the whole last layout if its size is 0 + if "Mission Pack 3" in removed_counts[SC2Campaign.NCO] and removed_counts[SC2Campaign.NCO]["Mission Pack 3"] == 3: + mission_order[SC2Campaign.NCO.campaign_name].pop("Mission Pack 3") + +removal_priorities: Dict[SC2Campaign, List[str]] = { + SC2Campaign.WOL: [ + "Colonist", + "Covert", + "Covert", + "Char", + "Rebellion", + "Artifact", + "Artifact", + "Rebellion" + ], + SC2Campaign.PROPHECY: [ + "Prophecy", + "Prophecy" + ], + SC2Campaign.HOTS: [ + "Umoja", + "Kaldir", + "Char", + "Zerus", + "Skygeirr Station" + ], + SC2Campaign.PROLOGUE: [ + "Prologue", + ], + SC2Campaign.LOTV: [ + "Ulnar", + "Return to Aiur", + "Aiur", + "Tal'darim", + "Purifier", + "Shakuras", + "Korhal" + ], + SC2Campaign.EPILOGUE: [ + "Epilogue", + ], + SC2Campaign.NCO: [ + "Mission Pack 3", + "Mission Pack 3", + "Mission Pack 2", + "Mission Pack 2", + "Mission Pack 1", + "Mission Pack 1", + "Mission Pack 3" + ] +} + +def make_grid(world: 'SC2World', size: int) -> Dict[str, Dict[str, Any]]: + mission_order = { + "grid": { + "display_name": "", + "type": "grid", + "size": size, + "two_start_positions": world.options.two_start_positions.value == TwoStartPositions.option_true + } + } + return mission_order + +def make_golden_path(world: 'SC2World', size: int) -> Dict[str, Dict[str, Any]]: + key_mode = world.options.key_mode.value + if key_mode == KeyMode.option_missions: + keys = "missions" + elif key_mode == KeyMode.option_questlines: + keys = "layouts" + elif key_mode == KeyMode.option_progressive_missions: + keys = "progressive_missions" + elif key_mode == KeyMode.option_progressive_questlines: + keys = "progressive_layouts" + elif key_mode == KeyMode.option_progressive_per_questline: + keys = "progressive_per_layout" + else: + keys = "none" + + mission_order = { + "golden path": { + "display_name": "", + "preset": "golden path", + "size": size, + "keys": keys, + "two_start_positions": world.options.two_start_positions.value == TwoStartPositions.option_true + } + } + return mission_order + +def make_gauntlet(size: int) -> Dict[str, Dict[str, Any]]: + mission_order = { + "gauntlet": { + "display_name": "", + "type": "gauntlet", + "size": size, + } + } + return mission_order + +def make_blitz(size: int) -> Dict[str, Dict[str, Any]]: + mission_order = { + "blitz": { + "display_name": "", + "type": "blitz", + "size": size, + } + } + return mission_order + +def make_hopscotch(world: 'SC2World', size: int) -> Dict[str, Dict[str, Any]]: + mission_order = { + "hopscotch": { + "display_name": "", + "type": "hopscotch", + "size": size, + "two_start_positions": world.options.two_start_positions.value == TwoStartPositions.option_true + } + } + return mission_order + +def create_dynamic_mission_order(world: 'SC2World', mission_order_type: int, mission_pools: SC2MOGenMissionPools) -> Dict[str, Dict[str, Any]]: + num_missions = min(mission_pools.get_allowed_mission_count(), world.options.maximum_campaign_size.value) + num_missions = max(1, num_missions) + if mission_order_type == MissionOrder.option_golden_path: + return make_golden_path(world, num_missions) + + if mission_order_type == MissionOrder.option_grid: + mission_order = make_grid(world, num_missions) + elif mission_order_type == MissionOrder.option_gauntlet: + mission_order = make_gauntlet(num_missions) + elif mission_order_type == MissionOrder.option_blitz: + mission_order = make_blitz(num_missions) + elif mission_order_type == MissionOrder.option_hopscotch: + mission_order = make_hopscotch(world, num_missions) + else: + raise ValueError("Received unknown Mission Order type") + + # Optionally add key requirements + # This only works for layout types that don't define their own entry rules (which is currently all of them) + # Golden Path handles Key Mode on its own + key_mode = world.options.key_mode.value + if key_mode == KeyMode.option_missions: + mission_order[list(mission_order.keys())[0]]["missions"] = [ + { "index": "all", "entry_rules": [{ "items": { "Key": 1 }}] }, + { "index": "entrances", "entry_rules": [] } + ] + elif key_mode == KeyMode.option_progressive_missions: + mission_order[list(mission_order.keys())[0]]["missions"] = [ + { "index": "all", "entry_rules": [{ "items": { "Progressive Key": 1 }}] }, + { "index": "entrances", "entry_rules": [] } + ] + + return mission_order diff --git a/worlds/sc2/rules.py b/worlds/sc2/rules.py new file mode 100644 index 0000000000..2298c2cea6 --- /dev/null +++ b/worlds/sc2/rules.py @@ -0,0 +1,3605 @@ +from math import floor +from typing import TYPE_CHECKING, Set, Optional, Callable, Dict, Tuple, Iterable + +from BaseClasses import CollectionState, Location +from .item.item_groups import kerrigan_non_ulimates, kerrigan_logic_active_abilities +from .item.item_names import PROGRESSIVE_PROTOSS_AIR_WEAPON, PROGRESSIVE_PROTOSS_AIR_ARMOR, PROGRESSIVE_PROTOSS_SHIELDS +from .options import ( + RequiredTactics, + kerrigan_unit_available, + AllInMap, + GrantStoryTech, + GrantStoryLevels, + SpearOfAdunPassiveAbilityPresence, + SpearOfAdunPresence, + MissionOrder, + EnableMorphling, + NovaGhostOfAChanceVariant, + get_enabled_campaigns, + get_enabled_races, +) +from .item.item_tables import ( + tvx_defense_ratings, + tvz_defense_ratings, + tvx_air_defense_ratings, + kerrigan_levels, + get_full_item_list, + zvx_air_defense_ratings, + zvx_defense_ratings, + pvx_defense_ratings, + pvz_defense_ratings, + no_logic_basic_units, + advanced_basic_units, + basic_units, + upgrade_bundle_inverted_lookup, + WEAPON_ARMOR_UPGRADE_MAX_LEVEL, + soa_ultimate_ratings, + soa_energy_ratings, + terran_passive_ratings, + soa_passive_ratings, + zerg_passive_ratings, + protoss_passive_ratings, +) +from .mission_tables import SC2Race, SC2Campaign +from .item import item_groups, item_names + +if TYPE_CHECKING: + from . import SC2World + + +def min2(a: int, b: int) -> int: + """`min()` that only takes two values; faster than baseline int by about 2x""" + if a <= b: + return a + return b + + +class SC2Logic: + def __init__(self, world: Optional["SC2World"]) -> None: + # Note: Don't store a reference to the world so we can cache this object on the world object + self.player = -1 if world is None else world.player + self.logic_level: int = world.options.required_tactics.value if world else RequiredTactics.default + self.advanced_tactics = self.logic_level != RequiredTactics.option_standard + self.take_over_ai_allies = bool(world and world.options.take_over_ai_allies) + self.kerrigan_unit_available = ( + (True if world is None else (world.options.kerrigan_presence.value in kerrigan_unit_available)) + and SC2Campaign.HOTS in get_enabled_campaigns(world) + and SC2Race.ZERG in get_enabled_races(world) + ) + self.kerrigan_levels_per_mission_completed = 0 if world is None else world.options.kerrigan_levels_per_mission_completed.value + self.kerrigan_levels_per_mission_completed_cap = -1 if world is None else world.options.kerrigan_levels_per_mission_completed_cap.value + self.kerrigan_total_level_cap = -1 if world is None else world.options.kerrigan_total_level_cap.value + self.morphling_enabled = False if world is None else (world.options.enable_morphling.value == EnableMorphling.option_true) + self.grant_story_tech = GrantStoryTech.option_no_grant if world is None else (world.options.grant_story_tech.value) + self.story_levels_granted = False if world is None else (world.options.grant_story_levels.value != GrantStoryLevels.option_disabled) + self.basic_terran_units = get_basic_units(self.logic_level, SC2Race.TERRAN) + self.basic_zerg_units = get_basic_units(self.logic_level, SC2Race.ZERG) + self.basic_protoss_units = get_basic_units(self.logic_level, SC2Race.PROTOSS) + self.spear_of_adun_presence = SpearOfAdunPresence.default if world is None else world.options.spear_of_adun_presence.value + self.spear_of_adun_passive_presence = ( + SpearOfAdunPassiveAbilityPresence.default if world is None else world.options.spear_of_adun_passive_ability_presence.value + ) + self.enabled_campaigns = get_enabled_campaigns(world) + self.mission_order = MissionOrder.default if world is None else world.options.mission_order.value + self.generic_upgrade_missions = 0 if world is None else world.options.generic_upgrade_missions.value + self.all_in_map = AllInMap.option_ground if world is None else world.options.all_in_map.value + self.nova_ghost_of_a_chance_variant = NovaGhostOfAChanceVariant.option_wol if world is None else world.options.nova_ghost_of_a_chance_variant.value + self.war_council_upgrades = True if world is None else not world.options.war_council_nerfs.value + self.base_power_rating = 2 if self.advanced_tactics else 0 + + # Must be set externally for accurate logic checking of upgrade level when generic_upgrade_missions is checked + self.total_mission_count = 1 + + # Must be set externally + self.nova_used = True + + # Conditionally set to False by the world after culling items + self.has_barracks_unit: bool = True + self.has_factory_unit: bool = True + self.has_starport_unit: bool = True + self.has_zerg_melee_unit: bool = True + self.has_zerg_ranged_unit: bool = True + self.has_zerg_air_unit: bool = True + self.has_protoss_ground_unit: bool = True + self.has_protoss_air_unit: bool = True + + self.unit_count_functions: Dict[Tuple[SC2Race, int], Callable[[CollectionState], bool]] = {} + """Cache of logic functions used by any_units logic level""" + + # Super Globals + + def is_item_placement(self, state: CollectionState) -> bool: + """ + Tells if it's item placement or item pool filter + :return: True for item placement, False for pool filter + """ + # has_group with count = 0 is always true for item placement and always false for SC2 item filtering + return state.has_group("Missions", self.player, 0) + + def get_very_hard_required_upgrade_level(self) -> bool: + return 2 if self.advanced_tactics else 3 + + def weapon_armor_upgrade_count(self, upgrade_item: str, state: CollectionState) -> int: + assert upgrade_item in upgrade_bundle_inverted_lookup.keys() + count: int = 0 + if self.generic_upgrade_missions > 0: + if (not self.is_item_placement(state)) or self.logic_level == RequiredTactics.option_no_logic: + # Item pool filtering, W/A upgrades aren't items + # No Logic: Don't care about W/A in this case + return WEAPON_ARMOR_UPGRADE_MAX_LEVEL + else: + count += floor((100 / self.generic_upgrade_missions) * (state.count_group("Missions", self.player) / self.total_mission_count)) + count += state.count(upgrade_item, self.player) + count += state.count_from_list(upgrade_bundle_inverted_lookup[upgrade_item], self.player) + if upgrade_item == item_names.PROGRESSIVE_PROTOSS_SHIELDS: + count += max( + state.count(item_names.PROGRESSIVE_PROTOSS_GROUND_UPGRADE, self.player), + state.count(item_names.PROGRESSIVE_PROTOSS_AIR_UPGRADE, self.player), + ) + if upgrade_item in item_groups.protoss_generic_upgrades and state.has(item_names.QUATRO, self.player): + count += 1 + return count + + def soa_power_rating(self, state: CollectionState) -> bool: + power_rating = 0 + # Spear of Adun Ultimates (Strongest) + for item, rating in soa_ultimate_ratings.items(): + if state.has(item, self.player): + power_rating += rating + break + # Spear of Adun ability that consumes energy (Strongest, then second strongest) + found_main_weapon = False + for item, rating in soa_energy_ratings.items(): + count = 1 + if item == item_names.SOA_PROGRESSIVE_PROXY_PYLON: + count = 2 + if state.has(item, self.player, count): + if not found_main_weapon: + power_rating += rating + found_main_weapon = True + else: + power_rating += rating // 2 + break + # Mass Recall (Negligible energy cost) + if state.has(item_names.SOA_MASS_RECALL, self.player): + power_rating += 2 + return power_rating + + # Global Terran + + def terran_power_rating(self, state: CollectionState) -> int: + power_score = self.base_power_rating + # Passive Score (Economic upgrades and global army upgrades) + power_score += sum((rating for item, rating in terran_passive_ratings.items() if state.has(item, self.player))) + # Spear of Adun + if self.spear_of_adun_presence == SpearOfAdunPresence.option_everywhere: + power_score += self.soa_power_rating(state) + if self.spear_of_adun_passive_presence == SpearOfAdunPassiveAbilityPresence.option_everywhere: + power_score += sum((rating for item, rating in soa_passive_ratings.items() if state.has(item, self.player))) + return power_score + + def terran_army_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + """ + Minimum W/A upgrade level for unit classes present in the world + """ + count: int = WEAPON_ARMOR_UPGRADE_MAX_LEVEL + if self.has_barracks_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, state), + ) + if self.has_factory_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, state), + ) + if self.has_starport_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR, state), + ) + return count + + def terran_very_hard_mission_weapon_armor_level(self, state: CollectionState) -> bool: + return self.terran_army_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + + # WoL + def terran_common_unit(self, state: CollectionState) -> bool: + return state.has_any(self.basic_terran_units, self.player) + + def terran_early_tech(self, state: CollectionState) -> bool: + """ + Basic combat unit that can be deployed quickly from mission start + :param state + :return: + """ + return state.has_any( + {item_names.MARINE, item_names.DOMINION_TROOPER, item_names.FIREBAT, item_names.MARAUDER, item_names.REAPER, item_names.HELLION}, + self.player, + ) or ( + self.advanced_tactics and state.has_any({item_names.GOLIATH, item_names.DIAMONDBACK, item_names.VIKING, item_names.BANSHEE}, self.player) + ) + + def terran_air(self, state: CollectionState) -> bool: + """ + Air units or drops on advanced tactics + """ + return ( + state.has_any({item_names.VIKING, item_names.WRAITH, item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) + or state.has_all((item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), self.player) + or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + or ( + self.advanced_tactics + and ( + (state.has_any({item_names.HERCULES, item_names.MEDIVAC}, self.player) and self.terran_common_unit(state)) + or (state.has_all((item_names.RAVEN, item_names.RAVEN_HUNTER_SEEKER_WEAPON), self.player)) + ) + ) + ) + + def terran_air_anti_air(self, state: CollectionState) -> bool: + """ + Air-to-air + """ + return ( + state.has(item_names.VIKING, self.player) + or state.has_all({item_names.WRAITH, item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) + or state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + or ( + self.advanced_tactics + and state.has_any({item_names.WRAITH, item_names.VALKYRIE, item_names.BATTLECRUISER}, self.player) + and self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 + ) + ) + + def terran_any_air_unit(self, state: CollectionState) -> bool: + return state.has_any( + { + item_names.VIKING, + item_names.MEDIVAC, + item_names.RAVEN, + item_names.BANSHEE, + item_names.SCIENCE_VESSEL, + item_names.BATTLECRUISER, + item_names.WRAITH, + item_names.HERCULES, + item_names.LIBERATOR, + item_names.VALKYRIE, + item_names.SKY_FURY, + item_names.NIGHT_HAWK, + item_names.EMPERORS_GUARDIAN, + item_names.NIGHT_WOLF, + item_names.PRIDE_OF_AUGUSTRGRAD, + }, + self.player, + ) + + def terran_competent_ground_to_air(self, state: CollectionState) -> bool: + """ + Ground-to-air + """ + return ( + state.has(item_names.GOLIATH, self.player) + or ( + state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER}, self.player) + and self.terran_bio_heal(state) + and self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, state) >= 2 + ) + or self.advanced_tactics + and ( + state.has(item_names.CYCLONE, self.player) + or state.has_all((item_names.THOR, item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD), self.player) + ) + ) + + def terran_competent_anti_air(self, state: CollectionState) -> bool: + """ + Good AA unit + """ + return self.terran_competent_ground_to_air(state) or self.terran_air_anti_air(state) + + def terran_any_anti_air(self, state: CollectionState) -> bool: + return ( + state.has_any( + ( + # Barracks + item_names.MARINE, + item_names.WAR_PIGS, + item_names.SON_OF_KORHAL, + item_names.DOMINION_TROOPER, + item_names.GHOST, + item_names.SPECTRE, + item_names.EMPERORS_SHADOW, + # Factory + item_names.GOLIATH, + item_names.SPARTAN_COMPANY, + item_names.BULWARK_COMPANY, + item_names.CYCLONE, + item_names.WIDOW_MINE, + item_names.THOR, + item_names.JOTUN, + item_names.BLACKHAMMER, + # Ships + item_names.WRAITH, + item_names.WINGED_NIGHTMARES, + item_names.NIGHT_HAWK, + item_names.VIKING, + item_names.HELS_ANGELS, + item_names.SKY_FURY, + item_names.LIBERATOR, + item_names.MIDNIGHT_RIDERS, + item_names.EMPERORS_GUARDIAN, + item_names.VALKYRIE, + item_names.BRYNHILDS, + item_names.BATTLECRUISER, + item_names.JACKSONS_REVENGE, + item_names.PRIDE_OF_AUGUSTRGRAD, + item_names.RAVEN, + # Buildings + item_names.MISSILE_TURRET, + ), + self.player, + ) + or state.has_all((item_names.REAPER, item_names.REAPER_JET_PACK_OVERDRIVE), self.player) + or state.has_all((item_names.PLANETARY_FORTRESS, item_names.PLANETARY_FORTRESS_IBIKS_TRACKING_SCANNERS), self.player) + or ( + state.has(item_names.MEDIVAC, self.player) + and state.has_any((item_names.SIEGE_TANK, item_names.SIEGE_BREAKERS, item_names.SHOCK_DIVISION), self.player) + and state.count(item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK, self.player) >= 2 + ) + ) + + def terran_any_anti_air_or_science_vessels(self, state: CollectionState) -> bool: + return self.terran_any_anti_air(state) or state.has(item_names.SCIENCE_VESSEL, self.player) + + def terran_moderate_anti_air(self, state: CollectionState) -> bool: + return self.terran_competent_anti_air(state) or ( + state.has_any( + ( + item_names.MARINE, + item_names.DOMINION_TROOPER, + item_names.THOR, + item_names.CYCLONE, + item_names.BATTLECRUISER, + item_names.WRAITH, + item_names.VALKYRIE, + ), + self.player, + ) + or ( + state.has_all((item_names.MEDIVAC, item_names.SIEGE_TANK), self.player) + and state.count(item_names.SIEGE_TANK_PROGRESSIVE_TRANSPORT_HOOK, self.player) >= 2 + ) + or (self.advanced_tactics and state.has_any((item_names.GHOST, item_names.SPECTRE, item_names.LIBERATOR), self.player)) + ) + + def terran_basic_anti_air(self, state: CollectionState) -> bool: + """ + Basic AA to deal with few air units + """ + return ( + state.has_any( + ( + item_names.MISSILE_TURRET, + item_names.WAR_PIGS, + item_names.SPARTAN_COMPANY, + item_names.HELS_ANGELS, + item_names.WINGED_NIGHTMARES, + item_names.BRYNHILDS, + item_names.SKY_FURY, + item_names.SON_OF_KORHAL, + item_names.BULWARK_COMPANY, + ), + self.player, + ) + or self.terran_moderate_anti_air(state) + or self.advanced_tactics + and ( + state.has_any( + ( + item_names.WIDOW_MINE, + item_names.PRIDE_OF_AUGUSTRGRAD, + item_names.BLACKHAMMER, + item_names.EMPERORS_SHADOW, + item_names.EMPERORS_GUARDIAN, + item_names.NIGHT_HAWK, + ), + self.player, + ) + ) + ) + + def terran_defense_rating(self, state: CollectionState, zerg_enemy: bool, air_enemy: bool = True) -> int: + """ + Ability to handle defensive missions + :param state: + :param zerg_enemy: Whether the enemy is zerg + :param air_enemy: Whether the enemy attacks with air + :return: + """ + defense_score = sum((tvx_defense_ratings[item] for item in tvx_defense_ratings if state.has(item, self.player))) + # Manned Bunker + if state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.MARAUDER}, self.player) and state.has( + item_names.BUNKER, self.player + ): + defense_score += 3 + elif zerg_enemy and state.has(item_names.FIREBAT, self.player) and state.has(item_names.BUNKER, self.player): + defense_score += 2 + # Siege Tank upgrades + if state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_MAELSTROM_ROUNDS}, self.player): + defense_score += 2 + if state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_GRADUATING_RANGE}, self.player): + defense_score += 1 + # Widow Mine upgrade + if state.has_all({item_names.WIDOW_MINE, item_names.WIDOW_MINE_CONCEALMENT}, self.player): + defense_score += 1 + # Viking with splash + if state.has_all({item_names.VIKING, item_names.VIKING_SHREDDER_ROUNDS}, self.player): + defense_score += 2 + + # General enemy-based rules + if zerg_enemy: + defense_score += sum((tvz_defense_ratings[item] for item in tvz_defense_ratings if state.has(item, self.player))) + if air_enemy: + # Capped at 2 + defense_score += min(sum((tvx_air_defense_ratings[item] for item in tvx_air_defense_ratings if state.has(item, self.player))), 2) + if air_enemy and zerg_enemy and state.has(item_names.VALKYRIE, self.player): + # Valkyries shred mass Mutas, the most common air enemy that's massed in these cases + defense_score += 2 + # Advanced Tactics bumps defense rating requirements down by 2 + if self.advanced_tactics: + defense_score += 2 + return defense_score + + def terran_competent_comp(self, state: CollectionState, upgrade_level: int = 1) -> bool: + # All competent comps require anti-air + if not self.terran_competent_anti_air(state): + return False + # Infantry with Healing + infantry_weapons = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, state) + infantry_armor = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, state) + infantry = state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.MARAUDER}, self.player) + if infantry_weapons >= upgrade_level + 1 and infantry_armor >= upgrade_level and infantry and self.terran_bio_heal(state): + return True + # Mass Air-To-Ground + ship_weapons = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) + ship_armor = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR, state) + if ship_weapons >= upgrade_level and ship_armor >= upgrade_level: + air = ( + state.has_any({item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) + or state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + or state.has_all({item_names.WRAITH, item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) + or state.has_all({item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES}, self.player) + and ship_weapons >= 2 + ) + if air and self.terran_mineral_dump(state): + return True + # Strong Mech + vehicle_weapons = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, state) + vehicle_armor = self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, state) + if vehicle_weapons >= upgrade_level and vehicle_armor >= upgrade_level: + strong_vehicle = state.has_any({item_names.THOR, item_names.SIEGE_TANK}, self.player) + light_frontline = state.has_any( + {item_names.MARINE, item_names.DOMINION_TROOPER, item_names.HELLION, item_names.VULTURE}, self.player + ) or state.has_all({item_names.REAPER, item_names.REAPER_RESOURCE_EFFICIENCY}, self.player) + if strong_vehicle and light_frontline: + return True + # Mech with Healing + vehicle = state.has_any({item_names.GOLIATH, item_names.WARHOUND}, self.player) + micro_gas_vehicle = self.advanced_tactics and state.has_any({item_names.DIAMONDBACK, item_names.CYCLONE}, self.player) + if self.terran_sustainable_mech_heal(state) and (vehicle or (micro_gas_vehicle and light_frontline)): + return True + return False + + def terran_mineral_dump(self, state: CollectionState) -> bool: + """ + Can build something using only minerals + """ + return ( + state.has_any({item_names.MARINE, item_names.VULTURE, item_names.HELLION, item_names.SON_OF_KORHAL}, self.player) + or state.has_all({item_names.REAPER, item_names.REAPER_RESOURCE_EFFICIENCY}, self.player) + or (self.advanced_tactics and state.has_any({item_names.PERDITION_TURRET, item_names.DEVASTATOR_TURRET}, self.player)) + ) + + def terran_beats_protoss_deathball(self, state: CollectionState) -> bool: + """ + Ability to deal with Immortals, Colossi with some air support + """ + return ( + ( + state.has_any({item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) + or state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + ) + and self.terran_competent_anti_air(state) + or self.terran_competent_comp(state) + and self.terran_air_anti_air(state) + ) and self.terran_army_weapon_armor_upgrade_min_level(state) >= 2 + + def marine_medic_upgrade(self, state: CollectionState) -> bool: + """ + Infantry upgrade to infantry-only no-build segments + """ + return ( + state.has_any({item_names.MARINE_COMBAT_SHIELD, item_names.MARINE_MAGRAIL_MUNITIONS, item_names.MEDIC_STABILIZER_MEDPACKS}, self.player) + or (state.count(item_names.MARINE_PROGRESSIVE_STIMPACK, self.player) >= 2 and state.has_group("Missions", self.player, 1)) + or self.advanced_tactics + and state.has(item_names.MARINE_LASER_TARGETING_SYSTEM, self.player) + ) + + def marine_medic_firebat_upgrade(self, state: CollectionState) -> bool: + return ( + self.marine_medic_upgrade(state) + or state.count(item_names.FIREBAT_PROGRESSIVE_STIMPACK, self.player) >= 2 + or state.has_any((item_names.FIREBAT_NANO_PROJECTORS, item_names.FIREBAT_JUGGERNAUT_PLATING), self.player) + ) + + def terran_bio_heal(self, state: CollectionState) -> bool: + """ + Ability to heal bio units + """ + return state.has_any({item_names.MEDIC, item_names.MEDIVAC, item_names.FIELD_RESPONSE_THETA}, self.player) or ( + self.advanced_tactics and state.has_all({item_names.RAVEN, item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player) + ) + + def terran_base_trasher(self, state: CollectionState) -> bool: + """ + Can attack heavily defended bases + """ + if not self.terran_competent_comp(state): + return False + if not self.terran_very_hard_mission_weapon_armor_level(state): + return False + return ( + state.has_all((item_names.SIEGE_TANK, item_names.SIEGE_TANK_JUMP_JETS), self.player) + or state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + or state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + or ( + self.advanced_tactics + and (state.has_all({item_names.RAVEN, item_names.RAVEN_HUNTER_SEEKER_WEAPON}, self.player)) + and ( + state.has_all({item_names.VIKING, item_names.VIKING_SHREDDER_ROUNDS}, self.player) + or state.has_all({item_names.BANSHEE, item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY}, self.player) + ) + ) + ) + + def terran_mobile_detector(self, state: CollectionState) -> bool: + return state.has_any({item_names.RAVEN, item_names.SCIENCE_VESSEL, item_names.COMMAND_CENTER_SCANNER_SWEEP}, self.player) + + def can_nuke(self, state: CollectionState) -> bool: + """ + Ability to launch nukes + """ + return self.advanced_tactics and ( + state.has_any({item_names.GHOST, item_names.SPECTRE}, self.player) + or state.has_all({item_names.THOR, item_names.THOR_BUTTON_WITH_A_SKULL_ON_IT}, self.player) + ) + + def terran_sustainable_mech_heal(self, state: CollectionState) -> bool: + """ + Can heal mech units without spending resources + """ + return ( + state.has(item_names.SCIENCE_VESSEL, self.player) + or ( + state.has_any({item_names.MEDIC, item_names.FIELD_RESPONSE_THETA}, self.player) + and state.has(item_names.MEDIC_ADAPTIVE_MEDPACKS, self.player) + ) + or state.count(item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 3 + or ( + self.advanced_tactics + and ( + state.has_all({item_names.RAVEN, item_names.RAVEN_BIO_MECHANICAL_REPAIR_DRONE}, self.player) + or state.count(item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL, self.player) >= 2 + ) + ) + ) + + def terran_cliffjumper(self, state: CollectionState) -> bool: + return ( + state.has(item_names.REAPER, self.player) + or state.has_all({item_names.GOLIATH, item_names.GOLIATH_JUMP_JETS}, self.player) + or state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_JUMP_JETS}, self.player) + ) + + def nova_any_nobuild_damage(self, state: CollectionState) -> bool: + return state.has_any( + ( + item_names.NOVA_C20A_CANISTER_RIFLE, + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_PLASMA_RIFLE, + item_names.NOVA_MONOMOLECULAR_BLADE, + item_names.NOVA_BLAZEFIRE_GUNBLADE, + item_names.NOVA_PULSE_GRENADES, + item_names.NOVA_DOMINATION, + ), + self.player, + ) + + def nova_any_weapon(self, state: CollectionState) -> bool: + return state.has_any( + { + item_names.NOVA_C20A_CANISTER_RIFLE, + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_PLASMA_RIFLE, + item_names.NOVA_MONOMOLECULAR_BLADE, + item_names.NOVA_BLAZEFIRE_GUNBLADE, + }, + self.player, + ) + + def nova_ranged_weapon(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_HELLFIRE_SHOTGUN, item_names.NOVA_PLASMA_RIFLE}, self.player) + + def nova_anti_air_weapon(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_PLASMA_RIFLE, item_names.NOVA_BLAZEFIRE_GUNBLADE}, self.player) + + def nova_splash(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_HELLFIRE_SHOTGUN, item_names.NOVA_PULSE_GRENADES}, self.player) or ( + self.advanced_tactics and state.has_any({item_names.NOVA_PLASMA_RIFLE, item_names.NOVA_MONOMOLECULAR_BLADE}, self.player) + ) + + def nova_dash(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_MONOMOLECULAR_BLADE, item_names.NOVA_BLINK}, self.player) + + def nova_full_stealth(self, state: CollectionState) -> bool: + return state.count(item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player) >= 2 + + def nova_heal(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_ARMORED_SUIT_MODULE, item_names.NOVA_STIM_INFUSION}, self.player) + + def nova_escape_assist(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_BLINK, item_names.NOVA_HOLO_DECOY, item_names.NOVA_IONIC_FORCE_FIELD}, self.player) + + def nova_beat_stone(self, state: CollectionState) -> bool: + """ + Used for any units logic for beating Stone. Shotgun may not be possible; may need feedback. + """ + return ( + state.has_any(( + item_names.NOVA_DOMINATION, + item_names.NOVA_BLAZEFIRE_GUNBLADE, + item_names.NOVA_C20A_CANISTER_RIFLE, + ), self.player) + or (( + state.has_any(( + item_names.NOVA_PLASMA_RIFLE, + item_names.NOVA_MONOMOLECULAR_BLADE, + ), self.player) + or state.has_all(( + item_names.NOVA_HELLFIRE_SHOTGUN, + item_names.NOVA_STIM_INFUSION + ), self.player) + ) + and state.has_any(( + item_names.NOVA_JUMP_SUIT_MODULE, + item_names.NOVA_ARMORED_SUIT_MODULE, + item_names.NOVA_ENERGY_SUIT_MODULE, + ), self.player) + and state.has_any(( + item_names.NOVA_FLASHBANG_GRENADES, + item_names.NOVA_STIM_INFUSION, + item_names.NOVA_BLINK, + item_names.NOVA_IONIC_FORCE_FIELD, + ), self.player) + ) + ) + + # Global Zerg + def zerg_power_rating(self, state: CollectionState) -> int: + power_score = self.base_power_rating + # Passive Score (Economic upgrades and global army upgrades) + power_score += sum((rating for item, rating in zerg_passive_ratings.items() if state.has(item, self.player))) + # Spear of Adun + if self.spear_of_adun_presence == SpearOfAdunPresence.option_everywhere: + power_score += self.soa_power_rating(state) + if self.spear_of_adun_passive_presence == SpearOfAdunPassiveAbilityPresence.option_everywhere: + power_score += sum((rating for item, rating in soa_passive_ratings.items() if state.has(item, self.player))) + return power_score + + def zerg_defense_rating(self, state: CollectionState, zerg_enemy: bool, air_enemy: bool = True) -> int: + """ + Ability to handle defensive missions + :param state: + :param zerg_enemy: Whether the enemy is zerg + :param air_enemy: Whether the enemy attacks with air + """ + defense_score = sum((zvx_defense_ratings[item] for item in zvx_defense_ratings if state.has(item, self.player))) + # Twin Drones + if state.has(item_names.TWIN_DRONES, self.player): + if state.has(item_names.SPINE_CRAWLER, self.player): + defense_score += 1 + if state.has(item_names.SPORE_CRAWLER, self.player) and air_enemy: + defense_score += 1 + # Impaler + if self.morph_impaler(state): + defense_score += 3 + if state.has(item_names.IMPALER_SUNKEN_SPINES, self.player): + defense_score += 1 + if zerg_enemy: + defense_score += -1 + # Lurker + if self.morph_lurker(state): + defense_score += 2 + if state.has(item_names.LURKER_SEISMIC_SPINES, self.player): + defense_score += 2 + if state.has(item_names.LURKER_ADAPTED_SPINES, self.player) and not zerg_enemy: + defense_score += 1 + if zerg_enemy: + defense_score += 1 + # Brood Lord + if self.morph_brood_lord(state): + defense_score += 2 + # Corpser Roach + if state.has_all({item_names.ROACH, item_names.ROACH_CORPSER_STRAIN}, self.player): + defense_score += 1 + if zerg_enemy: + defense_score += 1 + # Igniter + if self.morph_igniter(state) and zerg_enemy: + defense_score += 2 + # Creep Tumors + if self.spread_creep(state, False): + if not zerg_enemy: + defense_score += 1 + if state.has(item_names.MALIGNANT_CREEP, self.player): + defense_score += 1 + # Infested Siege Tanks + if self.zerg_infested_tank_with_ammo(state): + defense_score += 5 + # Infested Liberators + if state.has_all((item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE), self.player): + defense_score += 3 + # Bile Launcher upgrades + if state.has_all((item_names.BILE_LAUNCHER, item_names.BILE_LAUNCHER_RAPID_BOMBARMENT), self.player): + defense_score += 2 + + # General enemy-based rules + if air_enemy: + # Capped at 2 + defense_score += min(sum((zvx_air_defense_ratings[item] for item in zvx_air_defense_ratings if state.has(item, self.player))), 2) + # Advanced Tactics bumps defense rating requirements down by 2 + if self.advanced_tactics: + defense_score += 2 + return defense_score + + def zerg_army_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + count: int = WEAPON_ARMOR_UPGRADE_MAX_LEVEL + if self.has_zerg_melee_unit: + count = min2(count, self.zerg_melee_weapon_armor_upgrade_min_level(state)) + if self.has_zerg_ranged_unit: + count = min2(count, self.zerg_ranged_weapon_armor_upgrade_min_level(state)) + if self.has_zerg_air_unit: + count = min2(count, self.zerg_flyer_weapon_armor_upgrade_min_level(state)) + return count + + def zerg_melee_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + return min2( + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_MELEE_ATTACK, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, state), + ) + + def zerg_ranged_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + return min2( + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_MISSILE_ATTACK, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_GROUND_CARAPACE, state), + ) + + def zerg_flyer_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + return min2( + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_FLYER_ATTACK, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_ZERG_FLYER_CARAPACE, state), + ) + + def zerg_can_collect_pickup_across_gap(self, state: CollectionState) -> bool: + """Any way for zerg to get any ground unit across gaps longer than viper yoink range to collect a pickup.""" + return ( + state.has_any( + ( + item_names.NYDUS_WORM, + item_names.ECHIDNA_WORM, + item_names.OVERLORD_VENTRAL_SACS, + item_names.YGGDRASIL, + item_names.INFESTED_BANSHEE, + ), + self.player, + ) + or (self.morph_ravager(state) and state.has(item_names.RAVAGER_DEEP_TUNNEL, self.player)) + or state.has_all( + ( + item_names.INFESTED_SIEGE_TANK, + item_names.INFESTED_SIEGE_TANK_DEEP_TUNNEL, + item_names.OVERLORD_GENERATE_CREEP, + ), + self.player, + ) + or state.has_all((item_names.SWARM_QUEEN_DEEP_TUNNEL, item_names.OVERLORD_OVERSEER_ASPECT), self.player) # Deep tunnel to a creep tumor + ) + + def zerg_has_infested_scv(self, state: CollectionState) -> bool: + return ( + state.has_any(( + item_names.INFESTED_MARINE, + item_names.INFESTED_BUNKER, + item_names.INFESTED_DIAMONDBACK, + item_names.INFESTED_SIEGE_TANK, + item_names.INFESTED_BANSHEE, + item_names.BULLFROG, + item_names.INFESTED_LIBERATOR, + item_names.INFESTED_MISSILE_TURRET, + ), self.player) + ) + + def zerg_very_hard_mission_weapon_armor_level(self, state: CollectionState) -> bool: + return self.zerg_army_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + + def zerg_common_unit(self, state: CollectionState) -> bool: + return state.has_any(self.basic_zerg_units, self.player) + + def zerg_competent_anti_air(self, state: CollectionState) -> bool: + return state.has_any({item_names.HYDRALISK, item_names.MUTALISK, item_names.CORRUPTOR, item_names.BROOD_QUEEN}, self.player) or ( + self.advanced_tactics and state.has(item_names.INFESTOR, self.player) + ) + + def zerg_moderate_anti_air(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_anti_air(state) + or self.zerg_basic_air_to_air(state) + or ( + state.has(item_names.SWARM_QUEEN, self.player) + or state.has_all({item_names.SWARM_HOST, item_names.SWARM_HOST_PRESSURIZED_GLANDS}, self.player) + or (self.spread_creep(state, True) and state.has(item_names.INFESTED_BUNKER, self.player)) + ) + or (self.advanced_tactics and state.has(item_names.INFESTED_MARINE, self.player)) + ) + + def zerg_kerrigan_or_any_anti_air(self, state: CollectionState) -> bool: + return self.kerrigan_unit_available or self.zerg_any_anti_air(state) + + def zerg_any_anti_air(self, state: CollectionState) -> bool: + return ( + state.has_any( + ( + item_names.HYDRALISK, + item_names.SWARM_QUEEN, + item_names.BROOD_QUEEN, + item_names.MUTALISK, + item_names.CORRUPTOR, + item_names.SCOURGE, + item_names.INFESTOR, + item_names.INFESTED_MARINE, + item_names.INFESTED_LIBERATOR, + item_names.SPORE_CRAWLER, + item_names.INFESTED_MISSILE_TURRET, + item_names.INFESTED_BUNKER, + item_names.HUNTER_KILLERS, + item_names.CAUSTIC_HORRORS, + ), + self.player, + ) + or state.has_all((item_names.SWARM_HOST, item_names.SWARM_HOST_PRESSURIZED_GLANDS), self.player) + or state.has_all((item_names.ABERRATION, item_names.ABERRATION_PROGRESSIVE_BANELING_LAUNCH), self.player) + or state.has_all((item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE), self.player) + or self.morph_ravager(state) + or self.morph_viper(state) + or self.morph_devourer(state) + or (self.morph_guardian(state) and state.has(item_names.GUARDIAN_PRIMAL_ADAPTATION, self.player)) + ) + + def zerg_basic_anti_air(self, state: CollectionState) -> bool: + return self.zerg_basic_kerriganless_anti_air(state) or self.kerrigan_unit_available + + def zerg_basic_kerriganless_anti_air(self, state: CollectionState) -> bool: + return ( + self.zerg_moderate_anti_air(state) + or state.has_any((item_names.HUNTER_KILLERS, item_names.CAUSTIC_HORRORS), self.player) + or (self.advanced_tactics and state.has_any({item_names.SPORE_CRAWLER, item_names.INFESTED_MISSILE_TURRET}, self.player)) + ) + + def zerg_basic_air_to_air(self, state: CollectionState) -> bool: + return ( + state.has_any( + {item_names.MUTALISK, item_names.CORRUPTOR, item_names.BROOD_QUEEN, item_names.SCOURGE, item_names.INFESTED_LIBERATOR}, self.player + ) + or self.morph_devourer(state) + or self.morph_viper(state) + or (self.morph_guardian(state) and state.has(item_names.GUARDIAN_PRIMAL_ADAPTATION, self.player)) + ) + + def zerg_basic_air_to_ground(self, state: CollectionState) -> bool: + return ( + state.has_any({item_names.MUTALISK, item_names.INFESTED_BANSHEE}, self.player) + or self.morph_guardian(state) + or self.morph_brood_lord(state) + or (self.morph_devourer(state) and state.has(item_names.DEVOURER_PRESCIENT_SPORES, self.player)) + ) + + def zerg_versatile_air(self, state: CollectionState) -> bool: + return self.zerg_basic_air_to_air(state) and self.zerg_basic_air_to_ground(state) + + def zerg_infested_tank_with_ammo(self, state: CollectionState) -> bool: + return state.has(item_names.INFESTED_SIEGE_TANK, self.player) and ( + state.has_all({item_names.INFESTOR, item_names.INFESTOR_INFESTED_TERRAN}, self.player) + or state.has(item_names.INFESTED_BUNKER, self.player) + or (self.advanced_tactics and state.has(item_names.INFESTED_MARINE, self.player)) + or state.count(item_names.INFESTED_SIEGE_TANK_PROGRESSIVE_AUTOMATED_MITOSIS, self.player) >= (1 if self.advanced_tactics else 2) + ) + + def morph_baneling(self, state: CollectionState) -> bool: + return (state.has(item_names.ZERGLING, self.player) or self.morphling_enabled) and state.has(item_names.ZERGLING_BANELING_ASPECT, self.player) + + def morph_ravager(self, state: CollectionState) -> bool: + return (state.has(item_names.ROACH, self.player) or self.morphling_enabled) and state.has(item_names.ROACH_RAVAGER_ASPECT, self.player) + + def morph_brood_lord(self, state: CollectionState) -> bool: + return (state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) or self.morphling_enabled) and state.has( + item_names.MUTALISK_CORRUPTOR_BROOD_LORD_ASPECT, self.player + ) + + def morph_guardian(self, state: CollectionState) -> bool: + return (state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) or self.morphling_enabled) and state.has( + item_names.MUTALISK_CORRUPTOR_GUARDIAN_ASPECT, self.player + ) + + def morph_viper(self, state: CollectionState) -> bool: + return (state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) or self.morphling_enabled) and state.has( + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, self.player + ) + + def morph_devourer(self, state: CollectionState) -> bool: + return (state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) or self.morphling_enabled) and state.has( + item_names.MUTALISK_CORRUPTOR_DEVOURER_ASPECT, self.player + ) + + def morph_impaler(self, state: CollectionState) -> bool: + return (state.has(item_names.HYDRALISK, self.player) or self.morphling_enabled) and state.has( + item_names.HYDRALISK_IMPALER_ASPECT, self.player + ) + + def morph_lurker(self, state: CollectionState) -> bool: + return (state.has(item_names.HYDRALISK, self.player) or self.morphling_enabled) and state.has(item_names.HYDRALISK_LURKER_ASPECT, self.player) + + def morph_impaler_or_lurker(self, state: CollectionState) -> bool: + return self.morph_impaler(state) or self.morph_lurker(state) + + def morph_igniter(self, state: CollectionState) -> bool: + return (state.has(item_names.ROACH, self.player) or self.morphling_enabled) and state.has(item_names.ROACH_PRIMAL_IGNITER_ASPECT, self.player) + + def morph_tyrannozor(self, state: CollectionState) -> bool: + return state.has(item_names.ULTRALISK_TYRANNOZOR_ASPECT, self.player) and ( + state.has(item_names.ULTRALISK, self.player) or self.morphling_enabled + ) + + def zerg_competent_comp(self, state: CollectionState) -> bool: + if self.zerg_army_weapon_armor_upgrade_min_level(state) < 2: + return False + advanced = self.advanced_tactics + core_unit = state.has_any( + {item_names.ROACH, item_names.ABERRATION, item_names.ZERGLING, item_names.INFESTED_DIAMONDBACK}, self.player + ) or self.morph_igniter(state) + support_unit = ( + state.has_any({item_names.SWARM_QUEEN, item_names.HYDRALISK, item_names.INFESTED_BANSHEE}, self.player) + or self.morph_brood_lord(state) + or state.has_all((item_names.MUTALISK, item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE), self.player) + or advanced + and (state.has_any({item_names.INFESTOR, item_names.DEFILER}, self.player) or self.morph_viper(state)) + ) + if core_unit and support_unit: + return True + vespene_unit = ( + state.has_any({item_names.ULTRALISK, item_names.ABERRATION}, self.player) + or ( + self.morph_guardian(state) + and state.has_any( + (item_names.GUARDIAN_SORONAN_ACID, item_names.GUARDIAN_EXPLOSIVE_SPORES, item_names.GUARDIAN_PRIMORDIAL_FURY), self.player + ) + ) + or advanced + and self.morph_viper(state) + ) + return vespene_unit and state.has_any({item_names.ZERGLING, item_names.SWARM_QUEEN}, self.player) + + def zerg_common_unit_basic_aa(self, state: CollectionState) -> bool: + return self.zerg_common_unit(state) and self.zerg_basic_anti_air(state) + + def zerg_common_unit_competent_aa(self, state: CollectionState) -> bool: + return self.zerg_common_unit(state) and self.zerg_competent_anti_air(state) + + def zerg_competent_comp_basic_aa(self, state: CollectionState) -> bool: + return self.zerg_competent_comp(state) and self.zerg_basic_anti_air(state) + + def zerg_competent_comp_competent_aa(self, state: CollectionState) -> bool: + return self.zerg_competent_comp(state) and self.zerg_competent_anti_air(state) + + def spread_creep(self, state: CollectionState, free_creep_tumor=True) -> bool: + return (self.advanced_tactics and free_creep_tumor) or state.has_any( + {item_names.SWARM_QUEEN, item_names.OVERLORD_OVERSEER_ASPECT}, self.player + ) + + def zerg_mineral_dump(self, state: CollectionState) -> bool: + return ( + state.has_any({item_names.ZERGLING, item_names.PYGALISK, item_names.INFESTED_BUNKER}, self.player) + or state.has_all({item_names.SWARM_QUEEN, item_names.SWARM_QUEEN_RESOURCE_EFFICIENCY}, self.player) + or (self.advanced_tactics and self.spread_creep(state) and state.has(item_names.SPINE_CRAWLER, self.player)) + ) + + def zerg_big_monsters(self, state: CollectionState) -> bool: + """ + Durable units with some capacity for damage + """ + return ( + self.morph_tyrannozor(state) + or state.has_any((item_names.ABERRATION, item_names.ULTRALISK), self.player) + or (self.spread_creep(state, False) and state.has(item_names.INFESTED_BUNKER, self.player)) + ) + + def zerg_base_buster(self, state: CollectionState) -> bool: + """Powerful and sustainable zerg anti-ground for busting big bases; anti-air not included""" + if not self.zerg_competent_comp(state): + return False + return ( + ( + self.zerg_melee_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + and ( + self.morph_tyrannozor(state) + or ( + state.has(item_names.ULTRALISK, self.player) + and state.has_any((item_names.ULTRALISK_TORRASQUE_STRAIN, item_names.ULTRALISK_CHITINOUS_PLATING), self.player) + ) + or (self.morph_baneling(state) and state.has(item_names.BANELING_SPLITTER_STRAIN, self.player)) + ) + and state.has(item_names.SWARM_QUEEN, self.player) # Healing to sustain the frontline + ) + or ( + self.zerg_ranged_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + and ( + self.morph_impaler(state) + or self.morph_lurker(state) + and state.has_all((item_names.LURKER_SEISMIC_SPINES, item_names.LURKER_ADAPTED_SPINES), self.player) + or state.has_all( + ( + item_names.ROACH, + item_names.ROACH_CORPSER_STRAIN, + item_names.ROACH_ADAPTIVE_PLATING, + item_names.ROACH_GLIAL_RECONSTITUTION, + ), + self.player, + ) + or self.morph_igniter(state) + and state.has(item_names.PRIMAL_IGNITER_PRIMAL_TENACITY, self.player) + or state.has_all((item_names.INFESTOR, item_names.INFESTOR_INFESTED_TERRAN), self.player) + or self.spread_creep(state, False) + and state.has(item_names.INFESTED_BUNKER, self.player) + or self.zerg_infested_tank_with_ammo(state) + # Highly-upgraded swarm hosts may also work, but that would require promoting many upgrades to progression + ) + ) + or ( + self.zerg_flyer_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + and ( + self.morph_brood_lord(state) + or self.morph_guardian(state) + and state.has_all((item_names.GUARDIAN_PROPELLANT_SACS, item_names.GUARDIAN_SORONAN_ACID), self.player) + or state.has_all((item_names.INFESTED_BANSHEE, item_names.INFESTED_BANSHEE_FLESHFUSED_TARGETING_OPTICS), self.player) + # Highly-upgraded anti-ground devourers would also be good + ) + ) + ) + + def zergling_hydra_roach_start(self, state: CollectionState) -> bool: + """ + Created mainly for engine of destruction start, but works for other missions with no-build starts. + """ + return state.has_any(( + item_names.ZERGLING_ADRENAL_OVERLOAD, + item_names.HYDRALISK_FRENZY, + item_names.ROACH_HYDRIODIC_BILE, + item_names.ZERGLING_RAPTOR_STRAIN, + item_names.ROACH_CORPSER_STRAIN, + ), self.player) + + def kerrigan_levels(self, state: CollectionState, target: int, story_levels_available=True) -> bool: + if (story_levels_available and self.story_levels_granted) or not self.kerrigan_unit_available: + return True # Levels are granted + if ( + self.kerrigan_levels_per_mission_completed > 0 + and self.kerrigan_levels_per_mission_completed_cap != 0 + and not self.is_item_placement(state) + ): + # Levels can be granted from mission completion. + # Item pool filtering isn't aware of missions beaten. Assume that missions beaten will fulfill this rule. + return True + # Levels from missions beaten + levels = self.kerrigan_levels_per_mission_completed * state.count_group("Missions", self.player) + if self.kerrigan_levels_per_mission_completed_cap != -1: + levels = min2(levels, self.kerrigan_levels_per_mission_completed_cap) + # Levels from items + for kerrigan_level_item in kerrigan_levels: + level_amount = get_full_item_list()[kerrigan_level_item].number + item_count = state.count(kerrigan_level_item, self.player) + levels += item_count * level_amount + # Total level cap + if self.kerrigan_total_level_cap != -1: + levels = min2(levels, self.kerrigan_total_level_cap) + + return levels >= target + + def basic_kerrigan(self, state: CollectionState, story_tech_available=True) -> bool: + if story_tech_available and self.grant_story_tech == GrantStoryTech.option_grant: + return True + # One active ability that can be used to defeat enemies directly + if not state.has_any( + ( + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.KERRIGAN_KINETIC_BLAST, + item_names.KERRIGAN_SPAWN_BANELINGS, + item_names.KERRIGAN_PSIONIC_SHIFT, + item_names.KERRIGAN_CRUSHING_GRIP, + ), + self.player, + ): + return False + # Two non-ultimate abilities + count = 0 + for item in kerrigan_non_ulimates: + if state.has(item, self.player): + count += 1 + if count >= 2: + return True + return False + + def two_kerrigan_actives(self, state: CollectionState, story_tech_available=True) -> bool: + if story_tech_available and self.grant_story_tech == GrantStoryTech.option_grant: + return True + count = 0 + for i in range(7): + if state.has_any(kerrigan_logic_active_abilities, self.player): + count += 1 + return count >= 2 + + # Global Protoss + def protoss_power_rating(self, state: CollectionState) -> int: + power_score = self.base_power_rating + # War Council Upgrades (all units are improved) + if self.war_council_upgrades: + power_score += 3 + # Passive Score (Economic upgrades and global army upgrades) + power_score += sum((rating for item, rating in protoss_passive_ratings.items() if state.has(item, self.player))) + # Spear of Adun + if self.spear_of_adun_presence in (SpearOfAdunPresence.option_everywhere, SpearOfAdunPresence.option_protoss): + power_score += self.soa_power_rating(state) + if self.spear_of_adun_passive_presence in (SpearOfAdunPassiveAbilityPresence.option_everywhere, SpearOfAdunPresence.option_protoss): + power_score += sum((rating for item, rating in soa_passive_ratings.items() if state.has(item, self.player))) + return power_score + + def protoss_army_weapon_armor_upgrade_min_level(self, state: CollectionState) -> int: + count: int = WEAPON_ARMOR_UPGRADE_MAX_LEVEL + 1 # +1 for Quatro + if self.has_protoss_ground_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_GROUND_WEAPON, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_GROUND_ARMOR, state), + ) + if self.has_protoss_air_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, state), + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_AIR_ARMOR, state), + ) + if self.has_protoss_ground_unit or self.has_protoss_air_unit: + count = min( + count, + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_SHIELDS, state), + ) + return count + + def protoss_very_hard_mission_weapon_armor_level(self, state: CollectionState) -> bool: + return self.protoss_army_weapon_armor_upgrade_min_level(state) >= self.get_very_hard_required_upgrade_level() + + def protoss_defense_rating(self, state: CollectionState, zerg_enemy: bool) -> int: + """ + Ability to handle defensive missions + :param state: + :param zerg_enemy: Whether the enemy is zerg + """ + defense_score = sum((pvx_defense_ratings[item] for item in pvx_defense_ratings if state.has(item, self.player))) + # Vanguard + rapid fire + if state.has_all((item_names.VANGUARD, item_names.VANGUARD_RAPIDFIRE_CANNON), self.player): + defense_score += 1 + # Fire Colossus + if state.has_all((item_names.COLOSSUS, item_names.COLOSSUS_FIRE_LANCE), self.player): + defense_score += 2 + if zerg_enemy: + defense_score += 2 + if ( + state.has_any((item_names.PHOTON_CANNON, item_names.KHAYDARIN_MONOLITH, item_names.NEXUS_OVERCHARGE), self.player) + and state.has(item_names.SHIELD_BATTERY, self.player) + ): + defense_score += 2 + + # No anti-air defense dict here, use an existing logic rule instead + if zerg_enemy: + defense_score += sum((pvz_defense_ratings[item] for item in pvz_defense_ratings if state.has(item, self.player))) + # Advanced Tactics bumps defense rating requirements down by 2 + if self.advanced_tactics: + defense_score += 2 + return defense_score + + def protoss_common_unit(self, state: CollectionState) -> bool: + return state.has_any(self.basic_protoss_units, self.player) + + def protoss_any_gap_transport(self, state: CollectionState) -> bool: + """Can get ground units across large gaps, larger than blink range""" + return ( + state.has_any( + ( + item_names.WARP_PRISM, + item_names.ARBITER, + ), + self.player, + ) + or state.has(item_names.SOA_PROGRESSIVE_PROXY_PYLON, self.player, count=2) + or state.has_all((item_names.MISTWING, item_names.MISTWING_PILOT), self.player) + or ( + state.has(item_names.SOA_PROGRESSIVE_PROXY_PYLON, self.player) + and ( + state.has_any(item_groups.gateway_units + [item_names.ELDER_PROBES, item_names.PROBE_WARPIN], self.player) + or (state.has(item_names.WARP_HARMONIZATION, self.player) and state.has_any(item_groups.protoss_ground_wa, self.player)) + ) + ) + ) + + def protoss_any_anti_air_unit_or_soa_any_protoss(self, state: CollectionState) -> bool: + return self.protoss_any_anti_air_unit(state) or ( + self.spear_of_adun_presence in (SpearOfAdunPresence.option_everywhere, SpearOfAdunPresence.option_protoss) + and self.protoss_any_anti_air_soa(state) + ) + + def protoss_any_anti_air_unit_or_soa(self, state: CollectionState) -> bool: + return self.protoss_any_anti_air_unit(state) or self.protoss_any_anti_air_soa(state) + + def protoss_any_anti_air_soa(self, state: CollectionState) -> bool: + return ( + state.has_any( + ( + item_names.SOA_ORBITAL_STRIKE, + item_names.SOA_SOLAR_LANCE, + item_names.SOA_SOLAR_BOMBARDMENT, + item_names.SOA_PURIFIER_BEAM, + item_names.SOA_PYLON_OVERCHARGE, + ), + self.player, + ) + or state.has(item_names.SOA_PROGRESSIVE_PROXY_PYLON, self.player, 2) # Warp-In Reinforcements + ) + + def protoss_any_anti_air_unit(self, state: CollectionState) -> bool: + return ( + state.has_any( + ( + # Gateway + item_names.STALKER, + item_names.SLAYER, + item_names.INSTIGATOR, + item_names.DRAGOON, + item_names.ADEPT, + item_names.SENTRY, + item_names.ENERGIZER, + item_names.HIGH_TEMPLAR, + item_names.SIGNIFIER, + item_names.ASCENDANT, + item_names.DARK_ARCHON, + # Robo + item_names.ANNIHILATOR, + # Stargate + item_names.PHOENIX, + item_names.MIRAGE, + item_names.CORSAIR, + item_names.SCOUT, + item_names.MISTWING, + item_names.CALADRIUS, + item_names.OPPRESSOR, + item_names.ARBITER, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.PULSAR, + item_names.CARRIER, + item_names.SKYLORD, + item_names.TEMPEST, + item_names.MOTHERSHIP, + # Buildings + item_names.NEXUS_OVERCHARGE, + item_names.PHOTON_CANNON, + item_names.KHAYDARIN_MONOLITH, + ), + self.player, + ) + or state.has_all((item_names.SUPPLICANT, item_names.SUPPLICANT_ZENITH_PITCH), self.player) + or state.has_all((item_names.WARP_PRISM, item_names.WARP_PRISM_PHASE_BLASTER), self.player) + or state.has_all((item_names.WRATHWALKER, item_names.WRATHWALKER_AERIAL_TRACKING), self.player) + or state.has_all((item_names.DISRUPTOR, item_names.DISRUPTOR_PERFECTED_POWER), self.player) + or state.has_all((item_names.IMMORTAL, item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING), self.player) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + or state.has_all((item_names.TRIREME, item_names.TRIREME_SOLAR_BEAM), self.player) + or ( + state.has(item_names.DARK_TEMPLAR, self.player) + and state.has_any((item_names.DARK_TEMPLAR_DARK_ARCHON_MELD, item_names.DARK_TEMPLAR_ARCHON_MERGE), self.player) + ) + ) + + def protoss_basic_anti_air(self, state: CollectionState) -> bool: + return ( + self.protoss_competent_anti_air(state) + or state.has_any( + { + item_names.PHOENIX, + item_names.MIRAGE, + item_names.CORSAIR, + item_names.CARRIER, + item_names.SKYLORD, + item_names.SCOUT, + item_names.DARK_ARCHON, + item_names.MOTHERSHIP, + item_names.MISTWING, + item_names.CALADRIUS, + item_names.OPPRESSOR, + item_names.PULSAR, + item_names.DRAGOON, + }, + self.player, + ) + or state.has_all({item_names.TRIREME, item_names.TRIREME_SOLAR_BEAM}, self.player) + or state.has_all({item_names.WRATHWALKER, item_names.WRATHWALKER_AERIAL_TRACKING}, self.player) + or state.has_all({item_names.WARP_PRISM, item_names.WARP_PRISM_PHASE_BLASTER}, self.player) + or self.advanced_tactics + and state.has_any({item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.SENTRY, item_names.ENERGIZER}, self.player) + or self.protoss_can_merge_archon(state) + or self.protoss_can_merge_dark_archon(state) + ) + + def protoss_anti_armor_anti_air(self, state: CollectionState) -> bool: + return ( + self.protoss_competent_anti_air(state) + or state.has_any((item_names.SCOUT, item_names.MISTWING, item_names.DRAGOON), self.player) + or ( + state.has_any({item_names.IMMORTAL, item_names.ANNIHILATOR}, self.player) + and state.has(item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING, self.player) + ) + or state.has_all({item_names.WRATHWALKER, item_names.WRATHWALKER_AERIAL_TRACKING}, self.player) + ) + + def protoss_anti_light_anti_air(self, state: CollectionState) -> bool: + return ( + self.protoss_competent_anti_air(state) + or state.has_any( + { + item_names.PHOENIX, + item_names.MIRAGE, + item_names.CORSAIR, + item_names.CARRIER, + }, + self.player, + ) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + ) + + def protoss_moderate_anti_air(self, state: CollectionState) -> bool: + return ( + self.protoss_competent_anti_air(state) + or self.protoss_anti_light_anti_air(state) + or self.protoss_anti_armor_anti_air(state) + or state.has(item_names.SKYLORD, self.player) + ) + + def protoss_common_unit_basic_aa(self, state: CollectionState) -> bool: + return self.protoss_common_unit(state) and self.protoss_basic_anti_air(state) + + def protoss_common_unit_anti_light_air(self, state: CollectionState) -> bool: + return self.protoss_common_unit(state) and self.protoss_anti_light_anti_air(state) + + def protoss_common_unit_anti_armor_air(self, state: CollectionState) -> bool: + return self.protoss_common_unit(state) and self.protoss_anti_armor_anti_air(state) + + def protoss_competent_anti_air(self, state: CollectionState) -> bool: + return ( + state.has_any( + { + item_names.STALKER, + item_names.SLAYER, + item_names.INSTIGATOR, + item_names.ADEPT, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.TEMPEST, + item_names.CALADRIUS, + }, + self.player, + ) + or ( + ( + state.has_any( + { + item_names.PHOENIX, + item_names.MIRAGE, + item_names.CORSAIR, + item_names.CARRIER, + }, + self.player, + ) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + ) + and ( + state.has_any((item_names.SCOUT, item_names.MISTWING, item_names.DRAGOON), self.player) + or state.has_all({item_names.WRATHWALKER, item_names.WRATHWALKER_AERIAL_TRACKING}, self.player) + or ( + state.has_any({item_names.IMMORTAL, item_names.ANNIHILATOR}, self.player) + and state.has(item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING, self.player) + ) + ) + ) + or ( + self.advanced_tactics + and state.has_any({item_names.IMMORTAL, item_names.ANNIHILATOR}, self.player) + and state.has(item_names.IMMORTAL_ANNIHILATOR_ADVANCED_TARGETING, self.player) + ) + ) + + def protoss_has_blink(self, state: CollectionState) -> bool: + return ( + state.has_any({item_names.STALKER, item_names.INSTIGATOR}, self.player) + or state.has_all({item_names.SLAYER, item_names.SLAYER_PHASE_BLINK}, self.player) + or ( + state.has(item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK, self.player) + and state.has_any({item_names.DARK_TEMPLAR, item_names.BLOOD_HUNTER, item_names.AVENGER}, self.player) + ) + ) + + def protoss_fleet(self, state: CollectionState) -> bool: + return ( + ( + state.has_any( + { + item_names.CARRIER, + item_names.SKYLORD, + item_names.TEMPEST, + item_names.VOID_RAY, + item_names.DESTROYER, + }, + self.player, + ) + ) + or ( + state.has_all((item_names.TRIREME, item_names.TRIREME_SOLAR_BEAM), self.player) + and ( + state.has_any((item_names.PHOENIX, item_names.MIRAGE, item_names.CORSAIR), self.player) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + ) + ) + and self.weapon_armor_upgrade_count(PROGRESSIVE_PROTOSS_AIR_WEAPON, state) >= 2 + and self.weapon_armor_upgrade_count(PROGRESSIVE_PROTOSS_AIR_ARMOR, state) >= 2 + and self.weapon_armor_upgrade_count(PROGRESSIVE_PROTOSS_SHIELDS, state) >= 2 + ) + + def protoss_hybrid_counter(self, state: CollectionState) -> bool: + """ + Ground Hybrids + """ + return ( + state.has_any( + { + item_names.ANNIHILATOR, + item_names.ASCENDANT, + item_names.TEMPEST, + item_names.CARRIER, + item_names.TRIREME, + item_names.VOID_RAY, + item_names.WRATHWALKER, + }, + self.player, + ) + or state.has_all((item_names.VANGUARD, item_names.VANGUARD_FUSION_MORTARS), self.player) + or ( + (state.has(item_names.IMMORTAL, self.player) or self.advanced_tactics) + and (state.has_any({item_names.STALKER, item_names.DRAGOON, item_names.ADEPT, item_names.INSTIGATOR, item_names.SLAYER}, self.player)) + ) + or (self.advanced_tactics and state.has_all((item_names.OPPRESSOR, item_names.OPPRESSOR_VULCAN_BLASTER), self.player)) + ) + + def protoss_basic_splash(self, state: CollectionState) -> bool: + return ( + state.has_any(( + item_names.COLOSSUS, + item_names.VANGUARD, + item_names.HIGH_TEMPLAR, + item_names.SIGNIFIER, + item_names.REAVER, + item_names.ASCENDANT, + item_names.DAWNBRINGER, + ), self.player) + or state.has_all((item_names.ZEALOT, item_names.ZEALOT_WHIRLWIND), self.player) + or ( + state.has_all( + (item_names.DARK_TEMPLAR, item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY, item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY), self.player + ) + ) + or ( + state.has(item_names.DESTROYER, self.player) + and ( + state.has_any(( + item_names.DESTROYER_REFORGED_BLOODSHARD_CORE, + item_names.DESTROYER_RESOURCE_EFFICIENCY, + ), self.player) + ) + ) + ) + + def protoss_static_defense(self, state: CollectionState) -> bool: + return state.has_any({item_names.PHOTON_CANNON, item_names.KHAYDARIN_MONOLITH}, self.player) + + def protoss_can_merge_archon(self, state: CollectionState) -> bool: + return ( + state.has_any({item_names.HIGH_TEMPLAR, item_names.SIGNIFIER}, self.player) + or state.has_all({item_names.ASCENDANT, item_names.ASCENDANT_ARCHON_MERGE}, self.player) + or state.has_all({item_names.DARK_TEMPLAR, item_names.DARK_TEMPLAR_ARCHON_MERGE}, self.player) + ) + + def protoss_can_merge_dark_archon(self, state: CollectionState) -> bool: + return state.has(item_names.DARK_ARCHON, self.player) or state.has_all( + {item_names.DARK_TEMPLAR, item_names.DARK_TEMPLAR_DARK_ARCHON_MELD}, self.player + ) + + def protoss_competent_comp(self, state: CollectionState) -> bool: + if not self.protoss_competent_anti_air(state): + return False + if self.protoss_fleet(state) and self.protoss_mineral_dump(state): + return True + if self.protoss_deathball(state): + return True + core_unit: bool = state.has_any( + ( + item_names.ZEALOT, + item_names.CENTURION, + item_names.SENTINEL, + item_names.STALKER, + item_names.INSTIGATOR, + item_names.SLAYER, + item_names.ADEPT, + ), + self.player, + ) + support_unit: bool = ( + state.has_any( + ( + item_names.SENTRY, + item_names.ENERGIZER, + item_names.IMMORTAL, + item_names.VANGUARD, + item_names.COLOSSUS, + item_names.REAVER, + item_names.VOID_RAY, + item_names.PHOENIX, + item_names.CORSAIR, + ), + self.player, + ) + or state.has_all((item_names.MIRAGE, item_names.MIRAGE_GRAVITON_BEAM), self.player) + or state.has_all( + (item_names.DARK_TEMPLAR, item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY, item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY), self.player + ) + or ( + self.advanced_tactics + and ( + state.has_any( + ( + item_names.HIGH_TEMPLAR, + item_names.SIGNIFIER, + item_names.ASCENDANT, + item_names.ANNIHILATOR, + item_names.WRATHWALKER, + item_names.SKIRMISHER, + item_names.ARBITER, + ), + self.player, + ) + ) + ) + ) + if core_unit and support_unit: + return True + return False + + def protoss_deathball(self, state: CollectionState) -> bool: + return ( + self.protoss_common_unit(state) + and self.protoss_competent_anti_air(state) + and self.protoss_hybrid_counter(state) + and self.protoss_basic_splash(state) + and self.protoss_army_weapon_armor_upgrade_min_level(state) >= 2 + ) + + def protoss_heal(self, state: CollectionState) -> bool: + return state.has_any((item_names.SENTRY, item_names.SHIELD_BATTERY, item_names.RECONSTRUCTION_BEAM), self.player) or state.has_all( + (item_names.CARRIER, item_names.CARRIER_REPAIR_DRONES), self.player + ) + + def protoss_mineral_dump(self, state: CollectionState) -> bool: + return ( + state.has_any((item_names.ZEALOT, item_names.SENTINEL, item_names.PHOTON_CANNON), self.player) + or state.has_all((item_names.CENTURION, item_names.CENTURION_RESOURCE_EFFICIENCY), self.player) + or self.advanced_tactics + and state.has_any((item_names.SUPPLICANT, item_names.SHIELD_BATTERY), self.player) + ) + + def zealot_sentry_slayer_start(self, state: CollectionState) -> bool: + """ + Created mainly for engine of destruction start, but works for other missions with no-build starts. + """ + return state.has_any(( + item_names.ZEALOT_WHIRLWIND, + item_names.SENTRY_DOUBLE_SHIELD_RECHARGE, + item_names.SLAYER_PHASE_BLINK, + item_names.STALKER_INSTIGATOR_SLAYER_DISINTEGRATING_PARTICLES, + item_names.STALKER_INSTIGATOR_SLAYER_PARTICLE_REFLECTION, + ), self.player) + + # Mission-specific rules + def ghost_of_a_chance_requirement(self, state: CollectionState) -> bool: + return ( + self.grant_story_tech == GrantStoryTech.option_grant + or self.nova_ghost_of_a_chance_variant == NovaGhostOfAChanceVariant.option_wol + or not self.nova_used + or ( + self.nova_ranged_weapon(state) + and state.has_any({item_names.NOVA_DOMINATION, item_names.NOVA_C20A_CANISTER_RIFLE}, self.player) + and (self.nova_full_stealth(state) or self.nova_heal(state)) + and self.nova_anti_air_weapon(state) + ) + ) + + def terran_outbreak_requirement(self, state: CollectionState) -> bool: + """Outbreak mission requirement""" + return self.terran_defense_rating(state, True, False) >= 4 and (self.terran_common_unit(state) or state.has(item_names.REAPER, self.player)) + + def zerg_outbreak_requirement(self, state: CollectionState) -> bool: + """ + Outbreak mission requirement. + Need to boot out Aberration-based comp + """ + return ( + self.zerg_defense_rating(state, True, False) >= 4 + and self.zerg_common_unit(state) + and ( + state.has_any( + ( + item_names.SWARM_QUEEN, + item_names.HYDRALISK, + item_names.ROACH, + item_names.MUTALISK, + item_names.INFESTED_BANSHEE, + ), + self.player, + ) + or self.morph_lurker(state) + or self.morph_brood_lord(state) + or ( + self.advanced_tactics + and ( + self.morph_impaler(state) + or self.morph_igniter(state) + or state.has_any((item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_SIEGE_TANK), self.player) + ) + ) + ) + ) + + def protoss_outbreak_requirement(self, state: CollectionState) -> bool: + """ + Outbreak mission requirement + Something other than Zealot-based comp is required. + """ + return ( + self.protoss_defense_rating(state, True) >= 4 + and self.protoss_common_unit(state) + and self.protoss_basic_splash(state) + and ( + state.has_any( + ( + item_names.STALKER, + item_names.SLAYER, + item_names.INSTIGATOR, + item_names.ADEPT, + item_names.COLOSSUS, + item_names.VANGUARD, + item_names.SKIRMISHER, + item_names.OPPRESSOR, + item_names.CARRIER, + item_names.SKYLORD, + item_names.TRIREME, + item_names.DAWNBRINGER, + ), + self.player, + ) + or (self.advanced_tactics and (state.has_any((item_names.VOID_RAY, item_names.DESTROYER), self.player))) + ) + ) + + def terran_safe_haven_requirement(self, state: CollectionState) -> bool: + """Safe Haven mission requirement""" + return self.terran_common_unit(state) and self.terran_competent_anti_air(state) + + def terran_havens_fall_requirement(self, state: CollectionState) -> bool: + """Haven's Fall mission requirement""" + return self.terran_common_unit(state) and ( + self.terran_competent_comp(state) + or ( + self.terran_competent_anti_air(state) + and ( + state.has_any((item_names.VIKING, item_names.BATTLECRUISER), self.player) + or state.has_all((item_names.WRAITH, item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY), self.player) + or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + ) + ) + ) + + def terran_respond_to_colony_infestations(self, state: CollectionState) -> bool: + """ + Can deal quickly with Brood Lords and Mutas in Haven's Fall and being able to progress the mission + """ + return self.terran_havens_fall_requirement(state) and ( + self.terran_air_anti_air(state) + or ( + state.has_any({item_names.BATTLECRUISER, item_names.VALKYRIE}, self.player) + and self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 + ) + ) + + def zerg_havens_fall_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_common_unit(state) + and self.zerg_competent_anti_air(state) + and (state.has(item_names.MUTALISK, self.player) or self.zerg_competent_comp(state)) + ) + + def zerg_respond_to_colony_infestations(self, state: CollectionState) -> bool: + """ + Can deal quickly with Brood Lords and Mutas in Haven's Fall and being able to progress the mission + """ + return self.zerg_havens_fall_requirement(state) and ( + self.morph_devourer(state) + or state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) + or self.advanced_tactics + and (self.morph_viper(state) or state.has_any({item_names.BROOD_QUEEN, item_names.SCOURGE}, self.player)) + ) + + def protoss_havens_fall_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_common_unit(state) + and self.protoss_competent_anti_air(state) + and ( + self.protoss_competent_comp(state) + or ( + state.has_any((item_names.TEMPEST, item_names.SKYLORD, item_names.DESTROYER), self.player) + or ( + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_PROTOSS_AIR_WEAPON, state) >= 2 + and state.has(item_names.CARRIER, self.player) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + ) + ) + ) + ) + + def protoss_respond_to_colony_infestations(self, state: CollectionState) -> bool: + """ + Can deal quickly with Brood Lords and Mutas in Haven's Fall and being able to progress the mission + """ + return self.protoss_havens_fall_requirement(state) and ( + state.has_any({item_names.CARRIER, item_names.SKYLORD, item_names.DESTROYER, item_names.TEMPEST}, self.player) + # handle mutas + or ( + state.has_any( + { + item_names.PHOENIX, + item_names.MIRAGE, + item_names.CORSAIR, + }, + self.player, + ) + or state.has_all((item_names.SKIRMISHER, item_names.SKIRMISHER_PEER_CONTEMPT), self.player) + ) + # handle brood lords and virophages + and ( + state.has_any( + { + item_names.VOID_RAY, + }, + self.player, + ) + or self.advanced_tactics + and state.has_all({item_names.SCOUT, item_names.MISTWING}, self.player) + ) + ) + + def terran_gates_of_hell_requirement(self, state: CollectionState) -> bool: + """Gates of Hell mission requirement""" + return self.terran_competent_comp(state) and (self.terran_defense_rating(state, True) > 6) + + def zerg_gates_of_hell_requirement(self, state: CollectionState) -> bool: + """Gates of Hell mission requirement""" + return self.zerg_competent_comp_competent_aa(state) and (self.zerg_defense_rating(state, True) > 8) + + def protoss_gates_of_hell_requirement(self, state: CollectionState) -> bool: + """Gates of Hell mission requirement""" + return self.protoss_competent_comp(state) and (self.protoss_defense_rating(state, True) > 6) + + def terran_welcome_to_the_jungle_requirement(self, state: CollectionState) -> bool: + """ + Welcome to the Jungle requirements - able to deal with Scouts, Void Rays, Zealots and Stalkers + """ + if self.terran_power_rating(state) < 5: + return False + return (self.terran_common_unit(state) and self.terran_competent_ground_to_air(state)) or ( + self.advanced_tactics + and state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.VULTURE}, self.player) + and self.terran_air_anti_air(state) + ) + + def zerg_welcome_to_the_jungle_requirement(self, state: CollectionState) -> bool: + """ + Welcome to the Jungle requirements - able to deal with Scouts, Void Rays, Zealots and Stalkers + """ + if self.zerg_power_rating(state) < 5: + return False + return (self.zerg_competent_comp(state) and state.has_any({item_names.HYDRALISK, item_names.MUTALISK}, self.player)) or ( + self.advanced_tactics + and self.zerg_common_unit(state) + and ( + state.has_any({item_names.MUTALISK, item_names.INFESTOR}, self.player) + or (self.morph_devourer(state) and state.has_any({item_names.HYDRALISK, item_names.SWARM_QUEEN}, self.player)) + or (self.morph_viper(state) and state.has(item_names.VIPER_PARASITIC_BOMB, self.player)) + ) + and self.zerg_army_weapon_armor_upgrade_min_level(state) >= 1 + ) + + def protoss_welcome_to_the_jungle_requirement(self, state: CollectionState) -> bool: + """ + Welcome to the Jungle requirements - able to deal with Scouts, Void Rays, Zealots and Stalkers + """ + if self.protoss_power_rating(state) < 5: + return False + return self.protoss_common_unit(state) and self.protoss_anti_armor_anti_air(state) + + def terran_can_grab_ghosts_in_the_fog_east_rock_formation(self, state: CollectionState) -> bool: + """ + Able to shoot by a long range or from air to claim the rock formation separated by a chasm + """ + return ( + state.has_any( + { + item_names.MEDIVAC, + item_names.HERCULES, + item_names.VIKING, + item_names.BANSHEE, + item_names.WRAITH, + item_names.SIEGE_TANK, + item_names.BATTLECRUISER, + item_names.NIGHT_HAWK, + item_names.NIGHT_WOLF, + item_names.SHOCK_DIVISION, + item_names.SKY_FURY, + }, + self.player, + ) + or state.has_all({item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES}, self.player) + or state.has_all({item_names.RAVEN, item_names.RAVEN_HUNTER_SEEKER_WEAPON}, self.player) + or ( + state.has_any({item_names.LIBERATOR, item_names.EMPERORS_GUARDIAN}, self.player) + and state.has(item_names.LIBERATOR_RAID_ARTILLERY, self.player) + ) + or ( + self.advanced_tactics + and ( + state.has_any( + { + item_names.HELS_ANGELS, + item_names.DUSK_WINGS, + item_names.WINGED_NIGHTMARES, + item_names.SIEGE_BREAKERS, + item_names.BRYNHILDS, + item_names.JACKSONS_REVENGE, + }, + self.player, + ) + ) + or state.has_all({item_names.MIDNIGHT_RIDERS, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + ) + ) + + def terran_great_train_robbery_train_stopper(self, state: CollectionState) -> bool: + """ + Ability to deal with trains (moving target with a lot of HP) + """ + return state.has_any( + {item_names.SIEGE_TANK, item_names.DIAMONDBACK, item_names.MARAUDER, item_names.CYCLONE, item_names.BANSHEE}, self.player + ) or ( + self.advanced_tactics + and ( + state.has_all({item_names.REAPER, item_names.REAPER_G4_CLUSTERBOMB}, self.player) + or state.has_all({item_names.SPECTRE, item_names.SPECTRE_PSIONIC_LASH}, self.player) + or state.has_any({item_names.VULTURE, item_names.LIBERATOR}, self.player) + ) + ) + + def zerg_great_train_robbery_train_stopper(self, state: CollectionState) -> bool: + """ + Ability to deal with trains (moving target with a lot of HP) + """ + return ( + state.has_any( + ( + item_names.ABERRATION, + item_names.INFESTED_DIAMONDBACK, + item_names.INFESTED_BANSHEE, + ), + self.player, + ) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SUNDERING_GLAIVE}, self.player) + or state.has_all((item_names.HYDRALISK, item_names.HYDRALISK_MUSCULAR_AUGMENTS), self.player) + or ( + state.has(item_names.ZERGLING, self.player) + and ( + state.has_any( + (item_names.ZERGLING_SHREDDING_CLAWS, item_names.ZERGLING_SHREDDING_CLAWS, item_names.ZERGLING_RAPTOR_STRAIN), self.player + ) + ) + and (self.advanced_tactics or state.has_any((item_names.ZERGLING_METABOLIC_BOOST, item_names.ZERGLING_RAPTOR_STRAIN), self.player)) + ) + or self.zerg_infested_tank_with_ammo(state) + or (self.advanced_tactics and (self.morph_tyrannozor(state))) + ) + + def protoss_great_train_robbery_train_stopper(self, state: CollectionState) -> bool: + """ + Ability to deal with trains (moving target with a lot of HP) + """ + return ( + state.has_any( + (item_names.ANNIHILATOR, item_names.IMMORTAL, item_names.STALKER, item_names.WRATHWALKER, item_names.VOID_RAY, item_names.DESTROYER), + self.player, + ) + or state.has_all({item_names.SLAYER, item_names.SLAYER_PHASE_BLINK}, self.player) + or state.has_all((item_names.REAVER, item_names.REAVER_KHALAI_REPLICATORS), self.player) + or state.has_all({item_names.VANGUARD, item_names.VANGUARD_FUSION_MORTARS}, self.player) + or ( + state.has(item_names.INSTIGATOR, self.player) + and state.has_any((item_names.INSTIGATOR_BLINK_OVERDRIVE, item_names.INSTIGATOR_MODERNIZED_SERVOS), self.player) + ) + or (state.has_all((item_names.OPPRESSOR, item_names.SCOUT_GRAVITIC_THRUSTERS, item_names.SCOUT_ADVANCED_PHOTON_BLASTERS), self.player)) + or state.has_all((item_names.ORACLE, item_names.ORACLE_TEMPORAL_ACCELERATION_BEAM), self.player) + or ( + self.advanced_tactics + and ( + state.has(item_names.TEMPEST, self.player) + or state.has_all((item_names.ADEPT, item_names.ADEPT_RESONATING_GLAIVES), self.player) + or state.has_all({item_names.VANGUARD, item_names.VANGUARD_RAPIDFIRE_CANNON}, self.player) + or state.has_all((item_names.OPPRESSOR, item_names.SCOUT_GRAVITIC_THRUSTERS, item_names.OPPRESSOR_VULCAN_BLASTER), self.player) + or state.has_all((item_names.ASCENDANT, item_names.ASCENDANT_POWER_OVERWHELMING, item_names.SUPPLICANT), self.player) + or state.has_all( + (item_names.DARK_TEMPLAR, item_names.DARK_TEMPLAR_LESSER_SHADOW_FURY, item_names.DARK_TEMPLAR_GREATER_SHADOW_FURY), + self.player, + ) + or ( + state.has(item_names.DARK_TEMPLAR_AVENGER_BLOOD_HUNTER_BLINK, self.player) + and ( + state.has_any((item_names.DARK_TEMPLAR, item_names.AVENGER), self.player) + or state.has_all((item_names.BLOOD_HUNTER, item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY), self.player) + ) + ) + ) + ) + ) + + def terran_can_rescue(self, state) -> bool: + """ + Rescuing in The Moebius Factor + """ + return state.has_any({item_names.MEDIVAC, item_names.HERCULES, item_names.RAVEN, item_names.VIKING}, self.player) or self.advanced_tactics + + def terran_supernova_requirement(self, state) -> bool: + return self.terran_beats_protoss_deathball(state) and self.terran_power_rating(state) >= 6 + + def zerg_supernova_requirement(self, state) -> bool: + return ( + self.zerg_common_unit(state) + and self.zerg_power_rating(state) >= 6 + and (self.advanced_tactics or state.has(item_names.YGGDRASIL, self.player)) + ) + + def protoss_supernova_requirement(self, state: CollectionState) -> bool: + return ( + ( + state.count(item_names.PROGRESSIVE_WARP_RELOCATE, self.player) >= 2 + or (self.advanced_tactics and state.has(item_names.PROGRESSIVE_WARP_RELOCATE, self.player)) + ) + and self.protoss_competent_anti_air(state) + and (self.protoss_fleet(state) or (self.protoss_competent_comp(state) and self.protoss_power_rating(state) >= 6)) + ) + + def terran_maw_requirement(self, state: CollectionState) -> bool: + """ + Ability to deal with large areas with environment damage + """ + return ( + state.has(item_names.BATTLECRUISER, self.player) + and ( + self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 + or state.has(item_names.BATTLECRUISER_ATX_LASER_BATTERY, self.player) + ) + ) or ( + self.terran_air(state) + and ( + # Avoid dropping Troopers or units that do barely damage + state.has_any( + ( + item_names.GOLIATH, + item_names.THOR, + item_names.WARHOUND, + item_names.VIKING, + item_names.BANSHEE, + item_names.WRAITH, + item_names.BATTLECRUISER, + ), + self.player, + ) + or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + or state.has_all((item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), self.player) + or (state.has(item_names.MARAUDER, self.player) and self.terran_bio_heal(state)) + ) + and ( + # Can deal damage to air units inside rip fields + state.has_any((item_names.GOLIATH, item_names.CYCLONE, item_names.VIKING), self.player) + or ( + state.has_any((item_names.WRAITH, item_names.VALKYRIE, item_names.BATTLECRUISER), self.player) + and self.weapon_armor_upgrade_count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, state) >= 2 + ) + or state.has_all((item_names.THOR, item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD), self.player) + ) + and self.terran_competent_comp(state) + and self.terran_competent_anti_air(state) + and self.terran_sustainable_mech_heal(state) + ) + + def zerg_maw_requirement(self, state: CollectionState) -> bool: + """ + Ability to cross defended gaps, deal with skytoss, and avoid costly losses. + """ + if self.advanced_tactics and state.has(item_names.INFESTOR, self.player): + return True + usable_muta = ( + state.has_all((item_names.MUTALISK, item_names.MUTALISK_RAPID_REGENERATION), self.player) + and state.has_any((item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE), self.player) + and ( + state.has(item_names.MUTALISK_SUNDERING_GLAIVE, self.player) + or state.has_all((item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE), self.player) + ) + ) + return ( + # Heal + ( + state.has(item_names.SWARM_QUEEN, self.player) + or self.advanced_tactics + and ((self.morph_tyrannozor(state) and state.has(item_names.TYRANNOZOR_HEALING_ADAPTATION, self.player)) or (usable_muta)) + ) + # Cross the gap + and ( + state.has_any((item_names.NYDUS_WORM, item_names.OVERLORD_VENTRAL_SACS), self.player) + or (self.advanced_tactics and state.has(item_names.YGGDRASIL, self.player)) + ) + # Air to ground + and (self.morph_brood_lord(state) or self.morph_guardian(state) or usable_muta) + # Ground to air + and ( + state.has(item_names.INFESTOR, self.player) + or self.morph_tyrannozor(state) + or state.has_all( + {item_names.SWARM_HOST, item_names.SWARM_HOST_RESOURCE_EFFICIENCY, item_names.SWARM_HOST_PRESSURIZED_GLANDS}, self.player + ) + or state.has_all({item_names.HYDRALISK, item_names.HYDRALISK_RESOURCE_EFFICIENCY}, self.player) + or state.has_all({item_names.INFESTED_DIAMONDBACK, item_names.INFESTED_DIAMONDBACK_PROGRESSIVE_FUNGAL_SNARE}, self.player) + ) + # Survives rip-field + and ( + state.has_any({item_names.ABERRATION, item_names.ROACH, item_names.ULTRALISK}, self.player) + or self.morph_tyrannozor(state) + or (self.advanced_tactics and usable_muta) + ) + # Air-to-air + and (state.has_any({item_names.MUTALISK, item_names.CORRUPTOR, item_names.INFESTED_LIBERATOR, item_names.BROOD_QUEEN}, self.player)) + # Upgrades / general + and self.zerg_competent_anti_air(state) + and self.zerg_competent_comp(state) + ) + + def protoss_maw_requirement(self, state: CollectionState) -> bool: + """ + Ability to cross defended gaps and deal with skytoss. + """ + return ( + ( + state.has(item_names.WARP_PRISM, self.player) + or ( + self.advanced_tactics + and (state.has(item_names.ARBITER, self.player) or state.has_all((item_names.MISTWING, item_names.MISTWING_PILOT), self.player)) + ) + ) + and self.protoss_common_unit_anti_armor_air(state) + and self.protoss_fleet(state) + ) + + def terran_engine_of_destruction_requirement(self, state: CollectionState) -> bool: + power_rating = self.terran_power_rating(state) + if power_rating < 3 or not self.marine_medic_upgrade(state) or not self.terran_common_unit(state): + return False + if power_rating >= 7 and self.terran_competent_comp(state): + return True + else: + return ( + state.has_any((item_names.WRAITH, item_names.BATTLECRUISER), self.player) + or self.terran_air_anti_air(state) + and state.has_any((item_names.BANSHEE, item_names.LIBERATOR), self.player) + ) + + def zerg_engine_of_destruction_requirement(self, state: CollectionState) -> bool: + power_rating = self.zerg_power_rating(state) + if ( + power_rating < 3 + or not self.zergling_hydra_roach_start(state) + or not self.zerg_common_unit(state) + or not self.zerg_competent_anti_air(state) + or not self.zerg_repair_odin(state) + ): + return False + if power_rating >= 7 and self.zerg_competent_comp(state): + return True + else: + return self.zerg_base_buster(state) + + def protoss_engine_of_destruction_requirement(self, state: CollectionState) -> bool: + return ( + self.zealot_sentry_slayer_start(state) + and self.protoss_repair_odin(state) + and (self.protoss_deathball(state) or self.protoss_fleet(state)) + ) + + def zerg_repair_odin(self, state: CollectionState) -> bool: + return ( + self.zerg_has_infested_scv(state) + or state.has_all({item_names.SWARM_QUEEN_BIO_MECHANICAL_TRANSFUSION, item_names.SWARM_QUEEN}, self.player) + or (self.advanced_tactics and state.has(item_names.SWARM_QUEEN, self.player)) + ) + + def protoss_repair_odin(self, state: CollectionState) -> bool: + return ( + state.has(item_names.SENTRY, self.player) + or state.has_all((item_names.CARRIER, item_names.CARRIER_REPAIR_DRONES), self.player) + or ( + self.spear_of_adun_passive_presence + in [SpearOfAdunPassiveAbilityPresence.option_protoss, SpearOfAdunPassiveAbilityPresence.option_everywhere] + and state.has(item_names.RECONSTRUCTION_BEAM, self.player) + ) + or (self.advanced_tactics and state.has_all({item_names.SHIELD_BATTERY, item_names.KHALAI_INGENUITY}, self.player)) + ) + + def terran_in_utter_darkness_requirement(self, state: CollectionState) -> bool: + return self.terran_competent_comp(state) and self.terran_defense_rating(state, True, True) >= 8 + + def zerg_in_utter_darkness_requirement(self, state: CollectionState) -> bool: + return self.zerg_competent_comp(state) and self.zerg_competent_anti_air(state) and self.zerg_defense_rating(state, True, True) >= 8 + + def protoss_in_utter_darkness_requirement(self, state: CollectionState) -> bool: + return self.protoss_competent_comp(state) and self.protoss_defense_rating(state, True) >= 4 + + def terran_all_in_requirement(self, state: CollectionState) -> bool: + """ + All-in + """ + if not self.terran_very_hard_mission_weapon_armor_level(state): + return False + beats_kerrigan = ( + state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.BANSHEE}, self.player) + or state.has_all({item_names.REAPER, item_names.REAPER_RESOURCE_EFFICIENCY}, self.player) + or (self.all_in_map == AllInMap.option_air and state.has_all((item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), self.player)) + or (self.advanced_tactics and state.has_all((item_names.GHOST, item_names.GHOST_EMP_ROUNDS), self.player)) + ) + if not beats_kerrigan: + return False + if not self.terran_competent_comp(state): + return False + if self.all_in_map == AllInMap.option_ground: + # Ground + defense_rating = self.terran_defense_rating(state, True, False) + if state.has_any({item_names.BATTLECRUISER, item_names.BANSHEE}, self.player): + defense_rating += 2 + return defense_rating >= 13 + else: + # Air + defense_rating = self.terran_defense_rating(state, True, True) + return ( + defense_rating >= 9 + and self.terran_competent_anti_air(state) + and state.has_any({item_names.VIKING, item_names.BATTLECRUISER, item_names.VALKYRIE}, self.player) + and state.has_any({item_names.HIVE_MIND_EMULATOR, item_names.PSI_DISRUPTER, item_names.MISSILE_TURRET}, self.player) + ) + + def zerg_all_in_requirement(self, state: CollectionState) -> bool: + """ + All-in (Zerg) + """ + if not self.zerg_very_hard_mission_weapon_armor_level(state): + return False + beats_kerrigan = ( + state.has_any({item_names.INFESTED_MARINE, item_names.INFESTED_BANSHEE, item_names.INFESTED_BUNKER}, self.player) + or state.has_all({item_names.SWARM_HOST, item_names.SWARM_HOST_RESOURCE_EFFICIENCY}, self.player) + or self.morph_brood_lord(state) + ) + if not beats_kerrigan: + return False + if not self.zerg_competent_comp(state): + return False + if self.all_in_map == AllInMap.option_ground: + # Ground + defense_rating = self.zerg_defense_rating(state, True, False) + if ( + state.has_any({item_names.MUTALISK, item_names.INFESTED_BANSHEE}, self.player) + or self.morph_brood_lord(state) + or self.morph_guardian(state) + ): + defense_rating += 3 + if state.has(item_names.SPINE_CRAWLER, self.player): + defense_rating += 2 + return defense_rating >= 13 + else: + # Air + defense_rating = self.zerg_defense_rating(state, True, True) + return ( + defense_rating >= 9 + and state.has_any({item_names.MUTALISK, item_names.CORRUPTOR}, self.player) + and state.has_any({item_names.SPORE_CRAWLER, item_names.INFESTED_MISSILE_TURRET}, self.player) + ) + + def protoss_all_in_requirement(self, state: CollectionState) -> bool: + """ + All-in (Protoss) + """ + if not self.protoss_very_hard_mission_weapon_armor_level(state): + return False + beats_kerrigan = ( + # cheap units with multiple small attacks, or anything with Feedback + state.has_any({item_names.ZEALOT, item_names.SENTINEL, item_names.SKIRMISHER, item_names.HIGH_TEMPLAR}, self.player) + or state.has_all((item_names.CENTURION, item_names.CENTURION_RESOURCE_EFFICIENCY), self.player) + or state.has_all({item_names.SIGNIFIER, item_names.SIGNIFIER_FEEDBACK}, self.player) + or (self.protoss_can_merge_archon(state) and state.has(item_names.ARCHON_HIGH_ARCHON, self.player)) + or (self.protoss_can_merge_dark_archon(state) and state.has(item_names.DARK_ARCHON_FEEDBACK, self.player)) + ) + if not beats_kerrigan: + return False + if not self.protoss_competent_comp(state): + return False + if self.all_in_map == AllInMap.option_ground: + # Ground + defense_rating = self.protoss_defense_rating(state, True) + if ( + state.has_any({item_names.SKIRMISHER, item_names.DARK_TEMPLAR, item_names.TEMPEST, item_names.TRIREME}, self.player) + or state.has_all((item_names.BLOOD_HUNTER, item_names.BLOOD_HUNTER_BRUTAL_EFFICIENCY), self.player) + or state.has_all((item_names.AVENGER, item_names.AVENGER_KRYHAS_CLOAK), self.player) + ): + defense_rating += 2 + if state.has(item_names.PHOTON_CANNON, self.player): + defense_rating += 2 + return defense_rating >= 13 + else: + # Air + defense_rating = self.protoss_defense_rating(state, True) + if state.has(item_names.KHAYDARIN_MONOLITH, self.player): + defense_rating += 2 + if state.has(item_names.PHOTON_CANNON, self.player): + defense_rating += 2 + return defense_rating >= 9 and (state.has_any({item_names.TEMPEST, item_names.SKYLORD, item_names.VOID_RAY}, self.player)) + + def zerg_can_grab_ghosts_in_the_fog_east_rock_formation(self, state: CollectionState) -> bool: + return ( + state.has_any({item_names.MUTALISK, item_names.INFESTED_BANSHEE, item_names.OVERLORD_VENTRAL_SACS, item_names.INFESTOR}, self.player) + or (self.morph_devourer(state) and state.has(item_names.DEVOURER_PRESCIENT_SPORES, self.player)) + or (self.morph_guardian(state) and state.has(item_names.GUARDIAN_PRIMAL_ADAPTATION, self.player)) + or ((self.morph_guardian(state) or self.morph_brood_lord(state)) and self.zerg_basic_air_to_air(state)) + or ( + self.advanced_tactics + and ( + state.has_any({item_names.INFESTED_SIEGE_BREAKERS, item_names.INFESTED_DUSK_WINGS}, self.player) + or (state.has(item_names.HUNTERLING, self.player) and self.zerg_basic_air_to_air(state)) + ) + ) + ) + def zerg_any_units_back_in_the_saddle_requirement(self, state: CollectionState) -> bool: + return ( + self.grant_story_tech == GrantStoryTech.option_grant + # Note(mm): This check isn't necessary as self.kerrigan_levels cover it, + # and it's not fully desirable in future when we support non-grant story tech + kerriganless. + # or not self.kerrigan_presence + or state.has_any(( + # Cases tested by Snarky + item_names.KERRIGAN_KINETIC_BLAST, + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.KERRIGAN_CRUSHING_GRIP, + item_names.KERRIGAN_PSIONIC_SHIFT, + item_names.KERRIGAN_SPAWN_BANELINGS, + item_names.KERRIGAN_FURY, + item_names.KERRIGAN_APOCALYPSE, + item_names.KERRIGAN_DROP_PODS, + item_names.KERRIGAN_SPAWN_LEVIATHAN, + item_names.KERRIGAN_IMMOBILIZATION_WAVE, # Involves a 1-minute cooldown wait before the ultra + item_names.KERRIGAN_MEND, # See note from THE EV below + ), self.player) + or self.kerrigan_levels(state, 20) + or (self.kerrigan_levels(state, 10) and state.has(item_names.KERRIGAN_CHAIN_REACTION, self.player)) + # Tested by THE EV, "facetank with Kerrigan and stutter step to the end with >10s left" + # > have to lure the first group of Zerg in the 2nd timed section into the first room of the second area + # > (with the heal box) so you can kill them before the timer starts. + # + # phaneros: Technically possible without the levels, but adding them in for safety margin and to hopefully + # make generation force this branch less often + or (state.has_any((item_names.KERRIGAN_HEROIC_FORTITUDE, item_names.KERRIGAN_INFEST_BROODLINGS), self.player) + and self.kerrigan_levels(state, 5) + ) + # Insufficient: Wild Mutation, Assimilation Aura + ) + + def zerg_pass_vents(self, state: CollectionState) -> bool: + return ( + self.grant_story_tech == GrantStoryTech.option_grant + or state.has_any({item_names.ZERGLING, item_names.HYDRALISK, item_names.ROACH}, self.player) + or (self.advanced_tactics and state.has(item_names.INFESTOR, self.player)) + ) + + def supreme_requirement(self, state: CollectionState) -> bool: + return ( + self.grant_story_tech == GrantStoryTech.option_grant + or not self.kerrigan_unit_available or (self.grant_story_tech == GrantStoryTech.option_allow_substitutes + and state.has_any(( + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.OVERLORD_VENTRAL_SACS, + item_names.YGGDRASIL, + item_names.MUTALISK_CORRUPTOR_VIPER_ASPECT, + item_names.NYDUS_WORM, + item_names.BULLFROG, + ), self.player) + and state.has_any(( + item_names.KERRIGAN_MEND, + item_names.SWARM_QUEEN, + item_names.INFESTED_MEDICS, + ), self.player) + and self.kerrigan_levels(state, 35) + ) + or (state.has_all((item_names.KERRIGAN_LEAPING_STRIKE, item_names.KERRIGAN_MEND), self.player) and self.kerrigan_levels(state, 35)) + ) + + def terran_infested_garrison_claimer(self, state: CollectionState) -> bool: + return state.has_any((item_names.GHOST, item_names.SPECTRE, item_names.EMPERORS_SHADOW), self.player) + + def protoss_infested_garrison_claimer(self, state: CollectionState) -> bool: + return state.has_any( + (item_names.HIGH_TEMPLAR, item_names.SIGNIFIER, item_names.ASCENDANT), self.player + ) or self.protoss_can_merge_dark_archon(state) + + def terran_hand_of_darkness_requirement(self, state: CollectionState) -> bool: + return self.terran_competent_comp(state) and self.terran_power_rating(state) >= 6 + + def zerg_hand_of_darkness_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and (self.zerg_competent_anti_air(state) or self.advanced_tactics and self.zerg_moderate_anti_air(state)) + and (self.basic_kerrigan(state, False) or self.zerg_power_rating(state) >= 4) + ) + + def protoss_hand_of_darkness_requirement(self, state: CollectionState) -> bool: + return self.protoss_competent_comp(state) and self.protoss_power_rating(state) >= 6 + + def terran_planetfall_requirement(self, state: CollectionState) -> bool: + return self.terran_beats_protoss_deathball(state) and self.terran_power_rating(state) >= 8 + + def zerg_planetfall_requirement(self, state: CollectionState) -> bool: + return self.zerg_competent_comp(state) and self.zerg_competent_anti_air(state) and self.zerg_power_rating(state) >= 8 + + def protoss_planetfall_requirement(self, state: CollectionState) -> bool: + return self.protoss_deathball(state) and self.protoss_power_rating(state) >= 8 + + def zerg_the_reckoning_requirement(self, state: CollectionState) -> bool: + if not (self.zerg_power_rating(state) >= 6 or self.basic_kerrigan(state, False)): + return False + if self.take_over_ai_allies: + return ( + self.terran_competent_comp(state) + and self.zerg_competent_comp(state) + and (self.zerg_competent_anti_air(state) or self.terran_competent_anti_air(state)) + and self.terran_very_hard_mission_weapon_armor_level(state) + and self.zerg_very_hard_mission_weapon_armor_level(state) + ) + else: + return self.zerg_competent_comp(state) and self.zerg_competent_anti_air(state) and self.zerg_very_hard_mission_weapon_armor_level(state) + + def terran_the_reckoning_requirement(self, state: CollectionState) -> bool: + return self.terran_very_hard_mission_weapon_armor_level(state) and self.terran_base_trasher(state) + + def protoss_the_reckoning_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_very_hard_mission_weapon_armor_level(state) + and self.protoss_deathball(state) + and (not self.take_over_ai_allies or (self.terran_competent_comp(state) and self.terran_very_hard_mission_weapon_armor_level(state))) + ) + + def protoss_can_attack_behind_chasm(self, state: CollectionState) -> bool: + return ( + state.has_any(( + item_names.SCOUT, + item_names.SKIRMISHER, + item_names.TEMPEST, + item_names.CARRIER, + item_names.SKYLORD, + item_names.TRIREME, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.PULSAR, + item_names.DAWNBRINGER, + item_names.MOTHERSHIP, + ), self.player) + or self.protoss_has_blink(state) + or ( + state.has(item_names.WARP_PRISM, self.player) + and (self.protoss_common_unit(state) or state.has(item_names.WARP_PRISM_PHASE_BLASTER, self.player)) + ) + or (self.advanced_tactics and state.has_any({item_names.ORACLE, item_names.ARBITER}, self.player)) + ) + + def the_infinite_cycle_requirement(self, state: CollectionState) -> bool: + return ( + self.kerrigan_levels(state, 70) + and ( + self.grant_story_tech == GrantStoryTech.option_grant + or not self.kerrigan_unit_available + or ( + state.has_any( + ( + item_names.KERRIGAN_KINETIC_BLAST, + item_names.KERRIGAN_SPAWN_BANELINGS, + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.KERRIGAN_SPAWN_LEVIATHAN, + ), + self.player, + ) + and self.basic_kerrigan(state) + ) + ) + ) + + def templars_return_phase_2_requirement(self, state: CollectionState) -> bool: + return ( + self.grant_story_tech == GrantStoryTech.option_grant + or self.advanced_tactics + or ( + state.has_any( + ( + item_names.IMMORTAL, + item_names.ANNIHILATOR, + item_names.VANGUARD, + item_names.COLOSSUS, + item_names.WRATHWALKER, + item_names.REAVER, + item_names.DARK_TEMPLAR, + item_names.HIGH_TEMPLAR, + item_names.ENERGIZER, + item_names.SENTRY, + ), + self.player, + ) + ) + ) + + def templars_return_phase_3_reach_colossus_requirement(self, state: CollectionState) -> bool: + return self.templars_return_phase_2_requirement(state) and ( + self.grant_story_tech == GrantStoryTech.option_grant + or self.advanced_tactics + and state.has_any({item_names.ZEALOT_WHIRLWIND, item_names.VANGUARD_RAPIDFIRE_CANNON}, self.player) + or state.has_all(( + item_names.ZEALOT_WHIRLWIND, item_names.VANGUARD_RAPIDFIRE_CANNON + ), self.player) + ) + + def templars_return_phase_3_reach_dts_requirement(self, state: CollectionState) -> bool: + return self.templars_return_phase_3_reach_colossus_requirement(state) and ( + self.grant_story_tech == GrantStoryTech.option_grant + or ( + (self.advanced_tactics or state.has(item_names.ENERGIZER_MOBILE_CHRONO_BEAM, self.player)) + and (state.has(item_names.COLOSSUS_FIRE_LANCE, self.player) + or ( + state.has_all( + { + item_names.COLOSSUS_PACIFICATION_PROTOCOL, + item_names.ENERGIZER_MOBILE_CHRONO_BEAM, + }, + self.player, + ) + ) + )) + ) + + def terran_spear_of_adun_requirement(self, state: CollectionState) -> bool: + return self.terran_common_unit(state) and self.terran_competent_anti_air(state) and self.terran_defense_rating(state, False, False) >= 5 + + def zerg_spear_of_adun_requirement(self, state: CollectionState) -> bool: + return self.zerg_common_unit(state) and self.zerg_competent_anti_air(state) and self.zerg_defense_rating(state, False, False) >= 5 + + def protoss_spear_of_adun_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_common_unit(state) + and self.protoss_anti_light_anti_air(state) + and ( + state.has_any((item_names.ZEALOT, item_names.CENTURION, item_names.SENTINEL, item_names.ADEPT), self.player) + or self.protoss_basic_splash(state) + ) + and self.protoss_defense_rating(state, False) >= 5 + ) + + def terran_sky_shield_requirement(self, state: CollectionState) -> bool: + return self.terran_common_unit(state) and self.terran_competent_anti_air(state) and self.terran_power_rating(state) >= 7 + + def zerg_sky_shield_requirement(self, state: CollectionState) -> bool: + return self.zerg_common_unit(state) and self.zerg_competent_anti_air(state) and self.zerg_power_rating(state) >= 7 + + def protoss_sky_shield_requirement(self, state: CollectionState) -> bool: + return self.protoss_common_unit(state) and self.protoss_competent_anti_air(state) and self.protoss_power_rating(state) >= 7 + + def protoss_brothers_in_arms_requirement(self, state: CollectionState) -> bool: + return (self.protoss_common_unit(state) and self.protoss_anti_armor_anti_air(state) and self.protoss_hybrid_counter(state)) or ( + self.take_over_ai_allies + and (self.terran_common_unit(state) or self.protoss_common_unit(state)) + and (self.terran_competent_anti_air(state) or self.protoss_anti_armor_anti_air(state)) + and ( + self.protoss_hybrid_counter(state) + or state.has_any({item_names.BATTLECRUISER, item_names.LIBERATOR, item_names.SIEGE_TANK}, self.player) + or (self.advanced_tactics and state.has_all({item_names.SPECTRE, item_names.SPECTRE_PSIONIC_LASH}, self.player)) + or ( + state.has(item_names.IMMORTAL, self.player) + and state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.MARAUDER}, self.player) + and self.terran_bio_heal(state) + ) + ) + ) + + def zerg_brothers_in_arms_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_common_unit(state) and self.zerg_competent_comp(state) and self.zerg_competent_anti_air(state) and self.zerg_big_monsters(state) + ) or ( + self.take_over_ai_allies + and (self.zerg_common_unit(state) or self.terran_common_unit(state)) + and (self.terran_competent_anti_air(state) or self.zerg_competent_anti_air(state)) + and ( + self.zerg_big_monsters(state) + or state.has_any({item_names.BATTLECRUISER, item_names.LIBERATOR, item_names.SIEGE_TANK}, self.player) + or (self.advanced_tactics and state.has_all({item_names.SPECTRE, item_names.SPECTRE_PSIONIC_LASH}, self.player)) + or ( + state.has(item_names.ABERRATION, self.player) + and state.has_any({item_names.MARINE, item_names.DOMINION_TROOPER, item_names.MARAUDER}, self.player) + and self.terran_bio_heal(state) + ) + ) + ) + + def protoss_amons_reach_requirement(self, state: CollectionState) -> bool: + return self.protoss_common_unit_anti_light_air(state) and self.protoss_basic_splash(state) and self.protoss_power_rating(state) >= 7 + + def protoss_last_stand_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_common_unit(state) + and self.protoss_competent_anti_air(state) + and self.protoss_static_defense(state) + and self.protoss_defense_rating(state, False) >= 8 + ) + + def terran_last_stand_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_common_unit(state) + and state.has_any({item_names.SIEGE_TANK, item_names.LIBERATOR}, self.player) + and state.has_any({item_names.PERDITION_TURRET, item_names.DEVASTATOR_TURRET, item_names.PLANETARY_FORTRESS}, self.player) + and self.terran_air_anti_air(state) + and state.has_any({item_names.VIKING, item_names.BATTLECRUISER}, self.player) + and self.terran_defense_rating(state, True, False) >= 10 + and self.terran_army_weapon_armor_upgrade_min_level(state) >= 2 + ) + + def zerg_last_stand_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_common_unit(state) + and self.zerg_competent_anti_air(state) + and state.has(item_names.SPINE_CRAWLER, self.player) + and ( + self.morph_lurker(state) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE}, self.player) + or self.zerg_infested_tank_with_ammo(state) + or self.advanced_tactics + and state.has_all({item_names.ULTRALISK, item_names.ULTRALISK_CHITINOUS_PLATING, item_names.ULTRALISK_MONARCH_BLADES}, self.player) + ) + and ( + self.morph_impaler(state) + or state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE}, self.player) + or self.zerg_infested_tank_with_ammo(state) + or state.has(item_names.BILE_LAUNCHER, self.player) + ) + and ( + self.morph_devourer(state) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SUNDERING_GLAIVE}, self.player) + or self.advanced_tactics + and state.has(item_names.BROOD_QUEEN, self.player) + ) + and self.zerg_mineral_dump(state) + and self.zerg_army_weapon_armor_upgrade_min_level(state) >= 2 + ) + + def terran_temple_of_unification_requirement(self, state: CollectionState) -> bool: + return self.terran_beats_protoss_deathball(state) and self.terran_power_rating(state) >= 10 + + def zerg_temple_of_unification_requirement(self, state: CollectionState) -> bool: + # Don't be locked to roach/hydra + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and ( + state.has(item_names.INFESTED_BANSHEE, self.player) + or state.has_all((item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE), self.player) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SUNDERING_GLAIVE}, self.player) + or self.zerg_big_monsters(state) + or ( + self.advanced_tactics + and (state.has_any({item_names.INFESTOR, item_names.DEFILER, item_names.BROOD_QUEEN}, self.player) or self.morph_viper(state)) + ) + ) + and self.zerg_power_rating(state) >= 10 + ) + + def protoss_temple_of_unification_requirement(self, state: CollectionState) -> bool: + return self.protoss_competent_comp(state) and self.protoss_power_rating(state) >= 10 + + def protoss_harbinger_of_oblivion_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_anti_armor_anti_air(state) + and ( + self.take_over_ai_allies + and (self.protoss_common_unit(state) or self.zerg_common_unit(state)) + or (self.protoss_competent_comp(state) and self.protoss_hybrid_counter(state)) + ) + and self.protoss_power_rating(state) >= 6 + ) + + def terran_harbinger_of_oblivion_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_competent_anti_air(state) + and ( + self.take_over_ai_allies + and (self.terran_common_unit(state) or self.zerg_common_unit(state)) + or ( + self.terran_beats_protoss_deathball(state) + and state.has_any({item_names.BATTLECRUISER, item_names.LIBERATOR, item_names.SIEGE_TANK, item_names.THOR}, self.player) + ) + ) + and self.terran_power_rating(state) >= 6 + ) + + def zerg_harbinger_of_oblivion_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_anti_air(state) + and self.zerg_common_unit(state) + and (self.take_over_ai_allies or (self.zerg_competent_comp(state) and self.zerg_big_monsters(state))) + and self.zerg_power_rating(state) >= 6 + ) + + def protoss_unsealing_the_past_ledge_requirement(self, state: CollectionState) -> bool: + return ( + state.has_any((item_names.COLOSSUS, item_names.WRATHWALKER), self.player) + or self.protoss_can_attack_behind_chasm(state) + ) + + def terran_unsealing_the_past_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_competent_anti_air(state) + and self.terran_competent_comp(state) + and self.terran_power_rating(state) >= 6 + and ( + state.has_all((item_names.SIEGE_TANK, item_names.SIEGE_TANK_JUMP_JETS), self.player) + or state.has_all( + {item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY, item_names.BATTLECRUISER_MOIRAI_IMPULSE_DRIVE}, self.player + ) + or ( + self.advanced_tactics + and ( + state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_SMART_SERVOS}, self.player) + or ( + state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_SMART_SERVOS}, self.player) + and ( + ( + state.has_all({item_names.HELLION, item_names.HELLION_HELLBAT}, self.player) + or state.has(item_names.FIREBAT, self.player) + ) + and self.terran_bio_heal(state) + or state.has_all({item_names.VIKING, item_names.VIKING_SHREDDER_ROUNDS}, self.player) + or state.has(item_names.BANSHEE, self.player) + ) + ) + ) + ) + ) + ) + + def zerg_unsealing_the_past_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and self.zerg_power_rating(state) >= 6 + and ( + self.morph_brood_lord(state) + or self.zerg_big_monsters(state) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE}, self.player) + or ( + self.advanced_tactics + and (self.morph_igniter(state) or (self.morph_lurker(state) and state.has(item_names.LURKER_SEISMIC_SPINES, self.player))) + ) + ) + ) + + def terran_purification_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_competent_comp(state) + and self.terran_very_hard_mission_weapon_armor_level(state) + and self.terran_defense_rating(state, True, False) >= 10 + and ( + state.has_any({item_names.LIBERATOR, item_names.THOR}, self.player) + or ( + state.has(item_names.SIEGE_TANK, self.player) + and (self.advanced_tactics or state.has(item_names.SIEGE_TANK_MAELSTROM_ROUNDS, self.player)) + ) + ) + and ( + state.has_all({item_names.VIKING, item_names.VIKING_SHREDDER_ROUNDS}, self.player) + or ( + state.has(item_names.BANSHEE, self.player) + and ( + state.has(item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY, self.player) + or (self.advanced_tactics and state.has(item_names.BANSHEE_ROCKET_BARRAGE, self.player)) + ) + ) + ) + ) + + def zerg_purification_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and self.zerg_defense_rating(state, True, True) >= 5 + and self.zerg_big_monsters(state) + and (state.has(item_names.ULTRALISK, self.player) or self.morph_igniter(state) or self.morph_lurker(state)) + ) + + def protoss_steps_of_the_rite_requirement(self, state: CollectionState) -> bool: + return self.protoss_deathball(state) or self.protoss_fleet(state) + + def terran_steps_of_the_rite_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_beats_protoss_deathball(state) + and ( + state.has_any({item_names.SIEGE_TANK, item_names.LIBERATOR}, self.player) + or state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + or state.has_all((item_names.BANSHEE, item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY), self.player) + ) + and ( + state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + or state.has(item_names.VALKYRIE, self.player) + or state.has_all((item_names.VIKING, item_names.VIKING_RIPWAVE_MISSILES), self.player) + ) + and self.terran_very_hard_mission_weapon_armor_level(state) + ) + + def zerg_steps_of_the_rite_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and self.zerg_base_buster(state) + and ( + self.morph_lurker(state) + or self.zerg_infested_tank_with_ammo(state) + or state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE}, self.player) + or (state.has(item_names.SWARM_QUEEN, self.player) and self.zerg_big_monsters(state)) + ) + and ( + state.has(item_names.INFESTED_LIBERATOR, self.player) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE}, self.player) + or (state.has(item_names.MUTALISK, self.player) and self.morph_devourer(state)) + ) + ) + + def terran_rak_shir_requirement(self, state: CollectionState) -> bool: + return self.terran_beats_protoss_deathball(state) and self.terran_power_rating(state) >= 10 + + def zerg_rak_shir_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and ( + self.zerg_big_monsters(state) + or state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE}, self.player) + or self.morph_impaler_or_lurker(state) + ) + and ( + state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL}, self.player) + or ( + state.has(item_names.MUTALISK, self.player) + and (state.has(item_names.MUTALISK_SUNDERING_GLAIVE, self.player) or self.morph_devourer(state)) + ) + or state.has(item_names.CORRUPTOR, self.player) + or (self.advanced_tactics and state.has(item_names.INFESTOR, self.player)) + ) + and self.zerg_power_rating(state) >= 10 + ) + + def protoss_rak_shir_requirement(self, state: CollectionState) -> bool: + return (self.protoss_deathball(state) or self.protoss_fleet(state)) and self.protoss_power_rating(state) >= 10 + + def protoss_templars_charge_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_heal(state) + and self.protoss_anti_armor_anti_air(state) + and ( + self.protoss_fleet(state) + or ( + self.advanced_tactics + and self.protoss_competent_comp(state) + and ( + state.has_any((item_names.ARBITER, item_names.CORSAIR, item_names.PHOENIX), self.player) + or state.has_all((item_names.MIRAGE, item_names.MIRAGE_GRAVITON_BEAM), self.player) + ) + ) + ) + ) + + def terran_templars_charge_requirement(self, state: CollectionState) -> bool: + return self.terran_very_hard_mission_weapon_armor_level(state) and ( + ( + state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + and state.count(item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX, self.player) >= 2 + ) + or ( + self.terran_air_anti_air(state) + and self.terran_sustainable_mech_heal(state) + and ( + state.has_any({item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) + or state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + or (self.advanced_tactics and (state.has_all({item_names.WRAITH, item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player))) + ) + ) + ) + + def zerg_templars_charge_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and state.has(item_names.SWARM_QUEEN, self.player) + and ( + self.morph_guardian(state) + or self.morph_brood_lord(state) + or state.has(item_names.INFESTED_BANSHEE, self.player) + or ( + self.advanced_tactics + and ( + state.has_all( + { + item_names.MUTALISK, + item_names.MUTALISK_SEVERING_GLAIVE, + item_names.MUTALISK_VICIOUS_GLAIVE, + item_names.MUTALISK_AERODYNAMIC_GLAIVE_SHAPE, + }, + self.player, + ) + or self.morph_viper(state) + ) + ) + ) + and ( + state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL}, self.player) + or (self.morph_devourer(state) and state.has(item_names.MUTALISK, self.player)) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SUNDERING_GLAIVE}, self.player) + ) + ) + + def protoss_the_host_requirement(self, state: CollectionState) -> bool: + return ( + self.protoss_fleet(state) and self.protoss_static_defense(state) and self.protoss_army_weapon_armor_upgrade_min_level(state) >= 2 + ) or ( + self.protoss_deathball(state) + and state.has(item_names.SOA_TIME_STOP, self.player) + or self.advanced_tactics + and (state.has_any((item_names.SOA_SHIELD_OVERCHARGE, item_names.SOA_SOLAR_BOMBARDMENT), self.player)) + ) + + def terran_the_host_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_beats_protoss_deathball(state) + and self.terran_very_hard_mission_weapon_armor_level(state) + and ( + ( + state.has_all({item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY}, self.player) + and state.count(item_names.BATTLECRUISER_PROGRESSIVE_DEFENSIVE_MATRIX, self.player) >= 2 + ) + or ( + self.terran_air_anti_air(state) + and self.terran_sustainable_mech_heal(state) + and ( + state.has_any({item_names.BANSHEE, item_names.BATTLECRUISER}, self.player) + or state.has_all({item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY}, self.player) + ) + ) + or ( + self.spear_of_adun_presence == SpearOfAdunPresence.option_everywhere + and state.has(item_names.SOA_TIME_STOP, self.player) + or self.advanced_tactics + and (state.has_any((item_names.SOA_SHIELD_OVERCHARGE, item_names.SOA_SOLAR_BOMBARDMENT), self.player)) + ) + ) + ) + + def zerg_the_host_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and self.zerg_very_hard_mission_weapon_armor_level(state) + and self.zerg_base_buster(state) + and self.zerg_big_monsters(state) + and ( + (self.morph_brood_lord(state) or self.morph_guardian(state)) + and ( + (self.morph_devourer(state) and state.has(item_names.MUTALISK, self.player)) + or state.has_all((item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL), self.player) + ) + or ( + state.has_all( + ( + item_names.MUTALISK, + item_names.MUTALISK_SEVERING_GLAIVE, + item_names.MUTALISK_VICIOUS_GLAIVE, + item_names.MUTALISK_SUNDERING_GLAIVE, + item_names.MUTALISK_RAPID_REGENERATION, + ), + self.player, + ) + ) + ) + or ( + self.spear_of_adun_presence == SpearOfAdunPresence.option_everywhere + and state.has(item_names.SOA_TIME_STOP, self.player) + or self.advanced_tactics + and (state.has_any((item_names.SOA_SHIELD_OVERCHARGE, item_names.SOA_SOLAR_BOMBARDMENT), self.player)) + ) + ) + + def protoss_salvation_requirement(self, state: CollectionState) -> bool: + return ( + ([self.protoss_competent_comp(state), self.protoss_fleet(state), self.protoss_static_defense(state)].count(True) >= 2) + and self.protoss_very_hard_mission_weapon_armor_level(state) + and self.protoss_power_rating(state) >= 6 + ) + + def terran_salvation_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_beats_protoss_deathball(state) + and self.terran_very_hard_mission_weapon_armor_level(state) + and self.terran_air_anti_air(state) + and state.has_any({item_names.SIEGE_TANK, item_names.LIBERATOR}, self.player) + and state.has_any({item_names.PERDITION_TURRET, item_names.DEVASTATOR_TURRET, item_names.PLANETARY_FORTRESS}, self.player) + and self.terran_power_rating(state) >= 6 + ) + + def zerg_salvation_requirement(self, state: CollectionState) -> bool: + return ( + self.zerg_competent_comp(state) + and self.zerg_competent_anti_air(state) + and state.has(item_names.SPINE_CRAWLER, self.player) + and self.zerg_very_hard_mission_weapon_armor_level(state) + and ( + self.morph_impaler_or_lurker(state) + or state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_DEFENDER_MODE}, self.player) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SEVERING_GLAIVE, item_names.MUTALISK_VICIOUS_GLAIVE}, self.player) + ) + and ( + state.has_all({item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL}, self.player) + or (self.morph_devourer(state) and state.has(item_names.MUTALISK, self.player)) + or state.has_all({item_names.MUTALISK, item_names.MUTALISK_SUNDERING_GLAIVE}, self.player) + ) + and self.zerg_power_rating(state) >= 6 + ) + + def into_the_void_requirement(self, state: CollectionState) -> bool: + if not self.protoss_very_hard_mission_weapon_armor_level(state): + return False + if self.take_over_ai_allies and not ( + self.terran_very_hard_mission_weapon_armor_level(state) and self.zerg_very_hard_mission_weapon_armor_level(state) + ): + return False + return self.protoss_competent_comp(state) or ( + self.take_over_ai_allies + and ( + state.has(item_names.BATTLECRUISER, self.player) + or (state.has(item_names.ULTRALISK, self.player) and self.protoss_competent_anti_air(state)) + ) + ) + + def essence_of_eternity_requirement(self, state: CollectionState) -> bool: + if not self.terran_very_hard_mission_weapon_armor_level(state): + return False + if self.take_over_ai_allies and not ( + self.protoss_very_hard_mission_weapon_armor_level(state) and self.zerg_very_hard_mission_weapon_armor_level(state) + ): + return False + defense_score = self.terran_defense_rating(state, False, True) + if self.take_over_ai_allies and self.protoss_static_defense(state): + defense_score += 2 + return ( + defense_score >= 12 + and (self.terran_competent_anti_air(state) or self.take_over_ai_allies and self.protoss_competent_anti_air(state)) + and ( + state.has(item_names.BATTLECRUISER, self.player) + or ( + state.has_any((item_names.BANSHEE, item_names.LIBERATOR), self.player) + and state.has_any({item_names.VIKING, item_names.VALKYRIE}, self.player) + ) + or self.take_over_ai_allies + and self.protoss_fleet(state) + ) + and self.terran_power_rating(state) >= 6 + ) + + def amons_fall_requirement(self, state: CollectionState) -> bool: + if not self.zerg_very_hard_mission_weapon_armor_level(state): + return False + if not self.zerg_competent_anti_air(state): + return False + if self.zerg_power_rating(state) < 6: + return False + if self.take_over_ai_allies and not ( + self.terran_very_hard_mission_weapon_armor_level(state) and self.protoss_very_hard_mission_weapon_armor_level(state) + ): + return False + if self.take_over_ai_allies: + return ( + ( + state.has_any({item_names.BATTLECRUISER, item_names.CARRIER, item_names.SKYLORD, item_names.TRIREME}, self.player) + or ( + state.has(item_names.ULTRALISK, self.player) + and self.protoss_competent_anti_air(state) + and ( + state.has_any({item_names.LIBERATOR, item_names.BANSHEE, item_names.VALKYRIE, item_names.VIKING}, self.player) + or state.has_all({item_names.WRAITH, item_names.WRAITH_ADVANCED_LASER_TECHNOLOGY}, self.player) + or self.protoss_fleet(state) + ) + and ( + self.terran_sustainable_mech_heal(state) + or ( + self.spear_of_adun_passive_presence == SpearOfAdunPassiveAbilityPresence.option_everywhere + and state.has(item_names.RECONSTRUCTION_BEAM, self.player) + ) + ) + ) + ) + and self.terran_competent_anti_air(state) + and self.protoss_deathball(state) + and self.zerg_competent_comp(state) + ) + else: + return ( + ( + state.has_any((item_names.MUTALISK, item_names.CORRUPTOR, item_names.BROOD_QUEEN, item_names.INFESTED_BANSHEE), self.player) + or state.has_all((item_names.INFESTED_LIBERATOR, item_names.INFESTED_LIBERATOR_CLOUD_DISPERSAL), self.player) + or state.has_all((item_names.SCOURGE, item_names.SCOURGE_RESOURCE_EFFICIENCY), self.player) + or self.morph_brood_lord(state) + or self.morph_guardian(state) + or self.morph_devourer(state) + ) + or (self.advanced_tactics and self.spread_creep(state, False) and self.zerg_big_monsters(state)) + ) and self.zerg_competent_comp(state) + + def the_escape_stuff_granted(self) -> bool: + """ + The NCO first mission requires having too much stuff first before actually able to do anything + :return: + """ + return self.grant_story_tech == GrantStoryTech.option_grant or (self.mission_order == MissionOrder.option_vanilla and self.enabled_campaigns == {SC2Campaign.NCO}) + + def the_escape_first_stage_requirement(self, state: CollectionState) -> bool: + return self.the_escape_stuff_granted() or (self.nova_ranged_weapon(state) and (self.nova_full_stealth(state) or self.nova_heal(state))) + + def the_escape_requirement(self, state: CollectionState) -> bool: + return self.the_escape_first_stage_requirement(state) and (self.the_escape_stuff_granted() or self.nova_splash(state)) + + def terran_able_to_snipe_defiler(self, state: CollectionState) -> bool: + return ( + state.has(item_names.BANSHEE, self.player) + or ( + state.has(item_names.NOVA_JUMP_SUIT_MODULE, self.player) + and (state.has_any({item_names.NOVA_DOMINATION, item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_PULSE_GRENADES}, self.player)) + ) + or (state.has_all({item_names.SIEGE_TANK, item_names.SIEGE_TANK_MAELSTROM_ROUNDS, item_names.SIEGE_TANK_JUMP_JETS}, self.player)) + ) + + def sudden_strike_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_able_to_snipe_defiler(state) + and (self.terran_cliffjumper(state) or state.has(item_names.BANSHEE, self.player)) + and self.nova_splash(state) + and self.terran_defense_rating(state, True, False) >= 3 + and (self.advanced_tactics + or state.has(item_names.NOVA_JUMP_SUIT_MODULE, self.player) + ) + ) + + def enemy_intelligence_garrisonable_unit(self, state: CollectionState) -> bool: + """ + Has unit usable as a Garrison in Enemy Intelligence + """ + return ( + state.has_any(( + item_names.MARINE, + item_names.SON_OF_KORHAL, + item_names.REAPER, + item_names.MARAUDER, + item_names.GHOST, + item_names.SPECTRE, + item_names.HELLION, + item_names.GOLIATH, + item_names.WARHOUND, + item_names.DIAMONDBACK, + item_names.VIKING, + item_names.DOMINION_TROOPER, + ), self.player) + or (self.advanced_tactics + and state.has(item_names.ROGUE_FORCES, self.player) + and state.count_from_list(( + item_names.WAR_PIGS, + item_names.HAMMER_SECURITIES, + item_names.DEATH_HEADS, + item_names.SPARTAN_COMPANY, + item_names.HELS_ANGELS, + item_names.BRYNHILDS, + ), self.player) >= 3 + ) + ) + + def enemy_intelligence_cliff_garrison(self, state: CollectionState) -> bool: + return ( + state.has_any((item_names.REAPER, item_names.VIKING), self.player) + or (state.has_any((item_names.MEDIVAC, item_names.HERCULES), self.player) + and self.enemy_intelligence_garrisonable_unit(state) + ) + or state.has_all({item_names.GOLIATH, item_names.GOLIATH_JUMP_JETS}, self.player) + or (self.advanced_tactics and state.has_any({item_names.HELS_ANGELS, item_names.BRYNHILDS}, self.player)) + ) + + def enemy_intelligence_first_stage_requirement(self, state: CollectionState) -> bool: + return ( + self.enemy_intelligence_garrisonable_unit(state) + and ( + self.terran_competent_comp(state) + or (self.terran_common_unit(state) and self.terran_competent_anti_air(state) and state.has(item_names.NOVA_NUKE, self.player)) + ) + and self.terran_defense_rating(state, True, True) >= 5 + ) + + def enemy_intelligence_second_stage_requirement(self, state: CollectionState) -> bool: + return ( + self.enemy_intelligence_first_stage_requirement(state) + and self.enemy_intelligence_cliff_garrison(state) + and ( + self.grant_story_tech == GrantStoryTech.option_grant + or ( + self.nova_any_weapon(state) + and (self.nova_full_stealth(state) or (self.nova_heal(state) and self.nova_splash(state) and self.nova_ranged_weapon(state))) + ) + ) + ) + + def enemy_intelligence_third_stage_requirement(self, state: CollectionState) -> bool: + return self.enemy_intelligence_second_stage_requirement(state) and ( + self.grant_story_tech == GrantStoryTech.option_grant or (state.has(item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player) and self.nova_dash(state)) + ) + + def enemy_intelligence_cliff_garrison_and_nova_mobility(self, state: CollectionState) -> bool: + return self.enemy_intelligence_cliff_garrison(state) and ( + self.nova_any_nobuild_damage(state) + or ( + state.has(item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE, self.player, 2) + and state.has_any((item_names.NOVA_FLASHBANG_GRENADES, item_names.NOVA_BLINK), self.player) + ) + ) + + def trouble_in_paradise_requirement(self, state: CollectionState) -> bool: + return ( + self.nova_any_weapon(state) + and self.nova_splash(state) + and self.terran_beats_protoss_deathball(state) + and self.terran_defense_rating(state, True, True) >= 7 + and self.terran_power_rating(state) >= 5 + ) + + def night_terrors_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_common_unit(state) + and self.terran_competent_anti_air(state) + and ( + # These can handle the waves of infested, even volatile ones + state.has(item_names.SIEGE_TANK, self.player) + or state.has_all({item_names.VIKING, item_names.VIKING_SHREDDER_ROUNDS}, self.player) + or state.has_all((item_names.BANSHEE, item_names.BANSHEE_SHOCKWAVE_MISSILE_BATTERY), self.player) + or ( + ( + # Regular infesteds + ( + state.has_any((item_names.FIREBAT, item_names.REAPER), self.player) + or state.has_all({item_names.HELLION, item_names.HELLION_HELLBAT}, self.player) + ) + and self.terran_bio_heal(state) + or (self.advanced_tactics and state.has_any({item_names.PERDITION_TURRET, item_names.PLANETARY_FORTRESS}, self.player)) + ) + and ( + # Volatile infesteds + state.has(item_names.LIBERATOR, self.player) + or ( + self.advanced_tactics + and state.has(item_names.VULTURE, self.player) + or (state.has(item_names.HERC, self.player) and self.terran_bio_heal(state)) + ) + ) + ) + ) + and self.terran_army_weapon_armor_upgrade_min_level(state) >= 2 + ) + + def flashpoint_far_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_competent_comp(state) + and self.terran_mobile_detector(state) + and self.terran_defense_rating(state, True, False) >= 6 + and self.terran_army_weapon_armor_upgrade_min_level(state) >= 2 + and self.nova_splash(state) + and (self.advanced_tactics or self.terran_competent_ground_to_air(state)) + ) + + def enemy_shadow_tripwires_tool(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_FLASHBANG_GRENADES, item_names.NOVA_BLINK, item_names.NOVA_DOMINATION}, self.player) + + def enemy_shadow_door_unlocks_tool(self, state: CollectionState) -> bool: + return state.has_any({item_names.NOVA_DOMINATION, item_names.NOVA_BLINK, item_names.NOVA_JUMP_SUIT_MODULE}, self.player) + + def enemy_shadow_nova_damage_and_blazefire_unlock(self, state: CollectionState) -> bool: + return self.nova_any_nobuild_damage(state) and ( + state.has(item_names.NOVA_BLINK, self.player) or state.has_all((item_names.NOVA_HOLO_DECOY, item_names.NOVA_DOMINATION), self.player) + ) + + def enemy_shadow_domination(self, state: CollectionState) -> bool: + return self.grant_story_tech == GrantStoryTech.option_grant or ( + self.nova_ranged_weapon(state) + and ( + self.nova_full_stealth(state) + or state.has(item_names.NOVA_JUMP_SUIT_MODULE, self.player) + or (self.nova_heal(state) and self.nova_splash(state)) + ) + ) + + def enemy_shadow_first_stage(self, state: CollectionState) -> bool: + return self.enemy_shadow_domination(state) and ( + self.grant_story_tech == GrantStoryTech.option_grant + or ((self.nova_full_stealth(state) and self.enemy_shadow_tripwires_tool(state)) or (self.nova_heal(state) and self.nova_splash(state))) + ) + + def enemy_shadow_second_stage(self, state: CollectionState) -> bool: + return self.enemy_shadow_first_stage(state) and ( + self.grant_story_tech == GrantStoryTech.option_grant + or (self.nova_splash(state) or self.nova_heal(state) or self.nova_escape_assist(state)) + and (self.advanced_tactics or state.has(item_names.NOVA_GHOST_VISOR, self.player)) + ) + + def enemy_shadow_door_controls(self, state: CollectionState) -> bool: + return self.enemy_shadow_second_stage(state) and (self.grant_story_tech == GrantStoryTech.option_grant or self.enemy_shadow_door_unlocks_tool(state)) + + def enemy_shadow_victory(self, state: CollectionState) -> bool: + return self.enemy_shadow_door_controls(state) and (self.grant_story_tech == GrantStoryTech.option_grant or (self.nova_heal(state) and self.nova_beat_stone(state))) + + def dark_skies_requirement(self, state: CollectionState) -> bool: + return self.terran_common_unit(state) and self.terran_beats_protoss_deathball(state) and self.terran_defense_rating(state, False, True) >= 8 + + def end_game_requirement(self, state: CollectionState) -> bool: + return ( + self.terran_competent_comp(state) + and self.terran_mobile_detector(state) + and self.nova_any_weapon(state) + and self.nova_splash(state) + and ( + # Xanthos + state.has_any((item_names.BATTLECRUISER, item_names.VIKING, item_names.WARHOUND), self.player) + or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_SMART_SERVOS), self.player) + or state.has_all((item_names.THOR, item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD), self.player) + or ( + state.has(item_names.VALKYRIE, self.player) + and state.has_any((item_names.VALKYRIE_AFTERBURNERS, item_names.VALKYRIE_SHAPED_HULL), self.player) + and state.has_any((item_names.VALKYRIE_FLECHETTE_MISSILES, item_names.VALKYRIE_ENHANCED_CLUSTER_LAUNCHERS), self.player) + ) + or (state.has(item_names.BANSHEE, self.player) and (self.advanced_tactics or state.has(item_names.BANSHEE_SHAPED_HULL, self.player))) + or ( + self.advanced_tactics + and ( + ( + state.has_all((item_names.MARINE, item_names.MARINE_PROGRESSIVE_STIMPACK), self.player) + and (self.terran_bio_heal(state) or state.count(item_names.MARINE_PROGRESSIVE_STIMPACK, self.player) >= 2) + ) + or (state.has(item_names.DOMINION_TROOPER, self.player) and self.terran_bio_heal(state)) + or state.has_all( + (item_names.PREDATOR, item_names.PREDATOR_RESOURCE_EFFICIENCY, item_names.PREDATOR_ADAPTIVE_DEFENSES), self.player + ) + or state.has_all((item_names.CYCLONE, item_names.CYCLONE_TARGETING_OPTICS), self.player) + ) + ) + ) + and ( # The enemy has 3/3 BCs + state.has_any( + (item_names.GOLIATH, item_names.VIKING, item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_BLAZEFIRE_GUNBLADE), self.player + ) + or state.has_all((item_names.THOR, item_names.THOR_PROGRESSIVE_HIGH_IMPACT_PAYLOAD), self.player) + or state.has_all((item_names.GHOST, item_names.GHOST_LOCKDOWN), self.player) + or state.has_all((item_names.BATTLECRUISER, item_names.BATTLECRUISER_ATX_LASER_BATTERY), self.player) + ) + and self.terran_army_weapon_armor_upgrade_min_level(state) >= 3 + ) + + def has_terran_units(self, target: int) -> Callable[["CollectionState"], bool]: + def _has_terran_units(state: CollectionState) -> bool: + return ( + state.count_from_list_unique( + item_groups.terran_units + item_groups.terran_buildings, self.player + ) >= target + and ( + target < 5 + or self.terran_any_anti_air(state) + ) + and ( + # Anything that can hit buildings + state.has_any(( + # Infantry + item_names.MARINE, + item_names.FIREBAT, + item_names.MARAUDER, + item_names.REAPER, + item_names.HERC, + item_names.DOMINION_TROOPER, + item_names.GHOST, + item_names.SPECTRE, + # Vehicles + item_names.HELLION, + item_names.VULTURE, + item_names.SIEGE_TANK, + item_names.WARHOUND, + item_names.GOLIATH, + item_names.DIAMONDBACK, + item_names.THOR, + item_names.PREDATOR, + item_names.CYCLONE, + # Ships + item_names.WRAITH, + item_names.VIKING, + item_names.BANSHEE, + item_names.RAVEN, + item_names.BATTLECRUISER, + # RG + item_names.SON_OF_KORHAL, + item_names.AEGIS_GUARD, + item_names.EMPERORS_SHADOW, + item_names.BULWARK_COMPANY, + item_names.SHOCK_DIVISION, + item_names.BLACKHAMMER, + item_names.SKY_FURY, + item_names.NIGHT_WOLF, + item_names.NIGHT_HAWK, + item_names.PRIDE_OF_AUGUSTRGRAD, + ), self.player) + or state.has_all((item_names.LIBERATOR, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + or state.has_all((item_names.EMPERORS_GUARDIAN, item_names.LIBERATOR_RAID_ARTILLERY), self.player) + or state.has_all((item_names.VALKYRIE, item_names.VALKYRIE_FLECHETTE_MISSILES), self.player) + or state.has_all((item_names.WIDOW_MINE, item_names.WIDOW_MINE_DEMOLITION_PAYLOAD), self.player) + or ( + state.has_any(( + # Mercs with shortest initial cooldown (300s) + item_names.WAR_PIGS, + item_names.DEATH_HEADS, + item_names.HELS_ANGELS, + item_names.WINGED_NIGHTMARES, + ), self.player) + # + 2 upgrades that allow getting faster/earlier mercs + and state.count_from_list(( + item_names.RAPID_REINFORCEMENT, + item_names.PROGRESSIVE_FAST_DELIVERY, + item_names.ROGUE_FORCES, + # item_names.SIGNAL_BEACON, # Probably doesn't help too much on the first unit + ), self.player) >= 2 + ) + ) + ) + + return _has_terran_units + + def has_zerg_units(self, target: int) -> Callable[["CollectionState"], bool]: + def _has_zerg_units(state: CollectionState) -> bool: + num_units = ( + state.count_from_list_unique( + item_groups.zerg_nonmorph_units + item_groups.zerg_buildings + [item_names.OVERLORD_OVERSEER_ASPECT], + self.player + ) + + self.morph_baneling(state) + + self.morph_ravager(state) + + self.morph_igniter(state) + + self.morph_lurker(state) + + self.morph_impaler(state) + + self.morph_viper(state) + + self.morph_devourer(state) + + self.morph_brood_lord(state) + + self.morph_guardian(state) + + self.morph_tyrannozor(state) + ) + return ( + num_units >= target + and ( + target < 5 + or self.zerg_any_anti_air(state) + ) + and ( + # Anything that can hit buildings + state.has_any(( + item_names.ZERGLING, + item_names.SWARM_QUEEN, + item_names.ROACH, + item_names.HYDRALISK, + item_names.ABERRATION, + item_names.SWARM_HOST, + item_names.MUTALISK, + item_names.ULTRALISK, + item_names.PYGALISK, + item_names.INFESTED_MARINE, + item_names.INFESTED_BUNKER, + item_names.INFESTED_DIAMONDBACK, + item_names.INFESTED_SIEGE_TANK, + item_names.INFESTED_BANSHEE, + ), self.player) + or state.has_all((item_names.INFESTOR, item_names.INFESTOR_INFESTED_TERRAN), self.player) + or self.morph_baneling(state) + or self.morph_lurker(state) + or self.morph_impaler(state) + or self.morph_brood_lord(state) + or self.morph_guardian(state) + or self.morph_ravager(state) + or self.morph_igniter(state) + or self.morph_tyrannozor(state) + or (self.morph_devourer(state) + and state.has(item_names.DEVOURER_PRESCIENT_SPORES, self.player) + ) + or ( + state.has_any(( + # Mercs with <= 300s first drop time + item_names.DEVOURING_ONES, + item_names.HUNTER_KILLERS, + item_names.CAUSTIC_HORRORS, + item_names.HUNTERLING, + ), self.player) + # + 2 upgrades that allow getting faster/earlier mercs + and state.count_from_list(( + item_names.UNRESTRICTED_MUTATION, + item_names.EVOLUTIONARY_LEAP, + item_names.CELL_DIVISION, + item_names.SELF_SUFFICIENT, + ), self.player) >= 2 + ) + ) + ) + + return _has_zerg_units + + def has_protoss_units(self, target: int) -> Callable[["CollectionState"], bool]: + def _has_protoss_units(state: CollectionState) -> bool: + return ( + state.count_from_list_unique(item_groups.protoss_units + item_groups.protoss_buildings + [item_names.NEXUS_OVERCHARGE], self.player) + >= target + ) and ( + target < 5 + or self.protoss_any_anti_air_unit(state) + ) and ( + # Anything that can hit buildings + state.has_any(( + # Gateway + item_names.ZEALOT, + item_names.CENTURION, + item_names.SENTINEL, + item_names.SUPPLICANT, + item_names.STALKER, + item_names.INSTIGATOR, + item_names.SLAYER, + item_names.DRAGOON, + item_names.ADEPT, + item_names.SENTRY, + item_names.ENERGIZER, + item_names.AVENGER, + item_names.DARK_TEMPLAR, + item_names.BLOOD_HUNTER, + item_names.HIGH_TEMPLAR, + item_names.SIGNIFIER, + item_names.ASCENDANT, + item_names.DARK_ARCHON, + # Robo + item_names.IMMORTAL, + item_names.ANNIHILATOR, + item_names.VANGUARD, + item_names.STALWART, + item_names.COLOSSUS, + item_names.WRATHWALKER, + item_names.REAVER, + item_names.DISRUPTOR, + # Stargate + item_names.SKIRMISHER, + item_names.SCOUT, + item_names.MISTWING, + item_names.OPPRESSOR, + item_names.PULSAR, + item_names.VOID_RAY, + item_names.DESTROYER, + item_names.DAWNBRINGER, + item_names.ARBITER, + item_names.ORACLE, + item_names.CARRIER, + item_names.TRIREME, + item_names.SKYLORD, + item_names.TEMPEST, + item_names.MOTHERSHIP, + ), self.player) + or state.has_all((item_names.WARP_PRISM, item_names.WARP_PRISM_PHASE_BLASTER), self.player) + or state.has_all((item_names.CALADRIUS, item_names.CALADRIUS_CORONA_BEAM), self.player) + or state.has_all((item_names.PHOTON_CANNON, item_names.KHALAI_INGENUITY), self.player) + or state.has_all((item_names.KHAYDARIN_MONOLITH, item_names.KHALAI_INGENUITY), self.player) + ) + + return _has_protoss_units + + def has_race_units(self, target: int, race: SC2Race) -> Callable[["CollectionState"], bool]: + if target == 0 or race == SC2Race.ANY: + return Location.access_rule + result = self.unit_count_functions.get((race, target)) + if result is not None: + return result + if race == SC2Race.TERRAN: + result = self.has_terran_units(target) + if race == SC2Race.ZERG: + result = self.has_zerg_units(target) + if race == SC2Race.PROTOSS: + result = self.has_protoss_units(target) + assert result + self.unit_count_functions[(race, target)] = result + return result + + +def get_basic_units(logic_level: int, race: SC2Race) -> Set[str]: + if logic_level > RequiredTactics.option_advanced: + return no_logic_basic_units[race] + elif logic_level == RequiredTactics.option_advanced: + return advanced_basic_units[race] + else: + return basic_units[race] diff --git a/worlds/sc2/settings.py b/worlds/sc2/settings.py new file mode 100644 index 0000000000..26253b1e65 --- /dev/null +++ b/worlds/sc2/settings.py @@ -0,0 +1,49 @@ +from typing import Union +import settings + + +class Starcraft2Settings(settings.Group): + class WindowWidth(int): + """The starting width the client window in pixels""" + + class WindowHeight(int): + """The starting height the client window in pixels""" + + class GameWindowedMode(settings.Bool): + """Controls whether the game should start in windowed mode""" + + class TerranButtonColor(list): + """Defines the colour of terran mission buttons in the launcher in rgb format (3 elements ranging from 0 to 1)""" + + class ZergButtonColor(list): + """Defines the colour of zerg mission buttons in the launcher in rgb format (3 elements ranging from 0 to 1)""" + + class ProtossButtonColor(list): + """Defines the colour of protoss mission buttons in the launcher in rgb format (3 elements ranging from 0 to 1)""" + + class DisableForcedCamera(str): + """Overrides the disable forced-camera slot option. Possible values: `true`, `false`, `default`. Default uses slot value""" + + class SkipCutscenes(str): + """Overrides the skip cutscenes slot option. Possible values: `true`, `false`, `default`. Default uses slot value""" + + class GameDifficulty(str): + """Overrides the slot's difficulty setting. Possible values: `casual`, `normal`, `hard`, `brutal`, `default`. Default uses slot value""" + + class GameSpeed(str): + """Overrides the slot's gamespeed setting. Possible values: `slower`, `slow`, `normal`, `fast`, `faster`, `default`. Default uses slot value""" + + class ShowTraps(settings.Bool): + """If set to true, in-client scouting will show traps as distinct from filler""" + + window_width: WindowWidth = WindowWidth(1080) + window_height: WindowHeight = WindowHeight(720) + game_windowed_mode: Union[GameWindowedMode, bool] = False + show_traps: Union[ShowTraps, bool] = False + disable_forced_camera: DisableForcedCamera = DisableForcedCamera("default") + skip_cutscenes: SkipCutscenes = SkipCutscenes("default") + game_difficulty: GameDifficulty = GameDifficulty("default") + game_speed: GameSpeed = GameSpeed("default") + terran_button_color: TerranButtonColor = TerranButtonColor([0.0838, 0.2898, 0.2346]) + zerg_button_color: ZergButtonColor = ZergButtonColor([0.345, 0.22425, 0.12765]) + protoss_button_color: ProtossButtonColor = ProtossButtonColor([0.18975, 0.2415, 0.345]) diff --git a/worlds/sc2/starcraft2.kv b/worlds/sc2/starcraft2.kv new file mode 100644 index 0000000000..9013986f20 --- /dev/null +++ b/worlds/sc2/starcraft2.kv @@ -0,0 +1,61 @@ + + scroll_type: ["content", "bars"] + bar_width: dp(12) + effect_cls: "ScrollEffect" + canvas.after: + Color: + rgba: (0.82, 0.2, 0, root.border_on) + Line: + width: 1.5 + rectangle: self.x+1, self.y+1, self.width-1, self.height-1 + + + color: (1, 1, 1, 1) + canvas.before: + Color: + rgba: (0xd2/0xff, 0x33/0xff, 0, 1) + Rectangle: + pos: (self.x - 8, self.y - 8) + size: (self.width + 30, self.height + 16) + + + cols: 1 + size_hint_y: None + height: self.minimum_height + 15 + padding: [5,0,dp(12),0] + +: + cols: 1 + +: + rows: 1 + +: + cols: 1 + +: + rows: 1 + +: + cols: 1 + spacing: [0,5] + +: + text_size: self.size + markup: True + halign: 'center' + valign: 'middle' + padding: [5,0,5,0] + outline_width: 1 + canvas.before: + Color: + rgba: (1, 193/255, 86/255, root.is_goal) + Line: + width: 1 + rectangle: (self.x, self.y + 0.5, self.width, self.height) + canvas.after: + Color: + rgba: (0.8, 0.8, 0.8, root.is_exit) + Line: + width: 1 + rectangle: (self.x + 2, self.y + 3, self.width - 4, self.height - 4) \ No newline at end of file diff --git a/worlds/sc2/test/test_Regions.py b/worlds/sc2/test/test_Regions.py deleted file mode 100644 index c268b65da9..0000000000 --- a/worlds/sc2/test/test_Regions.py +++ /dev/null @@ -1,41 +0,0 @@ -import unittest -from .test_base import Sc2TestBase -from .. import Regions -from .. import Options, MissionTables - -class TestGridsizes(unittest.TestCase): - def test_grid_sizes_meet_specs(self): - self.assertTupleEqual((1, 2, 0), Regions.get_grid_dimensions(2)) - self.assertTupleEqual((1, 3, 0), Regions.get_grid_dimensions(3)) - self.assertTupleEqual((2, 2, 0), Regions.get_grid_dimensions(4)) - self.assertTupleEqual((2, 3, 1), Regions.get_grid_dimensions(5)) - self.assertTupleEqual((2, 4, 1), Regions.get_grid_dimensions(7)) - self.assertTupleEqual((2, 4, 0), Regions.get_grid_dimensions(8)) - self.assertTupleEqual((3, 3, 0), Regions.get_grid_dimensions(9)) - self.assertTupleEqual((2, 5, 0), Regions.get_grid_dimensions(10)) - self.assertTupleEqual((3, 4, 1), Regions.get_grid_dimensions(11)) - self.assertTupleEqual((3, 4, 0), Regions.get_grid_dimensions(12)) - self.assertTupleEqual((3, 5, 0), Regions.get_grid_dimensions(15)) - self.assertTupleEqual((4, 4, 0), Regions.get_grid_dimensions(16)) - self.assertTupleEqual((4, 6, 0), Regions.get_grid_dimensions(24)) - self.assertTupleEqual((5, 5, 0), Regions.get_grid_dimensions(25)) - self.assertTupleEqual((5, 6, 1), Regions.get_grid_dimensions(29)) - self.assertTupleEqual((5, 7, 2), Regions.get_grid_dimensions(33)) - - -class TestGridGeneration(Sc2TestBase): - options = { - "mission_order": Options.MissionOrder.option_grid, - "excluded_missions": [MissionTables.SC2Mission.ZERO_HOUR.mission_name,], - "enable_hots_missions": False, - "enable_prophecy_missions": True, - "enable_lotv_prologue_missions": False, - "enable_lotv_missions": False, - "enable_epilogue_missions": False, - "enable_nco_missions": False - } - - def test_size_matches_exclusions(self): - self.assertNotIn(MissionTables.SC2Mission.ZERO_HOUR.mission_name, self.multiworld.regions) - # WoL has 29 missions. -1 for Zero Hour being excluded, +1 for the automatically-added menu location - self.assertEqual(len(self.multiworld.regions), 29) diff --git a/worlds/sc2/test/test_base.py b/worlds/sc2/test/test_base.py index 28529e37ed..f0f778dc79 100644 --- a/worlds/sc2/test/test_base.py +++ b/worlds/sc2/test/test_base.py @@ -1,11 +1,65 @@ from typing import * +import unittest +import random +from argparse import Namespace +from BaseClasses import MultiWorld, CollectionState, PlandoOptions +from Generate import get_seed_name +from worlds import AutoWorld +from test.general import gen_steps, call_all -from test.TestBase import WorldTestBase -from .. import SC2World -from .. import Client +from test.bases import WorldTestBase +from .. import SC2World, SC2Campaign +from .. import client +from .. import options class Sc2TestBase(WorldTestBase): - game = Client.SC2Context.game + game = client.SC2Context.game world: SC2World player: ClassVar[int] = 1 skip_long_tests: bool = True + + +class Sc2SetupTestBase(unittest.TestCase): + """ + A custom sc2-specific test base class that provides an explicit function to generate the world from options. + This allows potentially generating multiple worlds in one test case, useful for tracking down a rare / sporadic + crash. + """ + ALL_CAMPAIGNS = { + 'enabled_campaigns': options.EnabledCampaigns.valid_keys, + } + TERRAN_CAMPAIGNS = { + 'enabled_campaigns': {SC2Campaign.WOL.campaign_name, SC2Campaign.NCO.campaign_name,} + } + ZERG_CAMPAIGNS = { + 'enabled_campaigns': {SC2Campaign.HOTS.campaign_name,} + } + PROTOSS_CAMPAIGNS = { + 'enabled_campaigns': {SC2Campaign.PROPHECY.campaign_name, SC2Campaign.PROLOGUE.campaign_name, SC2Campaign.LOTV.campaign_name,} + } + seed: Optional[int] = None + game = SC2World.game + player = 1 + def generate_world(self, options: Dict[str, Any]) -> None: + self.multiworld = MultiWorld(1) + self.multiworld.game[self.player] = self.game + self.multiworld.player_name = {self.player: "Tester"} + self.multiworld.set_seed(self.seed) + random.seed(self.multiworld.seed) + self.multiworld.seed_name = get_seed_name(random) # only called to get same RNG progression as Generate.py + args = Namespace() + for name, option in AutoWorld.AutoWorldRegister.world_types[self.game].options_dataclass.type_hints.items(): + new_option = option.from_any(options.get(name, option.default)) + new_option.verify(SC2World, "Tester", PlandoOptions.items|PlandoOptions.connections|PlandoOptions.texts|PlandoOptions.bosses) + setattr(args, name, { + 1: new_option + }) + self.multiworld.set_options(args) + self.world: SC2World = cast(SC2World, self.multiworld.worlds[self.player]) + self.multiworld.state = CollectionState(self.multiworld) + try: + for step in gen_steps: + call_all(self.multiworld, step) + except Exception as ex: + ex.add_note(f"Seed: {self.multiworld.seed}") + raise diff --git a/worlds/sc2/test/test_custom_mission_orders.py b/worlds/sc2/test/test_custom_mission_orders.py new file mode 100644 index 0000000000..524e6481e5 --- /dev/null +++ b/worlds/sc2/test/test_custom_mission_orders.py @@ -0,0 +1,221 @@ +""" +Unit tests for custom mission orders +""" + +from .test_base import Sc2SetupTestBase +from .. import MissionFlag +from ..item import item_tables, item_names +from BaseClasses import ItemClassification +from .. import options + +class TestCustomMissionOrders(Sc2SetupTestBase): + def test_mini_wol_generates(self): + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': 'custom', + 'custom_mission_order': { + 'Mini Wings of Liberty': { + 'global': { + 'type': 'column', + 'mission_pool': [ + 'terran missions', + '^ wol missions' + ] + }, + 'Mar Sara': { + 'size': 1 + }, + 'Colonist': { + 'size': 2, + 'entry_rules': [{ + 'scope': '../Mar Sara' + }] + }, + 'Artifact': { + 'size': 3, + 'entry_rules': [{ + 'scope': '../Mar Sara' + }], + 'missions': [ + { + 'index': 1, + 'entry_rules': [{ + 'scope': 'Mini Wings of Liberty', + 'amount': 4 + }] + }, + { + 'index': 2, + 'entry_rules': [{ + 'scope': 'Mini Wings of Liberty', + 'amount': 8 + }] + } + ] + }, + 'Prophecy': { + 'size': 2, + 'entry_rules': [{ + 'scope': '../Artifact/1' + }], + 'mission_pool': [ + 'protoss missions', + '^ prophecy missions' + ] + }, + 'Covert': { + 'size': 2, + 'entry_rules': [{ + 'scope': 'Mini Wings of Liberty', + 'amount': 2 + }] + }, + 'Rebellion': { + 'size': 2, + 'entry_rules': [{ + 'scope': 'Mini Wings of Liberty', + 'amount': 3 + }] + }, + 'Char': { + 'size': 3, + 'entry_rules': [{ + 'scope': '../Artifact/2' + }], + 'missions': [ + { + 'index': 0, + 'next': [2] + }, + { + 'index': 1, + 'entrance': True + } + ] + } + } + } + } + + self.generate_world(world_options) + flags = self.world.custom_mission_order.get_used_flags() + self.assertEqual(flags[MissionFlag.Terran], 13) + self.assertEqual(flags[MissionFlag.Protoss], 2) + self.assertEqual(flags.get(MissionFlag.Zerg, 0), 0) + sc2_regions = set(self.multiworld.regions.region_cache[self.player]) - {"Menu"} + self.assertEqual(len(self.world.custom_mission_order.get_used_missions()), len(sc2_regions)) + + def test_locked_and_necessary_item_appears_once(self): + # This is a filler upgrade with a parent + test_item = item_names.MARINE_OPTIMIZED_LOGISTICS + world_options = { + 'mission_order': 'custom', + 'locked_items': { test_item: 1 }, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 5, # Give the generator some space to place the key + 'max_difficulty': 'easy', + 'missions': [{ + 'index': 4, + 'entry_rules': [{ + 'items': { test_item: 1 } + }] + }] + } + } + } + + self.assertNotEqual(item_tables.item_table[test_item].classification, ItemClassification.progression, f"Test item {test_item} won't change classification") + + self.generate_world(world_options) + test_items_in_pool = [item for item in self.multiworld.itempool if item.name == test_item] + test_items_in_pool += [item for item in self.multiworld.precollected_items[self.player] if item.name == test_item] + self.assertEqual(len(test_items_in_pool), 1) + self.assertEqual(test_items_in_pool[0].classification, ItemClassification.progression) + + def test_start_inventory_and_necessary_item_appears_once(self): + # This is a filler upgrade with a parent + test_item = item_names.ZERGLING_METABOLIC_BOOST + world_options = { + 'mission_order': 'custom', + 'enabled_campaigns': set(options.EnabledCampaigns.valid_keys), + 'start_inventory': { test_item: 1 }, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 5, # Give the generator some space to place the key + 'max_difficulty': 'easy', + 'missions': [{ + 'index': 4, + 'entry_rules': [{ + 'items': { test_item: 1 } + }] + }] + } + } + } + + self.generate_world(world_options) + test_items_in_pool = [item for item in self.multiworld.itempool if item.name == test_item] + self.assertEqual(len(test_items_in_pool), 0) + test_items_in_start_inventory = [item for item in self.multiworld.precollected_items[self.player] if item.name == test_item] + self.assertEqual(len(test_items_in_start_inventory), 1) + + def test_start_inventory_and_locked_and_necessary_item_appears_once(self): + # This is a filler upgrade with a parent + test_item = item_names.ZERGLING_METABOLIC_BOOST + world_options = { + 'mission_order': 'custom', + 'enabled_campaigns': set(options.EnabledCampaigns.valid_keys), + 'start_inventory': { test_item: 1 }, + 'locked_items': { test_item: 1 }, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 5, # Give the generator some space to place the key + 'max_difficulty': 'easy', + 'missions': [{ + 'index': 4, + 'entry_rules': [{ + 'items': { test_item: 1 } + }] + }] + } + } + } + + self.generate_world(world_options) + test_items_in_pool = [item for item in self.multiworld.itempool if item.name == test_item] + self.assertEqual(len(test_items_in_pool), 0) + test_items_in_start_inventory = [item for item in self.multiworld.precollected_items[self.player] if item.name == test_item] + self.assertEqual(len(test_items_in_start_inventory), 1) + + def test_key_item_rule_creates_correct_item_amount(self): + # This is an item that normally only exists once + test_item = item_names.ZERGLING + test_amount = 3 + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': 'custom', + 'locked_items': { test_item: 1 }, # Make sure it is generated as normal + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 12, # Give the generator some space to place the keys + 'max_difficulty': 'easy', + 'mission_pool': ['zerg missions'], # Make sure the item isn't excluded by race selection + 'missions': [{ + 'index': 10, + 'entry_rules': [{ + 'items': { test_item: test_amount } # Require more than the usual item amount + }] + }] + } + } + } + + self.generate_world(world_options) + test_items_in_pool = [item for item in self.multiworld.itempool if item.name == test_item] + test_items_in_start_inventory = [item for item in self.multiworld.precollected_items[self.player] if item.name == test_item] + self.assertEqual(len(test_items_in_pool + test_items_in_start_inventory), test_amount) diff --git a/worlds/sc2/test/test_generation.py b/worlds/sc2/test/test_generation.py new file mode 100644 index 0000000000..61de392c0c --- /dev/null +++ b/worlds/sc2/test/test_generation.py @@ -0,0 +1,1302 @@ +""" +Unit tests for world generation +""" +from typing import * + +from .test_base import Sc2SetupTestBase + +from .. import mission_groups, mission_tables, options, locations, SC2Mission, SC2Campaign, SC2Race, unreleased_items, \ + RequiredTactics +from ..item import item_groups, item_tables, item_names +from .. import get_all_missions, get_random_first_mission +from ..options import EnabledCampaigns, NovaGhostOfAChanceVariant, MissionOrder, ExcludeOverpoweredItems, \ + VanillaItemsOnly, MaximumCampaignSize + + +class TestItemFiltering(Sc2SetupTestBase): + def test_explicit_locks_excludes_interact_and_set_flags(self): + world_options = { + **self.ALL_CAMPAIGNS, + 'locked_items': { + item_names.MARINE: 0, + item_names.MARAUDER: 0, + item_names.MEDIVAC: 1, + item_names.FIREBAT: 1, + item_names.ZEALOT: 0, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: 2, + }, + 'excluded_items': { + item_names.MARINE: 0, + item_names.MARAUDER: 0, + item_names.MEDIVAC: 0, + item_names.FIREBAT: 1, + item_names.ZERGLING: 0, + item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL: 2, + } + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + itempool = [item.name for item in self.multiworld.itempool] + self.assertIn(item_names.MARINE, itempool) + self.assertIn(item_names.MARAUDER, itempool) + self.assertIn(item_names.MEDIVAC, itempool) + self.assertIn(item_names.FIREBAT, itempool) + self.assertIn(item_names.ZEALOT, itempool) + self.assertNotIn(item_names.ZERGLING, itempool) + regen_biosteel_items = [x for x in itempool if x == item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL] + self.assertEqual(len(regen_biosteel_items), 2) + + def test_unexcludes_cancel_out_excludes(self): + world_options = { + 'grant_story_tech': options.GrantStoryTech.option_grant, + 'excluded_items': { + item_groups.ItemGroupNames.NOVA_EQUIPMENT: 15, + item_names.MARINE_PROGRESSIVE_STIMPACK: 1, + item_names.MARAUDER_PROGRESSIVE_STIMPACK: 2, + item_names.MARINE: 0, + item_names.MARAUDER: 0, + item_names.REAPER: 1, + item_names.DIAMONDBACK: 0, + item_names.HELLION: 1, + # Additional excludes to increase the likelihood that unexcluded items actually appear + item_groups.ItemGroupNames.STARPORT_UNITS: 0, + item_names.WARHOUND: 0, + item_names.VULTURE: 0, + item_names.WIDOW_MINE: 0, + item_names.THOR: 0, + item_names.GHOST: 0, + item_names.SPECTRE: 0, + item_groups.ItemGroupNames.MENGSK_UNITS: 0, + item_groups.ItemGroupNames.TERRAN_VETERANCY_UNITS: 0, + }, + 'unexcluded_items': { + item_names.NOVA_PLASMA_RIFLE: 1, # Necessary to pass logic + item_names.NOVA_PULSE_GRENADES: 0, # Necessary to pass logic + item_names.NOVA_JUMP_SUIT_MODULE: 0, # Necessary to pass logic + item_groups.ItemGroupNames.BARRACKS_UNITS: 0, + item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE: 1, + item_names.HELLION: 1, + item_names.MARINE_PROGRESSIVE_STIMPACK: 1, + item_names.MARAUDER_PROGRESSIVE_STIMPACK: 0, + # Additional unexcludes for logic + item_names.MEDIVAC: 0, + item_names.BATTLECRUISER: 0, + item_names.SCIENCE_VESSEL: 0, + }, + # Terran-only + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + itempool = [item.name for item in self.multiworld.itempool] + self.assertIn(item_names.MARINE, itempool) + self.assertIn(item_names.MARAUDER, itempool) + self.assertIn(item_names.REAPER, itempool) + self.assertEqual(itempool.count(item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE), 1, "Stealth suit occurred the wrong number of times") + self.assertIn(item_names.HELLION, itempool) + self.assertEqual(itempool.count(item_names.MARINE_PROGRESSIVE_STIMPACK), 2, f"Marine stimpacks weren't unexcluded (seed {self.multiworld.seed})") + self.assertEqual(itempool.count(item_names.MARAUDER_PROGRESSIVE_STIMPACK), 2, f"Marauder stimpacks weren't unexcluded (seed {self.multiworld.seed})") + self.assertNotIn(item_names.DIAMONDBACK, itempool) + self.assertNotIn(item_names.NOVA_BLAZEFIRE_GUNBLADE, itempool) + self.assertNotIn(item_names.NOVA_ENERGY_SUIT_MODULE, itempool) + + def test_excluding_groups_excludes_all_items_in_group(self): + world_options = { + 'excluded_items': [ + item_groups.ItemGroupNames.BARRACKS_UNITS.lower(), + ] + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertIn(item_names.MARINE, self.world.options.excluded_items) + for item_name in item_groups.barracks_units: + self.assertNotIn(item_name, itempool) + + def test_excluding_mission_groups_excludes_all_missions_in_group(self): + world_options = { + **self.ZERG_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'excluded_missions': [ + mission_groups.MissionGroupNames.HOTS_ZERUS_MISSIONS, + ], + 'mission_order': options.MissionOrder.option_grid, + } + self.generate_world(world_options) + missions = get_all_missions(self.world.custom_mission_order) + self.assertTrue(missions) + self.assertNotIn(mission_tables.SC2Mission.WAKING_THE_ANCIENT, missions) + self.assertNotIn(mission_tables.SC2Mission.THE_CRUCIBLE, missions) + self.assertNotIn(mission_tables.SC2Mission.SUPREME, missions) + + def test_excluding_campaigns_excludes_campaign_specific_items(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name + }, + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotIn(item_data.type, item_tables.ProtossItemType) + self.assertNotIn(item_data.type, item_tables.ZergItemType) + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Nova_Gear) + self.assertNotEqual(item_name, item_names.NOVA_PROGRESSIVE_STEALTH_SUIT_MODULE) + + def test_starter_unit_populates_start_inventory(self): + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'shuffle_no_build': options.ShuffleNoBuild.option_false, + 'mission_order': options.MissionOrder.option_grid, + 'starter_unit': options.StarterUnit.option_any_starter_unit, + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + self.assertTrue(self.multiworld.precollected_items[self.player]) + + def test_excluding_all_terran_missions_excludes_all_terran_items(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'excluded_missions': [ + mission.mission_name for mission in mission_tables.SC2Mission + if mission_tables.MissionFlag.Terran in mission.flags + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotIn(item_data.type, item_tables.TerranItemType, f"Item '{item_name}' included when all terran missions are excluded") + + def test_excluding_all_terran_build_missions_excludes_all_terran_units(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'excluded_missions': [ + mission.mission_name for mission in mission_tables.SC2Mission + if mission_tables.MissionFlag.Terran in mission.flags + and mission_tables.MissionFlag.NoBuild not in mission.flags + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Unit, f"Item '{item_name}' included when all terran build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Mercenary, f"Item '{item_name}' included when all terran build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.TerranItemType.Building, f"Item '{item_name}' included when all terran build missions are excluded") + + def test_excluding_all_zerg_and_kerrigan_missions_excludes_all_zerg_items(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'excluded_missions': [ + mission.mission_name for mission in mission_tables.SC2Mission + if (mission_tables.MissionFlag.Kerrigan | mission_tables.MissionFlag.Zerg) & mission.flags + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotIn(item_data.type, item_tables.ZergItemType, f"Item '{item_name}' included when all zerg missions are excluded") + + def test_excluding_all_zerg_build_missions_excludes_zerg_units(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'excluded_missions': [ + *[mission.mission_name + for mission in mission_tables.SC2Mission + if mission_tables.MissionFlag.Zerg in mission.flags + and mission_tables.MissionFlag.NoBuild not in mission.flags], + mission_tables.SC2Mission.ENEMY_WITHIN.mission_name, + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotEqual(item_data.type, item_tables.ZergItemType.Unit, f"Item '{item_name}' included when all zerg build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.ZergItemType.Mercenary, f"Item '{item_name}' included when all zerg build missions are excluded") + + def test_excluding_all_protoss_missions_excludes_all_protoss_items(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'excluded_missions': [ + *[mission.mission_name + for mission in mission_tables.SC2Mission + if mission_tables.MissionFlag.Protoss in mission.flags], + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotIn(item_data.type, item_tables.ProtossItemType, f"Item '{item_name}' included when all protoss missions are excluded") + + def test_excluding_all_protoss_build_missions_excludes_protoss_units(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'excluded_missions': [ + *[mission.mission_name + for mission in mission_tables.SC2Mission + if mission.race == mission_tables.SC2Race.PROTOSS + and mission_tables.MissionFlag.NoBuild not in mission.flags], + mission_tables.SC2Mission.TEMPLAR_S_RETURN.mission_name, + ], + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + for item_name, item_data in world_items: + self.assertNotEqual(item_data.type, item_tables.ProtossItemType.Unit, f"Item '{item_name}' included when all protoss build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.ProtossItemType.Unit_2, f"Item '{item_name}' included when all protoss build missions are excluded") + self.assertNotEqual(item_data.type, item_tables.ProtossItemType.Building, f"Item '{item_name}' included when all protoss build missions are excluded") + + def test_vanilla_items_only_excludes_terran_progressives(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'vanilla_items_only': True, + } + self.generate_world(world_options) + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + self.assertTrue(world_items) + occurrences: Dict[str, int] = {} + for item_name, _ in world_items: + if item_name in item_groups.terran_progressive_items: + if item_name in item_groups.nova_equipment: + # The option imposes no contraint on Nova equipment + continue + occurrences.setdefault(item_name, 0) + occurrences[item_name] += 1 + self.assertLessEqual(occurrences[item_name], 1, f"'{item_name}' unexpectedly appeared multiple times in the pool") + + def test_vanilla_items_only_includes_only_nova_equipment_and_vanilla_and_filler_items(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + # Avoid options that lock non-vanilla items for logic + 'spear_of_adun_presence': options.SpearOfAdunPresence.option_protoss, + 'required_tactics': options.RequiredTactics.option_advanced, + 'mastery_locations': options.MasteryLocations.option_disabled, + 'accessibility': 'locations', + 'vanilla_items_only': True, + # Move the unit nerf items from the start inventory to the pool, + # else this option could push non-vanilla items past this test + 'war_council_nerfs': True, + } + + self.generate_world(world_options) + + world_items = [(item.name, item_tables.item_table[item.name]) for item in self.multiworld.itempool] + self.assertTrue(world_items) + self.assertNotIn(item_names.DESTROYER_REFORGED_BLOODSHARD_CORE, world_items) + for item_name, item_data in world_items: + if item_data.quantity == 0: + continue + self.assertIn(item_name, item_groups.vanilla_items + item_groups.nova_equipment) + + def test_evil_awoken_with_vanilla_items_only_generates(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.PROLOGUE.campaign_name, + SC2Campaign.LOTV.campaign_name + }, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'vanilla_items_only': True, + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + self.assertTrue(self.world.get_region(mission_tables.SC2Mission.EVIL_AWOKEN.mission_name)) + + def test_enemy_within_and_no_zerg_build_missions_generates(self) -> None: + world_options = { + # including WoL to allow for valid goal missions + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.HOTS.campaign_name + }, + 'excluded_missions': [ + mission.mission_name for mission in mission_tables.SC2Mission + if mission_tables.MissionFlag.Zerg in mission.flags + and mission_tables.MissionFlag.NoBuild not in mission.flags + ], + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'vanilla_items_only': True, + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + self.assertTrue(self.world.get_region(mission_tables.SC2Mission.ENEMY_WITHIN.mission_name)) + self.assertNotIn(item_names.ULTRALISK, itempool) + self.assertNotIn(item_names.SWARM_QUEEN, itempool) + self.assertNotIn(item_names.MUTALISK, itempool) + self.assertNotIn(item_names.CORRUPTOR, itempool) + self.assertNotIn(item_names.SCOURGE, itempool) + + def test_soa_items_are_included_in_wol_when_presence_set_to_everywhere(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'spear_of_adun_presence': options.SpearOfAdunPresence.option_everywhere, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + # Ensure enough locations to fit all wanted items + 'generic_upgrade_missions': 1, + 'victory_cache': 5, + 'excluded_items': {item_groups.ItemGroupNames.BARRACKS_UNITS: 0}, + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + soa_items_in_pool = [item_name for item_name in itempool if item_tables.item_table[item_name].type == item_tables.ProtossItemType.Spear_Of_Adun] + self.assertGreater(len(soa_items_in_pool), 5) + + def test_lotv_only_doesnt_include_kerrigan_items_with_grant_story_tech(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.LOTV.campaign_name, + }, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + 'grant_story_tech': options.GrantStoryTech.option_grant, + } + self.generate_world(world_options) + missions = get_all_missions(self.world.custom_mission_order) + self.assertIn(mission_tables.SC2Mission.TEMPLE_OF_UNIFICATION, missions) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + kerrigan_items_in_pool = set(item_groups.kerrigan_abilities).intersection(itempool) + self.assertFalse(kerrigan_items_in_pool) + kerrigan_passives_in_pool = set(item_groups.kerrigan_passives).intersection(itempool) + self.assertFalse(kerrigan_passives_in_pool) + + def test_excluding_zerg_units_with_morphling_enabled_doesnt_exclude_aspects(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.HOTS.campaign_name, + }, + 'required_tactics': options.RequiredTactics.option_no_logic, + 'enable_morphling': options.EnableMorphling.option_true, + 'excluded_items': [ + item_groups.ItemGroupNames.ZERG_UNITS.lower() + ], + 'unexcluded_items': [ + item_groups.ItemGroupNames.ZERG_MORPHS.lower() + ] + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + aspects_in_pool = list(set(itempool).intersection(set(item_groups.zerg_morphs))) + self.assertTrue(aspects_in_pool) + units_in_pool = list(set(itempool).intersection(set(item_groups.zerg_units)) + .difference(set(item_groups.zerg_morphs))) + self.assertFalse(units_in_pool) + + def test_excluding_zerg_units_with_morphling_disabled_should_exclude_aspects(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.HOTS.campaign_name, + }, + 'required_tactics': options.RequiredTactics.option_no_logic, + 'enable_morphling': options.EnableMorphling.option_false, + 'excluded_items': [ + item_groups.ItemGroupNames.ZERG_UNITS.lower() + ], + 'unexcluded_items': [ + item_groups.ItemGroupNames.ZERG_MORPHS.lower() + ] + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + self.assertTrue(itempool) + aspects_in_pool = list(set(itempool).intersection(set(item_groups.zerg_morphs))) + if item_names.OVERLORD_OVERSEER_ASPECT in aspects_in_pool: + # Overseer morphs from Overlord, that's available always + aspects_in_pool.remove(item_names.OVERLORD_OVERSEER_ASPECT) + self.assertFalse(aspects_in_pool) + units_in_pool = list(set(itempool).intersection(set(item_groups.zerg_units)) + .difference(set(item_groups.zerg_morphs))) + self.assertFalse(units_in_pool) + + def test_deprecated_orbital_command_not_present(self) -> None: + """ + Orbital command got replaced. The item is still there for backwards compatibility. + It shouldn't be generated. + """ + world_options = {} + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertTrue(itempool) + self.assertNotIn(item_names.PROGRESSIVE_ORBITAL_COMMAND, itempool) + + def test_planetary_orbital_module_not_present_without_cc_spells(self) -> None: + world_options = { + "excluded_items": [ + item_names.COMMAND_CENTER_MULE, + item_names.COMMAND_CENTER_SCANNER_SWEEP, + item_names.COMMAND_CENTER_EXTRA_SUPPLIES + ], + "locked_items": [ + item_names.PLANETARY_FORTRESS + ] + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertTrue(itempool) + self.assertIn(item_names.PLANETARY_FORTRESS, itempool) + self.assertNotIn(item_names.PLANETARY_FORTRESS_ORBITAL_MODULE, itempool) + + def test_disabling_unit_nerfs_start_inventories_war_council_upgrades(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.PROPHECY.campaign_name, + SC2Campaign.PROLOGUE.campaign_name, + SC2Campaign.LOTV.campaign_name + }, + 'mission_order': options.MissionOrder.option_grid, + 'war_council_nerfs': options.WarCouncilNerfs.option_false, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + war_council_item_names = set(item_groups.item_name_groups[item_groups.ItemGroupNames.WAR_COUNCIL]) + present_war_council_items = war_council_item_names.intersection(itempool) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + starting_war_council_items = war_council_item_names.intersection(starting_inventory) + + self.assertTrue(itempool) + self.assertFalse(present_war_council_items, f'Found war council upgrades when war_council_nerfs is false: {present_war_council_items}') + self.assertEqual(war_council_item_names, starting_war_council_items) + + def test_disabling_speedrun_locations_removes_them_from_the_pool(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.HOTS.campaign_name, + }, + 'mission_order': options.MissionOrder.option_grid, + 'speedrun_locations': options.SpeedrunLocations.option_disabled, + 'preventative_locations': options.PreventativeLocations.option_filler, + } + + self.generate_world(world_options) + world_regions = list(self.multiworld.regions) + world_location_names = [location.name for region in world_regions for location in region.locations] + all_location_names = [location_data.name for location_data in locations.DEFAULT_LOCATION_LIST] + speedrun_location_name = f"{mission_tables.SC2Mission.LAB_RAT.mission_name}: Win In Under 10 Minutes" + self.assertIn(speedrun_location_name, all_location_names) + self.assertNotIn(speedrun_location_name, world_location_names) + + def test_nco_and_wol_picks_correct_starting_mission(self): + world_options = { + 'mission_order': MissionOrder.option_vanilla, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + } + self.generate_world(world_options) + self.assertEqual(get_random_first_mission(self.world, self.world.custom_mission_order), mission_tables.SC2Mission.LIBERATION_DAY) + + def test_excluding_mission_short_name_excludes_all_variants_of_mission(self): + world_options = { + 'excluded_missions': [ + mission_tables.SC2Mission.ZERO_HOUR.mission_name.split(" (")[0] + ], + 'mission_order': options.MissionOrder.option_grid, + 'selected_races': options.SelectedRaces.valid_keys, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + } + self.generate_world(world_options) + missions = get_all_missions(self.world.custom_mission_order) + self.assertTrue(missions) + self.assertNotIn(mission_tables.SC2Mission.ZERO_HOUR, missions) + self.assertNotIn(mission_tables.SC2Mission.ZERO_HOUR_Z, missions) + self.assertNotIn(mission_tables.SC2Mission.ZERO_HOUR_P, missions) + + def test_excluding_mission_variant_excludes_just_that_variant(self): + world_options = { + 'excluded_missions': [ + mission_tables.SC2Mission.ZERO_HOUR.mission_name + ], + 'mission_order': options.MissionOrder.option_grid, + 'selected_races': options.SelectedRaces.valid_keys, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + } + self.generate_world(world_options) + missions = get_all_missions(self.world.custom_mission_order) + self.assertTrue(missions) + self.assertNotIn(mission_tables.SC2Mission.ZERO_HOUR, missions) + self.assertIn(mission_tables.SC2Mission.ZERO_HOUR_Z, missions) + self.assertIn(mission_tables.SC2Mission.ZERO_HOUR_P, missions) + + def test_weapon_armor_upgrades(self): + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + # Disable locations in order to cause item culling + 'vanilla_locations': options.VanillaLocations.option_disabled, + 'extra_locations': options.ExtraLocations.option_disabled, + 'challenge_locations': options.ChallengeLocations.option_disabled, + 'mastery_locations': options.MasteryLocations.option_disabled, + 'speedrun_locations': options.SpeedrunLocations.option_disabled, + 'preventative_locations': options.PreventativeLocations.option_disabled, + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + itempool = [item.name for item in self.multiworld.itempool] + world_items = starting_inventory + itempool + vehicle_weapon_items = [x for x in world_items if x == item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON] + other_bundle_items = [ + x for x in world_items if x in ( + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, + item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE, + ) + ] + + # Under standard tactics you need to place L3 upgrades for available unit classes + self.assertGreaterEqual(len(vehicle_weapon_items), 3) + self.assertEqual(len(other_bundle_items), 0) + + def test_weapon_armor_upgrades_with_bundles(self): + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_bundle_unit_class, + # Disable locations in order to cause item culling + 'vanilla_locations': options.VanillaLocations.option_disabled, + 'extra_locations': options.ExtraLocations.option_disabled, + 'challenge_locations': options.ChallengeLocations.option_disabled, + 'mastery_locations': options.MasteryLocations.option_disabled, + 'speedrun_locations': options.SpeedrunLocations.option_disabled, + 'preventative_locations': options.PreventativeLocations.option_disabled, + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + itempool = [item.name for item in self.multiworld.itempool] + world_items = starting_inventory + itempool + vehicle_upgrade_items = [x for x in world_items if x == item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE] + other_bundle_items = [ + x for x in world_items if x in ( + item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE, + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE, + item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, + ) + ] + + # Under standard tactics you need to place L3 upgrades for available unit classes + self.assertGreaterEqual(len(vehicle_upgrade_items), 3) + self.assertEqual(len(other_bundle_items), 0) + + def test_weapon_armor_upgrades_all_in_air(self): + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'all_in_map': options.AllInMap.option_air, # All-in air forces an air unit + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + # Disable locations in order to cause item culling + 'vanilla_locations': options.VanillaLocations.option_disabled, + 'extra_locations': options.ExtraLocations.option_disabled, + 'challenge_locations': options.ChallengeLocations.option_disabled, + 'mastery_locations': options.MasteryLocations.option_disabled, + 'speedrun_locations': options.SpeedrunLocations.option_disabled, + 'preventative_locations': options.PreventativeLocations.option_disabled, + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + itempool = [item.name for item in self.multiworld.itempool] + world_items = starting_inventory + itempool + vehicle_weapon_items = [x for x in world_items if x == item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON] + ship_weapon_items = [x for x in world_items if x == item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON] + + # Under standard tactics you need to place L3 upgrades for available unit classes + self.assertGreaterEqual(len(vehicle_weapon_items), 3) + self.assertGreaterEqual(len(ship_weapon_items), 3) + + def test_weapon_armor_upgrades_generic_upgrade_missions(self): + """ + Tests the case when there aren't enough missions in order to get required weapon/armor upgrades + for logic requirements. + :return: + """ + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'required_tactics': options.RequiredTactics.option_standard, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'all_in_map': options.AllInMap.option_air, # All-in air forces an air unit + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + 'generic_upgrade_missions': 100, # Fallback happens by putting weapon/armor upgrades into starting inventory + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + upgrade_items = [x for x in starting_inventory if x == item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE] + + # Under standard tactics you need to place L3 upgrades for available unit classes + self.assertEqual(len(upgrade_items), 3) + + def test_weapon_armor_upgrades_generic_upgrade_missions_no_logic(self): + """ + Tests the case when there aren't enough missions in order to get required weapon/armor upgrades + for logic requirements. + + Except the case above it's No Logic, thus the fallback won't take place. + :return: + """ + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'required_tactics': options.RequiredTactics.option_no_logic, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'all_in_map': options.AllInMap.option_air, # All-in air forces an air unit + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + 'generic_upgrade_missions': 100, # Fallback happens by putting weapon/armor upgrades into starting inventory + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + upgrade_items = [x for x in starting_inventory if x == item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE] + + # No logic won't take the fallback to trigger + self.assertEqual(len(upgrade_items), 0) + + def test_weapon_armor_upgrades_generic_upgrade_missions_no_countermeasure_needed(self): + world_options = { + # Vanilla WoL with all missions + 'mission_order': options.MissionOrder.option_vanilla, + 'required_tactics': options.RequiredTactics.option_standard, + 'starter_unit': options.StarterUnit.option_off, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'all_in_map': options.AllInMap.option_air, # All-in air forces an air unit + 'start_inventory': { + item_names.GOLIATH: 1 # Don't fail with early item placement + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + 'generic_upgrade_missions': 1, # Weapon / Armor upgrades should be available almost instantly + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + upgrade_items = [x for x in starting_inventory if x == item_names.PROGRESSIVE_TERRAN_WEAPON_ARMOR_UPGRADE] + + # No additional starting inventory item placement is needed + self.assertEqual(len(upgrade_items), 0) + + def test_kerrigan_levels_per_mission_triggering_pre_fill(self): + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': options.MissionOrder.option_custom, + 'custom_mission_order': { + 'campaign': { + 'goal': True, + 'layout': { + 'type': 'column', + 'size': 3, + 'missions': [ + { + 'index': 0, + 'mission_pool': [SC2Mission.LIBERATION_DAY.mission_name] + }, + { + 'index': 1, + 'mission_pool': [SC2Mission.THE_INFINITE_CYCLE.mission_name] + }, + { + 'index': 2, + 'mission_pool': [SC2Mission.THE_RECKONING.mission_name] + }, + ] + } + } + }, + 'required_tactics': options.RequiredTactics.option_standard, + 'starter_unit': options.StarterUnit.option_off, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + 'grant_story_levels': options.GrantStoryLevels.option_disabled, + 'kerrigan_levels_per_mission_completed': 1, + 'kerrigan_level_item_distribution': options.KerriganLevelItemDistribution.option_size_2, + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + kerrigan_1_stacks = [x for x in starting_inventory if x == item_names.KERRIGAN_LEVELS_1] + + self.assertGreater(len(kerrigan_1_stacks), 0) + + def test_kerrigan_levels_per_mission_and_generic_upgrades_both_triggering_pre_fill(self): + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': options.MissionOrder.option_custom, + 'custom_mission_order': { + 'campaign': { + 'goal': True, + 'layout': { + 'type': 'column', + 'size': 3, + 'missions': [ + { + 'index': 0, + 'mission_pool': [SC2Mission.LIBERATION_DAY.mission_name] + }, + { + 'index': 1, + 'mission_pool': [SC2Mission.THE_INFINITE_CYCLE.mission_name] + }, + { + 'index': 2, + 'mission_pool': [SC2Mission.THE_RECKONING.mission_name] + }, + ] + } + } + }, + 'required_tactics': options.RequiredTactics.option_standard, + 'starter_unit': options.StarterUnit.option_off, + 'generic_upgrade_items': options.GenericUpgradeItems.option_individual_items, + 'grant_story_levels': options.GrantStoryLevels.option_disabled, + 'kerrigan_levels_per_mission_completed': 1, + 'kerrigan_level_item_distribution': options.KerriganLevelItemDistribution.option_size_2, + 'generic_upgrade_missions': 100, # Weapon / Armor upgrades + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + itempool = [item.name for item in self.multiworld.itempool] + kerrigan_1_stacks = [x for x in starting_inventory if x == item_names.KERRIGAN_LEVELS_1] + upgrade_items = [x for x in starting_inventory if x == item_names.PROGRESSIVE_ZERG_WEAPON_ARMOR_UPGRADE] + + self.assertGreater(len(kerrigan_1_stacks), 0) # Kerrigan levels were added + self.assertEqual(len(upgrade_items), 3) # W/A upgrades were added + self.assertNotIn(item_names.KERRIGAN_LEVELS_70, itempool) + self.assertNotIn(item_names.KERRIGAN_LEVELS_70, starting_inventory) + + def test_locking_required_items(self): + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': options.MissionOrder.option_custom, + 'custom_mission_order': { + 'campaign': { + 'goal': True, + 'layout': { + 'type': 'column', + 'size': 2, + 'missions': [ + { + 'index': 0, + 'mission_pool': [SC2Mission.LIBERATION_DAY.mission_name] + }, + { + 'index': 1, + 'mission_pool': [SC2Mission.SUPREME.mission_name] + }, + ] + } + } + }, + 'grant_story_levels': options.GrantStoryLevels.option_additive, + 'excluded_items': [ + item_names.KERRIGAN_LEAPING_STRIKE, + item_names.KERRIGAN_MEND, + ] + } + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + # These items will be in the pool despite exclusions + self.assertIn(item_names.KERRIGAN_LEAPING_STRIKE, itempool) + self.assertIn(item_names.KERRIGAN_MEND, itempool) + + + def test_fully_balanced_mission_races(self): + """ + Tests whether fully balanced mission race balancing actually is fully balanced. + """ + campaign_size = 57 + self.assertEqual(campaign_size % 3, 0, "Chosen test size cannot be perfectly balanced") + world_options = { + # Reasonably large grid with enough missions to balance races + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': campaign_size, + 'enabled_campaigns': EnabledCampaigns.valid_keys, + 'selected_races': options.SelectedRaces.valid_keys, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'mission_race_balancing': options.EnableMissionRaceBalancing.option_fully_balanced, + } + + self.generate_world(world_options) + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + missions = [mission_tables.lookup_name_to_mission[region] for region in world_regions] + race_flags = [mission_tables.MissionFlag.Terran, mission_tables.MissionFlag.Zerg, mission_tables.MissionFlag.Protoss] + race_counts = { flag: sum(flag in mission.flags for mission in missions) for flag in race_flags } + + self.assertEqual(race_counts[mission_tables.MissionFlag.Terran], race_counts[mission_tables.MissionFlag.Zerg]) + self.assertEqual(race_counts[mission_tables.MissionFlag.Zerg], race_counts[mission_tables.MissionFlag.Protoss]) + + def test_setting_filter_weight_to_zero_excludes_that_item(self) -> None: + world_options = { + 'filler_items_distribution': { + item_names.STARTING_MINERALS: 0, + item_names.STARTING_VESPENE: 1, + item_names.STARTING_SUPPLY: 0, + item_names.MAX_SUPPLY: 0, + item_names.REDUCED_MAX_SUPPLY: 0, + item_names.SHIELD_REGENERATION: 0, + item_names.BUILDING_CONSTRUCTION_SPEED: 0, + }, + # Exclude many items to get filler to generate + 'excluded_items': { + item_groups.ItemGroupNames.TERRAN_VETERANCY_UNITS: 0, + }, + 'max_number_of_upgrades': 2, + 'mission_order': options.MissionOrder.option_grid, + **self.ALL_CAMPAIGNS, + 'selected_races': { + SC2Race.TERRAN.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertNotIn(item_names.STARTING_MINERALS, itempool) + self.assertNotIn(item_names.STARTING_SUPPLY, itempool) + self.assertNotIn(item_names.MAX_SUPPLY, itempool) + self.assertNotIn(item_names.REDUCED_MAX_SUPPLY, itempool) + self.assertNotIn(item_names.SHIELD_REGENERATION, itempool) + self.assertNotIn(item_names.BUILDING_CONSTRUCTION_SPEED, itempool) + + self.assertIn(item_names.STARTING_VESPENE, itempool) + + def test_shields_filler_doesnt_appear_if_no_protoss_missions_appear(self) -> None: + world_options = { + 'filler_items_distribution': { + item_names.STARTING_MINERALS: 1, + item_names.STARTING_VESPENE: 0, + item_names.STARTING_SUPPLY: 0, + item_names.MAX_SUPPLY: 0, + item_names.REDUCED_MAX_SUPPLY: 1, + item_names.SHIELD_REGENERATION: 1, + item_names.BUILDING_CONSTRUCTION_SPEED: 0, + }, + # Exclude many items to get filler to generate + 'excluded_items': { + item_groups.ItemGroupNames.TERRAN_VETERANCY_UNITS: 0, + item_groups.ItemGroupNames.ZERG_MORPHS: 0, + }, + 'max_number_of_upgrades': 2, + 'mission_order': options.MissionOrder.option_grid, + **self.ALL_CAMPAIGNS, + 'selected_races': { + SC2Race.TERRAN.get_title(), + SC2Race.ZERG.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertNotIn(item_names.SHIELD_REGENERATION, itempool) + + self.assertNotIn(item_names.STARTING_VESPENE, itempool) + self.assertNotIn(item_names.STARTING_SUPPLY, itempool) + self.assertNotIn(item_names.MAX_SUPPLY, itempool) + self.assertNotIn(item_names.BUILDING_CONSTRUCTION_SPEED, itempool) + + self.assertIn(item_names.STARTING_MINERALS, itempool) + self.assertIn(item_names.REDUCED_MAX_SUPPLY, itempool) + + def test_weapon_armor_upgrade_items_capped_by_max_upgrade_level(self) -> None: + MAX_LEVEL = 3 + world_options = { + 'locked_items': { + item_groups.ItemGroupNames.TERRAN_GENERIC_UPGRADES: MAX_LEVEL, + item_groups.ItemGroupNames.ZERG_GENERIC_UPGRADES: MAX_LEVEL, + item_groups.ItemGroupNames.PROTOSS_GENERIC_UPGRADES: MAX_LEVEL + 1, + }, + 'max_upgrade_level': MAX_LEVEL, + 'mission_order': options.MissionOrder.option_grid, + **self.ALL_CAMPAIGNS, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'generic_upgrade_items': options.GenericUpgradeItems.option_bundle_weapon_and_armor + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + upgrade_item_counts: Dict[str, int] = {} + for item_name in itempool: + if item_tables.item_table[item_name].type in ( + item_tables.TerranItemType.Upgrade, + item_tables.ZergItemType.Upgrade, + item_tables.ProtossItemType.Upgrade, + ): + upgrade_item_counts[item_name] = upgrade_item_counts.get(item_name, 0) + 1 + expected_result = { + item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE: MAX_LEVEL, + item_names.PROGRESSIVE_TERRAN_WEAPON_UPGRADE: MAX_LEVEL, + item_names.PROGRESSIVE_ZERG_ARMOR_UPGRADE: MAX_LEVEL, + item_names.PROGRESSIVE_ZERG_WEAPON_UPGRADE: MAX_LEVEL, + item_names.PROGRESSIVE_PROTOSS_ARMOR_UPGRADE: MAX_LEVEL + 1, + item_names.PROGRESSIVE_PROTOSS_WEAPON_UPGRADE: MAX_LEVEL + 1, + } + self.assertDictEqual(expected_result, upgrade_item_counts) + + def test_ghost_of_a_chance_generates_without_nco(self) -> None: + world_options = { + **self.TERRAN_CAMPAIGNS, + 'mission_order': MissionOrder.option_custom, + 'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_auto, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 1, + 'mission_pool': [ + SC2Mission.GHOST_OF_A_CHANCE.mission_name + ] + } + } + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertNotIn(item_names.NOVA_C20A_CANISTER_RIFLE, itempool) + self.assertNotIn(item_names.NOVA_DOMINATION, itempool) + + def test_ghost_of_a_chance_generates_using_nco_nova(self) -> None: + world_options = { + **self.TERRAN_CAMPAIGNS, + 'mission_order': MissionOrder.option_custom, + 'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_nco, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 2, + 'mission_pool': [ + SC2Mission.LIBERATION_DAY.mission_name, # Starter mission + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + ] + } + } + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertGreater(len({item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_DOMINATION}.intersection(itempool)), 0) + + def test_ghost_of_a_chance_generates_with_nco(self) -> None: + world_options = { + **self.TERRAN_CAMPAIGNS, + 'mission_order': MissionOrder.option_custom, + 'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_auto, + 'custom_mission_order': { + 'test': { + 'type': 'column', + 'size': 3, + 'mission_pool': [ + SC2Mission.LIBERATION_DAY.mission_name, # Starter mission + SC2Mission.GHOST_OF_A_CHANCE.mission_name, + SC2Mission.FLASHPOINT.mission_name, # A NCO mission + ] + } + } + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertGreater(len({item_names.NOVA_C20A_CANISTER_RIFLE, item_names.NOVA_DOMINATION}.intersection(itempool)), 0) + + def test_exclude_overpowered_items(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.TERRAN.get_title()], + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + regen_biosteel_items = [item for item in itempool if item == item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL] + atx_laser_battery_items = [item for item in itempool if item == item_names.BATTLECRUISER_ATX_LASER_BATTERY] + + self.assertEqual(len(regen_biosteel_items), 2) # Progressive, only top level is excluded + self.assertEqual(len(atx_laser_battery_items), 0) # Non-progressive + + def test_exclude_overpowered_items_not_excluded(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_false, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.TERRAN.get_title()], + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + regen_biosteel_items = [item for item in itempool if item == item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL] + atx_laser_battery_items = [item for item in itempool if item == item_names.BATTLECRUISER_ATX_LASER_BATTERY] + + self.assertEqual(len(regen_biosteel_items), 3) + self.assertEqual(len(atx_laser_battery_items), 1) + + def test_exclude_overpowered_items_vanilla_only(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, + 'vanilla_items_only': VanillaItemsOnly.option_true, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.TERRAN.get_title()], + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + # Regen biosteel is in both of the lists + regen_biosteel_items = [item for item in itempool if item == item_names.PROGRESSIVE_REGENERATIVE_BIO_STEEL] + + self.assertEqual(len(regen_biosteel_items), 1) # One stack shall remain + + def test_exclude_locked_overpowered_items(self) -> None: + locked_item = item_names.BATTLECRUISER_ATX_LASER_BATTERY + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, + 'locked_items': [locked_item], + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.TERRAN.get_title()], + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + atx_laser_battery_items = [item for item in itempool if item == locked_item] + + self.assertEqual(len(atx_laser_battery_items), 1) # Locked, remains + + def test_unreleased_item_quantity(self) -> None: + """ + Checks if all unreleased items are marked properly not to generate + """ + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_false, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + items_to_check: List[str] = unreleased_items + for item in items_to_check: + self.assertNotIn(item, itempool) + + def test_unreleased_item_quantity_locked(self) -> None: + """ + Checks if all unreleased items are marked properly not to generate + Locking overrides this behavior - if they're locked, they must appear + """ + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_false, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'locked_items': {item_name: 0 for item_name in unreleased_items}, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + items_to_check: List[str] = unreleased_items + for item in items_to_check: + self.assertIn(item, itempool) + + def test_merc_excluded_excludes_merc_upgrades(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'excluded_items': [item_name for item_name in item_groups.terran_mercenaries], + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.TERRAN.get_title()], + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertNotIn(item_names.ROGUE_FORCES, itempool) + + def test_unexcluded_items_applies_over_op_items(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, + 'unexcluded_items': [item_names.SOA_TIME_STOP], + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + + self.assertNotIn( + item_groups.overpowered_items[0], + itempool, + f"OP item {item_groups.overpowered_items[0]} in the item pool when exclude_overpowered_items was true" + ) + self.assertIn( + item_names.SOA_TIME_STOP, + itempool, + f"{item_names.SOA_TIME_STOP} was not unexcluded by unexcluded_items when exclude_overpowered_items was true" + ) + + def test_exclude_overpowered_items_and_not_allow_unit_nerfs(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_true, + 'war_council_nerfs': options.WarCouncilNerfs.option_false, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'selected_races': [SC2Race.PROTOSS.get_title()], + } + + self.generate_world(world_options) + starting_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + + # A unit nerf happens due to excluding OP items + self.assertNotIn(item_names.MOTHERSHIP_INTEGRATED_POWER, starting_inventory) + + def test_terran_nobuild_sections_get_marine_medic_upgrades_with_units_excluded(self) -> None: + world_options = { + 'mission_order': MissionOrder.option_grid, + 'maximum_campaign_size': MaximumCampaignSize.range_end, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name + }, + 'excluded_items': [item_names.MARINE, item_names.MEDIC], + 'shuffle_no_build': False, + 'required_tactics': RequiredTactics.option_standard + } + mm_logic_upgrades = { + item_names.MARINE_COMBAT_SHIELD, item_names.MARINE_MAGRAIL_MUNITIONS, + item_names.MARINE_LASER_TARGETING_SYSTEM, + item_names.MARINE_PROGRESSIVE_STIMPACK, item_names.MEDIC_STABILIZER_MEDPACKS + } + + self.generate_world(world_options) + itempool = [item.name for item in self.multiworld.itempool] + missions = self.multiworld.worlds[self.player].custom_mission_order.get_used_missions() + + # These missions are rolled + self.assertIn(SC2Mission.THE_DIG, missions) + self.assertIn(SC2Mission.ENGINE_OF_DESTRUCTION, missions) + # This is not rolled + self.assertNotIn(SC2Mission.PIERCING_OF_THE_SHROUD, missions) + self.assertNotIn(SC2Mission.BELLY_OF_THE_BEAST, missions) + # These items are excluded and shouldn't appear + self.assertNotIn(item_names.MARINE, itempool) + self.assertNotIn(item_names.MEDIC, itempool) + # An upgrade is requested by logic for The Dig and Engine of Destruction + self.assertGreaterEqual(len(set(itempool).intersection(mm_logic_upgrades)), 1) diff --git a/worlds/sc2/test/test_item_filtering.py b/worlds/sc2/test/test_item_filtering.py new file mode 100644 index 0000000000..7f8251c52a --- /dev/null +++ b/worlds/sc2/test/test_item_filtering.py @@ -0,0 +1,91 @@ +""" +Unit tests for item filtering like pool_filter.py +""" + +from .test_base import Sc2SetupTestBase +from ..item import item_groups, item_names +from .. import options +from ..mission_tables import SC2Race + +class ItemFilterTests(Sc2SetupTestBase): + def test_excluding_all_barracks_units_excludes_infantry_upgrades(self) -> None: + world_options = { + 'excluded_items': { + item_groups.ItemGroupNames.BARRACKS_UNITS: 0 + }, + 'required_tactics': 'standard', + 'min_number_of_upgrades': 1, + **self.TERRAN_CAMPAIGNS, + 'selected_races': { + SC2Race.TERRAN.get_title() + }, + 'mission_order': 'grid', + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + races = {mission.race for mission in self.world.custom_mission_order.get_used_missions()} + self.assertIn(SC2Race.TERRAN, races) + self.assertNotIn(SC2Race.ZERG, races) + self.assertNotIn(SC2Race.PROTOSS, races) + itempool = [item.name for item in self.multiworld.itempool] + self.assertNotIn(item_names.MARINE, itempool) + self.assertNotIn(item_names.MARAUDER, itempool) + + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, itempool) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, itempool) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE, itempool) + + def test_excluding_one_item_of_multi_parent_doesnt_filter_children(self) -> None: + world_options = { + 'locked_items': { + item_names.SENTINEL: 1, + item_names.CENTURION: 1, + }, + 'excluded_items': { + item_names.ZEALOT: 1, + # Exclude more items to make space + item_names.WRATHWALKER: 1, + item_names.ENERGIZER: 1, + item_names.AVENGER: 1, + item_names.ARBITER: 1, + item_names.VOID_RAY: 1, + item_names.PULSAR: 1, + item_names.DESTROYER: 1, + item_names.DAWNBRINGER: 1, + }, + 'min_number_of_upgrades': 2, + 'required_tactics': 'standard', + **self.ALL_CAMPAIGNS, + 'selected_races': { + SC2Race.PROTOSS.get_title() + }, + 'mission_order': 'grid', + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + itempool = [item.name for item in self.multiworld.itempool] + self.assertIn(item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY, itempool) + self.assertIn(item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS, itempool) + + def test_excluding_all_items_in_multiparent_excludes_child_items(self) -> None: + world_options = { + 'excluded_items': { + item_names.ZEALOT: 1, + item_names.SENTINEL: 1, + item_names.CENTURION: 1, + }, + 'min_number_of_upgrades': 2, + 'required_tactics': 'standard', + **self.PROTOSS_CAMPAIGNS, + 'selected_races': { + SC2Race.PROTOSS.get_title() + }, + 'mission_order': 'grid', + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + itempool = [item.name for item in self.multiworld.itempool] + self.assertNotIn(item_names.ZEALOT_SENTINEL_CENTURION_SHIELD_CAPACITY, itempool) + self.assertNotIn(item_names.ZEALOT_SENTINEL_CENTURION_LEG_ENHANCEMENTS, itempool) + diff --git a/worlds/sc2/test/test_itemdescriptions.py b/worlds/sc2/test/test_itemdescriptions.py new file mode 100644 index 0000000000..a4fd6d5c28 --- /dev/null +++ b/worlds/sc2/test/test_itemdescriptions.py @@ -0,0 +1,18 @@ +import unittest + +from ..item import item_descriptions, item_tables + + +class TestItemDescriptions(unittest.TestCase): + def test_all_items_have_description(self) -> None: + for item_name in item_tables.item_table: + self.assertIn(item_name, item_descriptions.item_descriptions) + + def test_all_descriptions_refer_to_item_and_end_in_dot(self) -> None: + for item_name, item_desc in item_descriptions.item_descriptions.items(): + self.assertIn(item_name, item_tables.item_table) + self.assertEqual(item_desc.strip()[-1], '.', msg=f"{item_name}'s item description does not end in a '.': '{item_desc}'") + + def test_item_descriptions_follow_single_space_after_period_style(self) -> None: + for item_name, item_desc in item_descriptions.item_descriptions.items(): + self.assertNotIn('. ', item_desc, f"Double-space after period in description for {item_name}") diff --git a/worlds/sc2/test/test_itemgroups.py b/worlds/sc2/test/test_itemgroups.py new file mode 100644 index 0000000000..43848d20b5 --- /dev/null +++ b/worlds/sc2/test/test_itemgroups.py @@ -0,0 +1,32 @@ +""" +Unit tests for item_groups.py +""" + +import unittest +from ..item import item_groups, item_tables + + +class ItemGroupsUnitTests(unittest.TestCase): + def test_all_production_structure_groups_capture_all_units(self) -> None: + self.assertCountEqual( + item_groups.terran_units, + item_groups.barracks_units + item_groups.factory_units + item_groups.starport_units + item_groups.terran_mercenaries + ) + self.assertCountEqual( + item_groups.protoss_units, + item_groups.gateway_units + item_groups.robo_units + item_groups.stargate_units + ) + + def test_terran_original_progressive_group_fully_contained_in_wol_upgrades(self) -> None: + for item_name in item_groups.terran_original_progressive_upgrades: + self.assertIn(item_tables.item_table[item_name].type, ( + item_tables.TerranItemType.Progressive, item_tables.TerranItemType.Progressive_2), f"{item_name} is not progressive") + self.assertIn(item_name, item_groups.wol_upgrades) + + def test_all_items_in_stimpack_group_are_stimpacks(self) -> None: + for item_name in item_groups.terran_stimpacks: + self.assertIn("Stimpack", item_name) + + def test_all_item_group_names_have_a_group_defined(self) -> None: + for display_name in item_groups.ItemGroupNames.get_all_group_names(): + self.assertIn(display_name, item_groups.item_name_groups) diff --git a/worlds/sc2/test/test_items.py b/worlds/sc2/test/test_items.py new file mode 100644 index 0000000000..049810b956 --- /dev/null +++ b/worlds/sc2/test/test_items.py @@ -0,0 +1,170 @@ +import unittest +from typing import List, Set + +from ..item import item_tables + + +class TestItems(unittest.TestCase): + def test_grouped_upgrades_number(self) -> None: + """ + Tests if grouped upgrades have set number correctly + """ + bundled_items = item_tables.upgrade_bundles.keys() + bundled_item_data = [item_tables.get_full_item_list()[item_name] for item_name in bundled_items] + bundled_item_numbers = [item_data.number for item_data in bundled_item_data] + + check_numbers = [number == -1 for number in bundled_item_numbers] + + self.assertNotIn(False, check_numbers) + + def test_non_grouped_upgrades_number(self) -> None: + """ + Checks if non-grouped upgrades number is set correctly thus can be sent into the game. + """ + check_modulo = 4 + bundled_items = item_tables.upgrade_bundles.keys() + non_bundled_upgrades = [ + item_name for item_name in item_tables.get_full_item_list().keys() + if (item_name not in bundled_items + and item_tables.get_full_item_list()[item_name].type in item_tables.upgrade_item_types) + ] + non_bundled_upgrade_data = [item_tables.get_full_item_list()[item_name] for item_name in non_bundled_upgrades] + non_bundled_upgrade_numbers = [item_data.number for item_data in non_bundled_upgrade_data] + + check_numbers = [number % check_modulo == 0 for number in non_bundled_upgrade_numbers] + + self.assertNotIn(False, check_numbers) + + def test_bundles_contain_only_basic_elements(self) -> None: + """ + Checks if there are no bundles within bundles. + """ + bundled_items = item_tables.upgrade_bundles.keys() + bundle_elements: List[str] = [item_name for values in item_tables.upgrade_bundles.values() for item_name in values] + + for element in bundle_elements: + self.assertNotIn(element, bundled_items) + + def test_weapon_armor_level(self) -> None: + """ + Checks if Weapon/Armor upgrade level is correctly set to all Weapon/Armor upgrade items. + """ + weapon_armor_upgrades = [item for item in item_tables.get_full_item_list() if item_tables.get_item_table()[item].type in item_tables.upgrade_item_types] + + for weapon_armor_upgrade in weapon_armor_upgrades: + self.assertEqual(item_tables.get_full_item_list()[weapon_armor_upgrade].quantity, item_tables.WEAPON_ARMOR_UPGRADE_MAX_LEVEL) + + def test_item_ids_distinct(self) -> None: + """ + Verifies if there are no duplicates of item ID. + """ + item_ids: Set[int] = {item_tables.get_full_item_list()[item_name].code for item_name in item_tables.get_full_item_list()} + + self.assertEqual(len(item_ids), len(item_tables.get_full_item_list())) + + def test_number_distinct_in_item_type(self) -> None: + """ + Tests if each item is distinct for sending into the mod. + """ + item_types: List[item_tables.ItemTypeEnum] = [ + *[item.value for item in item_tables.TerranItemType], + *[item.value for item in item_tables.ZergItemType], + *[item.value for item in item_tables.ProtossItemType], + *[item.value for item in item_tables.FactionlessItemType] + ] + + self.assertGreater(len(item_types), 0) + + for item_type in item_types: + item_names: List[str] = [ + item_name for item_name in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item_name].number >= 0 # Negative numbers have special meaning + and item_tables.get_full_item_list()[item_name].type == item_type + ] + item_numbers: Set[int] = {item_tables.get_full_item_list()[item_name] for item_name in item_names} + + self.assertEqual(len(item_names), len(item_numbers)) + + def test_progressive_has_quantity(self) -> None: + """ + :return: + """ + progressive_groups: List[item_tables.ItemTypeEnum] = [ + item_tables.TerranItemType.Progressive, + item_tables.TerranItemType.Progressive_2, + item_tables.ProtossItemType.Progressive, + item_tables.ZergItemType.Progressive + ] + + quantities: List[int] = [ + item_tables.get_full_item_list()[item].quantity for item in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item].type in progressive_groups + ] + + self.assertNotIn(1, quantities) + + def test_non_progressive_quantity(self) -> None: + """ + Check if non-progressive items have quantity at most 1. + """ + non_progressive_single_entity_groups: List[item_tables.ItemTypeEnum] = [ + # Terran + item_tables.TerranItemType.Unit, + item_tables.TerranItemType.Unit_2, + item_tables.TerranItemType.Mercenary, + item_tables.TerranItemType.Armory_1, + item_tables.TerranItemType.Armory_2, + item_tables.TerranItemType.Armory_3, + item_tables.TerranItemType.Armory_4, + item_tables.TerranItemType.Armory_5, + item_tables.TerranItemType.Armory_6, + item_tables.TerranItemType.Armory_7, + item_tables.TerranItemType.Building, + item_tables.TerranItemType.Laboratory, + item_tables.TerranItemType.Nova_Gear, + # Zerg + item_tables.ZergItemType.Unit, + item_tables.ZergItemType.Mercenary, + item_tables.ZergItemType.Morph, + item_tables.ZergItemType.Strain, + item_tables.ZergItemType.Mutation_1, + item_tables.ZergItemType.Mutation_2, + item_tables.ZergItemType.Mutation_3, + item_tables.ZergItemType.Evolution_Pit, + item_tables.ZergItemType.Ability, + # Protoss + item_tables.ProtossItemType.Unit, + item_tables.ProtossItemType.Unit_2, + item_tables.ProtossItemType.Building, + item_tables.ProtossItemType.Forge_1, + item_tables.ProtossItemType.Forge_2, + item_tables.ProtossItemType.Forge_3, + item_tables.ProtossItemType.Forge_4, + item_tables.ProtossItemType.Solarite_Core, + item_tables.ProtossItemType.Spear_Of_Adun + ] + + quantities: List[int] = [ + item_tables.get_full_item_list()[item].quantity for item in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item].type in non_progressive_single_entity_groups + ] + + for quantity in quantities: + self.assertLessEqual(quantity, 1) + + def test_item_number_less_than_30(self) -> None: + """ + Checks if all item numbers are within bounds supported by game mod. + """ + not_checked_item_types: List[item_tables.ItemTypeEnum] = [ + item_tables.ZergItemType.Level + ] + items_to_check: List[str] = [ + item for item in item_tables.get_full_item_list() + if item_tables.get_full_item_list()[item].type not in not_checked_item_types + ] + + for item in items_to_check: + item_number = item_tables.get_full_item_list()[item].number + self.assertLess(item_number, 30) + diff --git a/worlds/sc2/test/test_location_groups.py b/worlds/sc2/test/test_location_groups.py new file mode 100644 index 0000000000..f429464f7c --- /dev/null +++ b/worlds/sc2/test/test_location_groups.py @@ -0,0 +1,37 @@ +import unittest +from .. import location_groups +from ..mission_tables import SC2Mission, MissionFlag + + +class TestLocationGroups(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + cls.location_groups = location_groups.get_location_groups() + + def test_location_categories_have_a_group(self) -> None: + self.assertIn('Victory', self.location_groups) + self.assertIn(f'{SC2Mission.LIBERATION_DAY.mission_name}: Victory', self.location_groups['Victory']) + self.assertIn(f'{SC2Mission.IN_UTTER_DARKNESS.mission_name}: Defeat', self.location_groups['Victory']) + self.assertIn('Vanilla', self.location_groups) + self.assertIn(f'{SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name}: Close Relic', self.location_groups['Vanilla']) + self.assertIn('Extra', self.location_groups) + self.assertIn(f'{SC2Mission.SMASH_AND_GRAB.mission_name}: First Forcefield Area Busted', self.location_groups['Extra']) + self.assertIn('Challenge', self.location_groups) + self.assertIn(f'{SC2Mission.ZERO_HOUR.mission_name}: First Hatchery', self.location_groups['Challenge']) + self.assertIn('Mastery', self.location_groups) + self.assertIn(f'{SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name}: Protoss Cleared', self.location_groups['Mastery']) + + def test_missions_have_a_group(self) -> None: + self.assertIn(SC2Mission.LIBERATION_DAY.mission_name, self.location_groups) + self.assertIn(f'{SC2Mission.LIBERATION_DAY.mission_name}: Victory', self.location_groups[SC2Mission.LIBERATION_DAY.mission_name]) + self.assertIn(f'{SC2Mission.LIBERATION_DAY.mission_name}: Special Delivery', self.location_groups[SC2Mission.LIBERATION_DAY.mission_name]) + + def test_race_swapped_locations_share_a_group(self) -> None: + self.assertIn(MissionFlag.HasRaceSwap, SC2Mission.ZERO_HOUR.flags) + ZERO_HOUR = 'Zero Hour' + self.assertNotEqual(ZERO_HOUR, SC2Mission.ZERO_HOUR.mission_name) + self.assertIn(ZERO_HOUR, self.location_groups) + self.assertIn(f'{ZERO_HOUR}: Victory', self.location_groups) + self.assertIn(f'{SC2Mission.ZERO_HOUR.mission_name}: Victory', self.location_groups[f'{ZERO_HOUR}: Victory']) + self.assertIn(f'{SC2Mission.ZERO_HOUR_P.mission_name}: Victory', self.location_groups[f'{ZERO_HOUR}: Victory']) + self.assertIn(f'{SC2Mission.ZERO_HOUR_Z.mission_name}: Victory', self.location_groups[f'{ZERO_HOUR}: Victory']) diff --git a/worlds/sc2/test/test_mission_groups.py b/worlds/sc2/test/test_mission_groups.py new file mode 100644 index 0000000000..6db7325da7 --- /dev/null +++ b/worlds/sc2/test/test_mission_groups.py @@ -0,0 +1,9 @@ +import unittest +from .. import mission_groups + + +class TestMissionGroups(unittest.TestCase): + def test_all_mission_groups_are_defined_and_nonempty(self) -> None: + for mission_group_name in mission_groups.MissionGroupNames.get_all_group_names(): + self.assertIn(mission_group_name, mission_groups.mission_groups) + self.assertTrue(mission_groups.mission_groups[mission_group_name]) diff --git a/worlds/sc2/test/test_options.py b/worlds/sc2/test/test_options.py index 30d21f3969..69b834da51 100644 --- a/worlds/sc2/test/test_options.py +++ b/worlds/sc2/test/test_options.py @@ -1,7 +1,19 @@ import unittest -from .test_base import Sc2TestBase -from .. import Options, MissionTables +from typing import Dict + +from .. import options +from ..item import item_parents + class TestOptions(unittest.TestCase): - def test_campaign_size_option_max_matches_number_of_missions(self): - self.assertEqual(Options.MaximumCampaignSize.range_end, len(MissionTables.SC2Mission)) + + def test_unit_max_upgrades_matching_items(self) -> None: + upgrade_group_to_count: Dict[str, int] = {} + for parent_id, child_list in item_parents.parent_id_to_children.items(): + main_parent = item_parents.parent_present[parent_id].constraint_group + if main_parent is None: + continue + upgrade_group_to_count.setdefault(main_parent, 0) + upgrade_group_to_count[main_parent] += len(child_list) + + self.assertEqual(options.MAX_UPGRADES_OPTION, max(upgrade_group_to_count.values())) diff --git a/worlds/sc2/test/test_regions.py b/worlds/sc2/test/test_regions.py new file mode 100644 index 0000000000..880a02f973 --- /dev/null +++ b/worlds/sc2/test/test_regions.py @@ -0,0 +1,40 @@ +import unittest +from .test_base import Sc2TestBase +from .. import mission_tables, SC2Campaign +from .. import options +from ..mission_order.layout_types import Grid + +class TestGridsizes(unittest.TestCase): + def test_grid_sizes_meet_specs(self): + self.assertTupleEqual((1, 2, 0), Grid.get_grid_dimensions(2)) + self.assertTupleEqual((1, 3, 0), Grid.get_grid_dimensions(3)) + self.assertTupleEqual((2, 2, 0), Grid.get_grid_dimensions(4)) + self.assertTupleEqual((2, 3, 1), Grid.get_grid_dimensions(5)) + self.assertTupleEqual((2, 4, 1), Grid.get_grid_dimensions(7)) + self.assertTupleEqual((2, 4, 0), Grid.get_grid_dimensions(8)) + self.assertTupleEqual((3, 3, 0), Grid.get_grid_dimensions(9)) + self.assertTupleEqual((2, 5, 0), Grid.get_grid_dimensions(10)) + self.assertTupleEqual((3, 4, 1), Grid.get_grid_dimensions(11)) + self.assertTupleEqual((3, 4, 0), Grid.get_grid_dimensions(12)) + self.assertTupleEqual((3, 5, 0), Grid.get_grid_dimensions(15)) + self.assertTupleEqual((4, 4, 0), Grid.get_grid_dimensions(16)) + self.assertTupleEqual((4, 6, 0), Grid.get_grid_dimensions(24)) + self.assertTupleEqual((5, 5, 0), Grid.get_grid_dimensions(25)) + self.assertTupleEqual((5, 6, 1), Grid.get_grid_dimensions(29)) + self.assertTupleEqual((5, 7, 2), Grid.get_grid_dimensions(33)) + + +class TestGridGeneration(Sc2TestBase): + options = { + "mission_order": options.MissionOrder.option_grid, + "excluded_missions": [mission_tables.SC2Mission.ZERO_HOUR.mission_name,], + "enabled_campaigns": { + SC2Campaign.WOL.campaign_name, + SC2Campaign.PROPHECY.campaign_name, + } + } + + def test_size_matches_exclusions(self): + self.assertNotIn(mission_tables.SC2Mission.ZERO_HOUR.mission_name, self.multiworld.regions) + # WoL has 29 missions. -1 for Zero Hour being excluded, +1 for the automatically-added menu location + self.assertEqual(len(self.multiworld.regions), 29) diff --git a/worlds/sc2/test/test_rules.py b/worlds/sc2/test/test_rules.py new file mode 100644 index 0000000000..abd005c171 --- /dev/null +++ b/worlds/sc2/test/test_rules.py @@ -0,0 +1,187 @@ +import itertools +from dataclasses import fields +from random import Random +import unittest +from typing import List, Set, Iterable + +from BaseClasses import ItemClassification, MultiWorld +import Options as CoreOptions +from .. import options, locations +from ..item import item_tables +from ..rules import SC2Logic +from ..mission_tables import SC2Race, MissionFlag, lookup_name_to_mission + + +class TestInventory: + """ + Runs checks against inventory with validation if all target items are progression and returns a random result + """ + def __init__(self) -> None: + self.random: Random = Random() + self.progression_types: Set[ItemClassification] = {ItemClassification.progression, ItemClassification.progression_skip_balancing} + + def is_item_progression(self, item: str) -> bool: + return item_tables.item_table[item].classification in self.progression_types + + def random_boolean(self): + return self.random.choice([True, False]) + + def has(self, item: str, player: int, count: int = 1): + if not self.is_item_progression(item): + raise AssertionError("Logic item {} is not a progression item".format(item)) + return self.random_boolean() + + def has_any(self, items: Set[str], player: int): + non_progression_items = [item for item in items if not self.is_item_progression(item)] + if len(non_progression_items) > 0: + raise AssertionError("Logic items {} are not progression items".format(non_progression_items)) + return self.random_boolean() + + def has_all(self, items: Set[str], player: int): + return self.has_any(items, player) + + def has_group(self, item_group: str, player: int, count: int = 1): + return self.random_boolean() + + def count_group(self, item_name_group: str, player: int) -> int: + return self.random.randrange(0, 20) + + def count(self, item: str, player: int) -> int: + if not self.is_item_progression(item): + raise AssertionError("Item {} is not a progression item".format(item)) + random_value: int = self.random.randrange(0, 5) + if random_value == 4: # 0-3 has a higher chance due to logic rules + return self.random.randrange(4, 100) + else: + return random_value + + def count_from_list(self, items: Iterable[str], player: int) -> int: + return sum(self.count(item_name, player) for item_name in items) + + def count_from_list_unique(self, items: Iterable[str], player: int) -> int: + return sum(self.count(item_name, player) for item_name in items) + + +class TestWorld: + """ + Mock world to simulate different player options for logic rules + """ + def __init__(self) -> None: + defaults = dict() + for field in fields(options.Starcraft2Options): + field_class = field.type + option_name = field.name + if isinstance(field_class, str): + if field_class in globals(): + field_class = globals()[field_class] + else: + field_class = CoreOptions.__dict__[field.type] + defaults[option_name] = field_class(options.get_option_value(None, option_name)) + self.options: options.Starcraft2Options = options.Starcraft2Options(**defaults) + + self.options.mission_order.value = options.MissionOrder.option_vanilla_shuffled + + self.player = 1 + self.multiworld = MultiWorld(1) + + +class TestRules(unittest.TestCase): + def setUp(self) -> None: + self.required_tactics_values: List[int] = [ + options.RequiredTactics.option_standard, options.RequiredTactics.option_advanced + ] + self.all_in_map_values: List[int] = [ + options.AllInMap.option_ground, options.AllInMap.option_air + ] + self.take_over_ai_allies_values: List[int] = [ + options.TakeOverAIAllies.option_true, options.TakeOverAIAllies.option_false + ] + self.kerrigan_presence_values: List[int] = [ + options.KerriganPresence.option_vanilla, options.KerriganPresence.option_not_present + ] + self.NUM_TEST_RUNS = 100 + + @staticmethod + def _get_world( + required_tactics: int = options.RequiredTactics.default, + all_in_map: int = options.AllInMap.default, + take_over_ai_allies: int = options.TakeOverAIAllies.default, + kerrigan_presence: int = options.KerriganPresence.default, + # setting this to everywhere catches one extra logic check for Amon's Fall without missing any + spear_of_adun_passive_presence: int = options.SpearOfAdunPassiveAbilityPresence.option_everywhere, + ) -> TestWorld: + test_world = TestWorld() + test_world.options.required_tactics.value = required_tactics + test_world.options.all_in_map.value = all_in_map + test_world.options.take_over_ai_allies.value = take_over_ai_allies + test_world.options.kerrigan_presence.value = kerrigan_presence + test_world.options.spear_of_adun_passive_ability_presence.value = spear_of_adun_passive_presence + test_world.options.enabled_campaigns.value = set(options.EnabledCampaigns.valid_keys) + test_world.logic = SC2Logic(test_world) # type: ignore + return test_world + + def test_items_in_rules_are_progression(self): + test_inventory = TestInventory() + for option in self.required_tactics_values: + test_world = self._get_world(required_tactics=option) + location_data = locations.get_locations(test_world) + for location in location_data: + for _ in range(self.NUM_TEST_RUNS): + location.rule(test_inventory) + + def test_items_in_all_in_are_progression(self): + test_inventory = TestInventory() + for test_options in itertools.product(self.required_tactics_values, self.all_in_map_values): + test_world = self._get_world(required_tactics=test_options[0], all_in_map=test_options[1]) + for location in locations.get_locations(test_world): + if 'All-In' not in location.region: + continue + for _ in range(self.NUM_TEST_RUNS): + location.rule(test_inventory) + + def test_items_in_kerriganless_missions_are_progression(self): + test_inventory = TestInventory() + for test_options in itertools.product(self.required_tactics_values, self.kerrigan_presence_values): + test_world = self._get_world(required_tactics=test_options[0], kerrigan_presence=test_options[1]) + for location in locations.get_locations(test_world): + mission = lookup_name_to_mission[location.region] + if MissionFlag.Kerrigan not in mission.flags: + continue + for _ in range(self.NUM_TEST_RUNS): + location.rule(test_inventory) + + def test_items_in_ai_takeover_missions_are_progression(self): + test_inventory = TestInventory() + for test_options in itertools.product(self.required_tactics_values, self.take_over_ai_allies_values): + test_world = self._get_world(required_tactics=test_options[0], take_over_ai_allies=test_options[1]) + for location in locations.get_locations(test_world): + mission = lookup_name_to_mission[location.region] + if MissionFlag.AiAlly not in mission.flags: + continue + for _ in range(self.NUM_TEST_RUNS): + location.rule(test_inventory) + + def test_items_in_hard_rules_are_progression(self): + test_inventory = TestInventory() + test_world = TestWorld() + test_world.options.required_tactics.value = options.RequiredTactics.option_any_units + test_world.logic = SC2Logic(test_world) + location_data = locations.get_locations(test_world) + for location in location_data: + if location.hard_rule is not None: + for _ in range(10): + location.hard_rule(test_inventory) + + def test_items_in_any_units_rules_are_progression(self): + test_inventory = TestInventory() + test_world = TestWorld() + test_world.options.required_tactics.value = options.RequiredTactics.option_any_units + logic = SC2Logic(test_world) + test_world.logic = logic + for race in (SC2Race.TERRAN, SC2Race.PROTOSS, SC2Race.ZERG): + for target in range(1, 5): + rule = logic.has_race_units(target, race) + for _ in range(10): + rule(test_inventory) + + diff --git a/worlds/sc2/test/test_usecases.py b/worlds/sc2/test/test_usecases.py new file mode 100644 index 0000000000..bf79dbea01 --- /dev/null +++ b/worlds/sc2/test/test_usecases.py @@ -0,0 +1,605 @@ +""" +Unit tests for yaml usecases we want to support +""" + +from .test_base import Sc2SetupTestBase +from .. import get_all_missions, mission_tables, options +from ..item import item_groups, item_tables, item_names +from ..mission_tables import SC2Race, SC2Mission, SC2Campaign, MissionFlag +from ..options import ( + EnabledCampaigns, MasteryLocations, MissionOrder, EnableRaceSwapVariants, ShuffleCampaigns, + ShuffleNoBuild, StarterUnit, RequiredTactics, KerriganPresence, KerriganLevelItemDistribution, GrantStoryTech, + GrantStoryLevels, BasebustLocations, ChallengeLocations, DifficultyCurve, EnableMorphling, ExcludeOverpoweredItems, + ExcludeVeryHardMissions, ExtraLocations, GenericUpgradeItems, GenericUpgradeResearch, GenericUpgradeResearchSpeedup, + KerriganPrimalStatus, KeyMode, MissionOrderScouting, EnableMissionRaceBalancing, + NovaGhostOfAChanceVariant, PreventativeLocations, SpeedrunLocations, TakeOverAIAllies, VanillaItemsOnly +) + + +class TestSupportedUseCases(Sc2SetupTestBase): + def test_vanilla_all_campaigns_generates(self) -> None: + world_options = { + 'mission_order': options.MissionOrder.option_vanilla, + 'enabled_campaigns': EnabledCampaigns.valid_keys, + } + + self.generate_world(world_options) + world_regions = [region.name for region in self.multiworld.regions if region.name != "Menu"] + + self.assertEqual(len(world_regions), 83, "Unexpected number of missions for vanilla mission order") + + def test_terran_with_nco_units_only_generates(self): + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + 'excluded_items': { + item_groups.ItemGroupNames.TERRAN_UNITS: 0, + }, + 'unexcluded_items': { + item_groups.ItemGroupNames.NCO_UNITS: 0, + }, + 'max_number_of_upgrades': 2, + } + + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_item_names = [item.name for item in self.multiworld.itempool] + + self.assertIn(item_names.MARINE, world_item_names) + self.assertIn(item_names.RAVEN, world_item_names) + self.assertIn(item_names.LIBERATOR, world_item_names) + self.assertIn(item_names.BATTLECRUISER, world_item_names) + self.assertNotIn(item_names.DIAMONDBACK, world_item_names) + self.assertNotIn(item_names.DIAMONDBACK_BURST_CAPACITORS, world_item_names) + self.assertNotIn(item_names.VIKING, world_item_names) + + def test_nco_with_nobuilds_excluded_generates(self): + world_options = { + 'enabled_campaigns': { + SC2Campaign.NCO.campaign_name + }, + 'shuffle_no_build': options.ShuffleNoBuild.option_false, + 'mission_order': options.MissionOrder.option_mini_campaign, + } + + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + missions = get_all_missions(self.world.custom_mission_order) + + self.assertNotIn(mission_tables.SC2Mission.THE_ESCAPE, missions) + self.assertNotIn(mission_tables.SC2Mission.IN_THE_ENEMY_S_SHADOW, missions) + for mission in missions: + self.assertEqual(mission_tables.SC2Campaign.NCO, mission.campaign) + + def test_terran_with_nco_upgrades_units_only_generates(self): + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + 'mission_order': options.MissionOrder.option_vanilla_shuffled, + 'excluded_items': { + item_groups.ItemGroupNames.TERRAN_ITEMS: 0, + }, + 'unexcluded_items': { + item_groups.ItemGroupNames.NCO_MAX_PROGRESSIVE_ITEMS: 0, + item_groups.ItemGroupNames.NCO_MIN_PROGRESSIVE_ITEMS: 1, + }, + 'excluded_missions': [ + # These missions have trouble fulfilling Terran Power Rating under these terms + SC2Mission.SUPERNOVA.mission_name, + SC2Mission.WELCOME_TO_THE_JUNGLE.mission_name, + SC2Mission.TROUBLE_IN_PARADISE.mission_name, + ], + 'mastery_locations': MasteryLocations.option_disabled, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool + self.multiworld.precollected_items[1]] + self.assertTrue(world_item_names) + missions = get_all_missions(self.world.custom_mission_order) + + for mission in missions: + self.assertIn(mission_tables.MissionFlag.Terran, mission.flags) + self.assertIn(item_names.MARINE, world_item_names) + self.assertIn(item_names.MARAUDER, world_item_names) + self.assertIn(item_names.BUNKER, world_item_names) + self.assertIn(item_names.BANSHEE, world_item_names) + self.assertIn(item_names.BATTLECRUISER_ATX_LASER_BATTERY, world_item_names) + self.assertIn(item_names.NOVA_C20A_CANISTER_RIFLE, world_item_names) + self.assertGreaterEqual(world_item_names.count(item_names.BANSHEE_PROGRESSIVE_CROSS_SPECTRUM_DAMPENERS), 2) + self.assertGreaterEqual(world_item_names.count(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON), 3) + self.assertNotIn(item_names.MEDIC, world_item_names) + self.assertNotIn(item_names.PSI_DISRUPTER, world_item_names) + self.assertNotIn(item_names.BATTLECRUISER_PROGRESSIVE_MISSILE_PODS, world_item_names) + self.assertNotIn(item_names.HELLION_INFERNAL_PLATING, world_item_names) + self.assertNotIn(item_names.CELLULAR_REACTOR, world_item_names) + self.assertNotIn(item_names.TECH_REACTOR, world_item_names) + + def test_nco_and_2_wol_missions_only_can_generate_with_vanilla_items_only(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + SC2Campaign.NCO.campaign_name + }, + 'excluded_missions': [ + mission.mission_name for mission in mission_tables.SC2Mission + if mission.campaign == mission_tables.SC2Campaign.WOL + and mission.mission_name not in (mission_tables.SC2Mission.LIBERATION_DAY.mission_name, mission_tables.SC2Mission.THE_OUTLAWS.mission_name) + ], + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'mastery_locations': options.MasteryLocations.option_disabled, + 'vanilla_items_only': True, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + + self.assertTrue(item_names) + self.assertNotIn(item_names.LIBERATOR, world_item_names) + self.assertNotIn(item_names.MARAUDER_PROGRESSIVE_STIMPACK, world_item_names) + self.assertNotIn(item_names.HELLION_HELLBAT, world_item_names) + self.assertNotIn(item_names.BATTLECRUISER_CLOAK, world_item_names) + + def test_free_protoss_only_generates(self) -> None: + world_options = { + 'enabled_campaigns': { + SC2Campaign.PROPHECY.campaign_name, + SC2Campaign.PROLOGUE.campaign_name + }, + # todo(mm): Currently, these settings don't generate on grid because there are not enough EASY missions + 'mission_order': options.MissionOrder.option_vanilla_shuffled, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'accessibility': 'locations', + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + self.assertTrue(world_item_names) + missions = get_all_missions(self.world.custom_mission_order) + + self.assertEqual(len(missions), 7, "Wrong number of missions in free protoss seed") + for mission in missions: + self.assertIn(mission.campaign, (mission_tables.SC2Campaign.PROLOGUE, mission_tables.SC2Campaign.PROPHECY)) + for item_name in world_item_names: + self.assertIn(item_tables.item_table[item_name].race, (mission_tables.SC2Race.ANY, mission_tables.SC2Race.PROTOSS)) + + def test_resource_filler_items_may_be_put_in_start_inventory(self) -> None: + NUM_RESOURCE_ITEMS = 10 + world_options = { + 'start_inventory': { + item_names.STARTING_MINERALS: NUM_RESOURCE_ITEMS, + item_names.STARTING_VESPENE: NUM_RESOURCE_ITEMS, + item_names.STARTING_SUPPLY: NUM_RESOURCE_ITEMS, + }, + } + + self.generate_world(world_options) + start_item_names = [item.name for item in self.multiworld.precollected_items[self.player]] + + self.assertEqual(start_item_names.count(item_names.STARTING_MINERALS), NUM_RESOURCE_ITEMS, "Wrong number of starting minerals in starting inventory") + self.assertEqual(start_item_names.count(item_names.STARTING_VESPENE), NUM_RESOURCE_ITEMS, "Wrong number of starting vespene in starting inventory") + self.assertEqual(start_item_names.count(item_names.STARTING_SUPPLY), NUM_RESOURCE_ITEMS, "Wrong number of starting supply in starting inventory") + + def test_excluding_protoss_excludes_campaigns_and_items(self) -> None: + world_options = { + 'selected_races': { + SC2Race.TERRAN.get_title(), + SC2Race.ZERG.get_title(), + }, + 'enabled_campaigns': options.EnabledCampaigns.valid_keys, + 'mission_order': options.MissionOrder.option_grid, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + + for item_name in world_item_names: + self.assertNotEqual(item_tables.item_table[item_name].race, mission_tables.SC2Race.PROTOSS, f"{item_name} is a PROTOSS item!") + for region in world_regions: + self.assertNotIn(mission_tables.lookup_name_to_mission[region].campaign, + (mission_tables.SC2Campaign.LOTV, mission_tables.SC2Campaign.PROPHECY, mission_tables.SC2Campaign.PROLOGUE), + f"{region} is a PROTOSS mission!") + + def test_excluding_terran_excludes_campaigns_and_items(self) -> None: + world_options = { + 'selected_races': { + SC2Race.ZERG.get_title(), + SC2Race.PROTOSS.get_title(), + }, + 'enabled_campaigns': EnabledCampaigns.valid_keys, + 'mission_order': options.MissionOrder.option_grid, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + + for item_name in world_item_names: + self.assertNotEqual(item_tables.item_table[item_name].race, mission_tables.SC2Race.TERRAN, + f"{item_name} is a TERRAN item!") + for region in world_regions: + self.assertNotIn(mission_tables.lookup_name_to_mission[region].campaign, + (mission_tables.SC2Campaign.WOL, mission_tables.SC2Campaign.NCO), + f"{region} is a TERRAN mission!") + + def test_excluding_zerg_excludes_campaigns_and_items(self) -> None: + world_options = { + 'selected_races': { + SC2Race.TERRAN.get_title(), + SC2Race.PROTOSS.get_title(), + }, + 'enabled_campaigns': EnabledCampaigns.valid_keys, + 'mission_order': options.MissionOrder.option_grid, + 'excluded_missions': [ + SC2Mission.THE_INFINITE_CYCLE.mission_name + ] + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + + for item_name in world_item_names: + self.assertNotEqual(item_tables.item_table[item_name].race, mission_tables.SC2Race.ZERG, + f"{item_name} is a ZERG item!") + # have to manually exclude the only non-zerg HotS mission... + for region in filter(lambda region: region != "With Friends Like These", world_regions): + self.assertNotIn(mission_tables.lookup_name_to_mission[region].campaign, + ([mission_tables.SC2Campaign.HOTS]), + f"{region} is a ZERG mission!") + + def test_excluding_faction_on_vanilla_order_excludes_epilogue(self) -> None: + world_options = { + 'selected_races': { + SC2Race.TERRAN.get_title(), + SC2Race.PROTOSS.get_title(), + }, + 'enabled_campaigns': EnabledCampaigns.valid_keys, + 'mission_order': options.MissionOrder.option_vanilla, + } + + self.generate_world(world_options) + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + + for region in world_regions: + self.assertNotIn(mission_tables.lookup_name_to_mission[region].campaign, + ([mission_tables.SC2Campaign.EPILOGUE]), + f"{region} is an epilogue mission!") + + def test_race_swap_pick_one_has_correct_length_and_includes_swaps(self) -> None: + world_options = { + 'selected_races': options.SelectedRaces.valid_keys, + 'enable_race_swap': options.EnableRaceSwapVariants.option_pick_one, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'mission_order': options.MissionOrder.option_grid, + 'excluded_missions': [mission_tables.SC2Mission.ZERO_HOUR.mission_name], + } + + self.generate_world(world_options) + world_regions = [region.name for region in self.multiworld.regions] + world_regions.remove('Menu') + NUM_WOL_MISSIONS = len([mission for mission in SC2Mission if mission.campaign == SC2Campaign.WOL and MissionFlag.RaceSwap not in mission.flags]) + races = set(mission_tables.lookup_name_to_mission[mission].race for mission in world_regions) + + self.assertEqual(len(world_regions), NUM_WOL_MISSIONS) + self.assertTrue(SC2Race.ZERG in races or SC2Race.PROTOSS in races) + + def test_start_inventory_upgrade_level_includes_only_correct_bundle(self) -> None: + world_options = { + 'start_inventory': { + item_groups.ItemGroupNames.TERRAN_GENERIC_UPGRADES: 1, + }, + 'locked_items': { + # One unit of each class to guarantee upgrades are available + item_names.MARINE: 1, + item_names.VULTURE: 1, + item_names.BANSHEE: 1, + }, + 'generic_upgrade_items': options.GenericUpgradeItems.option_bundle_unit_class, + 'selected_races': { + SC2Race.TERRAN.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_disabled, + 'enabled_campaigns': { + SC2Campaign.WOL.campaign_name, + }, + 'mission_order': options.MissionOrder.option_grid, + } + self.generate_world(world_options) + self.assertTrue(self.multiworld.itempool) + world_item_names = [item.name for item in self.multiworld.itempool] + start_inventory = [item.name for item in self.multiworld.precollected_items[self.player]] + + # Start inventory + self.assertIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE, start_inventory) + self.assertIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE, start_inventory) + self.assertIn(item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR, start_inventory) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, start_inventory) + + # Additional items in pool -- standard tactics will require additional levels + self.assertIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_UPGRADE, world_item_names) + self.assertIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_UPGRADE, world_item_names) + self.assertIn(item_names.PROGRESSIVE_TERRAN_SHIP_UPGRADE, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_WEAPON, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_INFANTRY_ARMOR, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_WEAPON, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_VEHICLE_ARMOR, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_SHIP_WEAPON, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_SHIP_ARMOR, world_item_names) + self.assertNotIn(item_names.PROGRESSIVE_TERRAN_ARMOR_UPGRADE, world_item_names) + + def test_kerrigan_max_active_abilities(self): + target_number: int = 8 + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.ZERG.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'kerrigan_max_active_abilities': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + kerrigan_actives = [item_name for item_name in world_item_names if item_name in item_groups.kerrigan_active_abilities] + + self.assertLessEqual(len(kerrigan_actives), target_number) + + def test_kerrigan_max_passive_abilities(self): + target_number: int = 3 + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.ZERG.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'kerrigan_max_passive_abilities': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + kerrigan_passives = [item_name for item_name in world_item_names if item_name in item_groups.kerrigan_passives] + + self.assertLessEqual(len(kerrigan_passives), target_number) + + def test_spear_of_adun_max_active_abilities(self): + target_number: int = 8 + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.PROTOSS.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'spear_of_adun_max_active_abilities': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + spear_of_adun_actives = [item_name for item_name in world_item_names if item_name in item_tables.spear_of_adun_calldowns] + + self.assertLessEqual(len(spear_of_adun_actives), target_number) + + + def test_spear_of_adun_max_autocasts(self): + target_number: int = 2 + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.PROTOSS.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'spear_of_adun_max_passive_abilities': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + spear_of_adun_autocasts = [item_name for item_name in world_item_names if item_name in item_tables.spear_of_adun_castable_passives] + + self.assertLessEqual(len(spear_of_adun_autocasts), target_number) + + + def test_nova_max_weapons(self): + target_number: int = 3 + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.TERRAN.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'nova_max_weapons': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + nova_weapons = [item_name for item_name in world_item_names if item_name in item_groups.nova_weapons] + + self.assertLessEqual(len(nova_weapons), target_number) + + + def test_nova_max_gadgets(self): + target_number: int = 3 + world_options = { + **self.ALL_CAMPAIGNS, + 'mission_order': options.MissionOrder.option_grid, + 'maximum_campaign_size': options.MaximumCampaignSize.range_end, + 'selected_races': { + SC2Race.TERRAN.get_title(), + }, + 'enable_race_swap': options.EnableRaceSwapVariants.option_shuffle_all, + 'nova_max_gadgets': target_number, + } + + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + nova_gadgets = [item_name for item_name in world_item_names if item_name in item_groups.nova_gadgets] + + self.assertLessEqual(len(nova_gadgets), target_number) + + def test_mercs_only(self) -> None: + world_options = { + **self.ALL_CAMPAIGNS, + 'selected_races': [ + SC2Race.TERRAN.get_title(), + SC2Race.ZERG.get_title(), + ], + 'required_tactics': options.RequiredTactics.option_any_units, + 'excluded_items': { + item_groups.ItemGroupNames.TERRAN_UNITS: 0, + item_groups.ItemGroupNames.ZERG_UNITS: 0, + }, + 'unexcluded_items': { + item_groups.ItemGroupNames.TERRAN_MERCENARIES: 0, + item_groups.ItemGroupNames.ZERG_MERCENARIES: 0, + }, + 'start_inventory': { + item_names.PROGRESSIVE_FAST_DELIVERY: 1, + item_names.ROGUE_FORCES: 1, + item_names.UNRESTRICTED_MUTATION: 1, + item_names.EVOLUTIONARY_LEAP: 1, + }, + 'mission_order': options.MissionOrder.option_grid, + 'excluded_missions': [ + SC2Mission.ENEMY_WITHIN.mission_name, # Requires a unit for Niadra to build + ], + } + self.generate_world(world_options) + world_item_names = [item.name for item in self.multiworld.itempool] + terran_nonmerc_units = tuple( + item_name + for item_name in world_item_names + if item_name in item_groups.terran_units and item_name not in item_groups.terran_mercenaries + ) + zerg_nonmerc_units = tuple( + item_name + for item_name in world_item_names + if item_name in item_groups.zerg_units and item_name not in item_groups.zerg_mercenaries + ) + + self.assertTupleEqual(terran_nonmerc_units, ()) + self.assertTupleEqual(zerg_nonmerc_units, ()) + + def test_zerg_hots_no_terran_items(self) -> None: + # The actual situation the bug got caught + world_options = { + 'basebust_locations': BasebustLocations.option_enabled, + 'challenge_locations': ChallengeLocations.option_enabled, + 'difficulty_curve': DifficultyCurve.option_standard, + 'enable_morphling': EnableMorphling.option_false, + 'enable_race_swap': EnableRaceSwapVariants.option_disabled, + 'enabled_campaigns': [SC2Campaign.HOTS.campaign_name], + 'ensure_generic_items': 25, + 'exclude_overpowered_items': ExcludeOverpoweredItems.option_false, + 'exclude_very_hard_missions': ExcludeVeryHardMissions.option_default, + 'excluded_missions': [ + SC2Mission.SUPREME.mission_name + ], + 'extra_locations': ExtraLocations.option_enabled, + 'generic_upgrade_items': GenericUpgradeItems.option_individual_items, + 'generic_upgrade_missions': 0, + 'generic_upgrade_research': GenericUpgradeResearch.option_auto_in_no_build, + 'generic_upgrade_research_speedup': GenericUpgradeResearchSpeedup.option_false, + 'grant_story_levels': GrantStoryLevels.option_disabled, + 'grant_story_tech': GrantStoryTech.option_no_grant, + 'kerrigan_level_item_distribution': KerriganLevelItemDistribution.option_size_14, + 'kerrigan_level_item_sum': 86, + 'kerrigan_levels_per_mission_completed': 0, + 'kerrigan_levels_per_mission_completed_cap': -1, + 'kerrigan_max_active_abilities': 12, + 'kerrigan_max_passive_abilities': 5, + 'kerrigan_presence': KerriganPresence.option_vanilla, + 'kerrigan_primal_status': KerriganPrimalStatus.option_vanilla, + 'kerrigan_total_level_cap': -1, + 'key_mode': KeyMode.option_progressive_questlines, + 'mastery_locations': MasteryLocations.option_disabled, + 'max_number_of_upgrades': -1, + 'max_upgrade_level': 4, + 'maximum_campaign_size': 40, + 'min_number_of_upgrades': 2, + 'mission_order': MissionOrder.option_mini_campaign, + 'mission_order_scouting': MissionOrderScouting.option_none, + 'mission_race_balancing': EnableMissionRaceBalancing.option_semi_balanced, + 'nova_ghost_of_a_chance_variant': NovaGhostOfAChanceVariant.option_wol, + 'preventative_locations': PreventativeLocations.option_enabled, + 'required_tactics': RequiredTactics.option_standard, + 'shuffle_campaigns': ShuffleCampaigns.option_true, + 'shuffle_no_build': ShuffleNoBuild.option_true, + 'speedrun_locations': SpeedrunLocations.option_disabled, + 'start_primary_abilities': 0, + 'starter_unit': StarterUnit.option_balanced, + 'starting_supply_per_item': 2, + 'take_over_ai_allies': TakeOverAIAllies.option_false, + 'vanilla_items_only': VanillaItemsOnly.option_false, + 'victory_cache': 0, + } + self.generate_world(world_options) + + world_item_names = [item.name for item in self.multiworld.itempool] + + self.assertNotIn(item_names.COMMAND_CENTER_SCANNER_SWEEP, world_item_names) + self.assertNotIn(item_names.COMMAND_CENTER_EXTRA_SUPPLIES, world_item_names) + self.assertNotIn(item_names.ULTRA_CAPACITORS, world_item_names) + self.assertNotIn(item_names.ORBITAL_DEPOTS, world_item_names) + self.assertNotIn(item_names.DOMINION_TROOPER, world_item_names) + + def test_all_kerrigan_missions_are_nobuild_and_grant_story_tech_is_on(self) -> None: + # The actual situation the bug got caught + world_options = { + 'mission_order': MissionOrder.option_vanilla_shuffled, + 'selected_races': [ + SC2Race.TERRAN.get_title(), + SC2Race.ZERG.get_title(), + SC2Race.PROTOSS.get_title(), + ], + 'enabled_campaigns': [ + SC2Campaign.WOL.campaign_name, + SC2Campaign.PROPHECY.campaign_name, + SC2Campaign.HOTS.campaign_name, + SC2Campaign.PROLOGUE.campaign_name, + SC2Campaign.LOTV.campaign_name, + SC2Campaign.EPILOGUE.campaign_name, + SC2Campaign.NCO.campaign_name, + ], + 'enable_race_swap': EnableRaceSwapVariants.option_shuffle_all_non_vanilla, # Causes no build Kerrigan missions to be present, only nobuilds remain + 'shuffle_campaigns': ShuffleCampaigns.option_true, + 'shuffle_no_build': ShuffleNoBuild.option_true, + 'starter_unit': StarterUnit.option_balanced, + 'required_tactics': RequiredTactics.option_standard, + 'kerrigan_presence': KerriganPresence.option_vanilla, + 'kerrigan_levels_per_mission_completed': 0, + 'kerrigan_levels_per_mission_completed_cap': -1, + 'kerrigan_level_item_sum': 87, + 'kerrigan_level_item_distribution': KerriganLevelItemDistribution.option_size_7, + 'kerrigan_total_level_cap': -1, + 'start_primary_abilities': 0, + 'grant_story_tech': GrantStoryTech.option_grant, + 'grant_story_levels': GrantStoryLevels.option_additive, + } + self.generate_world(world_options) + # Just check that the world itself generates under those rules and no exception is thrown diff --git a/worlds/sc2/transfer_data.py b/worlds/sc2/transfer_data.py new file mode 100644 index 0000000000..0718c35004 --- /dev/null +++ b/worlds/sc2/transfer_data.py @@ -0,0 +1,38 @@ +from typing import Dict, List + +""" +This file is for handling SC2 data read via the bot +""" + +normalized_unit_types: Dict[str, str] = { + # Thor morphs + "AP_ThorAP": "AP_Thor", + "AP_MercThorAP": "AP_MercThor", + "AP_ThorMengskSieged": "AP_ThorMengsk", + "AP_ThorMengskAP": "AP_ThorMengsk", + # Siege Tank morphs + "AP_SiegeTankSiegedTransportable": "AP_SiegeTank", + "AP_SiegeTankMengskSiegedTransportable": "AP_SiegeTankMengsk", + "AP_SiegeBreakerSiegedTransportable": "AP_SiegeBreaker", + "AP_InfestedSiegeBreakerSiegedTransportable": "AP_InfestedSiegeBreaker", + "AP_StukovInfestedSiegeTank": "AP_StukovInfestedSiegeTankUprooted", + # Cargo size upgrades + "AP_FirebatOptimizedLogistics": "AP_Firebat", + "AP_DevilDogOptimizedLogistics": "AP_DevilDog", + "AP_GhostResourceEfficiency": "AP_Ghost", + "AP_GhostMengskResourceEfficiency": "AP_GhostMengsk", + "AP_SpectreResourceEfficiency": "AP_Spectre", + "AP_UltraliskResourceEfficiency": "AP_Ultralisk", + "AP_MercUltraliskResourceEfficiency": "AP_MercUltralisk", + "AP_ReaperResourceEfficiency": "AP_Reaper", + "AP_MercReaperResourceEfficiency": "AP_MercReaper", +} + +worker_units: List[str] = [ + "AP_SCV", + "AP_MULE", # Mules can't currently build (or be traded due to timed life), this is future proofing just in case + "AP_Drone", + "AP_SISCV", # Infested SCV + "AP_Probe", + "AP_ElderProbe", +] diff --git a/worlds/shapez/__init__.py b/worlds/shapez/__init__.py new file mode 100644 index 0000000000..5557e2a96a --- /dev/null +++ b/worlds/shapez/__init__.py @@ -0,0 +1,417 @@ +import math +from typing import Mapping, Any + +from Options import OptionError +from .data.strings import OTHER, ITEMS, CATEGORY, LOCATIONS, SLOTDATA, GOALS, OPTIONS +from .items import item_descriptions, item_table, ShapezItem, \ + buildings_routing, buildings_processing, buildings_other, \ + buildings_top_row, buildings_wires, gameplay_unlocks, upgrades, \ + big_upgrades, filler, trap, bundles, belt_and_extractor, standard_traps, random_draining_trap, split_draining_traps, \ + whacky_upgrade_traps +from .locations import ShapezLocation, addlevels, addupgrades, addachievements, location_description, \ + addshapesanity, addshapesanity_ut, shapesanity_simple, init_shapesanity_pool, achievement_locations, \ + level_locations, upgrade_locations, shapesanity_locations, categories +from .presets import options_presets +from .options import ShapezOptions +from worlds.AutoWorld import World, WebWorld +from BaseClasses import Item, Tutorial, LocationProgressType, MultiWorld +from .regions import create_shapez_regions, has_x_belt_multiplier +from ..generic.Rules import add_rule + + +class ShapezWeb(WebWorld): + options_presets = options_presets + rich_text_options_doc = True + theme = "stone" + game_info_languages = ['en', 'de'] + setup_en = Tutorial( + "Multiworld Setup Guide", + "A guide to playing shapez with Archipelago:", + "English", + "setup_en.md", + "setup/en", + ["BlastSlimey"] + ) + setup_de = Tutorial( + setup_en.tutorial_name, + setup_en.description, + "Deutsch", + "setup_de.md", + "setup/de", + ["BlastSlimey"] + ) + datapackage_settings_en = Tutorial( + "Changing datapackage settings", + "3000 locations are too many or not enough? Here's how you can change that:", + "English", + "datapackage_settings_en.md", + "datapackage_settings/en", + ["BlastSlimey"] + ) + datapackage_settings_de = Tutorial( + datapackage_settings_en.tutorial_name, + datapackage_settings_en.description, + "Deutsch", + "datapackage_settings_de.md", + "datapackage_settings/de", + ["BlastSlimey"] + ) + tutorials = [setup_en, setup_de, datapackage_settings_en, datapackage_settings_de] + item_descriptions = item_descriptions + location_descriptions = location_description + + +class ShapezWorld(World): + """ + shapez is an automation game about cutting, rotating, stacking, and painting shapes, that you extract from randomly + generated patches on an infinite canvas, without the need to manage your infinite resources or to pay for building + your factories. + """ + game = OTHER.game_name + options_dataclass = ShapezOptions + options: ShapezOptions + topology_present = True + web = ShapezWeb() + base_id = 20010707 + item_name_to_id = {name: id for id, name in enumerate(item_table.keys(), base_id)} + location_name_to_id = {name: id for id, name in enumerate(level_locations + upgrade_locations + + achievement_locations + shapesanity_locations, base_id)} + item_name_groups = { + "Main Buildings": {ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker}, + "Processing Buildings": {*buildings_processing}, + "Goal Buildings": {ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.rotator_ccw, ITEMS.color_mixer, + ITEMS.stacker, ITEMS.cutter_quad, ITEMS.painter_double, ITEMS.painter_quad, ITEMS.wires, + ITEMS.switch, ITEMS.const_signal}, + "Most Useful Buildings": {ITEMS.balancer, ITEMS.tunnel, ITEMS.tunnel_tier_ii, ITEMS.comp_merger, + ITEMS.comp_splitter, ITEMS.trash, ITEMS.extractor_chain}, + "Most Important Buildings": {*belt_and_extractor}, + "Top Row Buildings": {*buildings_top_row}, + "Wires Layer Buildings": {*buildings_wires}, + "Gameplay Mechanics": {ITEMS.blueprints, ITEMS.wires}, + "Upgrades": {*{ITEMS.upgrade(size, cat) + for size in {CATEGORY.big, CATEGORY.small, CATEGORY.gigantic, CATEGORY.rising} + for cat in {CATEGORY.belt, CATEGORY.miner, CATEGORY.processors, CATEGORY.painting}}, + *{ITEMS.trap_upgrade(cat, size) + for cat in {CATEGORY.belt, CATEGORY.miner, CATEGORY.processors, CATEGORY.painting} + for size in {"", CATEGORY.demonic}}, + *{ITEMS.upgrade(size, CATEGORY.random) + for size in {CATEGORY.big, CATEGORY.small}}}, + **{f"{cat} Upgrades": {*{ITEMS.upgrade(size, cat) + for size in {CATEGORY.big, CATEGORY.small, CATEGORY.gigantic, CATEGORY.rising}}, + *{ITEMS.trap_upgrade(cat, size) + for size in {"", CATEGORY.demonic}}} + for cat in {CATEGORY.belt, CATEGORY.miner, CATEGORY.processors, CATEGORY.painting}}, + "Bundles": {*bundles}, + "Traps": {*standard_traps, *random_draining_trap, *split_draining_traps, *whacky_upgrade_traps}, + } + location_name_groups = { + "Levels": {*level_locations}, + "Upgrades": {*upgrade_locations}, + "Achievements": {*achievement_locations}, + "Shapesanity": {*shapesanity_locations}, + **{f"{cat} Upgrades": {loc for loc in upgrade_locations if loc.startswith(cat)} for cat in categories}, + "Only Belt and Extractor": {LOCATIONS.level(1), LOCATIONS.level(1, 1), + LOCATIONS.my_eyes, LOCATIONS.its_a_mess, LOCATIONS.getting_into_it, + LOCATIONS.perfectionist, LOCATIONS.oops, LOCATIONS.i_need_trains, LOCATIONS.gps, + LOCATIONS.a_long_time, LOCATIONS.addicted, + LOCATIONS.shapesanity(1), LOCATIONS.shapesanity(2), LOCATIONS.shapesanity(3)}, + } + + def __init__(self, multiworld: MultiWorld, player: int): + super().__init__(multiworld, player) + + # Defining instance attributes for each shapez world + # These are set to default values that should fail unit tests if not replaced with correct values + self.location_count: int = 0 + self.level_logic: list[str] = [] + self.upgrade_logic: list[str] = [] + self.level_logic_type: str = "" + self.upgrade_logic_type: str = "" + self.random_logic_phase_length: list[int] = [] + self.category_random_logic_amounts: dict[str, int] = {} + self.maxlevel: int = 0 + self.finaltier: int = 0 + self.included_locations: dict[str, tuple[str, LocationProgressType]] = {} + self.client_seed: int = 0 + self.shapesanity_names: list[str] = [] + self.upgrade_traps_allowed: bool = False + + # Universal Tracker support + self.ut_active: bool = False + self.passthrough: dict[str, Any] = {} + self.location_id_to_alias: dict[int, str] = {} + + @classmethod + def stage_generate_early(cls, multiworld: MultiWorld) -> None: + # Import the 75800 entries long shapesanity pool only once and only if it's actually needed + if len(shapesanity_simple) == 0: + init_shapesanity_pool() + + def generate_early(self) -> None: + # Calculate all the important values used for generating a shapez world, with some of them being random + self.upgrade_traps_allowed: bool = (self.options.include_whacky_upgrades and + (not self.options.goal == GOALS.efficiency_iii) and + self.options.throughput_levels_ratio == 0) + + # Load values from UT if this is a regenerated world + if hasattr(self.multiworld, "re_gen_passthrough"): + if OTHER.game_name in self.multiworld.re_gen_passthrough: + self.ut_active = True + self.passthrough = self.multiworld.re_gen_passthrough[OTHER.game_name] + self.maxlevel = self.passthrough[SLOTDATA.maxlevel] + self.finaltier = self.passthrough[SLOTDATA.finaltier] + self.client_seed = self.passthrough[SLOTDATA.seed] + self.level_logic = [self.passthrough[SLOTDATA.level_building(i+1)] for i in range(5)] + self.upgrade_logic = [self.passthrough[SLOTDATA.upgrade_building(i+1)] for i in range(5)] + self.level_logic_type = self.passthrough[SLOTDATA.rand_level_logic] + self.upgrade_logic_type = self.passthrough[SLOTDATA.rand_upgrade_logic] + self.random_logic_phase_length = [self.passthrough[SLOTDATA.phase_length(i)] for i in range(5)] + self.category_random_logic_amounts = {cat: self.passthrough[SLOTDATA.cat_buildings_amount(cat)] + for cat in [CATEGORY.belt_low, CATEGORY.miner_low, + CATEGORY.processors_low, CATEGORY.painting_low]} + # Forces balancers, tunnel, and trash to not appear in regen to make UT more accurate + self.options.early_balancer_tunnel_and_trash.value = 0 + return + + # "MAM" goal is supposed to be longer than vanilla, but to not have more options than necessary, + # both goal amounts for "MAM" and "Even fasterer" are set in a single option. + if self.options.goal == GOALS.mam and self.options.goal_amount < 27: + raise OptionError(self.player_name + + ": When setting goal to 1 ('mam'), goal_amount must be at least 27 and not " + + str(self.options.goal_amount.value)) + + # If lock_belt_and_extractor is true, the only sphere 1 locations will be achievements + if self.options.lock_belt_and_extractor and not self.options.include_achievements: + raise OptionError(self.player_name + ": Achievements must be included when belt and extractor are locked") + + # Determines maxlevel and finaltier, which are needed for location and item generation + if self.options.goal == GOALS.vanilla: + self.maxlevel = 25 + self.finaltier = 8 + elif self.options.goal == GOALS.mam: + self.maxlevel = self.options.goal_amount - 1 + self.finaltier = 8 + elif self.options.goal == GOALS.even_fasterer: + self.maxlevel = 26 + self.finaltier = self.options.goal_amount.value + else: # goal == efficiency_iii + self.maxlevel = 26 + self.finaltier = 8 + + # Setting the seed for the game before any other randomization call is done + self.client_seed = self.random.randint(0, 100000) + + # Determines the order of buildings for levels logic + if self.options.randomize_level_requirements: + self.level_logic_type = self.options.randomize_level_logic.current_key + if self.level_logic_type.endswith(OPTIONS.logic_shuffled) or self.level_logic_type == OPTIONS.logic_dopamine: + vanilla_list = [ITEMS.cutter, ITEMS.painter, ITEMS.stacker] + while len(vanilla_list) > 0: + index = self.random.randint(0, len(vanilla_list)-1) + next_building = vanilla_list.pop(index) + if next_building == ITEMS.cutter: + vanilla_list.append(ITEMS.rotator) + if next_building == ITEMS.painter: + vanilla_list.append(ITEMS.color_mixer) + self.level_logic.append(next_building) + else: + self.level_logic = [ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker] + else: + self.level_logic_type = OPTIONS.logic_vanilla + self.level_logic = [ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker] + + # Determines the order of buildings for upgrades logic + if self.options.randomize_upgrade_requirements: + self.upgrade_logic_type = self.options.randomize_upgrade_logic.current_key + if self.upgrade_logic_type == OPTIONS.logic_hardcore: + self.upgrade_logic = [ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker] + elif self.upgrade_logic_type == OPTIONS.logic_category: + self.upgrade_logic = [ITEMS.cutter, ITEMS.rotator, ITEMS.stacker, ITEMS.painter, ITEMS.color_mixer] + else: + vanilla_list = [ITEMS.cutter, ITEMS.painter, ITEMS.stacker] + while len(vanilla_list) > 0: + index = self.random.randint(0, len(vanilla_list)-1) + next_building = vanilla_list.pop(index) + if next_building == ITEMS.cutter: + vanilla_list.append(ITEMS.rotator) + if next_building == ITEMS.painter: + vanilla_list.append(ITEMS.color_mixer) + self.upgrade_logic.append(next_building) + else: + self.upgrade_logic_type = OPTIONS.logic_vanilla_like + self.upgrade_logic = [ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker] + + # Determine lenghts of phases in level logic type "random" + self.random_logic_phase_length = [1, 1, 1, 1, 1] + if self.level_logic_type.startswith(OPTIONS.logic_random_steps): + remaininglength = self.maxlevel - 1 + for phase in range(0, 5): + if self.random.random() < 0.1: # Make sure that longer phases are less frequent + self.random_logic_phase_length[phase] = self.random.randint(0, remaininglength) + else: + self.random_logic_phase_length[phase] = self.random.randint(0, remaininglength // (6 - phase)) + remaininglength -= self.random_logic_phase_length[phase] + + # Determine amount of needed buildings for each category in upgrade logic type "category_random" + self.category_random_logic_amounts = {CATEGORY.belt_low: 0, CATEGORY.miner_low: 1, + CATEGORY.processors_low: 2, CATEGORY.painting_low: 3} + if self.upgrade_logic_type == OPTIONS.logic_category_random: + cats = [CATEGORY.belt_low, CATEGORY.miner_low, CATEGORY.processors_low, CATEGORY.painting_low] + nextcat = self.random.choice(cats) + self.category_random_logic_amounts[nextcat] = 0 + cats.remove(nextcat) + for cat in cats: + self.category_random_logic_amounts[cat] = self.random.randint(0, 5) + + def create_item(self, name: str) -> Item: + return ShapezItem(name, item_table[name](self.options), self.item_name_to_id[name], self.player) + + def get_filler_item_name(self) -> str: + return filler(self.random.random(), bool(self.options.include_whacky_upgrades)) + + def append_shapesanity(self, name: str) -> None: + """This method is given as a parameter when creating the locations for shapesanity.""" + self.shapesanity_names.append(name) + + def add_alias(self, location_name: str, alias: str): + """This method is given as a parameter when locations with helpful aliases for UT are created.""" + if self.ut_active: + self.location_id_to_alias[self.location_name_to_id[location_name]] = alias + + def create_regions(self) -> None: + # Create list of all included level and upgrade locations based on player options + # This already includes the region to be placed in and the LocationProgressType + self.included_locations = {**addlevels(self.maxlevel, self.level_logic_type, + self.random_logic_phase_length), + **addupgrades(self.finaltier, self.upgrade_logic_type, + self.category_random_logic_amounts)} + + # Add shapesanity to included location and creates the corresponding list based on player options + if self.ut_active: + self.shapesanity_names = self.passthrough[SLOTDATA.shapesanity] + self.included_locations.update(addshapesanity_ut(self.shapesanity_names, self.add_alias)) + else: + self.included_locations.update(addshapesanity(self.options.shapesanity_amount.value, self.random, + self.append_shapesanity, self.add_alias)) + + # Add achievements to included locations based on player options + if self.options.include_achievements: + self.included_locations.update(addachievements( + bool(self.options.exclude_softlock_achievements), bool(self.options.exclude_long_playtime_achievements), + bool(self.options.exclude_progression_unreasonable), self.maxlevel, self.upgrade_logic_type, + self.category_random_logic_amounts, self.options.goal.current_key, self.included_locations, + self.add_alias, self.upgrade_traps_allowed)) + + # Save the final amount of to-be-filled locations + self.location_count = len(self.included_locations) + + # Create regions and entrances based on included locations and player options + self.multiworld.regions.extend(create_shapez_regions(self.player, self.multiworld, + bool(self.options.allow_floating_layers.value), + self.included_locations, self.location_name_to_id, + self.level_logic, self.upgrade_logic, + self.options.early_balancer_tunnel_and_trash.current_key, + self.options.goal.current_key)) + + def create_items(self) -> None: + # Include guaranteed items (game mechanic unlocks and 7x4 big upgrades) + included_items: list[Item] = ([self.create_item(name) for name in buildings_processing.keys()] + + [self.create_item(name) for name in buildings_routing.keys()] + + [self.create_item(name) for name in buildings_other.keys()] + + [self.create_item(name) for name in buildings_top_row.keys()] + + [self.create_item(name) for name in buildings_wires.keys()] + + [self.create_item(name) for name in gameplay_unlocks.keys()] + + [self.create_item(name) for name in big_upgrades for _ in range(7)]) + + if not self.options.lock_belt_and_extractor: + for name in belt_and_extractor: + self.multiworld.push_precollected(self.create_item(name)) + else: # This also requires self.options.include_achievements to be true + included_items.extend([self.create_item(name) for name in belt_and_extractor.keys()]) + + # Give a detailed error message if there are already more items than available locations. + # At the moment, this won't happen, but it's better for debugging in case a future update breaks things. + if len(included_items) > self.location_count: + raise RuntimeError(self.player_name + ": There are more guaranteed items than available locations") + + # Get value from traps probability option and convert to float + traps_probability = self.options.traps_percentage/100 + split_draining = bool(self.options.split_inventory_draining_trap) + # Fill remaining locations with fillers + for x in range(self.location_count - len(included_items)): + if self.random.random() < traps_probability: + # Fill with trap + included_items.append(self.create_item(trap(self.random.random(), split_draining, + self.upgrade_traps_allowed))) + else: + # Fil with random filler item + included_items.append(self.create_item(self.get_filler_item_name())) + + # Add correct number of items to itempool + self.multiworld.itempool += included_items + + # Add balancer, tunnel, and trash to early items if player options say so + if self.options.early_balancer_tunnel_and_trash == OPTIONS.sphere_1: + self.multiworld.early_items[self.player][ITEMS.balancer] = 1 + self.multiworld.early_items[self.player][ITEMS.tunnel] = 1 + self.multiworld.early_items[self.player][ITEMS.trash] = 1 + + def set_rules(self) -> None: + # Levels might need more belt speed if they require throughput per second. As the randomization of what levels + # need throughput happens in the client mod, this logic needs to be applied to all levels. This is applied to + # every individual level instead of regions, because they would need a much more complex calculation to prevent + # softlocks. + + def f(x: int, name: str): + # These calculations are taken from the client mod + if x < 26: + throughput = math.ceil((2.999+x*0.333)*self.options.required_shapes_multiplier/10) + else: + throughput = min((4+(x-26)*0.25)*self.options.required_shapes_multiplier/10, 200) + if throughput/32 >= 1: + add_rule(self.get_location(name), + lambda state: has_x_belt_multiplier(state, self.player, throughput/32)) + + if not self.options.throughput_levels_ratio == 0: + f(0, LOCATIONS.level(1, 1)) + f(19, LOCATIONS.level(20, 1)) + f(19, LOCATIONS.level(20, 2)) + for _x in range(self.maxlevel): + f(_x, LOCATIONS.level(_x+1)) + if self.options.goal.current_key in [GOALS.vanilla, GOALS.mam]: + f(self.maxlevel, LOCATIONS.goal) + + def fill_slot_data(self) -> Mapping[str, Any]: + # Buildings logic; all buildings as individual parameters + level_logic_data = {SLOTDATA.level_building(x+1): self.level_logic[x] for x in range(5)} + upgrade_logic_data = {SLOTDATA.upgrade_building(x+1): self.upgrade_logic[x] for x in range(5)} + # Randomized values for certain logic types + logic_type_random_data = {SLOTDATA.phase_length(x): self.random_logic_phase_length[x] for x in range(0, 5)} + logic_type_cat_random_data = {SLOTDATA.cat_buildings_amount(cat): self.category_random_logic_amounts[cat] + for cat in [CATEGORY.belt_low, CATEGORY.miner_low, + CATEGORY.processors_low, CATEGORY.painting_low]} + + # Options that are relevant to the mod + option_data = { + SLOTDATA.goal: self.options.goal.current_key, + SLOTDATA.maxlevel: self.maxlevel, + SLOTDATA.finaltier: self.finaltier, + SLOTDATA.req_shapes_mult: self.options.required_shapes_multiplier.value, + SLOTDATA.allow_float_layers: bool(self.options.allow_floating_layers), + SLOTDATA.rand_level_req: bool(self.options.randomize_level_requirements), + SLOTDATA.rand_upgrade_req: bool(self.options.randomize_upgrade_requirements), + SLOTDATA.rand_level_logic: self.level_logic_type, + SLOTDATA.rand_upgrade_logic: self.upgrade_logic_type, + SLOTDATA.throughput_levels_ratio: self.options.throughput_levels_ratio.value, + SLOTDATA.comp_growth_gradient: self.options.complexity_growth_gradient.value, + SLOTDATA.same_late: bool(self.options.same_late_upgrade_requirements), + SLOTDATA.toolbar_shuffling: bool(self.options.toolbar_shuffling), + } + + return {**level_logic_data, **upgrade_logic_data, **option_data, **logic_type_random_data, + **logic_type_cat_random_data, SLOTDATA.seed: self.client_seed, + SLOTDATA.shapesanity: self.shapesanity_names} + + def interpret_slot_data(self, slot_data: dict[str, Any]) -> dict[str, Any]: + """Helper function for Universal Tracker""" + return slot_data diff --git a/worlds/shapez/common/__init__.py b/worlds/shapez/common/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/shapez/common/options.py b/worlds/shapez/common/options.py new file mode 100644 index 0000000000..8a55448cd4 --- /dev/null +++ b/worlds/shapez/common/options.py @@ -0,0 +1,190 @@ +import random +from typing import cast, Any + +from Options import FreeText, NumericOption + + +class FloatRangeText(FreeText, NumericOption): + """FreeText option optimized for entering float numbers. + Supports everything that Range supports. + range_start and range_end have to be floats, while default has to be a string.""" + + default = "0.0" + value: float + range_start: float = 0.0 + range_end: float = 1.0 + + def __init__(self, value: str): + super().__init__(value) + value = value.lower() + if value.startswith("random"): + self.value = self.weighted_range(value) + elif value == "default" and hasattr(self, "default"): + self.value = float(self.default) + elif value == "high": + self.value = self.range_end + elif value == "low": + self.value = self.range_start + elif self.range_start == 0.0 \ + and hasattr(self, "default") \ + and self.default != "0.0" \ + and value in ("true", "false"): + # these are the conditions where "true" and "false" make sense + if value == "true": + self.value = float(self.default) + else: # "false" + self.value = 0.0 + else: + try: + self.value = float(value) + except ValueError: + raise Exception(f"Invalid value for option {self.__class__.__name__}: {value}") + except OverflowError: + raise Exception(f"Out of range floating value for option {self.__class__.__name__}: {value}") + if self.value < self.range_start: + raise Exception(f"{value} is lower than minimum {self.range_start} for option {self.__class__.__name__}") + if self.value > self.range_end: + raise Exception(f"{value} is higher than maximum {self.range_end} for option {self.__class__.__name__}") + + @classmethod + def from_text(cls, text: str) -> Any: + return cls(text) + + @classmethod + def weighted_range(cls, text: str) -> float: + if text == "random-low": + return random.triangular(cls.range_start, cls.range_end, cls.range_start) + elif text == "random-high": + return random.triangular(cls.range_start, cls.range_end, cls.range_end) + elif text == "random-middle": + return random.triangular(cls.range_start, cls.range_end) + elif text.startswith("random-range-"): + return cls.custom_range(text) + elif text == "random": + return random.uniform(cls.range_start, cls.range_end) + else: + raise Exception(f"random text \"{text}\" did not resolve to a recognized pattern. " + f"Acceptable values are: random, random-high, random-middle, random-low, " + f"random-range-low--, random-range-middle--, " + f"random-range-high--, or random-range--.") + + @classmethod + def custom_range(cls, text: str) -> float: + textsplit = text.split("-") + try: + random_range = [float(textsplit[len(textsplit) - 2]), float(textsplit[len(textsplit) - 1])] + except ValueError: + raise ValueError(f"Invalid random range {text} for option {cls.__name__}") + except OverflowError: + raise Exception(f"Out of range floating value for option {cls.__name__}: {text}") + random_range.sort() + if random_range[0] < cls.range_start or random_range[1] > cls.range_end: + raise Exception( + f"{random_range[0]}-{random_range[1]} is outside allowed range " + f"{cls.range_start}-{cls.range_end} for option {cls.__name__}") + if text.startswith("random-range-low"): + return random.triangular(random_range[0], random_range[1], random_range[0]) + elif text.startswith("random-range-middle"): + return random.triangular(random_range[0], random_range[1]) + elif text.startswith("random-range-high"): + return random.triangular(random_range[0], random_range[1], random_range[1]) + else: + return random.uniform(random_range[0], random_range[1]) + + @property + def current_key(self) -> str: + return str(self.value) + + @classmethod + def get_option_name(cls, value: float) -> str: + return str(value) + + def __eq__(self, other: Any): + if isinstance(other, NumericOption): + return self.value == other.value + else: + return cast(bool, self.value == other) + + def __lt__(self, other: int | float | NumericOption) -> bool: + if isinstance(other, NumericOption): + return self.value < other.value + else: + return self.value < other + + def __le__(self, other: int | float | NumericOption) -> bool: + if isinstance(other, NumericOption): + return self.value <= other.value + else: + return self.value <= other + + def __gt__(self, other: int | float | NumericOption) -> bool: + if isinstance(other, NumericOption): + return self.value > other.value + else: + return self.value > other + + def __ge__(self, other: int | float | NumericOption) -> bool: + if isinstance(other, NumericOption): + return self.value >= other.value + else: + return self.value >= other + + def __int__(self) -> int: + return int(self.value) + + def __and__(self, other: Any) -> int: + raise TypeError("& operator not supported for float values") + + def __floordiv__(self, other: Any) -> int: + return int(self.value // float(other)) + + def __invert__(self) -> int: + raise TypeError("~ operator not supported for float values") + + def __lshift__(self, other: Any) -> int: + raise TypeError("<< operator not supported for float values") + + def __mod__(self, other: Any) -> float: + return self.value % float(other) + + def __neg__(self) -> float: + return -self.value + + def __or__(self, other: Any) -> int: + raise TypeError("| operator not supported for float values") + + def __pos__(self) -> float: + return +self.value + + def __rand__(self, other: Any) -> int: + raise TypeError("& operator not supported for float values") + + def __rfloordiv__(self, other: Any) -> int: + return int(float(other) // self.value) + + def __rlshift__(self, other: Any) -> int: + raise TypeError("<< operator not supported for float values") + + def __rmod__(self, other: Any) -> float: + return float(other) % self.value + + def __ror__(self, other: Any) -> int: + raise TypeError("| operator not supported for float values") + + def __round__(self, ndigits: int | None = None) -> float: + return round(self.value, ndigits) + + def __rpow__(self, base: Any) -> Any: + return base ** self.value + + def __rrshift__(self, other: Any) -> int: + raise TypeError(">> operator not supported for float values") + + def __rshift__(self, other: Any) -> int: + raise TypeError(">> operator not supported for float values") + + def __rxor__(self, other: Any) -> int: + raise TypeError("^ operator not supported for float values") + + def __xor__(self, other: Any) -> int: + raise TypeError("^ operator not supported for float values") diff --git a/worlds/shapez/data/__init__.py b/worlds/shapez/data/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/shapez/data/generate.py b/worlds/shapez/data/generate.py new file mode 100644 index 0000000000..86b660ef5b --- /dev/null +++ b/worlds/shapez/data/generate.py @@ -0,0 +1,133 @@ +import itertools +import time + +from worlds.shapez.data.strings import SHAPESANITY, REGIONS + +shapesanity_simple: dict[str, str] = {} +shapesanity_1_4: dict[str, str] = {} +shapesanity_two_sided: dict[str, str] = {} +shapesanity_three_parts: dict[str, str] = {} +shapesanity_four_parts: dict[str, str] = {} +subshape_names = [SHAPESANITY.circle, SHAPESANITY.square, SHAPESANITY.star, SHAPESANITY.windmill] +color_names = [SHAPESANITY.red, SHAPESANITY.blue, SHAPESANITY.green, SHAPESANITY.yellow, SHAPESANITY.purple, + SHAPESANITY.cyan, SHAPESANITY.white, SHAPESANITY.uncolored] +short_subshapes = ["C", "R", "S", "W"] +short_colors = ["b", "c", "g", "p", "r", "u", "w", "y"] + + +def color_to_needed_building(color_list: list[str]) -> str: + for next_color in color_list: + if next_color in [SHAPESANITY.yellow, SHAPESANITY.purple, SHAPESANITY.cyan, SHAPESANITY.white, + "y", "p", "c", "w"]: + return REGIONS.mixed + for next_color in color_list: + if next_color not in [SHAPESANITY.uncolored, "u"]: + return REGIONS.painted + return REGIONS.uncol + + +def generate_shapesanity_pool() -> None: + # same shapes && same color + for color in color_names: + color_region = color_to_needed_building([color]) + shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.circle)] = REGIONS.sanity(REGIONS.full, color_region) + shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.square)] = REGIONS.sanity(REGIONS.full, color_region) + shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.star)] = REGIONS.sanity(REGIONS.full, color_region) + shapesanity_simple[SHAPESANITY.full(color, SHAPESANITY.windmill)] = REGIONS.sanity(REGIONS.east_wind, color_region) + for shape in subshape_names: + for color in color_names: + color_region = color_to_needed_building([color]) + shapesanity_simple[SHAPESANITY.half(color, shape)] = REGIONS.sanity(REGIONS.half, color_region) + shapesanity_simple[SHAPESANITY.piece(color, shape)] = REGIONS.sanity(REGIONS.piece, color_region) + shapesanity_simple[SHAPESANITY.cutout(color, shape)] = REGIONS.sanity(REGIONS.stitched, color_region) + shapesanity_simple[SHAPESANITY.cornered(color, shape)] = REGIONS.sanity(REGIONS.stitched, color_region) + + # one color && 4 shapes (including empty) + for first_color, second_color, third_color, fourth_color in itertools.combinations(short_colors+["-"], 4): + colors = [first_color, second_color, third_color, fourth_color] + color_region = color_to_needed_building(colors) + shape_regions = [REGIONS.stitched, REGIONS.stitched] if fourth_color == "-" else [REGIONS.col_full, REGIONS.col_east_wind] + color_code = ''.join(colors) + shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.circle)] = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.square)] = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.star)] = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_1_4[SHAPESANITY.full(color_code, SHAPESANITY.windmill)] = REGIONS.sanity(shape_regions[1], color_region) + + # one shape && 4 colors (including empty) + for first_shape, second_shape, third_shape, fourth_shape in itertools.combinations(short_subshapes+["-"], 4): + for color in color_names: + shapesanity_1_4[SHAPESANITY.full(color, ''.join([first_shape, second_shape, third_shape, fourth_shape]))] \ + = REGIONS.sanity(REGIONS.stitched, color_to_needed_building([color])) + + combos = [shape + color for shape in short_subshapes for color in short_colors] + for first_combo, second_combo in itertools.permutations(combos, 2): + # 2-sided shapes + color_region = color_to_needed_building([first_combo[1], second_combo[1]]) + ordered_combo = " ".join(sorted([first_combo, second_combo])) + shape_regions = (([REGIONS.east_wind, REGIONS.east_wind, REGIONS.col_half] + if first_combo[0] == "W" else [REGIONS.col_full, REGIONS.col_full, REGIONS.col_half]) + if first_combo[0] == second_combo[0] else [REGIONS.stitched, REGIONS.half_half, REGIONS.stitched]) + shapesanity_two_sided[SHAPESANITY.three_one(first_combo, second_combo)] = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_two_sided[SHAPESANITY.halfhalf(ordered_combo)] = REGIONS.sanity(shape_regions[1], color_region) + shapesanity_two_sided[SHAPESANITY.checkered(ordered_combo)] = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_two_sided[SHAPESANITY.singles(ordered_combo, SHAPESANITY.adjacent_pos)] = REGIONS.sanity(shape_regions[2], color_region) + shapesanity_two_sided[SHAPESANITY.singles(ordered_combo, SHAPESANITY.cornered_pos)] = REGIONS.sanity(REGIONS.stitched, color_region) + shapesanity_two_sided[SHAPESANITY.two_one(first_combo, second_combo, SHAPESANITY.adjacent_pos)] = REGIONS.sanity(REGIONS.stitched, color_region) + shapesanity_two_sided[SHAPESANITY.two_one(first_combo, second_combo, SHAPESANITY.cornered_pos)] = REGIONS.sanity(REGIONS.stitched, color_region) + for third_combo in combos: + if third_combo in [first_combo, second_combo]: + continue + # 3-part shapes + colors = [first_combo[1], second_combo[1], third_combo[1]] + color_region = color_to_needed_building(colors) + ordered_two = " ".join(sorted([second_combo, third_combo])) + if not (first_combo[1] == second_combo[1] == third_combo[1] or + first_combo[0] == second_combo[0] == third_combo[0]): + ordered_all = " ".join(sorted([first_combo, second_combo, third_combo])) + shapesanity_three_parts[SHAPESANITY.singles(ordered_all)] = REGIONS.sanity(REGIONS.stitched, color_region) + shape_regions = ([REGIONS.stitched, REGIONS.stitched] if not second_combo[0] == third_combo[0] + else (([REGIONS.east_wind, REGIONS.east_wind] if first_combo[0] == "W" + else [REGIONS.col_full, REGIONS.col_full]) + if first_combo[0] == second_combo[0] else [REGIONS.col_half_half, REGIONS.stitched])) + shapesanity_three_parts[SHAPESANITY.two_one_one(first_combo, ordered_two, SHAPESANITY.adjacent_pos)] \ + = REGIONS.sanity(shape_regions[0], color_region) + shapesanity_three_parts[SHAPESANITY.two_one_one(first_combo, ordered_two, SHAPESANITY.cornered_pos)] \ + = REGIONS.sanity(shape_regions[1], color_region) + for fourth_combo in combos: + if fourth_combo in [first_combo, second_combo, third_combo]: + continue + if (first_combo[1] == second_combo[1] == third_combo[1] == fourth_combo[1] or + first_combo[0] == second_combo[0] == third_combo[0] == fourth_combo[0]): + continue + colors = [first_combo[1], second_combo[1], third_combo[1], fourth_combo[1]] + color_region = color_to_needed_building(colors) + ordered_all = " ".join(sorted([first_combo, second_combo, third_combo, fourth_combo])) + if ((first_combo[0] == second_combo[0] and third_combo[0] == fourth_combo[0]) or + (first_combo[0] == third_combo[0] and second_combo[0] == fourth_combo[0]) or + (first_combo[0] == fourth_combo[0] and third_combo[0] == second_combo[0])): + shapesanity_four_parts[SHAPESANITY.singles(ordered_all)] = REGIONS.sanity(REGIONS.col_half_half, color_region) + else: + shapesanity_four_parts[SHAPESANITY.singles(ordered_all)] = REGIONS.sanity(REGIONS.stitched, color_region) + + +if __name__ == "__main__": + start = time.time() + generate_shapesanity_pool() + print(time.time() - start) + with open("shapesanity_pool.py", "w") as outfile: + outfile.writelines(["shapesanity_simple = {\n"] + + [f" \"{name}\": \"{shapesanity_simple[name]}\",\n" + for name in shapesanity_simple] + + ["}\n\nshapesanity_1_4 = {\n"] + + [f" \"{name}\": \"{shapesanity_1_4[name]}\",\n" + for name in shapesanity_1_4] + + ["}\n\nshapesanity_two_sided = {\n"] + + [f" \"{name}\": \"{shapesanity_two_sided[name]}\",\n" + for name in shapesanity_two_sided] + + ["}\n\nshapesanity_three_parts = {\n"] + + [f" \"{name}\": \"{shapesanity_three_parts[name]}\",\n" + for name in shapesanity_three_parts] + + ["}\n\nshapesanity_four_parts = {\n"] + + [f" \"{name}\": \"{shapesanity_four_parts[name]}\",\n" + for name in shapesanity_four_parts] + + ["}\n"]) diff --git a/worlds/shapez/data/options.json b/worlds/shapez/data/options.json new file mode 100644 index 0000000000..d60f02e0fd --- /dev/null +++ b/worlds/shapez/data/options.json @@ -0,0 +1,4 @@ +{ + "max_levels_and_upgrades": 500, + "max_shapesanity": 1000 +} diff --git a/worlds/shapez/data/shapesanity_pool.py b/worlds/shapez/data/shapesanity_pool.py new file mode 100644 index 0000000000..b0ae132e54 --- /dev/null +++ b/worlds/shapez/data/shapesanity_pool.py @@ -0,0 +1,75814 @@ +shapesanity_simple = { + "Red Circle": "Shapesanity Full Painted", + "Red Square": "Shapesanity Full Painted", + "Red Star": "Shapesanity Full Painted", + "Red Windmill": "Shapesanity East Windmill Painted", + "Blue Circle": "Shapesanity Full Painted", + "Blue Square": "Shapesanity Full Painted", + "Blue Star": "Shapesanity Full Painted", + "Blue Windmill": "Shapesanity East Windmill Painted", + "Green Circle": "Shapesanity Full Painted", + "Green Square": "Shapesanity Full Painted", + "Green Star": "Shapesanity Full Painted", + "Green Windmill": "Shapesanity East Windmill Painted", + "Yellow Circle": "Shapesanity Full Mixed", + "Yellow Square": "Shapesanity Full Mixed", + "Yellow Star": "Shapesanity Full Mixed", + "Yellow Windmill": "Shapesanity East Windmill Mixed", + "Purple Circle": "Shapesanity Full Mixed", + "Purple Square": "Shapesanity Full Mixed", + "Purple Star": "Shapesanity Full Mixed", + "Purple Windmill": "Shapesanity East Windmill Mixed", + "Cyan Circle": "Shapesanity Full Mixed", + "Cyan Square": "Shapesanity Full Mixed", + "Cyan Star": "Shapesanity Full Mixed", + "Cyan Windmill": "Shapesanity East Windmill Mixed", + "White Circle": "Shapesanity Full Mixed", + "White Square": "Shapesanity Full Mixed", + "White Star": "Shapesanity Full Mixed", + "White Windmill": "Shapesanity East Windmill Mixed", + "Uncolored Circle": "Shapesanity Full Uncolored", + "Uncolored Square": "Shapesanity Full Uncolored", + "Uncolored Star": "Shapesanity Full Uncolored", + "Uncolored Windmill": "Shapesanity East Windmill Uncolored", + "Half Red Circle": "Shapesanity Half Painted", + "Red Circle Piece": "Shapesanity Piece Painted", + "Cut Out Red Circle": "Shapesanity Stitched Painted", + "Cornered Red Circle": "Shapesanity Stitched Painted", + "Half Blue Circle": "Shapesanity Half Painted", + "Blue Circle Piece": "Shapesanity Piece Painted", + "Cut Out Blue Circle": "Shapesanity Stitched Painted", + "Cornered Blue Circle": "Shapesanity Stitched Painted", + "Half Green Circle": "Shapesanity Half Painted", + "Green Circle Piece": "Shapesanity Piece Painted", + "Cut Out Green Circle": "Shapesanity Stitched Painted", + "Cornered Green Circle": "Shapesanity Stitched Painted", + "Half Yellow Circle": "Shapesanity Half Mixed", + "Yellow Circle Piece": "Shapesanity Piece Mixed", + "Cut Out Yellow Circle": "Shapesanity Stitched Mixed", + "Cornered Yellow Circle": "Shapesanity Stitched Mixed", + "Half Purple Circle": "Shapesanity Half Mixed", + "Purple Circle Piece": "Shapesanity Piece Mixed", + "Cut Out Purple Circle": "Shapesanity Stitched Mixed", + "Cornered Purple Circle": "Shapesanity Stitched Mixed", + "Half Cyan Circle": "Shapesanity Half Mixed", + "Cyan Circle Piece": "Shapesanity Piece Mixed", + "Cut Out Cyan Circle": "Shapesanity Stitched Mixed", + "Cornered Cyan Circle": "Shapesanity Stitched Mixed", + "Half White Circle": "Shapesanity Half Mixed", + "White Circle Piece": "Shapesanity Piece Mixed", + "Cut Out White Circle": "Shapesanity Stitched Mixed", + "Cornered White Circle": "Shapesanity Stitched Mixed", + "Half Uncolored Circle": "Shapesanity Half Uncolored", + "Uncolored Circle Piece": "Shapesanity Piece Uncolored", + "Cut Out Uncolored Circle": "Shapesanity Stitched Uncolored", + "Cornered Uncolored Circle": "Shapesanity Stitched Uncolored", + "Half Red Square": "Shapesanity Half Painted", + "Red Square Piece": "Shapesanity Piece Painted", + "Cut Out Red Square": "Shapesanity Stitched Painted", + "Cornered Red Square": "Shapesanity Stitched Painted", + "Half Blue Square": "Shapesanity Half Painted", + "Blue Square Piece": "Shapesanity Piece Painted", + "Cut Out Blue Square": "Shapesanity Stitched Painted", + "Cornered Blue Square": "Shapesanity Stitched Painted", + "Half Green Square": "Shapesanity Half Painted", + "Green Square Piece": "Shapesanity Piece Painted", + "Cut Out Green Square": "Shapesanity Stitched Painted", + "Cornered Green Square": "Shapesanity Stitched Painted", + "Half Yellow Square": "Shapesanity Half Mixed", + "Yellow Square Piece": "Shapesanity Piece Mixed", + "Cut Out Yellow Square": "Shapesanity Stitched Mixed", + "Cornered Yellow Square": "Shapesanity Stitched Mixed", + "Half Purple Square": "Shapesanity Half Mixed", + "Purple Square Piece": "Shapesanity Piece Mixed", + "Cut Out Purple Square": "Shapesanity Stitched Mixed", + "Cornered Purple Square": "Shapesanity Stitched Mixed", + "Half Cyan Square": "Shapesanity Half Mixed", + "Cyan Square Piece": "Shapesanity Piece Mixed", + "Cut Out Cyan Square": "Shapesanity Stitched Mixed", + "Cornered Cyan Square": "Shapesanity Stitched Mixed", + "Half White Square": "Shapesanity Half Mixed", + "White Square Piece": "Shapesanity Piece Mixed", + "Cut Out White Square": "Shapesanity Stitched Mixed", + "Cornered White Square": "Shapesanity Stitched Mixed", + "Half Uncolored Square": "Shapesanity Half Uncolored", + "Uncolored Square Piece": "Shapesanity Piece Uncolored", + "Cut Out Uncolored Square": "Shapesanity Stitched Uncolored", + "Cornered Uncolored Square": "Shapesanity Stitched Uncolored", + "Half Red Star": "Shapesanity Half Painted", + "Red Star Piece": "Shapesanity Piece Painted", + "Cut Out Red Star": "Shapesanity Stitched Painted", + "Cornered Red Star": "Shapesanity Stitched Painted", + "Half Blue Star": "Shapesanity Half Painted", + "Blue Star Piece": "Shapesanity Piece Painted", + "Cut Out Blue Star": "Shapesanity Stitched Painted", + "Cornered Blue Star": "Shapesanity Stitched Painted", + "Half Green Star": "Shapesanity Half Painted", + "Green Star Piece": "Shapesanity Piece Painted", + "Cut Out Green Star": "Shapesanity Stitched Painted", + "Cornered Green Star": "Shapesanity Stitched Painted", + "Half Yellow Star": "Shapesanity Half Mixed", + "Yellow Star Piece": "Shapesanity Piece Mixed", + "Cut Out Yellow Star": "Shapesanity Stitched Mixed", + "Cornered Yellow Star": "Shapesanity Stitched Mixed", + "Half Purple Star": "Shapesanity Half Mixed", + "Purple Star Piece": "Shapesanity Piece Mixed", + "Cut Out Purple Star": "Shapesanity Stitched Mixed", + "Cornered Purple Star": "Shapesanity Stitched Mixed", + "Half Cyan Star": "Shapesanity Half Mixed", + "Cyan Star Piece": "Shapesanity Piece Mixed", + "Cut Out Cyan Star": "Shapesanity Stitched Mixed", + "Cornered Cyan Star": "Shapesanity Stitched Mixed", + "Half White Star": "Shapesanity Half Mixed", + "White Star Piece": "Shapesanity Piece Mixed", + "Cut Out White Star": "Shapesanity Stitched Mixed", + "Cornered White Star": "Shapesanity Stitched Mixed", + "Half Uncolored Star": "Shapesanity Half Uncolored", + "Uncolored Star Piece": "Shapesanity Piece Uncolored", + "Cut Out Uncolored Star": "Shapesanity Stitched Uncolored", + "Cornered Uncolored Star": "Shapesanity Stitched Uncolored", + "Half Red Windmill": "Shapesanity Half Painted", + "Red Windmill Piece": "Shapesanity Piece Painted", + "Cut Out Red Windmill": "Shapesanity Stitched Painted", + "Cornered Red Windmill": "Shapesanity Stitched Painted", + "Half Blue Windmill": "Shapesanity Half Painted", + "Blue Windmill Piece": "Shapesanity Piece Painted", + "Cut Out Blue Windmill": "Shapesanity Stitched Painted", + "Cornered Blue Windmill": "Shapesanity Stitched Painted", + "Half Green Windmill": "Shapesanity Half Painted", + "Green Windmill Piece": "Shapesanity Piece Painted", + "Cut Out Green Windmill": "Shapesanity Stitched Painted", + "Cornered Green Windmill": "Shapesanity Stitched Painted", + "Half Yellow Windmill": "Shapesanity Half Mixed", + "Yellow Windmill Piece": "Shapesanity Piece Mixed", + "Cut Out Yellow Windmill": "Shapesanity Stitched Mixed", + "Cornered Yellow Windmill": "Shapesanity Stitched Mixed", + "Half Purple Windmill": "Shapesanity Half Mixed", + "Purple Windmill Piece": "Shapesanity Piece Mixed", + "Cut Out Purple Windmill": "Shapesanity Stitched Mixed", + "Cornered Purple Windmill": "Shapesanity Stitched Mixed", + "Half Cyan Windmill": "Shapesanity Half Mixed", + "Cyan Windmill Piece": "Shapesanity Piece Mixed", + "Cut Out Cyan Windmill": "Shapesanity Stitched Mixed", + "Cornered Cyan Windmill": "Shapesanity Stitched Mixed", + "Half White Windmill": "Shapesanity Half Mixed", + "White Windmill Piece": "Shapesanity Piece Mixed", + "Cut Out White Windmill": "Shapesanity Stitched Mixed", + "Cornered White Windmill": "Shapesanity Stitched Mixed", + "Half Uncolored Windmill": "Shapesanity Half Uncolored", + "Uncolored Windmill Piece": "Shapesanity Piece Uncolored", + "Cut Out Uncolored Windmill": "Shapesanity Stitched Uncolored", + "Cornered Uncolored Windmill": "Shapesanity Stitched Uncolored", +} + +shapesanity_1_4 = { + "bcgp Circle": "Shapesanity Colorful Full Mixed", + "bcgp Square": "Shapesanity Colorful Full Mixed", + "bcgp Star": "Shapesanity Colorful Full Mixed", + "bcgp Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcgr Circle": "Shapesanity Colorful Full Mixed", + "bcgr Square": "Shapesanity Colorful Full Mixed", + "bcgr Star": "Shapesanity Colorful Full Mixed", + "bcgr Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcgu Circle": "Shapesanity Colorful Full Mixed", + "bcgu Square": "Shapesanity Colorful Full Mixed", + "bcgu Star": "Shapesanity Colorful Full Mixed", + "bcgu Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcgw Circle": "Shapesanity Colorful Full Mixed", + "bcgw Square": "Shapesanity Colorful Full Mixed", + "bcgw Star": "Shapesanity Colorful Full Mixed", + "bcgw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcgy Circle": "Shapesanity Colorful Full Mixed", + "bcgy Square": "Shapesanity Colorful Full Mixed", + "bcgy Star": "Shapesanity Colorful Full Mixed", + "bcgy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcg- Circle": "Shapesanity Stitched Mixed", + "bcg- Square": "Shapesanity Stitched Mixed", + "bcg- Star": "Shapesanity Stitched Mixed", + "bcg- Windmill": "Shapesanity Stitched Mixed", + "bcpr Circle": "Shapesanity Colorful Full Mixed", + "bcpr Square": "Shapesanity Colorful Full Mixed", + "bcpr Star": "Shapesanity Colorful Full Mixed", + "bcpr Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcpu Circle": "Shapesanity Colorful Full Mixed", + "bcpu Square": "Shapesanity Colorful Full Mixed", + "bcpu Star": "Shapesanity Colorful Full Mixed", + "bcpu Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcpw Circle": "Shapesanity Colorful Full Mixed", + "bcpw Square": "Shapesanity Colorful Full Mixed", + "bcpw Star": "Shapesanity Colorful Full Mixed", + "bcpw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcpy Circle": "Shapesanity Colorful Full Mixed", + "bcpy Square": "Shapesanity Colorful Full Mixed", + "bcpy Star": "Shapesanity Colorful Full Mixed", + "bcpy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcp- Circle": "Shapesanity Stitched Mixed", + "bcp- Square": "Shapesanity Stitched Mixed", + "bcp- Star": "Shapesanity Stitched Mixed", + "bcp- Windmill": "Shapesanity Stitched Mixed", + "bcru Circle": "Shapesanity Colorful Full Mixed", + "bcru Square": "Shapesanity Colorful Full Mixed", + "bcru Star": "Shapesanity Colorful Full Mixed", + "bcru Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcrw Circle": "Shapesanity Colorful Full Mixed", + "bcrw Square": "Shapesanity Colorful Full Mixed", + "bcrw Star": "Shapesanity Colorful Full Mixed", + "bcrw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcry Circle": "Shapesanity Colorful Full Mixed", + "bcry Square": "Shapesanity Colorful Full Mixed", + "bcry Star": "Shapesanity Colorful Full Mixed", + "bcry Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcr- Circle": "Shapesanity Stitched Mixed", + "bcr- Square": "Shapesanity Stitched Mixed", + "bcr- Star": "Shapesanity Stitched Mixed", + "bcr- Windmill": "Shapesanity Stitched Mixed", + "bcuw Circle": "Shapesanity Colorful Full Mixed", + "bcuw Square": "Shapesanity Colorful Full Mixed", + "bcuw Star": "Shapesanity Colorful Full Mixed", + "bcuw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcuy Circle": "Shapesanity Colorful Full Mixed", + "bcuy Square": "Shapesanity Colorful Full Mixed", + "bcuy Star": "Shapesanity Colorful Full Mixed", + "bcuy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcu- Circle": "Shapesanity Stitched Mixed", + "bcu- Square": "Shapesanity Stitched Mixed", + "bcu- Star": "Shapesanity Stitched Mixed", + "bcu- Windmill": "Shapesanity Stitched Mixed", + "bcwy Circle": "Shapesanity Colorful Full Mixed", + "bcwy Square": "Shapesanity Colorful Full Mixed", + "bcwy Star": "Shapesanity Colorful Full Mixed", + "bcwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bcw- Circle": "Shapesanity Stitched Mixed", + "bcw- Square": "Shapesanity Stitched Mixed", + "bcw- Star": "Shapesanity Stitched Mixed", + "bcw- Windmill": "Shapesanity Stitched Mixed", + "bcy- Circle": "Shapesanity Stitched Mixed", + "bcy- Square": "Shapesanity Stitched Mixed", + "bcy- Star": "Shapesanity Stitched Mixed", + "bcy- Windmill": "Shapesanity Stitched Mixed", + "bgpr Circle": "Shapesanity Colorful Full Mixed", + "bgpr Square": "Shapesanity Colorful Full Mixed", + "bgpr Star": "Shapesanity Colorful Full Mixed", + "bgpr Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgpu Circle": "Shapesanity Colorful Full Mixed", + "bgpu Square": "Shapesanity Colorful Full Mixed", + "bgpu Star": "Shapesanity Colorful Full Mixed", + "bgpu Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgpw Circle": "Shapesanity Colorful Full Mixed", + "bgpw Square": "Shapesanity Colorful Full Mixed", + "bgpw Star": "Shapesanity Colorful Full Mixed", + "bgpw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgpy Circle": "Shapesanity Colorful Full Mixed", + "bgpy Square": "Shapesanity Colorful Full Mixed", + "bgpy Star": "Shapesanity Colorful Full Mixed", + "bgpy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgp- Circle": "Shapesanity Stitched Mixed", + "bgp- Square": "Shapesanity Stitched Mixed", + "bgp- Star": "Shapesanity Stitched Mixed", + "bgp- Windmill": "Shapesanity Stitched Mixed", + "bgru Circle": "Shapesanity Colorful Full Painted", + "bgru Square": "Shapesanity Colorful Full Painted", + "bgru Star": "Shapesanity Colorful Full Painted", + "bgru Windmill": "Shapesanity Colorful East Windmill Painted", + "bgrw Circle": "Shapesanity Colorful Full Mixed", + "bgrw Square": "Shapesanity Colorful Full Mixed", + "bgrw Star": "Shapesanity Colorful Full Mixed", + "bgrw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgry Circle": "Shapesanity Colorful Full Mixed", + "bgry Square": "Shapesanity Colorful Full Mixed", + "bgry Star": "Shapesanity Colorful Full Mixed", + "bgry Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgr- Circle": "Shapesanity Stitched Painted", + "bgr- Square": "Shapesanity Stitched Painted", + "bgr- Star": "Shapesanity Stitched Painted", + "bgr- Windmill": "Shapesanity Stitched Painted", + "bguw Circle": "Shapesanity Colorful Full Mixed", + "bguw Square": "Shapesanity Colorful Full Mixed", + "bguw Star": "Shapesanity Colorful Full Mixed", + "bguw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bguy Circle": "Shapesanity Colorful Full Mixed", + "bguy Square": "Shapesanity Colorful Full Mixed", + "bguy Star": "Shapesanity Colorful Full Mixed", + "bguy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgu- Circle": "Shapesanity Stitched Painted", + "bgu- Square": "Shapesanity Stitched Painted", + "bgu- Star": "Shapesanity Stitched Painted", + "bgu- Windmill": "Shapesanity Stitched Painted", + "bgwy Circle": "Shapesanity Colorful Full Mixed", + "bgwy Square": "Shapesanity Colorful Full Mixed", + "bgwy Star": "Shapesanity Colorful Full Mixed", + "bgwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bgw- Circle": "Shapesanity Stitched Mixed", + "bgw- Square": "Shapesanity Stitched Mixed", + "bgw- Star": "Shapesanity Stitched Mixed", + "bgw- Windmill": "Shapesanity Stitched Mixed", + "bgy- Circle": "Shapesanity Stitched Mixed", + "bgy- Square": "Shapesanity Stitched Mixed", + "bgy- Star": "Shapesanity Stitched Mixed", + "bgy- Windmill": "Shapesanity Stitched Mixed", + "bpru Circle": "Shapesanity Colorful Full Mixed", + "bpru Square": "Shapesanity Colorful Full Mixed", + "bpru Star": "Shapesanity Colorful Full Mixed", + "bpru Windmill": "Shapesanity Colorful East Windmill Mixed", + "bprw Circle": "Shapesanity Colorful Full Mixed", + "bprw Square": "Shapesanity Colorful Full Mixed", + "bprw Star": "Shapesanity Colorful Full Mixed", + "bprw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bpry Circle": "Shapesanity Colorful Full Mixed", + "bpry Square": "Shapesanity Colorful Full Mixed", + "bpry Star": "Shapesanity Colorful Full Mixed", + "bpry Windmill": "Shapesanity Colorful East Windmill Mixed", + "bpr- Circle": "Shapesanity Stitched Mixed", + "bpr- Square": "Shapesanity Stitched Mixed", + "bpr- Star": "Shapesanity Stitched Mixed", + "bpr- Windmill": "Shapesanity Stitched Mixed", + "bpuw Circle": "Shapesanity Colorful Full Mixed", + "bpuw Square": "Shapesanity Colorful Full Mixed", + "bpuw Star": "Shapesanity Colorful Full Mixed", + "bpuw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bpuy Circle": "Shapesanity Colorful Full Mixed", + "bpuy Square": "Shapesanity Colorful Full Mixed", + "bpuy Star": "Shapesanity Colorful Full Mixed", + "bpuy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bpu- Circle": "Shapesanity Stitched Mixed", + "bpu- Square": "Shapesanity Stitched Mixed", + "bpu- Star": "Shapesanity Stitched Mixed", + "bpu- Windmill": "Shapesanity Stitched Mixed", + "bpwy Circle": "Shapesanity Colorful Full Mixed", + "bpwy Square": "Shapesanity Colorful Full Mixed", + "bpwy Star": "Shapesanity Colorful Full Mixed", + "bpwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bpw- Circle": "Shapesanity Stitched Mixed", + "bpw- Square": "Shapesanity Stitched Mixed", + "bpw- Star": "Shapesanity Stitched Mixed", + "bpw- Windmill": "Shapesanity Stitched Mixed", + "bpy- Circle": "Shapesanity Stitched Mixed", + "bpy- Square": "Shapesanity Stitched Mixed", + "bpy- Star": "Shapesanity Stitched Mixed", + "bpy- Windmill": "Shapesanity Stitched Mixed", + "bruw Circle": "Shapesanity Colorful Full Mixed", + "bruw Square": "Shapesanity Colorful Full Mixed", + "bruw Star": "Shapesanity Colorful Full Mixed", + "bruw Windmill": "Shapesanity Colorful East Windmill Mixed", + "bruy Circle": "Shapesanity Colorful Full Mixed", + "bruy Square": "Shapesanity Colorful Full Mixed", + "bruy Star": "Shapesanity Colorful Full Mixed", + "bruy Windmill": "Shapesanity Colorful East Windmill Mixed", + "bru- Circle": "Shapesanity Stitched Painted", + "bru- Square": "Shapesanity Stitched Painted", + "bru- Star": "Shapesanity Stitched Painted", + "bru- Windmill": "Shapesanity Stitched Painted", + "brwy Circle": "Shapesanity Colorful Full Mixed", + "brwy Square": "Shapesanity Colorful Full Mixed", + "brwy Star": "Shapesanity Colorful Full Mixed", + "brwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "brw- Circle": "Shapesanity Stitched Mixed", + "brw- Square": "Shapesanity Stitched Mixed", + "brw- Star": "Shapesanity Stitched Mixed", + "brw- Windmill": "Shapesanity Stitched Mixed", + "bry- Circle": "Shapesanity Stitched Mixed", + "bry- Square": "Shapesanity Stitched Mixed", + "bry- Star": "Shapesanity Stitched Mixed", + "bry- Windmill": "Shapesanity Stitched Mixed", + "buwy Circle": "Shapesanity Colorful Full Mixed", + "buwy Square": "Shapesanity Colorful Full Mixed", + "buwy Star": "Shapesanity Colorful Full Mixed", + "buwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "buw- Circle": "Shapesanity Stitched Mixed", + "buw- Square": "Shapesanity Stitched Mixed", + "buw- Star": "Shapesanity Stitched Mixed", + "buw- Windmill": "Shapesanity Stitched Mixed", + "buy- Circle": "Shapesanity Stitched Mixed", + "buy- Square": "Shapesanity Stitched Mixed", + "buy- Star": "Shapesanity Stitched Mixed", + "buy- Windmill": "Shapesanity Stitched Mixed", + "bwy- Circle": "Shapesanity Stitched Mixed", + "bwy- Square": "Shapesanity Stitched Mixed", + "bwy- Star": "Shapesanity Stitched Mixed", + "bwy- Windmill": "Shapesanity Stitched Mixed", + "cgpr Circle": "Shapesanity Colorful Full Mixed", + "cgpr Square": "Shapesanity Colorful Full Mixed", + "cgpr Star": "Shapesanity Colorful Full Mixed", + "cgpr Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgpu Circle": "Shapesanity Colorful Full Mixed", + "cgpu Square": "Shapesanity Colorful Full Mixed", + "cgpu Star": "Shapesanity Colorful Full Mixed", + "cgpu Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgpw Circle": "Shapesanity Colorful Full Mixed", + "cgpw Square": "Shapesanity Colorful Full Mixed", + "cgpw Star": "Shapesanity Colorful Full Mixed", + "cgpw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgpy Circle": "Shapesanity Colorful Full Mixed", + "cgpy Square": "Shapesanity Colorful Full Mixed", + "cgpy Star": "Shapesanity Colorful Full Mixed", + "cgpy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgp- Circle": "Shapesanity Stitched Mixed", + "cgp- Square": "Shapesanity Stitched Mixed", + "cgp- Star": "Shapesanity Stitched Mixed", + "cgp- Windmill": "Shapesanity Stitched Mixed", + "cgru Circle": "Shapesanity Colorful Full Mixed", + "cgru Square": "Shapesanity Colorful Full Mixed", + "cgru Star": "Shapesanity Colorful Full Mixed", + "cgru Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgrw Circle": "Shapesanity Colorful Full Mixed", + "cgrw Square": "Shapesanity Colorful Full Mixed", + "cgrw Star": "Shapesanity Colorful Full Mixed", + "cgrw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgry Circle": "Shapesanity Colorful Full Mixed", + "cgry Square": "Shapesanity Colorful Full Mixed", + "cgry Star": "Shapesanity Colorful Full Mixed", + "cgry Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgr- Circle": "Shapesanity Stitched Mixed", + "cgr- Square": "Shapesanity Stitched Mixed", + "cgr- Star": "Shapesanity Stitched Mixed", + "cgr- Windmill": "Shapesanity Stitched Mixed", + "cguw Circle": "Shapesanity Colorful Full Mixed", + "cguw Square": "Shapesanity Colorful Full Mixed", + "cguw Star": "Shapesanity Colorful Full Mixed", + "cguw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cguy Circle": "Shapesanity Colorful Full Mixed", + "cguy Square": "Shapesanity Colorful Full Mixed", + "cguy Star": "Shapesanity Colorful Full Mixed", + "cguy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgu- Circle": "Shapesanity Stitched Mixed", + "cgu- Square": "Shapesanity Stitched Mixed", + "cgu- Star": "Shapesanity Stitched Mixed", + "cgu- Windmill": "Shapesanity Stitched Mixed", + "cgwy Circle": "Shapesanity Colorful Full Mixed", + "cgwy Square": "Shapesanity Colorful Full Mixed", + "cgwy Star": "Shapesanity Colorful Full Mixed", + "cgwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cgw- Circle": "Shapesanity Stitched Mixed", + "cgw- Square": "Shapesanity Stitched Mixed", + "cgw- Star": "Shapesanity Stitched Mixed", + "cgw- Windmill": "Shapesanity Stitched Mixed", + "cgy- Circle": "Shapesanity Stitched Mixed", + "cgy- Square": "Shapesanity Stitched Mixed", + "cgy- Star": "Shapesanity Stitched Mixed", + "cgy- Windmill": "Shapesanity Stitched Mixed", + "cpru Circle": "Shapesanity Colorful Full Mixed", + "cpru Square": "Shapesanity Colorful Full Mixed", + "cpru Star": "Shapesanity Colorful Full Mixed", + "cpru Windmill": "Shapesanity Colorful East Windmill Mixed", + "cprw Circle": "Shapesanity Colorful Full Mixed", + "cprw Square": "Shapesanity Colorful Full Mixed", + "cprw Star": "Shapesanity Colorful Full Mixed", + "cprw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cpry Circle": "Shapesanity Colorful Full Mixed", + "cpry Square": "Shapesanity Colorful Full Mixed", + "cpry Star": "Shapesanity Colorful Full Mixed", + "cpry Windmill": "Shapesanity Colorful East Windmill Mixed", + "cpr- Circle": "Shapesanity Stitched Mixed", + "cpr- Square": "Shapesanity Stitched Mixed", + "cpr- Star": "Shapesanity Stitched Mixed", + "cpr- Windmill": "Shapesanity Stitched Mixed", + "cpuw Circle": "Shapesanity Colorful Full Mixed", + "cpuw Square": "Shapesanity Colorful Full Mixed", + "cpuw Star": "Shapesanity Colorful Full Mixed", + "cpuw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cpuy Circle": "Shapesanity Colorful Full Mixed", + "cpuy Square": "Shapesanity Colorful Full Mixed", + "cpuy Star": "Shapesanity Colorful Full Mixed", + "cpuy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cpu- Circle": "Shapesanity Stitched Mixed", + "cpu- Square": "Shapesanity Stitched Mixed", + "cpu- Star": "Shapesanity Stitched Mixed", + "cpu- Windmill": "Shapesanity Stitched Mixed", + "cpwy Circle": "Shapesanity Colorful Full Mixed", + "cpwy Square": "Shapesanity Colorful Full Mixed", + "cpwy Star": "Shapesanity Colorful Full Mixed", + "cpwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cpw- Circle": "Shapesanity Stitched Mixed", + "cpw- Square": "Shapesanity Stitched Mixed", + "cpw- Star": "Shapesanity Stitched Mixed", + "cpw- Windmill": "Shapesanity Stitched Mixed", + "cpy- Circle": "Shapesanity Stitched Mixed", + "cpy- Square": "Shapesanity Stitched Mixed", + "cpy- Star": "Shapesanity Stitched Mixed", + "cpy- Windmill": "Shapesanity Stitched Mixed", + "cruw Circle": "Shapesanity Colorful Full Mixed", + "cruw Square": "Shapesanity Colorful Full Mixed", + "cruw Star": "Shapesanity Colorful Full Mixed", + "cruw Windmill": "Shapesanity Colorful East Windmill Mixed", + "cruy Circle": "Shapesanity Colorful Full Mixed", + "cruy Square": "Shapesanity Colorful Full Mixed", + "cruy Star": "Shapesanity Colorful Full Mixed", + "cruy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cru- Circle": "Shapesanity Stitched Mixed", + "cru- Square": "Shapesanity Stitched Mixed", + "cru- Star": "Shapesanity Stitched Mixed", + "cru- Windmill": "Shapesanity Stitched Mixed", + "crwy Circle": "Shapesanity Colorful Full Mixed", + "crwy Square": "Shapesanity Colorful Full Mixed", + "crwy Star": "Shapesanity Colorful Full Mixed", + "crwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "crw- Circle": "Shapesanity Stitched Mixed", + "crw- Square": "Shapesanity Stitched Mixed", + "crw- Star": "Shapesanity Stitched Mixed", + "crw- Windmill": "Shapesanity Stitched Mixed", + "cry- Circle": "Shapesanity Stitched Mixed", + "cry- Square": "Shapesanity Stitched Mixed", + "cry- Star": "Shapesanity Stitched Mixed", + "cry- Windmill": "Shapesanity Stitched Mixed", + "cuwy Circle": "Shapesanity Colorful Full Mixed", + "cuwy Square": "Shapesanity Colorful Full Mixed", + "cuwy Star": "Shapesanity Colorful Full Mixed", + "cuwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "cuw- Circle": "Shapesanity Stitched Mixed", + "cuw- Square": "Shapesanity Stitched Mixed", + "cuw- Star": "Shapesanity Stitched Mixed", + "cuw- Windmill": "Shapesanity Stitched Mixed", + "cuy- Circle": "Shapesanity Stitched Mixed", + "cuy- Square": "Shapesanity Stitched Mixed", + "cuy- Star": "Shapesanity Stitched Mixed", + "cuy- Windmill": "Shapesanity Stitched Mixed", + "cwy- Circle": "Shapesanity Stitched Mixed", + "cwy- Square": "Shapesanity Stitched Mixed", + "cwy- Star": "Shapesanity Stitched Mixed", + "cwy- Windmill": "Shapesanity Stitched Mixed", + "gpru Circle": "Shapesanity Colorful Full Mixed", + "gpru Square": "Shapesanity Colorful Full Mixed", + "gpru Star": "Shapesanity Colorful Full Mixed", + "gpru Windmill": "Shapesanity Colorful East Windmill Mixed", + "gprw Circle": "Shapesanity Colorful Full Mixed", + "gprw Square": "Shapesanity Colorful Full Mixed", + "gprw Star": "Shapesanity Colorful Full Mixed", + "gprw Windmill": "Shapesanity Colorful East Windmill Mixed", + "gpry Circle": "Shapesanity Colorful Full Mixed", + "gpry Square": "Shapesanity Colorful Full Mixed", + "gpry Star": "Shapesanity Colorful Full Mixed", + "gpry Windmill": "Shapesanity Colorful East Windmill Mixed", + "gpr- Circle": "Shapesanity Stitched Mixed", + "gpr- Square": "Shapesanity Stitched Mixed", + "gpr- Star": "Shapesanity Stitched Mixed", + "gpr- Windmill": "Shapesanity Stitched Mixed", + "gpuw Circle": "Shapesanity Colorful Full Mixed", + "gpuw Square": "Shapesanity Colorful Full Mixed", + "gpuw Star": "Shapesanity Colorful Full Mixed", + "gpuw Windmill": "Shapesanity Colorful East Windmill Mixed", + "gpuy Circle": "Shapesanity Colorful Full Mixed", + "gpuy Square": "Shapesanity Colorful Full Mixed", + "gpuy Star": "Shapesanity Colorful Full Mixed", + "gpuy Windmill": "Shapesanity Colorful East Windmill Mixed", + "gpu- Circle": "Shapesanity Stitched Mixed", + "gpu- Square": "Shapesanity Stitched Mixed", + "gpu- Star": "Shapesanity Stitched Mixed", + "gpu- Windmill": "Shapesanity Stitched Mixed", + "gpwy Circle": "Shapesanity Colorful Full Mixed", + "gpwy Square": "Shapesanity Colorful Full Mixed", + "gpwy Star": "Shapesanity Colorful Full Mixed", + "gpwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "gpw- Circle": "Shapesanity Stitched Mixed", + "gpw- Square": "Shapesanity Stitched Mixed", + "gpw- Star": "Shapesanity Stitched Mixed", + "gpw- Windmill": "Shapesanity Stitched Mixed", + "gpy- Circle": "Shapesanity Stitched Mixed", + "gpy- Square": "Shapesanity Stitched Mixed", + "gpy- Star": "Shapesanity Stitched Mixed", + "gpy- Windmill": "Shapesanity Stitched Mixed", + "gruw Circle": "Shapesanity Colorful Full Mixed", + "gruw Square": "Shapesanity Colorful Full Mixed", + "gruw Star": "Shapesanity Colorful Full Mixed", + "gruw Windmill": "Shapesanity Colorful East Windmill Mixed", + "gruy Circle": "Shapesanity Colorful Full Mixed", + "gruy Square": "Shapesanity Colorful Full Mixed", + "gruy Star": "Shapesanity Colorful Full Mixed", + "gruy Windmill": "Shapesanity Colorful East Windmill Mixed", + "gru- Circle": "Shapesanity Stitched Painted", + "gru- Square": "Shapesanity Stitched Painted", + "gru- Star": "Shapesanity Stitched Painted", + "gru- Windmill": "Shapesanity Stitched Painted", + "grwy Circle": "Shapesanity Colorful Full Mixed", + "grwy Square": "Shapesanity Colorful Full Mixed", + "grwy Star": "Shapesanity Colorful Full Mixed", + "grwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "grw- Circle": "Shapesanity Stitched Mixed", + "grw- Square": "Shapesanity Stitched Mixed", + "grw- Star": "Shapesanity Stitched Mixed", + "grw- Windmill": "Shapesanity Stitched Mixed", + "gry- Circle": "Shapesanity Stitched Mixed", + "gry- Square": "Shapesanity Stitched Mixed", + "gry- Star": "Shapesanity Stitched Mixed", + "gry- Windmill": "Shapesanity Stitched Mixed", + "guwy Circle": "Shapesanity Colorful Full Mixed", + "guwy Square": "Shapesanity Colorful Full Mixed", + "guwy Star": "Shapesanity Colorful Full Mixed", + "guwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "guw- Circle": "Shapesanity Stitched Mixed", + "guw- Square": "Shapesanity Stitched Mixed", + "guw- Star": "Shapesanity Stitched Mixed", + "guw- Windmill": "Shapesanity Stitched Mixed", + "guy- Circle": "Shapesanity Stitched Mixed", + "guy- Square": "Shapesanity Stitched Mixed", + "guy- Star": "Shapesanity Stitched Mixed", + "guy- Windmill": "Shapesanity Stitched Mixed", + "gwy- Circle": "Shapesanity Stitched Mixed", + "gwy- Square": "Shapesanity Stitched Mixed", + "gwy- Star": "Shapesanity Stitched Mixed", + "gwy- Windmill": "Shapesanity Stitched Mixed", + "pruw Circle": "Shapesanity Colorful Full Mixed", + "pruw Square": "Shapesanity Colorful Full Mixed", + "pruw Star": "Shapesanity Colorful Full Mixed", + "pruw Windmill": "Shapesanity Colorful East Windmill Mixed", + "pruy Circle": "Shapesanity Colorful Full Mixed", + "pruy Square": "Shapesanity Colorful Full Mixed", + "pruy Star": "Shapesanity Colorful Full Mixed", + "pruy Windmill": "Shapesanity Colorful East Windmill Mixed", + "pru- Circle": "Shapesanity Stitched Mixed", + "pru- Square": "Shapesanity Stitched Mixed", + "pru- Star": "Shapesanity Stitched Mixed", + "pru- Windmill": "Shapesanity Stitched Mixed", + "prwy Circle": "Shapesanity Colorful Full Mixed", + "prwy Square": "Shapesanity Colorful Full Mixed", + "prwy Star": "Shapesanity Colorful Full Mixed", + "prwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "prw- Circle": "Shapesanity Stitched Mixed", + "prw- Square": "Shapesanity Stitched Mixed", + "prw- Star": "Shapesanity Stitched Mixed", + "prw- Windmill": "Shapesanity Stitched Mixed", + "pry- Circle": "Shapesanity Stitched Mixed", + "pry- Square": "Shapesanity Stitched Mixed", + "pry- Star": "Shapesanity Stitched Mixed", + "pry- Windmill": "Shapesanity Stitched Mixed", + "puwy Circle": "Shapesanity Colorful Full Mixed", + "puwy Square": "Shapesanity Colorful Full Mixed", + "puwy Star": "Shapesanity Colorful Full Mixed", + "puwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "puw- Circle": "Shapesanity Stitched Mixed", + "puw- Square": "Shapesanity Stitched Mixed", + "puw- Star": "Shapesanity Stitched Mixed", + "puw- Windmill": "Shapesanity Stitched Mixed", + "puy- Circle": "Shapesanity Stitched Mixed", + "puy- Square": "Shapesanity Stitched Mixed", + "puy- Star": "Shapesanity Stitched Mixed", + "puy- Windmill": "Shapesanity Stitched Mixed", + "pwy- Circle": "Shapesanity Stitched Mixed", + "pwy- Square": "Shapesanity Stitched Mixed", + "pwy- Star": "Shapesanity Stitched Mixed", + "pwy- Windmill": "Shapesanity Stitched Mixed", + "ruwy Circle": "Shapesanity Colorful Full Mixed", + "ruwy Square": "Shapesanity Colorful Full Mixed", + "ruwy Star": "Shapesanity Colorful Full Mixed", + "ruwy Windmill": "Shapesanity Colorful East Windmill Mixed", + "ruw- Circle": "Shapesanity Stitched Mixed", + "ruw- Square": "Shapesanity Stitched Mixed", + "ruw- Star": "Shapesanity Stitched Mixed", + "ruw- Windmill": "Shapesanity Stitched Mixed", + "ruy- Circle": "Shapesanity Stitched Mixed", + "ruy- Square": "Shapesanity Stitched Mixed", + "ruy- Star": "Shapesanity Stitched Mixed", + "ruy- Windmill": "Shapesanity Stitched Mixed", + "rwy- Circle": "Shapesanity Stitched Mixed", + "rwy- Square": "Shapesanity Stitched Mixed", + "rwy- Star": "Shapesanity Stitched Mixed", + "rwy- Windmill": "Shapesanity Stitched Mixed", + "uwy- Circle": "Shapesanity Stitched Mixed", + "uwy- Square": "Shapesanity Stitched Mixed", + "uwy- Star": "Shapesanity Stitched Mixed", + "uwy- Windmill": "Shapesanity Stitched Mixed", + "Red CRSW": "Shapesanity Stitched Painted", + "Blue CRSW": "Shapesanity Stitched Painted", + "Green CRSW": "Shapesanity Stitched Painted", + "Yellow CRSW": "Shapesanity Stitched Mixed", + "Purple CRSW": "Shapesanity Stitched Mixed", + "Cyan CRSW": "Shapesanity Stitched Mixed", + "White CRSW": "Shapesanity Stitched Mixed", + "Uncolored CRSW": "Shapesanity Stitched Uncolored", + "Red CRS-": "Shapesanity Stitched Painted", + "Blue CRS-": "Shapesanity Stitched Painted", + "Green CRS-": "Shapesanity Stitched Painted", + "Yellow CRS-": "Shapesanity Stitched Mixed", + "Purple CRS-": "Shapesanity Stitched Mixed", + "Cyan CRS-": "Shapesanity Stitched Mixed", + "White CRS-": "Shapesanity Stitched Mixed", + "Uncolored CRS-": "Shapesanity Stitched Uncolored", + "Red CRW-": "Shapesanity Stitched Painted", + "Blue CRW-": "Shapesanity Stitched Painted", + "Green CRW-": "Shapesanity Stitched Painted", + "Yellow CRW-": "Shapesanity Stitched Mixed", + "Purple CRW-": "Shapesanity Stitched Mixed", + "Cyan CRW-": "Shapesanity Stitched Mixed", + "White CRW-": "Shapesanity Stitched Mixed", + "Uncolored CRW-": "Shapesanity Stitched Uncolored", + "Red CSW-": "Shapesanity Stitched Painted", + "Blue CSW-": "Shapesanity Stitched Painted", + "Green CSW-": "Shapesanity Stitched Painted", + "Yellow CSW-": "Shapesanity Stitched Mixed", + "Purple CSW-": "Shapesanity Stitched Mixed", + "Cyan CSW-": "Shapesanity Stitched Mixed", + "White CSW-": "Shapesanity Stitched Mixed", + "Uncolored CSW-": "Shapesanity Stitched Uncolored", + "Red RSW-": "Shapesanity Stitched Painted", + "Blue RSW-": "Shapesanity Stitched Painted", + "Green RSW-": "Shapesanity Stitched Painted", + "Yellow RSW-": "Shapesanity Stitched Mixed", + "Purple RSW-": "Shapesanity Stitched Mixed", + "Cyan RSW-": "Shapesanity Stitched Mixed", + "White RSW-": "Shapesanity Stitched Mixed", + "Uncolored RSW-": "Shapesanity Stitched Uncolored", +} + +shapesanity_two_sided = { + "3-1 Cb Cc": "Shapesanity Colorful Full Mixed", + "Half-Half Cb Cc": "Shapesanity Colorful Full Mixed", + "Checkered Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cb Cc": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Cc": "Shapesanity Stitched Mixed", + "3-1 Cb Cg": "Shapesanity Colorful Full Painted", + "Half-Half Cb Cg": "Shapesanity Colorful Full Painted", + "Checkered Cb Cg": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cb Cg": "Shapesanity Colorful Half Painted", + "Cornered Singles Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Cg": "Shapesanity Stitched Painted", + "3-1 Cb Cp": "Shapesanity Colorful Full Mixed", + "Half-Half Cb Cp": "Shapesanity Colorful Full Mixed", + "Checkered Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cb Cp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Cp": "Shapesanity Stitched Mixed", + "3-1 Cb Cr": "Shapesanity Colorful Full Painted", + "Half-Half Cb Cr": "Shapesanity Colorful Full Painted", + "Checkered Cb Cr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cb Cr": "Shapesanity Colorful Half Painted", + "Cornered Singles Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Cr": "Shapesanity Stitched Painted", + "3-1 Cb Cu": "Shapesanity Colorful Full Painted", + "Half-Half Cb Cu": "Shapesanity Colorful Full Painted", + "Checkered Cb Cu": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cb Cu": "Shapesanity Colorful Half Painted", + "Cornered Singles Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Cu": "Shapesanity Stitched Painted", + "3-1 Cb Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cb Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cb Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Cw": "Shapesanity Stitched Mixed", + "3-1 Cb Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cb Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cb Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Cy": "Shapesanity Stitched Mixed", + "3-1 Cb Rb": "Shapesanity Stitched Painted", + "Half-Half Cb Rb": "Shapesanity Half-Half Painted", + "Checkered Cb Rb": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Rb": "Shapesanity Stitched Painted", + "Cornered Singles Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Rb": "Shapesanity Stitched Painted", + "3-1 Cb Rc": "Shapesanity Stitched Mixed", + "Half-Half Cb Rc": "Shapesanity Half-Half Mixed", + "Checkered Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Rc": "Shapesanity Stitched Mixed", + "3-1 Cb Rg": "Shapesanity Stitched Painted", + "Half-Half Cb Rg": "Shapesanity Half-Half Painted", + "Checkered Cb Rg": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Rg": "Shapesanity Stitched Painted", + "Cornered Singles Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Rg": "Shapesanity Stitched Painted", + "3-1 Cb Rp": "Shapesanity Stitched Mixed", + "Half-Half Cb Rp": "Shapesanity Half-Half Mixed", + "Checkered Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Rp": "Shapesanity Stitched Mixed", + "3-1 Cb Rr": "Shapesanity Stitched Painted", + "Half-Half Cb Rr": "Shapesanity Half-Half Painted", + "Checkered Cb Rr": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Rr": "Shapesanity Stitched Painted", + "Cornered Singles Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Rr": "Shapesanity Stitched Painted", + "3-1 Cb Ru": "Shapesanity Stitched Painted", + "Half-Half Cb Ru": "Shapesanity Half-Half Painted", + "Checkered Cb Ru": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Ru": "Shapesanity Stitched Painted", + "Cornered Singles Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Ru": "Shapesanity Stitched Painted", + "3-1 Cb Rw": "Shapesanity Stitched Mixed", + "Half-Half Cb Rw": "Shapesanity Half-Half Mixed", + "Checkered Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Rw": "Shapesanity Stitched Mixed", + "3-1 Cb Ry": "Shapesanity Stitched Mixed", + "Half-Half Cb Ry": "Shapesanity Half-Half Mixed", + "Checkered Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Ry": "Shapesanity Stitched Mixed", + "3-1 Cb Sb": "Shapesanity Stitched Painted", + "Half-Half Cb Sb": "Shapesanity Half-Half Painted", + "Checkered Cb Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Sb": "Shapesanity Stitched Painted", + "Cornered Singles Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Sb": "Shapesanity Stitched Painted", + "3-1 Cb Sc": "Shapesanity Stitched Mixed", + "Half-Half Cb Sc": "Shapesanity Half-Half Mixed", + "Checkered Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Sc": "Shapesanity Stitched Mixed", + "3-1 Cb Sg": "Shapesanity Stitched Painted", + "Half-Half Cb Sg": "Shapesanity Half-Half Painted", + "Checkered Cb Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Sg": "Shapesanity Stitched Painted", + "Cornered Singles Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Sg": "Shapesanity Stitched Painted", + "3-1 Cb Sp": "Shapesanity Stitched Mixed", + "Half-Half Cb Sp": "Shapesanity Half-Half Mixed", + "Checkered Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Sp": "Shapesanity Stitched Mixed", + "3-1 Cb Sr": "Shapesanity Stitched Painted", + "Half-Half Cb Sr": "Shapesanity Half-Half Painted", + "Checkered Cb Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Sr": "Shapesanity Stitched Painted", + "Cornered Singles Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Sr": "Shapesanity Stitched Painted", + "3-1 Cb Su": "Shapesanity Stitched Painted", + "Half-Half Cb Su": "Shapesanity Half-Half Painted", + "Checkered Cb Su": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Su": "Shapesanity Stitched Painted", + "Cornered Singles Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Su": "Shapesanity Stitched Painted", + "3-1 Cb Sw": "Shapesanity Stitched Mixed", + "Half-Half Cb Sw": "Shapesanity Half-Half Mixed", + "Checkered Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Sw": "Shapesanity Stitched Mixed", + "3-1 Cb Sy": "Shapesanity Stitched Mixed", + "Half-Half Cb Sy": "Shapesanity Half-Half Mixed", + "Checkered Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Sy": "Shapesanity Stitched Mixed", + "3-1 Cb Wb": "Shapesanity Stitched Painted", + "Half-Half Cb Wb": "Shapesanity Half-Half Painted", + "Checkered Cb Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Wb": "Shapesanity Stitched Painted", + "Cornered Singles Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Wb": "Shapesanity Stitched Painted", + "3-1 Cb Wc": "Shapesanity Stitched Mixed", + "Half-Half Cb Wc": "Shapesanity Half-Half Mixed", + "Checkered Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Wc": "Shapesanity Stitched Mixed", + "3-1 Cb Wg": "Shapesanity Stitched Painted", + "Half-Half Cb Wg": "Shapesanity Half-Half Painted", + "Checkered Cb Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Wg": "Shapesanity Stitched Painted", + "Cornered Singles Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Wg": "Shapesanity Stitched Painted", + "3-1 Cb Wp": "Shapesanity Stitched Mixed", + "Half-Half Cb Wp": "Shapesanity Half-Half Mixed", + "Checkered Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Wp": "Shapesanity Stitched Mixed", + "3-1 Cb Wr": "Shapesanity Stitched Painted", + "Half-Half Cb Wr": "Shapesanity Half-Half Painted", + "Checkered Cb Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Wr": "Shapesanity Stitched Painted", + "Cornered Singles Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Wr": "Shapesanity Stitched Painted", + "3-1 Cb Wu": "Shapesanity Stitched Painted", + "Half-Half Cb Wu": "Shapesanity Half-Half Painted", + "Checkered Cb Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Cb Wu": "Shapesanity Stitched Painted", + "Cornered Singles Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cb Wu": "Shapesanity Stitched Painted", + "3-1 Cb Ww": "Shapesanity Stitched Mixed", + "Half-Half Cb Ww": "Shapesanity Half-Half Mixed", + "Checkered Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Ww": "Shapesanity Stitched Mixed", + "3-1 Cb Wy": "Shapesanity Stitched Mixed", + "Half-Half Cb Wy": "Shapesanity Half-Half Mixed", + "Checkered Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cb Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cb Wy": "Shapesanity Stitched Mixed", + "3-1 Cc Cb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cc Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cb": "Shapesanity Stitched Mixed", + "3-1 Cc Cg": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cg": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cg": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cg": "Shapesanity Stitched Mixed", + "3-1 Cc Cp": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cp": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cp": "Shapesanity Stitched Mixed", + "3-1 Cc Cr": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cr": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cr": "Shapesanity Stitched Mixed", + "3-1 Cc Cu": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cu": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cu": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cu": "Shapesanity Stitched Mixed", + "3-1 Cc Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cw": "Shapesanity Stitched Mixed", + "3-1 Cc Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cc Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cc Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Cy": "Shapesanity Stitched Mixed", + "3-1 Cc Rb": "Shapesanity Stitched Mixed", + "Half-Half Cc Rb": "Shapesanity Half-Half Mixed", + "Checkered Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rb": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rb": "Shapesanity Stitched Mixed", + "3-1 Cc Rc": "Shapesanity Stitched Mixed", + "Half-Half Cc Rc": "Shapesanity Half-Half Mixed", + "Checkered Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rc": "Shapesanity Stitched Mixed", + "3-1 Cc Rg": "Shapesanity Stitched Mixed", + "Half-Half Cc Rg": "Shapesanity Half-Half Mixed", + "Checkered Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rg": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rg": "Shapesanity Stitched Mixed", + "3-1 Cc Rp": "Shapesanity Stitched Mixed", + "Half-Half Cc Rp": "Shapesanity Half-Half Mixed", + "Checkered Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rp": "Shapesanity Stitched Mixed", + "3-1 Cc Rr": "Shapesanity Stitched Mixed", + "Half-Half Cc Rr": "Shapesanity Half-Half Mixed", + "Checkered Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rr": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rr": "Shapesanity Stitched Mixed", + "3-1 Cc Ru": "Shapesanity Stitched Mixed", + "Half-Half Cc Ru": "Shapesanity Half-Half Mixed", + "Checkered Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Ru": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Ru": "Shapesanity Stitched Mixed", + "3-1 Cc Rw": "Shapesanity Stitched Mixed", + "Half-Half Cc Rw": "Shapesanity Half-Half Mixed", + "Checkered Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Rw": "Shapesanity Stitched Mixed", + "3-1 Cc Ry": "Shapesanity Stitched Mixed", + "Half-Half Cc Ry": "Shapesanity Half-Half Mixed", + "Checkered Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Ry": "Shapesanity Stitched Mixed", + "3-1 Cc Sb": "Shapesanity Stitched Mixed", + "Half-Half Cc Sb": "Shapesanity Half-Half Mixed", + "Checkered Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sb": "Shapesanity Stitched Mixed", + "3-1 Cc Sc": "Shapesanity Stitched Mixed", + "Half-Half Cc Sc": "Shapesanity Half-Half Mixed", + "Checkered Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sc": "Shapesanity Stitched Mixed", + "3-1 Cc Sg": "Shapesanity Stitched Mixed", + "Half-Half Cc Sg": "Shapesanity Half-Half Mixed", + "Checkered Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sg": "Shapesanity Stitched Mixed", + "3-1 Cc Sp": "Shapesanity Stitched Mixed", + "Half-Half Cc Sp": "Shapesanity Half-Half Mixed", + "Checkered Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sp": "Shapesanity Stitched Mixed", + "3-1 Cc Sr": "Shapesanity Stitched Mixed", + "Half-Half Cc Sr": "Shapesanity Half-Half Mixed", + "Checkered Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sr": "Shapesanity Stitched Mixed", + "3-1 Cc Su": "Shapesanity Stitched Mixed", + "Half-Half Cc Su": "Shapesanity Half-Half Mixed", + "Checkered Cc Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Su": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Su": "Shapesanity Stitched Mixed", + "3-1 Cc Sw": "Shapesanity Stitched Mixed", + "Half-Half Cc Sw": "Shapesanity Half-Half Mixed", + "Checkered Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sw": "Shapesanity Stitched Mixed", + "3-1 Cc Sy": "Shapesanity Stitched Mixed", + "Half-Half Cc Sy": "Shapesanity Half-Half Mixed", + "Checkered Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Sy": "Shapesanity Stitched Mixed", + "3-1 Cc Wb": "Shapesanity Stitched Mixed", + "Half-Half Cc Wb": "Shapesanity Half-Half Mixed", + "Checkered Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wb": "Shapesanity Stitched Mixed", + "3-1 Cc Wc": "Shapesanity Stitched Mixed", + "Half-Half Cc Wc": "Shapesanity Half-Half Mixed", + "Checkered Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wc": "Shapesanity Stitched Mixed", + "3-1 Cc Wg": "Shapesanity Stitched Mixed", + "Half-Half Cc Wg": "Shapesanity Half-Half Mixed", + "Checkered Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wg": "Shapesanity Stitched Mixed", + "3-1 Cc Wp": "Shapesanity Stitched Mixed", + "Half-Half Cc Wp": "Shapesanity Half-Half Mixed", + "Checkered Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wp": "Shapesanity Stitched Mixed", + "3-1 Cc Wr": "Shapesanity Stitched Mixed", + "Half-Half Cc Wr": "Shapesanity Half-Half Mixed", + "Checkered Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wr": "Shapesanity Stitched Mixed", + "3-1 Cc Wu": "Shapesanity Stitched Mixed", + "Half-Half Cc Wu": "Shapesanity Half-Half Mixed", + "Checkered Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wu": "Shapesanity Stitched Mixed", + "3-1 Cc Ww": "Shapesanity Stitched Mixed", + "Half-Half Cc Ww": "Shapesanity Half-Half Mixed", + "Checkered Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Ww": "Shapesanity Stitched Mixed", + "3-1 Cc Wy": "Shapesanity Stitched Mixed", + "Half-Half Cc Wy": "Shapesanity Half-Half Mixed", + "Checkered Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cc Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cc Wy": "Shapesanity Stitched Mixed", + "3-1 Cg Cb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cg Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Cb": "Shapesanity Stitched Painted", + "3-1 Cg Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cg Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Cc": "Shapesanity Stitched Mixed", + "3-1 Cg Cp": "Shapesanity Colorful Full Mixed", + "Half-Half Cg Cp": "Shapesanity Colorful Full Mixed", + "Checkered Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cg Cp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Cp": "Shapesanity Stitched Mixed", + "3-1 Cg Cr": "Shapesanity Colorful Full Painted", + "Half-Half Cg Cr": "Shapesanity Colorful Full Painted", + "Checkered Cg Cr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cg Cr": "Shapesanity Colorful Half Painted", + "Cornered Singles Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Cr": "Shapesanity Stitched Painted", + "3-1 Cg Cu": "Shapesanity Colorful Full Painted", + "Half-Half Cg Cu": "Shapesanity Colorful Full Painted", + "Checkered Cg Cu": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cg Cu": "Shapesanity Colorful Half Painted", + "Cornered Singles Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Cu": "Shapesanity Stitched Painted", + "3-1 Cg Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cg Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cg Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Cw": "Shapesanity Stitched Mixed", + "3-1 Cg Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cg Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cg Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cg Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Cy": "Shapesanity Stitched Mixed", + "3-1 Cg Rb": "Shapesanity Stitched Painted", + "Half-Half Cg Rb": "Shapesanity Half-Half Painted", + "Checkered Cg Rb": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Rb": "Shapesanity Stitched Painted", + "Cornered Singles Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Rb": "Shapesanity Stitched Painted", + "3-1 Cg Rc": "Shapesanity Stitched Mixed", + "Half-Half Cg Rc": "Shapesanity Half-Half Mixed", + "Checkered Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Rc": "Shapesanity Stitched Mixed", + "3-1 Cg Rg": "Shapesanity Stitched Painted", + "Half-Half Cg Rg": "Shapesanity Half-Half Painted", + "Checkered Cg Rg": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Rg": "Shapesanity Stitched Painted", + "Cornered Singles Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Rg": "Shapesanity Stitched Painted", + "3-1 Cg Rp": "Shapesanity Stitched Mixed", + "Half-Half Cg Rp": "Shapesanity Half-Half Mixed", + "Checkered Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Rp": "Shapesanity Stitched Mixed", + "3-1 Cg Rr": "Shapesanity Stitched Painted", + "Half-Half Cg Rr": "Shapesanity Half-Half Painted", + "Checkered Cg Rr": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Rr": "Shapesanity Stitched Painted", + "Cornered Singles Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Rr": "Shapesanity Stitched Painted", + "3-1 Cg Ru": "Shapesanity Stitched Painted", + "Half-Half Cg Ru": "Shapesanity Half-Half Painted", + "Checkered Cg Ru": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Ru": "Shapesanity Stitched Painted", + "Cornered Singles Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Ru": "Shapesanity Stitched Painted", + "3-1 Cg Rw": "Shapesanity Stitched Mixed", + "Half-Half Cg Rw": "Shapesanity Half-Half Mixed", + "Checkered Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Rw": "Shapesanity Stitched Mixed", + "3-1 Cg Ry": "Shapesanity Stitched Mixed", + "Half-Half Cg Ry": "Shapesanity Half-Half Mixed", + "Checkered Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Ry": "Shapesanity Stitched Mixed", + "3-1 Cg Sb": "Shapesanity Stitched Painted", + "Half-Half Cg Sb": "Shapesanity Half-Half Painted", + "Checkered Cg Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Sb": "Shapesanity Stitched Painted", + "Cornered Singles Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Sb": "Shapesanity Stitched Painted", + "3-1 Cg Sc": "Shapesanity Stitched Mixed", + "Half-Half Cg Sc": "Shapesanity Half-Half Mixed", + "Checkered Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Sc": "Shapesanity Stitched Mixed", + "3-1 Cg Sg": "Shapesanity Stitched Painted", + "Half-Half Cg Sg": "Shapesanity Half-Half Painted", + "Checkered Cg Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Sg": "Shapesanity Stitched Painted", + "Cornered Singles Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Sg": "Shapesanity Stitched Painted", + "3-1 Cg Sp": "Shapesanity Stitched Mixed", + "Half-Half Cg Sp": "Shapesanity Half-Half Mixed", + "Checkered Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Sp": "Shapesanity Stitched Mixed", + "3-1 Cg Sr": "Shapesanity Stitched Painted", + "Half-Half Cg Sr": "Shapesanity Half-Half Painted", + "Checkered Cg Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Sr": "Shapesanity Stitched Painted", + "Cornered Singles Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Sr": "Shapesanity Stitched Painted", + "3-1 Cg Su": "Shapesanity Stitched Painted", + "Half-Half Cg Su": "Shapesanity Half-Half Painted", + "Checkered Cg Su": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Su": "Shapesanity Stitched Painted", + "Cornered Singles Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Su": "Shapesanity Stitched Painted", + "3-1 Cg Sw": "Shapesanity Stitched Mixed", + "Half-Half Cg Sw": "Shapesanity Half-Half Mixed", + "Checkered Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Sw": "Shapesanity Stitched Mixed", + "3-1 Cg Sy": "Shapesanity Stitched Mixed", + "Half-Half Cg Sy": "Shapesanity Half-Half Mixed", + "Checkered Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Sy": "Shapesanity Stitched Mixed", + "3-1 Cg Wb": "Shapesanity Stitched Painted", + "Half-Half Cg Wb": "Shapesanity Half-Half Painted", + "Checkered Cg Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Wb": "Shapesanity Stitched Painted", + "Cornered Singles Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Wb": "Shapesanity Stitched Painted", + "3-1 Cg Wc": "Shapesanity Stitched Mixed", + "Half-Half Cg Wc": "Shapesanity Half-Half Mixed", + "Checkered Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Wc": "Shapesanity Stitched Mixed", + "3-1 Cg Wg": "Shapesanity Stitched Painted", + "Half-Half Cg Wg": "Shapesanity Half-Half Painted", + "Checkered Cg Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Wg": "Shapesanity Stitched Painted", + "Cornered Singles Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Wg": "Shapesanity Stitched Painted", + "3-1 Cg Wp": "Shapesanity Stitched Mixed", + "Half-Half Cg Wp": "Shapesanity Half-Half Mixed", + "Checkered Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Wp": "Shapesanity Stitched Mixed", + "3-1 Cg Wr": "Shapesanity Stitched Painted", + "Half-Half Cg Wr": "Shapesanity Half-Half Painted", + "Checkered Cg Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Wr": "Shapesanity Stitched Painted", + "Cornered Singles Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Wr": "Shapesanity Stitched Painted", + "3-1 Cg Wu": "Shapesanity Stitched Painted", + "Half-Half Cg Wu": "Shapesanity Half-Half Painted", + "Checkered Cg Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Cg Wu": "Shapesanity Stitched Painted", + "Cornered Singles Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cg Wu": "Shapesanity Stitched Painted", + "3-1 Cg Ww": "Shapesanity Stitched Mixed", + "Half-Half Cg Ww": "Shapesanity Half-Half Mixed", + "Checkered Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Ww": "Shapesanity Stitched Mixed", + "3-1 Cg Wy": "Shapesanity Stitched Mixed", + "Half-Half Cg Wy": "Shapesanity Half-Half Mixed", + "Checkered Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cg Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cg Wy": "Shapesanity Stitched Mixed", + "3-1 Cp Cb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cp Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cb": "Shapesanity Stitched Mixed", + "3-1 Cp Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cp Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cc": "Shapesanity Stitched Mixed", + "3-1 Cp Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cp Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cg": "Shapesanity Stitched Mixed", + "3-1 Cp Cr": "Shapesanity Colorful Full Mixed", + "Half-Half Cp Cr": "Shapesanity Colorful Full Mixed", + "Checkered Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cp Cr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cr": "Shapesanity Stitched Mixed", + "3-1 Cp Cu": "Shapesanity Colorful Full Mixed", + "Half-Half Cp Cu": "Shapesanity Colorful Full Mixed", + "Checkered Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cp Cu": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cu": "Shapesanity Stitched Mixed", + "3-1 Cp Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cp Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cp Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cw": "Shapesanity Stitched Mixed", + "3-1 Cp Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cp Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cp Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cp Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Cy": "Shapesanity Stitched Mixed", + "3-1 Cp Rb": "Shapesanity Stitched Mixed", + "Half-Half Cp Rb": "Shapesanity Half-Half Mixed", + "Checkered Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rb": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rb": "Shapesanity Stitched Mixed", + "3-1 Cp Rc": "Shapesanity Stitched Mixed", + "Half-Half Cp Rc": "Shapesanity Half-Half Mixed", + "Checkered Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rc": "Shapesanity Stitched Mixed", + "3-1 Cp Rg": "Shapesanity Stitched Mixed", + "Half-Half Cp Rg": "Shapesanity Half-Half Mixed", + "Checkered Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rg": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rg": "Shapesanity Stitched Mixed", + "3-1 Cp Rp": "Shapesanity Stitched Mixed", + "Half-Half Cp Rp": "Shapesanity Half-Half Mixed", + "Checkered Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rp": "Shapesanity Stitched Mixed", + "3-1 Cp Rr": "Shapesanity Stitched Mixed", + "Half-Half Cp Rr": "Shapesanity Half-Half Mixed", + "Checkered Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rr": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rr": "Shapesanity Stitched Mixed", + "3-1 Cp Ru": "Shapesanity Stitched Mixed", + "Half-Half Cp Ru": "Shapesanity Half-Half Mixed", + "Checkered Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Ru": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Ru": "Shapesanity Stitched Mixed", + "3-1 Cp Rw": "Shapesanity Stitched Mixed", + "Half-Half Cp Rw": "Shapesanity Half-Half Mixed", + "Checkered Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Rw": "Shapesanity Stitched Mixed", + "3-1 Cp Ry": "Shapesanity Stitched Mixed", + "Half-Half Cp Ry": "Shapesanity Half-Half Mixed", + "Checkered Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Ry": "Shapesanity Stitched Mixed", + "3-1 Cp Sb": "Shapesanity Stitched Mixed", + "Half-Half Cp Sb": "Shapesanity Half-Half Mixed", + "Checkered Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sb": "Shapesanity Stitched Mixed", + "3-1 Cp Sc": "Shapesanity Stitched Mixed", + "Half-Half Cp Sc": "Shapesanity Half-Half Mixed", + "Checkered Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sc": "Shapesanity Stitched Mixed", + "3-1 Cp Sg": "Shapesanity Stitched Mixed", + "Half-Half Cp Sg": "Shapesanity Half-Half Mixed", + "Checkered Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sg": "Shapesanity Stitched Mixed", + "3-1 Cp Sp": "Shapesanity Stitched Mixed", + "Half-Half Cp Sp": "Shapesanity Half-Half Mixed", + "Checkered Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sp": "Shapesanity Stitched Mixed", + "3-1 Cp Sr": "Shapesanity Stitched Mixed", + "Half-Half Cp Sr": "Shapesanity Half-Half Mixed", + "Checkered Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sr": "Shapesanity Stitched Mixed", + "3-1 Cp Su": "Shapesanity Stitched Mixed", + "Half-Half Cp Su": "Shapesanity Half-Half Mixed", + "Checkered Cp Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Su": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Su": "Shapesanity Stitched Mixed", + "3-1 Cp Sw": "Shapesanity Stitched Mixed", + "Half-Half Cp Sw": "Shapesanity Half-Half Mixed", + "Checkered Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sw": "Shapesanity Stitched Mixed", + "3-1 Cp Sy": "Shapesanity Stitched Mixed", + "Half-Half Cp Sy": "Shapesanity Half-Half Mixed", + "Checkered Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Sy": "Shapesanity Stitched Mixed", + "3-1 Cp Wb": "Shapesanity Stitched Mixed", + "Half-Half Cp Wb": "Shapesanity Half-Half Mixed", + "Checkered Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wb": "Shapesanity Stitched Mixed", + "3-1 Cp Wc": "Shapesanity Stitched Mixed", + "Half-Half Cp Wc": "Shapesanity Half-Half Mixed", + "Checkered Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wc": "Shapesanity Stitched Mixed", + "3-1 Cp Wg": "Shapesanity Stitched Mixed", + "Half-Half Cp Wg": "Shapesanity Half-Half Mixed", + "Checkered Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wg": "Shapesanity Stitched Mixed", + "3-1 Cp Wp": "Shapesanity Stitched Mixed", + "Half-Half Cp Wp": "Shapesanity Half-Half Mixed", + "Checkered Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wp": "Shapesanity Stitched Mixed", + "3-1 Cp Wr": "Shapesanity Stitched Mixed", + "Half-Half Cp Wr": "Shapesanity Half-Half Mixed", + "Checkered Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wr": "Shapesanity Stitched Mixed", + "3-1 Cp Wu": "Shapesanity Stitched Mixed", + "Half-Half Cp Wu": "Shapesanity Half-Half Mixed", + "Checkered Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wu": "Shapesanity Stitched Mixed", + "3-1 Cp Ww": "Shapesanity Stitched Mixed", + "Half-Half Cp Ww": "Shapesanity Half-Half Mixed", + "Checkered Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Ww": "Shapesanity Stitched Mixed", + "3-1 Cp Wy": "Shapesanity Stitched Mixed", + "Half-Half Cp Wy": "Shapesanity Half-Half Mixed", + "Checkered Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cp Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cp Wy": "Shapesanity Stitched Mixed", + "3-1 Cr Cb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cr Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Cb": "Shapesanity Stitched Painted", + "3-1 Cr Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cr Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Cc": "Shapesanity Stitched Mixed", + "3-1 Cr Cg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cr Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Cg": "Shapesanity Stitched Painted", + "3-1 Cr Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cr Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Cp": "Shapesanity Stitched Mixed", + "3-1 Cr Cu": "Shapesanity Colorful Full Painted", + "Half-Half Cr Cu": "Shapesanity Colorful Full Painted", + "Checkered Cr Cu": "Shapesanity Colorful Full Painted", + "Adjacent Singles Cr Cu": "Shapesanity Colorful Half Painted", + "Cornered Singles Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Cu": "Shapesanity Stitched Painted", + "3-1 Cr Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cr Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cr Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Cw": "Shapesanity Stitched Mixed", + "3-1 Cr Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cr Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cr Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cr Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Cy": "Shapesanity Stitched Mixed", + "3-1 Cr Rb": "Shapesanity Stitched Painted", + "Half-Half Cr Rb": "Shapesanity Half-Half Painted", + "Checkered Cr Rb": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Rb": "Shapesanity Stitched Painted", + "Cornered Singles Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Rb": "Shapesanity Stitched Painted", + "3-1 Cr Rc": "Shapesanity Stitched Mixed", + "Half-Half Cr Rc": "Shapesanity Half-Half Mixed", + "Checkered Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Rc": "Shapesanity Stitched Mixed", + "3-1 Cr Rg": "Shapesanity Stitched Painted", + "Half-Half Cr Rg": "Shapesanity Half-Half Painted", + "Checkered Cr Rg": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Rg": "Shapesanity Stitched Painted", + "Cornered Singles Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Rg": "Shapesanity Stitched Painted", + "3-1 Cr Rp": "Shapesanity Stitched Mixed", + "Half-Half Cr Rp": "Shapesanity Half-Half Mixed", + "Checkered Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Rp": "Shapesanity Stitched Mixed", + "3-1 Cr Rr": "Shapesanity Stitched Painted", + "Half-Half Cr Rr": "Shapesanity Half-Half Painted", + "Checkered Cr Rr": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Rr": "Shapesanity Stitched Painted", + "Cornered Singles Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Rr": "Shapesanity Stitched Painted", + "3-1 Cr Ru": "Shapesanity Stitched Painted", + "Half-Half Cr Ru": "Shapesanity Half-Half Painted", + "Checkered Cr Ru": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Ru": "Shapesanity Stitched Painted", + "Cornered Singles Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Ru": "Shapesanity Stitched Painted", + "3-1 Cr Rw": "Shapesanity Stitched Mixed", + "Half-Half Cr Rw": "Shapesanity Half-Half Mixed", + "Checkered Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Rw": "Shapesanity Stitched Mixed", + "3-1 Cr Ry": "Shapesanity Stitched Mixed", + "Half-Half Cr Ry": "Shapesanity Half-Half Mixed", + "Checkered Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Ry": "Shapesanity Stitched Mixed", + "3-1 Cr Sb": "Shapesanity Stitched Painted", + "Half-Half Cr Sb": "Shapesanity Half-Half Painted", + "Checkered Cr Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Sb": "Shapesanity Stitched Painted", + "Cornered Singles Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Sb": "Shapesanity Stitched Painted", + "3-1 Cr Sc": "Shapesanity Stitched Mixed", + "Half-Half Cr Sc": "Shapesanity Half-Half Mixed", + "Checkered Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Sc": "Shapesanity Stitched Mixed", + "3-1 Cr Sg": "Shapesanity Stitched Painted", + "Half-Half Cr Sg": "Shapesanity Half-Half Painted", + "Checkered Cr Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Sg": "Shapesanity Stitched Painted", + "Cornered Singles Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Sg": "Shapesanity Stitched Painted", + "3-1 Cr Sp": "Shapesanity Stitched Mixed", + "Half-Half Cr Sp": "Shapesanity Half-Half Mixed", + "Checkered Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Sp": "Shapesanity Stitched Mixed", + "3-1 Cr Sr": "Shapesanity Stitched Painted", + "Half-Half Cr Sr": "Shapesanity Half-Half Painted", + "Checkered Cr Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Sr": "Shapesanity Stitched Painted", + "Cornered Singles Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Sr": "Shapesanity Stitched Painted", + "3-1 Cr Su": "Shapesanity Stitched Painted", + "Half-Half Cr Su": "Shapesanity Half-Half Painted", + "Checkered Cr Su": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Su": "Shapesanity Stitched Painted", + "Cornered Singles Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Su": "Shapesanity Stitched Painted", + "3-1 Cr Sw": "Shapesanity Stitched Mixed", + "Half-Half Cr Sw": "Shapesanity Half-Half Mixed", + "Checkered Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Sw": "Shapesanity Stitched Mixed", + "3-1 Cr Sy": "Shapesanity Stitched Mixed", + "Half-Half Cr Sy": "Shapesanity Half-Half Mixed", + "Checkered Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Sy": "Shapesanity Stitched Mixed", + "3-1 Cr Wb": "Shapesanity Stitched Painted", + "Half-Half Cr Wb": "Shapesanity Half-Half Painted", + "Checkered Cr Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Wb": "Shapesanity Stitched Painted", + "Cornered Singles Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Wb": "Shapesanity Stitched Painted", + "3-1 Cr Wc": "Shapesanity Stitched Mixed", + "Half-Half Cr Wc": "Shapesanity Half-Half Mixed", + "Checkered Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Wc": "Shapesanity Stitched Mixed", + "3-1 Cr Wg": "Shapesanity Stitched Painted", + "Half-Half Cr Wg": "Shapesanity Half-Half Painted", + "Checkered Cr Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Wg": "Shapesanity Stitched Painted", + "Cornered Singles Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Wg": "Shapesanity Stitched Painted", + "3-1 Cr Wp": "Shapesanity Stitched Mixed", + "Half-Half Cr Wp": "Shapesanity Half-Half Mixed", + "Checkered Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Wp": "Shapesanity Stitched Mixed", + "3-1 Cr Wr": "Shapesanity Stitched Painted", + "Half-Half Cr Wr": "Shapesanity Half-Half Painted", + "Checkered Cr Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Wr": "Shapesanity Stitched Painted", + "Cornered Singles Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Wr": "Shapesanity Stitched Painted", + "3-1 Cr Wu": "Shapesanity Stitched Painted", + "Half-Half Cr Wu": "Shapesanity Half-Half Painted", + "Checkered Cr Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Cr Wu": "Shapesanity Stitched Painted", + "Cornered Singles Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Cr Wu": "Shapesanity Stitched Painted", + "3-1 Cr Ww": "Shapesanity Stitched Mixed", + "Half-Half Cr Ww": "Shapesanity Half-Half Mixed", + "Checkered Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Ww": "Shapesanity Stitched Mixed", + "3-1 Cr Wy": "Shapesanity Stitched Mixed", + "Half-Half Cr Wy": "Shapesanity Half-Half Mixed", + "Checkered Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cr Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cr Wy": "Shapesanity Stitched Mixed", + "3-1 Cu Cb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cu Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Cb": "Shapesanity Stitched Painted", + "3-1 Cu Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cu Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Cc": "Shapesanity Stitched Mixed", + "3-1 Cu Cg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cu Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Cg": "Shapesanity Stitched Painted", + "3-1 Cu Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cu Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Cp": "Shapesanity Stitched Mixed", + "3-1 Cu Cr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Cu Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Cr": "Shapesanity Stitched Painted", + "3-1 Cu Cw": "Shapesanity Colorful Full Mixed", + "Half-Half Cu Cw": "Shapesanity Colorful Full Mixed", + "Checkered Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cu Cw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Cw": "Shapesanity Stitched Mixed", + "3-1 Cu Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cu Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cu Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cu Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Cy": "Shapesanity Stitched Mixed", + "3-1 Cu Rb": "Shapesanity Stitched Painted", + "Half-Half Cu Rb": "Shapesanity Half-Half Painted", + "Checkered Cu Rb": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Rb": "Shapesanity Stitched Painted", + "Cornered Singles Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Rb": "Shapesanity Stitched Painted", + "3-1 Cu Rc": "Shapesanity Stitched Mixed", + "Half-Half Cu Rc": "Shapesanity Half-Half Mixed", + "Checkered Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Rc": "Shapesanity Stitched Mixed", + "3-1 Cu Rg": "Shapesanity Stitched Painted", + "Half-Half Cu Rg": "Shapesanity Half-Half Painted", + "Checkered Cu Rg": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Rg": "Shapesanity Stitched Painted", + "Cornered Singles Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Rg": "Shapesanity Stitched Painted", + "3-1 Cu Rp": "Shapesanity Stitched Mixed", + "Half-Half Cu Rp": "Shapesanity Half-Half Mixed", + "Checkered Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Rp": "Shapesanity Stitched Mixed", + "3-1 Cu Rr": "Shapesanity Stitched Painted", + "Half-Half Cu Rr": "Shapesanity Half-Half Painted", + "Checkered Cu Rr": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Rr": "Shapesanity Stitched Painted", + "Cornered Singles Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Rr": "Shapesanity Stitched Painted", + "3-1 Cu Ru": "Shapesanity Stitched Uncolored", + "Half-Half Cu Ru": "Shapesanity Half-Half Uncolored", + "Checkered Cu Ru": "Shapesanity Stitched Uncolored", + "Adjacent Singles Cu Ru": "Shapesanity Stitched Uncolored", + "Cornered Singles Cu Ru": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Cu Ru": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Cu Ru": "Shapesanity Stitched Uncolored", + "3-1 Cu Rw": "Shapesanity Stitched Mixed", + "Half-Half Cu Rw": "Shapesanity Half-Half Mixed", + "Checkered Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Rw": "Shapesanity Stitched Mixed", + "3-1 Cu Ry": "Shapesanity Stitched Mixed", + "Half-Half Cu Ry": "Shapesanity Half-Half Mixed", + "Checkered Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Ry": "Shapesanity Stitched Mixed", + "3-1 Cu Sb": "Shapesanity Stitched Painted", + "Half-Half Cu Sb": "Shapesanity Half-Half Painted", + "Checkered Cu Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Sb": "Shapesanity Stitched Painted", + "Cornered Singles Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Sb": "Shapesanity Stitched Painted", + "3-1 Cu Sc": "Shapesanity Stitched Mixed", + "Half-Half Cu Sc": "Shapesanity Half-Half Mixed", + "Checkered Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Sc": "Shapesanity Stitched Mixed", + "3-1 Cu Sg": "Shapesanity Stitched Painted", + "Half-Half Cu Sg": "Shapesanity Half-Half Painted", + "Checkered Cu Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Sg": "Shapesanity Stitched Painted", + "Cornered Singles Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Sg": "Shapesanity Stitched Painted", + "3-1 Cu Sp": "Shapesanity Stitched Mixed", + "Half-Half Cu Sp": "Shapesanity Half-Half Mixed", + "Checkered Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Sp": "Shapesanity Stitched Mixed", + "3-1 Cu Sr": "Shapesanity Stitched Painted", + "Half-Half Cu Sr": "Shapesanity Half-Half Painted", + "Checkered Cu Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Sr": "Shapesanity Stitched Painted", + "Cornered Singles Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Sr": "Shapesanity Stitched Painted", + "3-1 Cu Su": "Shapesanity Stitched Uncolored", + "Half-Half Cu Su": "Shapesanity Half-Half Uncolored", + "Checkered Cu Su": "Shapesanity Stitched Uncolored", + "Adjacent Singles Cu Su": "Shapesanity Stitched Uncolored", + "Cornered Singles Cu Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Cu Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Cu Su": "Shapesanity Stitched Uncolored", + "3-1 Cu Sw": "Shapesanity Stitched Mixed", + "Half-Half Cu Sw": "Shapesanity Half-Half Mixed", + "Checkered Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Sw": "Shapesanity Stitched Mixed", + "3-1 Cu Sy": "Shapesanity Stitched Mixed", + "Half-Half Cu Sy": "Shapesanity Half-Half Mixed", + "Checkered Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Sy": "Shapesanity Stitched Mixed", + "3-1 Cu Wb": "Shapesanity Stitched Painted", + "Half-Half Cu Wb": "Shapesanity Half-Half Painted", + "Checkered Cu Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Wb": "Shapesanity Stitched Painted", + "Cornered Singles Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Wb": "Shapesanity Stitched Painted", + "3-1 Cu Wc": "Shapesanity Stitched Mixed", + "Half-Half Cu Wc": "Shapesanity Half-Half Mixed", + "Checkered Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Wc": "Shapesanity Stitched Mixed", + "3-1 Cu Wg": "Shapesanity Stitched Painted", + "Half-Half Cu Wg": "Shapesanity Half-Half Painted", + "Checkered Cu Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Wg": "Shapesanity Stitched Painted", + "Cornered Singles Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Wg": "Shapesanity Stitched Painted", + "3-1 Cu Wp": "Shapesanity Stitched Mixed", + "Half-Half Cu Wp": "Shapesanity Half-Half Mixed", + "Checkered Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Wp": "Shapesanity Stitched Mixed", + "3-1 Cu Wr": "Shapesanity Stitched Painted", + "Half-Half Cu Wr": "Shapesanity Half-Half Painted", + "Checkered Cu Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Cu Wr": "Shapesanity Stitched Painted", + "Cornered Singles Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Cu Wr": "Shapesanity Stitched Painted", + "3-1 Cu Wu": "Shapesanity Stitched Uncolored", + "Half-Half Cu Wu": "Shapesanity Half-Half Uncolored", + "Checkered Cu Wu": "Shapesanity Stitched Uncolored", + "Adjacent Singles Cu Wu": "Shapesanity Stitched Uncolored", + "Cornered Singles Cu Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Cu Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Cu Wu": "Shapesanity Stitched Uncolored", + "3-1 Cu Ww": "Shapesanity Stitched Mixed", + "Half-Half Cu Ww": "Shapesanity Half-Half Mixed", + "Checkered Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Ww": "Shapesanity Stitched Mixed", + "3-1 Cu Wy": "Shapesanity Stitched Mixed", + "Half-Half Cu Wy": "Shapesanity Half-Half Mixed", + "Checkered Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cu Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cu Wy": "Shapesanity Stitched Mixed", + "3-1 Cw Cb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cb": "Shapesanity Stitched Mixed", + "3-1 Cw Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cc": "Shapesanity Stitched Mixed", + "3-1 Cw Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cg": "Shapesanity Stitched Mixed", + "3-1 Cw Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cp": "Shapesanity Stitched Mixed", + "3-1 Cw Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cr": "Shapesanity Stitched Mixed", + "3-1 Cw Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cw Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cu": "Shapesanity Stitched Mixed", + "3-1 Cw Cy": "Shapesanity Colorful Full Mixed", + "Half-Half Cw Cy": "Shapesanity Colorful Full Mixed", + "Checkered Cw Cy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Cw Cy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Cy": "Shapesanity Stitched Mixed", + "3-1 Cw Rb": "Shapesanity Stitched Mixed", + "Half-Half Cw Rb": "Shapesanity Half-Half Mixed", + "Checkered Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rb": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rb": "Shapesanity Stitched Mixed", + "3-1 Cw Rc": "Shapesanity Stitched Mixed", + "Half-Half Cw Rc": "Shapesanity Half-Half Mixed", + "Checkered Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rc": "Shapesanity Stitched Mixed", + "3-1 Cw Rg": "Shapesanity Stitched Mixed", + "Half-Half Cw Rg": "Shapesanity Half-Half Mixed", + "Checkered Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rg": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rg": "Shapesanity Stitched Mixed", + "3-1 Cw Rp": "Shapesanity Stitched Mixed", + "Half-Half Cw Rp": "Shapesanity Half-Half Mixed", + "Checkered Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rp": "Shapesanity Stitched Mixed", + "3-1 Cw Rr": "Shapesanity Stitched Mixed", + "Half-Half Cw Rr": "Shapesanity Half-Half Mixed", + "Checkered Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rr": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rr": "Shapesanity Stitched Mixed", + "3-1 Cw Ru": "Shapesanity Stitched Mixed", + "Half-Half Cw Ru": "Shapesanity Half-Half Mixed", + "Checkered Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Ru": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Ru": "Shapesanity Stitched Mixed", + "3-1 Cw Rw": "Shapesanity Stitched Mixed", + "Half-Half Cw Rw": "Shapesanity Half-Half Mixed", + "Checkered Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Rw": "Shapesanity Stitched Mixed", + "3-1 Cw Ry": "Shapesanity Stitched Mixed", + "Half-Half Cw Ry": "Shapesanity Half-Half Mixed", + "Checkered Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Ry": "Shapesanity Stitched Mixed", + "3-1 Cw Sb": "Shapesanity Stitched Mixed", + "Half-Half Cw Sb": "Shapesanity Half-Half Mixed", + "Checkered Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sb": "Shapesanity Stitched Mixed", + "3-1 Cw Sc": "Shapesanity Stitched Mixed", + "Half-Half Cw Sc": "Shapesanity Half-Half Mixed", + "Checkered Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sc": "Shapesanity Stitched Mixed", + "3-1 Cw Sg": "Shapesanity Stitched Mixed", + "Half-Half Cw Sg": "Shapesanity Half-Half Mixed", + "Checkered Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sg": "Shapesanity Stitched Mixed", + "3-1 Cw Sp": "Shapesanity Stitched Mixed", + "Half-Half Cw Sp": "Shapesanity Half-Half Mixed", + "Checkered Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sp": "Shapesanity Stitched Mixed", + "3-1 Cw Sr": "Shapesanity Stitched Mixed", + "Half-Half Cw Sr": "Shapesanity Half-Half Mixed", + "Checkered Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sr": "Shapesanity Stitched Mixed", + "3-1 Cw Su": "Shapesanity Stitched Mixed", + "Half-Half Cw Su": "Shapesanity Half-Half Mixed", + "Checkered Cw Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Su": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Su": "Shapesanity Stitched Mixed", + "3-1 Cw Sw": "Shapesanity Stitched Mixed", + "Half-Half Cw Sw": "Shapesanity Half-Half Mixed", + "Checkered Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sw": "Shapesanity Stitched Mixed", + "3-1 Cw Sy": "Shapesanity Stitched Mixed", + "Half-Half Cw Sy": "Shapesanity Half-Half Mixed", + "Checkered Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Sy": "Shapesanity Stitched Mixed", + "3-1 Cw Wb": "Shapesanity Stitched Mixed", + "Half-Half Cw Wb": "Shapesanity Half-Half Mixed", + "Checkered Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wb": "Shapesanity Stitched Mixed", + "3-1 Cw Wc": "Shapesanity Stitched Mixed", + "Half-Half Cw Wc": "Shapesanity Half-Half Mixed", + "Checkered Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wc": "Shapesanity Stitched Mixed", + "3-1 Cw Wg": "Shapesanity Stitched Mixed", + "Half-Half Cw Wg": "Shapesanity Half-Half Mixed", + "Checkered Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wg": "Shapesanity Stitched Mixed", + "3-1 Cw Wp": "Shapesanity Stitched Mixed", + "Half-Half Cw Wp": "Shapesanity Half-Half Mixed", + "Checkered Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wp": "Shapesanity Stitched Mixed", + "3-1 Cw Wr": "Shapesanity Stitched Mixed", + "Half-Half Cw Wr": "Shapesanity Half-Half Mixed", + "Checkered Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wr": "Shapesanity Stitched Mixed", + "3-1 Cw Wu": "Shapesanity Stitched Mixed", + "Half-Half Cw Wu": "Shapesanity Half-Half Mixed", + "Checkered Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wu": "Shapesanity Stitched Mixed", + "3-1 Cw Ww": "Shapesanity Stitched Mixed", + "Half-Half Cw Ww": "Shapesanity Half-Half Mixed", + "Checkered Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Ww": "Shapesanity Stitched Mixed", + "3-1 Cw Wy": "Shapesanity Stitched Mixed", + "Half-Half Cw Wy": "Shapesanity Half-Half Mixed", + "Checkered Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cw Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cw Wy": "Shapesanity Stitched Mixed", + "3-1 Cy Cb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cb": "Shapesanity Stitched Mixed", + "3-1 Cy Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cc": "Shapesanity Stitched Mixed", + "3-1 Cy Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cg": "Shapesanity Stitched Mixed", + "3-1 Cy Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cp": "Shapesanity Stitched Mixed", + "3-1 Cy Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cr": "Shapesanity Stitched Mixed", + "3-1 Cy Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cu": "Shapesanity Stitched Mixed", + "3-1 Cy Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Cy Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Cw": "Shapesanity Stitched Mixed", + "3-1 Cy Rb": "Shapesanity Stitched Mixed", + "Half-Half Cy Rb": "Shapesanity Half-Half Mixed", + "Checkered Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rb": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rb": "Shapesanity Stitched Mixed", + "3-1 Cy Rc": "Shapesanity Stitched Mixed", + "Half-Half Cy Rc": "Shapesanity Half-Half Mixed", + "Checkered Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rc": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rc": "Shapesanity Stitched Mixed", + "3-1 Cy Rg": "Shapesanity Stitched Mixed", + "Half-Half Cy Rg": "Shapesanity Half-Half Mixed", + "Checkered Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rg": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rg": "Shapesanity Stitched Mixed", + "3-1 Cy Rp": "Shapesanity Stitched Mixed", + "Half-Half Cy Rp": "Shapesanity Half-Half Mixed", + "Checkered Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rp": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rp": "Shapesanity Stitched Mixed", + "3-1 Cy Rr": "Shapesanity Stitched Mixed", + "Half-Half Cy Rr": "Shapesanity Half-Half Mixed", + "Checkered Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rr": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rr": "Shapesanity Stitched Mixed", + "3-1 Cy Ru": "Shapesanity Stitched Mixed", + "Half-Half Cy Ru": "Shapesanity Half-Half Mixed", + "Checkered Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Ru": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Ru": "Shapesanity Stitched Mixed", + "3-1 Cy Rw": "Shapesanity Stitched Mixed", + "Half-Half Cy Rw": "Shapesanity Half-Half Mixed", + "Checkered Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Rw": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Rw": "Shapesanity Stitched Mixed", + "3-1 Cy Ry": "Shapesanity Stitched Mixed", + "Half-Half Cy Ry": "Shapesanity Half-Half Mixed", + "Checkered Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Ry": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Ry": "Shapesanity Stitched Mixed", + "3-1 Cy Sb": "Shapesanity Stitched Mixed", + "Half-Half Cy Sb": "Shapesanity Half-Half Mixed", + "Checkered Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sb": "Shapesanity Stitched Mixed", + "3-1 Cy Sc": "Shapesanity Stitched Mixed", + "Half-Half Cy Sc": "Shapesanity Half-Half Mixed", + "Checkered Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sc": "Shapesanity Stitched Mixed", + "3-1 Cy Sg": "Shapesanity Stitched Mixed", + "Half-Half Cy Sg": "Shapesanity Half-Half Mixed", + "Checkered Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sg": "Shapesanity Stitched Mixed", + "3-1 Cy Sp": "Shapesanity Stitched Mixed", + "Half-Half Cy Sp": "Shapesanity Half-Half Mixed", + "Checkered Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sp": "Shapesanity Stitched Mixed", + "3-1 Cy Sr": "Shapesanity Stitched Mixed", + "Half-Half Cy Sr": "Shapesanity Half-Half Mixed", + "Checkered Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sr": "Shapesanity Stitched Mixed", + "3-1 Cy Su": "Shapesanity Stitched Mixed", + "Half-Half Cy Su": "Shapesanity Half-Half Mixed", + "Checkered Cy Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Su": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Su": "Shapesanity Stitched Mixed", + "3-1 Cy Sw": "Shapesanity Stitched Mixed", + "Half-Half Cy Sw": "Shapesanity Half-Half Mixed", + "Checkered Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sw": "Shapesanity Stitched Mixed", + "3-1 Cy Sy": "Shapesanity Stitched Mixed", + "Half-Half Cy Sy": "Shapesanity Half-Half Mixed", + "Checkered Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Sy": "Shapesanity Stitched Mixed", + "3-1 Cy Wb": "Shapesanity Stitched Mixed", + "Half-Half Cy Wb": "Shapesanity Half-Half Mixed", + "Checkered Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wb": "Shapesanity Stitched Mixed", + "3-1 Cy Wc": "Shapesanity Stitched Mixed", + "Half-Half Cy Wc": "Shapesanity Half-Half Mixed", + "Checkered Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wc": "Shapesanity Stitched Mixed", + "3-1 Cy Wg": "Shapesanity Stitched Mixed", + "Half-Half Cy Wg": "Shapesanity Half-Half Mixed", + "Checkered Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wg": "Shapesanity Stitched Mixed", + "3-1 Cy Wp": "Shapesanity Stitched Mixed", + "Half-Half Cy Wp": "Shapesanity Half-Half Mixed", + "Checkered Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wp": "Shapesanity Stitched Mixed", + "3-1 Cy Wr": "Shapesanity Stitched Mixed", + "Half-Half Cy Wr": "Shapesanity Half-Half Mixed", + "Checkered Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wr": "Shapesanity Stitched Mixed", + "3-1 Cy Wu": "Shapesanity Stitched Mixed", + "Half-Half Cy Wu": "Shapesanity Half-Half Mixed", + "Checkered Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wu": "Shapesanity Stitched Mixed", + "3-1 Cy Ww": "Shapesanity Stitched Mixed", + "Half-Half Cy Ww": "Shapesanity Half-Half Mixed", + "Checkered Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Ww": "Shapesanity Stitched Mixed", + "3-1 Cy Wy": "Shapesanity Stitched Mixed", + "Half-Half Cy Wy": "Shapesanity Half-Half Mixed", + "Checkered Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Cy Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Cy Wy": "Shapesanity Stitched Mixed", + "3-1 Rb Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Cb": "Shapesanity Stitched Painted", + "3-1 Rb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Cc": "Shapesanity Stitched Mixed", + "3-1 Rb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Cg": "Shapesanity Stitched Painted", + "3-1 Rb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Cp": "Shapesanity Stitched Mixed", + "3-1 Rb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Cr": "Shapesanity Stitched Painted", + "3-1 Rb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Cu": "Shapesanity Stitched Painted", + "3-1 Rb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Cw": "Shapesanity Stitched Mixed", + "3-1 Rb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Cy": "Shapesanity Stitched Mixed", + "3-1 Rb Rc": "Shapesanity Colorful Full Mixed", + "Half-Half Rb Rc": "Shapesanity Colorful Full Mixed", + "Checkered Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rb Rc": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Rc": "Shapesanity Stitched Mixed", + "3-1 Rb Rg": "Shapesanity Colorful Full Painted", + "Half-Half Rb Rg": "Shapesanity Colorful Full Painted", + "Checkered Rb Rg": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rb Rg": "Shapesanity Colorful Half Painted", + "Cornered Singles Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Rg": "Shapesanity Stitched Painted", + "3-1 Rb Rp": "Shapesanity Colorful Full Mixed", + "Half-Half Rb Rp": "Shapesanity Colorful Full Mixed", + "Checkered Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rb Rp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Rp": "Shapesanity Stitched Mixed", + "3-1 Rb Rr": "Shapesanity Colorful Full Painted", + "Half-Half Rb Rr": "Shapesanity Colorful Full Painted", + "Checkered Rb Rr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rb Rr": "Shapesanity Colorful Half Painted", + "Cornered Singles Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Rr": "Shapesanity Stitched Painted", + "3-1 Rb Ru": "Shapesanity Colorful Full Painted", + "Half-Half Rb Ru": "Shapesanity Colorful Full Painted", + "Checkered Rb Ru": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rb Ru": "Shapesanity Colorful Half Painted", + "Cornered Singles Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Ru": "Shapesanity Stitched Painted", + "3-1 Rb Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Rb Rw": "Shapesanity Colorful Full Mixed", + "Checkered Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rb Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Rw": "Shapesanity Stitched Mixed", + "3-1 Rb Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rb Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rb Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Ry": "Shapesanity Stitched Mixed", + "3-1 Rb Sb": "Shapesanity Stitched Painted", + "Half-Half Rb Sb": "Shapesanity Half-Half Painted", + "Checkered Rb Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Sb": "Shapesanity Stitched Painted", + "Cornered Singles Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Sb": "Shapesanity Stitched Painted", + "3-1 Rb Sc": "Shapesanity Stitched Mixed", + "Half-Half Rb Sc": "Shapesanity Half-Half Mixed", + "Checkered Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Sc": "Shapesanity Stitched Mixed", + "3-1 Rb Sg": "Shapesanity Stitched Painted", + "Half-Half Rb Sg": "Shapesanity Half-Half Painted", + "Checkered Rb Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Sg": "Shapesanity Stitched Painted", + "Cornered Singles Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Sg": "Shapesanity Stitched Painted", + "3-1 Rb Sp": "Shapesanity Stitched Mixed", + "Half-Half Rb Sp": "Shapesanity Half-Half Mixed", + "Checkered Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Sp": "Shapesanity Stitched Mixed", + "3-1 Rb Sr": "Shapesanity Stitched Painted", + "Half-Half Rb Sr": "Shapesanity Half-Half Painted", + "Checkered Rb Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Sr": "Shapesanity Stitched Painted", + "Cornered Singles Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Sr": "Shapesanity Stitched Painted", + "3-1 Rb Su": "Shapesanity Stitched Painted", + "Half-Half Rb Su": "Shapesanity Half-Half Painted", + "Checkered Rb Su": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Su": "Shapesanity Stitched Painted", + "Cornered Singles Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Su": "Shapesanity Stitched Painted", + "3-1 Rb Sw": "Shapesanity Stitched Mixed", + "Half-Half Rb Sw": "Shapesanity Half-Half Mixed", + "Checkered Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Sw": "Shapesanity Stitched Mixed", + "3-1 Rb Sy": "Shapesanity Stitched Mixed", + "Half-Half Rb Sy": "Shapesanity Half-Half Mixed", + "Checkered Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Sy": "Shapesanity Stitched Mixed", + "3-1 Rb Wb": "Shapesanity Stitched Painted", + "Half-Half Rb Wb": "Shapesanity Half-Half Painted", + "Checkered Rb Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Wb": "Shapesanity Stitched Painted", + "Cornered Singles Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Wb": "Shapesanity Stitched Painted", + "3-1 Rb Wc": "Shapesanity Stitched Mixed", + "Half-Half Rb Wc": "Shapesanity Half-Half Mixed", + "Checkered Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Wc": "Shapesanity Stitched Mixed", + "3-1 Rb Wg": "Shapesanity Stitched Painted", + "Half-Half Rb Wg": "Shapesanity Half-Half Painted", + "Checkered Rb Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Wg": "Shapesanity Stitched Painted", + "Cornered Singles Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Wg": "Shapesanity Stitched Painted", + "3-1 Rb Wp": "Shapesanity Stitched Mixed", + "Half-Half Rb Wp": "Shapesanity Half-Half Mixed", + "Checkered Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Wp": "Shapesanity Stitched Mixed", + "3-1 Rb Wr": "Shapesanity Stitched Painted", + "Half-Half Rb Wr": "Shapesanity Half-Half Painted", + "Checkered Rb Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Wr": "Shapesanity Stitched Painted", + "Cornered Singles Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Wr": "Shapesanity Stitched Painted", + "3-1 Rb Wu": "Shapesanity Stitched Painted", + "Half-Half Rb Wu": "Shapesanity Half-Half Painted", + "Checkered Rb Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Rb Wu": "Shapesanity Stitched Painted", + "Cornered Singles Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rb Wu": "Shapesanity Stitched Painted", + "3-1 Rb Ww": "Shapesanity Stitched Mixed", + "Half-Half Rb Ww": "Shapesanity Half-Half Mixed", + "Checkered Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Ww": "Shapesanity Stitched Mixed", + "3-1 Rb Wy": "Shapesanity Stitched Mixed", + "Half-Half Rb Wy": "Shapesanity Half-Half Mixed", + "Checkered Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rb Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rb Wy": "Shapesanity Stitched Mixed", + "3-1 Rc Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cb": "Shapesanity Stitched Mixed", + "3-1 Rc Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cc": "Shapesanity Stitched Mixed", + "3-1 Rc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cg": "Shapesanity Stitched Mixed", + "3-1 Rc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cp": "Shapesanity Stitched Mixed", + "3-1 Rc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cr": "Shapesanity Stitched Mixed", + "3-1 Rc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cu": "Shapesanity Stitched Mixed", + "3-1 Rc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cw": "Shapesanity Stitched Mixed", + "3-1 Rc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Cy": "Shapesanity Stitched Mixed", + "3-1 Rc Rb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Rb": "Shapesanity Stitched Mixed", + "3-1 Rc Rg": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Rg": "Shapesanity Colorful Full Mixed", + "Checkered Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Rg": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Rg": "Shapesanity Stitched Mixed", + "3-1 Rc Rp": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Rp": "Shapesanity Colorful Full Mixed", + "Checkered Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Rp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Rp": "Shapesanity Stitched Mixed", + "3-1 Rc Rr": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Rr": "Shapesanity Colorful Full Mixed", + "Checkered Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Rr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Rr": "Shapesanity Stitched Mixed", + "3-1 Rc Ru": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Ru": "Shapesanity Colorful Full Mixed", + "Checkered Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Ru": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Ru": "Shapesanity Stitched Mixed", + "3-1 Rc Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Rw": "Shapesanity Colorful Full Mixed", + "Checkered Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Rw": "Shapesanity Stitched Mixed", + "3-1 Rc Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rc Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rc Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Ry": "Shapesanity Stitched Mixed", + "3-1 Rc Sb": "Shapesanity Stitched Mixed", + "Half-Half Rc Sb": "Shapesanity Half-Half Mixed", + "Checkered Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sb": "Shapesanity Stitched Mixed", + "3-1 Rc Sc": "Shapesanity Stitched Mixed", + "Half-Half Rc Sc": "Shapesanity Half-Half Mixed", + "Checkered Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sc": "Shapesanity Stitched Mixed", + "3-1 Rc Sg": "Shapesanity Stitched Mixed", + "Half-Half Rc Sg": "Shapesanity Half-Half Mixed", + "Checkered Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sg": "Shapesanity Stitched Mixed", + "3-1 Rc Sp": "Shapesanity Stitched Mixed", + "Half-Half Rc Sp": "Shapesanity Half-Half Mixed", + "Checkered Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sp": "Shapesanity Stitched Mixed", + "3-1 Rc Sr": "Shapesanity Stitched Mixed", + "Half-Half Rc Sr": "Shapesanity Half-Half Mixed", + "Checkered Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sr": "Shapesanity Stitched Mixed", + "3-1 Rc Su": "Shapesanity Stitched Mixed", + "Half-Half Rc Su": "Shapesanity Half-Half Mixed", + "Checkered Rc Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Su": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Su": "Shapesanity Stitched Mixed", + "3-1 Rc Sw": "Shapesanity Stitched Mixed", + "Half-Half Rc Sw": "Shapesanity Half-Half Mixed", + "Checkered Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sw": "Shapesanity Stitched Mixed", + "3-1 Rc Sy": "Shapesanity Stitched Mixed", + "Half-Half Rc Sy": "Shapesanity Half-Half Mixed", + "Checkered Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Sy": "Shapesanity Stitched Mixed", + "3-1 Rc Wb": "Shapesanity Stitched Mixed", + "Half-Half Rc Wb": "Shapesanity Half-Half Mixed", + "Checkered Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wb": "Shapesanity Stitched Mixed", + "3-1 Rc Wc": "Shapesanity Stitched Mixed", + "Half-Half Rc Wc": "Shapesanity Half-Half Mixed", + "Checkered Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wc": "Shapesanity Stitched Mixed", + "3-1 Rc Wg": "Shapesanity Stitched Mixed", + "Half-Half Rc Wg": "Shapesanity Half-Half Mixed", + "Checkered Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wg": "Shapesanity Stitched Mixed", + "3-1 Rc Wp": "Shapesanity Stitched Mixed", + "Half-Half Rc Wp": "Shapesanity Half-Half Mixed", + "Checkered Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wp": "Shapesanity Stitched Mixed", + "3-1 Rc Wr": "Shapesanity Stitched Mixed", + "Half-Half Rc Wr": "Shapesanity Half-Half Mixed", + "Checkered Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wr": "Shapesanity Stitched Mixed", + "3-1 Rc Wu": "Shapesanity Stitched Mixed", + "Half-Half Rc Wu": "Shapesanity Half-Half Mixed", + "Checkered Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wu": "Shapesanity Stitched Mixed", + "3-1 Rc Ww": "Shapesanity Stitched Mixed", + "Half-Half Rc Ww": "Shapesanity Half-Half Mixed", + "Checkered Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Ww": "Shapesanity Stitched Mixed", + "3-1 Rc Wy": "Shapesanity Stitched Mixed", + "Half-Half Rc Wy": "Shapesanity Half-Half Mixed", + "Checkered Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rc Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rc Wy": "Shapesanity Stitched Mixed", + "3-1 Rg Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Cb": "Shapesanity Stitched Painted", + "3-1 Rg Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Cc": "Shapesanity Stitched Mixed", + "3-1 Rg Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Cg": "Shapesanity Stitched Painted", + "3-1 Rg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Cp": "Shapesanity Stitched Mixed", + "3-1 Rg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Cr": "Shapesanity Stitched Painted", + "3-1 Rg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Cu": "Shapesanity Stitched Painted", + "3-1 Rg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Cw": "Shapesanity Stitched Mixed", + "3-1 Rg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Cy": "Shapesanity Stitched Mixed", + "3-1 Rg Rb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Rg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Rb": "Shapesanity Stitched Painted", + "3-1 Rg Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Rc": "Shapesanity Stitched Mixed", + "3-1 Rg Rp": "Shapesanity Colorful Full Mixed", + "Half-Half Rg Rp": "Shapesanity Colorful Full Mixed", + "Checkered Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rg Rp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Rp": "Shapesanity Stitched Mixed", + "3-1 Rg Rr": "Shapesanity Colorful Full Painted", + "Half-Half Rg Rr": "Shapesanity Colorful Full Painted", + "Checkered Rg Rr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rg Rr": "Shapesanity Colorful Half Painted", + "Cornered Singles Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Rr": "Shapesanity Stitched Painted", + "3-1 Rg Ru": "Shapesanity Colorful Full Painted", + "Half-Half Rg Ru": "Shapesanity Colorful Full Painted", + "Checkered Rg Ru": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rg Ru": "Shapesanity Colorful Half Painted", + "Cornered Singles Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Ru": "Shapesanity Stitched Painted", + "3-1 Rg Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Rg Rw": "Shapesanity Colorful Full Mixed", + "Checkered Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rg Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Rw": "Shapesanity Stitched Mixed", + "3-1 Rg Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rg Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rg Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rg Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Ry": "Shapesanity Stitched Mixed", + "3-1 Rg Sb": "Shapesanity Stitched Painted", + "Half-Half Rg Sb": "Shapesanity Half-Half Painted", + "Checkered Rg Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Sb": "Shapesanity Stitched Painted", + "Cornered Singles Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Sb": "Shapesanity Stitched Painted", + "3-1 Rg Sc": "Shapesanity Stitched Mixed", + "Half-Half Rg Sc": "Shapesanity Half-Half Mixed", + "Checkered Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Sc": "Shapesanity Stitched Mixed", + "3-1 Rg Sg": "Shapesanity Stitched Painted", + "Half-Half Rg Sg": "Shapesanity Half-Half Painted", + "Checkered Rg Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Sg": "Shapesanity Stitched Painted", + "Cornered Singles Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Sg": "Shapesanity Stitched Painted", + "3-1 Rg Sp": "Shapesanity Stitched Mixed", + "Half-Half Rg Sp": "Shapesanity Half-Half Mixed", + "Checkered Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Sp": "Shapesanity Stitched Mixed", + "3-1 Rg Sr": "Shapesanity Stitched Painted", + "Half-Half Rg Sr": "Shapesanity Half-Half Painted", + "Checkered Rg Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Sr": "Shapesanity Stitched Painted", + "Cornered Singles Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Sr": "Shapesanity Stitched Painted", + "3-1 Rg Su": "Shapesanity Stitched Painted", + "Half-Half Rg Su": "Shapesanity Half-Half Painted", + "Checkered Rg Su": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Su": "Shapesanity Stitched Painted", + "Cornered Singles Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Su": "Shapesanity Stitched Painted", + "3-1 Rg Sw": "Shapesanity Stitched Mixed", + "Half-Half Rg Sw": "Shapesanity Half-Half Mixed", + "Checkered Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Sw": "Shapesanity Stitched Mixed", + "3-1 Rg Sy": "Shapesanity Stitched Mixed", + "Half-Half Rg Sy": "Shapesanity Half-Half Mixed", + "Checkered Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Sy": "Shapesanity Stitched Mixed", + "3-1 Rg Wb": "Shapesanity Stitched Painted", + "Half-Half Rg Wb": "Shapesanity Half-Half Painted", + "Checkered Rg Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Wb": "Shapesanity Stitched Painted", + "Cornered Singles Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Wb": "Shapesanity Stitched Painted", + "3-1 Rg Wc": "Shapesanity Stitched Mixed", + "Half-Half Rg Wc": "Shapesanity Half-Half Mixed", + "Checkered Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Wc": "Shapesanity Stitched Mixed", + "3-1 Rg Wg": "Shapesanity Stitched Painted", + "Half-Half Rg Wg": "Shapesanity Half-Half Painted", + "Checkered Rg Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Wg": "Shapesanity Stitched Painted", + "Cornered Singles Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Wg": "Shapesanity Stitched Painted", + "3-1 Rg Wp": "Shapesanity Stitched Mixed", + "Half-Half Rg Wp": "Shapesanity Half-Half Mixed", + "Checkered Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Wp": "Shapesanity Stitched Mixed", + "3-1 Rg Wr": "Shapesanity Stitched Painted", + "Half-Half Rg Wr": "Shapesanity Half-Half Painted", + "Checkered Rg Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Wr": "Shapesanity Stitched Painted", + "Cornered Singles Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Wr": "Shapesanity Stitched Painted", + "3-1 Rg Wu": "Shapesanity Stitched Painted", + "Half-Half Rg Wu": "Shapesanity Half-Half Painted", + "Checkered Rg Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Rg Wu": "Shapesanity Stitched Painted", + "Cornered Singles Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rg Wu": "Shapesanity Stitched Painted", + "3-1 Rg Ww": "Shapesanity Stitched Mixed", + "Half-Half Rg Ww": "Shapesanity Half-Half Mixed", + "Checkered Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Ww": "Shapesanity Stitched Mixed", + "3-1 Rg Wy": "Shapesanity Stitched Mixed", + "Half-Half Rg Wy": "Shapesanity Half-Half Mixed", + "Checkered Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rg Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rg Wy": "Shapesanity Stitched Mixed", + "3-1 Rp Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cb": "Shapesanity Stitched Mixed", + "3-1 Rp Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cc": "Shapesanity Stitched Mixed", + "3-1 Rp Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cg": "Shapesanity Stitched Mixed", + "3-1 Rp Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cp": "Shapesanity Stitched Mixed", + "3-1 Rp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cr": "Shapesanity Stitched Mixed", + "3-1 Rp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cu": "Shapesanity Stitched Mixed", + "3-1 Rp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cw": "Shapesanity Stitched Mixed", + "3-1 Rp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Cy": "Shapesanity Stitched Mixed", + "3-1 Rp Rb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Rb": "Shapesanity Stitched Mixed", + "3-1 Rp Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Rc": "Shapesanity Stitched Mixed", + "3-1 Rp Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Rg": "Shapesanity Stitched Mixed", + "3-1 Rp Rr": "Shapesanity Colorful Full Mixed", + "Half-Half Rp Rr": "Shapesanity Colorful Full Mixed", + "Checkered Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rp Rr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Rr": "Shapesanity Stitched Mixed", + "3-1 Rp Ru": "Shapesanity Colorful Full Mixed", + "Half-Half Rp Ru": "Shapesanity Colorful Full Mixed", + "Checkered Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rp Ru": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Ru": "Shapesanity Stitched Mixed", + "3-1 Rp Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Rp Rw": "Shapesanity Colorful Full Mixed", + "Checkered Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rp Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Rw": "Shapesanity Stitched Mixed", + "3-1 Rp Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rp Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rp Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rp Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Ry": "Shapesanity Stitched Mixed", + "3-1 Rp Sb": "Shapesanity Stitched Mixed", + "Half-Half Rp Sb": "Shapesanity Half-Half Mixed", + "Checkered Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sb": "Shapesanity Stitched Mixed", + "3-1 Rp Sc": "Shapesanity Stitched Mixed", + "Half-Half Rp Sc": "Shapesanity Half-Half Mixed", + "Checkered Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sc": "Shapesanity Stitched Mixed", + "3-1 Rp Sg": "Shapesanity Stitched Mixed", + "Half-Half Rp Sg": "Shapesanity Half-Half Mixed", + "Checkered Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sg": "Shapesanity Stitched Mixed", + "3-1 Rp Sp": "Shapesanity Stitched Mixed", + "Half-Half Rp Sp": "Shapesanity Half-Half Mixed", + "Checkered Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sp": "Shapesanity Stitched Mixed", + "3-1 Rp Sr": "Shapesanity Stitched Mixed", + "Half-Half Rp Sr": "Shapesanity Half-Half Mixed", + "Checkered Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sr": "Shapesanity Stitched Mixed", + "3-1 Rp Su": "Shapesanity Stitched Mixed", + "Half-Half Rp Su": "Shapesanity Half-Half Mixed", + "Checkered Rp Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Su": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Su": "Shapesanity Stitched Mixed", + "3-1 Rp Sw": "Shapesanity Stitched Mixed", + "Half-Half Rp Sw": "Shapesanity Half-Half Mixed", + "Checkered Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sw": "Shapesanity Stitched Mixed", + "3-1 Rp Sy": "Shapesanity Stitched Mixed", + "Half-Half Rp Sy": "Shapesanity Half-Half Mixed", + "Checkered Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Sy": "Shapesanity Stitched Mixed", + "3-1 Rp Wb": "Shapesanity Stitched Mixed", + "Half-Half Rp Wb": "Shapesanity Half-Half Mixed", + "Checkered Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wb": "Shapesanity Stitched Mixed", + "3-1 Rp Wc": "Shapesanity Stitched Mixed", + "Half-Half Rp Wc": "Shapesanity Half-Half Mixed", + "Checkered Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wc": "Shapesanity Stitched Mixed", + "3-1 Rp Wg": "Shapesanity Stitched Mixed", + "Half-Half Rp Wg": "Shapesanity Half-Half Mixed", + "Checkered Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wg": "Shapesanity Stitched Mixed", + "3-1 Rp Wp": "Shapesanity Stitched Mixed", + "Half-Half Rp Wp": "Shapesanity Half-Half Mixed", + "Checkered Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wp": "Shapesanity Stitched Mixed", + "3-1 Rp Wr": "Shapesanity Stitched Mixed", + "Half-Half Rp Wr": "Shapesanity Half-Half Mixed", + "Checkered Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wr": "Shapesanity Stitched Mixed", + "3-1 Rp Wu": "Shapesanity Stitched Mixed", + "Half-Half Rp Wu": "Shapesanity Half-Half Mixed", + "Checkered Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wu": "Shapesanity Stitched Mixed", + "3-1 Rp Ww": "Shapesanity Stitched Mixed", + "Half-Half Rp Ww": "Shapesanity Half-Half Mixed", + "Checkered Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Ww": "Shapesanity Stitched Mixed", + "3-1 Rp Wy": "Shapesanity Stitched Mixed", + "Half-Half Rp Wy": "Shapesanity Half-Half Mixed", + "Checkered Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rp Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rp Wy": "Shapesanity Stitched Mixed", + "3-1 Rr Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Cb": "Shapesanity Stitched Painted", + "3-1 Rr Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Cc": "Shapesanity Stitched Mixed", + "3-1 Rr Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Cg": "Shapesanity Stitched Painted", + "3-1 Rr Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Cp": "Shapesanity Stitched Mixed", + "3-1 Rr Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Cr": "Shapesanity Stitched Painted", + "3-1 Rr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Cu": "Shapesanity Stitched Painted", + "3-1 Rr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Cw": "Shapesanity Stitched Mixed", + "3-1 Rr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Cy": "Shapesanity Stitched Mixed", + "3-1 Rr Rb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Rr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Rb": "Shapesanity Stitched Painted", + "3-1 Rr Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Rc": "Shapesanity Stitched Mixed", + "3-1 Rr Rg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Rr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Rg": "Shapesanity Stitched Painted", + "3-1 Rr Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Rp": "Shapesanity Stitched Mixed", + "3-1 Rr Ru": "Shapesanity Colorful Full Painted", + "Half-Half Rr Ru": "Shapesanity Colorful Full Painted", + "Checkered Rr Ru": "Shapesanity Colorful Full Painted", + "Adjacent Singles Rr Ru": "Shapesanity Colorful Half Painted", + "Cornered Singles Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Ru": "Shapesanity Stitched Painted", + "3-1 Rr Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Rr Rw": "Shapesanity Colorful Full Mixed", + "Checkered Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rr Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Rw": "Shapesanity Stitched Mixed", + "3-1 Rr Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rr Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rr Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rr Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Ry": "Shapesanity Stitched Mixed", + "3-1 Rr Sb": "Shapesanity Stitched Painted", + "Half-Half Rr Sb": "Shapesanity Half-Half Painted", + "Checkered Rr Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Sb": "Shapesanity Stitched Painted", + "Cornered Singles Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Sb": "Shapesanity Stitched Painted", + "3-1 Rr Sc": "Shapesanity Stitched Mixed", + "Half-Half Rr Sc": "Shapesanity Half-Half Mixed", + "Checkered Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Sc": "Shapesanity Stitched Mixed", + "3-1 Rr Sg": "Shapesanity Stitched Painted", + "Half-Half Rr Sg": "Shapesanity Half-Half Painted", + "Checkered Rr Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Sg": "Shapesanity Stitched Painted", + "Cornered Singles Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Sg": "Shapesanity Stitched Painted", + "3-1 Rr Sp": "Shapesanity Stitched Mixed", + "Half-Half Rr Sp": "Shapesanity Half-Half Mixed", + "Checkered Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Sp": "Shapesanity Stitched Mixed", + "3-1 Rr Sr": "Shapesanity Stitched Painted", + "Half-Half Rr Sr": "Shapesanity Half-Half Painted", + "Checkered Rr Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Sr": "Shapesanity Stitched Painted", + "Cornered Singles Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Sr": "Shapesanity Stitched Painted", + "3-1 Rr Su": "Shapesanity Stitched Painted", + "Half-Half Rr Su": "Shapesanity Half-Half Painted", + "Checkered Rr Su": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Su": "Shapesanity Stitched Painted", + "Cornered Singles Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Su": "Shapesanity Stitched Painted", + "3-1 Rr Sw": "Shapesanity Stitched Mixed", + "Half-Half Rr Sw": "Shapesanity Half-Half Mixed", + "Checkered Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Sw": "Shapesanity Stitched Mixed", + "3-1 Rr Sy": "Shapesanity Stitched Mixed", + "Half-Half Rr Sy": "Shapesanity Half-Half Mixed", + "Checkered Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Sy": "Shapesanity Stitched Mixed", + "3-1 Rr Wb": "Shapesanity Stitched Painted", + "Half-Half Rr Wb": "Shapesanity Half-Half Painted", + "Checkered Rr Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Wb": "Shapesanity Stitched Painted", + "Cornered Singles Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Wb": "Shapesanity Stitched Painted", + "3-1 Rr Wc": "Shapesanity Stitched Mixed", + "Half-Half Rr Wc": "Shapesanity Half-Half Mixed", + "Checkered Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Wc": "Shapesanity Stitched Mixed", + "3-1 Rr Wg": "Shapesanity Stitched Painted", + "Half-Half Rr Wg": "Shapesanity Half-Half Painted", + "Checkered Rr Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Wg": "Shapesanity Stitched Painted", + "Cornered Singles Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Wg": "Shapesanity Stitched Painted", + "3-1 Rr Wp": "Shapesanity Stitched Mixed", + "Half-Half Rr Wp": "Shapesanity Half-Half Mixed", + "Checkered Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Wp": "Shapesanity Stitched Mixed", + "3-1 Rr Wr": "Shapesanity Stitched Painted", + "Half-Half Rr Wr": "Shapesanity Half-Half Painted", + "Checkered Rr Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Wr": "Shapesanity Stitched Painted", + "Cornered Singles Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Wr": "Shapesanity Stitched Painted", + "3-1 Rr Wu": "Shapesanity Stitched Painted", + "Half-Half Rr Wu": "Shapesanity Half-Half Painted", + "Checkered Rr Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Rr Wu": "Shapesanity Stitched Painted", + "Cornered Singles Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Rr Wu": "Shapesanity Stitched Painted", + "3-1 Rr Ww": "Shapesanity Stitched Mixed", + "Half-Half Rr Ww": "Shapesanity Half-Half Mixed", + "Checkered Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Ww": "Shapesanity Stitched Mixed", + "3-1 Rr Wy": "Shapesanity Stitched Mixed", + "Half-Half Rr Wy": "Shapesanity Half-Half Mixed", + "Checkered Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rr Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rr Wy": "Shapesanity Stitched Mixed", + "3-1 Ru Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Cb": "Shapesanity Stitched Painted", + "3-1 Ru Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Cc": "Shapesanity Stitched Mixed", + "3-1 Ru Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Cg": "Shapesanity Stitched Painted", + "3-1 Ru Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Cp": "Shapesanity Stitched Mixed", + "3-1 Ru Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Cr": "Shapesanity Stitched Painted", + "3-1 Ru Cu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Ru Cu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Ru Cu": "Shapesanity Stitched Uncolored", + "3-1 Ru Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Cw": "Shapesanity Stitched Mixed", + "3-1 Ru Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Cy": "Shapesanity Stitched Mixed", + "3-1 Ru Rb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Ru Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Rb": "Shapesanity Stitched Painted", + "3-1 Ru Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ru Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Rc": "Shapesanity Stitched Mixed", + "3-1 Ru Rg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Ru Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Rg": "Shapesanity Stitched Painted", + "3-1 Ru Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ru Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Rp": "Shapesanity Stitched Mixed", + "3-1 Ru Rr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Ru Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Rr": "Shapesanity Stitched Painted", + "3-1 Ru Rw": "Shapesanity Colorful Full Mixed", + "Half-Half Ru Rw": "Shapesanity Colorful Full Mixed", + "Checkered Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Ru Rw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Rw": "Shapesanity Stitched Mixed", + "3-1 Ru Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Ru Ry": "Shapesanity Colorful Full Mixed", + "Checkered Ru Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Ru Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Ry": "Shapesanity Stitched Mixed", + "3-1 Ru Sb": "Shapesanity Stitched Painted", + "Half-Half Ru Sb": "Shapesanity Half-Half Painted", + "Checkered Ru Sb": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Sb": "Shapesanity Stitched Painted", + "Cornered Singles Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Sb": "Shapesanity Stitched Painted", + "3-1 Ru Sc": "Shapesanity Stitched Mixed", + "Half-Half Ru Sc": "Shapesanity Half-Half Mixed", + "Checkered Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Sc": "Shapesanity Stitched Mixed", + "3-1 Ru Sg": "Shapesanity Stitched Painted", + "Half-Half Ru Sg": "Shapesanity Half-Half Painted", + "Checkered Ru Sg": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Sg": "Shapesanity Stitched Painted", + "Cornered Singles Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Sg": "Shapesanity Stitched Painted", + "3-1 Ru Sp": "Shapesanity Stitched Mixed", + "Half-Half Ru Sp": "Shapesanity Half-Half Mixed", + "Checkered Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Sp": "Shapesanity Stitched Mixed", + "3-1 Ru Sr": "Shapesanity Stitched Painted", + "Half-Half Ru Sr": "Shapesanity Half-Half Painted", + "Checkered Ru Sr": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Sr": "Shapesanity Stitched Painted", + "Cornered Singles Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Sr": "Shapesanity Stitched Painted", + "3-1 Ru Su": "Shapesanity Stitched Uncolored", + "Half-Half Ru Su": "Shapesanity Half-Half Uncolored", + "Checkered Ru Su": "Shapesanity Stitched Uncolored", + "Adjacent Singles Ru Su": "Shapesanity Stitched Uncolored", + "Cornered Singles Ru Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Ru Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Ru Su": "Shapesanity Stitched Uncolored", + "3-1 Ru Sw": "Shapesanity Stitched Mixed", + "Half-Half Ru Sw": "Shapesanity Half-Half Mixed", + "Checkered Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Sw": "Shapesanity Stitched Mixed", + "3-1 Ru Sy": "Shapesanity Stitched Mixed", + "Half-Half Ru Sy": "Shapesanity Half-Half Mixed", + "Checkered Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Sy": "Shapesanity Stitched Mixed", + "3-1 Ru Wb": "Shapesanity Stitched Painted", + "Half-Half Ru Wb": "Shapesanity Half-Half Painted", + "Checkered Ru Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Wb": "Shapesanity Stitched Painted", + "Cornered Singles Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Wb": "Shapesanity Stitched Painted", + "3-1 Ru Wc": "Shapesanity Stitched Mixed", + "Half-Half Ru Wc": "Shapesanity Half-Half Mixed", + "Checkered Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Wc": "Shapesanity Stitched Mixed", + "3-1 Ru Wg": "Shapesanity Stitched Painted", + "Half-Half Ru Wg": "Shapesanity Half-Half Painted", + "Checkered Ru Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Wg": "Shapesanity Stitched Painted", + "Cornered Singles Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Wg": "Shapesanity Stitched Painted", + "3-1 Ru Wp": "Shapesanity Stitched Mixed", + "Half-Half Ru Wp": "Shapesanity Half-Half Mixed", + "Checkered Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Wp": "Shapesanity Stitched Mixed", + "3-1 Ru Wr": "Shapesanity Stitched Painted", + "Half-Half Ru Wr": "Shapesanity Half-Half Painted", + "Checkered Ru Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Ru Wr": "Shapesanity Stitched Painted", + "Cornered Singles Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Ru Wr": "Shapesanity Stitched Painted", + "3-1 Ru Wu": "Shapesanity Stitched Uncolored", + "Half-Half Ru Wu": "Shapesanity Half-Half Uncolored", + "Checkered Ru Wu": "Shapesanity Stitched Uncolored", + "Adjacent Singles Ru Wu": "Shapesanity Stitched Uncolored", + "Cornered Singles Ru Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Ru Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Ru Wu": "Shapesanity Stitched Uncolored", + "3-1 Ru Ww": "Shapesanity Stitched Mixed", + "Half-Half Ru Ww": "Shapesanity Half-Half Mixed", + "Checkered Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Ww": "Shapesanity Stitched Mixed", + "3-1 Ru Wy": "Shapesanity Stitched Mixed", + "Half-Half Ru Wy": "Shapesanity Half-Half Mixed", + "Checkered Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Ru Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ru Wy": "Shapesanity Stitched Mixed", + "3-1 Rw Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cb": "Shapesanity Stitched Mixed", + "3-1 Rw Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cc": "Shapesanity Stitched Mixed", + "3-1 Rw Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cg": "Shapesanity Stitched Mixed", + "3-1 Rw Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cp": "Shapesanity Stitched Mixed", + "3-1 Rw Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cr": "Shapesanity Stitched Mixed", + "3-1 Rw Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cu": "Shapesanity Stitched Mixed", + "3-1 Rw Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cw": "Shapesanity Stitched Mixed", + "3-1 Rw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Cy": "Shapesanity Stitched Mixed", + "3-1 Rw Rb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Rb": "Shapesanity Stitched Mixed", + "3-1 Rw Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Rc": "Shapesanity Stitched Mixed", + "3-1 Rw Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Rg": "Shapesanity Stitched Mixed", + "3-1 Rw Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Rp": "Shapesanity Stitched Mixed", + "3-1 Rw Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Rr": "Shapesanity Stitched Mixed", + "3-1 Rw Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Rw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Ru": "Shapesanity Stitched Mixed", + "3-1 Rw Ry": "Shapesanity Colorful Full Mixed", + "Half-Half Rw Ry": "Shapesanity Colorful Full Mixed", + "Checkered Rw Ry": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Rw Ry": "Shapesanity Colorful Half Mixed", + "Cornered Singles Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Ry": "Shapesanity Stitched Mixed", + "3-1 Rw Sb": "Shapesanity Stitched Mixed", + "Half-Half Rw Sb": "Shapesanity Half-Half Mixed", + "Checkered Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sb": "Shapesanity Stitched Mixed", + "3-1 Rw Sc": "Shapesanity Stitched Mixed", + "Half-Half Rw Sc": "Shapesanity Half-Half Mixed", + "Checkered Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sc": "Shapesanity Stitched Mixed", + "3-1 Rw Sg": "Shapesanity Stitched Mixed", + "Half-Half Rw Sg": "Shapesanity Half-Half Mixed", + "Checkered Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sg": "Shapesanity Stitched Mixed", + "3-1 Rw Sp": "Shapesanity Stitched Mixed", + "Half-Half Rw Sp": "Shapesanity Half-Half Mixed", + "Checkered Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sp": "Shapesanity Stitched Mixed", + "3-1 Rw Sr": "Shapesanity Stitched Mixed", + "Half-Half Rw Sr": "Shapesanity Half-Half Mixed", + "Checkered Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sr": "Shapesanity Stitched Mixed", + "3-1 Rw Su": "Shapesanity Stitched Mixed", + "Half-Half Rw Su": "Shapesanity Half-Half Mixed", + "Checkered Rw Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Su": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Su": "Shapesanity Stitched Mixed", + "3-1 Rw Sw": "Shapesanity Stitched Mixed", + "Half-Half Rw Sw": "Shapesanity Half-Half Mixed", + "Checkered Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sw": "Shapesanity Stitched Mixed", + "3-1 Rw Sy": "Shapesanity Stitched Mixed", + "Half-Half Rw Sy": "Shapesanity Half-Half Mixed", + "Checkered Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Sy": "Shapesanity Stitched Mixed", + "3-1 Rw Wb": "Shapesanity Stitched Mixed", + "Half-Half Rw Wb": "Shapesanity Half-Half Mixed", + "Checkered Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wb": "Shapesanity Stitched Mixed", + "3-1 Rw Wc": "Shapesanity Stitched Mixed", + "Half-Half Rw Wc": "Shapesanity Half-Half Mixed", + "Checkered Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wc": "Shapesanity Stitched Mixed", + "3-1 Rw Wg": "Shapesanity Stitched Mixed", + "Half-Half Rw Wg": "Shapesanity Half-Half Mixed", + "Checkered Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wg": "Shapesanity Stitched Mixed", + "3-1 Rw Wp": "Shapesanity Stitched Mixed", + "Half-Half Rw Wp": "Shapesanity Half-Half Mixed", + "Checkered Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wp": "Shapesanity Stitched Mixed", + "3-1 Rw Wr": "Shapesanity Stitched Mixed", + "Half-Half Rw Wr": "Shapesanity Half-Half Mixed", + "Checkered Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wr": "Shapesanity Stitched Mixed", + "3-1 Rw Wu": "Shapesanity Stitched Mixed", + "Half-Half Rw Wu": "Shapesanity Half-Half Mixed", + "Checkered Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wu": "Shapesanity Stitched Mixed", + "3-1 Rw Ww": "Shapesanity Stitched Mixed", + "Half-Half Rw Ww": "Shapesanity Half-Half Mixed", + "Checkered Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Ww": "Shapesanity Stitched Mixed", + "3-1 Rw Wy": "Shapesanity Stitched Mixed", + "Half-Half Rw Wy": "Shapesanity Half-Half Mixed", + "Checkered Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Rw Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Rw Wy": "Shapesanity Stitched Mixed", + "3-1 Ry Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cb": "Shapesanity Stitched Mixed", + "3-1 Ry Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cc": "Shapesanity Stitched Mixed", + "3-1 Ry Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cg": "Shapesanity Stitched Mixed", + "3-1 Ry Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cp": "Shapesanity Stitched Mixed", + "3-1 Ry Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cr": "Shapesanity Stitched Mixed", + "3-1 Ry Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cu": "Shapesanity Stitched Mixed", + "3-1 Ry Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cw": "Shapesanity Stitched Mixed", + "3-1 Ry Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Cy": "Shapesanity Stitched Mixed", + "3-1 Ry Rb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rb": "Shapesanity Stitched Mixed", + "3-1 Ry Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rc": "Shapesanity Stitched Mixed", + "3-1 Ry Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rg": "Shapesanity Stitched Mixed", + "3-1 Ry Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rp": "Shapesanity Stitched Mixed", + "3-1 Ry Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rr": "Shapesanity Stitched Mixed", + "3-1 Ry Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Ru": "Shapesanity Stitched Mixed", + "3-1 Ry Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Ry Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Rw": "Shapesanity Stitched Mixed", + "3-1 Ry Sb": "Shapesanity Stitched Mixed", + "Half-Half Ry Sb": "Shapesanity Half-Half Mixed", + "Checkered Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sb": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sb": "Shapesanity Stitched Mixed", + "3-1 Ry Sc": "Shapesanity Stitched Mixed", + "Half-Half Ry Sc": "Shapesanity Half-Half Mixed", + "Checkered Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sc": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sc": "Shapesanity Stitched Mixed", + "3-1 Ry Sg": "Shapesanity Stitched Mixed", + "Half-Half Ry Sg": "Shapesanity Half-Half Mixed", + "Checkered Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sg": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sg": "Shapesanity Stitched Mixed", + "3-1 Ry Sp": "Shapesanity Stitched Mixed", + "Half-Half Ry Sp": "Shapesanity Half-Half Mixed", + "Checkered Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sp": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sp": "Shapesanity Stitched Mixed", + "3-1 Ry Sr": "Shapesanity Stitched Mixed", + "Half-Half Ry Sr": "Shapesanity Half-Half Mixed", + "Checkered Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sr": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sr": "Shapesanity Stitched Mixed", + "3-1 Ry Su": "Shapesanity Stitched Mixed", + "Half-Half Ry Su": "Shapesanity Half-Half Mixed", + "Checkered Ry Su": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Su": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Su": "Shapesanity Stitched Mixed", + "3-1 Ry Sw": "Shapesanity Stitched Mixed", + "Half-Half Ry Sw": "Shapesanity Half-Half Mixed", + "Checkered Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sw": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sw": "Shapesanity Stitched Mixed", + "3-1 Ry Sy": "Shapesanity Stitched Mixed", + "Half-Half Ry Sy": "Shapesanity Half-Half Mixed", + "Checkered Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Sy": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Sy": "Shapesanity Stitched Mixed", + "3-1 Ry Wb": "Shapesanity Stitched Mixed", + "Half-Half Ry Wb": "Shapesanity Half-Half Mixed", + "Checkered Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wb": "Shapesanity Stitched Mixed", + "3-1 Ry Wc": "Shapesanity Stitched Mixed", + "Half-Half Ry Wc": "Shapesanity Half-Half Mixed", + "Checkered Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wc": "Shapesanity Stitched Mixed", + "3-1 Ry Wg": "Shapesanity Stitched Mixed", + "Half-Half Ry Wg": "Shapesanity Half-Half Mixed", + "Checkered Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wg": "Shapesanity Stitched Mixed", + "3-1 Ry Wp": "Shapesanity Stitched Mixed", + "Half-Half Ry Wp": "Shapesanity Half-Half Mixed", + "Checkered Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wp": "Shapesanity Stitched Mixed", + "3-1 Ry Wr": "Shapesanity Stitched Mixed", + "Half-Half Ry Wr": "Shapesanity Half-Half Mixed", + "Checkered Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wr": "Shapesanity Stitched Mixed", + "3-1 Ry Wu": "Shapesanity Stitched Mixed", + "Half-Half Ry Wu": "Shapesanity Half-Half Mixed", + "Checkered Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wu": "Shapesanity Stitched Mixed", + "3-1 Ry Ww": "Shapesanity Stitched Mixed", + "Half-Half Ry Ww": "Shapesanity Half-Half Mixed", + "Checkered Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Ww": "Shapesanity Stitched Mixed", + "3-1 Ry Wy": "Shapesanity Stitched Mixed", + "Half-Half Ry Wy": "Shapesanity Half-Half Mixed", + "Checkered Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Ry Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ry Wy": "Shapesanity Stitched Mixed", + "3-1 Sb Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Cb": "Shapesanity Stitched Painted", + "3-1 Sb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Cc": "Shapesanity Stitched Mixed", + "3-1 Sb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Cg": "Shapesanity Stitched Painted", + "3-1 Sb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Cp": "Shapesanity Stitched Mixed", + "3-1 Sb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Cr": "Shapesanity Stitched Painted", + "3-1 Sb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Cu": "Shapesanity Stitched Painted", + "3-1 Sb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Cw": "Shapesanity Stitched Mixed", + "3-1 Sb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Cy": "Shapesanity Stitched Mixed", + "3-1 Sb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Rb": "Shapesanity Stitched Painted", + "3-1 Sb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Rc": "Shapesanity Stitched Mixed", + "3-1 Sb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Rg": "Shapesanity Stitched Painted", + "3-1 Sb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Rp": "Shapesanity Stitched Mixed", + "3-1 Sb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Rr": "Shapesanity Stitched Painted", + "3-1 Sb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Ru": "Shapesanity Stitched Painted", + "3-1 Sb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Rw": "Shapesanity Stitched Mixed", + "3-1 Sb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Ry": "Shapesanity Stitched Mixed", + "3-1 Sb Sc": "Shapesanity Colorful Full Mixed", + "Half-Half Sb Sc": "Shapesanity Colorful Full Mixed", + "Checkered Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sb Sc": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Sc": "Shapesanity Stitched Mixed", + "3-1 Sb Sg": "Shapesanity Colorful Full Painted", + "Half-Half Sb Sg": "Shapesanity Colorful Full Painted", + "Checkered Sb Sg": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sb Sg": "Shapesanity Colorful Half Painted", + "Cornered Singles Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Sg": "Shapesanity Stitched Painted", + "3-1 Sb Sp": "Shapesanity Colorful Full Mixed", + "Half-Half Sb Sp": "Shapesanity Colorful Full Mixed", + "Checkered Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sb Sp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Sp": "Shapesanity Stitched Mixed", + "3-1 Sb Sr": "Shapesanity Colorful Full Painted", + "Half-Half Sb Sr": "Shapesanity Colorful Full Painted", + "Checkered Sb Sr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sb Sr": "Shapesanity Colorful Half Painted", + "Cornered Singles Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Sr": "Shapesanity Stitched Painted", + "3-1 Sb Su": "Shapesanity Colorful Full Painted", + "Half-Half Sb Su": "Shapesanity Colorful Full Painted", + "Checkered Sb Su": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sb Su": "Shapesanity Colorful Half Painted", + "Cornered Singles Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Su": "Shapesanity Stitched Painted", + "3-1 Sb Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Sb Sw": "Shapesanity Colorful Full Mixed", + "Checkered Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sb Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Sw": "Shapesanity Stitched Mixed", + "3-1 Sb Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sb Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sb Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Sy": "Shapesanity Stitched Mixed", + "3-1 Sb Wb": "Shapesanity Stitched Painted", + "Half-Half Sb Wb": "Shapesanity Half-Half Painted", + "Checkered Sb Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Sb Wb": "Shapesanity Stitched Painted", + "Cornered Singles Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Wb": "Shapesanity Stitched Painted", + "3-1 Sb Wc": "Shapesanity Stitched Mixed", + "Half-Half Sb Wc": "Shapesanity Half-Half Mixed", + "Checkered Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sb Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Wc": "Shapesanity Stitched Mixed", + "3-1 Sb Wg": "Shapesanity Stitched Painted", + "Half-Half Sb Wg": "Shapesanity Half-Half Painted", + "Checkered Sb Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Sb Wg": "Shapesanity Stitched Painted", + "Cornered Singles Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Wg": "Shapesanity Stitched Painted", + "3-1 Sb Wp": "Shapesanity Stitched Mixed", + "Half-Half Sb Wp": "Shapesanity Half-Half Mixed", + "Checkered Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sb Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Wp": "Shapesanity Stitched Mixed", + "3-1 Sb Wr": "Shapesanity Stitched Painted", + "Half-Half Sb Wr": "Shapesanity Half-Half Painted", + "Checkered Sb Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Sb Wr": "Shapesanity Stitched Painted", + "Cornered Singles Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Wr": "Shapesanity Stitched Painted", + "3-1 Sb Wu": "Shapesanity Stitched Painted", + "Half-Half Sb Wu": "Shapesanity Half-Half Painted", + "Checkered Sb Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Sb Wu": "Shapesanity Stitched Painted", + "Cornered Singles Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sb Wu": "Shapesanity Stitched Painted", + "3-1 Sb Ww": "Shapesanity Stitched Mixed", + "Half-Half Sb Ww": "Shapesanity Half-Half Mixed", + "Checkered Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sb Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Ww": "Shapesanity Stitched Mixed", + "3-1 Sb Wy": "Shapesanity Stitched Mixed", + "Half-Half Sb Wy": "Shapesanity Half-Half Mixed", + "Checkered Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sb Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sb Wy": "Shapesanity Stitched Mixed", + "3-1 Sc Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cb": "Shapesanity Stitched Mixed", + "3-1 Sc Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cc": "Shapesanity Stitched Mixed", + "3-1 Sc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cg": "Shapesanity Stitched Mixed", + "3-1 Sc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cp": "Shapesanity Stitched Mixed", + "3-1 Sc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cr": "Shapesanity Stitched Mixed", + "3-1 Sc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cu": "Shapesanity Stitched Mixed", + "3-1 Sc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cw": "Shapesanity Stitched Mixed", + "3-1 Sc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Cy": "Shapesanity Stitched Mixed", + "3-1 Sc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rb": "Shapesanity Stitched Mixed", + "3-1 Sc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rc": "Shapesanity Stitched Mixed", + "3-1 Sc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rg": "Shapesanity Stitched Mixed", + "3-1 Sc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rp": "Shapesanity Stitched Mixed", + "3-1 Sc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rr": "Shapesanity Stitched Mixed", + "3-1 Sc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Ru": "Shapesanity Stitched Mixed", + "3-1 Sc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Rw": "Shapesanity Stitched Mixed", + "3-1 Sc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Ry": "Shapesanity Stitched Mixed", + "3-1 Sc Sb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sb": "Shapesanity Stitched Mixed", + "3-1 Sc Sg": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Sg": "Shapesanity Colorful Full Mixed", + "Checkered Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Sg": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sg": "Shapesanity Stitched Mixed", + "3-1 Sc Sp": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Sp": "Shapesanity Colorful Full Mixed", + "Checkered Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Sp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sp": "Shapesanity Stitched Mixed", + "3-1 Sc Sr": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Sr": "Shapesanity Colorful Full Mixed", + "Checkered Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Sr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sr": "Shapesanity Stitched Mixed", + "3-1 Sc Su": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Su": "Shapesanity Colorful Full Mixed", + "Checkered Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Su": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Su": "Shapesanity Stitched Mixed", + "3-1 Sc Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Sw": "Shapesanity Colorful Full Mixed", + "Checkered Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sw": "Shapesanity Stitched Mixed", + "3-1 Sc Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sc Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sc Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Sy": "Shapesanity Stitched Mixed", + "3-1 Sc Wb": "Shapesanity Stitched Mixed", + "Half-Half Sc Wb": "Shapesanity Half-Half Mixed", + "Checkered Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wb": "Shapesanity Stitched Mixed", + "3-1 Sc Wc": "Shapesanity Stitched Mixed", + "Half-Half Sc Wc": "Shapesanity Half-Half Mixed", + "Checkered Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wc": "Shapesanity Stitched Mixed", + "3-1 Sc Wg": "Shapesanity Stitched Mixed", + "Half-Half Sc Wg": "Shapesanity Half-Half Mixed", + "Checkered Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wg": "Shapesanity Stitched Mixed", + "3-1 Sc Wp": "Shapesanity Stitched Mixed", + "Half-Half Sc Wp": "Shapesanity Half-Half Mixed", + "Checkered Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wp": "Shapesanity Stitched Mixed", + "3-1 Sc Wr": "Shapesanity Stitched Mixed", + "Half-Half Sc Wr": "Shapesanity Half-Half Mixed", + "Checkered Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wr": "Shapesanity Stitched Mixed", + "3-1 Sc Wu": "Shapesanity Stitched Mixed", + "Half-Half Sc Wu": "Shapesanity Half-Half Mixed", + "Checkered Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wu": "Shapesanity Stitched Mixed", + "3-1 Sc Ww": "Shapesanity Stitched Mixed", + "Half-Half Sc Ww": "Shapesanity Half-Half Mixed", + "Checkered Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Ww": "Shapesanity Stitched Mixed", + "3-1 Sc Wy": "Shapesanity Stitched Mixed", + "Half-Half Sc Wy": "Shapesanity Half-Half Mixed", + "Checkered Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sc Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sc Wy": "Shapesanity Stitched Mixed", + "3-1 Sg Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Cb": "Shapesanity Stitched Painted", + "3-1 Sg Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Cc": "Shapesanity Stitched Mixed", + "3-1 Sg Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Cg": "Shapesanity Stitched Painted", + "3-1 Sg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Cp": "Shapesanity Stitched Mixed", + "3-1 Sg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Cr": "Shapesanity Stitched Painted", + "3-1 Sg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Cu": "Shapesanity Stitched Painted", + "3-1 Sg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Cw": "Shapesanity Stitched Mixed", + "3-1 Sg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Cy": "Shapesanity Stitched Mixed", + "3-1 Sg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Rb": "Shapesanity Stitched Painted", + "3-1 Sg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Rc": "Shapesanity Stitched Mixed", + "3-1 Sg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Rg": "Shapesanity Stitched Painted", + "3-1 Sg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Rp": "Shapesanity Stitched Mixed", + "3-1 Sg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Rr": "Shapesanity Stitched Painted", + "3-1 Sg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Ru": "Shapesanity Stitched Painted", + "3-1 Sg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Rw": "Shapesanity Stitched Mixed", + "3-1 Sg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Ry": "Shapesanity Stitched Mixed", + "3-1 Sg Sb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Sg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Sb": "Shapesanity Stitched Painted", + "3-1 Sg Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Sc": "Shapesanity Stitched Mixed", + "3-1 Sg Sp": "Shapesanity Colorful Full Mixed", + "Half-Half Sg Sp": "Shapesanity Colorful Full Mixed", + "Checkered Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sg Sp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Sp": "Shapesanity Stitched Mixed", + "3-1 Sg Sr": "Shapesanity Colorful Full Painted", + "Half-Half Sg Sr": "Shapesanity Colorful Full Painted", + "Checkered Sg Sr": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sg Sr": "Shapesanity Colorful Half Painted", + "Cornered Singles Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Sr": "Shapesanity Stitched Painted", + "3-1 Sg Su": "Shapesanity Colorful Full Painted", + "Half-Half Sg Su": "Shapesanity Colorful Full Painted", + "Checkered Sg Su": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sg Su": "Shapesanity Colorful Half Painted", + "Cornered Singles Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Su": "Shapesanity Stitched Painted", + "3-1 Sg Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Sg Sw": "Shapesanity Colorful Full Mixed", + "Checkered Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sg Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Sw": "Shapesanity Stitched Mixed", + "3-1 Sg Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sg Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sg Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sg Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Sy": "Shapesanity Stitched Mixed", + "3-1 Sg Wb": "Shapesanity Stitched Painted", + "Half-Half Sg Wb": "Shapesanity Half-Half Painted", + "Checkered Sg Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Sg Wb": "Shapesanity Stitched Painted", + "Cornered Singles Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Wb": "Shapesanity Stitched Painted", + "3-1 Sg Wc": "Shapesanity Stitched Mixed", + "Half-Half Sg Wc": "Shapesanity Half-Half Mixed", + "Checkered Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sg Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Wc": "Shapesanity Stitched Mixed", + "3-1 Sg Wg": "Shapesanity Stitched Painted", + "Half-Half Sg Wg": "Shapesanity Half-Half Painted", + "Checkered Sg Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Sg Wg": "Shapesanity Stitched Painted", + "Cornered Singles Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Wg": "Shapesanity Stitched Painted", + "3-1 Sg Wp": "Shapesanity Stitched Mixed", + "Half-Half Sg Wp": "Shapesanity Half-Half Mixed", + "Checkered Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sg Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Wp": "Shapesanity Stitched Mixed", + "3-1 Sg Wr": "Shapesanity Stitched Painted", + "Half-Half Sg Wr": "Shapesanity Half-Half Painted", + "Checkered Sg Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Sg Wr": "Shapesanity Stitched Painted", + "Cornered Singles Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Wr": "Shapesanity Stitched Painted", + "3-1 Sg Wu": "Shapesanity Stitched Painted", + "Half-Half Sg Wu": "Shapesanity Half-Half Painted", + "Checkered Sg Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Sg Wu": "Shapesanity Stitched Painted", + "Cornered Singles Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sg Wu": "Shapesanity Stitched Painted", + "3-1 Sg Ww": "Shapesanity Stitched Mixed", + "Half-Half Sg Ww": "Shapesanity Half-Half Mixed", + "Checkered Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sg Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Ww": "Shapesanity Stitched Mixed", + "3-1 Sg Wy": "Shapesanity Stitched Mixed", + "Half-Half Sg Wy": "Shapesanity Half-Half Mixed", + "Checkered Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sg Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sg Wy": "Shapesanity Stitched Mixed", + "3-1 Sp Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cb": "Shapesanity Stitched Mixed", + "3-1 Sp Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cc": "Shapesanity Stitched Mixed", + "3-1 Sp Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cg": "Shapesanity Stitched Mixed", + "3-1 Sp Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cp": "Shapesanity Stitched Mixed", + "3-1 Sp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cr": "Shapesanity Stitched Mixed", + "3-1 Sp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cu": "Shapesanity Stitched Mixed", + "3-1 Sp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cw": "Shapesanity Stitched Mixed", + "3-1 Sp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Cy": "Shapesanity Stitched Mixed", + "3-1 Sp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rb": "Shapesanity Stitched Mixed", + "3-1 Sp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rc": "Shapesanity Stitched Mixed", + "3-1 Sp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rg": "Shapesanity Stitched Mixed", + "3-1 Sp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rp": "Shapesanity Stitched Mixed", + "3-1 Sp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rr": "Shapesanity Stitched Mixed", + "3-1 Sp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Ru": "Shapesanity Stitched Mixed", + "3-1 Sp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Rw": "Shapesanity Stitched Mixed", + "3-1 Sp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Ry": "Shapesanity Stitched Mixed", + "3-1 Sp Sb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sb": "Shapesanity Stitched Mixed", + "3-1 Sp Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sc": "Shapesanity Stitched Mixed", + "3-1 Sp Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sg": "Shapesanity Stitched Mixed", + "3-1 Sp Sr": "Shapesanity Colorful Full Mixed", + "Half-Half Sp Sr": "Shapesanity Colorful Full Mixed", + "Checkered Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sp Sr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sr": "Shapesanity Stitched Mixed", + "3-1 Sp Su": "Shapesanity Colorful Full Mixed", + "Half-Half Sp Su": "Shapesanity Colorful Full Mixed", + "Checkered Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sp Su": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Su": "Shapesanity Stitched Mixed", + "3-1 Sp Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Sp Sw": "Shapesanity Colorful Full Mixed", + "Checkered Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sp Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sw": "Shapesanity Stitched Mixed", + "3-1 Sp Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sp Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sp Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sp Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Sy": "Shapesanity Stitched Mixed", + "3-1 Sp Wb": "Shapesanity Stitched Mixed", + "Half-Half Sp Wb": "Shapesanity Half-Half Mixed", + "Checkered Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wb": "Shapesanity Stitched Mixed", + "3-1 Sp Wc": "Shapesanity Stitched Mixed", + "Half-Half Sp Wc": "Shapesanity Half-Half Mixed", + "Checkered Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wc": "Shapesanity Stitched Mixed", + "3-1 Sp Wg": "Shapesanity Stitched Mixed", + "Half-Half Sp Wg": "Shapesanity Half-Half Mixed", + "Checkered Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wg": "Shapesanity Stitched Mixed", + "3-1 Sp Wp": "Shapesanity Stitched Mixed", + "Half-Half Sp Wp": "Shapesanity Half-Half Mixed", + "Checkered Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wp": "Shapesanity Stitched Mixed", + "3-1 Sp Wr": "Shapesanity Stitched Mixed", + "Half-Half Sp Wr": "Shapesanity Half-Half Mixed", + "Checkered Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wr": "Shapesanity Stitched Mixed", + "3-1 Sp Wu": "Shapesanity Stitched Mixed", + "Half-Half Sp Wu": "Shapesanity Half-Half Mixed", + "Checkered Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wu": "Shapesanity Stitched Mixed", + "3-1 Sp Ww": "Shapesanity Stitched Mixed", + "Half-Half Sp Ww": "Shapesanity Half-Half Mixed", + "Checkered Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Ww": "Shapesanity Stitched Mixed", + "3-1 Sp Wy": "Shapesanity Stitched Mixed", + "Half-Half Sp Wy": "Shapesanity Half-Half Mixed", + "Checkered Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sp Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sp Wy": "Shapesanity Stitched Mixed", + "3-1 Sr Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Cb": "Shapesanity Stitched Painted", + "3-1 Sr Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Cc": "Shapesanity Stitched Mixed", + "3-1 Sr Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Cg": "Shapesanity Stitched Painted", + "3-1 Sr Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Cp": "Shapesanity Stitched Mixed", + "3-1 Sr Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Cr": "Shapesanity Stitched Painted", + "3-1 Sr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Cu": "Shapesanity Stitched Painted", + "3-1 Sr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Cw": "Shapesanity Stitched Mixed", + "3-1 Sr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Cy": "Shapesanity Stitched Mixed", + "3-1 Sr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Rb": "Shapesanity Stitched Painted", + "3-1 Sr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Rc": "Shapesanity Stitched Mixed", + "3-1 Sr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Rg": "Shapesanity Stitched Painted", + "3-1 Sr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Rp": "Shapesanity Stitched Mixed", + "3-1 Sr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Rr": "Shapesanity Stitched Painted", + "3-1 Sr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Ru": "Shapesanity Stitched Painted", + "3-1 Sr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Rw": "Shapesanity Stitched Mixed", + "3-1 Sr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Ry": "Shapesanity Stitched Mixed", + "3-1 Sr Sb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Sr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Sb": "Shapesanity Stitched Painted", + "3-1 Sr Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Sc": "Shapesanity Stitched Mixed", + "3-1 Sr Sg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Sr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Sg": "Shapesanity Stitched Painted", + "3-1 Sr Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Sp": "Shapesanity Stitched Mixed", + "3-1 Sr Su": "Shapesanity Colorful Full Painted", + "Half-Half Sr Su": "Shapesanity Colorful Full Painted", + "Checkered Sr Su": "Shapesanity Colorful Full Painted", + "Adjacent Singles Sr Su": "Shapesanity Colorful Half Painted", + "Cornered Singles Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Su": "Shapesanity Stitched Painted", + "3-1 Sr Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Sr Sw": "Shapesanity Colorful Full Mixed", + "Checkered Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sr Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Sw": "Shapesanity Stitched Mixed", + "3-1 Sr Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sr Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sr Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sr Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Sy": "Shapesanity Stitched Mixed", + "3-1 Sr Wb": "Shapesanity Stitched Painted", + "Half-Half Sr Wb": "Shapesanity Half-Half Painted", + "Checkered Sr Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Sr Wb": "Shapesanity Stitched Painted", + "Cornered Singles Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Wb": "Shapesanity Stitched Painted", + "3-1 Sr Wc": "Shapesanity Stitched Mixed", + "Half-Half Sr Wc": "Shapesanity Half-Half Mixed", + "Checkered Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sr Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Wc": "Shapesanity Stitched Mixed", + "3-1 Sr Wg": "Shapesanity Stitched Painted", + "Half-Half Sr Wg": "Shapesanity Half-Half Painted", + "Checkered Sr Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Sr Wg": "Shapesanity Stitched Painted", + "Cornered Singles Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Wg": "Shapesanity Stitched Painted", + "3-1 Sr Wp": "Shapesanity Stitched Mixed", + "Half-Half Sr Wp": "Shapesanity Half-Half Mixed", + "Checkered Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sr Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Wp": "Shapesanity Stitched Mixed", + "3-1 Sr Wr": "Shapesanity Stitched Painted", + "Half-Half Sr Wr": "Shapesanity Half-Half Painted", + "Checkered Sr Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Sr Wr": "Shapesanity Stitched Painted", + "Cornered Singles Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Wr": "Shapesanity Stitched Painted", + "3-1 Sr Wu": "Shapesanity Stitched Painted", + "Half-Half Sr Wu": "Shapesanity Half-Half Painted", + "Checkered Sr Wu": "Shapesanity Stitched Painted", + "Adjacent Singles Sr Wu": "Shapesanity Stitched Painted", + "Cornered Singles Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Sr Wu": "Shapesanity Stitched Painted", + "3-1 Sr Ww": "Shapesanity Stitched Mixed", + "Half-Half Sr Ww": "Shapesanity Half-Half Mixed", + "Checkered Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sr Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Ww": "Shapesanity Stitched Mixed", + "3-1 Sr Wy": "Shapesanity Stitched Mixed", + "Half-Half Sr Wy": "Shapesanity Half-Half Mixed", + "Checkered Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sr Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sr Wy": "Shapesanity Stitched Mixed", + "3-1 Su Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Cb": "Shapesanity Stitched Painted", + "3-1 Su Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Cc": "Shapesanity Stitched Mixed", + "3-1 Su Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Cg": "Shapesanity Stitched Painted", + "3-1 Su Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Cp": "Shapesanity Stitched Mixed", + "3-1 Su Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Cr": "Shapesanity Stitched Painted", + "3-1 Su Cu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Su Cu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Su Cu": "Shapesanity Stitched Uncolored", + "3-1 Su Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Cw": "Shapesanity Stitched Mixed", + "3-1 Su Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Cy": "Shapesanity Stitched Mixed", + "3-1 Su Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Rb": "Shapesanity Stitched Painted", + "3-1 Su Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Rc": "Shapesanity Stitched Mixed", + "3-1 Su Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Rg": "Shapesanity Stitched Painted", + "3-1 Su Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Rp": "Shapesanity Stitched Mixed", + "3-1 Su Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Rr": "Shapesanity Stitched Painted", + "3-1 Su Ru": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Su Ru": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Su Ru": "Shapesanity Stitched Uncolored", + "3-1 Su Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Rw": "Shapesanity Stitched Mixed", + "3-1 Su Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Ry": "Shapesanity Stitched Mixed", + "3-1 Su Sb": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Su Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Sb": "Shapesanity Stitched Painted", + "3-1 Su Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Su Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Sc": "Shapesanity Stitched Mixed", + "3-1 Su Sg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Su Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Sg": "Shapesanity Stitched Painted", + "3-1 Su Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Su Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Sp": "Shapesanity Stitched Mixed", + "3-1 Su Sr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1 Su Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Sr": "Shapesanity Stitched Painted", + "3-1 Su Sw": "Shapesanity Colorful Full Mixed", + "Half-Half Su Sw": "Shapesanity Colorful Full Mixed", + "Checkered Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Su Sw": "Shapesanity Colorful Half Mixed", + "Cornered Singles Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Sw": "Shapesanity Stitched Mixed", + "3-1 Su Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Su Sy": "Shapesanity Colorful Full Mixed", + "Checkered Su Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Su Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Sy": "Shapesanity Stitched Mixed", + "3-1 Su Wb": "Shapesanity Stitched Painted", + "Half-Half Su Wb": "Shapesanity Half-Half Painted", + "Checkered Su Wb": "Shapesanity Stitched Painted", + "Adjacent Singles Su Wb": "Shapesanity Stitched Painted", + "Cornered Singles Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Wb": "Shapesanity Stitched Painted", + "3-1 Su Wc": "Shapesanity Stitched Mixed", + "Half-Half Su Wc": "Shapesanity Half-Half Mixed", + "Checkered Su Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Su Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Wc": "Shapesanity Stitched Mixed", + "3-1 Su Wg": "Shapesanity Stitched Painted", + "Half-Half Su Wg": "Shapesanity Half-Half Painted", + "Checkered Su Wg": "Shapesanity Stitched Painted", + "Adjacent Singles Su Wg": "Shapesanity Stitched Painted", + "Cornered Singles Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Wg": "Shapesanity Stitched Painted", + "3-1 Su Wp": "Shapesanity Stitched Mixed", + "Half-Half Su Wp": "Shapesanity Half-Half Mixed", + "Checkered Su Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Su Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Wp": "Shapesanity Stitched Mixed", + "3-1 Su Wr": "Shapesanity Stitched Painted", + "Half-Half Su Wr": "Shapesanity Half-Half Painted", + "Checkered Su Wr": "Shapesanity Stitched Painted", + "Adjacent Singles Su Wr": "Shapesanity Stitched Painted", + "Cornered Singles Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Su Wr": "Shapesanity Stitched Painted", + "3-1 Su Wu": "Shapesanity Stitched Uncolored", + "Half-Half Su Wu": "Shapesanity Half-Half Uncolored", + "Checkered Su Wu": "Shapesanity Stitched Uncolored", + "Adjacent Singles Su Wu": "Shapesanity Stitched Uncolored", + "Cornered Singles Su Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Su Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Su Wu": "Shapesanity Stitched Uncolored", + "3-1 Su Ww": "Shapesanity Stitched Mixed", + "Half-Half Su Ww": "Shapesanity Half-Half Mixed", + "Checkered Su Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Su Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Ww": "Shapesanity Stitched Mixed", + "3-1 Su Wy": "Shapesanity Stitched Mixed", + "Half-Half Su Wy": "Shapesanity Half-Half Mixed", + "Checkered Su Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Su Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Su Wy": "Shapesanity Stitched Mixed", + "3-1 Sw Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cb": "Shapesanity Stitched Mixed", + "3-1 Sw Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cc": "Shapesanity Stitched Mixed", + "3-1 Sw Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cg": "Shapesanity Stitched Mixed", + "3-1 Sw Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cp": "Shapesanity Stitched Mixed", + "3-1 Sw Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cr": "Shapesanity Stitched Mixed", + "3-1 Sw Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cu": "Shapesanity Stitched Mixed", + "3-1 Sw Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cw": "Shapesanity Stitched Mixed", + "3-1 Sw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Cy": "Shapesanity Stitched Mixed", + "3-1 Sw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rb": "Shapesanity Stitched Mixed", + "3-1 Sw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rc": "Shapesanity Stitched Mixed", + "3-1 Sw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rg": "Shapesanity Stitched Mixed", + "3-1 Sw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rp": "Shapesanity Stitched Mixed", + "3-1 Sw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rr": "Shapesanity Stitched Mixed", + "3-1 Sw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Ru": "Shapesanity Stitched Mixed", + "3-1 Sw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Rw": "Shapesanity Stitched Mixed", + "3-1 Sw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Ry": "Shapesanity Stitched Mixed", + "3-1 Sw Sb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sb": "Shapesanity Stitched Mixed", + "3-1 Sw Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sc": "Shapesanity Stitched Mixed", + "3-1 Sw Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sg": "Shapesanity Stitched Mixed", + "3-1 Sw Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sp": "Shapesanity Stitched Mixed", + "3-1 Sw Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sr": "Shapesanity Stitched Mixed", + "3-1 Sw Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Su": "Shapesanity Stitched Mixed", + "3-1 Sw Sy": "Shapesanity Colorful Full Mixed", + "Half-Half Sw Sy": "Shapesanity Colorful Full Mixed", + "Checkered Sw Sy": "Shapesanity Colorful Full Mixed", + "Adjacent Singles Sw Sy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Sy": "Shapesanity Stitched Mixed", + "3-1 Sw Wb": "Shapesanity Stitched Mixed", + "Half-Half Sw Wb": "Shapesanity Half-Half Mixed", + "Checkered Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wb": "Shapesanity Stitched Mixed", + "3-1 Sw Wc": "Shapesanity Stitched Mixed", + "Half-Half Sw Wc": "Shapesanity Half-Half Mixed", + "Checkered Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wc": "Shapesanity Stitched Mixed", + "3-1 Sw Wg": "Shapesanity Stitched Mixed", + "Half-Half Sw Wg": "Shapesanity Half-Half Mixed", + "Checkered Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wg": "Shapesanity Stitched Mixed", + "3-1 Sw Wp": "Shapesanity Stitched Mixed", + "Half-Half Sw Wp": "Shapesanity Half-Half Mixed", + "Checkered Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wp": "Shapesanity Stitched Mixed", + "3-1 Sw Wr": "Shapesanity Stitched Mixed", + "Half-Half Sw Wr": "Shapesanity Half-Half Mixed", + "Checkered Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wr": "Shapesanity Stitched Mixed", + "3-1 Sw Wu": "Shapesanity Stitched Mixed", + "Half-Half Sw Wu": "Shapesanity Half-Half Mixed", + "Checkered Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wu": "Shapesanity Stitched Mixed", + "3-1 Sw Ww": "Shapesanity Stitched Mixed", + "Half-Half Sw Ww": "Shapesanity Half-Half Mixed", + "Checkered Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Ww": "Shapesanity Stitched Mixed", + "3-1 Sw Wy": "Shapesanity Stitched Mixed", + "Half-Half Sw Wy": "Shapesanity Half-Half Mixed", + "Checkered Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sw Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sw Wy": "Shapesanity Stitched Mixed", + "3-1 Sy Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cb": "Shapesanity Stitched Mixed", + "3-1 Sy Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cc": "Shapesanity Stitched Mixed", + "3-1 Sy Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cg": "Shapesanity Stitched Mixed", + "3-1 Sy Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cp": "Shapesanity Stitched Mixed", + "3-1 Sy Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cr": "Shapesanity Stitched Mixed", + "3-1 Sy Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cu": "Shapesanity Stitched Mixed", + "3-1 Sy Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cw": "Shapesanity Stitched Mixed", + "3-1 Sy Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Cy": "Shapesanity Stitched Mixed", + "3-1 Sy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rb": "Shapesanity Stitched Mixed", + "3-1 Sy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rc": "Shapesanity Stitched Mixed", + "3-1 Sy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rg": "Shapesanity Stitched Mixed", + "3-1 Sy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rp": "Shapesanity Stitched Mixed", + "3-1 Sy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rr": "Shapesanity Stitched Mixed", + "3-1 Sy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Ru": "Shapesanity Stitched Mixed", + "3-1 Sy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Rw": "Shapesanity Stitched Mixed", + "3-1 Sy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Ry": "Shapesanity Stitched Mixed", + "3-1 Sy Sb": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sb": "Shapesanity Stitched Mixed", + "3-1 Sy Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sc": "Shapesanity Stitched Mixed", + "3-1 Sy Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sg": "Shapesanity Stitched Mixed", + "3-1 Sy Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sp": "Shapesanity Stitched Mixed", + "3-1 Sy Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sr": "Shapesanity Stitched Mixed", + "3-1 Sy Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Su": "Shapesanity Stitched Mixed", + "3-1 Sy Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1 Sy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Sw": "Shapesanity Stitched Mixed", + "3-1 Sy Wb": "Shapesanity Stitched Mixed", + "Half-Half Sy Wb": "Shapesanity Half-Half Mixed", + "Checkered Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wb": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wb": "Shapesanity Stitched Mixed", + "3-1 Sy Wc": "Shapesanity Stitched Mixed", + "Half-Half Sy Wc": "Shapesanity Half-Half Mixed", + "Checkered Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wc": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wc": "Shapesanity Stitched Mixed", + "3-1 Sy Wg": "Shapesanity Stitched Mixed", + "Half-Half Sy Wg": "Shapesanity Half-Half Mixed", + "Checkered Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wg": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wg": "Shapesanity Stitched Mixed", + "3-1 Sy Wp": "Shapesanity Stitched Mixed", + "Half-Half Sy Wp": "Shapesanity Half-Half Mixed", + "Checkered Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wp": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wp": "Shapesanity Stitched Mixed", + "3-1 Sy Wr": "Shapesanity Stitched Mixed", + "Half-Half Sy Wr": "Shapesanity Half-Half Mixed", + "Checkered Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wr": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wr": "Shapesanity Stitched Mixed", + "3-1 Sy Wu": "Shapesanity Stitched Mixed", + "Half-Half Sy Wu": "Shapesanity Half-Half Mixed", + "Checkered Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wu": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wu": "Shapesanity Stitched Mixed", + "3-1 Sy Ww": "Shapesanity Stitched Mixed", + "Half-Half Sy Ww": "Shapesanity Half-Half Mixed", + "Checkered Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Ww": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Ww": "Shapesanity Stitched Mixed", + "3-1 Sy Wy": "Shapesanity Stitched Mixed", + "Half-Half Sy Wy": "Shapesanity Half-Half Mixed", + "Checkered Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent Singles Sy Wy": "Shapesanity Stitched Mixed", + "Cornered Singles Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Sy Wy": "Shapesanity Stitched Mixed", + "3-1 Wb Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Cb": "Shapesanity Stitched Painted", + "3-1 Wb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Cc": "Shapesanity Stitched Mixed", + "3-1 Wb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Cg": "Shapesanity Stitched Painted", + "3-1 Wb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Cp": "Shapesanity Stitched Mixed", + "3-1 Wb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Cr": "Shapesanity Stitched Painted", + "3-1 Wb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Cu": "Shapesanity Stitched Painted", + "3-1 Wb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Cw": "Shapesanity Stitched Mixed", + "3-1 Wb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Cy": "Shapesanity Stitched Mixed", + "3-1 Wb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Rb": "Shapesanity Stitched Painted", + "3-1 Wb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Rc": "Shapesanity Stitched Mixed", + "3-1 Wb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Rg": "Shapesanity Stitched Painted", + "3-1 Wb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Rp": "Shapesanity Stitched Mixed", + "3-1 Wb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Rr": "Shapesanity Stitched Painted", + "3-1 Wb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Ru": "Shapesanity Stitched Painted", + "3-1 Wb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Rw": "Shapesanity Stitched Mixed", + "3-1 Wb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Ry": "Shapesanity Stitched Mixed", + "3-1 Wb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Sb": "Shapesanity Stitched Painted", + "3-1 Wb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Sc": "Shapesanity Stitched Mixed", + "3-1 Wb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Sg": "Shapesanity Stitched Painted", + "3-1 Wb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Sp": "Shapesanity Stitched Mixed", + "3-1 Wb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Sr": "Shapesanity Stitched Painted", + "3-1 Wb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Su": "Shapesanity Stitched Painted", + "3-1 Wb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Sw": "Shapesanity Stitched Mixed", + "3-1 Wb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Sy": "Shapesanity Stitched Mixed", + "3-1 Wb Wc": "Shapesanity East Windmill Mixed", + "Half-Half Wb Wc": "Shapesanity East Windmill Mixed", + "Checkered Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wb Wc": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Wc": "Shapesanity Stitched Mixed", + "3-1 Wb Wg": "Shapesanity East Windmill Painted", + "Half-Half Wb Wg": "Shapesanity East Windmill Painted", + "Checkered Wb Wg": "Shapesanity East Windmill Painted", + "Adjacent Singles Wb Wg": "Shapesanity Colorful Half Painted", + "Cornered Singles Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Wg": "Shapesanity Stitched Painted", + "3-1 Wb Wp": "Shapesanity East Windmill Mixed", + "Half-Half Wb Wp": "Shapesanity East Windmill Mixed", + "Checkered Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wb Wp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Wp": "Shapesanity Stitched Mixed", + "3-1 Wb Wr": "Shapesanity East Windmill Painted", + "Half-Half Wb Wr": "Shapesanity East Windmill Painted", + "Checkered Wb Wr": "Shapesanity East Windmill Painted", + "Adjacent Singles Wb Wr": "Shapesanity Colorful Half Painted", + "Cornered Singles Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Wr": "Shapesanity Stitched Painted", + "3-1 Wb Wu": "Shapesanity East Windmill Painted", + "Half-Half Wb Wu": "Shapesanity East Windmill Painted", + "Checkered Wb Wu": "Shapesanity East Windmill Painted", + "Adjacent Singles Wb Wu": "Shapesanity Colorful Half Painted", + "Cornered Singles Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wb Wu": "Shapesanity Stitched Painted", + "3-1 Wb Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wb Ww": "Shapesanity East Windmill Mixed", + "Checkered Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wb Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Ww": "Shapesanity Stitched Mixed", + "3-1 Wb Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wb Wy": "Shapesanity East Windmill Mixed", + "Checkered Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wb Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wb Wy": "Shapesanity Stitched Mixed", + "3-1 Wc Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cb": "Shapesanity Stitched Mixed", + "3-1 Wc Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cc": "Shapesanity Stitched Mixed", + "3-1 Wc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cg": "Shapesanity Stitched Mixed", + "3-1 Wc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cp": "Shapesanity Stitched Mixed", + "3-1 Wc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cr": "Shapesanity Stitched Mixed", + "3-1 Wc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cu": "Shapesanity Stitched Mixed", + "3-1 Wc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cw": "Shapesanity Stitched Mixed", + "3-1 Wc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Cy": "Shapesanity Stitched Mixed", + "3-1 Wc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rb": "Shapesanity Stitched Mixed", + "3-1 Wc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rc": "Shapesanity Stitched Mixed", + "3-1 Wc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rg": "Shapesanity Stitched Mixed", + "3-1 Wc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rp": "Shapesanity Stitched Mixed", + "3-1 Wc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rr": "Shapesanity Stitched Mixed", + "3-1 Wc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Ru": "Shapesanity Stitched Mixed", + "3-1 Wc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Rw": "Shapesanity Stitched Mixed", + "3-1 Wc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Ry": "Shapesanity Stitched Mixed", + "3-1 Wc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sb": "Shapesanity Stitched Mixed", + "3-1 Wc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sc": "Shapesanity Stitched Mixed", + "3-1 Wc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sg": "Shapesanity Stitched Mixed", + "3-1 Wc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sp": "Shapesanity Stitched Mixed", + "3-1 Wc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sr": "Shapesanity Stitched Mixed", + "3-1 Wc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Su": "Shapesanity Stitched Mixed", + "3-1 Wc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sw": "Shapesanity Stitched Mixed", + "3-1 Wc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Sy": "Shapesanity Stitched Mixed", + "3-1 Wc Wb": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wb": "Shapesanity Stitched Mixed", + "3-1 Wc Wg": "Shapesanity East Windmill Mixed", + "Half-Half Wc Wg": "Shapesanity East Windmill Mixed", + "Checkered Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Wg": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wg": "Shapesanity Stitched Mixed", + "3-1 Wc Wp": "Shapesanity East Windmill Mixed", + "Half-Half Wc Wp": "Shapesanity East Windmill Mixed", + "Checkered Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Wp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wp": "Shapesanity Stitched Mixed", + "3-1 Wc Wr": "Shapesanity East Windmill Mixed", + "Half-Half Wc Wr": "Shapesanity East Windmill Mixed", + "Checkered Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Wr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wr": "Shapesanity Stitched Mixed", + "3-1 Wc Wu": "Shapesanity East Windmill Mixed", + "Half-Half Wc Wu": "Shapesanity East Windmill Mixed", + "Checkered Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Wu": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wu": "Shapesanity Stitched Mixed", + "3-1 Wc Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wc Ww": "Shapesanity East Windmill Mixed", + "Checkered Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Ww": "Shapesanity Stitched Mixed", + "3-1 Wc Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wc Wy": "Shapesanity East Windmill Mixed", + "Checkered Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wc Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wc Wy": "Shapesanity Stitched Mixed", + "3-1 Wg Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Cb": "Shapesanity Stitched Painted", + "3-1 Wg Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Cc": "Shapesanity Stitched Mixed", + "3-1 Wg Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Cg": "Shapesanity Stitched Painted", + "3-1 Wg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Cp": "Shapesanity Stitched Mixed", + "3-1 Wg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Cr": "Shapesanity Stitched Painted", + "3-1 Wg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Cu": "Shapesanity Stitched Painted", + "3-1 Wg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Cw": "Shapesanity Stitched Mixed", + "3-1 Wg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Cy": "Shapesanity Stitched Mixed", + "3-1 Wg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Rb": "Shapesanity Stitched Painted", + "3-1 Wg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Rc": "Shapesanity Stitched Mixed", + "3-1 Wg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Rg": "Shapesanity Stitched Painted", + "3-1 Wg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Rp": "Shapesanity Stitched Mixed", + "3-1 Wg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Rr": "Shapesanity Stitched Painted", + "3-1 Wg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Ru": "Shapesanity Stitched Painted", + "3-1 Wg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Rw": "Shapesanity Stitched Mixed", + "3-1 Wg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Ry": "Shapesanity Stitched Mixed", + "3-1 Wg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Sb": "Shapesanity Stitched Painted", + "3-1 Wg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Sc": "Shapesanity Stitched Mixed", + "3-1 Wg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Sg": "Shapesanity Stitched Painted", + "3-1 Wg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Sp": "Shapesanity Stitched Mixed", + "3-1 Wg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Sr": "Shapesanity Stitched Painted", + "3-1 Wg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Su": "Shapesanity Stitched Painted", + "3-1 Wg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Sw": "Shapesanity Stitched Mixed", + "3-1 Wg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Sy": "Shapesanity Stitched Mixed", + "3-1 Wg Wb": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Wb": "Shapesanity Stitched Painted", + "3-1 Wg Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Wc": "Shapesanity Stitched Mixed", + "3-1 Wg Wp": "Shapesanity East Windmill Mixed", + "Half-Half Wg Wp": "Shapesanity East Windmill Mixed", + "Checkered Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wg Wp": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Wp": "Shapesanity Stitched Mixed", + "3-1 Wg Wr": "Shapesanity East Windmill Painted", + "Half-Half Wg Wr": "Shapesanity East Windmill Painted", + "Checkered Wg Wr": "Shapesanity East Windmill Painted", + "Adjacent Singles Wg Wr": "Shapesanity Colorful Half Painted", + "Cornered Singles Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Wr": "Shapesanity Stitched Painted", + "3-1 Wg Wu": "Shapesanity East Windmill Painted", + "Half-Half Wg Wu": "Shapesanity East Windmill Painted", + "Checkered Wg Wu": "Shapesanity East Windmill Painted", + "Adjacent Singles Wg Wu": "Shapesanity Colorful Half Painted", + "Cornered Singles Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wg Wu": "Shapesanity Stitched Painted", + "3-1 Wg Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wg Ww": "Shapesanity East Windmill Mixed", + "Checkered Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wg Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Ww": "Shapesanity Stitched Mixed", + "3-1 Wg Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wg Wy": "Shapesanity East Windmill Mixed", + "Checkered Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wg Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wg Wy": "Shapesanity Stitched Mixed", + "3-1 Wp Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cb": "Shapesanity Stitched Mixed", + "3-1 Wp Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cc": "Shapesanity Stitched Mixed", + "3-1 Wp Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cg": "Shapesanity Stitched Mixed", + "3-1 Wp Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cp": "Shapesanity Stitched Mixed", + "3-1 Wp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cr": "Shapesanity Stitched Mixed", + "3-1 Wp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cu": "Shapesanity Stitched Mixed", + "3-1 Wp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cw": "Shapesanity Stitched Mixed", + "3-1 Wp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Cy": "Shapesanity Stitched Mixed", + "3-1 Wp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rb": "Shapesanity Stitched Mixed", + "3-1 Wp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rc": "Shapesanity Stitched Mixed", + "3-1 Wp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rg": "Shapesanity Stitched Mixed", + "3-1 Wp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rp": "Shapesanity Stitched Mixed", + "3-1 Wp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rr": "Shapesanity Stitched Mixed", + "3-1 Wp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Ru": "Shapesanity Stitched Mixed", + "3-1 Wp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Rw": "Shapesanity Stitched Mixed", + "3-1 Wp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Ry": "Shapesanity Stitched Mixed", + "3-1 Wp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sb": "Shapesanity Stitched Mixed", + "3-1 Wp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sc": "Shapesanity Stitched Mixed", + "3-1 Wp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sg": "Shapesanity Stitched Mixed", + "3-1 Wp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sp": "Shapesanity Stitched Mixed", + "3-1 Wp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sr": "Shapesanity Stitched Mixed", + "3-1 Wp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Su": "Shapesanity Stitched Mixed", + "3-1 Wp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sw": "Shapesanity Stitched Mixed", + "3-1 Wp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Sy": "Shapesanity Stitched Mixed", + "3-1 Wp Wb": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wb": "Shapesanity Stitched Mixed", + "3-1 Wp Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wc": "Shapesanity Stitched Mixed", + "3-1 Wp Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wg": "Shapesanity Stitched Mixed", + "3-1 Wp Wr": "Shapesanity East Windmill Mixed", + "Half-Half Wp Wr": "Shapesanity East Windmill Mixed", + "Checkered Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wp Wr": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wr": "Shapesanity Stitched Mixed", + "3-1 Wp Wu": "Shapesanity East Windmill Mixed", + "Half-Half Wp Wu": "Shapesanity East Windmill Mixed", + "Checkered Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wp Wu": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wu": "Shapesanity Stitched Mixed", + "3-1 Wp Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wp Ww": "Shapesanity East Windmill Mixed", + "Checkered Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wp Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Ww": "Shapesanity Stitched Mixed", + "3-1 Wp Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wp Wy": "Shapesanity East Windmill Mixed", + "Checkered Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wp Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wp Wy": "Shapesanity Stitched Mixed", + "3-1 Wr Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Cb": "Shapesanity Stitched Painted", + "3-1 Wr Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Cc": "Shapesanity Stitched Mixed", + "3-1 Wr Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Cg": "Shapesanity Stitched Painted", + "3-1 Wr Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Cp": "Shapesanity Stitched Mixed", + "3-1 Wr Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Cr": "Shapesanity Stitched Painted", + "3-1 Wr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Cu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Cu": "Shapesanity Stitched Painted", + "3-1 Wr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Cw": "Shapesanity Stitched Mixed", + "3-1 Wr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Cy": "Shapesanity Stitched Mixed", + "3-1 Wr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Rb": "Shapesanity Stitched Painted", + "3-1 Wr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Rc": "Shapesanity Stitched Mixed", + "3-1 Wr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Rg": "Shapesanity Stitched Painted", + "3-1 Wr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Rp": "Shapesanity Stitched Mixed", + "3-1 Wr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Rr": "Shapesanity Stitched Painted", + "3-1 Wr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Ru": "Shapesanity Stitched Painted", + "3-1 Wr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Rw": "Shapesanity Stitched Mixed", + "3-1 Wr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Ry": "Shapesanity Stitched Mixed", + "3-1 Wr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Sb": "Shapesanity Stitched Painted", + "3-1 Wr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Sc": "Shapesanity Stitched Mixed", + "3-1 Wr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Sg": "Shapesanity Stitched Painted", + "3-1 Wr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Sp": "Shapesanity Stitched Mixed", + "3-1 Wr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Sr": "Shapesanity Stitched Painted", + "3-1 Wr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Su": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Su": "Shapesanity Stitched Painted", + "3-1 Wr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Sw": "Shapesanity Stitched Mixed", + "3-1 Wr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Sy": "Shapesanity Stitched Mixed", + "3-1 Wr Wb": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Wb": "Shapesanity Stitched Painted", + "3-1 Wr Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Wc": "Shapesanity Stitched Mixed", + "3-1 Wr Wg": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Wg": "Shapesanity Stitched Painted", + "3-1 Wr Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Wp": "Shapesanity Stitched Mixed", + "3-1 Wr Wu": "Shapesanity East Windmill Painted", + "Half-Half Wr Wu": "Shapesanity East Windmill Painted", + "Checkered Wr Wu": "Shapesanity East Windmill Painted", + "Adjacent Singles Wr Wu": "Shapesanity Colorful Half Painted", + "Cornered Singles Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1 Wr Wu": "Shapesanity Stitched Painted", + "3-1 Wr Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wr Ww": "Shapesanity East Windmill Mixed", + "Checkered Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wr Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Ww": "Shapesanity Stitched Mixed", + "3-1 Wr Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wr Wy": "Shapesanity East Windmill Mixed", + "Checkered Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wr Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wr Wy": "Shapesanity Stitched Mixed", + "3-1 Wu Cb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Cb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Cb": "Shapesanity Stitched Painted", + "3-1 Wu Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Cc": "Shapesanity Stitched Mixed", + "3-1 Wu Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Cg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Cg": "Shapesanity Stitched Painted", + "3-1 Wu Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Cp": "Shapesanity Stitched Mixed", + "3-1 Wu Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Cr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Cr": "Shapesanity Stitched Painted", + "3-1 Wu Cu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Wu Cu": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Wu Cu": "Shapesanity Stitched Uncolored", + "3-1 Wu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Cw": "Shapesanity Stitched Mixed", + "3-1 Wu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Cy": "Shapesanity Stitched Mixed", + "3-1 Wu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Rb": "Shapesanity Stitched Painted", + "3-1 Wu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Rc": "Shapesanity Stitched Mixed", + "3-1 Wu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Rg": "Shapesanity Stitched Painted", + "3-1 Wu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Rp": "Shapesanity Stitched Mixed", + "3-1 Wu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Rr": "Shapesanity Stitched Painted", + "3-1 Wu Ru": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Wu Ru": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Wu Ru": "Shapesanity Stitched Uncolored", + "3-1 Wu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Rw": "Shapesanity Stitched Mixed", + "3-1 Wu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Ry": "Shapesanity Stitched Mixed", + "3-1 Wu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Sb": "Shapesanity Stitched Painted", + "3-1 Wu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Sc": "Shapesanity Stitched Mixed", + "3-1 Wu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Sg": "Shapesanity Stitched Painted", + "3-1 Wu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Sp": "Shapesanity Stitched Mixed", + "3-1 Wu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1 Wu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Sr": "Shapesanity Stitched Painted", + "3-1 Wu Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1 Wu Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1 Wu Su": "Shapesanity Stitched Uncolored", + "3-1 Wu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Sw": "Shapesanity Stitched Mixed", + "3-1 Wu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Sy": "Shapesanity Stitched Mixed", + "3-1 Wu Wb": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Wb": "Shapesanity Stitched Painted", + "3-1 Wu Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Wc": "Shapesanity Stitched Mixed", + "3-1 Wu Wg": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Wg": "Shapesanity Stitched Painted", + "3-1 Wu Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Wp": "Shapesanity Stitched Mixed", + "3-1 Wu Wr": "Shapesanity East Windmill Painted", + "Adjacent 2-1 Wu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1 Wu Wr": "Shapesanity Stitched Painted", + "3-1 Wu Ww": "Shapesanity East Windmill Mixed", + "Half-Half Wu Ww": "Shapesanity East Windmill Mixed", + "Checkered Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wu Ww": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Ww": "Shapesanity Stitched Mixed", + "3-1 Wu Wy": "Shapesanity East Windmill Mixed", + "Half-Half Wu Wy": "Shapesanity East Windmill Mixed", + "Checkered Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Wu Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wu Wy": "Shapesanity Stitched Mixed", + "3-1 Ww Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cb": "Shapesanity Stitched Mixed", + "3-1 Ww Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cc": "Shapesanity Stitched Mixed", + "3-1 Ww Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cg": "Shapesanity Stitched Mixed", + "3-1 Ww Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cp": "Shapesanity Stitched Mixed", + "3-1 Ww Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cr": "Shapesanity Stitched Mixed", + "3-1 Ww Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cu": "Shapesanity Stitched Mixed", + "3-1 Ww Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cw": "Shapesanity Stitched Mixed", + "3-1 Ww Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Cy": "Shapesanity Stitched Mixed", + "3-1 Ww Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rb": "Shapesanity Stitched Mixed", + "3-1 Ww Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rc": "Shapesanity Stitched Mixed", + "3-1 Ww Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rg": "Shapesanity Stitched Mixed", + "3-1 Ww Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rp": "Shapesanity Stitched Mixed", + "3-1 Ww Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rr": "Shapesanity Stitched Mixed", + "3-1 Ww Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Ru": "Shapesanity Stitched Mixed", + "3-1 Ww Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Rw": "Shapesanity Stitched Mixed", + "3-1 Ww Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Ry": "Shapesanity Stitched Mixed", + "3-1 Ww Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sb": "Shapesanity Stitched Mixed", + "3-1 Ww Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sc": "Shapesanity Stitched Mixed", + "3-1 Ww Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sg": "Shapesanity Stitched Mixed", + "3-1 Ww Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sp": "Shapesanity Stitched Mixed", + "3-1 Ww Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sr": "Shapesanity Stitched Mixed", + "3-1 Ww Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Su": "Shapesanity Stitched Mixed", + "3-1 Ww Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sw": "Shapesanity Stitched Mixed", + "3-1 Ww Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Sy": "Shapesanity Stitched Mixed", + "3-1 Ww Wb": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wb": "Shapesanity Stitched Mixed", + "3-1 Ww Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wc": "Shapesanity Stitched Mixed", + "3-1 Ww Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wg": "Shapesanity Stitched Mixed", + "3-1 Ww Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wp": "Shapesanity Stitched Mixed", + "3-1 Ww Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wr": "Shapesanity Stitched Mixed", + "3-1 Ww Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Ww Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wu": "Shapesanity Stitched Mixed", + "3-1 Ww Wy": "Shapesanity East Windmill Mixed", + "Half-Half Ww Wy": "Shapesanity East Windmill Mixed", + "Checkered Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent Singles Ww Wy": "Shapesanity Colorful Half Mixed", + "Cornered Singles Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Ww Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Ww Wy": "Shapesanity Stitched Mixed", + "3-1 Wy Cb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cb": "Shapesanity Stitched Mixed", + "3-1 Wy Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cc": "Shapesanity Stitched Mixed", + "3-1 Wy Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cg": "Shapesanity Stitched Mixed", + "3-1 Wy Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cp": "Shapesanity Stitched Mixed", + "3-1 Wy Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cr": "Shapesanity Stitched Mixed", + "3-1 Wy Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cu": "Shapesanity Stitched Mixed", + "3-1 Wy Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cw": "Shapesanity Stitched Mixed", + "3-1 Wy Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Cy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Cy": "Shapesanity Stitched Mixed", + "3-1 Wy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rb": "Shapesanity Stitched Mixed", + "3-1 Wy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rc": "Shapesanity Stitched Mixed", + "3-1 Wy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rg": "Shapesanity Stitched Mixed", + "3-1 Wy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rp": "Shapesanity Stitched Mixed", + "3-1 Wy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rr": "Shapesanity Stitched Mixed", + "3-1 Wy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Ru": "Shapesanity Stitched Mixed", + "3-1 Wy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Rw": "Shapesanity Stitched Mixed", + "3-1 Wy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Ry": "Shapesanity Stitched Mixed", + "3-1 Wy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sb": "Shapesanity Stitched Mixed", + "3-1 Wy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sc": "Shapesanity Stitched Mixed", + "3-1 Wy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sg": "Shapesanity Stitched Mixed", + "3-1 Wy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sp": "Shapesanity Stitched Mixed", + "3-1 Wy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sr": "Shapesanity Stitched Mixed", + "3-1 Wy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Su": "Shapesanity Stitched Mixed", + "3-1 Wy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sw": "Shapesanity Stitched Mixed", + "3-1 Wy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1 Wy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Sy": "Shapesanity Stitched Mixed", + "3-1 Wy Wb": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wb": "Shapesanity Stitched Mixed", + "3-1 Wy Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wc": "Shapesanity Stitched Mixed", + "3-1 Wy Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wg": "Shapesanity Stitched Mixed", + "3-1 Wy Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wp": "Shapesanity Stitched Mixed", + "3-1 Wy Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wr": "Shapesanity Stitched Mixed", + "3-1 Wy Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Wu": "Shapesanity Stitched Mixed", + "3-1 Wy Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1 Wy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1 Wy Ww": "Shapesanity Stitched Mixed", +} + +shapesanity_three_parts = { + "Adjacent 2-1-1 Cb Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cc Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cg Cr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cb Cg Cr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cb Cg Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cb Cg Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cb Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cg Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Rb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Rg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Rr": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Ru": "Shapesanity Stitched Painted", + "Singles Cb Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cp Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cb Cr Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cb Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cr Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Rb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Rg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Rr": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Ru": "Shapesanity Stitched Painted", + "Singles Cb Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cb Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cu Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Rb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Rg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Rr": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Ru": "Shapesanity Stitched Painted", + "Singles Cb Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Sb": "Shapesanity Stitched Painted", + "Singles Cb Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Sg": "Shapesanity Stitched Painted", + "Singles Cb Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Sr": "Shapesanity Stitched Painted", + "Singles Cb Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Su": "Shapesanity Stitched Painted", + "Singles Cb Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Cu Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cb Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cb Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rb Rg": "Shapesanity Stitched Painted", + "Singles Cb Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rb Rr": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rb Ru": "Shapesanity Stitched Painted", + "Singles Cb Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Sb": "Shapesanity Stitched Painted", + "Singles Cb Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Sg": "Shapesanity Stitched Painted", + "Singles Cb Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rg Rr": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rg Ru": "Shapesanity Stitched Painted", + "Singles Cb Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Sb": "Shapesanity Stitched Painted", + "Singles Cb Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Sg": "Shapesanity Stitched Painted", + "Singles Cb Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Sr": "Shapesanity Stitched Painted", + "Singles Cb Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Rr Ru": "Shapesanity Stitched Painted", + "Singles Cb Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sb Sg": "Shapesanity Stitched Painted", + "Singles Cb Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sb Sr": "Shapesanity Stitched Painted", + "Singles Cb Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sb Su": "Shapesanity Stitched Painted", + "Singles Cb Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cb Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cb Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cb Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cg Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cg Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cg Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cg Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cg Cy": "Shapesanity Colorful Full Mixed", + "Singles Cc Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cp Cy": "Shapesanity Colorful Full Mixed", + "Singles Cc Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cr Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cr Cy": "Shapesanity Colorful Full Mixed", + "Singles Cc Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cc Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cu Cy": "Shapesanity Colorful Full Mixed", + "Singles Cc Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cc Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cc Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Rg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cb Cr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cg Cb Cr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cg Cb Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cg Cb Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cg Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cp Cy": "Shapesanity Colorful Full Mixed", + "Singles Cg Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cg Cr Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cg Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cr Cy": "Shapesanity Colorful Full Mixed", + "Singles Cg Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Rb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Rg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Rr": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Ru": "Shapesanity Stitched Painted", + "Singles Cg Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cr Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cg Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cu Cy": "Shapesanity Colorful Full Mixed", + "Singles Cg Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Rb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Rg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Rr": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Ru": "Shapesanity Stitched Painted", + "Singles Cg Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Sb": "Shapesanity Stitched Painted", + "Singles Cg Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Sg": "Shapesanity Stitched Painted", + "Singles Cg Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Sr": "Shapesanity Stitched Painted", + "Singles Cg Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Su": "Shapesanity Stitched Painted", + "Singles Cg Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Cu Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cg Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cg Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rb Rg": "Shapesanity Stitched Painted", + "Singles Cg Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rb Rr": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rb Ru": "Shapesanity Stitched Painted", + "Singles Cg Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Sb": "Shapesanity Stitched Painted", + "Singles Cg Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Sg": "Shapesanity Stitched Painted", + "Singles Cg Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rg Rr": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rg Ru": "Shapesanity Stitched Painted", + "Singles Cg Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Sb": "Shapesanity Stitched Painted", + "Singles Cg Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Sg": "Shapesanity Stitched Painted", + "Singles Cg Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Sr": "Shapesanity Stitched Painted", + "Singles Cg Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Rr Ru": "Shapesanity Stitched Painted", + "Singles Cg Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cg Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cg Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cg Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Su": "Shapesanity Stitched Painted", + "Singles Cg Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sb Sg": "Shapesanity Stitched Painted", + "Singles Cg Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sb Sr": "Shapesanity Stitched Painted", + "Singles Cg Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sb Su": "Shapesanity Stitched Painted", + "Singles Cg Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cg Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cg Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cg Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cg Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cg Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cr Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cr Cy": "Shapesanity Colorful Full Mixed", + "Singles Cp Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cp Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cu Cy": "Shapesanity Colorful Full Mixed", + "Singles Cp Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cp Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cp Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Rg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cb Cg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cr Cb Cg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cr Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cb Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cr Cb Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cr Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cg Cu": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cr Cg Cu": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cr Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cg Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cp Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cr Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cu Cy": "Shapesanity Colorful Full Mixed", + "Singles Cr Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Rb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Rg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Rr": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Ru": "Shapesanity Stitched Painted", + "Singles Cr Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Sb": "Shapesanity Stitched Painted", + "Singles Cr Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Sg": "Shapesanity Stitched Painted", + "Singles Cr Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Sr": "Shapesanity Stitched Painted", + "Singles Cr Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Su": "Shapesanity Stitched Painted", + "Singles Cr Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Cu Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cr Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cr Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rb Rg": "Shapesanity Stitched Painted", + "Singles Cr Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rb Rr": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rb Ru": "Shapesanity Stitched Painted", + "Singles Cr Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Sb": "Shapesanity Stitched Painted", + "Singles Cr Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Sg": "Shapesanity Stitched Painted", + "Singles Cr Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rg Rr": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rg Ru": "Shapesanity Stitched Painted", + "Singles Cr Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Sb": "Shapesanity Stitched Painted", + "Singles Cr Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Sg": "Shapesanity Stitched Painted", + "Singles Cr Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Sr": "Shapesanity Stitched Painted", + "Singles Cr Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Rr Ru": "Shapesanity Stitched Painted", + "Singles Cr Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Sb": "Shapesanity Stitched Painted", + "Singles Cr Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Sg": "Shapesanity Stitched Painted", + "Singles Cr Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Sr": "Shapesanity Stitched Painted", + "Singles Cr Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Su": "Shapesanity Stitched Painted", + "Singles Cr Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Rr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cr Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cr Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cr Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Su": "Shapesanity Stitched Painted", + "Singles Cr Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cr Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sb Sg": "Shapesanity Stitched Painted", + "Singles Cr Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sb Sr": "Shapesanity Stitched Painted", + "Singles Cr Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sb Su": "Shapesanity Stitched Painted", + "Singles Cr Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cr Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cb Cg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cu Cb Cg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cu Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cb Cr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cu Cb Cr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cu Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cg Cr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Cu Cg Cr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Cu Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cg Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cp Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cr Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cu Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cu Cw Cy": "Shapesanity Colorful Full Mixed", + "Singles Cu Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rb Rg": "Shapesanity Stitched Painted", + "Singles Cu Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rb Rr": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rb Ru": "Shapesanity Stitched Painted", + "Singles Cu Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Sb": "Shapesanity Stitched Painted", + "Singles Cu Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Sg": "Shapesanity Stitched Painted", + "Singles Cu Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rg Rr": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rg Ru": "Shapesanity Stitched Painted", + "Singles Cu Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Sb": "Shapesanity Stitched Painted", + "Singles Cu Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Sg": "Shapesanity Stitched Painted", + "Singles Cu Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Sr": "Shapesanity Stitched Painted", + "Singles Cu Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Rr Ru": "Shapesanity Stitched Painted", + "Singles Cu Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Sb": "Shapesanity Stitched Painted", + "Singles Cu Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Sg": "Shapesanity Stitched Painted", + "Singles Cu Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Sr": "Shapesanity Stitched Painted", + "Singles Cu Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Su": "Shapesanity Stitched Painted", + "Singles Cu Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Rr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Sb": "Shapesanity Stitched Painted", + "Singles Cu Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Sg": "Shapesanity Stitched Painted", + "Singles Cu Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Cu Ru Su": "Shapesanity Stitched Uncolored", + "Singles Cu Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Wb": "Shapesanity Stitched Painted", + "Singles Cu Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Ru Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Cu Ru Wu": "Shapesanity Stitched Uncolored", + "Singles Cu Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sb Sg": "Shapesanity Stitched Painted", + "Singles Cu Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sb Sr": "Shapesanity Stitched Painted", + "Singles Cu Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sb Su": "Shapesanity Stitched Painted", + "Singles Cu Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sb Wb": "Shapesanity Stitched Painted", + "Singles Cu Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sb Wg": "Shapesanity Stitched Painted", + "Singles Cu Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sb Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sb Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Cu Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Su Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Cu Su Wu": "Shapesanity Stitched Uncolored", + "Singles Cu Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Cu Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Cu Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cu Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cb Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cc Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cc Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cg Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cg Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cg Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cg Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cg Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cg Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cp Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cp Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cr Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cr Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cr Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Cy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cw Cu Cy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cw Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Rg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Cc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cb Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Cg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cc Cg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cc Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cc Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cc Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cc Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cc Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cc Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cc Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cc Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Cp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cg Cp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cg Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cg Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cg Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cg Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cg Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cg Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Cr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cp Cr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cp Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cp Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cp Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cp Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Cu": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cr Cu": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cr Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cr Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Cw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Cy Cu Cw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Cy Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Rc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Rg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rb Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Cy Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rc Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rg Rr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rb Rg Rr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rb Rg Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rb Rg Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rb Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rg Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Sb": "Shapesanity Stitched Painted", + "Singles Rb Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Sg": "Shapesanity Stitched Painted", + "Singles Rb Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Sr": "Shapesanity Stitched Painted", + "Singles Rb Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Su": "Shapesanity Stitched Painted", + "Singles Rb Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rg Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rp Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rb Rr Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rb Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rr Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Sb": "Shapesanity Stitched Painted", + "Singles Rb Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Sg": "Shapesanity Stitched Painted", + "Singles Rb Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Sr": "Shapesanity Stitched Painted", + "Singles Rb Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Su": "Shapesanity Stitched Painted", + "Singles Rb Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Rr Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rb Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Ru Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Sb": "Shapesanity Stitched Painted", + "Singles Rb Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Sg": "Shapesanity Stitched Painted", + "Singles Rb Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Sr": "Shapesanity Stitched Painted", + "Singles Rb Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Su": "Shapesanity Stitched Painted", + "Singles Rb Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Wb": "Shapesanity Stitched Painted", + "Singles Rb Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Wg": "Shapesanity Stitched Painted", + "Singles Rb Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Wr": "Shapesanity Stitched Painted", + "Singles Rb Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Ru Wu": "Shapesanity Stitched Painted", + "Singles Rb Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rb Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Rb Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sb Sg": "Shapesanity Stitched Painted", + "Singles Rb Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sb Sr": "Shapesanity Stitched Painted", + "Singles Rb Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sb Su": "Shapesanity Stitched Painted", + "Singles Rb Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sb Wb": "Shapesanity Stitched Painted", + "Singles Rb Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sb Wg": "Shapesanity Stitched Painted", + "Singles Rb Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sb Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sb Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sg Sr": "Shapesanity Stitched Painted", + "Singles Rb Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sg Su": "Shapesanity Stitched Painted", + "Singles Rb Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sg Wb": "Shapesanity Stitched Painted", + "Singles Rb Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sg Wg": "Shapesanity Stitched Painted", + "Singles Rb Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sg Wr": "Shapesanity Stitched Painted", + "Singles Rb Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sg Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Sr Su": "Shapesanity Stitched Painted", + "Singles Rb Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rb Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wb Wg": "Shapesanity Stitched Painted", + "Singles Rb Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wb Wr": "Shapesanity Stitched Painted", + "Singles Rb Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wb Wu": "Shapesanity Stitched Painted", + "Singles Rb Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rb Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rb Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rg Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rg Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rg Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rg Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rg Ry": "Shapesanity Colorful Full Mixed", + "Singles Rc Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rp Ry": "Shapesanity Colorful Full Mixed", + "Singles Rc Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rr Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rr Ry": "Shapesanity Colorful Full Mixed", + "Singles Rc Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rc Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Ru Ry": "Shapesanity Colorful Full Mixed", + "Singles Rc Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rc Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Rc Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rb Rr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rg Rb Rr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rg Rb Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rg Rb Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rg Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rp Ry": "Shapesanity Colorful Full Mixed", + "Singles Rg Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rg Rr Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rg Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rr Ry": "Shapesanity Colorful Full Mixed", + "Singles Rg Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Rg Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Rg Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Rg Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Rg Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rg Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Ru Ry": "Shapesanity Colorful Full Mixed", + "Singles Rg Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Rg Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Rg Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Rg Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Rg Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Rg Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Rg Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Rg Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Rg Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rg Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Rg Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sb Sg": "Shapesanity Stitched Painted", + "Singles Rg Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sb Sr": "Shapesanity Stitched Painted", + "Singles Rg Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sb Su": "Shapesanity Stitched Painted", + "Singles Rg Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Rg Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Rg Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sg Sr": "Shapesanity Stitched Painted", + "Singles Rg Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sg Su": "Shapesanity Stitched Painted", + "Singles Rg Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Rg Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sg Wg": "Shapesanity Stitched Painted", + "Singles Rg Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Rg Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Sr Su": "Shapesanity Stitched Painted", + "Singles Rg Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Rg Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Rg Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Rg Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wb Wg": "Shapesanity Stitched Painted", + "Singles Rg Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wb Wr": "Shapesanity Stitched Painted", + "Singles Rg Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wb Wu": "Shapesanity Stitched Painted", + "Singles Rg Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rg Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rg Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rg Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rg Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rr Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rr Ry": "Shapesanity Colorful Full Mixed", + "Singles Rp Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rp Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Ru Ry": "Shapesanity Colorful Full Mixed", + "Singles Rp Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rp Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Rp Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rb Rg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rr Rb Rg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rr Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rb Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rr Rb Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rr Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rg Ru": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Rr Rg Ru": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Rr Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rg Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rp Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rr Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Ru Ry": "Shapesanity Colorful Full Mixed", + "Singles Rr Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Rr Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Rr Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Rr Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Rr Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Rr Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Rr Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Rr Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Rr Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rr Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Rr Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sb Sg": "Shapesanity Stitched Painted", + "Singles Rr Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sb Sr": "Shapesanity Stitched Painted", + "Singles Rr Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sb Su": "Shapesanity Stitched Painted", + "Singles Rr Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Rr Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Rr Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sg Sr": "Shapesanity Stitched Painted", + "Singles Rr Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sg Su": "Shapesanity Stitched Painted", + "Singles Rr Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Rr Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Rr Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Rr Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Sr Su": "Shapesanity Stitched Painted", + "Singles Rr Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Rr Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Rr Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Rr Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Rr Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Rr Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Rr Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Rr Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wb Wg": "Shapesanity Stitched Painted", + "Singles Rr Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wb Wr": "Shapesanity Stitched Painted", + "Singles Rr Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wb Wu": "Shapesanity Stitched Painted", + "Singles Rr Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Rr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Rr Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Ru Cu Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Ru Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Cu Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Ru Cu Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Ru Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rb Rg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Ru Rb Rg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Ru Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rb Rr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Ru Rb Rr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Ru Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rg Rr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Ru Rg Rr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Ru Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rg Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rp Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rr Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ru Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ru Rw Ry": "Shapesanity Colorful Full Mixed", + "Singles Ru Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sb Sg": "Shapesanity Stitched Painted", + "Singles Ru Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sb Sr": "Shapesanity Stitched Painted", + "Singles Ru Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sb Su": "Shapesanity Stitched Painted", + "Singles Ru Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Ru Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Ru Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sg Sr": "Shapesanity Stitched Painted", + "Singles Ru Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sg Su": "Shapesanity Stitched Painted", + "Singles Ru Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Ru Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Ru Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Ru Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Sr Su": "Shapesanity Stitched Painted", + "Singles Ru Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Ru Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Ru Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Ru Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Ru Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Ru Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Ru Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Su Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Ru Su Wu": "Shapesanity Stitched Uncolored", + "Singles Ru Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wb Wg": "Shapesanity Stitched Painted", + "Singles Ru Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wb Wr": "Shapesanity Stitched Painted", + "Singles Ru Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wb Wu": "Shapesanity Stitched Painted", + "Singles Ru Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Ru Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Ru Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ru Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rb Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rc Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rc Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rg Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rg Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rg Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rg Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rg Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rg Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rp Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rp Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rr Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rr Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Rr Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Ry": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Rw Ru Ry": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Rw Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Rw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Rc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Rc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rb Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Rg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rc Rg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rc Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rc Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rc Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rc Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rc Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rc Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rc Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rc Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Rp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rg Rp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rg Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rg Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rg Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rg Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rg Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rg Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Rr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rp Rr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rp Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rp Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rp Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rp Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Ru": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rr Ru": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rr Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Rr Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Rw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Ry Ru Rw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Ry Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Rw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ry Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sc Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sg Sr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sb Sg Sr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sb Sg Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sb Sg Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sb Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sg Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Sb Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Sb Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Sb Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Sb Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sp Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sr Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sb Sr Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sb Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sr Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Sb Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Sb Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Sb Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Sb Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sb Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Su Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Sb Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Sb Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Sb Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Sb Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Sb Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Sb Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Sb Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sb Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Sb Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Sb Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Sb Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Sb Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Sb Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Sb Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sb Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Sb Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sb Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sb Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sg Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sg Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sg Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sg Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sg Sy": "Shapesanity Colorful Full Mixed", + "Singles Sc Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sp Sy": "Shapesanity Colorful Full Mixed", + "Singles Sc Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sr Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sr Sy": "Shapesanity Colorful Full Mixed", + "Singles Sc Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sc Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Su Sy": "Shapesanity Colorful Full Mixed", + "Singles Sc Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Sc Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Sc Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Sc Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Sc Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Sc Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Sc Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Sc Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sc Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Sc Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sc Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sb Sr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sg Sb Sr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sg Sb Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sg Sb Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sg Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sp Sy": "Shapesanity Colorful Full Mixed", + "Singles Sg Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sr Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sg Sr Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sg Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sr Sy": "Shapesanity Colorful Full Mixed", + "Singles Sg Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Sg Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Sg Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Sg Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Sg Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sg Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Su Sy": "Shapesanity Colorful Full Mixed", + "Singles Sg Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Sg Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Sg Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Sg Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Sg Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Sg Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Sg Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Sg Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sg Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Sg Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Sg Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Sg Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Sg Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Sg Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Sg Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Sg Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sg Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sg Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sg Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sg Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sg Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sr Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sr Sy": "Shapesanity Colorful Full Mixed", + "Singles Sp Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sp Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Su Sy": "Shapesanity Colorful Full Mixed", + "Singles Sp Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Sp Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Sp Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Sp Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Sp Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Sp Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Sp Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Sp Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sp Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Sp Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sp Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sb Sg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sr Sb Sg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sr Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sb Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sr Sb Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sr Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sg Su": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Sr Sg Su": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Sr Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sg Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sp Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sr Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Su Sy": "Shapesanity Colorful Full Mixed", + "Singles Sr Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Sr Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Sr Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Sr Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Sr Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Sr Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Sr Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Sr Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sr Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Sr Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sr Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sr Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sr Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Sr Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Sr Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Sr Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Sr Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Sr Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Sr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Sr Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sr Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Ru": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Su Cu Ru": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Su Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Cu Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Su Cu Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Su Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Ru Wu": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Su Ru Wu": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Su Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sb Sg": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Su Sb Sg": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Su Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sb Sr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Su Sb Sr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Su Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sg Sr": "Shapesanity Colorful Full Painted", + "Cornered 2-1-1 Su Sg Sr": "Shapesanity Colorful Full Painted", + "Adjacent 2-1-1 Su Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sg Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sp Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sr Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Su Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Su Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Su Sw Sy": "Shapesanity Colorful Full Mixed", + "Singles Su Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Su Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Su Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Su Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Su Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Su Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Su Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Su Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Su Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Su Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Su Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Su Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Su Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Su Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Su Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Su Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Su Wb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Su Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Su Wb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Su Wb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Su Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Su Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Su Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Su Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Su Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Su Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Su Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Su Wg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Su Wg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Su Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Su Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Su Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Su Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Su Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Su Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Su Wr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Su Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Su Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Su Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Su Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Su Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sb Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sc Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sc Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sg Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sg Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sg Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sg Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sg Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sg Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sp Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sp Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sr Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sr Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Sr Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Sy": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sw Su Sy": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sw Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Su Wy": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sw Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sw Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Sc": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Sc": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sb Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Sg": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sc Sg": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sc Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sc Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sc Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sc Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sc Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sc Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sc Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sc Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Sp": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sg Sp": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sg Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sg Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sg Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sg Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sg Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sg Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Sr": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sp Sr": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sp Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sp Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sp Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sp Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Su": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sr Su": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sr Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Sr Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Sw": "Shapesanity Colorful Full Mixed", + "Cornered 2-1-1 Sy Su Sw": "Shapesanity Colorful Full Mixed", + "Adjacent 2-1-1 Sy Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Sy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Sy Ww Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wb Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wb Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wb Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wb Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wb Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wb Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wg Wr": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wb Wg Wr": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wb Wg Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wb Wg Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wb Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wr Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wb Wr Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wb Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wb Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wb Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wc Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wc Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wc Wb Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wb Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wb Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wg Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wg Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wg Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wg Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wr Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wr Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wc Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wc Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wg Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wg Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wg Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wg Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wg Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wg Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wb Wr": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wg Wb Wr": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wg Wb Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wg Wb Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wg Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wr Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wg Wr Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wg Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wg Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wg Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wp Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wp Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wp Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wb Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wb Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wb Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wg Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wg Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wg Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wg Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wr Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wr Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wp Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wp Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Cu Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Rr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Ru Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sb Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sg Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wr Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Sr Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Wu": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wr Su Wu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wr Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wr Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wr Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wr Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wb Wg": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wr Wb Wg": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wr Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wb Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wr Wb Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wr Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wg Wu": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wr Wg Wu": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wr Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wu Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wr Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wr Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Cg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cb Cg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cb Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cb Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Cr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cg Cr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cg Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Cu": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Cr Cu": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Ru": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Rb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Rb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Rg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Rr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Ru": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Wu Cu Ru": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Wu Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Wu Cu Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Wu Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Cu Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rb Rg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rb Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rb Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rg Rr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rg Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Rr Ru": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Su": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Rr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Sb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Sb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Sg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Sr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Su": "Shapesanity Stitched Uncolored", + "Cornered 2-1-1 Wu Ru Su": "Shapesanity Stitched Uncolored", + "Adjacent 2-1-1 Wu Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Ru Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sb Sg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sb Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sb Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sb Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sb Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sb Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sg Sr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sg Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sg Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sg Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sg Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sg Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Su": "Shapesanity Colorful Half-Half Painted", + "Cornered 2-1-1 Wu Sr Su": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sr Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sr Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Sr Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Wb": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Su Wb": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Wg": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Su Wg": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Wr": "Shapesanity Stitched Painted", + "Cornered 2-1-1 Wu Su Wr": "Shapesanity Stitched Painted", + "Adjacent 2-1-1 Wu Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wu Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wu Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wu Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wb Wg": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wu Wb Wg": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wu Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wb Wr": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wu Wb Wr": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wu Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wg Wr": "Shapesanity East Windmill Painted", + "Cornered 2-1-1 Wu Wg Wr": "Shapesanity East Windmill Painted", + "Adjacent 2-1-1 Wu Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wu Ww Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wu Ww Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cu Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cu Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Cy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Cy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ru Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ru Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Rw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Rw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Ry Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Ry Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sb Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sb Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sc Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sc Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sg Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sg Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sp Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sp Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sr Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sr Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Su Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Su Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Ww Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sw Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sw Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Sy Wy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Ww Sy Wy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Ww Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wb Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wb Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wb Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wb Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wb Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wc Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wc Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wg Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wg Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wg Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wg Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wg Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wg Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wp Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wp Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wr Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wr Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wr Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wr Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Ww Wu Wy": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Ww Wu Wy": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Cb Cc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cb Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cc Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Cp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cg Cp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cg Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cg Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cg Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cg Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Cr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cp Cr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cp Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cp Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cp Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Cu": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cr Cu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cr Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cr Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Cw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cu Cw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cu Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cu Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cu Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Cy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Cw Cy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Ru": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Rw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Ry": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Cy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Cy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Rc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rb Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Rg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rc Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rg Rp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rg Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rg Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rg Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rg Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rp Rr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rp Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rp Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rp Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rr Ru": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rr Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rr Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Ru Rw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Ru Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ru Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ru Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Rw Ry": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Rw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Rw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Su": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sw": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Sy": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Ry Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Ry Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sb Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sb Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sb Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Sg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sc Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sc Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sc Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sg Sp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sg Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sg Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sg Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sg Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sg Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sg Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sp Sr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sp Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sp Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sp Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sp Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sp Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sr Su": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sr Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sr Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sr Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sr Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Su Sw": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Su Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Su Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Su Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Cornered 2-1-1 Wy Sw Sy": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sw Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sw Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wb": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wb": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wc": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wc": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wg": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wg": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wp": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wp": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wr": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wr": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Wu": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Wu": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Sy Ww": "Shapesanity Stitched Mixed", + "Cornered 2-1-1 Wy Sy Ww": "Shapesanity Stitched Mixed", + "Adjacent 2-1-1 Wy Wb Wc": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Wc": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wb Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wb Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wb Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wb Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wb Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wb Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wc Wg": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wc Wg": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wc Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wc Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wc Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wc Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wc Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wc Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wc Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wc Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wg Wp": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wg Wp": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wg Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wg Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wg Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wg Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wg Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wg Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wp Wr": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wp Wr": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wp Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wp Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wp Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wp Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wr Wu": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wr Wu": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wr Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wr Ww": "Shapesanity East Windmill Mixed", + "Adjacent 2-1-1 Wy Wu Ww": "Shapesanity East Windmill Mixed", + "Cornered 2-1-1 Wy Wu Ww": "Shapesanity East Windmill Mixed", +} + +shapesanity_four_parts = { + "Singles Cb Cc Cg Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Rb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Rg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Rr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Ru": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Rb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Rg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Rr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Ru": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rb Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rg Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Cg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Cg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Cg Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Cg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Cu Rb": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Rg": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Rr": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Ru": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rb Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rg Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Cr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Cr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Cr Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Cr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rb Sb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Sg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Sr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Su": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rg Sb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Sg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Sr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Su": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Cu Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cb Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cb Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Rr": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Ru": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Sb": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Sg": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Ru": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Sg": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Ru": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Sg": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Sr": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Sg": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Sr": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Su": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Rr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Sg": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Sr": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Su": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Ru Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Cb Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cb Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cb Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cb Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Cb Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Cb Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Cb Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Cb Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Cb Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Cb Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Cb Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cb Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cb Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cb Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cb Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cb Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cc Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cc Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cc Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Cu Rb": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Rg": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Rr": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Ru": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rb Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rg Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rr Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Cr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Cr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Cr Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Cr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rb Sb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Sg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Sr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Su": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rg Sb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Sg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Sr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Su": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rr Sb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Sg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Sr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Su": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Cu Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cg Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cg Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Rr": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Ru": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Sb": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Sg": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Ru": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Sb": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Sg": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Sg": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Ru": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Sg": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Sr": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Rg Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Sg": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Sr": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Su": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Rr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Sg": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Sr": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Su": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Ru Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Cg Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cg Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cg Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cg Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Cg Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Cg Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Cg Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Cg Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Cg Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Cg Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Cg Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cg Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cg Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cg Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cg Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cg Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cp Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cp Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cp Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Ru": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rb Rg": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rb Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rb Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rb Sb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Sg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Sr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Su": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rg Rr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rg Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rg Sb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Sg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Sr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Su": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Ru": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rr Sb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Sg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Sr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Su": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Ru Sb": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Sg": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Sr": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Su": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Cu Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Cu Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Cu Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Cu Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cu Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cu Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Cr Cu Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cu Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cr Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Rr": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Ru": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Sb": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Sg": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Ru": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Sb": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Sg": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Sb": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Sg": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Sg": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Ru": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Sg": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Sr": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Sg": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Sr": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Su": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Rr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Sg": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Sr": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Su": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Ru Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Cr Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cr Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cr Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cr Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Cr Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Cr Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Cr Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Cr Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Cr Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Cr Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Cr Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cr Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cr Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cr Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cr Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cr Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Ru": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Rw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Ry": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Cy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cu Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Rr": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Ru": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Sb": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Sg": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Ru": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Sb": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Sg": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Sb": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Sg": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Sg": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Ru": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Sg": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Sr": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Sg": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Sr": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Su": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Rr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Sg": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Sr": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Su": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Ru Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Cu Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Cu Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Cu Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Cu Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Cu Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Cu Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Cu Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Cu Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Cu Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Cu Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Cu Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Cu Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Cu Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Cu Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cu Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cu Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Rc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rb Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Rg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Rp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rg Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rg Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rg Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rg Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Rr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rp Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rp Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rp Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Ru": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rr Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rr Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Rw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Ru Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Ry": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Cy Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Cy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Cy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Cw Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cw Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cw Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Rg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Rp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Rr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Ru": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Rw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Ry": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ru Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ru Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Rw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Rw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Ry Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Ry Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Cy Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Cy Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Sb": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Sg": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Sr": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Su": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Sb": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Sg": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Sr": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Su": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sb Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sb Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sb Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Sb Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sg Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sg Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sg Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Sg Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Rg Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Rr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Rb Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Rb Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Rb Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Rb Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Rb Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Rb Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Rb Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Rb Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rb Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rb Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Rb Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Rb Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Rb Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Rb Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Rb Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Rb Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Rb Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Rb Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Rb Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Rb Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Rb Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Rb Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Rb Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Rb Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Rb Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Rb Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Rb Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Rb Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rb Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rb Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rb Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rb Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rb Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rc Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rc Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rc Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Su": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Su": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Su": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Su": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Ru Sb": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Sg": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Sr": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Su": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sb Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sb Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sb Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Sb Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sg Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sg Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sg Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Sg Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sr Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sr Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sr Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Sr Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Rr Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Rr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Rg Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Rg Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Rg Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Rg Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Rg Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Rg Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Rg Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Rg Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Rg Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Rg Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Rg Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Rg Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rg Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rg Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Rg Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Rg Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Rg Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Rg Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Rg Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Rg Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Rg Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Rg Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Rg Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Rg Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Rg Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Rg Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Rg Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Rg Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Rg Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Rg Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Rg Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Rg Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Rg Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Rg Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rg Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rg Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rg Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rg Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rg Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Su": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ru Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Su": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Su": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rp Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rp Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rp Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Su": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sw": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Rw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Su": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sb Sg": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sb Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sb Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sb Wb": "Shapesanity Stitched Painted", + "Singles Rr Ru Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sb Wg": "Shapesanity Stitched Painted", + "Singles Rr Ru Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sb Wr": "Shapesanity Stitched Painted", + "Singles Rr Ru Sb Wu": "Shapesanity Stitched Painted", + "Singles Rr Ru Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sg Sr": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sg Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sg Wb": "Shapesanity Stitched Painted", + "Singles Rr Ru Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sg Wg": "Shapesanity Stitched Painted", + "Singles Rr Ru Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sg Wr": "Shapesanity Stitched Painted", + "Singles Rr Ru Sg Wu": "Shapesanity Stitched Painted", + "Singles Rr Ru Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sr Su": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sr Wb": "Shapesanity Stitched Painted", + "Singles Rr Ru Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sr Wg": "Shapesanity Stitched Painted", + "Singles Rr Ru Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sr Wr": "Shapesanity Stitched Painted", + "Singles Rr Ru Sr Wu": "Shapesanity Stitched Painted", + "Singles Rr Ru Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Su Wb": "Shapesanity Stitched Painted", + "Singles Rr Ru Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Su Wg": "Shapesanity Stitched Painted", + "Singles Rr Ru Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Su Wr": "Shapesanity Stitched Painted", + "Singles Rr Ru Su Wu": "Shapesanity Stitched Painted", + "Singles Rr Ru Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ru Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ru Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Rr Ru Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ru Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rr Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Rr Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Rr Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Rr Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Rr Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Rr Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Rr Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Rr Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Rr Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Rr Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Rr Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Rr Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Rr Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Rr Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Rr Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Rr Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Rr Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Rr Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Rr Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Rr Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Rr Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Rr Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Rr Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Rr Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Rr Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Rr Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Rr Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Rr Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Rr Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rr Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rr Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Su": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sw": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Sy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Ry Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sb Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Su Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Rw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Rw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Rw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Ru Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Sr": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Su": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Wb": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Wg": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Su": "Shapesanity Stitched Painted", + "Singles Ru Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Wb": "Shapesanity Stitched Painted", + "Singles Ru Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Wg": "Shapesanity Stitched Painted", + "Singles Ru Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Sr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Wb": "Shapesanity Stitched Painted", + "Singles Ru Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Wg": "Shapesanity Stitched Painted", + "Singles Ru Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Su Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wb Wg": "Shapesanity Stitched Painted", + "Singles Ru Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wb Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Wb Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Sb Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Su": "Shapesanity Stitched Painted", + "Singles Ru Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Ru Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Ru Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Ru Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Ru Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Ru Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Ru Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wb Wg": "Shapesanity Stitched Painted", + "Singles Ru Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wb Wr": "Shapesanity Stitched Painted", + "Singles Ru Sg Wb Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Sg Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Ru Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Ru Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Ru Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Ru Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wb Wg": "Shapesanity Stitched Painted", + "Singles Ru Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wb Wr": "Shapesanity Stitched Painted", + "Singles Ru Sr Wb Wu": "Shapesanity Stitched Painted", + "Singles Ru Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Sr Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Su Wb Wg": "Shapesanity Stitched Painted", + "Singles Ru Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Wb Wr": "Shapesanity Stitched Painted", + "Singles Ru Su Wb Wu": "Shapesanity Stitched Painted", + "Singles Ru Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Su Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Su Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Ru Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Ru Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Ru Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ru Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ru Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Sc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sb Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Sg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Sp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sg Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sg Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sg Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sg Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Sr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sp Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sp Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sp Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Su": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sr Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sr Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Sw": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Su Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Sy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Ry Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Ry Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Ry Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Rw Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Rw Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Rw Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Sg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Su": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Su": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Su": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Su": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Sp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Su": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Su": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Su": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Sr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Su": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Su": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Su": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Sw": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Sy": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Su Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Su Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Su Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Su Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sw Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sw Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wc": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wb Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Sy Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Sy Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Ry Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Ry Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sg Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Su Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sc Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sc Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sc Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sr Wb": "Shapesanity Stitched Painted", + "Singles Sb Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sr Wg": "Shapesanity Stitched Painted", + "Singles Sb Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sr Wr": "Shapesanity Stitched Painted", + "Singles Sb Sg Sr Wu": "Shapesanity Stitched Painted", + "Singles Sb Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sg Su Wb": "Shapesanity Stitched Painted", + "Singles Sb Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Su Wg": "Shapesanity Stitched Painted", + "Singles Sb Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Su Wr": "Shapesanity Stitched Painted", + "Singles Sb Sg Su Wu": "Shapesanity Stitched Painted", + "Singles Sb Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Sb Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Sb Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Sb Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Sb Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Sr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sb Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sb Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sb Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sb Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sb Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Sb Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Sb Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Sb Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Sb Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sb Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sb Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sp Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Su Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sg Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sg Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sg Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sc Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sc Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sc Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sc Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sc Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sc Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sp Su Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sp Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sp Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sp Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Su Wb": "Shapesanity Stitched Painted", + "Singles Sg Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sr Su Wg": "Shapesanity Stitched Painted", + "Singles Sg Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sr Su Wr": "Shapesanity Stitched Painted", + "Singles Sg Sr Su Wu": "Shapesanity Stitched Painted", + "Singles Sg Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Sr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sg Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sg Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sg Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sg Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sg Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sg Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sg Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Sg Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Sg Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Sg Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Sg Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sg Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sg Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sr Su Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sr Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sr Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sr Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sp Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sp Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sp Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sp Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sp Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sp Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sp Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sp Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wb": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wc": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wg": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wp": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wr": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wu": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Ww": "Shapesanity Stitched Mixed", + "Singles Sr Su Sw Wy": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sr Su Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sr Su Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wb Wg": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wb Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wb Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wg Wr": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wg Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wr Wu": "Shapesanity Colorful Half-Half Painted", + "Singles Sr Su Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Su Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Sr Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Sr Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sr Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Sr Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Sr Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Sr Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Sr Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sr Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sr Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wb": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wc": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wg": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wp": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wr": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wu": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Ww": "Shapesanity Stitched Mixed", + "Singles Su Sw Sy Wy": "Shapesanity Stitched Mixed", + "Singles Su Sw Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sw Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Su Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Su Wb Wg Wr": "Shapesanity Stitched Painted", + "Singles Su Wb Wg Wu": "Shapesanity Stitched Painted", + "Singles Su Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Su Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Su Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Wr Wu": "Shapesanity Stitched Painted", + "Singles Su Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Su Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Su Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Su Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Su Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Su Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Su Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Su Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Su Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Su Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Su Wg Wr Wu": "Shapesanity Stitched Painted", + "Singles Su Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Su Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Su Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Su Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Su Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Su Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Su Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Su Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Su Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Sy Wb Wc": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wb Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Wg": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wc Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wg Wp": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wg Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wg Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wg Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wg Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wp Wr": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wp Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wp Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wp Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wr Wu": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wr Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wr Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wu Ww": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Wu Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Sy Ww Wy": "Shapesanity Colorful Half-Half Mixed", + "Singles Sw Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sw Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sw Wu Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Wg": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wc Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wb Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wb Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg Wp": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wg Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wc Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wc Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wp Wr": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wp Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wp Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wp Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wg Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wg Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wr Wu": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wr Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wr Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wp Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wp Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wr Wu Ww": "Shapesanity Stitched Mixed", + "Singles Sy Wr Wu Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wr Ww Wy": "Shapesanity Stitched Mixed", + "Singles Sy Wu Ww Wy": "Shapesanity Stitched Mixed", +} diff --git a/worlds/shapez/data/strings.py b/worlds/shapez/data/strings.py new file mode 100644 index 0000000000..261ca5317e --- /dev/null +++ b/worlds/shapez/data/strings.py @@ -0,0 +1,337 @@ + +class OTHER: + game_name = "shapez" + + +class SLOTDATA: + goal = "goal" + maxlevel = "maxlevel" + finaltier = "finaltier" + req_shapes_mult = "required_shapes_multiplier" + allow_float_layers = "allow_floating_layers" + rand_level_req = "randomize_level_requirements" + rand_upgrade_req = "randomize_upgrade_requirements" + rand_level_logic = "randomize_level_logic" + rand_upgrade_logic = "randomize_upgrade_logic" + throughput_levels_ratio = "throughput_levels_ratio" + comp_growth_gradient = "complexity_growth_gradient" + same_late = "same_late_upgrade_requirements" + toolbar_shuffling = "toolbar_shuffling" + seed = "seed" + shapesanity = "shapesanity" + + @staticmethod + def level_building(number: int) -> str: + return f"Level building {number}" + + @staticmethod + def upgrade_building(number: int) -> str: + return f"Upgrade building {number}" + + @staticmethod + def phase_length(number: int) -> str: + return f"Phase {number} length" + + @staticmethod + def cat_buildings_amount(category: str) -> str: + return f"{category} category buildings amount" + + +class GOALS: + vanilla = "vanilla" + mam = "mam" + even_fasterer = "even_fasterer" + efficiency_iii = "efficiency_iii" + + +class CATEGORY: + belt = "Belt" + miner = "Miner" + processors = "Processors" + painting = "Painting" + random = "Random" + belt_low = "belt" + miner_low = "miner" + processors_low = "processors" + painting_low = "painting" + big = "Big" + small = "Small" + gigantic = "Gigantic" + rising = "Rising" + demonic = "Demonic" + + +class OPTIONS: + logic_vanilla = "vanilla" + logic_stretched = "stretched" + logic_quick = "quick" + logic_random_steps = "random_steps" + logic_hardcore = "hardcore" + logic_dopamine = "dopamine" + logic_dopamine_overflow = "dopamine_overflow" + logic_vanilla_like = "vanilla_like" + logic_linear = "linear" + logic_category = "category" + logic_category_random = "category_random" + logic_shuffled = "shuffled" + sphere_1 = "sphere_1" + buildings_3 = "3_buildings" + buildings_5 = "5_buildings" + + +class REGIONS: + menu = "Menu" + belt = "Shape transportation" + extract = "Shape extraction" + main = "Main" + levels_1 = "Levels with 1 building" + levels_2 = "Levels with 2 buildings" + levels_3 = "Levels with 3 buildings" + levels_4 = "Levels with 4 buildings" + levels_5 = "Levels with 5 buildings" + upgrades_1 = "Upgrades with 1 building" + upgrades_2 = "Upgrades with 2 buildings" + upgrades_3 = "Upgrades with 3 buildings" + upgrades_4 = "Upgrades with 4 buildings" + upgrades_5 = "Upgrades with 5 buildings" + paint_not_quad = "Achievements with (double) painter" + cut_not_quad = "Achievements with half cutter" + rotate_cw = "Achievements with clockwise rotator" + stack_shape = "Achievements with stacker" + store_shape = "Achievements with storage" + trash_shape = "Achievements with trash" + blueprint = "Achievements with blueprints" + wiring = "Achievements with wires" + mam = "Achievements needing a MAM" + any_building = "Achievements with any placeable building" + all_buildings = "Achievements with all main buildings" + all_buildings_x1_6_belt = "Achievements with x1.6 belt speed" + full = "Full" + half = "Half" + piece = "Piece" + stitched = "Stitched" + east_wind = "East Windmill" + half_half = "Half-Half" + col_east_wind = "Colorful East Windmill" + col_half_half = "Colorful Half-Half" + col_full = "Colorful Full" + col_half = "Colorful Half" + uncol = "Uncolored" + painted = "Painted" + mixed = "Mixed" + + @staticmethod + def sanity(processing: str, coloring: str): + return f"Shapesanity {processing} {coloring}" + + +class LOCATIONS: + my_eyes = "My eyes no longer hurt" + painter = "Painter" + cutter = "Cutter" + rotater = "Rotater" + wait_they_stack = "Wait, they stack?" + wires = "Wires" + storage = "Storage" + freedom = "Freedom" + the_logo = "The logo!" + to_the_moon = "To the moon" + its_piling_up = "It's piling up" + use_it_later = "I'll use it later" + efficiency_1 = "Efficiency 1" + preparing_to_launch = "Preparing to launch" + spacey = "SpaceY" + stack_overflow = "Stack overflow" + its_a_mess = "It's a mess" + faster = "Faster" + even_faster = "Even faster" + get_rid_of_them = "Get rid of them" + a_long_time = "It's been a long time" + addicted = "Addicted" + cant_stop = "Can't stop" + is_this_the_end = "Is this the end?" + getting_into_it = "Getting into it" + now_its_easy = "Now it's easy" + computer_guy = "Computer Guy" + speedrun_master = "Speedrun Master" + speedrun_novice = "Speedrun Novice" + not_idle_game = "Not an idle game" + efficiency_2 = "Efficiency 2" + branding_1 = "Branding specialist 1" + branding_2 = "Branding specialist 2" + king_of_inefficiency = "King of Inefficiency" + its_so_slow = "It's so slow" + mam = "MAM (Make Anything Machine)" + perfectionist = "Perfectionist" + next_dimension = "The next dimension" + oops = "Oops" + copy_pasta = "Copy-Pasta" + ive_seen_that_before = "I've seen that before ..." + memories = "Memories from the past" + i_need_trains = "I need trains" + a_bit_early = "A bit early?" + gps = "GPS" + goal = "Goal" + + @staticmethod + def level(number: int, additional: int = 0) -> str: + if not additional: + return f"Level {number}" + elif additional == 1: + return f"Level {number} Additional" + else: + return f"Level {number} Additional {additional}" + + @staticmethod + def upgrade(category: str, tier: str) -> str: + return f"{category} Upgrade Tier {tier}" + + @staticmethod + def shapesanity(number: int) -> str: + return f"Shapesanity {number}" + + +class ITEMS: + cutter = "Cutter" + cutter_quad = "Quad Cutter" + rotator = "Rotator" + rotator_ccw = "Rotator (CCW)" + rotator_180 = "Rotator (180°)" + stacker = "Stacker" + painter = "Painter" + painter_double = "Double Painter" + painter_quad = "Quad Painter" + color_mixer = "Color Mixer" + + belt = "Belt" + extractor = "Extractor" + extractor_chain = "Chaining Extractor" + balancer = "Balancer" + comp_merger = "Compact Merger" + comp_splitter = "Compact Splitter" + tunnel = "Tunnel" + tunnel_tier_ii = "Tunnel Tier II" + trash = "Trash" + + belt_reader = "Belt Reader" + storage = "Storage" + switch = "Switch" + item_filter = "Item Filter" + display = "Display" + wires = "Wires" + const_signal = "Constant Signal" + logic_gates = "Logic Gates" + virtual_proc = "Virtual Processing" + blueprints = "Blueprints" + + upgrade_big_belt = "Big Belt Upgrade" + upgrade_big_miner = "Big Miner Upgrade" + upgrade_big_proc = "Big Processors Upgrade" + upgrade_big_paint = "Big Painting Upgrade" + upgrade_small_belt = "Small Belt Upgrade" + upgrade_small_miner = "Small Miner Upgrade" + upgrade_small_proc = "Small Processors Upgrade" + upgrade_small_paint = "Small Painting Upgrade" + upgrade_gigantic_belt = "Gigantic Belt Upgrade" + upgrade_gigantic_miner = "Gigantic Miner Upgrade" + upgrade_gigantic_proc = "Gigantic Processors Upgrade" + upgrade_gigantic_paint = "Gigantic Painting Upgrade" + upgrade_rising_belt = "Rising Belt Upgrade" + upgrade_rising_miner = "Rising Miner Upgrade" + upgrade_rising_proc = "Rising Processors Upgrade" + upgrade_rising_paint = "Rising Painting Upgrade" + trap_upgrade_belt = "Belt Upgrade Trap" + trap_upgrade_miner = "Miner Upgrade Trap" + trap_upgrade_proc = "Processors Upgrade Trap" + trap_upgrade_paint = "Painting Upgrade Trap" + trap_upgrade_demonic_belt = "Demonic Belt Upgrade Trap" + trap_upgrade_demonic_miner = "Demonic Miner Upgrade Trap" + trap_upgrade_demonic_proc = "Demonic Processors Upgrade Trap" + trap_upgrade_demonic_paint = "Demonic Painting Upgrade Trap" + upgrade_big_random = "Big Random Upgrade" + upgrade_small_random = "Small Random Upgrade" + + @staticmethod + def upgrade(size: str, category: str) -> str: + return f"{size} {category} Upgrade" + + @staticmethod + def trap_upgrade(category: str, size: str = "") -> str: + return f"{size} {category} Upgrade Trap".strip() + + bundle_blueprint = "Blueprint Shapes Bundle" + bundle_level = "Level Shapes Bundle" + bundle_upgrade = "Upgrade Shapes Bundle" + + trap_locked = "Locked Building Trap" + trap_throttled = "Throttled Building Trap" + trap_malfunction = "Malfunctioning Trap" + trap_inflation = "Inflation Trap" + trap_draining_inv = "Inventory Draining Trap" + trap_draining_blueprint = "Blueprint Shapes Draining Trap" + trap_draining_level = "Level Shapes Draining Trap" + trap_draining_upgrade = "Upgrade Shapes Draining Trap" + trap_clear_belts = "Belts Clearing Trap" + + goal = "Goal" + + +class SHAPESANITY: + circle = "Circle" + square = "Square" + star = "Star" + windmill = "Windmill" + red = "Red" + blue = "Blue" + green = "Green" + yellow = "Yellow" + purple = "Purple" + cyan = "Cyan" + white = "White" + uncolored = "Uncolored" + adjacent_pos = "Adjacent" + cornered_pos = "Cornered" + + @staticmethod + def full(color: str, subshape: str): + return f"{color} {subshape}" + + @staticmethod + def half(color: str, subshape: str): + return f"Half {color} {subshape}" + + @staticmethod + def piece(color: str, subshape: str): + return f"{color} {subshape} Piece" + + @staticmethod + def cutout(color: str, subshape: str): + return f"Cut Out {color} {subshape}" + + @staticmethod + def cornered(color: str, subshape: str): + return f"Cornered {color} {subshape}" + + @staticmethod + def three_one(first: str, second: str): + return f"3-1 {first} {second}" + + @staticmethod + def halfhalf(combo: str): + return f"Half-Half {combo}" + + @staticmethod + def checkered(combo: str): + return f"Checkered {combo}" + + @staticmethod + def singles(combo: str, position: str = ""): + return f"{position} Singles {combo}".strip() + + @staticmethod + def two_one(first: str, second: str, position: str): + return f"{position} 2-1 {first} {second}" + + @staticmethod + def two_one_one(first: str, second: str, position: str): + return f"{position} 2-1-1 {first} {second}" diff --git a/worlds/shapez/docs/datapackage_settings_de.md b/worlds/shapez/docs/datapackage_settings_de.md new file mode 100644 index 0000000000..a6c1b35cb8 --- /dev/null +++ b/worlds/shapez/docs/datapackage_settings_de.md @@ -0,0 +1,36 @@ +# Anleitung zum Ändern der maximalen Anzahl an Locations in shapez + +## Wo finde ich die Einstellungen zum Erhöhen/Verringern der maximalen Anzahl an Locations? + +Die Maximalwerte von `goal_amount` und `shapesanity_amount` sind fest eingebaute Einstellungen, die das Datenpaket des +Spiels beeinflussen. Sie sind in einer Datei names `options.json` innerhalb der APWorld festgelegt. Durch das Ändern +dieser Werte erschaffst du eine custom Version der APWorld, die nur auf deinem PC existiert. + +## Wie du die Datenpaket-Einstellungen änderst + +Diese Anleitung ist für erfahrene Nutzer und kann in nicht richtig funktionierender Software resultieren, wenn sie nicht +ordnungsgemäß befolgt wird. Anwendung auf eigene Gefahr. + +1. Navigiere zu `/lib/worlds`. +2. Benenne `shapez.apworld` zu `shapez.zip` um. +3. Öffne die Zip-Datei und navigiere zu `shapez/data/options.json`. +4. Ändere die Werte in dieser Datei nach Belieben und speichere die Datei. + - `max_shapesanity` kann nicht weniger als `4` sein, da dies die benötigte Mindestanzahl zum Verhindern von + FillErrors ist. + - `max_shapesanity` kann auch nicht mehr als `75800` sein, da dies die maximale Anzahl an möglichen Shapesanity-Namen + ist. Das Generieren der Multiworld wird fehlschlagen, falls die `shapesanity_amount`-Option auf einen höheren Wert + gesetzt wird. + - `max_levels_and_upgrades` kann nicht weniger als `27` sein, da dies die Mindestanzahl für das `mam`-Ziel ist. +5. Schließe die Zip-Datei und benenne sie zurück zu `shapez.apworld`. + +## Warum muss ich das ganze selbst machen? + +Alle Spiele in Archipelago müssen eine Liste aller möglichen Locations **unabhängig der Spieler-Optionen** +bereitstellen. Diese Listen aller in einer Multiworld inkludierten Spiele werden in den Daten der Multiworld gespeichert +und an alle verbundenen Clients gesendet. Je mehr mögliche Locations, desto größer das Datenpaket. Und mit ~80000 +möglichen Locations hatte shapez zu einem gewissen Zeitpunkt ein (von der Datenmenge her) größeres Datenpaket als alle +Core-verifizierten Spiele zusammen. Um also diese Datenmenge zu reduzieren, wurden die ausgeschriebenen +Shapesanity-Locations-Namen (`Shapesanity Uncolored Circle`, `Shapesanity Blue Rectangle`, ...) durch standardisierte +Namen (`Shapesanity 1`, `Shapesanity 2`, ...) ersetzt. Durch das Ändern dieser Maximalwerte, und damit das Erstellen +einer custom APWorld, kannst du die Anzahl der möglichen Locations erhöhen, wirst aber auch gleichzeitig das Datenpaket +vergrößern. diff --git a/worlds/shapez/docs/datapackage_settings_en.md b/worlds/shapez/docs/datapackage_settings_en.md new file mode 100644 index 0000000000..64f39abf2e --- /dev/null +++ b/worlds/shapez/docs/datapackage_settings_en.md @@ -0,0 +1,33 @@ +# Guide to change the maximum amount of locations in shapez + +## Where do I find the settings to increase/decrease the amount of possible locations? + +The maximum values of the `goal_amount` and `shapesanity_amount` options are hardcoded settings that affect the +datapackage. They are stored in a file called `options.json` inside the apworld. By changing them, you will create a +custom version on your local machine. + +## How to change datapackage settings + +This tutorial is intended for advanced users and can result in the software not working properly, if not read carefully. +Proceed at your own risk. + +1. Go to `/lib/worlds`. +2. Rename `shapez.apworld` to `shapez.zip`. +3. Open the zip file and go to `shapez/data/options.json`. +4. Edit the values in this file to your desire and save the file. + - `max_shapesanity` cannot be lower than `4`, as this is the minimum amount to prevent FillErrors. + - `max_shapesanity` also cannot be higher than `75800`, as this is the maximum amount of possible shapesanity names. + Multiworld generation will fail if the `shapesanity_amount` options is set to a higher value. + - `max_levels_and_upgrades` cannot be lower than `27`, as this is the minimum amount for the `mam` goal to properly + work. +5. Close the zip file and rename it back to `shapez.apworld`. + +## Why do I have to do this manually? + +For every game in Archipelago, there must be a list of all possible locations, **regardless of player options**. When +generating a multiworld, a list of all locations of all included games will be saved in the multiworld's data and sent +to all clients. The higher the amount of possible locations, the bigger the datapackage. And having ~80000 possible +locations at one point made the datapackage for shapez bigger than all other core-verified games combined. So, to reduce +the datapackage size of shapez, the locations for shapesanity are named `Shapesanity 1`, `Shapesanity 2` etc. instead of +their actual names. By creating a custom version of the apworld, you can increase the amount of possible locations, but +you will also increase the size of the datapackage at the same time. diff --git a/worlds/shapez/docs/de_shapez.md b/worlds/shapez/docs/de_shapez.md new file mode 100644 index 0000000000..494edca210 --- /dev/null +++ b/worlds/shapez/docs/de_shapez.md @@ -0,0 +1,73 @@ +# shapez + +## Was für ein Spiel ist das? + +shapez ist ein Automatisierungsspiel, in dem du Formen aus zufällig generierten Vorkommen in einer endlosen Welt +extrahierst, zerschneidest, rotierst, stapelst, anmalst und schließlich zum Zentrum beförderst, um Level abzuschließen +und Upgrades zu kaufen. Das Tutorial beinhaltet 26 Level, in denen du (fast) immer ein neues Gebäude oder eine neue +Spielmechanik freischaltest. Danach folgen endlos weitere Level mit zufällig generierten Vorgaben. Um das Spiel bzw. +deine Gebäude schneller zu machen, kannst du bis zu 1000 Upgrades (pro Kategorie) kaufen. + +## Wo ist die Optionen-Seite? + +Die [Spieler-Optionen-Seite für dieses Spiel](../player-options) enthält alle Optionen zum Erstellen und exportieren +einer YAML-Datei. +Zusätzlich gibt es zu diesem Spiel "Datenpaket-Einstellungen", die du nach +[dieser Anleitung](/tutorial/shapez/datapackage_settings/de) einstellen kannst. + +## Inwiefern wird das Spiel randomisiert? + +Alle Belohnungen aus den Tutorial-Level (das Freischalten von Gebäuden und Spielmechaniken) und Verbesserungen durch +Upgrades werden dem Itempool der Multiworld hinzugefügt. Außerdem werden, wenn so in den Spieler-Optionen festgelegt, +die Bedingungen zum Abschließen eines Levels und zum Kaufen der Upgrades randomisiert und die Reihenfolge der Gebäude +in deinen Toolbars (Haupt- und Kabelebene) gemischt. + +## Was ist das Ziel von shapez in Archipelago? + +Da das Spiel eigentlich kein konkretes Ziel, welches das Ende des Spiels bedeuten würde, hat, kann man sich zwischen +(aktuell) 4 verschiedenen Zielen entscheiden: +1. Vanilla: Schließe Level 26 ab (eigentlich das Ende des Tutorials). +2. MAM: Schließe ein bestimmtes Level nach Level 26 ab, das zuvor in den Spieler-Optionen festgelegt wurde. Es ist +empfohlen, eine Maschine zu bauen, die alles automatisch herstellt ("Make-Anything-Machine", kurz MAM). +3. Even Fasterer: Kaufe alle Upgrades bis zu einer in den Spieler-Optionen festgelegten Stufe (nach Stufe VIII (8)). +4. Efficiency III: Liefere 256 Blaupausen-Formen pro Sekunde ins Zentrum. + +## Welche Items können in den Welten anderer Spieler erscheinen? + +- Gebäude +- Blaupausen freischalten +- Upgrades + - Große Upgrades (addiert 1 zum Geschwindigkeitsmultiplikator) + - Kleine Upgrades (addiert 0.1 zum Geschwindigkeitsmultiplikator) + - Andere ungewöhnliche (auch negative) Upgrades (optional) +- Verschiedene Bündel, die bestimmte Formen enthalten +- Fallen, die bestimmte Formen aus dem Zentrum dränieren (ja, das Wort gibt es) +- Fallen, die zufällige Gebäude oder andere Spielmechaniken betreffen + +## Was ist eine Location / ein Check? + +- Level (minimum 1-25, bis zu 499 je nach Spieler-Optionen, mit zusätzlichen Checks für Level 1 und 20) +- Upgrades (minimum Stufen II-VIII (2-8), bis zu D (500), je nach Spieler-Optionen) +- Bestimmte Formen mindestens einmal ins Zentrum liefern ("Shapesanity", bis zu 1000 zufällig gewählte Definitionen) +- Errungenschaften (bis zu 45) + +## Was passiert, wenn der Spieler ein Item erhält? + +Ein Pop-Up erscheint, das das/die erhaltene(n) Item(s) und eventuell weitere Informationen auflistet. + +## Was bedeuten die Namen dieser ganzen Shapesanity Dinger? + +Hier ist ein Spicker für die Englischarbeit (bloß nicht dem Lehrer zeigen): + +![image](/static/generated/docs/shapez/shapesanity_full.png) + +## Kann ich auch weitere Mods neben dem AP Client installieren? + +Zurzeit wird Kompatibilität mit anderen Mods nicht unterstützt, aber niemand kann dich davon abhalten, es trotzdem zu +versuchen. Mods, die das Gameplay verändern, werden wahrscheinlich nicht funktionieren, indem sie das Laden der +jeweiligen Mods verhindern oder das Spiel zum Abstürzen bringen, während einfache QoL-Mods vielleicht problemlos +funktionieren könnten. Wenn du es versuchst, dann also auf eigene Gefahr. + +## Hast du wirklich eine deutschsprachige Infoseite geschrieben, obwohl man sie aktuell nur über Umwege erreichen kann und du eigentlich an dem Praktikumsportfolio arbeiten solltest? + +Ja diff --git a/worlds/shapez/docs/en_shapez.md b/worlds/shapez/docs/en_shapez.md new file mode 100644 index 0000000000..56c0387258 --- /dev/null +++ b/worlds/shapez/docs/en_shapez.md @@ -0,0 +1,65 @@ +# shapez + +## What is this game? + +shapez is an automation game about cutting, rotating, stacking, and painting shapes, that you extract from randomly +generated patches on an infinite canvas, and sending them to the hub to complete levels. The "tutorial", where you +unlock a new building or game mechanic (almost) each level, lasts until level 26, which unlocks freeplay with +infinitely more levels, that each require a new, randomly generated shape. Alongside the levels, you can unlock +upgrades, that make your buildings work faster. + +## Where is the options page? + +The [player options page for this game](../player-options) contains all the options you need to configure +and export a config file. +There are also some advanced "datapackage settings" that can be changed by following +[this guide](/tutorial/shapez/datapackage_settings/en). + +## What does randomization do to this game? + +Buildings and gameplay mechanics, which you normally unlock by completing a level, and upgrade improvements are put +into the item pool of the multiworld. You can also randomize the requirements for completing a level or buying an +upgrade and shuffle the order of building in your toolbars (main and wires layer). + +## What is the goal of shapez in Archipelago? + +As the game has no actual goal that would represent the end of the game, there are (currently) 4 different goals you +can choose from in the player options: +1. Vanilla: Complete level 26 (the end of the tutorial). +2. MAM: Complete a player-specified level after level 26. It's recommended to build a Make-Anything-Machine (MAM). +3. Even Fasterer: Upgrade everything to a player-specified tier after tier VIII (8). +4. Efficiency III: Deliver 256 blueprint shapes per second to the hub. + +## Which items can be in another player's world? + +- Buildings +- Unlocking blueprints +- Upgrade improvements + - Big improvements, adding 1 to the multiplier + - Small improvements, adding 0.1 to the multiplier + - Optional: Other, rather unusual and even bad, improvements +- Different shapes bundles +- Inventory draining traps +- Different traps affecting random buildings and game mechanics + +## What is considered a location check? + +- Levels (minimum 1-25, up to 499 depending on player options, with additional checks for levels 1 and 20) +- Upgrades (minimum tiers II-VIII (2-8), up to D (500) depending on player options) +- Delivering certain shapes at least once to the hub ("shapesanity", up to 1000 from a 75800 names pool) +- Achievements (up to 45) + +## When the player receives an item, what happens? + +A pop-up will show, which item(s) were received, with additional information on some of them. + +## What do the names of all these shapesanity locations mean? + +Here's a cheat sheet: + +![image](/static/generated/docs/shapez/shapesanity_full.png) + +## Can I use other mods alongside the AP client? + +At the moment, compatibility with other mods is not supported, but not forbidden. Gameplay altering mods will most +likely break the game in some way, while small QoL mods might work without problems. Try at your own risk. diff --git a/worlds/shapez/docs/setup_de.md b/worlds/shapez/docs/setup_de.md new file mode 100644 index 0000000000..a2eb92dfa1 --- /dev/null +++ b/worlds/shapez/docs/setup_de.md @@ -0,0 +1,63 @@ +# Setup-Anleitung für shapez: Archipelago + +## Schnelle Links + +- Info-Seite zum Spiel + * [English](/games/shapez/info/en) + * [Deutsch](/games/shapez/info/de) +- [Spieler-Optionen-Seite](/games/shapez/player-options) + +## Benötigte Software + +- Eine installierbare und aktuelle PC-Version von shapez ([Steam](https://store.steampowered.com/app/1318690/shapez/)). +- Die shapezipelago Mod von der [mod.io-Seite](https://mod.io/g/shapez/m/shapezipelago). + +## Optionale Software + +- Archipelago von der [Archipelago-Release-Seite](https://github.com/ArchipelagoMW/Archipelago/releases) + * (Für den Text-Client) + * (Alternativ kannst du auch die eingebaute Konsole nutzen, indem du das Spiel mit dem `-dev`-Parameter + startest und jede Nachricht als `AP.sendAPMessage(""")` schreibst) +- Universal Tracker (schau im Kanal von UT auf dem Discord-Server nach der aktuellen Anleitung und für weitere + Informationen) + +## Installation + +Da das Spiel einen eingebauten Mod-Loader hat, musst du nur die "shapezipelago@X.X.X.js"-Datei in den dafür vorgesehenen +Ordner kopieren. Wenn du nicht weißt, wo dieser ist, dann öffne das Spiel, drücke auf "MODS" und schließlich auf +"MODORDNER ÖFFNEN". + +Du solltest (egal ob vor oder nach der Installation) die Einstellungen des Spiels öffnen und `HINWEISE & TUTORIALS` im +Reiter `BENUTZEROBERFLÄCHE` ausschalten, da sie sonst den Upgrade-Shop verstecken wird, bis du ein paar Level +abgeschlossen hast. + +## Erstellen deiner YAML-Datei + +### Was ist eine YAML-Datei und wofür brauche ich die? + +Deine persönliche YAML-Datei beinhaltet eine Reihe von Optionen, die der Zufallsgenerator zum Erstellen von deinem +Spiel benötigt. Jeder Spieler einer Multiworld stellt seine eigene YAML-Datei zur Verfügung. Dadurch kann jeder Spieler +sein Spiel nach seinem eigenen Geschmack gestalten, während andere Spieler unabhängig davon ihre eigenen Optionen +wählen können! + +### Wo bekomme ich so eine YAML-Datei her? + +Du kannst auf der [shapez-Spieler-Optionen-Seite](/games/shapez/player-options) eine YAML-Datei generieren oder ein +Template herunterladen. + +## Einer MultiWorld beitreten + +1. Öffne das Spiel. +2. Gib im Hauptmenü den Slot-Namen, die Adresse, den Port und das Passwort (optional) in die dafür vorgesehene Box ein. +3. Drücke auf "Connect". + - Erneutes Drücken trennt die Verbindung zum Server. + - Ob du verbunden bist, steht direkt daneben. +4. Starte ein neues Spiel. + +Nachdem der Speicherstand erstellt wurde und du zum Hauptmenü zurückkehrst, wird das erneute Öffnen des Speicherstandes +erneut verbinden. + +### Der Port/Die Adresse der MultiWorld hat sich geändert, wie trete ich mit meinem existierenden Speicherstand bei? + +Wiederhole die Schritte 1-3 und öffne den existierenden Speicherstand. Dies wird außerdem die gespeicherten Login-Daten +überschreiben, sodass du dies nur einmal machen musst. \ No newline at end of file diff --git a/worlds/shapez/docs/setup_en.md b/worlds/shapez/docs/setup_en.md new file mode 100644 index 0000000000..2036f75d6c --- /dev/null +++ b/worlds/shapez/docs/setup_en.md @@ -0,0 +1,58 @@ +# Setup Guide for shapez: Archipelago + +## Quick Links + +- Game Info Page + * [English](/games/shapez/info/en) + * [Deutsch](/games/shapez/info/de) +- [Player Options Page](/games/shapez/player-options) + +## Required Software + +- An installable, up-to-date PC version of shapez ([Steam](https://store.steampowered.com/app/1318690/shapez/)). +- The shapezipelago mod from the [mod.io page](https://mod.io/g/shapez/m/shapezipelago). + +## Optional Software + +- Archipelago from the [Archipelago Releases Page](https://github.com/ArchipelagoMW/Archipelago/releases) + * (Only for the TextClient) + * (You can alternatively use the built-in console by launching the game with the `-dev` parameter and typing + `AP.sendAPMessage(""")`) +- Universal Tracker (check UT's channel in the discord server for more information and instructions) + +## Installation + +As the game has a built-in mod loader, all you need to do is copy the `shapezipelago@X.X.X.js` mod file into the mods +folder. If you don't know where that is, open the game, click on `MODS`, and then `OPEN MODS FOLDER`. + +It is recommended to go into the settings of the game and disable `HINTS & TUTORIALS` in the `USER INTERFACE` tab, as +this setting will disable the upgrade shop until you complete a few levels. + +## Configuring your YAML file + +### What is a YAML file and why do I need one? + +Your YAML file contains a set of configuration options which provide the generator with information about how it should +generate your game. Each player of a multiworld will provide their own YAML file. This setup allows each player to enjoy +an experience customized for their taste, and different players in the same multiworld can all have different options. + +### Where do I get a YAML file? + +You can generate a yaml or download a template by visiting the +[shapez Player Options Page](/games/shapez/player-options) + +## Joining a MultiWorld Game + +1. Open the game. +2. In the main menu, type the slot name, address, port, and password (optional) into the input box. +3. Click "Connect". + - To disconnect, just press this button again. + - The status of your connection is shown right next to the button. +4. Create a new game. + +After creating the save file and returning to the main menu, opening the save file again will automatically reconnect. + +### The MultiWorld changed its port/address, how do I reconnect correctly with my existing save file? + +Repeat steps 1-3 and open the existing save file. This will also overwrite the saved connection details, so you will +only have to do this once. diff --git a/worlds/shapez/docs/shapesanity_full.png b/worlds/shapez/docs/shapesanity_full.png new file mode 100644 index 0000000000..494065d514 Binary files /dev/null and b/worlds/shapez/docs/shapesanity_full.png differ diff --git a/worlds/shapez/items.py b/worlds/shapez/items.py new file mode 100644 index 0000000000..2e5816b9fc --- /dev/null +++ b/worlds/shapez/items.py @@ -0,0 +1,279 @@ +from typing import Callable, Any + +from BaseClasses import Item, ItemClassification as IClass +from .options import ShapezOptions +from .data.strings import GOALS, ITEMS, OTHER + + +def is_mam_achievement_included(options: ShapezOptions) -> IClass: + return IClass.progression if options.include_achievements and (not options.goal == GOALS.vanilla) else IClass.useful + + +def is_achievements_included(options: ShapezOptions) -> IClass: + return IClass.progression if options.include_achievements else IClass.useful + + +def is_goal_efficiency_iii(options: ShapezOptions) -> IClass: + return IClass.progression if options.goal == GOALS.efficiency_iii else IClass.useful + + +def always_progression(options: ShapezOptions) -> IClass: + return IClass.progression + + +def always_useful(options: ShapezOptions) -> IClass: + return IClass.useful + + +def always_filler(options: ShapezOptions) -> IClass: + return IClass.filler + + +def always_trap(options: ShapezOptions) -> IClass: + return IClass.trap + + +# Routing buildings are not needed to complete the game, but building factories without balancers and tunnels +# would be unreasonably complicated and time-consuming. +# Some buildings are not needed to complete the game, but are "logically needed" for the "MAM" achievement. + +buildings_processing: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.cutter: always_progression, + ITEMS.cutter_quad: always_progression, + ITEMS.rotator: always_progression, + ITEMS.rotator_ccw: always_progression, + ITEMS.rotator_180: always_progression, + ITEMS.stacker: always_progression, + ITEMS.painter: always_progression, + ITEMS.painter_double: always_progression, + ITEMS.painter_quad: always_progression, + ITEMS.color_mixer: always_progression, +} + +buildings_routing: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.balancer: always_progression, + ITEMS.comp_merger: always_progression, + ITEMS.comp_splitter: always_progression, + ITEMS.tunnel: always_progression, + ITEMS.tunnel_tier_ii: is_mam_achievement_included, +} + +buildings_other: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.trash: always_progression, + ITEMS.extractor_chain: always_useful +} + +buildings_top_row: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.belt_reader: is_mam_achievement_included, + ITEMS.storage: is_achievements_included, + ITEMS.switch: always_progression, + ITEMS.item_filter: is_mam_achievement_included, + ITEMS.display: always_useful +} + +buildings_wires: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.wires: always_progression, + ITEMS.const_signal: always_progression, + ITEMS.logic_gates: is_mam_achievement_included, + ITEMS.virtual_proc: is_mam_achievement_included +} + +gameplay_unlocks: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.blueprints: is_achievements_included +} + +upgrades: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.upgrade_big_belt: always_progression, + ITEMS.upgrade_big_miner: always_useful, + ITEMS.upgrade_big_proc: always_useful, + ITEMS.upgrade_big_paint: always_useful, + ITEMS.upgrade_small_belt: always_filler, + ITEMS.upgrade_small_miner: always_filler, + ITEMS.upgrade_small_proc: always_filler, + ITEMS.upgrade_small_paint: always_filler +} + +whacky_upgrades: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.upgrade_gigantic_belt: always_progression, + ITEMS.upgrade_gigantic_miner: always_useful, + ITEMS.upgrade_gigantic_proc: always_useful, + ITEMS.upgrade_gigantic_paint: always_useful, + ITEMS.upgrade_rising_belt: always_progression, + ITEMS.upgrade_rising_miner: always_useful, + ITEMS.upgrade_rising_proc: always_useful, + ITEMS.upgrade_rising_paint: always_useful, + ITEMS.upgrade_big_random: always_useful, + ITEMS.upgrade_small_random: always_filler, +} + +whacky_upgrade_traps: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.trap_upgrade_belt: always_trap, + ITEMS.trap_upgrade_miner: always_trap, + ITEMS.trap_upgrade_proc: always_trap, + ITEMS.trap_upgrade_paint: always_trap, + ITEMS.trap_upgrade_demonic_belt: always_trap, + ITEMS.trap_upgrade_demonic_miner: always_trap, + ITEMS.trap_upgrade_demonic_proc: always_trap, + ITEMS.trap_upgrade_demonic_paint: always_trap, +} + +bundles: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.bundle_blueprint: always_filler, + ITEMS.bundle_level: always_filler, + ITEMS.bundle_upgrade: always_filler +} + +standard_traps: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.trap_locked: always_trap, + ITEMS.trap_throttled: always_trap, + ITEMS.trap_malfunction: always_trap, + ITEMS.trap_inflation: always_trap, + ITEMS.trap_clear_belts: always_trap, +} + +random_draining_trap: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.trap_draining_inv: always_trap +} + +split_draining_traps: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.trap_draining_blueprint: always_trap, + ITEMS.trap_draining_level: always_trap, + ITEMS.trap_draining_upgrade: always_trap +} + +belt_and_extractor: dict[str, Callable[[ShapezOptions], IClass]] = { + ITEMS.belt: always_progression, + ITEMS.extractor: always_progression +} + +item_table: dict[str, Callable[[ShapezOptions], IClass]] = { + **buildings_processing, + **buildings_routing, + **buildings_other, + **buildings_top_row, + **buildings_wires, + **gameplay_unlocks, + **upgrades, + **whacky_upgrades, + **whacky_upgrade_traps, + **bundles, + **standard_traps, + **random_draining_trap, + **split_draining_traps, + **belt_and_extractor +} + +big_upgrades = [ + ITEMS.upgrade_big_belt, + ITEMS.upgrade_big_miner, + ITEMS.upgrade_big_proc, + ITEMS.upgrade_big_paint +] + +small_upgrades = [ + ITEMS.upgrade_small_belt, + ITEMS.upgrade_small_miner, + ITEMS.upgrade_small_proc, + ITEMS.upgrade_small_paint +] + + +def filler(random: float, whacky_allowed: bool) -> str: + """Returns a random filler item.""" + bundles_list = [*bundles] + return random_choice_nested(random, [ + small_upgrades, + [ + bundles_list, + bundles_list, + [ + big_upgrades, + [*whacky_upgrades] if whacky_allowed else big_upgrades, + ], + ], + ]) + + +def trap(random: float, split_draining: bool, whacky_allowed: bool) -> str: + """Returns a random trap item.""" + pool = [ + *standard_traps, + ITEMS.trap_draining_inv if not split_draining else [*split_draining_traps], + ] + if whacky_allowed: + pool.append([*whacky_upgrade_traps]) + return random_choice_nested(random, pool) + + +def random_choice_nested(random: float, nested: list[Any]) -> Any: + """Helper function for getting a random element from a nested list.""" + current: Any = nested + while isinstance(current, list): + index_float = random*len(current) + current = current[int(index_float)] + random = index_float-int(index_float) + return current + + +item_descriptions = { # TODO replace keys with global strings and update with whacky upgrades + "Balancer": "A routing building, that can merge two belts into one, split a belt in two, " + + "or balance the items of two belts", + "Tunnel": "A routing building consisting of two parts, that allows for gaps in belts", + "Compact Merger": "A small routing building, that merges two belts into one", + "Tunnel Tier II": "A routing building consisting of two parts, that allows for even longer gaps in belts", + "Compact Splitter": "A small routing building, that splits a belt in two", + "Cutter": "A processing building, that cuts shapes vertically in two halves", + "Rotator": "A processing building, that rotates shapes 90 degrees clockwise", + "Painter": "A processing building, that paints shapes in a given color", + "Rotator (CCW)": "A processing building, that rotates shapes 90 degrees counter-clockwise", + "Color Mixer": "A processing building, that mixes two colors together to create a new one", + "Stacker": "A processing building, that combines two shapes with missing parts or puts one on top of the other", + "Quad Cutter": "A processing building, that cuts shapes in four quarter parts", + "Double Painter": "A processing building, that paints two shapes in a given color", + "Rotator (180°)": "A processing building, that rotates shapes 180 degrees", + "Quad Painter": "A processing building, that paint each quarter of a shape in another given color and requires " + + "wire inputs for each color to work", + "Trash": "A building, that destroys unused shapes", + "Chaining Extractor": "An upgrade to extractors, that can increase the output without balancers or mergers", + "Belt Reader": "A wired building, that shows the average amount of items passing through per second", + "Storage": "A building, that stores up to 5000 of a certain shape", + "Switch": "A building, that sends a constant boolean signal", + "Item Filter": "A wired building, that filters items based on wire input", + "Display": "A wired building, that displays a shape or color based on wire input", + "Wires": "The main building of the wires layer, that carries signals between other buildings", + "Constant Signal": "A building on the wires layer, that sends a constant shape, color, or boolean signal", + "Logic Gates": "Multiple buildings on the wires layer, that perform logical operations on wire signals", + "Virtual Processing": "Multiple buildings on the wires layer, that process wire signals like processor buildings", + "Blueprints": "A game mechanic, that allows copy-pasting multiple buildings at once", + "Big Belt Upgrade": "An upgrade, that adds 1 to the speed multiplier of belts, distributors, and tunnels", + "Big Miner Upgrade": "An upgrade, that adds 1 to the speed multiplier of extractors", + "Big Processors Upgrade": "An upgrade, that adds 1 to the speed multiplier of cutters, rotators, and stackers", + "Big Painting Upgrade": "An upgrade, that adds 1 to the speed multiplier of painters and color mixers", + "Small Belt Upgrade": "An upgrade, that adds 0.1 to the speed multiplier of belts, distributors, and tunnels", + "Small Miner Upgrade": "An upgrade, that adds 0.1 to the speed multiplier of extractors", + "Small Processors Upgrade": "An upgrade, that adds 0.1 to the speed multiplier of cutters, rotators, and stackers", + "Small Painting Upgrade": "An upgrade, that adds 0.1 to the speed multiplier of painters and color mixers", + "Blueprint Shapes Bundle": "A bundle with 1000 blueprint shapes, instantly delivered to the hub", + "Level Shapes Bundle": "A bundle with some shapes needed for the current level, " + + "instantly delivered to the hub", + "Upgrade Shapes Bundle": "A bundle with some shapes needed for a random upgrade, " + + "instantly delivered to the hub", + "Inventory Draining Trap": "Randomly drains either blueprint shapes, current level requirement shapes, " + + "or random upgrade requirement shapes, by half", + "Blueprint Shapes Draining Trap": "Drains the stored blueprint shapes by half", + "Level Shapes Draining Trap": "Drains the current level requirement shapes by half", + "Upgrade Shapes Draining Trap": "Drains a random upgrade requirement shape by half", + "Locked Building Trap": "Locks a random building from being placed for 15-60 seconds", + "Throttled Building Trap": "Halves the speed of a random building for 15-60 seconds", + "Malfunctioning Trap": "Makes a random building process items incorrectly for 15-60 seconds", + "Inflation Trap": "Permanently increases the required shapes multiplier by 1. " + "In other words: Permanently increases required shapes by 10% of the standard amount.", + "Belt": "One of the most important buildings in the game, that transports your shapes and colors from one " + + "place to another", + "Extractor": "One of the most important buildings in the game, that extracts shapes from those randomly " + + "generated patches" +} + + +class ShapezItem(Item): + game = OTHER.game_name diff --git a/worlds/shapez/locations.py b/worlds/shapez/locations.py new file mode 100644 index 0000000000..f68ca1ebf5 --- /dev/null +++ b/worlds/shapez/locations.py @@ -0,0 +1,546 @@ +from random import Random +from typing import Callable + +from BaseClasses import Location, LocationProgressType, Region +from .data.strings import CATEGORY, LOCATIONS, REGIONS, OPTIONS, GOALS, OTHER, SHAPESANITY +from .options import max_shapesanity, max_levels_and_upgrades + +categories = [CATEGORY.belt, CATEGORY.miner, CATEGORY.processors, CATEGORY.painting] + +translate: list[tuple[int, str]] = [ + (1000, "M"), + (900, "CM"), + (500, "D"), + (400, "CD"), + (100, "C"), + (90, "XC"), + (50, "L"), + (40, "XL"), + (10, "X"), + (9, "IX"), + (5, "V"), + (4, "IV"), + (1, "I") +] + + +def roman(num: int) -> str: + """Converts positive non-zero integers into roman numbers.""" + rom: str = "" + for key, val in translate: + while num >= key: + rom += val + num -= key + return rom + + +location_description = { # TODO change keys to global strings + "Level 1": "Levels are completed by delivering certain shapes in certain amounts to the hub. The required shape " + "and amount for the current level are always displayed on the hub.", + "Level 1 Additional": "In the vanilla game, levels 1 and 20 have unlock more than one building.", + "Level 20 Additional": "In the vanilla game, levels 1 and 20 have unlock more than one building.", + "Level 20 Additional 2": "In the vanilla game, levels 1 and 20 have unlock more than one building.", + "Level 26": "In the vanilla game, level 26 is the final level of the tutorial, unlocking freeplay.", + f"Level {max_levels_and_upgrades-1}": "This is the highest possible level that can contains an item, if your goal " + "is set to \"mam\"", + "Belt Upgrade Tier II": "Upgrades can be purchased by having certain shapes in certain amounts stored in your hub. " + "This is the first upgrade in the belt, balancers, and tunnel category.", + "Miner Upgrade Tier II": "Upgrades can be purchased by having certain shapes in certain amounts stored in your " + "hub. This is the first upgrade in the extractor category.", + "Processors Upgrade Tier II": "Upgrades can be purchased by having certain shapes in certain amounts stored in " + "your hub. This is the first upgrade in the cutter, rotators, and stacker category.", + "Painting Upgrade Tier II": "Upgrades can be purchased by having certain shapes in certain amounts stored in your " + "hub. This is the first upgrade in the painters and color mixer category.", + "Belt Upgrade Tier VIII": "This is the final upgrade in the belt, balancers, and tunnel category, if your goal is " + "**not** set to \"even_fasterer\".", + "Miner Upgrade Tier VIII": "This is the final upgrade in the extractor category, if your goal is **not** set to " + "\"even_fasterer\".", + "Processors Upgrade Tier VIII": "This is the final upgrade in the cutter, rotators, and stacker category, if your " + "goal is **not** set to \"even_fasterer\".", + "Painting Upgrade Tier VIII": "This is the final upgrade in the painters and color mixer category, if your goal is " + "**not** set to \"even_fasterer\".", + f"Belt Upgrade Tier {roman(max_levels_and_upgrades)}": "This is the highest possible upgrade in the belt, " + "balancers, and tunnel category, if your goal is set to " + "\"even_fasterer\".", + f"Miner Upgrade Tier {roman(max_levels_and_upgrades)}": "This is the highest possible upgrade in the extractor " + "category, if your goal is set to \"even_fasterer\".", + f"Processors Upgrade Tier {roman(max_levels_and_upgrades)}": "This is the highest possible upgrade in the cutter, " + "rotators, and stacker category, if your goal is set " + "to \"even_fasterer\".", + f"Painting Upgrade Tier {roman(max_levels_and_upgrades)}": "This is the highest possible upgrade in the painters " + "and color mixer category, if your goal is set to " + "\"even_fasterer\".", + "My eyes no longer hurt": "This is an achievement, that is unlocked by activating dark mode.", + "Painter": "This is an achievement, that is unlocked by painting a shape using the painter or double painter.", + "Cutter": "This is an achievement, that is unlocked by cutting a shape in half using the cutter.", + "Rotater": "This is an achievement, that is unlocked by rotating a shape clock wise.", + "Wait, they stack?": "This is an achievement, that is unlocked by stacking two shapes on top of each other.", + "Wires": "This is an achievement, that is unlocked by completing level 20.", + "Storage": "This is an achievement, that is unlocked by storing a shape in a storage.", + "Freedom": "This is an achievement, that is unlocked by completing level 20. It is only included if the goal is " + "**not** set to vanilla.", + "The logo!": "This is an achievement, that is unlocked by producing the logo of the game.", + "To the moon": "This is an achievement, that is unlocked by producing the rocket shape.", + "It's piling up": "This is an achievement, that is unlocked by having 100.000 blueprint shapes stored in the hub.", + "I'll use it later": "This is an achievement, that is unlocked by having one million blueprint shapes stored in " + "the hub.", + "Efficiency 1": "This is an achievement, that is unlocked by delivering 25 blueprint shapes per second to the hub.", + "Preparing to launch": "This is an achievement, that is unlocked by delivering 10 rocket shapes per second to the " + "hub.", + "SpaceY": "This is an achievement, that is unlocked by 20 rocket shapes per second to the hub.", + "Stack overflow": "This is an achievement, that is unlocked by stacking 4 layers on top of each other.", + "It's a mess": "This is an achievement, that is unlocked by having 100 different shapes stored in the hub.", + "Faster": "This is an achievement, that is unlocked by upgrading everything to at least tier V.", + "Even faster": "This is an achievement, that is unlocked by upgrading everything to at least tier VIII.", + "Get rid of them": "This is an achievement, that is unlocked by transporting 1000 shapes into a trash can.", + "It's been a long time": "This is an achievement, that is unlocked by playing your save file for 10 hours " + "(combined playtime).", + "Addicted": "This is an achievement, that is unlocked by playing your save file for 20 hours (combined playtime).", + "Can't stop": "This is an achievement, that is unlocked by reaching level 50.", + "Is this the end?": "This is an achievement, that is unlocked by reaching level 100.", + "Getting into it": "This is an achievement, that is unlocked by playing your save file for 1 hour (combined " + "playtime).", + "Now it's easy": "This is an achievement, that is unlocked by placing a blueprint.", + "Computer Guy": "This is an achievement, that is unlocked by placing 5000 wires.", + "Speedrun Master": "This is an achievement, that is unlocked by completing level 12 in under 30 Minutes. This " + "location is excluded by default, as it can become inaccessible in a save file after that time.", + "Speedrun Novice": "This is an achievement, that is unlocked by completing level 12 in under 60 Minutes. This " + "location is excluded by default, as it can become inaccessible in a save file after that time.", + "Not an idle game": "This is an achievement, that is unlocked by completing level 12 in under 120 Minutes. This " + "location is excluded by default, as it can become inaccessible in a save file after that time.", + "Efficiency 2": "This is an achievement, that is unlocked by delivering 50 blueprint shapes per second to the hub.", + "Branding specialist 1": "This is an achievement, that is unlocked by delivering 25 logo shapes per second to the " + "hub.", + "Branding specialist 2": "This is an achievement, that is unlocked by delivering 50 logo shapes per second to the " + "hub.", + "King of Inefficiency": "This is an achievement, that is unlocked by **not** placing a counter clock wise rotator " + "until level 14. This location is excluded by default, as it can become inaccessible in a " + "save file after placing that building.", + "It's so slow": "This is an achievement, that is unlocked by completing level 12 **without** buying any belt " + "upgrade. This location is excluded by default, as it can become inaccessible in a save file after " + "buying that upgrade.", + "MAM (Make Anything Machine)": "This is an achievement, that is unlocked by completing any level after level 26 " + "**without** modifying your factory. It is recommended to build a Make Anything " + "Machine.", + "Perfectionist": "This is an achievement, that is unlocked by destroying more than 1000 buildings at once.", + "The next dimension": "This is an achievement, that is unlocked by opening the wires layer.", + "Oops": "This is an achievement, that is unlocked by delivering a shape, that neither a level requirement nor an " + "upgrade requirement.", + "Copy-Pasta": "This is an achievement, that is unlocked by placing a blueprint with at least 1000 buildings.", + "I've seen that before ...": "This is an achievement, that is unlocked by producing RgRyRbRr.", + "Memories from the past": "This is an achievement, that is unlocked by producing WrRgWrRg:CwCrCwCr:SgSgSgSg.", + "I need trains": "This is an achievement, that is unlocked by placing a 500 tiles long belt.", + "A bit early?": "This is an achievement, that is unlocked by producing the logo shape before reaching level 18. " + "This location is excluded by default, as it can become inaccessible in a save file after reaching " + "that level.", + "GPS": "This is an achievement, that is unlocked by placing 15 or more map markers.", + "Shapesanity 1": "Shapesanity locations can be checked by delivering a described shape to the hub, without " + "requiring a certain roation, orientation, or ordering. Shapesanity 1 is always an uncolored " + "circle.", + "Shapesanity 2": "Shapesanity locations can be checked by delivering a described shape to the hub, without " + "requiring a certain roation, orientation, or ordering. Shapesanity 2 is always an uncolored " + "square.", + "Shapesanity 3": "Shapesanity locations can be checked by delivering a described shape to the hub, without " + "requiring a certain roation, orientation, or ordering. Shapesanity 3 is always an uncolored " + "star.", + "Shapesanity 4": "Shapesanity locations can be checked by delivering a described shape to the hub, without " + "requiring a certain roation, orientation, or ordering. Shapesanity 4 is always an uncolored " + "windmill.", +} + +shapesanity_simple: dict[str, str] = {} +shapesanity_1_4: dict[str, str] = {} +shapesanity_two_sided: dict[str, str] = {} +shapesanity_three_parts: dict[str, str] = {} +shapesanity_four_parts: dict[str, str] = {} + +level_locations: list[str] = ([LOCATIONS.level(1, 1), LOCATIONS.level(20, 1), LOCATIONS.level(20, 2)] + + [LOCATIONS.level(x) for x in range(1, max_levels_and_upgrades)]) +upgrade_locations: list[str] = [LOCATIONS.upgrade(cat, roman(x)) + for cat in categories for x in range(2, max_levels_and_upgrades+1)] +achievement_locations: list[str] = [LOCATIONS.my_eyes, LOCATIONS.painter, LOCATIONS.cutter, LOCATIONS.rotater, + LOCATIONS.wait_they_stack, LOCATIONS.wires, LOCATIONS.storage, LOCATIONS.freedom, + LOCATIONS.the_logo, LOCATIONS.to_the_moon, LOCATIONS.its_piling_up, + LOCATIONS.use_it_later, LOCATIONS.efficiency_1, LOCATIONS.preparing_to_launch, + LOCATIONS.spacey, LOCATIONS.stack_overflow, LOCATIONS.its_a_mess, LOCATIONS.faster, + LOCATIONS.even_faster, LOCATIONS.get_rid_of_them, LOCATIONS.a_long_time, + LOCATIONS.addicted, LOCATIONS.cant_stop, LOCATIONS.is_this_the_end, + LOCATIONS.getting_into_it, LOCATIONS.now_its_easy, LOCATIONS.computer_guy, + LOCATIONS.speedrun_master, LOCATIONS.speedrun_novice, LOCATIONS.not_idle_game, + LOCATIONS.efficiency_2, LOCATIONS.branding_1, + LOCATIONS.branding_2, LOCATIONS.king_of_inefficiency, LOCATIONS.its_so_slow, + LOCATIONS.mam, LOCATIONS.perfectionist, LOCATIONS.next_dimension, LOCATIONS.oops, + LOCATIONS.copy_pasta, LOCATIONS.ive_seen_that_before, LOCATIONS.memories, + LOCATIONS.i_need_trains, LOCATIONS.a_bit_early, LOCATIONS.gps] +shapesanity_locations: list[str] = [LOCATIONS.shapesanity(x) for x in range(1, max_shapesanity+1)] + + +def init_shapesanity_pool() -> None: + """Imports the pregenerated shapesanity pool.""" + from .data import shapesanity_pool + shapesanity_simple.update(shapesanity_pool.shapesanity_simple) + shapesanity_1_4.update(shapesanity_pool.shapesanity_1_4) + shapesanity_two_sided.update(shapesanity_pool.shapesanity_two_sided) + shapesanity_three_parts.update(shapesanity_pool.shapesanity_three_parts) + shapesanity_four_parts.update(shapesanity_pool.shapesanity_four_parts) + + +def addlevels(maxlevel: int, logictype: str, + random_logic_phase_length: list[int]) -> dict[str, tuple[str, LocationProgressType]]: + """Returns a dictionary with all level locations based on player options (maxlevel INCLUDED). + If shape requirements are not randomized, the logic type is expected to be vanilla.""" + + # Level 1 is always directly accessible + locations: dict[str, tuple[str, LocationProgressType]] \ + = {LOCATIONS.level(1): (REGIONS.main, LocationProgressType.PRIORITY), + LOCATIONS.level(1, 1): (REGIONS.main, LocationProgressType.PRIORITY)} + level_regions = [REGIONS.main, REGIONS.levels_1, REGIONS.levels_2, REGIONS.levels_3, + REGIONS.levels_4, REGIONS.levels_5] + + def f(name: str, region: str, progress: LocationProgressType = LocationProgressType.DEFAULT) -> None: + locations[name] = (region, progress) + + if logictype.startswith(OPTIONS.logic_vanilla): + f(LOCATIONS.level(20, 1), REGIONS.levels_5) + f(LOCATIONS.level(20, 2), REGIONS.levels_5) + f(LOCATIONS.level(2), REGIONS.levels_1) + f(LOCATIONS.level(3), REGIONS.levels_1) + f(LOCATIONS.level(4), REGIONS.levels_1) + f(LOCATIONS.level(5), REGIONS.levels_2) + f(LOCATIONS.level(6), REGIONS.levels_2) + f(LOCATIONS.level(7), REGIONS.levels_3) + f(LOCATIONS.level(8), REGIONS.levels_3) + f(LOCATIONS.level(9), REGIONS.levels_4) + f(LOCATIONS.level(10), REGIONS.levels_4) + for x in range(11, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_5) + + elif logictype.startswith(OPTIONS.logic_stretched): + phaselength = maxlevel//6 + f(LOCATIONS.level(20, 1), level_regions[20//phaselength]) + f(LOCATIONS.level(20, 2), level_regions[20//phaselength]) + for x in range(2, phaselength): + f(LOCATIONS.level(x), REGIONS.main) + for x in range(phaselength, phaselength*2): + f(LOCATIONS.level(x), REGIONS.levels_1) + for x in range(phaselength*2, phaselength*3): + f(LOCATIONS.level(x), REGIONS.levels_2) + for x in range(phaselength*3, phaselength*4): + f(LOCATIONS.level(x), REGIONS.levels_3) + for x in range(phaselength*4, phaselength*5): + f(LOCATIONS.level(x), REGIONS.levels_4) + for x in range(phaselength*5, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_5) + + elif logictype.startswith(OPTIONS.logic_quick): + f(LOCATIONS.level(20, 1), REGIONS.levels_5) + f(LOCATIONS.level(20, 2), REGIONS.levels_5) + f(LOCATIONS.level(2), REGIONS.levels_1) + f(LOCATIONS.level(3), REGIONS.levels_2) + f(LOCATIONS.level(4), REGIONS.levels_3) + f(LOCATIONS.level(5), REGIONS.levels_4) + for x in range(6, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_5) + + elif logictype.startswith(OPTIONS.logic_random_steps): + next_level = 2 + for phase in range(5): + for x in range(random_logic_phase_length[phase]): + f(LOCATIONS.level(next_level+x), level_regions[phase]) + next_level += random_logic_phase_length[phase] + if next_level > 20: + f(LOCATIONS.level(20, 1), level_regions[phase]) + f(LOCATIONS.level(20, 2), level_regions[phase]) + for x in range(next_level, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_5) + if next_level <= 20: + f(LOCATIONS.level(20, 1), REGIONS.levels_5) + f(LOCATIONS.level(20, 2), REGIONS.levels_5) + + elif logictype == OPTIONS.logic_hardcore: + f(LOCATIONS.level(20, 1), REGIONS.levels_5) + f(LOCATIONS.level(20, 2), REGIONS.levels_5) + for x in range(2, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_5) + + elif logictype == OPTIONS.logic_dopamine: + f(LOCATIONS.level(20, 1), REGIONS.levels_2) + f(LOCATIONS.level(20, 2), REGIONS.levels_2) + for x in range(2, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.levels_2) + + elif logictype == OPTIONS.logic_dopamine_overflow: + f(LOCATIONS.level(20, 1), REGIONS.main) + f(LOCATIONS.level(20, 2), REGIONS.main) + for x in range(2, maxlevel+1): + f(LOCATIONS.level(x), REGIONS.main) + + else: + raise Exception(f"Illegal level logic type {logictype}") + + return locations + + +def addupgrades(finaltier: int, logictype: str, + category_random_logic_amounts: dict[str, int]) -> dict[str, tuple[str, LocationProgressType]]: + """Returns a dictionary with all upgrade locations based on player options (finaltier INCLUDED). + If shape requirements are not randomized, give logic type 0.""" + + locations: dict[str, tuple[str, LocationProgressType]] = {} + upgrade_regions = [REGIONS.main, REGIONS.upgrades_1, REGIONS.upgrades_2, REGIONS.upgrades_3, + REGIONS.upgrades_4, REGIONS.upgrades_5] + + def f(name: str, region: str, progress: LocationProgressType = LocationProgressType.DEFAULT) -> None: + locations[name] = (region, progress) + + if logictype == OPTIONS.logic_vanilla_like: + f(LOCATIONS.upgrade(CATEGORY.belt, "II"), REGIONS.main) + f(LOCATIONS.upgrade(CATEGORY.miner, "II"), REGIONS.main) + f(LOCATIONS.upgrade(CATEGORY.processors, "II"), REGIONS.main) + f(LOCATIONS.upgrade(CATEGORY.painting, "II"), REGIONS.upgrades_3) + f(LOCATIONS.upgrade(CATEGORY.belt, "III"), REGIONS.upgrades_2) + f(LOCATIONS.upgrade(CATEGORY.miner, "III"), REGIONS.upgrades_2) + f(LOCATIONS.upgrade(CATEGORY.processors, "III"), REGIONS.upgrades_1) + f(LOCATIONS.upgrade(CATEGORY.painting, "III"), REGIONS.upgrades_3) + for x in range(4, finaltier+1): + tier = roman(x) + for cat in categories: + f(LOCATIONS.upgrade(cat, tier), REGIONS.upgrades_5) + + elif logictype == OPTIONS.logic_linear: + for x in range(2, 7): + tier = roman(x) + for cat in categories: + f(LOCATIONS.upgrade(cat, tier), upgrade_regions[x-2]) + for x in range(7, finaltier+1): + tier = roman(x) + for cat in categories: + f(LOCATIONS.upgrade(cat, tier), REGIONS.upgrades_5) + + elif logictype == OPTIONS.logic_category: + for x in range(2, 7): + tier = roman(x) + f(LOCATIONS.upgrade(CATEGORY.belt, tier), REGIONS.main) + f(LOCATIONS.upgrade(CATEGORY.miner, tier), REGIONS.main) + for x in range(7, finaltier + 1): + tier = roman(x) + f(LOCATIONS.upgrade(CATEGORY.belt, tier), REGIONS.upgrades_5) + f(LOCATIONS.upgrade(CATEGORY.miner, tier), REGIONS.upgrades_5) + f(LOCATIONS.upgrade(CATEGORY.processors, "II"), REGIONS.upgrades_1) + f(LOCATIONS.upgrade(CATEGORY.processors, "III"), REGIONS.upgrades_2) + f(LOCATIONS.upgrade(CATEGORY.processors, "IV"), REGIONS.upgrades_2) + f(LOCATIONS.upgrade(CATEGORY.processors, "V"), REGIONS.upgrades_3) + f(LOCATIONS.upgrade(CATEGORY.processors, "VI"), REGIONS.upgrades_3) + for x in range(7, finaltier+1): + f(LOCATIONS.upgrade(CATEGORY.processors, roman(x)), REGIONS.upgrades_5) + for x in range(2, 4): + f(LOCATIONS.upgrade(CATEGORY.painting, roman(x)), REGIONS.upgrades_4) + for x in range(4, finaltier+1): + f(LOCATIONS.upgrade(CATEGORY.painting, roman(x)), REGIONS.upgrades_5) + + elif logictype == OPTIONS.logic_category_random: + for x in range(2, 7): + tier = roman(x) + f(LOCATIONS.upgrade(CATEGORY.belt, tier), + upgrade_regions[category_random_logic_amounts[CATEGORY.belt_low]]) + f(LOCATIONS.upgrade(CATEGORY.miner, tier), + upgrade_regions[category_random_logic_amounts[CATEGORY.miner_low]]) + f(LOCATIONS.upgrade(CATEGORY.processors, tier), + upgrade_regions[category_random_logic_amounts[CATEGORY.processors_low]]) + f(LOCATIONS.upgrade(CATEGORY.painting, tier), + upgrade_regions[category_random_logic_amounts[CATEGORY.painting_low]]) + for x in range(7, finaltier+1): + tier = roman(x) + for cat in categories: + f(LOCATIONS.upgrade(cat, tier), REGIONS.upgrades_5) + + else: # logictype == hardcore + for cat in categories: + f(LOCATIONS.upgrade(cat, "II"), REGIONS.main) + for x in range(3, finaltier+1): + tier = roman(x) + for cat in categories: + f(LOCATIONS.upgrade(cat, tier), REGIONS.upgrades_5) + + return locations + + +def addachievements(excludesoftlock: bool, excludelong: bool, excludeprogressive: bool, + maxlevel: int, upgradelogictype: str, category_random_logic_amounts: dict[str, int], + goal: str, presentlocations: dict[str, tuple[str, LocationProgressType]], + add_alias: Callable[[str, str], None], has_upgrade_traps: bool + ) -> dict[str, tuple[str, LocationProgressType]]: + """Returns a dictionary with all achievement locations based on player options.""" + + locations: dict[str, tuple[str, LocationProgressType]] = dict() + upgrade_regions = [REGIONS.main, REGIONS.upgrades_1, REGIONS.upgrades_2, REGIONS.upgrades_3, + REGIONS.upgrades_4, REGIONS.upgrades_5] + + def f(name: str, region: str, alias: str, progress: LocationProgressType = LocationProgressType.DEFAULT): + locations[name] = (region, progress) + add_alias(name, alias) + + f(LOCATIONS.my_eyes, REGIONS.menu, "Activate dark mode") + f(LOCATIONS.painter, REGIONS.paint_not_quad, "Paint a shape (no Quad Painter)") + f(LOCATIONS.cutter, REGIONS.cut_not_quad, "Cut a shape (no Quad Cutter)") + f(LOCATIONS.rotater, REGIONS.rotate_cw, "Rotate a shape clock wise") + f(LOCATIONS.wait_they_stack, REGIONS.stack_shape, "Stack a shape") + f(LOCATIONS.storage, REGIONS.store_shape, "Store a shape in the storage") + f(LOCATIONS.the_logo, REGIONS.all_buildings, "Produce the shapez logo") + f(LOCATIONS.to_the_moon, REGIONS.all_buildings, "Produce the rocket shape") + f(LOCATIONS.its_piling_up, REGIONS.all_buildings, "100k blueprint shapes") + f(LOCATIONS.use_it_later, REGIONS.all_buildings, "1 million blueprint shapes") + + f(LOCATIONS.stack_overflow, REGIONS.stack_shape, "4 layers shape") + f(LOCATIONS.its_a_mess, REGIONS.main, "100 different shapes in hub") + f(LOCATIONS.get_rid_of_them, REGIONS.trash_shape, "1000 shapes trashed") + f(LOCATIONS.getting_into_it, REGIONS.menu, "1 hour") + f(LOCATIONS.now_its_easy, REGIONS.blueprint, "Place a blueprint") + f(LOCATIONS.computer_guy, REGIONS.wiring, "Place 5000 wires") + f(LOCATIONS.perfectionist, REGIONS.any_building, "Destroy more than 1000 objects at once") + f(LOCATIONS.next_dimension, REGIONS.wiring, "Open the wires layer") + f(LOCATIONS.copy_pasta, REGIONS.blueprint, "Place a 1000 buildings blueprint") + f(LOCATIONS.ive_seen_that_before, REGIONS.all_buildings, "Produce RgRyRbRr") + f(LOCATIONS.memories, REGIONS.all_buildings, "Produce WrRgWrRg:CwCrCwCr:SgSgSgSg") + f(LOCATIONS.i_need_trains, REGIONS.belt, "Have a 500 tiles belt") + f(LOCATIONS.gps, REGIONS.menu, "15 map markers") + + # Per second delivery achievements + f(LOCATIONS.preparing_to_launch, REGIONS.all_buildings, "10 rocket shapes / second") + if not has_upgrade_traps: + f(LOCATIONS.spacey, REGIONS.all_buildings, "20 rocket shapes / second") + f(LOCATIONS.efficiency_1, REGIONS.all_buildings, "25 blueprints shapes / second") + f(LOCATIONS.efficiency_2, REGIONS.all_buildings_x1_6_belt, "50 blueprints shapes / second") + f(LOCATIONS.branding_1, REGIONS.all_buildings, "25 logo shapes / second") + f(LOCATIONS.branding_2, REGIONS.all_buildings_x1_6_belt, "50 logo shapes / second") + + # Achievements that depend on upgrades + f(LOCATIONS.even_faster, REGIONS.upgrades_5, "All upgrades on tier VIII") + if upgradelogictype == OPTIONS.logic_linear: + f(LOCATIONS.faster, REGIONS.upgrades_3, "All upgrades on tier V") + elif upgradelogictype == OPTIONS.logic_category_random: + f(LOCATIONS.faster, upgrade_regions[ + max(category_random_logic_amounts[CATEGORY.belt_low], + category_random_logic_amounts[CATEGORY.miner_low], + category_random_logic_amounts[CATEGORY.processors_low], + category_random_logic_amounts[CATEGORY.painting_low]) + ], "All upgrades on tier V") + else: + f(LOCATIONS.faster, REGIONS.upgrades_5, "All upgrades on tier V") + + # Achievements that depend on the level + f(LOCATIONS.wires, presentlocations[LOCATIONS.level(20)][0], "Complete level 20") + if not goal == GOALS.vanilla: + f(LOCATIONS.freedom, presentlocations[LOCATIONS.level(26)][0], "Complete level 26") + f(LOCATIONS.mam, REGIONS.mam, "Complete any level > 26 without modifications") + if maxlevel >= 50: + f(LOCATIONS.cant_stop, presentlocations[LOCATIONS.level(50)][0], "Reach level 50") + elif goal not in [GOALS.vanilla, GOALS.mam]: + f(LOCATIONS.cant_stop, REGIONS.levels_5, "Reach level 50") + if maxlevel >= 100: + f(LOCATIONS.is_this_the_end, presentlocations[LOCATIONS.level(100)][0], "Reach level 100") + elif goal not in [GOALS.vanilla, GOALS.mam]: + f(LOCATIONS.is_this_the_end, REGIONS.levels_5, "Reach level 100") + + # Achievements that depend on player preferences + if excludeprogressive: + unreasonable_type = LocationProgressType.EXCLUDED + else: + unreasonable_type = LocationProgressType.DEFAULT + if not excludesoftlock: + f(LOCATIONS.speedrun_master, presentlocations[LOCATIONS.level(12)][0], + "Complete level 12 in under 30 min", unreasonable_type) + f(LOCATIONS.speedrun_novice, presentlocations[LOCATIONS.level(12)][0], + "Complete level 12 in under 60 min", unreasonable_type) + f(LOCATIONS.not_idle_game, presentlocations[LOCATIONS.level(12)][0], + "Complete level 12 in under 120 min", unreasonable_type) + f(LOCATIONS.its_so_slow, presentlocations[LOCATIONS.level(12)][0], + "Complete level 12 without upgrading belts", unreasonable_type) + f(LOCATIONS.king_of_inefficiency, presentlocations[LOCATIONS.level(14)][0], + "No ccw rotator until level 14", unreasonable_type) + f(LOCATIONS.a_bit_early, REGIONS.all_buildings, + "Produce logo shape before level 18", unreasonable_type) + if not excludelong: + f(LOCATIONS.a_long_time, REGIONS.menu, "10 hours") + f(LOCATIONS.addicted, REGIONS.menu, "20 hours") + + # Achievements with a softlock chance of less than + # 1 divided by 2 to the power of the number of all atoms in the universe + f(LOCATIONS.oops, REGIONS.main, "Deliver an irrelevant shape") + + return locations + + +def addshapesanity(amount: int, random: Random, append_shapesanity: Callable[[str], None], + add_alias: Callable[[str, str], None]) -> dict[str, tuple[str, LocationProgressType]]: + """Returns a dictionary with a given number of random shapesanity locations.""" + + included_shapes: dict[str, tuple[str, LocationProgressType]] = {} + + def f(name: str, region: str, alias: str, progress: LocationProgressType = LocationProgressType.DEFAULT) -> None: + included_shapes[name] = (region, progress) + append_shapesanity(alias) + shapes_list.remove((alias, region)) + add_alias(name, alias) + + # Always have at least 4 shapesanity checks because of sphere 1 usefulls + both hardcore logic + shapes_list = list(shapesanity_simple.items()) + f(LOCATIONS.shapesanity(1), REGIONS.sanity(REGIONS.full, REGIONS.uncol), + SHAPESANITY.full(SHAPESANITY.uncolored, SHAPESANITY.circle)) + f(LOCATIONS.shapesanity(2), REGIONS.sanity(REGIONS.full, REGIONS.uncol), + SHAPESANITY.full(SHAPESANITY.uncolored, SHAPESANITY.square)) + f(LOCATIONS.shapesanity(3), REGIONS.sanity(REGIONS.full, REGIONS.uncol), + SHAPESANITY.full(SHAPESANITY.uncolored, SHAPESANITY.star)) + f(LOCATIONS.shapesanity(4), REGIONS.sanity(REGIONS.east_wind, REGIONS.uncol), + SHAPESANITY.full(SHAPESANITY.uncolored, SHAPESANITY.windmill)) + + # The pool switches dynamically depending on if either it's ratio or limit is reached + switched = 0 + for counting in range(4, amount): + if switched == 0 and (len(shapes_list) == 0 or counting == amount//2): + shapes_list = list(shapesanity_1_4.items()) + switched = 1 + elif switched == 1 and (len(shapes_list) == 0 or counting == amount*7//12): + shapes_list = list(shapesanity_two_sided.items()) + switched = 2 + elif switched == 2 and (len(shapes_list) == 0 or counting == amount*5//6): + shapes_list = list(shapesanity_three_parts.items()) + switched = 3 + elif switched == 3 and (len(shapes_list) == 0 or counting == amount*11//12): + shapes_list = list(shapesanity_four_parts.items()) + switched = 4 + x = random.randint(0, len(shapes_list)-1) + next_shape = shapes_list.pop(x) + included_shapes[LOCATIONS.shapesanity(counting+1)] = (next_shape[1], LocationProgressType.DEFAULT) + append_shapesanity(next_shape[0]) + add_alias(LOCATIONS.shapesanity(counting+1), next_shape[0]) + + return included_shapes + + +def addshapesanity_ut(shapesanity_names: list[str], add_alias: Callable[[str, str], None] + ) -> dict[str, tuple[str, LocationProgressType]]: + """Returns the same information as addshapesanity but will add specific values based on a UT rebuild.""" + + included_shapes: dict[str, tuple[str, LocationProgressType]] = {} + + for name in shapesanity_names: + for options in [shapesanity_simple, shapesanity_1_4, shapesanity_two_sided, shapesanity_three_parts, + shapesanity_four_parts]: + if name in options: + next_shape = options[name] + break + else: + raise ValueError(f"Could not find shapesanity name {name}") + included_shapes[LOCATIONS.shapesanity(len(included_shapes)+1)] = (next_shape, LocationProgressType.DEFAULT) + add_alias(LOCATIONS.shapesanity(len(included_shapes)), name) + return included_shapes + + +class ShapezLocation(Location): + game = OTHER.game_name + + def __init__(self, player: int, name: str, address: int | None, region: Region, + progress_type: LocationProgressType): + super(ShapezLocation, self).__init__(player, name, address, region) + self.progress_type = progress_type diff --git a/worlds/shapez/options.py b/worlds/shapez/options.py new file mode 100644 index 0000000000..bc3fc1ed2f --- /dev/null +++ b/worlds/shapez/options.py @@ -0,0 +1,310 @@ +import pkgutil +from dataclasses import dataclass + +import orjson + +from Options import Toggle, Choice, PerGameCommonOptions, NamedRange, Range +from .common.options import FloatRangeText + +datapackage_options = orjson.loads(pkgutil.get_data(__name__, "data/options.json")) +max_levels_and_upgrades = datapackage_options["max_levels_and_upgrades"] +max_shapesanity = datapackage_options["max_shapesanity"] +del datapackage_options + + +class Goal(Choice): + """Sets the goal of your world. + + - **Vanilla:** Complete level 26. + - **MAM:** Complete a specified level after level 26. Every level before that will be a location. It's recommended + to build a Make-Anything-Machine (MAM). + - **Even fasterer:** Upgrade everything to a specified tier after tier 8. Every upgrade before that will be a + location. + - **Efficiency III:** Deliver 256 blueprint shapes per second to the hub.""" + display_name = "Goal" + rich_text_doc = True + option_vanilla = 0 + option_mam = 1 + option_even_fasterer = 2 + option_efficiency_iii = 3 + default = 0 + + +class GoalAmount(NamedRange): + """Specify, what level or tier (when either MAM or Even Fasterer is chosen as goal) is required to reach the goal. + + If MAM is set as the goal, this has to be set to 27 or more. Else it will raise an error.""" + display_name = "Goal amount" + rich_text_doc = True + range_start = 9 + range_end = max_levels_and_upgrades + default = 27 + special_range_names = { + "minimum_mam": 27, + "recommended_mam": 50, + "long_game_mam": 120, + "minimum_even_fasterer": 9, + "recommended_even_fasterer": 16, + "long_play_even_fasterer": 35, + } + + +class RequiredShapesMultiplier(Range): + """Multiplies the amount of required shapes for levels and upgrades by value/10. + + For level 1, the amount of shapes ranges from 3 to 300. + + For level 26, it ranges from 5k to 500k.""" + display_name = "Required shapes multiplier" + rich_text_doc = True + range_start = 1 + range_end = 100 + default = 10 + + +class AllowFloatingLayers(Toggle): + """Toggle whether shape requirements are allowed to have floating layers (like the logo or the rocket shape). + + However, be aware that floating shapes make MAMs much more complex.""" + display_name = "Allow floating layers" + rich_text_doc = True + default = False + + +class RandomizeLevelRequirements(Toggle): + """Randomize the required shapes to complete levels.""" + display_name = "Randomize level requirements" + rich_text_doc = True + default = True + + +class RandomizeUpgradeRequirements(Toggle): + """Randomize the required shapes to buy upgrades.""" + display_name = "Randomize upgrade requirements" + rich_text_doc = True + default = True + + +class RandomizeLevelLogic(Choice): + """If level requirements are randomized, this sets how those random shapes are generated and how logic works for + levels. The shuffled variants shuffle the order of progression buildings obtained in the multiworld. The standard + order is: **cutter -> rotator -> painter -> color mixer -> stacker** + + - **Vanilla:** Level 1 requires nothing, 2-4 require the first building, 5-6 require also the second, 7-8 the + third, 9-10 the fourth, and 11 and onwards the fifth and thereby all buildings. + - **Stretched:** After every floor(maxlevel/6) levels, another building is required. + - **Quick:** Every Level, except level 1, requires another building, with level 6 and onwards requiring all + buildings. + - **Random steps:** After a random amount of levels, another building is required, with level 1 always requiring + none. This can potentially generate like any other option. + - **Hardcore:** All levels (except level 1) have completely random shape requirements and thus require all + buildings. Expect early BKs. + - **Dopamine (overflow):** All levels (except level 1 and the goal) require 2 random buildings (or none in case of + overflow).""" + display_name = "Randomize level logic" + rich_text_doc = True + option_vanilla = 0 + option_vanilla_shuffled = 1 + option_stretched = 2 + option_stretched_shuffled = 3 + option_quick = 4 + option_quick_shuffled = 5 + option_random_steps = 6 + option_random_steps_shuffled = 7 + option_hardcore = 8 + option_dopamine = 9 + option_dopamine_overflow = 10 + default = 2 + + +class RandomizeUpgradeLogic(Choice): + """If upgrade requirements are randomized, this sets how those random shapes are generated + and how logic works for upgrades. + + - **Vanilla-like:** Tier II requires up to two random buildings, III requires up to three random buildings, + and IV and onwards require all processing buildings. + - **Linear:** Tier II requires nothing, III-VI require another random building each, + and VII and onwards require all buildings. + - **Category:** Belt and miner upgrades require no building up to tier V, but onwards all buildings, processors + upgrades require the cutter (all tiers), rotator (tier III and onwards), and stacker (tier V and onwards), and + painting upgrades require the cutter, rotator, stacker, painter (all tiers) and color mixer (tiers V and onwards). + Tier VII and onwards will always require all buildings. + - **Category random:** Each upgrades category (up to tier VI) requires a random amount of buildings (in order), + with one category always requiring no buildings. Tier VII and onwards will always require all buildings. + - **Hardcore:** All tiers (except each tier II) have completely random shape requirements and thus require all + buildings. Expect early BKs.""" + display_name = "Randomize upgrade logic" + rich_text_doc = True + option_vanilla_like = 0 + option_linear = 1 + option_category = 2 + option_category_random = 3 + option_hardcore = 4 + default = 1 + + +class ThroughputLevelsRatio(NamedRange): + """If level requirements are randomized, this sets the ratio of how many levels (approximately) will require either + a total amount or per second amount (throughput) of shapes delivered. + + 0 means only total, 100 means only throughput, and vanilla (-1) means only levels 14, 27 and beyond have throughput. + """ + display_name = "Throughput levels ratio" + rich_text_doc = True + range_start = 0 + range_end = 100 + default = 0 + special_range_names = { + "vanilla": -1, + "only_total": 0, + "half_half": 50, + "only_throughput": 100, + } + + +class ComplexityGrowthGradient(FloatRangeText): + """If level requirements are randomized, this determines how fast complexity will grow each level. In other words: + The higher you set this value, the more difficult lategame shapes will be. + + Allowed values are floating numbers ranging from 0.0 to 10.0.""" + display_name = "Complexity growth gradient" + rich_text_doc = True + range_start = 0.0 + range_end = 10.0 + default = "0.5" + + +class SameLateUpgradeRequirements(Toggle): + """If upgrade requirements are randomized, should the last 3 shapes for each category be the same, + as in vanilla?""" + display_name = "Same late upgrade requirements" + rich_text_doc = True + default = True + + +class EarlyBalancerTunnelAndTrash(Choice): + """Makes the balancer, tunnel, and trash appear in earlier spheres. + + - **None:** Complete randomization. + - **5 buildings:** Should be accessible before getting all 5 main buildings. + - **3 buildings:** Should be accessible before getting the first 3 main buildings for levels and upgrades. + - **Sphere 1:** Always accessible from start. **Beware of generation failures.**""" + display_name = "Early balancer, tunnel, and trash" + rich_text_doc = True + option_none = 0 + option_5_buildings = 1 + option_3_buildings = 2 + option_sphere_1 = 3 + default = 2 + + +class LockBeltAndExtractor(Toggle): + """Locks Belts and Extractors and adds them to the item pool. + + **If you set this to true, achievements must also be included.**""" + display_name = "Lock Belt and Extractor" + rich_text_doc = True + default = False + + +class IncludeAchievements(Toggle): + """Include up to 45 achievements (depending on other options) as additional locations.""" + display_name = "Include Achievements" + rich_text_doc = True + default = True + + +class ExcludeSoftlockAchievements(Toggle): + """Exclude 6 achievements, that can become unreachable in a save file, if not achieved until a certain level.""" + display_name = "Exclude softlock achievements" + rich_text_doc = True + default = True + + +class ExcludeLongPlaytimeAchievements(Toggle): + """Exclude 2 achievements, that require actively playing for a really long time.""" + display_name = "Exclude long playtime achievements" + rich_text_doc = True + default = True + + +class ExcludeProgressionUnreasonable(Toggle): + """Exclude progression and useful items from being placed into softlock and long playtime achievements.""" + display_name = "Exclude progression items in softlock and long playtime achievements" + rich_text_doc = True + default = True + + +class ShapesanityAmount(Range): + """Amount of single-layer shapes that will be included as locations.""" + display_name = "Shapesanity amount" + rich_text_doc = True + range_start = 4 + range_end = max_shapesanity + default = 50 + + +class TrapsProbability(NamedRange): + """The probability of any filler item (in percent) being replaced by a trap.""" + display_name = "Traps Percentage" + rich_text_doc = True + range_start = 0 + range_end = 100 + default = 0 + special_range_names = { + "none": 0, + "rare": 4, + "occasionally": 10, + "maximum_suffering": 100, + } + + +class IncludeWhackyUpgrades(Toggle): + """Includes some very unusual upgrade items in generation (and logic), that greatly increase or decrease building + speeds. If the goal is set to Efficiency III or throughput levels ratio is not 0, decreasing upgrades (aka traps) + will always be disabled.""" + display_name = "Include Whacky Upgrades" + rich_text_doc = True + default = False + + +class SplitInventoryDrainingTrap(Toggle): + """If set to true, the inventory draining trap will be split into level, upgrade, and blueprint draining traps + instead of executing as one of those 3 randomly.""" + display_name = "Split Inventory Draining Trap" + rich_text_doc = True + default = False + + +class ToolbarShuffling(Toggle): + """If set to true, the toolbars (main and wires layer) will be shuffled (including bottom and top row). + However, keybindings will still select the same building to place.""" + display_name = "Toolbar Shuffling" + rich_text_doc = True + default = True + + +@dataclass +class ShapezOptions(PerGameCommonOptions): + goal: Goal + goal_amount: GoalAmount + required_shapes_multiplier: RequiredShapesMultiplier + allow_floating_layers: AllowFloatingLayers + randomize_level_requirements: RandomizeLevelRequirements + randomize_upgrade_requirements: RandomizeUpgradeRequirements + randomize_level_logic: RandomizeLevelLogic + randomize_upgrade_logic: RandomizeUpgradeLogic + throughput_levels_ratio: ThroughputLevelsRatio + complexity_growth_gradient: ComplexityGrowthGradient + same_late_upgrade_requirements: SameLateUpgradeRequirements + early_balancer_tunnel_and_trash: EarlyBalancerTunnelAndTrash + lock_belt_and_extractor: LockBeltAndExtractor + include_achievements: IncludeAchievements + exclude_softlock_achievements: ExcludeSoftlockAchievements + exclude_long_playtime_achievements: ExcludeLongPlaytimeAchievements + exclude_progression_unreasonable: ExcludeProgressionUnreasonable + shapesanity_amount: ShapesanityAmount + traps_percentage: TrapsProbability + include_whacky_upgrades: IncludeWhackyUpgrades + split_inventory_draining_trap: SplitInventoryDrainingTrap + toolbar_shuffling: ToolbarShuffling diff --git a/worlds/shapez/presets.py b/worlds/shapez/presets.py new file mode 100644 index 0000000000..e01192d594 --- /dev/null +++ b/worlds/shapez/presets.py @@ -0,0 +1,49 @@ +from .options import max_levels_and_upgrades, max_shapesanity + +options_presets = { + "Most vanilla": { + "goal": "vanilla", + "randomize_level_requirements": False, + "randomize_upgrade_requirements": False, + "early_balancer_tunnel_and_trash": "3_buildings", + "include_achievements": True, + "exclude_softlock_achievements": False, + "exclude_long_playtime_achievements": False, + "shapesanity_amount": 4, + "toolbar_shuffling": False, + }, + "Minimum checks": { + "goal": "vanilla", + "include_achievements": False, + "shapesanity_amount": 4 + }, + "Maximum checks": { + "goal": "even_fasterer", + "goal_amount": max_levels_and_upgrades, + "include_achievements": True, + "exclude_softlock_achievements": False, + "exclude_long_playtime_achievements": False, + "shapesanity_amount": max_shapesanity + }, + "Restrictive start": { + "goal": "vanilla", + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": "hardcore", + "randomize_upgrade_logic": "hardcore", + "early_balancer_tunnel_and_trash": "sphere_1", + "include_achievements": False, + "shapesanity_amount": 4 + }, + "Quick game": { + "goal": "efficiency_iii", + "required_shapes_multiplier": 1, + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": "hardcore", + "randomize_upgrade_logic": "hardcore", + "include_achievements": False, + "shapesanity_amount": 4, + "include_whacky_upgrades": True, + } +} diff --git a/worlds/shapez/regions.py b/worlds/shapez/regions.py new file mode 100644 index 0000000000..b5835461d8 --- /dev/null +++ b/worlds/shapez/regions.py @@ -0,0 +1,275 @@ +from BaseClasses import Region, MultiWorld, LocationProgressType, ItemClassification, CollectionState +from .items import ShapezItem +from .locations import ShapezLocation +from .data.strings import ITEMS, REGIONS, GOALS, LOCATIONS, OPTIONS +from worlds.generic.Rules import add_rule + +shapesanity_processing = [REGIONS.full, REGIONS.half, REGIONS.piece, REGIONS.stitched, REGIONS.east_wind, + REGIONS.half_half, REGIONS.col_east_wind, REGIONS.col_half_half, REGIONS.col_full, + REGIONS.col_half] +shapesanity_coloring = [REGIONS.uncol, REGIONS.painted, REGIONS.mixed] + +all_regions = [ + REGIONS.menu, REGIONS.belt, REGIONS.extract, REGIONS.main, + REGIONS.levels_1, REGIONS.levels_2, REGIONS.levels_3, REGIONS.levels_4, REGIONS.levels_5, + REGIONS.upgrades_1, REGIONS.upgrades_2, REGIONS.upgrades_3, REGIONS.upgrades_4, REGIONS.upgrades_5, + REGIONS.paint_not_quad, REGIONS.cut_not_quad, REGIONS.rotate_cw, REGIONS.stack_shape, REGIONS.store_shape, + REGIONS.trash_shape, REGIONS.blueprint, REGIONS.wiring, REGIONS.mam, REGIONS.any_building, + REGIONS.all_buildings, REGIONS.all_buildings_x1_6_belt, + *[REGIONS.sanity(processing, coloring) + for processing in shapesanity_processing + for coloring in shapesanity_coloring], +] + + +def can_cut_half(state: CollectionState, player: int) -> bool: + return state.has(ITEMS.cutter, player) + + +def can_rotate_90(state: CollectionState, player: int) -> bool: + return state.has_any((ITEMS.rotator, ITEMS.rotator_ccw), player) + + +def can_rotate_180(state: CollectionState, player: int) -> bool: + return state.has_any((ITEMS.rotator, ITEMS.rotator_ccw, ITEMS.rotator_180), player) + + +def can_stack(state: CollectionState, player: int) -> bool: + return state.has(ITEMS.stacker, player) + + +def can_paint(state: CollectionState, player: int) -> bool: + return state.has_any((ITEMS.painter, ITEMS.painter_double), player) or can_use_quad_painter(state, player) + + +def can_mix_colors(state: CollectionState, player: int) -> bool: + return state.has(ITEMS.color_mixer, player) + + +def has_tunnel(state: CollectionState, player: int) -> bool: + return state.has_any((ITEMS.tunnel, ITEMS.tunnel_tier_ii), player) + + +def has_balancer(state: CollectionState, player: int) -> bool: + return state.has(ITEMS.balancer, player) or state.has_all((ITEMS.comp_merger, ITEMS.comp_splitter), player) + + +def can_use_quad_painter(state: CollectionState, player: int) -> bool: + return (state.has_all((ITEMS.painter_quad, ITEMS.wires), player) and + state.has_any((ITEMS.switch, ITEMS.const_signal), player)) + + +def can_make_stitched_shape(state: CollectionState, player: int, floating: bool) -> bool: + return (can_stack(state, player) and + ((state.has(ITEMS.cutter_quad, player) and not floating) or + (can_cut_half(state, player) and can_rotate_90(state, player)))) + + +def can_build_mam(state: CollectionState, player: int, floating: bool) -> bool: + return (can_make_stitched_shape(state, player, floating) and can_paint(state, player) and + can_mix_colors(state, player) and has_balancer(state, player) and has_tunnel(state, player) and + state.has_all((ITEMS.belt_reader, ITEMS.storage, ITEMS.item_filter, + ITEMS.wires, ITEMS.logic_gates, ITEMS.virtual_proc), player)) + + +def can_make_east_windmill(state: CollectionState, player: int) -> bool: + # Only used for shapesanity => single layers + return (can_stack(state, player) and + (state.has(ITEMS.cutter_quad, player) or (can_cut_half(state, player) and can_rotate_180(state, player)))) + + +def can_make_half_half_shape(state: CollectionState, player: int) -> bool: + # Only used for shapesanity => single layers + return can_stack(state, player) and state.has_any((ITEMS.cutter, ITEMS.cutter_quad), player) + + +def can_make_half_shape(state: CollectionState, player: int) -> bool: + # Only used for shapesanity => single layers + return can_cut_half(state, player) or state.has_all((ITEMS.cutter_quad, ITEMS.stacker), player) + + +def has_x_belt_multiplier(state: CollectionState, player: int, needed: float) -> bool: + # Assumes there are no upgrade traps + multiplier = 1.0 + # Rising upgrades do the least improvement if received before other upgrades + for _ in range(state.count(ITEMS.upgrade_rising_belt, player)): + multiplier *= 2 + multiplier += state.count(ITEMS.upgrade_gigantic_belt, player)*10 + multiplier += state.count(ITEMS.upgrade_big_belt, player) + multiplier += state.count(ITEMS.upgrade_small_belt, player)*0.1 + return multiplier >= needed + + +def has_logic_list_building(state: CollectionState, player: int, buildings: list[str], index: int, + includeuseful: bool) -> bool: + + # Includes balancer, tunnel, and trash in logic in order to make them appear in earlier spheres + if includeuseful and not (state.has(ITEMS.trash, player) and has_balancer(state, player) and + has_tunnel(state, player)): + return False + + if buildings[index] == ITEMS.cutter: + if buildings.index(ITEMS.stacker) < index: + return state.has_any((ITEMS.cutter, ITEMS.cutter_quad), player) + else: + return can_cut_half(state, player) + elif buildings[index] == ITEMS.rotator: + return can_rotate_90(state, player) + elif buildings[index] == ITEMS.stacker: + return can_stack(state, player) + elif buildings[index] == ITEMS.painter: + return can_paint(state, player) + elif buildings[index] == ITEMS.color_mixer: + return can_mix_colors(state, player) + + +def create_shapez_regions(player: int, multiworld: MultiWorld, floating: bool, + included_locations: dict[str, tuple[str, LocationProgressType]], + location_name_to_id: dict[str, int], level_logic_buildings: list[str], + upgrade_logic_buildings: list[str], early_useful: str, goal: str) -> list[Region]: + """Creates and returns a list of all regions with entrances and all locations placed correctly.""" + regions: dict[str, Region] = {name: Region(name, player, multiworld) for name in all_regions} + + # Creates ShapezLocations for every included location and puts them into the correct region + for name, data in included_locations.items(): + regions[data[0]].locations.append(ShapezLocation(player, name, location_name_to_id[name], + regions[data[0]], data[1])) + + # Create goal event + if goal in [GOALS.vanilla, GOALS.mam]: + goal_region = regions[REGIONS.levels_5] + elif goal == GOALS.even_fasterer: + goal_region = regions[REGIONS.upgrades_5] + else: + goal_region = regions[REGIONS.all_buildings] + goal_location = ShapezLocation(player, LOCATIONS.goal, None, goal_region, LocationProgressType.DEFAULT) + goal_location.place_locked_item(ShapezItem(ITEMS.goal, ItemClassification.progression_skip_balancing, None, player)) + if goal == GOALS.efficiency_iii: + add_rule(goal_location, lambda state: has_x_belt_multiplier(state, player, 8)) + goal_region.locations.append(goal_location) + multiworld.completion_condition[player] = lambda state: state.has(ITEMS.goal, player) + + # Connect Menu to rest of regions + regions[REGIONS.menu].connect(regions[REGIONS.belt], "Placing belts", lambda state: state.has(ITEMS.belt, player)) + regions[REGIONS.menu].connect(regions[REGIONS.extract], "Extracting shapes from patches", + lambda state: state.has_any((ITEMS.extractor, ITEMS.extractor_chain), player)) + regions[REGIONS.extract].connect( + regions[REGIONS.main], "Transporting shapes over the canvas", + lambda state: state.has_any((ITEMS.belt, ITEMS.comp_merger, ITEMS.comp_splitter), player) + ) + + # Connect achievement regions + regions[REGIONS.main].connect(regions[REGIONS.paint_not_quad], "Painting with (double) painter", + lambda state: state.has_any((ITEMS.painter, ITEMS.painter_double), player)) + regions[REGIONS.extract].connect(regions[REGIONS.cut_not_quad], "Cutting with half cutter", + lambda state: can_cut_half(state, player)) + regions[REGIONS.extract].connect(regions[REGIONS.rotate_cw], "Rotating clockwise", + lambda state: state.has(ITEMS.rotator, player)) + regions[REGIONS.extract].connect(regions[REGIONS.stack_shape], "Stacking shapes", + lambda state: can_stack(state, player)) + regions[REGIONS.extract].connect(regions[REGIONS.store_shape], "Storing shapes", + lambda state: state.has(ITEMS.storage, player)) + regions[REGIONS.extract].connect(regions[REGIONS.trash_shape], "Trashing shapes", + lambda state: state.has(ITEMS.trash, player)) + regions[REGIONS.main].connect(regions[REGIONS.blueprint], "Copying and placing blueprints", + lambda state: state.has(ITEMS.blueprints, player) and + can_make_stitched_shape(state, player, floating) and + can_paint(state, player) and can_mix_colors(state, player)) + regions[REGIONS.menu].connect(regions[REGIONS.wiring], "Using the wires layer", + lambda state: state.has(ITEMS.wires, player)) + regions[REGIONS.main].connect(regions[REGIONS.mam], "Building a MAM", + lambda state: can_build_mam(state, player, floating)) + regions[REGIONS.menu].connect(regions[REGIONS.any_building], "Placing any building", lambda state: state.has_any(( + ITEMS.belt, ITEMS.balancer, ITEMS.comp_merger, ITEMS.comp_splitter, ITEMS.tunnel, ITEMS.tunnel_tier_ii, + ITEMS.extractor, ITEMS.extractor_chain, ITEMS.cutter, ITEMS.cutter_quad, ITEMS.rotator, ITEMS.rotator_ccw, + ITEMS.rotator_180, ITEMS.stacker, ITEMS.painter, ITEMS.painter_double, ITEMS.painter_quad, ITEMS.color_mixer, + ITEMS.trash, ITEMS.belt_reader, ITEMS.storage, ITEMS.switch, ITEMS.item_filter, ITEMS.display, ITEMS.wires + ), player)) + regions[REGIONS.main].connect(regions[REGIONS.all_buildings], "Using all main buildings", + lambda state: can_make_stitched_shape(state, player, floating) and + can_paint(state, player) and can_mix_colors(state, player)) + regions[REGIONS.all_buildings].connect(regions[REGIONS.all_buildings_x1_6_belt], + "Delivering per second with 1.6x belt speed", + lambda state: has_x_belt_multiplier(state, player, 1.6)) + + # Progressively connect level and upgrade regions + regions[REGIONS.main].connect( + regions[REGIONS.levels_1], "Using first level building", + lambda state: has_logic_list_building(state, player, level_logic_buildings, 0, False)) + regions[REGIONS.levels_1].connect( + regions[REGIONS.levels_2], "Using second level building", + lambda state: has_logic_list_building(state, player, level_logic_buildings, 1, False)) + regions[REGIONS.levels_2].connect( + regions[REGIONS.levels_3], "Using third level building", + lambda state: has_logic_list_building(state, player, level_logic_buildings, 2, + early_useful == OPTIONS.buildings_3)) + regions[REGIONS.levels_3].connect( + regions[REGIONS.levels_4], "Using fourth level building", + lambda state: has_logic_list_building(state, player, level_logic_buildings, 3, False)) + regions[REGIONS.levels_4].connect( + regions[REGIONS.levels_5], "Using fifth level building", + lambda state: has_logic_list_building(state, player, level_logic_buildings, 4, + early_useful == OPTIONS.buildings_5)) + regions[REGIONS.main].connect( + regions[REGIONS.upgrades_1], "Using first upgrade building", + lambda state: has_logic_list_building(state, player, upgrade_logic_buildings, 0, False)) + regions[REGIONS.upgrades_1].connect( + regions[REGIONS.upgrades_2], "Using second upgrade building", + lambda state: has_logic_list_building(state, player, upgrade_logic_buildings, 1, False)) + regions[REGIONS.upgrades_2].connect( + regions[REGIONS.upgrades_3], "Using third upgrade building", + lambda state: has_logic_list_building(state, player, upgrade_logic_buildings, 2, + early_useful == OPTIONS.buildings_3)) + regions[REGIONS.upgrades_3].connect( + regions[REGIONS.upgrades_4], "Using fourth upgrade building", + lambda state: has_logic_list_building(state, player, upgrade_logic_buildings, 3, False)) + regions[REGIONS.upgrades_4].connect( + regions[REGIONS.upgrades_5], "Using fifth upgrade building", + lambda state: has_logic_list_building(state, player, upgrade_logic_buildings, 4, + early_useful == OPTIONS.buildings_5)) + + # Connect Uncolored shapesanity regions to Main + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.full, REGIONS.uncol)], "Delivering unprocessed", lambda state: True) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.half, REGIONS.uncol)], "Cutting in single half", + lambda state: can_make_half_shape(state, player)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.piece, REGIONS.uncol)], "Cutting in single piece", + lambda state: (can_cut_half(state, player) and can_rotate_90(state, player)) or + state.has(ITEMS.cutter_quad, player)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.half_half, REGIONS.uncol)], "Cutting and stacking into two halves", + lambda state: can_make_half_half_shape(state, player)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.stitched, REGIONS.uncol)], "Stitching complex shapes", + lambda state: can_make_stitched_shape(state, player, floating)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.east_wind, REGIONS.uncol)], "Rotating and stitching a single windmill half", + lambda state: can_make_east_windmill(state, player)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.col_full, REGIONS.uncol)], "Painting with a quad painter or stitching", + lambda state: can_make_stitched_shape(state, player, floating) or can_use_quad_painter(state, player)) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.col_east_wind, REGIONS.uncol)], "Why windmill, why?", + lambda state: can_make_stitched_shape(state, player, floating) or + (can_use_quad_painter(state, player) and can_make_east_windmill(state, player))) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.col_half_half, REGIONS.uncol)], "Quad painting a half-half shape", + lambda state: can_make_stitched_shape(state, player, floating) or + (can_use_quad_painter(state, player) and can_make_half_half_shape(state, player))) + regions[REGIONS.main].connect( + regions[REGIONS.sanity(REGIONS.col_half, REGIONS.uncol)], "Quad painting a half shape", + lambda state: can_make_stitched_shape(state, player, floating) or + (can_use_quad_painter(state, player) and can_make_half_shape(state, player))) + + # Progressively connect colored shapesanity regions + for processing in shapesanity_processing: + regions[REGIONS.sanity(processing, REGIONS.uncol)].connect( + regions[REGIONS.sanity(processing, REGIONS.painted)], f"Painting a {processing.lower()} shape", + lambda state: can_paint(state, player)) + regions[REGIONS.sanity(processing, REGIONS.painted)].connect( + regions[REGIONS.sanity(processing, REGIONS.mixed)], f"Mixing colors for a {processing.lower()} shape", + lambda state: can_mix_colors(state, player)) + + return [region for region in regions.values() if len(region.locations) or len(region.exits)] diff --git a/worlds/shapez/test/__init__.py b/worlds/shapez/test/__init__.py new file mode 100644 index 0000000000..c8855be960 --- /dev/null +++ b/worlds/shapez/test/__init__.py @@ -0,0 +1,203 @@ +from unittest import TestCase + +from test.bases import WorldTestBase +from .. import ShapezWorld +from ..data.strings import GOALS, OTHER, ITEMS, LOCATIONS, CATEGORY, OPTIONS, SHAPESANITY +from ..options import max_levels_and_upgrades, max_shapesanity + + +class ShapezTestBase(WorldTestBase): + game = OTHER.game_name + world: ShapezWorld + + def test_location_count(self): + self.assertTrue(self.world.location_count > 0, + f"location_count is {self.world.location_count} for some reason.") + + def test_logic_lists(self): + logic_buildings = [ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker] + for building in logic_buildings: + count = self.world.level_logic.count(building) + self.assertTrue(count == 1, f"{building} was found {count} times in level_logic.") + count = self.world.upgrade_logic.count(building) + self.assertTrue(count == 1, f"{building} was found {count} times in upgrade_logic.") + self.assertTrue(len(self.world.level_logic) == 5, + f"level_logic contains {len(self.world.level_logic)} entries instead of the expected 5.") + self.assertTrue(len(self.world.upgrade_logic) == 5, + f"upgrade_logic contains {len(self.world.upgrade_logic)} entries instead of the expected 5.") + + def test_random_logic_phase_length(self): + self.assertTrue(len(self.world.random_logic_phase_length) == 5, + f"random_logic_phase_length contains {len(self.world.random_logic_phase_length)} entries " + + f"instead of the expected 5.") + self.assertTrue(sum(self.world.random_logic_phase_length) < self.world.maxlevel, + f"The sum of all random phase lengths is greater than allowed: " + + str(sum(self.world.random_logic_phase_length))) + for length in self.world.random_logic_phase_length: + self.assertTrue(length in range(self.world.maxlevel), + f"Found an illegal value in random_logic_phase_length: {length}") + + def test_category_random_logic_amounts(self): + self.assertTrue(len(self.world.category_random_logic_amounts) == 4, + f"Found {len(self.world.category_random_logic_amounts)} instead of 4 keys in " + f"category_random_logic_amounts.") + self.assertTrue(min(self.world.category_random_logic_amounts.values()) == 0, + "Found a value less than or no 0 in category_random_logic_amounts.") + self.assertTrue(max(self.world.category_random_logic_amounts.values()) <= 5, + "Found a value greater than 5 in category_random_logic_amounts.") + + def test_maxlevel_and_finaltier(self): + self.assertTrue(self.world.maxlevel in range(25, max_levels_and_upgrades), + f"Found an illegal value for maxlevel: {self.world.maxlevel}") + self.assertTrue(self.world.finaltier in range(8, max_levels_and_upgrades+1), + f"Found an illegal value for finaltier: {self.world.finaltier}") + + def test_included_locations(self): + self.assertTrue(len(self.world.included_locations) > 0, "Found no locations cached in included_locations.") + self.assertTrue(LOCATIONS.level(1) in self.world.included_locations.keys(), + "Could not find Level 1 (guraranteed location) cached in included_locations.") + self.assertTrue(LOCATIONS.upgrade(CATEGORY.belt, "II") in self.world.included_locations.keys(), + "Could not find Belt Upgrade Tier II (guraranteed location) cached in included_locations.") + self.assertTrue(LOCATIONS.shapesanity(1) in self.world.included_locations.keys(), + "Could not find Shapesanity 1 (guraranteed location) cached in included_locations.") + + def test_shapesanity_names(self): + names_length = len(self.world.shapesanity_names) + locations_length = len([0 for loc in self.multiworld.get_locations(self.player) if "Shapesanity" in loc.name]) + self.assertEqual(names_length, locations_length, + f"The amount of shapesanity names ({names_length}) does not match the amount of included " + + f"shapesanity locations ({locations_length}).") + self.assertTrue(SHAPESANITY.full(SHAPESANITY.uncolored, SHAPESANITY.circle) in self.world.shapesanity_names, + "Uncolored Circle is guaranteed but was not found in shapesanity_names.") + + def test_efficiency_iii_no_softlock(self): + if self.world.options.goal == GOALS.efficiency_iii: + for item in self.multiworld.itempool: + self.assertFalse(item.name.endswith("Upgrade Trap"), + "Item pool contains an upgrade trap, which could make the efficiency_iii goal " + "unreachable if collected.") + + +class TestGlobalOptionsImport(TestCase): + + def test_global_options_import(self): + self.assertTrue(isinstance(max_levels_and_upgrades, int), f"The global option max_levels_and_upgrades is not " + + f"an integer, but instead a " + + f"{type(max_levels_and_upgrades)}.") + self.assertTrue(max_levels_and_upgrades >= 27, f"max_levels_and_upgrades must be at least 27, but is " + + f"{max_levels_and_upgrades} instead.") + self.assertTrue(isinstance(max_shapesanity, int), f"The global option max_shapesanity is not an integer, but " + + f"instead a {type(max_levels_and_upgrades)}.") + self.assertTrue(max_shapesanity >= 4, f"max_shapesanity must be at least 4, but is " + + f"{max_levels_and_upgrades} instead.") + + +# The following unittests are intended to test all code paths of the generator + +class TestAllRelevantOptions1(ShapezTestBase): + options = { + "goal": GOALS.vanilla, + "randomize_level_requirements": False, + "randomize_upgrade_requirements": False, + "complexity_growth_gradient": "0.1234", + "early_balancer_tunnel_and_trash": "none", + "lock_belt_and_extractor": True, + "include_achievements": True, + "exclude_softlock_achievements": False, + "exclude_long_playtime_achievements": False, + "exclude_progression_unreasonable": True, + "shapesanity_amount": max_shapesanity, + "traps_percentage": "random" + } + + +class TestAllRelevantOptions2(ShapezTestBase): + options = { + "goal": GOALS.mam, + "goal_amount": max_levels_and_upgrades, + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": OPTIONS.logic_random_steps, + "randomize_upgrade_logic": OPTIONS.logic_vanilla_like, + "complexity_growth_gradient": "2", + "early_balancer_tunnel_and_trash": OPTIONS.buildings_5, + "lock_belt_and_extractor": False, + "include_achievements": True, + "exclude_softlock_achievements": False, + "exclude_long_playtime_achievements": False, + "exclude_progression_unreasonable": False, + "shapesanity_amount": 4, + "traps_percentage": 0 + } + + +class TestAllRelevantOptions3(ShapezTestBase): + options = { + "goal": GOALS.even_fasterer, + "goal_amount": max_levels_and_upgrades, + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": f"{OPTIONS.logic_vanilla}_shuffled", + "randomize_upgrade_logic": OPTIONS.logic_linear, + "complexity_growth_gradient": "1e-003", + "early_balancer_tunnel_and_trash": OPTIONS.buildings_3, + "lock_belt_and_extractor": False, + "include_achievements": True, + "exclude_softlock_achievements": True, + "exclude_long_playtime_achievements": True, + "shapesanity_amount": "random", + "traps_percentage": 100, + "include_whacky_upgrades": True, + "split_inventory_draining_trap": True + } + + +class TestAllRelevantOptions4(ShapezTestBase): + options = { + "goal": GOALS.efficiency_iii, + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": f"{OPTIONS.logic_stretched}_shuffled", + "randomize_upgrade_logic": OPTIONS.logic_category, + "early_balancer_tunnel_and_trash": OPTIONS.sphere_1, + "lock_belt_and_extractor": False, + "include_achievements": True, + "exclude_softlock_achievements": True, + "exclude_long_playtime_achievements": True, + "shapesanity_amount": "random", + "traps_percentage": "random", + "include_whacky_upgrades": True, + } + + +class TestAllRelevantOptions5(ShapezTestBase): + options = { + "goal": GOALS.mam, + "goal_amount": "random-range-27-500", + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": f"{OPTIONS.logic_quick}_shuffled", + "randomize_upgrade_logic": OPTIONS.logic_category_random, + "lock_belt_and_extractor": False, + "include_achievements": True, + "exclude_softlock_achievements": True, + "exclude_long_playtime_achievements": True, + "shapesanity_amount": "random", + "traps_percentage": 100, + "split_inventory_draining_trap": False + } + + +class TestAllRelevantOptions6(ShapezTestBase): + options = { + "goal": GOALS.mam, + "goal_amount": "random-range-27-500", + "randomize_level_requirements": True, + "randomize_upgrade_requirements": True, + "randomize_level_logic": OPTIONS.logic_hardcore, + "randomize_upgrade_logic": OPTIONS.logic_hardcore, + "lock_belt_and_extractor": False, + "include_achievements": False, + "shapesanity_amount": "random", + "traps_percentage": "random" + } diff --git a/worlds/shivers/__init__.py b/worlds/shivers/__init__.py index 3430a5a02d..dd941b9212 100644 --- a/worlds/shivers/__init__.py +++ b/worlds/shivers/__init__.py @@ -261,13 +261,13 @@ class ShiversWorld(World): data.type == ItemType.POT_DUPLICATE] elif self.options.full_pots == "complete": return [self.create_item(name) for name, data in item_table.items() if - data.type == ItemType.POT_COMPELTE_DUPLICATE] + data.type == ItemType.POT_COMPLETE_DUPLICATE] else: pool = [] pieces = [self.create_item(name) for name, data in item_table.items() if data.type == ItemType.POT_DUPLICATE] complete = [self.create_item(name) for name, data in item_table.items() if - data.type == ItemType.POT_COMPELTE_DUPLICATE] + data.type == ItemType.POT_COMPLETE_DUPLICATE] for i in range(10): if self.pot_completed_list[i] == 0: pool.append(pieces[i]) diff --git a/worlds/sm/Options.py b/worlds/sm/Options.py index 3dad16ad3a..7bce352994 100644 --- a/worlds/sm/Options.py +++ b/worlds/sm/Options.py @@ -1,5 +1,5 @@ import typing -from Options import Choice, PerGameCommonOptions, Range, OptionDict, OptionList, OptionSet, Option, Toggle, DefaultOnToggle +from Options import Choice, PerGameCommonOptions, Range, OptionDict, OptionList, OptionSet, OptionGroup, Toggle, DefaultOnToggle from .variaRandomizer.utils.objectives import _goals from dataclasses import dataclass @@ -8,8 +8,15 @@ class StartItemsRemovesFromPool(Toggle): display_name = "StartItems Removes From Item Pool" class Preset(Choice): - """Choose one of the presets or specify "varia_custom" to use varia_custom_preset option or specify "custom" to use - custom_preset option.""" + """Determines the general difficulty of the item placements by adjusting the list of tricks that logic allows. + - Newbie: New to randomizers, but completed Super Metroid 100% and knows basic techniques (Wall Jump, Shinespark, Mid-air Morph) + - Casual: Occasional rando player. No hell runs or suitless Maridia, some easy to learn tricks in logic. + - Regular: Plays rando regularly. Knows many tricks that open up the game. + - Veteran: Experienced rando player. Harder everything, some tougher tricks in logic. + - Expert: Knows almost all tricks: full suitless Maridia, Lower Norfair hell runs, etc. + - Master: Everything on hardest, all tricks known. + In-depth details on each preset can be found on the VARIA website: https://varia.run/presets + You may also specify "varia_custom" to use varia_custom_preset option, or specify "custom" to use custom_preset option.""" display_name = "Preset" option_newbie = 0 option_casual = 1 @@ -46,7 +53,8 @@ class StartLocation(Choice): default = 1 class DeathLink(Choice): - """When DeathLink is enabled and someone dies, you will die. With survive reserve tanks can save you.""" + """When DeathLink is enabled and someone else with DeathLink dies, you will die. + If "Enable Survive" is selected, reserve tanks can save you.""" display_name = "Death Link" option_disable = 0 option_enable = 1 @@ -56,11 +64,13 @@ class DeathLink(Choice): default = 0 class RemoteItems(Toggle): - """Indicates you get items sent from your own world. This allows coop play of a world.""" - display_name = "Remote Items" + """Items from your own world are sent via the Archipelago server. This allows co-op play of a world and means that + you will not lose items on death or save file loss.""" + display_name = "Remote Items" class MaxDifficulty(Choice): - """Depending on the perceived difficulties of the techniques, bosses, hell runs etc. from the preset, it will + """Maximum difficulty of tricks that are allowed from the seed's Preset. + Depending on the perceived difficulties of the techniques, bosses, hell runs etc. from the preset, it will prevent the Randomizer from placing an item in a location too difficult to reach with the current items.""" display_name = "Maximum Difficulty" option_easy = 0 @@ -73,7 +83,7 @@ class MaxDifficulty(Choice): default = 4 class MorphPlacement(Choice): - """Influences where the Morphing Ball with be placed.""" + """Influences where the Morphing Ball will be placed.""" display_name = "Morph Placement" option_early = 0 option_normal = 1 @@ -85,21 +95,21 @@ class StrictMinors(Toggle): display_name = "Strict Minors" class MissileQty(Range): - """The higher the number the higher the probability of choosing missles when placing a minor.""" + """The higher the number, the higher the probability of choosing Missiles when placing a minor.""" display_name = "Missile Quantity" range_start = 10 range_end = 90 default = 30 class SuperQty(Range): - """The higher the number the higher the probability of choosing super missles when placing a minor.""" + """The higher the number, the higher the probability of choosing Super Missiles when placing a minor.""" display_name = "Super Quantity" range_start = 10 range_end = 90 default = 20 class PowerBombQty(Range): - """The higher the number the higher the probability of choosing power bombs when placing a minor.""" + """The higher the number, the higher the probability of choosing Power Bombs when placing a minor.""" display_name = "Power Bomb Quantity" range_start = 10 range_end = 90 @@ -123,7 +133,13 @@ class EnergyQty(Choice): default = 3 class AreaRandomization(Choice): - """Randomize areas together using bidirectional access portals.""" + """Randomize areas together using bidirectional access portals. + - Off: No change. All rooms are connected the same as in the original game. + - Full: All doors connecting areas will be randomized. "Areas" are roughly determined, but generally are regions + with different tilesets or music. For example, red Brinstar and green/pink Brinstar are different areas, Crocomire + and upper Norfair are different areas, etc. + - Light: Keep the same number of transitions between areas as in vanilla. So Crocomire area will always be connected + to upper Norfair, there'll always be two transitions between Crateria/blue Brinstar and green/pink Brinstar, etc.""" display_name = "Area Randomization" option_off = 0 option_light = 1 @@ -136,13 +152,13 @@ class AreaLayout(Toggle): display_name = "Area Layout" class DoorsColorsRando(Toggle): - """Randomize the color of Red/Green/Yellow doors. Add four new type of doors which require Ice/Wave/Spazer/Plasma - beams to open them.""" + """Randomize the color of Red/Green/Yellow doors. Add four new types of doors which require Ice/Wave/Spazer/Plasma + Beams to open them.""" display_name = "Doors Colors Rando" class AllowGreyDoors(Toggle): """When randomizing the color of Red/Green/Yellow doors, some doors can be randomized to Grey. Grey doors will never - open, you will have to go around them.""" + open; you will have to go around them.""" display_name = "Allow Grey Doors" class BossRandomization(Toggle): @@ -169,7 +185,10 @@ class LayoutPatches(DefaultOnToggle): display_name = "Layout Patches" class VariaTweaks(Toggle): - """Include minor tweaks for the game to behave 'as it should' in a randomizer context""" + """Include minor tweaks for the game to behave 'as it should' in a randomizer context: + - Bomb Torizo always activates after picking up its item and does not require Bomb to activate + - Wrecked Ship item on the Energy Tank Chozo statue is present before defeating Phantoon + - Lower Norfair Chozo statue that lowers the acid toward Gold Torizo does not require Space Jump to activate""" display_name = "Varia Tweaks" class NerfedCharge(Toggle): @@ -179,7 +198,12 @@ class NerfedCharge(Toggle): display_name = "Nerfed Charge" class GravityBehaviour(Choice): - """Modify the heat damage and enemy damage reduction qualities of the Gravity and Varia Suits.""" + """Modify the heat damage and enemy damage reduction qualities of the Gravity and Varia Suits. + - Vanilla: Gravity provides full protection against all environmental damage (heat, spikes, etc.) + - Balanced: Removes Gravity environmental protection. Doubles Varia environmental protection. Enemy damage protection + is vanilla (50% Varia, 75% Gravity). + - Progressive: Gravity provides 50% heat reduction, Varia provides full heat reduction. Each suit adds 50% enemy + and environmental reduction, stacking to 75% reduction if you have both.""" display_name = "Gravity Behaviour" option_Vanilla = 0 option_Balanced = 1 @@ -233,7 +257,7 @@ class RandomMusic(Toggle): class CustomPreset(OptionDict): """ - see https://randommetroidsolver.pythonanywhere.com/presets for detailed info on each preset settings + see https://varia.run/presets for detailed info on each preset settings knows: each skill (know) has a pair [can use, perceived difficulty using one of 1, 5, 10, 25, 50 or 100 each one matching a max_difficulty] settings: hard rooms, hellruns and bosses settings @@ -246,7 +270,7 @@ class CustomPreset(OptionDict): } class VariaCustomPreset(OptionList): - """use an entry from the preset list on https://randommetroidsolver.pythonanywhere.com/presets""" + """use an entry from the preset list on https://varia.run/presets""" display_name = "Varia Custom Preset" default = {} @@ -259,7 +283,7 @@ class EscapeRando(Toggle): During the escape sequence: - All doors are opened - Maridia tube is opened - - The Hyper Beam can destroy Bomb , Power Bomb and Super Missile blocks and open blue/green gates from both sides + - The Hyper Beam can destroy Bomb, Power Bomb and Super Missile blocks and open blue/green gates from both sides - All mini bosses are defeated - All minor enemies are removed to allow you to move faster and remove lag @@ -281,9 +305,9 @@ class RemoveEscapeEnemies(Toggle): class Tourian(Choice): """ Choose endgame Tourian behaviour: - Vanilla: regular vanilla Tourian - Fast: speed up Tourian to skip Metroids, Zebetites, and all cutscenes (including Mother Brain 3 fight). Golden Four statues are replaced by an invincible Gadora until all objectives are completed. - Disabled: skip Tourian entirely, ie. escape sequence is triggered as soon as all objectives are completed. + - Vanilla: regular vanilla Tourian + - Fast: speed up Tourian to skip Metroids, Zebetites, and all cutscenes (including Mother Brain 3 fight). Golden Four statues are replaced by an invincible Gadora until all objectives are completed. + - Disabled: skip Tourian entirely; the escape sequence is triggered as soon as all objectives are completed. """ display_name = "Endgame behavior with Tourian" option_Vanilla = 0 @@ -373,10 +397,71 @@ class RelaxedRoundRobinCF(Toggle): """ display_name = "Relaxed round robin Crystal Flash" +sm_option_groups = [ + OptionGroup("Logic", [ + Preset, + MaxDifficulty, + StartLocation, + VariaCustomPreset, + CustomPreset, + ]), + OptionGroup("Objectives and Endgame", [ + Objective, + CustomObjective, + CustomObjectiveCount, + CustomObjectiveList, + Tourian, + EscapeRando, + RemoveEscapeEnemies, + Animals, + ]), + OptionGroup("Areas and Layout", [ + AreaRandomization, + AreaLayout, + DoorsColorsRando, + AllowGreyDoors, + BossRandomization, + LayoutPatches, + ]), + OptionGroup("Item Pool", [ + MorphPlacement, + StrictMinors, + MissileQty, + SuperQty, + PowerBombQty, + MinorQty, + EnergyQty, + FunCombat, + FunMovement, + FunSuits, + ]), + OptionGroup("Misc Tweaks", [ + VariaTweaks, + GravityBehaviour, + NerfedCharge, + SpinJumpRestart, + SpeedKeep, + InfiniteSpaceJump, + RelaxedRoundRobinCF, + ]), + OptionGroup("Quality of Life", [ + ElevatorsSpeed, + DoorsSpeed, + RefillBeforeSave, + ]), + OptionGroup("Cosmetic", [ + Hud, + HideItems, + NoMusic, + RandomMusic, + ]), +] + @dataclass class SMOptions(PerGameCommonOptions): start_inventory_removes_from_pool: StartItemsRemovesFromPool preset: Preset + max_difficulty: MaxDifficulty start_location: StartLocation remote_items: RemoteItems death_link: DeathLink @@ -384,7 +469,6 @@ class SMOptions(PerGameCommonOptions): #scav_num_locs: "10" #scav_randomized: "off" #scav_escape: "off" - max_difficulty: MaxDifficulty #progression_speed": "medium" #progression_difficulty": "normal" morph_placement: MorphPlacement diff --git a/worlds/sm/Rom.py b/worlds/sm/Rom.py index c5b6645ed8..9d567aa482 100644 --- a/worlds/sm/Rom.py +++ b/worlds/sm/Rom.py @@ -1,6 +1,7 @@ import hashlib import os +import settings import json import Utils from Utils import read_snes_rom @@ -77,7 +78,7 @@ def get_base_rom_bytes(file_name: str = "") -> bytes: def get_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() + options: settings.Settings = settings.get_settings() if not file_name: file_name = options["sm_options"]["rom_file"] if not os.path.exists(file_name): diff --git a/worlds/sm/__init__.py b/worlds/sm/__init__.py index bc8dcd6114..cdb58b72fb 100644 --- a/worlds/sm/__init__.py +++ b/worlds/sm/__init__.py @@ -15,7 +15,7 @@ from worlds.generic.Rules import add_rule, set_rule logger = logging.getLogger("Super Metroid") -from .Options import SMOptions +from .Options import SMOptions, sm_option_groups from .Client import SMSNIClient from .Rom import SM_ROM_MAX_PLAYERID, SM_ROM_PLAYERDATA_COUNT, SMProcedurePatch, get_sm_symbols import Utils @@ -78,6 +78,7 @@ class SMWeb(WebWorld): "multiworld/en", ["Farrak Kilhn"] )] + option_groups = sm_option_groups class ByteEdit(TypedDict): @@ -852,7 +853,7 @@ class SMWorld(World): def fill_slot_data(self): slot_data = {} if not self.multiworld.is_race: - slot_data = self.options.as_dict(*self.options_dataclass.type_hints) + slot_data = self.options.as_dict("start_location", "max_difficulty", "area_randomization", "doors_colors_rando", "boss_randomization") slot_data["Preset"] = { "Knows": {}, "Settings": {"hardRooms": Settings.SettingsDict[self.player].hardRooms, "bossesDifficulty": Settings.SettingsDict[self.player].bossesDifficulty, diff --git a/worlds/sm/variaRandomizer/logic/smbool.py b/worlds/sm/variaRandomizer/logic/smbool.py index b7f596cbbb..25f20b550a 100644 --- a/worlds/sm/variaRandomizer/logic/smbool.py +++ b/worlds/sm/variaRandomizer/logic/smbool.py @@ -66,6 +66,14 @@ class SMBool: def __copy__(self): return SMBool(self.bool, self.difficulty, self._knows, self._items) + def __deepcopy__(self, memodict): + # `bool` and `difficulty` are a `bool` and `int`, so do not need to be copied. + # The `_knows` list is never mutated, so does not need to be copied. + # The `_items` list is a `list[str | list[str]]` (copied to a flat `list[str]` when accessed through the `items` + # property) that is mutated by code in helpers.py, so needs to be copied. Because there could be lists within + # the list, it is copied using the `flatten()` helper function. + return SMBool(self.bool, self.difficulty, self._knows, flatten(self._items)) + def json(self): # as we have slots instead of dict return {'bool': self.bool, 'difficulty': self.difficulty, 'knows': self.knows, 'items': self.items} diff --git a/worlds/sm/variaRandomizer/logic/smboolmanager.py b/worlds/sm/variaRandomizer/logic/smboolmanager.py index 16f903074e..27abb0d31d 100644 --- a/worlds/sm/variaRandomizer/logic/smboolmanager.py +++ b/worlds/sm/variaRandomizer/logic/smboolmanager.py @@ -8,6 +8,7 @@ from ..utils.doorsmanager import DoorsManager from ..utils.objectives import Objectives from ..utils.parameters import Knows, isKnows import logging +from copy import deepcopy import sys class SMBoolManager(object): @@ -34,6 +35,46 @@ class SMBoolManager(object): self.createFacadeFunctions() self.createKnowsFunctions(player) self.resetItems() + self.itemsPositions = {} + + def __deepcopy__(self, memodict): + # Use __new__ to avoid calling __init__ like copy.deepcopy without __deepcopy__ implemented. + new = object.__new__(type(self)) + + # Copy everything over in the same order as __init__, ensuring that mutable attributes are deeply copied. + + # SMBool instances contain mutable lists, so must be deep-copied. + new._items = {i: deepcopy(v, memodict) for i, v in self._items.items()} + # `_counts` is a dict[str, int], so the dict can be copied because its keys and values are immutable. + new._counts = self._counts.copy() + # `player` is an int. + new.player = self.player + # `maxDiff` is an int. + new.maxDiff = self.maxDiff + # `onlyBossLeft` is a bool. + new.onlyBossLeft = self.onlyBossLeft + # The HelpersGraph keeps reference to the instance, so a new HelpersGraph is required. + new.helpers = Logic.HelpersGraph(new) + # DoorsManager is stateless, so the same instance can be used. + new.doorsManager = self.doorsManager + # Objectives are cached by self.player, so will be the same instance for the copy. + new.objectives = self.objectives + # Copy the facade functions from new.helpers into new.__dict__. + new.createFacadeFunctions() + # Copying the existing 'knows' functions from `self` to `new` is faster than re-creating all the lambdas with + # `new.createKnowsFunctions(player)`. + for key in Knows.__dict__.keys(): + if isKnows(key): + attribute_name = "knows"+key + knows_func = getattr(self, attribute_name) + setattr(new, attribute_name, knows_func) + # There is no need to call `new.resetItems()` because `_items` and `_counts` have been copied over. + # new.resetItems() + # itemsPositions is a `dict[str, tuple[int, int]]`, so the dict can be copied because the keys and values are + # immutable. + new.itemsPositions = self.itemsPositions.copy() + + return new def computeItemsPositions(self): # compute index in cache key for each items @@ -245,6 +286,9 @@ class SMBoolManagerPlando(SMBoolManager): def __init__(self): super(SMBoolManagerPlando, self).__init__() + def __deepcopy__(self, memodict): + return super().__deepcopy__(memodict) + def addItem(self, item): # a new item is available already = self.haveItem(item) diff --git a/worlds/smw/Regions.py b/worlds/smw/Regions.py index 2496049874..d7950ffb35 100644 --- a/worlds/smw/Regions.py +++ b/worlds/smw/Regions.py @@ -808,7 +808,7 @@ def create_regions(world: World, active_locations): lambda state: (state.has(ItemName.blue_switch_palace, player) and (state.has(ItemName.p_switch, player) or state.has(ItemName.green_switch_palace, player) or - (state.has(ItemName.yellow_switch_palace, player) or state.has(ItemName.red_switch_palace, player))))) + (state.has(ItemName.yellow_switch_palace, player) and state.has(ItemName.red_switch_palace, player))))) add_location_to_region(multiworld, player, active_locations, LocationName.chocolate_island_3_region, LocationName.chocolate_island_3_dragon) add_location_to_region(multiworld, player, active_locations, LocationName.chocolate_island_4_region, LocationName.chocolate_island_4_dragon, lambda state: (state.has(ItemName.p_switch, player) and diff --git a/worlds/smw/Rom.py b/worlds/smw/Rom.py index 9016e14def..081d6b4a50 100644 --- a/worlds/smw/Rom.py +++ b/worlds/smw/Rom.py @@ -3185,9 +3185,9 @@ def get_base_rom_bytes(file_name: str = "") -> bytes: def get_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() if not file_name: - file_name = options["smw_options"]["rom_file"] + from settings import get_settings + file_name = get_settings()["smw_options"]["rom_file"] if not os.path.exists(file_name): file_name = Utils.user_path(file_name) return file_name diff --git a/worlds/smz3/Rom.py b/worlds/smz3/Rom.py index d66d923979..4c66b0d450 100644 --- a/worlds/smz3/Rom.py +++ b/worlds/smz3/Rom.py @@ -1,6 +1,7 @@ import hashlib import os +import settings import Utils from Utils import read_snes_rom from worlds.Files import APProcedurePatch, APPatchExtension, APTokenMixin, APTokenTypes @@ -65,7 +66,7 @@ def get_base_rom_bytes() -> bytes: def get_sm_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() + options: settings.Settings = settings.get_settings() if not file_name: file_name = options["sm_options"]["rom_file"] if not os.path.exists(file_name): @@ -74,7 +75,7 @@ def get_sm_base_rom_path(file_name: str = "") -> str: def get_lttp_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() + options: settings.Settings = settings.get_settings() if not file_name: file_name = options["lttp_options"]["rom_file"] if not os.path.exists(file_name): diff --git a/worlds/smz3/TotalSMZ3/WorldState.py b/worlds/smz3/TotalSMZ3/WorldState.py index bbffffa107..8b2b56470c 100644 --- a/worlds/smz3/TotalSMZ3/WorldState.py +++ b/worlds/smz3/TotalSMZ3/WorldState.py @@ -1,6 +1,5 @@ from enum import Enum from typing import List -from copy import copy from .Patch import DropPrize from .Region import RewardType @@ -91,7 +90,11 @@ class WorldState: self.Green = 1 if (distribution is not None): - self = copy(distribution) + self.Boss = distribution.Boss + self.Blue = distribution.Blue + self.Red = distribution.Red + self.Pend = distribution.Pend + self.Green = distribution.Green if (boss is not None): self.Boss = boss if (blue is not None): @@ -111,11 +114,11 @@ class WorldState: p -= self.Boss if (p < 0): return (RewardType.AnyBossToken, WorldState.Distribution(self, boss = self.Boss - WorldState.Distribution.factor)) p -= self.Blue - if (p - self.Blue < 0): return (RewardType.CrystalBlue, WorldState.Distribution(self, blue = self.Blue - WorldState.Distribution.factor)) + if (p < 0): return (RewardType.CrystalBlue, WorldState.Distribution(self, blue = self.Blue - WorldState.Distribution.factor)) p -= self.Red - if (p - self.Red < 0): return (RewardType.CrystalRed, WorldState.Distribution(self, red = self.Red - WorldState.Distribution.factor)) + if (p < 0): return (RewardType.CrystalRed, WorldState.Distribution(self, red = self.Red - WorldState.Distribution.factor)) p -= self.Pend - if (p - self.Pend < 0): return (RewardType.PendantNonGreen, WorldState.Distribution(self, pend = self.Pend - 1)) + if (p < 0): return (RewardType.PendantNonGreen, WorldState.Distribution(self, pend = self.Pend - 1)) return (RewardType.PendantGreen, WorldState.Distribution(self, green = self.Green - 1)) def Generate(self, func): diff --git a/worlds/smz3/__init__.py b/worlds/smz3/__init__.py index dca105b162..4d0b63f33c 100644 --- a/worlds/smz3/__init__.py +++ b/worlds/smz3/__init__.py @@ -97,7 +97,6 @@ class SMZ3World(World): ItemType.TwentyRupees, ItemType.FiftyRupees, ItemType.ThreeHundredRupees, - ItemType.ETank, ItemType.Missile, ItemType.Super, ItemType.PowerBomb @@ -231,7 +230,6 @@ class SMZ3World(World): niceItems = TotalSMZ3Item.Item.CreateNicePool(self.smz3World) junkItems = TotalSMZ3Item.Item.CreateJunkPool(self.smz3World) - self.junkItemsNames = [item.Type.name for item in junkItems] if (self.smz3World.Config.Keysanity): progressionItems = self.progression + self.dungeon + self.keyCardsItems + self.SmMapsItems @@ -500,7 +498,14 @@ class SMZ3World(World): multidata["connect_names"][new_name] = payload def fill_slot_data(self): - slot_data = {} + slot_data = { + "goal": self.options.goal.value, + "open_tower": self.options.open_tower.value, + "ganon_vulnerable": self.options.ganon_vulnerable.value, + "open_tourian": self.options.open_tourian.value, + "sm_logic": self.options.sm_logic.value, + "key_shuffle": self.options.key_shuffle.value, + } return slot_data def collect(self, state: CollectionState, item: Item) -> bool: diff --git a/worlds/soe/docs/multiworld_en.md b/worlds/soe/docs/multiworld_en.md index a2944d4c01..9378626df4 100644 --- a/worlds/soe/docs/multiworld_en.md +++ b/worlds/soe/docs/multiworld_en.md @@ -130,9 +130,7 @@ page: [usb2snes Supported Platforms Page](http://usb2snes.com/#supported-platfor ### Open the client -Open ap-soeclient ([Evermizer Archipelago Client Page](http://evermizer.com/apclient)) in a modern browser. Do not -switch tabs, open it in a new window if you want to use the browser while playing. Do not minimize the window with the -client. +Open ap-soeclient ([Evermizer Archipelago Client Page](http://evermizer.com/apclient)) in a modern browser. The client should automatically connect to SNI, the "SNES" status should change to green. diff --git a/worlds/stardew_valley/__init__.py b/worlds/stardew_valley/__init__.py index 9a05c04d51..ec96a9949e 100644 --- a/worlds/stardew_valley/__init__.py +++ b/worlds/stardew_valley/__init__.py @@ -1,9 +1,10 @@ import logging import typing from random import Random -from typing import Dict, Any, Iterable, Optional, List, TextIO +from typing import Dict, Any, Optional, List, TextIO -from BaseClasses import Region, Entrance, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState +import entrance_rando +from BaseClasses import Region, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState from Options import PerGameCommonOptions from worlds.AutoWorld import World, WebWorld from .bundles.bundle_room import BundleRoom @@ -21,7 +22,7 @@ from .options.forced_options import force_change_options_if_incompatible from .options.option_groups import sv_option_groups from .options.presets import sv_options_presets from .options.worlds_group import apply_most_restrictive_options -from .regions import create_regions +from .regions import create_regions, prepare_mod_data from .rules import set_rules from .stardew_rule import True_, StardewRule, HasProgressionPercent from .strings.ap_names.event_names import Event @@ -49,15 +50,25 @@ class StardewWebWorld(WebWorld): options_presets = sv_options_presets option_groups = sv_option_groups - tutorials = [ - Tutorial( - "Multiworld Setup Guide", - "A guide to playing Stardew Valley with Archipelago.", - "English", - "setup_en.md", - "setup/en", - ["KaitoKid", "Jouramie", "Witchybun (Mod Support)", "Exempt-Medic (Proofreading)"] - )] + setup_en = Tutorial( + "Multiworld Setup Guide", + "A guide to playing Stardew Valley with Archipelago.", + "English", + "setup_en.md", + "setup/en", + ["KaitoKid", "Jouramie", "Witchybun (Mod Support)", "Exempt-Medic (Proofreading)"] + ) + + setup_fr = Tutorial( + "Guide de configuration MultiWorld", + "Un guide pour configurer Stardew Valley sur Archipelago", + "Français", + "setup_fr.md", + "setup/fr", + ["Eindall"] + ) + + tutorials = [setup_en, setup_fr] class StardewValleyWorld(World): @@ -124,18 +135,13 @@ class StardewValleyWorld(World): self.content = create_content(self.options) def create_regions(self): - def create_region(name: str, exits: Iterable[str]) -> Region: - region = Region(name, self.player, self.multiworld) - region.exits = [Entrance(self.player, exit_name, region) for exit_name in exits] - return region + def create_region(name: str) -> Region: + return Region(name, self.player, self.multiworld) - world_regions, world_entrances, self.randomized_entrances = create_regions(create_region, self.random, self.options, self.content) + world_regions = create_regions(create_region, self.options, self.content) self.logic = StardewLogic(self.player, self.options, self.content, world_regions.keys()) - self.modified_bundles = get_all_bundles(self.random, - self.logic, - self.content, - self.options) + self.modified_bundles = get_all_bundles(self.random, self.logic, self.content, self.options) def add_location(name: str, code: Optional[int], region: str): region: Region = world_regions[region] @@ -308,6 +314,11 @@ class StardewValleyWorld(World): def set_rules(self): set_rules(self) + def connect_entrances(self) -> None: + no_target_groups = {0: [0]} + placement = entrance_rando.randomize_entrances(self, coupled=True, target_group_lookup=no_target_groups) + self.randomized_entrances = prepare_mod_data(placement) + def generate_basic(self): pass diff --git a/worlds/stardew_valley/content/mods/sve.py b/worlds/stardew_valley/content/mods/sve.py index 12b3e3558a..3784723737 100644 --- a/worlds/stardew_valley/content/mods/sve.py +++ b/worlds/stardew_valley/content/mods/sve.py @@ -24,6 +24,9 @@ from ...strings.skill_names import Skill from ...strings.tool_names import Tool, ToolMaterial from ...strings.villager_names import ModNPC +# Used to adapt content not yet moved to content packs to easily detect when SVE and Ginger Island are both enabled. +SVE_GINGER_ISLAND_PACK = ModNames.sve + "+" + ginger_island_content_pack.name + class SVEContentPack(ContentPack): @@ -67,6 +70,10 @@ class SVEContentPack(ContentPack): content.game_items.pop(SVESeed.slime) content.game_items.pop(SVEFruit.slime_berry) + def finalize_hook(self, content: StardewContent): + if ginger_island_content_pack.name in content.registered_packs: + content.registered_packs.add(SVE_GINGER_ISLAND_PACK) + register_mod_content_pack(SVEContentPack( ModNames.sve, @@ -80,8 +87,9 @@ register_mod_content_pack(SVEContentPack( ModEdible.lightning_elixir: (ShopSource(money_price=12000, shop_region=SVERegion.galmoran_outpost),), ModEdible.barbarian_elixir: (ShopSource(money_price=22000, shop_region=SVERegion.galmoran_outpost),), ModEdible.gravity_elixir: (ShopSource(money_price=4000, shop_region=SVERegion.galmoran_outpost),), - SVEMeal.grampleton_orange_chicken: ( - ShopSource(money_price=650, shop_region=Region.saloon, other_requirements=(RelationshipRequirement(ModNPC.sophia, 6),)),), + SVEMeal.grampleton_orange_chicken: (ShopSource(money_price=650, + shop_region=Region.saloon, + other_requirements=(RelationshipRequirement(ModNPC.sophia, 6),)),), ModEdible.hero_elixir: (ShopSource(money_price=8000, shop_region=SVERegion.isaac_shop),), ModEdible.aegis_elixir: (ShopSource(money_price=28000, shop_region=SVERegion.galmoran_outpost),), SVEBeverage.sports_drink: (ShopSource(money_price=750, shop_region=Region.hospital),), @@ -118,8 +126,8 @@ register_mod_content_pack(SVEContentPack( ModLoot.green_mushroom: (ForagingSource(regions=(SVERegion.highlands_pond,), seasons=Season.not_winter),), ModLoot.ornate_treasure_chest: (ForagingSource(regions=(SVERegion.highlands_outside,), - other_requirements=( - CombatRequirement(Performance.galaxy), ToolRequirement(Tool.axe, ToolMaterial.iron))),), + other_requirements=(CombatRequirement(Performance.galaxy), + ToolRequirement(Tool.axe, ToolMaterial.iron))),), ModLoot.swirl_stone: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.galaxy),)),), ModLoot.void_soul: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.good),)),), SVEForage.winter_star_rose: (ForagingSource(regions=(SVERegion.summit,), seasons=(Season.winter,)),), @@ -139,8 +147,9 @@ register_mod_content_pack(SVEContentPack( SVEForage.thistle: (ForagingSource(regions=(SVERegion.summit,)),), ModLoot.void_pebble: (ForagingSource(regions=(SVERegion.crimson_badlands,), other_requirements=(CombatRequirement(Performance.great),)),), ModLoot.void_shard: (ForagingSource(regions=(SVERegion.crimson_badlands,), - other_requirements=( - CombatRequirement(Performance.galaxy), SkillRequirement(Skill.combat, 10), YearRequirement(3),)),), + other_requirements=(CombatRequirement(Performance.galaxy), + SkillRequirement(Skill.combat, 10), + YearRequirement(3),)),), SVEWaterItem.dulse_seaweed: (ForagingSource(regions=(Region.beach,), other_requirements=(FishingRequirement(Region.beach),)),), # Fable Reef @@ -207,7 +216,6 @@ register_mod_content_pack(SVEContentPack( villagers_data.scarlett, villagers_data.susan, villagers_data.morris, - # The wizard leaves his tower on sunday, for like 1 hour... Good enough for entrance rando! - override(villagers_data.wizard, locations=(Region.wizard_tower, Region.forest), bachelor=True, mod_name=ModNames.sve), + override(villagers_data.wizard, bachelor=True, mod_name=ModNames.sve), ) )) diff --git a/worlds/stardew_valley/content/vanilla/pelican_town.py b/worlds/stardew_valley/content/vanilla/pelican_town.py index aeae4c1431..d1d024b54c 100644 --- a/worlds/stardew_valley/content/vanilla/pelican_town.py +++ b/worlds/stardew_valley/content/vanilla/pelican_town.py @@ -3,7 +3,7 @@ from ...data import villagers_data, fish_data from ...data.building import Building from ...data.game_item import GenericSource, ItemTag, Tag, CustomRuleSource from ...data.harvest import ForagingSource, SeasonalForagingSource, ArtifactSpotSource -from ...data.requirement import ToolRequirement, BookRequirement, SkillRequirement +from ...data.requirement import ToolRequirement, BookRequirement, SkillRequirement, YearRequirement from ...data.shop import ShopSource, MysteryBoxSource, ArtifactTroveSource, PrizeMachineSource, FishingTreasureChestSource from ...strings.artisan_good_names import ArtisanGood from ...strings.book_names import Book @@ -209,7 +209,7 @@ pelican_town = ContentPack( # Books Book.animal_catalogue: ( Tag(ItemTag.BOOK, ItemTag.BOOK_POWER), - ShopSource(money_price=5000, shop_region=Region.ranch),), + ShopSource(money_price=5000, shop_region=Region.ranch, other_requirements=(YearRequirement(2),)),), Book.book_of_mysteries: ( Tag(ItemTag.BOOK, ItemTag.BOOK_POWER), MysteryBoxSource(amount=38),), # After 38 boxes, there are 49.99% chances player received the book. diff --git a/worlds/stardew_valley/data/bundle_data.py b/worlds/stardew_valley/data/bundle_data.py index 3a5523ecdd..3f289d33cd 100644 --- a/worlds/stardew_valley/data/bundle_data.py +++ b/worlds/stardew_valley/data/bundle_data.py @@ -271,11 +271,11 @@ solar_essence = BundleItem(Loot.solar_essence) void_essence = BundleItem(Loot.void_essence) petrified_slime = BundleItem(Mineral.petrified_slime) -blue_slime_egg = BundleItem(Loot.blue_slime_egg) -red_slime_egg = BundleItem(Loot.red_slime_egg) -purple_slime_egg = BundleItem(Loot.purple_slime_egg) -green_slime_egg = BundleItem(Loot.green_slime_egg) -tiger_slime_egg = BundleItem(Loot.tiger_slime_egg, source=BundleItem.Sources.island) +blue_slime_egg = BundleItem(AnimalProduct.slime_egg_blue) +red_slime_egg = BundleItem(AnimalProduct.slime_egg_red) +purple_slime_egg = BundleItem(AnimalProduct.slime_egg_purple) +green_slime_egg = BundleItem(AnimalProduct.slime_egg_green) +tiger_slime_egg = BundleItem(AnimalProduct.slime_egg_tiger, source=BundleItem.Sources.island) cherry_bomb = BundleItem(Bomb.cherry_bomb, 5) bomb = BundleItem(Bomb.bomb, 2) diff --git a/worlds/stardew_valley/data/craftable_data.py b/worlds/stardew_valley/data/craftable_data.py index de371b7c3a..3dae67c260 100644 --- a/worlds/stardew_valley/data/craftable_data.py +++ b/worlds/stardew_valley/data/craftable_data.py @@ -305,7 +305,7 @@ hopper = ap_recipe(Craftable.hopper, {Material.hardwood: 10, MetalBar.iridium: 1 cookout_kit = skill_recipe(Craftable.cookout_kit, Skill.foraging, 3, {Material.wood: 15, Material.fiber: 10, Material.coal: 3}) tent_kit = skill_recipe(Craftable.tent_kit, Skill.foraging, 8, {Material.hardwood: 10, Material.fiber: 25, ArtisanGood.cloth: 1}) -statue_of_blessings = mastery_recipe(Statue.blessings, Skill.farming, {Material.sap: 999, Material.fiber: 999, Material.stone: 999}) +statue_of_blessings = mastery_recipe(Statue.blessings, Skill.farming, {Material.sap: 999, Material.fiber: 999, Material.stone: 999, Material.moss: 333}) statue_of_dwarf_king = mastery_recipe(Statue.dwarf_king, Skill.mining, {MetalBar.iridium: 20}) heavy_furnace = mastery_recipe(Machine.heavy_furnace, Skill.mining, {Machine.furnace: 2, MetalBar.iron: 3, Material.stone: 50}) mystic_tree_seed = mastery_recipe(TreeSeed.mystic, Skill.foraging, {TreeSeed.acorn: 5, TreeSeed.maple: 5, TreeSeed.pine: 5, TreeSeed.mahogany: 5}) @@ -386,7 +386,7 @@ coppper_slot_machine = skill_recipe(ModMachine.copper_slot_machine, ModSkill.luc Forageable.salmonberry: 1, Material.clay: 1, Trash.joja_cola: 1}, ModNames.luck_skill) gold_slot_machine = skill_recipe(ModMachine.gold_slot_machine, ModSkill.luck, 4, {MetalBar.gold: 15, ModMachine.copper_slot_machine: 1}, ModNames.luck_skill) -iridium_slot_machine = skill_recipe(ModMachine.iridium_slot_machine, ModSkill.luck, 4, {MetalBar.iridium: 15, ModMachine.gold_slot_machine: 1}, ModNames.luck_skill) -radioactive_slot_machine = skill_recipe(ModMachine.radioactive_slot_machine, ModSkill.luck, 4, {MetalBar.radioactive: 15, ModMachine.iridium_slot_machine: 1}, ModNames.luck_skill) +iridium_slot_machine = skill_recipe(ModMachine.iridium_slot_machine, ModSkill.luck, 6, {MetalBar.iridium: 15, ModMachine.gold_slot_machine: 1}, ModNames.luck_skill) +radioactive_slot_machine = skill_recipe(ModMachine.radioactive_slot_machine, ModSkill.luck, 8, {MetalBar.radioactive: 15, ModMachine.iridium_slot_machine: 1}, ModNames.luck_skill) all_crafting_recipes_by_name = {recipe.item: recipe for recipe in all_crafting_recipes} diff --git a/worlds/stardew_valley/data/items.csv b/worlds/stardew_valley/data/items.csv index 11a22e952d..f7dac9c579 100644 --- a/worlds/stardew_valley/data/items.csv +++ b/worlds/stardew_valley/data/items.csv @@ -6,7 +6,7 @@ id,name,classification,groups,mod_name 18,Greenhouse,progression,COMMUNITY_REWARD, 19,Glittering Boulder Removed,progression,COMMUNITY_REWARD, 20,Minecarts Repair,useful,COMMUNITY_REWARD, -21,Bus Repair,progression,COMMUNITY_REWARD, +21,Bus Repair,progression,"COMMUNITY_REWARD,DESERT_TRANSPORTATION", 22,Progressive Movie Theater,"progression,trap",COMMUNITY_REWARD, 23,Stardrop,progression,, 24,Progressive Backpack,progression,, @@ -63,8 +63,8 @@ id,name,classification,groups,mod_name 77,Combat Level,progression,SKILL_LEVEL_UP, 78,Earth Obelisk,progression,WIZARD_BUILDING, 79,Water Obelisk,progression,WIZARD_BUILDING, -80,Desert Obelisk,progression,WIZARD_BUILDING, -81,Island Obelisk,progression,"WIZARD_BUILDING,GINGER_ISLAND", +80,Desert Obelisk,progression,"WIZARD_BUILDING,DESERT_TRANSPORTATION", +81,Island Obelisk,progression,"WIZARD_BUILDING,GINGER_ISLAND,ISLAND_TRANSPORTATION", 82,Junimo Hut,useful,WIZARD_BUILDING, 83,Gold Clock,progression,WIZARD_BUILDING, 84,Progressive Coop,progression,BUILDING, @@ -242,7 +242,7 @@ id,name,classification,groups,mod_name 257,Peach Sapling,progression,"RESOURCE_PACK,RESOURCE_PACK_USEFUL,CROPSANITY", 258,Banana Sapling,progression,"GINGER_ISLAND,RESOURCE_PACK,RESOURCE_PACK_USEFUL,CROPSANITY", 259,Mango Sapling,progression,"GINGER_ISLAND,RESOURCE_PACK,RESOURCE_PACK_USEFUL,CROPSANITY", -260,Boat Repair,progression,GINGER_ISLAND, +260,Boat Repair,progression,"GINGER_ISLAND,ISLAND_TRANSPORTATION", 261,Open Professor Snail Cave,progression,GINGER_ISLAND, 262,Island North Turtle,progression,"GINGER_ISLAND,WALNUT_PURCHASE", 263,Island West Turtle,progression,"GINGER_ISLAND,WALNUT_PURCHASE", diff --git a/worlds/stardew_valley/data/locations.csv b/worlds/stardew_valley/data/locations.csv index 66a9157b34..14554a3bcd 100644 --- a/worlds/stardew_valley/data/locations.csv +++ b/worlds/stardew_valley/data/locations.csv @@ -1129,8 +1129,8 @@ id,region,name,tags,mod_name 2204,Leo's Hut,Leo's Parrot,"GINGER_ISLAND,WALNUT_PURCHASE", 2205,Island South,Island West Turtle,"GINGER_ISLAND,WALNUT_PURCHASE", 2206,Island West,Island Farmhouse,"GINGER_ISLAND,WALNUT_PURCHASE", -2207,Island Farmhouse,Island Mailbox,"GINGER_ISLAND,WALNUT_PURCHASE", -2208,Island Farmhouse,Farm Obelisk,"GINGER_ISLAND,WALNUT_PURCHASE", +2207,Island West,Island Mailbox,"GINGER_ISLAND,WALNUT_PURCHASE", +2208,Island West,Farm Obelisk,"GINGER_ISLAND,WALNUT_PURCHASE", 2209,Island North,Dig Site Bridge,"GINGER_ISLAND,WALNUT_PURCHASE", 2210,Island North,Island Trader,"GINGER_ISLAND,WALNUT_PURCHASE", 2211,Volcano Entrance,Volcano Bridge,"GINGER_ISLAND,WALNUT_PURCHASE", @@ -2316,100 +2316,100 @@ id,region,name,tags,mod_name 4069,Museum,Read Note From Gunther,"BOOKSANITY,BOOKSANITY_LOST", 4070,Museum,Read Goblins by M. Jasper,"BOOKSANITY,BOOKSANITY_LOST", 4071,Museum,Read Secret Statues Acrostics,"BOOKSANITY,BOOKSANITY_LOST", -4101,Clint's Blacksmith,Open Golden Coconut,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4102,Island West,Fishing Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4103,Island West,Fishing Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4104,Island North,Fishing Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4105,Island North,Fishing Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4106,Island Southeast,Fishing Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4107,Island East,Jungle Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4108,Island East,Banana Altar,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4109,Leo's Hut,Leo's Tree,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4110,Island Shrine,Gem Birds Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4111,Island Shrine,Gem Birds Shrine,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4112,Island West,Harvesting Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4113,Island West,Harvesting Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4114,Island West,Harvesting Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4115,Island West,Harvesting Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4116,Island West,Harvesting Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4117,Gourmand Frog Cave,Gourmand Frog Melon,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4118,Gourmand Frog Cave,Gourmand Frog Wheat,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4119,Gourmand Frog Cave,Gourmand Frog Garlic,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4120,Island West,Journal Scrap #6,"WALNUTSANITY,WALNUTSANITY_DIG", -4121,Island West,Mussel Node Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4122,Island West,Mussel Node Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4123,Island West,Mussel Node Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4124,Island West,Mussel Node Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4125,Island West,Mussel Node Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4126,Shipwreck,Shipwreck Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4127,Island West,Whack A Mole,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4128,Island West,Starfish Triangle,"WALNUTSANITY,WALNUTSANITY_DIG", -4129,Island West,Starfish Diamond,"WALNUTSANITY,WALNUTSANITY_DIG", -4130,Island West,X in the sand,"WALNUTSANITY,WALNUTSANITY_DIG", -4131,Island West,Diamond Of Indents,"WALNUTSANITY,WALNUTSANITY_DIG", -4132,Island West,Bush Behind Coconut Tree,"WALNUTSANITY,WALNUTSANITY_BUSH", -4133,Island West,Journal Scrap #4,"WALNUTSANITY,WALNUTSANITY_DIG", -4134,Island West,Walnut Room Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4135,Island West,Coast Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4136,Island West,Tiger Slime Walnut,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4137,Island West,Bush Behind Mahogany Tree,"WALNUTSANITY,WALNUTSANITY_BUSH", -4138,Island West,Circle Of Grass,"WALNUTSANITY,WALNUTSANITY_DIG", -4139,Island West,Below Colored Crystals Cave Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4140,Colored Crystals Cave,Colored Crystals,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4141,Island West,Cliff Edge Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4142,Island West,Diamond Of Pebbles,"WALNUTSANITY,WALNUTSANITY_DIG", -4143,Island West,Farm Parrot Express Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4144,Island West,Farmhouse Cliff Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4145,Island North,Big Circle Of Stones,"WALNUTSANITY,WALNUTSANITY_DIG", -4146,Island North,Grove Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4147,Island North,Diamond Of Grass,"WALNUTSANITY,WALNUTSANITY_DIG", -4148,Island North,Small Circle Of Stones,"WALNUTSANITY,WALNUTSANITY_DIG", -4149,Island North,Patch Of Sand,"WALNUTSANITY,WALNUTSANITY_DIG", -4150,Dig Site,Crooked Circle Of Stones,"WALNUTSANITY,WALNUTSANITY_DIG", -4151,Dig Site,Above Dig Site Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4152,Dig Site,Above Field Office Bush 1,"WALNUTSANITY,WALNUTSANITY_BUSH", -4153,Dig Site,Above Field Office Bush 2,"WALNUTSANITY,WALNUTSANITY_BUSH", -4154,Field Office,Complete Large Animal Collection,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4155,Field Office,Complete Snake Collection,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4156,Field Office,Complete Mummified Frog Collection,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4157,Field Office,Complete Mummified Bat Collection,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4158,Field Office,Purple Flowers Island Survey,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4159,Field Office,Purple Starfish Island Survey,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4160,Island North,Bush Behind Volcano Tree,"WALNUTSANITY,WALNUTSANITY_BUSH", -4161,Island North,Arc Of Stones,"WALNUTSANITY,WALNUTSANITY_DIG", -4162,Island North,Protruding Tree Walnut,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4163,Island North,Journal Scrap #10,"WALNUTSANITY,WALNUTSANITY_DIG", -4164,Island North,Northmost Point Circle Of Stones,"WALNUTSANITY,WALNUTSANITY_DIG", -4165,Island North,Hidden Passage Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4166,Volcano Secret Beach,Secret Beach Bush 1,"WALNUTSANITY,WALNUTSANITY_BUSH", -4167,Volcano Secret Beach,Secret Beach Bush 2,"WALNUTSANITY,WALNUTSANITY_BUSH", -4168,Volcano - Floor 5,Volcano Rocks Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4169,Volcano - Floor 5,Volcano Rocks Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4170,Volcano - Floor 10,Volcano Rocks Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4171,Volcano - Floor 10,Volcano Rocks Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4172,Volcano - Floor 10,Volcano Rocks Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4173,Volcano - Floor 5,Volcano Monsters Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4174,Volcano - Floor 5,Volcano Monsters Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4175,Volcano - Floor 10,Volcano Monsters Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4176,Volcano - Floor 10,Volcano Monsters Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4177,Volcano - Floor 10,Volcano Monsters Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4178,Volcano - Floor 5,Volcano Crates Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4179,Volcano - Floor 5,Volcano Crates Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4180,Volcano - Floor 10,Volcano Crates Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4181,Volcano - Floor 10,Volcano Crates Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4182,Volcano - Floor 10,Volcano Crates Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4183,Volcano - Floor 5,Volcano Common Chest Walnut,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4184,Volcano - Floor 10,Volcano Rare Chest Walnut,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", -4185,Volcano - Floor 10,Forge Entrance Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4186,Volcano - Floor 10,Forge Exit Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4187,Island North,Cliff Over Island South Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", -4188,Island Southeast,Starfish Tide Pool,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4189,Island Southeast,Diamond Of Yellow Starfish,"WALNUTSANITY,WALNUTSANITY_DIG", -4190,Island Southeast,Mermaid Song,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4191,Pirate Cove,Pirate Darts 1,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4192,Pirate Cove,Pirate Darts 2,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4193,Pirate Cove,Pirate Darts 3,"WALNUTSANITY,WALNUTSANITY_PUZZLE", -4194,Pirate Cove,Pirate Cove Patch Of Sand,"WALNUTSANITY,WALNUTSANITY_DIG", +4101,Clint's Blacksmith,Walnutsanity: Open Golden Coconut,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4102,Island West,Walnutsanity: Fishing Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4103,Island West,Walnutsanity: Fishing Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4104,Island North,Walnutsanity: Fishing Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4105,Island North,Walnutsanity: Fishing Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4106,Island Southeast,Walnutsanity: Fishing Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4107,Island East,Walnutsanity: Jungle Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4108,Island East,Walnutsanity: Banana Altar,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4109,Leo's Hut,Walnutsanity: Leo's Tree,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4110,Island Shrine,Walnutsanity: Gem Birds Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4111,Island Shrine,Walnutsanity: Gem Birds Shrine,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4112,Island West,Walnutsanity: Harvesting Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4113,Island West,Walnutsanity: Harvesting Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4114,Island West,Walnutsanity: Harvesting Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4115,Island West,Walnutsanity: Harvesting Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4116,Island West,Walnutsanity: Harvesting Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4117,Gourmand Frog Cave,Walnutsanity: Gourmand Frog Melon,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4118,Gourmand Frog Cave,Walnutsanity: Gourmand Frog Wheat,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4119,Gourmand Frog Cave,Walnutsanity: Gourmand Frog Garlic,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4120,Island West,Walnutsanity: Journal Scrap #6,"WALNUTSANITY,WALNUTSANITY_DIG", +4121,Island West,Walnutsanity: Mussel Node Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4122,Island West,Walnutsanity: Mussel Node Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4123,Island West,Walnutsanity: Mussel Node Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4124,Island West,Walnutsanity: Mussel Node Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4125,Island West,Walnutsanity: Mussel Node Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4126,Shipwreck,Walnutsanity: Shipwreck Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4127,Island West,Walnutsanity: Whack A Mole,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4128,Island West,Walnutsanity: Starfish Triangle,"WALNUTSANITY,WALNUTSANITY_DIG", +4129,Island West,Walnutsanity: Starfish Diamond,"WALNUTSANITY,WALNUTSANITY_DIG", +4130,Island West,Walnutsanity: X in the sand,"WALNUTSANITY,WALNUTSANITY_DIG", +4131,Island West,Walnutsanity: Diamond Of Indents,"WALNUTSANITY,WALNUTSANITY_DIG", +4132,Island West,Walnutsanity: Bush Behind Coconut Tree,"WALNUTSANITY,WALNUTSANITY_BUSH", +4133,Island West,Walnutsanity: Journal Scrap #4,"WALNUTSANITY,WALNUTSANITY_DIG", +4134,Island West,Walnutsanity: Walnut Room Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4135,Island West,Walnutsanity: Coast Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4136,Island West,Walnutsanity: Tiger Slime Walnut,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4137,Island West,Walnutsanity: Bush Behind Mahogany Tree,"WALNUTSANITY,WALNUTSANITY_BUSH", +4138,Island West,Walnutsanity: Circle Of Grass,"WALNUTSANITY,WALNUTSANITY_DIG", +4139,Island West,Walnutsanity: Below Colored Crystals Cave Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4140,Colored Crystals Cave,Walnutsanity: Colored Crystals,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4141,Island West,Walnutsanity: Cliff Edge Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4142,Island West,Walnutsanity: Diamond Of Pebbles,"WALNUTSANITY,WALNUTSANITY_DIG", +4143,Island West,Walnutsanity: Farm Parrot Express Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4144,Island West,Walnutsanity: Farmhouse Cliff Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4145,Island North,Walnutsanity: Big Circle Of Stones,"WALNUTSANITY,WALNUTSANITY_DIG", +4146,Island North,Walnutsanity: Grove Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4147,Island North,Walnutsanity: Diamond Of Grass,"WALNUTSANITY,WALNUTSANITY_DIG", +4148,Island North,Walnutsanity: Small Circle Of Stones,"WALNUTSANITY,WALNUTSANITY_DIG", +4149,Island North,Walnutsanity: Patch Of Sand,"WALNUTSANITY,WALNUTSANITY_DIG", +4150,Dig Site,Walnutsanity: Crooked Circle Of Stones,"WALNUTSANITY,WALNUTSANITY_DIG", +4151,Dig Site,Walnutsanity: Above Dig Site Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4152,Dig Site,Walnutsanity: Above Field Office Bush 1,"WALNUTSANITY,WALNUTSANITY_BUSH", +4153,Dig Site,Walnutsanity: Above Field Office Bush 2,"WALNUTSANITY,WALNUTSANITY_BUSH", +4154,Field Office,Walnutsanity: Complete Large Animal Collection,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4155,Field Office,Walnutsanity: Complete Snake Collection,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4156,Field Office,Walnutsanity: Complete Mummified Frog Collection,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4157,Field Office,Walnutsanity: Complete Mummified Bat Collection,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4158,Field Office,Walnutsanity: Purple Flowers Island Survey,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4159,Field Office,Walnutsanity: Purple Starfish Island Survey,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4160,Island North,Walnutsanity: Bush Behind Volcano Tree,"WALNUTSANITY,WALNUTSANITY_BUSH", +4161,Island North,Walnutsanity: Arc Of Stones,"WALNUTSANITY,WALNUTSANITY_DIG", +4162,Island North,Walnutsanity: Protruding Tree Walnut,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4163,Island North,Walnutsanity: Journal Scrap #10,"WALNUTSANITY,WALNUTSANITY_DIG", +4164,Island North,Walnutsanity: Northmost Point Circle Of Stones,"WALNUTSANITY,WALNUTSANITY_DIG", +4165,Island North,Walnutsanity: Hidden Passage Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4166,Volcano Secret Beach,Walnutsanity: Secret Beach Bush 1,"WALNUTSANITY,WALNUTSANITY_BUSH", +4167,Volcano Secret Beach,Walnutsanity: Secret Beach Bush 2,"WALNUTSANITY,WALNUTSANITY_BUSH", +4168,Volcano - Floor 5,Walnutsanity: Volcano Rocks Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4169,Volcano - Floor 5,Walnutsanity: Volcano Rocks Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4170,Volcano - Floor 10,Walnutsanity: Volcano Rocks Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4171,Volcano - Floor 10,Walnutsanity: Volcano Rocks Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4172,Volcano - Floor 10,Walnutsanity: Volcano Rocks Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4173,Volcano - Floor 5,Walnutsanity: Volcano Monsters Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4174,Volcano - Floor 5,Walnutsanity: Volcano Monsters Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4175,Volcano - Floor 10,Walnutsanity: Volcano Monsters Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4176,Volcano - Floor 10,Walnutsanity: Volcano Monsters Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4177,Volcano - Floor 10,Walnutsanity: Volcano Monsters Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4178,Volcano - Floor 5,Walnutsanity: Volcano Crates Walnut 1,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4179,Volcano - Floor 5,Walnutsanity: Volcano Crates Walnut 2,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4180,Volcano - Floor 10,Walnutsanity: Volcano Crates Walnut 3,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4181,Volcano - Floor 10,Walnutsanity: Volcano Crates Walnut 4,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4182,Volcano - Floor 10,Walnutsanity: Volcano Crates Walnut 5,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4183,Volcano - Floor 5,Walnutsanity: Volcano Common Chest Walnut,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4184,Volcano - Floor 10,Walnutsanity: Volcano Rare Chest Walnut,"WALNUTSANITY,WALNUTSANITY_REPEATABLE", +4185,Volcano - Floor 10,Walnutsanity: Forge Entrance Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4186,Volcano - Floor 10,Walnutsanity: Forge Exit Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4187,Island North,Walnutsanity: Cliff Over Island South Bush,"WALNUTSANITY,WALNUTSANITY_BUSH", +4188,Island Southeast,Walnutsanity: Starfish Tide Pool,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4189,Island Southeast,Walnutsanity: Diamond Of Yellow Starfish,"WALNUTSANITY,WALNUTSANITY_DIG", +4190,Island Southeast,Walnutsanity: Mermaid Song,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4191,Pirate Cove,Walnutsanity: Pirate Darts 1,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4192,Pirate Cove,Walnutsanity: Pirate Darts 2,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4193,Pirate Cove,Walnutsanity: Pirate Darts 3,"WALNUTSANITY,WALNUTSANITY_PUZZLE", +4194,Pirate Cove,Walnutsanity: Pirate Cove Patch Of Sand,"WALNUTSANITY,WALNUTSANITY_DIG", 5001,Stardew Valley,Level 1 Luck,"LUCK_LEVEL,SKILL_LEVEL",Luck Skill 5002,Stardew Valley,Level 2 Luck,"LUCK_LEVEL,SKILL_LEVEL",Luck Skill 5003,Stardew Valley,Level 3 Luck,"LUCK_LEVEL,SKILL_LEVEL",Luck Skill diff --git a/worlds/stardew_valley/docs/setup_fr.md b/worlds/stardew_valley/docs/setup_fr.md new file mode 100644 index 0000000000..d7866c0b16 --- /dev/null +++ b/worlds/stardew_valley/docs/setup_fr.md @@ -0,0 +1,87 @@ +# Guide de configuration du Randomizer Stardew Valley + +## Logiciels nécessaires + +- Stardew Valley 1.6 sur PC (Recommandé: [Steam](https://store.steampowered.com/app/413150/Stardew_Valley/)) +- SMAPI ([Mod loader pour Stardew Valley](https://www.nexusmods.com/stardewvalley/mods/2400?tab=files)) +- [StardewArchipelago Version 6.x.x](https://github.com/agilbert1412/StardewArchipelago/releases) + - Il est important d'utiliser une release en 6.x.x pour jouer sur des seeds générées ici. Les versions ultérieures peuvent uniquement être utilisées pour des release ultérieures du générateur de mondes, qui ne sont pas encore hébergées sur archipelago.gg + +## Logiciels optionnels + +- Launcher Archipelago à partir de la [page des versions d'Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) + - (Uniquement pour le client textuel) +- Autres [mods supportés](https://github.com/agilbert1412/StardewArchipelago/blob/6.x.x/Documentation/Supported%20Mods.md) que vous pouvez ajouter au yaml pour les inclure dans la randomization d'Archipelago + + - Il n'est **pas** recommandé de modder Stardew Valley avec des mods non supportés, même s'il est possible de le faire. + Les interactions entre mods peuvent être imprévisibles, et aucune aide ne sera fournie pour les bugs qui y sont liés. + - Plus vous avez de mods non supportés, et plus ils sont gros, plus vous avez de chances de casser des choses. + +## Configuration du fichier YAML + +### Qu'est qu'un fichier YAML et pourquoi en ai-je besoin ? + +Voir le guide pour paramètrer un fichier YAML dans le guide de configuration d'Archipelago (en anglais): [Guide de configuration d'un MultiWorld basique](/tutorial/Archipelago/setup/en) + +### Où puis-je récupèrer un fichier YAML + +Vous pouvez personnaliser vos options en visitant la [Page d'options de joueur pour Stardew Valley](/games/Stardew%20Valley/player-options) + +## Rejoindre une partie en MultiWorld + +### Installation du mod + +- Installer [SMAPI](https://www.nexusmods.com/stardewvalley/mods/2400?tab=files) en suivant les instructions sur la page du mod. +- Télécharger et extraire le mod [StardewArchipelago](https://github.com/agilbert1412/StardewArchipelago/releases) dans le dossier "Mods" de Stardew Valley. +- *Optionnel*: Si vous voulez lancer le jeu depuis Steam, ajouter l'option de lancement suivante à Stardew Valley : `"[PATH TO STARDEW VALLEY]\Stardew Valley\StardewModdingAPI.exe" %command%` +- Sinon, exécutez juste "StardewModdingAPI.exe" dans le dossier d'installation de Stardew Valley. +- Stardew Valley devrait se lancer avec une console qui liste les informations des mods installés, et intéragit avec certains d'entre eux. + +### Se connecter au MultiServer + +Lancer Stardew Valley avec SMAPI. Une fois que vous avez atteint l'écran titre du jeu, créez une nouvelle ferme. + +Dans la fenêtre de création de personnage, vous verrez 3 nouveaux champs, qui permettent de relier votre personnage à un MultiWorld Archipelago. + +![image](https://i.imgur.com/b8KZy2F.png) + +Vous pouvez personnaliser votre personnage comme vous le souhaitez. + +Le champ "Server" nécessite l'adresse **et** le port, et le "Slotname" est le nom que vous avez spécifié dans votre YAML. + +`archipelago.gg:12345` + +`StardewPlayer` + +Le mot de passe est optionnel. + +Votre jeu se connectera automatiquement à Archipelago, et se reconnectera automatiquement également quand vous chargerez votre sauvegarde, plus tard. + +Vous n'aurez plus besoin d'entrer ces informations à nouveau pour ce personnage, à moins que votre session ne change d'ip ou de port. +Si l'ip ou le port de la session **change**, vous pouvez suivre ces instructions pour modifier les informations de connexion liées à votre sauvegarde : + +- Lancer Stardew Valley moddé +- Dans le **menu principal** du jeu, entrer la commande suivante **dans la console de SMAPI** : +- `connect_override ip:port slot password` +- Par exemple : `connect_override archipelago.gg:54321 StardewPlayer` +- Chargez votre partie. Les nouvelles informations de connexion seront utilisées à la place de celles enregistrées initialement. +- Jouez une journée, dormez et sauvegarder la partie. Les nouvelles informations de connexion iront écraser les précédentes, et deviendront permanentes. + +### Intéragir avec le MultiWorld depuis le jeu + +Quand vous vous connectez, vous devriez voir un message dans le chat vous informant de l'existence de la commande `!!help`. Cette commande liste les autres commandes exclusives à Stardew Valley que vous pouvez utiliser. + +De plus, vous pouvez utiliser le chat en jeu pour parler aux autres joueurs du MultiWorld, pour peu qu'ils aient un jeu qui supporte le chat. + +Enfin, vous pouvez également utiliser les commandes Archipelago (`!help` pour les lister) depuis le chat du jeu, permettant de demander des indices (via la commande `!hint`) sur certains objets. + +Il est important de préciser que le chat de Stardew Valley est assez limité. Par exemple, il ne permet pas de remonter l'historique de conversation. La console SMAPI qui tourne à côté aura quant à elle l'historique complet et sera plus pratique pour consulter des messages moins récents. +Pour une meilleure expérience avec le chat, vous pouvez aussi utiliser le client textuel d'Archipelago, bien qu'il ne permettra pas de lancer les commandes exclusives à Stardew Valley. + +### Jouer avec des mods supportés + +Voir la [documentation des mods supportés](https://github.com/agilbert1412/StardewArchipelago/blob/6.x.x/Documentation/Supported%20Mods.md) (en Anglais). + +### Multijoueur + +Vous ne pouvez pas jouer à Stardew Valley en mode multijoueur pour le moment. Il n'y a aucun plan d'action pour ajouter cette fonctionalité à court terme. \ No newline at end of file diff --git a/worlds/stardew_valley/items/item_data.py b/worlds/stardew_valley/items/item_data.py index e7c3779e27..6abc96f4e6 100644 --- a/worlds/stardew_valley/items/item_data.py +++ b/worlds/stardew_valley/items/item_data.py @@ -33,6 +33,8 @@ class Group(enum.Enum): SKILL_MASTERY = enum.auto() BUILDING = enum.auto() WIZARD_BUILDING = enum.auto() + DESERT_TRANSPORTATION = enum.auto() + ISLAND_TRANSPORTATION = enum.auto() ARCADE_MACHINE_BUFFS = enum.auto() BASE_RESOURCE = enum.auto() WARP_TOTEM = enum.auto() diff --git a/worlds/stardew_valley/locations.py b/worlds/stardew_valley/locations.py index 0d621fda49..fa4d50ce79 100644 --- a/worlds/stardew_valley/locations.py +++ b/worlds/stardew_valley/locations.py @@ -279,6 +279,9 @@ def extend_festival_locations(randomized_locations: List[LocationData], options: return festival_locations = locations_by_tag[LocationTags.FESTIVAL] + if not options.museumsanity: + festival_locations = [location for location in festival_locations if location.name not in ("Rarecrow #7 (Tanuki)", "Rarecrow #8 (Tribal Mask)")] + randomized_locations.extend(festival_locations) extend_hard_festival_locations(randomized_locations, options) extend_desert_festival_chef_locations(randomized_locations, options, random) diff --git a/worlds/stardew_valley/logic/fishing_logic.py b/worlds/stardew_valley/logic/fishing_logic.py index c8f9e0a340..544f322057 100644 --- a/worlds/stardew_valley/logic/fishing_logic.py +++ b/worlds/stardew_valley/logic/fishing_logic.py @@ -117,7 +117,7 @@ class FishingLogic(BaseLogic): @cached_property def can_crab_pot_anywhere(self) -> StardewRule: - return self.logic.fishing.can_fish() & self.logic.region.can_reach_any(fishing_regions) + return self.logic.fishing.can_crab_pot & self.logic.region.can_reach_any(fishing_regions) @cache_self1 def can_crab_pot_at(self, region: str) -> StardewRule: @@ -125,12 +125,4 @@ class FishingLogic(BaseLogic): @cached_property def can_crab_pot(self) -> StardewRule: - crab_pot_rule = self.logic.has(Fishing.bait) - - # We can't use the same rule if skills are vanilla, because fishing levels are required to crab pot, which is required to get fishing levels... - if self.content.features.skill_progression.is_progressive: - crab_pot_rule = crab_pot_rule & self.logic.has(Machine.crab_pot) - else: - crab_pot_rule = crab_pot_rule & self.logic.skill.can_get_fishing_xp - - return crab_pot_rule + return self.logic.has(Machine.crab_pot) & self.logic.has(Fishing.bait) diff --git a/worlds/stardew_valley/logic/logic.py b/worlds/stardew_valley/logic/logic.py index 716dd06571..42bfb9cc26 100644 --- a/worlds/stardew_valley/logic/logic.py +++ b/worlds/stardew_valley/logic/logic.py @@ -168,15 +168,16 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin AnimalProduct.squid_ink: self.mine.can_mine_in_the_mines_floor_81_120() | (self.building.has_building(Building.fish_pond) & self.has(Fish.squid)), AnimalProduct.sturgeon_roe: self.has(Fish.sturgeon) & self.building.has_building(Building.fish_pond), AnimalProduct.truffle: self.animal.has_animal(Animal.pig) & self.season.has_any_not_winter(), - AnimalProduct.void_egg: self.has(AnimalProduct.void_egg_starter), # Should also check void chicken if there was an alternative to obtain it without void egg + AnimalProduct.void_egg: self.has(AnimalProduct.void_egg_starter), # Should also check void chicken if there was an alternative to obtain it without void egg AnimalProduct.wool: self.animal.has_animal(Animal.rabbit) | self.animal.has_animal(Animal.sheep), AnimalProduct.slime_egg_green: self.has(Machine.slime_egg_press) & self.has(Loot.slime), AnimalProduct.slime_egg_blue: self.has(Machine.slime_egg_press) & self.has(Loot.slime) & self.time.has_lived_months(3), AnimalProduct.slime_egg_red: self.has(Machine.slime_egg_press) & self.has(Loot.slime) & self.time.has_lived_months(6), AnimalProduct.slime_egg_purple: self.has(Machine.slime_egg_press) & self.has(Loot.slime) & self.time.has_lived_months(9), - AnimalProduct.slime_egg_tiger: self.has(Fish.lionfish) & self.building.has_building(Building.fish_pond), - AnimalProduct.duck_egg_starter: self.logic.false_, # It could be purchased at the Feast of the Winter Star, but it's random every year, so not considering it yet... - AnimalProduct.dinosaur_egg_starter: self.logic.false_, # Dinosaur eggs are also part of the museum rules, and I don't want to touch them yet. + AnimalProduct.slime_egg_tiger: self.can_fish_pond(Fish.lionfish, *(Forageable.ginger, Fruit.pineapple, Fruit.mango)) & self.time.has_lived_months(12) & + self.building.has_building(Building.slime_hutch) & self.monster.can_kill(Monster.tiger_slime), + AnimalProduct.duck_egg_starter: self.logic.false_, # It could be purchased at the Feast of the Winter Star, but it's random every year, so not considering it yet... + AnimalProduct.dinosaur_egg_starter: self.logic.false_, # Dinosaur eggs are also part of the museum rules, and I don't want to touch them yet. AnimalProduct.egg_starter: self.logic.false_, # It could be purchased at the Desert Festival, but festival logic is quite a mess, so not considering it yet... AnimalProduct.golden_egg_starter: self.received(AnimalProduct.golden_egg) & (self.money.can_spend_at(Region.ranch, 100000) | self.money.can_trade_at(Region.qi_walnut_room, Currency.qi_gem, 100)), AnimalProduct.void_egg_starter: self.money.can_spend_at(Region.sewer, 5000) | (self.building.has_building(Building.fish_pond) & self.has(Fish.void_salmon)), @@ -233,7 +234,7 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin Forageable.secret_note: self.quest.has_magnifying_glass() & (self.ability.can_chop_trees() | self.mine.can_mine_in_the_mines_floor_1_40()), # Fossil.bone_fragment: (self.region.can_reach(Region.dig_site) & self.tool.has_tool(Tool.pickaxe)) | self.monster.can_kill(Monster.skeleton), Fossil.fossilized_leg: self.region.can_reach(Region.dig_site) & self.tool.has_tool(Tool.pickaxe), - Fossil.fossilized_ribs: self.region.can_reach(Region.island_south) & self.tool.has_tool(Tool.hoe), + Fossil.fossilized_ribs: self.region.can_reach(Region.island_south) & self.tool.has_tool(Tool.hoe) & self.received("Open Professor Snail Cave"), Fossil.fossilized_skull: self.action.can_open_geode(Geode.golden_coconut), Fossil.fossilized_spine: self.fishing.can_fish_at(Region.dig_site), Fossil.fossilized_tail: self.action.can_pan_at(Region.dig_site, ToolMaterial.copper), @@ -288,9 +289,9 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin MetalBar.quartz: self.can_smelt(Mineral.quartz) | self.can_smelt("Fire Quartz") | (self.has(Machine.recycling_machine) & (self.has(Trash.broken_cd) | self.has(Trash.broken_glasses))), MetalBar.radioactive: self.can_smelt(Ore.radioactive), Ore.copper: self.mine.can_mine_in_the_mines_floor_1_40() | self.mine.can_mine_in_the_skull_cavern() | self.tool.has_tool(Tool.pan, ToolMaterial.copper), - Ore.gold: self.mine.can_mine_in_the_mines_floor_81_120() | self.mine.can_mine_in_the_skull_cavern() | self.tool.has_tool(Tool.pan, ToolMaterial.iron), - Ore.iridium: self.mine.can_mine_in_the_skull_cavern() | self.can_fish_pond(Fish.super_cucumber) | self.tool.has_tool(Tool.pan, ToolMaterial.gold), - Ore.iron: self.mine.can_mine_in_the_mines_floor_41_80() | self.mine.can_mine_in_the_skull_cavern() | self.tool.has_tool(Tool.pan, ToolMaterial.copper), + Ore.gold: self.mine.can_mine_in_the_mines_floor_81_120() | self.mine.can_mine_in_the_skull_cavern() | self.tool.has_tool(Tool.pan, ToolMaterial.gold), + Ore.iridium: self.count(2, *(self.mine.can_mine_in_the_skull_cavern(), self.can_fish_pond(Fish.super_cucumber), self.tool.has_tool(Tool.pan, ToolMaterial.iridium))), + Ore.iron: self.mine.can_mine_in_the_mines_floor_41_80() | self.mine.can_mine_in_the_skull_cavern() | self.tool.has_tool(Tool.pan, ToolMaterial.iron), Ore.radioactive: self.ability.can_mine_perfectly() & self.region.can_reach(Region.qi_walnut_room), RetainingSoil.basic: self.money.can_spend_at(Region.pierre_store, 100), RetainingSoil.quality: self.time.has_year_two & self.money.can_spend_at(Region.pierre_store, 150), @@ -381,5 +382,8 @@ class StardewLogic(ReceivedLogicMixin, HasLogicMixin, RegionLogicMixin, Travelin def can_use_obelisk(self, obelisk: str) -> StardewRule: return self.region.can_reach(Region.farm) & self.received(obelisk) - def can_fish_pond(self, fish: str) -> StardewRule: - return self.building.has_building(Building.fish_pond) & self.has(fish) + def can_fish_pond(self, fish: str, *items: str) -> StardewRule: + rule = self.building.has_building(Building.fish_pond) & self.has(fish) + if items: + rule = rule & self.has_all(*items) + return rule diff --git a/worlds/stardew_valley/logic/museum_logic.py b/worlds/stardew_valley/logic/museum_logic.py index 2237cd89ea..21718db27c 100644 --- a/worlds/stardew_valley/logic/museum_logic.py +++ b/worlds/stardew_valley/logic/museum_logic.py @@ -1,13 +1,5 @@ -from typing import Union - from Utils import cache_self1 -from .action_logic import ActionLogicMixin from .base_logic import BaseLogic, BaseLogicMixin -from .has_logic import HasLogicMixin -from .received_logic import ReceivedLogicMixin -from .region_logic import RegionLogicMixin -from .time_logic import TimeLogicMixin -from .tool_logic import ToolLogicMixin from .. import options from ..data.museum_data import MuseumItem, all_museum_items, all_museum_artifacts, all_museum_minerals from ..stardew_rule import StardewRule, False_ diff --git a/worlds/stardew_valley/logic/quest_logic.py b/worlds/stardew_valley/logic/quest_logic.py index 5bc3f86eae..af52d06e30 100644 --- a/worlds/stardew_valley/logic/quest_logic.py +++ b/worlds/stardew_valley/logic/quest_logic.py @@ -89,7 +89,7 @@ class QuestLogic(BaseLogic): Quest.goblin_problem: self.logic.region.can_reach(Region.witch_swamp) # Void mayo can be fished at 5% chance in the witch swamp while the quest is active. It drops a lot after the quest. & (self.logic.has(ArtisanGood.void_mayonnaise) | self.logic.fishing.can_fish()), - Quest.magic_ink: self.logic.relationship.can_meet(NPC.wizard), + Quest.magic_ink: self.logic.region.can_reach(Region.witch_hut) & self.logic.relationship.can_meet(NPC.wizard), Quest.the_pirates_wife: self.logic.relationship.can_meet(NPC.kent) & self.logic.relationship.can_meet(NPC.gus) & self.logic.relationship.can_meet(NPC.sandy) & self.logic.relationship.can_meet(NPC.george) & self.logic.relationship.can_meet(NPC.wizard) & self.logic.relationship.can_meet(NPC.willy), diff --git a/worlds/stardew_valley/logic/region_logic.py b/worlds/stardew_valley/logic/region_logic.py index 083f56e167..81c79be097 100644 --- a/worlds/stardew_valley/logic/region_logic.py +++ b/worlds/stardew_valley/logic/region_logic.py @@ -1,23 +1,23 @@ -from typing import Tuple, Union +from typing import Tuple from Utils import cache_self1 from .base_logic import BaseLogic, BaseLogicMixin -from .has_logic import HasLogicMixin from ..options import EntranceRandomization from ..stardew_rule import StardewRule, Reach, false_, true_ from ..strings.region_names import Region main_outside_area = {Region.menu, Region.stardew_valley, Region.farm_house, Region.farm, Region.town, Region.beach, Region.mountain, Region.forest, Region.bus_stop, Region.backwoods, Region.bus_tunnel, Region.tunnel_entrance} -always_accessible_regions_without_er = {*main_outside_area, Region.community_center, Region.pantry, Region.crafts_room, Region.fish_tank, Region.boiler_room, - Region.vault, Region.bulletin_board, Region.mines, Region.hospital, Region.carpenter, Region.alex_house, - Region.elliott_house, Region.ranch, Region.farm_cave, Region.wizard_tower, Region.tent, Region.pierre_store, - Region.saloon, Region.blacksmith, Region.trailer, Region.museum, Region.mayor_house, Region.haley_house, - Region.sam_house, Region.jojamart, Region.fish_shop} +always_accessible_regions_with_non_progression_er = {*main_outside_area, Region.mines, Region.hospital, Region.carpenter, Region.alex_house, + Region.ranch, Region.farm_cave, Region.wizard_tower, Region.tent, + Region.pierre_store, Region.saloon, Region.blacksmith, Region.trailer, Region.museum, Region.mayor_house, + Region.haley_house, Region.sam_house, Region.jojamart, Region.fish_shop} +always_accessible_regions_without_er = {*always_accessible_regions_with_non_progression_er, Region.community_center, Region.pantry, Region.crafts_room, + Region.fish_tank, Region.boiler_room, Region.vault, Region.bulletin_board} always_regions_by_setting = {EntranceRandomization.option_disabled: always_accessible_regions_without_er, EntranceRandomization.option_pelican_town: always_accessible_regions_without_er, - EntranceRandomization.option_non_progression: always_accessible_regions_without_er, + EntranceRandomization.option_non_progression: always_accessible_regions_with_non_progression_er, EntranceRandomization.option_buildings_without_house: main_outside_area, EntranceRandomization.option_buildings: main_outside_area, EntranceRandomization.option_chaos: always_accessible_regions_without_er} diff --git a/worlds/stardew_valley/logic/skill_logic.py b/worlds/stardew_valley/logic/skill_logic.py index 7582e5240f..b582eb3613 100644 --- a/worlds/stardew_valley/logic/skill_logic.py +++ b/worlds/stardew_valley/logic/skill_logic.py @@ -34,7 +34,8 @@ class SkillLogic(BaseLogic): previous_level_rule = self.logic.skill.has_previous_level(skill, level) if skill == Skill.fishing: - xp_rule = self.logic.tool.has_fishing_rod(max(tool_level, 3)) + # Not checking crab pot as this is used for not randomized skills logic, for which players need a fishing rod to start gaining xp. + xp_rule = self.logic.tool.has_fishing_rod(max(tool_level, 3)) & self.logic.fishing.can_fish_anywhere() elif skill == Skill.farming: xp_rule = self.can_get_farming_xp & self.logic.tool.has_tool(Tool.hoe, tool_material) & self.logic.tool.can_water(tool_level) elif skill == Skill.foraging: @@ -134,7 +135,7 @@ class SkillLogic(BaseLogic): @cached_property def can_get_fishing_xp(self) -> StardewRule: if self.content.features.skill_progression.is_progressive: - return self.logic.fishing.can_fish_anywhere() | self.logic.fishing.can_crab_pot + return self.logic.fishing.can_fish_anywhere() | self.logic.fishing.can_crab_pot_anywhere return self.logic.fishing.can_fish_anywhere() diff --git a/worlds/stardew_valley/mods/logic/sve_logic.py b/worlds/stardew_valley/mods/logic/sve_logic.py index 7f0c12bc4f..03f1737c59 100644 --- a/worlds/stardew_valley/mods/logic/sve_logic.py +++ b/worlds/stardew_valley/mods/logic/sve_logic.py @@ -1,8 +1,7 @@ -from ..mod_regions import SVERegion from ...logic.base_logic import BaseLogicMixin, BaseLogic from ...strings.ap_names.mods.mod_items import SVELocation, SVERunes, SVEQuestItem from ...strings.quest_names import Quest, ModQuest -from ...strings.region_names import Region +from ...strings.region_names import Region, SVERegion from ...strings.tool_names import Tool, ToolMaterial from ...strings.wallet_item_names import Wallet diff --git a/worlds/stardew_valley/mods/mod_regions.py b/worlds/stardew_valley/mods/region_data.py similarity index 61% rename from worlds/stardew_valley/mods/mod_regions.py rename to worlds/stardew_valley/mods/region_data.py index a402ba6068..5dc4a3dff2 100644 --- a/worlds/stardew_valley/mods/mod_regions.py +++ b/worlds/stardew_valley/mods/region_data.py @@ -1,15 +1,14 @@ -from typing import Dict, List - from .mod_data import ModNames -from ..region_classes import RegionData, ConnectionData, ModificationFlag, RandomizationFlag, ModRegionData +from ..content.mods.sve import SVE_GINGER_ISLAND_PACK +from ..regions.model import RegionData, ConnectionData, MergeFlag, RandomizationFlag, ModRegionsData from ..strings.entrance_names import Entrance, DeepWoodsEntrance, EugeneEntrance, LaceyEntrance, BoardingHouseEntrance, \ JasperEntrance, AlecEntrance, YobaEntrance, JunaEntrance, MagicEntrance, AyeishaEntrance, RileyEntrance, SVEEntrance, AlectoEntrance from ..strings.region_names import Region, DeepWoodsRegion, EugeneRegion, JasperRegion, BoardingHouseRegion, \ AlecRegion, YobaRegion, JunaRegion, MagicRegion, AyeishaRegion, RileyRegion, SVERegion, AlectoRegion, LaceyRegion deep_woods_regions = [ - RegionData(Region.farm, [DeepWoodsEntrance.use_woods_obelisk]), - RegionData(DeepWoodsRegion.woods_obelisk_menu, [DeepWoodsEntrance.deep_woods_depth_1, + RegionData(Region.farm, (DeepWoodsEntrance.use_woods_obelisk,)), + RegionData(DeepWoodsRegion.woods_obelisk_menu, (DeepWoodsEntrance.deep_woods_depth_1, DeepWoodsEntrance.deep_woods_depth_10, DeepWoodsEntrance.deep_woods_depth_20, DeepWoodsEntrance.deep_woods_depth_30, @@ -19,9 +18,9 @@ deep_woods_regions = [ DeepWoodsEntrance.deep_woods_depth_70, DeepWoodsEntrance.deep_woods_depth_80, DeepWoodsEntrance.deep_woods_depth_90, - DeepWoodsEntrance.deep_woods_depth_100]), - RegionData(Region.secret_woods, [DeepWoodsEntrance.secret_woods_to_deep_woods]), - RegionData(DeepWoodsRegion.main_lichtung, [DeepWoodsEntrance.deep_woods_house]), + DeepWoodsEntrance.deep_woods_depth_100)), + RegionData(Region.secret_woods, (DeepWoodsEntrance.secret_woods_to_deep_woods,)), + RegionData(DeepWoodsRegion.main_lichtung, (DeepWoodsEntrance.deep_woods_house,)), RegionData(DeepWoodsRegion.abandoned_home), RegionData(DeepWoodsRegion.floor_10), RegionData(DeepWoodsRegion.floor_20), @@ -32,14 +31,13 @@ deep_woods_regions = [ RegionData(DeepWoodsRegion.floor_70), RegionData(DeepWoodsRegion.floor_80), RegionData(DeepWoodsRegion.floor_90), - RegionData(DeepWoodsRegion.floor_100) + RegionData(DeepWoodsRegion.floor_100), ] deep_woods_entrances = [ ConnectionData(DeepWoodsEntrance.use_woods_obelisk, DeepWoodsRegion.woods_obelisk_menu), ConnectionData(DeepWoodsEntrance.secret_woods_to_deep_woods, DeepWoodsRegion.main_lichtung), - ConnectionData(DeepWoodsEntrance.deep_woods_house, DeepWoodsRegion.abandoned_home, - flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(DeepWoodsEntrance.deep_woods_house, DeepWoodsRegion.abandoned_home, flag=RandomizationFlag.BUILDINGS), ConnectionData(DeepWoodsEntrance.deep_woods_depth_1, DeepWoodsRegion.main_lichtung), ConnectionData(DeepWoodsEntrance.deep_woods_depth_10, DeepWoodsRegion.floor_10), ConnectionData(DeepWoodsEntrance.deep_woods_depth_20, DeepWoodsRegion.floor_20), @@ -50,165 +48,166 @@ deep_woods_entrances = [ ConnectionData(DeepWoodsEntrance.deep_woods_depth_70, DeepWoodsRegion.floor_70), ConnectionData(DeepWoodsEntrance.deep_woods_depth_80, DeepWoodsRegion.floor_80), ConnectionData(DeepWoodsEntrance.deep_woods_depth_90, DeepWoodsRegion.floor_90), - ConnectionData(DeepWoodsEntrance.deep_woods_depth_100, DeepWoodsRegion.floor_100) + ConnectionData(DeepWoodsEntrance.deep_woods_depth_100, DeepWoodsRegion.floor_100), ] eugene_regions = [ - RegionData(Region.forest, [EugeneEntrance.forest_to_garden]), - RegionData(EugeneRegion.eugene_garden, [EugeneEntrance.garden_to_bedroom]), - RegionData(EugeneRegion.eugene_bedroom) + RegionData(Region.forest, (EugeneEntrance.forest_to_garden,)), + RegionData(EugeneRegion.eugene_garden, (EugeneEntrance.garden_to_bedroom,)), + RegionData(EugeneRegion.eugene_bedroom), ] eugene_entrances = [ ConnectionData(EugeneEntrance.forest_to_garden, EugeneRegion.eugene_garden, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(EugeneEntrance.garden_to_bedroom, EugeneRegion.eugene_bedroom, flag=RandomizationFlag.BUILDINGS) + ConnectionData(EugeneEntrance.garden_to_bedroom, EugeneRegion.eugene_bedroom, flag=RandomizationFlag.BUILDINGS), ] magic_regions = [ - RegionData(Region.pierre_store, [MagicEntrance.store_to_altar]), - RegionData(MagicRegion.altar) + RegionData(Region.pierre_store, (MagicEntrance.store_to_altar,)), + RegionData(MagicRegion.altar), ] magic_entrances = [ - ConnectionData(MagicEntrance.store_to_altar, MagicRegion.altar, flag=RandomizationFlag.NOT_RANDOMIZED) + ConnectionData(MagicEntrance.store_to_altar, MagicRegion.altar, flag=RandomizationFlag.NOT_RANDOMIZED), ] jasper_regions = [ - RegionData(Region.museum, [JasperEntrance.museum_to_bedroom]), - RegionData(JasperRegion.jasper_bedroom) + RegionData(Region.museum, (JasperEntrance.museum_to_bedroom,)), + RegionData(JasperRegion.jasper_bedroom), ] jasper_entrances = [ - ConnectionData(JasperEntrance.museum_to_bedroom, JasperRegion.jasper_bedroom, flag=RandomizationFlag.BUILDINGS) + ConnectionData(JasperEntrance.museum_to_bedroom, JasperRegion.jasper_bedroom, flag=RandomizationFlag.BUILDINGS), ] alec_regions = [ - RegionData(Region.forest, [AlecEntrance.forest_to_petshop]), - RegionData(AlecRegion.pet_store, [AlecEntrance.petshop_to_bedroom]), - RegionData(AlecRegion.alec_bedroom) + RegionData(Region.forest, (AlecEntrance.forest_to_petshop,)), + RegionData(AlecRegion.pet_store, (AlecEntrance.petshop_to_bedroom,)), + RegionData(AlecRegion.alec_bedroom), ] alec_entrances = [ ConnectionData(AlecEntrance.forest_to_petshop, AlecRegion.pet_store, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(AlecEntrance.petshop_to_bedroom, AlecRegion.alec_bedroom, flag=RandomizationFlag.BUILDINGS) + ConnectionData(AlecEntrance.petshop_to_bedroom, AlecRegion.alec_bedroom, flag=RandomizationFlag.BUILDINGS), ] yoba_regions = [ - RegionData(Region.secret_woods, [YobaEntrance.secret_woods_to_clearing]), - RegionData(YobaRegion.yoba_clearing) + RegionData(Region.secret_woods, (YobaEntrance.secret_woods_to_clearing,)), + RegionData(YobaRegion.yoba_clearing), ] yoba_entrances = [ - ConnectionData(YobaEntrance.secret_woods_to_clearing, YobaRegion.yoba_clearing, flag=RandomizationFlag.BUILDINGS) + ConnectionData(YobaEntrance.secret_woods_to_clearing, YobaRegion.yoba_clearing, flag=RandomizationFlag.BUILDINGS), ] juna_regions = [ - RegionData(Region.forest, [JunaEntrance.forest_to_juna_cave]), - RegionData(JunaRegion.juna_cave) + RegionData(Region.forest, (JunaEntrance.forest_to_juna_cave,)), + RegionData(JunaRegion.juna_cave), ] juna_entrances = [ ConnectionData(JunaEntrance.forest_to_juna_cave, JunaRegion.juna_cave, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA) + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), ] ayeisha_regions = [ - RegionData(Region.bus_stop, [AyeishaEntrance.bus_stop_to_mail_van]), - RegionData(AyeishaRegion.mail_van) + RegionData(Region.bus_stop, (AyeishaEntrance.bus_stop_to_mail_van,)), + RegionData(AyeishaRegion.mail_van), ] ayeisha_entrances = [ ConnectionData(AyeishaEntrance.bus_stop_to_mail_van, AyeishaRegion.mail_van, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA) + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), ] riley_regions = [ - RegionData(Region.town, [RileyEntrance.town_to_riley]), - RegionData(RileyRegion.riley_house) + RegionData(Region.town, (RileyEntrance.town_to_riley,)), + RegionData(RileyRegion.riley_house), ] riley_entrances = [ ConnectionData(RileyEntrance.town_to_riley, RileyRegion.riley_house, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA) + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), ] -stardew_valley_expanded_regions = [ - RegionData(Region.backwoods, [SVEEntrance.backwoods_to_grove]), - RegionData(SVERegion.enchanted_grove, [SVEEntrance.grove_to_outpost_warp, SVEEntrance.grove_to_wizard_warp, +sve_main_land_regions = [ + RegionData(Region.backwoods, (SVEEntrance.backwoods_to_grove,)), + RegionData(SVERegion.enchanted_grove, (SVEEntrance.grove_to_outpost_warp, SVEEntrance.grove_to_wizard_warp, SVEEntrance.grove_to_farm_warp, SVEEntrance.grove_to_guild_warp, SVEEntrance.grove_to_junimo_warp, - SVEEntrance.grove_to_spring_warp, SVEEntrance.grove_to_aurora_warp]), - RegionData(SVERegion.grove_farm_warp, [SVEEntrance.farm_warp_to_farm]), - RegionData(SVERegion.grove_aurora_warp, [SVEEntrance.aurora_warp_to_aurora]), - RegionData(SVERegion.grove_guild_warp, [SVEEntrance.guild_warp_to_guild]), - RegionData(SVERegion.grove_junimo_warp, [SVEEntrance.junimo_warp_to_junimo]), - RegionData(SVERegion.grove_spring_warp, [SVEEntrance.spring_warp_to_spring]), - RegionData(SVERegion.grove_outpost_warp, [SVEEntrance.outpost_warp_to_outpost]), - RegionData(SVERegion.grove_wizard_warp, [SVEEntrance.wizard_warp_to_wizard]), - RegionData(SVERegion.galmoran_outpost, [SVEEntrance.outpost_to_badlands_entrance, SVEEntrance.use_alesia_shop, - SVEEntrance.use_isaac_shop]), - RegionData(SVERegion.badlands_entrance, [SVEEntrance.badlands_entrance_to_badlands]), - RegionData(SVERegion.crimson_badlands, [SVEEntrance.badlands_to_cave]), + SVEEntrance.grove_to_spring_warp, SVEEntrance.grove_to_aurora_warp)), + RegionData(SVERegion.grove_farm_warp, (SVEEntrance.farm_warp_to_farm,)), + RegionData(SVERegion.grove_aurora_warp, (SVEEntrance.aurora_warp_to_aurora,)), + RegionData(SVERegion.grove_guild_warp, (SVEEntrance.guild_warp_to_guild,)), + RegionData(SVERegion.grove_junimo_warp, (SVEEntrance.junimo_warp_to_junimo,)), + RegionData(SVERegion.grove_spring_warp, (SVEEntrance.spring_warp_to_spring,)), + RegionData(SVERegion.grove_outpost_warp, (SVEEntrance.outpost_warp_to_outpost,)), + RegionData(SVERegion.grove_wizard_warp, (SVEEntrance.wizard_warp_to_wizard,)), + RegionData(SVERegion.galmoran_outpost, (SVEEntrance.outpost_to_badlands_entrance, SVEEntrance.use_alesia_shop, SVEEntrance.use_isaac_shop)), + RegionData(SVERegion.badlands_entrance, (SVEEntrance.badlands_entrance_to_badlands,)), + RegionData(SVERegion.crimson_badlands, (SVEEntrance.badlands_to_cave,)), RegionData(SVERegion.badlands_cave), - RegionData(Region.bus_stop, [SVEEntrance.bus_stop_to_shed]), - RegionData(SVERegion.grandpas_shed, [SVEEntrance.grandpa_shed_to_interior, SVEEntrance.grandpa_shed_to_town]), - RegionData(SVERegion.grandpas_shed_interior, [SVEEntrance.grandpa_interior_to_upstairs]), + RegionData(Region.bus_stop, (SVEEntrance.bus_stop_to_shed,)), + RegionData(SVERegion.grandpas_shed, (SVEEntrance.grandpa_shed_to_interior, SVEEntrance.grandpa_shed_to_town)), + RegionData(SVERegion.grandpas_shed_interior, (SVEEntrance.grandpa_interior_to_upstairs,)), RegionData(SVERegion.grandpas_shed_upstairs), RegionData(Region.forest, - [SVEEntrance.forest_to_fairhaven, SVEEntrance.forest_to_west, SVEEntrance.forest_to_lost_woods, - SVEEntrance.forest_to_bmv, SVEEntrance.forest_to_marnie_shed]), + (SVEEntrance.forest_to_fairhaven, SVEEntrance.forest_to_west, SVEEntrance.forest_to_lost_woods, + SVEEntrance.forest_to_bmv, SVEEntrance.forest_to_marnie_shed)), RegionData(SVERegion.marnies_shed), RegionData(SVERegion.fairhaven_farm), - RegionData(Region.town, [SVEEntrance.town_to_bmv, SVEEntrance.town_to_jenkins, - SVEEntrance.town_to_bridge, SVEEntrance.town_to_plot]), - RegionData(SVERegion.blue_moon_vineyard, [SVEEntrance.bmv_to_sophia, SVEEntrance.bmv_to_beach]), + RegionData(Region.town, (SVEEntrance.town_to_bmv, SVEEntrance.town_to_jenkins, SVEEntrance.town_to_bridge, SVEEntrance.town_to_plot)), + RegionData(SVERegion.blue_moon_vineyard, (SVEEntrance.bmv_to_sophia, SVEEntrance.bmv_to_beach)), RegionData(SVERegion.sophias_house), - RegionData(SVERegion.jenkins_residence, [SVEEntrance.jenkins_to_cellar]), + RegionData(SVERegion.jenkins_residence, (SVEEntrance.jenkins_to_cellar,)), RegionData(SVERegion.jenkins_cellar), - RegionData(SVERegion.unclaimed_plot, [SVEEntrance.plot_to_bridge]), + RegionData(SVERegion.unclaimed_plot, (SVEEntrance.plot_to_bridge,)), RegionData(SVERegion.shearwater), - RegionData(Region.museum, [SVEEntrance.museum_to_gunther_bedroom]), + RegionData(Region.museum, (SVEEntrance.museum_to_gunther_bedroom,)), RegionData(SVERegion.gunther_bedroom), - RegionData(Region.fish_shop, [SVEEntrance.fish_shop_to_willy_bedroom]), + RegionData(Region.fish_shop, (SVEEntrance.fish_shop_to_willy_bedroom,)), RegionData(SVERegion.willy_bedroom), - RegionData(Region.mountain, [SVEEntrance.mountain_to_guild_summit]), - RegionData(SVERegion.guild_summit, [SVEEntrance.guild_to_interior, SVEEntrance.guild_to_mines, - SVEEntrance.summit_to_highlands]), - RegionData(Region.railroad, [SVEEntrance.to_susan_house, SVEEntrance.enter_summit, SVEEntrance.railroad_to_grampleton_station]), - RegionData(SVERegion.grampleton_station, [SVEEntrance.grampleton_station_to_grampleton_suburbs]), - RegionData(SVERegion.grampleton_suburbs, [SVEEntrance.grampleton_suburbs_to_scarlett_house]), + RegionData(Region.mountain, (SVEEntrance.mountain_to_guild_summit,)), + # These entrances are removed from the mountain region when SVE is enabled + RegionData(Region.mountain, (Entrance.mountain_to_adventurer_guild, Entrance.mountain_to_the_mines), flag=MergeFlag.REMOVE_EXITS), + RegionData(SVERegion.guild_summit, (SVEEntrance.guild_to_interior, SVEEntrance.guild_to_mines)), + RegionData(Region.railroad, (SVEEntrance.to_susan_house, SVEEntrance.enter_summit, SVEEntrance.railroad_to_grampleton_station)), + RegionData(SVERegion.grampleton_station, (SVEEntrance.grampleton_station_to_grampleton_suburbs,)), + RegionData(SVERegion.grampleton_suburbs, (SVEEntrance.grampleton_suburbs_to_scarlett_house,)), RegionData(SVERegion.scarlett_house), - RegionData(Region.wizard_basement, [SVEEntrance.wizard_to_fable_reef]), - RegionData(SVERegion.fable_reef, [SVEEntrance.fable_reef_to_guild], is_ginger_island=True), - RegionData(SVERegion.first_slash_guild, [SVEEntrance.first_slash_guild_to_hallway], is_ginger_island=True), - RegionData(SVERegion.first_slash_hallway, [SVEEntrance.first_slash_hallway_to_room], is_ginger_island=True), - RegionData(SVERegion.first_slash_spare_room, is_ginger_island=True), - RegionData(SVERegion.highlands_outside, [SVEEntrance.highlands_to_lance, SVEEntrance.highlands_to_cave, SVEEntrance.highlands_to_pond], is_ginger_island=True), - RegionData(SVERegion.highlands_pond, is_ginger_island=True), - RegionData(SVERegion.highlands_cavern, [SVEEntrance.to_dwarf_prison], is_ginger_island=True), - RegionData(SVERegion.dwarf_prison, is_ginger_island=True), - RegionData(SVERegion.lances_house, [SVEEntrance.lance_to_ladder], is_ginger_island=True), - RegionData(SVERegion.lances_ladder, [SVEEntrance.lance_ladder_to_highlands], is_ginger_island=True), - RegionData(SVERegion.forest_west, [SVEEntrance.forest_west_to_spring, SVEEntrance.west_to_aurora, - SVEEntrance.use_bear_shop]), - RegionData(SVERegion.aurora_vineyard, [SVEEntrance.to_aurora_basement]), + RegionData(SVERegion.forest_west, (SVEEntrance.forest_west_to_spring, SVEEntrance.west_to_aurora, SVEEntrance.use_bear_shop,)), + RegionData(SVERegion.aurora_vineyard, (SVEEntrance.to_aurora_basement,)), RegionData(SVERegion.aurora_vineyard_basement), - RegionData(Region.secret_woods, [SVEEntrance.secret_woods_to_west]), + RegionData(Region.secret_woods, (SVEEntrance.secret_woods_to_west,)), RegionData(SVERegion.bear_shop), - RegionData(SVERegion.sprite_spring, [SVEEntrance.sprite_spring_to_cave]), + RegionData(SVERegion.sprite_spring, (SVEEntrance.sprite_spring_to_cave,)), RegionData(SVERegion.sprite_spring_cave), - RegionData(SVERegion.lost_woods, [SVEEntrance.lost_woods_to_junimo_woods]), - RegionData(SVERegion.junimo_woods, [SVEEntrance.use_purple_junimo]), + RegionData(SVERegion.lost_woods, (SVEEntrance.lost_woods_to_junimo_woods,)), + RegionData(SVERegion.junimo_woods, (SVEEntrance.use_purple_junimo,)), RegionData(SVERegion.purple_junimo_shop), RegionData(SVERegion.alesia_shop), RegionData(SVERegion.isaac_shop), RegionData(SVERegion.summit), RegionData(SVERegion.susans_house), - RegionData(Region.mountain, [Entrance.mountain_to_adventurer_guild, Entrance.mountain_to_the_mines], ModificationFlag.MODIFIED) - ] -mandatory_sve_connections = [ +sve_ginger_island_regions = [ + RegionData(Region.wizard_basement, (SVEEntrance.wizard_to_fable_reef,)), + + RegionData(SVERegion.fable_reef, (SVEEntrance.fable_reef_to_guild,)), + RegionData(SVERegion.first_slash_guild, (SVEEntrance.first_slash_guild_to_hallway,)), + RegionData(SVERegion.first_slash_hallway, (SVEEntrance.first_slash_hallway_to_room,)), + RegionData(SVERegion.first_slash_spare_room), + RegionData(SVERegion.guild_summit, (SVEEntrance.summit_to_highlands,)), + RegionData(SVERegion.highlands_outside, (SVEEntrance.highlands_to_lance, SVEEntrance.highlands_to_cave, SVEEntrance.highlands_to_pond), ), + RegionData(SVERegion.highlands_pond), + RegionData(SVERegion.highlands_cavern, (SVEEntrance.to_dwarf_prison,)), + RegionData(SVERegion.dwarf_prison), + RegionData(SVERegion.lances_house, (SVEEntrance.lance_to_ladder,)), + RegionData(SVERegion.lances_ladder, (SVEEntrance.lance_ladder_to_highlands,)), +] + +sve_main_land_connections = [ ConnectionData(SVEEntrance.town_to_jenkins, SVERegion.jenkins_residence, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), ConnectionData(SVEEntrance.jenkins_to_cellar, SVERegion.jenkins_cellar, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.forest_to_bmv, SVERegion.blue_moon_vineyard), @@ -223,7 +222,7 @@ mandatory_sve_connections = [ ConnectionData(SVEEntrance.grandpa_interior_to_upstairs, SVERegion.grandpas_shed_upstairs, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.grandpa_shed_to_town, Region.town), ConnectionData(SVEEntrance.bmv_to_sophia, SVERegion.sophias_house, flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(SVEEntrance.summit_to_highlands, SVERegion.highlands_outside, flag=RandomizationFlag.GINGER_ISLAND), + ConnectionData(SVEEntrance.summit_to_highlands, SVERegion.highlands_outside), ConnectionData(SVEEntrance.guild_to_interior, Region.adventurer_guild, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.backwoods_to_grove, SVERegion.enchanted_grove, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), ConnectionData(SVEEntrance.grove_to_outpost_warp, SVERegion.grove_outpost_warp), @@ -242,8 +241,6 @@ mandatory_sve_connections = [ ConnectionData(SVEEntrance.use_purple_junimo, SVERegion.purple_junimo_shop), ConnectionData(SVEEntrance.grove_to_spring_warp, SVERegion.grove_spring_warp), ConnectionData(SVEEntrance.spring_warp_to_spring, SVERegion.sprite_spring, flag=RandomizationFlag.BUILDINGS), - ConnectionData(SVEEntrance.wizard_to_fable_reef, SVERegion.fable_reef, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(SVEEntrance.fable_reef_to_guild, SVERegion.first_slash_guild, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), ConnectionData(SVEEntrance.outpost_to_badlands_entrance, SVERegion.badlands_entrance, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.badlands_entrance_to_badlands, SVERegion.crimson_badlands, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.badlands_to_cave, SVERegion.badlands_cave, flag=RandomizationFlag.BUILDINGS), @@ -259,71 +256,75 @@ mandatory_sve_connections = [ ConnectionData(SVEEntrance.to_susan_house, SVERegion.susans_house, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.enter_summit, SVERegion.summit, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.forest_to_fairhaven, SVERegion.fairhaven_farm, flag=RandomizationFlag.NON_PROGRESSION), - ConnectionData(SVEEntrance.highlands_to_lance, SVERegion.lances_house, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(SVEEntrance.lance_to_ladder, SVERegion.lances_ladder, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(SVEEntrance.lance_ladder_to_highlands, SVERegion.highlands_outside, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(SVEEntrance.highlands_to_cave, SVERegion.highlands_cavern, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), ConnectionData(SVEEntrance.use_bear_shop, SVERegion.bear_shop), ConnectionData(SVEEntrance.use_purple_junimo, SVERegion.purple_junimo_shop), ConnectionData(SVEEntrance.use_alesia_shop, SVERegion.alesia_shop), ConnectionData(SVEEntrance.use_isaac_shop, SVERegion.isaac_shop), - ConnectionData(SVEEntrance.to_dwarf_prison, SVERegion.dwarf_prison, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), ConnectionData(SVEEntrance.railroad_to_grampleton_station, SVERegion.grampleton_station), ConnectionData(SVEEntrance.grampleton_station_to_grampleton_suburbs, SVERegion.grampleton_suburbs), ConnectionData(SVEEntrance.grampleton_suburbs_to_scarlett_house, SVERegion.scarlett_house, flag=RandomizationFlag.BUILDINGS), - ConnectionData(SVEEntrance.first_slash_guild_to_hallway, SVERegion.first_slash_hallway, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(SVEEntrance.first_slash_hallway_to_room, SVERegion.first_slash_spare_room, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), ConnectionData(SVEEntrance.sprite_spring_to_cave, SVERegion.sprite_spring_cave, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.fish_shop_to_willy_bedroom, SVERegion.willy_bedroom, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.museum_to_gunther_bedroom, SVERegion.gunther_bedroom, flag=RandomizationFlag.BUILDINGS), ConnectionData(SVEEntrance.highlands_to_pond, SVERegion.highlands_pond), ] +sve_ginger_island_connections = [ + ConnectionData(SVEEntrance.wizard_to_fable_reef, SVERegion.fable_reef, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.fable_reef_to_guild, SVERegion.first_slash_guild, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.highlands_to_lance, SVERegion.lances_house, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.lance_to_ladder, SVERegion.lances_ladder), + ConnectionData(SVEEntrance.lance_ladder_to_highlands, SVERegion.highlands_outside, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.highlands_to_cave, SVERegion.highlands_cavern, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.to_dwarf_prison, SVERegion.dwarf_prison, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.first_slash_guild_to_hallway, SVERegion.first_slash_hallway, flag=RandomizationFlag.BUILDINGS), + ConnectionData(SVEEntrance.first_slash_hallway_to_room, SVERegion.first_slash_spare_room, flag=RandomizationFlag.BUILDINGS), +] + alecto_regions = [ - RegionData(Region.witch_hut, [AlectoEntrance.witch_hut_to_witch_attic]), - RegionData(AlectoRegion.witch_attic) + RegionData(Region.witch_hut, (AlectoEntrance.witch_hut_to_witch_attic,)), + RegionData(AlectoRegion.witch_attic), ] alecto_entrances = [ - ConnectionData(AlectoEntrance.witch_hut_to_witch_attic, AlectoRegion.witch_attic, flag=RandomizationFlag.BUILDINGS) + ConnectionData(AlectoEntrance.witch_hut_to_witch_attic, AlectoRegion.witch_attic, flag=RandomizationFlag.BUILDINGS), ] lacey_regions = [ - RegionData(Region.forest, [LaceyEntrance.forest_to_hat_house]), - RegionData(LaceyRegion.hat_house) + RegionData(Region.forest, (LaceyEntrance.forest_to_hat_house,)), + RegionData(LaceyRegion.hat_house), ] lacey_entrances = [ - ConnectionData(LaceyEntrance.forest_to_hat_house, LaceyRegion.hat_house, flag=RandomizationFlag.BUILDINGS) + ConnectionData(LaceyEntrance.forest_to_hat_house, LaceyRegion.hat_house, flag=RandomizationFlag.BUILDINGS), ] boarding_house_regions = [ - RegionData(Region.bus_stop, [BoardingHouseEntrance.bus_stop_to_boarding_house_plateau]), - RegionData(BoardingHouseRegion.boarding_house_plateau, [BoardingHouseEntrance.boarding_house_plateau_to_boarding_house_first, + RegionData(Region.bus_stop, (BoardingHouseEntrance.bus_stop_to_boarding_house_plateau,)), + RegionData(BoardingHouseRegion.boarding_house_plateau, (BoardingHouseEntrance.boarding_house_plateau_to_boarding_house_first, BoardingHouseEntrance.boarding_house_plateau_to_buffalo_ranch, - BoardingHouseEntrance.boarding_house_plateau_to_abandoned_mines_entrance]), - RegionData(BoardingHouseRegion.boarding_house_first, [BoardingHouseEntrance.boarding_house_first_to_boarding_house_second]), + BoardingHouseEntrance.boarding_house_plateau_to_abandoned_mines_entrance)), + RegionData(BoardingHouseRegion.boarding_house_first, (BoardingHouseEntrance.boarding_house_first_to_boarding_house_second,)), RegionData(BoardingHouseRegion.boarding_house_second), RegionData(BoardingHouseRegion.buffalo_ranch), - RegionData(BoardingHouseRegion.abandoned_mines_entrance, [BoardingHouseEntrance.abandoned_mines_entrance_to_abandoned_mines_1a, - BoardingHouseEntrance.abandoned_mines_entrance_to_the_lost_valley]), - RegionData(BoardingHouseRegion.abandoned_mines_1a, [BoardingHouseEntrance.abandoned_mines_1a_to_abandoned_mines_1b]), - RegionData(BoardingHouseRegion.abandoned_mines_1b, [BoardingHouseEntrance.abandoned_mines_1b_to_abandoned_mines_2a]), - RegionData(BoardingHouseRegion.abandoned_mines_2a, [BoardingHouseEntrance.abandoned_mines_2a_to_abandoned_mines_2b]), - RegionData(BoardingHouseRegion.abandoned_mines_2b, [BoardingHouseEntrance.abandoned_mines_2b_to_abandoned_mines_3]), - RegionData(BoardingHouseRegion.abandoned_mines_3, [BoardingHouseEntrance.abandoned_mines_3_to_abandoned_mines_4]), - RegionData(BoardingHouseRegion.abandoned_mines_4, [BoardingHouseEntrance.abandoned_mines_4_to_abandoned_mines_5]), - RegionData(BoardingHouseRegion.abandoned_mines_5, [BoardingHouseEntrance.abandoned_mines_5_to_the_lost_valley]), - RegionData(BoardingHouseRegion.the_lost_valley, [BoardingHouseEntrance.the_lost_valley_to_gregory_tent, + RegionData(BoardingHouseRegion.abandoned_mines_entrance, (BoardingHouseEntrance.abandoned_mines_entrance_to_abandoned_mines_1a, + BoardingHouseEntrance.abandoned_mines_entrance_to_the_lost_valley)), + RegionData(BoardingHouseRegion.abandoned_mines_1a, (BoardingHouseEntrance.abandoned_mines_1a_to_abandoned_mines_1b,)), + RegionData(BoardingHouseRegion.abandoned_mines_1b, (BoardingHouseEntrance.abandoned_mines_1b_to_abandoned_mines_2a,)), + RegionData(BoardingHouseRegion.abandoned_mines_2a, (BoardingHouseEntrance.abandoned_mines_2a_to_abandoned_mines_2b,)), + RegionData(BoardingHouseRegion.abandoned_mines_2b, (BoardingHouseEntrance.abandoned_mines_2b_to_abandoned_mines_3,)), + RegionData(BoardingHouseRegion.abandoned_mines_3, (BoardingHouseEntrance.abandoned_mines_3_to_abandoned_mines_4,)), + RegionData(BoardingHouseRegion.abandoned_mines_4, (BoardingHouseEntrance.abandoned_mines_4_to_abandoned_mines_5,)), + RegionData(BoardingHouseRegion.abandoned_mines_5, (BoardingHouseEntrance.abandoned_mines_5_to_the_lost_valley,)), + RegionData(BoardingHouseRegion.the_lost_valley, (BoardingHouseEntrance.the_lost_valley_to_gregory_tent, BoardingHouseEntrance.lost_valley_to_lost_valley_minecart, - BoardingHouseEntrance.the_lost_valley_to_lost_valley_ruins]), + BoardingHouseEntrance.the_lost_valley_to_lost_valley_ruins)), RegionData(BoardingHouseRegion.gregory_tent), - RegionData(BoardingHouseRegion.lost_valley_ruins, [BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_1, - BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_2]), + RegionData(BoardingHouseRegion.lost_valley_ruins, (BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_1, + BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_2)), RegionData(BoardingHouseRegion.lost_valley_minecart), RegionData(BoardingHouseRegion.lost_valley_house_1), - RegionData(BoardingHouseRegion.lost_valley_house_2) + RegionData(BoardingHouseRegion.lost_valley_house_2), ] boarding_house_entrances = [ @@ -351,30 +352,29 @@ boarding_house_entrances = [ ConnectionData(BoardingHouseEntrance.lost_valley_to_lost_valley_minecart, BoardingHouseRegion.lost_valley_minecart), ConnectionData(BoardingHouseEntrance.the_lost_valley_to_lost_valley_ruins, BoardingHouseRegion.lost_valley_ruins, flag=RandomizationFlag.BUILDINGS), ConnectionData(BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_1, BoardingHouseRegion.lost_valley_house_1, flag=RandomizationFlag.BUILDINGS), - ConnectionData(BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_2, BoardingHouseRegion.lost_valley_house_2, flag=RandomizationFlag.BUILDINGS) + ConnectionData(BoardingHouseEntrance.lost_valley_ruins_to_lost_valley_house_2, BoardingHouseRegion.lost_valley_house_2, flag=RandomizationFlag.BUILDINGS), ] -vanilla_connections_to_remove_by_mod: Dict[str, List[ConnectionData]] = { - ModNames.sve: [ - ConnectionData(Entrance.mountain_to_the_mines, Region.mines, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.mountain_to_adventurer_guild, Region.adventurer_guild, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ] +vanilla_connections_to_remove_by_content_pack: dict[str, tuple[str, ...]] = { + ModNames.sve: ( + Entrance.mountain_to_the_mines, + Entrance.mountain_to_adventurer_guild, + ) } -ModDataList = { - ModNames.deepwoods: ModRegionData(ModNames.deepwoods, deep_woods_regions, deep_woods_entrances), - ModNames.eugene: ModRegionData(ModNames.eugene, eugene_regions, eugene_entrances), - ModNames.jasper: ModRegionData(ModNames.jasper, jasper_regions, jasper_entrances), - ModNames.alec: ModRegionData(ModNames.alec, alec_regions, alec_entrances), - ModNames.yoba: ModRegionData(ModNames.yoba, yoba_regions, yoba_entrances), - ModNames.juna: ModRegionData(ModNames.juna, juna_regions, juna_entrances), - ModNames.magic: ModRegionData(ModNames.magic, magic_regions, magic_entrances), - ModNames.ayeisha: ModRegionData(ModNames.ayeisha, ayeisha_regions, ayeisha_entrances), - ModNames.riley: ModRegionData(ModNames.riley, riley_regions, riley_entrances), - ModNames.sve: ModRegionData(ModNames.sve, stardew_valley_expanded_regions, mandatory_sve_connections), - ModNames.alecto: ModRegionData(ModNames.alecto, alecto_regions, alecto_entrances), - ModNames.lacey: ModRegionData(ModNames.lacey, lacey_regions, lacey_entrances), - ModNames.boarding_house: ModRegionData(ModNames.boarding_house, boarding_house_regions, boarding_house_entrances), +region_data_by_content_pack = { + ModNames.deepwoods: ModRegionsData(ModNames.deepwoods, deep_woods_regions, deep_woods_entrances), + ModNames.eugene: ModRegionsData(ModNames.eugene, eugene_regions, eugene_entrances), + ModNames.jasper: ModRegionsData(ModNames.jasper, jasper_regions, jasper_entrances), + ModNames.alec: ModRegionsData(ModNames.alec, alec_regions, alec_entrances), + ModNames.yoba: ModRegionsData(ModNames.yoba, yoba_regions, yoba_entrances), + ModNames.juna: ModRegionsData(ModNames.juna, juna_regions, juna_entrances), + ModNames.magic: ModRegionsData(ModNames.magic, magic_regions, magic_entrances), + ModNames.ayeisha: ModRegionsData(ModNames.ayeisha, ayeisha_regions, ayeisha_entrances), + ModNames.riley: ModRegionsData(ModNames.riley, riley_regions, riley_entrances), + ModNames.sve: ModRegionsData(ModNames.sve, sve_main_land_regions, sve_main_land_connections), + SVE_GINGER_ISLAND_PACK: ModRegionsData(SVE_GINGER_ISLAND_PACK, sve_ginger_island_regions, sve_ginger_island_connections), + ModNames.alecto: ModRegionsData(ModNames.alecto, alecto_regions, alecto_entrances), + ModNames.lacey: ModRegionsData(ModNames.lacey, lacey_regions, lacey_entrances), + ModNames.boarding_house: ModRegionsData(ModNames.boarding_house, boarding_house_regions, boarding_house_entrances), } diff --git a/worlds/stardew_valley/region_classes.py b/worlds/stardew_valley/region_classes.py deleted file mode 100644 index d3d16e3878..0000000000 --- a/worlds/stardew_valley/region_classes.py +++ /dev/null @@ -1,67 +0,0 @@ -from copy import deepcopy -from dataclasses import dataclass, field -from enum import IntFlag -from typing import Optional, List, Set - -connector_keyword = " to " - - -class ModificationFlag(IntFlag): - NOT_MODIFIED = 0 - MODIFIED = 1 - - -class RandomizationFlag(IntFlag): - NOT_RANDOMIZED = 0b0 - PELICAN_TOWN = 0b00011111 - NON_PROGRESSION = 0b00011110 - BUILDINGS = 0b00011100 - EVERYTHING = 0b00011000 - GINGER_ISLAND = 0b00100000 - LEAD_TO_OPEN_AREA = 0b01000000 - MASTERIES = 0b10000000 - - -@dataclass(frozen=True) -class RegionData: - name: str - exits: List[str] = field(default_factory=list) - flag: ModificationFlag = ModificationFlag.NOT_MODIFIED - is_ginger_island: bool = False - - def get_merged_with(self, exits: List[str]): - merged_exits = [] - merged_exits.extend(self.exits) - if exits is not None: - merged_exits.extend(exits) - merged_exits = sorted(set(merged_exits)) - return RegionData(self.name, merged_exits, is_ginger_island=self.is_ginger_island) - - def get_without_exits(self, exits_to_remove: Set[str]): - exits = [exit_ for exit_ in self.exits if exit_ not in exits_to_remove] - return RegionData(self.name, exits, is_ginger_island=self.is_ginger_island) - - def get_clone(self): - return deepcopy(self) - - -@dataclass(frozen=True) -class ConnectionData: - name: str - destination: str - origin: Optional[str] = None - reverse: Optional[str] = None - flag: RandomizationFlag = RandomizationFlag.NOT_RANDOMIZED - - def __post_init__(self): - if connector_keyword in self.name: - origin, destination = self.name.split(connector_keyword) - if self.reverse is None: - super().__setattr__("reverse", f"{destination}{connector_keyword}{origin}") - - -@dataclass(frozen=True) -class ModRegionData: - mod_name: str - regions: List[RegionData] - connections: List[ConnectionData] diff --git a/worlds/stardew_valley/regions.py b/worlds/stardew_valley/regions.py deleted file mode 100644 index d5be53ba86..0000000000 --- a/worlds/stardew_valley/regions.py +++ /dev/null @@ -1,774 +0,0 @@ -from random import Random -from typing import Iterable, Dict, Protocol, List, Tuple, Set - -from BaseClasses import Region, Entrance -from .content import content_packs, StardewContent -from .mods.mod_regions import ModDataList, vanilla_connections_to_remove_by_mod -from .options import EntranceRandomization, ExcludeGingerIsland, StardewValleyOptions -from .region_classes import RegionData, ConnectionData, RandomizationFlag, ModificationFlag -from .strings.entrance_names import Entrance, LogicEntrance -from .strings.region_names import Region as RegionName, LogicRegion - - -class RegionFactory(Protocol): - def __call__(self, name: str, regions: Iterable[str]) -> Region: - raise NotImplementedError - - -vanilla_regions = [ - RegionData(RegionName.menu, [Entrance.to_stardew_valley]), - RegionData(RegionName.stardew_valley, [Entrance.to_farmhouse]), - RegionData(RegionName.farm_house, - [Entrance.farmhouse_to_farm, Entrance.downstairs_to_cellar, LogicEntrance.farmhouse_cooking, LogicEntrance.watch_queen_of_sauce]), - RegionData(RegionName.cellar), - RegionData(RegionName.farm, - [Entrance.farm_to_backwoods, Entrance.farm_to_bus_stop, Entrance.farm_to_forest, Entrance.farm_to_farmcave, Entrance.enter_greenhouse, - Entrance.enter_coop, Entrance.enter_barn, Entrance.enter_shed, Entrance.enter_slime_hutch, LogicEntrance.grow_spring_crops, - LogicEntrance.grow_summer_crops, LogicEntrance.grow_fall_crops, LogicEntrance.grow_winter_crops, LogicEntrance.shipping]), - RegionData(RegionName.backwoods, [Entrance.backwoods_to_mountain]), - RegionData(RegionName.bus_stop, - [Entrance.bus_stop_to_town, Entrance.take_bus_to_desert, Entrance.bus_stop_to_tunnel_entrance]), - RegionData(RegionName.forest, - [Entrance.forest_to_town, Entrance.enter_secret_woods, Entrance.forest_to_wizard_tower, Entrance.forest_to_marnie_ranch, - Entrance.forest_to_leah_cottage, Entrance.forest_to_sewer, Entrance.forest_to_mastery_cave, LogicEntrance.buy_from_traveling_merchant, - LogicEntrance.complete_raccoon_requests, LogicEntrance.fish_in_waterfall, LogicEntrance.attend_flower_dance, LogicEntrance.attend_trout_derby, - LogicEntrance.attend_festival_of_ice]), - RegionData(LogicRegion.forest_waterfall), - RegionData(RegionName.farm_cave), - RegionData(RegionName.greenhouse, - [LogicEntrance.grow_spring_crops_in_greenhouse, LogicEntrance.grow_summer_crops_in_greenhouse, LogicEntrance.grow_fall_crops_in_greenhouse, - LogicEntrance.grow_winter_crops_in_greenhouse, LogicEntrance.grow_indoor_crops_in_greenhouse]), - RegionData(RegionName.mountain, - [Entrance.mountain_to_railroad, Entrance.mountain_to_tent, Entrance.mountain_to_carpenter_shop, - Entrance.mountain_to_the_mines, Entrance.enter_quarry, Entrance.mountain_to_adventurer_guild, - Entrance.mountain_to_town, Entrance.mountain_to_maru_room, - Entrance.mountain_to_leo_treehouse]), - RegionData(RegionName.leo_treehouse, is_ginger_island=True), - RegionData(RegionName.maru_room), - RegionData(RegionName.tunnel_entrance, [Entrance.tunnel_entrance_to_bus_tunnel]), - RegionData(RegionName.bus_tunnel), - RegionData(RegionName.town, - [Entrance.town_to_community_center, Entrance.town_to_beach, Entrance.town_to_hospital, Entrance.town_to_pierre_general_store, - Entrance.town_to_saloon, Entrance.town_to_alex_house, Entrance.town_to_trailer, Entrance.town_to_mayor_manor, Entrance.town_to_sam_house, - Entrance.town_to_haley_house, Entrance.town_to_sewer, Entrance.town_to_clint_blacksmith, Entrance.town_to_museum, Entrance.town_to_jojamart, - Entrance.purchase_movie_ticket, LogicEntrance.buy_experience_books, LogicEntrance.attend_egg_festival, LogicEntrance.attend_fair, - LogicEntrance.attend_spirit_eve, LogicEntrance.attend_winter_star]), - RegionData(RegionName.beach, - [Entrance.beach_to_willy_fish_shop, Entrance.enter_elliott_house, Entrance.enter_tide_pools, LogicEntrance.fishing, LogicEntrance.attend_luau, - LogicEntrance.attend_moonlight_jellies, LogicEntrance.attend_night_market, LogicEntrance.attend_squidfest]), - RegionData(RegionName.railroad, [Entrance.enter_bathhouse_entrance, Entrance.enter_witch_warp_cave]), - RegionData(RegionName.ranch), - RegionData(RegionName.leah_house), - RegionData(RegionName.mastery_cave), - RegionData(RegionName.sewer, [Entrance.enter_mutant_bug_lair]), - RegionData(RegionName.mutant_bug_lair), - RegionData(RegionName.wizard_tower, [Entrance.enter_wizard_basement, Entrance.use_desert_obelisk, Entrance.use_island_obelisk]), - RegionData(RegionName.wizard_basement), - RegionData(RegionName.tent), - RegionData(RegionName.carpenter, [Entrance.enter_sebastian_room]), - RegionData(RegionName.sebastian_room), - RegionData(RegionName.adventurer_guild, [Entrance.adventurer_guild_to_bedroom]), - RegionData(RegionName.adventurer_guild_bedroom), - RegionData(RegionName.community_center, - [Entrance.access_crafts_room, Entrance.access_pantry, Entrance.access_fish_tank, - Entrance.access_boiler_room, Entrance.access_bulletin_board, Entrance.access_vault]), - RegionData(RegionName.crafts_room), - RegionData(RegionName.pantry), - RegionData(RegionName.fish_tank), - RegionData(RegionName.boiler_room), - RegionData(RegionName.bulletin_board), - RegionData(RegionName.vault), - RegionData(RegionName.hospital, [Entrance.enter_harvey_room]), - RegionData(RegionName.harvey_room), - RegionData(RegionName.pierre_store, [Entrance.enter_sunroom]), - RegionData(RegionName.sunroom), - RegionData(RegionName.saloon, [Entrance.play_journey_of_the_prairie_king, Entrance.play_junimo_kart]), - RegionData(RegionName.jotpk_world_1, [Entrance.reach_jotpk_world_2]), - RegionData(RegionName.jotpk_world_2, [Entrance.reach_jotpk_world_3]), - RegionData(RegionName.jotpk_world_3), - RegionData(RegionName.junimo_kart_1, [Entrance.reach_junimo_kart_2]), - RegionData(RegionName.junimo_kart_2, [Entrance.reach_junimo_kart_3]), - RegionData(RegionName.junimo_kart_3, [Entrance.reach_junimo_kart_4]), - RegionData(RegionName.junimo_kart_4), - RegionData(RegionName.alex_house), - RegionData(RegionName.trailer), - RegionData(RegionName.mayor_house), - RegionData(RegionName.sam_house), - RegionData(RegionName.haley_house), - RegionData(RegionName.blacksmith, [LogicEntrance.blacksmith_copper]), - RegionData(RegionName.museum), - RegionData(RegionName.jojamart, [Entrance.enter_abandoned_jojamart]), - RegionData(RegionName.abandoned_jojamart, [Entrance.enter_movie_theater]), - RegionData(RegionName.movie_ticket_stand), - RegionData(RegionName.movie_theater), - RegionData(RegionName.fish_shop, [Entrance.fish_shop_to_boat_tunnel]), - RegionData(RegionName.boat_tunnel, [Entrance.boat_to_ginger_island], is_ginger_island=True), - RegionData(RegionName.elliott_house), - RegionData(RegionName.tide_pools), - RegionData(RegionName.bathhouse_entrance, [Entrance.enter_locker_room]), - RegionData(RegionName.locker_room, [Entrance.enter_public_bath]), - RegionData(RegionName.public_bath), - RegionData(RegionName.witch_warp_cave, [Entrance.enter_witch_swamp]), - RegionData(RegionName.witch_swamp, [Entrance.enter_witch_hut]), - RegionData(RegionName.witch_hut, [Entrance.witch_warp_to_wizard_basement]), - RegionData(RegionName.quarry, [Entrance.enter_quarry_mine_entrance]), - RegionData(RegionName.quarry_mine_entrance, [Entrance.enter_quarry_mine]), - RegionData(RegionName.quarry_mine), - RegionData(RegionName.secret_woods), - RegionData(RegionName.desert, [Entrance.enter_skull_cavern_entrance, Entrance.enter_oasis, LogicEntrance.attend_desert_festival]), - RegionData(RegionName.oasis, [Entrance.enter_casino]), - RegionData(RegionName.casino), - RegionData(RegionName.skull_cavern_entrance, [Entrance.enter_skull_cavern]), - RegionData(RegionName.skull_cavern, [Entrance.mine_to_skull_cavern_floor_25]), - RegionData(RegionName.skull_cavern_25, [Entrance.mine_to_skull_cavern_floor_50]), - RegionData(RegionName.skull_cavern_50, [Entrance.mine_to_skull_cavern_floor_75]), - RegionData(RegionName.skull_cavern_75, [Entrance.mine_to_skull_cavern_floor_100]), - RegionData(RegionName.skull_cavern_100, [Entrance.mine_to_skull_cavern_floor_125]), - RegionData(RegionName.skull_cavern_125, [Entrance.mine_to_skull_cavern_floor_150]), - RegionData(RegionName.skull_cavern_150, [Entrance.mine_to_skull_cavern_floor_175]), - RegionData(RegionName.skull_cavern_175, [Entrance.mine_to_skull_cavern_floor_200]), - RegionData(RegionName.skull_cavern_200, [Entrance.enter_dangerous_skull_cavern]), - RegionData(RegionName.dangerous_skull_cavern, is_ginger_island=True), - RegionData(RegionName.island_south, - [Entrance.island_south_to_west, Entrance.island_south_to_north, Entrance.island_south_to_east, Entrance.island_south_to_southeast, - Entrance.use_island_resort, Entrance.parrot_express_docks_to_volcano, Entrance.parrot_express_docks_to_dig_site, - Entrance.parrot_express_docks_to_jungle], - is_ginger_island=True), - RegionData(RegionName.island_resort, is_ginger_island=True), - RegionData(RegionName.island_west, - [Entrance.island_west_to_islandfarmhouse, Entrance.island_west_to_gourmand_cave, Entrance.island_west_to_crystals_cave, - Entrance.island_west_to_shipwreck, Entrance.island_west_to_qi_walnut_room, Entrance.use_farm_obelisk, Entrance.parrot_express_jungle_to_docks, - Entrance.parrot_express_jungle_to_dig_site, Entrance.parrot_express_jungle_to_volcano, LogicEntrance.grow_spring_crops_on_island, - LogicEntrance.grow_summer_crops_on_island, LogicEntrance.grow_fall_crops_on_island, LogicEntrance.grow_winter_crops_on_island, - LogicEntrance.grow_indoor_crops_on_island], - is_ginger_island=True), - RegionData(RegionName.island_east, [Entrance.island_east_to_leo_hut, Entrance.island_east_to_island_shrine], is_ginger_island=True), - RegionData(RegionName.island_shrine, is_ginger_island=True), - RegionData(RegionName.island_south_east, [Entrance.island_southeast_to_pirate_cove], is_ginger_island=True), - RegionData(RegionName.island_north, - [Entrance.talk_to_island_trader, Entrance.island_north_to_field_office, Entrance.island_north_to_dig_site, Entrance.island_north_to_volcano, - Entrance.parrot_express_volcano_to_dig_site, Entrance.parrot_express_volcano_to_jungle, Entrance.parrot_express_volcano_to_docks], - is_ginger_island=True), - RegionData(RegionName.volcano, [Entrance.climb_to_volcano_5, Entrance.volcano_to_secret_beach], is_ginger_island=True), - RegionData(RegionName.volcano_secret_beach, is_ginger_island=True), - RegionData(RegionName.volcano_floor_5, [Entrance.talk_to_volcano_dwarf, Entrance.climb_to_volcano_10], is_ginger_island=True), - RegionData(RegionName.volcano_dwarf_shop, is_ginger_island=True), - RegionData(RegionName.volcano_floor_10, is_ginger_island=True), - RegionData(RegionName.island_trader, is_ginger_island=True), - RegionData(RegionName.island_farmhouse, [LogicEntrance.island_cooking], is_ginger_island=True), - RegionData(RegionName.gourmand_frog_cave, is_ginger_island=True), - RegionData(RegionName.colored_crystals_cave, is_ginger_island=True), - RegionData(RegionName.shipwreck, is_ginger_island=True), - RegionData(RegionName.qi_walnut_room, is_ginger_island=True), - RegionData(RegionName.leo_hut, is_ginger_island=True), - RegionData(RegionName.pirate_cove, is_ginger_island=True), - RegionData(RegionName.field_office, is_ginger_island=True), - RegionData(RegionName.dig_site, - [Entrance.dig_site_to_professor_snail_cave, Entrance.parrot_express_dig_site_to_volcano, - Entrance.parrot_express_dig_site_to_docks, Entrance.parrot_express_dig_site_to_jungle], - is_ginger_island=True), - RegionData(RegionName.professor_snail_cave, is_ginger_island=True), - RegionData(RegionName.coop), - RegionData(RegionName.barn), - RegionData(RegionName.shed), - RegionData(RegionName.slime_hutch), - - RegionData(RegionName.mines, [LogicEntrance.talk_to_mines_dwarf, - Entrance.dig_to_mines_floor_5]), - RegionData(RegionName.mines_floor_5, [Entrance.dig_to_mines_floor_10]), - RegionData(RegionName.mines_floor_10, [Entrance.dig_to_mines_floor_15]), - RegionData(RegionName.mines_floor_15, [Entrance.dig_to_mines_floor_20]), - RegionData(RegionName.mines_floor_20, [Entrance.dig_to_mines_floor_25]), - RegionData(RegionName.mines_floor_25, [Entrance.dig_to_mines_floor_30]), - RegionData(RegionName.mines_floor_30, [Entrance.dig_to_mines_floor_35]), - RegionData(RegionName.mines_floor_35, [Entrance.dig_to_mines_floor_40]), - RegionData(RegionName.mines_floor_40, [Entrance.dig_to_mines_floor_45]), - RegionData(RegionName.mines_floor_45, [Entrance.dig_to_mines_floor_50]), - RegionData(RegionName.mines_floor_50, [Entrance.dig_to_mines_floor_55]), - RegionData(RegionName.mines_floor_55, [Entrance.dig_to_mines_floor_60]), - RegionData(RegionName.mines_floor_60, [Entrance.dig_to_mines_floor_65]), - RegionData(RegionName.mines_floor_65, [Entrance.dig_to_mines_floor_70]), - RegionData(RegionName.mines_floor_70, [Entrance.dig_to_mines_floor_75]), - RegionData(RegionName.mines_floor_75, [Entrance.dig_to_mines_floor_80]), - RegionData(RegionName.mines_floor_80, [Entrance.dig_to_mines_floor_85]), - RegionData(RegionName.mines_floor_85, [Entrance.dig_to_mines_floor_90]), - RegionData(RegionName.mines_floor_90, [Entrance.dig_to_mines_floor_95]), - RegionData(RegionName.mines_floor_95, [Entrance.dig_to_mines_floor_100]), - RegionData(RegionName.mines_floor_100, [Entrance.dig_to_mines_floor_105]), - RegionData(RegionName.mines_floor_105, [Entrance.dig_to_mines_floor_110]), - RegionData(RegionName.mines_floor_110, [Entrance.dig_to_mines_floor_115]), - RegionData(RegionName.mines_floor_115, [Entrance.dig_to_mines_floor_120]), - RegionData(RegionName.mines_floor_120, [Entrance.dig_to_dangerous_mines_20, Entrance.dig_to_dangerous_mines_60, Entrance.dig_to_dangerous_mines_100]), - RegionData(RegionName.dangerous_mines_20, is_ginger_island=True), - RegionData(RegionName.dangerous_mines_60, is_ginger_island=True), - RegionData(RegionName.dangerous_mines_100, is_ginger_island=True), - - RegionData(LogicRegion.mines_dwarf_shop), - RegionData(LogicRegion.blacksmith_copper, [LogicEntrance.blacksmith_iron]), - RegionData(LogicRegion.blacksmith_iron, [LogicEntrance.blacksmith_gold]), - RegionData(LogicRegion.blacksmith_gold, [LogicEntrance.blacksmith_iridium]), - RegionData(LogicRegion.blacksmith_iridium), - RegionData(LogicRegion.kitchen), - RegionData(LogicRegion.queen_of_sauce), - RegionData(LogicRegion.fishing), - - RegionData(LogicRegion.spring_farming), - RegionData(LogicRegion.summer_farming, [LogicEntrance.grow_summer_fall_crops_in_summer]), - RegionData(LogicRegion.fall_farming, [LogicEntrance.grow_summer_fall_crops_in_fall]), - RegionData(LogicRegion.winter_farming), - RegionData(LogicRegion.summer_or_fall_farming), - RegionData(LogicRegion.indoor_farming), - - RegionData(LogicRegion.shipping), - RegionData(LogicRegion.traveling_cart, [LogicEntrance.buy_from_traveling_merchant_sunday, - LogicEntrance.buy_from_traveling_merchant_monday, - LogicEntrance.buy_from_traveling_merchant_tuesday, - LogicEntrance.buy_from_traveling_merchant_wednesday, - LogicEntrance.buy_from_traveling_merchant_thursday, - LogicEntrance.buy_from_traveling_merchant_friday, - LogicEntrance.buy_from_traveling_merchant_saturday]), - RegionData(LogicRegion.traveling_cart_sunday), - RegionData(LogicRegion.traveling_cart_monday), - RegionData(LogicRegion.traveling_cart_tuesday), - RegionData(LogicRegion.traveling_cart_wednesday), - RegionData(LogicRegion.traveling_cart_thursday), - RegionData(LogicRegion.traveling_cart_friday), - RegionData(LogicRegion.traveling_cart_saturday), - RegionData(LogicRegion.raccoon_daddy, [LogicEntrance.buy_from_raccoon]), - RegionData(LogicRegion.raccoon_shop), - - RegionData(LogicRegion.egg_festival), - RegionData(LogicRegion.desert_festival), - RegionData(LogicRegion.flower_dance), - RegionData(LogicRegion.luau), - RegionData(LogicRegion.trout_derby), - RegionData(LogicRegion.moonlight_jellies), - RegionData(LogicRegion.fair), - RegionData(LogicRegion.spirit_eve), - RegionData(LogicRegion.festival_of_ice), - RegionData(LogicRegion.night_market), - RegionData(LogicRegion.winter_star), - RegionData(LogicRegion.squidfest), - RegionData(LogicRegion.bookseller_1, [LogicEntrance.buy_year1_books]), - RegionData(LogicRegion.bookseller_2, [LogicEntrance.buy_year3_books]), - RegionData(LogicRegion.bookseller_3), -] - -# Exists and where they lead -vanilla_connections = [ - ConnectionData(Entrance.to_stardew_valley, RegionName.stardew_valley), - ConnectionData(Entrance.to_farmhouse, RegionName.farm_house), - ConnectionData(Entrance.farmhouse_to_farm, RegionName.farm), - ConnectionData(Entrance.downstairs_to_cellar, RegionName.cellar), - ConnectionData(Entrance.farm_to_backwoods, RegionName.backwoods), - ConnectionData(Entrance.farm_to_bus_stop, RegionName.bus_stop), - ConnectionData(Entrance.farm_to_forest, RegionName.forest), - ConnectionData(Entrance.farm_to_farmcave, RegionName.farm_cave, flag=RandomizationFlag.NON_PROGRESSION), - ConnectionData(Entrance.enter_greenhouse, RegionName.greenhouse), - ConnectionData(Entrance.enter_coop, RegionName.coop), - ConnectionData(Entrance.enter_barn, RegionName.barn), - ConnectionData(Entrance.enter_shed, RegionName.shed), - ConnectionData(Entrance.enter_slime_hutch, RegionName.slime_hutch), - ConnectionData(Entrance.use_desert_obelisk, RegionName.desert), - ConnectionData(Entrance.use_island_obelisk, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.use_farm_obelisk, RegionName.farm), - ConnectionData(Entrance.backwoods_to_mountain, RegionName.mountain), - ConnectionData(Entrance.bus_stop_to_town, RegionName.town), - ConnectionData(Entrance.bus_stop_to_tunnel_entrance, RegionName.tunnel_entrance), - ConnectionData(Entrance.tunnel_entrance_to_bus_tunnel, RegionName.bus_tunnel, flag=RandomizationFlag.NON_PROGRESSION), - ConnectionData(Entrance.take_bus_to_desert, RegionName.desert), - ConnectionData(Entrance.forest_to_town, RegionName.town), - ConnectionData(Entrance.forest_to_wizard_tower, RegionName.wizard_tower, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.forest_to_marnie_ranch, RegionName.ranch, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.forest_to_leah_cottage, RegionName.leah_house, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_secret_woods, RegionName.secret_woods), - ConnectionData(Entrance.forest_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.forest_to_mastery_cave, RegionName.mastery_cave, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.MASTERIES), - ConnectionData(Entrance.town_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_mutant_bug_lair, RegionName.mutant_bug_lair, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.mountain_to_railroad, RegionName.railroad), - ConnectionData(Entrance.mountain_to_tent, RegionName.tent, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.mountain_to_leo_treehouse, RegionName.leo_treehouse, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.mountain_to_carpenter_shop, RegionName.carpenter, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.mountain_to_maru_room, RegionName.maru_room, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_sebastian_room, RegionName.sebastian_room, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.mountain_to_adventurer_guild, RegionName.adventurer_guild, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.adventurer_guild_to_bedroom, RegionName.adventurer_guild_bedroom), - ConnectionData(Entrance.enter_quarry, RegionName.quarry), - ConnectionData(Entrance.enter_quarry_mine_entrance, RegionName.quarry_mine_entrance, - flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_quarry_mine, RegionName.quarry_mine), - ConnectionData(Entrance.mountain_to_town, RegionName.town), - ConnectionData(Entrance.town_to_community_center, RegionName.community_center, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.access_crafts_room, RegionName.crafts_room), - ConnectionData(Entrance.access_pantry, RegionName.pantry), - ConnectionData(Entrance.access_fish_tank, RegionName.fish_tank), - ConnectionData(Entrance.access_boiler_room, RegionName.boiler_room), - ConnectionData(Entrance.access_bulletin_board, RegionName.bulletin_board), - ConnectionData(Entrance.access_vault, RegionName.vault), - ConnectionData(Entrance.town_to_hospital, RegionName.hospital, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_harvey_room, RegionName.harvey_room, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.town_to_pierre_general_store, RegionName.pierre_store, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_sunroom, RegionName.sunroom, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.town_to_clint_blacksmith, RegionName.blacksmith, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_saloon, RegionName.saloon, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.play_journey_of_the_prairie_king, RegionName.jotpk_world_1), - ConnectionData(Entrance.reach_jotpk_world_2, RegionName.jotpk_world_2), - ConnectionData(Entrance.reach_jotpk_world_3, RegionName.jotpk_world_3), - ConnectionData(Entrance.play_junimo_kart, RegionName.junimo_kart_1), - ConnectionData(Entrance.reach_junimo_kart_2, RegionName.junimo_kart_2), - ConnectionData(Entrance.reach_junimo_kart_3, RegionName.junimo_kart_3), - ConnectionData(Entrance.reach_junimo_kart_4, RegionName.junimo_kart_4), - ConnectionData(Entrance.town_to_sam_house, RegionName.sam_house, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_haley_house, RegionName.haley_house, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_mayor_manor, RegionName.mayor_house, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_alex_house, RegionName.alex_house, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_trailer, RegionName.trailer, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_museum, RegionName.museum, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.town_to_jojamart, RegionName.jojamart, - flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.purchase_movie_ticket, RegionName.movie_ticket_stand), - ConnectionData(Entrance.enter_abandoned_jojamart, RegionName.abandoned_jojamart), - ConnectionData(Entrance.enter_movie_theater, RegionName.movie_theater), - ConnectionData(Entrance.town_to_beach, RegionName.beach), - ConnectionData(Entrance.enter_elliott_house, RegionName.elliott_house, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.beach_to_willy_fish_shop, RegionName.fish_shop, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.fish_shop_to_boat_tunnel, RegionName.boat_tunnel, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.boat_to_ginger_island, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.enter_tide_pools, RegionName.tide_pools), - ConnectionData(Entrance.mountain_to_the_mines, RegionName.mines, - flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.dig_to_mines_floor_5, RegionName.mines_floor_5), - ConnectionData(Entrance.dig_to_mines_floor_10, RegionName.mines_floor_10), - ConnectionData(Entrance.dig_to_mines_floor_15, RegionName.mines_floor_15), - ConnectionData(Entrance.dig_to_mines_floor_20, RegionName.mines_floor_20), - ConnectionData(Entrance.dig_to_mines_floor_25, RegionName.mines_floor_25), - ConnectionData(Entrance.dig_to_mines_floor_30, RegionName.mines_floor_30), - ConnectionData(Entrance.dig_to_mines_floor_35, RegionName.mines_floor_35), - ConnectionData(Entrance.dig_to_mines_floor_40, RegionName.mines_floor_40), - ConnectionData(Entrance.dig_to_mines_floor_45, RegionName.mines_floor_45), - ConnectionData(Entrance.dig_to_mines_floor_50, RegionName.mines_floor_50), - ConnectionData(Entrance.dig_to_mines_floor_55, RegionName.mines_floor_55), - ConnectionData(Entrance.dig_to_mines_floor_60, RegionName.mines_floor_60), - ConnectionData(Entrance.dig_to_mines_floor_65, RegionName.mines_floor_65), - ConnectionData(Entrance.dig_to_mines_floor_70, RegionName.mines_floor_70), - ConnectionData(Entrance.dig_to_mines_floor_75, RegionName.mines_floor_75), - ConnectionData(Entrance.dig_to_mines_floor_80, RegionName.mines_floor_80), - ConnectionData(Entrance.dig_to_mines_floor_85, RegionName.mines_floor_85), - ConnectionData(Entrance.dig_to_mines_floor_90, RegionName.mines_floor_90), - ConnectionData(Entrance.dig_to_mines_floor_95, RegionName.mines_floor_95), - ConnectionData(Entrance.dig_to_mines_floor_100, RegionName.mines_floor_100), - ConnectionData(Entrance.dig_to_mines_floor_105, RegionName.mines_floor_105), - ConnectionData(Entrance.dig_to_mines_floor_110, RegionName.mines_floor_110), - ConnectionData(Entrance.dig_to_mines_floor_115, RegionName.mines_floor_115), - ConnectionData(Entrance.dig_to_mines_floor_120, RegionName.mines_floor_120), - ConnectionData(Entrance.dig_to_dangerous_mines_20, RegionName.dangerous_mines_20, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.dig_to_dangerous_mines_60, RegionName.dangerous_mines_60, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.dig_to_dangerous_mines_100, RegionName.dangerous_mines_100, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.enter_skull_cavern_entrance, RegionName.skull_cavern_entrance, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_oasis, RegionName.oasis, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_casino, RegionName.casino, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_skull_cavern, RegionName.skull_cavern), - ConnectionData(Entrance.mine_to_skull_cavern_floor_25, RegionName.skull_cavern_25), - ConnectionData(Entrance.mine_to_skull_cavern_floor_50, RegionName.skull_cavern_50), - ConnectionData(Entrance.mine_to_skull_cavern_floor_75, RegionName.skull_cavern_75), - ConnectionData(Entrance.mine_to_skull_cavern_floor_100, RegionName.skull_cavern_100), - ConnectionData(Entrance.mine_to_skull_cavern_floor_125, RegionName.skull_cavern_125), - ConnectionData(Entrance.mine_to_skull_cavern_floor_150, RegionName.skull_cavern_150), - ConnectionData(Entrance.mine_to_skull_cavern_floor_175, RegionName.skull_cavern_175), - ConnectionData(Entrance.mine_to_skull_cavern_floor_200, RegionName.skull_cavern_200), - ConnectionData(Entrance.enter_dangerous_skull_cavern, RegionName.dangerous_skull_cavern, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.enter_witch_warp_cave, RegionName.witch_warp_cave, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_witch_swamp, RegionName.witch_swamp, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_witch_hut, RegionName.witch_hut, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.witch_warp_to_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_bathhouse_entrance, RegionName.bathhouse_entrance, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), - ConnectionData(Entrance.enter_locker_room, RegionName.locker_room, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.enter_public_bath, RegionName.public_bath, flag=RandomizationFlag.BUILDINGS), - ConnectionData(Entrance.island_south_to_west, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_south_to_north, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_south_to_east, RegionName.island_east, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_south_to_southeast, RegionName.island_south_east, - flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.use_island_resort, RegionName.island_resort, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_islandfarmhouse, RegionName.island_farmhouse, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_gourmand_cave, RegionName.gourmand_frog_cave, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_crystals_cave, RegionName.colored_crystals_cave, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_shipwreck, RegionName.shipwreck, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_west_to_qi_walnut_room, RegionName.qi_walnut_room, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_east_to_leo_hut, RegionName.leo_hut, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_east_to_island_shrine, RegionName.island_shrine, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_southeast_to_pirate_cove, RegionName.pirate_cove, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_north_to_field_office, RegionName.field_office, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_north_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.dig_site_to_professor_snail_cave, RegionName.professor_snail_cave, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.island_north_to_volcano, RegionName.volcano, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.volcano_to_secret_beach, RegionName.volcano_secret_beach, - flag=RandomizationFlag.BUILDINGS | RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.talk_to_island_trader, RegionName.island_trader, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.climb_to_volcano_5, RegionName.volcano_floor_5, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.talk_to_volcano_dwarf, RegionName.volcano_dwarf_shop, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.climb_to_volcano_10, RegionName.volcano_floor_10, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_jungle_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_dig_site_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_volcano_to_docks, RegionName.island_south, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_volcano_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_docks_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_dig_site_to_jungle, RegionName.island_west, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_docks_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_volcano_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_jungle_to_dig_site, RegionName.dig_site, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_dig_site_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_docks_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(Entrance.parrot_express_jungle_to_volcano, RegionName.island_north, flag=RandomizationFlag.GINGER_ISLAND), - - ConnectionData(LogicEntrance.talk_to_mines_dwarf, LogicRegion.mines_dwarf_shop), - - ConnectionData(LogicEntrance.buy_from_traveling_merchant, LogicRegion.traveling_cart), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_sunday, LogicRegion.traveling_cart_sunday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_monday, LogicRegion.traveling_cart_monday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_tuesday, LogicRegion.traveling_cart_tuesday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_wednesday, LogicRegion.traveling_cart_wednesday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_thursday, LogicRegion.traveling_cart_thursday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_friday, LogicRegion.traveling_cart_friday), - ConnectionData(LogicEntrance.buy_from_traveling_merchant_saturday, LogicRegion.traveling_cart_saturday), - ConnectionData(LogicEntrance.complete_raccoon_requests, LogicRegion.raccoon_daddy), - ConnectionData(LogicEntrance.fish_in_waterfall, LogicRegion.forest_waterfall), - ConnectionData(LogicEntrance.buy_from_raccoon, LogicRegion.raccoon_shop), - ConnectionData(LogicEntrance.farmhouse_cooking, LogicRegion.kitchen), - ConnectionData(LogicEntrance.watch_queen_of_sauce, LogicRegion.queen_of_sauce), - - ConnectionData(LogicEntrance.grow_spring_crops, LogicRegion.spring_farming), - ConnectionData(LogicEntrance.grow_summer_crops, LogicRegion.summer_farming), - ConnectionData(LogicEntrance.grow_fall_crops, LogicRegion.fall_farming), - ConnectionData(LogicEntrance.grow_winter_crops, LogicRegion.winter_farming), - ConnectionData(LogicEntrance.grow_spring_crops_in_greenhouse, LogicRegion.spring_farming), - ConnectionData(LogicEntrance.grow_summer_crops_in_greenhouse, LogicRegion.summer_farming), - ConnectionData(LogicEntrance.grow_fall_crops_in_greenhouse, LogicRegion.fall_farming), - ConnectionData(LogicEntrance.grow_winter_crops_in_greenhouse, LogicRegion.winter_farming), - ConnectionData(LogicEntrance.grow_indoor_crops_in_greenhouse, LogicRegion.indoor_farming), - ConnectionData(LogicEntrance.grow_spring_crops_on_island, LogicRegion.spring_farming, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(LogicEntrance.grow_summer_crops_on_island, LogicRegion.summer_farming, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(LogicEntrance.grow_fall_crops_on_island, LogicRegion.fall_farming, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(LogicEntrance.grow_winter_crops_on_island, LogicRegion.winter_farming, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(LogicEntrance.grow_indoor_crops_on_island, LogicRegion.indoor_farming, flag=RandomizationFlag.GINGER_ISLAND), - ConnectionData(LogicEntrance.grow_summer_fall_crops_in_summer, LogicRegion.summer_or_fall_farming), - ConnectionData(LogicEntrance.grow_summer_fall_crops_in_fall, LogicRegion.summer_or_fall_farming), - - ConnectionData(LogicEntrance.shipping, LogicRegion.shipping), - ConnectionData(LogicEntrance.blacksmith_copper, LogicRegion.blacksmith_copper), - ConnectionData(LogicEntrance.blacksmith_iron, LogicRegion.blacksmith_iron), - ConnectionData(LogicEntrance.blacksmith_gold, LogicRegion.blacksmith_gold), - ConnectionData(LogicEntrance.blacksmith_iridium, LogicRegion.blacksmith_iridium), - ConnectionData(LogicEntrance.fishing, LogicRegion.fishing), - ConnectionData(LogicEntrance.island_cooking, LogicRegion.kitchen), - ConnectionData(LogicEntrance.attend_egg_festival, LogicRegion.egg_festival), - ConnectionData(LogicEntrance.attend_desert_festival, LogicRegion.desert_festival), - ConnectionData(LogicEntrance.attend_flower_dance, LogicRegion.flower_dance), - ConnectionData(LogicEntrance.attend_luau, LogicRegion.luau), - ConnectionData(LogicEntrance.attend_trout_derby, LogicRegion.trout_derby), - ConnectionData(LogicEntrance.attend_moonlight_jellies, LogicRegion.moonlight_jellies), - ConnectionData(LogicEntrance.attend_fair, LogicRegion.fair), - ConnectionData(LogicEntrance.attend_spirit_eve, LogicRegion.spirit_eve), - ConnectionData(LogicEntrance.attend_festival_of_ice, LogicRegion.festival_of_ice), - ConnectionData(LogicEntrance.attend_night_market, LogicRegion.night_market), - ConnectionData(LogicEntrance.attend_winter_star, LogicRegion.winter_star), - ConnectionData(LogicEntrance.attend_squidfest, LogicRegion.squidfest), - ConnectionData(LogicEntrance.buy_experience_books, LogicRegion.bookseller_1), - ConnectionData(LogicEntrance.buy_year1_books, LogicRegion.bookseller_2), - ConnectionData(LogicEntrance.buy_year3_books, LogicRegion.bookseller_3), -] - - -def create_final_regions(world_options) -> List[RegionData]: - final_regions = [] - final_regions.extend(vanilla_regions) - if world_options.mods is None: - return final_regions - for mod in sorted(world_options.mods.value): - if mod not in ModDataList: - continue - for mod_region in ModDataList[mod].regions: - existing_region = next( - (region for region in final_regions if region.name == mod_region.name), None) - if existing_region: - final_regions.remove(existing_region) - if ModificationFlag.MODIFIED in mod_region.flag: - mod_region = modify_vanilla_regions(existing_region, mod_region) - final_regions.append(existing_region.get_merged_with(mod_region.exits)) - continue - final_regions.append(mod_region.get_clone()) - - return final_regions - - -def create_final_connections_and_regions(world_options) -> Tuple[Dict[str, ConnectionData], Dict[str, RegionData]]: - regions_data: Dict[str, RegionData] = {region.name: region for region in create_final_regions(world_options)} - connections = {connection.name: connection for connection in vanilla_connections} - connections = modify_connections_for_mods(connections, sorted(world_options.mods.value)) - include_island = world_options.exclude_ginger_island == ExcludeGingerIsland.option_false - return remove_ginger_island_regions_and_connections(regions_data, connections, include_island) - - -def remove_ginger_island_regions_and_connections(regions_by_name: Dict[str, RegionData], connections: Dict[str, ConnectionData], include_island: bool): - if include_island: - return connections, regions_by_name - - removed_connections = set() - - for connection_name in tuple(connections): - connection = connections[connection_name] - if connection.flag & RandomizationFlag.GINGER_ISLAND: - connections.pop(connection_name) - removed_connections.add(connection_name) - - for region_name in tuple(regions_by_name): - region = regions_by_name[region_name] - if region.is_ginger_island: - regions_by_name.pop(region_name) - else: - regions_by_name[region_name] = region.get_without_exits(removed_connections) - - return connections, regions_by_name - - -def modify_connections_for_mods(connections: Dict[str, ConnectionData], mods: Iterable) -> Dict[str, ConnectionData]: - for mod in mods: - if mod not in ModDataList: - continue - if mod in vanilla_connections_to_remove_by_mod: - for connection_data in vanilla_connections_to_remove_by_mod[mod]: - connections.pop(connection_data.name) - connections.update({connection.name: connection for connection in ModDataList[mod].connections}) - return connections - - -def modify_vanilla_regions(existing_region: RegionData, modified_region: RegionData) -> RegionData: - updated_region = existing_region - region_exits = updated_region.exits - modified_exits = modified_region.exits - for exits in modified_exits: - region_exits.remove(exits) - - return updated_region - - -def create_regions(region_factory: RegionFactory, random: Random, world_options: StardewValleyOptions, content: StardewContent) \ - -> Tuple[Dict[str, Region], Dict[str, Entrance], Dict[str, str]]: - entrances_data, regions_data = create_final_connections_and_regions(world_options) - regions_by_name: Dict[str: Region] = {region_name: region_factory(region_name, regions_data[region_name].exits) for region_name in regions_data} - entrances_by_name: Dict[str: Entrance] = { - entrance.name: entrance - for region in regions_by_name.values() - for entrance in region.exits - if entrance.name in entrances_data - } - - connections, randomized_data = randomize_connections(random, world_options, content, regions_data, entrances_data) - - for connection in connections: - if connection.name in entrances_by_name: - entrances_by_name[connection.name].connect(regions_by_name[connection.destination]) - return regions_by_name, entrances_by_name, randomized_data - - -def randomize_connections(random: Random, world_options: StardewValleyOptions, content: StardewContent, regions_by_name: Dict[str, RegionData], - connections_by_name: Dict[str, ConnectionData]) -> Tuple[List[ConnectionData], Dict[str, str]]: - connections_to_randomize: List[ConnectionData] = [] - if world_options.entrance_randomization == EntranceRandomization.option_pelican_town: - connections_to_randomize = [connections_by_name[connection] for connection in connections_by_name if - RandomizationFlag.PELICAN_TOWN in connections_by_name[connection].flag] - elif world_options.entrance_randomization == EntranceRandomization.option_non_progression: - connections_to_randomize = [connections_by_name[connection] for connection in connections_by_name if - RandomizationFlag.NON_PROGRESSION in connections_by_name[connection].flag] - elif world_options.entrance_randomization == EntranceRandomization.option_buildings or world_options.entrance_randomization == EntranceRandomization.option_buildings_without_house: - connections_to_randomize = [connections_by_name[connection] for connection in connections_by_name if - RandomizationFlag.BUILDINGS in connections_by_name[connection].flag] - elif world_options.entrance_randomization == EntranceRandomization.option_chaos: - connections_to_randomize = [connections_by_name[connection] for connection in connections_by_name if - RandomizationFlag.BUILDINGS in connections_by_name[connection].flag] - connections_to_randomize = remove_excluded_entrances(connections_to_randomize, content) - - # On Chaos, we just add the connections to randomize, unshuffled, and the client does it every day - randomized_data_for_mod = {} - for connection in connections_to_randomize: - randomized_data_for_mod[connection.name] = connection.name - randomized_data_for_mod[connection.reverse] = connection.reverse - return list(connections_by_name.values()), randomized_data_for_mod - - connections_to_randomize = remove_excluded_entrances(connections_to_randomize, content) - random.shuffle(connections_to_randomize) - destination_pool = list(connections_to_randomize) - random.shuffle(destination_pool) - - randomized_connections = randomize_chosen_connections(connections_to_randomize, destination_pool) - add_non_randomized_connections(list(connections_by_name.values()), connections_to_randomize, randomized_connections) - - swap_connections_until_valid(regions_by_name, connections_by_name, randomized_connections, connections_to_randomize, random) - randomized_connections_for_generation = create_connections_for_generation(randomized_connections) - randomized_data_for_mod = create_data_for_mod(randomized_connections, connections_to_randomize) - - return randomized_connections_for_generation, randomized_data_for_mod - - -def remove_excluded_entrances(connections_to_randomize: List[ConnectionData], content: StardewContent) -> List[ConnectionData]: - # FIXME remove when regions are handled in content packs - if content_packs.ginger_island_content_pack.name not in content.registered_packs: - connections_to_randomize = [connection for connection in connections_to_randomize if RandomizationFlag.GINGER_ISLAND not in connection.flag] - if not content.features.skill_progression.are_masteries_shuffled: - connections_to_randomize = [connection for connection in connections_to_randomize if RandomizationFlag.MASTERIES not in connection.flag] - - return connections_to_randomize - - -def randomize_chosen_connections(connections_to_randomize: List[ConnectionData], - destination_pool: List[ConnectionData]) -> Dict[ConnectionData, ConnectionData]: - randomized_connections = {} - for connection in connections_to_randomize: - destination = destination_pool.pop() - randomized_connections[connection] = destination - return randomized_connections - - -def create_connections_for_generation(randomized_connections: Dict[ConnectionData, ConnectionData]) -> List[ConnectionData]: - connections = [] - for connection in randomized_connections: - destination = randomized_connections[connection] - connections.append(ConnectionData(connection.name, destination.destination, destination.reverse)) - return connections - - -def create_data_for_mod(randomized_connections: Dict[ConnectionData, ConnectionData], - connections_to_randomize: List[ConnectionData]) -> Dict[str, str]: - randomized_data_for_mod = {} - for connection in randomized_connections: - if connection not in connections_to_randomize: - continue - destination = randomized_connections[connection] - add_to_mod_data(connection, destination, randomized_data_for_mod) - return randomized_data_for_mod - - -def add_to_mod_data(connection: ConnectionData, destination: ConnectionData, randomized_data_for_mod: Dict[str, str]): - randomized_data_for_mod[connection.name] = destination.name - randomized_data_for_mod[destination.reverse] = connection.reverse - - -def add_non_randomized_connections(all_connections: List[ConnectionData], connections_to_randomize: List[ConnectionData], - randomized_connections: Dict[ConnectionData, ConnectionData]): - for connection in all_connections: - if connection in connections_to_randomize: - continue - randomized_connections[connection] = connection - - -def swap_connections_until_valid(regions_by_name, connections_by_name: Dict[str, ConnectionData], randomized_connections: Dict[ConnectionData, ConnectionData], - connections_to_randomize: List[ConnectionData], random: Random): - while True: - reachable_regions, unreachable_regions = find_reachable_regions(regions_by_name, connections_by_name, randomized_connections) - if not unreachable_regions: - return randomized_connections - swap_one_random_connection(regions_by_name, connections_by_name, randomized_connections, reachable_regions, - unreachable_regions, connections_to_randomize, random) - - -def region_should_be_reachable(region_name: str, connections_in_slot: Iterable[ConnectionData]) -> bool: - if region_name == RegionName.menu: - return True - for connection in connections_in_slot: - if region_name == connection.destination: - return True - return False - - -def find_reachable_regions(regions_by_name, connections_by_name, - randomized_connections: Dict[ConnectionData, ConnectionData]): - reachable_regions = {RegionName.menu} - unreachable_regions = {region for region in regions_by_name.keys()} - # unreachable_regions = {region for region in regions_by_name.keys() if region_should_be_reachable(region, connections_by_name.values())} - unreachable_regions.remove(RegionName.menu) - exits_to_explore = list(regions_by_name[RegionName.menu].exits) - while exits_to_explore: - exit_name = exits_to_explore.pop() - # if exit_name not in connections_by_name: - # continue - exit_connection = connections_by_name[exit_name] - replaced_connection = randomized_connections[exit_connection] - target_region_name = replaced_connection.destination - if target_region_name in reachable_regions: - continue - - target_region = regions_by_name[target_region_name] - reachable_regions.add(target_region_name) - unreachable_regions.remove(target_region_name) - exits_to_explore.extend(target_region.exits) - return reachable_regions, unreachable_regions - - -def swap_one_random_connection(regions_by_name, connections_by_name, randomized_connections: Dict[ConnectionData, ConnectionData], - reachable_regions: Set[str], unreachable_regions: Set[str], - connections_to_randomize: List[ConnectionData], random: Random): - randomized_connections_already_shuffled = {connection: randomized_connections[connection] - for connection in randomized_connections - if connection != randomized_connections[connection]} - unreachable_regions_names_leading_somewhere = [region for region in sorted(unreachable_regions) if len(regions_by_name[region].exits) > 0] - unreachable_regions_leading_somewhere = [regions_by_name[region_name] for region_name in unreachable_regions_names_leading_somewhere] - unreachable_regions_exits_names = [exit_name for region in unreachable_regions_leading_somewhere for exit_name in region.exits] - unreachable_connections = [connections_by_name[exit_name] for exit_name in unreachable_regions_exits_names] - unreachable_connections_that_can_be_randomized = [connection for connection in unreachable_connections if connection in connections_to_randomize] - - chosen_unreachable_entrance = random.choice(unreachable_connections_that_can_be_randomized) - - chosen_reachable_entrance = None - while chosen_reachable_entrance is None or chosen_reachable_entrance not in randomized_connections_already_shuffled: - chosen_reachable_region_name = random.choice(sorted(reachable_regions)) - chosen_reachable_region = regions_by_name[chosen_reachable_region_name] - if not any(chosen_reachable_region.exits): - continue - chosen_reachable_entrance_name = random.choice(chosen_reachable_region.exits) - chosen_reachable_entrance = connections_by_name[chosen_reachable_entrance_name] - - swap_two_connections(chosen_reachable_entrance, chosen_unreachable_entrance, randomized_connections) - - -def swap_two_connections(entrance_1, entrance_2, randomized_connections): - reachable_destination = randomized_connections[entrance_1] - unreachable_destination = randomized_connections[entrance_2] - randomized_connections[entrance_1] = unreachable_destination - randomized_connections[entrance_2] = reachable_destination diff --git a/worlds/stardew_valley/regions/__init__.py b/worlds/stardew_valley/regions/__init__.py new file mode 100644 index 0000000000..63e8afc2fb --- /dev/null +++ b/worlds/stardew_valley/regions/__init__.py @@ -0,0 +1,2 @@ +from .entrance_rando import prepare_mod_data +from .regions import create_regions, RegionFactory diff --git a/worlds/stardew_valley/regions/entrance_rando.py b/worlds/stardew_valley/regions/entrance_rando.py new file mode 100644 index 0000000000..7aa91685e8 --- /dev/null +++ b/worlds/stardew_valley/regions/entrance_rando.py @@ -0,0 +1,73 @@ +from BaseClasses import Region +from entrance_rando import ERPlacementState +from .model import ConnectionData, RandomizationFlag, reverse_connection_name, RegionData +from ..content import StardewContent +from ..options import EntranceRandomization + + +def create_player_randomization_flag(entrance_randomization_choice: EntranceRandomization, content: StardewContent): + """Return the flag that a connection is expected to have to be randomized. Only the bit corresponding to the player randomization choice will be enabled. + + Other bits for content exclusion might also be enabled, tho the preferred solution to exclude content should be to not create those regions at alls, when possible. + """ + flag = RandomizationFlag.NOT_RANDOMIZED + + if entrance_randomization_choice.value == EntranceRandomization.option_disabled: + return flag + + if entrance_randomization_choice == EntranceRandomization.option_pelican_town: + flag |= RandomizationFlag.BIT_PELICAN_TOWN + elif entrance_randomization_choice == EntranceRandomization.option_non_progression: + flag |= RandomizationFlag.BIT_NON_PROGRESSION + elif entrance_randomization_choice in ( + EntranceRandomization.option_buildings, + EntranceRandomization.option_buildings_without_house, + EntranceRandomization.option_chaos + ): + flag |= RandomizationFlag.BIT_BUILDINGS + + if not content.features.skill_progression.are_masteries_shuffled: + flag |= RandomizationFlag.EXCLUDE_MASTERIES + + return flag + + +def connect_regions(region_data_by_name: dict[str, RegionData], connection_data_by_name: dict[str, ConnectionData], regions_by_name: dict[str, Region], + player_randomization_flag: RandomizationFlag) -> None: + for region_name, region_data in region_data_by_name.items(): + origin_region = regions_by_name[region_name] + + for exit_name in region_data.exits: + connection_data = connection_data_by_name[exit_name] + destination_region = regions_by_name[connection_data.destination] + + if connection_data.is_eligible_for_randomization(player_randomization_flag): + create_entrance_rando_target(origin_region, destination_region, connection_data) + else: + origin_region.connect(destination_region, connection_data.name) + + +def create_entrance_rando_target(origin: Region, destination: Region, connection_data: ConnectionData) -> None: + """We need our own function to create the GER targets, because the Stardew Mod have very specific expectations for the name of the entrances. + We need to know exactly which entrances to swap in both directions.""" + origin.create_exit(connection_data.name) + destination.create_er_target(connection_data.reverse) + + +def prepare_mod_data(placements: ERPlacementState) -> dict[str, str]: + """Take the placements from GER and prepare the data for the mod. + The mod require a dictionary detailing which connections need to be swapped. It acts as if the connections are decoupled, so both directions are required. + + For instance, GER will provide placements like (Town to Community Center, Hospital to Town), meaning that the door of the Community Center will instead lead + to the Hospital, and that the exit of the Hospital will lead to the Town by the Community Center door. The StardewAP mod need to know both swaps, being the + original destination of the "Town to Community Center" connection is to be replaced by the original destination of "Town to Hospital", and the original + destination of "Hospital to Town" is to be replaced by the original destination of "Community Center to Town". + """ + + swapped_connections = {} + + for entrance, exit_ in placements.pairings: + swapped_connections[entrance] = reverse_connection_name(exit_) + swapped_connections[exit_] = reverse_connection_name(entrance) + + return swapped_connections diff --git a/worlds/stardew_valley/regions/model.py b/worlds/stardew_valley/regions/model.py new file mode 100644 index 0000000000..07c3901558 --- /dev/null +++ b/worlds/stardew_valley/regions/model.py @@ -0,0 +1,94 @@ +from __future__ import annotations + +from collections.abc import Container +from dataclasses import dataclass, field +from enum import IntFlag + +connector_keyword = " to " + + +def reverse_connection_name(name: str) -> str | None: + try: + origin, destination = name.split(connector_keyword) + except ValueError: + return None + return f"{destination}{connector_keyword}{origin}" + + +class MergeFlag(IntFlag): + ADD_EXITS = 0 + REMOVE_EXITS = 1 + + +class RandomizationFlag(IntFlag): + NOT_RANDOMIZED = 0 + + # Randomization options + # The first 4 bits are used to mark if an entrance is eligible for randomization according to the entrance randomization options. + BIT_PELICAN_TOWN = 1 # 0b0001 + BIT_NON_PROGRESSION = 1 << 1 # 0b0010 + BIT_BUILDINGS = 1 << 2 # 0b0100 + BIT_EVERYTHING = 1 << 3 # 0b1000 + + # Content flag for entrances exclusions + # The next 2 bits are used to mark if an entrance is to be excluded from randomization according to the content options. + # Those bits must be removed from an entrance flags when then entrance must be excluded. + __UNUSED = 1 << 4 # 0b010000 + EXCLUDE_MASTERIES = 1 << 5 # 0b100000 + + # Entrance groups + # The last bit is used to add additional qualifiers on entrances to group them + # Those bits should be added when an entrance need additional qualifiers. + LEAD_TO_OPEN_AREA = 1 << 6 + + # Tags to apply on connections + EVERYTHING = EXCLUDE_MASTERIES | BIT_EVERYTHING + BUILDINGS = EVERYTHING | BIT_BUILDINGS + NON_PROGRESSION = BUILDINGS | BIT_NON_PROGRESSION + PELICAN_TOWN = NON_PROGRESSION | BIT_PELICAN_TOWN + + +@dataclass(frozen=True) +class RegionData: + name: str + exits: tuple[str, ...] = field(default_factory=tuple) + flag: MergeFlag = MergeFlag.ADD_EXITS + + def __post_init__(self): + assert not isinstance(self.exits, str), "Exits must be a tuple of strings, you probably forgot a trailing comma." + + def merge_with(self, other: RegionData) -> RegionData: + assert self.name == other.name, "Regions must have the same name to be merged" + + if other.flag == MergeFlag.REMOVE_EXITS: + return self.get_without_exits(other.exits) + + merged_exits = self.exits + other.exits + assert len(merged_exits) == len(set(merged_exits)), "Two regions getting merged have duplicated exists..." + + return RegionData(self.name, merged_exits) + + def get_without_exits(self, exits_to_remove: Container[str]) -> RegionData: + exits = tuple(exit_ for exit_ in self.exits if exit_ not in exits_to_remove) + return RegionData(self.name, exits) + + +@dataclass(frozen=True) +class ConnectionData: + name: str + destination: str + flag: RandomizationFlag = RandomizationFlag.NOT_RANDOMIZED + + @property + def reverse(self) -> str | None: + return reverse_connection_name(self.name) + + def is_eligible_for_randomization(self, chosen_randomization_flag: RandomizationFlag) -> bool: + return chosen_randomization_flag and chosen_randomization_flag in self.flag + + +@dataclass(frozen=True) +class ModRegionsData: + mod_name: str + regions: list[RegionData] + connections: list[ConnectionData] diff --git a/worlds/stardew_valley/regions/mods.py b/worlds/stardew_valley/regions/mods.py new file mode 100644 index 0000000000..fca54619f5 --- /dev/null +++ b/worlds/stardew_valley/regions/mods.py @@ -0,0 +1,46 @@ +from collections.abc import Iterable + +from .model import ConnectionData, RegionData, ModRegionsData +from ..mods.region_data import region_data_by_content_pack, vanilla_connections_to_remove_by_content_pack + + +def modify_regions_for_mods(current_regions_by_name: dict[str, RegionData], active_content_packs: Iterable[str]) -> None: + for content_pack in active_content_packs: + try: + region_data = region_data_by_content_pack[content_pack] + except KeyError: + continue + + merge_mod_regions(current_regions_by_name, region_data) + + +def merge_mod_regions(current_regions_by_name: dict[str, RegionData], mod_region_data: ModRegionsData) -> None: + for new_region in mod_region_data.regions: + region_name = new_region.name + try: + current_region = current_regions_by_name[region_name] + except KeyError: + current_regions_by_name[region_name] = new_region + continue + + current_regions_by_name[region_name] = current_region.merge_with(new_region) + + +def modify_connections_for_mods(connections: dict[str, ConnectionData], active_mods: Iterable[str]) -> None: + for active_mod in active_mods: + try: + region_data = region_data_by_content_pack[active_mod] + except KeyError: + continue + + try: + vanilla_connections_to_remove = vanilla_connections_to_remove_by_content_pack[active_mod] + for connection_name in vanilla_connections_to_remove: + connections.pop(connection_name) + except KeyError: + pass + + connections.update({ + connection.name: connection + for connection in region_data.connections + }) diff --git a/worlds/stardew_valley/regions/regions.py b/worlds/stardew_valley/regions/regions.py new file mode 100644 index 0000000000..ceaec5b2ac --- /dev/null +++ b/worlds/stardew_valley/regions/regions.py @@ -0,0 +1,61 @@ +from typing import Protocol + +from BaseClasses import Region +from . import vanilla_data, mods +from .entrance_rando import create_player_randomization_flag, connect_regions +from .model import ConnectionData, RegionData +from ..content import StardewContent +from ..content.vanilla.ginger_island import ginger_island_content_pack +from ..options import StardewValleyOptions + + +class RegionFactory(Protocol): + def __call__(self, name: str) -> Region: + raise NotImplementedError + + +def create_regions(region_factory: RegionFactory, world_options: StardewValleyOptions, content: StardewContent) -> dict[str, Region]: + connection_data_by_name, region_data_by_name = create_connections_and_regions(content.registered_packs) + + regions_by_name: dict[str: Region] = { + region_name: region_factory(region_name) + for region_name in region_data_by_name + } + + randomization_flag = create_player_randomization_flag(world_options.entrance_randomization, content) + connect_regions(region_data_by_name, connection_data_by_name, regions_by_name, randomization_flag) + + return regions_by_name + + +def create_connections_and_regions(active_content_packs: set[str]) -> tuple[dict[str, ConnectionData], dict[str, RegionData]]: + regions_by_name = create_all_regions(active_content_packs) + connections_by_name = create_all_connections(active_content_packs) + + return connections_by_name, regions_by_name + + +def create_all_regions(active_content_packs: set[str]) -> dict[str, RegionData]: + current_regions_by_name = create_vanilla_regions(active_content_packs) + mods.modify_regions_for_mods(current_regions_by_name, sorted(active_content_packs)) + return current_regions_by_name + + +def create_vanilla_regions(active_content_packs: set[str]) -> dict[str, RegionData]: + if ginger_island_content_pack.name in active_content_packs: + return {**vanilla_data.regions_with_ginger_island_by_name} + else: + return {**vanilla_data.regions_without_ginger_island_by_name} + + +def create_all_connections(active_content_packs: set[str]) -> dict[str, ConnectionData]: + connections = create_vanilla_connections(active_content_packs) + mods.modify_connections_for_mods(connections, sorted(active_content_packs)) + return connections + + +def create_vanilla_connections(active_content_packs: set[str]) -> dict[str, ConnectionData]: + if ginger_island_content_pack.name in active_content_packs: + return {**vanilla_data.connections_with_ginger_island_by_name} + else: + return {**vanilla_data.connections_without_ginger_island_by_name} diff --git a/worlds/stardew_valley/regions/vanilla_data.py b/worlds/stardew_valley/regions/vanilla_data.py new file mode 100644 index 0000000000..dbb83e1063 --- /dev/null +++ b/worlds/stardew_valley/regions/vanilla_data.py @@ -0,0 +1,522 @@ +from collections.abc import Mapping +from types import MappingProxyType + +from .model import ConnectionData, RandomizationFlag, RegionData +from ..strings.entrance_names import LogicEntrance, Entrance +from ..strings.region_names import LogicRegion, Region as RegionName + +vanilla_regions: tuple[RegionData, ...] = ( + RegionData(RegionName.menu, (Entrance.to_stardew_valley,)), + RegionData(RegionName.stardew_valley, (Entrance.to_farmhouse,)), + RegionData(RegionName.farm_house, + (Entrance.farmhouse_to_farm, Entrance.downstairs_to_cellar, LogicEntrance.farmhouse_cooking, LogicEntrance.watch_queen_of_sauce)), + RegionData(RegionName.cellar), + RegionData(RegionName.farm, + (Entrance.farm_to_backwoods, Entrance.farm_to_bus_stop, Entrance.farm_to_forest, Entrance.farm_to_farmcave, Entrance.enter_greenhouse, + Entrance.enter_coop, Entrance.enter_barn, Entrance.enter_shed, Entrance.enter_slime_hutch, LogicEntrance.grow_spring_crops, + LogicEntrance.grow_summer_crops, LogicEntrance.grow_fall_crops, LogicEntrance.grow_winter_crops, LogicEntrance.shipping, + LogicEntrance.fishing,)), + RegionData(RegionName.backwoods, (Entrance.backwoods_to_mountain,)), + RegionData(RegionName.bus_stop, + (Entrance.bus_stop_to_town, Entrance.take_bus_to_desert, Entrance.bus_stop_to_tunnel_entrance)), + RegionData(RegionName.forest, + (Entrance.forest_to_town, Entrance.enter_secret_woods, Entrance.forest_to_wizard_tower, Entrance.forest_to_marnie_ranch, + Entrance.forest_to_leah_cottage, Entrance.forest_to_sewer, Entrance.forest_to_mastery_cave, LogicEntrance.buy_from_traveling_merchant, + LogicEntrance.complete_raccoon_requests, LogicEntrance.fish_in_waterfall, LogicEntrance.attend_flower_dance, LogicEntrance.attend_trout_derby, + LogicEntrance.attend_festival_of_ice)), + RegionData(LogicRegion.forest_waterfall), + RegionData(RegionName.farm_cave), + RegionData(RegionName.greenhouse, + (LogicEntrance.grow_spring_crops_in_greenhouse, LogicEntrance.grow_summer_crops_in_greenhouse, LogicEntrance.grow_fall_crops_in_greenhouse, + LogicEntrance.grow_winter_crops_in_greenhouse, LogicEntrance.grow_indoor_crops_in_greenhouse)), + RegionData(RegionName.mountain, + (Entrance.mountain_to_railroad, Entrance.mountain_to_tent, Entrance.mountain_to_carpenter_shop, + Entrance.mountain_to_the_mines, Entrance.enter_quarry, Entrance.mountain_to_adventurer_guild, + Entrance.mountain_to_town, Entrance.mountain_to_maru_room)), + RegionData(RegionName.maru_room), + RegionData(RegionName.tunnel_entrance, (Entrance.tunnel_entrance_to_bus_tunnel,)), + RegionData(RegionName.bus_tunnel), + RegionData(RegionName.town, + (Entrance.town_to_community_center, Entrance.town_to_beach, Entrance.town_to_hospital, Entrance.town_to_pierre_general_store, + Entrance.town_to_saloon, Entrance.town_to_alex_house, Entrance.town_to_trailer, Entrance.town_to_mayor_manor, Entrance.town_to_sam_house, + Entrance.town_to_haley_house, Entrance.town_to_sewer, Entrance.town_to_clint_blacksmith, Entrance.town_to_museum, Entrance.town_to_jojamart, + Entrance.purchase_movie_ticket, LogicEntrance.buy_experience_books, LogicEntrance.attend_egg_festival, LogicEntrance.attend_fair, + LogicEntrance.attend_spirit_eve, LogicEntrance.attend_winter_star)), + RegionData(RegionName.beach, + (Entrance.beach_to_willy_fish_shop, Entrance.enter_elliott_house, Entrance.enter_tide_pools, LogicEntrance.attend_luau, + LogicEntrance.attend_moonlight_jellies, LogicEntrance.attend_night_market, LogicEntrance.attend_squidfest)), + RegionData(RegionName.railroad, (Entrance.enter_bathhouse_entrance, Entrance.enter_witch_warp_cave)), + RegionData(RegionName.ranch), + RegionData(RegionName.leah_house), + RegionData(RegionName.mastery_cave), + RegionData(RegionName.sewer, (Entrance.enter_mutant_bug_lair,)), + RegionData(RegionName.mutant_bug_lair), + RegionData(RegionName.wizard_tower, (Entrance.enter_wizard_basement, Entrance.use_desert_obelisk)), + RegionData(RegionName.wizard_basement), + RegionData(RegionName.tent), + RegionData(RegionName.carpenter, (Entrance.enter_sebastian_room,)), + RegionData(RegionName.sebastian_room), + RegionData(RegionName.adventurer_guild, (Entrance.adventurer_guild_to_bedroom,)), + RegionData(RegionName.adventurer_guild_bedroom), + RegionData(RegionName.community_center, + (Entrance.access_crafts_room, Entrance.access_pantry, Entrance.access_fish_tank, + Entrance.access_boiler_room, Entrance.access_bulletin_board, Entrance.access_vault)), + RegionData(RegionName.crafts_room), + RegionData(RegionName.pantry), + RegionData(RegionName.fish_tank), + RegionData(RegionName.boiler_room), + RegionData(RegionName.bulletin_board), + RegionData(RegionName.vault), + RegionData(RegionName.hospital, (Entrance.enter_harvey_room,)), + RegionData(RegionName.harvey_room), + RegionData(RegionName.pierre_store, (Entrance.enter_sunroom,)), + RegionData(RegionName.sunroom), + RegionData(RegionName.saloon, (Entrance.play_journey_of_the_prairie_king, Entrance.play_junimo_kart)), + RegionData(RegionName.jotpk_world_1, (Entrance.reach_jotpk_world_2,)), + RegionData(RegionName.jotpk_world_2, (Entrance.reach_jotpk_world_3,)), + RegionData(RegionName.jotpk_world_3), + RegionData(RegionName.junimo_kart_1, (Entrance.reach_junimo_kart_2,)), + RegionData(RegionName.junimo_kart_2, (Entrance.reach_junimo_kart_3,)), + RegionData(RegionName.junimo_kart_3, (Entrance.reach_junimo_kart_4,)), + RegionData(RegionName.junimo_kart_4), + RegionData(RegionName.alex_house), + RegionData(RegionName.trailer), + RegionData(RegionName.mayor_house), + RegionData(RegionName.sam_house), + RegionData(RegionName.haley_house), + RegionData(RegionName.blacksmith, (LogicEntrance.blacksmith_copper,)), + RegionData(RegionName.museum), + RegionData(RegionName.jojamart, (Entrance.enter_abandoned_jojamart,)), + RegionData(RegionName.abandoned_jojamart, (Entrance.enter_movie_theater,)), + RegionData(RegionName.movie_ticket_stand), + RegionData(RegionName.movie_theater), + RegionData(RegionName.fish_shop), + RegionData(RegionName.elliott_house), + RegionData(RegionName.tide_pools), + RegionData(RegionName.bathhouse_entrance, (Entrance.enter_locker_room,)), + RegionData(RegionName.locker_room, (Entrance.enter_public_bath,)), + RegionData(RegionName.public_bath), + RegionData(RegionName.witch_warp_cave, (Entrance.enter_witch_swamp,)), + RegionData(RegionName.witch_swamp, (Entrance.enter_witch_hut,)), + RegionData(RegionName.witch_hut, (Entrance.witch_warp_to_wizard_basement,)), + RegionData(RegionName.quarry, (Entrance.enter_quarry_mine_entrance,)), + RegionData(RegionName.quarry_mine_entrance, (Entrance.enter_quarry_mine,)), + RegionData(RegionName.quarry_mine), + RegionData(RegionName.secret_woods), + RegionData(RegionName.desert, (Entrance.enter_skull_cavern_entrance, Entrance.enter_oasis, LogicEntrance.attend_desert_festival)), + RegionData(RegionName.oasis, (Entrance.enter_casino,)), + RegionData(RegionName.casino), + RegionData(RegionName.skull_cavern_entrance, (Entrance.enter_skull_cavern,)), + RegionData(RegionName.skull_cavern, (Entrance.mine_to_skull_cavern_floor_25,)), + RegionData(RegionName.skull_cavern_25, (Entrance.mine_to_skull_cavern_floor_50,)), + RegionData(RegionName.skull_cavern_50, (Entrance.mine_to_skull_cavern_floor_75,)), + RegionData(RegionName.skull_cavern_75, (Entrance.mine_to_skull_cavern_floor_100,)), + RegionData(RegionName.skull_cavern_100, (Entrance.mine_to_skull_cavern_floor_125,)), + RegionData(RegionName.skull_cavern_125, (Entrance.mine_to_skull_cavern_floor_150,)), + RegionData(RegionName.skull_cavern_150, (Entrance.mine_to_skull_cavern_floor_175,)), + RegionData(RegionName.skull_cavern_175, (Entrance.mine_to_skull_cavern_floor_200,)), + RegionData(RegionName.skull_cavern_200), + + RegionData(RegionName.coop), + RegionData(RegionName.barn), + RegionData(RegionName.shed), + RegionData(RegionName.slime_hutch), + + RegionData(RegionName.mines, (LogicEntrance.talk_to_mines_dwarf, Entrance.dig_to_mines_floor_5)), + RegionData(RegionName.mines_floor_5, (Entrance.dig_to_mines_floor_10,)), + RegionData(RegionName.mines_floor_10, (Entrance.dig_to_mines_floor_15,)), + RegionData(RegionName.mines_floor_15, (Entrance.dig_to_mines_floor_20,)), + RegionData(RegionName.mines_floor_20, (Entrance.dig_to_mines_floor_25,)), + RegionData(RegionName.mines_floor_25, (Entrance.dig_to_mines_floor_30,)), + RegionData(RegionName.mines_floor_30, (Entrance.dig_to_mines_floor_35,)), + RegionData(RegionName.mines_floor_35, (Entrance.dig_to_mines_floor_40,)), + RegionData(RegionName.mines_floor_40, (Entrance.dig_to_mines_floor_45,)), + RegionData(RegionName.mines_floor_45, (Entrance.dig_to_mines_floor_50,)), + RegionData(RegionName.mines_floor_50, (Entrance.dig_to_mines_floor_55,)), + RegionData(RegionName.mines_floor_55, (Entrance.dig_to_mines_floor_60,)), + RegionData(RegionName.mines_floor_60, (Entrance.dig_to_mines_floor_65,)), + RegionData(RegionName.mines_floor_65, (Entrance.dig_to_mines_floor_70,)), + RegionData(RegionName.mines_floor_70, (Entrance.dig_to_mines_floor_75,)), + RegionData(RegionName.mines_floor_75, (Entrance.dig_to_mines_floor_80,)), + RegionData(RegionName.mines_floor_80, (Entrance.dig_to_mines_floor_85,)), + RegionData(RegionName.mines_floor_85, (Entrance.dig_to_mines_floor_90,)), + RegionData(RegionName.mines_floor_90, (Entrance.dig_to_mines_floor_95,)), + RegionData(RegionName.mines_floor_95, (Entrance.dig_to_mines_floor_100,)), + RegionData(RegionName.mines_floor_100, (Entrance.dig_to_mines_floor_105,)), + RegionData(RegionName.mines_floor_105, (Entrance.dig_to_mines_floor_110,)), + RegionData(RegionName.mines_floor_110, (Entrance.dig_to_mines_floor_115,)), + RegionData(RegionName.mines_floor_115, (Entrance.dig_to_mines_floor_120,)), + RegionData(RegionName.mines_floor_120), + + RegionData(LogicRegion.mines_dwarf_shop), + RegionData(LogicRegion.blacksmith_copper, (LogicEntrance.blacksmith_iron,)), + RegionData(LogicRegion.blacksmith_iron, (LogicEntrance.blacksmith_gold,)), + RegionData(LogicRegion.blacksmith_gold, (LogicEntrance.blacksmith_iridium,)), + RegionData(LogicRegion.blacksmith_iridium), + RegionData(LogicRegion.kitchen), + RegionData(LogicRegion.queen_of_sauce), + RegionData(LogicRegion.fishing), + + RegionData(LogicRegion.spring_farming), + RegionData(LogicRegion.summer_farming, (LogicEntrance.grow_summer_fall_crops_in_summer,)), + RegionData(LogicRegion.fall_farming, (LogicEntrance.grow_summer_fall_crops_in_fall,)), + RegionData(LogicRegion.winter_farming), + RegionData(LogicRegion.summer_or_fall_farming), + RegionData(LogicRegion.indoor_farming), + + RegionData(LogicRegion.shipping), + RegionData(LogicRegion.traveling_cart, (LogicEntrance.buy_from_traveling_merchant_sunday, + LogicEntrance.buy_from_traveling_merchant_monday, + LogicEntrance.buy_from_traveling_merchant_tuesday, + LogicEntrance.buy_from_traveling_merchant_wednesday, + LogicEntrance.buy_from_traveling_merchant_thursday, + LogicEntrance.buy_from_traveling_merchant_friday, + LogicEntrance.buy_from_traveling_merchant_saturday)), + RegionData(LogicRegion.traveling_cart_sunday), + RegionData(LogicRegion.traveling_cart_monday), + RegionData(LogicRegion.traveling_cart_tuesday), + RegionData(LogicRegion.traveling_cart_wednesday), + RegionData(LogicRegion.traveling_cart_thursday), + RegionData(LogicRegion.traveling_cart_friday), + RegionData(LogicRegion.traveling_cart_saturday), + RegionData(LogicRegion.raccoon_daddy, (LogicEntrance.buy_from_raccoon,)), + RegionData(LogicRegion.raccoon_shop), + + RegionData(LogicRegion.egg_festival), + RegionData(LogicRegion.desert_festival), + RegionData(LogicRegion.flower_dance), + RegionData(LogicRegion.luau), + RegionData(LogicRegion.trout_derby), + RegionData(LogicRegion.moonlight_jellies), + RegionData(LogicRegion.fair), + RegionData(LogicRegion.spirit_eve), + RegionData(LogicRegion.festival_of_ice), + RegionData(LogicRegion.night_market), + RegionData(LogicRegion.winter_star), + RegionData(LogicRegion.squidfest), + RegionData(LogicRegion.bookseller_1, (LogicEntrance.buy_year1_books,)), + RegionData(LogicRegion.bookseller_2, (LogicEntrance.buy_year3_books,)), + RegionData(LogicRegion.bookseller_3), +) +ginger_island_regions = ( + # This overrides the regions from vanilla... When regions are moved to content packs, overriding existing entrances should no longer be necessary. + RegionData(RegionName.mountain, + (Entrance.mountain_to_railroad, Entrance.mountain_to_tent, Entrance.mountain_to_carpenter_shop, + Entrance.mountain_to_the_mines, Entrance.enter_quarry, Entrance.mountain_to_adventurer_guild, + Entrance.mountain_to_town, Entrance.mountain_to_maru_room, Entrance.mountain_to_leo_treehouse)), + RegionData(RegionName.wizard_tower, (Entrance.enter_wizard_basement, Entrance.use_desert_obelisk, Entrance.use_island_obelisk,)), + RegionData(RegionName.fish_shop, (Entrance.fish_shop_to_boat_tunnel,)), + RegionData(RegionName.mines_floor_120, (Entrance.dig_to_dangerous_mines_20, Entrance.dig_to_dangerous_mines_60, Entrance.dig_to_dangerous_mines_100)), + RegionData(RegionName.skull_cavern_200, (Entrance.enter_dangerous_skull_cavern,)), + + RegionData(RegionName.leo_treehouse), + RegionData(RegionName.boat_tunnel, (Entrance.boat_to_ginger_island,)), + RegionData(RegionName.dangerous_skull_cavern), + RegionData(RegionName.island_south, + (Entrance.island_south_to_west, Entrance.island_south_to_north, Entrance.island_south_to_east, Entrance.island_south_to_southeast, + Entrance.use_island_resort, Entrance.parrot_express_docks_to_volcano, Entrance.parrot_express_docks_to_dig_site, + Entrance.parrot_express_docks_to_jungle), ), + RegionData(RegionName.island_resort), + RegionData(RegionName.island_west, + (Entrance.island_west_to_islandfarmhouse, Entrance.island_west_to_gourmand_cave, Entrance.island_west_to_crystals_cave, + Entrance.island_west_to_shipwreck, Entrance.island_west_to_qi_walnut_room, Entrance.use_farm_obelisk, Entrance.parrot_express_jungle_to_docks, + Entrance.parrot_express_jungle_to_dig_site, Entrance.parrot_express_jungle_to_volcano, LogicEntrance.grow_spring_crops_on_island, + LogicEntrance.grow_summer_crops_on_island, LogicEntrance.grow_fall_crops_on_island, LogicEntrance.grow_winter_crops_on_island, + LogicEntrance.grow_indoor_crops_on_island), ), + RegionData(RegionName.island_east, (Entrance.island_east_to_leo_hut, Entrance.island_east_to_island_shrine)), + RegionData(RegionName.island_shrine), + RegionData(RegionName.island_south_east, (Entrance.island_southeast_to_pirate_cove,)), + RegionData(RegionName.island_north, + (Entrance.talk_to_island_trader, Entrance.island_north_to_field_office, Entrance.island_north_to_dig_site, Entrance.island_north_to_volcano, + Entrance.parrot_express_volcano_to_dig_site, Entrance.parrot_express_volcano_to_jungle, Entrance.parrot_express_volcano_to_docks), ), + RegionData(RegionName.volcano, (Entrance.climb_to_volcano_5, Entrance.volcano_to_secret_beach)), + RegionData(RegionName.volcano_secret_beach), + RegionData(RegionName.volcano_floor_5, (Entrance.talk_to_volcano_dwarf, Entrance.climb_to_volcano_10)), + RegionData(RegionName.volcano_dwarf_shop), + RegionData(RegionName.volcano_floor_10), + RegionData(RegionName.island_trader), + RegionData(RegionName.island_farmhouse, (LogicEntrance.island_cooking,)), + RegionData(RegionName.gourmand_frog_cave), + RegionData(RegionName.colored_crystals_cave), + RegionData(RegionName.shipwreck), + RegionData(RegionName.qi_walnut_room), + RegionData(RegionName.leo_hut), + RegionData(RegionName.pirate_cove), + RegionData(RegionName.field_office), + RegionData(RegionName.dig_site, + (Entrance.dig_site_to_professor_snail_cave, Entrance.parrot_express_dig_site_to_volcano, + Entrance.parrot_express_dig_site_to_docks, Entrance.parrot_express_dig_site_to_jungle), ), + + RegionData(RegionName.professor_snail_cave), + RegionData(RegionName.dangerous_mines_20), + RegionData(RegionName.dangerous_mines_60), + RegionData(RegionName.dangerous_mines_100), +) + +# Exists and where they lead +vanilla_connections: tuple[ConnectionData, ...] = ( + ConnectionData(Entrance.to_stardew_valley, RegionName.stardew_valley), + ConnectionData(Entrance.to_farmhouse, RegionName.farm_house), + ConnectionData(Entrance.farmhouse_to_farm, RegionName.farm), + ConnectionData(Entrance.downstairs_to_cellar, RegionName.cellar), + ConnectionData(Entrance.farm_to_backwoods, RegionName.backwoods), + ConnectionData(Entrance.farm_to_bus_stop, RegionName.bus_stop), + ConnectionData(Entrance.farm_to_forest, RegionName.forest), + ConnectionData(Entrance.farm_to_farmcave, RegionName.farm_cave, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(Entrance.enter_greenhouse, RegionName.greenhouse), + ConnectionData(Entrance.enter_coop, RegionName.coop), + ConnectionData(Entrance.enter_barn, RegionName.barn), + ConnectionData(Entrance.enter_shed, RegionName.shed), + ConnectionData(Entrance.enter_slime_hutch, RegionName.slime_hutch), + ConnectionData(Entrance.use_desert_obelisk, RegionName.desert), + ConnectionData(Entrance.backwoods_to_mountain, RegionName.mountain), + ConnectionData(Entrance.bus_stop_to_town, RegionName.town), + ConnectionData(Entrance.bus_stop_to_tunnel_entrance, RegionName.tunnel_entrance), + ConnectionData(Entrance.tunnel_entrance_to_bus_tunnel, RegionName.bus_tunnel, flag=RandomizationFlag.NON_PROGRESSION), + ConnectionData(Entrance.take_bus_to_desert, RegionName.desert), + ConnectionData(Entrance.forest_to_town, RegionName.town), + ConnectionData(Entrance.forest_to_wizard_tower, RegionName.wizard_tower, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.forest_to_marnie_ranch, RegionName.ranch, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.forest_to_leah_cottage, RegionName.leah_house, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_secret_woods, RegionName.secret_woods), + ConnectionData(Entrance.forest_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS), + # We remove the bit for masteries, because the mastery cave is to be excluded from the randomization if masteries are not shuffled. + ConnectionData(Entrance.forest_to_mastery_cave, RegionName.mastery_cave, flag=RandomizationFlag.BUILDINGS ^ RandomizationFlag.EXCLUDE_MASTERIES), + ConnectionData(Entrance.town_to_sewer, RegionName.sewer, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_mutant_bug_lair, RegionName.mutant_bug_lair, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.mountain_to_railroad, RegionName.railroad), + ConnectionData(Entrance.mountain_to_tent, RegionName.tent, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.mountain_to_carpenter_shop, RegionName.carpenter, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.mountain_to_maru_room, RegionName.maru_room, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_sebastian_room, RegionName.sebastian_room, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.mountain_to_adventurer_guild, RegionName.adventurer_guild, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.adventurer_guild_to_bedroom, RegionName.adventurer_guild_bedroom), + ConnectionData(Entrance.enter_quarry, RegionName.quarry), + ConnectionData(Entrance.enter_quarry_mine_entrance, RegionName.quarry_mine_entrance, + flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_quarry_mine, RegionName.quarry_mine), + ConnectionData(Entrance.mountain_to_town, RegionName.town), + ConnectionData(Entrance.town_to_community_center, RegionName.community_center, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.access_crafts_room, RegionName.crafts_room), + ConnectionData(Entrance.access_pantry, RegionName.pantry), + ConnectionData(Entrance.access_fish_tank, RegionName.fish_tank), + ConnectionData(Entrance.access_boiler_room, RegionName.boiler_room), + ConnectionData(Entrance.access_bulletin_board, RegionName.bulletin_board), + ConnectionData(Entrance.access_vault, RegionName.vault), + ConnectionData(Entrance.town_to_hospital, RegionName.hospital, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_harvey_room, RegionName.harvey_room, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.town_to_pierre_general_store, RegionName.pierre_store, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_sunroom, RegionName.sunroom, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.town_to_clint_blacksmith, RegionName.blacksmith, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_saloon, RegionName.saloon, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.play_journey_of_the_prairie_king, RegionName.jotpk_world_1), + ConnectionData(Entrance.reach_jotpk_world_2, RegionName.jotpk_world_2), + ConnectionData(Entrance.reach_jotpk_world_3, RegionName.jotpk_world_3), + ConnectionData(Entrance.play_junimo_kart, RegionName.junimo_kart_1), + ConnectionData(Entrance.reach_junimo_kart_2, RegionName.junimo_kart_2), + ConnectionData(Entrance.reach_junimo_kart_3, RegionName.junimo_kart_3), + ConnectionData(Entrance.reach_junimo_kart_4, RegionName.junimo_kart_4), + ConnectionData(Entrance.town_to_sam_house, RegionName.sam_house, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_haley_house, RegionName.haley_house, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_mayor_manor, RegionName.mayor_house, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_alex_house, RegionName.alex_house, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_trailer, RegionName.trailer, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_museum, RegionName.museum, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.town_to_jojamart, RegionName.jojamart, + flag=RandomizationFlag.PELICAN_TOWN | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.purchase_movie_ticket, RegionName.movie_ticket_stand), + ConnectionData(Entrance.enter_abandoned_jojamart, RegionName.abandoned_jojamart), + ConnectionData(Entrance.enter_movie_theater, RegionName.movie_theater), + ConnectionData(Entrance.town_to_beach, RegionName.beach), + ConnectionData(Entrance.enter_elliott_house, RegionName.elliott_house, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.beach_to_willy_fish_shop, RegionName.fish_shop, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_tide_pools, RegionName.tide_pools), + ConnectionData(Entrance.mountain_to_the_mines, RegionName.mines, + flag=RandomizationFlag.NON_PROGRESSION | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.dig_to_mines_floor_5, RegionName.mines_floor_5), + ConnectionData(Entrance.dig_to_mines_floor_10, RegionName.mines_floor_10), + ConnectionData(Entrance.dig_to_mines_floor_15, RegionName.mines_floor_15), + ConnectionData(Entrance.dig_to_mines_floor_20, RegionName.mines_floor_20), + ConnectionData(Entrance.dig_to_mines_floor_25, RegionName.mines_floor_25), + ConnectionData(Entrance.dig_to_mines_floor_30, RegionName.mines_floor_30), + ConnectionData(Entrance.dig_to_mines_floor_35, RegionName.mines_floor_35), + ConnectionData(Entrance.dig_to_mines_floor_40, RegionName.mines_floor_40), + ConnectionData(Entrance.dig_to_mines_floor_45, RegionName.mines_floor_45), + ConnectionData(Entrance.dig_to_mines_floor_50, RegionName.mines_floor_50), + ConnectionData(Entrance.dig_to_mines_floor_55, RegionName.mines_floor_55), + ConnectionData(Entrance.dig_to_mines_floor_60, RegionName.mines_floor_60), + ConnectionData(Entrance.dig_to_mines_floor_65, RegionName.mines_floor_65), + ConnectionData(Entrance.dig_to_mines_floor_70, RegionName.mines_floor_70), + ConnectionData(Entrance.dig_to_mines_floor_75, RegionName.mines_floor_75), + ConnectionData(Entrance.dig_to_mines_floor_80, RegionName.mines_floor_80), + ConnectionData(Entrance.dig_to_mines_floor_85, RegionName.mines_floor_85), + ConnectionData(Entrance.dig_to_mines_floor_90, RegionName.mines_floor_90), + ConnectionData(Entrance.dig_to_mines_floor_95, RegionName.mines_floor_95), + ConnectionData(Entrance.dig_to_mines_floor_100, RegionName.mines_floor_100), + ConnectionData(Entrance.dig_to_mines_floor_105, RegionName.mines_floor_105), + ConnectionData(Entrance.dig_to_mines_floor_110, RegionName.mines_floor_110), + ConnectionData(Entrance.dig_to_mines_floor_115, RegionName.mines_floor_115), + ConnectionData(Entrance.dig_to_mines_floor_120, RegionName.mines_floor_120), + ConnectionData(Entrance.enter_skull_cavern_entrance, RegionName.skull_cavern_entrance, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_oasis, RegionName.oasis, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_casino, RegionName.casino, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_skull_cavern, RegionName.skull_cavern), + ConnectionData(Entrance.mine_to_skull_cavern_floor_25, RegionName.skull_cavern_25), + ConnectionData(Entrance.mine_to_skull_cavern_floor_50, RegionName.skull_cavern_50), + ConnectionData(Entrance.mine_to_skull_cavern_floor_75, RegionName.skull_cavern_75), + ConnectionData(Entrance.mine_to_skull_cavern_floor_100, RegionName.skull_cavern_100), + ConnectionData(Entrance.mine_to_skull_cavern_floor_125, RegionName.skull_cavern_125), + ConnectionData(Entrance.mine_to_skull_cavern_floor_150, RegionName.skull_cavern_150), + ConnectionData(Entrance.mine_to_skull_cavern_floor_175, RegionName.skull_cavern_175), + ConnectionData(Entrance.mine_to_skull_cavern_floor_200, RegionName.skull_cavern_200), + ConnectionData(Entrance.enter_witch_warp_cave, RegionName.witch_warp_cave, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_witch_swamp, RegionName.witch_swamp, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_witch_hut, RegionName.witch_hut, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.witch_warp_to_wizard_basement, RegionName.wizard_basement, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_bathhouse_entrance, RegionName.bathhouse_entrance, + flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.enter_locker_room, RegionName.locker_room, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.enter_public_bath, RegionName.public_bath, flag=RandomizationFlag.BUILDINGS), + ConnectionData(LogicEntrance.talk_to_mines_dwarf, LogicRegion.mines_dwarf_shop), + + ConnectionData(LogicEntrance.buy_from_traveling_merchant, LogicRegion.traveling_cart), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_sunday, LogicRegion.traveling_cart_sunday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_monday, LogicRegion.traveling_cart_monday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_tuesday, LogicRegion.traveling_cart_tuesday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_wednesday, LogicRegion.traveling_cart_wednesday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_thursday, LogicRegion.traveling_cart_thursday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_friday, LogicRegion.traveling_cart_friday), + ConnectionData(LogicEntrance.buy_from_traveling_merchant_saturday, LogicRegion.traveling_cart_saturday), + ConnectionData(LogicEntrance.complete_raccoon_requests, LogicRegion.raccoon_daddy), + ConnectionData(LogicEntrance.fish_in_waterfall, LogicRegion.forest_waterfall), + ConnectionData(LogicEntrance.buy_from_raccoon, LogicRegion.raccoon_shop), + ConnectionData(LogicEntrance.farmhouse_cooking, LogicRegion.kitchen), + ConnectionData(LogicEntrance.watch_queen_of_sauce, LogicRegion.queen_of_sauce), + + ConnectionData(LogicEntrance.grow_spring_crops, LogicRegion.spring_farming), + ConnectionData(LogicEntrance.grow_summer_crops, LogicRegion.summer_farming), + ConnectionData(LogicEntrance.grow_fall_crops, LogicRegion.fall_farming), + ConnectionData(LogicEntrance.grow_winter_crops, LogicRegion.winter_farming), + ConnectionData(LogicEntrance.grow_spring_crops_in_greenhouse, LogicRegion.spring_farming), + ConnectionData(LogicEntrance.grow_summer_crops_in_greenhouse, LogicRegion.summer_farming), + ConnectionData(LogicEntrance.grow_fall_crops_in_greenhouse, LogicRegion.fall_farming), + ConnectionData(LogicEntrance.grow_winter_crops_in_greenhouse, LogicRegion.winter_farming), + ConnectionData(LogicEntrance.grow_indoor_crops_in_greenhouse, LogicRegion.indoor_farming), + ConnectionData(LogicEntrance.grow_summer_fall_crops_in_summer, LogicRegion.summer_or_fall_farming), + ConnectionData(LogicEntrance.grow_summer_fall_crops_in_fall, LogicRegion.summer_or_fall_farming), + + ConnectionData(LogicEntrance.shipping, LogicRegion.shipping), + ConnectionData(LogicEntrance.blacksmith_copper, LogicRegion.blacksmith_copper), + ConnectionData(LogicEntrance.blacksmith_iron, LogicRegion.blacksmith_iron), + ConnectionData(LogicEntrance.blacksmith_gold, LogicRegion.blacksmith_gold), + ConnectionData(LogicEntrance.blacksmith_iridium, LogicRegion.blacksmith_iridium), + ConnectionData(LogicEntrance.fishing, LogicRegion.fishing), + ConnectionData(LogicEntrance.attend_egg_festival, LogicRegion.egg_festival), + ConnectionData(LogicEntrance.attend_desert_festival, LogicRegion.desert_festival), + ConnectionData(LogicEntrance.attend_flower_dance, LogicRegion.flower_dance), + ConnectionData(LogicEntrance.attend_luau, LogicRegion.luau), + ConnectionData(LogicEntrance.attend_trout_derby, LogicRegion.trout_derby), + ConnectionData(LogicEntrance.attend_moonlight_jellies, LogicRegion.moonlight_jellies), + ConnectionData(LogicEntrance.attend_fair, LogicRegion.fair), + ConnectionData(LogicEntrance.attend_spirit_eve, LogicRegion.spirit_eve), + ConnectionData(LogicEntrance.attend_festival_of_ice, LogicRegion.festival_of_ice), + ConnectionData(LogicEntrance.attend_night_market, LogicRegion.night_market), + ConnectionData(LogicEntrance.attend_winter_star, LogicRegion.winter_star), + ConnectionData(LogicEntrance.attend_squidfest, LogicRegion.squidfest), + ConnectionData(LogicEntrance.buy_experience_books, LogicRegion.bookseller_1), + ConnectionData(LogicEntrance.buy_year1_books, LogicRegion.bookseller_2), + ConnectionData(LogicEntrance.buy_year3_books, LogicRegion.bookseller_3), +) + +ginger_island_connections = ( + ConnectionData(Entrance.use_island_obelisk, RegionName.island_south), + ConnectionData(Entrance.use_farm_obelisk, RegionName.farm), + ConnectionData(Entrance.mountain_to_leo_treehouse, RegionName.leo_treehouse, flag=RandomizationFlag.BUILDINGS | RandomizationFlag.LEAD_TO_OPEN_AREA), + ConnectionData(Entrance.fish_shop_to_boat_tunnel, RegionName.boat_tunnel, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.boat_to_ginger_island, RegionName.island_south), + ConnectionData(Entrance.enter_dangerous_skull_cavern, RegionName.dangerous_skull_cavern), + ConnectionData(Entrance.dig_to_dangerous_mines_20, RegionName.dangerous_mines_20), + ConnectionData(Entrance.dig_to_dangerous_mines_60, RegionName.dangerous_mines_60), + ConnectionData(Entrance.dig_to_dangerous_mines_100, RegionName.dangerous_mines_100), + ConnectionData(Entrance.island_south_to_west, RegionName.island_west), + ConnectionData(Entrance.island_south_to_north, RegionName.island_north), + ConnectionData(Entrance.island_south_to_east, RegionName.island_east), + ConnectionData(Entrance.island_south_to_southeast, RegionName.island_south_east), + ConnectionData(Entrance.use_island_resort, RegionName.island_resort), + ConnectionData(Entrance.island_west_to_islandfarmhouse, RegionName.island_farmhouse, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_west_to_gourmand_cave, RegionName.gourmand_frog_cave, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_west_to_crystals_cave, RegionName.colored_crystals_cave, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_west_to_shipwreck, RegionName.shipwreck, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_west_to_qi_walnut_room, RegionName.qi_walnut_room, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_east_to_leo_hut, RegionName.leo_hut, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_east_to_island_shrine, RegionName.island_shrine, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_southeast_to_pirate_cove, RegionName.pirate_cove, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_north_to_field_office, RegionName.field_office, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_north_to_dig_site, RegionName.dig_site), + ConnectionData(Entrance.dig_site_to_professor_snail_cave, RegionName.professor_snail_cave, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.island_north_to_volcano, RegionName.volcano, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.volcano_to_secret_beach, RegionName.volcano_secret_beach, flag=RandomizationFlag.BUILDINGS), + ConnectionData(Entrance.talk_to_island_trader, RegionName.island_trader), + ConnectionData(Entrance.climb_to_volcano_5, RegionName.volcano_floor_5), + ConnectionData(Entrance.talk_to_volcano_dwarf, RegionName.volcano_dwarf_shop), + ConnectionData(Entrance.climb_to_volcano_10, RegionName.volcano_floor_10), + ConnectionData(Entrance.parrot_express_jungle_to_docks, RegionName.island_south), + ConnectionData(Entrance.parrot_express_dig_site_to_docks, RegionName.island_south), + ConnectionData(Entrance.parrot_express_volcano_to_docks, RegionName.island_south), + ConnectionData(Entrance.parrot_express_volcano_to_jungle, RegionName.island_west), + ConnectionData(Entrance.parrot_express_docks_to_jungle, RegionName.island_west), + ConnectionData(Entrance.parrot_express_dig_site_to_jungle, RegionName.island_west), + ConnectionData(Entrance.parrot_express_docks_to_dig_site, RegionName.dig_site), + ConnectionData(Entrance.parrot_express_volcano_to_dig_site, RegionName.dig_site), + ConnectionData(Entrance.parrot_express_jungle_to_dig_site, RegionName.dig_site), + ConnectionData(Entrance.parrot_express_dig_site_to_volcano, RegionName.island_north), + ConnectionData(Entrance.parrot_express_docks_to_volcano, RegionName.island_north), + ConnectionData(Entrance.parrot_express_jungle_to_volcano, RegionName.island_north), + ConnectionData(LogicEntrance.grow_spring_crops_on_island, LogicRegion.spring_farming), + ConnectionData(LogicEntrance.grow_summer_crops_on_island, LogicRegion.summer_farming), + ConnectionData(LogicEntrance.grow_fall_crops_on_island, LogicRegion.fall_farming), + ConnectionData(LogicEntrance.grow_winter_crops_on_island, LogicRegion.winter_farming), + ConnectionData(LogicEntrance.grow_indoor_crops_on_island, LogicRegion.indoor_farming), + ConnectionData(LogicEntrance.island_cooking, LogicRegion.kitchen), +) + +connections_without_ginger_island_by_name: Mapping[str, ConnectionData] = MappingProxyType({ + connection.name: connection + for connection in vanilla_connections +}) +regions_without_ginger_island_by_name: Mapping[str, RegionData] = MappingProxyType({ + region.name: region + for region in vanilla_regions +}) + +connections_with_ginger_island_by_name: Mapping[str, ConnectionData] = MappingProxyType({ + connection.name: connection + for connection in vanilla_connections + ginger_island_connections +}) +regions_with_ginger_island_by_name: Mapping[str, RegionData] = MappingProxyType({ + region.name: region + for region in vanilla_regions + ginger_island_regions +}) diff --git a/worlds/stardew_valley/rules.py b/worlds/stardew_valley/rules.py index 51f69a1af8..7351871a39 100644 --- a/worlds/stardew_valley/rules.py +++ b/worlds/stardew_valley/rules.py @@ -195,6 +195,7 @@ def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: S set_entrance_rule(multiworld, player, Entrance.enter_tide_pools, logic.received("Beach Bridge") | (logic.mod.magic.can_blink())) set_entrance_rule(multiworld, player, Entrance.enter_quarry, logic.received("Bridge Repair") | (logic.mod.magic.can_blink())) set_entrance_rule(multiworld, player, Entrance.enter_secret_woods, logic.tool.has_tool(Tool.axe, "Iron") | (logic.mod.magic.can_blink())) + set_entrance_rule(multiworld, player, Entrance.forest_to_wizard_tower, logic.region.can_reach(Region.community_center)) set_entrance_rule(multiworld, player, Entrance.forest_to_sewer, logic.wallet.has_rusty_key()) set_entrance_rule(multiworld, player, Entrance.town_to_sewer, logic.wallet.has_rusty_key()) set_entrance_rule(multiworld, player, Entrance.enter_abandoned_jojamart, logic.has_abandoned_jojamart()) @@ -205,7 +206,7 @@ def set_entrance_rules(logic: StardewLogic, multiworld, player, world_options: S set_entrance_rule(multiworld, player, Entrance.enter_skull_cavern, logic.received(Wallet.skull_key)) set_entrance_rule(multiworld, player, LogicEntrance.talk_to_mines_dwarf, logic.wallet.can_speak_dwarf() & logic.tool.has_tool(Tool.pickaxe, ToolMaterial.iron)) - set_entrance_rule(multiworld, player, LogicEntrance.buy_from_traveling_merchant, logic.traveling_merchant.has_days()) + set_entrance_rule(multiworld, player, LogicEntrance.buy_from_traveling_merchant, logic.traveling_merchant.has_days() & logic.money.can_spend(1200)) set_entrance_rule(multiworld, player, LogicEntrance.buy_from_raccoon, logic.quest.has_raccoon_shop()) set_entrance_rule(multiworld, player, LogicEntrance.fish_in_waterfall, logic.skill.has_level(Skill.fishing, 5) & logic.tool.has_fishing_rod(2)) @@ -284,7 +285,7 @@ def set_skull_cavern_floor_entrance_rules(logic, multiworld, player): set_entrance_rule(multiworld, player, dig_to_skull_floor(floor), rule) -def set_skill_entrance_rules(logic, multiworld, player, world_options: StardewValleyOptions): +def set_skill_entrance_rules(logic: StardewLogic, multiworld, player, world_options: StardewValleyOptions): set_entrance_rule(multiworld, player, LogicEntrance.grow_spring_crops, logic.farming.has_farming_tools & logic.season.has_spring) set_entrance_rule(multiworld, player, LogicEntrance.grow_summer_crops, logic.farming.has_farming_tools & logic.season.has_summer) set_entrance_rule(multiworld, player, LogicEntrance.grow_fall_crops, logic.farming.has_farming_tools & logic.season.has_fall) @@ -299,7 +300,7 @@ def set_skill_entrance_rules(logic, multiworld, player, world_options: StardewVa set_entrance_rule(multiworld, player, LogicEntrance.grow_summer_fall_crops_in_summer, true_) set_entrance_rule(multiworld, player, LogicEntrance.grow_summer_fall_crops_in_fall, true_) - set_entrance_rule(multiworld, player, LogicEntrance.fishing, logic.skill.can_get_fishing_xp) + set_entrance_rule(multiworld, player, LogicEntrance.fishing, logic.fishing.can_fish_anywhere()) def set_blacksmith_entrance_rules(logic, multiworld, player): @@ -442,27 +443,27 @@ def set_walnut_puzzle_rules(logic: StardewLogic, multiworld, player, world_optio if WalnutsanityOptionName.puzzles not in world_options.walnutsanity: return - set_rule(multiworld.get_location("Open Golden Coconut", player), logic.has(Geode.golden_coconut)) - set_rule(multiworld.get_location("Banana Altar", player), logic.has(Fruit.banana)) - set_rule(multiworld.get_location("Leo's Tree", player), logic.tool.has_tool(Tool.axe)) - set_rule(multiworld.get_location("Gem Birds Shrine", player), logic.has(Mineral.amethyst) & logic.has(Mineral.aquamarine) & + set_rule(multiworld.get_location("Walnutsanity: Open Golden Coconut", player), logic.has(Geode.golden_coconut)) + set_rule(multiworld.get_location("Walnutsanity: Banana Altar", player), logic.has(Fruit.banana)) + set_rule(multiworld.get_location("Walnutsanity: Leo's Tree", player), logic.tool.has_tool(Tool.axe)) + set_rule(multiworld.get_location("Walnutsanity: Gem Birds Shrine", player), logic.has(Mineral.amethyst) & logic.has(Mineral.aquamarine) & logic.has(Mineral.emerald) & logic.has(Mineral.ruby) & logic.has(Mineral.topaz) & logic.region.can_reach_all((Region.island_north, Region.island_west, Region.island_east, Region.island_south))) - set_rule(multiworld.get_location("Gourmand Frog Melon", player), logic.has(Fruit.melon) & logic.region.can_reach(Region.island_west)) - set_rule(multiworld.get_location("Gourmand Frog Wheat", player), logic.has(Vegetable.wheat) & - logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Gourmand Frog Melon")) - set_rule(multiworld.get_location("Gourmand Frog Garlic", player), logic.has(Vegetable.garlic) & - logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Gourmand Frog Wheat")) - set_rule(multiworld.get_location("Whack A Mole", player), logic.tool.has_tool(Tool.watering_can, ToolMaterial.iridium)) - set_rule(multiworld.get_location("Complete Large Animal Collection", player), logic.walnut.can_complete_large_animal_collection()) - set_rule(multiworld.get_location("Complete Snake Collection", player), logic.walnut.can_complete_snake_collection()) - set_rule(multiworld.get_location("Complete Mummified Frog Collection", player), logic.walnut.can_complete_frog_collection()) - set_rule(multiworld.get_location("Complete Mummified Bat Collection", player), logic.walnut.can_complete_bat_collection()) - set_rule(multiworld.get_location("Purple Flowers Island Survey", player), logic.walnut.can_start_field_office) - set_rule(multiworld.get_location("Purple Starfish Island Survey", player), logic.walnut.can_start_field_office) - set_rule(multiworld.get_location("Protruding Tree Walnut", player), logic.combat.has_slingshot) - set_rule(multiworld.get_location("Starfish Tide Pool", player), logic.tool.has_fishing_rod(1)) - set_rule(multiworld.get_location("Mermaid Song", player), logic.has(Furniture.flute_block)) + set_rule(multiworld.get_location("Walnutsanity: Gourmand Frog Melon", player), logic.has(Fruit.melon) & logic.region.can_reach(Region.island_west)) + set_rule(multiworld.get_location("Walnutsanity: Gourmand Frog Wheat", player), logic.has(Vegetable.wheat) & + logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Walnutsanity: Gourmand Frog Melon")) + set_rule(multiworld.get_location("Walnutsanity: Gourmand Frog Garlic", player), logic.has(Vegetable.garlic) & + logic.region.can_reach(Region.island_west) & logic.region.can_reach_location("Walnutsanity: Gourmand Frog Wheat")) + set_rule(multiworld.get_location("Walnutsanity: Whack A Mole", player), logic.tool.has_tool(Tool.watering_can, ToolMaterial.iridium)) + set_rule(multiworld.get_location("Walnutsanity: Complete Large Animal Collection", player), logic.walnut.can_complete_large_animal_collection()) + set_rule(multiworld.get_location("Walnutsanity: Complete Snake Collection", player), logic.walnut.can_complete_snake_collection()) + set_rule(multiworld.get_location("Walnutsanity: Complete Mummified Frog Collection", player), logic.walnut.can_complete_frog_collection()) + set_rule(multiworld.get_location("Walnutsanity: Complete Mummified Bat Collection", player), logic.walnut.can_complete_bat_collection()) + set_rule(multiworld.get_location("Walnutsanity: Purple Flowers Island Survey", player), logic.walnut.can_start_field_office) + set_rule(multiworld.get_location("Walnutsanity: Purple Starfish Island Survey", player), logic.walnut.can_start_field_office) + set_rule(multiworld.get_location("Walnutsanity: Protruding Tree Walnut", player), logic.combat.has_slingshot) + set_rule(multiworld.get_location("Walnutsanity: Starfish Tide Pool", player), logic.tool.has_fishing_rod(1)) + set_rule(multiworld.get_location("Walnutsanity: Mermaid Song", player), logic.has(Furniture.flute_block)) def set_walnut_bushes_rules(logic, multiworld, player, world_options): @@ -489,13 +490,13 @@ def set_walnut_repeatable_rules(logic, multiworld, player, world_options): if WalnutsanityOptionName.repeatables not in world_options.walnutsanity: return for i in range(1, 6): - set_rule(multiworld.get_location(f"Fishing Walnut {i}", player), logic.tool.has_fishing_rod(1)) - set_rule(multiworld.get_location(f"Harvesting Walnut {i}", player), logic.skill.can_get_farming_xp) - set_rule(multiworld.get_location(f"Mussel Node Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe)) - set_rule(multiworld.get_location(f"Volcano Rocks Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe)) - set_rule(multiworld.get_location(f"Volcano Monsters Walnut {i}", player), logic.combat.has_galaxy_weapon) - set_rule(multiworld.get_location(f"Volcano Crates Walnut {i}", player), logic.combat.has_any_weapon) - set_rule(multiworld.get_location(f"Tiger Slime Walnut", player), logic.monster.can_kill(Monster.tiger_slime)) + set_rule(multiworld.get_location(f"Walnutsanity: Fishing Walnut {i}", player), logic.tool.has_fishing_rod(1)) + set_rule(multiworld.get_location(f"Walnutsanity: Harvesting Walnut {i}", player), logic.skill.can_get_farming_xp) + set_rule(multiworld.get_location(f"Walnutsanity: Mussel Node Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe)) + set_rule(multiworld.get_location(f"Walnutsanity: Volcano Rocks Walnut {i}", player), logic.tool.has_tool(Tool.pickaxe)) + set_rule(multiworld.get_location(f"Walnutsanity: Volcano Monsters Walnut {i}", player), logic.combat.has_galaxy_weapon) + set_rule(multiworld.get_location(f"Walnutsanity: Volcano Crates Walnut {i}", player), logic.combat.has_any_weapon) + set_rule(multiworld.get_location(f"Walnutsanity: Tiger Slime Walnut", player), logic.monster.can_kill(Monster.tiger_slime)) def set_cropsanity_rules(logic: StardewLogic, multiworld, player, world_content: StardewContent): @@ -864,7 +865,7 @@ def set_friendsanity_rules(logic: StardewLogic, multiworld: MultiWorld, player: if not content.features.friendsanity.is_enabled: return set_rule(multiworld.get_location("Spouse Stardrop", player), - logic.relationship.has_hearts_with_any_bachelor(13)) + logic.relationship.has_hearts_with_any_bachelor(13) & logic.relationship.can_get_married()) set_rule(multiworld.get_location("Have a Baby", player), logic.relationship.can_reproduce(1)) set_rule(multiworld.get_location("Have Another Baby", player), diff --git a/worlds/stardew_valley/strings/monster_drop_names.py b/worlds/stardew_valley/strings/monster_drop_names.py index df2cacf0c6..8612b3c7b5 100644 --- a/worlds/stardew_valley/strings/monster_drop_names.py +++ b/worlds/stardew_valley/strings/monster_drop_names.py @@ -1,9 +1,4 @@ class Loot: - blue_slime_egg = "Blue Slime Egg" - red_slime_egg = "Red Slime Egg" - purple_slime_egg = "Purple Slime Egg" - green_slime_egg = "Green Slime Egg" - tiger_slime_egg = "Tiger Slime Egg" slime = "Slime" bug_meat = "Bug Meat" bat_wing = "Bat Wing" diff --git a/worlds/stardew_valley/test/TestBackpack.py b/worlds/stardew_valley/test/TestBackpack.py index 378c90e40a..bccafd15e5 100644 --- a/worlds/stardew_valley/test/TestBackpack.py +++ b/worlds/stardew_valley/test/TestBackpack.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from .. import options diff --git a/worlds/stardew_valley/test/TestBooksanity.py b/worlds/stardew_valley/test/TestBooksanity.py index c25924aa3b..f1678de0db 100644 --- a/worlds/stardew_valley/test/TestBooksanity.py +++ b/worlds/stardew_valley/test/TestBooksanity.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from ..options import ExcludeGingerIsland, Booksanity, Shipsanity from ..strings.book_names import Book, LostBook diff --git a/worlds/stardew_valley/test/TestBundles.py b/worlds/stardew_valley/test/TestBundles.py index 091f39b256..5b70158f5f 100644 --- a/worlds/stardew_valley/test/TestBundles.py +++ b/worlds/stardew_valley/test/TestBundles.py @@ -1,6 +1,6 @@ import unittest -from . import SVTestBase +from .bases import SVTestBase from .. import BundleRandomization from ..data.bundle_data import all_bundle_items_except_money, quality_crops_items_thematic, quality_foraging_items, quality_fish_items from ..options import BundlePlando @@ -87,4 +87,3 @@ class TestRemixedAnywhereBundles(SVTestBase): for bundle_name in self.fish_bundle_names: with self.subTest(f"{bundle_name}"): self.assertIn(bundle_name, location_names) - diff --git a/worlds/stardew_valley/test/TestCrops.py b/worlds/stardew_valley/test/TestCrops.py index 53048259ab..bf8f4f719e 100644 --- a/worlds/stardew_valley/test/TestCrops.py +++ b/worlds/stardew_valley/test/TestCrops.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from .. import options from ..strings.ap_names.transport_names import Transportation from ..strings.building_names import Building diff --git a/worlds/stardew_valley/test/TestDynamicGoals.py b/worlds/stardew_valley/test/TestDynamicGoals.py index b0e6d6c626..23f453e9f0 100644 --- a/worlds/stardew_valley/test/TestDynamicGoals.py +++ b/worlds/stardew_valley/test/TestDynamicGoals.py @@ -1,7 +1,7 @@ from typing import List, Tuple -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .. import options, StardewItem from ..strings.ap_names.ap_weapon_names import APWeapon from ..strings.ap_names.transport_names import Transportation diff --git a/worlds/stardew_valley/test/TestFarmType.py b/worlds/stardew_valley/test/TestFarmType.py index 1bb4404ae6..2c4fe4ec36 100644 --- a/worlds/stardew_valley/test/TestFarmType.py +++ b/worlds/stardew_valley/test/TestFarmType.py @@ -1,7 +1,7 @@ from collections import Counter -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .. import options @@ -13,7 +13,7 @@ class TestStartInventoryStandardFarm(WorldAssertMixin, SVTestBase): def test_start_inventory_progressive_coops(self): start_items = Counter((i.name for i in self.multiworld.precollected_items[self.player])) items = Counter((i.name for i in self.multiworld.itempool)) - + self.assertIn("Progressive Coop", items) self.assertEqual(items["Progressive Coop"], 3) self.assertNotIn("Progressive Coop", start_items) diff --git a/worlds/stardew_valley/test/TestFill.py b/worlds/stardew_valley/test/TestFill.py index f8565f4f21..2205c49cdf 100644 --- a/worlds/stardew_valley/test/TestFill.py +++ b/worlds/stardew_valley/test/TestFill.py @@ -1,5 +1,5 @@ -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .options.presets import minimal_locations_maximal_items from .. import options from ..mods.mod_data import ModNames diff --git a/worlds/stardew_valley/test/TestFishsanity.py b/worlds/stardew_valley/test/TestFishsanity.py index c5d87c0f8d..953255c4d0 100644 --- a/worlds/stardew_valley/test/TestFishsanity.py +++ b/worlds/stardew_valley/test/TestFishsanity.py @@ -1,8 +1,8 @@ import unittest from typing import ClassVar, Set -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from ..content.feature import fishsanity from ..mods.mod_data import ModNames from ..options import Fishsanity, ExcludeGingerIsland, Mods, SpecialOrderLocations, Goal, QuestLocations diff --git a/worlds/stardew_valley/test/TestFriendsanity.py b/worlds/stardew_valley/test/TestFriendsanity.py index 842c0edd09..a346df7d2a 100644 --- a/worlds/stardew_valley/test/TestFriendsanity.py +++ b/worlds/stardew_valley/test/TestFriendsanity.py @@ -2,7 +2,7 @@ import unittest from collections import Counter from typing import ClassVar, Set -from . import SVTestBase +from .bases import SVTestBase from ..content.feature import friendsanity from ..options import Friendsanity, FriendsanityHeartSize diff --git a/worlds/stardew_valley/test/TestGeneration.py b/worlds/stardew_valley/test/TestGeneration.py index 6d0846f8c1..7b1535676d 100644 --- a/worlds/stardew_valley/test/TestGeneration.py +++ b/worlds/stardew_valley/test/TestGeneration.py @@ -1,7 +1,7 @@ from typing import List from BaseClasses import ItemClassification, Item -from . import SVTestBase +from .bases import SVTestBase from .. import location_table, options, items from ..items import Group, ItemData, item_data from ..locations import LocationTags @@ -120,165 +120,6 @@ class TestNoGingerIslandItemGeneration(SVTestBase): self.assertTrue(count == 0 or count == 2) -class TestMonstersanityNone(SVTestBase): - options = { - options.Monstersanity.internal_name: options.Monstersanity.option_none, - # Not really necessary, but it adds more locations, so we don't have to remove useful items. - options.Fishsanity.internal_name: options.Fishsanity.option_all - } - - @property - def run_default_tests(self) -> bool: - # None is default - return False - - def test_when_generate_world_then_5_generic_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Weapon"), 5) - - def test_when_generate_world_then_zero_specific_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Sword"), 0) - self.assertEqual(item_pool.count("Progressive Club"), 0) - self.assertEqual(item_pool.count("Progressive Dagger"), 0) - - def test_when_generate_world_then_2_slingshots_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Slingshot"), 2) - - def test_when_generate_world_then_3_shoes_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Footwear"), 3) - - -class TestMonstersanityGoals(SVTestBase): - options = {options.Monstersanity.internal_name: options.Monstersanity.option_goals} - - def test_when_generate_world_then_no_generic_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Weapon"), 0) - - def test_when_generate_world_then_5_specific_weapons_of_each_type_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Sword"), 5) - self.assertEqual(item_pool.count("Progressive Club"), 5) - self.assertEqual(item_pool.count("Progressive Dagger"), 5) - - def test_when_generate_world_then_2_slingshots_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Slingshot"), 2) - - def test_when_generate_world_then_4_shoes_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Footwear"), 4) - - def test_when_generate_world_then_all_monster_checks_are_inaccessible(self): - for location in self.get_real_locations(): - if LocationTags.MONSTERSANITY not in location_table[location.name].tags: - continue - with self.subTest(location.name): - self.assertFalse(location.can_reach(self.multiworld.state)) - - -class TestMonstersanityOnePerCategory(SVTestBase): - options = {options.Monstersanity.internal_name: options.Monstersanity.option_one_per_category} - - def test_when_generate_world_then_no_generic_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Weapon"), 0) - - def test_when_generate_world_then_5_specific_weapons_of_each_type_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Sword"), 5) - self.assertEqual(item_pool.count("Progressive Club"), 5) - self.assertEqual(item_pool.count("Progressive Dagger"), 5) - - def test_when_generate_world_then_2_slingshots_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Slingshot"), 2) - - def test_when_generate_world_then_4_shoes_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Footwear"), 4) - - def test_when_generate_world_then_all_monster_checks_are_inaccessible(self): - for location in self.get_real_locations(): - if LocationTags.MONSTERSANITY not in location_table[location.name].tags: - continue - with self.subTest(location.name): - self.assertFalse(location.can_reach(self.multiworld.state)) - - -class TestMonstersanityProgressive(SVTestBase): - options = {options.Monstersanity.internal_name: options.Monstersanity.option_progressive_goals} - - def test_when_generate_world_then_no_generic_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Weapon"), 0) - - def test_when_generate_world_then_5_specific_weapons_of_each_type_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Sword"), 5) - self.assertEqual(item_pool.count("Progressive Club"), 5) - self.assertEqual(item_pool.count("Progressive Dagger"), 5) - - def test_when_generate_world_then_2_slingshots_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Slingshot"), 2) - - def test_when_generate_world_then_4_shoes_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Footwear"), 4) - - def test_when_generate_world_then_many_rings_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertIn("Hot Java Ring", item_pool) - self.assertIn("Wedding Ring", item_pool) - self.assertIn("Slime Charmer Ring", item_pool) - - def test_when_generate_world_then_all_monster_checks_are_inaccessible(self): - for location in self.get_real_locations(): - if LocationTags.MONSTERSANITY not in location_table[location.name].tags: - continue - with self.subTest(location.name): - self.assertFalse(location.can_reach(self.multiworld.state)) - - -class TestMonstersanitySplit(SVTestBase): - options = {options.Monstersanity.internal_name: options.Monstersanity.option_split_goals} - - def test_when_generate_world_then_no_generic_weapons_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Weapon"), 0) - - def test_when_generate_world_then_5_specific_weapons_of_each_type_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Sword"), 5) - self.assertEqual(item_pool.count("Progressive Club"), 5) - self.assertEqual(item_pool.count("Progressive Dagger"), 5) - - def test_when_generate_world_then_2_slingshots_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Slingshot"), 2) - - def test_when_generate_world_then_4_shoes_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertEqual(item_pool.count("Progressive Footwear"), 4) - - def test_when_generate_world_then_many_rings_in_the_pool(self): - item_pool = [item.name for item in self.multiworld.itempool] - self.assertIn("Hot Java Ring", item_pool) - self.assertIn("Wedding Ring", item_pool) - self.assertIn("Slime Charmer Ring", item_pool) - - def test_when_generate_world_then_all_monster_checks_are_inaccessible(self): - for location in self.get_real_locations(): - if LocationTags.MONSTERSANITY not in location_table[location.name].tags: - continue - with self.subTest(location.name): - self.assertFalse(location.can_reach(self.multiworld.state)) - - class TestProgressiveElevator(SVTestBase): options = { options.ElevatorProgression.internal_name: options.ElevatorProgression.option_progressive, @@ -290,15 +131,13 @@ class TestProgressiveElevator(SVTestBase): items_for_115 = self.generate_items_for_mine_115() last_elevator = self.get_item_by_name("Progressive Mine Elevator") self.collect(items_for_115) - floor_115 = self.multiworld.get_region("The Mines - Floor 115", self.player) - floor_120 = self.multiworld.get_region("The Mines - Floor 120", self.player) - self.assertTrue(floor_115.can_reach(self.multiworld.state)) - self.assertFalse(floor_120.can_reach(self.multiworld.state)) + self.assert_can_reach_region(Region.mines_floor_115) + self.assert_cannot_reach_region(Region.mines_floor_120) self.collect(last_elevator) - self.assertTrue(floor_120.can_reach(self.multiworld.state)) + self.assert_can_reach_region(Region.mines_floor_120) def generate_items_for_mine_115(self) -> List[Item]: pickaxes = [self.get_item_by_name("Progressive Pickaxe")] * 2 @@ -330,27 +169,24 @@ class TestSkullCavernLogic(SVTestBase): items_for_skull_50 = self.generate_items_for_skull_50() items_for_skull_100 = self.generate_items_for_skull_100() self.collect(items_for_115) - floor_115 = self.multiworld.get_region(Region.mines_floor_115, self.player) - skull_25 = self.multiworld.get_region(Region.skull_cavern_25, self.player) - skull_75 = self.multiworld.get_region(Region.skull_cavern_75, self.player) - self.assertTrue(floor_115.can_reach(self.multiworld.state)) - self.assertFalse(skull_25.can_reach(self.multiworld.state)) - self.assertFalse(skull_75.can_reach(self.multiworld.state)) + self.assert_can_reach_region(Region.mines_floor_115) + self.assert_cannot_reach_region(Region.skull_cavern_25) + self.assert_cannot_reach_region(Region.skull_cavern_75) self.remove(items_for_115) self.collect(items_for_skull_50) - self.assertTrue(floor_115.can_reach(self.multiworld.state)) - self.assertTrue(skull_25.can_reach(self.multiworld.state)) - self.assertFalse(skull_75.can_reach(self.multiworld.state)) + self.assert_can_reach_region(Region.mines_floor_115) + self.assert_can_reach_region(Region.skull_cavern_25) + self.assert_cannot_reach_region(Region.skull_cavern_75) self.remove(items_for_skull_50) self.collect(items_for_skull_100) - self.assertTrue(floor_115.can_reach(self.multiworld.state)) - self.assertTrue(skull_25.can_reach(self.multiworld.state)) - self.assertTrue(skull_75.can_reach(self.multiworld.state)) + self.assert_can_reach_region(Region.mines_floor_115) + self.assert_can_reach_region(Region.skull_cavern_25) + self.assert_can_reach_region(Region.skull_cavern_75) def generate_items_for_mine_115(self) -> List[Item]: pickaxes = [self.get_item_by_name("Progressive Pickaxe")] * 2 diff --git a/worlds/stardew_valley/test/TestItemLink.py b/worlds/stardew_valley/test/TestItemLink.py index f1c8346142..c3029b6070 100644 --- a/worlds/stardew_valley/test/TestItemLink.py +++ b/worlds/stardew_valley/test/TestItemLink.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from .. import options, item_table, Group max_iterations = 2000 diff --git a/worlds/stardew_valley/test/TestItems.py b/worlds/stardew_valley/test/TestItems.py index 1d6f968955..d4fa9e832a 100644 --- a/worlds/stardew_valley/test/TestItems.py +++ b/worlds/stardew_valley/test/TestItems.py @@ -1,5 +1,5 @@ from BaseClasses import MultiWorld, get_seed, ItemClassification -from . import setup_solo_multiworld, SVTestCase, solo_multiworld +from .bases import SVTestCase, solo_multiworld, setup_solo_multiworld from .options.presets import allsanity_no_mods_6_x_x, get_minsanity_options from .. import StardewValleyWorld from ..items import Group, item_table diff --git a/worlds/stardew_valley/test/TestLogic.py b/worlds/stardew_valley/test/TestLogic.py index 7a6b81ea74..047e0226c6 100644 --- a/worlds/stardew_valley/test/TestLogic.py +++ b/worlds/stardew_valley/test/TestLogic.py @@ -3,8 +3,8 @@ import unittest from unittest import TestCase, SkipTest from BaseClasses import MultiWorld -from . import setup_solo_multiworld from .assertion import RuleAssertMixin +from .bases import setup_solo_multiworld from .options.presets import allsanity_mods_6_x_x, minimal_locations_maximal_items from .. import StardewValleyWorld from ..data.bundle_data import all_bundle_items_except_money diff --git a/worlds/stardew_valley/test/TestMonstersanity.py b/worlds/stardew_valley/test/TestMonstersanity.py new file mode 100644 index 0000000000..dd05827432 --- /dev/null +++ b/worlds/stardew_valley/test/TestMonstersanity.py @@ -0,0 +1,132 @@ +import unittest +from typing import ClassVar + +from .bases import SVTestBase +from .. import options +from ..locations import LocationTags, location_table +from ..mods.mod_data import ModNames + + +class SVMonstersanityTestBase(SVTestBase): + expected_progressive_generic_weapon: ClassVar[int] = 0 + expected_progressive_specific_weapon: ClassVar[int] = 0 + expected_progressive_slingshot: ClassVar[int] = 0 + expected_progressive_footwear: ClassVar[int] = 0 + expected_rings: ClassVar[list[str]] = [] + + @classmethod + def setUpClass(cls) -> None: + if cls is SVMonstersanityTestBase: + raise unittest.SkipTest("Base tests disabled") + + super().setUpClass() + + def test_when_generate_world_then_expected_generic_weapons_in_the_pool(self): + item_pool = [item.name for item in self.multiworld.itempool] + self.assertEqual(item_pool.count("Progressive Weapon"), self.expected_progressive_generic_weapon) + + def test_when_generate_world_then_expected_specific_weapons_in_the_pool(self): + item_pool = [item.name for item in self.multiworld.itempool] + self.assertEqual(item_pool.count("Progressive Sword"), self.expected_progressive_specific_weapon) + self.assertEqual(item_pool.count("Progressive Club"), self.expected_progressive_specific_weapon) + self.assertEqual(item_pool.count("Progressive Dagger"), self.expected_progressive_specific_weapon) + + def test_when_generate_world_then_expected_slingshots_in_the_pool(self): + item_pool = [item.name for item in self.multiworld.itempool] + self.assertEqual(item_pool.count("Progressive Slingshot"), self.expected_progressive_slingshot) + + def test_when_generate_world_then_expected_shoes_in_the_pool(self): + item_pool = [item.name for item in self.multiworld.itempool] + self.assertEqual(item_pool.count("Progressive Footwear"), self.expected_progressive_footwear) + + def test_when_generate_world_then_many_rings_in_the_pool(self): + item_pool = [item.name for item in self.multiworld.itempool] + for expected_ring in self.expected_rings: + self.assertIn(expected_ring, item_pool) + + def test_when_generate_world_then_all_monster_checks_are_inaccessible_with_empty_inventory(self): + for location in self.get_real_locations(): + if LocationTags.MONSTERSANITY not in location_table[location.name].tags: + continue + with self.subTest(location.name): + self.assert_cannot_reach_location(location.name) + + +class TestMonstersanityNone(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_none, + # Not really necessary, but it adds more locations, so we don't have to remove useful items. + options.Fishsanity: options.Fishsanity.option_all, + } + expected_progressive_generic_weapon = 5 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 3 + + @property + def run_default_tests(self) -> bool: + # None is default + return False + + +class TestMonstersanityNoneWithSVE(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_none, + options.Mods: ModNames.sve, + } + expected_progressive_generic_weapon = 6 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 3 + + @property + def run_default_tests(self) -> bool: + # None is default + return False + + +class TestMonstersanityGoals(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_goals, + } + expected_progressive_specific_weapon = 5 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 4 + + +class TestMonstersanityOnePerCategory(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_one_per_category, + } + expected_progressive_specific_weapon = 5 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 4 + + +class TestMonstersanityProgressive(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_progressive_goals, + } + expected_progressive_specific_weapon = 5 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 4 + expected_rings = ["Hot Java Ring", "Wedding Ring", "Slime Charmer Ring"] + + +class TestMonstersanitySplit(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_split_goals, + } + expected_progressive_specific_weapon = 5 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 4 + expected_rings = ["Hot Java Ring", "Wedding Ring", "Slime Charmer Ring"] + + +class TestMonstersanitySplitWithSVE(SVMonstersanityTestBase): + options = { + options.Monstersanity: options.Monstersanity.option_split_goals, + options.Mods: ModNames.sve, + } + expected_progressive_specific_weapon = 6 + expected_progressive_slingshot = 2 + expected_progressive_footwear = 4 + expected_rings = ["Hot Java Ring", "Wedding Ring", "Slime Charmer Ring"] diff --git a/worlds/stardew_valley/test/TestMultiplePlayers.py b/worlds/stardew_valley/test/TestMultiplePlayers.py index d8db616f66..3b57105595 100644 --- a/worlds/stardew_valley/test/TestMultiplePlayers.py +++ b/worlds/stardew_valley/test/TestMultiplePlayers.py @@ -1,4 +1,4 @@ -from . import SVTestCase, setup_multiworld +from .bases import SVTestCase, setup_multiworld from .. import True_ from ..options import FestivalLocations, StartingMoney from ..strings.festival_check_names import FestivalCheck diff --git a/worlds/stardew_valley/test/TestNumberLocations.py b/worlds/stardew_valley/test/TestNumberLocations.py index 2ed528086a..dd57a5e39b 100644 --- a/worlds/stardew_valley/test/TestNumberLocations.py +++ b/worlds/stardew_valley/test/TestNumberLocations.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from .options.presets import default_6_x_x, allsanity_no_mods_6_x_x, allsanity_mods_6_x_x_exclude_disabled, get_minsanity_options, \ minimal_locations_maximal_items, minimal_locations_maximal_items_with_island from .. import location_table diff --git a/worlds/stardew_valley/test/TestOptionFlags.py b/worlds/stardew_valley/test/TestOptionFlags.py index 2833649e35..d930157564 100644 --- a/worlds/stardew_valley/test/TestOptionFlags.py +++ b/worlds/stardew_valley/test/TestOptionFlags.py @@ -1,4 +1,4 @@ -from . import SVTestBase +from .bases import SVTestBase from .. import BuildingProgression from ..options import ToolProgression diff --git a/worlds/stardew_valley/test/TestOptions.py b/worlds/stardew_valley/test/TestOptions.py index 11b0a01415..738753fe83 100644 --- a/worlds/stardew_valley/test/TestOptions.py +++ b/worlds/stardew_valley/test/TestOptions.py @@ -3,8 +3,8 @@ from typing import ClassVar from BaseClasses import ItemClassification from test.param import classvar_matrix -from . import SVTestCase, solo_multiworld, SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestCase, SVTestBase, solo_multiworld from .options.option_names import all_option_choices from .options.presets import allsanity_no_mods_6_x_x, allsanity_mods_6_x_x from .. import items_by_group, Group diff --git a/worlds/stardew_valley/test/TestOptionsPairs.py b/worlds/stardew_valley/test/TestOptionsPairs.py index d489ab1ff2..addd748c42 100644 --- a/worlds/stardew_valley/test/TestOptionsPairs.py +++ b/worlds/stardew_valley/test/TestOptionsPairs.py @@ -1,5 +1,5 @@ -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .. import options diff --git a/worlds/stardew_valley/test/TestRandomWorlds.py b/worlds/stardew_valley/test/TestRandomWorlds.py index 550ae14b55..0c4ad6ae29 100644 --- a/worlds/stardew_valley/test/TestRandomWorlds.py +++ b/worlds/stardew_valley/test/TestRandomWorlds.py @@ -2,8 +2,8 @@ from typing import ClassVar from BaseClasses import MultiWorld, get_seed from test.param import classvar_matrix -from . import SVTestCase, skip_long_tests, solo_multiworld from .assertion import GoalAssertMixin, OptionAssertMixin, WorldAssertMixin +from .bases import skip_long_tests, SVTestCase, solo_multiworld from .options.option_names import generate_random_world_options diff --git a/worlds/stardew_valley/test/TestRegions.py b/worlds/stardew_valley/test/TestRegions.py deleted file mode 100644 index bd1b672974..0000000000 --- a/worlds/stardew_valley/test/TestRegions.py +++ /dev/null @@ -1,173 +0,0 @@ -import random -import unittest -from typing import Set - -from BaseClasses import get_seed -from . import SVTestCase -from .options.utils import fill_dataclass_with_default -from .. import create_content -from ..options import EntranceRandomization, ExcludeGingerIsland, SkillProgression -from ..regions import vanilla_regions, vanilla_connections, randomize_connections, RandomizationFlag, create_final_connections_and_regions -from ..strings.entrance_names import Entrance as EntranceName -from ..strings.region_names import Region as RegionName - -connections_by_name = {connection.name for connection in vanilla_connections} -regions_by_name = {region.name for region in vanilla_regions} - - -class TestRegions(unittest.TestCase): - def test_region_exits_lead_somewhere(self): - for region in vanilla_regions: - with self.subTest(region=region): - for exit in region.exits: - self.assertIn(exit, connections_by_name, - f"{region.name} is leading to {exit} but it does not exist.") - - def test_connection_lead_somewhere(self): - for connection in vanilla_connections: - with self.subTest(connection=connection): - self.assertIn(connection.destination, regions_by_name, - f"{connection.name} is leading to {connection.destination} but it does not exist.") - - -def explore_connections_tree_up_to_blockers(blocked_entrances: Set[str], connections_by_name, regions_by_name): - explored_entrances = set() - explored_regions = set() - entrances_to_explore = set() - current_node_name = "Menu" - current_node = regions_by_name[current_node_name] - entrances_to_explore.update(current_node.exits) - while entrances_to_explore: - current_entrance_name = entrances_to_explore.pop() - current_entrance = connections_by_name[current_entrance_name] - current_node_name = current_entrance.destination - - explored_entrances.add(current_entrance_name) - explored_regions.add(current_node_name) - - if current_entrance_name in blocked_entrances: - continue - - current_node = regions_by_name[current_node_name] - entrances_to_explore.update({entrance for entrance in current_node.exits if entrance not in explored_entrances}) - return explored_regions - - -class TestEntranceRando(SVTestCase): - - def test_entrance_randomization(self): - for option, flag in [(EntranceRandomization.option_pelican_town, RandomizationFlag.PELICAN_TOWN), - (EntranceRandomization.option_non_progression, RandomizationFlag.NON_PROGRESSION), - (EntranceRandomization.option_buildings_without_house, RandomizationFlag.BUILDINGS), - (EntranceRandomization.option_buildings, RandomizationFlag.BUILDINGS)]: - sv_options = fill_dataclass_with_default({ - EntranceRandomization.internal_name: option, - ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, - SkillProgression.internal_name: SkillProgression.option_progressive_with_masteries, - }) - content = create_content(sv_options) - seed = get_seed() - rand = random.Random(seed) - with self.subTest(flag=flag, msg=f"Seed: {seed}"): - entrances, regions = create_final_connections_and_regions(sv_options) - _, randomized_connections = randomize_connections(rand, sv_options, content, regions, entrances) - - for connection in vanilla_connections: - if flag in connection.flag: - connection_in_randomized = connection.name in randomized_connections - reverse_in_randomized = connection.reverse in randomized_connections - self.assertTrue(connection_in_randomized, f"Connection {connection.name} should be randomized but it is not in the output.") - self.assertTrue(reverse_in_randomized, f"Connection {connection.reverse} should be randomized but it is not in the output.") - - self.assertEqual(len(set(randomized_connections.values())), len(randomized_connections.values()), - f"Connections are duplicated in randomization.") - - def test_entrance_randomization_without_island(self): - for option, flag in [(EntranceRandomization.option_pelican_town, RandomizationFlag.PELICAN_TOWN), - (EntranceRandomization.option_non_progression, RandomizationFlag.NON_PROGRESSION), - (EntranceRandomization.option_buildings_without_house, RandomizationFlag.BUILDINGS), - (EntranceRandomization.option_buildings, RandomizationFlag.BUILDINGS)]: - - sv_options = fill_dataclass_with_default({ - EntranceRandomization.internal_name: option, - ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true, - SkillProgression.internal_name: SkillProgression.option_progressive_with_masteries, - }) - content = create_content(sv_options) - seed = get_seed() - rand = random.Random(seed) - with self.subTest(option=option, flag=flag, seed=seed): - entrances, regions = create_final_connections_and_regions(sv_options) - _, randomized_connections = randomize_connections(rand, sv_options, content, regions, entrances) - - for connection in vanilla_connections: - if flag in connection.flag: - if RandomizationFlag.GINGER_ISLAND in connection.flag: - self.assertNotIn(connection.name, randomized_connections, - f"Connection {connection.name} should not be randomized but it is in the output.") - self.assertNotIn(connection.reverse, randomized_connections, - f"Connection {connection.reverse} should not be randomized but it is in the output.") - else: - self.assertIn(connection.name, randomized_connections, - f"Connection {connection.name} should be randomized but it is not in the output.") - self.assertIn(connection.reverse, randomized_connections, - f"Connection {connection.reverse} should be randomized but it is not in the output.") - - self.assertEqual(len(set(randomized_connections.values())), len(randomized_connections.values()), - f"Connections are duplicated in randomization.") - - def test_cannot_put_island_access_on_island(self): - sv_options = fill_dataclass_with_default({ - EntranceRandomization.internal_name: EntranceRandomization.option_buildings, - ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, - SkillProgression.internal_name: SkillProgression.option_progressive_with_masteries, - }) - content = create_content(sv_options) - - for i in range(0, 100 if self.skip_long_tests else 10000): - seed = get_seed() - rand = random.Random(seed) - with self.subTest(msg=f"Seed: {seed}"): - entrances, regions = create_final_connections_and_regions(sv_options) - randomized_connections, randomized_data = randomize_connections(rand, sv_options, content, regions, entrances) - connections_by_name = {connection.name: connection for connection in randomized_connections} - - blocked_entrances = {EntranceName.use_island_obelisk, EntranceName.boat_to_ginger_island} - required_regions = {RegionName.wizard_tower, RegionName.boat_tunnel} - self.assert_can_reach_any_region_before_blockers(required_regions, blocked_entrances, connections_by_name, regions) - - def assert_can_reach_any_region_before_blockers(self, required_regions, blocked_entrances, connections_by_name, regions_by_name): - explored_regions = explore_connections_tree_up_to_blockers(blocked_entrances, connections_by_name, regions_by_name) - self.assertTrue(any(region in explored_regions for region in required_regions)) - - -class TestEntranceClassifications(SVTestCase): - - def test_non_progression_are_all_accessible_with_empty_inventory(self): - for option, flag in [(EntranceRandomization.option_pelican_town, RandomizationFlag.PELICAN_TOWN), - (EntranceRandomization.option_non_progression, RandomizationFlag.NON_PROGRESSION)]: - world_options = { - EntranceRandomization.internal_name: option - } - with self.solo_world_sub_test(world_options=world_options, flag=flag) as (multiworld, sv_world): - ap_entrances = {entrance.name: entrance for entrance in multiworld.get_entrances()} - for randomized_entrance in sv_world.randomized_entrances: - if randomized_entrance in ap_entrances: - ap_entrance_origin = ap_entrances[randomized_entrance] - self.assertTrue(ap_entrance_origin.access_rule(multiworld.state)) - if sv_world.randomized_entrances[randomized_entrance] in ap_entrances: - ap_entrance_destination = multiworld.get_entrance(sv_world.randomized_entrances[randomized_entrance], 1) - self.assertTrue(ap_entrance_destination.access_rule(multiworld.state)) - - def test_no_ginger_island_entrances_when_excluded(self): - world_options = { - EntranceRandomization.internal_name: EntranceRandomization.option_disabled, - ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_true - } - with self.solo_world_sub_test(world_options=world_options) as (multiworld, _): - ap_entrances = {entrance.name: entrance for entrance in multiworld.get_entrances()} - entrance_data_by_name = {entrance.name: entrance for entrance in vanilla_connections} - for entrance_name in ap_entrances: - entrance_data = entrance_data_by_name[entrance_name] - with self.subTest(f"{entrance_name}: {entrance_data.flag}"): - self.assertFalse(entrance_data.flag & RandomizationFlag.GINGER_ISLAND) diff --git a/worlds/stardew_valley/test/TestStartInventory.py b/worlds/stardew_valley/test/TestStartInventory.py index dc44a1bb45..43ee0e1329 100644 --- a/worlds/stardew_valley/test/TestStartInventory.py +++ b/worlds/stardew_valley/test/TestStartInventory.py @@ -1,5 +1,5 @@ -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .. import options diff --git a/worlds/stardew_valley/test/TestTraps.py b/worlds/stardew_valley/test/TestTraps.py index 9df07a6d74..130674a35d 100644 --- a/worlds/stardew_valley/test/TestTraps.py +++ b/worlds/stardew_valley/test/TestTraps.py @@ -1,7 +1,7 @@ import unittest -from . import SVTestBase from .assertion import WorldAssertMixin +from .bases import SVTestBase from .. import options, items_by_group, Group from ..options import TrapDistribution @@ -119,4 +119,3 @@ class TestDistributionIsRespectedAllTraps(WorldAssertMixin, SVTestBase): self.assertLess(num_bark, num_debris - threshold_difference) self.assertGreater(num_meow, num_time_flies + threshold_difference) self.assertGreater(num_meow, num_debris + threshold_difference) - diff --git a/worlds/stardew_valley/test/TestWalnutsanity.py b/worlds/stardew_valley/test/TestWalnutsanity.py index 5cc2f79e91..7111174d26 100644 --- a/worlds/stardew_valley/test/TestWalnutsanity.py +++ b/worlds/stardew_valley/test/TestWalnutsanity.py @@ -1,26 +1,47 @@ -from . import SVTestBase +import unittest + +from .bases import SVTestBase from ..options import ExcludeGingerIsland, Walnutsanity, ToolProgression, SkillProgression from ..strings.ap_names.ap_option_names import WalnutsanityOptionName +from ..strings.ap_names.transport_names import Transportation -class TestWalnutsanityNone(SVTestBase): +class SVWalnutsanityTestBase(SVTestBase): + expected_walnut_locations: set[str] = set() + unexpected_walnut_locations: set[str] = set() + + @classmethod + def setUpClass(cls) -> None: + if cls is SVWalnutsanityTestBase: + raise unittest.SkipTest("Base tests disabled") + + super().setUpClass() + + def test_walnut_locations(self): + location_names = {location.name for location in self.multiworld.get_locations()} + for location in self.expected_walnut_locations: + self.assertIn(location, location_names, f"{location} should be in the location names") + for location in self.unexpected_walnut_locations: + self.assertNotIn(location, location_names, f"{location} should not be in the location names") + + +class TestWalnutsanityNone(SVWalnutsanityTestBase): options = { ExcludeGingerIsland: ExcludeGingerIsland.option_false, Walnutsanity: Walnutsanity.preset_none, SkillProgression: ToolProgression.option_progressive, ToolProgression: ToolProgression.option_progressive, } - - def test_no_walnut_locations(self): - location_names = {location.name for location in self.multiworld.get_locations()} - self.assertNotIn("Open Golden Coconut", location_names) - self.assertNotIn("Fishing Walnut 4", location_names) - self.assertNotIn("Journal Scrap #6", location_names) - self.assertNotIn("Starfish Triangle", location_names) - self.assertNotIn("Bush Behind Coconut Tree", location_names) - self.assertNotIn("Purple Starfish Island Survey", location_names) - self.assertNotIn("Volcano Monsters Walnut 3", location_names) - self.assertNotIn("Cliff Over Island South Bush", location_names) + unexpected_walnut_locations = { + "Walnutsanity: Open Golden Coconut", + "Walnutsanity: Fishing Walnut 4", + "Walnutsanity: Journal Scrap #6", + "Walnutsanity: Starfish Triangle", + "Walnutsanity: Bush Behind Coconut Tree", + "Walnutsanity: Purple Starfish Island Survey", + "Walnutsanity: Volcano Monsters Walnut 3", + "Walnutsanity: Cliff Over Island South Bush", + } def test_logic_received_walnuts(self): # You need to receive 0, and collect 40 @@ -28,48 +49,53 @@ class TestWalnutsanityNone(SVTestBase): self.collect("Island West Turtle") self.collect("Progressive House") self.collect("5 Golden Walnuts", 10) + self.assert_cannot_reach_location(Transportation.parrot_express) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) self.collect("Island North Turtle") self.collect("Island Resort") self.collect("Open Professor Snail Cave") - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) + self.collect("Dig Site Bridge") self.collect("Island Farmhouse") self.collect("Qi Walnut Room") - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) + self.collect("Combat Level", 10) self.collect("Mining Level", 10) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) + self.collect("Progressive Slingshot") self.collect("Progressive Weapon", 5) self.collect("Progressive Pickaxe", 4) self.collect("Progressive Watering Can", 4) - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) -class TestWalnutsanityPuzzles(SVTestBase): +class TestWalnutsanityPuzzles(SVWalnutsanityTestBase): options = { ExcludeGingerIsland: ExcludeGingerIsland.option_false, Walnutsanity: frozenset({WalnutsanityOptionName.puzzles}), SkillProgression: ToolProgression.option_progressive, ToolProgression: ToolProgression.option_progressive, } - - def test_only_puzzle_walnut_locations(self): - location_names = {location.name for location in self.multiworld.get_locations()} - self.assertIn("Open Golden Coconut", location_names) - self.assertNotIn("Fishing Walnut 4", location_names) - self.assertNotIn("Journal Scrap #6", location_names) - self.assertNotIn("Starfish Triangle", location_names) - self.assertNotIn("Bush Behind Coconut Tree", location_names) - self.assertIn("Purple Starfish Island Survey", location_names) - self.assertNotIn("Volcano Monsters Walnut 3", location_names) - self.assertNotIn("Cliff Over Island South Bush", location_names) + expected_walnut_locations = { + "Walnutsanity: Open Golden Coconut", + "Walnutsanity: Purple Starfish Island Survey", + } + unexpected_walnut_locations = { + "Walnutsanity: Fishing Walnut 4", + "Walnutsanity: Journal Scrap #6", + "Walnutsanity: Starfish Triangle", + "Walnutsanity: Bush Behind Coconut Tree", + "Walnutsanity: Volcano Monsters Walnut 3", + "Walnutsanity: Cliff Over Island South Bush", + } def test_field_office_locations_require_professor_snail(self): - location_names = ["Complete Large Animal Collection", "Complete Snake Collection", "Complete Mummified Frog Collection", - "Complete Mummified Bat Collection", "Purple Flowers Island Survey", "Purple Starfish Island Survey", ] + location_names = ["Walnutsanity: Complete Large Animal Collection", "Walnutsanity: Complete Snake Collection", + "Walnutsanity: Complete Mummified Frog Collection", "Walnutsanity: Complete Mummified Bat Collection", + "Walnutsanity: Purple Flowers Island Survey", "Walnutsanity: Purple Starfish Island Survey", ] self.collect("Island Obelisk") self.collect("Island North Turtle") self.collect("Island West Turtle") @@ -90,40 +116,42 @@ class TestWalnutsanityPuzzles(SVTestBase): self.assert_can_reach_location(location) -class TestWalnutsanityBushes(SVTestBase): +class TestWalnutsanityBushes(SVWalnutsanityTestBase): options = { ExcludeGingerIsland: ExcludeGingerIsland.option_false, Walnutsanity: frozenset({WalnutsanityOptionName.bushes}), } - - def test_only_bush_walnut_locations(self): - location_names = {location.name for location in self.multiworld.get_locations()} - self.assertNotIn("Open Golden Coconut", location_names) - self.assertNotIn("Fishing Walnut 4", location_names) - self.assertNotIn("Journal Scrap #6", location_names) - self.assertNotIn("Starfish Triangle", location_names) - self.assertIn("Bush Behind Coconut Tree", location_names) - self.assertNotIn("Purple Starfish Island Survey", location_names) - self.assertNotIn("Volcano Monsters Walnut 3", location_names) - self.assertIn("Cliff Over Island South Bush", location_names) + expected_walnut_locations = { + "Walnutsanity: Bush Behind Coconut Tree", + "Walnutsanity: Cliff Over Island South Bush", + } + unexpected_walnut_locations = { + "Walnutsanity: Open Golden Coconut", + "Walnutsanity: Fishing Walnut 4", + "Walnutsanity: Journal Scrap #6", + "Walnutsanity: Starfish Triangle", + "Walnutsanity: Purple Starfish Island Survey", + "Walnutsanity: Volcano Monsters Walnut 3", + } -class TestWalnutsanityPuzzlesAndBushes(SVTestBase): +class TestWalnutsanityPuzzlesAndBushes(SVWalnutsanityTestBase): options = { ExcludeGingerIsland: ExcludeGingerIsland.option_false, Walnutsanity: frozenset({WalnutsanityOptionName.puzzles, WalnutsanityOptionName.bushes}), } - - def test_only_bush_walnut_locations(self): - location_names = {location.name for location in self.multiworld.get_locations()} - self.assertIn("Open Golden Coconut", location_names) - self.assertNotIn("Fishing Walnut 4", location_names) - self.assertNotIn("Journal Scrap #6", location_names) - self.assertNotIn("Starfish Triangle", location_names) - self.assertIn("Bush Behind Coconut Tree", location_names) - self.assertIn("Purple Starfish Island Survey", location_names) - self.assertNotIn("Volcano Monsters Walnut 3", location_names) - self.assertIn("Cliff Over Island South Bush", location_names) + expected_walnut_locations = { + "Walnutsanity: Open Golden Coconut", + "Walnutsanity: Bush Behind Coconut Tree", + "Walnutsanity: Purple Starfish Island Survey", + "Walnutsanity: Cliff Over Island South Bush", + } + unexpected_walnut_locations = { + "Walnutsanity: Fishing Walnut 4", + "Walnutsanity: Journal Scrap #6", + "Walnutsanity: Starfish Triangle", + "Walnutsanity: Volcano Monsters Walnut 3", + } def test_logic_received_walnuts(self): # You need to receive 25, and collect 15 @@ -131,82 +159,83 @@ class TestWalnutsanityPuzzlesAndBushes(SVTestBase): self.collect("Island West Turtle") self.collect("5 Golden Walnuts", 5) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) self.collect("Island North Turtle") - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) -class TestWalnutsanityDigSpots(SVTestBase): +class TestWalnutsanityDigSpots(SVWalnutsanityTestBase): options = { ExcludeGingerIsland: ExcludeGingerIsland.option_false, Walnutsanity: frozenset({WalnutsanityOptionName.dig_spots}), } - - def test_only_dig_spots_walnut_locations(self): - location_names = {location.name for location in self.multiworld.get_locations()} - self.assertNotIn("Open Golden Coconut", location_names) - self.assertNotIn("Fishing Walnut 4", location_names) - self.assertIn("Journal Scrap #6", location_names) - self.assertIn("Starfish Triangle", location_names) - self.assertNotIn("Bush Behind Coconut Tree", location_names) - self.assertNotIn("Purple Starfish Island Survey", location_names) - self.assertNotIn("Volcano Monsters Walnut 3", location_names) - self.assertNotIn("Cliff Over Island South Bush", location_names) + expected_walnut_locations = { + "Walnutsanity: Journal Scrap #6", + "Walnutsanity: Starfish Triangle", + } + unexpected_walnut_locations = { + "Walnutsanity: Open Golden Coconut", + "Walnutsanity: Fishing Walnut 4", + "Walnutsanity: Bush Behind Coconut Tree", + "Walnutsanity: Purple Starfish Island Survey", + "Walnutsanity: Volcano Monsters Walnut 3", + "Walnutsanity: Cliff Over Island South Bush", + } -class TestWalnutsanityRepeatables(SVTestBase): +class TestWalnutsanityRepeatables(SVWalnutsanityTestBase): options = { ExcludeGingerIsland: ExcludeGingerIsland.option_false, Walnutsanity: frozenset({WalnutsanityOptionName.repeatables}), } - - def test_only_repeatable_walnut_locations(self): - location_names = {location.name for location in self.multiworld.get_locations()} - self.assertNotIn("Open Golden Coconut", location_names) - self.assertIn("Fishing Walnut 4", location_names) - self.assertNotIn("Journal Scrap #6", location_names) - self.assertNotIn("Starfish Triangle", location_names) - self.assertNotIn("Bush Behind Coconut Tree", location_names) - self.assertNotIn("Purple Starfish Island Survey", location_names) - self.assertIn("Volcano Monsters Walnut 3", location_names) - self.assertNotIn("Cliff Over Island South Bush", location_names) + expected_walnut_locations = { + "Walnutsanity: Fishing Walnut 4", + "Walnutsanity: Volcano Monsters Walnut 3", + } + unexpected_walnut_locations = { + "Walnutsanity: Open Golden Coconut", + "Walnutsanity: Journal Scrap #6", + "Walnutsanity: Starfish Triangle", + "Walnutsanity: Bush Behind Coconut Tree", + "Walnutsanity: Purple Starfish Island Survey", + "Walnutsanity: Cliff Over Island South Bush", + } -class TestWalnutsanityAll(SVTestBase): +class TestWalnutsanityAll(SVWalnutsanityTestBase): options = { ExcludeGingerIsland: ExcludeGingerIsland.option_false, Walnutsanity: Walnutsanity.preset_all, } - - def test_all_walnut_locations(self): - location_names = {location.name for location in self.multiworld.get_locations()} - self.assertIn("Open Golden Coconut", location_names) - self.assertIn("Fishing Walnut 4", location_names) - self.assertIn("Journal Scrap #6", location_names) - self.assertIn("Starfish Triangle", location_names) - self.assertIn("Bush Behind Coconut Tree", location_names) - self.assertIn("Purple Starfish Island Survey", location_names) - self.assertIn("Volcano Monsters Walnut 3", location_names) - self.assertIn("Cliff Over Island South Bush", location_names) + expected_walnut_locations = { + "Walnutsanity: Open Golden Coconut", + "Walnutsanity: Fishing Walnut 4", + "Walnutsanity: Journal Scrap #6", + "Walnutsanity: Starfish Triangle", + "Walnutsanity: Bush Behind Coconut Tree", + "Walnutsanity: Purple Starfish Island Survey", + "Walnutsanity: Volcano Monsters Walnut 3", + "Walnutsanity: Cliff Over Island South Bush", + } def test_logic_received_walnuts(self): # You need to receive 40, and collect 4 self.collect("Island Obelisk") self.collect("Island West Turtle") - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) items = self.collect("5 Golden Walnuts", 8) - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) self.remove(items) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) items = self.collect("3 Golden Walnuts", 14) - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) self.remove(items) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) items = self.collect("Golden Walnut", 40) - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) self.remove(items) - self.assertFalse(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_cannot_reach_location(Transportation.parrot_express) self.collect("5 Golden Walnuts", 4) self.collect("3 Golden Walnuts", 6) self.collect("Golden Walnut", 2) - self.assertTrue(self.multiworld.state.can_reach_location("Parrot Express", self.player)) + self.assert_can_reach_location(Transportation.parrot_express) diff --git a/worlds/stardew_valley/test/__init__.py b/worlds/stardew_valley/test/__init__.py index 6a8011a37d..e69de29bb2 100644 --- a/worlds/stardew_valley/test/__init__.py +++ b/worlds/stardew_valley/test/__init__.py @@ -1,308 +0,0 @@ -import itertools -import logging -import os -import threading -import unittest -from contextlib import contextmanager -from typing import Dict, ClassVar, Iterable, Tuple, Optional, List, Union, Any - -from BaseClasses import MultiWorld, CollectionState, get_seed, Location, Item -from test.bases import WorldTestBase -from test.general import gen_steps, setup_solo_multiworld as setup_base_solo_multiworld -from worlds.AutoWorld import call_all -from .assertion import RuleAssertMixin -from .options.utils import fill_namespace_with_default, parse_class_option_keys, fill_dataclass_with_default -from .. import StardewValleyWorld, StardewItem, StardewRule -from ..logic.time_logic import MONTH_COEFFICIENT -from ..options import StardewValleyOption, options - -logger = logging.getLogger(__name__) - -DEFAULT_TEST_SEED = get_seed() -logger.info(f"Default Test Seed: {DEFAULT_TEST_SEED}") - - -def skip_default_tests() -> bool: - return not bool(os.environ.get("base", False)) - - -def skip_long_tests() -> bool: - return not bool(os.environ.get("long", False)) - - -class SVTestCase(unittest.TestCase): - skip_default_tests: bool = skip_default_tests() - """Set False to not skip the base fill tests""" - skip_long_tests: bool = skip_long_tests() - """Set False to run tests that take long""" - - @contextmanager - def solo_world_sub_test(self, msg: Optional[str] = None, - /, - world_options: Optional[Dict[Union[str, StardewValleyOption], Any]] = None, - *, - seed=DEFAULT_TEST_SEED, - world_caching=True, - **kwargs) -> Tuple[MultiWorld, StardewValleyWorld]: - if msg is not None: - msg += " " - else: - msg = "" - msg += f"[Seed = {seed}]" - - with self.subTest(msg, **kwargs): - with solo_multiworld(world_options, seed=seed, world_caching=world_caching) as (multiworld, world): - yield multiworld, world - - -class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase): - game = "Stardew Valley" - world: StardewValleyWorld - player: ClassVar[int] = 1 - - seed = DEFAULT_TEST_SEED - - @classmethod - def setUpClass(cls) -> None: - if cls is SVTestBase: - raise unittest.SkipTest("No running tests on SVTestBase import.") - - super().setUpClass() - - def world_setup(self, *args, **kwargs): - self.options = parse_class_option_keys(self.options) - - self.multiworld = setup_solo_multiworld(self.options, seed=self.seed) - self.multiworld.lock.acquire() - world = self.multiworld.worlds[self.player] - - self.original_state = self.multiworld.state.copy() - self.original_itempool = self.multiworld.itempool.copy() - self.unfilled_locations = self.multiworld.get_unfilled_locations(1) - if self.constructed: - self.world = world # noqa - - def tearDown(self) -> None: - self.multiworld.state = self.original_state - self.multiworld.itempool = self.original_itempool - for location in self.unfilled_locations: - location.item = None - - self.multiworld.lock.release() - - @property - def run_default_tests(self) -> bool: - if self.skip_default_tests: - return False - return super().run_default_tests - - def collect_months(self, months: int) -> None: - real_total_prog_items = self.world.total_progression_items - percent = months * MONTH_COEFFICIENT - self.collect("Stardrop", real_total_prog_items * 100 // percent) - self.world.total_progression_items = real_total_prog_items - - def collect_lots_of_money(self, percent: float = 0.25): - self.collect("Shipping Bin") - real_total_prog_items = self.world.total_progression_items - required_prog_items = int(round(real_total_prog_items * percent)) - self.collect("Stardrop", required_prog_items) - - def collect_all_the_money(self): - self.collect_lots_of_money(0.95) - - def collect_everything(self): - non_event_items = [item for item in self.multiworld.get_items() if item.code] - for item in non_event_items: - self.multiworld.state.collect(item) - - def collect_all_except(self, item_to_not_collect: str): - non_event_items = [item for item in self.multiworld.get_items() if item.code] - for item in non_event_items: - if item.name != item_to_not_collect: - self.multiworld.state.collect(item) - - def get_real_locations(self) -> List[Location]: - return [location for location in self.multiworld.get_locations(self.player) if location.address is not None] - - def get_real_location_names(self) -> List[str]: - return [location.name for location in self.get_real_locations()] - - def collect(self, item: Union[str, Item, Iterable[Item]], count: int = 1) -> Union[None, Item, List[Item]]: - assert count > 0 - - if not isinstance(item, str): - super().collect(item) - return - - if count == 1: - item = self.create_item(item) - self.multiworld.state.collect(item) - return item - - items = [] - for i in range(count): - item = self.create_item(item) - self.multiworld.state.collect(item) - items.append(item) - - return items - - def create_item(self, item: str) -> StardewItem: - return self.world.create_item(item) - - def get_all_created_items(self) -> list[str]: - return [item.name for item in itertools.chain(self.multiworld.get_items(), self.multiworld.precollected_items[self.player])] - - def remove_one_by_name(self, item: str) -> None: - self.remove(self.create_item(item)) - - def reset_collection_state(self) -> None: - self.multiworld.state = self.original_state.copy() - - def assert_rule_true(self, rule: StardewRule, state: CollectionState | None = None) -> None: - if state is None: - state = self.multiworld.state - super().assert_rule_true(rule, state) - - def assert_rule_false(self, rule: StardewRule, state: CollectionState | None = None) -> None: - if state is None: - state = self.multiworld.state - super().assert_rule_false(rule, state) - - def assert_can_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: - if state is None: - state = self.multiworld.state - super().assert_can_reach_location(location, state) - - def assert_cannot_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: - if state is None: - state = self.multiworld.state - super().assert_cannot_reach_location(location, state) - - -pre_generated_worlds = {} - - -@contextmanager -def solo_multiworld(world_options: Optional[Dict[Union[str, StardewValleyOption], Any]] = None, - *, - seed=DEFAULT_TEST_SEED, - world_caching=True) -> Tuple[MultiWorld, StardewValleyWorld]: - if not world_caching: - multiworld = setup_solo_multiworld(world_options, seed, _cache={}) - yield multiworld, multiworld.worlds[1] - else: - multiworld = setup_solo_multiworld(world_options, seed) - try: - multiworld.lock.acquire() - world = multiworld.worlds[1] - - original_state = multiworld.state.copy() - original_itempool = multiworld.itempool.copy() - unfilled_locations = multiworld.get_unfilled_locations(1) - - yield multiworld, world - - multiworld.state = original_state - multiworld.itempool = original_itempool - for location in unfilled_locations: - location.item = None - finally: - multiworld.lock.release() - - -# Mostly a copy of test.general.setup_solo_multiworld, I just don't want to change the core. -def setup_solo_multiworld(test_options: Optional[Dict[Union[str, StardewValleyOption], str]] = None, - seed=DEFAULT_TEST_SEED, - _cache: Dict[frozenset, MultiWorld] = {}, # noqa - _steps=gen_steps) -> MultiWorld: - test_options = parse_class_option_keys(test_options) - - # Yes I reuse the worlds generated between tests, its speeds the execution by a couple seconds - # If the simple dict caching ends up taking too much memory, we could replace it with some kind of lru cache. - should_cache = should_cache_world(test_options) - if should_cache: - frozen_options = make_hashable(test_options, seed) - cached_multi_world = search_world_cache(_cache, frozen_options) - if cached_multi_world: - print(f"Using cached solo multi world [Seed = {cached_multi_world.seed}] [Cache size = {len(_cache)}]") - return cached_multi_world - - multiworld = setup_base_solo_multiworld(StardewValleyWorld, (), seed=seed) - # print(f"Seed: {multiworld.seed}") # Uncomment to print the seed for every test - - args = fill_namespace_with_default(test_options) - multiworld.set_options(args) - - if "start_inventory" in test_options: - for item, amount in test_options["start_inventory"].items(): - for _ in range(amount): - multiworld.push_precollected(multiworld.create_item(item, 1)) - - for step in _steps: - call_all(multiworld, step) - - if should_cache: - add_to_world_cache(_cache, frozen_options, multiworld) # noqa - - # Lock is needed for multi-threading tests - setattr(multiworld, "lock", threading.Lock()) - - return multiworld - - -def should_cache_world(test_options): - if "start_inventory" in test_options: - return False - - trap_distribution_key = "trap_distribution" - if trap_distribution_key not in test_options: - return True - - trap_distribution = test_options[trap_distribution_key] - for key in trap_distribution: - if trap_distribution[key] != options.TrapDistribution.default_weight: - return False - - return True - - - -def make_hashable(test_options, seed): - return frozenset(test_options.items()).union({("seed", seed)}) - - -def search_world_cache(cache: Dict[frozenset, MultiWorld], frozen_options: frozenset) -> Optional[MultiWorld]: - try: - return cache[frozen_options] - except KeyError: - for cached_options, multi_world in cache.items(): - if frozen_options.issubset(cached_options): - return multi_world - return None - - -def add_to_world_cache(cache: Dict[frozenset, MultiWorld], frozen_options: frozenset, multi_world: MultiWorld) -> None: - # We could complete the key with all the default options, but that does not seem to improve performances. - cache[frozen_options] = multi_world - - -def setup_multiworld(test_options: Iterable[Dict[str, int]] = None, seed=None) -> MultiWorld: # noqa - if test_options is None: - test_options = [] - - multiworld = MultiWorld(len(test_options)) - multiworld.player_name = {} - multiworld.set_seed(seed) - multiworld.state = CollectionState(multiworld) - for i in range(1, len(test_options) + 1): - multiworld.game[i] = StardewValleyWorld.game - multiworld.player_name.update({i: f"Tester{i}"}) - args = fill_namespace_with_default(test_options) - multiworld.set_options(args) - - for step in gen_steps: - call_all(multiworld, step) - - return multiworld diff --git a/worlds/stardew_valley/test/assertion/rule_assert.py b/worlds/stardew_valley/test/assertion/rule_assert.py index 02362f2d15..39b69a529f 100644 --- a/worlds/stardew_valley/test/assertion/rule_assert.py +++ b/worlds/stardew_valley/test/assertion/rule_assert.py @@ -1,7 +1,7 @@ from typing import List from unittest import TestCase -from BaseClasses import CollectionState, Location, Region +from BaseClasses import CollectionState, Location, Region, Entrance from ...stardew_rule import StardewRule, false_, MISSING_ITEM, Reach from ...stardew_rule.rule_explain import explain @@ -79,3 +79,13 @@ class RuleAssertMixin(TestCase): except KeyError as e: raise AssertionError(f"Error while checking region {region_name}: {e}" f"\nExplanation: {expl}") + + def assert_can_reach_entrance(self, entrance: Entrance | str, state: CollectionState) -> None: + entrance_name = entrance.name if isinstance(entrance, Entrance) else entrance + expl = explain(Reach(entrance_name, "Entrance", 1), state) + try: + can_reach = state.can_reach_entrance(entrance_name, 1) + self.assertTrue(can_reach, expl) + except KeyError as e: + raise AssertionError(f"Error while checking entrance {entrance_name}: {e}" + f"\nExplanation: {expl}") diff --git a/worlds/stardew_valley/test/bases.py b/worlds/stardew_valley/test/bases.py new file mode 100644 index 0000000000..4370c05d7b --- /dev/null +++ b/worlds/stardew_valley/test/bases.py @@ -0,0 +1,319 @@ +import itertools +import logging +import os +import threading +import typing +import unittest +from collections.abc import Iterable +from contextlib import contextmanager + +from BaseClasses import get_seed, MultiWorld, Location, Item, Region, CollectionState, Entrance +from test.bases import WorldTestBase +from test.general import gen_steps, setup_solo_multiworld as setup_base_solo_multiworld +from worlds.AutoWorld import call_all +from .assertion import RuleAssertMixin +from .options.utils import parse_class_option_keys, fill_namespace_with_default +from .. import StardewValleyWorld, StardewItem, StardewRule +from ..logic.time_logic import MONTH_COEFFICIENT +from ..options import StardewValleyOption, options + +logger = logging.getLogger(__name__) + +DEFAULT_TEST_SEED = get_seed() +logger.info(f"Default Test Seed: {DEFAULT_TEST_SEED}") + + +def skip_default_tests() -> bool: + return not bool(os.environ.get("base", False)) + + +def skip_long_tests() -> bool: + return not bool(os.environ.get("long", False)) + + +class SVTestCase(unittest.TestCase): + skip_default_tests: bool = skip_default_tests() + """Set False to not skip the base fill tests""" + skip_long_tests: bool = skip_long_tests() + """Set False to run tests that take long""" + + @contextmanager + def solo_world_sub_test(self, msg: str | None = None, + /, + world_options: dict[str | type[StardewValleyOption], typing.Any] | None = None, + *, + seed=DEFAULT_TEST_SEED, + world_caching=True, + **kwargs) -> Iterable[tuple[MultiWorld, StardewValleyWorld]]: + if msg is not None: + msg += " " + else: + msg = "" + msg += f"[Seed = {seed}]" + + with self.subTest(msg, **kwargs): + with solo_multiworld(world_options, seed=seed, world_caching=world_caching) as (multiworld, world): + yield multiworld, world + + +class SVTestBase(RuleAssertMixin, WorldTestBase, SVTestCase): + game = "Stardew Valley" + world: StardewValleyWorld + + seed = DEFAULT_TEST_SEED + + @classmethod + def setUpClass(cls) -> None: + if cls is SVTestBase: + raise unittest.SkipTest("No running tests on SVTestBase import.") + + super().setUpClass() + + def world_setup(self, *args, **kwargs): + self.options = parse_class_option_keys(self.options) + + self.multiworld = setup_solo_multiworld(self.options, seed=self.seed) + self.multiworld.lock.acquire() + world = self.multiworld.worlds[self.player] + + self.original_state = self.multiworld.state.copy() + self.original_itempool = self.multiworld.itempool.copy() + self.unfilled_locations = self.multiworld.get_unfilled_locations(1) + if self.constructed: + self.world = world # noqa + + def tearDown(self) -> None: + self.multiworld.state = self.original_state + self.multiworld.itempool = self.original_itempool + for location in self.unfilled_locations: + location.item = None + + self.multiworld.lock.release() + + @property + def run_default_tests(self) -> bool: + if self.skip_default_tests: + return False + return super().run_default_tests + + def collect_months(self, months: int) -> None: + real_total_prog_items = self.world.total_progression_items + percent = months * MONTH_COEFFICIENT + self.collect("Stardrop", real_total_prog_items * 100 // percent) + self.world.total_progression_items = real_total_prog_items + + def collect_lots_of_money(self, percent: float = 0.25): + self.collect("Shipping Bin") + real_total_prog_items = self.world.total_progression_items + required_prog_items = int(round(real_total_prog_items * percent)) + self.collect("Stardrop", required_prog_items) + + def collect_all_the_money(self): + self.collect_lots_of_money(0.95) + + def collect_everything(self): + non_event_items = [item for item in self.multiworld.get_items() if item.code] + for item in non_event_items: + self.multiworld.state.collect(item) + + def collect_all_except(self, item_to_not_collect: str): + non_event_items = [item for item in self.multiworld.get_items() if item.code] + for item in non_event_items: + if item.name != item_to_not_collect: + self.multiworld.state.collect(item) + + def get_real_locations(self) -> list[Location]: + return [location for location in self.multiworld.get_locations(self.player) if location.address is not None] + + def get_real_location_names(self) -> list[str]: + return [location.name for location in self.get_real_locations()] + + def collect(self, item: str | Item | Iterable[Item], count: int = 1) -> Item | list[Item] | None: + assert count > 0 + + if not isinstance(item, str): + return super().collect(item) + + if count == 1: + item = self.create_item(item) + self.multiworld.state.collect(item) + return item + + items = [] + for i in range(count): + item = self.create_item(item) + self.multiworld.state.collect(item) + items.append(item) + + return items + + def create_item(self, item: str) -> StardewItem: + return self.world.create_item(item) + + def get_all_created_items(self) -> list[str]: + return [item.name for item in itertools.chain(self.multiworld.get_items(), self.multiworld.precollected_items[self.player])] + + def remove_one_by_name(self, item: str) -> None: + self.remove(self.create_item(item)) + + def reset_collection_state(self) -> None: + self.multiworld.state = self.original_state.copy() + + def assert_rule_true(self, rule: StardewRule, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + return super().assert_rule_true(rule, state) + + def assert_rule_false(self, rule: StardewRule, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + return super().assert_rule_false(rule, state) + + def assert_can_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + return super().assert_can_reach_location(location, state) + + def assert_cannot_reach_location(self, location: Location | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + return super().assert_cannot_reach_location(location, state) + + def assert_can_reach_region(self, region: Region | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + return super().assert_can_reach_region(region, state) + + def assert_cannot_reach_region(self, region: Region | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + return super().assert_cannot_reach_region(region, state) + + def assert_can_reach_entrance(self, entrance: Entrance | str, state: CollectionState | None = None) -> None: + if state is None: + state = self.multiworld.state + return super().assert_can_reach_entrance(entrance, state) + + +pre_generated_worlds = {} + + +@contextmanager +def solo_multiworld(world_options: dict[str | type[StardewValleyOption], typing.Any] | None = None, + *, + seed=DEFAULT_TEST_SEED, + world_caching=True) -> Iterable[tuple[MultiWorld, StardewValleyWorld]]: + if not world_caching: + multiworld = setup_solo_multiworld(world_options, seed, _cache={}) + yield multiworld, typing.cast(StardewValleyWorld, multiworld.worlds[1]) + else: + multiworld = setup_solo_multiworld(world_options, seed) + try: + multiworld.lock.acquire() + original_state = multiworld.state.copy() + original_itempool = multiworld.itempool.copy() + unfilled_locations = multiworld.get_unfilled_locations(1) + + yield multiworld, typing.cast(StardewValleyWorld, multiworld.worlds[1]) + + multiworld.state = original_state + multiworld.itempool = original_itempool + for location in unfilled_locations: + location.item = None + finally: + multiworld.lock.release() + + +# Mostly a copy of test.general.setup_solo_multiworld, I just don't want to change the core. +def setup_solo_multiworld(test_options: dict[str | type[StardewValleyOption], str] | None = None, + seed=DEFAULT_TEST_SEED, + _cache: dict[frozenset, MultiWorld] = {}, # noqa + _steps=gen_steps) -> MultiWorld: + test_options = parse_class_option_keys(test_options) + + # Yes I reuse the worlds generated between tests, its speeds the execution by a couple seconds + # If the simple dict caching ends up taking too much memory, we could replace it with some kind of lru cache. + should_cache = should_cache_world(test_options) + if should_cache: + frozen_options = make_hashable(test_options, seed) + cached_multi_world = search_world_cache(_cache, frozen_options) + if cached_multi_world: + print(f"Using cached solo multi world [Seed = {cached_multi_world.seed}] [Cache size = {len(_cache)}]") + return cached_multi_world + + multiworld = setup_base_solo_multiworld(StardewValleyWorld, (), seed=seed) + # print(f"Seed: {multiworld.seed}") # Uncomment to print the seed for every test + + args = fill_namespace_with_default(test_options) + multiworld.set_options(args) + + if "start_inventory" in test_options: + for item, amount in test_options["start_inventory"].items(): + for _ in range(amount): + multiworld.push_precollected(multiworld.create_item(item, 1)) + + for step in _steps: + call_all(multiworld, step) + + if should_cache: + add_to_world_cache(_cache, frozen_options, multiworld) # noqa + + # Lock is needed for multi-threading tests + setattr(multiworld, "lock", threading.Lock()) + + return multiworld + + +def should_cache_world(test_options): + if "start_inventory" in test_options: + return False + + trap_distribution_key = "trap_distribution" + if trap_distribution_key not in test_options: + return True + + trap_distribution = test_options[trap_distribution_key] + for key in trap_distribution: + if trap_distribution[key] != options.TrapDistribution.default_weight: + return False + + return True + + +def make_hashable(test_options, seed): + return frozenset(test_options.items()).union({("seed", seed)}) + + +def search_world_cache(cache: dict[frozenset, MultiWorld], frozen_options: frozenset) -> MultiWorld | None: + try: + return cache[frozen_options] + except KeyError: + for cached_options, multi_world in cache.items(): + if frozen_options.issubset(cached_options): + return multi_world + return None + + +def add_to_world_cache(cache: dict[frozenset, MultiWorld], frozen_options: frozenset, multi_world: MultiWorld) -> None: + # We could complete the key with all the default options, but that does not seem to improve performances. + cache[frozen_options] = multi_world + + +def setup_multiworld(test_options: Iterable[dict[str, int]] | None = None, seed=None) -> MultiWorld: # noqa + if test_options is None: + test_options = [] + + multiworld = MultiWorld(len(test_options)) + multiworld.player_name = {} + multiworld.set_seed(seed) + for i in range(1, len(test_options) + 1): + multiworld.game[i] = StardewValleyWorld.game + multiworld.player_name.update({i: f"Tester{i}"}) + args = fill_namespace_with_default(test_options) + multiworld.set_options(args) + multiworld.state = CollectionState(multiworld) + + for step in gen_steps: + call_all(multiworld, step) + + return multiworld diff --git a/worlds/stardew_valley/test/content/TestGingerIsland.py b/worlds/stardew_valley/test/content/TestGingerIsland.py index 7e7f866dfc..c1f16b48c4 100644 --- a/worlds/stardew_valley/test/content/TestGingerIsland.py +++ b/worlds/stardew_valley/test/content/TestGingerIsland.py @@ -1,5 +1,5 @@ from . import SVContentPackTestBase -from .. import SVTestBase +from ..bases import SVTestBase from ... import options from ...content import content_packs from ...data.artisan import MachineSource diff --git a/worlds/stardew_valley/test/content/mods/TestSVE.py b/worlds/stardew_valley/test/content/mods/TestSVE.py index 4065498d6b..7cd0a822a1 100644 --- a/worlds/stardew_valley/test/content/mods/TestSVE.py +++ b/worlds/stardew_valley/test/content/mods/TestSVE.py @@ -1,5 +1,5 @@ from .. import SVContentPackTestBase -from ... import SVTestBase +from ...bases import SVTestBase from .... import options from ....content import content_packs from ....mods.mod_data import ModNames diff --git a/worlds/stardew_valley/test/long/TestModsLong.py b/worlds/stardew_valley/test/long/TestModsLong.py index bc5e8bfff8..d14af8bc55 100644 --- a/worlds/stardew_valley/test/long/TestModsLong.py +++ b/worlds/stardew_valley/test/long/TestModsLong.py @@ -4,8 +4,8 @@ from typing import ClassVar from BaseClasses import get_seed from test.param import classvar_matrix -from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion import WorldAssertMixin, ModAssertMixin +from ..bases import skip_long_tests, SVTestCase, solo_multiworld from ..options.option_names import all_option_choices from ... import options from ...mods.mod_data import ModNames diff --git a/worlds/stardew_valley/test/long/TestOptionsLong.py b/worlds/stardew_valley/test/long/TestOptionsLong.py index db467964e7..3c9690e2e6 100644 --- a/worlds/stardew_valley/test/long/TestOptionsLong.py +++ b/worlds/stardew_valley/test/long/TestOptionsLong.py @@ -4,8 +4,8 @@ from typing import ClassVar from BaseClasses import get_seed from test.param import classvar_matrix -from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion.world_assert import WorldAssertMixin +from ..bases import skip_long_tests, SVTestCase, solo_multiworld from ..options.option_names import all_option_choices from ... import options diff --git a/worlds/stardew_valley/test/long/TestPreRolledRandomness.py b/worlds/stardew_valley/test/long/TestPreRolledRandomness.py index 3b6f818ec4..3d3e0da13b 100644 --- a/worlds/stardew_valley/test/long/TestPreRolledRandomness.py +++ b/worlds/stardew_valley/test/long/TestPreRolledRandomness.py @@ -3,8 +3,8 @@ from typing import ClassVar from BaseClasses import get_seed from test.param import classvar_matrix -from .. import SVTestCase, solo_multiworld, skip_long_tests from ..assertion import WorldAssertMixin +from ..bases import skip_long_tests, SVTestCase, solo_multiworld from ... import options if skip_long_tests(): diff --git a/worlds/stardew_valley/test/mods/TestBiggerBackpack.py b/worlds/stardew_valley/test/mods/TestBiggerBackpack.py index f6d312976c..8ec2e539b7 100644 --- a/worlds/stardew_valley/test/mods/TestBiggerBackpack.py +++ b/worlds/stardew_valley/test/mods/TestBiggerBackpack.py @@ -1,4 +1,4 @@ -from .. import SVTestBase +from ..bases import SVTestBase from ...mods.mod_data import ModNames from ...options import Mods, BackpackProgression diff --git a/worlds/stardew_valley/test/mods/TestMods.py b/worlds/stardew_valley/test/mods/TestMods.py index bd5d7d626d..8cff10b4fc 100644 --- a/worlds/stardew_valley/test/mods/TestMods.py +++ b/worlds/stardew_valley/test/mods/TestMods.py @@ -1,17 +1,13 @@ -import random from typing import ClassVar -from BaseClasses import get_seed from test.param import classvar_matrix -from .. import SVTestBase, SVTestCase, solo_multiworld from ..TestGeneration import get_all_permanent_progression_items from ..assertion import ModAssertMixin, WorldAssertMixin +from ..bases import SVTestCase, SVTestBase, solo_multiworld from ..options.presets import allsanity_mods_6_x_x -from ..options.utils import fill_dataclass_with_default -from ... import options, Group, create_content +from ... import options, Group from ...mods.mod_data import ModNames from ...options.options import all_mods -from ...regions import RandomizationFlag, randomize_connections, create_final_connections_and_regions class TestCanGenerateAllsanityWithMods(WorldAssertMixin, ModAssertMixin, SVTestCase): @@ -117,39 +113,6 @@ class TestNoGingerIslandModItemGeneration(SVTestBase): self.assertIn(progression_item.name, all_created_items) -class TestModEntranceRando(SVTestCase): - - def test_mod_entrance_randomization(self): - for option, flag in [(options.EntranceRandomization.option_pelican_town, RandomizationFlag.PELICAN_TOWN), - (options.EntranceRandomization.option_non_progression, RandomizationFlag.NON_PROGRESSION), - (options.EntranceRandomization.option_buildings_without_house, RandomizationFlag.BUILDINGS), - (options.EntranceRandomization.option_buildings, RandomizationFlag.BUILDINGS)]: - sv_options = fill_dataclass_with_default({ - options.EntranceRandomization.internal_name: option, - options.ExcludeGingerIsland.internal_name: options.ExcludeGingerIsland.option_false, - options.SkillProgression.internal_name: options.SkillProgression.option_progressive_with_masteries, - options.Mods.internal_name: frozenset(options.Mods.valid_keys) - }) - content = create_content(sv_options) - seed = get_seed() - rand = random.Random(seed) - with self.subTest(option=option, flag=flag, seed=seed): - final_connections, final_regions = create_final_connections_and_regions(sv_options) - - _, randomized_connections = randomize_connections(rand, sv_options, content, final_regions, final_connections) - - for connection_name in final_connections: - connection = final_connections[connection_name] - if flag in connection.flag: - connection_in_randomized = connection_name in randomized_connections - reverse_in_randomized = connection.reverse in randomized_connections - self.assertTrue(connection_in_randomized, f"Connection {connection_name} should be randomized but it is not in the output") - self.assertTrue(reverse_in_randomized, f"Connection {connection.reverse} should be randomized but it is not in the output.") - - self.assertEqual(len(set(randomized_connections.values())), len(randomized_connections.values()), - f"Connections are duplicated in randomization.") - - class TestVanillaLogicAlternativeWhenQuestsAreNotRandomized(WorldAssertMixin, SVTestBase): """We often forget to add an alternative rule that works when quests are not randomized. When this happens, some Location are not reachable because they depend on items that are only added to the pool when quests are randomized. diff --git a/worlds/stardew_valley/test/mods/TestModsFill.py b/worlds/stardew_valley/test/mods/TestModsFill.py index a140f5abae..334a4ff9e4 100644 --- a/worlds/stardew_valley/test/mods/TestModsFill.py +++ b/worlds/stardew_valley/test/mods/TestModsFill.py @@ -1,4 +1,4 @@ -from .. import SVTestBase +from ..bases import SVTestBase from ... import options diff --git a/worlds/stardew_valley/test/mods/TestSVE.py b/worlds/stardew_valley/test/mods/TestSVE.py index ca63dcb351..a6b6f6a3dc 100644 --- a/worlds/stardew_valley/test/mods/TestSVE.py +++ b/worlds/stardew_valley/test/mods/TestSVE.py @@ -1,4 +1,4 @@ -from .. import SVTestBase +from ..bases import SVTestBase from ... import options from ...mods.mod_data import ModNames from ...strings.ap_names.mods.mod_items import SVEQuestItem diff --git a/worlds/stardew_valley/test/options/TestPresets.py b/worlds/stardew_valley/test/options/TestPresets.py index 5d9e89531c..5c1cee4a58 100644 --- a/worlds/stardew_valley/test/options/TestPresets.py +++ b/worlds/stardew_valley/test/options/TestPresets.py @@ -1,5 +1,5 @@ from Options import PerGameCommonOptions, OptionSet, OptionDict -from .. import SVTestCase +from ..bases import SVTestCase from ...options import StardewValleyOptions, TrapItems from ...options.presets import sv_options_presets diff --git a/worlds/stardew_valley/test/options/utils.py b/worlds/stardew_valley/test/options/utils.py index 9f02105da8..1ed88974ec 100644 --- a/worlds/stardew_valley/test/options/utils.py +++ b/worlds/stardew_valley/test/options/utils.py @@ -7,7 +7,7 @@ from ... import StardewValleyWorld from ...options import StardewValleyOptions, StardewValleyOption -def parse_class_option_keys(test_options: dict[str | StardewValleyOption, Any] | None) -> dict: +def parse_class_option_keys(test_options: dict[str | type[StardewValleyOption], Any] | None) -> dict: """ Now the option class is allowed as key. """ if test_options is None: return {} @@ -25,7 +25,7 @@ def parse_class_option_keys(test_options: dict[str | StardewValleyOption, Any] | return parsed_options -def fill_dataclass_with_default(test_options: dict[str | StardewValleyOption, Any] | None) -> StardewValleyOptions: +def fill_dataclass_with_default(test_options: dict[str | type[StardewValleyOption], Any] | None) -> StardewValleyOptions: test_options = parse_class_option_keys(test_options) filled_options = {} diff --git a/worlds/stardew_valley/test/performance/TestPerformance.py b/worlds/stardew_valley/test/performance/TestPerformance.py index ca63ee5e2c..2951e6d00a 100644 --- a/worlds/stardew_valley/test/performance/TestPerformance.py +++ b/worlds/stardew_valley/test/performance/TestPerformance.py @@ -8,7 +8,7 @@ from typing import List from BaseClasses import get_seed from Fill import distribute_items_restrictive, balance_multiworld_progression from worlds import AutoWorld -from .. import SVTestCase, setup_multiworld +from ..bases import SVTestCase, setup_multiworld from ..options.presets import default_6_x_x, allsanity_no_mods_6_x_x, allsanity_mods_6_x_x, minimal_locations_maximal_items assert default_6_x_x diff --git a/worlds/stardew_valley/test/regions/TestEntranceClassifications.py b/worlds/stardew_valley/test/regions/TestEntranceClassifications.py new file mode 100644 index 0000000000..4bc13cb51c --- /dev/null +++ b/worlds/stardew_valley/test/regions/TestEntranceClassifications.py @@ -0,0 +1,36 @@ +from ..bases import SVTestBase +from ... import options +from ...regions.model import RandomizationFlag +from ...regions.regions import create_all_connections + + +class EntranceRandomizationAssertMixin: + + def assert_non_progression_are_all_accessible_with_empty_inventory(self: SVTestBase): + all_connections = create_all_connections(self.world.content.registered_packs) + non_progression_connections = [connection for connection in all_connections.values() if RandomizationFlag.BIT_NON_PROGRESSION in connection.flag] + + for non_progression_connections in non_progression_connections: + with self.subTest(connection=non_progression_connections.name): + self.assert_can_reach_entrance(non_progression_connections.name) + + +# This test does not actually need to generate with entrance randomization. Entrances rules are the same regardless of the randomization. +class TestVanillaEntranceClassifications(EntranceRandomizationAssertMixin, SVTestBase): + options = { + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false, + options.Mods: frozenset() + } + + def test_non_progression_are_all_accessible_with_empty_inventory(self): + self.assert_non_progression_are_all_accessible_with_empty_inventory() + + +class TestModdedEntranceClassifications(EntranceRandomizationAssertMixin, SVTestBase): + options = { + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false, + options.Mods: frozenset(options.Mods.valid_keys) + } + + def test_non_progression_are_all_accessible_with_empty_inventory(self): + self.assert_non_progression_are_all_accessible_with_empty_inventory() diff --git a/worlds/stardew_valley/test/regions/TestEntranceRandomization.py b/worlds/stardew_valley/test/regions/TestEntranceRandomization.py new file mode 100644 index 0000000000..15c46637ab --- /dev/null +++ b/worlds/stardew_valley/test/regions/TestEntranceRandomization.py @@ -0,0 +1,167 @@ +from collections import deque +from collections.abc import Collection +from unittest.mock import patch, Mock + +from BaseClasses import get_seed, MultiWorld, Entrance +from ..assertion import WorldAssertMixin +from ..bases import SVTestCase, solo_multiworld +from ... import options +from ...mods.mod_data import ModNames +from ...options import EntranceRandomization, ExcludeGingerIsland, SkillProgression +from ...options.options import all_mods +from ...regions.entrance_rando import create_entrance_rando_target, prepare_mod_data, connect_regions +from ...regions.model import RegionData, ConnectionData, RandomizationFlag +from ...strings.entrance_names import Entrance as EntranceName +from ...strings.region_names import Region as RegionName + + +class TestEntranceRando(SVTestCase): + + def test_given_connection_matching_randomization_when_connect_regions_then_make_connection_entrance_rando_target(self): + region_data_by_name = { + "Region1": RegionData("Region1", ("randomized_connection", "not_randomized")), + "Region2": RegionData("Region2"), + "Region3": RegionData("Region3"), + } + connection_data_by_name = { + "randomized_connection": ConnectionData("randomized_connection", "Region2", flag=RandomizationFlag.PELICAN_TOWN), + "not_randomized": ConnectionData("not_randomized", "Region2", flag=RandomizationFlag.BUILDINGS), + } + regions_by_name = { + "Region1": Mock(), + "Region2": Mock(), + "Region3": Mock(), + } + player_randomization_flag = RandomizationFlag.BIT_PELICAN_TOWN + + with patch("worlds.stardew_valley.regions.entrance_rando.create_entrance_rando_target") as mock_create_entrance_rando_target: + connect_regions(region_data_by_name, connection_data_by_name, regions_by_name, player_randomization_flag) + + expected_origin, expected_destination = regions_by_name["Region1"], regions_by_name["Region2"] + expected_connection = connection_data_by_name["randomized_connection"] + mock_create_entrance_rando_target.assert_called_once_with(expected_origin, expected_destination, expected_connection) + + def test_when_create_entrance_rando_target_then_create_exit_and_er_target(self): + origin = Mock() + destination = Mock() + connection_data = ConnectionData("origin to destination", "destination") + + create_entrance_rando_target(origin, destination, connection_data) + + origin.create_exit.assert_called_once_with("origin to destination") + destination.create_er_target.assert_called_once_with("destination to origin") + + def test_when_prepare_mod_data_then_swapped_connections_contains_both_directions(self): + placements = Mock(pairings=[("A to B", "C to A"), ("C to D", "A to C")]) + + swapped_connections = prepare_mod_data(placements) + + self.assertEqual({"A to B": "A to C", "C to A": "B to A", "C to D": "C to A", "A to C": "D to C"}, swapped_connections) + + +class TestEntranceRandoCreatesValidWorlds(WorldAssertMixin, SVTestCase): + + # The following tests validate that ER still generates winnable and logically-sane games with given mods. + # Mods that do not interact with entrances are skipped + # Not all ER settings are tested, because 'buildings' is, essentially, a superset of all others + def test_ginger_island_excluded_buildings(self): + world_options = { + options.EntranceRandomization: options.EntranceRandomization.option_buildings, + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_true + } + with solo_multiworld(world_options) as (multi_world, _): + self.assert_basic_checks(multi_world) + + def test_deepwoods_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.deepwoods, options.EntranceRandomization.option_buildings) + + def test_juna_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.juna, options.EntranceRandomization.option_buildings) + + def test_jasper_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.jasper, options.EntranceRandomization.option_buildings) + + def test_alec_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.alec, options.EntranceRandomization.option_buildings) + + def test_yoba_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.yoba, options.EntranceRandomization.option_buildings) + + def test_eugene_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.eugene, options.EntranceRandomization.option_buildings) + + def test_ayeisha_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.ayeisha, options.EntranceRandomization.option_buildings) + + def test_riley_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.riley, options.EntranceRandomization.option_buildings) + + def test_sve_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.sve, options.EntranceRandomization.option_buildings) + + def test_alecto_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.alecto, options.EntranceRandomization.option_buildings) + + def test_lacey_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.lacey, options.EntranceRandomization.option_buildings) + + def test_boarding_house_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(ModNames.boarding_house, options.EntranceRandomization.option_buildings) + + def test_all_mods_entrance_randomization_buildings(self): + self.perform_basic_checks_on_mod_with_er(all_mods, options.EntranceRandomization.option_buildings) + + def perform_basic_checks_on_mod_with_er(self, mods: str | set[str], er_option: int) -> None: + if isinstance(mods, str): + mods = {mods} + world_options = { + options.EntranceRandomization: er_option, + options.Mods: frozenset(mods), + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false + } + with solo_multiworld(world_options) as (multi_world, _): + self.assert_basic_checks(multi_world) + + +# GER should have this covered, but it's good to have a backup +class TestGingerIslandEntranceRando(SVTestCase): + def test_cannot_put_island_access_on_island(self): + test_options = { + options.EntranceRandomization: EntranceRandomization.option_buildings, + options.ExcludeGingerIsland: ExcludeGingerIsland.option_false, + options.SkillProgression: SkillProgression.option_progressive_with_masteries, + } + + blocked_entrances = {EntranceName.use_island_obelisk, EntranceName.boat_to_ginger_island} + required_regions = {RegionName.wizard_tower, RegionName.boat_tunnel} + + for i in range(0, 10 if self.skip_long_tests else 1000): + seed = get_seed() + with self.solo_world_sub_test(f"Seed: {seed}", world_options=test_options, world_caching=False, seed=seed) as (multiworld, world): + self.assert_can_reach_any_region_before_blockers(required_regions, blocked_entrances, multiworld) + + def assert_can_reach_any_region_before_blockers(self, required_regions: Collection[str], blocked_entrances: Collection[str], multiworld: MultiWorld): + explored_regions = explore_regions_up_to_blockers(blocked_entrances, multiworld) + self.assertTrue(any(region in explored_regions for region in required_regions)) + + +def explore_regions_up_to_blockers(blocked_entrances: Collection[str], multiworld: MultiWorld) -> set[str]: + explored_regions: set[str] = set() + regions_by_name = multiworld.regions.region_cache[1] + regions_to_explore = deque([regions_by_name["Menu"]]) + + while regions_to_explore: + region = regions_to_explore.pop() + + if region.name in explored_regions: + continue + + explored_regions.add(region.name) + + for exit_ in region.exits: + exit_: Entrance + if exit_.name in blocked_entrances: + continue + regions_to_explore.append(exit_.connected_region) + + return explored_regions diff --git a/worlds/stardew_valley/test/regions/TestRandomizationFlag.py b/worlds/stardew_valley/test/regions/TestRandomizationFlag.py new file mode 100644 index 0000000000..6a01ef07e9 --- /dev/null +++ b/worlds/stardew_valley/test/regions/TestRandomizationFlag.py @@ -0,0 +1,88 @@ +import unittest + +from ..options.utils import fill_dataclass_with_default +from ... import create_content, options +from ...regions.entrance_rando import create_player_randomization_flag +from ...regions.model import RandomizationFlag, ConnectionData + + +class TestConnectionData(unittest.TestCase): + + def test_given_entrances_not_randomized_when_is_eligible_for_randomization_then_not_eligible(self): + player_flag = RandomizationFlag.NOT_RANDOMIZED + + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.PELICAN_TOWN) + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertFalse(is_eligible) + + def test_given_pelican_town_connection_when_is_eligible_for_pelican_town_randomization_then_eligible(self): + player_flag = RandomizationFlag.BIT_PELICAN_TOWN + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.PELICAN_TOWN) + + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertTrue(is_eligible) + + def test_given_pelican_town_connection_when_is_eligible_for_buildings_randomization_then_eligible(self): + player_flag = RandomizationFlag.BIT_BUILDINGS + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.PELICAN_TOWN) + + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertTrue(is_eligible) + + def test_given_non_progression_connection_when_is_eligible_for_pelican_town_randomization_then_not_eligible(self): + player_flag = RandomizationFlag.BIT_PELICAN_TOWN + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.NON_PROGRESSION) + + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertFalse(is_eligible) + + def test_given_non_progression_masteries_connection_when_is_eligible_for_non_progression_randomization_then_eligible(self): + player_flag = RandomizationFlag.BIT_NON_PROGRESSION + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.NON_PROGRESSION ^ RandomizationFlag.EXCLUDE_MASTERIES) + + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertTrue(is_eligible) + + def test_given_non_progression_masteries_connection_when_is_eligible_for_non_progression_without_masteries_randomization_then_not_eligible(self): + player_flag = RandomizationFlag.BIT_NON_PROGRESSION | RandomizationFlag.EXCLUDE_MASTERIES + connection = ConnectionData("Go to Somewhere", "Somewhere", RandomizationFlag.NON_PROGRESSION ^ RandomizationFlag.EXCLUDE_MASTERIES) + + is_eligible = connection.is_eligible_for_randomization(player_flag) + + self.assertFalse(is_eligible) + + +class TestRandomizationFlag(unittest.TestCase): + + def test_given_entrance_randomization_choice_when_create_player_randomization_flag_then_only_relevant_bit_is_enabled(self): + for entrance_randomization_choice, expected_bit in ( + (options.EntranceRandomization.option_disabled, RandomizationFlag.NOT_RANDOMIZED), + (options.EntranceRandomization.option_pelican_town, RandomizationFlag.BIT_PELICAN_TOWN), + (options.EntranceRandomization.option_non_progression, RandomizationFlag.BIT_NON_PROGRESSION), + (options.EntranceRandomization.option_buildings_without_house, RandomizationFlag.BIT_BUILDINGS), + (options.EntranceRandomization.option_buildings, RandomizationFlag.BIT_BUILDINGS), + (options.EntranceRandomization.option_chaos, RandomizationFlag.BIT_BUILDINGS), + ): + player_options = fill_dataclass_with_default({options.EntranceRandomization: entrance_randomization_choice}) + content = create_content(player_options) + + flag = create_player_randomization_flag(player_options.entrance_randomization, content) + + self.assertEqual(flag, expected_bit) + + def test_given_masteries_not_randomized_when_create_player_randomization_flag_then_exclude_masteries_bit_enabled(self): + for entrance_randomization_choice in set(options.EntranceRandomization.options.values()) ^ {options.EntranceRandomization.option_disabled}: + player_options = fill_dataclass_with_default({ + options.EntranceRandomization: entrance_randomization_choice, + options.SkillProgression: options.SkillProgression.option_progressive + }) + content = create_content(player_options) + + flag = create_player_randomization_flag(player_options.entrance_randomization, content) + + self.assertIn(RandomizationFlag.EXCLUDE_MASTERIES, flag) diff --git a/worlds/stardew_valley/test/regions/TestRegionConnections.py b/worlds/stardew_valley/test/regions/TestRegionConnections.py new file mode 100644 index 0000000000..f20ef7943c --- /dev/null +++ b/worlds/stardew_valley/test/regions/TestRegionConnections.py @@ -0,0 +1,66 @@ +import unittest + +from ..options.utils import fill_dataclass_with_default +from ... import options +from ...content import create_content +from ...mods.region_data import region_data_by_content_pack +from ...regions import vanilla_data +from ...regions.model import MergeFlag +from ...regions.regions import create_all_regions, create_all_connections + + +class TestVanillaRegionsConnectionsWithGingerIsland(unittest.TestCase): + def test_region_exits_lead_somewhere(self): + for region in vanilla_data.regions_with_ginger_island_by_name.values(): + with self.subTest(region=region.name): + for exit_ in region.exits: + self.assertIn(exit_, vanilla_data.connections_with_ginger_island_by_name, + f"{region.name} is leading to {exit_} but it does not exist.") + + def test_connection_lead_somewhere(self): + for connection in vanilla_data.connections_with_ginger_island_by_name.values(): + with self.subTest(connection=connection.name): + self.assertIn(connection.destination, vanilla_data.regions_with_ginger_island_by_name, + f"{connection.name} is leading to {connection.destination} but it does not exist.") + + +class TestVanillaRegionsConnectionsWithoutGingerIsland(unittest.TestCase): + def test_region_exits_lead_somewhere(self): + for region in vanilla_data.regions_without_ginger_island_by_name.values(): + with self.subTest(region=region.name): + for exit_ in region.exits: + self.assertIn(exit_, vanilla_data.connections_without_ginger_island_by_name, + f"{region.name} is leading to {exit_} but it does not exist.") + + def test_connection_lead_somewhere(self): + for connection in vanilla_data.connections_without_ginger_island_by_name.values(): + with self.subTest(connection=connection.name): + self.assertIn(connection.destination, vanilla_data.regions_without_ginger_island_by_name, + f"{connection.name} is leading to {connection.destination} but it does not exist.") + + +class TestModsConnections(unittest.TestCase): + options = { + options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_false, + options.Mods: frozenset(options.Mods.valid_keys) + } + content = create_content(fill_dataclass_with_default(options)) + all_regions_by_name = create_all_regions(content.registered_packs) + all_connections_by_name = create_all_connections(content.registered_packs) + + def test_region_exits_lead_somewhere(self): + for mod_region_data in region_data_by_content_pack.values(): + for region in mod_region_data.regions: + if MergeFlag.REMOVE_EXITS in region.flag: + continue + + with self.subTest(mod=mod_region_data.mod_name, region=region.name): + for exit_ in region.exits: + self.assertIn(exit_, self.all_connections_by_name, f"{region.name} is leading to {exit_} but it does not exist.") + + def test_connection_lead_somewhere(self): + for mod_region_data in region_data_by_content_pack.values(): + for connection in mod_region_data.connections: + with self.subTest(mod=mod_region_data.mod_name, connection=connection.name): + self.assertIn(connection.destination, self.all_regions_by_name, + f"{connection.name} is leading to {connection.destination} but it does not exist.") diff --git a/worlds/stardew_valley/test/regions/__init__.py b/worlds/stardew_valley/test/regions/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/worlds/stardew_valley/test/rules/TestArcades.py b/worlds/stardew_valley/test/rules/TestArcades.py index 5fdf7df13d..b820fda797 100644 --- a/worlds/stardew_valley/test/rules/TestArcades.py +++ b/worlds/stardew_valley/test/rules/TestArcades.py @@ -1,5 +1,5 @@ +from ..bases import SVTestBase from ... import options -from ...test import SVTestBase class TestArcadeMachinesLogic(SVTestBase): @@ -8,9 +8,9 @@ class TestArcadeMachinesLogic(SVTestBase): } def test_prairie_king(self): - self.assertFalse(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_cannot_reach_region("JotPK World 1") + self.assert_cannot_reach_region("JotPK World 2") + self.assert_cannot_reach_region("JotPK World 3") self.assert_cannot_reach_location("Journey of the Prairie King Victory") boots = self.create_item("JotPK: Progressive Boots") @@ -21,18 +21,18 @@ class TestArcadeMachinesLogic(SVTestBase): self.multiworld.state.collect(boots) self.multiworld.state.collect(gun) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_can_reach_region("JotPK World 1") + self.assert_cannot_reach_region("JotPK World 2") + self.assert_cannot_reach_region("JotPK World 3") self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(gun) self.multiworld.state.collect(boots) self.multiworld.state.collect(boots) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_can_reach_region("JotPK World 1") + self.assert_cannot_reach_region("JotPK World 2") + self.assert_cannot_reach_region("JotPK World 3") self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(boots) @@ -41,9 +41,9 @@ class TestArcadeMachinesLogic(SVTestBase): self.multiworld.state.collect(gun) self.multiworld.state.collect(ammo) self.multiworld.state.collect(life) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertFalse(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_can_reach_region("JotPK World 1") + self.assert_can_reach_region("JotPK World 2") + self.assert_cannot_reach_region("JotPK World 3") self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(gun) @@ -57,9 +57,9 @@ class TestArcadeMachinesLogic(SVTestBase): self.multiworld.state.collect(ammo) self.multiworld.state.collect(life) self.multiworld.state.collect(drop) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_can_reach_region("JotPK World 1") + self.assert_can_reach_region("JotPK World 2") + self.assert_can_reach_region("JotPK World 3") self.assert_cannot_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(gun) @@ -80,9 +80,9 @@ class TestArcadeMachinesLogic(SVTestBase): self.multiworld.state.collect(ammo) self.multiworld.state.collect(life) self.multiworld.state.collect(drop) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 1")(self.multiworld.state)) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 2")(self.multiworld.state)) - self.assertTrue(self.world.logic.region.can_reach("JotPK World 3")(self.multiworld.state)) + self.assert_can_reach_region("JotPK World 1") + self.assert_can_reach_region("JotPK World 2") + self.assert_can_reach_region("JotPK World 3") self.assert_can_reach_location("Journey of the Prairie King Victory") self.remove(boots) self.remove(boots) diff --git a/worlds/stardew_valley/test/rules/TestBooks.py b/worlds/stardew_valley/test/rules/TestBooks.py index 4cd84a77a2..eb26b27444 100644 --- a/worlds/stardew_valley/test/rules/TestBooks.py +++ b/worlds/stardew_valley/test/rules/TestBooks.py @@ -1,5 +1,5 @@ +from ..bases import SVTestBase from ... import options -from ...test import SVTestBase class TestBooksLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestBuildings.py b/worlds/stardew_valley/test/rules/TestBuildings.py index 8eeb9d295a..0b1f41d2c5 100644 --- a/worlds/stardew_valley/test/rules/TestBuildings.py +++ b/worlds/stardew_valley/test/rules/TestBuildings.py @@ -1,5 +1,5 @@ +from ..bases import SVTestBase from ...options import BuildingProgression, FarmType -from ...test import SVTestBase class TestBuildingLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestBundles.py b/worlds/stardew_valley/test/rules/TestBundles.py index 918cb8aba6..357269a25b 100644 --- a/worlds/stardew_valley/test/rules/TestBundles.py +++ b/worlds/stardew_valley/test/rules/TestBundles.py @@ -1,7 +1,7 @@ +from ..bases import SVTestBase from ... import options from ...options import BundleRandomization from ...strings.bundle_names import BundleName -from ...test import SVTestBase class TestBundlesLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestCookingRecipes.py b/worlds/stardew_valley/test/rules/TestCookingRecipes.py index b3aafdb690..b468a72d41 100644 --- a/worlds/stardew_valley/test/rules/TestCookingRecipes.py +++ b/worlds/stardew_valley/test/rules/TestCookingRecipes.py @@ -1,6 +1,6 @@ +from ..bases import SVTestBase from ... import options from ...options import BuildingProgression, ExcludeGingerIsland, Chefsanity -from ...test import SVTestBase class TestRecipeLearnLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestCraftingRecipes.py b/worlds/stardew_valley/test/rules/TestCraftingRecipes.py index 94d6bc145a..f875dc539d 100644 --- a/worlds/stardew_valley/test/rules/TestCraftingRecipes.py +++ b/worlds/stardew_valley/test/rules/TestCraftingRecipes.py @@ -1,7 +1,7 @@ +from ..bases import SVTestBase from ... import options from ...data.craftable_data import all_crafting_recipes_by_name from ...options import BuildingProgression, ExcludeGingerIsland, Craftsanity, SeasonRandomization -from ...test import SVTestBase class TestCraftsanityLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestDonations.py b/worlds/stardew_valley/test/rules/TestDonations.py index d50f87d3e9..2cddcad395 100644 --- a/worlds/stardew_valley/test/rules/TestDonations.py +++ b/worlds/stardew_valley/test/rules/TestDonations.py @@ -1,8 +1,8 @@ +from ..bases import SVTestBase from ... import options from ...locations import locations_by_tag, LocationTags, location_table from ...strings.entrance_names import Entrance from ...strings.region_names import Region -from ...test import SVTestBase class TestDonationLogicAll(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestFishing.py b/worlds/stardew_valley/test/rules/TestFishing.py index 6a6a4bb315..22e6321a7a 100644 --- a/worlds/stardew_valley/test/rules/TestFishing.py +++ b/worlds/stardew_valley/test/rules/TestFishing.py @@ -1,6 +1,6 @@ +from ..bases import SVTestBase from ...options import SeasonRandomization, Fishsanity, ExcludeGingerIsland, SkillProgression, ToolProgression, ElevatorProgression, SpecialOrderLocations from ...strings.fish_names import Fish -from ...test import SVTestBase class TestNeedRegionToCatchFish(SVTestBase): @@ -8,7 +8,7 @@ class TestNeedRegionToCatchFish(SVTestBase): SeasonRandomization.internal_name: SeasonRandomization.option_disabled, ElevatorProgression.internal_name: ElevatorProgression.option_vanilla, SkillProgression.internal_name: SkillProgression.option_vanilla, - ToolProgression.internal_name: ToolProgression.option_vanilla, + ToolProgression.internal_name: ToolProgression.option_progressive, Fishsanity.internal_name: Fishsanity.option_all, ExcludeGingerIsland.internal_name: ExcludeGingerIsland.option_false, SpecialOrderLocations.internal_name: SpecialOrderLocations.option_board_qi, @@ -18,7 +18,7 @@ class TestNeedRegionToCatchFish(SVTestBase): fish_and_items = { Fish.crimsonfish: ["Beach Bridge"], Fish.void_salmon: ["Railroad Boulder Removed", "Dark Talisman"], - Fish.woodskip: ["Glittering Boulder Removed", "Progressive Weapon"], # For the ores to get the axe upgrades + Fish.woodskip: ["Progressive Axe", "Progressive Axe", "Progressive Weapon"], # For the ores to get the axe upgrades Fish.mutant_carp: ["Rusty Key"], Fish.slimejack: ["Railroad Boulder Removed", "Rusty Key"], Fish.lionfish: ["Boat Repair"], @@ -26,8 +26,8 @@ class TestNeedRegionToCatchFish(SVTestBase): Fish.stingray: ["Boat Repair", "Island Resort"], Fish.ghostfish: ["Progressive Weapon"], Fish.stonefish: ["Progressive Weapon"], - Fish.ice_pip: ["Progressive Weapon", "Progressive Weapon"], - Fish.lava_eel: ["Progressive Weapon", "Progressive Weapon", "Progressive Weapon"], + Fish.ice_pip: ["Progressive Weapon", "Progressive Weapon", "Progressive Pickaxe", "Progressive Pickaxe"], + Fish.lava_eel: ["Progressive Weapon", "Progressive Weapon", "Progressive Weapon", "Progressive Pickaxe", "Progressive Pickaxe", "Progressive Pickaxe"], Fish.sandfish: ["Bus Repair"], Fish.scorpion_carp: ["Desert Obelisk"], # Starting the extended family quest requires having caught all the legendaries before, so they all have the rules of every other legendary @@ -37,6 +37,7 @@ class TestNeedRegionToCatchFish(SVTestBase): Fish.legend_ii: ["Beach Bridge", "Island Obelisk", "Island West Turtle", "Qi Walnut Room", "Rusty Key"], Fish.ms_angler: ["Beach Bridge", "Island Obelisk", "Island West Turtle", "Qi Walnut Room", "Rusty Key"], } + self.collect("Progressive Fishing Rod", 4) self.original_state = self.multiworld.state.copy() for fish in fish_and_items: with self.subTest(f"Region rules for {fish}"): diff --git a/worlds/stardew_valley/test/rules/TestFriendship.py b/worlds/stardew_valley/test/rules/TestFriendship.py index 9cd3127aa3..dc5935580a 100644 --- a/worlds/stardew_valley/test/rules/TestFriendship.py +++ b/worlds/stardew_valley/test/rules/TestFriendship.py @@ -1,5 +1,5 @@ +from ..bases import SVTestBase from ...options import SeasonRandomization, Friendsanity, FriendsanityHeartSize -from ...test import SVTestBase class TestFriendsanityDatingRules(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestMuseum.py b/worlds/stardew_valley/test/rules/TestMuseum.py index 35dad8f43e..1a22e8800c 100644 --- a/worlds/stardew_valley/test/rules/TestMuseum.py +++ b/worlds/stardew_valley/test/rules/TestMuseum.py @@ -1,12 +1,16 @@ from collections import Counter +from unittest.mock import patch -from ...options import Museumsanity -from .. import SVTestBase +from ..bases import SVTestBase +from ..options import presets +from ... import options, StardewLogic, StardewRule +from ...logic.museum_logic import MuseumLogic +from ...stardew_rule import true_, LiteralStardewRule class TestMuseumMilestones(SVTestBase): options = { - Museumsanity.internal_name: Museumsanity.option_milestones + options.Museumsanity: options.Museumsanity.option_milestones } def test_50_milestone(self): @@ -14,3 +18,45 @@ class TestMuseumMilestones(SVTestBase): milestone_rule = self.world.logic.museum.can_find_museum_items(50) self.assert_rule_false(milestone_rule, self.multiworld.state) + + +class DisabledMuseumRule(LiteralStardewRule): + value = False + + def __or__(self, other) -> StardewRule: + return other + + def __and__(self, other) -> StardewRule: + return self + + def __repr__(self): + return "Disabled Museum Rule" + + +class TestMuseumsanityDisabledExcludesMuseumDonationsFromOtherLocations(SVTestBase): + options = { + **presets.allsanity_mods_6_x_x(), + options.Museumsanity.internal_name: options.Museumsanity.option_none + } + + def test_museum_donations_are_never_required_in_any_locations(self): + with patch("worlds.stardew_valley.logic.museum_logic.MuseumLogic") as MockMuseumLogic: + museum_logic: MuseumLogic = MockMuseumLogic.return_value + museum_logic.can_donate_museum_items.return_value = DisabledMuseumRule() + museum_logic.can_donate_museum_artifacts.return_value = DisabledMuseumRule() + museum_logic.can_find_museum_artifacts.return_value = DisabledMuseumRule() + museum_logic.can_find_museum_minerals.return_value = DisabledMuseumRule() + museum_logic.can_find_museum_items.return_value = DisabledMuseumRule() + museum_logic.can_complete_museum.return_value = DisabledMuseumRule() + museum_logic.can_donate.return_value = DisabledMuseumRule() + # Allowing calls to museum rules since a lot of other logic depends on it, for minerals for instance. + museum_logic.can_find_museum_item.return_value = true_ + + regions = {region.name for region in self.multiworld.regions} + self.world.logic = StardewLogic(self.player, self.world.options, self.world.content, regions) + self.world.set_rules() + + self.collect_everything() + for location in self.get_real_locations(): + with self.subTest(location.name): + self.assert_can_reach_location(location) diff --git a/worlds/stardew_valley/test/rules/TestShipping.py b/worlds/stardew_valley/test/rules/TestShipping.py index fc61ae8e2a..c1f29d9342 100644 --- a/worlds/stardew_valley/test/rules/TestShipping.py +++ b/worlds/stardew_valley/test/rules/TestShipping.py @@ -1,6 +1,6 @@ +from ..bases import SVTestBase from ...locations import LocationTags, location_table from ...options import BuildingProgression, Shipsanity -from ...test import SVTestBase class TestShipsanityNone(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestSkills.py b/worlds/stardew_valley/test/rules/TestSkills.py index a5957488a1..fd513a1bec 100644 --- a/worlds/stardew_valley/test/rules/TestSkills.py +++ b/worlds/stardew_valley/test/rules/TestSkills.py @@ -1,7 +1,7 @@ +from ..bases import SVTestBase from ... import HasProgressionPercent, StardewLogic from ...options import ToolProgression, SkillProgression, Mods from ...strings.skill_names import all_skills, all_vanilla_skills, Skill -from ...test import SVTestBase class TestSkillProgressionVanilla(SVTestBase): diff --git a/worlds/stardew_valley/test/rules/TestStateRules.py b/worlds/stardew_valley/test/rules/TestStateRules.py index db56e8220c..57573c7f8b 100644 --- a/worlds/stardew_valley/test/rules/TestStateRules.py +++ b/worlds/stardew_valley/test/rules/TestStateRules.py @@ -1,4 +1,4 @@ -from .. import SVTestBase +from ..bases import SVTestBase from ..options.presets import allsanity_mods_6_x_x from ...stardew_rule import HasProgressionPercent diff --git a/worlds/stardew_valley/test/rules/TestTools.py b/worlds/stardew_valley/test/rules/TestTools.py index bda29e3d74..54b9ec8f2f 100644 --- a/worlds/stardew_valley/test/rules/TestTools.py +++ b/worlds/stardew_valley/test/rules/TestTools.py @@ -1,6 +1,6 @@ from collections import Counter -from .. import SVTestBase +from ..bases import SVTestBase from ... import options from ...options import ToolProgression, SeasonRandomization from ...strings.entrance_names import Entrance diff --git a/worlds/stardew_valley/test/rules/TestTravelingMerchant.py b/worlds/stardew_valley/test/rules/TestTravelingMerchant.py new file mode 100644 index 0000000000..aa7f46d07b --- /dev/null +++ b/worlds/stardew_valley/test/rules/TestTravelingMerchant.py @@ -0,0 +1,28 @@ +from ..bases import SVTestBase +from ... import SeasonRandomization, EntranceRandomization +from ...locations import location_table, LocationTags + + +class TestTravelingMerchant(SVTestBase): + options = { + SeasonRandomization: SeasonRandomization.option_randomized_not_winter, + EntranceRandomization: EntranceRandomization.option_disabled, + } + + def test_purchase_from_traveling_merchant_requires_money(self): + traveling_merchant_location_names = [l for l in self.get_real_location_names() if LocationTags.TRAVELING_MERCHANT in location_table[l].tags] + + for traveling_merchant_day in ["Traveling Merchant: Sunday", "Traveling Merchant: Monday", "Traveling Merchant: Tuesday", + "Traveling Merchant: Wednesday", "Traveling Merchant: Thursday", "Traveling Merchant: Friday", + "Traveling Merchant: Saturday"]: + self.collect(traveling_merchant_day) + + for location_name in traveling_merchant_location_names: + location = self.multiworld.get_location(location_name, 1) + self.assert_cannot_reach_location(location, self.multiworld.state) + + self.collect("Shipping Bin") + + for location_name in traveling_merchant_location_names: + location = self.multiworld.get_location(location_name, 1) + self.assert_can_reach_location(location, self.multiworld.state) diff --git a/worlds/stardew_valley/test/rules/TestWeapons.py b/worlds/stardew_valley/test/rules/TestWeapons.py index 383f26e841..e95e706ded 100644 --- a/worlds/stardew_valley/test/rules/TestWeapons.py +++ b/worlds/stardew_valley/test/rules/TestWeapons.py @@ -1,6 +1,6 @@ +from ..bases import SVTestBase from ... import options from ...options import ToolProgression -from ...test import SVTestBase class TestWeaponsLogic(SVTestBase): diff --git a/worlds/stardew_valley/test/script/benchmark_locations.py b/worlds/stardew_valley/test/script/benchmark_locations.py index 04553e3996..3dcfc4dbeb 100644 --- a/worlds/stardew_valley/test/script/benchmark_locations.py +++ b/worlds/stardew_valley/test/script/benchmark_locations.py @@ -15,8 +15,9 @@ import typing from BaseClasses import CollectionState, Location from Utils import init_logging -from worlds.stardew_valley.stardew_rule.rule_explain import explain -from ... import test +from ..bases import setup_solo_multiworld +from ..options import presets +from ...stardew_rule.rule_explain import explain def run_locations_benchmark(): @@ -56,12 +57,12 @@ def run_locations_benchmark(): parser.add_argument('--state', help="Define the state in which the location will be benchmarked.", type=str, default=None) args = parser.parse_args() options_set = args.options - options = getattr(test, options_set)() + options = getattr(presets, options_set)() seed = args.seed location = args.location state = args.state - multiworld = test.setup_solo_multiworld(options, seed) + multiworld = setup_solo_multiworld(options, seed) gc.collect() if location: diff --git a/worlds/stardew_valley/test/stability/StabilityOutputScript.py b/worlds/stardew_valley/test/stability/StabilityOutputScript.py index 9b4b608d4e..29fd903095 100644 --- a/worlds/stardew_valley/test/stability/StabilityOutputScript.py +++ b/worlds/stardew_valley/test/stability/StabilityOutputScript.py @@ -1,7 +1,7 @@ import argparse import json -from .. import setup_solo_multiworld +from ..bases import setup_solo_multiworld from ..options.presets import allsanity_mods_6_x_x_exclude_disabled from ...options import FarmType, EntranceRandomization diff --git a/worlds/stardew_valley/test/stability/TestStability.py b/worlds/stardew_valley/test/stability/TestStability.py index b4d0f30ea5..f3dfb9fdaa 100644 --- a/worlds/stardew_valley/test/stability/TestStability.py +++ b/worlds/stardew_valley/test/stability/TestStability.py @@ -5,7 +5,7 @@ import sys import unittest from BaseClasses import get_seed -from .. import SVTestCase +from ..bases import SVTestCase # at 0x102ca98a0> lambda_regex = re.compile(r"^ at (.*)>$") diff --git a/worlds/stardew_valley/test/stability/TestUniversalTracker.py b/worlds/stardew_valley/test/stability/TestUniversalTracker.py index 7590635aa1..301abfff22 100644 --- a/worlds/stardew_valley/test/stability/TestUniversalTracker.py +++ b/worlds/stardew_valley/test/stability/TestUniversalTracker.py @@ -1,9 +1,11 @@ import unittest from unittest.mock import Mock -from .. import SVTestBase, fill_namespace_with_default, skip_long_tests +from ..bases import skip_long_tests, SVTestBase from ..options.presets import allsanity_mods_6_x_x -from ... import STARDEW_VALLEY, FarmType, BundleRandomization, EntranceRandomization +from ..options.utils import fill_namespace_with_default +from ... import STARDEW_VALLEY +from ...options import FarmType, BundleRandomization, EntranceRandomization @unittest.skipIf(skip_long_tests(), "Long tests disabled") diff --git a/worlds/subnautica/__init__.py b/worlds/subnautica/__init__.py index 850c23c7dd..bfedf0c90a 100644 --- a/worlds/subnautica/__init__.py +++ b/worlds/subnautica/__init__.py @@ -41,7 +41,7 @@ class SubnauticaWorld(World): location_name_to_id = all_locations options_dataclass = options.SubnauticaOptions options: options.SubnauticaOptions - required_client_version = (0, 5, 0) + required_client_version = (0, 6, 2) origin_region_name = "Planet 4546B" creatures_to_scan: List[str] @@ -155,6 +155,7 @@ class SubnauticaWorld(World): "creatures_to_scan": self.creatures_to_scan, "death_link": self.options.death_link.value, "free_samples": self.options.free_samples.value, + "empty_tanks": self.options.empty_tanks.value, } return slot_data diff --git a/worlds/subnautica/options.py b/worlds/subnautica/options.py index 6cdcb33d89..0aa869de0b 100644 --- a/worlds/subnautica/options.py +++ b/worlds/subnautica/options.py @@ -129,6 +129,10 @@ class FillerItemsDistribution(ItemDict): return list(self.value.keys()), list(accumulate(self.value.values())) +class EmptyTanks(DefaultOnToggle): + """Oxygen Tanks stored in inventory are empty if enabled.""" + + @dataclass class SubnauticaOptions(PerGameCommonOptions): swim_rule: SwimRule @@ -140,3 +144,4 @@ class SubnauticaOptions(PerGameCommonOptions): death_link: SubnauticaDeathLink start_inventory_from_pool: StartInventoryPool filler_items_distribution: FillerItemsDistribution + empty_tanks: EmptyTanks diff --git a/worlds/terraria/docs/setup_en.md b/worlds/terraria/docs/setup_en.md index 55a4df1df3..b415955337 100644 --- a/worlds/terraria/docs/setup_en.md +++ b/worlds/terraria/docs/setup_en.md @@ -10,13 +10,6 @@ and [tModLoader](https://store.steampowered.com/app/1281930/tModLoader/) on Stea 1. Subscribe to [the mod](https://steamcommunity.com/sharedfiles/filedetails/?id=2922217554) on Steam 2. Open tModLoader 3. Go to **Workshop -> Manage Mods** and enable the Archipelago mod - - If tModLoader states that you need version 1.4.3, follow the following steps - 1. Close tModLoader - 2. Right-Click tModLoader in Steam and select **Properties** - 3. Navigate to **Betas -> Beta Participation** - 4. Select **1.4.3-legacy - Legacy - Stable tModLoader for Terraria 1.4.3** - 5. Update tModLoader through Steam - 6. Open tModLoader and navigate back to the **Manage Mods** menu 4. tModLoader will say that it needs to refresh; exit this menu, and it will do this automatically 5. Once tModLoader finishes loading, the Archipelago mod is finished installing; you can now [connect to an Archipelago game](#joining-an-archipelago-game-in-terraria). diff --git a/worlds/timespinner/Items.py b/worlds/timespinner/Items.py index a00fca7ee5..957c617675 100644 --- a/worlds/timespinner/Items.py +++ b/worlds/timespinner/Items.py @@ -174,7 +174,7 @@ item_table: Dict[str, ItemData] = { 'Corruption': ItemData('Orb Spell', 1337161), 'Lightwall': ItemData('Orb Spell', 1337162, progression=True), 'Bleak Ring': ItemData('Orb Passive', 1337163, useful=True), - 'Scythe Ring': ItemData('Orb Passive', 1337164), + 'Scythe Ring': ItemData('Orb Passive', 1337164, useful=True), 'Pyro Ring': ItemData('Orb Passive', 1337165, progression=True), 'Royal Ring': ItemData('Orb Passive', 1337166, progression=True), 'Shield Ring': ItemData('Orb Passive', 1337167), @@ -208,7 +208,11 @@ item_table: Dict[str, ItemData] = { 'Lab Access Research': ItemData('Lab Access', 1337196, progression=True), 'Lab Access Dynamo': ItemData('Lab Access', 1337197, progression=True), 'Drawbridge Key': ItemData('Key', 1337198, progression=True), - # 1337199 - 1337248 Reserved + 'Cube of Bodie': ItemData('Relic', 1337199, progression=True), + 'Spider Trap': ItemData('Trap', 1337200, 0, trap=True), + 'Lights Out Trap': ItemData('Trap', 1337201, 0, trap=True), + 'Palm Punch Trap': ItemData('Trap', 1337202, 0, trap=True), + # 1337203 - 1337248 Reserved 'Max Sand': ItemData('Stat', 1337249, 14) } diff --git a/worlds/timespinner/Locations.py b/worlds/timespinner/Locations.py index 644304733a..ffd2f60eb9 100644 --- a/worlds/timespinner/Locations.py +++ b/worlds/timespinner/Locations.py @@ -22,236 +22,238 @@ def get_location_datas(player: Optional[int], options: Optional[TimespinnerOptio # 1337000 - 1337155 Generic locations # 1337171 - 1337175 New Pickup checks # 1337246 - 1337249 Ancient Pyramid + # 1337250 - 1337781 Torch checks + # 1337782 - 1337999 Reserved location_table: List[LocationData] = [ # Present item locations - LocationData('Tutorial', 'Tutorial: Yo Momma 1', 1337000), - LocationData('Tutorial', 'Tutorial: Yo Momma 2', 1337001), - LocationData('Lake desolation', 'Lake Desolation: Starter chest 2', 1337002), - LocationData('Lake desolation', 'Lake Desolation: Starter chest 3', 1337003), - LocationData('Lake desolation', 'Lake Desolation: Starter chest 1', 1337004), - LocationData('Lake desolation', 'Lake Desolation (Lower): Timespinner Wheel room', 1337005), - LocationData('Lake desolation', 'Lake Desolation: Forget me not chest', 1337006, lambda state: logic.has_fire(state) and state.can_reach('Upper Lake Serene', 'Region', player)), + LocationData('Tutorial', 'Tutorial: Yo Momma 1', 1337000), + LocationData('Tutorial', 'Tutorial: Yo Momma 2', 1337001), + LocationData('Lake desolation', 'Lake Desolation: Starter chest 2', 1337002), + LocationData('Lake desolation', 'Lake Desolation: Starter chest 3', 1337003), + LocationData('Lake desolation', 'Lake Desolation: Starter chest 1', 1337004), + LocationData('Lake desolation', 'Lake Desolation (Lower): Timespinner Wheel room', 1337005), + LocationData('Lake desolation', 'Lake Desolation: Forget me not chest', 1337006, lambda state: logic.has_fire(state) and state.can_reach('Upper Lake Serene', 'Region', player)), LocationData('Lake desolation', 'Lake Desolation (Lower): Chicken chest', 1337007, logic.has_timestop), - LocationData('Lower lake desolation', 'Lake Desolation (Lower): Not so secret room', 1337008, logic.can_break_walls), - LocationData('Lower lake desolation', 'Lake Desolation (Upper): Tank chest', 1337009, logic.has_timestop), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Oxygen recovery room', 1337010), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Secret room', 1337011, logic.can_break_walls), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Double jump cave platform', 1337012, logic.has_doublejump), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Double jump cave floor', 1337013), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Sparrow chest', 1337014), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site pedestal', 1337015), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site chest 1', 1337016, lambda state: state.has('Killed Maw', player)), - LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site chest 2', 1337017, lambda state: state.has('Killed Maw', player)), - LocationData('Eastern lake desolation', 'Lake Desolation: Kitty Boss', 1337018), - LocationData('Library', 'Library: Basement', 1337019), - LocationData('Library', 'Library: Warp gate', 1337020), - LocationData('Library', 'Library: Librarian', 1337021), - LocationData('Library', 'Library: Reading nook chest', 1337022), - LocationData('Library', 'Library: Storage room chest 1', 1337023, logic.has_keycard_D), - LocationData('Library', 'Library: Storage room chest 2', 1337024, logic.has_keycard_D), - LocationData('Library', 'Library: Storage room chest 3', 1337025, logic.has_keycard_D), - LocationData('Library top', 'Library: Backer room chest 5', 1337026), - LocationData('Library top', 'Library: Backer room chest 4', 1337027), - LocationData('Library top', 'Library: Backer room chest 3', 1337028), - LocationData('Library top', 'Library: Backer room chest 2', 1337029), - LocationData('Library top', 'Library: Backer room chest 1', 1337030), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Elevator Key not required', 1337031), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Ye olde Timespinner', 1337032), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Bottom floor', 1337033, logic.has_keycard_C), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Air vents secret', 1337034, logic.can_break_walls), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Elevator chest', 1337035, lambda state: state.has('Elevator Keycard', player)), - LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers: Bridge', 1337036), - LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Elevator chest', 1337037), - LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Elevator card chest', 1337038, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), - LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Air vents right chest', 1337039, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), - LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Air vents left chest', 1337040, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), - LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Bottom floor', 1337041), - LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Varndagroth', 1337042, logic.has_keycard_C), - LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Spider Hell', 1337043, logic.has_keycard_A), - LocationData('Skeleton Shaft', 'Sealed Caves (Xarion): Skeleton', 1337044), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom jump room', 1337045, logic.has_timestop), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Double shroom room', 1337046), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Jacksquat room', 1337047, logic.has_forwarddash_doublejump), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Below Jacksquat room', 1337048), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Secret room', 1337049, logic.can_break_walls), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Bottom left room', 1337050), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last chance before Xarion', 1337051, logic.has_doublejump), - LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Xarion', 1337052, lambda state: not flooded.flood_xarion or state.has('Water Mask', player)), - LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Water hook', 1337053, lambda state: state.has('Water Mask', player)), - LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Siren room underwater right', 1337054, lambda state: state.has('Water Mask', player)), - LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Siren room underwater left', 1337055, lambda state: state.has('Water Mask', player)), - LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Cave after sirens chest 1', 1337056), - LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Cave after sirens chest 2', 1337057), - LocationData('Military Fortress', 'Military Fortress: Bomber chest', 1337058, lambda state: state.has('Timespinner Wheel', player) and logic.has_doublejump_of_npc(state)), - LocationData('Military Fortress', 'Military Fortress: Close combat room', 1337059), - LocationData('Military Fortress (hangar)', 'Military Fortress: Soldiers bridge', 1337060), - LocationData('Military Fortress (hangar)', 'Military Fortress: Giantess room', 1337061), - LocationData('Military Fortress (hangar)', 'Military Fortress: Giantess bridge', 1337062), - LocationData('Military Fortress (hangar)', 'Military Fortress: B door chest 2', 1337063, lambda state: logic.has_keycard_B(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))), - LocationData('Military Fortress (hangar)', 'Military Fortress: B door chest 1', 1337064, lambda state: logic.has_keycard_B(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))), - LocationData('Military Fortress (hangar)', 'Military Fortress: Pedestal', 1337065, lambda state: state.has('Water Mask', player) if flooded.flood_lab else (logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state))), - LocationData('The lab', 'Lab: Coffee break', 1337066), - LocationData('The lab', 'Lab: Lower trash right', 1337067, logic.has_doublejump), - LocationData('The lab', 'Lab: Lower trash left', 1337068, lambda state: logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash ), - LocationData('The lab', 'Lab: Below lab entrance', 1337069, logic.has_doublejump), - LocationData('The lab (power off)', 'Lab: Trash jump room', 1337070, lambda state: not options.lock_key_amadeus or logic.has_doublejump_of_npc(state) ), - LocationData('The lab (power off)', 'Lab: Dynamo Works', 1337071, lambda state: not options.lock_key_amadeus or (state.has_all(('Lab Access Research', 'Lab Access Dynamo'), player)) ), - LocationData('The lab (upper)', 'Lab: Genza (Blob Mom)', 1337072), - LocationData('The lab (power off)', 'Lab: Experiment #13', 1337073, lambda state: not options.lock_key_amadeus or state.has('Lab Access Experiment', player) ), - LocationData('The lab (upper)', 'Lab: Download and chest room chest', 1337074), - LocationData('The lab (upper)', 'Lab: Lab secret', 1337075, logic.can_break_walls), - LocationData('The lab (power off)', 'Lab: Spider Hell', 1337076, lambda state: logic.has_keycard_A and not options.lock_key_amadeus or state.has('Lab Access Research', player)), - LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard bottom chest', 1337077), - LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard floor secret', 1337078, lambda state: logic.has_upwarddash(state) and logic.can_break_walls(state)), - LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard upper chest', 1337079, lambda state: logic.has_upwarddash(state)), - LocationData('Emperors tower', 'Emperor\'s Tower: Galactic sage room', 1337080), - LocationData('Emperors tower', 'Emperor\'s Tower: Bottom right tower', 1337081), - LocationData('Emperors tower', 'Emperor\'s Tower: Wayyyy up there', 1337082, logic.has_doublejump_of_npc), - LocationData('Emperors tower', 'Emperor\'s Tower: Left tower balcony', 1337083), - LocationData('Emperors tower', 'Emperor\'s Tower: Emperor\'s Chambers chest', 1337084), - LocationData('Emperors tower', 'Emperor\'s Tower: Emperor\'s Chambers pedestal', 1337085), + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Not so secret room', 1337008, logic.can_break_walls), + LocationData('Lower lake desolation', 'Lake Desolation (Upper): Tank chest', 1337009, logic.has_timestop), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Oxygen recovery room', 1337010), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Secret room', 1337011, logic.can_break_walls), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Double jump cave platform', 1337012, logic.has_doublejump), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Double jump cave floor', 1337013), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Sparrow chest', 1337014), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site pedestal', 1337015), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site chest 1', 1337016, lambda state: state.has('Killed Maw', player)), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Crash site chest 2', 1337017, lambda state: state.has('Killed Maw', player)), + LocationData('Eastern lake desolation', 'Lake Desolation: Kitty Boss', 1337018), + LocationData('Library', 'Library: Basement', 1337019), + LocationData('Library', 'Library: Warp gate', 1337020), + LocationData('Library', 'Library: Librarian', 1337021), + LocationData('Library', 'Library: Reading nook chest', 1337022), + LocationData('Library', 'Library: Storage room chest 1', 1337023, logic.has_keycard_D), + LocationData('Library', 'Library: Storage room chest 2', 1337024, logic.has_keycard_D), + LocationData('Library', 'Library: Storage room chest 3', 1337025, logic.has_keycard_D), + LocationData('Library top', 'Library: Backer room chest 5', 1337026), + LocationData('Library top', 'Library: Backer room chest 4', 1337027), + LocationData('Library top', 'Library: Backer room chest 3', 1337028), + LocationData('Library top', 'Library: Backer room chest 2', 1337029), + LocationData('Library top', 'Library: Backer room chest 1', 1337030), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Elevator Key not required', 1337031), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Ye olde Timespinner', 1337032), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Bottom floor', 1337033, logic.has_keycard_C), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Air vents secret', 1337034, logic.can_break_walls), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Elevator chest', 1337035, lambda state: state.has('Elevator Keycard', player)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers: Bridge', 1337036), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Elevator chest', 1337037), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Elevator card chest', 1337038, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Air vents right chest', 1337039, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Air vents left chest', 1337040, lambda state: state.has('Elevator Keycard', player) or logic.has_doublejump(state)), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Bottom floor', 1337041), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Varndagroth', 1337042, logic.has_keycard_C), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Spider Hell', 1337043, logic.has_keycard_A), + LocationData('Skeleton Shaft', 'Sealed Caves (Xarion): Skeleton', 1337044), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom jump room', 1337045, logic.has_timestop), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Double shroom room', 1337046), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Jacksquat room', 1337047, logic.has_forwarddash_doublejump), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Below Jacksquat room', 1337048), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Secret room', 1337049, logic.can_break_walls), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Bottom left room', 1337050), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last chance before Xarion', 1337051, logic.has_doublejump), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Xarion', 1337052, lambda state: not flooded.flood_xarion or state.has('Water Mask', player)), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Water hook', 1337053, lambda state: state.has('Water Mask', player)), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Siren room underwater right', 1337054, lambda state: state.has('Water Mask', player)), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Siren room underwater left', 1337055, lambda state: state.has('Water Mask', player)), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Cave after sirens chest 1', 1337056), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Cave after sirens chest 2', 1337057), + LocationData('Military Fortress', 'Military Fortress: Bomber chest', 1337058, lambda state: state.has('Timespinner Wheel', player) and logic.has_doublejump_of_npc(state)), + LocationData('Military Fortress', 'Military Fortress: Close combat room', 1337059), + LocationData('Military Fortress (hangar)', 'Military Fortress: Soldiers bridge', 1337060), + LocationData('Military Fortress (hangar)', 'Military Fortress: Giantess room', 1337061), + LocationData('Military Fortress (hangar)', 'Military Fortress: Giantess bridge', 1337062), + LocationData('Military Fortress (hangar)', 'Military Fortress: B door chest 2', 1337063, lambda state: logic.has_keycard_B(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))), + LocationData('Military Fortress (hangar)', 'Military Fortress: B door chest 1', 1337064, lambda state: logic.has_keycard_B(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))), + LocationData('Military Fortress (hangar)', 'Military Fortress: Pedestal', 1337065, lambda state: state.has('Water Mask', player) if flooded.flood_lab else (logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state))), + LocationData('Main Lab', 'Lab: Coffee break', 1337066), + LocationData('Main Lab', 'Lab: Lower trash right', 1337067, logic.has_doublejump), + LocationData('Main Lab', 'Lab: Lower trash left', 1337068, lambda state: logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state) ), + LocationData('Main Lab', 'Lab: Below lab entrance', 1337069, logic.has_doublejump), + LocationData('Main Lab', 'Lab: Trash jump room', 1337070, lambda state: not options.lock_key_amadeus or logic.has_doublejump_of_npc(state) ), + LocationData('Lab Research', 'Lab: Dynamo Works', 1337071, lambda state: not options.lock_key_amadeus or ( state.has('Lab Access Dynamo', player) and logic.has_upwarddash(state) )), + LocationData('The lab (upper)', 'Lab: Genza (Blob Mom)', 1337072), + LocationData('Main Lab', 'Lab: Experiment #13', 1337073, lambda state: not options.lock_key_amadeus or state.has('Lab Access Experiment', player) ), + LocationData('The lab (upper)', 'Lab: Download and chest room chest', 1337074), + LocationData('The lab (upper)', 'Lab: Lab secret', 1337075, logic.can_break_walls), + LocationData('Lab Research', 'Lab: Spider Hell', 1337076, lambda state: logic.has_keycard_A(state)), + LocationData('Emperors tower (courtyard)', 'Emperor\'s Tower: Courtyard bottom chest', 1337077), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard floor secret', 1337078, lambda state: logic.has_upwarddash(state) and logic.can_break_walls(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard upper chest', 1337079, lambda state: logic.has_upwarddash(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Galactic sage room', 1337080), + LocationData('Emperors tower', 'Emperor\'s Tower: Bottom right tower', 1337081), + LocationData('Emperors tower', 'Emperor\'s Tower: Wayyyy up there', 1337082, logic.has_doublejump_of_npc), + LocationData('Emperors tower', 'Emperor\'s Tower: Left tower balcony', 1337083), + LocationData('Emperors tower', 'Emperor\'s Tower: Emperor\'s Chambers chest', 1337084), + LocationData('Emperors tower', 'Emperor\'s Tower: Emperor\'s Chambers pedestal', 1337085), LocationData('Emperors tower', 'Killed Emperor', EventId), # Past item locations - LocationData('Refugee Camp', 'Refugee Camp: Neliste\'s Bra', 1337086), - LocationData('Refugee Camp', 'Refugee Camp: Storage chest 3', 1337087), - LocationData('Refugee Camp', 'Refugee Camp: Storage chest 2', 1337088), - LocationData('Refugee Camp', 'Refugee Camp: Storage chest 1', 1337089), - LocationData('Forest', 'Forest: Refugee camp roof', 1337090), - LocationData('Forest', 'Forest: Bat jump ledge', 1337091, lambda state: logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state) or logic.has_fastjump_on_npc(state)), - LocationData('Forest', 'Forest: Green platform secret', 1337092, logic.can_break_walls), - LocationData('Forest', 'Forest: Rats guarded chest', 1337093), - LocationData('Forest', 'Forest: Waterfall chest 1', 1337094, lambda state: state.has('Water Mask', player)), - LocationData('Forest', 'Forest: Waterfall chest 2', 1337095, lambda state: state.has('Water Mask', player)), - LocationData('Forest', 'Forest: Batcave', 1337096), - LocationData('Forest', 'Castle Ramparts: In the moat', 1337097, lambda state: not flooded.flood_moat or state.has('Water Mask', player)), - LocationData('Left Side forest Caves', 'Forest: Before Serene single bat cave', 1337098), - LocationData('Upper Lake Serene', 'Lake Serene (Upper): Rat nest', 1337099), - LocationData('Upper Lake Serene', 'Lake Serene (Upper): Double jump cave platform', 1337100, logic.has_doublejump), - LocationData('Upper Lake Serene', 'Lake Serene (Upper): Double jump cave floor', 1337101), - LocationData('Upper Lake Serene', 'Lake Serene (Upper): Cave secret', 1337102, logic.can_break_walls), + LocationData('Refugee Camp', 'Refugee Camp: Neliste\'s Bra', 1337086), + LocationData('Refugee Camp', 'Refugee Camp: Storage chest 3', 1337087), + LocationData('Refugee Camp', 'Refugee Camp: Storage chest 2', 1337088), + LocationData('Refugee Camp', 'Refugee Camp: Storage chest 1', 1337089), + LocationData('Forest', 'Forest: Refugee camp roof', 1337090), + LocationData('Forest', 'Forest: Bat jump ledge', 1337091, lambda state: logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state) or logic.has_fastjump_on_npc(state)), + LocationData('Forest', 'Forest: Green platform secret', 1337092, logic.can_break_walls), + LocationData('Forest', 'Forest: Rats guarded chest', 1337093), + LocationData('Forest', 'Forest: Waterfall chest 1', 1337094, lambda state: state.has('Water Mask', player)), + LocationData('Forest', 'Forest: Waterfall chest 2', 1337095, lambda state: state.has('Water Mask', player)), + LocationData('Forest', 'Forest: Batcave', 1337096), + LocationData('Forest', 'Castle Ramparts: In the moat', 1337097, lambda state: not flooded.flood_moat or state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Forest: Before Serene single bat cave', 1337098), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Rat nest', 1337099), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Double jump cave platform', 1337100, logic.has_doublejump), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Double jump cave floor', 1337101), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Cave secret', 1337102, logic.can_break_walls), LocationData('Upper Lake Serene', 'Lake Serene: Before Big Bird', 1337175), - LocationData('Upper Lake Serene', 'Lake Serene: Behind the vines', 1337103), - LocationData('Upper Lake Serene', 'Lake Serene: Pyramid keys room', 1337104), + LocationData('Upper Lake Serene', 'Lake Serene: Behind the vines', 1337103), + LocationData('Upper Lake Serene', 'Lake Serene: Pyramid keys room', 1337104), LocationData('Upper Lake Serene', 'Lake Serene (Upper): Chicken ledge', 1337174), - LocationData('Lower Lake Serene', 'Lake Serene (Lower): Deep dive', 1337105), - LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under the eels', 1337106, lambda state: state.has('Water Mask', player)), - LocationData('Lower Lake Serene', 'Lake Serene (Lower): Water spikes room', 1337107), - LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater secret', 1337108, logic.can_break_walls), - LocationData('Lower Lake Serene', 'Lake Serene (Lower): T chest', 1337109, lambda state: flooded.flood_lake_serene or logic.has_doublejump_of_npc(state)), - LocationData('Left Side forest Caves', 'Lake Serene (Lower): Past the eels', 1337110, lambda state: state.has('Water Mask', player)), - LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater pedestal', 1337111, lambda state: flooded.flood_lake_serene or logic.has_doublejump(state)), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Shroom jump room', 1337112, lambda state: flooded.flood_maw or logic.has_doublejump(state)), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Secret room', 1337113, lambda state: logic.can_break_walls(state) and (not flooded.flood_maw or state.has('Water Mask', player))), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Bottom left room', 1337114, lambda state: not flooded.flood_maw or state.has('Water Mask', player)), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Single shroom room', 1337115), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 1', 1337116, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 2', 1337117, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 3', 1337118, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 4', 1337119, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), - LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Pedestal', 1337120, lambda state: not flooded.flood_maw or state.has('Water Mask', player)), - LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Last chance before Maw', 1337121, lambda state: state.has('Water Mask', player) if flooded.flood_maw else logic.has_doublejump(state)), - LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Plasma Crystal', 1337173, lambda state: state.has_any({'Gas Mask', 'Talaria Attachment'}, player) and (not flooded.flood_maw or state.has('Water Mask', player))), - LocationData('Caves of Banishment (Maw)', 'Killed Maw', EventId, lambda state: state.has('Gas Mask', player) and (not flooded.flood_maw or state.has('Water Mask', player))), - LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Mineshaft', 1337122, lambda state: state.has_any({'Gas Mask', 'Talaria Attachment'}, player) and (not flooded.flood_maw or state.has('Water Mask', player))), - LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Wyvern room', 1337123), - LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room above water chest', 1337124), - LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room underwater left chest', 1337125, lambda state: state.has('Water Mask', player)), - LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room underwater right chest', 1337126, lambda state: state.has('Water Mask', player)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Deep dive', 1337105), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under the eels', 1337106, lambda state: state.has('Water Mask', player)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Water spikes room', 1337107), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater secret', 1337108, logic.can_break_walls), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): T chest', 1337109, lambda state: flooded.flood_lake_serene or logic.has_doublejump_of_npc(state)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Past the eels', 1337110, lambda state: state.has('Water Mask', player)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater pedestal', 1337111, lambda state: flooded.flood_lake_serene or logic.has_doublejump(state)), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Shroom jump room', 1337112, lambda state: flooded.flood_maw or logic.has_doublejump(state)), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Secret room', 1337113, lambda state: logic.can_break_walls(state) and (not flooded.flood_maw or state.has('Water Mask', player))), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Bottom left room', 1337114, lambda state: not flooded.flood_maw or state.has('Water Mask', player)), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Single shroom room', 1337115), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 1', 1337116, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 2', 1337117, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 3', 1337118, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Jackpot room chest 4', 1337119, lambda state: flooded.flood_maw or logic.has_forwarddash_doublejump(state)), + LocationData('Caves of Banishment (upper)', 'Caves of Banishment (Maw): Pedestal', 1337120, lambda state: not flooded.flood_maw or state.has('Water Mask', player)), + LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Last chance before Maw', 1337121, lambda state: flooded.flood_maw or logic.has_doublejump(state)), + LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Plasma Crystal', 1337173, lambda state: state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + LocationData('Caves of Banishment (Maw)', 'Killed Maw', EventId, lambda state: state.has('Gas Mask', player)), + LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Mineshaft', 1337122, lambda state: state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Wyvern room', 1337123), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room above water chest', 1337124), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room underwater left chest', 1337125, lambda state: state.has('Water Mask', player)), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room underwater right chest', 1337126, lambda state: state.has('Water Mask', player)), LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Siren room underwater right ground', 1337172, lambda state: state.has('Water Mask', player)), - LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Water hook', 1337127, lambda state: state.has('Water Mask', player)), - LocationData('Castle Ramparts', 'Castle Ramparts: Bomber chest', 1337128, logic.has_multiple_small_jumps_of_npc), - LocationData('Castle Ramparts', 'Castle Ramparts: Freeze the engineer', 1337129, lambda state: state.has('Talaria Attachment', player) or logic.has_timestop(state)), - LocationData('Castle Ramparts', 'Castle Ramparts: Giantess guarded room', 1337130), - LocationData('Castle Ramparts', 'Castle Ramparts: Knight and archer guarded room', 1337131), - LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal', 1337132), - LocationData('Castle Basement', 'Castle Basement: Secret pedestal', 1337133, logic.can_break_walls), - LocationData('Castle Basement', 'Castle Basement: Clean the castle basement', 1337134), - LocationData('Royal towers (lower)', 'Castle Keep: Yas queen room', 1337135, logic.has_pink), - LocationData('Castle Basement', 'Castle Basement: Giantess guarded chest', 1337136), - LocationData('Castle Basement', 'Castle Basement: Omelette chest', 1337137), - LocationData('Castle Basement', 'Castle Basement: Just an egg', 1337138), - LocationData('Castle Keep', 'Castle Keep: Under the twins', 1337139), - LocationData('Castle Keep', 'Killed Twins', EventId, logic.has_timestop), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Water hook', 1337127, lambda state: state.has('Water Mask', player)), + LocationData('Castle Ramparts', 'Castle Ramparts: Bomber chest', 1337128, logic.has_multiple_small_jumps_of_npc), + LocationData('Castle Ramparts', 'Castle Ramparts: Freeze the engineer', 1337129, lambda state: state.has('Talaria Attachment', player) or logic.has_timestop(state)), + LocationData('Castle Ramparts', 'Castle Ramparts: Giantess guarded room', 1337130), + LocationData('Castle Ramparts', 'Castle Ramparts: Knight and archer guarded room', 1337131), + LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal', 1337132), + LocationData('Castle Basement', 'Castle Basement: Secret pedestal', 1337133, logic.can_break_walls), + LocationData('Castle Basement', 'Castle Basement: Clean the castle basement', 1337134), + LocationData('Royal towers (lower)', 'Castle Keep: Yas queen room', 1337135, logic.has_pink), + LocationData('Castle Basement', 'Castle Basement: Giantess guarded chest', 1337136), + LocationData('Castle Basement', 'Castle Basement: Omelette chest', 1337137), + LocationData('Castle Basement', 'Castle Basement: Just an egg', 1337138), + LocationData('Castle Keep', 'Castle Keep: Under the twins', 1337139), + LocationData('Castle Keep', 'Killed Twins', EventId, logic.has_timestop), LocationData('Castle Keep', 'Castle Keep: Advisor jump', 1337171, logic.has_timestop), - LocationData('Castle Keep', 'Castle Keep: Twins', 1337140, logic.has_timestop), - LocationData('Castle Keep', 'Castle Keep: Royal guard tiny room', 1337141, lambda state: logic.has_doublejump(state) or logic.has_fastjump_on_npc(state)), - LocationData('Royal towers (lower)', 'Royal Towers: Floor secret', 1337142, lambda state: logic.has_doublejump(state) and logic.can_break_walls(state)), - LocationData('Royal towers', 'Royal Towers: Pre-climb gap', 1337143), - LocationData('Royal towers', 'Royal Towers: Long balcony', 1337144, lambda state: not flooded.flood_courtyard or state.has('Water Mask', player)), - LocationData('Royal towers', 'Royal Towers: Past bottom struggle juggle', 1337145, lambda state: flooded.flood_courtyard or logic.has_doublejump_of_npc(state)), - LocationData('Royal towers', 'Royal Towers: Bottom struggle juggle', 1337146, logic.has_doublejump_of_npc), - LocationData('Royal towers (upper)', 'Royal Towers: Top struggle juggle', 1337147, logic.has_doublejump_of_npc), - LocationData('Royal towers (upper)', 'Royal Towers: No struggle required', 1337148), - LocationData('Royal towers', 'Royal Towers: Right tower freebie', 1337149), - LocationData('Royal towers (upper)', 'Royal Towers: Left tower small balcony', 1337150), - LocationData('Royal towers (upper)', 'Royal Towers: Left tower royal guard', 1337151), - LocationData('Royal towers (upper)', 'Royal Towers: Before Aelana', 1337152), - LocationData('Royal towers (upper)', 'Killed Aelana', EventId), - LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s attic', 1337153, logic.has_upwarddash), - LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s chest', 1337154), - LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s pedestal', 1337155), + LocationData('Castle Keep', 'Castle Keep: Twins', 1337140, logic.has_timestop), + LocationData('Castle Keep', 'Castle Keep: Royal guard tiny room', 1337141, lambda state: logic.has_doublejump(state) or logic.has_fastjump_on_npc(state)), + LocationData('Royal towers (lower)', 'Royal Towers: Floor secret', 1337142, lambda state: logic.has_doublejump(state) and logic.can_break_walls(state)), + LocationData('Royal towers', 'Royal Towers: Pre-climb gap', 1337143), + LocationData('Royal towers', 'Royal Towers: Long balcony', 1337144, lambda state: not flooded.flood_courtyard or state.has('Water Mask', player)), + LocationData('Royal towers', 'Royal Towers: Past bottom struggle juggle', 1337145, lambda state: flooded.flood_courtyard or logic.has_doublejump_of_npc(state)), + LocationData('Royal towers', 'Royal Towers: Bottom struggle juggle', 1337146, logic.has_doublejump_of_npc), + LocationData('Royal towers (upper)', 'Royal Towers: Top struggle juggle', 1337147, logic.has_doublejump_of_npc), + LocationData('Royal towers (upper)', 'Royal Towers: No struggle required', 1337148), + LocationData('Royal towers', 'Royal Towers: Right tower freebie', 1337149), + LocationData('Royal towers (upper)', 'Royal Towers: Left tower small balcony', 1337150), + LocationData('Royal towers (upper)', 'Royal Towers: Left tower royal guard', 1337151), + LocationData('Royal towers (upper)', 'Royal Towers: Before Aelana', 1337152), + LocationData('Royal towers (upper)', 'Killed Aelana', EventId), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s attic', 1337153, logic.has_upwarddash), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s chest', 1337154), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s pedestal', 1337155), # Ancient pyramid locations - LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Why not it\'s right there', 1337246), - LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Conviction guarded room', 1337247), - LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit secret room', 1337248, lambda state: logic.can_break_walls(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), - LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret chest', 1337249, lambda state: logic.can_break_walls(state) and (state.has('Water Mask', player) if flooded.flood_pyramid_shaft else logic.has_doublejump(state))), - LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Nightmare Door chest', 1337236, lambda state: not flooded.flood_pyramid_back or state.has('Water Mask', player)), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Why not it\'s right there', 1337246), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Conviction guarded room', 1337247), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit secret room', 1337248, lambda state: logic.can_break_walls(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret chest', 1337249, lambda state: logic.can_break_walls(state) and (state.has('Water Mask', player) if flooded.flood_pyramid_shaft else logic.has_doublejump(state))), + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Nightmare Door chest', 1337236, lambda state: not flooded.flood_pyramid_back or state.has('Water Mask', player)), LocationData('Ancient Pyramid (right)', 'Killed Nightmare', EventId, lambda state: state.has_all({'Timespinner Wheel', 'Timespinner Spindle', 'Timespinner Gear 1', 'Timespinner Gear 2', 'Timespinner Gear 3'}, player) and (not flooded.flood_pyramid_back or state.has('Water Mask', player))) ] # 1337156 - 1337170 Downloads if not options or options.downloadable_items: location_table += ( - LocationData('Library', 'Library: Terminal 2 (Lachiem)', 1337156, lambda state: state.has('Tablet', player)), - LocationData('Library', 'Library: Terminal 1 (Windaria)', 1337157, lambda state: state.has('Tablet', player)), + LocationData('Library', 'Library: Terminal 2 (Lachiem)', 1337156, lambda state: state.has('Tablet', player)), + LocationData('Library', 'Library: Terminal 1 (Windaria)', 1337157, lambda state: state.has('Tablet', player)), # 1337158 Is lost in time - LocationData('Library', 'Library: Terminal 3 (Emperor Nuvius)', 1337159, lambda state: state.has('Tablet', player)), - LocationData('Library', 'Library: V terminal 1 (War of the Sisters)', 1337160, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), - LocationData('Library', 'Library: V terminal 2 (Lake Desolation Map)', 1337161, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), - LocationData('Library', 'Library: V terminal 3 (Vilete)', 1337162, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), - LocationData('Library top', 'Library: Backer room terminal (Vandagray Metropolis Map)', 1337163, lambda state: state.has('Tablet', player)), - LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Medbay terminal (Bleakness Research)', 1337164, lambda state: state.has('Tablet', player) and logic.has_keycard_B(state)), - LocationData('The lab (upper)', 'Lab: Download and chest room terminal (Experiment #13)', 1337165, lambda state: state.has('Tablet', player)), - LocationData('The lab (power off)', 'Lab: Middle terminal (Amadeus Laboratory Map)', 1337166, lambda state: state.has('Tablet', player) and (not options.lock_key_amadeus or state.has('Lab Access Research', player))), - LocationData('The lab (power off)', 'Lab: Sentry platform terminal (Origins)', 1337167, lambda state: state.has('Tablet', player) and (not options.lock_key_amadeus or state.has('Lab Access Genza', player) or logic.can_teleport_to(state, "Time", "GateDadsTower"))), - LocationData('The lab', 'Lab: Experiment 13 terminal (W.R.E.C Farewell)', 1337168, lambda state: state.has('Tablet', player)), - LocationData('The lab', 'Lab: Left terminal (Biotechnology)', 1337169, lambda state: state.has('Tablet', player)), - LocationData('The lab (power off)', 'Lab: Right terminal (Experiment #11)', 1337170, lambda state: state.has('Tablet', player) and (not options.lock_key_amadeus or state.has('Lab Access Research', player))) + LocationData('Library', 'Library: Terminal 3 (Emperor Nuvius)', 1337159, lambda state: state.has('Tablet', player)), + LocationData('Library', 'Library: V terminal 1 (War of the Sisters)', 1337160, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), + LocationData('Library', 'Library: V terminal 2 (Lake Desolation Map)', 1337161, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), + LocationData('Library', 'Library: V terminal 3 (Vilete)', 1337162, lambda state: state.has_all({'Tablet', 'Library Keycard V'}, player)), + LocationData('Library top', 'Library: Backer room terminal (Vandagray Metropolis Map)', 1337163, lambda state: state.has('Tablet', player)), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Medbay terminal (Bleakness Research)', 1337164, lambda state: state.has('Tablet', player) and logic.has_keycard_B(state)), + LocationData('The lab (upper)', 'Lab: Download and chest room terminal (Experiment #13)', 1337165, lambda state: state.has('Tablet', player)), + LocationData('Lab Research', 'Lab: Middle terminal (Amadeus Laboratory Map)', 1337166, lambda state: state.has('Tablet', player)), + LocationData('Main Lab', 'Lab: Sentry platform terminal (Origins)', 1337167, lambda state: state.has('Tablet', player) and (not options.lock_key_amadeus or state.has('Lab Access Genza', player) or logic.can_teleport_to(state, "Time", "GateDadsTower"))), + LocationData('Main Lab', 'Lab: Experiment 13 terminal (W.R.E.C Farewell)', 1337168, lambda state: state.has('Tablet', player)), + LocationData('Main Lab', 'Lab: Left terminal (Biotechnology)', 1337169, lambda state: state.has('Tablet', player)), + LocationData('Lab Research', 'Lab: Right terminal (Experiment #11)', 1337170, lambda state: state.has('Tablet', player)) ) # 1337176 - 1337176 Cantoran if not options or options.cantoran: location_table += ( - LocationData('Left Side forest Caves', 'Lake Serene: Cantoran', 1337176), + LocationData('Left Side forest Caves', 'Lake Serene: Cantoran', 1337176), ) # 1337177 - 1337198 Lore Checks if not options or options.lore_checks: location_table += ( - LocationData('Lower lake desolation', 'Lake Desolation: Memory - Coyote Jump (Time Messenger)', 1337177), - LocationData('Library', 'Library: Memory - Waterway (A Message)', 1337178), - LocationData('Library top', 'Library: Memory - Library Gap (Lachiemi Sun)', 1337179), - LocationData('Library top', 'Library: Memory - Mr. Hat Portrait (Moonlit Night)', 1337180), - LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Memory - Elevator (Nomads)', 1337181, lambda state: state.has('Elevator Keycard', player)), - LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers: Memory - Siren Elevator (Childhood)', 1337182, logic.has_keycard_B), - LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Memory - Bottom (Faron)', 1337183), - LocationData('Military Fortress', 'Military Fortress: Memory - Bomber Climb (A Solution)', 1337184, lambda state: state.has('Timespinner Wheel', player) and logic.has_doublejump_of_npc(state)), - LocationData('The lab', 'Lab: Memory - Genza\'s Secret Stash 1 (An Old Friend)', 1337185, logic.can_break_walls), - LocationData('The lab', 'Lab: Memory - Genza\'s Secret Stash 2 (Twilight Dinner)', 1337186, logic.can_break_walls), - LocationData('Emperors tower', 'Emperor\'s Tower: Memory - Way Up There (Final Circle)', 1337187, logic.has_doublejump_of_npc), - LocationData('Forest', 'Forest: Journal - Rats (Lachiem Expedition)', 1337188), - LocationData('Forest', 'Forest: Journal - Bat Jump Ledge (Peace Treaty)', 1337189, lambda state: logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state) or logic.has_fastjump_on_npc(state)), - LocationData('Forest', 'Forest: Journal - Floating in Moat (Prime Edicts)', 1337190, lambda state: not flooded.flood_moat or state.has('Water Mask', player)), - LocationData('Castle Ramparts', 'Castle Ramparts: Journal - Archer + Knight (Declaration of Independence)', 1337191), - LocationData('Castle Keep', 'Castle Keep: Journal - Under the Twins (Letter of Reference)', 1337192), - LocationData('Castle Basement', 'Castle Basement: Journal - Castle Loop Giantess (Political Advice)', 1337193), - LocationData('Royal towers (lower)', 'Royal Towers: Journal - Aelana\'s Room (Diplomatic Missive)', 1337194, logic.has_pink), - LocationData('Royal towers (upper)', 'Royal Towers: Journal - Top Struggle Juggle Base (War of the Sisters)', 1337195), - LocationData('Royal towers (upper)', 'Royal Towers: Journal - Aelana Boss (Stained Letter)', 1337196), - LocationData('Royal towers', 'Royal Towers: Journal - Near Bottom Struggle Juggle (Mission Findings)', 1337197, lambda state: flooded.flood_courtyard or logic.has_doublejump_of_npc(state)), - LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Journal - Lower Left Caves (Naivety)', 1337198, lambda state: not flooded.flood_maw or state.has('Water Mask', player)) + LocationData('Lower lake desolation', 'Lake Desolation: Memory - Coyote Jump (Time Messenger)', 1337177), + LocationData('Library', 'Library: Memory - Waterway (A Message)', 1337178), + LocationData('Library top', 'Library: Memory - Library Gap (Lachiemi Sun)', 1337179), + LocationData('Library top', 'Library: Memory - Mr. Hat Portrait (Moonlit Night)', 1337180), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Memory - Elevator (Nomads)', 1337181, lambda state: state.has('Elevator Keycard', player)), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers: Memory - Siren Elevator (Childhood)', 1337182, logic.has_keycard_B), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Memory - Bottom (Faron)', 1337183), + LocationData('Military Fortress', 'Military Fortress: Memory - Bomber Climb (A Solution)', 1337184, lambda state: state.has('Timespinner Wheel', player) and logic.has_doublejump_of_npc(state)), + LocationData('Main Lab', 'Lab: Memory - Genza\'s Secret Stash 1 (An Old Friend)', 1337185, logic.can_break_walls), + LocationData('Main Lab', 'Lab: Memory - Genza\'s Secret Stash 2 (Twilight Dinner)', 1337186, logic.can_break_walls), + LocationData('Emperors tower', 'Emperor\'s Tower: Memory - Way Up There (Final Circle)', 1337187, logic.has_doublejump_of_npc), + LocationData('Forest', 'Forest: Journal - Rats (Lachiem Expedition)', 1337188), + LocationData('Forest', 'Forest: Journal - Bat Jump Ledge (Peace Treaty)', 1337189, lambda state: logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state) or logic.has_fastjump_on_npc(state)), + LocationData('Forest', 'Forest: Journal - Floating in Moat (Prime Edicts)', 1337190, lambda state: not flooded.flood_moat or state.has('Water Mask', player)), + LocationData('Castle Ramparts', 'Castle Ramparts: Journal - Archer + Knight (Declaration of Independence)', 1337191), + LocationData('Castle Keep', 'Castle Keep: Journal - Under the Twins (Letter of Reference)', 1337192), + LocationData('Castle Basement', 'Castle Basement: Journal - Castle Loop Giantess (Political Advice)', 1337193), + LocationData('Royal towers (lower)', 'Royal Towers: Journal - Aelana\'s Room (Diplomatic Missive)', 1337194, logic.has_pink), + LocationData('Royal towers (upper)', 'Royal Towers: Journal - Top Struggle Juggle Base (War of the Sisters)', 1337195), + LocationData('Royal towers (upper)', 'Royal Towers: Journal - Aelana Boss (Stained Letter)', 1337196), + LocationData('Royal towers', 'Royal Towers: Journal - Near Bottom Struggle Juggle (Mission Findings)', 1337197, lambda state: flooded.flood_courtyard or logic.has_doublejump_of_npc(state)), + LocationData('Caves of Banishment (Maw)', 'Caves of Banishment (Maw): Journal - Lower Left Caves (Naivety)', 1337198) ) # 1337199 - 1337232 Reserved for future use @@ -259,9 +261,9 @@ def get_location_datas(player: Optional[int], options: Optional[TimespinnerOptio # 1337233 - 1337235 Pyramid Start checks if not options or options.pyramid_start: location_table += ( - LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Training Dummy', 1337233), - LocationData('Ancient Pyramid (entrance)', 'Temporal Gyre: Forest Entrance', 1337234, lambda state: logic.has_upwarddash(state) or logic.can_teleport_to(state, "Time", "GateGyre")), - LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Rubble', 1337235), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Training Dummy', 1337233), + LocationData('Ancient Pyramid (entrance)', 'Temporal Gyre: Forest Entrance', 1337234, lambda state: logic.has_upwarddash(state) or logic.can_teleport_to(state, "Time", "GateGyre")), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Rubble', 1337235), ) # 1337236 Nightmare door @@ -269,15 +271,581 @@ def get_location_datas(player: Optional[int], options: Optional[TimespinnerOptio # 1337237 - 1337245 GyreArchives if not options or options.gyre_archives: location_table += ( - LocationData('Ravenlord\'s Lair', 'Ravenlord: Post fight (pedestal)', 1337237), - LocationData('Ifrit\'s Lair', 'Ifrit: Post fight (pedestal)', 1337238), - LocationData('Temporal Gyre', 'Temporal Gyre: Chest 1', 1337239), - LocationData('Temporal Gyre', 'Temporal Gyre: Chest 2', 1337240), - LocationData('Temporal Gyre', 'Temporal Gyre: Chest 3', 1337241), - LocationData('Ravenlord\'s Lair', 'Ravenlord: Pre fight', 1337242), - LocationData('Ravenlord\'s Lair', 'Ravenlord: Post fight (chest)', 1337243), - LocationData('Ifrit\'s Lair', 'Ifrit: Pre fight', 1337244), + LocationData('Ravenlord\'s Lair', 'Ravenlord: Post fight (pedestal)', 1337237), + LocationData('Ifrit\'s Lair', 'Ifrit: Post fight (pedestal)', 1337238), + LocationData('Temporal Gyre', 'Temporal Gyre: Chest 1', 1337239), + LocationData('Temporal Gyre', 'Temporal Gyre: Chest 2', 1337240), + LocationData('Temporal Gyre', 'Temporal Gyre: Chest 3', 1337241), + LocationData('Ravenlord\'s Lair', 'Ravenlord: Pre fight', 1337242), + LocationData('Ravenlord\'s Lair', 'Ravenlord: Post fight (chest)', 1337243), + LocationData('Ifrit\'s Lair', 'Ifrit: Pre fight', 1337244), LocationData('Ifrit\'s Lair', 'Ifrit: Post fight (chest)', 1337245), ) + + # 1337250 - 1337781 Torch checks + if not options or options.pure_torcher: + location_table += ( + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Not So Secret Lantern', 1337250, lambda state: logic.can_break_walls(state) and logic.can_break_lanterns(state)), + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Middle Room Lantern 1', 1337256, logic.can_break_lanterns), + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Middle Room Lantern 2', 1337257, logic.can_break_lanterns), + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Timespinner Wheel Lantern 1', 1337258, logic.can_break_lanterns), + LocationData('Lower lake desolation', 'Lake Desolation (Lower): Timespinner Wheel Lantern 2', 1337259, logic.can_break_lanterns), + + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Upper Left Room Lantern 1', 1337251, logic.can_break_lanterns), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Upper Left Room Lantern 2', 1337252, logic.can_break_lanterns), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Oxygen Recovery Lantern', 1337253, logic.can_break_lanterns), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Upper Right Room Lantern 1', 1337254, logic.can_break_lanterns), + LocationData('Upper lake desolation', 'Lake Desolation (Upper): Double jump Cave Lantern', 1337255, logic.can_break_lanterns), + + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 1', 1337773, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 2', 1337774, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 3', 1337775, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 4', 1337776, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 5', 1337777, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 6', 1337778, logic.can_break_lanterns), + LocationData('Eastern lake desolation', 'Lake Desolation: Metropolis Bridge Lantern 7', 1337779, logic.can_break_lanterns), + + LocationData('Library', 'Library: Sewer Entrance Lantern', 1337489, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Sewer Lantern 1', 1337422, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Sewer Lantern 2', 1337423, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 1', 1337424, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 2', 1337425, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 3', 1337426, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 4', 1337427, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 5', 1337428, logic.can_break_lanterns), + LocationData('Library', 'Library: Right Sewer Lantern 6', 1337429, logic.can_break_lanterns), + LocationData('Library', 'Library: Sewer Exit Lantern 1', 1337492, logic.can_break_lanterns), + LocationData('Library', 'Library: Sewer Exit Lantern 2', 1337493, logic.can_break_lanterns), + LocationData('Library', 'Library: Basement Lantern', 1337494, logic.can_break_lanterns), + LocationData('Library', 'Library: Exit Lantern', 1337450, logic.can_break_lanterns), + LocationData('Library', 'Library: Librarian Lantern 1', 1337463, logic.can_break_lanterns), + LocationData('Library', 'Library: Librarian Lantern 2', 1337464, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Staircase Lantern 1', 1337465, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Staircase Lantern 2', 1337466, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Staircase Lantern 3', 1337467, logic.can_break_lanterns), + LocationData('Library', 'Library: Left Staircase Lantern 4', 1337468, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 1', 1337471, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 2', 1337472, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 3', 1337473, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 4', 1337474, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 5', 1337475, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 6', 1337476, logic.can_break_lanterns), + LocationData('Library', 'Library: Lantern 7', 1337477, logic.can_break_lanterns), + LocationData('Library', 'Library: Storage Room Lantern 1', 1337478, lambda state: logic.has_keycard_D(state) and logic.can_break_lanterns(state)), + LocationData('Library', 'Library: Storage Room Lantern 2', 1337479, lambda state: logic.has_keycard_D(state) and logic.can_break_lanterns(state)), + LocationData('Library', 'Library: Waterway Lantern 1', 1337480, logic.can_break_lanterns), + LocationData('Library', 'Library: Waterway Lantern 2', 1337481, logic.can_break_lanterns), + LocationData('Library', 'Library: V Room Lantern 1', 1337490, lambda state: state.has('Library Keycard V', player) and logic.can_break_lanterns(state)), + LocationData('Library', 'Library: V Room Lantern 2', 1337491, lambda state: state.has('Library Keycard V', player) and logic.can_break_lanterns(state)), + + LocationData('Library top', 'Library: Backer Room Lantern 1', 1337484, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Room Lantern 2', 1337485, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Room Lantern 3', 1337486, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Room Lantern 4', 1337487, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Room Lantern 5', 1337488, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Stairs Lantern 1', 1337459, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Stairs Lantern 2', 1337460, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Stairs Lantern 3', 1337461, logic.can_break_lanterns), + LocationData('Library top', 'Library: Backer Stairs Lantern 4', 1337462, logic.can_break_lanterns), + LocationData('Library top', 'Library: Mr. Hat Lantern 1', 1337482, logic.can_break_lanterns), + LocationData('Library top', 'Library: Mr. Hat Lantern 2', 1337483, logic.can_break_lanterns), + + LocationData('Varndagroth tower left', 'Library: Moving Sidewalk Lantern 1', 1337430, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Library: Moving Sidewalk Lantern 2', 1337431, logic.can_break_lanterns), + + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Entrance Lantern', 1337434, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Bottom Floor Lantern', 1337451, lambda state: logic.has_keycard_C(state) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Elevator Lantern 1', 1337452, lambda state: state.has('Elevator Keycard', player) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Elevator Lantern 2', 1337453, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Base Lantern 1', 1337469, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Base Lantern 2', 1337470, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Floor 2 Lantern 1', 1337432, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Floor 2 Lantern 2', 1337433, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Middle Lantern', 1337454, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Ladder Lantern 1', 1337455, logic.can_break_lanterns), + LocationData('Varndagroth tower left', 'Varndagroth Towers (Left): Left Stairs Ladder Lantern 2', 1337456, logic.can_break_lanterns), + + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers: Bridge Entrance Lantern 1', 1337457, logic.can_break_lanterns), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers: Bridge Entrance Lantern 2', 1337458, logic.can_break_lanterns), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Bridge Exit Lantern 1', 1337437, logic.can_break_lanterns), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Bridge Exit Lantern 2', 1337438, logic.can_break_lanterns), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Above Vents Lantern 1', 1337448, lambda state: (state.has('Elevator Keycard', player) or logic.has_doublejump(state)) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Above Vents Lantern 2', 1337449, lambda state: (state.has('Elevator Keycard', player) or logic.has_doublejump(state)) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Vent Lantern 1', 1337445, lambda state: (state.has('Elevator Keycard', player) or logic.has_doublejump(state)) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Vent Lantern 2', 1337446, lambda state: (state.has('Elevator Keycard', player) or logic.has_doublejump(state)) and logic.can_break_lanterns(state)), + LocationData('Varndagroth tower right (upper)', 'Varndagroth Towers (Right): Vent Lantern 3', 1337447, lambda state: (state.has('Elevator Keycard', player) or logic.has_doublejump(state)) and logic.can_break_lanterns(state)), + + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 1', 1337439, logic.can_break_lanterns), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 2', 1337440, logic.can_break_lanterns), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 3', 1337441, logic.can_break_lanterns), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 4', 1337442, logic.can_break_lanterns), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 5', 1337443, logic.can_break_lanterns), + LocationData('Varndagroth tower right (elevator)', 'Varndagroth Towers (Right): Right Elevator Lantern 6', 1337444, logic.can_break_lanterns), + + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Right Stairs Lantern 1', 1337435, logic.can_break_lanterns), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Right Stairs Lantern 2', 1337436, logic.can_break_lanterns), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Base Lantern 1', 1337495, logic.can_break_lanterns), + LocationData('Varndagroth tower right (lower)', 'Varndagroth Towers (Right): Base Lantern 2', 1337496, logic.can_break_lanterns), + + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Middle Hall Lantern 1', 1337721, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Middle Hall Lantern 2', 1337722, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Middle Hall Lantern 3', 1337723, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Middle Hall Lantern 4', 1337724, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): First Hall Lantern 1', 1337741, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): First Hall Lantern 2', 1337742, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): First Hall Lantern ', 1337743, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Condemned Shaft Lantern 1', 1337744, logic.can_break_lanterns), + LocationData('Sealed Caves (Sirens)', 'Sealed Caves (Sirens): Condemned Shaft Lantern 2', 1337745, logic.can_break_lanterns), + + LocationData('Skeleton Shaft', 'Sealed Caves (Xarion): Skeleton Lantern 1', 1337718, logic.can_break_lanterns), + LocationData('Skeleton Shaft', 'Sealed Caves (Xarion): Skeleton Lantern 2', 1337719, logic.can_break_lanterns), + LocationData('Skeleton Shaft', 'Sealed Caves (Xarion): Skeleton Lantern 3', 1337720, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 1', 1337712, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 2', 1337713, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 3', 1337714, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 4', 1337715, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 5', 1337716, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): First Hall Lantern 6', 1337717, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Second Hall Lantern 1', 1337746, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Second Hall Lantern 2', 1337747, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Second Hall Lantern 3', 1337748, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Second Hall Lantern 4', 1337749, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Forked Shaft Lantern 1', 1337750, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Forked Shaft Lantern 2', 1337751, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Forked Shaft Lantern 3', 1337752, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Forked Shaft Lantern 4', 1337753, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Forked Shaft Lantern 5', 1337754, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom Jump Lantern 1', 1337738, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom Jump Lantern 2', 1337739, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom Jump Lantern 3', 1337740, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Shroom Jump Lantern 4', 1337781, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Start Lantern 1', 1337761, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Start Lantern 2', 1337762, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Vertical Room Lantern 1', 1337769, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Vertical Room Lantern 2', 1337770, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Vertical Room Lantern 3', 1337771, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Lower Fork Vertical Room Lantern 4', 1337772, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Mini Jackpot Ledge Lantern', 1337733, lambda state: logic.has_forwarddash_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Waterfall Lantern 1', 1337731, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Waterfall Lantern 2', 1337732, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Waterfall Lantern 3', 1337734, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Waterfall Lantern 4', 1337735, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Waterfall Lantern 5', 1337736, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Post-Fork Room Lantern 1', 1337763, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Post-Fork Room Lantern 2', 1337764, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 1', 1337755, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 2', 1337756, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 3', 1337757, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 4', 1337758, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 5', 1337759, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Rejoined Hallway Lantern 6', 1337760, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 1', 1337725, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 2', 1337726, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 3', 1337727, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 4', 1337728, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 5', 1337729, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Penultimate Hall Lantern 6', 1337730, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last Chance Room Lantern 1', 1337765, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last Chance Room Lantern 2', 1337766, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last Chance Room Lantern 3', 1337767, logic.can_break_lanterns), + LocationData('Sealed Caves (Xarion)', 'Sealed Caves (Xarion): Last Chance Room Lantern 4', 1337768, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + + LocationData('Forest', 'Forest: Rats Lantern', 1337498, logic.can_break_lanterns), + LocationData('Forest', 'Forest: Ramparts Bridge Lantern 1', 1337499, logic.can_break_lanterns), + LocationData('Forest', 'Forest: Ramparts Bridge Lantern 2', 1337500, logic.can_break_lanterns), + LocationData('Forest', 'Forest: Ramparts Bridge Lantern 3', 1337501, logic.can_break_lanterns), + LocationData('Forest', 'Forest: Batcave Lantern', 1337502, logic.can_break_lanterns), + LocationData('Forest', 'Forest: Lantern Before Broken Bridge', 1337503, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Forest: Lantern Past Signpost', 1337497, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Forest: Lantern After Broken Bridge', 1337504, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Forest: Left Caves Lantern', 1337505, logic.can_break_lanterns), + + LocationData('Castle Ramparts', 'Castle Ramparts: Giantess Lantern 1', 1337507, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Giantess Lantern 2', 1337508, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Archer + Knight Lantern 1', 1337509, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Archer + Knight Lantern 2', 1337510, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal Lantern', 1337513, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Big Boulder Room Lantern 1', 1337514, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Big Boulder Room Lantern 2', 1337515, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Left Rooftops Lantern 1', 1337516, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Left Rooftops Lantern 2', 1337517, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Left Rooftops Lantern 3', 1337518, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Middle Hammer Lantern 1', 1337519, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Middle Hammer Lantern 2', 1337520, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Middle Hammer Lantern 3', 1337521, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Exit Lantern 1', 1337522, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Exit Lantern 2', 1337523, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Exit Lantern 3', 1337524, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Exit Lantern 4', 1337525, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal Stairs Lantern 1', 1337526, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal Stairs Lantern 2', 1337527, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Pedestal Stairs Lantern 3', 1337528, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Right Rooftops Lantern 1', 1337529, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Right Rooftops Lantern 2', 1337530, logic.can_break_lanterns), + LocationData('Castle Ramparts', 'Castle Ramparts: Right Rooftops Lantern 3', 1337531, logic.can_break_lanterns), + + LocationData('Castle Basement', 'Castle Basement: Entrance Lantern 1', 1337536, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Entrance Lantern 2', 1337537, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Entrance Lantern 3', 1337538, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Exit Lantern 1', 1337539, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Exit Lantern 2', 1337540, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Exit Climb Lantern 1', 1337541, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Exit Climb Lantern 2', 1337542, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: First Bird Hall Lantern 1', 1337543, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: First Bird Hall Lantern 2', 1337544, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Single Bird Lantern 1', 1337567, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Single Bird Lantern 2', 1337568, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Second Bird Hall Lantern 1', 1337569, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Second Bird Hall Lantern 2', 1337570, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Center Shaft Lantern 1', 1337579, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Center Shaft Lantern 2', 1337580, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Giantess Lantern 1', 1337581, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Giantess Lantern 2', 1337582, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Foyer Low Left Lantern', 1337563, logic.can_break_lanterns), + LocationData('Castle Basement', 'Castle Basement: Foyer Low Right Lantern', 1337560, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Foyer Mid Left Lantern', 1337562, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Foyer Mid Right Lantern', 1337561, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Foyer High Left Lantern', 1337564, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Foyer High Right Lantern', 1337565, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Beginning Lantern 1', 1337532, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Beginning Lantern 2', 1337533, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Beginning Lantern 3', 1337534, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Beginning Lantern 4', 1337535, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Far-Left Climb Double-Jump Lantern', 1337545, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Far-Left Climb Lower Lantern 1', 1337546, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Far-Left Climb Lower Lantern 2', 1337547, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Hallway Lantern 1', 1337548, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Hallway Lantern 2', 1337549, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Hallway Lantern 3', 1337550, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Hallway Lantern 4', 1337551, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Right-Middle Hallway Lantern 1', 1337552, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Right-Middle Hallway Lantern 2', 1337553, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Right-Middle Hallway Lantern 3', 1337554, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Right-Middle Hallway Lantern 4', 1337555, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Tiny Royal Guard Room Lantern 1', 1337556, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump(state) or logic.has_fastjump_on_npc(state))), + LocationData('Castle Keep', 'Castle Keep: Tiny Royal Guard Room Lantern 2', 1337557, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump(state) or logic.has_fastjump_on_npc(state))), + LocationData('Castle Keep', 'Castle Keep: Royal Tower Entrance Lantern 1', 1337558, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Royal Tower Entrance Lantern 2', 1337559, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Below Royal Room Lantern', 1337566, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Outside Aelana\'s Room Lantern 1', 1337571, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Outside Aelana\'s Room Lantern 2', 1337572, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Outside Aelana\'s Room Lantern 3', 1337573, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Outside Aelana\'s Room Lantern 4', 1337574, lambda state: logic.has_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Door Lantern 1', 1337575, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Door Lantern 2', 1337576, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Lantern 1', 1337577, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Under The Twins Lantern 2', 1337578, logic.can_break_lanterns), + LocationData('Castle Keep', 'Castle Keep: Twins Approach Lantern 1', 1337583, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Approach Lantern 2', 1337584, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Approach Lantern 3', 1337585, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Stairwell Lantern 1', 1337586, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + LocationData('Castle Keep', 'Castle Keep: Twins Stairwell Lantern 2', 1337587, lambda state: logic.has_timestop(state) and logic.can_break_lanterns(state)), + + LocationData('Royal towers', 'Royal Towers: Long Balcony Lantern 1', 1337588, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_courtyard or state.has('Water Mask', player))), + LocationData('Royal towers', 'Royal Towers: Long Balcony Lantern 2', 1337589, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_courtyard or state.has('Water Mask', player))), + LocationData('Royal towers', 'Royal Towers: Long Balcony Lantern 3', 1337590, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_courtyard or state.has('Water Mask', player))), + LocationData('Royal towers', 'Royal Towers: Long Balcony Lantern 4', 1337591, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_courtyard or state.has('Water Mask', player))), + LocationData('Royal towers', 'Royal Towers: Long Balcony Lantern 5', 1337592, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_courtyard or state.has('Water Mask', player))), + LocationData('Royal towers', 'Royal Towers: Bottom Struggle Base Lantern 1', 1337593, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers', 'Royal Towers: Bottom Struggle Base Lantern 2', 1337594, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers', 'Royal Towers: Before Bottom Struggle Lantern 1', 1337605, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers', 'Royal Towers: Before Bottom Struggle Lantern 2', 1337606, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers', 'Royal Towers: Past Bottom Struggle Lantern 1', 1337607, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers', 'Royal Towers: Past Bottom Struggle Lantern 2', 1337608, lambda state: logic.can_break_lanterns(state) and (flooded.flood_courtyard or logic.has_doublejump_of_npc(state))), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s Attic Lantern 1', 1337780, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s Attic Lantern 2', 1337511, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Royal towers (upper)', 'Royal Towers: Aelana\'s Attic Lantern 3', 1337512, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Royal towers (upper)', 'Royal Towers: Before Aelana Lantern 1', 1337595, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Tower Base Entrance Lantern 1', 1337596, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Tower Base Entrance Lantern 2', 1337597, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Tower Base Entrance Lantern 3', 1337598, logic.can_break_lanterns), + LocationData('Royal towers', 'Royal Towers: Lantern Above Time-Stop Demon', 1337599, logic.can_break_lanterns), + LocationData('Royal towers (lower)', 'Royal Towers: Lantern Below Time-Stop Demon', 1337600, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Left Tower Base Lantern 1', 1337601, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Left Tower Base Lantern 2', 1337602, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Left Royal Guard Lantern 1', 1337603, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Left Royal Guard Lantern 2', 1337604, logic.can_break_lanterns), + LocationData('Royal towers', 'Royal Towers: Pre-Climb Lantern 1', 1337609, logic.can_break_lanterns), + LocationData('Royal towers', 'Royal Towers: Pre-Climb Lantern 2', 1337610, logic.can_break_lanterns), + LocationData('Royal towers', 'Royal Towers: Bottom Struggle Lantern', 1337611, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Final Climb Lantern 1', 1337612, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Final Climb Lantern 2', 1337613, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Right Tower Base Lantern 1', 1337614, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Right Tower Base Lantern 2', 1337615, logic.can_break_lanterns), + LocationData('Royal towers (upper)', 'Royal Towers: Right Tower Base Lantern 3', 1337616, logic.can_break_lanterns), + + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): First Hall Lantern 1', 1337674, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): First Hall Lantern 2', 1337675, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): First Hall Lantern 3', 1337676, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Second Hall Lantern 1', 1337700, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Second Hall Lantern 2', 1337701, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Second Hall Lantern 3', 1337702, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Second Hall Lantern 4', 1337703, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Middle Hall Lantern 1', 1337654, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Middle Hall Lantern 2', 1337655, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Middle Hall Lantern 3', 1337656, logic.can_break_lanterns), + LocationData('Caves of Banishment (Sirens)', 'Caves of Banishment (Sirens): Middle Hall Lantern 4', 1337657, logic.can_break_lanterns), + + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Not Dead Yet Lantern 1', 1337650, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Not Dead Yet Lantern 2', 1337651, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Not Dead Yet Lantern 3', 1337652, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Not Dead Yet Lantern 4', 1337653, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 1', 1337643, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 2', 1337644, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 3', 1337645, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 4', 1337646, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 5', 1337647, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): First Hall Lantern 6', 1337648, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Second Hall Lantern 1', 1337682, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Second Hall Lantern 2', 1337683, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Second Hall Lantern 3', 1337684, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Second Hall Lantern 4', 1337685, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Shroom Jump Lantern 1', 1337670, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Shroom Jump Lantern 2', 1337671, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Shroom Jump Lantern 3', 1337672, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Shroom Jump Lantern 4', 1337673, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Forked Shaft Lantern 1', 1337686, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Forked Shaft Lantern 2', 1337687, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Forked Shaft Lantern 3', 1337688, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Forked Shaft Lantern 4', 1337689, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Forked Shaft Lantern 5', 1337690, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Vertical Room Lantern 1', 1337708, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Vertical Room Lantern 2', 1337709, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Vertical Room Lantern 3', 1337710, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Vertical Room Lantern 4', 1337711, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 1', 1337658, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 2', 1337659, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 3', 1337660, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 4', 1337661, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 5', 1337662, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Penultimate Hall Lantern 6', 1337663, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Jackpot Ledge Lantern', 1337666, lambda state: logic.has_forwarddash_doublejump(state) and logic.can_break_lanterns(state)), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Waterfall Lantern 1', 1337664, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Waterfall Lantern 2', 1337665, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Waterfall Lantern 3', 1337667, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Waterfall Lantern 4', 1337668, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Waterfall Lantern 5', 1337669, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 1', 1337691, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 2', 1337692, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 3', 1337693, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 4', 1337694, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 5', 1337695, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Rejoined Hallway Lantern 6', 1337737, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Start Lantern 1', 1337696, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Lower Fork Start Lantern 2', 1337697, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Post-Fork Room Lantern 1', 1337698, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Post-Fork Room Lantern 2', 1337699, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Last Chance Lantern 1', 1337704, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Last Chance Lantern 2', 1337705, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Last Chance Lantern 3', 1337706, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Last Chance Lantern 4', 1337707, logic.can_break_lanterns), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Mineshaft Lantern 1', 1337677, lambda state: logic.can_break_lanterns(state) and state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Mineshaft Lantern 2', 1337678, lambda state: logic.can_break_lanterns(state) and state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Mineshaft Lantern 3', 1337679, lambda state: logic.can_break_lanterns(state) and state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Mineshaft Lantern 4', 1337680, lambda state: logic.can_break_lanterns(state) and state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + LocationData('Caves of Banishment (Flooded)', 'Caves of Banishment (Maw): Mineshaft Lantern 5', 1337681, lambda state: logic.can_break_lanterns(state) and state.has_any({'Gas Mask', 'Talaria Attachment'}, player)), + + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Intro Room Lantern', 1337617, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Middle Cave Lantern', 1337621, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Uncrashed Site Lantern 1', 1337622, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Uncrashed Site Lantern 2', 1337623, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Uncrashed Site Lantern 3', 1337624, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Uncrashed Site Lantern 4', 1337625, logic.can_break_lanterns), + LocationData('Upper Lake Serene', 'Lake Serene (Upper): Past First Vine Lantern', 1337626, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Lake Serene (Upper): Past Cantoran Lantern', 1337634, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Lake Serene (Upper): Fork Dry Lantern', 1337631, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Lake Serene (Upper): Fork Wet Lantern 1', 1337632, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Upper): Fork Wet Lantern 2', 1337633, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Above The Eels Lantern 1', 1337638, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Above The Eels Lantern 2', 1337639, logic.can_break_lanterns), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under The Eels Lantern 1', 1337640, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under The Eels Lantern 2', 1337641, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under The Eels Lantern 3', 1337642, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Under The Eels Lantern 4', 1337649, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Left Side forest Caves', 'Lake Serene (Lower): Past the Eels Lantern', 1337630, lambda state: logic.can_break_lanterns(state) and state.has('Water Mask', player)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Secret Lantern 1', 1337618, lambda state: logic.can_break_lanterns(state) and logic.can_break_walls(state)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Secret Lantern 2', 1337619, lambda state: logic.can_break_lanterns(state) and logic.can_break_walls(state)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Secret Lantern 3', 1337620, lambda state: logic.can_break_lanterns(state) and logic.can_break_walls(state)), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Water Spikes Lantern 1', 1337635, logic.can_break_lanterns), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Water Spikes Lantern 2', 1337636, logic.can_break_lanterns), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Water Spikes Lantern 3', 1337637, logic.can_break_lanterns), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Lantern 1', 1337627, logic.can_break_lanterns), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Lantern 2', 1337628, logic.can_break_lanterns), + LocationData('Lower Lake Serene', 'Lake Serene (Lower): Underwater Lantern 3', 1337629, logic.can_break_lanterns), + + LocationData('Military Fortress', 'Military Fortress: Entrance Lantern 1', 1337260, logic.can_break_lanterns), + LocationData('Military Fortress', 'Military Fortress: Entrance Lantern 2', 1337261, logic.can_break_lanterns), + LocationData('Military Fortress', 'Military Fortress: Bombing Room Lower Lantern 1', 1337264, logic.can_break_lanterns), + LocationData('Military Fortress', 'Military Fortress: Bombing Room Lower Lantern 2', 1337266, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Bombing Room Upper Lantern 1', 1337263, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Bombing Room Upper Lantern 2', 1337265, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Left Bridge Lantern 1', 1337267, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Left Bridge Lantern 2', 1337268, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Left Bridge Lantern 3', 1337269, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Middle Room Lantern 1', 1337270, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Middle Room Lantern 2', 1337271, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Right Bridge Lantern 1', 1337274, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Right Bridge Lantern 2', 1337275, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Right Bridge Lantern 3', 1337276, logic.can_break_lanterns), + LocationData('Military Fortress (hangar)', 'Military Fortress: Spike Room Lantern 1', 1337262, lambda state: logic.can_break_lanterns(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))), + LocationData('Military Fortress (hangar)', 'Military Fortress: Spike Room Lantern 2', 1337272, lambda state: logic.can_break_lanterns(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))), + LocationData('Military Fortress (hangar)', 'Military Fortress: Pedestal Lantern', 1337273, lambda state: logic.can_break_lanterns(state) and (state.has('Water Mask', player) if flooded.flood_lab else (logic.has_doublejump_of_npc(state) or logic.has_forwarddash_doublejump(state)))), + + LocationData('Lab Entrance', 'Lab: Intro Hallway Lantern 1', 1337294, logic.can_break_lanterns), + LocationData('Lab Entrance', 'Lab: Intro Hallway Lantern 2', 1337782, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Coffee Lantern 1', 1337305, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Coffee Lantern 2', 1337306, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Coffee Lantern 3', 1337307, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Lower Trash Entrance Lantern 1', 1337277, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Lower Trash Entrance Lantern 2', 1337278, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 1', 1337297, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 2', 1337298, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 3', 1337299, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 4', 1337300, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 5', 1337301, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 6', 1337302, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 7', 1337303, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Main Shaft Lantern 8', 1337304, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Trash Stairs Lantern 1', 1337281, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Trash Stairs Lantern 2', 1337506, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Exp. 13 Terminal Lantern 1', 1337295, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Exp. 13 Terminal Lantern 2', 1337296, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Left Terminal Lantern 1', 1337308, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Left Terminal Lantern 2', 1337309, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Trash Jump Lantern 1', 1337282, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state))), + LocationData('Main Lab', 'Lab: Trash Jump Lantern 2', 1337283, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state))), + LocationData('Lab Research', 'Lab: Spider Hell Entrance Lantern 1', 1337290, logic.can_break_lanterns), + LocationData('Lab Research', 'Lab: Spider Hell Entrance Lantern 2', 1337291, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Lower Trash Lantern 1', 1337292, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state))), + LocationData('Main Lab', 'Lab: Lower Trash Lantern 2', 1337293, lambda state: logic.can_break_lanterns(state) and (logic.has_doublejump_of_npc(state) if options.lock_key_amadeus else logic.has_upwarddash(state))), + LocationData('The lab (upper)', 'Lab: File Cabinet Lantern 1', 1337310, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: File Cabinet Lantern 2', 1337311, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: File Cabinet Staircase Lantern 1', 1337286, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: File Cabinet Staircase Lantern 2', 1337287, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: File Cabinet Staircase Lantern 3', 1337288, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: File Cabinet Staircase Lantern 4', 1337289, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: Genza Door Lantern 1', 1337284, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: Genza Door Lantern 2', 1337285, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: Download and Chest Lantern 1', 1337312, logic.can_break_lanterns), + LocationData('The lab (upper)', 'Lab: Download and Chest Lantern 2', 1337313, logic.can_break_lanterns), + LocationData('Main Lab', 'Lab: Sentry Lantern 1', 1337279, lambda state: logic.can_break_lanterns(state) and (not options.lock_key_amadeus or state.has('Lab Access Genza', player) or logic.can_teleport_to(state, "Time", "GateDadsTower"))), + LocationData('Main Lab', 'Lab: Sentry Lantern 2', 1337280, lambda state: logic.can_break_lanterns(state) and (not options.lock_key_amadeus or state.has('Lab Access Genza', player) or logic.can_teleport_to(state, "Time", "GateDadsTower"))), + + LocationData('Emperors tower (courtyard)', 'Emperor\'s Tower: Courtyard Lantern 1', 1337314, logic.can_break_lanterns), + LocationData('Emperors tower (courtyard)', 'Emperor\'s Tower: Courtyard Lantern 2', 1337316, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Staircase Lantern', 1337315, logic.can_break_lanterns), + LocationData('Emperors tower (courtyard)', 'Emperor\'s Tower: Courtyard Bottom Lantern 1', 1337342, logic.can_break_lanterns), + LocationData('Emperors tower (courtyard)', 'Emperor\'s Tower: Courtyard Bottom Lantern 2', 1337343, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Floor Secret Lantern 1', 1337336, lambda state: logic.has_upwarddash(state) and logic.can_break_walls(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Floor Secret Lantern 2', 1337337, lambda state: logic.has_upwarddash(state) and logic.can_break_walls(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Giantess Lantern 1', 1337331, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Giantess Lantern 2', 1337332, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Courtyard Upper Lantern', 1337333, lambda state: logic.has_upwarddash(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Hallway Lantern 1', 1337317, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Hallway Lantern 2', 1337318, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Hallway Lantern 3', 1337319, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Hallway Lantern 4', 1337320, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Left Room Lantern 1', 1337321, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Left Room Lantern 2', 1337322, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Outside Way Up There Lantern 1', 1337323, lambda state: logic.has_doublejump_of_npc(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Outside Way Up There Lantern 2', 1337324, lambda state: logic.has_doublejump_of_npc(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Way Up There Lantern 1', 1337325, lambda state: logic.has_doublejump_of_npc(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Way Up There Lantern 2', 1337326, lambda state: logic.has_doublejump_of_npc(state) and logic.can_break_lanterns(state)), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Left Tower Lantern 1', 1337327, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Left Tower Lantern 2', 1337328, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Galactic Sage Lantern 1', 1337329, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Galactic Sage Lantern 2', 1337330, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Save Room Lantern 1', 1337334, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Save Room Lantern 2', 1337335, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Climb Past Stairs Lantern 1', 1337338, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Climb Past Stairs Lantern 2', 1337339, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Climb Past Stairs Lantern 3', 1337340, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Climb Past Stairs Lantern 4', 1337341, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Middle Bridge Lantern 1', 1337344, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Middle Bridge Lantern 2', 1337345, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Middle Bridge Lantern 3', 1337346, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Middle Bridge Lantern 4', 1337347, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Middle Bridge Lantern 5', 1337348, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Upper Left Tower Lantern 1', 1337349, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Upper Left Tower Lantern 2', 1337350, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Right Tower Lantern 1', 1337351, logic.can_break_lanterns), + LocationData('Emperors tower', 'Emperor\'s Tower: Lower Right Tower Lantern 2', 1337352, logic.can_break_lanterns), + + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 1', 1337369, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 2', 1337370, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 3', 1337371, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 4', 1337372, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 5', 1337373, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Pyramid Entrance Lantern 6', 1337374, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Training Dummy Lantern 1', 1337375, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Dark Forest: Training Dummy Lantern 2', 1337376, logic.can_break_lanterns), + + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Entrance Lantern 1', 1337377, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Entrance Lantern 2', 1337378, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Rubble Lantern 1', 1337399, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Rubble Lantern 2', 1337400, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Rubble Lantern 3', 1337401, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Entrance Climb Lantern 1', 1337393, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Entrance Climb Lantern 2', 1337394, logic.can_break_lanterns), + LocationData('Ancient Pyramid (entrance)', 'Ancient Pyramid: Why Not It\'s Right There Lantern', 1337386, logic.can_break_lanterns), + + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: First Enemy Lantern 1', 1337387, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: First Enemy Lantern 2', 1337388, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Upper-Left Stairway Lantern 1', 1337381, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Upper-Left Stairway Lantern 2', 1337382, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Upper-Left Stairway Lantern 3', 1337383, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Shaft Lantern 1', 1337402, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Shaft Lantern 2', 1337403, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Lantern 1', 1337389, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Lantern 2', 1337390, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Lantern 3', 1337391, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Regret Lantern 4', 1337392, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Left Hallway Lantern 1', 1337395, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Left Hallway Lantern 2', 1337396, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Left Hallway Lantern 3', 1337397, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Left Hallway Lantern 4', 1337398, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit Secret Lantern 1', 1337404, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit Secret Lantern 2', 1337405, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit Secret\'s Secret Lantern 1', 1337406, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit Secret\'s Secret Lantern 2', 1337407, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Outside Inner Warp Lantern 1', 1337408, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Outside Inner Warp Lantern 2', 1337409, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Nightmare Stairway Entrance Lantern', 1337410, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Conviction Lantern 1', 1337411, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Conviction Lantern 2', 1337412, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: A Long Fall Lantern 1', 1337415, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: A Long Fall Lantern 2', 1337416, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_shaft or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Last Chance Before Shaft Lantern 1', 1337417, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Last Chance Before Shaft Lantern 2', 1337418, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Pit Secret Wall Lantern', 1337419, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Post-Shaft Hallway Lantern 1', 1337420, logic.can_break_lanterns), + LocationData('Ancient Pyramid (left)', 'Ancient Pyramid: Post-Shaft Hallway Lantern 2', 1337421, logic.can_break_lanterns), + + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Upper-Right Stairway Lantern 1', 1337384, logic.can_break_lanterns), + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Upper-Right Stairway Lantern 2', 1337385, logic.can_break_lanterns), + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Nightmare Stairway Lantern 1', 1337379, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_back or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Nightmare Stairway Lantern 2"', 1337380, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_back or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Nightmare Door Lantern 1', 1337413, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_back or state.has('Water Mask', player))), + LocationData('Ancient Pyramid (right)', 'Ancient Pyramid: Nightmare Door Lantern 2', 1337414, lambda state: logic.can_break_lanterns(state) and (not flooded.flood_pyramid_back or state.has('Water Mask', player))), + ) + if not options or options.gyre_archives: + location_table += ( + LocationData('Temporal Gyre', 'Temporal Gyre: Room 1 Lantern 1', 1337353, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 1 Lantern 2', 1337354, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 2 Lantern 1', 1337355, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 2 Lantern 2', 1337356, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 3 Lantern 1', 1337357, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 3 Lantern 2', 1337358, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 4 Lantern 1', 1337359, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 4 Lantern 2', 1337360, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 5 Lantern 1', 1337361, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 5 Lantern 2', 1337362, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 6 Lantern 1', 1337363, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 6 Lantern 2', 1337364, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 7 Lantern 1', 1337365, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 7 Lantern 2', 1337366, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 8 Lantern 1', 1337367, logic.can_break_lanterns), + LocationData('Temporal Gyre', 'Temporal Gyre: Room 8 Lantern 2', 1337368, logic.can_break_lanterns), + ) return location_table diff --git a/worlds/timespinner/LogicExtensions.py b/worlds/timespinner/LogicExtensions.py index 878b69ae9c..a977b8a0ea 100644 --- a/worlds/timespinner/LogicExtensions.py +++ b/worlds/timespinner/LogicExtensions.py @@ -24,6 +24,7 @@ class TimespinnerLogic: self.flag_eye_spy = bool(options and options.eye_spy) self.flag_unchained_keys = bool(options and options.unchained_keys) self.flag_prism_break = bool(options and options.prism_break) + self.flag_find_the_flame = bool(options and options.find_the_flame) if precalculated_weights: if self.flag_unchained_keys: @@ -93,6 +94,12 @@ class TimespinnerLogic: else: return True + def can_break_lanterns(self, state: CollectionState) -> bool: + if self.flag_find_the_flame: + return state.has('Cube of Bodie', self.player) + else: + return True + def can_kill_all_3_bosses(self, state: CollectionState) -> bool: if self.flag_prism_break: return state.has_all({'Laser Access M', 'Laser Access I', 'Laser Access A'}, self.player) diff --git a/worlds/timespinner/Options.py b/worlds/timespinner/Options.py index 4cb7fbbce1..23a688b8b3 100644 --- a/worlds/timespinner/Options.py +++ b/worlds/timespinner/Options.py @@ -53,6 +53,75 @@ class BossRando(Choice): option_unscaled = 2 alias_true = 1 +class BossRandoType(Choice): + """ + Sets what type of boss shuffling occurs. + Shuffle: Bosses will be shuffled amongst each other + Chaos: Bosses will be randomized with the chance of duplicate bosses + Singularity: All bosses will be replaced with a single boss + Manual: Bosses will be placed according to the Boss Rando Overrides setting + """ + display_name = "Boss Randomization Type" + option_shuffle = 0 + option_chaos = 1 + option_singularity = 2 + option_manual = 3 + +class BossRandoOverrides(OptionDict): + """ + Manual mapping of bosses to the boss they will be replaced with. + Bosses that you don't specify will be the vanilla boss. + """ + bosses = [ + "FelineSentry", + "Varndagroth", + "AzureQueen", + "GoldenIdol", + "Aelana", + "Maw", + "Cantoran", + "Genza", + "Nuvius", + "Vol", + "Prince", + "Xarion", + "Ravenlord", + "Ifrit", + "Sandman", + "Nightmare", + ] + + schema = Schema( + { + Optional(Or(*bosses)): Or( + And( + {Optional(boss): And(int, lambda n: n >= 0) for boss in bosses}, + lambda d: any(v > 0 for v in d.values()), + ), + *bosses + ) + } + ) + display_name = "Boss Rando Overrides" + default = { + "FelineSentry": "FelineSentry", + "Varndagroth": "Varndagroth", + "AzureQueen": "AzureQueen", + "GoldenIdol": "GoldenIdol", + "Aelana": "Aelana", + "Maw": "Maw", + "Cantoran": "Cantoran", + "Genza": "Genza", + "Nuvius": "Nuvius", + "Vol": "Vol", + "Prince": "Prince", + "Xarion": "Xarion", + "Ravenlord": "Ravenlord", + "Ifrit": "Ifrit", + "Sandman": "Sandman", + "Nightmare": "Nightmare" + } + class EnemyRando(Choice): "Wheter enemies will be randomized, and if their damage/hp should be scaled." display_name = "Enemy Randomization" @@ -367,8 +436,8 @@ class TrapChance(Range): class Traps(OptionList): """List of traps that may be in the item pool to find""" display_name = "Traps Types" - valid_keys = { "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap" } - default = [ "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap" ] + valid_keys = { "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap", "Spider Trap", "Lights Out Trap", "Palm Punch Trap" } + default = [ "Meteor Sparrow Trap", "Poison Trap", "Chaos Trap", "Neurotoxin Trap", "Bee Trap", "Throw Stun Trap", "Spider Trap", "Lights Out Trap", "Palm Punch Trap" ] class PresentAccessWithWheelAndSpindle(Toggle): """When inverted, allows using the refugee camp warp when both the Timespinner Wheel and Spindle is acquired.""" @@ -399,6 +468,14 @@ class RoyalRoadblock(Toggle): """The Royal Towers entrance door requires a royal orb (Plasma Orb, Plasma Geyser, or Royal Ring) to enter.""" display_name = "Royal Roadblock" +class PureTorcher(Toggle): + """All lanterns contain checks. (Except tutorial)""" + display_name = "Pure Torcher" + +class FindTheFlame(Toggle): + """Lanterns in 'Pure Torcher' will not break without new item 'Cube of Bodie'.""" + display_name = "Find the Flame" + @dataclass class TimespinnerOptions(PerGameCommonOptions, DeathLinkMixin): start_with_jewelry_box: StartWithJewelryBox @@ -412,6 +489,8 @@ class TimespinnerOptions(PerGameCommonOptions, DeathLinkMixin): cantoran: Cantoran lore_checks: LoreChecks boss_rando: BossRando + boss_rando_type: BossRandoType + boss_rando_overrides: BossRandoOverrides enemy_rando: EnemyRando damage_rando: DamageRando damage_rando_overrides: DamageRandoOverrides @@ -441,6 +520,8 @@ class TimespinnerOptions(PerGameCommonOptions, DeathLinkMixin): pyramid_start: PyramidStart gate_keep: GateKeep royal_roadblock: RoyalRoadblock + pure_torcher: PureTorcher + find_the_flame: FindTheFlame trap_chance: TrapChance traps: Traps diff --git a/worlds/timespinner/PreCalculatedWeights.py b/worlds/timespinner/PreCalculatedWeights.py index 3ad7c2c78a..916de34696 100644 --- a/worlds/timespinner/PreCalculatedWeights.py +++ b/worlds/timespinner/PreCalculatedWeights.py @@ -21,6 +21,8 @@ class PreCalculatedWeights: flood_lake_serene_bridge: bool flood_lab: bool + boss_rando_overrides: Dict[str, str] + def __init__(self, options: TimespinnerOptions, random: Random): if options.rising_tides: weights_overrrides: Dict[str, Union[str, Dict[str, int]]] = self.get_flood_weights_overrides(options) @@ -51,6 +53,26 @@ class PreCalculatedWeights: self.flood_lake_serene_bridge = False self.flood_lab = False + boss_rando_weights_overrides: Dict[str, Union[str, Dict[str, int]]] = self.get_boss_rando_weights_overrides(options) + self.boss_rando_overrides = { + "FelineSentry": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "FelineSentry"), + "Varndagroth": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Varndagroth"), + "AzureQueen": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "AzureQueen"), + "GoldenIdol": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "GoldenIdol"), + "Aelana": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Aelana"), + "Maw": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Maw"), + "Cantoran": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Cantoran"), + "Genza": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Genza"), + "Nuvius": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Nuvius"), + "Vol": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Vol"), + "Prince": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Prince"), + "Xarion": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Xarion"), + "Ravenlord": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Ravenlord"), + "Ifrit": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Ifrit"), + "Sandman": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Sandman"), + "Nightmare": self.roll_boss_rando_setting(random, boss_rando_weights_overrides, "Nightmare") + } + self.pyramid_keys_unlock, self.present_key_unlock, self.past_key_unlock, self.time_key_unlock = \ self.get_pyramid_keys_unlocks(options, random, self.flood_maw, self.flood_xarion, self.flood_lab) @@ -88,12 +110,15 @@ class PreCalculatedWeights: if options.risky_warps: past_teleportation_gates.append("GateLakeSereneLeft") - present_teleportation_gates.append("GateDadsTower") if not is_xarion_flooded: present_teleportation_gates.append("GateXarion") - if not is_lab_flooded: - present_teleportation_gates.append("GateLabEntrance") + # Prevent going past the lazers without a way to the past + if options.unchained_keys or options.prism_break or not options.pyramid_start: + present_teleportation_gates.append("GateDadsTower") + if not is_lab_flooded: + present_teleportation_gates.append("GateLabEntrance") + # Prevent getting stuck in the past without a way back to the future if options.inverted or (options.pyramid_start and not options.back_to_the_future): all_gates: Tuple[str, ...] = present_teleportation_gates else: @@ -139,3 +164,32 @@ class PreCalculatedWeights: return True, True elif result == "FloodedWithSavePointAvailable": return True, False + + @staticmethod + def get_boss_rando_weights_overrides(options: TimespinnerOptions) -> Dict[str, Union[str, Dict[str, int]]]: + weights_overrides_option: Union[int, Dict[str, Union[str, Dict[str, int]]]] = \ + options.boss_rando_overrides.value + + default_weights: Dict[str, Dict[str, int]] = options.boss_rando_overrides.default + + if not weights_overrides_option: + weights_overrides_option = default_weights + else: + for key, weights in default_weights.items(): + if not key in weights_overrides_option: + weights_overrides_option[key] = weights + + return weights_overrides_option + + @staticmethod + def roll_boss_rando_setting(random: Random, all_weights: Dict[str, Union[Dict[str, int], str]], + key: str) -> str: + + weights: Union[Dict[str, int], str] = all_weights[key] + + if isinstance(weights, dict): + result: str = random.choices(list(weights.keys()), weights=list(map(int, weights.values())))[0] + else: + result: str = weights + + return result diff --git a/worlds/timespinner/Regions.py b/worlds/timespinner/Regions.py index 51b1688f1a..9580eb14fe 100644 --- a/worlds/timespinner/Regions.py +++ b/worlds/timespinner/Regions.py @@ -28,9 +28,11 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp create_region(world, player, locations_per_region, 'Sealed Caves (Sirens)'), create_region(world, player, locations_per_region, 'Military Fortress'), create_region(world, player, locations_per_region, 'Military Fortress (hangar)'), - create_region(world, player, locations_per_region, 'The lab'), - create_region(world, player, locations_per_region, 'The lab (power off)'), + create_region(world, player, locations_per_region, 'Lab Entrance'), + create_region(world, player, locations_per_region, 'Main Lab'), + create_region(world, player, locations_per_region, 'Lab Research'), create_region(world, player, locations_per_region, 'The lab (upper)'), + create_region(world, player, locations_per_region, 'Emperors tower (courtyard)'), create_region(world, player, locations_per_region, 'Emperors tower'), create_region(world, player, locations_per_region, 'Skeleton Shaft'), create_region(world, player, locations_per_region, 'Sealed Caves (Xarion)'), @@ -41,6 +43,7 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp create_region(world, player, locations_per_region, 'Lower Lake Serene'), create_region(world, player, locations_per_region, 'Caves of Banishment (upper)'), create_region(world, player, locations_per_region, 'Caves of Banishment (Maw)'), + create_region(world, player, locations_per_region, 'Caves of Banishment (Flooded)'), create_region(world, player, locations_per_region, 'Caves of Banishment (Sirens)'), create_region(world, player, locations_per_region, 'Castle Ramparts'), create_region(world, player, locations_per_region, 'Castle Keep'), @@ -109,16 +112,19 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp connect(world, player, 'Military Fortress', 'Temporal Gyre', lambda state: state.has('Timespinner Wheel', player) and logic.can_kill_all_3_bosses(state)) connect(world, player, 'Military Fortress', 'Military Fortress (hangar)', logic.has_doublejump) connect(world, player, 'Military Fortress (hangar)', 'Military Fortress') - connect(world, player, 'Military Fortress (hangar)', 'The lab', lambda state: logic.has_keycard_B(state) and (state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state))) + connect(world, player, 'Military Fortress (hangar)', 'Lab Entrance', lambda state: state.has('Water Mask', player) if flooded.flood_lab else logic.has_doublejump(state)) + connect(world, player, 'Lab Entrance', 'Main Lab', lambda state: logic.has_keycard_B(state)) + connect(world, player, 'Main Lab', 'Lab Entrance') + connect(world, player, 'Lab Entrance', 'Military Fortress (hangar)') connect(world, player, 'Temporal Gyre', 'Military Fortress') - connect(world, player, 'The lab', 'Military Fortress') - connect(world, player, 'The lab', 'The lab (power off)', lambda state: options.lock_key_amadeus or logic.has_doublejump_of_npc(state)) - connect(world, player, 'The lab (power off)', 'The lab', lambda state: not flooded.flood_lab or state.has('Water Mask', player)) - connect(world, player, 'The lab (power off)', 'The lab (upper)', lambda state: logic.has_forwarddash_doublejump(state) and ((not options.lock_key_amadeus) or state.has('Lab Access Genza', player))) - connect(world, player, 'The lab (upper)', 'The lab (power off)') - connect(world, player, 'The lab (upper)', 'Emperors tower', logic.has_forwarddash_doublejump) + connect(world, player, 'Main Lab', 'Lab Research', lambda state: state.has('Lab Access Research', player) if options.lock_key_amadeus else logic.has_doublejump_of_npc(state)) + connect(world, player, 'Main Lab', 'The lab (upper)', lambda state: logic.has_forwarddash_doublejump(state) and ((not options.lock_key_amadeus) or state.has('Lab Access Genza', player))) + connect(world, player, 'The lab (upper)', 'Main Lab', lambda state: options.lock_key_amadeus and state.has('Lab Access Genza', player)) + connect(world, player, 'The lab (upper)', 'Emperors tower (courtyard)', logic.has_forwarddash_doublejump) connect(world, player, 'The lab (upper)', 'Ancient Pyramid (entrance)', lambda state: state.has_all({'Timespinner Wheel', 'Timespinner Spindle', 'Timespinner Gear 1', 'Timespinner Gear 2', 'Timespinner Gear 3'}, player)) - connect(world, player, 'Emperors tower', 'The lab (upper)') + connect(world, player, 'Emperors tower (courtyard)', 'The lab (upper)') + connect(world, player, 'Emperors tower (courtyard)', 'Emperors tower', logic.has_doublejump) + connect(world, player, 'Emperors tower', 'Emperors tower (courtyard)') connect(world, player, 'Skeleton Shaft', 'Lake desolation') connect(world, player, 'Skeleton Shaft', 'Sealed Caves (Xarion)', logic.has_keycard_A) connect(world, player, 'Skeleton Shaft', 'Space time continuum', logic.has_teleport) @@ -141,10 +147,11 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp connect(world, player, 'Lower Lake Serene', 'Left Side forest Caves') connect(world, player, 'Lower Lake Serene', 'Caves of Banishment (upper)', lambda state: flooded.flood_lake_serene or logic.has_doublejump(state)) connect(world, player, 'Caves of Banishment (upper)', 'Lower Lake Serene', lambda state: not flooded.flood_lake_serene or state.has('Water Mask', player)) - connect(world, player, 'Caves of Banishment (upper)', 'Caves of Banishment (Maw)', lambda state: logic.has_doublejump(state) or state.has_any({'Gas Mask', 'Talaria Attachment'} or logic.has_teleport(state), player)) + connect(world, player, 'Caves of Banishment (upper)', 'Caves of Banishment (Maw)', lambda state: not flooded.flood_maw or state.has('Water Mask', player)) connect(world, player, 'Caves of Banishment (upper)', 'Space time continuum', logic.has_teleport) connect(world, player, 'Caves of Banishment (Maw)', 'Caves of Banishment (upper)', lambda state: logic.has_doublejump(state) if not flooded.flood_maw else state.has('Water Mask', player)) connect(world, player, 'Caves of Banishment (Maw)', 'Caves of Banishment (Sirens)', lambda state: state.has_any({'Gas Mask', 'Talaria Attachment'}, player) ) + connect(world, player, 'Caves of Banishment (Maw)', 'Caves of Banishment (Flooded)', lambda state: flooded.flood_maw or state.has('Water Mask', player)) connect(world, player, 'Caves of Banishment (Maw)', 'Space time continuum', logic.has_teleport) connect(world, player, 'Caves of Banishment (Sirens)', 'Forest') connect(world, player, 'Castle Ramparts', 'Forest') @@ -178,7 +185,7 @@ def create_regions_and_locations(world: MultiWorld, player: int, options: Timesp connect(world, player, 'Space time continuum', 'Upper Lake Serene', lambda state: logic.can_teleport_to(state, "Past", "GateLakeSereneLeft")) connect(world, player, 'Space time continuum', 'Left Side forest Caves', lambda state: logic.can_teleport_to(state, "Past", "GateLakeSereneRight")) connect(world, player, 'Space time continuum', 'Refugee Camp', lambda state: logic.can_teleport_to(state, "Past", "GateAccessToPast")) - connect(world, player, 'Space time continuum', 'Castle Ramparts', lambda state: logic.can_teleport_to(state, "Past", "GateCastleRamparts")) + connect(world, player, 'Space time continuum', 'Forest', lambda state: logic.can_teleport_to(state, "Past", "GateCastleRamparts")) connect(world, player, 'Space time continuum', 'Castle Keep', lambda state: logic.can_teleport_to(state, "Past", "GateCastleKeep")) connect(world, player, 'Space time continuum', 'Royal towers (lower)', lambda state: logic.can_teleport_to(state, "Past", "GateRoyalTowers")) connect(world, player, 'Space time continuum', 'Caves of Banishment (Maw)', lambda state: logic.can_teleport_to(state, "Past", "GateMaw")) diff --git a/worlds/timespinner/__init__.py b/worlds/timespinner/__init__.py index 4d1efc41e5..3f1178373e 100644 --- a/worlds/timespinner/__init__.py +++ b/worlds/timespinner/__init__.py @@ -3,7 +3,7 @@ from BaseClasses import Item, Tutorial, ItemClassification from .Items import get_item_names_per_category from .Items import item_table, starter_melee_weapons, starter_spells, filler_items, starter_progression_items, pyramid_start_starter_progression_items from .Locations import get_location_datas, EventId -from .Options import BackwardsCompatiableTimespinnerOptions, Toggle +from .Options import BackwardsCompatiableTimespinnerOptions, Toggle, BossRandoType from .PreCalculatedWeights import PreCalculatedWeights from .Regions import create_regions_and_locations from worlds.AutoWorld import World, WebWorld @@ -42,6 +42,7 @@ class TimespinnerWorld(World): topology_present = True web = TimespinnerWebWorld() required_client_version = (0, 4, 2) + ut_can_gen_without_yaml = True item_name_to_id = {name: data.code for name, data in item_table.items()} location_name_to_id = {location.name: location.code for location in get_location_datas(-1, None, None)} @@ -103,6 +104,8 @@ class TimespinnerWorld(World): "Cantoran": self.options.cantoran.value, "LoreChecks": self.options.lore_checks.value, "BossRando": self.options.boss_rando.value, + "BossRandoType": self.options.boss_rando_type.value, + "BossRandoOverrides": self.precalculated_weights.boss_rando_overrides, "EnemyRando": self.options.enemy_rando.value, "DamageRando": self.options.damage_rando.value, "DamageRandoOverrides": self.options.damage_rando_overrides.value, @@ -131,6 +134,8 @@ class TimespinnerWorld(World): "PyramidStart": self.options.pyramid_start.value, "GateKeep": self.options.gate_keep.value, "RoyalRoadblock": self.options.royal_roadblock.value, + "PureTorcher": self.options.pure_torcher.value, + "FindTheFlame": self.options.find_the_flame.value, "Traps": self.options.traps.value, "DeathLink": self.options.death_link.value, "StinkyMaw": True, @@ -178,6 +183,8 @@ class TimespinnerWorld(World): self.options.cantoran.value = slot_data["Cantoran"] self.options.lore_checks.value = slot_data["LoreChecks"] self.options.boss_rando.value = slot_data["BossRando"] + self.options.boss_rando_type.value = slot_data["BossRandoType"] + self.precalculated_weights.boss_rando_overrides = slot_data["BossRandoOverrides"] self.options.damage_rando.value = slot_data["DamageRando"] self.options.damage_rando_overrides.value = slot_data["DamageRandoOverrides"] self.options.hp_cap.value = slot_data["HpCap"] @@ -198,6 +205,7 @@ class TimespinnerWorld(World): self.options.rising_tides.value = slot_data["RisingTides"] self.options.unchained_keys.value = slot_data["UnchainedKeys"] self.options.back_to_the_future.value = slot_data["PresentAccessWithWheelAndSpindle"] + self.options.prism_break.value = slot_data["PrismBreak"] self.options.traps.value = slot_data["Traps"] self.options.death_link.value = slot_data["DeathLink"] # Readonly slot_data["StinkyMaw"] @@ -234,7 +242,10 @@ class TimespinnerWorld(World): spoiler_handle.write(f'Mysterious Warp Beacon unlock: {self.precalculated_weights.time_key_unlock}\n') else: spoiler_handle.write(f'Twin Pyramid Keys unlock: {self.precalculated_weights.pyramid_keys_unlock}\n') - + + if self.options.boss_rando.value and self.options.boss_rando_type.value == BossRandoType.option_manual: + spoiler_handle.write(f'Selected bosses: {self.precalculated_weights.boss_rando_overrides}\n') + if self.options.rising_tides: flooded_areas: List[str] = [] @@ -297,7 +308,9 @@ class TimespinnerWorld(World): if not item.advancement: return item - if (name == 'Tablet' or name == 'Library Keycard V') and not self.options.downloadable_items: + if name == 'Tablet' and not self.options.downloadable_items: + item.classification = ItemClassification.filler + elif name == 'Library Keycard V' and not (self.options.downloadable_items or self.options.pure_torcher): item.classification = ItemClassification.filler elif name == 'Oculus Ring' and not self.options.eye_spy: item.classification = ItemClassification.filler @@ -314,6 +327,8 @@ class TimespinnerWorld(World): item.classification = ItemClassification.filler elif name == "Drawbridge Key" and not self.options.gate_keep: item.classification = ItemClassification.filler + elif name == "Cube of Bodie" and not self.options.find_the_flame: + item.classification = ItemClassification.filler return item @@ -360,6 +375,9 @@ class TimespinnerWorld(World): if not self.options.gate_keep: excluded_items.add('Drawbridge Key') + if not self.options.find_the_flame: + excluded_items.add('Cube of Bodie') + for item in self.multiworld.precollected_items[self.player]: if item.name not in self.item_name_groups['UseItem']: excluded_items.add(item.name) diff --git a/worlds/tloz/Rom.py b/worlds/tloz/Rom.py index 58aa38805f..5b618bb688 100644 --- a/worlds/tloz/Rom.py +++ b/worlds/tloz/Rom.py @@ -58,7 +58,7 @@ class TLoZDeltaPatch(APDeltaPatch): def get_base_rom_bytes(file_name: str = "") -> bytes: base_rom_bytes = getattr(get_base_rom_bytes, "base_rom_bytes", None) if not base_rom_bytes: - file_name = get_base_rom_path(file_name) + file_name = get_base_rom_path() base_rom_bytes = bytes(Utils.read_snes_rom(open(file_name, "rb"))) basemd5 = hashlib.md5() @@ -70,10 +70,6 @@ def get_base_rom_bytes(file_name: str = "") -> bytes: return base_rom_bytes -def get_base_rom_path(file_name: str = "") -> str: - options = Utils.get_options() - if not file_name: - file_name = options["tloz_options"]["rom_file"] - if not os.path.exists(file_name): - file_name = Utils.user_path(file_name) - return file_name +def get_base_rom_path() -> str: + from . import TLoZWorld + return TLoZWorld.settings.rom_file diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index cdc8f05cb9..1d59eeaeca 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -1,24 +1,28 @@ from dataclasses import fields -from typing import Dict, List, Any, Tuple, TypedDict, ClassVar, Union, Set, TextIO from logging import warning -from BaseClasses import Region, Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState +from typing import Any, TypedDict, ClassVar, TextIO + +from BaseClasses import Location, Item, Tutorial, ItemClassification, MultiWorld, CollectionState +from Options import PlandoConnection, OptionError, PerGameCommonOptions, Range, Removed +from settings import Group, Bool, FilePath +from worlds.AutoWorld import WebWorld, World + +from .bells import bell_location_groups, bell_location_name_to_id +from .breakables import breakable_location_name_to_id, breakable_location_groups, breakable_location_table +from .combat_logic import area_data, CombatState +from .er_data import portal_mapping, RegionInfo, tunic_er_regions +from .er_rules import set_er_location_rules +from .er_scripts import create_er_regions, verify_plando_directions +from .fuses import fuse_location_name_to_id, fuse_location_groups +from .grass import grass_location_table, grass_location_name_to_id, grass_location_name_groups, excluded_grass_locations from .items import (item_name_to_id, item_table, item_name_groups, fool_tiers, filler_items, slot_data_item_names, combat_items) from .locations import location_table, location_name_groups, standard_location_name_to_id, hexagon_locations -from .rules import set_location_rules, set_region_rules, randomize_ability_unlocks, gold_hexagon -from .er_rules import set_er_location_rules -from .regions import tunic_regions -from .er_scripts import create_er_regions, verify_plando_directions -from .grass import grass_location_table, grass_location_name_to_id, grass_location_name_groups, excluded_grass_locations -from .er_data import portal_mapping, RegionInfo, tunic_er_regions +from .logic_helpers import randomize_ability_unlocks, gold_hexagon from .options import (TunicOptions, EntranceRando, tunic_option_groups, tunic_option_presets, TunicPlandoConnections, - LaurelsLocation, LogicRules, LaurelsZips, IceGrappling, LadderStorage, check_options, - get_hexagons_in_pool, HexagonQuestAbilityUnlockType, EntranceLayout) -from .breakables import breakable_location_name_to_id, breakable_location_groups, breakable_location_table -from .combat_logic import area_data, CombatState -from worlds.AutoWorld import WebWorld, World -from Options import PlandoConnection, OptionError, PerGameCommonOptions, Removed, Range -from settings import Group, Bool + LaurelsLocation, LaurelsZips, IceGrappling, LadderStorage, EntranceLayout, + check_options, LocalFill, get_hexagons_in_pool, HexagonQuestAbilityUnlockType) +from . import ut_stuff class TunicSettings(Group): @@ -28,8 +32,14 @@ class TunicSettings(Group): class LimitGrassRando(Bool): """Limits the impact of Grass Randomizer on the multiworld by disallowing local_fill percentages below 95.""" - disable_local_spoiler: Union[DisableLocalSpoiler, bool] = False - limit_grass_rando: Union[LimitGrassRando, bool] = True + class UTPoptrackerPath(FilePath): + """Path to the user's TUNIC Poptracker Pack.""" + description = "TUNIC Poptracker Pack zip file" + required = False + + disable_local_spoiler: DisableLocalSpoiler | bool = False + limit_grass_rando: LimitGrassRando | bool = True + ut_poptracker_path: UTPoptrackerPath | str = UTPoptrackerPath() class TunicWeb(WebWorld): @@ -61,10 +71,12 @@ class SeedGroup(TypedDict): laurels_zips: bool # laurels_zips value ice_grappling: int # ice_grappling value ladder_storage: int # ls value - laurels_at_10_fairies: bool # laurels location value + laurels_at_10_fairies: bool # whether laurels location is set to 10 fairies entrance_layout: int # entrance layout value has_decoupled_enabled: bool # for checking that players don't have conflicting options - plando: List[PlandoConnection] # consolidated plando connections for the seed group + plando: list[PlandoConnection] # consolidated plando connections for the seed group + bell_shuffle: bool # off controls + fuse_shuffle: bool # off controls class TunicWorld(World): @@ -75,53 +87,66 @@ class TunicWorld(World): """ game = "TUNIC" web = TunicWeb() + author: str = "SilentSR & ScipioWright" options: TunicOptions options_dataclass = TunicOptions settings: ClassVar[TunicSettings] item_name_groups = item_name_groups + # grass, breakables, fuses, and bells are separated out into their own files + # this makes for easier organization, at the cost of stuff like what's directly below here location_name_groups = location_name_groups for group_name, members in grass_location_name_groups.items(): location_name_groups.setdefault(group_name, set()).update(members) for group_name, members in breakable_location_groups.items(): location_name_groups.setdefault(group_name, set()).update(members) + for group_name, members in fuse_location_groups.items(): + location_name_groups.setdefault(group_name, set()).update(members) + for group_name, members in bell_location_groups.items(): + location_name_groups.setdefault(group_name, set()).update(members) item_name_to_id = item_name_to_id location_name_to_id = standard_location_name_to_id.copy() location_name_to_id.update(grass_location_name_to_id) location_name_to_id.update(breakable_location_name_to_id) + location_name_to_id.update(fuse_location_name_to_id) + location_name_to_id.update(bell_location_name_to_id) - player_location_table: Dict[str, int] - ability_unlocks: Dict[str, int] - slot_data_items: List[TunicItem] - tunic_portal_pairs: Dict[str, str] - er_portal_hints: Dict[int, str] - seed_groups: Dict[str, SeedGroup] = {} - used_shop_numbers: Set[int] - er_regions: Dict[str, RegionInfo] # absolutely needed so outlet regions work + player_location_table: dict[str, int] + ability_unlocks: dict[str, int] + slot_data_items: list[TunicItem] + tunic_portal_pairs: dict[str, str] + er_portal_hints: dict[int, str] + seed_groups: dict[str, SeedGroup] = {} + used_shop_numbers: set[int] + er_regions: dict[str, RegionInfo] # absolutely needed so outlet regions work # for the local_fill option - fill_items: List[TunicItem] - fill_locations: List[Location] + fill_items: list[TunicItem] + fill_locations: list[Location] + backup_locations: list[Location] amount_to_local_fill: int # so we only loop the multiworld locations once # if these are locations instead of their info, it gives a memory leak error - item_link_locations: Dict[int, Dict[str, List[Tuple[int, str]]]] = {} - player_item_link_locations: Dict[str, List[Location]] + item_link_locations: dict[int, dict[str, list[tuple[int, str]]]] = {} + player_item_link_locations: dict[str, list[Location]] using_ut: bool # so we can check if we're using UT only once - passthrough: Dict[str, Any] + passthrough: dict[str, Any] ut_can_gen_without_yaml = True # class var that tells it to ignore the player yaml + tracker_world: ClassVar = ut_stuff.tracker_world def generate_early(self) -> None: + # if you have multiple APWorlds, we want it to fail here instead of at the end of gen try: int(self.settings.disable_local_spoiler) except AttributeError: raise Exception("You have a TUNIC APWorld in your lib/worlds folder and custom_worlds folder.\n" "This would cause an error at the end of generation.\n" "Please remove one of them, most likely the one in lib/worlds.") - + + # hidden option for me to do multi-slot test gens with random options more easily if self.options.all_random: for option_name in (attr.name for attr in fields(TunicOptions) if attr not in fields(PerGameCommonOptions)): @@ -137,10 +162,11 @@ class TunicWorld(World): option.value = self.random.choice(list(option.name_lookup)) check_options(self) - self.er_regions = tunic_er_regions.copy() + # empty plando connections if ER is off if self.options.plando_connections and not self.options.entrance_rando: self.options.plando_connections.value = () + # modify direction and order of plando connections for more consistency later on if self.options.plando_connections: def replace_connection(old_cxn: PlandoConnection, new_cxn: PlandoConnection, index: int) -> None: self.options.plando_connections.value.remove(old_cxn) @@ -168,42 +194,11 @@ class TunicWorld(World): f"They have Direction Pairs enabled and the connection " f"{cxn.entrance} --> {cxn.exit} does not abide by this option.") - # Universal tracker stuff, shouldn't do anything in standard gen - if hasattr(self.multiworld, "re_gen_passthrough"): - if "TUNIC" in self.multiworld.re_gen_passthrough: - self.using_ut = True - self.passthrough = self.multiworld.re_gen_passthrough["TUNIC"] - self.options.start_with_sword.value = self.passthrough["start_with_sword"] - self.options.keys_behind_bosses.value = self.passthrough["keys_behind_bosses"] - self.options.sword_progression.value = self.passthrough["sword_progression"] - self.options.ability_shuffling.value = self.passthrough["ability_shuffling"] - self.options.laurels_zips.value = self.passthrough["laurels_zips"] - self.options.ice_grappling.value = self.passthrough["ice_grappling"] - self.options.ladder_storage.value = self.passthrough["ladder_storage"] - self.options.ladder_storage_without_items = self.passthrough["ladder_storage_without_items"] - self.options.lanternless.value = self.passthrough["lanternless"] - self.options.maskless.value = self.passthrough["maskless"] - self.options.hexagon_quest.value = self.passthrough["hexagon_quest"] - self.options.hexagon_quest_ability_type.value = self.passthrough.get("hexagon_quest_ability_type", 0) - self.options.entrance_rando.value = self.passthrough["entrance_rando"] - self.options.shuffle_ladders.value = self.passthrough["shuffle_ladders"] - self.options.entrance_layout.value = EntranceLayout.option_standard - if ("ziggurat2020_3, ziggurat2020_1_zig2_skip" in self.passthrough["Entrance Rando"].keys() - or "ziggurat2020_3, ziggurat2020_1_zig2_skip" in self.passthrough["Entrance Rando"].values()): - self.options.entrance_layout.value = EntranceLayout.option_fixed_shop - self.options.decoupled = self.passthrough.get("decoupled", 0) - self.options.laurels_location.value = LaurelsLocation.option_anywhere - self.options.grass_randomizer.value = self.passthrough.get("grass_randomizer", 0) - self.options.breakable_shuffle.value = self.passthrough.get("breakable_shuffle", 0) - self.options.laurels_location.value = self.options.laurels_location.option_anywhere - self.options.combat_logic.value = self.passthrough.get("combat_logic", 0) - else: - self.using_ut = False - else: - self.using_ut = False + ut_stuff.setup_options_from_slot_data(self) self.player_location_table = standard_location_name_to_id.copy() + # setup our defaults for the local_fill option if self.options.local_fill == -1: if self.options.grass_randomizer: if self.options.breakable_shuffle: @@ -215,6 +210,10 @@ class TunicWorld(World): else: self.options.local_fill.value = 0 + if self.options.local_fill > 0 and self.settings.limit_grass_rando: + # discard grass from non_local if it's meant to be limited + self.options.non_local_items.value.discard("Grass") + if self.options.grass_randomizer: if self.settings.limit_grass_rando and self.options.local_fill < 95 and self.multiworld.players > 1: raise OptionError(f"TUNIC: Player {self.player_name} has their Local Fill option set too low. " @@ -230,9 +229,15 @@ class TunicWorld(World): self.player_location_table.update({name: num for name, num in breakable_location_name_to_id.items() if not name.startswith("Purgatory")}) + if self.options.shuffle_fuses: + self.player_location_table.update(fuse_location_name_to_id) + + if self.options.shuffle_bells: + self.player_location_table.update(bell_location_name_to_id) + @classmethod def stage_generate_early(cls, multiworld: MultiWorld) -> None: - tunic_worlds: Tuple[TunicWorld] = multiworld.get_game_worlds("TUNIC") + tunic_worlds: tuple[TunicWorld] = multiworld.get_game_worlds("TUNIC") for tunic in tunic_worlds: # setting up state combat logic stuff, see has_combat_reqs for its use # and this is magic so pycharm doesn't like it, unfortunately @@ -256,7 +261,9 @@ class TunicWorld(World): laurels_at_10_fairies=tunic.options.laurels_location == LaurelsLocation.option_10_fairies, entrance_layout=tunic.options.entrance_layout.value, has_decoupled_enabled=bool(tunic.options.decoupled), - plando=tunic.options.plando_connections.value.copy()) + plando=tunic.options.plando_connections.value.copy(), + bell_shuffle=bool(tunic.options.shuffle_bells), + fuse_shuffle=bool(tunic.options.shuffle_fuses)) continue # I feel that syncing this one is worse than erroring out if bool(tunic.options.decoupled) != cls.seed_groups[group]["has_decoupled_enabled"]: @@ -274,6 +281,12 @@ class TunicWorld(World): # laurels at 10 fairies changes logic for secret gathering place placement if tunic.options.laurels_location == 3: cls.seed_groups[group]["laurels_at_10_fairies"] = True + # off is more restrictive + if not tunic.options.shuffle_bells: + cls.seed_groups[group]["bell_shuffle"] = False + # off is more restrictive + if not tunic.options.shuffle_fuses: + cls.seed_groups[group]["fuse_shuffle"] = False # fixed shop and direction pairs override standard, but conflict with each other if tunic.options.entrance_layout: if cls.seed_groups[group]["entrance_layout"] == EntranceLayout.option_standard: @@ -338,10 +351,10 @@ class TunicWorld(World): return TunicItem(name, itemclass, self.item_name_to_id[name], self.player) def create_items(self) -> None: - tunic_items: List[TunicItem] = [] + tunic_items: list[TunicItem] = [] self.slot_data_items = [] - items_to_create: Dict[str, int] = {item: data.quantity_in_item_pool for item, data in item_table.items()} + items_to_create: dict[str, int] = {item: data.quantity_in_item_pool for item, data in item_table.items()} # Calculate number of hexagons in item pool if self.options.hexagon_quest: @@ -401,7 +414,7 @@ class TunicWorld(World): items_to_create[rgb_hexagon] = 0 # Filler items in the item pool - available_filler: List[str] = [filler for filler in items_to_create if items_to_create[filler] > 0 and + available_filler: list[str] = [filler for filler in items_to_create if items_to_create[filler] > 0 and item_table[filler].classification == ItemClassification.filler] # Remove filler to make room for other items @@ -425,6 +438,19 @@ class TunicWorld(World): ladder_count += 1 remove_filler(ladder_count) + if self.options.shuffle_fuses: + for item_name, item_data in item_table.items(): + if item_data.item_group == "Fuses": + if item_name == "Cathedral Elevator Fuse" and self.options.entrance_rando: + tunic_items.append(self.create_item(item_name, ItemClassification.useful)) + continue + items_to_create[item_name] = 1 + + if self.options.shuffle_bells: + for item_name, item_data in item_table.items(): + if item_data.item_group == "Bells": + items_to_create[item_name] = 1 + if self.options.hexagon_quest: # Replace pages and normal hexagons with filler for replaced_item in list(filter(lambda item: "Pages" in item or item in hexagon_locations, items_to_create)): @@ -477,12 +503,8 @@ class TunicWorld(World): # pull out the filler so that we can place it manually during pre_fill self.fill_items = [] if self.options.local_fill > 0 and self.multiworld.players > 1: - # skip items marked local or non-local, let fill deal with them in its own way - # discard grass from non_local if it's meant to be limited - if self.settings.limit_grass_rando: - self.options.non_local_items.value.discard("Grass") - all_filler: List[TunicItem] = [] - non_filler: List[TunicItem] = [] + all_filler: list[TunicItem] = [] + non_filler: list[TunicItem] = [] for tunic_item in tunic_items: if (tunic_item.excludable and tunic_item.name not in self.options.local_items @@ -501,7 +523,7 @@ class TunicWorld(World): if self.options.local_fill > 0 and self.multiworld.players > 1: # we need to reserve a couple locations so that we don't fill up every sphere 1 location sphere_one_locs = self.multiworld.get_reachable_locations(CollectionState(self.multiworld), self.player) - reserved_locations: Set[Location] = set(self.random.sample(sphere_one_locs, 2)) + reserved_locations: set[Location] = set(self.random.sample(sphere_one_locs, 2)) viable_locations = [loc for loc in self.multiworld.get_unfilled_locations(self.player) if loc not in reserved_locations and loc.name not in self.options.priority_locations.value] @@ -511,34 +533,91 @@ class TunicWorld(World): f"This is likely due to excess plando or priority locations.") self.random.shuffle(viable_locations) self.fill_locations = viable_locations[:self.amount_to_local_fill] + self.backup_locations = viable_locations[self.amount_to_local_fill:] @classmethod def stage_pre_fill(cls, multiworld: MultiWorld) -> None: - tunic_fill_worlds: List[TunicWorld] = [world for world in multiworld.get_game_worlds("TUNIC") + tunic_fill_worlds: list[TunicWorld] = [world for world in multiworld.get_game_worlds("TUNIC") if world.options.local_fill.value > 0] if tunic_fill_worlds and multiworld.players > 1: - grass_fill: List[TunicItem] = [] - non_grass_fill: List[TunicItem] = [] - grass_fill_locations: List[Location] = [] - non_grass_fill_locations: List[Location] = [] + grass_fill: list[TunicItem] = [] + non_grass_fill: list[TunicItem] = [] + grass_fill_locations: list[Location] = [] + non_grass_fill_locations: list[Location] = [] + backup_grass_locations: list[Location] = [] + backup_non_grass_locations: list[Location] = [] for world in tunic_fill_worlds: if world.options.grass_randomizer: grass_fill.extend(world.fill_items) grass_fill_locations.extend(world.fill_locations) + backup_grass_locations.extend(world.backup_locations) else: non_grass_fill.extend(world.fill_items) non_grass_fill_locations.extend(world.fill_locations) + backup_non_grass_locations.extend(world.backup_locations) multiworld.random.shuffle(grass_fill) multiworld.random.shuffle(non_grass_fill) multiworld.random.shuffle(grass_fill_locations) multiworld.random.shuffle(non_grass_fill_locations) + multiworld.random.shuffle(backup_grass_locations) + multiworld.random.shuffle(backup_non_grass_locations) + + # these are slots that filled in TUNIC locations during pre_fill + out_of_spec_worlds = set() for filler_item in grass_fill: - grass_fill_locations.pop().place_locked_item(filler_item) + loc_to_fill = grass_fill_locations.pop() + try: + loc_to_fill.place_locked_item(filler_item) + except Exception: + out_of_spec_worlds.add(multiworld.worlds[loc_to_fill.item.player].game) + for loc in backup_grass_locations: + if not loc.item: + loc.place_locked_item(filler_item) + break + else: + out_of_spec_worlds.add(multiworld.worlds[loc_to_fill.item.player].game) + else: + raise Exception("TUNIC: Could not fulfill local_filler option. This issue is caused by another " + "world filling TUNIC locations during pre_fill.\n" + "Archipelago does not allow us to place items into the item pool after " + "create_items, so we cannot recover from this issue.\n" + f"This is likely caused by the following world(s): {out_of_spec_worlds}.\n" + f"Please let the world dev(s) for the listed world(s) know that there is an " + f"issue there.\n" + "As a workaround, you can try setting the local_filler option lower for " + "TUNIC slots with Breakable Shuffle or Grass Rando enabled. You may be able to " + "try generating again, as it may not happen every generation.") for filler_item in non_grass_fill: - non_grass_fill_locations.pop().place_locked_item(filler_item) + loc_to_fill = non_grass_fill_locations.pop() + try: + loc_to_fill.place_locked_item(filler_item) + except Exception: + out_of_spec_worlds.add(multiworld.worlds[loc_to_fill.item.player].game) + for loc in backup_non_grass_locations: + if not loc.item: + loc.place_locked_item(filler_item) + break + else: + out_of_spec_worlds.add(multiworld.worlds[loc_to_fill.item.player].game) + else: + raise Exception("TUNIC: Could not fulfill local_filler option. This issue is caused by another " + "world filling TUNIC locations during pre_fill.\n" + "Archipelago does not allow us to place items into the item pool after " + "create_items, so we cannot recover from this issue.\n" + f"This is likely caused by the following world(s): {out_of_spec_worlds}.\n" + f"Please let the world dev(s) for the listed world(s) know that there is an " + f"issue there.\n" + "As a workaround, you can try setting the local_filler option lower for " + "TUNIC slots with Breakable Shuffle or Grass Rando enabled. You may be able to " + "try generating again, as it may not happen every generation.") + if out_of_spec_worlds: + warning("TUNIC: At least one other world has filled TUNIC locations during pre_fill. This may " + "cause issues for games that rely on placing items in their own world during pre_fill.\n" + f"This is likely being caused by the following world(s): {out_of_spec_worlds}.\n" + "Please let the world dev(s) for the listed world(s) know that there is an issue there.") def create_regions(self) -> None: self.tunic_portal_pairs = {} @@ -546,48 +625,19 @@ class TunicWorld(World): self.ability_unlocks = randomize_ability_unlocks(self) # stuff for universal tracker support, can be ignored for standard gen - if self.using_ut: + if self.using_ut and self.options.hexagon_quest_ability_type == "hexagons": self.ability_unlocks["Pages 24-25 (Prayer)"] = self.passthrough["Hexagon Quest Prayer"] self.ability_unlocks["Pages 42-43 (Holy Cross)"] = self.passthrough["Hexagon Quest Holy Cross"] self.ability_unlocks["Pages 52-53 (Icebolt)"] = self.passthrough["Hexagon Quest Icebolt"] - # Most non-standard options use ER regions - if (self.options.entrance_rando or self.options.shuffle_ladders or self.options.combat_logic - or self.options.grass_randomizer or self.options.breakable_shuffle): - portal_pairs = create_er_regions(self) - if self.options.entrance_rando: - # these get interpreted by the game to tell it which entrances to connect - for portal1, portal2 in portal_pairs.items(): - self.tunic_portal_pairs[portal1.scene_destination()] = portal2.scene_destination() - else: - # uses the original rules, easier to navigate and reference - for region_name in tunic_regions: - region = Region(region_name, self.player, self.multiworld) - self.multiworld.regions.append(region) - - for region_name, exits in tunic_regions.items(): - region = self.get_region(region_name) - region.add_exits(exits) - - for location_name, location_id in self.player_location_table.items(): - region = self.get_region(location_table[location_name].region) - location = TunicLocation(self.player, location_name, location_id, region) - region.locations.append(location) - - victory_region = self.get_region("Spirit Arena") - victory_location = TunicLocation(self.player, "The Heir", None, victory_region) - victory_location.place_locked_item(TunicItem("Victory", ItemClassification.progression, None, self.player)) - self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) - victory_region.locations.append(victory_location) + portal_pairs = create_er_regions(self) + if self.options.entrance_rando: + # these get interpreted by the game to tell it which entrances to connect + for portal1, portal2 in portal_pairs.items(): + self.tunic_portal_pairs[portal1.scene_destination()] = portal2.scene_destination() def set_rules(self) -> None: - # same reason as in create_regions - if (self.options.entrance_rando or self.options.shuffle_ladders or self.options.combat_logic - or self.options.grass_randomizer or self.options.breakable_shuffle): - set_er_location_rules(self) - else: - set_region_rules(self) - set_location_rules(self) + set_er_location_rules(self) def get_filler_item_name(self) -> str: return self.random.choice(filler_items) @@ -606,14 +656,14 @@ class TunicWorld(World): return change def write_spoiler_header(self, spoiler_handle: TextIO): - if self.options.hexagon_quest and self.options.ability_shuffling\ - and self.options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: + if (self.options.hexagon_quest and self.options.ability_shuffling + and self.options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons): spoiler_handle.write("\nAbility Unlocks (Hexagon Quest):\n") for ability in self.ability_unlocks: # Remove parentheses for better readability spoiler_handle.write(f'{ability[ability.find("(")+1:ability.find(")")]}: {self.ability_unlocks[ability]} Gold Questagons\n') - def extend_hint_information(self, hint_data: Dict[int, Dict[int, str]]) -> None: + def extend_hint_information(self, hint_data: dict[int, dict[int, str]]) -> None: if self.options.entrance_rando: hint_data.update({self.player: {}}) # all state seems to have efficient paths @@ -650,7 +700,7 @@ class TunicWorld(World): if hint_text: hint_data[self.player][location.address] = hint_text - def get_real_location(self, location: Location) -> Tuple[str, int]: + def get_real_location(self, location: Location) -> tuple[str, int]: # if it's not in a group, it's not in an item link if location.player not in self.multiworld.groups or not location.item: return location.name, location.player @@ -662,8 +712,8 @@ class TunicWorld(World): f"Using a potentially incorrect location name instead.") return location.name, location.player - def fill_slot_data(self) -> Dict[str, Any]: - slot_data: Dict[str, Any] = { + def fill_slot_data(self) -> dict[str, Any]: + slot_data: dict[str, Any] = { "seed": self.random.randint(0, 2147483647), "start_with_sword": self.options.start_with_sword.value, "keys_behind_bosses": self.options.keys_behind_bosses.value, @@ -681,6 +731,8 @@ class TunicWorld(World): "entrance_rando": int(bool(self.options.entrance_rando.value)), "decoupled": self.options.decoupled.value if self.options.entrance_rando else 0, "shuffle_ladders": self.options.shuffle_ladders.value, + "shuffle_fuses": self.options.shuffle_fuses.value, + "shuffle_bells": self.options.shuffle_bells.value, "grass_randomizer": self.options.grass_randomizer.value, "combat_logic": self.options.combat_logic.value, "Hexagon Quest Prayer": self.ability_unlocks["Pages 24-25 (Prayer)"], @@ -698,7 +750,7 @@ class TunicWorld(World): # checking if groups so that this doesn't run if the player isn't in a group if groups: if not self.item_link_locations: - tunic_worlds: Tuple[TunicWorld] = self.multiworld.get_game_worlds("TUNIC") + tunic_worlds: tuple[TunicWorld] = self.multiworld.get_game_worlds("TUNIC") # figure out our groups and the items in them for tunic in tunic_worlds: for group in self.multiworld.get_player_groups(tunic.player): @@ -734,7 +786,7 @@ class TunicWorld(World): # for the universal tracker, doesn't get called in standard gen # docs: https://github.com/FarisTheAncient/Archipelago/blob/tracker/worlds/tracker/docs/re-gen-passthrough.md @staticmethod - def interpret_slot_data(slot_data: Dict[str, Any]) -> Dict[str, Any]: + def interpret_slot_data(slot_data: dict[str, Any]) -> dict[str, Any]: # returning slot_data so it regens, giving it back in multiworld.re_gen_passthrough # we are using re_gen_passthrough over modifying the world here due to complexities with ER return slot_data diff --git a/worlds/tunic/archipelago.json b/worlds/tunic/archipelago.json new file mode 100644 index 0000000000..4c4d8dd931 --- /dev/null +++ b/worlds/tunic/archipelago.json @@ -0,0 +1,6 @@ +{ + "game": "TUNIC", + "authors": ["SilentSR", "ScipioWright"], + "minimum_ap_version": "0.6.4", + "world_version": "4.1.0" +} diff --git a/worlds/tunic/bells.py b/worlds/tunic/bells.py new file mode 100644 index 0000000000..2687d9bf1d --- /dev/null +++ b/worlds/tunic/bells.py @@ -0,0 +1,39 @@ +from typing import NamedTuple, TYPE_CHECKING + +from worlds.generic.Rules import set_rule + +from .constants import base_id +from .logic_helpers import has_melee + + +if TYPE_CHECKING: + from . import TunicWorld + + +class TunicLocationData(NamedTuple): + region: str + er_region: str + + +bell_location_table: dict[str, TunicLocationData] = { + "Forest Belltower - Ring the East Bell": TunicLocationData("Forest Belltower", "Forest Belltower Upper"), + "Overworld - [West] Ring the West Bell": TunicLocationData("Overworld", "Overworld Belltower at Bell"), +} + +bell_location_base_id = base_id + 11000 +bell_location_name_to_id: dict[str, int] = {name: bell_location_base_id + index + for index, name in enumerate(bell_location_table)} + +bell_location_groups: dict[str, set[str]] = {} +for location_name, location_data in bell_location_table.items(): + bell_location_groups.setdefault(location_data.region, set()).add(location_name) + bell_location_groups.setdefault("Bells", set()).add(location_name) + + +def set_bell_location_rules(world: "TunicWorld") -> None: + player = world.player + + set_rule(world.get_location("Forest Belltower - Ring the East Bell"), + lambda state: has_melee(state, player) or state.has("Magic Wand", player)) + set_rule(world.get_location("Overworld - [West] Ring the West Bell"), + lambda state: has_melee(state, player) or state.has("Magic Wand", player)) diff --git a/worlds/tunic/breakables.py b/worlds/tunic/breakables.py index 156bece7ca..b9af437c83 100644 --- a/worlds/tunic/breakables.py +++ b/worlds/tunic/breakables.py @@ -1,18 +1,18 @@ +from enum import IntEnum from typing import TYPE_CHECKING, NamedTuple -from enum import IntEnum from BaseClasses import CollectionState, Region from worlds.generic.Rules import set_rule -from .rules import has_sword, has_melee + +from .constants import base_id from .er_rules import can_shop +from .logic_helpers import has_sword, has_melee + + if TYPE_CHECKING: from . import TunicWorld -# just getting an id that is a decent chunk ahead of the grass ones -breakable_base_id = 509342400 + 8000 - - class BreakableType(IntEnum): pot = 1 fire_pot = 2 @@ -341,6 +341,7 @@ breakable_location_table: dict[str, TunicLocationData] = { } +breakable_base_id = base_id + 8000 breakable_location_name_to_id: dict[str, int] = {name: breakable_base_id + index for index, name in enumerate(breakable_location_table)} @@ -358,6 +359,7 @@ loc_group_convert: dict[str, str] = { "Beneath the Well Main": "Beneath the Well", "Well Boss": "Dark Tomb Checkpoint", "Dark Tomb Main": "Dark Tomb", + "Magic Dagger House": "West Garden House", "Fortress Courtyard Upper": "Fortress Courtyard", "Fortress Courtyard Upper pot": "Fortress Courtyard", "Fortress Courtyard west pots": "Fortress Courtyard", @@ -370,13 +372,16 @@ loc_group_convert: dict[str, str] = { "Fortress Grave Path westmost pot": "Fortress Grave Path", "Fortress Grave Path pots": "Fortress Grave Path", "Dusty": "Fortress Leaf Piles", - "Frog Stairs Upper": "Frog Stairs", + "Frog Stairs Upper": "Frog Stairway", + "Frog's Domain Front": "Frog's Domain", + "Frog's Domain Main": "Frog's Domain", "Quarry Monastery Entry": "Quarry", "Quarry Back": "Quarry", "Lower Quarry": "Quarry", "Lower Quarry upper pots": "Quarry", "Even Lower Quarry": "Quarry", "Monastery Back": "Monastery", + "Cathedral Main": "Cathedral", } diff --git a/worlds/tunic/combat_logic.py b/worlds/tunic/combat_logic.py index dbf1e8640f..d12450fbca 100644 --- a/worlds/tunic/combat_logic.py +++ b/worlds/tunic/combat_logic.py @@ -1,10 +1,12 @@ -from typing import Dict, List, NamedTuple, Tuple, Optional -from enum import IntEnum from collections import defaultdict +from enum import IntEnum +from typing import NamedTuple + from BaseClasses import CollectionState -from .rules import has_sword, has_melee from worlds.AutoWorld import LogicMixin +from .logic_helpers import has_sword, has_melee + # the vanilla stats you are expected to have to get through an area, based on where they are in vanilla class AreaStats(NamedTuple): @@ -16,12 +18,12 @@ class AreaStats(NamedTuple): sp_level: int mp_level: int potion_count: int - equipment: List[str] = [] + equipment: list[str] = [] is_boss: bool = False # the vanilla upgrades/equipment you would have -area_data: Dict[str, AreaStats] = { +area_data: dict[str, AreaStats] = { # The upgrade page is right by the Well entrance. Upper Overworld by the chest in the top right might need something "Overworld": AreaStats(1, 1, 1, 1, 1, 1, 0, ["Stick"]), "East Forest": AreaStats(1, 1, 1, 1, 1, 1, 0, ["Sword"]), @@ -52,9 +54,9 @@ area_data: Dict[str, AreaStats] = { # these are used for caching which areas can currently be reached in state # Gauntlet does not have exclusively higher stat requirements, so it will be checked separately -boss_areas: List[str] = [name for name, data in area_data.items() if data.is_boss and name != "Gauntlet"] +boss_areas: list[str] = [name for name, data in area_data.items() if data.is_boss and name != "Gauntlet"] # Swamp does not have exclusively higher stat requirements, so it will be checked separately -non_boss_areas: List[str] = [name for name, data in area_data.items() if not data.is_boss and name != "Swamp"] +non_boss_areas: list[str] = [name for name, data in area_data.items() if not data.is_boss and name != "Swamp"] class CombatState(IntEnum): @@ -114,7 +116,7 @@ def has_combat_reqs(area_name: str, state: CollectionState, player: int) -> bool return met_combat_reqs -def check_combat_reqs(area_name: str, state: CollectionState, player: int, alt_data: Optional[AreaStats] = None) -> bool: +def check_combat_reqs(area_name: str, state: CollectionState, player: int, alt_data: AreaStats | None = None) -> bool: data = alt_data or area_data[area_name] extra_att_needed = 0 extra_def_needed = 0 @@ -303,7 +305,7 @@ def has_required_stats(data: AreaStats, state: CollectionState, player: int) -> # returns a tuple of your max attack level, the number of attack offerings -def get_att_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_att_level(state: CollectionState, player: int) -> tuple[int, int]: att_offerings = state.count("ATT Offering", player) att_upgrades = state.count("Hero Relic - ATT", player) sword_level = state.count("Sword Upgrade", player) @@ -315,44 +317,44 @@ def get_att_level(state: CollectionState, player: int) -> Tuple[int, int]: # returns a tuple of your max defense level, the number of defense offerings -def get_def_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_def_level(state: CollectionState, player: int) -> tuple[int, int]: def_offerings = state.count("DEF Offering", player) # defense falls off, can just cap it at 8 for simplicity return (min(8, 1 + def_offerings - + state.count_from_list({"Hero Relic - DEF", "Secret Legend", "Phonomath"}, player)) + + state.count_from_list(("Hero Relic - DEF", "Secret Legend", "Phonomath"), player)) + (2 if state.has("Shield", player) else 0) + (2 if state.has("Hero's Laurels", player) else 0), def_offerings) # returns a tuple of your max potion level, the number of potion offerings -def get_potion_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_potion_level(state: CollectionState, player: int) -> tuple[int, int]: potion_offerings = min(2, state.count("Potion Offering", player)) # your third potion upgrade (from offerings) costs 1,000 money, reasonable to assume you won't do that return (1 + potion_offerings - + state.count_from_list({"Hero Relic - POTION", "Just Some Pals", "Spring Falls", "Back To Work"}, player), + + state.count_from_list(("Hero Relic - POTION", "Just Some Pals", "Spring Falls", "Back To Work"), player), potion_offerings) # returns a tuple of your max hp level, the number of hp offerings -def get_hp_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_hp_level(state: CollectionState, player: int) -> tuple[int, int]: hp_offerings = state.count("HP Offering", player) return 1 + hp_offerings + state.count("Hero Relic - HP", player), hp_offerings # returns a tuple of your max sp level, the number of sp offerings -def get_sp_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_sp_level(state: CollectionState, player: int) -> tuple[int, int]: sp_offerings = state.count("SP Offering", player) return (1 + sp_offerings - + state.count_from_list({"Hero Relic - SP", "Mr Mayor", "Power Up", - "Regal Weasel", "Forever Friend"}, player), + + state.count_from_list(("Hero Relic - SP", "Mr Mayor", "Power Up", + "Regal Weasel", "Forever Friend"), player), sp_offerings) -def get_mp_level(state: CollectionState, player: int) -> Tuple[int, int]: +def get_mp_level(state: CollectionState, player: int) -> tuple[int, int]: mp_offerings = state.count("MP Offering", player) return (1 + mp_offerings - + state.count_from_list({"Hero Relic - MP", "Sacred Geometry", "Vintage", "Dusty"}, player), + + state.count_from_list(("Hero Relic - MP", "Sacred Geometry", "Vintage", "Dusty"), player), mp_offerings) @@ -426,9 +428,9 @@ def calc_def_sp_cost(def_upgrades: int, sp_upgrades: int) -> int: class TunicState(LogicMixin): - tunic_need_to_reset_combat_from_collect: Dict[int, bool] - tunic_need_to_reset_combat_from_remove: Dict[int, bool] - tunic_area_combat_state: Dict[int, Dict[str, int]] + tunic_need_to_reset_combat_from_collect: dict[int, bool] + tunic_need_to_reset_combat_from_remove: dict[int, bool] + tunic_area_combat_state: dict[int, dict[str, int]] def init_mixin(self, _): # the per-player need to reset the combat state when collecting a combat item diff --git a/worlds/tunic/constants.py b/worlds/tunic/constants.py new file mode 100644 index 0000000000..2543fd3c19 --- /dev/null +++ b/worlds/tunic/constants.py @@ -0,0 +1,51 @@ +base_id = 509342400 + +laurels = "Hero's Laurels" +grapple = "Magic Orb" +ice_dagger = "Magic Dagger" +fire_wand = "Magic Wand" +gun = "Gun" +lantern = "Lantern" +fairies = "Fairy" +coins = "Golden Coin" +prayer = "Pages 24-25 (Prayer)" +holy_cross = "Pages 42-43 (Holy Cross)" +icebolt = "Pages 52-53 (Icebolt)" +shield = "Shield" +key = "Key" +house_key = "Old House Key" +vault_key = "Fortress Vault Key" +mask = "Scavenger Mask" +red_hexagon = "Red Questagon" +green_hexagon = "Green Questagon" +blue_hexagon = "Blue Questagon" +gold_hexagon = "Gold Questagon" + +swamp_fuse_1 = "Swamp Fuse 1" +swamp_fuse_2 = "Swamp Fuse 2" +swamp_fuse_3 = "Swamp Fuse 3" +cathedral_elevator_fuse = "Cathedral Elevator Fuse" +quarry_fuse_1 = "Quarry Fuse 1" +quarry_fuse_2 = "Quarry Fuse 2" +ziggurat_miniboss_fuse = "Ziggurat Miniboss Fuse" +ziggurat_teleporter_fuse = "Ziggurat Teleporter Fuse" +fortress_exterior_fuse_1 = "Fortress Exterior Fuse 1" +fortress_exterior_fuse_2 = "Fortress Exterior Fuse 2" +fortress_courtyard_upper_fuse = "Fortress Courtyard Upper Fuse" +fortress_courtyard_lower_fuse = "Fortress Courtyard Fuse" +beneath_the_vault_fuse = "Beneath the Vault Fuse" # event needs to be renamed probably +fortress_candles_fuse = "Fortress Candles Fuse" +fortress_door_left_fuse = "Fortress Door Left Fuse" +fortress_door_right_fuse = "Fortress Door Right Fuse" +west_furnace_fuse = "West Furnace Fuse" +west_garden_fuse = "West Garden Fuse" +atoll_northeast_fuse = "Atoll Northeast Fuse" +atoll_northwest_fuse = "Atoll Northwest Fuse" +atoll_southeast_fuse = "Atoll Southeast Fuse" +atoll_southwest_fuse = "Atoll Southwest Fuse" +library_lab_fuse = "Library Lab Fuse" + +# "Quarry - [East] Bombable Wall" is excluded from this list since it has slightly different rules +bomb_walls = ["East Forest - Bombable Wall", "Eastern Vault Fortress - [East Wing] Bombable Wall", + "Overworld - [Central] Bombable Wall", "Overworld - [Southwest] Bombable Wall Near Fountain", + "Quarry - [West] Upper Area Bombable Wall", "Ruined Atoll - [Northwest] Bombable Wall"] diff --git a/worlds/tunic/er_data.py b/worlds/tunic/er_data.py index 744326aa20..3641658ab1 100644 --- a/worlds/tunic/er_data.py +++ b/worlds/tunic/er_data.py @@ -1,5 +1,5 @@ -from typing import Dict, NamedTuple, List, Optional, TYPE_CHECKING from enum import IntEnum +from typing import NamedTuple, TYPE_CHECKING if TYPE_CHECKING: from . import TunicWorld @@ -36,7 +36,7 @@ class Portal(NamedTuple): return self.destination + ", " + self.scene() + self.tag -portal_mapping: List[Portal] = [ +portal_mapping: list[Portal] = [ Portal(name="Stick House Entrance", region="Overworld", destination="Sword Cave", tag="_", direction=Direction.north), Portal(name="Windmill Entrance", region="Overworld", @@ -535,7 +535,7 @@ portal_mapping: List[Portal] = [ class RegionInfo(NamedTuple): game_scene: str # the name of the scene in the actual game dead_end: int = 0 # if a region has only one exit - outlet_region: Optional[str] = None + outlet_region: str | None = None is_fake_region: bool = False @@ -553,7 +553,7 @@ class DeadEnd(IntEnum): # key is the AP region name. "Fake" in region info just means the mod won't receive that info at all -tunic_er_regions: Dict[str, RegionInfo] = { +tunic_er_regions: dict[str, RegionInfo] = { "Menu": RegionInfo("Fake", dead_end=DeadEnd.all_cats, is_fake_region=True), "Overworld": RegionInfo("Overworld Redux"), # main overworld, the central area "Overworld Holy Cross": RegionInfo("Fake", dead_end=DeadEnd.all_cats, is_fake_region=True), # main overworld holy cross checks @@ -735,6 +735,7 @@ tunic_er_regions: Dict[str, RegionInfo] = { "Rooted Ziggurat Lower Entry": RegionInfo("ziggurat2020_3"), # the vanilla entry point side "Rooted Ziggurat Lower Front": RegionInfo("ziggurat2020_3"), # the front for combat logic "Rooted Ziggurat Lower Mid Checkpoint": RegionInfo("ziggurat2020_3"), # the mid-checkpoint before double admin + "Rooted Ziggurat Lower Miniboss Platform": RegionInfo("ziggurat2020_3"), # the double admin platform "Rooted Ziggurat Lower Back": RegionInfo("ziggurat2020_3"), # the boss side "Zig Skip Exit": RegionInfo("ziggurat2020_3", dead_end=DeadEnd.special, outlet_region="Rooted Ziggurat Lower Entry", is_fake_region=True), # for use with fixed shop on "Rooted Ziggurat Portal Room Entrance": RegionInfo("ziggurat2020_3", outlet_region="Rooted Ziggurat Lower Back"), # the door itself on the zig 3 side @@ -775,7 +776,6 @@ tunic_er_regions: Dict[str, RegionInfo] = { "Spirit Arena Victory": RegionInfo("Spirit Arena", dead_end=DeadEnd.all_cats, is_fake_region=True), } - # this is essentially a pared down version of the region connections in rules.py, with some minor differences # the main purpose of this is to make it so that you can access every region # most items are excluded from the rules here, since we can assume Archipelago will properly place them @@ -786,7 +786,7 @@ tunic_er_regions: Dict[str, RegionInfo] = { # LS# refers to ladder storage difficulties # LS rules are used for region connections here regardless of whether you have being knocked out of the air in logic # this is because it just means you can reach the entrances in that region via ladder storage -traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { +traversal_requirements: dict[str, dict[str, list[list[str]]]] = { "Overworld": { "Overworld Beach": [], @@ -801,7 +801,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Overworld Swamp Lower Entry": [], "Overworld Special Shop Entry": - [["Hyperdash"], ["LS1"]], + [["LS1"]], "Overworld Well Entry Area": [], "Overworld Ruined Passage Door": @@ -823,7 +823,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Overworld Tunnel Turret": [["IG1"], ["LS1"], ["Hyperdash"]], "Overworld Temple Door": - [["IG2"], ["LS3"], ["Forest Belltower Upper", "Overworld Belltower"]], + [["Bell Shuffle"], ["IG2"], ["LS3"], ["Forest Belltower Upper", "Overworld Belltower"]], "Overworld Southeast Cross Door": [], "Overworld Fountain Cross Door": @@ -1229,7 +1229,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { }, "West Garden by Portal": { "West Garden Portal": - [["West Garden South Checkpoint"]], + [["Fuse Shuffle"], ["West Garden South Checkpoint"]], "West Garden Portal Item": [["Hyperdash"]], }, @@ -1468,7 +1468,8 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Eastern Vault Fortress": { "Eastern Vault Fortress Gold Door": - [["IG2"], ["Fortress Exterior from Overworld", "Beneath the Vault Back", "Fortress Courtyard Upper"]], + [["IG2"], ["Fuse Shuffle"], + ["Fortress Exterior from Overworld", "Beneath the Vault Back", "Fortress Courtyard Upper"]], }, "Eastern Vault Fortress Gold Door": { "Eastern Vault Fortress": @@ -1514,7 +1515,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Fortress Arena": { "Fortress Arena Portal": - [["Fortress Exterior from Overworld", "Beneath the Vault Back", "Eastern Vault Fortress"]], + [["Fuse Shuffle"], ["Fortress Exterior from Overworld", "Beneath the Vault Back", "Eastern Vault Fortress"]], }, "Fortress Arena Portal": { "Fortress Arena": @@ -1547,7 +1548,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Quarry Entry": { "Quarry Portal": - [["Quarry Connector"]], + [["Fuse Shuffle"], ["Quarry Connector"]], "Quarry": [], "Monastery Rope": @@ -1593,7 +1594,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Even Lower Quarry": [], "Lower Quarry Zig Door": - [["Quarry", "Quarry Connector"], ["IG3"]], + [["Fuse Shuffle"], ["Quarry", "Quarry Connector"], ["IG3"]], }, "Monastery Rope": { "Quarry Back": @@ -1636,13 +1637,19 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { [["Hyperdash"]], "Rooted Ziggurat Lower Front": [], - "Rooted Ziggurat Lower Back": + "Rooted Ziggurat Lower Miniboss Platform": [], }, + "Rooted Ziggurat Lower Miniboss Platform": { + "Rooted Ziggurat Lower Mid Checkpoint": + [], + "Rooted Ziggurat Lower Back": + [] + }, "Rooted Ziggurat Lower Back": { "Rooted Ziggurat Lower Entry": [["LS2"]], - "Rooted Ziggurat Lower Mid Checkpoint": + "Rooted Ziggurat Lower Miniboss Platform": [["Hyperdash"], ["IG1"]], "Rooted Ziggurat Portal Room Entrance": [], @@ -1658,7 +1665,7 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { }, "Rooted Ziggurat Portal Room": { "Rooted Ziggurat Portal Room Exit": - [["Rooted Ziggurat Lower Back"]], + [["Fuse Shuffle"], ["Rooted Ziggurat Lower Back"]], "Rooted Ziggurat Portal": [], }, @@ -1742,7 +1749,6 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Cathedral Main": [], }, - "Cathedral Gauntlet Checkpoint": { "Cathedral Gauntlet": [], @@ -1762,13 +1768,13 @@ traversal_requirements: Dict[str, Dict[str, List[List[str]]]] = { "Far Shore to East Forest Region": [["Hyperdash"]], "Far Shore to Quarry Region": - [["Quarry Connector", "Quarry"]], + [["Fuse Shuffle"], ["Quarry Connector", "Quarry"]], "Far Shore to Library Region": - [["Library Lab"]], + [["Fuse Shuffle"], ["Library Lab"]], "Far Shore to West Garden Region": - [["West Garden South Checkpoint"]], + [["Fuse Shuffle"], ["West Garden South Checkpoint"]], "Far Shore to Fortress Region": - [["Fortress Exterior from Overworld", "Beneath the Vault Back", "Eastern Vault Fortress"]], + [["Fuse Shuffle"], ["Fortress Exterior from Overworld", "Beneath the Vault Back", "Eastern Vault Fortress"]], }, "Far Shore to Spawn Region": { "Far Shore": diff --git a/worlds/tunic/er_rules.py b/worlds/tunic/er_rules.py index 8c0979e3e4..ad26e10c9e 100644 --- a/worlds/tunic/er_rules.py +++ b/worlds/tunic/er_rules.py @@ -1,73 +1,44 @@ -from typing import Dict, FrozenSet, Tuple, TYPE_CHECKING +from typing import FrozenSet, TYPE_CHECKING + +from BaseClasses import Region from worlds.generic.Rules import set_rule, add_rule, forbid_item -from BaseClasses import Region, CollectionState -from .options import IceGrappling, LadderStorage, CombatLogic -from .rules import (has_ability, has_sword, has_melee, has_ice_grapple_logic, has_lantern, has_mask, can_ladder_storage, - laurels_zip, bomb_walls) -from .er_data import Portal, get_portal_outlet_region -from .ladder_storage_data import ow_ladder_groups, region_ladders, easy_ls, medium_ls, hard_ls + +from .bells import set_bell_location_rules from .combat_logic import has_combat_reqs +from .constants import * +from .er_data import Portal, get_portal_outlet_region +from .fuses import set_fuse_location_rules from .grass import set_grass_location_rules +from .ladder_storage_data import ow_ladder_groups, region_ladders, easy_ls, medium_ls, hard_ls +from .logic_helpers import (has_ability, has_ladder, has_melee, has_sword, has_lantern, has_mask, has_fuses, + can_shop, can_get_past_bushes, laurels_zip, has_ice_grapple_logic, can_ladder_storage) +from .options import IceGrappling, LadderStorage, CombatLogic if TYPE_CHECKING: from . import TunicWorld -laurels = "Hero's Laurels" -grapple = "Magic Orb" -ice_dagger = "Magic Dagger" -fire_wand = "Magic Wand" -gun = "Gun" -lantern = "Lantern" -fairies = "Fairy" -coins = "Golden Coin" -prayer = "Pages 24-25 (Prayer)" -holy_cross = "Pages 42-43 (Holy Cross)" -icebolt = "Pages 52-53 (Icebolt)" -key = "Key" -house_key = "Old House Key" -vault_key = "Fortress Vault Key" -mask = "Scavenger Mask" -red_hexagon = "Red Questagon" -green_hexagon = "Green Questagon" -blue_hexagon = "Blue Questagon" -gold_hexagon = "Gold Questagon" - -def has_ladder(ladder: str, state: CollectionState, world: "TunicWorld") -> bool: - return not world.options.shuffle_ladders or state.has(ladder, world.player) - - -def can_shop(state: CollectionState, world: "TunicWorld") -> bool: - return has_sword(state, world.player) and state.can_reach_region("Shop", world.player) - - -# for the ones that are not early bushes where ER can screw you over a bit -def can_get_past_bushes(state: CollectionState, world: "TunicWorld") -> bool: - # add in glass cannon + stick for grass rando - return has_sword(state, world.player) or state.has_any((fire_wand, laurels, gun), world.player) - - -def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_pairs: Dict[Portal, Portal]) -> None: +def set_er_region_rules(world: "TunicWorld", regions: dict[str, Region], portal_pairs: dict[Portal, Portal]) -> None: player = world.player options = world.options # input scene destination tag, returns portal's name and paired portal's outlet region or region - def get_portal_info(portal_sd: str) -> Tuple[str, str]: + def get_portal_info(portal_sd: str) -> tuple[str, str]: for portal1, portal2 in portal_pairs.items(): if portal1.scene_destination() == portal_sd: return portal1.name, get_portal_outlet_region(portal2, world) - if portal2.scene_destination() == portal_sd: + if portal2.scene_destination() == portal_sd and not (options.decoupled and options.entrance_rando): return portal2.name, get_portal_outlet_region(portal1, world) - raise Exception("No matches found in get_portal_info") + raise Exception(f"No matches found in get_portal_info for {portal_sd}") # input scene destination tag, returns paired portal's name and region - def get_paired_portal(portal_sd: str) -> Tuple[str, str]: + def get_paired_portal(portal_sd: str) -> tuple[str, str]: for portal1, portal2 in portal_pairs.items(): if portal1.scene_destination() == portal_sd: return portal2.name, portal2.region - if portal2.scene_destination() == portal_sd: + if portal2.scene_destination() == portal_sd and not (options.decoupled and options.entrance_rando): return portal1.name, portal1.region - raise Exception("no matches found in get_paired_portal") + raise Exception(f"No matches found in get_paired_portal for {portal_sd}") regions["Menu"].connect( connecting_region=regions["Overworld"]) @@ -81,7 +52,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Overworld"].connect( connecting_region=regions["Overworld Beach"], rule=lambda state: has_ladder("Ladders in Overworld Town", state, world) - or state.has_any({laurels, grapple}, player)) + or state.has_any((laurels, grapple), player)) # regions["Overworld Beach"].connect( # connecting_region=regions["Overworld"], # rule=lambda state: has_ladder("Ladders in Overworld Town", state, world) @@ -114,14 +85,14 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ rule=lambda state: state.has(laurels, player)) regions["Overworld to Atoll Upper"].connect( connecting_region=regions["Overworld"], - rule=lambda state: state.has_any({laurels, grapple}, player)) + rule=lambda state: state.has_any((laurels, grapple), player)) regions["Overworld"].connect( connecting_region=regions["Overworld Belltower"], rule=lambda state: state.has(laurels, player) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - regions["Overworld Belltower"].connect( - connecting_region=regions["Overworld"]) + # regions["Overworld Belltower"].connect( + # connecting_region=regions["Overworld"]) # ice grapple rudeling across rubble, drop bridge, ice grapple rudeling down regions["Overworld Belltower"].connect( @@ -146,17 +117,17 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["Overworld Ruined Passage Door"], rule=lambda state: state.has(key, player, 2) or laurels_zip(state, world)) - regions["Overworld Ruined Passage Door"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: laurels_zip(state, world)) + # regions["Overworld Ruined Passage Door"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: laurels_zip(state, world)) regions["Overworld"].connect( connecting_region=regions["After Ruined Passage"], rule=lambda state: has_ladder("Ladders near Weathervane", state, world) or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) - regions["After Ruined Passage"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ladder("Ladders near Weathervane", state, world)) + # regions["After Ruined Passage"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ladder("Ladders near Weathervane", state, world)) # for the hard ice grapple, get to the chest after the bomb wall, grab a slime, and grapple push down # you can ice grapple through the bomb wall, so no need for shop logic checking @@ -165,10 +136,10 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ rule=lambda state: has_ladder("Ladders near Weathervane", state, world) or state.has(laurels, player) or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - regions["Above Ruined Passage"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ladder("Ladders near Weathervane", state, world) - or state.has(laurels, player)) + # regions["Above Ruined Passage"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ladder("Ladders near Weathervane", state, world) + # or state.has(laurels, player)) regions["After Ruined Passage"].connect( connecting_region=regions["Above Ruined Passage"], @@ -183,8 +154,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) regions["East Overworld"].connect( connecting_region=regions["Above Ruined Passage"], - rule=lambda state: has_ladder("Ladders near Weathervane", state, world) - or state.has(laurels, player)) + rule=lambda state: has_ladder("Ladders near Weathervane", state, world)) # nmg: ice grapple the slimes, works both ways consistently regions["East Overworld"].connect( @@ -198,9 +168,9 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["East Overworld"], rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world) or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) - regions["East Overworld"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world)) + # regions["East Overworld"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world)) regions["East Overworld"].connect( connecting_region=regions["Overworld at Patrol Cave"]) @@ -220,9 +190,9 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["Overworld above Patrol Cave"], rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world) or state.has(grapple, player)) - regions["Overworld above Patrol Cave"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world)) + # regions["Overworld above Patrol Cave"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ladder("Ladders near Overworld Checkpoint", state, world)) regions["East Overworld"].connect( connecting_region=regions["Overworld above Patrol Cave"], @@ -243,10 +213,10 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Upper Overworld"].connect( connecting_region=regions["Overworld above Quarry Entrance"], - rule=lambda state: state.has_any({grapple, laurels}, player)) + rule=lambda state: state.has_any((grapple, laurels), player)) regions["Overworld above Quarry Entrance"].connect( connecting_region=regions["Upper Overworld"], - rule=lambda state: state.has_any({grapple, laurels}, player)) + rule=lambda state: state.has_any((grapple, laurels), player)) # ice grapple push guard captain down the ledge regions["Upper Overworld"].connect( @@ -267,11 +237,11 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Overworld"].connect( connecting_region=regions["Overworld after Envoy"], - rule=lambda state: state.has_any({laurels, grapple, gun}, player) + rule=lambda state: state.has_any((laurels, grapple, gun), player) or state.has("Sword Upgrade", player, 4)) regions["Overworld after Envoy"].connect( connecting_region=regions["Overworld"], - rule=lambda state: state.has_any({laurels, grapple, gun}, player) + rule=lambda state: state.has_any((laurels, grapple, gun), player) or state.has("Sword Upgrade", player, 4)) regions["Overworld after Envoy"].connect( @@ -285,24 +255,24 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Overworld"].connect( connecting_region=regions["Overworld Quarry Entry"], rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - regions["Overworld Quarry Entry"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world)) + # regions["Overworld Quarry Entry"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world)) regions["Overworld"].connect( connecting_region=regions["Overworld Swamp Upper Entry"], rule=lambda state: state.has(laurels, player)) - regions["Overworld Swamp Upper Entry"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: state.has(laurels, player)) + # regions["Overworld Swamp Upper Entry"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: state.has(laurels, player)) regions["Overworld"].connect( connecting_region=regions["Overworld Swamp Lower Entry"], rule=lambda state: has_ladder("Ladder to Swamp", state, world) or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - regions["Overworld Swamp Lower Entry"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ladder("Ladder to Swamp", state, world)) + # regions["Overworld Swamp Lower Entry"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ladder("Ladder to Swamp", state, world)) regions["East Overworld"].connect( connecting_region=regions["Overworld Special Shop Entry"], @@ -335,33 +305,34 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["Overworld Southeast Cross Door"], rule=lambda state: has_ability(holy_cross, state, world) or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - regions["Overworld Southeast Cross Door"].connect( - connecting_region=regions["Overworld"], - rule=lambda state: has_ability(holy_cross, state, world)) + # regions["Overworld Southeast Cross Door"].connect( + # connecting_region=regions["Overworld"], + # rule=lambda state: has_ability(holy_cross, state, world)) regions["Overworld"].connect( connecting_region=regions["Overworld Fountain Cross Door"], rule=lambda state: has_ability(holy_cross, state, world) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - regions["Overworld Fountain Cross Door"].connect( - connecting_region=regions["Overworld"]) + # regions["Overworld Fountain Cross Door"].connect( + # connecting_region=regions["Overworld"]) ow_to_town_portal = regions["Overworld"].connect( connecting_region=regions["Overworld Town Portal"], rule=lambda state: has_ability(prayer, state, world)) - regions["Overworld Town Portal"].connect( - connecting_region=regions["Overworld"]) + # regions["Overworld Town Portal"].connect( + # connecting_region=regions["Overworld"]) regions["Overworld"].connect( connecting_region=regions["Overworld Spawn Portal"], rule=lambda state: has_ability(prayer, state, world)) - regions["Overworld Spawn Portal"].connect( - connecting_region=regions["Overworld"]) + # regions["Overworld Spawn Portal"].connect( + # connecting_region=regions["Overworld"]) # nmg: ice grapple through temple door regions["Overworld"].connect( connecting_region=regions["Overworld Temple Door"], - rule=lambda state: state.has_all({"Ring Eastern Bell", "Ring Western Bell"}, player) + rule=lambda state: (state.has_all(("Ring Eastern Bell", "Ring Western Bell"), player) and not options.shuffle_bells) + or (state.has_all(("East Bell", "West Bell"), player) and options.shuffle_bells) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) regions["Overworld Temple Door"].connect( @@ -637,7 +608,8 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["West Garden by Portal"]) regions["West Garden by Portal"].connect( connecting_region=regions["West Garden Portal"], - rule=lambda state: has_ability(prayer, state, world) and state.has("Activate West Garden Fuse", player)) + rule=lambda state: has_ability(prayer, state, world) + and has_fuses("Activate West Garden Fuse", state, world)) regions["West Garden by Portal"].connect( connecting_region=regions["West Garden Portal Item"], @@ -691,12 +663,16 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ atoll_statue = regions["Ruined Atoll"].connect( connecting_region=regions["Ruined Atoll Statue"], rule=lambda state: has_ability(prayer, state, world) - and ((has_ladder("Ladders in South Atoll", state, world) - and state.has_any((laurels, grapple), player) - and (has_sword(state, player) or state.has_any((fire_wand, gun), player))) - # shoot fuse and have the shot hit you mid-LS - or (can_ladder_storage(state, world) and state.has(fire_wand, player) - and options.ladder_storage >= LadderStorage.option_hard))) + and (((((has_ladder("Ladders in South Atoll", state, world) + and state.has_any((laurels, grapple), player) + and (has_sword(state, player) or state.has_any((gun, fire_wand), player))) + # shoot fuse and have the shot hit you mid-LS + or (can_ladder_storage(state, world) and state.has(fire_wand, player) + and options.ladder_storage >= LadderStorage.option_hard))) and not options.shuffle_fuses) + or (state.has_all((atoll_northwest_fuse, atoll_northeast_fuse, atoll_southwest_fuse, atoll_southeast_fuse), player) + and options.shuffle_fuses)) + ) + regions["Ruined Atoll Statue"].connect( connecting_region=regions["Ruined Atoll"]) @@ -742,7 +718,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Library Exterior by Tree"].connect( connecting_region=regions["Library Exterior Ladder Region"], - rule=lambda state: state.has_any({grapple, laurels}, player) + rule=lambda state: state.has_any((grapple, laurels), player) and has_ladder("Ladders in Library", state, world)) regions["Library Exterior Ladder Region"].connect( connecting_region=regions["Library Exterior by Tree"], @@ -785,7 +761,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Library Lab Lower"].connect( connecting_region=regions["Library Lab"], - rule=lambda state: state.has_any({grapple, laurels}, player) + rule=lambda state: state.has_any((grapple, laurels), player) and has_ladder("Ladders in Library", state, world)) regions["Library Lab"].connect( connecting_region=regions["Library Lab Lower"], @@ -802,7 +778,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Library Lab on Portal Pad"].connect( connecting_region=regions["Library Portal"], - rule=lambda state: has_ability(prayer, state, world)) + rule=lambda state: has_ability(prayer, state, world) and has_fuses("Activate Library Fuse", state, world)) regions["Library Portal"].connect( connecting_region=regions["Library Lab on Portal Pad"]) @@ -823,10 +799,14 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Fortress Exterior near cave"].connect( connecting_region=regions["Fortress Exterior from Overworld"], - rule=lambda state: state.has(laurels, player)) + rule=lambda state: state.has(laurels, player) + or (has_ability(prayer, state, world) and state.has(fortress_exterior_fuse_1, player) + and options.shuffle_fuses)) regions["Fortress Exterior from Overworld"].connect( connecting_region=regions["Fortress Exterior near cave"], - rule=lambda state: state.has(laurels, player) or has_ability(prayer, state, world)) + rule=lambda state: state.has(laurels, player) + or (has_ability(prayer, state, world) and state.has(fortress_exterior_fuse_1, player) + if options.shuffle_fuses else has_ability(prayer, state, world))) # shoot far fire pot, enemy gets aggro'd regions["Fortress Exterior near cave"].connect( @@ -889,12 +869,15 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Eastern Vault Fortress"].connect( connecting_region=regions["Eastern Vault Fortress Gold Door"], - rule=lambda state: state.has_all({"Activate Eastern Vault West Fuses", - "Activate Eastern Vault East Fuse"}, player) + rule=lambda state: (has_fuses("Activate Eastern Vault West Fuses", state, world) + and has_fuses("Activate Eastern Vault East Fuse", state, world)) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) regions["Eastern Vault Fortress Gold Door"].connect( connecting_region=regions["Eastern Vault Fortress"], - rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world)) + rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world) + or (has_fuses("Activate Eastern Vault West Fuses", state, world) + and has_fuses("Activate Eastern Vault East Fuse", state, world) + and options.shuffle_fuses)) fort_grave_entry_to_combat = regions["Fortress Grave Path Entry"].connect( connecting_region=regions["Fortress Grave Path Combat"]) @@ -925,7 +908,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Fortress Arena"].connect( connecting_region=regions["Fortress Arena Portal"], - rule=lambda state: state.has("Activate Eastern Vault West Fuses", player)) + rule=lambda state: has_ability(prayer, state, world) and has_fuses("Activate Eastern Vault West Fuses", state, world)) regions["Fortress Arena Portal"].connect( connecting_region=regions["Fortress Arena"]) @@ -939,7 +922,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Quarry Entry"].connect( connecting_region=regions["Quarry Portal"], - rule=lambda state: state.has("Activate Quarry Fuse", player)) + rule=lambda state: has_ability(prayer, state, world) and has_fuses("Activate Quarry Fuse", state, world)) regions["Quarry Portal"].connect( connecting_region=regions["Quarry Entry"]) @@ -990,7 +973,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Even Lower Quarry Isolated Chest"].connect( connecting_region=regions["Lower Quarry Zig Door"], - rule=lambda state: state.has("Activate Quarry Fuse", player) + rule=lambda state: has_fuses("Activate Quarry Fuse", state, world) or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) # don't need the mask for this either, please don't complain about not needing a mask here, you know what you did @@ -1037,21 +1020,26 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ zig_low_mid_to_front = regions["Rooted Ziggurat Lower Mid Checkpoint"].connect( connecting_region=regions["Rooted Ziggurat Lower Front"]) - zig_low_mid_to_back = regions["Rooted Ziggurat Lower Mid Checkpoint"].connect( - connecting_region=regions["Rooted Ziggurat Lower Back"], - rule=lambda state: state.has(laurels, player) - or (has_sword(state, player) and has_ability(prayer, state, world))) - # can ice grapple to the voidlings to get to the double admin fight, still need to pray at the fuse - zig_low_back_to_mid = regions["Rooted Ziggurat Lower Back"].connect( + regions["Rooted Ziggurat Lower Mid Checkpoint"].connect( + connecting_region=regions["Rooted Ziggurat Lower Miniboss Platform"]) + zig_low_miniboss_to_mid = regions["Rooted Ziggurat Lower Miniboss Platform"].connect( connecting_region=regions["Rooted Ziggurat Lower Mid Checkpoint"], - rule=lambda state: (state.has(laurels, player) - or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) - and has_ability(prayer, state, world) - and has_sword(state, player)) + rule=lambda state: state.has(ziggurat_miniboss_fuse, player) if options.shuffle_fuses + else (has_sword(state, player) and has_ability(prayer, state, world))) + # can ice grapple to the voidlings to get to the double admin fight, still need to pray at the fuse + zig_low_miniboss_to_back = regions["Rooted Ziggurat Lower Miniboss Platform"].connect( + connecting_region=regions["Rooted Ziggurat Lower Back"], + rule=lambda state: state.has(laurels, player) or (state.has(ziggurat_miniboss_fuse, player) and options.shuffle_fuses) + or (has_sword(state, player) and has_ability(prayer, state, world) and not options.shuffle_fuses)) + regions["Rooted Ziggurat Lower Back"].connect( + connecting_region=regions["Rooted Ziggurat Lower Miniboss Platform"], + rule=lambda state: state.has(laurels, player) + or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world) + or (state.has(ziggurat_miniboss_fuse, player) and options.shuffle_fuses)) regions["Rooted Ziggurat Lower Back"].connect( connecting_region=regions["Rooted Ziggurat Portal Room Entrance"], - rule=lambda state: has_ability(prayer, state, world)) + rule=lambda state: has_fuses("Activate Ziggurat Fuse", state, world)) regions["Rooted Ziggurat Portal Room Entrance"].connect( connecting_region=regions["Rooted Ziggurat Lower Back"]) @@ -1059,11 +1047,11 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ connecting_region=regions["Rooted Ziggurat Portal Room"]) regions["Rooted Ziggurat Portal Room"].connect( connecting_region=regions["Rooted Ziggurat Portal"], - rule=lambda state: has_ability(prayer, state, world)) + rule=lambda state: has_fuses("Activate Ziggurat Fuse", state, world) and has_ability(prayer, state, world)) regions["Rooted Ziggurat Portal Room"].connect( connecting_region=regions["Rooted Ziggurat Portal Room Exit"], - rule=lambda state: state.has("Activate Ziggurat Fuse", player)) + rule=lambda state: has_fuses("Activate Ziggurat Fuse", state, world)) regions["Rooted Ziggurat Portal Room Exit"].connect( connecting_region=regions["Rooted Ziggurat Portal Room"]) @@ -1082,19 +1070,21 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ swamp_mid_to_cath = regions["Swamp Mid"].connect( connecting_region=regions["Swamp to Cathedral Main Entrance Region"], rule=lambda state: (has_ability(prayer, state, world) - and (has_sword(state, player)) + and has_sword(state, player) and (state.has(laurels, player) # blam yourself in the face with a wand shot off the fuse or (can_ladder_storage(state, world) and state.has(fire_wand, player) and options.ladder_storage >= LadderStorage.option_hard and (not options.shuffle_ladders - or state.has_any({"Ladders in Overworld Town", + or state.has_any(("Ladders in Overworld Town", "Ladder to Swamp", - "Ladders near Weathervane"}, player) + "Ladders near Weathervane"), player) or (state.has("Ladder to Ruined Atoll", player) and state.can_reach_region("Overworld Beach", player))))) and (not options.combat_logic - or has_combat_reqs("Swamp", state, player))) + or has_combat_reqs("Swamp", state, player)) + and not options.shuffle_fuses) + or (state.has_all((swamp_fuse_1, swamp_fuse_2, swamp_fuse_3), player) and options.shuffle_fuses) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) if options.ladder_storage >= LadderStorage.option_hard and options.shuffle_ladders: @@ -1102,7 +1092,8 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Swamp to Cathedral Main Entrance Region"].connect( connecting_region=regions["Swamp Mid"], - rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world)) + rule=lambda state: has_ice_grapple_logic(False, IceGrappling.option_easy, state, world) + or (state.has_all((swamp_fuse_1, swamp_fuse_2, swamp_fuse_3), player) and options.shuffle_fuses)) # grapple push the enemy by the door down, then grapple to it. Really jank regions["Swamp Mid"].connect( @@ -1148,7 +1139,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ cath_entry_to_elev = regions["Cathedral Entry"].connect( connecting_region=regions["Cathedral to Gauntlet"], - rule=lambda state: (has_ability(prayer, state, world) + rule=lambda state: ((state.has(cathedral_elevator_fuse, player) if options.shuffle_fuses else has_ability(prayer, state, world)) or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) or options.entrance_rando) # elevator is always there in ER regions["Cathedral to Gauntlet"].connect( @@ -1159,11 +1150,6 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Cathedral Main"].connect( connecting_region=regions["Cathedral Entry"]) - cath_elev_to_main = regions["Cathedral to Gauntlet"].connect( - connecting_region=regions["Cathedral Main"]) - regions["Cathedral Main"].connect( - connecting_region=regions["Cathedral to Gauntlet"]) - regions["Cathedral Gauntlet Checkpoint"].connect( connecting_region=regions["Cathedral Gauntlet"]) @@ -1191,25 +1177,25 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ regions["Far Shore"].connect( connecting_region=regions["Far Shore to West Garden Region"], - rule=lambda state: state.has("Activate West Garden Fuse", player)) + rule=lambda state: has_fuses("Activate West Garden Fuse", state, world)) regions["Far Shore to West Garden Region"].connect( connecting_region=regions["Far Shore"]) regions["Far Shore"].connect( connecting_region=regions["Far Shore to Quarry Region"], - rule=lambda state: state.has("Activate Quarry Fuse", player)) + rule=lambda state: has_fuses("Activate Quarry Fuse", state, world)) regions["Far Shore to Quarry Region"].connect( connecting_region=regions["Far Shore"]) regions["Far Shore"].connect( connecting_region=regions["Far Shore to Fortress Region"], - rule=lambda state: state.has("Activate Eastern Vault West Fuses", player)) + rule=lambda state: has_fuses("Activate Eastern Vault West Fuses", state, world)) regions["Far Shore to Fortress Region"].connect( connecting_region=regions["Far Shore"]) regions["Far Shore"].connect( connecting_region=regions["Far Shore to Library Region"], - rule=lambda state: state.has("Activate Library Fuse", player)) + rule=lambda state: has_fuses("Activate Library Fuse", state, world)) regions["Far Shore to Library Region"].connect( connecting_region=regions["Far Shore"]) @@ -1239,7 +1225,7 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ non_ow_ls_list.extend(hard_ls) # create the ls elevation regions - ladder_regions: Dict[str, Region] = {} + ladder_regions: dict[str, Region] = {} for name in ow_ladder_groups.keys(): ladder_regions[name] = Region(name, player, world.multiworld) @@ -1409,10 +1395,10 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ lambda state: has_combat_reqs("Dark Tomb", state, player)) set_rule(wg_before_to_after_terry, - lambda state: state.has_any({laurels, ice_dagger}, player) + lambda state: state.has_any((laurels, ice_dagger), player) or has_combat_reqs("West Garden", state, player)) set_rule(wg_after_to_before_terry, - lambda state: state.has_any({laurels, ice_dagger}, player) + lambda state: state.has_any((laurels, ice_dagger), player) or has_combat_reqs("West Garden", state, player)) set_rule(wg_after_terry_to_west_combat, @@ -1453,25 +1439,23 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ lambda state: has_combat_reqs("Rooted Ziggurat", state, player)) set_rule(zig_low_mid_to_front, lambda state: has_combat_reqs("Rooted Ziggurat", state, player)) - set_rule(zig_low_mid_to_back, + set_rule(zig_low_miniboss_to_back, lambda state: state.has(laurels, player) - or (has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player))) - set_rule(zig_low_back_to_mid, - lambda state: (state.has(laurels, player) - or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) - and has_ability(prayer, state, world) - and has_combat_reqs("Rooted Ziggurat", state, player)) + or (state.has(ziggurat_miniboss_fuse, player) if options.shuffle_fuses + else (has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player)))) + set_rule(zig_low_miniboss_to_mid, + lambda state: state.has(ziggurat_miniboss_fuse, player) if options.shuffle_fuses + else (has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player))) # only activating the fuse requires combat logic set_rule(cath_entry_to_elev, lambda state: options.entrance_rando or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - or (has_ability(prayer, state, world) and has_combat_reqs("Swamp", state, player))) + or (state.has(cathedral_elevator_fuse, player) if options.shuffle_fuses + else (has_ability(prayer, state, world) and has_combat_reqs("Swamp", state, player)))) set_rule(cath_entry_to_main, lambda state: has_combat_reqs("Swamp", state, player)) - set_rule(cath_elev_to_main, - lambda state: has_combat_reqs("Swamp", state, player)) # for spots where you can go into and come out of an entrance to reset enemy aggro if world.options.entrance_rando: @@ -1543,10 +1527,17 @@ def set_er_region_rules(world: "TunicWorld", regions: Dict[str, Region], portal_ def set_er_location_rules(world: "TunicWorld") -> None: player = world.player + options = world.options - if world.options.grass_randomizer: + if options.grass_randomizer: set_grass_location_rules(world) + if options.shuffle_fuses: + set_fuse_location_rules(world) + + if options.shuffle_bells: + set_bell_location_rules(world) + forbid_item(world.get_location("Secret Gathering Place - 20 Fairy Reward"), fairies, player) # Ability Shuffle Exclusive Rules @@ -1557,7 +1548,7 @@ def set_er_location_rules(world: "TunicWorld") -> None: set_rule(world.get_location("East Forest - Golden Obelisk Holy Cross"), lambda state: has_ability(holy_cross, state, world)) set_rule(world.get_location("Beneath the Well - [Powered Secret Room] Chest"), - lambda state: state.has("Activate Furnace Fuse", player)) + lambda state: has_fuses("Activate Furnace Fuse", state, world)) set_rule(world.get_location("West Garden - [North] Behind Holy Cross Door"), lambda state: has_ability(holy_cross, state, world)) set_rule(world.get_location("Library Hall - Holy Cross Chest"), @@ -1583,9 +1574,9 @@ def set_er_location_rules(world: "TunicWorld") -> None: # Overworld set_rule(world.get_location("Overworld - [Southwest] Grapple Chest Over Walkway"), - lambda state: state.has_any({grapple, laurels}, player)) + lambda state: state.has_any((grapple, laurels), player)) set_rule(world.get_location("Overworld - [Southwest] West Beach Guarded By Turret 2"), - lambda state: state.has_any({grapple, laurels}, player)) + lambda state: state.has_any((grapple, laurels), player)) set_rule(world.get_location("Overworld - [Southwest] From West Garden"), lambda state: state.has(laurels, player)) set_rule(world.get_location("Overworld - [Southeast] Page on Pillar by Swamp"), @@ -1635,9 +1626,9 @@ def set_er_location_rules(world: "TunicWorld") -> None: set_rule(world.get_location("East Forest - Lower Grapple Chest"), lambda state: state.has(grapple, player)) set_rule(world.get_location("East Forest - Lower Dash Chest"), - lambda state: state.has_all({grapple, laurels}, player)) + lambda state: state.has_all((grapple, laurels), player)) set_rule(world.get_location("East Forest - Ice Rod Grapple Chest"), lambda state: ( - state.has_all({grapple, ice_dagger, fire_wand}, player) and has_ability(icebolt, state, world))) + state.has_all((grapple, ice_dagger, fire_wand), player) and has_ability(icebolt, state, world))) # Dark Tomb # added to make combat logic smoother @@ -1669,11 +1660,11 @@ def set_er_location_rules(world: "TunicWorld") -> None: # Frog's Domain set_rule(world.get_location("Frog's Domain - Side Room Grapple Secret"), - lambda state: state.has_any({grapple, laurels}, player)) + lambda state: state.has_any((grapple, laurels), player)) set_rule(world.get_location("Frog's Domain - Grapple Above Hot Tub"), - lambda state: state.has_any({grapple, laurels}, player)) + lambda state: state.has_any((grapple, laurels), player)) set_rule(world.get_location("Frog's Domain - Escape Chest"), - lambda state: state.has_any({grapple, laurels}, player)) + lambda state: state.has_any((grapple, laurels), player)) # Library Lab set_rule(world.get_location("Library Lab - Page 1"), @@ -1695,7 +1686,7 @@ def set_er_location_rules(world: "TunicWorld") -> None: # Beneath the Vault set_rule(world.get_location("Beneath the Fortress - Bridge"), lambda state: has_lantern(state, world) and - (has_melee(state, player) or state.has_any((laurels, fire_wand, ice_dagger, gun), player))) + (has_melee(state, player) or state.has_any((laurels, fire_wand, ice_dagger, gun), player))) # Quarry set_rule(world.get_location("Quarry - [Central] Above Ladder Dash Chest"), @@ -1706,9 +1697,10 @@ def set_er_location_rules(world: "TunicWorld") -> None: set_rule(world.get_location("Rooted Ziggurat Upper - Near Bridge Switch"), lambda state: has_sword(state, player) or (state.has(fire_wand, player) and (state.has(laurels, player) - or world.options.entrance_rando))) + or options.entrance_rando))) set_rule(world.get_location("Rooted Ziggurat Lower - After Guarded Fuse"), - lambda state: has_sword(state, player) and has_ability(prayer, state, world)) + lambda state: state.has(ziggurat_miniboss_fuse, player) if options.shuffle_fuses + else has_sword(state, player) and has_ability(prayer, state, world)) # Bosses set_rule(world.get_location("Fortress Arena - Siege Engine/Vault Key Pickup"), @@ -1750,34 +1742,36 @@ def set_er_location_rules(world: "TunicWorld") -> None: lambda state: state.has(laurels, player)) # Events - set_rule(world.get_location("Eastern Bell"), - lambda state: (has_melee(state, player) or state.has(fire_wand, player))) - set_rule(world.get_location("Western Bell"), - lambda state: (has_melee(state, player) or state.has(fire_wand, player))) - set_rule(world.get_location("Furnace Fuse"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("South and West Fortress Exterior Fuses"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("Upper and Central Fortress Exterior Fuses"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("Beneath the Vault Fuse"), - lambda state: state.has("Activate South and West Fortress Exterior Fuses", player)) - set_rule(world.get_location("Eastern Vault West Fuses"), - lambda state: state.has("Activate Beneath the Vault Fuse", player)) - set_rule(world.get_location("Eastern Vault East Fuse"), - lambda state: state.has_all({"Activate Upper and Central Fortress Exterior Fuses", - "Activate South and West Fortress Exterior Fuses"}, player)) - set_rule(world.get_location("Quarry Connector Fuse"), - lambda state: has_ability(prayer, state, world) and state.has(grapple, player)) - set_rule(world.get_location("Quarry Fuse"), - lambda state: state.has("Activate Quarry Connector Fuse", player)) - set_rule(world.get_location("Ziggurat Fuse"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("West Garden Fuse"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("Library Fuse"), - lambda state: has_ability(prayer, state, world) and has_ladder("Ladders in Library", state, world)) - if not world.options.hexagon_quest: + if not options.shuffle_bells: + set_rule(world.get_location("Eastern Bell"), + lambda state: (has_melee(state, player) or state.has(fire_wand, player))) + set_rule(world.get_location("Western Bell"), + lambda state: (has_melee(state, player) or state.has(fire_wand, player))) + if not options.shuffle_fuses: + set_rule(world.get_location("Furnace Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("South and West Fortress Exterior Fuses"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Upper and Central Fortress Exterior Fuses"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Beneath the Vault Fuse"), + lambda state: state.has("Activate South and West Fortress Exterior Fuses", player)) + set_rule(world.get_location("Eastern Vault West Fuses"), + lambda state: state.has("Activate Beneath the Vault Fuse", player)) + set_rule(world.get_location("Eastern Vault East Fuse"), + lambda state: state.has_all(("Activate Upper and Central Fortress Exterior Fuses", + "Activate South and West Fortress Exterior Fuses"), player)) + set_rule(world.get_location("Quarry Connector Fuse"), + lambda state: has_ability(prayer, state, world) and state.has(grapple, player)) + set_rule(world.get_location("Quarry Fuse"), + lambda state: state.has("Activate Quarry Connector Fuse", player)) + set_rule(world.get_location("Ziggurat Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("West Garden Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Library Fuse"), + lambda state: has_ability(prayer, state, world) and has_ladder("Ladders in Library", state, world)) + if not options.hexagon_quest: set_rule(world.get_location("Place Questagons"), lambda state: state.has_all((red_hexagon, blue_hexagon, green_hexagon), player)) @@ -1868,7 +1862,7 @@ def set_er_location_rules(world: "TunicWorld") -> None: # laurels past the enemies, then use the wand or gun to take care of the fairies that chased you add_rule(world.get_location("West Garden - [West Lowlands] Tree Holy Cross Chest"), - lambda state: state.has_any({fire_wand, "Gun"}, player)) + lambda state: state.has_any((fire_wand, gun), player)) combat_logic_to_loc("West Garden - [Central Lowlands] Chest Beneath Faeries", "West Garden") combat_logic_to_loc("West Garden - [Central Lowlands] Chest Beneath Save Point", "West Garden") combat_logic_to_loc("West Garden - [West Highlands] Upper Left Walkway", "West Garden") @@ -1880,13 +1874,14 @@ def set_er_location_rules(world: "TunicWorld") -> None: # could just do the last two, but this outputs better in the spoiler log # dagger is maybe viable here, but it's sketchy -- activate ladder switch, save to reset enemies, climb up - combat_logic_to_loc("Upper and Central Fortress Exterior Fuses", "Eastern Vault Fortress") - combat_logic_to_loc("Beneath the Vault Fuse", "Beneath the Vault") - combat_logic_to_loc("Eastern Vault West Fuses", "Eastern Vault Fortress") + if not options.shuffle_fuses: + combat_logic_to_loc("Upper and Central Fortress Exterior Fuses", "Eastern Vault Fortress") + combat_logic_to_loc("Beneath the Vault Fuse", "Beneath the Vault") + combat_logic_to_loc("Eastern Vault West Fuses", "Eastern Vault Fortress") # if you come in from the left, you only need to fight small crabs add_rule(world.get_location("Ruined Atoll - [South] Near Birds"), - lambda state: has_melee(state, player) or state.has_any({laurels, "Gun"}, player)) + lambda state: has_melee(state, player) or state.has_any((laurels, gun), player)) # can get this one without fighting if you have laurels add_rule(world.get_location("Frog's Domain - Above Vault"), @@ -1898,8 +1893,21 @@ def set_er_location_rules(world: "TunicWorld") -> None: and (state.has(laurels, player) or world.options.entrance_rando)) or has_combat_reqs("Rooted Ziggurat", state, player)) set_rule(world.get_location("Rooted Ziggurat Lower - After Guarded Fuse"), - lambda state: has_ability(prayer, state, world) - and has_combat_reqs("Rooted Ziggurat", state, player)) + lambda state: state.has(ziggurat_miniboss_fuse, player) if options.shuffle_fuses + else (has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player))) + + if options.shuffle_fuses: + set_rule(world.get_location("Rooted Ziggurat Lower - [Miniboss] Activate Fuse"), + lambda state: has_ability(prayer, state, world) and has_combat_reqs("Rooted Ziggurat", state, player)) + combat_logic_to_loc("Beneath the Fortress - Activate Fuse", "Beneath the Vault") + combat_logic_to_loc("Fortress Courtyard - [Upper] Activate Fuse", "Eastern Vault Fortress") + combat_logic_to_loc("Fortress Courtyard - [Central] Activate Fuse", "Eastern Vault Fortress") + combat_logic_to_loc("Eastern Vault Fortress - [Candle Room] Activate Fuse", "Eastern Vault Fortress") + combat_logic_to_loc("Eastern Vault Fortress - [Left of Door] Activate Fuse", "Eastern Vault Fortress") + combat_logic_to_loc("Eastern Vault Fortress - [Right of Door] Activate Fuse", "Eastern Vault Fortress") + combat_logic_to_loc("Ruined Atoll - [Northwest] Activate Fuse", "Ruined Atoll") + combat_logic_to_loc("Ruined Atoll - [Southwest] Activate Fuse", "Ruined Atoll") + combat_logic_to_loc("Swamp - [Central] Activate Fuse", "Swamp") # replace the sword rule with this one combat_logic_to_loc("Swamp - [South Graveyard] 4 Orange Skulls", "Swamp", set_instead=True) diff --git a/worlds/tunic/er_scripts.py b/worlds/tunic/er_scripts.py index ae1b5fcb45..a1b8b2fefd 100644 --- a/worlds/tunic/er_scripts.py +++ b/worlds/tunic/er_scripts.py @@ -1,14 +1,16 @@ -from typing import Dict, List, Set, Tuple, TYPE_CHECKING +from copy import deepcopy +from random import Random +from typing import TYPE_CHECKING + from BaseClasses import Region, ItemClassification, Item, Location -from .locations import all_locations +from Options import PlandoConnection + +from .breakables import create_breakable_exclusive_regions, set_breakable_location_rules from .er_data import (Portal, portal_mapping, traversal_requirements, DeadEnd, Direction, RegionInfo, get_portal_outlet_region) from .er_rules import set_er_region_rules -from .breakables import create_breakable_exclusive_regions, set_breakable_location_rules -from Options import PlandoConnection +from .locations import all_locations from .options import EntranceRando, EntranceLayout -from random import Random -from copy import deepcopy if TYPE_CHECKING: from . import TunicWorld @@ -22,8 +24,8 @@ class TunicERLocation(Location): game: str = "TUNIC" -def create_er_regions(world: "TunicWorld") -> Dict[Portal, Portal]: - regions: Dict[str, Region] = {} +def create_er_regions(world: "TunicWorld") -> dict[Portal, Portal]: + regions: dict[str, Region] = {} world.used_shop_numbers = set() for region_name, region_data in world.er_regions.items(): @@ -83,7 +85,7 @@ def create_er_regions(world: "TunicWorld") -> Dict[Portal, Portal]: # keys are event names, values are event regions -tunic_events: Dict[str, str] = { +tunic_events: dict[str, str] = { "Eastern Bell": "Forest Belltower Upper", "Western Bell": "Overworld Belltower at Bell", "Furnace Fuse": "Furnace Fuse", @@ -101,7 +103,7 @@ tunic_events: Dict[str, str] = { } -def place_event_items(world: "TunicWorld", regions: Dict[str, Region]) -> None: +def place_event_items(world: "TunicWorld", regions: dict[str, Region]) -> None: for event_name, region_name in tunic_events.items(): region = regions[region_name] location = TunicERLocation(world.player, event_name, None, region) @@ -111,9 +113,13 @@ def place_event_items(world: "TunicWorld", regions: Dict[str, Region]) -> None: location.place_locked_item( TunicERItem("Unseal the Heir", ItemClassification.progression, None, world.player)) elif event_name.endswith("Bell"): + if world.options.shuffle_bells: + continue location.place_locked_item( TunicERItem("Ring " + event_name, ItemClassification.progression, None, world.player)) - else: + elif event_name.endswith("Fuse") or event_name.endswith("Fuses"): + if world.options.shuffle_fuses: + continue location.place_locked_item( TunicERItem("Activate " + event_name, ItemClassification.progression, None, world.player)) region.locations.append(location) @@ -135,7 +141,7 @@ def get_shop_num(world: "TunicWorld") -> int: # all shops are the same shop. however, you cannot get to all shops from the same shop entrance. # so, we need a bunch of shop regions that connect to the actual shop, but the actual shop cannot connect back -def create_shop_region(world: "TunicWorld", regions: Dict[str, Region], portal_num) -> None: +def create_shop_region(world: "TunicWorld", regions: dict[str, Region], portal_num) -> None: new_shop_name = f"Shop {portal_num}" world.er_regions[new_shop_name] = RegionInfo("Shop", dead_end=DeadEnd.all_cats) new_shop_region = Region(new_shop_name, world.player, world.multiworld) @@ -144,8 +150,8 @@ def create_shop_region(world: "TunicWorld", regions: Dict[str, Region], portal_n # for non-ER that uses the ER rules, we create a vanilla set of portal pairs -def vanilla_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal, Portal]: - portal_pairs: Dict[Portal, Portal] = {} +def vanilla_portals(world: "TunicWorld", regions: dict[str, Region]) -> dict[Portal, Portal]: + portal_pairs: dict[Portal, Portal] = {} # we don't want the zig skip exit for vanilla portals, since it shouldn't be considered for logic here portal_map = [portal for portal in portal_mapping if portal.name not in ["Ziggurat Lower Falling Entrance", "Purgatory Bottom Exit", "Purgatory Top Exit"]] @@ -182,10 +188,10 @@ def vanilla_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Por # repeat this phase until all regions are reachable # second phase: randomly pair dead ends to random two_plus # third phase: randomly pair the remaining two_plus to each other -def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal, Portal]: - portal_pairs: Dict[Portal, Portal] = {} - dead_ends: List[Portal] = [] - two_plus: List[Portal] = [] +def pair_portals(world: "TunicWorld", regions: dict[str, Region]) -> dict[Portal, Portal]: + portal_pairs: dict[Portal, Portal] = {} + dead_ends: list[Portal] = [] + two_plus: list[Portal] = [] player_name = world.player_name portal_map = portal_mapping.copy() laurels_zips = world.options.laurels_zips.value @@ -194,6 +200,8 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal entrance_layout = world.options.entrance_layout laurels_location = world.options.laurels_location decoupled = world.options.decoupled + shuffle_fuses = bool(world.options.shuffle_fuses.value) + shuffle_bells = bool(world.options.shuffle_bells.value) traversal_reqs = deepcopy(traversal_requirements) has_laurels = True waterfall_plando = False @@ -206,8 +214,10 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal ladder_storage = seed_group["ladder_storage"] entrance_layout = seed_group["entrance_layout"] laurels_location = "10_fairies" if seed_group["laurels_at_10_fairies"] is True else False + shuffle_bells = seed_group["bell_shuffle"] + shuffle_fuses = seed_group["fuse_shuffle"] - logic_tricks: Tuple[bool, int, int] = (laurels_zips, ice_grappling, ladder_storage) + logic_tricks: tuple[bool, int, int] = (laurels_zips, ice_grappling, ladder_storage) # marking that you don't immediately have laurels if laurels_location == "10_fairies" and not world.using_ut: @@ -215,8 +225,8 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal # for the direction pairs option with decoupled off # tracks how many portals are in each direction in each list - two_plus_direction_tracker: Dict[int, int] = {direction: 0 for direction in range(8)} - dead_end_direction_tracker: Dict[int, int] = {direction: 0 for direction in range(8)} + two_plus_direction_tracker: dict[int, int] = {direction: 0 for direction in range(8)} + dead_end_direction_tracker: dict[int, int] = {direction: 0 for direction in range(8)} # for ensuring we have enough entrances in directions left that we don't leave dead ends without any def too_few_portals_for_direction_pairs(direction: int, offset: int) -> bool: @@ -226,10 +236,6 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal return False return True - # If using Universal Tracker, restore portal_map. Could be cleaner, but it does not matter for UT even a little bit - if world.using_ut: - portal_map = portal_mapping.copy() - # create separate lists for dead ends and non-dead ends for portal in portal_map: dead_end_status = world.er_regions[portal.region].dead_end @@ -255,8 +261,10 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal else: dead_ends.append(portal) dead_end_direction_tracker[portal.direction] += 1 - if portal.region == "Zig Skip Exit" and entrance_layout == EntranceLayout.option_fixed_shop: + if (portal.region == "Zig Skip Exit" and entrance_layout == EntranceLayout.option_fixed_shop + and not decoupled): # direction isn't meaningful here since zig skip cannot be in direction pairs mode + # don't add it in decoupled two_plus.append(portal) # now we generate the shops and add them to the dead ends list @@ -289,11 +297,12 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal dead_ends.append(shop_portal) dead_end_direction_tracker[shop_portal.direction] += 1 - connected_regions: Set[str] = set() + connected_regions: set[str] = set() # make better start region stuff when/if implementing random start start_region = "Overworld" connected_regions.add(start_region) - connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks) + connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks, + shuffle_fuses, shuffle_bells) if world.options.entrance_rando.value in EntranceRando.options.values(): plando_connections = world.options.plando_connections.value @@ -369,8 +378,8 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal else: modified_plando_connections = plando_connections - connected_shop_portal1s: Set[int] = set() - connected_shop_portal2s: Set[int] = set() + connected_shop_portal1s: set[int] = set() + connected_shop_portal2s: set[int] = set() for connection in modified_plando_connections: p_entrance = connection.entrance p_exit = connection.exit @@ -417,7 +426,15 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal break else: if p_entrance.startswith("Shop Portal "): - portal_num = int(p_entrance.split("Shop Portal ")[-1]) + try: + portal_num = int(p_entrance.split("Shop Portal ")[-1]) + except ValueError: + if "Previous Region" in p_entrance: + raise Exception("TUNIC: APWorld used for generation is incompatible with newer APWorld. " + "Please use the APWorld from Archipelago 0.6.1 instead.") + else: + raise Exception("TUNIC: Unknown error occurred in UT entrance setup, please contact " + "the TUNIC APWorld devs.") # shops 1-6 are south, 7 and 8 are east, and after that it just breaks direction pairs if portal_num <= 6: pdir = Direction.south @@ -450,7 +467,15 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal else: if not portal2: if p_exit.startswith("Shop Portal "): - portal_num = int(p_exit.split("Shop Portal ")[-1]) + try: + portal_num = int(p_exit.split("Shop Portal ")[-1]) + except ValueError: + if "Previous Region" in p_exit: + raise Exception("TUNIC: APWorld used for generation is incompatible with newer APWorld. " + "Please use the APWorld from Archipelago 0.6.1 instead.") + else: + raise Exception("TUNIC: Unknown error occurred in UT entrance setup, please contact " + "the TUNIC APWorld devs.") if portal_num <= 6: pdir = Direction.south elif portal_num in [7, 8]: @@ -508,13 +533,15 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal dead_end_direction_tracker[portal1.direction] -= 1 else: two_plus_direction_tracker[portal1.direction] -= 1 + if portal2_dead_end: dead_end_direction_tracker[portal2.direction] -= 1 else: two_plus_direction_tracker[portal2.direction] -= 1 # if we have plando connections, our connected regions may change somewhat - connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks) + connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks, + shuffle_fuses, shuffle_bells) # if there are an odd number of shops after plando, add another one, except in decoupled where it doesn't matter if not decoupled and len(world.used_shop_numbers) % 2 == 1: @@ -597,7 +624,6 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal connected_regions = backup_connected_regions.copy() rare_failure_count += 1 fail_count = 0 - if rare_failure_count > 100: raise Exception(f"Failed to pair regions due to rare pairing issues for {player_name}. " f"Unconnected regions: {non_dead_end_regions - connected_regions}.\n" @@ -631,7 +657,9 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal if waterfall_plando: cr = connected_regions.copy() cr.add(portal.region) - if "Secret Gathering Place" not in update_reachable_regions(cr, traversal_reqs, has_laurels, logic_tricks): + if "Secret Gathering Place" not in update_reachable_regions(cr, traversal_reqs, has_laurels, + logic_tricks, shuffle_fuses, + shuffle_bells): continue # if not waterfall_plando, then we just want to pair secret gathering place now elif portal.region != "Secret Gathering Place": @@ -680,8 +708,8 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal # once we have both portals, connect them and add the new region(s) to connected_regions if not has_laurels and "Secret Gathering Place" in connected_regions: has_laurels = True - connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks) - + connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic_tricks, + shuffle_fuses, shuffle_bells) portal_pairs[portal1] = portal2 two_plus_direction_tracker[portal1.direction] -= 1 two_plus_direction_tracker[portal2.direction] -= 1 @@ -743,7 +771,7 @@ def pair_portals(world: "TunicWorld", regions: Dict[str, Region]) -> Dict[Portal # loop through our list of paired portals and make two-way connections -def create_randomized_entrances(world: "TunicWorld", portal_pairs: Dict[Portal, Portal], regions: Dict[str, Region]) -> None: +def create_randomized_entrances(world: "TunicWorld", portal_pairs: dict[Portal, Portal], regions: dict[str, Region]) -> None: for portal1, portal2 in portal_pairs.items(): # connect to the outlet region if there is one, if not connect to the actual region regions[portal1.region].connect( @@ -755,8 +783,9 @@ def create_randomized_entrances(world: "TunicWorld", portal_pairs: Dict[Portal, name=portal2.name) -def update_reachable_regions(connected_regions: Set[str], traversal_reqs: Dict[str, Dict[str, List[List[str]]]], - has_laurels: bool, logic: Tuple[bool, int, int]) -> Set[str]: +def update_reachable_regions(connected_regions: set[str], traversal_reqs: dict[str, dict[str, list[list[str]]]], + has_laurels: bool, logic: tuple[bool, int, int], shuffle_fuses: bool, + shuffle_bells: bool) -> set[str]: zips, ice_grapples, ls = logic # starting count, so we can run it again if this changes region_count = len(connected_regions) @@ -788,6 +817,12 @@ def update_reachable_regions(connected_regions: Set[str], traversal_reqs: Dict[s break elif req not in connected_regions: break + elif req == "Fuse Shuffle": + if not shuffle_fuses: + break + elif req == "Bell Shuffle": + if not shuffle_bells: + break else: met_traversal_reqs = True break @@ -796,13 +831,14 @@ def update_reachable_regions(connected_regions: Set[str], traversal_reqs: Dict[s # if the length of connected_regions changed, we got new regions, so we want to check those new origins if region_count != len(connected_regions): - connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic) + connected_regions = update_reachable_regions(connected_regions, traversal_reqs, has_laurels, logic, + shuffle_fuses, shuffle_bells) return connected_regions # which directions are opposites -direction_pairs: Dict[int, int] = { +direction_pairs: dict[int, int] = { Direction.north: Direction.south, Direction.south: Direction.north, Direction.east: Direction.west, @@ -846,9 +882,9 @@ def verify_plando_directions(connection: PlandoConnection) -> bool: # sort the portal dict by the name of the first portal, referring to the portal order in the master portal list -def sort_portals(portal_pairs: Dict[Portal, Portal], world: "TunicWorld") -> Dict[str, str]: - sorted_pairs: Dict[str, str] = {} - reference_list: List[str] = [portal.name for portal in portal_mapping] +def sort_portals(portal_pairs: dict[Portal, Portal], world: "TunicWorld") -> dict[str, str]: + sorted_pairs: dict[str, str] = {} + reference_list: list[str] = [portal.name for portal in portal_mapping] # due to plando, there can be a variable number of shops largest_shop_number = max(world.used_shop_numbers) diff --git a/worlds/tunic/fuses.py b/worlds/tunic/fuses.py new file mode 100644 index 0000000000..566dffcb0a --- /dev/null +++ b/worlds/tunic/fuses.py @@ -0,0 +1,123 @@ +from typing import NamedTuple, TYPE_CHECKING + +from BaseClasses import CollectionState +from worlds.generic.Rules import set_rule + +from .constants import * +from .logic_helpers import has_ability, has_sword, fuse_activation_reqs + +if TYPE_CHECKING: + from . import TunicWorld + + +class TunicLocationData(NamedTuple): + loc_group: str + er_region: str + + +fuse_location_table: dict[str, TunicLocationData] = { + "Overworld - [Southeast] Activate Fuse": TunicLocationData("Overworld", "Overworld"), + "Swamp - [Central] Activate Fuse": TunicLocationData("Swamp", "Swamp Mid"), + "Swamp - [Outside Cathedral] Activate Fuse": TunicLocationData("Swamp", "Swamp Mid"), + "Cathedral - Activate Fuse": TunicLocationData("Cathedral", "Cathedral Main"), + "West Furnace - Activate Fuse": TunicLocationData("West Furnace", "Furnace Fuse"), + "West Garden - [South Highlands] Activate Fuse": TunicLocationData("West Garden", "West Garden South Checkpoint"), + "Ruined Atoll - [Northwest] Activate Fuse": TunicLocationData("Ruined Atoll", "Ruined Atoll"), + "Ruined Atoll - [Northeast] Activate Fuse": TunicLocationData("Ruined Atoll", "Ruined Atoll"), + "Ruined Atoll - [Southeast] Activate Fuse": TunicLocationData("Ruined Atoll", "Ruined Atoll Ladder Tops"), + "Ruined Atoll - [Southwest] Activate Fuse": TunicLocationData("Ruined Atoll", "Ruined Atoll"), + "Library Lab - Activate Fuse": TunicLocationData("Library Lab", "Library Lab"), + "Fortress Courtyard - [From Overworld] Activate Fuse": TunicLocationData("Fortress Courtyard", "Fortress Exterior from Overworld"), + "Fortress Courtyard - [Near Cave] Activate Fuse": TunicLocationData("Fortress Courtyard", "Fortress Exterior from Overworld"), + "Fortress Courtyard - [Upper] Activate Fuse": TunicLocationData("Fortress Courtyard", "Fortress Courtyard Upper"), + "Fortress Courtyard - [Central] Activate Fuse": TunicLocationData("Fortress Courtyard", "Fortress Courtyard"), + "Beneath the Fortress - Activate Fuse": TunicLocationData("Beneath the Fortress", "Beneath the Vault Back"), + "Eastern Vault Fortress - [Candle Room] Activate Fuse": TunicLocationData("Eastern Vault Fortress", "Eastern Vault Fortress"), + "Eastern Vault Fortress - [Left of Door] Activate Fuse": TunicLocationData("Eastern Vault Fortress", "Eastern Vault Fortress"), + "Eastern Vault Fortress - [Right of Door] Activate Fuse": TunicLocationData("Eastern Vault Fortress", "Eastern Vault Fortress"), + "Quarry Entryway - Activate Fuse": TunicLocationData("Quarry Connector", "Quarry Connector"), + "Quarry - Activate Fuse": TunicLocationData("Quarry", "Quarry Entry"), + "Rooted Ziggurat Lower - [Miniboss] Activate Fuse": TunicLocationData("Rooted Ziggurat Lower", "Rooted Ziggurat Lower Miniboss Platform"), + "Rooted Ziggurat Lower - [Before Boss] Activate Fuse": TunicLocationData("Rooted Ziggurat Lower", "Rooted Ziggurat Lower Back"), +} + +fuse_location_base_id = base_id + 10000 +fuse_location_name_to_id: dict[str, int] = {name: fuse_location_base_id + index + for index, name in enumerate(fuse_location_table)} + +fuse_location_groups: dict[str, set[str]] = {} +for location_name, location_data in fuse_location_table.items(): + fuse_location_groups.setdefault(location_data.loc_group, set()).add(location_name) + fuse_location_groups.setdefault("Fuses", set()).add(location_name) + + +# to be deduplicated in the big refactor +def has_ladder(ladder: str, state: CollectionState, world: "TunicWorld") -> bool: + return not world.options.shuffle_ladders or state.has(ladder, world.player) + + +def set_fuse_location_rules(world: "TunicWorld") -> None: + player = world.player + + set_rule(world.get_location("Overworld - [Southeast] Activate Fuse"), + lambda state: state.has(laurels, player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Swamp - [Central] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[swamp_fuse_2], player) + and has_ability(prayer, state, world) + and has_sword(state, player)) + set_rule(world.get_location("Swamp - [Outside Cathedral] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[swamp_fuse_3], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Cathedral - Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("West Furnace - Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("West Garden - [South Highlands] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Ruined Atoll - [Northwest] Activate Fuse"), + lambda state: state.has_any([grapple, laurels], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Ruined Atoll - [Northeast] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Ruined Atoll - [Southeast] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Ruined Atoll - [Southwest] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Library Lab - Activate Fuse"), + lambda state: has_ability(prayer, state, world) + and has_ladder("Ladders in Library", state, world)) + set_rule(world.get_location("Fortress Courtyard - [From Overworld] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) + set_rule(world.get_location("Fortress Courtyard - [Near Cave] Activate Fuse"), + lambda state: state.has(fortress_exterior_fuse_1, player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Fortress Courtyard - [Upper] Activate Fuse"), + lambda state: state.has(fortress_exterior_fuse_1, player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Fortress Courtyard - [Central] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[fortress_courtyard_lower_fuse], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Beneath the Fortress - Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[beneath_the_vault_fuse], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Eastern Vault Fortress - [Candle Room] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[fortress_candles_fuse], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Eastern Vault Fortress - [Left of Door] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[fortress_door_left_fuse], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Eastern Vault Fortress - [Right of Door] Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[fortress_door_right_fuse], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Quarry Entryway - Activate Fuse"), + lambda state: state.has(grapple, player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Quarry - Activate Fuse"), + lambda state: state.has_all(fuse_activation_reqs[quarry_fuse_2], player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Rooted Ziggurat Lower - [Miniboss] Activate Fuse"), + lambda state: has_sword(state, player) + and has_ability(prayer, state, world)) + set_rule(world.get_location("Rooted Ziggurat Lower - [Before Boss] Activate Fuse"), + lambda state: has_ability(prayer, state, world)) diff --git a/worlds/tunic/grass.py b/worlds/tunic/grass.py index 971ac4c0fe..f2aea40f7c 100644 --- a/worlds/tunic/grass.py +++ b/worlds/tunic/grass.py @@ -1,8 +1,11 @@ -from typing import Dict, NamedTuple, Optional, TYPE_CHECKING, Set +from typing import NamedTuple, TYPE_CHECKING from BaseClasses import CollectionState from worlds.generic.Rules import set_rule, add_rule -from .rules import has_sword, has_melee + +from .constants import base_id +from .logic_helpers import has_sword, has_melee + if TYPE_CHECKING: from . import TunicWorld @@ -10,12 +13,12 @@ if TYPE_CHECKING: class TunicLocationData(NamedTuple): region: str er_region: str # entrance rando region - location_group: Optional[str] = None + location_group: str | None = None -location_base_id = 509342400 - -grass_location_table: Dict[str, TunicLocationData] = { +# todo: remove region, make all of these regions append grass to the name +# and then set the rules on the region entrances instead of the locations directly +grass_location_table: dict[str, TunicLocationData] = { "Overworld - Overworld Grass (576) (7.0, 4.0, -223.0)": TunicLocationData("Overworld", "Overworld"), "Overworld - Overworld Grass (572) (6.0, 4.0, -223.0)": TunicLocationData("Overworld", "Overworld"), "Overworld - Overworld Grass (574) (7.0, 4.0, -224.0)": TunicLocationData("Overworld", "Overworld"), @@ -7763,9 +7766,10 @@ excluded_grass_locations = { "Overworld - East Overworld Bush (64) (56.0, 44.0, -107.0)", } -grass_location_name_to_id: Dict[str, int] = {name: location_base_id + 302 + index for index, name in enumerate(grass_location_table)} +grass_base_id = base_id + 302 +grass_location_name_to_id: dict[str, int] = {name: grass_base_id + index for index, name in enumerate(grass_location_table)} -grass_location_name_groups: Dict[str, Set[str]] = {} +grass_location_name_groups: dict[str, set[str]] = {} for loc_name, loc_data in grass_location_table.items(): area_name = loc_name.split(" - ", 1)[0] # adding it to the normal location group and a grass-only one diff --git a/worlds/tunic/items.py b/worlds/tunic/items.py index a2b4140a68..e8f201b926 100644 --- a/worlds/tunic/items.py +++ b/worlds/tunic/items.py @@ -1,7 +1,10 @@ from itertools import groupby -from typing import Dict, List, Set, NamedTuple, Optional +from typing import NamedTuple + from BaseClasses import ItemClassification as IC +from .constants import base_id + class TunicItemData(NamedTuple): classification: IC @@ -9,12 +12,10 @@ class TunicItemData(NamedTuple): item_id_offset: int item_group: str = "" # classification if combat logic is on - combat_ic: Optional[IC] = None + combat_ic: None | IC = None -item_base_id = 509342400 - -item_table: Dict[str, TunicItemData] = { +item_table: dict[str, TunicItemData] = { "Firecracker x2": TunicItemData(IC.filler, 3, 0, "Bombs"), "Firecracker x3": TunicItemData(IC.filler, 3, 1, "Bombs"), "Firecracker x4": TunicItemData(IC.filler, 3, 2, "Bombs"), @@ -172,10 +173,35 @@ item_table: Dict[str, TunicItemData] = { "Ladders in Lower Quarry": TunicItemData(IC.progression, 0, 149, "Ladders"), "Ladders in Swamp": TunicItemData(IC.progression, 0, 150, "Ladders"), "Grass": TunicItemData(IC.filler, 0, 151), + "Swamp Fuse 1": TunicItemData(IC.progression, 0, 157, "Fuses"), + "Swamp Fuse 2": TunicItemData(IC.progression, 0, 158, "Fuses"), + "Swamp Fuse 3": TunicItemData(IC.progression, 0, 159, "Fuses"), + "Cathedral Elevator Fuse": TunicItemData(IC.progression, 0, 160, "Fuses"), + "Quarry Fuse 1": TunicItemData(IC.progression, 0, 161, "Fuses"), + "Quarry Fuse 2": TunicItemData(IC.progression, 0, 162, "Fuses"), + "Ziggurat Miniboss Fuse": TunicItemData(IC.progression, 0, 163, "Fuses"), + "Ziggurat Teleporter Fuse": TunicItemData(IC.progression, 0, 164, "Fuses"), + "Fortress Exterior Fuse 1": TunicItemData(IC.progression, 0, 165, "Fuses"), + "Fortress Exterior Fuse 2": TunicItemData(IC.progression, 0, 166, "Fuses"), + "Fortress Courtyard Upper Fuse": TunicItemData(IC.progression, 0, 167, "Fuses"), + "Fortress Courtyard Fuse": TunicItemData(IC.progression, 0, 168, "Fuses"), + "Beneath the Vault Fuse": TunicItemData(IC.progression, 0, 169, "Fuses"), + "Fortress Candles Fuse": TunicItemData(IC.progression, 0, 170, "Fuses"), + "Fortress Door Left Fuse": TunicItemData(IC.progression, 0, 171, "Fuses"), + "Fortress Door Right Fuse": TunicItemData(IC.progression, 0, 172, "Fuses"), + "West Furnace Fuse": TunicItemData(IC.progression, 0, 173, "Fuses"), + "West Garden Fuse": TunicItemData(IC.progression, 0, 174, "Fuses"), + "Atoll Northeast Fuse": TunicItemData(IC.progression, 0, 175, "Fuses"), + "Atoll Northwest Fuse": TunicItemData(IC.progression, 0, 176, "Fuses"), + "Atoll Southeast Fuse": TunicItemData(IC.progression, 0, 177, "Fuses"), + "Atoll Southwest Fuse": TunicItemData(IC.progression, 0, 178, "Fuses"), + "Library Lab Fuse": TunicItemData(IC.progression, 0, 179, "Fuses"), + "East Bell": TunicItemData(IC.progression, 0, 180, "Bells"), + "West Bell": TunicItemData(IC.progression, 0, 181, "Bells") } # items to be replaced by fool traps -fool_tiers: List[List[str]] = [ +fool_tiers: list[list[str]] = [ [], ["Money x1", "Money x10", "Money x15", "Money x16"], ["Money x1", "Money x10", "Money x15", "Money x16", "Money x20"], @@ -214,25 +240,25 @@ slot_data_item_names = [ "Gold Questagon", ] -combat_items: List[str] = [name for name, data in item_table.items() +combat_items: list[str] = [name for name, data in item_table.items() if data.combat_ic and IC.progression in data.combat_ic] combat_items.extend(["Stick", "Sword", "Sword Upgrade", "Magic Wand", "Hero's Laurels", "Gun"]) -item_name_to_id: Dict[str, int] = {name: item_base_id + data.item_id_offset for name, data in item_table.items()} +item_name_to_id: dict[str, int] = {name: base_id + data.item_id_offset for name, data in item_table.items()} -filler_items: List[str] = [name for name, data in item_table.items() if data.classification == IC.filler and name != "Grass"] +filler_items: list[str] = [name for name, data in item_table.items() if data.classification == IC.filler and name != "Grass"] def get_item_group(item_name: str) -> str: return item_table[item_name].item_group -item_name_groups: Dict[str, Set[str]] = { +item_name_groups: dict[str, set[str]] = { group: set(item_names) for group, item_names in groupby(sorted(item_table, key=get_item_group), get_item_group) if group != "" } # extra groups for the purpose of aliasing items -extra_groups: Dict[str, Set[str]] = { +extra_groups: dict[str, set[str]] = { "Laurels": {"Hero's Laurels"}, "Orb": {"Magic Orb"}, "Dagger": {"Magic Dagger"}, diff --git a/worlds/tunic/ladder_storage_data.py b/worlds/tunic/ladder_storage_data.py index f2d4b94406..99a51b406c 100644 --- a/worlds/tunic/ladder_storage_data.py +++ b/worlds/tunic/ladder_storage_data.py @@ -1,15 +1,15 @@ -from typing import Dict, List, Set, NamedTuple, Optional +from typing import NamedTuple # ladders in overworld, since it is the most complex area for ladder storage class OWLadderInfo(NamedTuple): - ladders: Set[str] # ladders where the top or bottom is at the same elevation - portals: List[str] # portals at the same elevation, only those without doors - regions: List[str] # regions where a melee enemy can hit you out of ladder storage + ladders: set[str] # ladders where the top or bottom is at the same elevation + portals: list[str] # portals at the same elevation, only those without doors + regions: list[str] # regions where a melee enemy can hit you out of ladder storage # groups for ladders at the same elevation, for use in determing whether you can ls to entrances in diff rulesets -ow_ladder_groups: Dict[str, OWLadderInfo] = { +ow_ladder_groups: dict[str, OWLadderInfo] = { # lowest elevation "LS Elev 0": OWLadderInfo({"Ladders in Overworld Town", "Ladder to Ruined Atoll", "Ladder to Swamp"}, ["Swamp Redux 2_conduit", "Overworld Cave_", "Atoll Redux_lower", "Maze Room_", @@ -49,7 +49,7 @@ ow_ladder_groups: Dict[str, OWLadderInfo] = { # ladders accessible within different regions of overworld, only those that are relevant # other scenes will just have them hardcoded since this type of structure is not necessary there -region_ladders: Dict[str, Set[str]] = { +region_ladders: dict[str, set[str]] = { "Overworld": {"Ladders near Weathervane", "Ladders near Overworld Checkpoint", "Ladders near Dark Tomb", "Ladders in Overworld Town", "Ladder to Swamp", "Ladders in Well"}, "Overworld Beach": {"Ladder to Ruined Atoll"}, @@ -63,11 +63,11 @@ region_ladders: Dict[str, Set[str]] = { class LadderInfo(NamedTuple): origin: str # origin region destination: str # destination portal - ladders_req: Optional[str] = None # ladders required to do this + ladders_req: str | None = None # ladders required to do this dest_is_region: bool = False # whether it is a region that you are going to -easy_ls: List[LadderInfo] = [ +easy_ls: list[LadderInfo] = [ # In the furnace # Furnace ladder to the fuse entrance LadderInfo("Furnace Ladder Area", "Furnace, Overworld Redux_gyro_upper_north"), @@ -128,7 +128,7 @@ easy_ls: List[LadderInfo] = [ ] # if we can gain elevation or get knocked down, add the harder ones -medium_ls: List[LadderInfo] = [ +medium_ls: list[LadderInfo] = [ # region-destination versions of easy ls spots LadderInfo("East Forest", "East Forest Dance Fox Spot", dest_is_region=True), # fortress courtyard knockdowns are never logically relevant, the fuse requires upper @@ -169,7 +169,7 @@ medium_ls: List[LadderInfo] = [ LadderInfo("Back of Swamp", "Swamp Redux 2, Overworld Redux_wall"), ] -hard_ls: List[LadderInfo] = [ +hard_ls: list[LadderInfo] = [ # lower ladder, go into the waterfall then above the bonfire, up a ramp, then through the right wall LadderInfo("Beneath the Well Front", "Sewer, Sewer_Boss_", "Ladders in Well"), LadderInfo("Beneath the Well Front", "Sewer, Overworld Redux_west_aqueduct", "Ladders in Well"), diff --git a/worlds/tunic/locations.py b/worlds/tunic/locations.py index ced3d2233b..dea2e603c1 100644 --- a/worlds/tunic/locations.py +++ b/worlds/tunic/locations.py @@ -1,17 +1,19 @@ -from typing import Dict, NamedTuple, Set, Optional, List -from .grass import grass_location_table +from typing import NamedTuple + +from .bells import bell_location_table from .breakables import breakable_location_table +from .constants import base_id +from .fuses import fuse_location_table +from .grass import grass_location_table class TunicLocationData(NamedTuple): region: str er_region: str # entrance rando region - location_group: Optional[str] = None + location_group: str | None = None -location_base_id = 509342400 - -location_table: Dict[str, TunicLocationData] = { +location_table: dict[str, TunicLocationData] = { "Beneath the Well - [Powered Secret Room] Chest": TunicLocationData("Beneath the Well", "Beneath the Well Back"), "Beneath the Well - [Entryway] Chest": TunicLocationData("Beneath the Well", "Beneath the Well Main"), "Beneath the Well - [Third Room] Beneath Platform Chest": TunicLocationData("Beneath the Well", "Beneath the Well Main"), @@ -243,7 +245,7 @@ location_table: Dict[str, TunicLocationData] = { "Rooted Ziggurat Lower - Near Corpses": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Entry"), "Rooted Ziggurat Lower - Spider Ambush": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Entry"), "Rooted Ziggurat Lower - Left Of Checkpoint Before Fuse": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Mid Checkpoint"), - "Rooted Ziggurat Lower - After Guarded Fuse": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Mid Checkpoint"), + "Rooted Ziggurat Lower - After Guarded Fuse": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Miniboss Platform"), "Rooted Ziggurat Lower - Guarded By Double Turrets": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Front"), "Rooted Ziggurat Lower - After 2nd Double Turret Chest": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Mid Checkpoint"), "Rooted Ziggurat Lower - Guarded By Double Turrets 2": TunicLocationData("Rooted Ziggurat", "Rooted Ziggurat Lower Front"), @@ -307,7 +309,7 @@ location_table: Dict[str, TunicLocationData] = { "West Garden - [Central Lowlands] Chest Near Shortcut Bridge": TunicLocationData("West Garden", "West Garden after Terry"), "West Garden - [West Highlands] Upper Left Walkway": TunicLocationData("West Garden", "West Garden South Checkpoint"), "West Garden - [Central Lowlands] Chest Beneath Save Point": TunicLocationData("West Garden", "West Garden South Checkpoint"), - "West Garden - [Central Highlands] Behind Guard Captain": TunicLocationData("West Garden", "West Garden before Boss"), + "West Garden - [Central Highlands] Behind Guard Captain": TunicLocationData("West Garden", "West Garden South Checkpoint"), "West Garden - [Central Highlands] After Garden Knight": TunicLocationData("Overworld", "West Garden after Boss", location_group="Bosses"), "West Garden - [South Highlands] Secret Chest Beneath Fuse": TunicLocationData("West Garden", "West Garden South Checkpoint"), "West Garden - [East Lowlands] Page Behind Ice Dagger House": TunicLocationData("West Garden", "West Garden Portal Item"), @@ -316,19 +318,21 @@ location_table: Dict[str, TunicLocationData] = { "Hero's Grave - Effigy Relic": TunicLocationData("West Garden", "Hero Relic - West Garden"), } -hexagon_locations: Dict[str, str] = { +hexagon_locations: dict[str, str] = { "Red Questagon": "Fortress Arena - Siege Engine/Vault Key Pickup", "Green Questagon": "Librarian - Hexagon Green", "Blue Questagon": "Rooted Ziggurat Lower - Hexagon Blue", } -standard_location_name_to_id: Dict[str, int] = {name: location_base_id + index for index, name in enumerate(location_table)} +standard_location_name_to_id: dict[str, int] = {name: base_id + index for index, name in enumerate(location_table)} all_locations = location_table.copy() all_locations.update(grass_location_table) all_locations.update(breakable_location_table) +all_locations.update(fuse_location_table) +all_locations.update(bell_location_table) -location_name_groups: Dict[str, Set[str]] = {} +location_name_groups: dict[str, set[str]] = {} for loc_name, loc_data in location_table.items(): loc_group_name = loc_name.split(" - ", 1)[0] location_name_groups.setdefault(loc_group_name, set()).add(loc_name) diff --git a/worlds/tunic/logic_helpers.py b/worlds/tunic/logic_helpers.py new file mode 100644 index 0000000000..7370c9ace5 --- /dev/null +++ b/worlds/tunic/logic_helpers.py @@ -0,0 +1,125 @@ +from typing import TYPE_CHECKING + +from BaseClasses import CollectionState + +from .constants import * +from .options import HexagonQuestAbilityUnlockType, IceGrappling + +if TYPE_CHECKING: + from . import TunicWorld + + +def randomize_ability_unlocks(world: "TunicWorld") -> dict[str, int]: + options = world.options + + abilities = [prayer, holy_cross, icebolt] + ability_requirement = [1, 1, 1] + world.random.shuffle(abilities) + + if options.hexagon_quest.value and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: + hexagon_goal = options.hexagon_goal.value + # Set ability unlocks to 25, 50, and 75% of goal amount + ability_requirement = [hexagon_goal // 4, hexagon_goal // 2, hexagon_goal * 3 // 4] + if any(req == 0 for req in ability_requirement): + ability_requirement = [1, 2, 3] + + return dict(zip(abilities, ability_requirement)) + + +def has_ability(ability: str, state: CollectionState, world: "TunicWorld") -> bool: + options = world.options + ability_unlocks = world.ability_unlocks + if not options.ability_shuffling: + return True + if options.hexagon_quest and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: + return state.has(gold_hexagon, world.player, ability_unlocks[ability]) + return state.has(ability, world.player) + + +# a check to see if you can whack things in melee at all +def has_melee(state: CollectionState, player: int) -> bool: + return state.has_any(("Stick", "Sword", "Sword Upgrade"), player) + + +def has_sword(state: CollectionState, player: int) -> bool: + return state.has("Sword", player) or state.has("Sword Upgrade", player, 2) + + +def laurels_zip(state: CollectionState, world: "TunicWorld") -> bool: + return world.options.laurels_zips and state.has(laurels, world.player) + + +def has_ice_grapple_logic(long_range: bool, difficulty: IceGrappling, state: CollectionState, world: "TunicWorld") -> bool: + if world.options.ice_grappling < difficulty: + return False + if not long_range: + return state.has_all((ice_dagger, grapple), world.player) + else: + return state.has_all((ice_dagger, fire_wand, grapple), world.player) and has_ability(icebolt, state, world) + + +def can_ladder_storage(state: CollectionState, world: "TunicWorld") -> bool: + if not world.options.ladder_storage: + return False + if world.options.ladder_storage_without_items: + return True + return has_melee(state, world.player) or state.has_any((grapple, shield), world.player) + + +def has_mask(state: CollectionState, world: "TunicWorld") -> bool: + return world.options.maskless or state.has(mask, world.player) + + +def has_lantern(state: CollectionState, world: "TunicWorld") -> bool: + return world.options.lanternless or state.has(lantern, world.player) + + +def has_ladder(ladder: str, state: CollectionState, world: "TunicWorld") -> bool: + return not world.options.shuffle_ladders or state.has(ladder, world.player) + + +def can_shop(state: CollectionState, world: "TunicWorld") -> bool: + return has_sword(state, world.player) and state.can_reach_region("Shop", world.player) + + +# for the ones that are not early bushes where ER can screw you over a bit +def can_get_past_bushes(state: CollectionState, world: "TunicWorld") -> bool: + # add in glass cannon + stick for grass rando + return has_sword(state, world.player) or state.has_any((fire_wand, laurels, gun), world.player) + + +# for fuse locations and reusing event names to simplify er_rules +fuse_activation_reqs: dict[str, list[str]] = { + swamp_fuse_2: [swamp_fuse_1], + swamp_fuse_3: [swamp_fuse_1, swamp_fuse_2], + fortress_exterior_fuse_2: [fortress_exterior_fuse_1], + beneath_the_vault_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2], + fortress_candles_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse], + fortress_door_left_fuse: [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse, + fortress_candles_fuse], + fortress_courtyard_upper_fuse: [fortress_exterior_fuse_1], + fortress_courtyard_lower_fuse: [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse], + fortress_door_right_fuse: [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, fortress_courtyard_lower_fuse], + quarry_fuse_2: [quarry_fuse_1], + "Activate Furnace Fuse": [west_furnace_fuse], + "Activate South and West Fortress Exterior Fuses": [fortress_exterior_fuse_1, fortress_exterior_fuse_2], + "Activate Upper and Central Fortress Exterior Fuses": [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, + fortress_courtyard_lower_fuse], + "Activate Beneath the Vault Fuse": [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse], + "Activate Eastern Vault West Fuses": [fortress_exterior_fuse_1, fortress_exterior_fuse_2, beneath_the_vault_fuse, + fortress_candles_fuse, fortress_door_left_fuse], + "Activate Eastern Vault East Fuse": [fortress_exterior_fuse_1, fortress_courtyard_upper_fuse, + fortress_courtyard_lower_fuse, fortress_door_right_fuse], + "Activate Quarry Connector Fuse": [quarry_fuse_1], + "Activate Quarry Fuse": [quarry_fuse_1, quarry_fuse_2], + "Activate Ziggurat Fuse": [ziggurat_teleporter_fuse], + "Activate West Garden Fuse": [west_garden_fuse], + "Activate Library Fuse": [library_lab_fuse], +} + + +def has_fuses(fuse_event: str, state: CollectionState, world: "TunicWorld") -> bool: + if world.options.shuffle_fuses: + return state.has_all(fuse_activation_reqs[fuse_event], world.player) + + return state.has(fuse_event, world.player) diff --git a/worlds/tunic/options.py b/worlds/tunic/options.py index 09e2d1d604..f705979a44 100644 --- a/worlds/tunic/options.py +++ b/worlds/tunic/options.py @@ -1,12 +1,13 @@ -import logging from dataclasses import dataclass -from typing import Dict, Any, TYPE_CHECKING - from decimal import Decimal, ROUND_HALF_UP +import logging +from typing import Any, TYPE_CHECKING from Options import (DefaultOnToggle, Toggle, StartInventoryPool, Choice, Range, TextChoice, PlandoConnections, PerGameCommonOptions, OptionGroup, Removed, Visibility, NamedRange) + from .er_data import portal_mapping + if TYPE_CHECKING: from . import TunicWorld @@ -145,17 +146,6 @@ class EntranceRando(TextChoice): default = 0 -class FixedShop(Toggle): - """ - This option has been superseded by the Entrance Layout option. - If enabled, it will override the Entrance Layout option. - This is kept to keep older yamls working, and will be removed at a later date. - """ - visibility = Visibility.none - internal_name = "fixed_shop" - display_name = "Fewer Shops in Entrance Rando" - - class EntranceLayout(Choice): """ Decide how the Entrance Randomizer chooses how to pair the entrances. @@ -208,6 +198,24 @@ class ShuffleLadders(Toggle): display_name = "Shuffle Ladders" +class ShuffleFuses(Toggle): + """ + Praying at a fuse will reward a check instead of turning on the power. The power from each fuse gets turned into an + item that must be found in order to restore power for that part of the path. + """ + internal_name = "shuffle_fuses" + display_name = "Shuffle Fuses" + + +class ShuffleBells(Toggle): + """ + The East and West bells are shuffled into the item pool and must be found in order to unlock the Sealed Temple. + Ringing the bells will instead now reward a check. + """ + internal_name = "shuffle_bells" + display_name = "Shuffle Bells" + + class GrassRandomizer(Toggle): """ Turns over 6,000 blades of grass and bushes in the game into checks. @@ -219,8 +227,9 @@ class GrassRandomizer(Toggle): class LocalFill(NamedRange): """ Choose the percentage of your filler/trap items that will be kept local or distributed to other TUNIC players with this option enabled. - If you have Grass Randomizer enabled, this option must be set to 95% or higher to avoid flooding the item pool. The host can remove this restriction by turning off the limit_grass_rando setting in host.yaml. - This option defaults to 95% if you have Grass Randomizer enabled, and to 0% otherwise. + If you have Grass Randomizer enabled, this defaults to 95%. If you have Breakable Shuffle enabled, this defaults to 40%. If you have both enabled, this defaults to 96%. + If you have Grass Randomizer enabled, this option must be set to 95% or higher to avoid flooding the item pool. + The host can remove this restriction by turning off the limit_grass_rando setting in host.yaml. This setting can only be changed with local generation, it cannot be changed on the website. This option ignores items placed in your local_items or non_local_items. This option does nothing in single player games. """ @@ -232,7 +241,6 @@ class LocalFill(NamedRange): "default": -1 } default = -1 - visibility = Visibility.template | Visibility.complex_ui | Visibility.spoiler class TunicPlandoConnections(PlandoConnections): @@ -332,6 +340,14 @@ class LadderStorageWithoutItems(Toggle): display_name = "Ladder Storage without Items" +class BreakableShuffle(Toggle): + """ + Turns approximately 250 breakable objects in the game into checks. + """ + internal_name = "breakable_shuffle" + display_name = "Breakable Shuffle" + + class HiddenAllRandom(Toggle): """ Sets all options that can be random to random. @@ -342,36 +358,9 @@ class HiddenAllRandom(Toggle): visibility = Visibility.none -class LogicRules(Choice): - """ - This option has been superseded by the individual trick options. - If set to nmg, it will set Ice Grappling to medium and Laurels Zips on. - If set to ur, it will do nmg as well as set Ladder Storage to medium. - It is here to avoid breaking old yamls, and will be removed at a later date. - """ - visibility = Visibility.none - internal_name = "logic_rules" - display_name = "Logic Rules" - option_restricted = 0 - option_no_major_glitches = 1 - alias_nmg = 1 - option_unrestricted = 2 - alias_ur = 2 - default = 0 - - -class BreakableShuffle(Toggle): - """ - Turns approximately 250 breakable objects in the game into checks. - """ - internal_name = "breakable_shuffle" - display_name = "Breakable Shuffle" - - @dataclass class TunicOptions(PerGameCommonOptions): start_inventory_from_pool: StartInventoryPool - sword_progression: SwordProgression start_with_sword: StartWithSword keys_behind_bosses: KeysBehindBosses @@ -386,6 +375,8 @@ class TunicOptions(PerGameCommonOptions): hexagon_quest_ability_type: HexagonQuestAbilityUnlockType shuffle_ladders: ShuffleLadders + shuffle_fuses: ShuffleFuses + shuffle_bells: ShuffleBells grass_randomizer: GrassRandomizer breakable_shuffle: BreakableShuffle local_fill: LocalFill @@ -393,7 +384,6 @@ class TunicOptions(PerGameCommonOptions): entrance_rando: EntranceRando entrance_layout: EntranceLayout decoupled: Decoupled - plando_connections: TunicPlandoConnections combat_logic: CombatLogic lanternless: Lanternless @@ -402,11 +392,13 @@ class TunicOptions(PerGameCommonOptions): ice_grappling: IceGrappling ladder_storage: LadderStorage ladder_storage_without_items: LadderStorageWithoutItems - + + plando_connections: TunicPlandoConnections + all_random: HiddenAllRandom - fixed_shop: FixedShop # will be removed at a later date - logic_rules: Removed # fully removed in the direction pairs update + fixed_shop: Removed + logic_rules: Removed tunic_option_groups = [ @@ -433,7 +425,7 @@ tunic_option_groups = [ ]), ] -tunic_option_presets: Dict[str, Dict[str, Any]] = { +tunic_option_presets: dict[str, dict[str, Any]] = { "Sync": { "ability_shuffling": True, }, @@ -460,14 +452,16 @@ tunic_option_presets: Dict[str, Dict[str, Any]] = { def check_options(world: "TunicWorld"): options = world.options - if options.hexagon_quest and options.ability_shuffling and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: + if (options.hexagon_quest and options.ability_shuffling + and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons): total_hexes = get_hexagons_in_pool(world) min_hexes = 3 if options.keys_behind_bosses: min_hexes = 15 if total_hexes < min_hexes: - logging.warning(f"TUNIC: Not enough Gold Hexagons in {world.player_name}'s item pool for Hexagon Ability Shuffle with the selected options. Ability Shuffle mode will be switched to Pages.") + logging.warning(f"TUNIC: Not enough Gold Hexagons in {world.player_name}'s item pool for Hexagon Ability " + "Shuffle with the selected options. Ability Shuffle mode will be switched to Pages.") options.hexagon_quest_ability_type.value = HexagonQuestAbilityUnlockType.option_pages @@ -475,4 +469,4 @@ def get_hexagons_in_pool(world: "TunicWorld"): # Calculate number of hexagons in item pool options = world.options return min(int((Decimal(100 + options.extra_hexagon_percentage) / 100 * options.hexagon_goal) - .to_integral_value(rounding=ROUND_HALF_UP)), 100) + .to_integral_value(rounding=ROUND_HALF_UP)), 100) diff --git a/worlds/tunic/regions.py b/worlds/tunic/regions.py deleted file mode 100644 index f21af11ee4..0000000000 --- a/worlds/tunic/regions.py +++ /dev/null @@ -1,25 +0,0 @@ -tunic_regions: dict[str, tuple[str]] = { - "Menu": ("Overworld",), - "Overworld": ("Overworld Holy Cross", "East Forest", "Dark Tomb", "Beneath the Well", "West Garden", - "Ruined Atoll", "Eastern Vault Fortress", "Beneath the Vault", "Quarry Back", "Quarry", "Swamp", - "Spirit Arena"), - "Overworld Holy Cross": tuple(), - "East Forest": tuple(), - "Dark Tomb": ("West Garden",), - "Beneath the Well": tuple(), - "West Garden": tuple(), - "Ruined Atoll": ("Frog's Domain", "Library"), - "Frog's Domain": tuple(), - "Library": tuple(), - "Eastern Vault Fortress": ("Beneath the Vault",), - "Beneath the Vault": ("Eastern Vault Fortress",), - "Quarry Back": ("Quarry", "Monastery"), - "Quarry": ("Monastery", "Lower Quarry"), - "Monastery": ("Monastery Back",), - "Monastery Back": tuple(), - "Lower Quarry": ("Rooted Ziggurat",), - "Rooted Ziggurat": tuple(), - "Swamp": ("Cathedral",), - "Cathedral": tuple(), - "Spirit Arena": tuple() -} diff --git a/worlds/tunic/rules.py b/worlds/tunic/rules.py deleted file mode 100644 index 52d5c42e51..0000000000 --- a/worlds/tunic/rules.py +++ /dev/null @@ -1,402 +0,0 @@ -from typing import Dict, TYPE_CHECKING - -from worlds.generic.Rules import set_rule, forbid_item, add_rule -from BaseClasses import CollectionState -from .options import LadderStorage, IceGrappling, HexagonQuestAbilityUnlockType -if TYPE_CHECKING: - from . import TunicWorld - -laurels = "Hero's Laurels" -grapple = "Magic Orb" -ice_dagger = "Magic Dagger" -fire_wand = "Magic Wand" -gun = "Gun" -lantern = "Lantern" -fairies = "Fairy" -coins = "Golden Coin" -prayer = "Pages 24-25 (Prayer)" -holy_cross = "Pages 42-43 (Holy Cross)" -icebolt = "Pages 52-53 (Icebolt)" -shield = "Shield" -key = "Key" -house_key = "Old House Key" -vault_key = "Fortress Vault Key" -mask = "Scavenger Mask" -red_hexagon = "Red Questagon" -green_hexagon = "Green Questagon" -blue_hexagon = "Blue Questagon" -gold_hexagon = "Gold Questagon" - -# "Quarry - [East] Bombable Wall" is excluded from this list since it has slightly different rules -bomb_walls = ["East Forest - Bombable Wall", "Eastern Vault Fortress - [East Wing] Bombable Wall", - "Overworld - [Central] Bombable Wall", "Overworld - [Southwest] Bombable Wall Near Fountain", - "Quarry - [West] Upper Area Bombable Wall", "Ruined Atoll - [Northwest] Bombable Wall"] - - -def randomize_ability_unlocks(world: "TunicWorld") -> Dict[str, int]: - random = world.random - options = world.options - - abilities = [prayer, holy_cross, icebolt] - ability_requirement = [1, 1, 1] - random.shuffle(abilities) - - if options.hexagon_quest.value and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: - hexagon_goal = options.hexagon_goal.value - # Set ability unlocks to 25, 50, and 75% of goal amount - ability_requirement = [hexagon_goal // 4, hexagon_goal // 2, hexagon_goal * 3 // 4] - if any(req == 0 for req in ability_requirement): - ability_requirement = [1, 2, 3] - - return dict(zip(abilities, ability_requirement)) - - -def has_ability(ability: str, state: CollectionState, world: "TunicWorld") -> bool: - options = world.options - ability_unlocks = world.ability_unlocks - if not options.ability_shuffling: - return True - if options.hexagon_quest and options.hexagon_quest_ability_type == HexagonQuestAbilityUnlockType.option_hexagons: - return state.has(gold_hexagon, world.player, ability_unlocks[ability]) - return state.has(ability, world.player) - - -# a check to see if you can whack things in melee at all -def has_melee(state: CollectionState, player: int) -> bool: - return state.has_any({"Stick", "Sword", "Sword Upgrade"}, player) - - -def has_sword(state: CollectionState, player: int) -> bool: - return state.has("Sword", player) or state.has("Sword Upgrade", player, 2) - - -def laurels_zip(state: CollectionState, world: "TunicWorld") -> bool: - return world.options.laurels_zips and state.has(laurels, world.player) - - -def has_ice_grapple_logic(long_range: bool, difficulty: IceGrappling, state: CollectionState, world: "TunicWorld") -> bool: - if world.options.ice_grappling < difficulty: - return False - if not long_range: - return state.has_all({ice_dagger, grapple}, world.player) - else: - return state.has_all({ice_dagger, fire_wand, grapple}, world.player) and has_ability(icebolt, state, world) - - -def can_ladder_storage(state: CollectionState, world: "TunicWorld") -> bool: - if not world.options.ladder_storage: - return False - if world.options.ladder_storage_without_items: - return True - return has_melee(state, world.player) or state.has_any((grapple, shield), world.player) - - -def has_mask(state: CollectionState, world: "TunicWorld") -> bool: - return world.options.maskless or state.has(mask, world.player) - - -def has_lantern(state: CollectionState, world: "TunicWorld") -> bool: - return world.options.lanternless or state.has(lantern, world.player) - - -def set_region_rules(world: "TunicWorld") -> None: - player = world.player - options = world.options - - world.get_entrance("Overworld -> Overworld Holy Cross").access_rule = \ - lambda state: has_ability(holy_cross, state, world) - world.get_entrance("Overworld -> Beneath the Well").access_rule = \ - lambda state: has_melee(state, player) or state.has(fire_wand, player) - world.get_entrance("Overworld -> Dark Tomb").access_rule = \ - lambda state: has_lantern(state, world) - # laurels in, ladder storage in through the furnace, or ice grapple down the belltower - world.get_entrance("Overworld -> West Garden").access_rule = \ - lambda state: (state.has(laurels, player) - or can_ladder_storage(state, world) - or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - world.get_entrance("Overworld -> Eastern Vault Fortress").access_rule = \ - lambda state: state.has(laurels, player) \ - or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world) \ - or can_ladder_storage(state, world) - # using laurels or ls to get in is covered by the -> Eastern Vault Fortress rules - world.get_entrance("Overworld -> Beneath the Vault").access_rule = \ - lambda state: (has_lantern(state, world) and has_ability(prayer, state, world) - # there's some boxes in the way - and (has_melee(state, player) or state.has_any((gun, grapple, fire_wand), player))) - world.get_entrance("Ruined Atoll -> Library").access_rule = \ - lambda state: (state.has_any({grapple, laurels}, player) and has_ability(prayer, state, world) - and (has_sword(state, player) or state.has_any((fire_wand, gun), player))) - world.get_entrance("Overworld -> Quarry").access_rule = \ - lambda state: (has_sword(state, player) or state.has(fire_wand, player)) \ - and (state.has_any({grapple, laurels, gun}, player) or can_ladder_storage(state, world)) - world.get_entrance("Quarry Back -> Quarry").access_rule = \ - lambda state: has_sword(state, player) or state.has(fire_wand, player) - world.get_entrance("Quarry Back -> Monastery").access_rule = \ - lambda state: state.has(laurels, player) - world.get_entrance("Monastery -> Monastery Back").access_rule = \ - lambda state: (has_sword(state, player) or state.has(fire_wand, player) - or laurels_zip(state, world)) - world.get_entrance("Quarry -> Lower Quarry").access_rule = \ - lambda state: has_mask(state, world) - world.get_entrance("Lower Quarry -> Rooted Ziggurat").access_rule = \ - lambda state: state.has(grapple, player) and has_ability(prayer, state, world) - world.get_entrance("Swamp -> Cathedral").access_rule = \ - lambda state: (state.has(laurels, player) and has_ability(prayer, state, world) and has_sword(state, player)) \ - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - world.get_entrance("Overworld -> Spirit Arena").access_rule = \ - lambda state: ((state.has(gold_hexagon, player, options.hexagon_goal.value) if options.hexagon_quest.value - else state.has_all({red_hexagon, green_hexagon, blue_hexagon}, player) - and state.has_group_unique("Hero Relics", player, 6)) - and has_ability(prayer, state, world) and has_sword(state, player) - and state.has_any({lantern, laurels}, player)) - - world.get_region("Quarry").connect(world.get_region("Rooted Ziggurat"), - rule=lambda state: has_ice_grapple_logic(True, IceGrappling.option_hard, state, world) - and has_ability(prayer, state, world)) - - if options.ladder_storage >= LadderStorage.option_medium: - # ls at any ladder in a safe spot in quarry to get to the monastery rope entrance - add_rule(world.get_entrance(entrance_name="Quarry Back -> Monastery"), - rule=lambda state: can_ladder_storage(state, world)) - - -def set_location_rules(world: "TunicWorld") -> None: - player = world.player - - forbid_item(world.get_location("Secret Gathering Place - 20 Fairy Reward"), fairies, player) - - # Ability Shuffle Exclusive Rules - set_rule(world.get_location("Far Shore - Page Pickup"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("Fortress Courtyard - Chest Near Cave"), - lambda state: has_ability(prayer, state, world) - or state.has(laurels, player) - or can_ladder_storage(state, world) - or (has_ice_grapple_logic(True, IceGrappling.option_easy, state, world) - and has_lantern(state, world))) - set_rule(world.get_location("Fortress Courtyard - Page Near Cave"), - lambda state: has_ability(prayer, state, world) or state.has(laurels, player) - or can_ladder_storage(state, world) - or (has_ice_grapple_logic(True, IceGrappling.option_easy, state, world) - and has_lantern(state, world))) - set_rule(world.get_location("East Forest - Dancing Fox Spirit Holy Cross"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Forest Grave Path - Holy Cross Code by Grave"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("East Forest - Golden Obelisk Holy Cross"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Beneath the Well - [Powered Secret Room] Chest"), - lambda state: has_ability(prayer, state, world)) - set_rule(world.get_location("West Garden - [North] Behind Holy Cross Door"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Library Hall - Holy Cross Chest"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Eastern Vault Fortress - [West Wing] Candles Holy Cross"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("West Garden - [Central Highlands] Holy Cross (Blue Lines)"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Quarry - [Back Entrance] Bushes Holy Cross"), - lambda state: has_ability(holy_cross, state, world)) - set_rule(world.get_location("Cathedral - Secret Legend Trophy Chest"), - lambda state: has_ability(holy_cross, state, world)) - - # Overworld - set_rule(world.get_location("Overworld - [Southwest] Fountain Page"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Overworld - [Southwest] Grapple Chest Over Walkway"), - lambda state: state.has_any({grapple, laurels}, player)) - set_rule(world.get_location("Overworld - [Southwest] West Beach Guarded By Turret 2"), - lambda state: state.has_any({grapple, laurels}, player)) - set_rule(world.get_location("Far Shore - Secret Chest"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Overworld - [Southeast] Page on Pillar by Swamp"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Old House - Normal Chest"), - lambda state: state.has(house_key, player) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - or laurels_zip(state, world)) - set_rule(world.get_location("Old House - Holy Cross Chest"), - lambda state: has_ability(holy_cross, state, world) and ( - state.has(house_key, player) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - or laurels_zip(state, world))) - set_rule(world.get_location("Old House - Shield Pickup"), - lambda state: state.has(house_key, player) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world) - or laurels_zip(state, world)) - set_rule(world.get_location("Overworld - [Northwest] Page on Pillar by Dark Tomb"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Overworld - [Southwest] From West Garden"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Overworld - [West] Chest After Bell"), - lambda state: state.has(laurels, player) - or (has_lantern(state, world) and has_sword(state, player)) - or can_ladder_storage(state, world)) - set_rule(world.get_location("Overworld - [Northwest] Chest Beneath Quarry Gate"), - lambda state: state.has_any({grapple, laurels}, player)) - set_rule(world.get_location("Overworld - [East] Grapple Chest"), - lambda state: state.has(grapple, player)) - set_rule(world.get_location("Special Shop - Secret Page Pickup"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Sealed Temple - Holy Cross Chest"), - lambda state: has_ability(holy_cross, state, world) - and (state.has(laurels, player) or (has_lantern(state, world) and (has_sword(state, player) - or state.has(fire_wand, player))) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world))) - set_rule(world.get_location("Sealed Temple - Page Pickup"), - lambda state: state.has(laurels, player) - or (has_lantern(state, world) and (has_sword(state, player) or state.has(fire_wand, player))) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - set_rule(world.get_location("West Furnace - Lantern Pickup"), - lambda state: has_melee(state, player) or state.has_any({fire_wand, laurels}, player)) - - set_rule(world.get_location("Secret Gathering Place - 10 Fairy Reward"), - lambda state: state.has(fairies, player, 10)) - set_rule(world.get_location("Secret Gathering Place - 20 Fairy Reward"), - lambda state: state.has(fairies, player, 20)) - set_rule(world.get_location("Coins in the Well - 3 Coins"), - lambda state: state.has(coins, player, 3)) - set_rule(world.get_location("Coins in the Well - 6 Coins"), - lambda state: state.has(coins, player, 6)) - set_rule(world.get_location("Coins in the Well - 10 Coins"), - lambda state: state.has(coins, player, 10)) - set_rule(world.get_location("Coins in the Well - 15 Coins"), - lambda state: state.has(coins, player, 15)) - - # East Forest - set_rule(world.get_location("East Forest - Lower Grapple Chest"), - lambda state: state.has(grapple, player)) - set_rule(world.get_location("East Forest - Lower Dash Chest"), - lambda state: state.has_all({grapple, laurels}, player)) - set_rule(world.get_location("East Forest - Ice Rod Grapple Chest"), - lambda state: state.has_all({grapple, ice_dagger, fire_wand}, player) - and has_ability(icebolt, state, world)) - - # West Garden - set_rule(world.get_location("West Garden - [North] Across From Page Pickup"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("West Garden - [West] In Flooded Walkway"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("West Garden - [West Lowlands] Tree Holy Cross Chest"), - lambda state: state.has(laurels, player) and has_ability(holy_cross, state, world)) - set_rule(world.get_location("West Garden - [East Lowlands] Page Behind Ice Dagger House"), - lambda state: (state.has(laurels, player) and has_ability(prayer, state, world)) - or has_ice_grapple_logic(True, IceGrappling.option_easy, state, world)) - set_rule(world.get_location("West Garden - [Central Lowlands] Below Left Walkway"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("West Garden - [Central Highlands] After Garden Knight"), - lambda state: state.has(laurels, player) - or (has_lantern(state, world) and has_sword(state, player)) - or can_ladder_storage(state, world)) - - # Ruined Atoll - set_rule(world.get_location("Ruined Atoll - [West] Near Kevin Block"), - lambda state: state.has(laurels, player)) - # ice grapple push a crab through the door - set_rule(world.get_location("Ruined Atoll - [East] Locked Room Lower Chest"), - lambda state: state.has(laurels, player) or state.has(key, player, 2) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - set_rule(world.get_location("Ruined Atoll - [East] Locked Room Upper Chest"), - lambda state: state.has(laurels, player) or state.has(key, player, 2) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world)) - set_rule(world.get_location("Librarian - Hexagon Green"), - lambda state: has_sword(state, player)) - - # Frog's Domain - set_rule(world.get_location("Frog's Domain - Side Room Grapple Secret"), - lambda state: state.has_any({grapple, laurels}, player)) - set_rule(world.get_location("Frog's Domain - Grapple Above Hot Tub"), - lambda state: state.has_any({grapple, laurels}, player)) - set_rule(world.get_location("Frog's Domain - Escape Chest"), - lambda state: state.has_any({grapple, laurels}, player)) - - # Library Lab - set_rule(world.get_location("Library Lab - Page 1"), - lambda state: has_melee(state, player) or state.has_any((fire_wand, gun), player)) - set_rule(world.get_location("Library Lab - Page 2"), - lambda state: has_melee(state, player) or state.has_any((fire_wand, gun), player)) - set_rule(world.get_location("Library Lab - Page 3"), - lambda state: has_melee(state, player) or state.has_any((fire_wand, gun), player)) - - # Eastern Vault Fortress - # yes, you can clear the leaves with dagger - # gun isn't included since it can only break one leaf pile at a time, and we don't check how much mana you have - # but really, I expect the player to just throw a bomb at them if they don't have melee - set_rule(world.get_location("Fortress Leaf Piles - Secret Chest"), - lambda state: state.has(laurels, player) and (has_melee(state, player) or state.has(ice_dagger, player))) - set_rule(world.get_location("Fortress Arena - Siege Engine/Vault Key Pickup"), - lambda state: has_sword(state, player) - and (has_ability(prayer, state, world) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world))) - set_rule(world.get_location("Fortress Arena - Hexagon Red"), - lambda state: state.has(vault_key, player) - and (has_ability(prayer, state, world) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world))) - - # Beneath the Vault - set_rule(world.get_location("Beneath the Fortress - Bridge"), - lambda state: has_lantern(state, world) and - (has_melee(state, player) or state.has_any((laurels, fire_wand, ice_dagger, gun), player))) - set_rule(world.get_location("Beneath the Fortress - Obscured Behind Waterfall"), - lambda state: has_melee(state, player) and has_lantern(state, world)) - - # Quarry - set_rule(world.get_location("Quarry - [Central] Above Ladder Dash Chest"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Rooted Ziggurat Upper - Near Bridge Switch"), - lambda state: has_sword(state, player) or state.has_all({fire_wand, laurels}, player)) - set_rule(world.get_location("Rooted Ziggurat Lower - Hexagon Blue"), - lambda state: has_sword(state, player)) - - # Swamp - set_rule(world.get_location("Cathedral Gauntlet - Gauntlet Reward"), - lambda state: (state.has(fire_wand, player) and has_sword(state, player)) - and (state.has(laurels, player) - or has_ice_grapple_logic(False, IceGrappling.option_medium, state, world))) - set_rule(world.get_location("Swamp - [Entrance] Above Entryway"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Swamp - [South Graveyard] Upper Walkway Dash Chest"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Swamp - [Outside Cathedral] Obscured Behind Memorial"), - lambda state: state.has(laurels, player)) - set_rule(world.get_location("Swamp - [South Graveyard] 4 Orange Skulls"), - lambda state: has_sword(state, player)) - - # Hero's Grave - set_rule(world.get_location("Hero's Grave - Tooth Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Hero's Grave - Mushroom Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Hero's Grave - Ash Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Hero's Grave - Flowers Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Hero's Grave - Effigy Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - set_rule(world.get_location("Hero's Grave - Feathers Relic"), - lambda state: state.has(laurels, player) and has_ability(prayer, state, world)) - - # Bombable Walls - for location_name in bomb_walls: - # has_sword is there because you can buy bombs in the shop - set_rule(world.get_location(location_name), - lambda state: state.has(gun, player) - or has_sword(state, player) - or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - add_rule(world.get_location("Cube Cave - Holy Cross Chest"), - lambda state: state.has(gun, player) - or has_sword(state, player) - or has_ice_grapple_logic(False, IceGrappling.option_hard, state, world)) - # can't ice grapple to this one, not enough space - set_rule(world.get_location("Quarry - [East] Bombable Wall"), - lambda state: state.has(gun, player) or has_sword(state, player)) - - # Shop - set_rule(world.get_location("Shop - Potion 1"), - lambda state: has_sword(state, player)) - set_rule(world.get_location("Shop - Potion 2"), - lambda state: has_sword(state, player)) - set_rule(world.get_location("Shop - Coin 1"), - lambda state: has_sword(state, player)) - set_rule(world.get_location("Shop - Coin 2"), - lambda state: has_sword(state, player)) diff --git a/worlds/tunic/test/__init__.py b/worlds/tunic/test/__init__.py index d0b68955c5..e69de29bb2 100644 --- a/worlds/tunic/test/__init__.py +++ b/worlds/tunic/test/__init__.py @@ -1,6 +0,0 @@ -from test.bases import WorldTestBase - - -class TunicTestBase(WorldTestBase): - game = "TUNIC" - player = 1 diff --git a/worlds/tunic/test/bases.py b/worlds/tunic/test/bases.py new file mode 100644 index 0000000000..0e51bcd013 --- /dev/null +++ b/worlds/tunic/test/bases.py @@ -0,0 +1,5 @@ +from test.bases import WorldTestBase + + +class TunicTestBase(WorldTestBase): + game = "TUNIC" diff --git a/worlds/tunic/test/test_access.py b/worlds/tunic/test/test_access.py index 6a26180cf0..6cafae1743 100644 --- a/worlds/tunic/test/test_access.py +++ b/worlds/tunic/test/test_access.py @@ -1,17 +1,10 @@ -from . import TunicTestBase from .. import options +from .bases import TunicTestBase -class TestAccess(TunicTestBase): +class TestWells(TunicTestBase): options = {options.CombatLogic.internal_name: options.CombatLogic.option_off} - # test whether you can get into the temple without laurels - def test_temple_access(self) -> None: - self.collect_all_but(["Hero's Laurels", "Lantern"]) - self.assertFalse(self.can_reach_location("Sealed Temple - Page Pickup")) - self.collect_by_name(["Lantern"]) - self.assertTrue(self.can_reach_location("Sealed Temple - Page Pickup")) - # test that the wells function properly. Since fairies is written the same way, that should succeed too def test_wells(self) -> None: self.collect_all_but(["Golden Coin"]) @@ -50,22 +43,12 @@ class TestHexQuestNoShuffle(TunicTestBase): self.assertTrue(self.can_reach_location("Fountain Cross Door - Page Pickup")) -class TestNormalGoal(TunicTestBase): - options = {options.HexagonQuest.internal_name: options.HexagonQuest.option_false} - - # test that you need the three colored hexes to reach the Heir in standard - def test_normal_goal(self) -> None: - location = ["The Heir"] - items = [["Red Questagon", "Blue Questagon", "Green Questagon"]] - self.assertAccessDependency(location, items) - - class TestER(TunicTestBase): options = {options.EntranceRando.internal_name: options.EntranceRando.option_yes, options.AbilityShuffling.internal_name: options.AbilityShuffling.option_true, options.HexagonQuest.internal_name: options.HexagonQuest.option_false, options.CombatLogic.internal_name: options.CombatLogic.option_off, - options.FixedShop.internal_name: options.FixedShop.option_true} + options.EntranceLayout.internal_name: options.EntranceLayout.option_fixed_shop} def test_overworld_hc_chest(self) -> None: # test to see that static connections are working properly -- this chest requires holy cross and is in Overworld @@ -99,7 +82,7 @@ class TestLadderStorage(TunicTestBase): options = {options.EntranceRando.internal_name: options.EntranceRando.option_yes, options.AbilityShuffling.internal_name: options.AbilityShuffling.option_true, options.HexagonQuest.internal_name: options.HexagonQuest.option_false, - options.FixedShop.internal_name: options.FixedShop.option_false, + options.EntranceLayout.internal_name: options.EntranceLayout.option_standard, options.LadderStorage.internal_name: options.LadderStorage.option_hard, options.LadderStorageWithoutItems.internal_name: options.LadderStorageWithoutItems.option_false, "plando_connections": [ diff --git a/worlds/tunic/test/test_combat.py b/worlds/tunic/test/test_combat.py index c0e76ef92b..70324247df 100644 --- a/worlds/tunic/test/test_combat.py +++ b/worlds/tunic/test/test_combat.py @@ -1,17 +1,15 @@ from BaseClasses import ItemClassification from collections import Counter -from . import TunicTestBase -from .. import options +from .. import options, TunicWorld +from .bases import TunicTestBase from ..combat_logic import (check_combat_reqs, area_data, get_money_count, calc_effective_hp, get_potion_level, get_hp_level, get_def_level, get_sp_level, has_combat_reqs) from ..items import item_table -from .. import TunicWorld class TestCombat(TunicTestBase): options = {options.CombatLogic.internal_name: options.CombatLogic.option_on} - player = 1 world: TunicWorld combat_items = [] # these are items that are progression that do not contribute to combat logic diff --git a/worlds/tunic/ut_stuff.py b/worlds/tunic/ut_stuff.py new file mode 100644 index 0000000000..9096f037d8 --- /dev/null +++ b/worlds/tunic/ut_stuff.py @@ -0,0 +1,690 @@ +from typing import Any, TYPE_CHECKING + +from .options import EntranceLayout, LaurelsLocation + +if TYPE_CHECKING: + from . import TunicWorld + + +def setup_options_from_slot_data(world: "TunicWorld") -> None: + if hasattr(world.multiworld, "re_gen_passthrough"): + if "TUNIC" in world.multiworld.re_gen_passthrough: + world.using_ut = True + world.passthrough = world.multiworld.re_gen_passthrough["TUNIC"] + world.options.start_with_sword.value = world.passthrough["start_with_sword"] + world.options.keys_behind_bosses.value = world.passthrough["keys_behind_bosses"] + world.options.sword_progression.value = world.passthrough["sword_progression"] + world.options.ability_shuffling.value = world.passthrough["ability_shuffling"] + world.options.laurels_zips.value = world.passthrough["laurels_zips"] + world.options.ice_grappling.value = world.passthrough["ice_grappling"] + world.options.ladder_storage.value = world.passthrough["ladder_storage"] + world.options.ladder_storage_without_items = world.passthrough["ladder_storage_without_items"] + world.options.lanternless.value = world.passthrough["lanternless"] + world.options.maskless.value = world.passthrough["maskless"] + world.options.hexagon_quest.value = world.passthrough["hexagon_quest"] + world.options.hexagon_quest_ability_type.value = world.passthrough.get("hexagon_quest_ability_type", 0) + world.options.entrance_rando.value = world.passthrough["entrance_rando"] + world.options.shuffle_ladders.value = world.passthrough["shuffle_ladders"] + world.options.shuffle_fuses.value = world.passthrough.get("shuffle_fuses", 0) + world.options.shuffle_bells.value = world.passthrough.get("shuffle_bells", 0) + world.options.grass_randomizer.value = world.passthrough.get("grass_randomizer", 0) + world.options.breakable_shuffle.value = world.passthrough.get("breakable_shuffle", 0) + world.options.entrance_layout.value = EntranceLayout.option_standard + if ("ziggurat2020_3, ziggurat2020_1_zig2_skip" in world.passthrough["Entrance Rando"].keys() + or "ziggurat2020_3, ziggurat2020_1_zig2_skip" in world.passthrough["Entrance Rando"].values()): + world.options.entrance_layout.value = EntranceLayout.option_fixed_shop + world.options.decoupled = world.passthrough.get("decoupled", 0) + world.options.laurels_location.value = LaurelsLocation.option_anywhere + world.options.combat_logic.value = world.passthrough.get("combat_logic", 0) + else: + world.using_ut = False + else: + world.using_ut = False + + +# for UT poptracker integration map tab switching +def map_page_index(data: Any) -> int: + mapping: dict[str, int] = { + "Beneath the Earth": 1, + "Beneath the Well": 2, + "The Cathedral": 3, + "Dark Tomb": 4, + "Eastern Vault": 5, + "Frog's Domain": 6, + "Swamp": 7, + "Overworld": 8, + "The Quarry": 9, + "Ruined Atoll": 10, + "West Gardens": 11, + "The Grand Library": 12, + "East Forest": 13, + "The Far Shore": 14, + "The Rooted Ziggurat": 15, + } + return mapping.get(data, 0) + + +# mapping of everything after the second to last slash and the location id +# lua used for the name: string.match(full_name, "[^/]*/[^/]*$") +poptracker_data: dict[str, int] = { + "Library Lab Chest by Shrine 1/Chest": 509342493, + "Library Lab Chest by Shrine 3/Chest": 509342494, + "Library Lab by Fuse/Behind Chalkboard": 509342495, + "Library Lab Page 3/Page": 509342496, + "Library Lab Page 1/Page": 509342497, + "Library Lab Page 2/Page": 509342498, + "Hero's Grave/Mushroom Relic": 509342499, + "Mountain Door/Lower Mountain - Page Before Door": 509342500, + "Changing Room/Normal Chest": 509342501, + "Fortress Courtyard - Chest Near Cave/Next to the Obelisk": 509342502, + "Fortress Courtyard - Near Fuse/Pray": 509342503, + "Fortress Courtyard - Below Walkway/Under the Stairs": 509342504, + "Fortress Courtyard - Page Near Cave/Heir-To-The-Heir": 509342505, + "West Furnace/Lantern Pickup": 509342506, + "Maze Cave/Maze Room Chest": 509342507, + "Inside the Old House/Normal Chest": 509342508, + "Inside the Old House/Shield Pickup": 509342509, + "[West] Obscured Behind Windmill/Behind the Trees": 509342510, + "[South] Beach Chest/Beside the Bridge": 509342511, + "[West] Obscured Near Well/Hidden by Trees": 509342512, + "[Central] Bombable Wall/Let the flowers guide you": 509342513, + "[Northwest] Chest Near Turret/Mind the Autobolt...": 509342514, + "[East] Chest Near Pots/Chest": 509342515, + "[Northwest] Chest Near Golden Obelisk/Underneath the Staff": 509342516, + "[Southwest] South Chest Near Guard/End of the Bridge": 509342517, + "[Southwest] West Beach Guarded By Turret/Chest": 509342518, + "[Southwest] Chest Guarded By Turret/Behind the Trees": 509342519, + "[Northwest] Shadowy Corner Chest/Dark Ramps Chest": 509342520, + "[Southwest] Obscured In Tunnel To Beach/Deep in the Wall": 509342521, + "[Southwest] Obscured In Tunnel To Beach/Deep between the Trees": 509342521, + "[Southwest] Grapple Chest Over Walkway/Jeffry": 509342522, + "[Northwest] Chest Beneath Quarry Gate/Across the Bridge": 509342523, + "[Southeast] Chest Near Swamp/Under the Bridge": 509342524, + "[Southwest] From West Garden/Dash Across": 509342525, + "[East] Grapple Chest/Grapple Across": 509342526, + "[Southwest] West Beach Guarded By Turret 2/Get Across": 509342527, + "Sand Hook/[Southwest] Beach Chest Near Flowers": 509342528, + "[Southwest] Bombable Wall Near Fountain/Let the flowers guide you": 509342529, + "[West] Chest After Bell/Post-Dong!": 509342530, + "[Southwest] Tunnel Guarded By Turret/Below Jeffry": 509342531, + "[East] Between ladders near Ruined Passage/Chest": 509342532, + "[Northeast] Chest Above Patrol Cave/Behind Blue Rudelings": 509342533, + "[Southwest] Beach Chest Beneath Guard/Under Bridge": 509342534, + "[Central] Chest Across From Well/Across the Bridge": 509342535, + "[Northwest] Chest Near Quarry Gate/Rudeling Camp": 509342536, + "[East] Chest In Trees/Above Locked House": 509342537, + "[West] Chest Behind Moss Wall/Around the Corner": 509342538, + "[South] Beach Page/Page": 509342539, + "[Southeast] Page on Pillar by Swamp/Dash Across": 509342540, + "[Southwest] Key Pickup/Old House Key": 509342541, + "[West] Key Pickup/Hero's Path Key": 509342542, + "[East] Page Near Secret Shop/Page": 509342543, + "Fountain/[Southwest] Fountain Page": 509342544, + "[Northwest] Page on Pillar by Dark Tomb/A Terrible Power Rises": 509342545, + "Magic Staff/[Northwest] Fire Wand Pickup": 509342546, + "[West] Page on Teleporter/Treasures and Tools": 509342547, + "[Northwest] Page By Well/If you seek to increase your power...": 509342548, + "Patrol Cave/Normal Chest": 509342549, + "Ruined Shop/Chest 1": 509342550, + "Ruined Shop/Chest 2": 509342551, + "Ruined Shop/Chest 3": 509342552, + "Ruined Passage/Page Pickup": 509342553, + "Shop/Potion 1": 509342554, + "Shop/Potion 2": 509342555, + "Shop/Coin 1": 509342556, + "Shop/Coin 2": 509342557, + "Special Shop/Secret Page Pickup": 509342558, + "Stick House/Stick Chest": 509342559, + "Sealed Temple/Page Pickup": 509342560, + "Inside Hourglass Cave/Hourglass Chest": 509342561, + "Secret Chest/Dash Across": 509342562, + "Page Pickup/A Long, Long Time Ago...": 509342563, + "Coins in the Well/10 Coins": 509342564, + "Coins in the Well/15 Coins": 509342565, + "Coins in the Well/3 Coins": 509342566, + "Coins in the Well/6 Coins": 509342567, + "Secret Gathering Place/20 Fairy Reward": 509342568, + "Secret Gathering Place/10 Fairy Reward": 509342569, + "[West] Moss Wall Holy Cross/Use the Holy Cross": 509342570, + "[Southwest] Flowers Holy Cross/Use the Holy Cross": 509342571, + "Fountain/[Southwest] Fountain Holy Cross": 509342572, + "[Northeast] Flowers Holy Cross/Use the Holy Cross": 509342573, + "[East] Weathervane Holy Cross/Use the Holy Cross": 509342574, + "[West] Windmill Holy Cross/Sacred Geometry": 509342575, + "Sand Hook/[Southwest] Haiku Holy Cross": 509342576, + "[West] Windchimes Holy Cross/Power Up!": 509342577, + "[South] Starting Platform Holy Cross/Back to Work": 509342578, + "Magic Staff/[Northwest] Golden Obelisk Page": 509342579, + "Inside the Old House/Holy Cross Door Page": 509342580, + "Cube Cave/Holy Cross Chest": 509342581, + "Southeast Cross Door/Chest 3": 509342582, + "Southeast Cross Door/Chest 2": 509342583, + "Southeast Cross Door/Chest 1": 509342584, + "Maze Cave/Maze Room Holy Cross": 509342585, + "Caustic Light Cave/Holy Cross Chest": 509342586, + "Inside the Old House/Holy Cross Chest": 509342587, + "Patrol Cave/Holy Cross Chest": 509342588, + "Ruined Passage/Holy Cross Chest": 509342589, + "Inside Hourglass Cave/Holy Cross Chest": 509342590, + "Sealed Temple/Holy Cross Chest": 509342591, + "Fountain Cross Door/Page Pickup": 509342592, + "Secret Gathering Place/Holy Cross Chest": 509342593, + "Mountain Door/Top of the Mountain - Page At The Peak": 509342594, + "Monastery/Monastery Chest": 509342595, + "[Back Entrance] Bushes Holy Cross/Use the Holy Cross": 509342596, + "[Back Entrance] Chest/Peaceful Chest": 509342597, + "[Central] Near Shortcut Ladder/By the Boxes": 509342598, + "[East] Near Telescope/Spoopy": 509342599, + "[East] Upper Floor/Reminds me of Blighttown": 509342600, + "[Central] Below Entry Walkway/Even more Stairs!": 509342601, + "[East] Obscured Near Winding Staircase/At the Bottom": 509342602, + "[East] Obscured Beneath Scaffolding/In the Miasma Mound": 509342603, + "[East] Obscured Near Telescope/Weird path?": 509342604, + "[Back Entrance] Obscured Behind Wall/Happy Water!": 509342605, + "[Central] Obscured Below Entry Walkway/Down the Stairs": 509342606, + "[Central] Top Floor Overhang/End of the ruined bridge": 509342607, + "[East] Near Bridge/Drop that Bridge!": 509342608, + "[Central] Above Ladder/Climb Ladder": 509342609, + "[Central] Obscured Behind Staircase/At the Bottom": 509342610, + "[Central] Above Ladder Dash Chest/Dash Across": 509342611, + "[West] Upper Area Bombable Wall/Boomy": 509342612, + "[East] Bombable Wall/Flowers Guide Thee": 509342613, + "Monastery/Hero's Grave - Ash Relic": 509342614, + "[West] Shooting Range Secret Path/Obscured Path": 509342615, + "[West] Near Shooting Range/End of bridge": 509342616, + "[West] Below Shooting Range/Clever little sneak!": 509342617, + "[Lowlands] Below Broken Ladder/Miasma Pits": 509342618, + "[West] Upper Area Near Waterfall/Yummy Polygons": 509342619, + "[Lowlands] Upper Walkway/Hate them Snipers": 509342620, + "[West] Lower Area Below Bridge/Go Around": 509342621, + "[West] Lower Area Isolated Chest/Burn Pots": 509342622, + "[Lowlands] Near Elevator/End of the Tracks": 509342623, + "[West] Lower Area After Bridge/Drop that Bridge!": 509342624, + "Upper - Near Bridge Switch/You can shoot it": 509342625, + "Upper - Beneath Bridge To Administrator/End of the First Floor": 509342626, + "Tower - Inside Tower/I'm Scared": 509342627, + "Lower - Near Corpses/They are Dead": 509342628, + "Lower - Spider Ambush/Use the Gun": 509342629, + "Lower - Left Of Checkpoint Before Fuse/Moment of Reprieve": 509342630, + "Lower - After Guarded Fuse/Defeat those Mechs": 509342631, + "Lower - Guarded By Double Turrets/Help": 509342632, + "Lower - After 2nd Double Turret Chest/Haircut Time!": 509342633, + "Lower - Guarded By Double Turrets 2/Oh god they're everywhere": 509342634, + "Lower - Hexagon Blue/Scavenger Queen": 509342635, + "[West] Near Kevin Block/Phonomath": 509342636, + "[South] Upper Floor On Power Line/Hidden Ladder Chest": 509342637, + "[South] Chest Near Big Crabs/His Name is Tom": 509342638, + "[North] Guarded By Bird/Skraw!": 509342639, + "[Northeast] Chest Beneath Brick Walkway/Mind the Crabbits": 509342640, + "[Northwest] Bombable Wall/Flowers Guide Thee": 509342641, + "[North] Obscured Beneath Bridge/In the shallow water": 509342642, + "[South] Upper Floor On Bricks/Up the Ladder": 509342643, + "[South] Near Birds/Danlarry and Thranmire ate Jerry!": 509342644, + "[Northwest] Behind Envoy/Mind the Fairies": 509342645, + "[Southwest] Obscured Behind Fuse/Saved by the Prayer": 509342646, + "Locked Brick House/[East] Locked Room Upper Chest": 509342647, + "[North] From Lower Overworld Entrance/Come from the Overworld": 509342648, + "Locked Brick House/[East] Locked Room Lower Chest": 509342649, + "[Northeast] Chest On Brick Walkway/Near Domain": 509342650, + "[Southeast] Chest Near Fuse/Around the Tower": 509342651, + "[Northeast] Key Pickup/Around the Hill": 509342652, + "Cathedral Gauntlet/Gauntlet Reward": 509342653, + "Secret Legend Trophy Chest/You can use the Holy Cross from the outside": 509342654, + "[Upper Graveyard] Obscured Behind Hill/Between Two Hills": 509342655, + "[South Graveyard] 4 Orange Skulls/DJ Khaled - Let's go Golfing!": 509342656, + "[Central] Near Ramps Up/Up them Ramps": 509342657, + "[Upper Graveyard] Near Shield Fleemers/Alternatively, Before the Cathedral": 509342658, + "[South Graveyard] Obscured Behind Ridge/Hidden passage by ladder": 509342659, + "[South Graveyard] Obscured Beneath Telescope/Through the Nook": 509342660, + "[Entrance] Above Entryway/Dash Across": 509342661, + "[Central] South Secret Passage/Wall Man Approves these Vibes": 509342662, + "[South Graveyard] Upper Walkway On Pedestal/Gazing out over the Graves": 509342663, + "[South Graveyard] Guarded By Tentacles/Isolated Island": 509342664, + "[Upper Graveyard] Near Telescope/Overlooking the Graves": 509342665, + "[Outside Cathedral] Near Moonlight Bridge Door/Down the Hidden Ladder": 509342666, + "[Entrance] Obscured Inside Watchtower/Go Inside": 509342667, + "[Entrance] South Near Fence/DAGGER STRAP!!!!!": 509342668, + "[South Graveyard] Guarded By Big Skeleton/Super Clipping": 509342669, + "[South Graveyard] Chest Near Graves/The Rest of Our Entire Life is Death": 509342670, + "[Entrance] North Small Island/Mildly Hidden": 509342671, + "First Hero's Grave/[Outside Cathedral] Obscured Behind Memorial": 509342672, + "[Central] Obscured Behind Northern Mountain/Hug the Wall": 509342673, + "[South Graveyard] Upper Walkway Dash Chest/Around the Hill": 509342674, + "[South Graveyard] Above Big Skeleton/End of Ledge": 509342675, + "[Central] Beneath Memorial/Do You Even Live?": 509342676, + "First Hero's Grave/Hero's Grave - Feathers Relic": 509342677, + "West Furnace/Chest": 509342678, + "[West] Near Gardens Entrance/Effigy Skip": 509342679, + "[Central Highlands] Holy Cross (Blue Lines)/Use the Holy Cross": 509342680, + "[West Lowlands] Tree Holy Cross Chest/Use the Holy Cross": 509342681, + "[Southeast Lowlands] Outside Cave/Mind the Chompignoms!": 509342682, + "[Central Lowlands] Chest Beneath Faeries/As you walk by": 509342683, + "[North] Behind Holy Cross Door/Extra Sword!": 509342684, + "[Central Highlands] Top of Ladder Before Boss/Try to be This Strong": 509342685, + "[Central Lowlands] Passage Beneath Bridge/Take the lower path": 509342686, + "[North] Across From Page Pickup/I Love Fish!": 509342687, + "[Central Lowlands] Below Left Walkway/Dash Across": 509342688, + "[West] In Flooded Walkway/Dash through the water": 509342689, + "[West] Past Flooded Walkway/Through the Shallow Water": 509342690, + "[North] Obscured Beneath Hero's Memorial/Take the Long Way Around": 509342691, + "[Central Lowlands] Chest Near Shortcut Bridge/Between a Rope and a Bridge Place": 509342692, + "[West Highlands] Upper Left Walkway/By the Rudeling": 509342693, + "[Central Lowlands] Chest Beneath Save Point/Behind the Way": 509342694, + "[Central Highlands] Behind Guard Captain/Under Boss Ladder": 509342695, + "[Central Highlands] After Garden Knight/Did Not Kill You": 509342696, + "[South Highlands] Secret Chest Beneath Fuse/Pray to the Wall Man": 509342697, + "[East Lowlands] Page Behind Ice Dagger House/Come from the Far Shore": 509342698, + "[North] Page Pickup/Survival Tips": 509342699, + "[Southeast Lowlands] Ice Dagger Pickup/Ice Dagger Cave": 509342700, + "Hero's Grave/Effigy Relic": 509342701, + "[East] Bombable Wall/Break Bombable Wall": 509350705, + "[West] Upper Area Bombable Wall/Break Bombable Wall": 509350704, + "[East Wing] Bombable Wall/Break Bombable Wall": 509350703, + "Bombable Wall/Break Bombable Wall": 509350702, + "[Northwest] Bombable Wall/Break Bombable Wall": 509350701, + "[Southwest] Bombable Wall Near Fountain/Break Bombable Wall": 509350700, + "Cube Cave/Break Bombable Wall": 509350699, + "[Central] Bombable Wall/Break Bombable Wall": 509350698, + "Purgatory Pots/Pot 33": 509350697, + "Purgatory Pots/Pot 32": 509350696, + "Purgatory Pots/Pot 31": 509350695, + "Purgatory Pots/Pot 30": 509350694, + "Purgatory Pots/Pot 29": 509350693, + "Purgatory Pots/Pot 28": 509350692, + "Purgatory Pots/Pot 27": 509350691, + "Purgatory Pots/Pot 26": 509350690, + "Purgatory Pots/Pot 25": 509350689, + "Purgatory Pots/Pot 24": 509350688, + "Purgatory Pots/Pot 23": 509350687, + "Purgatory Pots/Pot 22": 509350686, + "Purgatory Pots/Pot 21": 509350685, + "Purgatory Pots/Pot 20": 509350684, + "Purgatory Pots/Pot 19": 509350683, + "Purgatory Pots/Pot 18": 509350682, + "Purgatory Pots/Pot 17": 509350681, + "Purgatory Pots/Pot 16": 509350680, + "Purgatory Pots/Pot 15": 509350679, + "Purgatory Pots/Pot 14": 509350678, + "Purgatory Pots/Pot 13": 509350677, + "Purgatory Pots/Pot 12": 509350676, + "Purgatory Pots/Pot 11": 509350675, + "Purgatory Pots/Pot 10": 509350674, + "Purgatory Pots/Pot 9": 509350673, + "Purgatory Pots/Pot 8": 509350672, + "Purgatory Pots/Pot 7": 509350671, + "Purgatory Pots/Pot 6": 509350670, + "Purgatory Pots/Pot 5": 509350669, + "Purgatory Pots/Pot 4": 509350668, + "Purgatory Pots/Pot 3": 509350667, + "Purgatory Pots/Pot 2": 509350666, + "Purgatory Pots/Pot 1": 509350665, + "[1F] Pots by Stairs/Pot 2": 509350664, + "[1F] Pots by Stairs/Pot 1": 509350663, + "Crates/Crate 9": 509350662, + "Crates/Crate 8": 509350661, + "Crates/Crate 7": 509350660, + "Crates/Crate 6": 509350659, + "Crates/Crate 5": 509350658, + "Crates/Crate 4": 509350657, + "Crates/Crate 3": 509350656, + "Crates/Crate 2": 509350655, + "Crates/Crate 1": 509350654, + "[Lowlands] Crates/Crate 2": 509350653, + "[Lowlands] Crates/Crate 1": 509350652, + "[West] Near Isolated Chest/Crate 5": 509350651, + "[West] Near Isolated Chest/Crate 4": 509350650, + "[West] Near Isolated Chest/Crate 3": 509350649, + "[West] Near Isolated Chest/Crate 2": 509350648, + "[West] Near Isolated Chest/Crate 1": 509350647, + "[West] Crates by Shooting Range/Crate 5": 509350646, + "[West] Crates by Shooting Range/Crate 4": 509350645, + "[West] Crates by Shooting Range/Crate 3": 509350644, + "[West] Crates by Shooting Range/Crate 2": 509350643, + "[West] Crates by Shooting Range/Crate 1": 509350642, + "[West] Near Isolated Chest/Explosive Pot 2": 509350641, + "[West] Near Isolated Chest/Explosive Pot 1": 509350640, + "[West] Explosive Pot above Shooting Range/Explosive Pot": 509350639, + "[West] Explosive Pots near Bombable Wall/Explosive Pot 2": 509350638, + "[West] Explosive Pots near Bombable Wall/Explosive Pot 1": 509350637, + "[Central] Crates near Shortcut Ladder/Crate 5": 509350636, + "[Central] Crates near Shortcut Ladder/Crate 4": 509350635, + "[Central] Crates near Shortcut Ladder/Crate 3": 509350634, + "[Central] Crates near Shortcut Ladder/Crate 2": 509350633, + "[Central] Crates near Shortcut Ladder/Crate 1": 509350632, + "[Central] Explosive Pots near Shortcut Ladder/Explosive Pot 2": 509350631, + "[Central] Explosive Pots near Shortcut Ladder/Explosive Pot 1": 509350630, + "[Back Entrance] Pots/Pot 5": 509350629, + "[Back Entrance] Pots/Pot 4": 509350628, + "[Back Entrance] Pots/Pot 3": 509350627, + "[Back Entrance] Pots/Pot 2": 509350626, + "[Back Entrance] Pots/Pot 1": 509350625, + "[Central] Explosive Pots near Monastery/Explosive Pot 2": 509350624, + "[Central] Explosive Pots near Monastery/Explosive Pot 1": 509350623, + "[East] Explosive Pot beneath Scaffolding/Explosive Pot": 509350622, + "[East] Explosive Pots/Explosive Pot 3": 509350621, + "[East] Explosive Pots/Explosive Pot 2": 509350620, + "[East] Explosive Pots/Explosive Pot 1": 509350619, + "Display Cases/Display Case 3": 509350618, + "Display Cases/Display Case 2": 509350617, + "Display Cases/Display Case 1": 509350616, + "Orb Room Explosive Pots/Explosive Pot 2": 509350615, + "Orb Room Explosive Pots/Explosive Pot 1": 509350614, + "Pots after Gate/Pot 2": 509350613, + "Pots after Gate/Pot 1": 509350612, + "Slorm Room/Pot": 509350611, + "Main Room Pots/Pot 2": 509350610, + "Main Room Pots/Pot 1": 509350609, + "Side Room Pots/Pot 3": 509350608, + "Side Room Pots/Pot 2": 509350607, + "Side Room Pots/Pot 1": 509350606, + "Pots above Orb Altar/Pot 2": 509350605, + "Pots above Orb Altar/Pot 1": 509350604, + "[Upper] Pots/Pot 6": 509350603, + "[Upper] Pots/Pot 5": 509350602, + "[Upper] Pots/Pot 4": 509350601, + "[Upper] Pots/Pot 3": 509350600, + "[Upper] Pots/Pot 2": 509350599, + "[Upper] Pots/Pot 1": 509350598, + "[South] Explosive Pot near Birds/Explosive Pot": 509350597, + "[West] Broken House/Table": 509350596, + "[West] Broken House/Pot 2": 509350595, + "[West] Broken House/Pot 1": 509350594, + "Fortress Arena/Pot 2": 509350593, + "Fortress Arena/Pot 1": 509350592, + "Fortress Leaf Piles - Secret Chest/Leaf Pile 4": 509350591, + "Fortress Leaf Piles - Secret Chest/Leaf Pile 3": 509350590, + "Fortress Leaf Piles - Secret Chest/Leaf Pile 2": 509350589, + "Fortress Leaf Piles - Secret Chest/Leaf Pile 1": 509350588, + "Barrels/Back Room Barrel 7": 509350587, + "Barrels/Back Room Barrel 6": 509350586, + "Barrels/Back Room Barrel 5": 509350585, + "[Northwest] Sign by Quarry Gate/Sign": 509350400, + "[Central] Sign South of Checkpoint/Sign": 509350401, + "[Central] Sign by Ruined Passage/Sign": 509350402, + "[East] Pots near Slimes/Pot 1": 509350403, + "[East] Pots near Slimes/Pot 2": 509350404, + "[East] Pots near Slimes/Pot 3": 509350405, + "[East] Pots near Slimes/Pot 4": 509350406, + "[East] Pots near Slimes/Pot 5": 509350407, + "[East] Forest Sign/Sign": 509350408, + "[East] Fortress Sign/Sign": 509350409, + "[North] Pots/Pot 1": 509350410, + "[North] Pots/Pot 2": 509350411, + "[North] Pots/Pot 3": 509350412, + "[North] Pots/Pot 4": 509350413, + "[West] Sign Near West Garden Entrance/Sign": 509350414, + "Stick House/Pot 1": 509350415, + "Stick House/Pot 2": 509350416, + "Stick House/Pot 3": 509350417, + "Stick House/Pot 4": 509350418, + "Stick House/Pot 5": 509350419, + "Stick House/Pot 6": 509350420, + "Stick House/Pot 7": 509350421, + "Ruined Shop/Pot 1": 509350422, + "Ruined Shop/Pot 2": 509350423, + "Ruined Shop/Pot 3": 509350424, + "Ruined Shop/Pot 4": 509350425, + "Ruined Shop/Pot 5": 509350426, + "Inside Hourglass Cave/Sign": 509350427, + "Pots by Slimes/Pot 1": 509350428, + "Pots by Slimes/Pot 2": 509350429, + "Pots by Slimes/Pot 3": 509350430, + "Pots by Slimes/Pot 4": 509350431, + "Pots by Slimes/Pot 5": 509350432, + "Pots by Slimes/Pot 6": 509350433, + "[Upper] Barrels/Barrel 1": 509350434, + "[Upper] Barrels/Barrel 2": 509350435, + "[Upper] Barrels/Barrel 3": 509350436, + "Pots after Guard Captain/Pot 1": 509350437, + "Pots after Guard Captain/Pot 2": 509350438, + "Pots after Guard Captain/Pot 3": 509350439, + "Pots after Guard Captain/Pot 4": 509350440, + "Pots after Guard Captain/Pot 5": 509350441, + "Pots after Guard Captain/Pot 6": 509350442, + "Pots after Guard Captain/Pot 7": 509350443, + "Pots after Guard Captain/Pot 8": 509350444, + "Pots after Guard Captain/Pot 9": 509350445, + "Pots/Pot 1": 509350446, + "Pots/Pot 2": 509350447, + "Pots/Pot 3": 509350448, + "Pots/Pot 4": 509350449, + "Pots/Pot 5": 509350450, + "Sign by Grave Path/Sign": 509350451, + "Sign by Guardhouse 1/Sign": 509350452, + "Pots by Grave Path/Pot 1": 509350453, + "Pots by Grave Path/Pot 2": 509350454, + "Pots by Grave Path/Pot 3": 509350455, + "Pots by Envoy/Pot 1": 509350456, + "Pots by Envoy/Pot 2": 509350457, + "Pots by Envoy/Pot 3": 509350458, + "Bottom Floor Pots/Pot 1": 509350459, + "Bottom Floor Pots/Pot 2": 509350460, + "Bottom Floor Pots/Pot 3": 509350461, + "Bottom Floor Pots/Pot 4": 509350462, + "Bottom Floor Pots/Pot 5": 509350463, + "[Side Room] Pots by Chest/Pot 1": 509350464, + "[Side Room] Pots by Chest/Pot 2": 509350465, + "[Side Room] Pots by Chest/Pot 3": 509350466, + "[Third Room] Barrels by Bridge/Barrel 1": 509350467, + "[Third Room] Barrels by Bridge/Barrel 2": 509350468, + "[Third Room] Barrels by Bridge/Barrel 3": 509350469, + "[Third Room] Barrels after Back Corridor/Barrel 1": 509350470, + "[Third Room] Barrels after Back Corridor/Barrel 2": 509350471, + "[Third Room] Barrels after Back Corridor/Barrel 3": 509350472, + "[Third Room] Barrels after Back Corridor/Barrel 4": 509350473, + "[Third Room] Barrels after Back Corridor/Barrel 5": 509350474, + "[Third Room] Barrels by West Turret/Barrel 1": 509350475, + "[Third Room] Barrels by West Turret/Barrel 2": 509350476, + "[Third Room] Barrels by West Turret/Barrel 3": 509350477, + "[Third Room] Pots by East Turret/Pot 1": 509350478, + "[Third Room] Pots by East Turret/Pot 2": 509350479, + "[Third Room] Pots by East Turret/Pot 3": 509350480, + "[Third Room] Pots by East Turret/Pot 4": 509350481, + "[Third Room] Pots by East Turret/Pot 5": 509350482, + "[Third Room] Pots by East Turret/Pot 6": 509350483, + "[Third Room] Pots by East Turret/Pot 7": 509350484, + "Barrels/Barrel 1": 509350485, + "Barrels/Barrel 2": 509350486, + "Pot Hallway Pots/Pot 1": 509350487, + "Pot Hallway Pots/Pot 2": 509350488, + "Pot Hallway Pots/Pot 3": 509350489, + "Pot Hallway Pots/Pot 4": 509350490, + "Pot Hallway Pots/Pot 5": 509350491, + "Pot Hallway Pots/Pot 6": 509350492, + "Pot Hallway Pots/Pot 7": 509350493, + "Pot Hallway Pots/Pot 8": 509350494, + "Pot Hallway Pots/Pot 9": 509350495, + "Pot Hallway Pots/Pot 10": 509350496, + "Pot Hallway Pots/Pot 11": 509350497, + "Pot Hallway Pots/Pot 12": 509350498, + "Pot Hallway Pots/Pot 13": 509350499, + "Pot Hallway Pots/Pot 14": 509350500, + "2nd Laser Room Pots/Pot 1": 509350501, + "2nd Laser Room Pots/Pot 2": 509350502, + "2nd Laser Room Pots/Pot 3": 509350503, + "2nd Laser Room Pots/Pot 4": 509350504, + "2nd Laser Room Pots/Pot 5": 509350505, + "[Southeast Lowlands] Ice Dagger Pickup/Pot 1": 509350506, + "[Southeast Lowlands] Ice Dagger Pickup/Pot 2": 509350507, + "[Southeast Lowlands] Ice Dagger Pickup/Pot 3": 509350508, + "Fire Pots/Fire Pot 1": 509350509, + "Fire Pots/Fire Pot 2": 509350510, + "Fire Pots/Fire Pot 3": 509350511, + "Fire Pots/Fire Pot 4": 509350512, + "Fire Pots/Fire Pot 5": 509350513, + "Fire Pots/Fire Pot 6": 509350514, + "Fire Pots/Fire Pot 7": 509350515, + "Fire Pots/Fire Pot 8": 509350516, + "Upper Fire Pot/Fire Pot": 509350517, + "[Entry] Pots/Pot 1": 509350518, + "[Entry] Pots/Pot 2": 509350519, + "[By Grave] Pots/Pot 1": 509350520, + "[By Grave] Pots/Pot 2": 509350521, + "[By Grave] Pots/Pot 3": 509350522, + "[By Grave] Pots/Pot 4": 509350523, + "[By Grave] Pots/Pot 5": 509350524, + "[By Grave] Pots/Pot 6": 509350525, + "[Central] Fire Pots/Fire Pot 1": 509350526, + "[Central] Fire Pots/Fire Pot 2": 509350527, + "[Central] Pots by Door/Pot 1": 509350528, + "[Central] Pots by Door/Pot 2": 509350529, + "[Central] Pots by Door/Pot 3": 509350530, + "[Central] Pots by Door/Pot 4": 509350531, + "[Central] Pots by Door/Pot 5": 509350532, + "[Central] Pots by Door/Pot 6": 509350533, + "[Central] Pots by Door/Pot 7": 509350534, + "[Central] Pots by Door/Pot 8": 509350535, + "[Central] Pots by Door/Pot 9": 509350536, + "[Central] Pots by Door/Pot 10": 509350537, + "[Central] Pots by Door/Pot 11": 509350538, + "[East Wing] Pots by Broken Checkpoint/Pot 1": 509350539, + "[East Wing] Pots by Broken Checkpoint/Pot 2": 509350540, + "[East Wing] Pots by Broken Checkpoint/Pot 3": 509350541, + "[West Wing] Pots by Checkpoint/Pot 1": 509350542, + "[West Wing] Pots by Checkpoint/Pot 2": 509350543, + "[West Wing] Pots by Checkpoint/Pot 3": 509350544, + "[West Wing] Pots by Overlook/Pot 1": 509350545, + "[West Wing] Pots by Overlook/Pot 2": 509350546, + "[West Wing] Slorm Room Pots/Pot 1": 509350547, + "[West Wing] Slorm Room Pots/Pot 2": 509350548, + "[West Wing] Slorm Room Pots/Pot 3": 509350549, + "[West Wing] Chest Room Pots/Pot 1": 509350550, + "[West Wing] Chest Room Pots/Pot 2": 509350551, + "[West Wing] Pots by Stairs to Basement/Pot 1": 509350552, + "[West Wing] Pots by Stairs to Basement/Pot 2": 509350553, + "[West Wing] Pots by Stairs to Basement/Pot 3": 509350554, + "Entry Spot/Pot 1": 509350555, + "Entry Spot/Pot 2": 509350556, + "Entry Spot/Crate 1": 509350557, + "Entry Spot/Crate 2": 509350558, + "Entry Spot/Crate 3": 509350559, + "Entry Spot/Crate 4": 509350560, + "Entry Spot/Crate 5": 509350561, + "Entry Spot/Crate 6": 509350562, + "Entry Spot/Crate 7": 509350563, + "Slorm Room Crates/Crate 1": 509350564, + "Slorm Room Crates/Crate 2": 509350565, + "Crates under Rope/Crate 1": 509350566, + "Crates under Rope/Crate 2": 509350567, + "Crates under Rope/Crate 3": 509350568, + "Crates under Rope/Crate 4": 509350569, + "Crates under Rope/Crate 5": 509350570, + "Crates under Rope/Crate 6": 509350571, + "Fuse Room Fire Pots/Fire Pot 1": 509350572, + "Fuse Room Fire Pots/Fire Pot 2": 509350573, + "Fuse Room Fire Pots/Fire Pot 3": 509350574, + "Barrels/Barrel by Back Room 1": 509350575, + "Barrels/Barrel by Back Room 2": 509350576, + "Barrels/Barrel by Back Room 3": 509350577, + "Barrels/Barrel by Back Room 4": 509350578, + "Barrels/Barrel by Back Room 5": 509350579, + "Barrels/Barrel by Back Room 6": 509350580, + "Barrels/Back Room Barrel 1": 509350581, + "Barrels/Back Room Barrel 2": 509350582, + "Barrels/Back Room Barrel 3": 509350583, + "[Powered Secret Room] Chest/Follow the Purple Energy Road": 509342400, + "[Entryway] Chest/Mind the Slorms": 509342401, + "[Third Room] Beneath Platform Chest/Run from the tentacles!": 509342402, + "[Third Room] Tentacle Chest/Water Sucks": 509342403, + "[Entryway] Obscured Behind Waterfall/You can just go in there": 509342404, + "[Save Room] Upper Floor Chest 1/Through the Power of Prayer": 509342405, + "[Save Room] Upper Floor Chest 2/Above the Fox Shrine": 509342406, + "[Second Room] Underwater Chest/Hidden Passage": 509342407, + "[Back Corridor] Right Secret/Hidden Path": 509342408, + "[Back Corridor] Left Secret/Behind the Slorms": 509342409, + "[Second Room] Obscured Behind Waterfall/Just go in there": 509342410, + "[Side Room] Chest By Pots/Just Climb up There": 509342411, + "[Side Room] Chest By Phrends/So Many Phrends!": 509342412, + "[Second Room] Page/Ruined Atoll Map": 509342413, + "[Passage To Dark Tomb] Page Pickup/Siege Engine": 509342414, + "[1F] Guarded By Lasers/Beside 3 Miasma Seekers": 509342415, + "[1F] Near Spikes/Mind the Miasma Seeker": 509342416, + "Birdcage Room/[2F] Bird Room": 509342417, + "[2F] Entryway Upper Walkway/Overlooking Miasma": 509342418, + "[1F] Library/By the Books": 509342419, + "[2F] Library/Behind the Ladder": 509342420, + "[2F] Guarded By Lasers/Before the big reveal...": 509342421, + "Birdcage Room/[2F] Bird Room Secret": 509342422, + "[1F] Library Secret/Pray to the Wallman": 509342423, + "Spike Maze Near Exit/Watch out!": 509342424, + "2nd Laser Room/Can you roll?": 509342425, + "1st Laser Room/Use a bomb?": 509342426, + "Spike Maze Upper Walkway/Just walk right!": 509342427, + "Skulls Chest/Move the Grave": 509342428, + "Spike Maze Near Stairs/In the Corner": 509342429, + "1st Laser Room Obscured/Follow the red laser of death": 509342430, + "Guardhouse 2 - Upper Floor/In the Mound": 509342431, + "Guardhouse 2 - Bottom Floor Secret/Hidden Hallway": 509342432, + "Guardhouse 1 Obscured/Upper Floor Obscured": 509342433, + "Guardhouse 1/Upper Floor": 509342434, + "Guardhouse 1 Ledge HC/Dancing Fox Spirit Holy Cross": 509342435, + "Golden Obelisk Holy Cross/Use the Holy Cross": 509342436, + "Ice Rod Grapple Chest/Freeze the Blob and ascend With Orb": 509342437, + "Above Save Point/Chest": 509342438, + "Above Save Point Obscured/Hidden Path": 509342439, + "Guardhouse 1 Ledge/From Guardhouse 1 Chest": 509342440, + "Near Save Point/Chest": 509342441, + "Ambushed by Spiders/Beneath Spider Chest": 509342442, + "Near Telescope/Up on the Wall": 509342443, + "Ambushed by Spiders/Spider Chest": 509342444, + "Lower Dash Chest/Dash Across": 509342445, + "Lower Grapple Chest/Grapple Across": 509342446, + "Bombable Wall/Follow the Flowers": 509342447, + "Page On Teleporter/Page": 509342448, + "Forest Belltower Save Point/Near Save Point": 509342449, + "Forest Belltower - After Guard Captain/Chest": 509342450, + "East Bell/Forest Belltower - Obscured Near Bell Top Floor": 509342451, + "Forest Belltower Obscured/Obscured Beneath Bell Bottom Floor": 509342452, + "Forest Belltower Page/Page Pickup": 509342453, + "Forest Grave Path - Holy Cross Code by Grave/Single Money Chest": 509342454, + "Forest Grave Path - Above Gate/Chest": 509342455, + "Forest Grave Path - Obscured Chest/Behind the Trees": 509342456, + "Forest Grave Path - Upper Walkway/From the top of the Guardhouse": 509342457, + "The Hero's Sword/Forest Grave Path - Sword Pickup": 509342458, + "The Hero's Sword/Hero's Grave - Tooth Relic": 509342459, + "Fortress Courtyard - From East Belltower/Crack in the Wall": 509342460, + "Fortress Leaf Piles - Secret Chest/Dusty": 509342461, + "Fortress Arena/Hexagon Red": 509342462, + "Fortress Arena/Siege Engine|Vault Key Pickup": 509342463, + "Fortress East Shortcut - Chest Near Slimes/Mind the Custodians": 509342464, + "[West Wing] Candles Holy Cross/Use the Holy Cross": 509342465, + "Westmost Upper Room/[West Wing] Dark Room Chest 1": 509342466, + "Westmost Upper Room/[West Wing] Dark Room Chest 2": 509342467, + "[East Wing] Bombable Wall/Bomb the Wall": 509342468, + "[West Wing] Page Pickup/He will never visit the Far Shore": 509342469, + "Fortress Grave Path - Upper Walkway/Go Around the East Wing": 509342470, + "Vault Hero's Grave/Fortress Grave Path - Chest Right of Grave": 509342471, + "Vault Hero's Grave/Fortress Grave Path - Obscured Chest Left of Grave": 509342472, + "Vault Hero's Grave/Hero's Grave - Flowers Relic": 509342473, + "Bridge/Chest": 509342474, + "Cell Chest 1/Drop the Shortcut Rope": 509342475, + "Obscured Behind Waterfall/Muffling Bell": 509342476, + "Back Room Chest/Lose the Lure or take 2 Damage": 509342477, + "Cell Chest 2/Mind the Custodian": 509342478, + "Near Vault/Already Stolen": 509342479, + "Slorm Room/Tobias was Trapped Here Once...": 509342480, + "Escape Chest/Don't Kick Fimbleton!": 509342481, + "Grapple Above Hot Tub/Look Up": 509342482, + "Above Vault/Obscured Doorway Ledge": 509342483, + "Main Room Top Floor/Mind the Adult Frog": 509342484, + "Main Room Bottom Floor/Altar Chest": 509342485, + "Side Room Secret Passage/Upper Right Corner": 509342486, + "Side Room Chest/Oh No! Our Frogs! They're Dead!": 509342487, + "Side Room Grapple Secret/Grapple on Over": 509342488, + "Magic Orb Pickup/Frult Meeting": 509342489, + "The Librarian/Hexagon Green": 509342490, + "Library Hall/Holy Cross Chest": 509342491, + "Library Lab Chest by Shrine 2/Chest": 509342492, + "Barrels/Back Room Barrel 4": 509350584, +} + + +# for setting up the poptracker integration +tracker_world = { + "map_page_maps": ["maps/maps_pop.json"], + "map_page_locations": ["locations/locations_pop_er.json", "locations/locations_breakables.json"], + "map_page_setting_key": "Slot:{player}:Current Map", + "map_page_index": map_page_index, + "external_pack_key": "ut_poptracker_path", + "poptracker_name_mapping": poptracker_data +} diff --git a/worlds/tww/Options.py b/worlds/tww/Options.py index ad9c8b3937..b6f2c1511b 100644 --- a/worlds/tww/Options.py +++ b/worlds/tww/Options.py @@ -755,6 +755,54 @@ class TWWOptions(PerGameCommonOptions): remove_music: RemoveMusic death_link: DeathLink + def get_slot_data_dict(self) -> dict[str, Any]: + """ + Returns a dictionary of option name to value to be placed in + the slot data network package. + + :return: Dictionary of option name to value for the slot data. + """ + return self.as_dict( + "progression_dungeons", + "progression_tingle_chests", + "progression_dungeon_secrets", + "progression_puzzle_secret_caves", + "progression_combat_secret_caves", + "progression_savage_labyrinth", + "progression_great_fairies", + "progression_short_sidequests", + "progression_long_sidequests", + "progression_spoils_trading", + "progression_minigames", + "progression_battlesquid", + "progression_free_gifts", + "progression_mail", + "progression_platforms_rafts", + "progression_submarines", + "progression_eye_reef_chests", + "progression_big_octos_gunboats", + "progression_triforce_charts", + "progression_treasure_charts", + "progression_expensive_purchases", + "progression_island_puzzles", + "progression_misc", + "sword_mode", + "required_bosses", + "logic_obscurity", + "logic_precision", + "enable_tuner_logic", + "randomize_dungeon_entrances", + "randomize_secret_cave_entrances", + "randomize_miniboss_entrances", + "randomize_boss_entrances", + "randomize_secret_cave_inner_entrances", + "randomize_fairy_fountain_entrances", + "swift_sail", + "skip_rematch_bosses", + "remove_music", + "death_link", + ) + def get_output_dict(self) -> dict[str, Any]: """ Returns a dictionary of option name to value to be placed in diff --git a/worlds/tww/Presets.py b/worlds/tww/Presets.py index 286494262f..bc1477cb53 100644 --- a/worlds/tww/Presets.py +++ b/worlds/tww/Presets.py @@ -1,61 +1,122 @@ from typing import Any tww_options_presets: dict[str, dict[str, Any]] = { - "Tournament S7": { + "Tournament S8": { "progression_dungeon_secrets": True, "progression_combat_secret_caves": True, "progression_short_sidequests": True, + "progression_long_sidequests": True, "progression_spoils_trading": True, "progression_big_octos_gunboats": True, "progression_mail": True, + "progression_platforms_rafts": True, + "progression_submarines": True, + "progression_big_octos_gunboats": True, + "progression_expensive_purchases": True, "progression_island_puzzles": True, "progression_misc": True, "randomize_mapcompass": "startwith", + "randomize_bigkeys": "startwith", "required_bosses": True, - "num_required_bosses": 3, + "num_required_bosses": 4, + "included_dungeons": ["Forsaken Fortress"], "chest_type_matches_contents": True, "logic_obscurity": "hard", + "randomize_dungeon_entrances": True, "randomize_starting_island": True, "add_shortcut_warps_between_dungeons": True, "start_inventory_from_pool": { "Telescope": 1, "Wind Waker": 1, - "Goddess Tingle Statue": 1, - "Earth Tingle Statue": 1, - "Wind Tingle Statue": 1, "Wind's Requiem": 1, "Ballad of Gales": 1, + "Command Melody": 1, "Earth God's Lyric": 1, "Wind God's Aria": 1, "Song of Passing": 1, - "Progressive Magic Meter": 2, + "Triforce Shard 1": 1, + "Triforce Shard 2": 1, + "Triforce Shard 3": 1, + "Skull Necklace": 20, + "Golden Feather": 20, + "Knight's Crest": 10, + "Green Chu Jelly": 15, + "Nayru's Pearl": 1, + "Din's Pearl": 1, }, - "start_location_hints": ["Ganon's Tower - Maze Chest"], + "start_location_hints": [ + "Windfall Island - Chu Jelly Juice Shop - Give 15 Blue Chu Jelly", + "Ganon's Tower - Maze Chest", + ], "exclude_locations": [ - "Outset Island - Orca - Give 10 Knight's Crests", "Outset Island - Great Fairy", - "Windfall Island - Chu Jelly Juice Shop - Give 15 Green Chu Jelly", + "Windfall Island - Mrs. Marie - Give 1 Joy Pendant", "Windfall Island - Mrs. Marie - Give 21 Joy Pendants", "Windfall Island - Mrs. Marie - Give 40 Joy Pendants", - "Windfall Island - Maggie's Father - Give 20 Skull Necklaces", - "Dragon Roost Island - Rito Aerie - Give Hoskit 20 Golden Feathers", + "Windfall Island - Lenzo's House - Become Lenzo's Assistant", + "Windfall Island - Lenzo's House - Bring Forest Firefly", + "Windfall Island - Sam - Decorate the Town", + "Windfall Island - Kamo - Full Moon Photo", + "Windfall Island - Linda and Anton", + "Dragon Roost Island - Secret Cave", + "Greatfish Isle - Hidden Chest", + "Mother and Child Isles - Inside Mother Isle", + "Fire Mountain - Cave - Chest", + "Fire Mountain - Lookout Platform Chest", + "Fire Mountain - Lookout Platform - Destroy the Cannons", "Fire Mountain - Big Octo", - "Mailbox - Letter from Hoskit's Girlfriend", + "Headstone Island - Top of the Island", + "Headstone Island - Submarine", + "Earth Temple - Behind Curtain Next to Hammer Button", + "The Great Sea - Goron Trading Reward", + "The Great Sea - Withered Trees", "Private Oasis - Big Octo", + "Boating Course - Raft", + "Boating Course - Cave", "Stone Watcher Island - Cave", + "Stone Watcher Island - Lookout Platform Chest", + "Stone Watcher Island - Lookout Platform - Destroy the Cannons", "Overlook Island - Cave", + "Bird's Peak Rock - Cave", + "Pawprint Isle - Wizzrobe Cave", "Thorned Fairy Island - Great Fairy", + "Thorned Fairy Island - Northeastern Lookout Platform - Destroy the Cannons", + "Thorned Fairy Island - Southwestern Lookout Platform - Defeat the Enemies", "Eastern Fairy Island - Great Fairy", + "Eastern Fairy Island - Lookout Platform - Defeat the Cannons and Enemies", "Western Fairy Island - Great Fairy", - "Southern Fairy Island - Great Fairy", - "Northern Fairy Island - Great Fairy", + "Western Fairy Island - Lookout Platform", + "Tingle Island - Ankle - Reward for All Tingle Statues", "Tingle Island - Big Octo", "Diamond Steppe Island - Big Octo", + "Rock Spire Isle - Cave", "Rock Spire Isle - Beedle's Special Shop Ship - 500 Rupee Item", "Rock Spire Isle - Beedle's Special Shop Ship - 950 Rupee Item", "Rock Spire Isle - Beedle's Special Shop Ship - 900 Rupee Item", + "Rock Spire Isle - Western Lookout Platform - Destroy the Cannons", + "Rock Spire Isle - Eastern Lookout Platform - Destroy the Cannons", + "Rock Spire Isle - Center Lookout Platform", + "Rock Spire Isle - Southeast Gunboat", "Shark Island - Cave", + "Horseshoe Island - Northwestern Lookout Platform", + "Horseshoe Island - Southeastern Lookout Platform", + "Flight Control Platform - Submarine", + "Star Island - Cave", + "Star Island - Lookout Platform", + "Star Belt Archipelago - Lookout Platform", + "Five-Star Isles - Lookout Platform - Destroy the Cannons", + "Five-Star Isles - Raft", + "Five-Star Isles - Submarine", + "Seven-Star Isles - Center Lookout Platform", + "Seven-Star Isles - Northern Lookout Platform", + "Seven-Star Isles - Southern Lookout Platform", "Seven-Star Isles - Big Octo", + "Cyclops Reef - Lookout Platform - Defeat the Enemies", + "Two-Eye Reef - Lookout Platform", + "Two-Eye Reef - Big Octo Great Fairy", + "Five-Eye Reef - Lookout Platform", + "Six-Eye Reef - Lookout Platform - Destroy the Cannons", + "Six-Eye Reef - Submarine", ], }, "Miniblins 2025": { diff --git a/worlds/tww/__init__.py b/worlds/tww/__init__.py index 6b6c3ca33a..58e752b5c9 100644 --- a/worlds/tww/__init__.py +++ b/worlds/tww/__init__.py @@ -11,7 +11,7 @@ from BaseClasses import ItemClassification as IC from BaseClasses import MultiWorld, Region, Tutorial from Options import Toggle from worlds.AutoWorld import WebWorld, World -from worlds.Files import APContainer, AutoPatchRegister +from worlds.Files import APPlayerContainer from worlds.generic.Rules import add_item_rule from worlds.LauncherComponents import Component, SuffixIdentifier, Type, components, icon_paths, launch_subprocess @@ -51,7 +51,7 @@ components.append( icon_paths["The Wind Waker"] = "ap:worlds.tww/assets/icon.png" -class TWWContainer(APContainer, metaclass=AutoPatchRegister): +class TWWContainer(APPlayerContainer): """ This class defines the container file for The Wind Waker. """ @@ -91,6 +91,14 @@ class TWWWeb(WebWorld): "setup_en.md", "setup/en", ["tanjo3", "Lunix"], + ), + Tutorial( + "Multiworld Setup Guide", + "A guide to setting up the Archipelago The Wind Waker software on your computer.", + "Français", + "setup_fr.md", + "setup/fr", + ["mobby45"] ) ] theme = "ocean" @@ -586,7 +594,7 @@ class TWWWorld(World): :return: A dictionary to be sent to the client when it connects to the server. """ - slot_data = self.options.as_dict(*self.options_dataclass.type_hints) + slot_data = self.options.get_slot_data_dict() # Add entrances to `slot_data`. This is the same data that is written to the .aptww file. entrances = { diff --git a/worlds/tww/docs/en_The Wind Waker.md b/worlds/tww/docs/en_The Wind Waker.md index 0158366b3f..77669ce7dd 100644 --- a/worlds/tww/docs/en_The Wind Waker.md +++ b/worlds/tww/docs/en_The Wind Waker.md @@ -76,10 +76,11 @@ at least normal. A few presets are available on the [player options page](../player-options) for your convenience. -- **Tournament S7**: These are (as close to as possible) the settings used in the WWR Racing Server's - [Season 7 Tournament](https://docs.google.com/document/d/1mJj7an-DvpYilwNt-DdlFOy1fz5_NMZaPZvHeIekplc). - The preset features 3 required bosses and hard obscurity difficulty, and while the list of enabled progression options - may seem intimidating, the preset also excludes several locations. +- **Tournament S8**: These are (as close to as possible) the settings used in the WWR Racing Server's + [Season 8 Tournament](https://docs.google.com/document/d/1b8F5DL3P5fgsQC_URiwhpMfqTpsGh2M-KmtTdXVigh4). + The preset features 4 required bosses (with Helmaroc King guaranteed required), dungeon entrance rando, hard obscurity + difficulty, and a variety of overworld checks. While the list of enabled progression options may seem intimidating, + the preset also excludes several locations and starts you with a handful of items. - **Miniblins 2025**: These are (as close to as possible) the settings used in the WWR Racing Server's [2025 Season of Miniblins](https://docs.google.com/document/d/19vT68eU6PepD2BD2ZjR9ikElfqs8pXfqQucZ-TcscV8). This preset is great if you're new to Wind Waker! There aren't too many locations in the world, and you only need to @@ -115,6 +116,7 @@ This randomizer would not be possible without the help from: - Gamma / SageOfMirrors: (additional programming) - LagoLunatic: (base randomizer, additional assistance) - Lunix: (Linux support, additional programming) +- mobby45: (French Translation of Guides) - Mysteryem: (tracker support, additional programming) - Necrofitz: (additional documentation) - Ouro: (tracker support) diff --git a/worlds/tww/docs/fr_The Wind Waker.md b/worlds/tww/docs/fr_The Wind Waker.md new file mode 100644 index 0000000000..2c89ae53fe --- /dev/null +++ b/worlds/tww/docs/fr_The Wind Waker.md @@ -0,0 +1,142 @@ +# The Wind Waker + +## Où est la page d'options ? + +La [page d'option pour ce jeu](../player-options) contient toutes les options que vous avez besoin de configurer et +exporter afin d'obtenir un fichier de configuration. + +## Que fait la randomisation à ce jeu ? + +Les objets sont mélangés entre les différentes localisations du jeu, donc chaque expérience est unique. +Les localisations randomisés incluent les coffres, les objets reçu des PNJ, ainsi que les trésors submergés sous l'eau. +Le randomiseur inclue également des qualités de vie tel qu'un monde entièrement ouvert, +des cinématiques retirées ainsi qu'une vitesse de navigation améliorée, et plus. + +## Quelles localisations sont mélangés ? + +Seulement les localisations mises en logiques dans les paramètres du monde seront randomisés. +Les localisations restantes dans le jeu auront un rubis jaune. +Celles-ci incluant un message indiquant que la localisation n'est pas randomisé. + +## Quel est l'objectif de The Wind Waker ? + +Atteindre et battre Ganondorf en haut de la tour de Ganon. +Pour cela, vous aurez besoin des huit morceaux de la Triforce du Courage, l'Excalibur entièrerement ranimée (sauf si ce +sont des épées optionnelles ou en mode sans épée), les flèches de lumières, ainsi que tous les objets nécessaires pour +atteindre Ganondorf. + +## A quoi ressemble un objet venant d'un autre monde dans TWW ? + +Les objets appartenant aux autres mondes qui ne sont pas TWW sont représentés +par la Lettre de Père (la lettre que Médolie vous donne pour la donner à Komali), +un objet inutilisé dans le randomiseur. + +## Que se passe-t-il quand un joueur reçoit un objet ? + +Quand le joueur reçoit n'importe quel objet, il sera automatiquement ajouté à l'inventaire de Link. +Link **ne tiendra pas** l'objet au dessus de sa tête comme dans d'autres randomizer de Zelda. + +## J'ai besoin d'aide ! Que dois-je faire ? + +Référez vous à la [FAQ](https://lagolunatic.github.io/wwrando/faq/) premièrement. Ensuite, +essayez les étapes de résolutions de problèmes dans le [guide de mise en place](/tutorial/The%20Wind%20Waker/setup/en). +Si vous êtes encore bloqué, s'il vous plait poser votre question dans le salon textuel Wind Waker +dans le serveur discord d'Archipelago. + +## J'ai ouvert mon jeu dans Dolphin, mais je n'ai aucun de mes items de démarrage ! + +Vous devez vous connecter à la salle du multiworld pour recevoir vos objets. Cela inclut votre inventaire de départ. + +## Problèmes Connus + +- Les rubis randomisés freestanding, butins, et appâts seront aussi données au joueur qui récupère l'objet. + L'objet sera bien envoyé mais le joueur qui le collecte recevra une copie supplémentaire. +- Les objets que tiens Link au dessus de sa tête **ne sont pas** randomisés, + comme les rubis allant des trésors venant des cercles lumineux + jusqu'aux récompenses venant des mini-jeux, ne fonctionneront pas. +- Un objet qui reçoit des messages pour des objets progressifs reçu à des localisations + qui s'envoient plus tôt que prévu seront incorrect. Cela n'affecte pas le gameplay. +- Le compteur de quart de cœur dans les messages lorsqu'on reçoit un objet seront faux d'un. + Cela n'affecte pas le gameplay. +- Il a été signalé que l'itemlink peut être buggé. + Ça ne casse en rien le jeu, mais soyez en conscient. + +N'hésitez pas à signaler n'importe quel autre problème ou suggestion d'amélioration dans le salon textuel Wind Waker +dans le serveur discord d'Archipelago ! + +## Astuces et conseils + +### Où sont les secrets de donjons trouvés à trouver dans les donjons ? + +[Ce document](https://docs.google.com/document/d/1LrjGr6W9970XEA-pzl8OhwnqMqTbQaxCX--M-kdsLos/edit?usp=sharing) +contient des images montrant les différents secrets des donjons. + +### Que font exactement les options obscures et de précisions des options de difficultés ? + +Les options `logic_obscurity` et `logic_precision` modifient la logique du randomizer +pour mettre différentes astuces et techniques en logique. +[Ce document](https://docs.google.com/spreadsheets/d/14ToE1SvNr9yRRqU4GK2qxIsuDUs9Edegik3wUbLtzH8/edit?usp=sharing) +liste parfaitement les changements qui sont fait. Les options sont progressives donc par exemple, +la difficulté obscure dur inclue les astuces normales et durs. +Certains changements ont besoin de la combinaison des deux options. +Par exemple, pour mettre les canons qui détruisent la porte de la Forteresse Maudite pour vous en logique, +les paramètres obscure et précision doivent tout les deux être mis au moins à normal. + +### Quels sont les différents préréglages d'options ? + +Quelques préréglages (presets) sont disponibles sur la [page d'options](../player-options) pour votre confort. + +- **Tournoi Saison 8**: Ce sont (aussi proche que possible) les paramètres utilisés dans le [Tournoi + Saison 8](https://docs.google.com/document/d/1b8F5DL3P5fgsQC_URiwhpMfqTpsGh2M-KmtTdXVigh4) du serveur WWR Racing. + Ce préréglage contient 4 boss requis (avec le Roi Cuirassé garanti d'être requis), + entrée des donjons randomisées, difficulté obscure dur, et une variété de checks dans l'overworld, + même si la liste d'options progressive peut sembler intimidante. + Ce préréglage exclut également plusieurs localisations et vous fait commencez avec plusieurs objets. +- **Miniblins 2025**: Ce sont (aussi proche que possible) les paramètres utilisés dans la + [Saison 2025 de Miniblins](https://docs.google.com/document/d/19vT68eU6PepD2BD2ZjR9ikElfqs8pXfqQucZ-TcscV8) + du serveur WWR Racing. Ce préréglage est bien si vous êtes nouveau à The Wind Waker ! + Il n'y a pas beaucoup de localisation dans ce monde, et tu as seulement besoin de compléter deux donjons. + Tu commences aussi avec plusieurs objets utiles comme la double magie, + une amélioration de capacité pour votre arc et vos bombes ainsi que six coeurs. +- **Mixed Pools**: Ce sont (aussi proche que possible) les paramètres utilisés dans le + [Tournoi Mixed Pools Co-op](https://docs.google.com/document/d/1YGPTtEgP978TIi0PUAD792OtZbE2jBQpI8XCAy63qpg) + du serveur WWR Racing. + Ce préréglage contient toutes les entrées randomisés et inclue la plupart des localisations + derrière une entrée randomisé. Il y a aussi plusieurs locations de l'overworld, + étant donnée que ces paramètres sont censés être joué dans une équipe de deux joueurs. + Ce préréglage a aussi six boss requis, mais vu que les pools d'entrées sont randomisés, + les boss peuvent être trouvés n'importe où ! Regarder votre carte de l'océan pour + déterminer quels îles les boss sont. + +## Fonctionnalités planifiées + +- Type des coffres Dynamique assorties au contenu en fonction des options activés +- Implémentation des indices venant du randomiseur de base (options de placement des indices et des types d'indices) +- Intégration avec le système d'indice d'Archipelago (ex: indices des enchères) +- Support de l'EnergyLink +- Logique de la voile rapide en tant qu'option +- Continuer la correction de bug + +## Crédits + +Ce randomiseur ne pouvait pas être possible sans l'aide de : + +- BigSharkZ: (Dessinateur de l'îcone) +- Celeste (Maëlle): (correction de logique et de fautes d'orthographe, programmation additionnelle) +- Chavu: (document sur les difficultés de logique) +- CrainWWR: (multiworld et assitance sur la mémoire de Dolphin, programmation additionnelle) +- Cyb3R: (référence pour `TWWClient`) +- DeamonHunter: (programmation additionnelle) +- Dev5ter: (Implémentation initiale de l'AP de TWW) +- Gamma / SageOfMirrors: (programmation additionnelle) +- LagoLunatic: (randomiseur de base, assistance additionelle) +- Lunix: (Support Linux, programmation additionnelle) +- mobby45 (Traduction du guide français) +- Mysteryem: (Support du tracker, programmation additionnelle) +- Necrofitz: (documentation additionelle) +- Ouro: (Support du tracker) +- tal (matzahTalSoup): (guide pour les dungeon secrets) +- Tubamann: (programmation additionnelle) + +Le logo archipelago © 2022 par Krista Corkos et Christopher Wilson, sous licence +[CC BY-NC 4.0](http://creativecommons.org/licenses/by-nc/4.0/). diff --git a/worlds/tww/docs/setup_fr.md b/worlds/tww/docs/setup_fr.md new file mode 100644 index 0000000000..8457c8ef5b --- /dev/null +++ b/worlds/tww/docs/setup_fr.md @@ -0,0 +1,95 @@ +# Guide de mise en place de l'Archipelago de The Wind Waker + +Bienvenue dans l'Archipelago The Wind Waker ! +Ce guide vous aidera à mettre en place le randomiser et à jouer à votre premier multiworld. +Si vous jouez à The Wind Waker, vous devez suivre quelques étapes simple pour commencer. + +## Requis + +Vous aurez besoin des choses suivantes pour être capable de jouer à The Wind Waker: +* L'[émulateur Dolphin](https://dolphin-emu.org/download/). **Nous recommendons d'utiliser la dernière version + sortie.** + * Les utilisateurs Linux peuvent utiliser le paquet flatpak + [disponible sur Flathub](https://flathub.org/apps/org.DolphinEmu.dolphin-emu). +* La dernière version du [Randomiser The Wind Waker pour + Archipelago](https://github.com/tanjo3/wwrando/releases?q=tag%3Aap_2). + * Veuillez noter que cette version est **différente** de celui utilisé pour le randomiser standard. Cette version + est spécifique à Archipelago. +* Une ISO du jeu Zelda The Wind Waker (version Nord Américaine), probablement nommé "Legend of Zelda, The - The Wind + Waker (USA).iso". + +De manière optionnelle, vous pouvez également télécharger: +* Le [tracker pour Wind Waker](https://github.com/Mysteryem/ww-poptracker/releases/latest) avec + [PopTracker](https://github.com/black-sliver/PopTracker/releases), qui en est la dépendance. +* Des [modèles de personnages personnalisés pour Wind + Waker](https://github.com/Sage-of-Mirrors/Custom-Wind-Waker-Player-Models) afin de personnaliser votre personnage en + jeu. + + +## Mise en place d'un YAML + +Tous les joueurs jouant à The Wind Waker doivent donner un YAML comportant les paramètres de leur monde +à l'hôte de la salle. +Vous pouvez aller sur la [page d'options The Wind Waker](/games/The%20Wind%20Waker/player-options) +pour générer un YAML avec vos options désirés. +Seulement les localisations catégorisées sous les options activés +sous "Progression Locations" seront randomisés dans votre monde. +Une fois que vous êtes heureux avec vos paramètres, +donnez votre fichier YAML à l'hôte de la salle et procéder à la prochaine étape. + +## Connexion à une salle + +L'hôte du multiworld vous donnera un lien pour télécharger votre fichier APTWW +ou un zip contenant les fichiers de tout le monde. +Le fichier APTWW doit être nommé `P#__XXXXX.aptww`, où `#` est l'identifiant du joueur, +`` est votre nom de joueur, et `XXXXX` est l'identifiant de la salle. +L'hôte doit également vous donner le nom de la salle du serveur avec le numéro de port. + +Une fois que vous êtes prêt, suivez ces étapes pour vous connecter à la salle: +1. Lancer le build AP du Randomiser. Si c'est la première fois que vous ouvrez le randomiser, + vous aurez besoin d'indiquer le chemin vers votre ISO de The Wind Waker et le dossier de sortie pour l'ISO randomisé. + Ceux-ci seront sauvegardé pour la prochaine fois que vous ouvrez le programme. +2. Modifier n'importe quel cosmétique comme vous le voulez avec les ajustements désirés + ainsi que la personnalisation de votre personnage desiré. +3. Pour le fichier APTWW, naviguer et localiser le chemin du fichier. +4. Appuyer sur `Randomize` en bas à droite. + Cela va randomiser et mettre l'ISO dans le dossier de sortie que vous avez renseigné. + Le fichier sera nommé `TWW AP_YYYYY_P# ().iso`, où `YYYYY` est le numéro de votre seed, + `#` est l'identifiant de votre joueur, et `` est le nom de votre joueur (nom de slot). + Veuillez vérifier que ces valeurs sont correctes pour votre multiworld. +5. Ouvrez Dolphin et utilisez le pour ouvrir l'iso randomisé. +6. Lancer `ArchipelagoLauncher.exe` (sans le `.exe` sur Linux) et choisissez `The Wind Waker Client`, + Cela va lancer le client texte. +7. Si Dolphin n'est pas encore ouvert, ou que vous n'avez pas encore commencé de nouveau fichier, + vous serez demandé à le faire. + * Une fois que vous avez ouvert votre ISO dans Dolphin, le client doit dire "Dolphin connected successfully.". +8. Connectez-vous à la salle entrant le nom du serveur et son numéro de port en haut et cliquer sur `Connect`. + Pour ceux qui hébergent sur le site web, cela sera `archipelago.gg:`, où `` est le numéro de port. + Si un jeu est hébergé à partir de `ArchipelagoServer.exe` (sans le `.exe` sur Linux), + le numéro de port par défaut est `38281` mais il peut être changé dans le `host.yaml`. +9. Si tu as ouvert ton ISO correspondant au multiworld auquel tu es connecté, + ça doit authentifier ton nom de slot automatiquement quand tu commences une nouveau fichier de sauvegarde. + +## Résolutions de problèmes +* Vérifier que vous utilisez la même version d'Archipelago que celui qui a généré le multiworld. +* Vérifier que `tww.apworld` n'est pas dans votre dossier d'installation Archipelago dans le dossier `custom_worlds`. +* Vérifier que vous utiliser la bonne version du build du randomiser que vous utilisez pour la version d'Archipelago. + * Le build doit donner un message d'erreur vous dirigeant vers la bonne version. + Vous pouvez aussi consulter les notes de version des builds AP de TWW + [ici](https://github.com/tanjo3/wwrando/releases?q=tag%3Aap_2), + afin de voir avec quelles versions d'Archipelago chaque build est compatible avec. +* Ne pas lancer le Launcher d'Archipelago ou Dolphin en tant qu'Administrateur sur Windows. +* Si vous rencontrez des problèmes avec l'authentification, + vérifier que la ROM randomisé est ouverte dans Dolphin et correspond au multiworld auquel vous vous connectez. +* Vérifier que vous n'utilisez aucune triche Dolphin ou que des codes de triches sont activés. + Certains codes peut interférer de manière imprévue avec l'émulation et + rendre la résolution des problèmes compliquées. +* Vérifier que `Modifier la taille de la mémoire émulée` dans Dolphin + (situé sous `Options` > `Configuration` > `Avancé`) est **désactivé**. +* Si le client ne peut pas se connecter à Dolphin, Vérifier que Dolphin est situé sur le même disque qu'Archipelago. + D'après certaines informations, avoir Dolphin sur un disque dur externe cause des problèmes de connexion. +* Vérifier que la `Région de remplacement` dans Dolphin (situé sous `Options` > `Configuration` > `Général`) + est mise à `NTSC-U`. +* Si vous lancez un menu de démarrage de Gamecube personnalisé, + vous aurez besoin de le passer en allant dans `Options` > `Configuration` > `GameCube` + et cocher `Passer le Menu Principal`. diff --git a/worlds/tww/randomizers/ItemPool.py b/worlds/tww/randomizers/ItemPool.py index 86c02f3932..e3d62fa973 100644 --- a/worlds/tww/randomizers/ItemPool.py +++ b/worlds/tww/randomizers/ItemPool.py @@ -110,6 +110,14 @@ def get_pool_core(world: "TWWWorld") -> tuple[list[str], list[str]]: else: filler_pool.extend([item] * data.quantity) + # If the player starts with a sword, add one to the precollected items list and remove one from the item pool. + if world.options.sword_mode == "start_with_sword": + precollected_items.append("Progressive Sword") + progression_pool.remove("Progressive Sword") + # Or, if it's swordless mode, remove all swords from the item pool. + elif world.options.sword_mode == "swordless": + useful_pool = [item for item in useful_pool if item != "Progressive Sword"] + # Assign useful and filler items to item pools in the world. world.random.shuffle(useful_pool) world.random.shuffle(filler_pool) @@ -117,7 +125,8 @@ def get_pool_core(world: "TWWWorld") -> tuple[list[str], list[str]]: world.filler_pool = filler_pool # Add filler items to place into excluded locations. - pool.extend([world.get_filler_item_name() for _ in world.options.exclude_locations]) + excluded_locations = world.progress_locations.intersection(world.options.exclude_locations) + pool.extend([world.get_filler_item_name() for _ in excluded_locations]) # The remaining of items left to place should be the same as the number of non-excluded locations in the world. nonexcluded_locations = [ @@ -140,17 +149,6 @@ def get_pool_core(world: "TWWWorld") -> tuple[list[str], list[str]]: pool.extend(progression_pool) num_items_left_to_place -= len(progression_pool) - # If the player starts with a sword, add one to the precollected items list and remove one from the item pool. - if world.options.sword_mode == "start_with_sword": - precollected_items.append("Progressive Sword") - num_items_left_to_place += 1 - pool.remove("Progressive Sword") - # Or, if it's swordless mode, remove all swords from the item pool. - elif world.options.sword_mode == "swordless": - while "Progressive Sword" in pool: - num_items_left_to_place += 1 - pool.remove("Progressive Sword") - # Place useful items, then filler items to fill out the remaining locations. pool.extend([world.get_filler_item_name(strict=False) for _ in range(num_items_left_to_place)]) diff --git a/worlds/v6/__init__.py b/worlds/v6/__init__.py index b74f335189..3ed8b7044c 100644 --- a/worlds/v6/__init__.py +++ b/worlds/v6/__init__.py @@ -59,7 +59,7 @@ class V6World(World): self.multiworld.itempool += filltrinkets def generate_basic(self): - musiclist_o = [1,2,3,4,9,12] + musiclist_o = [1,2,3,4,9,11,12] musiclist_s = musiclist_o.copy() if self.options.music_rando: self.multiworld.random.shuffle(musiclist_s) diff --git a/WargrooveClient.py b/worlds/wargroove/Client.py similarity index 58% rename from WargrooveClient.py rename to worlds/wargroove/Client.py index 595a221cd2..0627c7e9f2 100644 --- a/WargrooveClient.py +++ b/worlds/wargroove/Client.py @@ -2,14 +2,15 @@ from __future__ import annotations import atexit import os +import pkgutil import sys import asyncio import random -import shutil +import typing from typing import Tuple, List, Iterable, Dict -from worlds.wargroove import WargrooveWorld -from worlds.wargroove.Items import item_table, faction_table, CommanderData, ItemData +from . import WargrooveWorld +from .Items import item_table, faction_table, CommanderData, ItemData import ModuleUpdate ModuleUpdate.update() @@ -21,7 +22,7 @@ import logging if __name__ == "__main__": Utils.init_logging("WargrooveClient", exception_logger="Client") -from NetUtils import NetworkItem, ClientStatus +from NetUtils import ClientStatus from CommonClient import gui_enabled, logger, get_base_parser, ClientCommandProcessor, \ CommonContext, server_loop @@ -29,6 +30,34 @@ wg_logger = logging.getLogger("WG") class WargrooveClientCommandProcessor(ClientCommandProcessor): + def _cmd_sacrifice_summon(self): + """Toggles sacrifices and summons On/Off""" + if isinstance(self.ctx, WargrooveContext): + self.ctx.has_sacrifice_summon = not self.ctx.has_sacrifice_summon + if self.ctx.has_sacrifice_summon: + self.output(f"Sacrifices and summons are enabled.") + else: + unit_summon_response_file = os.path.join(self.ctx.game_communication_path, "unitSummonResponse") + if os.path.exists(unit_summon_response_file): + os.remove(unit_summon_response_file) + self.output(f"Sacrifices and summons are disabled.") + + def _cmd_deathlink(self): + """Toggles deathlink On/Off""" + if isinstance(self.ctx, WargrooveContext): + self.ctx.has_death_link = not self.ctx.has_death_link + Utils.async_start(self.ctx.update_death_link(self.ctx.has_death_link), name="Update Deathlink") + if self.ctx.has_death_link: + death_link_send_file = os.path.join(self.ctx.game_communication_path, "deathLinkSend") + if os.path.exists(death_link_send_file): + os.remove(death_link_send_file) + self.output(f"Deathlink enabled.") + else: + death_link_receive_file = os.path.join(self.ctx.game_communication_path, "deathLinkReceive") + if os.path.exists(death_link_receive_file): + os.remove(death_link_receive_file) + self.output(f"Deathlink disabled.") + def _cmd_resync(self): """Manually trigger a resync.""" self.output(f"Syncing items.") @@ -58,6 +87,11 @@ class WargrooveContext(CommonContext): commander_defense_boost_multiplier: int = 0 income_boost_multiplier: int = 0 starting_groove_multiplier: float + has_death_link: bool = False + has_sacrifice_summon: bool = True + player_stored_units_key: str = "" + ai_stored_units_key: str = "" + max_stored_units: int = 1000 faction_item_ids = { 'Starter': 0, 'Cherrystone': 52025, @@ -71,6 +105,31 @@ class WargrooveContext(CommonContext): 'Income Boost': 52023, 'Commander Defense Boost': 52024, } + unit_classes = { + "archer", + "ballista", + "balloon", + "dog", + "dragon", + "giant", + "harpoonship", + "harpy", + "knight", + "mage", + "merman", + "rifleman", + "soldier", + "spearman", + "thief", + "thief_with_gold", + "travelboat", + "trebuchet", + "turtle", + "villager", + "wagon", + "warship", + "witch", + } def __init__(self, server_address, password): super(WargrooveContext, self).__init__(server_address, password) @@ -78,31 +137,80 @@ class WargrooveContext(CommonContext): self.syncing = False self.awaiting_bridge = False # self.game_communication_path: files go in this path to pass data between us and the actual game + game_options = WargrooveWorld.settings + + # Validate the AppData directory with Wargroove save data. + # By default, Windows sets an environment variable we can leverage. + # However, other OSes don't usually have this value set, so we need to rely on a settings value instead. + appdata_wargroove = None if "appdata" in os.environ: - options = Utils.get_options() - root_directory = os.path.join(options["wargroove_options"]["root_directory"]) - data_directory = os.path.join("lib", "worlds", "wargroove", "data") - dev_data_directory = os.path.join("worlds", "wargroove", "data") - appdata_wargroove = os.path.expandvars(os.path.join("%APPDATA%", "Chucklefish", "Wargroove")) - if not os.path.isfile(os.path.join(root_directory, "win64_bin", "wargroove64.exe")): - print_error_and_close("WargrooveClient couldn't find wargroove64.exe. " - "Unable to infer required game_communication_path") - self.game_communication_path = os.path.join(root_directory, "AP") - if not os.path.exists(self.game_communication_path): - os.makedirs(self.game_communication_path) - self.remove_communication_files() - atexit.register(self.remove_communication_files) - if not os.path.isdir(appdata_wargroove): - print_error_and_close("WargrooveClient couldn't find Wargoove in appdata!" - "Boot Wargroove and then close it to attempt to fix this error") - if not os.path.isdir(data_directory): - data_directory = dev_data_directory - if not os.path.isdir(data_directory): - print_error_and_close("WargrooveClient couldn't find Wargoove mod and save files in install!") - shutil.copytree(data_directory, appdata_wargroove, dirs_exist_ok=True) + appdata_wargroove = os.environ['appdata'] else: - print_error_and_close("WargrooveClient couldn't detect system type. " - "Unable to infer required game_communication_path") + try: + appdata_wargroove = game_options.save_directory + except FileNotFoundError: + print_error_and_close("WargrooveClient couldn't detect a path to the AppData folder.\n" + "Unable to infer required game_communication_path.\n" + "Try setting the \"save_directory\" value in your local options file " + "to the AppData folder containing your Wargroove saves.") + appdata_wargroove = os.path.expandvars(os.path.join(appdata_wargroove, "Chucklefish", "Wargroove")) + if not os.path.isdir(appdata_wargroove): + print_error_and_close(f"WargrooveClient couldn't find Wargroove data in your AppData folder.\n" + f"Looked in \"{appdata_wargroove}\".\n" + f"If you haven't yet booted the game at least once, boot Wargroove " + f"and then close it to attempt to fix this error.\n" + f"If the AppData folder above seems wrong, try setting the " + f"\"save_directory\" value in your local options file " + f"to the AppData folder containing your Wargroove saves.") + + # Check for the Wargroove game executable path. + # This should always be set regardless of the OS. + root_directory = game_options["root_directory"] + if not os.path.isfile(os.path.join(root_directory, "win64_bin", "wargroove64.exe")): + print_error_and_close(f"WargrooveClient couldn't find wargroove64.exe in " + f"\"{root_directory}/win64_bin/\".\n" + f"Unable to infer required game_communication_path.\n" + f"Please verify the \"root_directory\" value in your local " + f"options file is set correctly.") + self.game_communication_path = os.path.join(root_directory, "AP") + if not os.path.exists(self.game_communication_path): + os.makedirs(self.game_communication_path) + self.remove_communication_files() + atexit.register(self.remove_communication_files) + if not os.path.isdir(appdata_wargroove): + print_error_and_close("WargrooveClient couldn't find Wargoove in appdata!" + "Boot Wargroove and then close it to attempt to fix this error") + mods_directory = os.path.join(appdata_wargroove, "mods", "ArchipelagoMod") + save_directory = os.path.join(appdata_wargroove, "save") + + # Wargroove doesn't always create the mods directory, so we have to do it + if not os.path.isdir(mods_directory): + os.makedirs(mods_directory) + resources = ["data/mods/ArchipelagoMod/maps.dat", + "data/mods/ArchipelagoMod/mod.dat", + "data/mods/ArchipelagoMod/modAssets.dat", + "data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp", + "data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp.bak"] + file_paths = [os.path.join(mods_directory, "maps.dat"), + os.path.join(mods_directory, "mod.dat"), + os.path.join(mods_directory, "modAssets.dat"), + os.path.join(save_directory, "campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp"), + os.path.join(save_directory, "campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp.bak")] + for resource, destination in zip(resources, file_paths): + file_data = pkgutil.get_data("worlds.wargroove", resource) + if file_data is None: + print_error_and_close("WargrooveClient couldn't find Wargoove mod and save files in install!") + with open(destination, 'wb') as f: + f.write(file_data) + + def on_deathlink(self, data: typing.Dict[str, typing.Any]) -> None: + with open(os.path.join(self.game_communication_path, "deathLinkReceive"), 'w+') as f: + text = data.get("cause", "") + if text: + f.write(f"DeathLink: {text}") + else: + f.write(f"DeathLink: Received from {data['source']}") + super(WargrooveContext, self).on_deathlink(data) async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: @@ -138,20 +246,25 @@ class WargrooveContext(CommonContext): def on_package(self, cmd: str, args: dict): if cmd in {"Connected"}: + slot_data = args["slot_data"] + self.has_death_link = slot_data.get("death_link", False) filename = f"AP_settings.json" with open(os.path.join(self.game_communication_path, filename), 'w') as f: - slot_data = args["slot_data"] - json.dump(args["slot_data"], f) + json.dump(slot_data, f) self.can_choose_commander = slot_data["can_choose_commander"] print('can choose commander:', self.can_choose_commander) self.starting_groove_multiplier = slot_data["starting_groove_multiplier"] self.income_boost_multiplier = slot_data["income_boost"] self.commander_defense_boost_multiplier = slot_data["commander_defense_boost"] - f.close() for ss in self.checked_locations: filename = f"send{ss}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: - f.close() + pass + + self.player_stored_units_key = f"wargroove_player_units_{self.team}" + self.ai_stored_units_key = f"wargroove_ai_units_{self.team}" + self.set_notify(self.player_stored_units_key, self.ai_stored_units_key) + self.update_commander_data() self.ui.update_tracker() @@ -161,7 +274,6 @@ class WargrooveContext(CommonContext): filename = f"seed{i}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: f.write(str(random.randint(0, 4294967295))) - f.close() if cmd in {"RoomInfo"}: self.seed_name = args["seed_name"] @@ -189,7 +301,6 @@ class WargrooveContext(CommonContext): f.write(f"{item_count * self.commander_defense_boost_multiplier}") else: f.write(f"{item_count}") - f.close() print_filename = f"AP_{str(network_item.item)}.item.print" print_path = os.path.join(self.game_communication_path, print_filename) @@ -200,7 +311,6 @@ class WargrooveContext(CommonContext): self.item_names.lookup_in_game(network_item.item) + " from " + self.player_names[network_item.player]) - f.close() self.update_commander_data() self.ui.update_tracker() @@ -209,7 +319,7 @@ class WargrooveContext(CommonContext): for ss in self.checked_locations: filename = f"send{ss}" with open(os.path.join(self.game_communication_path, filename), 'w') as f: - f.close() + pass def run_gui(self): """Import kivy UI system and start running it as self.ui_task.""" @@ -385,32 +495,75 @@ class WargrooveContext(CommonContext): async def game_watcher(ctx: WargrooveContext): - from worlds.wargroove.Locations import location_table while not ctx.exit_event.is_set(): - if ctx.syncing == True: - sync_msg = [{'cmd': 'Sync'}] - if ctx.locations_checked: - sync_msg.append({"cmd": "LocationChecks", "locations": list(ctx.locations_checked)}) - await ctx.send_msgs(sync_msg) - ctx.syncing = False - sending = [] - victory = False - for root, dirs, files in os.walk(ctx.game_communication_path): - for file in files: - if file.find("send") > -1: - st = file.split("send", -1)[1] - sending = sending+[(int(st))] - os.remove(os.path.join(ctx.game_communication_path, file)) - if file.find("victory") > -1: - victory = True - os.remove(os.path.join(ctx.game_communication_path, file)) - ctx.locations_checked = sending - message = [{"cmd": 'LocationChecks', "locations": sending}] - await ctx.send_msgs(message) - if not ctx.finished_game and victory: - await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) - ctx.finished_game = True - await asyncio.sleep(0.1) + try: + if ctx.syncing == True: + sync_msg = [{'cmd': 'Sync'}] + if ctx.locations_checked: + sync_msg.append({"cmd": "LocationChecks", "locations": list(ctx.locations_checked)}) + await ctx.send_msgs(sync_msg) + ctx.syncing = False + sending = [] + victory = False + for root, dirs, files in os.walk(ctx.game_communication_path): + for file in files: + if file == "deathLinkSend" and ctx.has_death_link: + with open(os.path.join(ctx.game_communication_path, file), 'r') as f: + failed_mission = f.read() + if ctx.slot is not None: + await ctx.send_death(f"{ctx.player_names[ctx.slot]} failed {failed_mission}") + os.remove(os.path.join(ctx.game_communication_path, file)) + if file.find("send") > -1: + st = file.split("send", -1)[1] + sending = sending+[(int(st))] + os.remove(os.path.join(ctx.game_communication_path, file)) + if file.find("victory") > -1: + victory = True + os.remove(os.path.join(ctx.game_communication_path, file)) + if file == "unitSacrifice" or file == "unitSacrificeAI": + if ctx.has_sacrifice_summon: + stored_units_key = ctx.player_stored_units_key + if file == "unitSacrificeAI": + stored_units_key = ctx.ai_stored_units_key + with open(os.path.join(ctx.game_communication_path, file), 'r') as f: + unit_class = f.read() + message = [{"cmd": 'Set', "key": stored_units_key, + "default": [], + "want_reply": True, + "operations": [{"operation": "add", "value": [unit_class[:64]]}]}] + await ctx.send_msgs(message) + os.remove(os.path.join(ctx.game_communication_path, file)) + if file == "unitSummonRequestAI" or file == "unitSummonRequest": + if ctx.has_sacrifice_summon: + stored_units_key = ctx.player_stored_units_key + if file == "unitSummonRequestAI": + stored_units_key = ctx.ai_stored_units_key + with open(os.path.join(ctx.game_communication_path, "unitSummonResponse"), 'w') as f: + if stored_units_key in ctx.stored_data: + stored_units = ctx.stored_data[stored_units_key] + if stored_units is None: + stored_units = [] + wg1_stored_units = [unit for unit in stored_units if unit in ctx.unit_classes] + if len(wg1_stored_units) != 0: + summoned_unit = random.choice(wg1_stored_units) + message = [{"cmd": 'Set', "key": stored_units_key, + "default": [], + "want_reply": True, + "operations": [{"operation": "remove", "value": summoned_unit[:64]}]}] + await ctx.send_msgs(message) + f.write(summoned_unit) + os.remove(os.path.join(ctx.game_communication_path, file)) + + ctx.locations_checked = sending + message = [{"cmd": 'LocationChecks', "locations": sending}] + await ctx.send_msgs(message) + if not ctx.finished_game and victory: + await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}]) + ctx.finished_game = True + await asyncio.sleep(0.1) + + except Exception as err: + logger.warn("Exception in communication thread, a check may not have been sent: " + str(err)) def print_error_and_close(msg): @@ -418,8 +571,9 @@ def print_error_and_close(msg): Utils.messagebox("Error", msg, error=True) sys.exit(1) -if __name__ == '__main__': - async def main(args): +def launch(*launch_args: str): + async def main(): + args = parser.parse_args(launch_args) ctx = WargrooveContext(args.connect, args.password) ctx.server_task = asyncio.create_task(server_loop(ctx), name="server loop") if gui_enabled: @@ -439,7 +593,6 @@ if __name__ == '__main__': parser = get_base_parser(description="Wargroove Client, for text interfacing.") - args, rest = parser.parse_known_args() colorama.just_fix_windows_console() - asyncio.run(main(args)) + asyncio.run(main()) colorama.deinit() diff --git a/worlds/wargroove/Options.py b/worlds/wargroove/Options.py index 1af0772065..a933cdb17b 100644 --- a/worlds/wargroove/Options.py +++ b/worlds/wargroove/Options.py @@ -1,6 +1,6 @@ -import typing from dataclasses import dataclass -from Options import Choice, Option, Range, PerGameCommonOptions +from Options import Choice, Range, PerGameCommonOptions, StartInventoryPool, OptionDict, OptionGroup, \ + DeathLinkMixin class IncomeBoost(Range): @@ -31,8 +31,65 @@ class CommanderChoice(Choice): option_unlockable_factions = 1 option_random_starting_faction = 2 + +class PlayerSacrificeLimit(Range): + """How many times the player can sacrifice a unit at the Stronghold per level attempt. + Sacrificed units are stored in the multiworld for other players to summon.""" + display_name = "Player Sacrifice Limit" + range_start = 0 + range_end = 5 + default = 0 + + +class PlayerSummonLimit(Range): + """How many times the player can summon a unit at the Stronghold per level attempt. + Summoned units are from the multiworld which were sacrificed by other players.""" + display_name = "Player Summon Limit" + range_start = 0 + range_end = 5 + default = 0 + + +class AISacrificeLimit(Range): + """How many times the AI can sacrifice a unit at the Stronghold per level attempt. + Sacrificed units are stored in the multiworld for other AIs to summon.""" + display_name = "AI Sacrifice Limit" + range_start = 0 + range_end = 5 + default = 0 + + +class AISummonLimit(Range): + """How many times the AI can summon a unit at the Stronghold per level attempt. + Summoned units are from the multiworld which were sacrificed by other AIs. + AI summoning can be overwhelming, use /sacrifice_summon in the client if a level becomes impossible.""" + display_name = "AI Summon Limit" + range_start = 0 + range_end = 5 + default = 0 + + +wargroove_option_groups = [ + OptionGroup("General Options", [ + IncomeBoost, + CommanderDefenseBoost, + CommanderChoice + ]), + OptionGroup("Sacrifice and Summon Options", [ + PlayerSacrificeLimit, + PlayerSummonLimit, + AISacrificeLimit, + AISummonLimit, + ]), +] + @dataclass -class WargrooveOptions(PerGameCommonOptions): +class WargrooveOptions(DeathLinkMixin, PerGameCommonOptions): income_boost: IncomeBoost commander_defense_boost: CommanderDefenseBoost commander_choice: CommanderChoice + player_sacrifice_limit: PlayerSacrificeLimit + player_summon_limit: PlayerSummonLimit + ai_sacrifice_limit: AISacrificeLimit + ai_summon_limit: AISummonLimit + start_inventory_from_pool: StartInventoryPool diff --git a/worlds/wargroove/__init__.py b/worlds/wargroove/__init__.py index f204f468d1..e6bcc6288a 100644 --- a/worlds/wargroove/__init__.py +++ b/worlds/wargroove/__init__.py @@ -8,18 +8,42 @@ from .Locations import location_table from .Regions import create_regions from .Rules import set_rules from worlds.AutoWorld import World, WebWorld -from .Options import WargrooveOptions +from .Options import WargrooveOptions, wargroove_option_groups +from worlds.LauncherComponents import Component, components, Type, launch as launch_component + + +def launch_client(*args: str): + from .Client import launch + launch_component(launch, name="WargrooveClient", args=args) + + +components.append(Component("Wargroove Client", game_name="Wargroove", func=launch_client, component_type=Type.CLIENT)) class WargrooveSettings(settings.Group): class RootDirectory(settings.UserFolderPath): """ - Locate the Wargroove root directory on your system. - This is used by the Wargroove client, so it knows where to send communication files to + Locates the Wargroove root directory on your system. + This is used by the Wargroove client, so it knows where to send communication files to. """ description = "Wargroove root directory" + class SaveDirectory(settings.UserFolderPath): + """ + Locates the Wargroove save file directory on your system. + This is used by the Wargroove client, so it knows where to send mod and save files to. + """ + description = "Wargroove save file/appdata directory" + + def browse(self, **kwargs): + from Utils import messagebox + messagebox("AppData folder not found", + "WargrooveClient couldn't detect a path to the AppData folder.\n" + "Please select the folder containing the \"/Chucklefish/Wargroove/\" directories.") + super().browse(**kwargs) + root_directory: RootDirectory = RootDirectory("C:/Program Files (x86)/Steam/steamapps/common/Wargroove") + save_directory: SaveDirectory = SaveDirectory("%APPDATA%") class WargrooveWeb(WebWorld): @@ -32,6 +56,8 @@ class WargrooveWeb(WebWorld): ["Fly Sniper"] )] + option_groups = wargroove_option_groups + class WargrooveWorld(World): """ @@ -55,6 +81,11 @@ class WargrooveWorld(World): 'commander_defense_boost': self.options.commander_defense_boost.value, 'can_choose_commander': self.options.commander_choice.value != 0, 'commander_choice': self.options.commander_choice.value, + 'player_sacrifice_limit': self.options.player_sacrifice_limit.value, + 'player_summon_limit': self.options.player_summon_limit.value, + 'ai_sacrifice_limit': self.options.ai_sacrifice_limit.value, + 'ai_summon_limit': self.options.ai_summon_limit.value, + 'death_link': self.options.death_link.value, 'starting_groove_multiplier': 20 # Backwards compatibility in case this ever becomes an option } diff --git a/worlds/wargroove/data/mods/ArchipelagoMod/maps.dat b/worlds/wargroove/data/mods/ArchipelagoMod/maps.dat index a7ffb07331..fca94c194e 100644 Binary files a/worlds/wargroove/data/mods/ArchipelagoMod/maps.dat and b/worlds/wargroove/data/mods/ArchipelagoMod/maps.dat differ diff --git a/worlds/wargroove/data/mods/ArchipelagoMod/mod.dat b/worlds/wargroove/data/mods/ArchipelagoMod/mod.dat index 22464857e0..6a12724d9a 100644 Binary files a/worlds/wargroove/data/mods/ArchipelagoMod/mod.dat and b/worlds/wargroove/data/mods/ArchipelagoMod/mod.dat differ diff --git a/worlds/wargroove/data/mods/ArchipelagoMod/modAssets.dat b/worlds/wargroove/data/mods/ArchipelagoMod/modAssets.dat index 54026ab2c2..a51c17e954 100644 Binary files a/worlds/wargroove/data/mods/ArchipelagoMod/modAssets.dat and b/worlds/wargroove/data/mods/ArchipelagoMod/modAssets.dat differ diff --git a/worlds/wargroove/data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp b/worlds/wargroove/data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp index 93c4f3c887..f823aa0477 100644 Binary files a/worlds/wargroove/data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp and b/worlds/wargroove/data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp differ diff --git a/worlds/wargroove/data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp.bak b/worlds/wargroove/data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp.bak index a916c11619..2ad3d37a71 100644 Binary files a/worlds/wargroove/data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp.bak and b/worlds/wargroove/data/save/campaign-c40a6e5b0cdf86ddac03b276691c483d.cmp.bak differ diff --git a/worlds/wargroove/docs/en_Wargroove.md b/worlds/wargroove/docs/en_Wargroove.md index 31fd8c8130..b8dcc7aca8 100644 --- a/worlds/wargroove/docs/en_Wargroove.md +++ b/worlds/wargroove/docs/en_Wargroove.md @@ -1,4 +1,4 @@ -# Wargroove (Steam, Windows) +# Wargroove (Steam, Windows, Linux) ## Where is the options page? @@ -39,3 +39,5 @@ The following commands are only available when using the WargrooveClient to play - `/resync` Manually trigger a resync. - `/commander` Set the current commander to the given commander. +- `/deathlink` Toggle deathlink between On and Off. +- `/sacrifice_summon` Toggle sacrificing and summoning units between On and Off. diff --git a/worlds/wargroove/docs/wargroove_en.md b/worlds/wargroove/docs/wargroove_en.md index 9c2645178a..d23f58309b 100644 --- a/worlds/wargroove/docs/wargroove_en.md +++ b/worlds/wargroove/docs/wargroove_en.md @@ -2,8 +2,8 @@ ## Required Files -- Wargroove with the Double Trouble DLC installed through Steam on Windows - - Only the Steam Windows version is supported. MAC, Switch, Xbox, and Playstation are not supported. +- Wargroove with the Double Trouble DLC installed through Steam on Windows and Linux + - Only the Steam versions on Windows and Linux are supported. MAC, Switch, Xbox, and Playstation are not supported. - [The most recent Archipelago release](https://github.com/ArchipelagoMW/Archipelago/releases) ## Backup playerProgress files @@ -23,10 +23,20 @@ is strongly recommended in case they become corrupted. - You may have to replace all single \\ with \\\\. 4. Start the Wargroove client. +## Linux Only: Select AppData equivalent when starting the client +1. Shut down Wargroove if it is open. +2. Start the Archipelago Wargroove Client from the Archipelago Launcher. +3. A file select dialogue will appear, claiming it cannot detect a path to the AppData folder. +4. Navigate to your Steam install directory and select . +`/steamapps/compatdata/607050/pfx/drive_c/users/steamuser/AppData/Roaming` as the save directory. +5. Using a default Steam install path, the full AppData path is +`~/.steam/steam/steamapps/compatdata/607050/pfx/drive_c/users/steamuser/AppData/Roaming`. +6. The client should start. + ## Installing the Archipelago Wargroove Mod and Campaign files 1. Shut down Wargroove if it is open. -2. Start the ArchipelagoWargrooveClient.exe from the Archipelago installation. +2. Start the Archipelago Wargroove Client from the Archipelago Launcher. This should install the mod and campaign for you. 3. Start Wargroove. diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index b2e91c7cf0..6aaf2fdc0a 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -27,14 +27,32 @@ from .rules import set_rules class WitnessWebWorld(WebWorld): theme = "jungle" - tutorials = [Tutorial( + setup_en = Tutorial( "Multiworld Setup Guide", "A guide to playing The Witness with Archipelago.", "English", "setup_en.md", "setup/en", ["NewSoupVi", "Jarno"] - )] + ) + setup_de = Tutorial( + setup_en.tutorial_name, + setup_en.description, + "German", + "setup_de.md", + "setup/de", + ["NewSoupVi"] + ) + setup_fr = Tutorial( + setup_en.tutorial_name, + setup_en.description, + "Français", + "setup_fr.md", + "setup/fr", + ["Rever"] + ) + + tutorials = [setup_en, setup_de, setup_fr] options_presets = witness_option_presets option_groups = witness_option_groups @@ -86,7 +104,6 @@ class WitnessWorld(World): "item_id_to_door_hexes": static_witness_items.get_item_to_door_mappings(), "door_items_in_the_pool": self.player_items.get_door_item_ids_in_pool(), "doors_that_shouldnt_be_locked": [int(h, 16) for h in self.player_logic.FORBIDDEN_DOORS], - "symbols_not_in_the_game": self.player_items.get_symbol_ids_not_in_pool(), "disabled_entities": [int(h, 16) for h in self.player_logic.COMPLETELY_DISABLED_ENTITIES], "hunt_entities": [int(h, 16) for h in self.player_logic.HUNT_ENTITIES], "log_ids_to_hints": self.log_ids_to_hints, @@ -94,7 +111,6 @@ class WitnessWorld(World): "progressive_item_lists": self.player_items.get_progressive_item_ids_in_pool(), "obelisk_side_id_to_EPs": static_witness_logic.OBELISK_SIDE_ID_TO_EP_HEXES, "precompleted_puzzles": [int(h, 16) for h in self.player_logic.EXCLUDED_ENTITIES], - "entity_to_name": static_witness_logic.ENTITY_ID_TO_NAME, "panel_hunt_required_absolute": self.panel_hunt_required_count } @@ -239,7 +255,7 @@ class WitnessWorld(World): needed_size = 2 needed_size += self.options.puzzle_randomization == "sigma_expert" needed_size += self.options.shuffle_symbols - needed_size += self.options.shuffle_doors > 0 + needed_size += self.options.shuffle_doors != "off" # Then, add checks in order until the required amount of sphere 1 checks is met. diff --git a/worlds/witness/data/static_locations.py b/worlds/witness/data/static_locations.py index a5cfc3b49f..029dcd5dcb 100644 --- a/worlds/witness/data/static_locations.py +++ b/worlds/witness/data/static_locations.py @@ -18,6 +18,7 @@ GENERAL_LOCATIONS = { "Outside Tutorial Outpost Entry Panel", "Outside Tutorial Outpost Exit Panel", + "Glass Factory Entry Panel", "Glass Factory Discard", "Glass Factory Back Wall 5", "Glass Factory Front 3", diff --git a/worlds/witness/docs/setup_de.md b/worlds/witness/docs/setup_de.md new file mode 100644 index 0000000000..82865bb134 --- /dev/null +++ b/worlds/witness/docs/setup_de.md @@ -0,0 +1,46 @@ +# The Witness Randomizer Setup + +## Benötigte Software + +- [The Witness für ein 64-bit-Windows-Betriebssystem (z.B. Steam-Version)](https://store.steampowered.com/app/210970/The_Witness/) +- [The Witness Archipelago Randomizer](https://github.com/NewSoupVi/The-Witness-Randomizer-for-Archipelago/releases/latest) + +## Optionale Software + +- [ArchipelagoTextClient](https://github.com/ArchipelagoMW/Archipelago/releases) +- [The Witness Auto-Tracker mit Kartenansicht](https://github.com/NewSoupVi/witness_archipelago_tracker/releases), benutzbar mit [PopTracker](https://github.com/black-sliver/PopTracker/releases) + +## Verbindung mit einem Multiworld-Spiel + +1. Öffne The Witness. +2. Erstelle einen neuen Speicherstand. +3. Öffne [The Witness Archipelago Randomizer](https://github.com/NewSoupVi/The-Witness-Randomizer-for-Archipelago/releases/latest). +4. Gib die Archipelago-Adresse, deinen Namen und evtl. das Passwort ein. +5. Drücke "Connect". +6. Viel Spaß! + +Wenn du ein vorheriges Spiel fortsetzen willst, ist das auch möüglich: + +1. Öffne The Witness. +2. Lade den Speicherstand für das Multiworld-Spiel, das du weiterspielen willst - Wenn das nicht sowieso schon der ist, den das Spiel automatisch geladen hat. +3. Öffne [The Witness Archipelago Randomizer](https://github.com/NewSoupVi/The-Witness-Randomizer-for-Archipelago/releases/latest). +4. Drücke "Load Credentials", um Adresse, Namen und Passwort automatisch zu laden (oder tippe diese manuell ein). +5. Drücke "Connect". + +## Archipelago Text Client + +Es ist empfehlenswert, den "Archipelago Text Client", der eine Textansicht für gesendete und erhaltene Items liefert, beim Spielen nebenbei sichtbar zu haben. +
Diese Nachrichten werden zwar auch im Spiel angezeigt, jedoch nur für ein paar Sekunden. Es ist leicht, eine dieser Nachrichten zu übersehen. + +

Alternativ gibt es den visuellen Auto-Tracker mit Kartenansicht, der im nächsten Kapitel beschrieben wird. + +## Auto-Tracking + +The Witness hat einen voll funktionsfähigen Tracker mit Kartenansicht und Autotracking. + +1. Installiere [PopTracker](https://github.com/black-sliver/PopTracker/releases) und lade den [The Witness Auto-Tracker mit Kartenansicht](https://github.com/NewSoupVi/witness_archipelago_tracker/releases) herunter. +2. Öffne PopTracker, und lade das "The Witness"-Packet. +3. Klicke auf das "AP"-Symbol am oberen Fensterrand. +4. Gib die Archipelago-Adresse, deinen Namen und evtl. das Passwort ein. + +Der Rest sollte vollautomatisch ohne weitere Eingabe funktionieren. Der Tracker wird deine momentanen Items anzeigen und lösbare Rätsel grün auf der Karte anzeigen. Sobald du eine Rätselsequenz abschließt, wird sie grau markiert. \ No newline at end of file diff --git a/worlds/witness/docs/setup_fr.md b/worlds/witness/docs/setup_fr.md new file mode 100644 index 0000000000..db88911b92 --- /dev/null +++ b/worlds/witness/docs/setup_fr.md @@ -0,0 +1,47 @@ +# Guide d'installation du Witness randomizer + +## Logiciels Requis + +- [The Witness pour Windows 64-bit (par exemple, la version Steam)](https://store.steampowered.com/app/210970/The_Witness/) +- [The Witness Archipelago Randomizer](https://github.com/NewSoupVi/The-Witness-Randomizer-for-Archipelago/releases/latest) + +## Logiciels Facultatifs + +- [ArchipelagoTextClient](https://github.com/ArchipelagoMW/Archipelago/releases) +- [The Witness Map- et Auto-Tracker](https://github.com/NewSoupVi/witness_archipelago_tracker/releases), pour usage avec [PopTracker](https://github.com/black-sliver/PopTracker/releases) + +## Rejoindre un jeu multimonde + +1. Lancez The Witness +2. Commencez une nouvelle partie +3. Lancez [The Witness Archipelago Randomizer](https://github.com/NewSoupVi/The-Witness-Randomizer-for-Archipelago/releases/latest) +4. Inscrivez l'adresse Archipelago, votre nom de joueur et le mot de passe du jeu multimonde +5. Cliquez sur "Connect" +6. Jouez! + +Pour continuer un jeu multimonde précedemment commencé: + +1. Lancez The Witness +2. Chargez la sauvegarde sur laquelle vous avez dernièrement joué ce monde, si ce n'est pas celle qui a été chargée automatiquement +3. Lancez [The Witness Archipelago Randomizer](https://github.com/NewSoupVi/The-Witness-Randomizer-for-Archipelago/releases/latest) +4. Cliquez sur "Load Credentials" (ou tapez les manuellement) +5. Cliquez sur "Connect" + +## Archipelago Text Client + +Il est recommandé d'utiliser le "Archipelago Text Client" en parallèle afin de suivre quels items vous envoyez et recevez. +
The Witness affiche également ces informations en jeu, mais seulement pour une courte période et donc il est facile de manquer ces messages. + +

Bien sûr, vous pouvez également utiliser l'auto-tracker! + +## Auto-Tracking + +The Witness a un tracker fonctionnel qui supporte l'auto-tracking. + +1. Téléchargez [The Witness Map- and Auto-Tracker](https://github.com/NewSoupVi/witness_archipelago_tracker/releases) et [PopTracker](https://github.com/black-sliver/PopTracker/releases). +2. Ouvrez Poptracker, puis chargez le pack Witness. +3. Cliquez sur l'icone "AP" qui se situe au dessus de la carte. +4. Inscrivez l'adresse Archipelago, votre nom de joueur et le mot de passe du jeu multimonde. + +Le reste devrait être pris en charge par Poptracker - les items que vous recevrez et les puzzles que vous résolverez seront automatiquement indiqués. De plus, Poptracker est en mesure de détecter +vos paramètres de jeu - les puzzles accessibles seront alors masqués ou affichés en fonction de vos paramètres de randomization et de logique. Veuillez noter que le tracker peut être obsolète. \ No newline at end of file diff --git a/worlds/witness/hints.py b/worlds/witness/hints.py index c82024cc12..ac5572257f 100644 --- a/worlds/witness/hints.py +++ b/worlds/witness/hints.py @@ -129,7 +129,7 @@ def get_priority_hint_items(world: "WitnessWorld") -> List[str]: "Shadows Laser", ] - if world.options.shuffle_doors >= 2: + if world.options.shuffle_doors >= "doors": priority.add("Desert Laser") priority.update(world.random.sample(lasers, 5)) diff --git a/worlds/witness/player_logic.py b/worlds/witness/player_logic.py index 52bddde17e..aed6d3da66 100644 --- a/worlds/witness/player_logic.py +++ b/worlds/witness/player_logic.py @@ -435,7 +435,7 @@ class WitnessPlayerLogic: postgame_adjustments = [] # Make some quick references to some options - remote_doors = world.options.shuffle_doors >= 2 # "Panels" mode has no region accessibility implications. + remote_doors = world.options.shuffle_doors >= "doors" # "Panels" mode has no region accessibility implications. early_caves = world.options.early_caves victory = world.options.victory_condition mnt_lasers = world.options.mountain_lasers @@ -592,7 +592,7 @@ class WitnessPlayerLogic: # Make condensed references to some options - remote_doors = world.options.shuffle_doors >= 2 # "Panels" mode has no overarching region access implications. + remote_doors = world.options.shuffle_doors >= "doors" # "Panels" mode has no region access implications. lasers = world.options.shuffle_lasers victory = world.options.victory_condition mnt_lasers = world.options.mountain_lasers diff --git a/worlds/witness/test/__init__.py b/worlds/witness/test/__init__.py index c3b427851a..e69de29bb2 100644 --- a/worlds/witness/test/__init__.py +++ b/worlds/witness/test/__init__.py @@ -1,196 +0,0 @@ -from typing import Any, ClassVar, Dict, Iterable, List, Mapping, Union - -from BaseClasses import CollectionState, Entrance, Item, Location, Region - -from test.bases import WorldTestBase -from test.general import gen_steps, setup_multiworld -from test.multiworld.test_multiworlds import MultiworldTestBase - -from .. import WitnessWorld -from ..data.utils import cast_not_none - - -class WitnessTestBase(WorldTestBase): - game = "The Witness" - player: ClassVar[int] = 1 - - world: WitnessWorld - - def can_beat_game_with_items(self, items: Iterable[Item]) -> bool: - """ - Check that the items listed are enough to beat the game. - """ - - state = CollectionState(self.multiworld) - for item in items: - state.collect(item) - return state.multiworld.can_beat_game(state) - - def assert_dependency_on_event_item(self, spot: Union[Location, Region, Entrance], item_name: str) -> None: - """ - WorldTestBase.assertAccessDependency, but modified & simplified to work with event items - """ - event_items = [item for item in self.multiworld.get_items() if item.name == item_name] - self.assertTrue(event_items, f"Event item {item_name} does not exist.") - - event_locations = [cast_not_none(event_item.location) for event_item in event_items] - - # Checking for an access dependency on an event item requires a bit of extra work, - # as state.remove forces a sweep, which will pick up the event item again right after we tried to remove it. - # So, we temporarily set the access rules of the event locations to be impossible. - original_rules = {event_location.name: event_location.access_rule for event_location in event_locations} - for event_location in event_locations: - event_location.access_rule = lambda _: False - - # We can't use self.assertAccessDependency here, it doesn't work for event items. (As of 2024-06-30) - test_state = self.multiworld.get_all_state(False) - - self.assertFalse(spot.can_reach(test_state), f"{spot.name} is reachable without {item_name}") - - test_state.collect(event_items[0]) - - self.assertTrue(spot.can_reach(test_state), f"{spot.name} is not reachable despite having {item_name}") - - # Restore original access rules. - for event_location in event_locations: - event_location.access_rule = original_rules[event_location.name] - - def assert_location_exists(self, location_name: str, strict_check: bool = True) -> None: - """ - Assert that a location exists in this world. - If strict_check, also make sure that this (non-event) location COULD exist. - """ - - if strict_check: - self.assertIn(location_name, self.world.location_name_to_id, f"Location {location_name} can never exist") - - try: - self.world.get_location(location_name) - except KeyError: - self.fail(f"Location {location_name} does not exist.") - - def assert_location_does_not_exist(self, location_name: str, strict_check: bool = True) -> None: - """ - Assert that a location exists in this world. - If strict_check, be explicit about whether the location could exist in the first place. - """ - - if strict_check: - self.assertIn(location_name, self.world.location_name_to_id, f"Location {location_name} can never exist") - - self.assertRaises( - KeyError, - lambda _: self.world.get_location(location_name), - f"Location {location_name} exists, but is not supposed to.", - ) - - def assert_can_beat_with_minimally(self, required_item_counts: Mapping[str, int]) -> None: - """ - Assert that the specified mapping of items is enough to beat the game, - and that having one less of any item would result in the game being unbeatable. - """ - # Find the actual items - found_items = [item for item in self.multiworld.get_items() if item.name in required_item_counts] - actual_items: Dict[str, List[Item]] = {item_name: [] for item_name in required_item_counts} - for item in found_items: - if len(actual_items[item.name]) < required_item_counts[item.name]: - actual_items[item.name].append(item) - - # Assert that enough items exist in the item pool to satisfy the specified required counts - for item_name, item_objects in actual_items.items(): - self.assertEqual( - len(item_objects), - required_item_counts[item_name], - f"Couldn't find {required_item_counts[item_name]} copies of item {item_name} available in the pool, " - f"only found {len(item_objects)}", - ) - - # assert that multiworld is beatable with the items specified - self.assertTrue( - self.can_beat_game_with_items(item for items in actual_items.values() for item in items), - f"Could not beat game with items: {required_item_counts}", - ) - - # assert that one less copy of any item would result in the multiworld being unbeatable - for item_name, item_objects in actual_items.items(): - with self.subTest(f"Verify cannot beat game with one less copy of {item_name}"): - removed_item = item_objects.pop() - self.assertFalse( - self.can_beat_game_with_items(item for items in actual_items.values() for item in items), - f"Game was beatable despite having {len(item_objects)} copies of {item_name} " - f"instead of the specified {required_item_counts[item_name]}", - ) - item_objects.append(removed_item) - - -class WitnessMultiworldTestBase(MultiworldTestBase): - options_per_world: List[Dict[str, Any]] - common_options: Dict[str, Any] = {} - - def setUp(self) -> None: - """ - Set up a multiworld with multiple players, each using different options. - """ - - self.multiworld = setup_multiworld([WitnessWorld] * len(self.options_per_world), ()) - - for world, options in zip(self.multiworld.worlds.values(), self.options_per_world): - for option_name, option_value in {**self.common_options, **options}.items(): - option = getattr(world.options, option_name) - self.assertIsNotNone(option) - - option.value = option.from_any(option_value).value - - self.assertSteps(gen_steps) - - def collect_by_name(self, item_names: Union[str, Iterable[str]], player: int) -> List[Item]: - """ - Collect all copies of a specified item name (or list of item names) for a player in the multiworld item pool. - """ - - items = self.get_items_by_name(item_names, player) - for item in items: - self.multiworld.state.collect(item) - return items - - def get_items_by_name(self, item_names: Union[str, Iterable[str]], player: int) -> List[Item]: - """ - Return all copies of a specified item name (or list of item names) for a player in the multiworld item pool. - """ - - if isinstance(item_names, str): - item_names = (item_names,) - return [item for item in self.multiworld.itempool if item.name in item_names and item.player == player] - - def assert_location_exists(self, location_name: str, player: int, strict_check: bool = True) -> None: - """ - Assert that a location exists in this world. - If strict_check, also make sure that this (non-event) location COULD exist. - """ - - world = self.multiworld.worlds[player] - - if strict_check: - self.assertIn(location_name, world.location_name_to_id, f"Location {location_name} can never exist") - - try: - world.get_location(location_name) - except KeyError: - self.fail(f"Location {location_name} does not exist.") - - def assert_location_does_not_exist(self, location_name: str, player: int, strict_check: bool = True) -> None: - """ - Assert that a location exists in this world. - If strict_check, be explicit about whether the location could exist in the first place. - """ - - world = self.multiworld.worlds[player] - - if strict_check: - self.assertIn(location_name, world.location_name_to_id, f"Location {location_name} can never exist") - - self.assertRaises( - KeyError, - lambda _: world.get_location(location_name), - f"Location {location_name} exists, but is not supposed to.", - ) diff --git a/worlds/witness/test/bases.py b/worlds/witness/test/bases.py new file mode 100644 index 0000000000..c3b427851a --- /dev/null +++ b/worlds/witness/test/bases.py @@ -0,0 +1,196 @@ +from typing import Any, ClassVar, Dict, Iterable, List, Mapping, Union + +from BaseClasses import CollectionState, Entrance, Item, Location, Region + +from test.bases import WorldTestBase +from test.general import gen_steps, setup_multiworld +from test.multiworld.test_multiworlds import MultiworldTestBase + +from .. import WitnessWorld +from ..data.utils import cast_not_none + + +class WitnessTestBase(WorldTestBase): + game = "The Witness" + player: ClassVar[int] = 1 + + world: WitnessWorld + + def can_beat_game_with_items(self, items: Iterable[Item]) -> bool: + """ + Check that the items listed are enough to beat the game. + """ + + state = CollectionState(self.multiworld) + for item in items: + state.collect(item) + return state.multiworld.can_beat_game(state) + + def assert_dependency_on_event_item(self, spot: Union[Location, Region, Entrance], item_name: str) -> None: + """ + WorldTestBase.assertAccessDependency, but modified & simplified to work with event items + """ + event_items = [item for item in self.multiworld.get_items() if item.name == item_name] + self.assertTrue(event_items, f"Event item {item_name} does not exist.") + + event_locations = [cast_not_none(event_item.location) for event_item in event_items] + + # Checking for an access dependency on an event item requires a bit of extra work, + # as state.remove forces a sweep, which will pick up the event item again right after we tried to remove it. + # So, we temporarily set the access rules of the event locations to be impossible. + original_rules = {event_location.name: event_location.access_rule for event_location in event_locations} + for event_location in event_locations: + event_location.access_rule = lambda _: False + + # We can't use self.assertAccessDependency here, it doesn't work for event items. (As of 2024-06-30) + test_state = self.multiworld.get_all_state(False) + + self.assertFalse(spot.can_reach(test_state), f"{spot.name} is reachable without {item_name}") + + test_state.collect(event_items[0]) + + self.assertTrue(spot.can_reach(test_state), f"{spot.name} is not reachable despite having {item_name}") + + # Restore original access rules. + for event_location in event_locations: + event_location.access_rule = original_rules[event_location.name] + + def assert_location_exists(self, location_name: str, strict_check: bool = True) -> None: + """ + Assert that a location exists in this world. + If strict_check, also make sure that this (non-event) location COULD exist. + """ + + if strict_check: + self.assertIn(location_name, self.world.location_name_to_id, f"Location {location_name} can never exist") + + try: + self.world.get_location(location_name) + except KeyError: + self.fail(f"Location {location_name} does not exist.") + + def assert_location_does_not_exist(self, location_name: str, strict_check: bool = True) -> None: + """ + Assert that a location exists in this world. + If strict_check, be explicit about whether the location could exist in the first place. + """ + + if strict_check: + self.assertIn(location_name, self.world.location_name_to_id, f"Location {location_name} can never exist") + + self.assertRaises( + KeyError, + lambda _: self.world.get_location(location_name), + f"Location {location_name} exists, but is not supposed to.", + ) + + def assert_can_beat_with_minimally(self, required_item_counts: Mapping[str, int]) -> None: + """ + Assert that the specified mapping of items is enough to beat the game, + and that having one less of any item would result in the game being unbeatable. + """ + # Find the actual items + found_items = [item for item in self.multiworld.get_items() if item.name in required_item_counts] + actual_items: Dict[str, List[Item]] = {item_name: [] for item_name in required_item_counts} + for item in found_items: + if len(actual_items[item.name]) < required_item_counts[item.name]: + actual_items[item.name].append(item) + + # Assert that enough items exist in the item pool to satisfy the specified required counts + for item_name, item_objects in actual_items.items(): + self.assertEqual( + len(item_objects), + required_item_counts[item_name], + f"Couldn't find {required_item_counts[item_name]} copies of item {item_name} available in the pool, " + f"only found {len(item_objects)}", + ) + + # assert that multiworld is beatable with the items specified + self.assertTrue( + self.can_beat_game_with_items(item for items in actual_items.values() for item in items), + f"Could not beat game with items: {required_item_counts}", + ) + + # assert that one less copy of any item would result in the multiworld being unbeatable + for item_name, item_objects in actual_items.items(): + with self.subTest(f"Verify cannot beat game with one less copy of {item_name}"): + removed_item = item_objects.pop() + self.assertFalse( + self.can_beat_game_with_items(item for items in actual_items.values() for item in items), + f"Game was beatable despite having {len(item_objects)} copies of {item_name} " + f"instead of the specified {required_item_counts[item_name]}", + ) + item_objects.append(removed_item) + + +class WitnessMultiworldTestBase(MultiworldTestBase): + options_per_world: List[Dict[str, Any]] + common_options: Dict[str, Any] = {} + + def setUp(self) -> None: + """ + Set up a multiworld with multiple players, each using different options. + """ + + self.multiworld = setup_multiworld([WitnessWorld] * len(self.options_per_world), ()) + + for world, options in zip(self.multiworld.worlds.values(), self.options_per_world): + for option_name, option_value in {**self.common_options, **options}.items(): + option = getattr(world.options, option_name) + self.assertIsNotNone(option) + + option.value = option.from_any(option_value).value + + self.assertSteps(gen_steps) + + def collect_by_name(self, item_names: Union[str, Iterable[str]], player: int) -> List[Item]: + """ + Collect all copies of a specified item name (or list of item names) for a player in the multiworld item pool. + """ + + items = self.get_items_by_name(item_names, player) + for item in items: + self.multiworld.state.collect(item) + return items + + def get_items_by_name(self, item_names: Union[str, Iterable[str]], player: int) -> List[Item]: + """ + Return all copies of a specified item name (or list of item names) for a player in the multiworld item pool. + """ + + if isinstance(item_names, str): + item_names = (item_names,) + return [item for item in self.multiworld.itempool if item.name in item_names and item.player == player] + + def assert_location_exists(self, location_name: str, player: int, strict_check: bool = True) -> None: + """ + Assert that a location exists in this world. + If strict_check, also make sure that this (non-event) location COULD exist. + """ + + world = self.multiworld.worlds[player] + + if strict_check: + self.assertIn(location_name, world.location_name_to_id, f"Location {location_name} can never exist") + + try: + world.get_location(location_name) + except KeyError: + self.fail(f"Location {location_name} does not exist.") + + def assert_location_does_not_exist(self, location_name: str, player: int, strict_check: bool = True) -> None: + """ + Assert that a location exists in this world. + If strict_check, be explicit about whether the location could exist in the first place. + """ + + world = self.multiworld.worlds[player] + + if strict_check: + self.assertIn(location_name, world.location_name_to_id, f"Location {location_name} can never exist") + + self.assertRaises( + KeyError, + lambda _: world.get_location(location_name), + f"Location {location_name} exists, but is not supposed to.", + ) diff --git a/worlds/witness/test/test_auto_elevators.py b/worlds/witness/test/test_auto_elevators.py index f91943e855..6762657b8e 100644 --- a/worlds/witness/test/test_auto_elevators.py +++ b/worlds/witness/test/test_auto_elevators.py @@ -1,4 +1,4 @@ -from ..test import WitnessMultiworldTestBase +from ..test.bases import WitnessMultiworldTestBase class TestElevatorsComeToYouBleed(WitnessMultiworldTestBase): diff --git a/worlds/witness/test/test_disable_non_randomized.py b/worlds/witness/test/test_disable_non_randomized.py index bf285f035d..00071ec5f6 100644 --- a/worlds/witness/test/test_disable_non_randomized.py +++ b/worlds/witness/test/test_disable_non_randomized.py @@ -1,5 +1,5 @@ from ..rules import _has_lasers -from ..test import WitnessTestBase +from ..test.bases import WitnessTestBase class TestDisableNonRandomized(WitnessTestBase): diff --git a/worlds/witness/test/test_door_shuffle.py b/worlds/witness/test/test_door_shuffle.py index ca4d6e0aa8..be0a3332f3 100644 --- a/worlds/witness/test/test_door_shuffle.py +++ b/worlds/witness/test/test_door_shuffle.py @@ -1,7 +1,7 @@ from typing import cast from .. import WitnessWorld -from ..test import WitnessMultiworldTestBase, WitnessTestBase +from ..test.bases import WitnessMultiworldTestBase, WitnessTestBase class TestIndividualDoors(WitnessTestBase): diff --git a/worlds/witness/test/test_easter_egg_shuffle.py b/worlds/witness/test/test_easter_egg_shuffle.py index 300d32f97f..a95357c6e1 100644 --- a/worlds/witness/test/test_easter_egg_shuffle.py +++ b/worlds/witness/test/test_easter_egg_shuffle.py @@ -3,7 +3,7 @@ from typing import cast from BaseClasses import LocationProgressType from .. import WitnessWorld -from ..test import WitnessMultiworldTestBase +from ..test.bases import WitnessMultiworldTestBase class TestEasterEggShuffle(WitnessMultiworldTestBase): diff --git a/worlds/witness/test/test_ep_shuffle.py b/worlds/witness/test/test_ep_shuffle.py index 3423909166..17297fbcf3 100644 --- a/worlds/witness/test/test_ep_shuffle.py +++ b/worlds/witness/test/test_ep_shuffle.py @@ -1,4 +1,4 @@ -from ..test import WitnessTestBase +from ..test.bases import WitnessTestBase class TestIndividualEPs(WitnessTestBase): diff --git a/worlds/witness/test/test_lasers.py b/worlds/witness/test/test_lasers.py index 5e60dfc521..5681757161 100644 --- a/worlds/witness/test/test_lasers.py +++ b/worlds/witness/test/test_lasers.py @@ -1,4 +1,4 @@ -from ..test import WitnessTestBase +from ..test.bases import WitnessTestBase class TestSymbolsRequiredToWinElevatorNormal(WitnessTestBase): diff --git a/worlds/witness/test/test_panel_hunt.py b/worlds/witness/test/test_panel_hunt.py index 2f8434802b..6dea655070 100644 --- a/worlds/witness/test/test_panel_hunt.py +++ b/worlds/witness/test/test_panel_hunt.py @@ -1,6 +1,6 @@ from BaseClasses import CollectionState -from worlds.witness.test import WitnessMultiworldTestBase, WitnessTestBase +from ..test.bases import WitnessMultiworldTestBase, WitnessTestBase class TestMaxPanelHuntMinChecks(WitnessTestBase): diff --git a/worlds/witness/test/test_roll_other_options.py b/worlds/witness/test/test_roll_other_options.py index 05f3235a1f..72313034e4 100644 --- a/worlds/witness/test/test_roll_other_options.py +++ b/worlds/witness/test/test_roll_other_options.py @@ -1,5 +1,5 @@ from ..options import ElevatorsComeToYou -from ..test import WitnessTestBase +from ..test.bases import WitnessTestBase # These are just some random options combinations, just to catch whether I broke anything obvious diff --git a/worlds/witness/test/test_symbol_shuffle.py b/worlds/witness/test/test_symbol_shuffle.py index 3be874f3c0..fb1d820815 100644 --- a/worlds/witness/test/test_symbol_shuffle.py +++ b/worlds/witness/test/test_symbol_shuffle.py @@ -1,4 +1,4 @@ -from ..test import WitnessMultiworldTestBase, WitnessTestBase +from ..test.bases import WitnessMultiworldTestBase, WitnessTestBase class TestSymbols(WitnessTestBase): diff --git a/worlds/witness/test/test_weird_traversals.py b/worlds/witness/test/test_weird_traversals.py index 47b69b01fb..9447a13922 100644 --- a/worlds/witness/test/test_weird_traversals.py +++ b/worlds/witness/test/test_weird_traversals.py @@ -1,4 +1,4 @@ -from ..test import WitnessTestBase +from ..test.bases import WitnessTestBase class TestWeirdTraversalRequirements(WitnessTestBase): diff --git a/worlds/yugioh06/__init__.py b/worlds/yugioh06/__init__.py index 9070683f33..5d4cddd95c 100644 --- a/worlds/yugioh06/__init__.py +++ b/worlds/yugioh06/__init__.py @@ -56,7 +56,7 @@ class Yugioh06Web(WebWorld): "A guide to setting up Yu-Gi-Oh! - Ultimate Masters Edition - World Championship Tournament 2006 " "for Archipelago on your computer.", "English", - "docs/setup_en.md", + "setup_en.md", "setup/en", ["Rensen"], ) diff --git a/worlds/zillion/__init__.py b/worlds/zillion/__init__.py index 588654d259..02ef920d8f 100644 --- a/worlds/zillion/__init__.py +++ b/worlds/zillion/__init__.py @@ -168,8 +168,8 @@ class ZillionWorld(World): def create_regions(self) -> None: assert self.zz_system.randomizer, "generate_early hasn't been called" assert self.id_to_zz_item, "generate_early hasn't been called" - p = self.player - logic_cache = ZillionLogicCache(p, self.zz_system.randomizer, self.id_to_zz_item) + player = self.player + logic_cache = ZillionLogicCache(player, self.zz_system.randomizer, self.id_to_zz_item) self.logic_cache = logic_cache w = self.multiworld self.my_locations = [] @@ -192,7 +192,7 @@ class ZillionWorld(World): all_regions: dict[str, ZillionRegion] = {} for here_zz_name, zz_r in self.zz_system.randomizer.regions.items(): here_name = "Menu" if here_zz_name == "start" else zz_reg_name_to_reg_name(here_zz_name) - all_regions[here_name] = ZillionRegion(zz_r, here_name, here_name, p, w) + all_regions[here_name] = ZillionRegion(zz_r, here_name, here_name, player, w) self.multiworld.regions.append(all_regions[here_name]) limited_skill = Req(gun=3, jump=3, skill=self.zz_system.randomizer.options.skill, hp=940, red=1, floppy=126) @@ -239,7 +239,7 @@ class ZillionWorld(World): for zz_dest in zz_here.connections.keys(): dest_name = "Menu" if zz_dest.name == "start" else zz_reg_name_to_reg_name(zz_dest.name) dest = all_regions[dest_name] - exit_ = Entrance(p, f"{here_name} to {dest_name}", here) + exit_ = Entrance(player, f"{here_name} to {dest_name}", here) here.exits.append(exit_) exit_.connect(dest) @@ -248,6 +248,11 @@ class ZillionWorld(World): if self.options.priority_dead_ends.value: self.options.priority_locations.value |= {loc.name for loc in dead_end_locations} + # main location name is an alias + main_loc_name = self.zz_system.randomizer.loc_name_2_pretty[self.zz_system.randomizer.locations["main"].name] + self.multiworld.get_location(main_loc_name, player).place_locked_item(self.create_item("Win")) + self.multiworld.completion_condition[player] = lambda state: state.has("Win", player) + @override def create_items(self) -> None: if not self.id_to_zz_item: @@ -272,17 +277,6 @@ class ZillionWorld(World): self.logger.debug(f"Zillion Items: {item_name} 1") self.multiworld.itempool.append(self.create_item(item_name)) - @override - def generate_basic(self) -> None: - assert self.zz_system.randomizer, "generate_early hasn't been called" - # main location name is an alias - main_loc_name = self.zz_system.randomizer.loc_name_2_pretty[self.zz_system.randomizer.locations["main"].name] - - self.multiworld.get_location(main_loc_name, self.player)\ - .place_locked_item(self.create_item("Win")) - self.multiworld.completion_condition[self.player] = \ - lambda state: state.has("Win", self.player) - @staticmethod def stage_generate_basic(multiworld: MultiWorld, *args: Any) -> None: # noqa: ANN401 # item link pools are about to be created in main diff --git a/worlds/zillion/patch.py b/worlds/zillion/patch.py index 0eee3315f4..e28d70f181 100644 --- a/worlds/zillion/patch.py +++ b/worlds/zillion/patch.py @@ -1,5 +1,5 @@ import os -from typing import BinaryIO +from typing import Any, BinaryIO import zipfile from typing_extensions import override @@ -46,9 +46,10 @@ class ZillionPatch(APAutoPatchInterface): compress_type=zipfile.ZIP_DEFLATED) @override - def read_contents(self, opened_zipfile: zipfile.ZipFile) -> None: - super().read_contents(opened_zipfile) + def read_contents(self, opened_zipfile: zipfile.ZipFile) -> dict[str, Any]: + manifest = super().read_contents(opened_zipfile) self.gen_data_str = opened_zipfile.read("gen_data.json").decode() + return manifest @override def patch(self, target: str) -> None: diff --git a/worlds_disabled/README.md b/worlds_disabled/README.md deleted file mode 100644 index a7bffe222b..0000000000 --- a/worlds_disabled/README.md +++ /dev/null @@ -1,13 +0,0 @@ -## Folder Purpose - -This folder is for already merged worlds that are unmaintained and currently broken. If you are interested in fixing and -stepping up as maintainer for any of these worlds, please review the [world maintainer](/docs/world%20maintainer.md) -documentation. - -## Information for Disabled Worlds - -For each disabled world, a README file can be found detailing when the world was disabled and the reasons that it -was disabled. In order to be considered for reactivation, these concerns should be handled at a bare minimum. However, -each world may have additional issues that also need to be handled, such as deprecated API calls or missing components. - - diff --git a/worlds_disabled/oribf/Items.py b/worlds_disabled/oribf/Items.py deleted file mode 100644 index 788b802de3..0000000000 --- a/worlds_disabled/oribf/Items.py +++ /dev/null @@ -1,10 +0,0 @@ -# generated by https://github.com/Berserker66/ori_rando_server -# do not edit manually - -from typing import Dict - -item_table: Dict[str, int] = \ - {'EX100': 262144, 'AC': 262145, 'Bash': 262146, 'HC': 262147, 'Plant': 262148, 'MapStone': 262149, 'ChargeFlame': 262150, 'ChargeJump': 262151, 'Climb': 262152, 'MS': 262153, 'Dash': 262154, 'EC': 262155, 'EX200': 262156, 'DoubleJump': 262157, 'EX15': 262158, 'Wind': 262159, 'KS': 262160, 'Water': 262161, 'Glide': 262162, 'Grenade': 262163, 'ForlornKey': 262164, 'CS': 262165, 'Stomp': 262166, 'HoruKey': 262167, 'WallJump': 262168, 'GinsoKey': 262169} - -default_pool: Dict[str, int] = \ - {'EX100': 53, 'AC': 33, 'Bash': 1, 'HC': 12, 'Plant': 24, 'MapStone': 9, 'ChargeFlame': 1, 'ChargeJump': 1, 'Climb': 1, 'MS': 9, 'Dash': 1, 'EC': 14, 'EX200': 29, 'DoubleJump': 1, 'EX15': 6, 'Wind': 1, 'KS': 40, 'Water': 1, 'Glide': 1, 'Grenade': 1, 'ForlornKey': 1, 'CS': 8, 'Stomp': 1, 'HoruKey': 1, 'WallJump': 1, 'GinsoKey': 1} \ No newline at end of file diff --git a/worlds_disabled/oribf/Locations.py b/worlds_disabled/oribf/Locations.py deleted file mode 100644 index 1522fb557e..0000000000 --- a/worlds_disabled/oribf/Locations.py +++ /dev/null @@ -1,262 +0,0 @@ -# generated by https://github.com/Berserker66/ori_rando_server -# do not edit manually - -from .Types import * - -locations_data = \ - {'AboveChargeFlameTreeExp': Location(code=262144, vanilla_item='EX100'), - 'AboveChargeJumpAbilityCell': Location(code=262145, vanilla_item='AC'), - 'AboveFourthHealth': Location(code=262146, vanilla_item='AC'), - 'AboveGrottoTeleporterExp': Location(code=262147, vanilla_item='EX100'), - 'BashAreaExp': Location(code=262148, vanilla_item='EX100'), - 'BashSkillTree': Location(code=262149, vanilla_item='SKBash'), - 'BelowGrottoTeleporterHealthCell': Location(code=262150, vanilla_item='HC'), - 'BelowGrottoTeleporterPlant': Location(code=262151, vanilla_item='Plant'), - 'BlackrootBoulderExp': Location(code=262152, vanilla_item='EX100'), - 'BlackrootMap': Location(code=262153, vanilla_item='MapStone'), - 'BlackrootTeleporterHealthCell': Location(code=262154, vanilla_item='HC'), - 'ChargeFlameAreaExp': Location(code=262155, vanilla_item='EX100'), - 'ChargeFlameAreaPlant': Location(code=262156, vanilla_item='Plant'), - 'ChargeFlameSkillTree': Location(code=262157, vanilla_item='SKChargeFlame'), - 'ChargeJumpSkillTree': Location(code=262158, vanilla_item='SKChargeJump'), - 'ClimbSkillTree': Location(code=262159, vanilla_item='SKClimb'), - 'DashAreaAbilityCell': Location(code=262160, vanilla_item='AC'), - 'DashAreaMapstone': Location(code=262161, vanilla_item='MS'), - 'DashAreaOrbRoomExp': Location(code=262162, vanilla_item='EX100'), - 'DashAreaPlant': Location(code=262163, vanilla_item='Plant'), - 'DashAreaRoofExp': Location(code=262164, vanilla_item='EX100'), - 'DashSkillTree': Location(code=262165, vanilla_item='SKDash'), - 'DeathGauntletEnergyCell': Location(code=262166, vanilla_item='EC'), - 'DeathGauntletExp': Location(code=262167, vanilla_item='EX100'), - 'DeathGauntletRoofHealthCell': Location(code=262168, vanilla_item='HC'), - 'DeathGauntletRoofPlant': Location(code=262169, vanilla_item='Plant'), - 'DeathGauntletStompSwim': Location(code=262170, vanilla_item='EX200'), - 'DeathGauntletSwimEnergyDoor': Location(code=262171, vanilla_item='AC'), - 'DoorWarpExp': Location(code=262172, vanilla_item='EX200'), - 'DoubleJumpAreaExp': Location(code=262173, vanilla_item='EX100'), - 'DoubleJumpSkillTree': Location(code=262174, vanilla_item='SKDoubleJump'), - 'FarLeftGumoHideoutExp': Location(code=262175, vanilla_item='EX100'), - 'FirstPickup': Location(code=262176, vanilla_item='EX15'), - 'ForlornEntranceExp': Location(code=262177, vanilla_item='EX200'), - 'ForlornEscape': Location(code=262178, vanilla_item='EVWind'), - 'ForlornHiddenSpiderExp': Location(code=262179, vanilla_item='EX100'), - 'ForlornKeystone1': Location(code=262180, vanilla_item='KS'), - 'ForlornKeystone2': Location(code=262181, vanilla_item='KS'), - 'ForlornKeystone3': Location(code=262182, vanilla_item='KS'), - 'ForlornKeystone4': Location(code=262183, vanilla_item='KS'), - 'ForlornMap': Location(code=262184, vanilla_item='MapStone'), - 'ForlornPlant': Location(code=262185, vanilla_item='Plant'), - 'FourthHealthCell': Location(code=262186, vanilla_item='HC'), - 'FronkeyFight': Location(code=262187, vanilla_item='EX15'), - 'FronkeyWalkRoof': Location(code=262188, vanilla_item='EX200'), - 'GinsoEscapeExit': Location(code=262189, vanilla_item='EVWater'), - 'GinsoEscapeHangingExp': Location(code=262190, vanilla_item='EX100'), - 'GinsoEscapeJumpPadExp': Location(code=262191, vanilla_item='EX100'), - 'GinsoEscapeProjectileExp': Location(code=262192, vanilla_item='EX100'), - 'GinsoEscapeSpiderExp': Location(code=262193, vanilla_item='EX200'), - 'GladesGrenadePool': Location(code=262194, vanilla_item='EX200'), - 'GladesGrenadeTree': Location(code=262195, vanilla_item='AC'), - 'GladesKeystone1': Location(code=262196, vanilla_item='KS'), - 'GladesKeystone2': Location(code=262197, vanilla_item='KS'), - 'GladesLaser': Location(code=262198, vanilla_item='EC'), - 'GladesLaserGrenade': Location(code=262199, vanilla_item='AC'), - 'GladesMainPool': Location(code=262200, vanilla_item='EX100'), - 'GladesMainPoolDeep': Location(code=262201, vanilla_item='EC'), - 'GladesMap': Location(code=262202, vanilla_item='MapStone'), - 'GladesMapKeystone': Location(code=262203, vanilla_item='KS'), - 'GlideSkillFeather': Location(code=262204, vanilla_item='SKGlide'), - 'GrenadeAreaAbilityCell': Location(code=262205, vanilla_item='AC'), - 'GrenadeAreaExp': Location(code=262206, vanilla_item='EX100'), - 'GrenadeSkillTree': Location(code=262207, vanilla_item='SKGrenade'), - 'GrottoEnergyDoorHealthCell': Location(code=262208, vanilla_item='HC'), - 'GrottoEnergyDoorSwim': Location(code=262209, vanilla_item='EX100'), - 'GrottoHideoutFallAbilityCell': Location(code=262210, vanilla_item='AC'), - 'GrottoLasersRoofExp': Location(code=262211, vanilla_item='EX100'), - 'GrottoSwampDrainAccessExp': Location(code=262212, vanilla_item='EX100'), - 'GrottoSwampDrainAccessPlant': Location(code=262213, vanilla_item='Plant'), - 'GroveAboveSpiderWaterEnergyCell': Location(code=262214, vanilla_item='EC'), - 'GroveAboveSpiderWaterExp': Location(code=262215, vanilla_item='EX200'), - 'GroveAboveSpiderWaterHealthCell': Location(code=262216, vanilla_item='HC'), - 'GroveSpiderWaterSwim': Location(code=262217, vanilla_item='EX100'), - 'GroveWaterStompAbilityCell': Location(code=262218, vanilla_item='AC'), - 'GumoHideoutCrusherExp': Location(code=262219, vanilla_item='EX100'), - 'GumoHideoutCrusherKeystone': Location(code=262220, vanilla_item='KS'), - 'GumoHideoutEnergyCell': Location(code=262221, vanilla_item='EC'), - 'GumoHideoutLeftHangingExp': Location(code=262222, vanilla_item='EX15'), - 'GumoHideoutMap': Location(code=262223, vanilla_item='MapStone'), - 'GumoHideoutMapstone': Location(code=262224, vanilla_item='MS'), - 'GumoHideoutMiniboss': Location(code=262225, vanilla_item='KS'), - 'GumoHideoutRedirectAbilityCell': Location(code=262226, vanilla_item='AC'), - 'GumoHideoutRedirectEnergyCell': Location(code=262227, vanilla_item='EC'), - 'GumoHideoutRedirectExp': Location(code=262228, vanilla_item='EX200'), - 'GumoHideoutRedirectPlant': Location(code=262229, vanilla_item='Plant'), - 'GumoHideoutRightHangingExp': Location(code=262230, vanilla_item='EX15'), - 'GumoHideoutRockfallExp': Location(code=262231, vanilla_item='EX100'), - 'GumonSeal': Location(code=262232, vanilla_item='EVForlornKey'), - 'HollowGroveMap': Location(code=262233, vanilla_item='MapStone'), - 'HollowGroveMapPlant': Location(code=262234, vanilla_item='Plant'), - 'HollowGroveMapstone': Location(code=262235, vanilla_item='MS'), - 'HollowGroveTreeAbilityCell': Location(code=262236, vanilla_item='AC'), - 'HollowGroveTreePlant': Location(code=262237, vanilla_item='Plant'), - 'HoruFieldsAbilityCell': Location(code=262238, vanilla_item='AC'), - 'HoruFieldsEnergyCell': Location(code=262239, vanilla_item='EC'), - 'HoruFieldsHealthCell': Location(code=262240, vanilla_item='HC'), - 'HoruFieldsHiddenExp': Location(code=262241, vanilla_item='EX200'), - 'HoruFieldsPlant': Location(code=262242, vanilla_item='Plant'), - 'HoruL1': Location(code=262243, vanilla_item='CS'), - 'HoruL2': Location(code=262244, vanilla_item='CS'), - 'HoruL3': Location(code=262245, vanilla_item='CS'), - 'HoruL4': Location(code=262246, vanilla_item='CS'), - 'HoruL4ChaseExp': Location(code=262247, vanilla_item='EX200'), - 'HoruL4LowerExp': Location(code=262248, vanilla_item='EX200'), - 'HoruLavaDrainedLeftExp': Location(code=262249, vanilla_item='EX200'), - 'HoruLavaDrainedRightExp': Location(code=262250, vanilla_item='EX200'), - 'HoruMap': Location(code=262251, vanilla_item='MapStone'), - 'HoruR1': Location(code=262252, vanilla_item='CS'), - 'HoruR1EnergyCell': Location(code=262253, vanilla_item='EC'), - 'HoruR1HangingExp': Location(code=262254, vanilla_item='EX100'), - 'HoruR1Mapstone': Location(code=262255, vanilla_item='MS'), - 'HoruR2': Location(code=262256, vanilla_item='CS'), - 'HoruR3': Location(code=262257, vanilla_item='CS'), - 'HoruR3Plant': Location(code=262258, vanilla_item='Plant'), - 'HoruR4': Location(code=262259, vanilla_item='CS'), - 'HoruR4DrainedExp': Location(code=262260, vanilla_item='EX200'), - 'HoruR4LaserExp': Location(code=262261, vanilla_item='EX200'), - 'HoruR4StompExp': Location(code=262262, vanilla_item='EX200'), - 'HoruTeleporterExp': Location(code=262263, vanilla_item='EX200'), - 'IcelessExp': Location(code=262264, vanilla_item='EX100'), - 'InnerSwampDrainExp': Location(code=262265, vanilla_item='EX100'), - 'InnerSwampEnergyCell': Location(code=262266, vanilla_item='EC'), - 'InnerSwampHiddenSwimExp': Location(code=262267, vanilla_item='EX100'), - 'InnerSwampStompExp': Location(code=262268, vanilla_item='EX100'), - 'InnerSwampSwimLeftKeystone': Location(code=262269, vanilla_item='KS'), - 'InnerSwampSwimMapstone': Location(code=262270, vanilla_item='MS'), - 'InnerSwampSwimRightKeystone': Location(code=262271, vanilla_item='KS'), - 'KuroPerchExp': Location(code=262272, vanilla_item='EX200'), - 'LeftGladesExp': Location(code=262273, vanilla_item='EX15'), - 'LeftGladesHiddenExp': Location(code=262274, vanilla_item='EX15'), - 'LeftGladesKeystone': Location(code=262275, vanilla_item='KS'), - 'LeftGladesMapstone': Location(code=262276, vanilla_item='MS'), - 'LeftGrottoTeleporterExp': Location(code=262277, vanilla_item='EX200'), - 'LeftGumoHideoutExp': Location(code=262278, vanilla_item='EX100'), - 'LeftGumoHideoutHealthCell': Location(code=262279, vanilla_item='HC'), - 'LeftGumoHideoutLowerPlant': Location(code=262280, vanilla_item='Plant'), - 'LeftGumoHideoutSwim': Location(code=262281, vanilla_item='EX100'), - 'LeftGumoHideoutUpperPlant': Location(code=262282, vanilla_item='Plant'), - 'LeftSorrowAbilityCell': Location(code=262283, vanilla_item='AC'), - 'LeftSorrowEnergyCell': Location(code=262284, vanilla_item='EC'), - 'LeftSorrowGrenade': Location(code=262285, vanilla_item='EX200'), - 'LeftSorrowKeystone1': Location(code=262286, vanilla_item='KS'), - 'LeftSorrowKeystone2': Location(code=262287, vanilla_item='KS'), - 'LeftSorrowKeystone3': Location(code=262288, vanilla_item='KS'), - 'LeftSorrowKeystone4': Location(code=262289, vanilla_item='KS'), - 'LeftSorrowPlant': Location(code=262290, vanilla_item='Plant'), - 'LostGroveAbilityCell': Location(code=262291, vanilla_item='AC'), - 'LostGroveHiddenExp': Location(code=262292, vanilla_item='EX100'), - 'LostGroveLongSwim': Location(code=262293, vanilla_item='AC'), - 'LostGroveTeleporter': Location(code=262294, vanilla_item='EX100'), - 'LowerBlackrootAbilityCell': Location(code=262295, vanilla_item='AC'), - 'LowerBlackrootGrenadeThrow': Location(code=262296, vanilla_item='AC'), - 'LowerBlackrootLaserAbilityCell': Location(code=262297, vanilla_item='AC'), - 'LowerBlackrootLaserExp': Location(code=262298, vanilla_item='EX100'), - 'LowerGinsoHiddenExp': Location(code=262299, vanilla_item='EX100'), - 'LowerGinsoKeystone1': Location(code=262300, vanilla_item='KS'), - 'LowerGinsoKeystone2': Location(code=262301, vanilla_item='KS'), - 'LowerGinsoKeystone3': Location(code=262302, vanilla_item='KS'), - 'LowerGinsoKeystone4': Location(code=262303, vanilla_item='KS'), - 'LowerGinsoPlant': Location(code=262304, vanilla_item='Plant'), - 'LowerValleyExp': Location(code=262305, vanilla_item='EX100'), - 'LowerValleyMapstone': Location(code=262306, vanilla_item='MS'), - 'MistyAbilityCell': Location(code=262307, vanilla_item='AC'), - 'MistyEntranceStompExp': Location(code=262308, vanilla_item='EX100'), - 'MistyEntranceTreeExp': Location(code=262309, vanilla_item='EX100'), - 'MistyFrogNookExp': Location(code=262310, vanilla_item='EX100'), - 'MistyGrenade': Location(code=262311, vanilla_item='EX200'), - 'MistyKeystone1': Location(code=262312, vanilla_item='KS'), - 'MistyKeystone2': Location(code=262313, vanilla_item='KS'), - 'MistyKeystone3': Location(code=262314, vanilla_item='KS'), - 'MistyKeystone4': Location(code=262315, vanilla_item='KS'), - 'MistyMortarCorridorHiddenExp': Location(code=262316, vanilla_item='EX100'), - 'MistyMortarCorridorUpperExp': Location(code=262317, vanilla_item='EX100'), - 'MistyPlant': Location(code=262318, vanilla_item='Plant'), - 'MistyPostClimbAboveSpikePit': Location(code=262319, vanilla_item='EX200'), - 'MistyPostClimbSpikeCave': Location(code=262320, vanilla_item='EX100'), - 'MoonGrottoStompPlant': Location(code=262321, vanilla_item='Plant'), - 'OuterSwampAbilityCell': Location(code=262322, vanilla_item='AC'), - 'OuterSwampGrenadeExp': Location(code=262323, vanilla_item='EX200'), - 'OuterSwampHealthCell': Location(code=262324, vanilla_item='HC'), - 'OuterSwampMortarAbilityCell': Location(code=262325, vanilla_item='AC'), - 'OuterSwampMortarPlant': Location(code=262326, vanilla_item='Plant'), - 'OuterSwampStompExp': Location(code=262327, vanilla_item='EX100'), - 'OutsideForlornCliffExp': Location(code=262328, vanilla_item='EX200'), - 'OutsideForlornTreeExp': Location(code=262329, vanilla_item='EX100'), - 'OutsideForlornWaterExp': Location(code=262330, vanilla_item='EX100'), - 'RazielNo': Location(code=262331, vanilla_item='EX100'), - 'RightForlornHealthCell': Location(code=262332, vanilla_item='HC'), - 'RightForlornPlant': Location(code=262333, vanilla_item='Plant'), - 'SorrowEntranceAbilityCell': Location(code=262334, vanilla_item='AC'), - 'SorrowHealthCell': Location(code=262335, vanilla_item='HC'), - 'SorrowHiddenKeystone': Location(code=262336, vanilla_item='KS'), - 'SorrowLowerLeftKeystone': Location(code=262337, vanilla_item='KS'), - 'SorrowMainShaftKeystone': Location(code=262338, vanilla_item='KS'), - 'SorrowMap': Location(code=262339, vanilla_item='MapStone'), - 'SorrowMapstone': Location(code=262340, vanilla_item='MS'), - 'SorrowSpikeKeystone': Location(code=262341, vanilla_item='KS'), - 'SpiderSacEnergyCell': Location(code=262342, vanilla_item='EC'), - 'SpiderSacEnergyDoor': Location(code=262343, vanilla_item='AC'), - 'SpiderSacGrenadeDoor': Location(code=262344, vanilla_item='AC'), - 'SpiderSacHealthCell': Location(code=262345, vanilla_item='HC'), - 'SpiritCavernsAbilityCell': Location(code=262346, vanilla_item='AC'), - 'SpiritCavernsKeystone1': Location(code=262347, vanilla_item='KS'), - 'SpiritCavernsKeystone2': Location(code=262348, vanilla_item='KS'), - 'SpiritCavernsTopLeftKeystone': Location(code=262349, vanilla_item='KS'), - 'SpiritCavernsTopRightKeystone': Location(code=262350, vanilla_item='KS'), - 'StompAreaExp': Location(code=262351, vanilla_item='EX100'), - 'StompAreaGrenadeExp': Location(code=262352, vanilla_item='EX200'), - 'StompAreaRoofExp': Location(code=262353, vanilla_item='EX200'), - 'StompSkillTree': Location(code=262354, vanilla_item='SKStomp'), - 'Sunstone': Location(code=262355, vanilla_item='EVHoruKey'), - 'SunstonePlant': Location(code=262356, vanilla_item='Plant'), - 'SwampEntranceAbilityCell': Location(code=262357, vanilla_item='AC'), - 'SwampEntrancePlant': Location(code=262358, vanilla_item='Plant'), - 'SwampEntranceSwim': Location(code=262359, vanilla_item='EX200'), - 'SwampMap': Location(code=262360, vanilla_item='MapStone'), - 'SwampTeleporterAbilityCell': Location(code=262361, vanilla_item='AC'), - 'TopGinsoLeftLowerExp': Location(code=262362, vanilla_item='EX100'), - 'TopGinsoLeftUpperExp': Location(code=262363, vanilla_item='EX100'), - 'TopGinsoRightPlant': Location(code=262364, vanilla_item='Plant'), - 'UpperGinsoEnergyCell': Location(code=262365, vanilla_item='EC'), - 'UpperGinsoLowerKeystone': Location(code=262366, vanilla_item='KS'), - 'UpperGinsoRedirectLowerExp': Location(code=262367, vanilla_item='EX100'), - 'UpperGinsoRedirectUpperExp': Location(code=262368, vanilla_item='EX100'), - 'UpperGinsoRightKeystone': Location(code=262369, vanilla_item='KS'), - 'UpperGinsoUpperLeftKeystone': Location(code=262370, vanilla_item='KS'), - 'UpperGinsoUpperRightKeystone': Location(code=262371, vanilla_item='KS'), - 'UpperSorrowFarLeftKeystone': Location(code=262372, vanilla_item='KS'), - 'UpperSorrowFarRightKeystone': Location(code=262373, vanilla_item='KS'), - 'UpperSorrowLeftKeystone': Location(code=262374, vanilla_item='KS'), - 'UpperSorrowRightKeystone': Location(code=262375, vanilla_item='KS'), - 'UpperSorrowSpikeExp': Location(code=262376, vanilla_item='EX100'), - 'ValleyEntryAbilityCell': Location(code=262377, vanilla_item='AC'), - 'ValleyEntryGrenadeLongSwim': Location(code=262378, vanilla_item='EC'), - 'ValleyEntryTreeExp': Location(code=262379, vanilla_item='EX100'), - 'ValleyEntryTreePlant': Location(code=262380, vanilla_item='Plant'), - 'ValleyForlornApproachGrenade': Location(code=262381, vanilla_item='AC'), - 'ValleyForlornApproachMapstone': Location(code=262382, vanilla_item='MS'), - 'ValleyMainFACS': Location(code=262383, vanilla_item='AC'), - 'ValleyMainPlant': Location(code=262384, vanilla_item='Plant'), - 'ValleyMap': Location(code=262385, vanilla_item='MapStone'), - 'ValleyRightBirdStompCell': Location(code=262386, vanilla_item='AC'), - 'ValleyRightExp': Location(code=262387, vanilla_item='EX100'), - 'ValleyRightFastStomplessCell': Location(code=262388, vanilla_item='AC'), - 'ValleyRightSwimExp': Location(code=262389, vanilla_item='EX100'), - 'ValleyThreeBirdAbilityCell': Location(code=262390, vanilla_item='AC'), - 'WallJumpAreaEnergyCell': Location(code=262391, vanilla_item='EC'), - 'WallJumpAreaExp': Location(code=262392, vanilla_item='EX200'), - 'WallJumpSkillTree': Location(code=262393, vanilla_item='SKWallJump'), - 'WaterVein': Location(code=262394, vanilla_item='EVGinsoKey'), - 'WilhelmExp': Location(code=262395, vanilla_item='EX200')} - - - -lookup_name_to_id = {location_name: location_data.code for location_name, location_data in locations_data.items()} \ No newline at end of file diff --git a/worlds_disabled/oribf/Options.py b/worlds_disabled/oribf/Options.py deleted file mode 100644 index ac6808aa8d..0000000000 --- a/worlds_disabled/oribf/Options.py +++ /dev/null @@ -1,12 +0,0 @@ -from .RulesData import location_rules -from Options import Toggle - - -options = { - "open" : Toggle, - "openworld": Toggle -} - -for logic_set in location_rules: - if logic_set != "casual-core": - options[logic_set.replace("-", "_")] = Toggle diff --git a/worlds_disabled/oribf/README.md b/worlds_disabled/oribf/README.md deleted file mode 100644 index 0c78c23bea..0000000000 --- a/worlds_disabled/oribf/README.md +++ /dev/null @@ -1,7 +0,0 @@ -### Ori and the Blind Forest - -This world was disabled for the following reasons: - -* Missing client -* Unmaintained -* Outdated, fails tests as of Jun 29, 2023 diff --git a/worlds_disabled/oribf/Regions.py b/worlds_disabled/oribf/Regions.py deleted file mode 100644 index c86608732c..0000000000 --- a/worlds_disabled/oribf/Regions.py +++ /dev/null @@ -1,251 +0,0 @@ -# generated by https://github.com/Berserker66/ori_rando_server -# do not edit manually - -locations_by_region = \ - {'AboveChargeJumpArea': {'AboveChargeJumpAbilityCell'}, 'BashTree': {'BashAreaExp', 'BashSkillTree'}, - 'BashTreeDoorClosed': set(), 'BashTreeDoorOpened': set(), 'BelowSunstoneArea': set(), - 'BlackrootDarknessRoom': {'DashAreaOrbRoomExp', 'DashAreaAbilityCell', 'DashAreaRoofExp'}, - 'BlackrootGrottoConnection': {'BlackrootBoulderExp', 'BlackrootMap', 'BlackrootTeleporterHealthCell'}, - 'ChargeFlameAreaPlantAccess': {'ChargeFlameAreaPlant'}, 'ChargeFlameAreaStump': set(), - 'ChargeFlameSkillTreeChamber': {'ChargeFlameSkillTree'}, 'ChargeJumpArea': {'ChargeJumpSkillTree'}, - 'ChargeJumpDoor': set(), 'ChargeJumpDoorOpen': set(), - 'ChargeJumpDoorOpenLeft': {'UpperSorrowSpikeExp', 'UpperSorrowRightKeystone', 'UpperSorrowLeftKeystone', - 'UpperSorrowFarRightKeystone', 'UpperSorrowFarLeftKeystone'}, - 'DashArea': {'DashAreaMapstone', 'DashSkillTree'}, 'DashPlantAccess': {'DashAreaPlant'}, - 'DeathGauntlet': {'DeathGauntletEnergyCell', 'DeathGauntletStompSwim', 'DeathGauntletExp'}, - 'DeathGauntletDoor': set(), 'DeathGauntletDoorOpened': set(), 'DeathGauntletMoat': {'DeathGauntletSwimEnergyDoor'}, - 'DeathGauntletRoof': {'DeathGauntletRoofHealthCell'}, 'DeathGauntletRoofPlantAccess': {'DeathGauntletRoofPlant'}, - 'DoubleJumpKeyDoor': set(), 'DoubleJumpKeyDoorOpened': {'DoubleJumpSkillTree', 'DoubleJumpAreaExp'}, - 'ForlornGravityRoom': {'ForlornKeystone2', 'ForlornHiddenSpiderExp', 'ForlornKeystone1'}, - 'ForlornInnerDoor': {'ForlornEntranceExp'}, 'ForlornKeyDoor': set(), 'ForlornLaserRoom': {'ForlornEscape'}, - 'ForlornMapArea': {'ForlornMap', 'ForlornKeystone4'}, - 'ForlornOrbPossession': {'ForlornKeystone2', 'ForlornHiddenSpiderExp', 'ForlornKeystone1', 'ForlornKeystone4', - 'ForlornKeystone3'}, 'ForlornOuterDoor': set(), 'ForlornPlantAccess': {'ForlornPlant'}, - 'ForlornStompDoor': set(), 'ForlornTeleporter': {'ForlornKeystone3'}, 'GinsoEscape': set(), - 'GinsoEscapeComplete': {'GinsoEscapeExit', 'GinsoEscapeSpiderExp', 'GinsoEscapeProjectileExp', - 'GinsoEscapeJumpPadExp', 'GinsoEscapeHangingExp'}, 'GinsoInnerDoor': set(), - 'GinsoMiniBossDoor': {'LowerGinsoKeystone2', 'LowerGinsoKeystone1', 'LowerGinsoKeystone3', 'LowerGinsoKeystone4'}, - 'GinsoOuterDoor': set(), 'GinsoTeleporter': set(), 'GladesLaserArea': {'GladesLaserGrenade', 'GladesLaser'}, - 'GladesMain': {'FourthHealthCell', 'GladesMap', 'GladesMapKeystone'}, 'GladesMainAttic': {'AboveFourthHealth'}, - 'GrenadeArea': {'GrenadeAreaAbilityCell', 'GrenadeAreaExp', 'GrenadeSkillTree'}, 'GrenadeAreaAccess': set(), - 'GumoHideout': {'GumoHideoutMapstone', 'GumoHideoutCrusherExp', 'GumoHideoutRightHangingExp', - 'GumoHideoutEnergyCell', 'GumoHideoutCrusherKeystone', 'GumoHideoutMap', 'GumoHideoutMiniboss'}, - 'GumoHideoutRedirectArea': {'GumoHideoutRedirectAbilityCell', 'GumoHideoutRedirectPlant'}, - 'GumoHideoutRedirectEnergyVault': {'GumoHideoutRedirectExp', 'GumoHideoutRedirectEnergyCell'}, - 'HollowGrove': {'GroveWaterStompAbilityCell', 'HollowGroveTreeAbilityCell', 'HollowGroveMapPlant', - 'HoruFieldsHealthCell', 'HollowGroveMap', 'SwampTeleporterAbilityCell', 'HollowGroveMapstone', - 'HollowGroveTreePlant'}, 'HoruBasement': {'DoorWarpExp'}, 'HoruEscapeInnerDoor': set(), - 'HoruEscapeOuterDoor': set(), 'HoruFields': set(), - 'HoruFieldsPushBlock': {'HoruFieldsEnergyCell', 'HoruFieldsPlant', 'HoruFieldsHiddenExp', 'HoruFieldsAbilityCell'}, - 'HoruInnerDoor': {'HoruLavaDrainedLeftExp', 'HoruLavaDrainedRightExp'}, - 'HoruL4CutscenePeg': {'HoruL4', 'HoruL4LowerExp'}, 'HoruL4LavaChasePeg': {'HoruL4ChaseExp'}, - 'HoruMapLedge': {'HoruMap'}, 'HoruOuterDoor': set(), 'HoruR1CutsceneTrigger': {'HoruR1EnergyCell', 'HoruR1'}, - 'HoruR1MapstoneSecret': {'HoruR1Mapstone'}, 'HoruR3CutsceneTrigger': {'HoruR3'}, 'HoruR3ElevatorLever': set(), - 'HoruR3PlantCove': {'HoruR3Plant'}, 'HoruR4CutsceneTrigger': {'HoruR4DrainedExp', 'HoruR4'}, - 'HoruR4PuzzleEntrance': {'HoruR4LaserExp'}, 'HoruR4StompHideout': {'HoruR4StompExp'}, - 'HoruTeleporter': {'HoruTeleporterExp'}, 'Iceless': {'IcelessExp'}, 'InnerSwampAboveDrainArea': set(), - 'InnerSwampDrainBroken': {'InnerSwampDrainExp'}, 'InnerSwampSkyArea': {'InnerSwampEnergyCell'}, 'L1': {'HoruL1'}, - 'L1InnerDoor': set(), 'L1OuterDoor': set(), 'L2': {'HoruL2'}, 'L2InnerDoor': set(), 'L2OuterDoor': set(), - 'L3': {'HoruL3'}, 'L3InnerDoor': set(), 'L3OuterDoor': set(), 'L4': set(), 'L4InnerDoor': set(), - 'L4OuterDoor': {'HoruLavaDrainedLeftExp'}, - 'LeftGlades': {'WallJumpAreaEnergyCell', 'LeftGladesHiddenExp', 'WallJumpAreaExp', 'WallJumpSkillTree'}, - 'LeftGumoHideout': {'FarLeftGumoHideoutExp', 'LeftGumoHideoutUpperPlant'}, - 'LeftSorrow': {'LeftSorrowAbilityCell', 'LeftSorrowPlant', 'LeftSorrowGrenade'}, - 'LeftSorrowKeystones': {'LeftSorrowEnergyCell', 'LeftSorrowKeystone1', 'LeftSorrowKeystone2', - 'LeftSorrowKeystone4', 'LeftSorrowKeystone3'}, 'LeftSorrowLowerDoor': set(), - 'LeftSorrowMiddleDoor': set(), 'LostGrove': {'LostGroveLongSwim'}, - 'LostGroveExit': {'LostGroveTeleporter', 'LostGroveAbilityCell', 'LostGroveHiddenExp'}, - 'LowerBlackroot': {'LowerBlackrootAbilityCell', 'LowerBlackrootLaserAbilityCell', 'LowerBlackrootGrenadeThrow', - 'LowerBlackrootLaserExp'}, 'LowerChargeFlameArea': {'ChargeFlameAreaExp'}, - 'LowerGinsoTree': {'LowerGinsoPlant', 'LowerGinsoHiddenExp'}, - 'LowerLeftGumoHideout': {'LeftGumoHideoutSwim', 'LeftGumoHideoutHealthCell', 'LeftGumoHideoutExp', - 'GumoHideoutLeftHangingExp', 'GumoHideoutRightHangingExp', 'LeftGumoHideoutLowerPlant'}, - 'LowerSorrow': {'SorrowLowerLeftKeystone', 'SorrowHiddenKeystone', 'SorrowEntranceAbilityCell', 'SorrowHealthCell', - 'SorrowSpikeKeystone'}, - 'LowerSpiritCaverns': {'SpiritCavernsKeystone1', 'SpiritCavernsAbilityCell', 'SpiritCavernsKeystone2'}, - 'LowerValley': {'LowerValleyExp', 'LowerValleyMapstone', 'KuroPerchExp'}, - 'LowerValleyPlantApproach': {'ValleyMainPlant'}, 'MidSpiritCaverns': set(), 'MiddleSorrow': set(), - 'MistyAbove200xp': {'MistyGrenade'}, 'MistyBeforeDocks': set(), 'MistyBeforeMiniBoss': set(), - 'MistyEntrance': {'MistyEntranceStompExp', 'MistyEntranceTreeExp'}, 'MistyKeystone3Ledge': {'MistyKeystone3'}, - 'MistyKeystone4Ledge': {'MistyKeystone4'}, 'MistyMortarSpikeCave': {'MistyPostClimbAboveSpikePit'}, - 'MistyOrbRoom': {'GumonSeal'}, 'MistyPostClimb': set(), - 'MistyPostFeatherTutorial': {'MistyFrogNookExp', 'MistyKeystone1'}, 'MistyPostKeystone1': set(), - 'MistyPostLasers': {'MistyPostClimbSpikeCave'}, 'MistyPostMortarCorridor': set(), - 'MistyPreClimb': {'ClimbSkillTree'}, 'MistyPreKeystone2': {'MistyKeystone2', 'MistyAbilityCell'}, - 'MistyPreLasers': set(), 'MistyPreMortarCorridor': {'MistyMortarCorridorUpperExp', 'MistyMortarCorridorHiddenExp'}, - 'MistyPrePlantLedge': {'MistyPlant'}, 'MistySpikeCave': set(), - 'MoonGrotto': {'GrottoEnergyDoorHealthCell', 'GrottoEnergyDoorSwim'}, - 'MoonGrottoAboveTeleporter': {'LeftGrottoTeleporterExp', 'AboveGrottoTeleporterExp'}, - 'MoonGrottoBelowTeleporter': {'BelowGrottoTeleporterPlant', 'BelowGrottoTeleporterHealthCell'}, - 'MoonGrottoStompPlantAccess': {'MoonGrottoStompPlant'}, - 'MoonGrottoSwampAccessArea': {'GrottoSwampDrainAccessExp', 'GrottoSwampDrainAccessPlant'}, - 'OuterSwampAbilityCellNook': {'OuterSwampAbilityCell'}, - 'OuterSwampLowerArea': {'OuterSwampHealthCell', 'OuterSwampStompExp'}, - 'OuterSwampMortarAbilityCellLedge': {'OuterSwampMortarAbilityCell'}, - 'OuterSwampMortarPlantAccess': {'OuterSwampMortarPlant'}, 'OuterSwampUpperArea': {'OuterSwampGrenadeExp'}, - 'OutsideForlorn': {'OutsideForlornTreeExp', 'OutsideForlornWaterExp'}, - 'OutsideForlornCliff': {'OutsideForlornCliffExp'}, 'R1': {'HoruR1HangingExp'}, 'R1InnerDoor': set(), - 'R1OuterDoor': set(), 'R2': {'HoruR2'}, 'R2InnerDoor': set(), 'R2OuterDoor': set(), 'R3': set(), - 'R3InnerDoor': set(), 'R3OuterDoor': set(), 'R4': {'HoruR4DrainedExp'}, 'R4InnerDoor': set(), - 'R4OuterDoor': {'HoruLavaDrainedRightExp'}, 'RazielNoArea': {'RazielNo'}, - 'RightForlorn': {'RightForlornPlant', 'RightForlornHealthCell'}, - 'RightSwamp': {'StompAreaGrenadeExp', 'StompSkillTree', 'StompAreaExp', 'StompAreaRoofExp'}, - 'SideFallCell': {'GrottoHideoutFallAbilityCell'}, 'SorrowBashLedge': set(), - 'SorrowMainShaftKeystoneArea': {'SorrowMainShaftKeystone'}, 'SorrowMapstoneArea': {'SorrowMap', 'SorrowMapstone'}, - 'SorrowTeleporter': set(), 'SpiderSacArea': {'AboveChargeFlameTreeExp'}, - 'SpiderSacEnergyNook': {'SpiderSacEnergyCell'}, - 'SpiderSacTetherArea': {'SpiderSacGrenadeDoor', 'SpiderSacEnergyDoor', 'SpiderSacHealthCell'}, - 'SpiderWaterArea': {'GroveSpiderWaterSwim', 'GroveAboveSpiderWaterEnergyCell', 'GroveAboveSpiderWaterExp', - 'GroveAboveSpiderWaterHealthCell'}, 'SpiritCavernsDoor': set(), - 'SpiritCavernsDoorOpened': set(), 'SpiritTreeDoor': set(), 'SpiritTreeDoorOpened': set(), - 'SpiritTreeRefined': {'AboveChargeFlameTreeExp'}, - 'SunkenGladesRunaway': {'FronkeyWalkRoof', 'GladesGrenadePool', 'GladesMainPoolDeep', 'FirstPickup', - 'FronkeyFight', 'GladesMainPool', 'GladesKeystone1', 'GladesGrenadeTree', - 'GladesKeystone2'}, 'SunstoneArea': {'Sunstone', 'SunstonePlant'}, - 'Swamp': {'InnerSwampDrainExp', 'SwampMap'}, 'SwampDrainlessArea': {'SwampEntranceAbilityCell'}, - 'SwampEntryArea': {'SwampEntrancePlant', 'SwampEntranceSwim'}, 'SwampKeyDoorOpened': set(), - 'SwampKeyDoorPlatform': {'InnerSwampStompExp'}, 'SwampTeleporter': set(), - 'SwampWater': {'InnerSwampSwimRightKeystone', 'InnerSwampSwimMapstone', 'InnerSwampHiddenSwimExp', - 'InnerSwampSwimLeftKeystone'}, - 'TopGinsoTree': {'TopGinsoLeftLowerExp', 'TopGinsoLeftUpperExp', 'TopGinsoRightPlant'}, - 'UpperGinsoDoorClosed': set(), 'UpperGinsoDoorOpened': set(), - 'UpperGinsoRedirectArea': {'BashAreaExp', 'UpperGinsoRedirectUpperExp', 'UpperGinsoRedirectLowerExp'}, - 'UpperGinsoTree': {'UpperGinsoUpperLeftKeystone', 'UpperGinsoLowerKeystone', 'UpperGinsoRightKeystone', - 'UpperGinsoUpperRightKeystone', 'UpperGinsoEnergyCell'}, 'UpperGrotto': {'GrottoLasersRoofExp'}, - 'UpperLeftGlades': {'LeftGladesKeystone', 'LeftGladesExp', 'LeftGladesMapstone'}, - 'UpperSorrow': {'UpperSorrowSpikeExp', 'UpperSorrowRightKeystone', 'UpperSorrowLeftKeystone', - 'UpperSorrowFarRightKeystone', 'UpperSorrowFarLeftKeystone'}, - 'UpperSpiritCaverns': {'SpiritCavernsTopRightKeystone', 'SpiritCavernsTopLeftKeystone'}, - 'ValleyEntry': {'ValleyEntryAbilityCell', 'ValleyThreeBirdAbilityCell'}, - 'ValleyEntryTree': {'ValleyEntryTreeExp', 'ValleyEntryGrenadeLongSwim'}, - 'ValleyEntryTreePlantAccess': {'ValleyEntryTreePlant'}, - 'ValleyForlornApproach': {'ValleyMap', 'ValleyForlornApproachGrenade', 'ValleyForlornApproachMapstone'}, - 'ValleyMain': {'GlideSkillFeather', 'KuroPerchExp'}, 'ValleyPostStompDoor': {'ValleyRightSwimExp'}, - 'ValleyRight': set(), 'ValleyStompFloor': set(), 'ValleyStompless': {'KuroPerchExp'}, - 'ValleyStomplessApproach': {'ValleyRightFastStomplessCell', 'ValleyRightBirdStompCell', 'ValleyRightExp'}, - 'ValleyTeleporter': set(), 'ValleyThreeBirdLever': {'ValleyThreeBirdAbilityCell', 'ValleyMainFACS'}, - 'WaterVeinArea': {'WaterVein', 'GumoHideoutRockfallExp'}, 'WilhelmLedge': {'WilhelmExp', 'KuroPerchExp'}} - -connectors = \ - {'AboveChargeJumpArea': {'SorrowTeleporter', 'ChargeJumpArea'}, - 'BashTree': {'BashTreeDoorClosed', 'UpperGinsoRedirectArea'}, 'BashTreeDoorClosed': {'BashTreeDoorOpened'}, - 'BashTreeDoorOpened': {'GinsoMiniBossDoor', 'BashTree'}, 'BelowSunstoneArea': {'SunstoneArea', 'UpperSorrow'}, - 'BlackrootDarknessRoom': {'DashArea'}, 'BlackrootGrottoConnection': {'SideFallCell'}, - 'ChargeFlameAreaStump': {'LowerChargeFlameArea', 'ChargeFlameSkillTreeChamber', 'ChargeFlameAreaPlantAccess'}, - 'ChargeFlameSkillTreeChamber': {'SpiritTreeRefined', 'ChargeFlameAreaStump'}, - 'ChargeJumpArea': {'AboveChargeJumpArea', 'ChargeJumpDoor'}, 'ChargeJumpDoor': {'ChargeJumpDoorOpen'}, - 'ChargeJumpDoorOpen': {'ChargeJumpDoorOpenLeft', 'ChargeJumpArea'}, 'ChargeJumpDoorOpenLeft': {'UpperSorrow'}, - 'DashArea': {'RazielNoArea', 'GrenadeAreaAccess', 'DashPlantAccess'}, - 'DeathGauntlet': {'DeathGauntletRoofPlantAccess', 'MoonGrotto', 'DeathGauntletMoat', 'MoonGrottoAboveTeleporter', - 'DeathGauntletRoof', 'DeathGauntletDoor'}, 'DeathGauntletDoor': {'DeathGauntletDoorOpened'}, - 'DeathGauntletDoorOpened': {'SunkenGladesRunaway', 'DeathGauntlet', 'DeathGauntletMoat'}, - 'DeathGauntletRoof': {'DeathGauntlet', 'DeathGauntletRoofPlantAccess'}, - 'DoubleJumpKeyDoor': {'DoubleJumpKeyDoorOpened'}, 'ForlornGravityRoom': {'ForlornMapArea', 'ForlornInnerDoor'}, - 'ForlornInnerDoor': {'ForlornGravityRoom', 'ForlornOrbPossession', 'ForlornOuterDoor'}, - 'ForlornKeyDoor': {'ForlornLaserRoom'}, 'ForlornLaserRoom': {'ForlornStompDoor'}, - 'ForlornMapArea': {'ForlornGravityRoom', 'ForlornKeyDoor', 'ForlornPlantAccess', 'ForlornTeleporter'}, - 'ForlornOrbPossession': {'ForlornMapArea', 'ForlornKeyDoor', 'ForlornPlantAccess', 'ForlornInnerDoor'}, - 'ForlornOuterDoor': {'OutsideForlorn', 'ForlornInnerDoor'}, 'ForlornStompDoor': {'RightForlorn'}, - 'ForlornTeleporter': {'ForlornMapArea', 'ForlornGravityRoom', 'ForlornOrbPossession'}, - 'GinsoEscape': {'GinsoEscapeComplete'}, 'GinsoEscapeComplete': {'Swamp'}, 'GinsoInnerDoor': {'LowerGinsoTree'}, - 'GinsoMiniBossDoor': {'BashTreeDoorClosed'}, 'GinsoOuterDoor': {'GinsoInnerDoor'}, - 'GinsoTeleporter': {'UpperGinsoDoorClosed', 'TopGinsoTree'}, 'GladesLaserArea': {'MidSpiritCaverns', 'GladesMain'}, - 'GladesMain': {'LeftGlades', 'SpiritCavernsDoor', 'LowerChargeFlameArea', 'GladesMainAttic', 'GladesLaserArea'}, - 'GladesMainAttic': {'LowerChargeFlameArea', 'GladesMain'}, 'GrenadeAreaAccess': {'LowerBlackroot', 'GrenadeArea'}, - 'GumoHideout': {'SideFallCell', 'LeftGumoHideout', 'LowerLeftGumoHideout', 'DoubleJumpKeyDoor'}, - 'GumoHideoutRedirectArea': {'GumoHideoutRedirectEnergyVault'}, - 'HollowGrove': {'MoonGrottoStompPlantAccess', 'Iceless', 'SwampTeleporter', 'SpiderWaterArea', 'HoruFields', - 'OuterSwampUpperArea'}, 'HoruBasement': {'HoruEscapeOuterDoor'}, - 'HoruEscapeOuterDoor': {'HoruEscapeInnerDoor'}, 'HoruFields': {'HoruOuterDoor', 'HoruFieldsPushBlock'}, - 'HoruFieldsPushBlock': {'HollowGrove'}, - 'HoruInnerDoor': {'HoruBasement', 'R2OuterDoor', 'HoruMapLedge', 'L1OuterDoor', 'L2OuterDoor', 'HoruTeleporter', - 'L3OuterDoor', 'R1OuterDoor', 'R4OuterDoor', 'HoruOuterDoor', 'L4OuterDoor', 'R3OuterDoor'}, - 'HoruL4LavaChasePeg': {'HoruL4CutscenePeg'}, 'HoruOuterDoor': {'HoruFieldsPushBlock', 'HoruInnerDoor'}, - 'HoruR1CutsceneTrigger': {'LowerGinsoTree'}, 'HoruR1MapstoneSecret': {'HoruR1CutsceneTrigger'}, - 'HoruR3CutsceneTrigger': {'HoruR3PlantCove'}, 'HoruR3ElevatorLever': {'HoruR3PlantCove', 'HoruR3CutsceneTrigger'}, - 'HoruR4PuzzleEntrance': {'HoruR4CutsceneTrigger'}, - 'HoruR4StompHideout': {'HoruR4CutsceneTrigger', 'HoruR4PuzzleEntrance'}, 'HoruTeleporter': {'HoruInnerDoor'}, - 'Iceless': {'HollowGrove', 'UpperGrotto'}, 'InnerSwampAboveDrainArea': {'InnerSwampDrainBroken'}, - 'InnerSwampDrainBroken': {'Swamp'}, 'InnerSwampSkyArea': {'SwampKeyDoorPlatform', 'Swamp'}, 'L1InnerDoor': {'L1'}, - 'L1OuterDoor': {'L1InnerDoor', 'HoruInnerDoor'}, 'L2InnerDoor': {'L2'}, - 'L2OuterDoor': {'L2InnerDoor', 'HoruInnerDoor'}, 'L3InnerDoor': {'L3'}, - 'L3OuterDoor': {'L3InnerDoor', 'HoruInnerDoor'}, 'L4': {'HoruL4CutscenePeg', 'HoruL4LavaChasePeg'}, - 'L4InnerDoor': {'L4'}, 'L4OuterDoor': {'L4InnerDoor', 'HoruInnerDoor'}, - 'LeftGlades': {'UpperLeftGlades', 'GladesMain'}, 'LeftGumoHideout': {'WaterVeinArea', 'LowerLeftGumoHideout'}, - 'LeftSorrow': {'LeftSorrowKeystones'}, 'LeftSorrowKeystones': {'LeftSorrowMiddleDoor', 'MiddleSorrow'}, - 'LeftSorrowLowerDoor': {'LeftSorrow'}, 'LeftSorrowMiddleDoor': {'MiddleSorrow'}, 'LostGrove': {'LostGroveExit'}, - 'LowerBlackroot': {'LostGrove'}, 'LowerChargeFlameArea': {'ChargeFlameAreaStump', 'GladesMain'}, - 'LowerGinsoTree': {'R4InnerDoor', 'GinsoMiniBossDoor'}, - 'LowerLeftGumoHideout': {'LowerBlackroot', 'GumoHideoutRedirectArea'}, - 'LowerSorrow': {'SorrowMainShaftKeystoneArea', 'SorrowMapstoneArea', 'LeftSorrowLowerDoor', 'LeftSorrow', - 'SunstoneArea', 'WilhelmLedge', 'MiddleSorrow'}, - 'LowerSpiritCaverns': {'SpiritCavernsDoor', 'MidSpiritCaverns', 'GladesLaserArea'}, - 'LowerValley': {'ValleyThreeBirdLever', 'LowerValleyPlantApproach', 'ValleyTeleporter', 'MistyEntrance'}, - 'MidSpiritCaverns': {'UpperSpiritCaverns', 'LowerSpiritCaverns', 'GladesLaserArea'}, - 'MiddleSorrow': {'SorrowMainShaftKeystoneArea', 'LeftSorrowKeystones', 'LeftSorrow', 'LowerSorrow', 'UpperSorrow', - 'SunstoneArea'}, 'MistyAbove200xp': {'MistyBeforeMiniBoss'}, - 'MistyBeforeDocks': {'MistyAbove200xp'}, 'MistyBeforeMiniBoss': {'MistyOrbRoom'}, - 'MistyEntrance': {'MistyPostFeatherTutorial'}, 'MistyKeystone3Ledge': {'MistyPreLasers'}, - 'MistyKeystone4Ledge': {'MistyBeforeDocks'}, 'MistyMortarSpikeCave': {'MistyKeystone4Ledge'}, - 'MistyOrbRoom': {'MistyPreKeystone2'}, 'MistyPostClimb': {'MistySpikeCave'}, - 'MistyPostFeatherTutorial': {'MistyPostKeystone1'}, 'MistyPostKeystone1': {'MistyPreMortarCorridor'}, - 'MistyPostLasers': {'MistyMortarSpikeCave'}, 'MistyPostMortarCorridor': {'MistyPrePlantLedge'}, - 'MistyPreClimb': {'MistyPostClimb', 'ForlornTeleporter', 'RightForlorn'}, 'MistyPreLasers': {'MistyPostLasers'}, - 'MistyPreMortarCorridor': {'MistyPostMortarCorridor', 'RightForlorn'}, 'MistyPrePlantLedge': {'MistyPreClimb'}, - 'MistySpikeCave': {'MistyKeystone3Ledge'}, - 'MoonGrotto': {'MoonGrottoBelowTeleporter', 'MoonGrottoAboveTeleporter', 'WaterVeinArea', 'DeathGauntlet', - 'GumoHideout'}, - 'MoonGrottoAboveTeleporter': {'MoonGrottoSwampAccessArea', 'MoonGrottoBelowTeleporter', - 'MoonGrottoStompPlantAccess', 'MoonGrotto', 'DeathGauntletRoof', 'UpperGrotto'}, - 'MoonGrottoSwampAccessArea': {'InnerSwampAboveDrainArea'}, 'OuterSwampAbilityCellNook': {'InnerSwampSkyArea'}, - 'OuterSwampLowerArea': {'OuterSwampAbilityCellNook', 'OuterSwampMortarPlantAccess', 'SwampEntryArea', - 'OuterSwampMortarAbilityCellLedge', 'UpperGrotto', 'OuterSwampUpperArea'}, - 'OuterSwampMortarAbilityCellLedge': {'OuterSwampMortarPlantAccess', 'UpperGrotto'}, - 'OuterSwampUpperArea': {'OuterSwampLowerArea', 'OuterSwampAbilityCellNook', 'GinsoOuterDoor'}, - 'OutsideForlorn': {'OutsideForlornCliff', 'RightForlorn', 'ForlornOuterDoor'}, - 'OutsideForlornCliff': {'OutsideForlorn', 'ValleyForlornApproach'}, 'R1': {'HoruR1MapstoneSecret'}, - 'R1InnerDoor': {'R1'}, 'R1OuterDoor': {'R1InnerDoor', 'L1OuterDoor'}, 'R2InnerDoor': {'R2'}, - 'R2OuterDoor': {'R2InnerDoor', 'HoruInnerDoor'}, 'R3': {'HoruR3ElevatorLever'}, 'R3InnerDoor': {'R3'}, - 'R3OuterDoor': {'R3InnerDoor', 'HoruInnerDoor'}, 'R4': {'HoruR4StompHideout'}, 'R4InnerDoor': {'R4'}, - 'R4OuterDoor': {'R4InnerDoor', 'HoruInnerDoor'}, 'RazielNoArea': {'GumoHideout', 'BlackrootGrottoConnection'}, - 'SideFallCell': {'LeftGumoHideout', 'GumoHideout'}, 'SorrowBashLedge': {'LowerSorrow'}, - 'SorrowMainShaftKeystoneArea': {'LowerSorrow'}, 'SorrowMapstoneArea': {'HoruInnerDoor'}, - 'SorrowTeleporter': {'AboveChargeJumpArea', 'BelowSunstoneArea'}, - 'SpiderSacArea': {'SpiritTreeRefined', 'SpiderWaterArea', 'SpiderSacTetherArea', 'SpiderSacEnergyNook'}, - 'SpiderSacEnergyNook': {'ChargeFlameAreaPlantAccess'}, - 'SpiderSacTetherArea': {'SpiderWaterArea', 'SpiderSacEnergyNook'}, - 'SpiderWaterArea': {'HollowGrove', 'DeathGauntletRoof', 'SpiderSacEnergyNook', 'SpiderSacArea'}, - 'SpiritCavernsDoor': {'SpiritCavernsDoorOpened'}, 'SpiritCavernsDoorOpened': {'LowerSpiritCaverns', 'GladesMain'}, - 'SpiritTreeDoor': {'SpiritTreeDoorOpened'}, 'SpiritTreeDoorOpened': {'SpiritTreeRefined', 'UpperSpiritCaverns'}, - 'SpiritTreeRefined': {'ChargeFlameAreaStump', 'SpiritTreeDoor', 'ChargeFlameSkillTreeChamber', 'ValleyEntry', - 'SpiderSacArea'}, - 'SunkenGladesRunaway': {'MoonGrotto', 'LowerChargeFlameArea', 'ValleyTeleporter', 'SorrowTeleporter', - 'HoruTeleporter', 'GladesMain', 'GinsoTeleporter', 'SwampTeleporter', 'SpiritTreeRefined', - 'BlackrootDarknessRoom', 'DeathGauntletDoor', 'ForlornTeleporter'}, - 'SunstoneArea': {'SorrowTeleporter', 'UpperSorrow'}, - 'Swamp': {'SwampKeyDoorPlatform', 'SwampDrainlessArea', 'SwampWater'}, - 'SwampEntryArea': {'SwampDrainlessArea', 'Swamp'}, 'SwampKeyDoorOpened': {'RightSwamp'}, - 'SwampKeyDoorPlatform': {'SwampKeyDoorOpened', 'InnerSwampSkyArea'}, - 'SwampTeleporter': {'HollowGrove', 'OuterSwampMortarAbilityCellLedge'}, 'TopGinsoTree': {'GinsoEscape'}, - 'UpperGinsoDoorClosed': {'UpperGinsoDoorOpened'}, 'UpperGinsoDoorOpened': {'GinsoTeleporter', 'UpperGinsoTree'}, - 'UpperGinsoRedirectArea': {'UpperGinsoTree', 'BashTree'}, - 'UpperGinsoTree': {'UpperGinsoDoorClosed', 'UpperGinsoRedirectArea'}, - 'UpperGrotto': {'MoonGrottoStompPlantAccess', 'Iceless', 'MoonGrottoAboveTeleporter', - 'OuterSwampMortarAbilityCellLedge', 'OuterSwampLowerArea'}, 'UpperLeftGlades': {'LeftGlades'}, - 'UpperSorrow': {'SunstoneArea', 'MiddleSorrow', 'SorrowTeleporter', 'ChargeJumpDoor'}, - 'UpperSpiritCaverns': {'SpiritTreeDoor', 'MidSpiritCaverns'}, - 'ValleyEntry': {'ValleyThreeBirdLever', 'ValleyStompFloor', 'ValleyPostStompDoor', 'ValleyEntryTreePlantAccess', - 'ValleyEntryTree', 'SpiritTreeRefined'}, - 'ValleyEntryTree': {'ValleyPostStompDoor', 'ValleyEntryTreePlantAccess'}, - 'ValleyForlornApproach': {'ValleyStompFloor', 'OutsideForlornCliff'}, - 'ValleyMain': {'LowerValleyPlantApproach', 'LowerValley', 'MistyEntrance', 'WilhelmLedge', 'ValleyStompless'}, - 'ValleyPostStompDoor': {'ValleyEntry', 'ValleyRight', 'ValleyEntryTree'}, - 'ValleyRight': {'ValleyPostStompDoor', 'ValleyStomplessApproach'}, - 'ValleyStompFloor': {'ValleyThreeBirdLever', 'ValleyEntry', 'ValleyForlornApproach'}, - 'ValleyStompless': {'LowerValleyPlantApproach', 'ValleyMain', 'LowerValley', 'WilhelmLedge', 'MistyEntrance', - 'ValleyStomplessApproach'}, 'ValleyStomplessApproach': {'ValleyRight', 'ValleyStompless'}, - 'ValleyTeleporter': {'LowerValleyPlantApproach', 'ValleyRight', 'ValleyPostStompDoor', 'LowerValley', - 'MistyEntrance', 'ValleyStompless'}, - 'ValleyThreeBirdLever': {'ValleyStompFloor', 'ValleyEntry', 'LowerValley'}, - 'WaterVeinArea': {'MoonGrotto', 'LeftGumoHideout', 'LowerLeftGumoHideout'}, - 'WilhelmLedge': {'ValleyMain', 'SorrowBashLedge', 'ValleyStompless'}} diff --git a/worlds_disabled/oribf/Rules.py b/worlds_disabled/oribf/Rules.py deleted file mode 100644 index e59bc6412f..0000000000 --- a/worlds_disabled/oribf/Rules.py +++ /dev/null @@ -1,59 +0,0 @@ -from typing import Set - -from .RulesData import location_rules -from worlds.generic.Rules import set_rule -from BaseClasses import Location, CollectionState - - -# TODO: implement Mapstone counting, Open, OpenWorld, connection rules - -def oribf_has_all(state: CollectionState, items: Set[str], player:int) -> bool: - return all(state.prog_items[item, player] if type(item) == str - else state.prog_items[item[0], player] >= item[1] for item in items) - -def set_rules(world): - temp_base_rule(world.multiworld, world.player) - for logicset in world.logic_sets: - apply_or_ruleset(world.multiworld, world.player, logicset) - - -def tautology(state): - return True - - -def add_or_rule_check_first(world, location: str, player: int, conditionsets): - location = world.get_location(location, player) - for set in conditionsets: - if "Free" in set: - location.access_rule = tautology - return - rule = lambda state, conditionsets=conditionsets: any( - oribf_has_all(state, conditionset, player) for conditionset in conditionsets) - if location.access_rule is Location.access_rule: - location.access_rule = rule - else: - old_rule = location.access_rule - location.access_rule = lambda state: rule(state) or old_rule(state) - - -def temp_base_rule(world, player): - world.completion_condition[player] = lambda state: oribf_has_all(state, - {"Bash", "ChargeFlame", "ChargeJump", "Climb", "Dash", "DoubleJump", "Glide", "Grenade", "Stomp", "WallJump"}, - player) - - -def base_rule(world, player): - if world.logic[player] != 'nologic': - # Victory gets placed on Escaped Horu Event - world.completion_condition[player] = lambda state: state.has('Victory', player) - # Events - # Also add: can complete goal - set_rule(world.get_location("Escaped Horu", player), - lambda state: state.can_reach("HoruEscapeInnerDoor", player) - and state.has_any({"Dash", "Stomp", "ChargeJump", "ChargeFlame"}, player)) - - -def apply_or_ruleset(world, player, rulesetname): - rules = location_rules[rulesetname] - for location, conditionsets in rules.items(): - add_or_rule_check_first(world, location, player, conditionsets) diff --git a/worlds_disabled/oribf/RulesData.py b/worlds_disabled/oribf/RulesData.py deleted file mode 100644 index 11a51c0763..0000000000 --- a/worlds_disabled/oribf/RulesData.py +++ /dev/null @@ -1,6 +0,0 @@ -# generated by https://github.com/Berserker66/ori_rando_server -# do not edit manually - -# Rules from areas.ori -location_rules = {'casual-core': {'AboveChargeJumpAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'BashSkillTree': {frozenset({'GinsoKey'})}, 'BashAreaExp': {frozenset({'Bash', 'GinsoKey'}), frozenset({'GinsoKey', 'ChargeJump'})}, 'DashAreaOrbRoomExp': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'DashAreaAbilityCell': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'DashAreaRoofExp': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'BlackrootBoulderExp': {frozenset({'Stomp'})}, 'BlackrootMap': {frozenset({'MapStone', 'ChargeJump'}), frozenset({'Climb', 'MapStone', 'DoubleJump'}), frozenset({'MapStone', 'WallJump'}), frozenset({'Grenade', 'Bash', 'MapStone'})}, 'ChargeFlameAreaPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'DashAreaMapstone': {frozenset({'Dash'})}, 'DashAreaPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'DeathGauntletExp': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'DeathGauntletStompSwim': {frozenset({'Stomp', 'Water'})}, 'DeathGauntletEnergyCell': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'DeathGauntletSwimEnergyDoor': {frozenset({('EC', 4)})}, 'DeathGauntletRoofPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'DoubleJumpSkillTree': {frozenset({'Glide'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Climb', 'Bash', 'Grenade'}), frozenset({'DoubleJump'})}, 'DoubleJumpAreaExp': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Climb', 'Bash', 'Grenade'}), frozenset({'Bash', 'WallJump', 'Water'}), frozenset({'ChargeJump', 'WallJump', 'Water'})}, 'ForlornHiddenSpiderExp': {frozenset({'ForlornKey', 'ChargeJump'}), frozenset({'ForlornKey', 'Bash'})}, 'ForlornKeystone1': {frozenset({'ForlornKey', 'ChargeJump'}), frozenset({'ForlornKey'}), frozenset({'Grenade', 'ForlornKey', 'Bash'}), frozenset({'ForlornKey', 'DoubleJump', 'Bash'})}, 'ForlornKeystone2': {frozenset({'ForlornKey', 'ChargeJump'}), frozenset({'Grenade', 'ForlornKey', 'Bash'}), frozenset({'Glide', 'ForlornKey', 'DoubleJump', 'WallJump'}), frozenset({'ForlornKey'}), frozenset({'Climb', 'ForlornKey', 'Glide', 'DoubleJump'})}, 'ForlornEntranceExp': {frozenset({'Grenade', 'ForlornKey', 'Bash'}), frozenset({'ForlornKey', 'ChargeJump', 'Open'}), frozenset({'ForlornKey', 'ChargeJump', 'DoubleJump'}), frozenset({'ForlornKey', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'ForlornKey', 'WallJump', 'Open'}), frozenset({'ForlornKey', 'DoubleJump', 'Open'}), frozenset({'Climb', 'ForlornKey', 'DoubleJump'}), frozenset({'ForlornKey', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'ForlornKey', 'ChargeJump'}), frozenset({'Glide', 'ForlornKey', 'Climb', 'Open'})}, 'ForlornEscape': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'ForlornMap': {frozenset({'ForlornKey', 'MapStone'})}, 'ForlornKeystone4': {frozenset({'ForlornKey'}), frozenset({'Grenade', 'ForlornKey', 'WallJump', 'Bash'}), frozenset({'ForlornKey', 'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'ForlornKey', 'Climb', 'Bash'}), frozenset({'Climb', 'ForlornKey', 'ChargeJump'})}, 'ForlornKeystone3': {frozenset({'Grenade', 'ForlornKey', 'Climb', 'Bash'}), frozenset({'Glide', 'ForlornKey', 'ChargeJump'}), frozenset({'ForlornKey'}), frozenset({'ForlornKey', 'ChargeJump', 'DoubleJump'})}, 'ForlornPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'LowerGinsoKeystone1': {frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'LowerGinsoKeystone2': {frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'LowerGinsoKeystone3': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'LowerGinsoKeystone4': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'GladesLaser': {frozenset({'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'GladesLaserGrenade': {frozenset({'Grenade', 'Climb', 'ChargeJump', 'Bash'}), frozenset({'Grenade', 'Bash', 'DoubleJump', 'WallJump'})}, 'GladesMap': {frozenset({'MapStone'})}, 'GrenadeSkillTree': {frozenset({'Climb', 'Dash'}), frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'})}, 'GrenadeAreaExp': {frozenset({'Climb', 'Dash', 'Glide'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'Dash', 'Bash'}), frozenset({'Glide', 'Dash', 'WallJump'})}, 'GrenadeAreaAbilityCell': {frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Grenade', 'Dash', 'ChargeJump'})}, 'GumoHideoutMap': {frozenset({'MapStone'})}, 'GumoHideoutRightHangingExp': {frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Glide'}), frozenset({'ChargeJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Glide', 'WallJump'})}, 'GumoHideoutMapstone': {frozenset({'Glide'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Climb', 'Bash', 'Grenade'}), frozenset({'DoubleJump'})}, 'GumoHideoutMiniboss': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'GumoHideoutEnergyCell': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'GumoHideoutCrusherExp': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'GumoHideoutCrusherKeystone': {frozenset({'Climb'}), frozenset({'WallJump'})}, 'GumoHideoutRedirectAbilityCell': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'GumoHideoutRedirectPlant': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'ChargeFlame'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Climb', 'Grenade'})}, 'GumoHideoutRedirectEnergyCell': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Glide'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Climb', 'DoubleJump'})}, 'GumoHideoutRedirectExp': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Glide'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Climb', 'DoubleJump'})}, 'GroveWaterStompAbilityCell': {frozenset({'Stomp', 'Water'})}, 'HoruFieldsHealthCell': {frozenset({'Stomp'})}, 'HollowGroveTreePlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'HollowGroveTreeAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'HollowGroveMap': {frozenset({'MapStone'})}, 'HollowGroveMapPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'SwampTeleporterAbilityCell': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash', 'Glide', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Glide', 'WallJump'}), frozenset({'Climb', 'Glide', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb', 'Glide'}), frozenset({'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'DoorWarpExp': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'HoruFieldsPlant': {frozenset({'Grenade', 'Glide', 'ChargeJump'}), frozenset({'ChargeFlame', 'Glide', 'ChargeJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'ChargeFlame', 'Bash'}), frozenset({'Climb', 'ChargeJump', 'Grenade'}), frozenset({'Climb', 'ChargeJump', 'ChargeFlame'})}, 'HoruFieldsEnergyCell': {frozenset({'Glide', 'Bash'}), frozenset({'Glide', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'DoubleJump'})}, 'HoruFieldsHiddenExp': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'HoruFieldsAbilityCell': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump'})}, 'HoruLavaDrainedLeftExp': {frozenset({'Open', 'Bash'}), frozenset({'Glide', 'Open', 'DoubleJump'}), frozenset({'Open', 'ChargeJump'})}, 'HoruLavaDrainedRightExp': {frozenset({'Glide', 'Open', 'Bash'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'DoubleJump'}), frozenset({'Glide', 'Open', 'ChargeJump'})}, 'HoruL4': {frozenset({'Stomp'})}, 'HoruL4LowerExp': {frozenset({'Grenade', 'Bash', 'Stomp'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}, 'HoruL4ChaseExp': {frozenset({'Free'})}, 'HoruMap': {frozenset({'MapStone'})}, 'HoruR1EnergyCell': {frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'Grenade'}), frozenset({'Glide', 'WallJump'})}, 'HoruR3Plant': {frozenset({'Grenade'})}, 'HoruR4DrainedExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Glide', 'DoubleJump'})}, 'HoruR4LaserExp': {frozenset({'Bash', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'InnerSwampDrainExp': {frozenset({'Grenade', 'Bash', 'WallJump', 'Water'}), frozenset({'Climb', 'ChargeJump', 'Water'}), frozenset({'Glide'}), frozenset({'Climb', 'Bash', 'Grenade', 'Water'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeFlame', 'Water', 'Glide', 'Stomp', 'WallJump'}), frozenset({'DoubleJump', 'WallJump', 'Water'}), frozenset({'Grenade', 'Glide', 'Water', 'Bash'}), frozenset({'Glide', 'ChargeJump', 'DoubleJump', 'Water'}), frozenset({'Grenade', 'Bash', 'DoubleJump', 'Water'}), frozenset({'DoubleJump'}), frozenset({'Water', 'Grenade', 'Glide', 'Stomp', 'WallJump'}), frozenset({'Climb', 'DoubleJump', 'Water'}), frozenset({'Climb', 'Dash', 'Glide', 'Water'})}, 'HoruL1': {frozenset({'Grenade', 'Glide', 'Stomp', 'Bash'}), frozenset({'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Bash', 'Stomp', 'DoubleJump'})}, 'HoruL2': {frozenset({'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump'})}, 'HoruL3': {frozenset({'Glide', 'Bash', 'Stomp', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb', 'Stomp'}), frozenset({'Stomp', 'DoubleJump', 'Bash'})}, 'WallJumpAreaExp': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'WallJumpAreaEnergyCell': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'LeftGumoHideoutUpperPlant': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Climb', 'ChargeFlame'}), frozenset({'Grenade'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'ChargeFlame', 'DoubleJump'})}, 'FarLeftGumoHideoutExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'DoubleJump'})}, 'LeftSorrowAbilityCell': {frozenset({'Glide', 'Bash'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Glide', 'DoubleJump', 'WallJump'})}, 'LeftSorrowGrenade': {frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash', 'Glide'})}, 'LeftSorrowPlant': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'ChargeFlame', 'DoubleJump', 'WallJump'}), frozenset({'Grenade'})}, 'LeftSorrowKeystone1': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'LeftSorrowKeystone2': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'LeftSorrowKeystone3': {frozenset({'Glide'})}, 'LeftSorrowKeystone4': {frozenset({'Glide'})}, 'LeftSorrowEnergyCell': {frozenset({'Glide'})}, 'LostGroveLongSwim': {frozenset({'Water'})}, 'LostGroveHiddenExp': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'LostGroveTeleporter': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'LowerBlackrootAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'Grenade', 'Dash', 'Bash'})}, 'LowerBlackrootLaserExp': {frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'}), frozenset({'Climb', 'Dash', 'DoubleJump'})}, 'LowerBlackrootGrenadeThrow': {frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'Climb', 'Grenade'}), frozenset({'Grenade', 'Glide'}), frozenset({'Grenade', 'DoubleJump'})}, 'LowerGinsoHiddenExp': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'LowerGinsoPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'LeftGumoHideoutLowerPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'GumoHideoutLeftHangingExp': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'LeftGumoHideoutExp': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'LeftGumoHideoutHealthCell': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'ChargeJump'})}, 'LeftGumoHideoutSwim': {frozenset({'Water'})}, 'SorrowSpikeKeystone': {frozenset({'Glide'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}, 'SorrowHiddenKeystone': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'}), frozenset({'Glide'})}, 'SorrowHealthCell': {frozenset({'Glide', 'ChargeJump', 'Bash'})}, 'SorrowLowerLeftKeystone': {frozenset({'Glide'})}, 'SpiritCavernsKeystone2': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'SpiritCavernsAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Bash'})}, 'LowerValleyMapstone': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'KuroPerchExp': {frozenset({'Glide', 'Wind'}), frozenset({'Bash', 'OpenWorld'}), frozenset({'Glide'}), frozenset({'Bash'}), frozenset({'Glide', 'OpenWorld'}), frozenset({'Stomp'})}, 'ValleyMainPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'MistyGrenade': {frozenset({'Grenade'})}, 'MistyEntranceStompExp': {frozenset({'Stomp'})}, 'MistyEntranceTreeExp': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'MistyPostClimbAboveSpikePit': {frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Climb', 'Bash', 'Glide'})}, 'GumonSeal': {frozenset({'Climb'}), frozenset({'DoubleJump'}), frozenset({'Bash'}), frozenset({'WallJump'})}, 'MistyFrogNookExp': {frozenset({'Grenade', 'Bash', 'DoubleJump'}), frozenset({'Glide', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'DoubleJump'})}, 'MistyPostClimbSpikeCave': {frozenset({'Glide', 'Bash', 'DoubleJump'})}, 'MistyAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'MistyMortarCorridorUpperExp': {frozenset({'Glide', 'Bash'})}, 'MistyMortarCorridorHiddenExp': {frozenset({'Glide'})}, 'MistyPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'GrottoEnergyDoorSwim': {frozenset({('EC', 2), 'Water'})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'ChargeJump'}), frozenset({('EC', 2), 'Bash', 'Grenade'}), frozenset({('EC', 2), 'DoubleJump', 'WallJump'})}, 'AboveGrottoTeleporterExp': {frozenset({'Grenade', 'Bash'}), frozenset({'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'DoubleJump'}), frozenset({'Bash', 'WallJump'})}, 'LeftGrottoTeleporterExp': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}, 'BelowGrottoTeleporterHealthCell': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'})}, 'BelowGrottoTeleporterPlant': {frozenset({'ChargeFlame', 'Glide'}), frozenset({'Grenade', 'Glide'}), frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'Grenade', 'DoubleJump'})}, 'MoonGrottoStompPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'GrottoSwampDrainAccessExp': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Glide', 'Bash', 'DoubleJump'})}, 'GrottoSwampDrainAccessPlant': {frozenset({'Grenade', 'Stomp'}), frozenset({'ChargeFlame', 'Stomp', 'Climb', 'ChargeJump'}), frozenset({'ChargeFlame', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'ChargeFlame', 'Stomp', 'ChargeJump', 'Glide'}), frozenset({'ChargeFlame', 'Stomp', 'ChargeJump', 'DoubleJump'})}, 'OuterSwampStompExp': {frozenset({'Glide', 'Wind'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'OuterSwampHealthCell': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'OuterSwampMortarPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'OuterSwampGrenadeExp': {frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Grenade', 'Climb'})}, 'OutsideForlornTreeExp': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'OutsideForlornWaterExp': {frozenset({'Water'})}, 'OutsideForlornCliffExp': {frozenset({'Glide'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Dash'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'HoruR1HangingExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Glide', 'DoubleJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'})}, 'HoruR2': {frozenset({'ChargeJump', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'Grenade', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'})}, 'RightForlornPlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'StompAreaExp': {frozenset({'Bash'}), frozenset({'Stomp'})}, 'StompAreaRoofExp': {frozenset({'ChargeJump'})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Bash', 'Glide', 'Water'}), frozenset({'Climb', 'Water', 'Grenade', 'Glide', 'ChargeJump'}), frozenset({'Grenade', 'Stomp', 'ChargeJump', 'Water'}), frozenset({'Grenade', 'Bash', 'Stomp', 'Water'})}, 'SorrowMapstone': {frozenset({'Bash'})}, 'SorrowMap': {frozenset({'Bash', 'MapStone'}), frozenset({'Stomp', 'MapStone'})}, 'SpiderSacHealthCell': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump'}), frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'ChargeFlame', 'Climb', 'ChargeJump'}), frozenset({'Grenade', 'DoubleJump'})}, 'SpiderSacEnergyDoor': {frozenset({('EC', 4)})}, 'SpiderSacGrenadeDoor': {frozenset({'Grenade', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'GroveSpiderWaterSwim': {frozenset({'Water'})}, 'GroveAboveSpiderWaterExp': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}, 'GroveAboveSpiderWaterHealthCell': {frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}, 'GroveAboveSpiderWaterEnergyCell': {frozenset({'Grenade', 'Climb', 'ChargeJump', 'DoubleJump'})}, 'AboveChargeFlameTreeExp': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'})}, 'GladesGrenadePool': {frozenset({'Grenade', 'Water'})}, 'GladesGrenadeTree': {frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'GladesMainPool': {frozenset({'Water'})}, 'GladesMainPoolDeep': {frozenset({'Water'})}, 'FronkeyWalkRoof': {frozenset({'ChargeJump'}), frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash'})}, 'SunstonePlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'SwampMap': {frozenset({'MapStone'})}, 'SwampEntranceSwim': {frozenset({'Water'})}, 'SwampEntrancePlant': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'ChargeFlame', 'Climb'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'Climb'})}, 'InnerSwampStompExp': {frozenset({'Stomp', 'Water'})}, 'InnerSwampSwimRightKeystone': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Glide', 'WallJump'})}, 'TopGinsoLeftLowerExp': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'})}, 'TopGinsoLeftUpperExp': {frozenset({'ChargeJump'}), frozenset({'Bash'})}, 'TopGinsoRightPlant': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'UpperGinsoRedirectLowerExp': {frozenset({'Bash', 'GinsoKey'}), frozenset({'Stomp', 'GinsoKey'})}, 'UpperGinsoRedirectUpperExp': {frozenset({'Bash', 'GinsoKey'}), frozenset({'Stomp', 'GinsoKey'})}, 'UpperGinsoLowerKeystone': {frozenset({'Glide', 'Bash', 'GinsoKey'}), frozenset({'Bash', 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoRightKeystone': {frozenset({'Glide', 'Bash', 'GinsoKey'}), frozenset({'Bash', 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoUpperRightKeystone': {frozenset({'Bash', 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoUpperLeftKeystone': {frozenset({'Bash', 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoEnergyCell': {frozenset({'Bash', 'GinsoKey'}), frozenset({'Stomp', 'GinsoKey'})}, 'GrottoLasersRoofExp': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'LeftGladesExp': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'UpperSorrowRightKeystone': {frozenset({'Glide'})}, 'UpperSorrowFarRightKeystone': {frozenset({'Glide'})}, 'UpperSorrowLeftKeystone': {frozenset({'Glide'})}, 'UpperSorrowSpikeExp': {frozenset({'Glide'})}, 'UpperSorrowFarLeftKeystone': {frozenset({'Glide'})}, 'SpiritCavernsTopLeftKeystone': {frozenset({'Climb', 'DoubleJump'}), frozenset({'WallJump'}), frozenset({'Climb', 'Glide'})}, 'ValleyThreeBirdAbilityCell': {frozenset({'Glide', 'Wind'}), frozenset({'Glide', 'OpenWorld', 'Wind'}), frozenset({'Bash', 'OpenWorld'}), frozenset({'ChargeJump', 'OpenWorld'}), frozenset({'Bash'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'Glide', 'ChargeJump'})}, 'ValleyEntryGrenadeLongSwim': {frozenset({'Grenade', 'Water'})}, 'ValleyEntryTreePlant': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'ValleyForlornApproachGrenade': {frozenset({'Grenade'})}, 'ValleyMap': {frozenset({'Bash', 'MapStone'})}, 'ValleyRightSwimExp': {frozenset({'Water'})}, 'ValleyRightBirdStompCell': {frozenset({'Climb', 'ChargeJump'})}, 'ValleyRightFastStomplessCell': {frozenset({'Glide', 'Wind'})}, 'ValleyRightExp': {frozenset({'Bash'})}, 'ValleyMainFACS': {frozenset({'Climb', 'ChargeJump'})}, 'WilhelmExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash', 'Climb'})}}, 'dbash': {'AboveChargeJumpAbilityCell': {frozenset({'Bash'})}, 'GrenadeSkillTree': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Bash', 'DoubleJump'})}, 'GrenadeAreaExp': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Bash', 'DoubleJump'})}, 'HollowGroveTreeAbilityCell': {frozenset({'Bash'})}, 'HoruFieldsEnergyCell': {frozenset({'Bash'})}, 'HoruLavaDrainedRightExp': {frozenset({'Open', 'Bash'}), frozenset({'Bash'})}, 'HoruR4DrainedExp': {frozenset({'Bash'})}, 'HoruR4LaserExp': {frozenset({'Bash'})}, 'LeftSorrowGrenade': {frozenset({'Grenade', 'Bash'})}, 'GumoHideoutLeftHangingExp': {frozenset({'Bash'})}, 'GumoHideoutRightHangingExp': {frozenset({'Bash'})}, 'LeftGumoHideoutExp': {frozenset({'Bash'})}, 'LeftGumoHideoutHealthCell': {frozenset({'Bash'})}, 'SorrowSpikeKeystone': {frozenset({'Bash'})}, 'SorrowHiddenKeystone': {frozenset({'Bash'})}, 'SorrowHealthCell': {frozenset({'Bash'})}, 'AboveGrottoTeleporterExp': {frozenset({'Bash'})}, 'GrottoSwampDrainAccessExp': {frozenset({'Bash'})}, 'StompAreaRoofExp': {frozenset({'Bash'})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Bash', 'Water'})}, 'GroveAboveSpiderWaterExp': {frozenset({'Bash'})}, 'GroveAboveSpiderWaterHealthCell': {frozenset({'Bash'})}, 'ValleyMainFACS': {frozenset({'Bash'})}, 'WilhelmExp': {frozenset({'Bash'})}}, 'expert-abilities': {'AboveChargeJumpAbilityCell': {frozenset({'Dash', ('AC', 6)})}, 'BashAreaExp': {frozenset({('AC', 6), 'Dash', 'GinsoKey'}), frozenset({('AC', 6), 'Dash', 'GinsoKey', 'DoubleJump', 'WallJump'})}, 'ChargeFlameAreaPlant': {frozenset({'Dash', ('AC', 6)})}, 'DashAreaPlant': {frozenset({'Dash', ('AC', 6)})}, 'DeathGauntletRoofPlant': {frozenset({'Dash', ('AC', 6)})}, 'DoubleJumpAreaExp': {frozenset({'Dash', ('AC', 6), ('EC', 1)})}, 'ForlornHiddenSpiderExp': {frozenset({'ForlornKey', ('AC', 6), 'Dash'})}, 'ForlornPlant': {frozenset({'Dash', ('AC', 6)})}, 'ForlornKeystone3': {frozenset({'ForlornKey', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'ForlornKey', ('AC', 6), 'Dash'})}, 'GladesLaser': {frozenset({'Dash', ('AC', 6)})}, 'GladesLaserGrenade': {frozenset({('AC', 6), ('EC', 1), 'Dash', 'Grenade', 'DoubleJump', 'WallJump'}), frozenset({('AC', 6), ('EC', 1), 'Climb', 'Dash', 'Grenade', 'Glide', 'ChargeJump'}), frozenset({('AC', 6), ('EC', 2), 'Climb', 'Dash', 'Grenade', 'ChargeJump'})}, 'GrenadeSkillTree': {frozenset({'Dash', ('AC', 6)})}, 'GrenadeAreaExp': {frozenset({'Dash', ('AC', 6)})}, 'GrenadeAreaAbilityCell': {frozenset({'Grenade', 'Dash', ('AC', 6)})}, 'GumoHideoutRedirectPlant': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}, 'HollowGroveTreePlant': {frozenset({'Dash', ('AC', 6)})}, 'HollowGroveTreeAbilityCell': {frozenset({'Dash', ('AC', 6)})}, 'HollowGroveMapPlant': {frozenset({'Dash', ('AC', 6)})}, 'SwampTeleporterAbilityCell': {frozenset({'Dash', ('AC', 6)})}, 'HoruFieldsPlant': {frozenset({'Dash', ('AC', 6), ('EC', 3)})}, 'HoruFieldsEnergyCell': {frozenset({('EC', 2), 'Dash', ('AC', 6)})}, 'HoruFieldsHiddenExp': {frozenset({'Dash', ('AC', 6)})}, 'HoruLavaDrainedLeftExp': {frozenset({'Open', ('AC', 6), 'Dash'})}, 'HoruLavaDrainedRightExp': {frozenset({'Open', ('AC', 6), 'Dash'})}, 'HoruL4LowerExp': {frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({'Dash', 'Stomp', ('AC', 3)})}, 'HoruR3Plant': {frozenset({'Dash', ('AC', 6)})}, 'HoruR4DrainedExp': {frozenset({'Dash', ('AC', 6), ('EC', 1)}), frozenset({'Dash', ('AC', 6)})}, 'HoruR4LaserExp': {frozenset({('AC', 6), 'Dash', 'ChargeJump', ('EC', 2)})}, 'HoruL1': {frozenset({'Dash', 'Stomp', ('AC', 3), 'Bash'}), frozenset({('AC', 6), 'Dash', ('EC', 2), 'Stomp', 'DoubleJump'}), frozenset({('AC', 6), 'Dash', 'Stomp', ('EC', 3)})}, 'HoruL2': {frozenset({'Stomp', ('AC', 6), 'Dash', ('EC', 1)}), frozenset({'Climb', 'Stomp', 'Dash', ('AC', 3)})}, 'HoruL3': {frozenset({('AC', 6), 'Climb', 'Dash', ('EC', 2), 'ChargeJump'})}, 'LeftGumoHideoutUpperPlant': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}, 'LeftSorrowPlant': {frozenset({'Dash', ('AC', 6)})}, 'LowerBlackrootAbilityCell': {frozenset({'Dash', ('AC', 6)})}, 'LowerBlackrootLaserExp': {frozenset({'Dash', ('AC', 6)})}, 'LowerGinsoPlant': {frozenset({'Dash', ('AC', 6)})}, 'LeftGumoHideoutLowerPlant': {frozenset({'Dash', ('AC', 6)})}, 'LeftGumoHideoutHealthCell': {frozenset({'Dash', ('AC', 6)})}, 'SorrowSpikeKeystone': {frozenset({'Dash', ('AC', 6)})}, 'SorrowHiddenKeystone': {frozenset({'Dash', ('AC', 6)})}, 'SorrowLowerLeftKeystone': {frozenset({'Dash', ('AC', 6), 'Bash'}), frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'DoubleJump'}), frozenset({('AC', 6), 'Dash', 'Stomp'})}, 'SpiritCavernsKeystone2': {frozenset({'Dash', ('AC', 6)})}, 'SpiritCavernsAbilityCell': {frozenset({'Dash', ('AC', 6)})}, 'LowerValleyMapstone': {frozenset({'Dash', ('AC', 6)})}, 'KuroPerchExp': {frozenset({'Dash', ('AC', 6), 'OpenWorld'}), frozenset({'Dash', ('AC', 3), 'ChargeJump', 'WallJump'}), frozenset({'Dash', ('AC', 6)})}, 'ValleyMainPlant': {frozenset({'Dash', ('AC', 6)})}, 'MistyEntranceTreeExp': {frozenset({'Dash', ('AC', 6)})}, 'MistyFrogNookExp': {frozenset({'Dash', ('AC', 6)})}, 'MistyMortarCorridorUpperExp': {frozenset({'Dash', ('AC', 6)})}, 'MistyMortarCorridorHiddenExp': {frozenset({'Dash', ('AC', 6), 'DoubleJump'})}, 'MistyPlant': {frozenset({'Dash', ('AC', 6)})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'Dash', ('AC', 6)})}, 'AboveGrottoTeleporterExp': {frozenset({'Dash', ('AC', 6)})}, 'BelowGrottoTeleporterHealthCell': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}, 'BelowGrottoTeleporterPlant': {frozenset({'Dash', ('AC', 6)})}, 'MoonGrottoStompPlant': {frozenset({'Dash', ('AC', 6)})}, 'GrottoSwampDrainAccessExp': {frozenset({'Dash', ('AC', 6)})}, 'GrottoSwampDrainAccessPlant': {frozenset({'Dash', ('AC', 6)})}, 'OuterSwampStompExp': {frozenset({'Dash', ('AC', 6)})}, 'OuterSwampHealthCell': {frozenset({'Dash', ('AC', 6)})}, 'OuterSwampMortarPlant': {frozenset({'Dash', ('AC', 6)})}, 'RightForlornPlant': {frozenset({'Dash', ('AC', 6)})}, 'StompAreaExp': {frozenset({'Dash', ('AC', 6), ('EC', 1)})}, 'StompAreaGrenadeExp': {frozenset({('AC', 6), 'Dash', 'Water', 'Grenade', 'Stomp'}), frozenset({('AC', 6), 'Dash', ('EC', 3), 'Water', 'Grenade'})}, 'SorrowMapstone': {frozenset({'Dash', ('AC', 6)})}, 'AboveChargeFlameTreeExp': {frozenset({'Dash', ('AC', 6)})}, 'SpiderSacHealthCell': {frozenset({'Dash', ('AC', 6)})}, 'SpiderSacGrenadeDoor': {frozenset({'Grenade', 'Dash', ('AC', 6)})}, 'GroveAboveSpiderWaterExp': {frozenset({'Dash', ('AC', 6)})}, 'GroveAboveSpiderWaterHealthCell': {frozenset({'Dash', ('AC', 6)})}, 'GroveAboveSpiderWaterEnergyCell': {frozenset({'Grenade', 'Dash', ('AC', 6)})}, 'GladesGrenadeTree': {frozenset({'Grenade', 'Dash', ('AC', 6)})}, 'FronkeyWalkRoof': {frozenset({'Dash', ('AC', 6)})}, 'SunstonePlant': {frozenset({'Dash', ('AC', 6)})}, 'InnerSwampDrainExp': {frozenset({'Climb', 'Dash', 'Water', 'Grenade', 'Stomp', ('AC', 3)}), frozenset({'Climb', 'Dash', ('AC', 6), 'Water'}), frozenset({'ChargeFlame', 'Climb', 'Dash', 'Water', 'Stomp', ('AC', 3)}), frozenset({'Dash', ('AC', 3), 'WallJump', 'Water'})}, 'SwampEntrancePlant': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}, 'InnerSwampStompExp': {frozenset({'Dash', 'ChargeJump', ('AC', 3), 'Water'})}, 'TopGinsoLeftLowerExp': {frozenset({'Dash', ('AC', 6)})}, 'TopGinsoLeftUpperExp': {frozenset({'Dash', ('AC', 6)})}, 'TopGinsoRightPlant': {frozenset({'Dash', ('AC', 6)})}, 'UpperGinsoRedirectLowerExp': {frozenset({'Dash', ('AC', 3), 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoRedirectUpperExp': {frozenset({'Dash', ('AC', 3), 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoLowerKeystone': {frozenset({('AC', 6), 'Dash', 'GinsoKey'})}, 'GrottoLasersRoofExp': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)})}, 'UpperSorrowLeftKeystone': {frozenset({('EC', 2), 'Dash', ('AC', 6)})}, 'ValleyThreeBirdAbilityCell': {frozenset({'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'OpenWorld'})}, 'ValleyEntryTreePlant': {frozenset({'Dash', ('AC', 6)})}, 'ValleyMap': {frozenset({'Grenade', 'Dash', 'MapStone', ('AC', 3)}), frozenset({'ChargeFlame', 'Dash', 'MapStone', ('AC', 3)})}, 'ValleyMainFACS': {frozenset({'WallJump', 'Dash', 'ChargeJump', 'DoubleJump', ('AC', 3)}), frozenset({'Wind', 'Dash', 'Glide', ('AC', 3), 'ChargeJump', 'WallJump'})}}, 'master-abilities': {'BashAreaExp': {frozenset({('AC', 12), 'GinsoKey', 'DoubleJump'})}, 'ForlornHiddenSpiderExp': {frozenset({'ForlornKey', ('AC', 12), 'DoubleJump'})}, 'ForlornKeystone2': {frozenset({'ForlornKey', ('AC', 12), 'DoubleJump'})}, 'ForlornEntranceExp': {frozenset({'ForlornKey', ('AC', 12), 'DoubleJump'})}, 'GumoHideoutRedirectPlant': {frozenset({'Dash', ('AC', 6), 'DoubleJump'})}, 'SwampTeleporterAbilityCell': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump'})}, 'HoruFieldsAbilityCell': {frozenset({'Glide', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'HoruLavaDrainedLeftExp': {frozenset({'Open', ('AC', 12), 'DoubleJump'})}, 'HoruLavaDrainedRightExp': {frozenset({'Open', 'ChargeJump', 'DoubleJump', ('AC', 12)}), frozenset({'Glide', 'Open', ('AC', 12), 'DoubleJump'})}, 'HoruR4DrainedExp': {frozenset({('AC', 12), 'DoubleJump'})}, 'HoruL1': {frozenset({('AC', 6), ('EC', 1), 'Dash', 'Stomp', 'DoubleJump'})}, 'HoruL2': {frozenset({'Stomp', 'DoubleJump', ('AC', 3), 'Dash'}), frozenset({'Stomp', ('AC', 12), 'DoubleJump'})}, 'HoruL3': {frozenset({('AC', 6), 'Dash', ('EC', 6), 'DoubleJump', 'WallJump'}), frozenset({('AC', 6), 'Dash', ('EC', 2), 'Stomp', 'DoubleJump'}), frozenset({('AC', 6), 'Dash', 'Stomp', ('EC', 3)}), frozenset({('AC', 6), ('EC', 4), 'Dash', 'Glide', 'DoubleJump'}), frozenset({'Dash', ('AC', 6), ('EC', 7)}), frozenset({'Glide', 'Dash', ('AC', 6), ('EC', 6)}), frozenset({('AC', 12), 'Climb', 'Dash', 'Glide', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', ('AC', 6), 'Dash', ('EC', 1)}), frozenset({('AC', 6), 'Climb', 'Dash', ('EC', 6), 'DoubleJump'})}, 'LeftSorrowAbilityCell': {frozenset({'Climb', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'LowerGinsoHiddenExp': {frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'WallJump'})}, 'LeftGumoHideoutExp': {frozenset({('AC', 12), 'DoubleJump'})}, 'LeftGumoHideoutHealthCell': {frozenset({('AC', 12), 'DoubleJump'})}, 'SorrowSpikeKeystone': {frozenset({'Climb', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'SorrowLowerLeftKeystone': {frozenset({('AC', 12), 'DoubleJump'})}, 'SpiritCavernsAbilityCell': {frozenset({('AC', 12), 'DoubleJump'})}, 'MistyFrogNookExp': {frozenset({('AC', 12), 'DoubleJump'})}, 'MistyMortarCorridorUpperExp': {frozenset({('AC', 12), 'DoubleJump'})}, 'MistyMortarCorridorHiddenExp': {frozenset({('AC', 12), 'DoubleJump'}), frozenset({'Dash', ('AC', 6)})}, 'BelowGrottoTeleporterHealthCell': {frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'OuterSwampHealthCell': {frozenset({('AC', 12), 'DoubleJump'})}, 'SpiderSacHealthCell': {frozenset({'Dash', ('AC', 6), 'DoubleJump'})}, 'TopGinsoLeftUpperExp': {frozenset({('AC', 12), 'DoubleJump'})}, 'TopGinsoRightPlant': {frozenset({'ChargeFlame', ('AC', 12), 'DoubleJump'}), frozenset({'Grenade', ('AC', 12), 'DoubleJump'})}, 'UpperSorrowRightKeystone': {frozenset({('AC', 6), 'Dash', 'Grenade', 'Bash', 'DoubleJump'})}, 'UpperSorrowFarRightKeystone': {frozenset({('AC', 12), 'Dash', 'Grenade', 'Bash', 'DoubleJump'})}, 'ValleyThreeBirdAbilityCell': {frozenset({('AC', 12), 'DoubleJump'})}, 'WilhelmExp': {frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'KuroPerchExp': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'master-core': {'DashAreaRoofExp': {frozenset({'DoubleJump'}), frozenset({'Bash'})}, 'DoubleJumpAreaExp': {frozenset({'DoubleJump'})}, 'ForlornKeystone4': {frozenset({'Grenade', 'ForlornKey', 'DoubleJump', 'Bash'}), frozenset({'ForlornKey', 'ChargeJump', 'DoubleJump'})}, 'LowerGinsoKeystone3': {frozenset({'DoubleJump'})}, 'LowerGinsoKeystone4': {frozenset({'DoubleJump'})}, 'GladesLaserGrenade': {frozenset({'Grenade', 'Bash', 'DoubleJump'})}, 'GrenadeSkillTree': {frozenset({'ChargeJump'})}, 'GrenadeAreaAbilityCell': {frozenset({'Grenade', 'ChargeJump'})}, 'GumoHideoutMiniboss': {frozenset({'DoubleJump'})}, 'GumoHideoutEnergyCell': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'}), frozenset({'DoubleJump'})}, 'HollowGroveTreeAbilityCell': {frozenset({'Stomp', 'DoubleJump'})}, 'SwampTeleporterAbilityCell': {frozenset({'Glide', 'ChargeJump', 'DoubleJump'})}, 'DoorWarpExp': {frozenset({'DoubleJump'})}, 'HoruFieldsPlant': {frozenset({'Grenade', 'Glide'}), frozenset({'Grenade', 'Dash'}), frozenset({'Grenade', 'DoubleJump'})}, 'HoruFieldsAbilityCell': {frozenset({'Bash'})}, 'HoruL4LowerExp': {frozenset({'Dash', 'Stomp'})}, 'HoruR1EnergyCell': {frozenset({'DoubleJump'})}, 'HoruL2': {frozenset({'Glide', 'Stomp', 'DoubleJump'})}, 'HoruL3': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'Bash', 'Stomp'})}, 'WallJumpAreaEnergyCell': {frozenset({'DoubleJump'})}, 'FarLeftGumoHideoutExp': {frozenset({'Bash'})}, 'LeftSorrowAbilityCell': {frozenset({'Bash'})}, 'LeftSorrowKeystone2': {frozenset({'Bash'})}, 'LeftSorrowKeystone3': {frozenset({'Bash'})}, 'LeftSorrowKeystone4': {frozenset({'Bash'})}, 'LeftSorrowEnergyCell': {frozenset({'Bash'})}, 'LowerBlackrootAbilityCell': {frozenset({'DoubleJump'})}, 'LowerGinsoHiddenExp': {frozenset({'DoubleJump'})}, 'SorrowSpikeKeystone': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump'})}, 'SorrowLowerLeftKeystone': {frozenset({'Bash'})}, 'SpiritCavernsKeystone2': {frozenset({'Free'})}, 'LowerValleyMapstone': {frozenset({'Free'})}, 'MistyEntranceStompExp': {frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({'ChargeFlame', 'Dash'})}, 'MistyEntranceTreeExp': {frozenset({'DoubleJump'}), frozenset({'WallJump'})}, 'MistyPostClimbAboveSpikePit': {frozenset({'Bash'})}, 'MistyMortarCorridorUpperExp': {frozenset({'Bash'})}, 'MistyMortarCorridorHiddenExp': {frozenset({'Bash'})}, 'OuterSwampHealthCell': {frozenset({'Glide', 'DoubleJump'}), frozenset({'Bash'})}, 'OutsideForlornTreeExp': {frozenset({'Bash'})}, 'HoruR1HangingExp': {frozenset({'Glide', 'WallJump'})}, 'HoruR2': {frozenset({'Stomp', 'DoubleJump'})}, 'HoruR4DrainedExp': {frozenset({'Bash'})}, 'StompAreaExp': {frozenset({'Grenade'})}, 'AboveChargeFlameTreeExp': {frozenset({'Glide', 'Bash', 'DoubleJump'}), frozenset({'Stomp', 'DoubleJump'}), frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'Grenade', 'DoubleJump'})}, 'SpiderSacHealthCell': {frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'Grenade', 'DoubleJump'})}, 'SpiderSacEnergyDoor': {frozenset({('EC', 2)})}, 'InnerSwampDrainExp': {frozenset({'DoubleJump', 'Water'})}, 'TopGinsoLeftLowerExp': {frozenset({'DoubleJump'})}, 'UpperGinsoRedirectLowerExp': {frozenset({'Grenade', 'GinsoKey'})}, 'GrottoLasersRoofExp': {frozenset({'Glide', 'DoubleJump'}), frozenset({'Bash'})}, 'SpiritCavernsTopLeftKeystone': {frozenset({'DoubleJump'}), frozenset({'Climb'})}, 'KuroPerchExp': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash'}), frozenset({'Glide', 'ChargeJump'})}}, 'glitched': {'BlackrootBoulderExp': {frozenset({'Free'})}, 'GroveWaterStompAbilityCell': {frozenset({'Bash'})}, 'SpiderSacEnergyDoor': {frozenset({('EC', 3)})}, 'GladesGrenadeTree': {frozenset({'Grenade'})}, 'KuroPerchExp': {frozenset({'ChargeJump'})}}, 'standard-abilities': {'BlackrootMap': {frozenset({'Climb', 'Dash', 'MapStone', ('AC', 3)})}, 'DoubleJumpSkillTree': {frozenset({'Dash', ('AC', 3)})}, 'DoubleJumpAreaExp': {frozenset({'Dash', 'ChargeJump', ('AC', 3)}), frozenset({'Bash', 'Dash', ('AC', 3)})}, 'ForlornKeystone3': {frozenset({'ForlornKey', 'ChargeJump', 'Dash', ('AC', 3)})}, 'LowerGinsoKeystone1': {frozenset({'Dash', ('AC', 3)})}, 'LowerGinsoKeystone2': {frozenset({'Dash', ('AC', 3)})}, 'GladesLaserGrenade': {frozenset({'Dash', 'Grenade', 'Glide', ('AC', 3), 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Dash', 'Grenade', 'ChargeJump', 'DoubleJump', ('AC', 3)})}, 'GumoHideoutMapstone': {frozenset({'Dash', ('AC', 3)})}, 'GumoHideoutRedirectAbilityCell': {frozenset({'Dash', ('AC', 3)})}, 'HollowGroveTreeAbilityCell': {frozenset({'WallJump', 'Dash', 'Glide', 'Stomp', ('AC', 3)}), frozenset({'Climb', 'Dash', 'Glide', 'Stomp', ('AC', 3)})}, 'SwampTeleporterAbilityCell': {frozenset({'Dash', 'Glide', 'ChargeJump', 'DoubleJump', ('AC', 3)})}, 'HoruFieldsPlant': {frozenset({'Dash', 'Grenade', 'ChargeJump', 'DoubleJump', ('AC', 3)}), frozenset({'ChargeFlame', 'Dash', 'ChargeJump', 'DoubleJump', ('AC', 3)})}, 'HoruFieldsEnergyCell': {frozenset({'Dash', 'ChargeJump', 'DoubleJump', ('AC', 3)}), frozenset({'Glide', 'ChargeJump', 'Dash', ('AC', 3)})}, 'HoruLavaDrainedLeftExp': {frozenset({'Glide', 'Open', 'Dash', ('AC', 3)})}, 'HoruR1EnergyCell': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}, 'HoruR4DrainedExp': {frozenset({'Dash', 'DoubleJump', ('AC', 3)}), frozenset({'Glide', 'Dash', ('AC', 3)})}, 'InnerSwampDrainExp': {frozenset({'Dash', ('AC', 3)})}, 'HoruL1': {frozenset({'WallJump', 'Dash', 'Stomp', ('AC', 3), 'Bash'}), frozenset({'Dash', 'Grenade', 'Stomp', ('AC', 3), 'Bash'}), frozenset({'Dash', 'Stomp', 'ChargeJump', ('AC', 3), 'Bash'}), frozenset({'Climb', 'Dash', 'Stomp', ('AC', 3), 'Bash'})}, 'HoruL2': {frozenset({'Stomp', ('AC', 3), 'Dash', 'WallJump'}), frozenset({'Climb', 'Dash', 'Stomp', 'DoubleJump', ('AC', 3)})}, 'HoruL3': {frozenset({'Bash', 'Stomp', 'Dash', ('AC', 3)}), frozenset({'ChargeFlame', 'Bash', 'Dash', ('AC', 3)})}, 'FarLeftGumoHideoutExp': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}, 'GumoHideoutLeftHangingExp': {frozenset({'Dash', ('AC', 3)})}, 'MistyFrogNookExp': {frozenset({'Dash', ('AC', 3), 'DoubleJump', 'WallJump'})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'Climb', 'Dash', ('AC', 3)})}, 'BelowGrottoTeleporterPlant': {frozenset({'Grenade', 'Dash', ('AC', 3)}), frozenset({'ChargeFlame', 'Dash', ('AC', 3)})}, 'GrottoSwampDrainAccessPlant': {frozenset({'ChargeFlame', 'Dash', ('AC', 3), 'WallJump'}), frozenset({'ChargeFlame', 'Glide', 'Dash', ('AC', 3)})}, 'HoruR1HangingExp': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}, 'HoruLavaDrainedRightExp': {frozenset({'Dash', ('AC', 3)})}, 'AboveChargeFlameTreeExp': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}, 'UpperGinsoLowerKeystone': {frozenset({'Dash', ('AC', 3), 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoRightKeystone': {frozenset({'Dash', ('AC', 3), 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoUpperLeftKeystone': {frozenset({'Dash', ('AC', 3), 'GinsoKey', 'ChargeJump'})}}, 'expert-core': {'BlackrootMap': {frozenset({'Climb', 'MapStone'})}, 'DashAreaMapstone': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'DoubleJumpSkillTree': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'})}, 'DoubleJumpAreaExp': {frozenset({'Climb', 'Bash', 'Water'}), frozenset({'Grenade', 'Bash'})}, 'ForlornHiddenSpiderExp': {frozenset({'ForlornKey', 'DoubleJump', 'WallJump'})}, 'ForlornEntranceExp': {frozenset({'ForlornKey', 'Open'})}, 'GladesLaserGrenade': {frozenset({'Water', 'Grenade', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump', 'Water'})}, 'GrenadeSkillTree': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Dash', 'Bash'})}, 'GumoHideoutCrusherExp': {frozenset({'DoubleJump'})}, 'GumoHideoutCrusherKeystone': {frozenset({'DoubleJump'})}, 'SwampTeleporterAbilityCell': {frozenset({'Grenade', 'Bash'})}, 'HoruL4LowerExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'HoruR1EnergyCell': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Climb', 'Glide'})}, 'HoruR4DrainedExp': {frozenset({'Glide', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'HoruL1': {frozenset({'Glide', 'Stomp', 'Bash'})}, 'HoruL2': {frozenset({'Climb', 'Stomp', 'Glide', 'DoubleJump'})}, 'HoruL3': {frozenset({'Grenade', 'Bash', 'ChargeJump'})}, 'LeftGumoHideoutUpperPlant': {frozenset({'ChargeFlame'})}, 'LeftSorrowKeystone1': {frozenset({'ChargeJump', 'WallJump'})}, 'LeftSorrowKeystone2': {frozenset({'ChargeJump', 'WallJump'})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'Glide', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'LowerBlackrootLaserExp': {frozenset({'Grenade', 'Bash'}), frozenset({'DoubleJump'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'GumoHideoutRightHangingExp': {frozenset({'DoubleJump'})}, 'LeftGumoHideoutExp': {frozenset({'Climb', 'DoubleJump'})}, 'SorrowHiddenKeystone': {frozenset({'Bash', 'ChargeJump', 'WallJump'})}, 'SorrowHealthCell': {frozenset({'Climb', 'ChargeJump'})}, 'SorrowLowerLeftKeystone': {frozenset({'Bash', 'DoubleJump'})}, 'SpiritCavernsAbilityCell': {frozenset({'Climb', 'DoubleJump'})}, 'KuroPerchExp': {frozenset({'Glide', 'ChargeJump', 'WallJump'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}, 'MistyEntranceStompExp': {frozenset({'Climb', 'Dash', 'ChargeJump'})}, 'MistyEntranceTreeExp': {frozenset({'Bash'})}, 'MistyPostClimbAboveSpikePit': {frozenset({'Bash', 'DoubleJump'})}, 'MistyMortarCorridorHiddenExp': {frozenset({'Bash', 'DoubleJump'})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'Climb', 'Glide'})}, 'LeftGrottoTeleporterExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'HoruR1HangingExp': {frozenset({'DoubleJump'}), frozenset({'Dash'})}, 'HoruR2': {frozenset({'Stomp', 'WallJump'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Climb', 'Stomp'}), frozenset({'Stomp', 'ChargeJump'})}, 'StompAreaExp': {frozenset({'ChargeFlame'})}, 'AboveChargeFlameTreeExp': {frozenset({'ChargeFlame', 'Climb', 'Glide'}), frozenset({'Dash', 'WallJump'}), frozenset({'Grenade', 'Climb', 'Glide'}), frozenset({'ChargeFlame', 'Glide', 'WallJump'}), frozenset({'Grenade', 'Glide', 'WallJump'}), frozenset({'Climb', 'Stomp', 'Glide'}), frozenset({'Glide', 'Stomp', 'WallJump'}), frozenset({'Climb', 'Dash'})}, 'SpiderSacGrenadeDoor': {frozenset({'Grenade', 'Climb', 'DoubleJump'})}, 'InnerSwampDrainExp': {frozenset({'ChargeJump', 'DoubleJump', 'Water'}), frozenset({'Glide', 'Dash', 'WallJump', 'Water'})}, 'SwampEntrancePlant': {frozenset({'Grenade'})}, 'InnerSwampStompExp': {frozenset({'Grenade', 'Bash', 'ChargeJump', 'Water'})}, 'InnerSwampSwimRightKeystone': {frozenset({'DoubleJump'})}, 'UpperGinsoRedirectLowerExp': {frozenset({'ChargeFlame', 'GinsoKey'})}, 'UpperGinsoRedirectUpperExp': {frozenset({'Climb', 'GinsoKey', 'ChargeJump'}), frozenset({'ChargeFlame', 'GinsoKey'})}, 'UpperGinsoEnergyCell': {frozenset({'Dash', 'GinsoKey', 'ChargeJump'}), frozenset({'ChargeFlame', 'GinsoKey'})}, 'LeftGladesExp': {frozenset({'DoubleJump'}), frozenset({'Bash'})}, 'UpperSorrowLeftKeystone': {frozenset({'Grenade', 'Bash'})}, 'ValleyMap': {frozenset({'Grenade', 'MapStone', 'DoubleJump'}), frozenset({'Grenade', 'MapStone', 'ChargeJump'}), frozenset({'ChargeFlame', 'MapStone', 'ChargeJump'}), frozenset({'ChargeFlame', 'MapStone', 'DoubleJump'})}, 'WilhelmExp': {frozenset({'Climb', 'Bash'}), frozenset({'Grenade', 'Bash'})}}, 'expert-dboost': {'UpperSorrowSpikeExp': {frozenset({('AC', 6), 'Dash', 'ChargeJump', ('HC', 2)}), frozenset({('EC', 2), 'Dash', ('AC', 6), ('HC', 2)}), frozenset({'Grenade', 'Bash', 'DoubleJump', ('HC', 2)}), frozenset({('AC', 6), 'Dash', ('HC', 2), 'Grenade', 'Bash'})}, 'DeathGauntletStompSwim': {frozenset({('HC', 0)})}, 'DoubleJumpAreaExp': {frozenset({'Climb', 'Bash', ('HC', -1)})}, 'ForlornEntranceExp': {frozenset({'ForlornKey', 'WallJump', ('HC', 1)})}, 'GladesLaser': {frozenset({'Glide', 'WallJump'})}, 'GladesLaserGrenade': {frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Climb', 'Dash', 'Grenade', 'Glide'}), frozenset({'Grenade', 'Glide', 'ChargeJump', ('HC', 0)}), frozenset({('AC', 6), ('EC', 1), 'Climb', 'Dash', ('HC', 2), 'Grenade'}), frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Climb', 'Dash', 'Grenade', 'DoubleJump'}), frozenset({('HC', 0), 'Grenade', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Grenade', 'ChargeJump'}), frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Climb', 'Dash', 'Water', 'Grenade'}), frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Dash', 'Grenade', 'Glide', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump', ('HC', 0)}), frozenset({'Grenade', 'ChargeJump', ('HC', 2)}), frozenset({('HC', 0), ('EC', 2), 'Grenade', 'ChargeJump', ('AC', 3)}), frozenset({('AC', 6), ('HC', 0), ('EC', 2), 'Dash', 'Grenade', 'WallJump'}), frozenset({('AC', 6), ('HC', 0), ('EC', 1), 'Dash', 'Water', 'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash', 'ChargeJump', ('HC', 0)}), frozenset({'Grenade', 'ChargeJump', ('HC', 0), 'Water'}), frozenset({('AC', 6), ('HC', 0), ('EC', 2), 'Climb', 'Dash', 'Grenade'}), frozenset({('EC', 1), ('HC', 1), 'Grenade', 'ChargeJump', ('AC', 3)}), frozenset({('AC', 6), ('EC', 1), 'Dash', ('HC', 2), 'Grenade', 'WallJump'})}, 'GroveWaterStompAbilityCell': {frozenset({'Stomp', ('HC', 2)}), frozenset({('HC', 3), 'Bash'})}, 'HoruFieldsAbilityCell': {frozenset({'Bash', 'WallJump', ('HC', 2)})}, 'HoruR1EnergyCell': {frozenset({'WallJump', ('HC', 2)}), frozenset({'Climb', ('HC', 2)})}, 'HoruR4DrainedExp': {frozenset({('HC', 3), 'DoubleJump'}), frozenset({('HC', 3), 'Dash', ('AC', 3)}), frozenset({('HC', 3), 'Glide'})}, 'LeftSorrowAbilityCell': {frozenset({'Climb', 'ChargeJump', ('HC', 2)}), frozenset({'ChargeJump', 'WallJump', ('HC', 2)})}, 'LeftSorrowKeystone3': {frozenset({'Climb', 'ChargeJump', ('HC', 2)})}, 'LeftSorrowKeystone4': {frozenset({'Climb', 'ChargeJump', 'DoubleJump', ('HC', 2)}), frozenset({'Climb', 'Dash', 'ChargeJump', ('HC', 2)})}, 'LeftSorrowEnergyCell': {frozenset({'Climb', 'ChargeJump', 'DoubleJump', ('HC', 2)})}, 'LowerBlackrootAbilityCell': {frozenset({'DoubleJump', ('HC', 2)})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'DoubleJump', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)}), frozenset({'Glide', 'Stomp', ('HC', 1)}), frozenset({'Glide', 'WallJump', ('HC', 1)}), frozenset({'Dash', ('AC', 3), ('HC', 1)})}, 'LeftGumoHideoutSwim': {frozenset({'Free'})}, 'SorrowSpikeKeystone': {frozenset({'Climb', 'DoubleJump', ('HC', 2)}), frozenset({'ChargeJump', 'WallJump', ('HC', 2)}), frozenset({'Climb', 'ChargeJump', ('HC', 2)}), frozenset({'DoubleJump', 'WallJump', ('HC', 2)})}, 'SorrowHiddenKeystone': {frozenset({'Climb', 'Bash', ('HC', 2)}), frozenset({'Bash', 'WallJump', ('HC', 2)})}, 'SorrowHealthCell': {frozenset({'ChargeJump', 'DoubleJump', 'WallJump', ('HC', 2)})}, 'MistyFrogNookExp': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({('HC', 4), 'Dash', 'WallJump'})}, 'MistyPostClimbSpikeCave': {frozenset({'Glide', ('HC', 1)})}, 'MistyMortarCorridorUpperExp': {frozenset({'ChargeJump', ('HC', 1)}), frozenset({'Bash', ('HC', 1)})}, 'MistyMortarCorridorHiddenExp': {frozenset({'Grenade', 'Bash', ('HC', 1)}), frozenset({'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({'Dash', ('AC', 3), ('HC', 1)}), frozenset({('HC', 4), 'Bash'})}, 'GrottoEnergyDoorSwim': {frozenset({('EC', 2)})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'Climb', 'DoubleJump'})}, 'LeftGrottoTeleporterExp': {frozenset({('HC', 4), 'WallJump'}), frozenset({'Glide', 'DoubleJump', ('HC', 1)}), frozenset({'Climb', 'Glide', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)}), frozenset({'Climb', ('HC', 4)}), frozenset({'Glide', 'WallJump', ('HC', 1)})}, 'BelowGrottoTeleporterHealthCell': {frozenset({'Bash', ('HC', 2)})}, 'OutsideForlornWaterExp': {frozenset({('HC', 1)}), frozenset({'Stomp', ('HC', -1)})}, 'HoruR1HangingExp': {frozenset({'ChargeJump', ('HC', 2)})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Bash', ('HC', 0)}), frozenset({('HC', 0), 'Climb', 'Dash', 'Water', 'Grenade', 'Stomp', 'DoubleJump', ('AC', 3)}), frozenset({'Climb', 'Dash', ('HC', 1), 'Grenade', 'Stomp', 'DoubleJump', ('AC', 3)}), frozenset({('HC', 0), 'Water', 'Grenade', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({('AC', 6), 'Dash', ('EC', 3), 'Grenade', ('HC', 1)}), frozenset({('HC', 1), 'Grenade', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'ChargeJump', ('HC', 1)})}, 'GroveSpiderWaterSwim': {frozenset({'Bash', ('HC', 2)}), frozenset({('HC', 3)})}, 'GladesGrenadePool': {frozenset({'Grenade', ('HC', 3)}), frozenset({'Grenade', 'Stomp', ('HC', 2)})}, 'GladesMainPool': {frozenset({'Bash', ('HC', 0)}), frozenset({('HC', 1)}), frozenset({'Stomp', ('HC', 0)})}, 'GladesMainPoolDeep': {frozenset({('HC', 4)})}, 'SwampEntranceSwim': {frozenset({'Free'})}, 'InnerSwampStompExp': {frozenset({'Dash', 'ChargeJump', ('AC', 3)}), frozenset({'Stomp'}), frozenset({'Grenade', 'Bash', 'ChargeJump'})}, 'TopGinsoLeftLowerExp': {frozenset({('HC', 2)})}, 'TopGinsoRightPlant': {frozenset({'ChargeFlame', 'DoubleJump', 'WallJump', ('HC', 0)}), frozenset({'Climb', ('HC', 0), 'DoubleJump', 'ChargeFlame'})}, 'UpperGinsoLowerKeystone': {frozenset({'GinsoKey', ('HC', 2)})}, 'UpperGinsoRightKeystone': {frozenset({'GinsoKey', 'DoubleJump', 'WallJump', ('HC', 2)})}, 'UpperSorrowRightKeystone': {frozenset({('AC', 6), 'Dash', 'ChargeJump', ('HC', 2)})}, 'UpperSorrowLeftKeystone': {frozenset({'ChargeJump', ('HC', 2)})}, 'ValleyRightSwimExp': {frozenset({('HC', 1)})}, 'ValleyRightFastStomplessCell': {frozenset({'ChargeJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'ChargeJump', ('HC', 1)}), frozenset({'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'ValleyRightExp': {frozenset({'ChargeJump', 'DoubleJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'ValleyMainFACS': {frozenset({'WallJump', 'Dash', ('HC', 1), 'ChargeJump', ('AC', 3)})}, 'WilhelmExp': {frozenset({'ChargeJump', ('HC', 2)})}}, 'master-lure': {'UpperSorrowSpikeExp': {frozenset({'Bash'})}, 'UpperSorrowFarLeftKeystone': {frozenset({'Bash'})}, 'UpperSorrowRightKeystone': {frozenset({'Bash'})}, 'UpperSorrowFarRightKeystone': {frozenset({'Bash'})}, 'UpperSorrowLeftKeystone': {frozenset({'Bash'})}, 'ForlornKeystone2': {frozenset({'ForlornKey', 'Bash'})}, 'ForlornEscape': {frozenset({'Bash'})}, 'ForlornKeystone3': {frozenset({'ForlornKey', 'Bash'})}, 'GroveWaterStompAbilityCell': {frozenset({('AC', 12)}), frozenset({('HC', 2)})}, 'SwampTeleporterAbilityCell': {frozenset({'Bash'})}, 'WallJumpAreaExp': {frozenset({'Bash'})}, 'WallJumpAreaEnergyCell': {frozenset({'Bash'})}, 'SorrowHealthCell': {frozenset({'Glide', 'Stomp', 'WallJump'}), frozenset({'Glide', 'Stomp', 'DoubleJump'}), frozenset({'Climb', 'Glide', 'Stomp'})}, 'KuroPerchExp': {frozenset({'Bash'})}, 'LeftGrottoTeleporterExp': {frozenset({'Bash'})}, 'InnerSwampDrainExp': {frozenset({'Bash', 'Water'})}, 'InnerSwampStompExp': {frozenset({'Bash', 'Water'}), frozenset({'Bash', ('HC', 0)})}}, 'master-dboost': {'UpperSorrowSpikeExp': {frozenset({('AC', 12), 'Dash', 'Grenade', 'Bash', ('HC', 1)}), frozenset({('AC', 12), 'Grenade', 'Bash', 'DoubleJump', ('HC', 1)}), frozenset({('EC', 2), 'Dash', ('AC', 12), ('HC', 1)}), frozenset({('AC', 12), 'Dash', 'ChargeJump', ('HC', 1)}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'UpperSorrowFarLeftKeystone': {frozenset({('AC', 12), 'Dash', ('HC', 1), 'Grenade', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({('AC', 12), 'Dash', ('HC', 1), 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({('HC', 4), ('AC', 12), 'Climb', 'Grenade', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({('AC', 12), 'Climb', 'Dash', 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 12), 'Climb', 'ChargeJump', 'DoubleJump', ('HC', 7)}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', 'WallJump', ('HC', 7)}), frozenset({('AC', 12), 'Climb', 'Dash', 'Grenade', 'Bash', 'DoubleJump', ('HC', 1)}), frozenset({('HC', 4), ('AC', 12), 'Grenade', 'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'ForlornEntranceExp': {frozenset({'ForlornKey', ('AC', 12), ('HC', 0), 'WallJump'})}, 'HoruR1EnergyCell': {frozenset({('AC', 12), 'WallJump', ('HC', 1)}), frozenset({'Climb', ('AC', 12), ('HC', 1)})}, 'HoruR4DrainedExp': {frozenset({('HC', 8)}), frozenset({('AC', 12), ('HC', 6)})}, 'HoruL1': {frozenset({('EC', 1), ('AC', 12), 'Climb', ('HC', 2), 'Stomp', 'DoubleJump'}), frozenset({('AC', 12), 'Climb', ('EC', 2), 'Stomp', 'DoubleJump', ('HC', 1)}), frozenset({('HC', 4), ('AC', 12), 'Climb', 'Stomp', 'DoubleJump'}), frozenset({('AC', 12), ('HC', 1), 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Bash', 'Stomp', ('HC', 2)}), frozenset({'Stomp', 'ChargeJump', ('HC', 2)})}, 'HoruL3': {frozenset({('HC', 3), ('AC', 12), 'Climb', 'Dash', ('EC', 2), 'Glide', 'DoubleJump'}), frozenset({('HC', 0), ('AC', 12), 'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'ChargeFlame', ('HC', 0), ('AC', 12), 'ChargeJump', 'DoubleJump'}), frozenset({('EC', 1), ('AC', 12), 'Climb', 'Dash', 'Glide', 'Stomp', 'DoubleJump', ('HC', 1)}), frozenset({'Climb', 'Glide', 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({('HC', 0), ('AC', 12), 'Stomp', 'ChargeJump', 'DoubleJump'})}, 'LeftSorrowAbilityCell': {frozenset({('AC', 12), 'ChargeJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', ('AC', 12), 'ChargeJump', ('HC', 1)})}, 'LeftSorrowKeystone3': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'LeftSorrowKeystone4': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'LeftSorrowEnergyCell': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 1)})}, 'LostGroveLongSwim': {frozenset({('HC', 3), ('AC', 12)}), frozenset({('HC', 9)})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'Stomp', ('HC', 1)})}, 'SorrowLowerLeftKeystone': {frozenset({('AC', 12), 'ChargeJump', ('HC', 7)})}, 'MistyFrogNookExp': {frozenset({'DoubleJump', ('HC', 1)})}, 'MistyPostClimbSpikeCave': {frozenset({'Bash', ('HC', 1)}), frozenset({'DoubleJump', ('HC', 8)})}, 'MistyMortarCorridorHiddenExp': {frozenset({('HC', 7)}), frozenset({('HC', 4), ('AC', 12)}), frozenset({'DoubleJump', ('HC', 1)})}, 'LeftGrottoTeleporterExp': {frozenset({'DoubleJump', ('HC', 1)})}, 'OutsideForlornWaterExp': {frozenset({('AC', 12), ('HC', -1)})}, 'HoruR1HangingExp': {frozenset({('AC', 12), 'ChargeJump', ('HC', 1)})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'DoubleJump', ('HC', 2)}), frozenset({'Water', ('HC', 2), 'Grenade', 'Stomp', 'DoubleJump'}), frozenset({'Grenade', 'Stomp', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 12), 'Water', ('HC', 2), 'Grenade', 'DoubleJump'})}, 'GroveSpiderWaterSwim': {frozenset({('HC', 2)}), frozenset({'Bash', ('AC', 12)}), frozenset({('AC', 12), ('HC', 1)})}, 'GladesGrenadePool': {frozenset({'Grenade', ('HC', 2)})}, 'GladesMainPool': {frozenset({('HC', 0)})}, 'InnerSwampDrainExp': {frozenset({('HC', 4), 'Dash', ('AC', 12), 'WallJump'}), frozenset({('HC', 4), 'Bash', ('AC', 12)}), frozenset({('HC', 4), ('AC', 12), 'Grenade', 'Glide', 'Stomp', 'WallJump'}), frozenset({'Climb', ('HC', 4), 'ChargeJump', ('AC', 12)}), frozenset({'ChargeFlame', ('HC', 4), ('AC', 12), 'Glide', 'Stomp', 'WallJump'}), frozenset({('HC', 4), ('AC', 12), 'DoubleJump'}), frozenset({'Climb', 'Dash', ('HC', 4), ('AC', 12)})}, 'TopGinsoLeftUpperExp': {frozenset({('HC', 0), 'Glide', 'DoubleJump'}), frozenset({('HC', 0), 'Dash', 'DoubleJump'})}, 'TopGinsoRightPlant': {frozenset({'ChargeFlame', 'DoubleJump', ('HC', 0)}), frozenset({'Grenade', 'DoubleJump', ('HC', 0)})}, 'UpperGinsoRightKeystone': {frozenset({('HC', 0), ('AC', 12), 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoUpperRightKeystone': {frozenset({('AC', 12), 'GinsoKey', 'DoubleJump', ('HC', 2)})}, 'UpperGinsoUpperLeftKeystone': {frozenset({('AC', 12), 'GinsoKey', 'DoubleJump', ('HC', 2)})}, 'UpperSorrowRightKeystone': {frozenset({('HC', 4), 'ChargeJump', 'DoubleJump', ('AC', 12)}), frozenset({('AC', 12), 'Grenade', 'Bash', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 12), 'Dash', 'ChargeJump', ('HC', 1)}), frozenset({('AC', 12), 'ChargeJump', ('HC', 7)})}, 'UpperSorrowFarRightKeystone': {frozenset({('HC', 4), 'Dash', 'ChargeJump', ('AC', 12)}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 7)}), frozenset({('HC', 4), ('AC', 12), 'Grenade', 'Bash', 'DoubleJump'})}, 'UpperSorrowLeftKeystone': {frozenset({('AC', 12), 'ChargeJump', ('HC', 1)})}, 'ValleyEntryGrenadeLongSwim': {frozenset({'Grenade', 'Bash', ('HC', 10)}), frozenset({'Grenade', ('HC', 11)}), frozenset({'Grenade', ('HC', 4), ('AC', 12)})}, 'ValleyRightFastStomplessCell': {frozenset({'Climb', ('HC', 4), ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump', ('HC', 2)})}, 'ValleyRightExp': {frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'WilhelmExp': {frozenset({('AC', 12), 'ChargeJump', ('HC', 1)})}}, 'standard-lure': {'DeathGauntletExp': {frozenset({'Bash'})}, 'DeathGauntletStompSwim': {frozenset({'Water'})}, 'GladesLaser': {frozenset({'Bash'})}, 'HoruFieldsHealthCell': {frozenset({'Free'})}, 'HollowGroveTreeAbilityCell': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}, 'HoruL2': {frozenset({'Stomp', 'DoubleJump', 'Bash'})}, 'LeftSorrowKeystone1': {frozenset({'Bash'})}, 'MistyEntranceStompExp': {frozenset({'Bash'})}, 'MistyAbilityCell': {frozenset({'Bash'})}, 'GrottoSwampDrainAccessPlant': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'Grenade'})}, 'SorrowMap': {frozenset({'MapStone'})}, 'FronkeyWalkRoof': {frozenset({'Bash'})}, 'ValleyRightFastStomplessCell': {frozenset({'Bash'})}, 'WilhelmExp': {frozenset({'Bash', 'WallJump'})}, 'KuroPerchExp': {frozenset({'HoruKey'})}}, 'casual-dboost': {'DoubleJumpSkillTree': {frozenset({'Bash', ('HC', 0)}), frozenset({'Climb', ('HC', 0)}), frozenset({'ChargeJump', ('HC', 0)})}, 'DoubleJumpAreaExp': {frozenset({'Grenade', 'Bash', ('HC', 0)}), frozenset({'ChargeJump', ('HC', 0), 'Water'}), frozenset({('HC', -1), 'ChargeJump', 'WallJump'}), frozenset({'Bash', ('HC', 0), 'Water'}), frozenset({'Bash', 'WallJump', ('HC', -1)})}, 'GrenadeAreaExp': {frozenset({'ChargeJump'})}, 'GumoHideoutCrusherKeystone': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'GumoHideoutRedirectAbilityCell': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'WallJump'})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'ChargeJump', 'Water'})}, 'SpiderSacHealthCell': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'InnerSwampSwimRightKeystone': {frozenset({'Climb'}), frozenset({'WallJump'})}, 'SpiritCavernsTopLeftKeystone': {frozenset({'ChargeJump'}), frozenset({'Bash'})}}, 'standard-dboost': {'DoubleJumpSkillTree': {frozenset({'Dash', ('HC', 0)})}, 'DoubleJumpAreaExp': {frozenset({'Dash', 'ChargeJump', ('HC', 0)}), frozenset({('HC', 0), 'Bash', 'Dash'}), frozenset({'ChargeJump', ('HC', 0), ('AC', 3), ('EC', 1)}), frozenset({'Bash', ('HC', 0), ('AC', 3), ('EC', 1)}), frozenset({'Bash', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)})}, 'ForlornKeystone3': {frozenset({'ForlornKey', 'ChargeJump', ('HC', 1)})}, 'LowerGinsoKeystone1': {frozenset({('HC', 0)})}, 'LowerGinsoKeystone2': {frozenset({'ChargeJump', ('HC', 0)})}, 'GumoHideoutMapstone': {frozenset({'ChargeJump', ('HC', 1)})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'Dash', 'ChargeJump', ('HC', 1)})}, 'MistyAbilityCell': {frozenset({'DoubleJump', 'WallJump', ('HC', 1)})}, 'GrottoEnergyDoorHealthCell': {frozenset({('EC', 2), 'WallJump'})}, 'BelowGrottoTeleporterHealthCell': {frozenset({('HC', 0), 'Bash', 'DoubleJump'}), frozenset({'Bash', ('HC', 0), 'WallJump'}), frozenset({'ChargeJump', ('HC', 0)})}, 'BelowGrottoTeleporterPlant': {frozenset({'ChargeFlame', ('HC', 1)}), frozenset({'Grenade', ('HC', 1)})}, 'GrottoSwampDrainAccessPlant': {frozenset({'ChargeFlame', 'Glide', ('HC', 1)}), frozenset({'ChargeFlame', 'DoubleJump', ('HC', 1)}), frozenset({'ChargeFlame', 'ChargeJump', ('HC', 1)}), frozenset({'ChargeFlame', 'WallJump', ('HC', 1)})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Bash', ('HC', 0), 'Water'})}, 'InnerSwampDrainExp': {frozenset({'Grenade', 'Bash', ('HC', 1), 'Water'})}, 'TopGinsoLeftLowerExp': {frozenset({('HC', 0), 'DoubleJump'}), frozenset({'ChargeJump', ('HC', 0)})}, 'TopGinsoLeftUpperExp': {frozenset({('HC', 0), 'Dash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Dash', 'DoubleJump', ('HC', 0)}), frozenset({'Climb', 'Glide', 'DoubleJump', ('HC', 0)}), frozenset({('HC', 0), 'Glide', 'DoubleJump', 'WallJump'})}, 'TopGinsoRightPlant': {frozenset({'Grenade', 'DoubleJump', 'WallJump', ('HC', 0)}), frozenset({'Climb', 'Grenade', 'DoubleJump', ('HC', 0)})}, 'UpperGinsoLowerKeystone': {frozenset({'Bash', 'GinsoKey', ('HC', 0)}), frozenset({'GinsoKey', ('HC', 0), 'ChargeJump'}), frozenset({('HC', 0), 'GinsoKey', 'DoubleJump'})}, 'UpperGinsoRightKeystone': {frozenset({'GinsoKey', ('HC', 0), 'ChargeJump'})}, 'UpperGinsoUpperRightKeystone': {frozenset({'GinsoKey', ('HC', 0), 'ChargeJump'})}, 'UpperGinsoUpperLeftKeystone': {frozenset({'GinsoKey', ('HC', 0), 'ChargeJump'})}}, 'standard-core': {'DoubleJumpAreaExp': {frozenset({'ChargeJump', 'WallJump'})}, 'ForlornKeystone2': {frozenset({'ForlornKey', 'Dash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'ForlornKey', 'Dash', 'WallJump'}), frozenset({'Climb', 'ForlornKey', 'Dash', 'DoubleJump'}), frozenset({'Glide', 'ForlornKey', 'Climb', 'Dash'})}, 'ForlornEntranceExp': {frozenset({'ForlornKey', 'Dash', 'WallJump', 'Open'}), frozenset({'Climb', 'ForlornKey', 'Dash', 'Open'})}, 'LowerGinsoKeystone1': {frozenset({'Grenade', 'Bash'})}, 'LowerGinsoKeystone2': {frozenset({'Grenade', 'Bash'})}, 'GladesLaserGrenade': {frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Grenade', 'Climb', 'Bash'}), frozenset({'Climb', 'Grenade', 'Glide', 'ChargeJump', 'DoubleJump'})}, 'GrenadeSkillTree': {frozenset({'Grenade', 'Bash'})}, 'GrenadeAreaExp': {frozenset({'Dash', 'DoubleJump'})}, 'GrenadeAreaAbilityCell': {frozenset({'Grenade', 'Bash'})}, 'GumoHideoutMapstone': {frozenset({'Climb'}), frozenset({'Grenade', 'Bash'})}, 'GumoHideoutRedirectAbilityCell': {frozenset({'Grenade', 'Bash'})}, 'SwampTeleporterAbilityCell': {frozenset({'Grenade', 'Bash', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Glide'})}, 'HoruFieldsHiddenExp': {frozenset({'Bash'})}, 'HoruLavaDrainedLeftExp': {frozenset({'Open', 'Dash', 'DoubleJump'})}, 'HoruL4LowerExp': {frozenset({'Climb', 'Stomp'})}, 'HoruR1EnergyCell': {frozenset({'Grenade', 'Bash'})}, 'HoruR3Plant': {frozenset({'ChargeFlame'})}, 'HoruR4DrainedExp': {frozenset({'Grenade', 'Bash', 'Climb'})}, 'HoruL1': {frozenset({'Glide', 'ChargeJump', 'Stomp', 'Bash'})}, 'HoruL3': {frozenset({'ChargeFlame', 'Bash', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Stomp'}), frozenset({'Glide', 'Bash', 'ChargeFlame', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'}), frozenset({'Glide', 'Bash', 'Climb', 'ChargeFlame'}), frozenset({'Grenade', 'Bash', 'ChargeFlame'})}, 'FarLeftGumoHideoutExp': {frozenset({'Climb', 'Bash', 'Grenade'})}, 'LeftSorrowKeystone1': {frozenset({'Dash'})}, 'LowerBlackrootLaserAbilityCell': {frozenset({'Dash', 'DoubleJump'})}, 'LowerBlackrootGrenadeThrow': {frozenset({'ChargeJump', 'DoubleJump'})}, 'GumoHideoutRightHangingExp': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'})}, 'SorrowSpikeKeystone': {frozenset({'Climb', 'Dash', 'DoubleJump'}), frozenset({'Dash', 'DoubleJump', 'WallJump'})}, 'SorrowHiddenKeystone': {frozenset({'Climb', 'Bash', 'Dash', 'DoubleJump'}), frozenset({'Bash', 'Dash', 'DoubleJump', 'WallJump'})}, 'SorrowHealthCell': {frozenset({'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'})}, 'SpiritCavernsAbilityCell': {frozenset({'DoubleJump', 'WallJump'})}, 'MistyFrogNookExp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Bash'})}, 'MistyPostClimbSpikeCave': {frozenset({'Glide', 'Bash'})}, 'MistyMortarCorridorUpperExp': {frozenset({'Grenade', 'Bash'})}, 'OuterSwampHealthCell': {frozenset({'Climb', 'DoubleJump'})}, 'HoruR1HangingExp': {frozenset({'Grenade', 'Bash'})}, 'HoruR2': {frozenset({'Glide', 'Stomp', 'Climb', 'Bash'}), frozenset({'Glide', 'Stomp', 'ChargeJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'WallJump', 'Bash'})}, 'StompAreaExp': {frozenset({'Climb', 'ChargeJump'})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Bash', 'DoubleJump', 'Water'})}, 'GroveAboveSpiderWaterExp': {frozenset({'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'})}, 'GroveAboveSpiderWaterHealthCell': {frozenset({'Bash', 'ChargeJump'})}, 'GroveAboveSpiderWaterEnergyCell': {frozenset({'Dash', 'Grenade', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Grenade', 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'AboveChargeFlameTreeExp': {frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb'})}, 'GladesGrenadeTree': {frozenset({'Grenade', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Glide', 'Climb', 'Wind'}), frozenset({'Grenade', 'Glide', 'WallJump', 'Wind'})}, 'InnerSwampSwimRightKeystone': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'})}, 'TopGinsoLeftLowerExp': {frozenset({'Bash'})}, 'UpperGinsoRedirectLowerExp': {frozenset({'Climb', 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoRightKeystone': {frozenset({'Bash', 'GinsoKey'}), frozenset({'Glide', 'GinsoKey', 'ChargeJump'}), frozenset({'GinsoKey', 'DoubleJump', 'ChargeJump'})}, 'UpperGinsoUpperRightKeystone': {frozenset({'Bash', 'GinsoKey'}), frozenset({'GinsoKey', 'DoubleJump', 'ChargeJump'})}, 'UpperGinsoUpperLeftKeystone': {frozenset({'Bash', 'GinsoKey'}), frozenset({'Glide', 'GinsoKey', 'ChargeJump'}), frozenset({'GinsoKey', 'DoubleJump', 'ChargeJump'})}, 'UpperGinsoEnergyCell': {frozenset({'Climb', 'GinsoKey', 'ChargeJump'})}, 'GrottoLasersRoofExp': {frozenset({'Climb', 'DoubleJump'})}, 'SpiritCavernsTopLeftKeystone': {frozenset({'ChargeJump'}), frozenset({'Bash'})}, 'ValleyRightBirdStompCell': {frozenset({'Stomp', 'DoubleJump'}), frozenset({'Climb', 'Stomp'}), frozenset({'Stomp', 'WallJump'})}, 'ValleyThreeBirdAbilityCell': {frozenset({'Dash', 'DoubleJump'})}, 'KuroPerchExp': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-lure': {'ForlornKeystone1': {frozenset({'ForlornKey', 'Bash'})}, 'GumoHideoutMiniboss': {frozenset({'Bash'})}, 'GroveWaterStompAbilityCell': {frozenset({'Bash', 'Water'})}, 'SorrowHealthCell': {frozenset({'Grenade', 'Glide', 'Stomp', 'Bash'}), frozenset({('AC', 6), 'Dash', ('EC', 2), 'Glide', 'Stomp'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump'}), frozenset({'Glide', 'Stomp', 'ChargeJump'})}}, 'gjump': {'GladesLaserGrenade': {frozenset({'Grenade', 'Climb', 'ChargeJump'})}, 'SwampTeleporterAbilityCell': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'HoruFieldsEnergyCell': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'HoruR4LaserExp': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'HoruL3': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'SorrowSpikeKeystone': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'SorrowHiddenKeystone': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'SorrowLowerLeftKeystone': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'KuroPerchExp': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'MistyMortarCorridorUpperExp': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'StompAreaGrenadeExp': {frozenset({'Grenade', 'Climb', 'ChargeJump', 'Water'})}, 'SorrowMapstone': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'GroveAboveSpiderWaterExp': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'GroveAboveSpiderWaterHealthCell': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'UpperSorrowLeftKeystone': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'ValleyThreeBirdAbilityCell': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'insane': {'GrenadeSkillTree': {frozenset({'WallJump'})}, 'ValleyRightBirdStompCell': {frozenset({'Bash'})}}, 'timed-level': {'LowerBlackrootGrenadeThrow': {frozenset({'Free'})}, 'SpiderSacEnergyDoor': {frozenset({('EC', 2)})}}} -connection_rules = {'AboveChargeJumpArea': {'casual-core': {'SorrowTeleporter': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'Grenade'})}}, 'expert-dboost': {'SorrowTeleporter': {frozenset({'Dash', 'ChargeJump', 'WallJump', ('HC', 2)})}, 'ChargeJumpArea': {frozenset({('HC', 3), 'Bash', 'ChargeJump'}), frozenset({('HC', 3), 'Dash', 'ChargeJump', ('AC', 6)})}}, 'master-core': {'SorrowTeleporter': {frozenset({'Bash'})}, 'ChargeJumpArea': {frozenset({'Bash'})}}, 'standard-lure': {'ChargeJumpArea': {frozenset({'Climb', 'Bash', 'Stomp'}), frozenset({'Bash', 'Stomp', 'WallJump'})}}, 'expert-core': {'ChargeJumpArea': {frozenset({'Climb', 'Bash', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'ChargeJump', 'WallJump'})}}, 'expert-abilities': {'ChargeJumpArea': {frozenset({('AC', 6), 'Dash', 'Stomp', 'WallJump'}), frozenset({'Climb', 'Dash', 'ChargeJump', ('AC', 6)}), frozenset({'Bash', 'ChargeJump', 'Dash', ('AC', 3)}), frozenset({'Climb', 'Dash', 'Stomp', ('AC', 6)})}}, 'gjump': {'ChargeJumpArea': {frozenset({'Climb', 'Dash', 'ChargeJump', 'Grenade'}), frozenset({'Climb', ('HC', 3), 'ChargeJump', 'Grenade'})}}, 'dbash': {'ChargeJumpArea': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}}, 'BashTree': {'casual-core': {'BashTreeDoorClosed': {frozenset({'Open'})}, 'UpperGinsoRedirectArea': {frozenset({'Glide', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash'}), frozenset({'Dash', 'ChargeJump', 'DoubleJump'})}}, 'standard-dboost': {'UpperGinsoRedirectArea': {frozenset({'ChargeJump', ('HC', 1)})}}, 'expert-dboost': {'UpperGinsoRedirectArea': {frozenset({'ChargeJump', ('HC', 0)})}}, 'expert-abilities': {'UpperGinsoRedirectArea': {frozenset({('AC', 6), 'Dash', 'ChargeJump'})}}, 'master-core': {'UpperGinsoRedirectArea': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Dash', 'DoubleJump'})}}, 'master-abilities': {'UpperGinsoRedirectArea': {frozenset({('AC', 12), 'DoubleJump'})}}}, 'BashTreeDoorClosed': {'casual-core': {'BashTreeDoorOpened': {frozenset({('KS', 4)})}}}, 'BashTreeDoorOpened': {'casual-core': {'GinsoMiniBossDoor': {frozenset({'Open', 'GinsoKey'})}, 'BashTree': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}}, 'master-core': {'BashTree': {frozenset({'DoubleJump'})}}}, 'BelowSunstoneArea': {'casual-core': {'SunstoneArea': {frozenset({'Glide', 'Stomp'})}, 'UpperSorrow': {frozenset({'Stomp'})}}, 'standard-core': {'SunstoneArea': {frozenset({'Climb', 'Glide', 'ChargeJump'})}, 'UpperSorrow': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'SunstoneArea': {frozenset({'Glide', 'Dash', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'ChargeJump', 'Glide'})}, 'UpperSorrow': {frozenset({'Grenade', 'Bash', 'ChargeJump'})}}, 'gjump': {'SunstoneArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-core': {'SunstoneArea': {frozenset({'Bash'})}, 'UpperSorrow': {frozenset({'Bash'})}}, 'master-dboost': {'SunstoneArea': {frozenset({('AC', 12), 'Climb', 'ChargeJump', 'DoubleJump', ('HC', 1)})}}, 'expert-abilities': {'UpperSorrow': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}}, 'BlackrootDarknessRoom': {'casual-core': {'DashArea': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}}, 'expert-core': {'DashArea': {frozenset({'DoubleJump'})}}, 'master-core': {'DashArea': {frozenset({'Bash'})}}}, 'BlackrootGrottoConnection': {'casual-core': {'SideFallCell': {frozenset({'Climb', 'Stomp', 'DoubleJump'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}}, 'standard-abilities': {'SideFallCell': {frozenset({'Climb', 'Stomp', 'Dash', ('AC', 3)})}}, 'expert-core': {'SideFallCell': {frozenset({'Climb', 'Stomp'})}}}, 'ChargeFlameAreaStump': {'casual-core': {'ChargeFlameSkillTreeChamber': {frozenset({'ChargeFlame'}), frozenset({'Grenade'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'})}}, 'standard-core': {'ChargeFlameSkillTreeChamber': {frozenset({'Stomp'})}}, 'expert-abilities': {'ChargeFlameSkillTreeChamber': {frozenset({'Dash', ('AC', 6)})}}, 'master-core': {'ChargeFlameSkillTreeChamber': {frozenset({'DoubleJump'})}}}, 'ChargeFlameSkillTreeChamber': {'casual-core': {'SpiritTreeRefined': {frozenset({'ChargeJump'})}, 'ChargeFlameAreaStump': {frozenset({'ChargeJump'}), frozenset({'ChargeFlame'}), frozenset({'Grenade'})}}, 'expert-abilities': {'ChargeFlameAreaStump': {frozenset({'Dash', ('AC', 6)})}}}, 'ChargeJumpArea': {'casual-core': {'AboveChargeJumpArea': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'})}, 'ChargeJumpDoor': {frozenset({'Open'})}}, 'gjump': {'AboveChargeJumpArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'expert-dboost': {'AboveChargeJumpArea': {frozenset({'Bash', 'ChargeJump', 'WallJump', ('HC', 2)}), frozenset({'Dash', 'ChargeJump', ('HC', 2)})}}, 'expert-abilities': {'AboveChargeJumpArea': {frozenset({'Climb', 'Dash', 'ChargeJump', ('AC', 6)})}}, 'master-core': {'AboveChargeJumpArea': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}}, 'ChargeJumpDoor': {'casual-core': {'ChargeJumpDoorOpen': {frozenset({('KS', 4)})}}}, 'ChargeJumpDoorOpen': {'casual-core': {'ChargeJumpArea': {frozenset({'Glide'})}}, 'master-dboost': {'ChargeJumpArea': {frozenset({('AC', 12), 'Dash', 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 12), 'Dash', ('HC', 1), 'Grenade', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({('HC', 4), ('AC', 12), 'Grenade', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 7)}), frozenset({('HC', 10), ('AC', 12), 'Grenade', 'Bash', 'DoubleJump', 'WallJump'})}, 'ChargeJumpDoorOpenLeft': {frozenset({'ChargeJump', ('HC', 2)})}}, 'expert-dboost': {'ChargeJumpDoorOpenLeft': {frozenset({('HC', 3), 'ChargeJump'})}}, 'master-lure': {'ChargeJumpDoorOpenLeft': {frozenset({'Bash'})}}}, 'ChargeJumpDoorOpenLeft': {'casual-core': {'UpperSorrow': {frozenset({'Glide'})}}, 'master-dboost': {'UpperSorrow': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump', ('HC', 7)}), frozenset({('AC', 6), ('HC', 6), 'Dash', ('EC', 2), 'ChargeJump'}), frozenset({('HC', 4), ('AC', 12), 'Dash', ('EC', 2), 'ChargeJump'})}}, 'master-lure': {'UpperSorrow': {frozenset({'Bash'})}}}, 'DashArea': {'casual-core': {'DashPlantAccess': {frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'WallJump'})}, 'GrenadeAreaAccess': {frozenset({'Stomp', 'Dash'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump'})}, 'RazielNoArea': {frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'}), frozenset({'Climb', 'Dash', 'DoubleJump'})}}, 'standard-abilities': {'DashPlantAccess': {frozenset({'Climb', 'Dash', 'DoubleJump', ('AC', 3)}), frozenset({'Dash', ('AC', 3), 'DoubleJump', 'WallJump'})}, 'RazielNoArea': {frozenset({'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Climb', 'Dash', ('AC', 3)}), frozenset({'WallJump'})}}, 'expert-core': {'DashPlantAccess': {frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'Glide'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'DoubleJump'})}, 'GrenadeAreaAccess': {frozenset({'Stomp'})}}, 'expert-abilities': {'DashPlantAccess': {frozenset({'Climb', 'Dash', ('AC', 6), ('EC', 2)}), frozenset({'Grenade', 'Dash', ('AC', 3)}), frozenset({'ChargeFlame', 'Dash', ('AC', 6), 'WallJump'}), frozenset({('EC', 2), 'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6), 'ChargeFlame'})}, 'RazielNoArea': {frozenset({'Climb'})}}, 'master-core': {'DashPlantAccess': {frozenset({'Glide', 'DoubleJump'}), frozenset({'Bash'}), frozenset({'Dash', 'DoubleJump'})}, 'GrenadeAreaAccess': {frozenset({'Bash'})}}, 'master-abilities': {'DashPlantAccess': {frozenset({'Climb', 'ChargeFlame', ('AC', 3)}), frozenset({'ChargeFlame', ('AC', 3), 'WallJump'}), frozenset({('AC', 12), 'DoubleJump'}), frozenset({'ChargeFlame', 'DoubleJump', ('AC', 3)})}, 'RazielNoArea': {frozenset({'DoubleJump'})}}, 'standard-core': {'GrenadeAreaAccess': {frozenset({'Climb', 'ChargeJump'})}, 'RazielNoArea': {frozenset({'Grenade', 'Bash'})}}, 'glitched': {'GrenadeAreaAccess': {frozenset({'Free'})}}, 'insane': {'GrenadeAreaAccess': {frozenset({'Free'})}}}, 'DeathGauntlet': {'casual-core': {'DeathGauntletMoat': {frozenset({'Water'})}, 'DeathGauntletDoor': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'DeathGauntletRoof': {frozenset({'ChargeJump'})}, 'MoonGrotto': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}}, 'expert-dboost': {'DeathGauntletMoat': {frozenset({('HC', 1)})}}, 'master-dboost': {'DeathGauntletMoat': {frozenset({('HC', 0)})}}, 'expert-core': {'DeathGauntletRoofPlantAccess': {frozenset({'ChargeFlame', 'Climb', 'DoubleJump'}), frozenset({'ChargeFlame', 'Bash', 'WallJump'}), frozenset({'ChargeFlame', 'Bash', 'Grenade'}), frozenset({'ChargeFlame', 'DoubleJump', 'WallJump'}), frozenset({'ChargeFlame', 'Bash', 'Climb'})}}, 'master-core': {'DeathGauntletRoofPlantAccess': {frozenset({'ChargeFlame', 'DoubleJump'})}}, 'master-abilities': {'DeathGauntletRoofPlantAccess': {frozenset({'ChargeFlame', ('AC', 3)})}}, 'master-lure': {'MoonGrotto': {frozenset({'Dash', ('AC', 6), ('EC', 1)}), frozenset({'Bash'})}, 'MoonGrottoAboveTeleporter': {frozenset({'Bash'})}}}, 'DeathGauntletDoor': {'casual-core': {'DeathGauntletDoorOpened': {frozenset({('EC', 4)})}}, 'glitched': {'DeathGauntletDoorOpened': {frozenset({('EC', 3)})}}, 'timed-level': {'DeathGauntletDoorOpened': {frozenset({('EC', 2)})}}}, 'DeathGauntletDoorOpened': {'casual-core': {'DeathGauntlet': {frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'WallJump', 'Water'}), frozenset({'Climb', 'Water'}), frozenset({'Bash', 'Water'}), frozenset({'Glide', 'DoubleJump', 'WallJump'})}, 'DeathGauntletMoat': {frozenset({'Water'})}}, 'standard-dboost': {'DeathGauntlet': {frozenset({'Climb', ('HC', 1)}), frozenset({'WallJump', ('HC', 1)}), frozenset({'Bash', ('HC', 1)})}}, 'expert-dboost': {'DeathGauntlet': {frozenset({'Climb', ('HC', 0)}), frozenset({'Bash', ('HC', 0)}), frozenset({('HC', 0), 'WallJump'})}, 'DeathGauntletMoat': {frozenset({('HC', 2)})}}, 'expert-abilities': {'DeathGauntlet': {frozenset({'Dash', ('AC', 6), ('EC', 1)})}}, 'master-core': {'DeathGauntlet': {frozenset({'DoubleJump'})}}, 'master-dboost': {'DeathGauntletMoat': {frozenset({('HC', 1)})}}}, 'DeathGauntletRoof': {'casual-core': {'DeathGauntlet': {frozenset({'Stomp'})}}, 'standard-lure': {'DeathGauntlet': {frozenset({'Free'})}}}, 'DoubleJumpKeyDoor': {'casual-core': {'DoubleJumpKeyDoorOpened': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}}, 'expert-core': {'DoubleJumpKeyDoorOpened': {frozenset({'DoubleJump'})}}}, 'ForlornGravityRoom': {'casual-core': {'ForlornMapArea': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'ForlornInnerDoor': {frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Bash'}), frozenset({'Glide', 'DoubleJump', 'WallJump'})}}, 'master-core': {'ForlornMapArea': {frozenset({'DoubleJump'})}}, 'master-lure': {'ForlornMapArea': {frozenset({'Bash'})}}, 'standard-dboost': {'ForlornInnerDoor': {frozenset({('HC', 1)})}}, 'standard-core': {'ForlornInnerDoor': {frozenset({'Dash', 'DoubleJump'})}}, 'standard-abilities': {'ForlornInnerDoor': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'expert-core': {'ForlornInnerDoor': {frozenset({'ChargeJump'})}}, 'master-dboost': {'ForlornInnerDoor': {frozenset({('AC', 12), ('HC', 0)})}}}, 'ForlornInnerDoor': {'casual-core': {'ForlornOuterDoor': {frozenset({'ForlornKey'})}, 'ForlornOrbPossession': {frozenset({'Climb', 'Glide', 'Open'}), frozenset({'Open', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'Open'}), frozenset({'Glide', 'WallJump', 'Open'}), frozenset({'Open', 'DoubleJump'})}, 'ForlornGravityRoom': {frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Glide', 'DoubleJump', 'WallJump'})}}, 'standard-core': {'ForlornOrbPossession': {frozenset({'Dash', 'WallJump', 'Open'}), frozenset({'Climb', 'Dash', 'Open'})}, 'ForlornGravityRoom': {frozenset({'Climb', 'Dash', 'DoubleJump'}), frozenset({'Dash', 'DoubleJump', 'WallJump'})}}, 'expert-core': {'ForlornOrbPossession': {frozenset({'Open'})}, 'ForlornGravityRoom': {frozenset({'ChargeJump'})}}, 'standard-dboost': {'ForlornGravityRoom': {frozenset({'DoubleJump', 'WallJump', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)}), frozenset({'Climb', 'DoubleJump', ('HC', 1)})}}, 'standard-abilities': {'ForlornGravityRoom': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'expert-dboost': {'ForlornGravityRoom': {frozenset({'WallJump', ('HC', 1)})}}, 'master-dboost': {'ForlornGravityRoom': {frozenset({('AC', 12), ('HC', 0), 'WallJump'})}}}, 'ForlornKeyDoor': {'casual-core': {'ForlornLaserRoom': {frozenset({'ForlornKey', ('KS', 4)})}}}, 'ForlornLaserRoom': {'casual-core': {'ForlornStompDoor': {frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Glide', 'Stomp', 'ChargeJump'})}}, 'standard-abilities': {'ForlornStompDoor': {frozenset({'Dash', 'Glide', ('AC', 3), 'Stomp', 'DoubleJump', ('HC', 1)}), frozenset({'Dash', ('HC', 1), 'Stomp', 'ChargeJump', ('AC', 3)}), frozenset({'Dash', 'Stomp', 'ChargeJump', 'DoubleJump', ('AC', 3)})}}, 'standard-dboost': {'ForlornStompDoor': {frozenset({'Stomp', 'ChargeJump', 'DoubleJump', ('HC', 1)})}}, 'expert-abilities': {'ForlornStompDoor': {frozenset({'Stomp', ('AC', 6), 'Dash', 'DoubleJump'}), frozenset({'Climb', 'Stomp', ('AC', 6), 'Dash'}), frozenset({('AC', 6), 'Stomp', 'ChargeJump', 'Dash'}), frozenset({'Stomp', ('AC', 6), 'Dash', 'WallJump'})}}, 'master-abilities': {'ForlornStompDoor': {frozenset({'Glide', 'Stomp', ('AC', 12), 'DoubleJump'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', ('AC', 12)})}}, 'master-lure': {'ForlornStompDoor': {frozenset({'Stomp', 'Bash'})}}, 'gjump': {'ForlornStompDoor': {frozenset({'Climb', 'Stomp', 'ChargeJump', 'Grenade'})}}}, 'ForlornMapArea': {'casual-core': {'ForlornTeleporter': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'})}, 'ForlornPlantAccess': {frozenset({'Grenade', 'ForlornKey', 'WallJump', 'Bash'}), frozenset({'ForlornKey', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'ForlornKey', 'ChargeJump'}), frozenset({'Grenade', 'ForlornKey', 'Climb', 'Bash'})}}, 'standard-abilities': {'ForlornTeleporter': {frozenset({'Glide', 'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', 'Glide', ('AC', 3)}), frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'standard-dboost': {'ForlornTeleporter': {frozenset({'ChargeJump', ('HC', 1)})}}, 'master-core': {'ForlornTeleporter': {frozenset({'DoubleJump'})}, 'ForlornPlantAccess': {frozenset({'Grenade', 'ForlornKey', 'DoubleJump', 'Bash'}), frozenset({'ForlornKey', 'ChargeJump', 'DoubleJump'})}}, 'master-lure': {'ForlornTeleporter': {frozenset({'Bash'})}}, 'master-dboost': {'ForlornTeleporter': {frozenset({('AC', 12), 'ChargeJump', ('HC', 0)})}}}, 'ForlornOrbPossession': {'casual-core': {'ForlornPlantAccess': {frozenset({'ForlornKey'})}, 'ForlornInnerDoor': {frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Bash'}), frozenset({'Glide', 'DoubleJump', 'WallJump'})}}, 'standard-dboost': {'ForlornInnerDoor': {frozenset({('HC', 1)})}}, 'standard-core': {'ForlornInnerDoor': {frozenset({'Dash', 'DoubleJump'})}}, 'standard-abilities': {'ForlornInnerDoor': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'expert-core': {'ForlornInnerDoor': {frozenset({'ChargeJump'})}}, 'master-dboost': {'ForlornInnerDoor': {frozenset({('AC', 12), ('HC', 0)})}}}, 'ForlornStompDoor': {'casual-core': {'RightForlorn': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}, 'standard-abilities': {'RightForlorn': {frozenset({'Dash', 'ChargeJump', ('AC', 3)}), frozenset({'Climb', 'Dash', 'DoubleJump', ('AC', 3)}), frozenset({'Dash', ('AC', 3), 'DoubleJump', 'WallJump'})}}, 'standard-dboost': {'RightForlorn': {frozenset({'DoubleJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'DoubleJump', ('HC', 1)})}}, 'expert-dboost': {'RightForlorn': {frozenset({'Climb', ('HC', 1)}), frozenset({'WallJump', ('HC', 1)})}}, 'master-dboost': {'RightForlorn': {frozenset({'Climb', ('AC', 12), ('HC', 0)}), frozenset({('AC', 12), ('HC', 0), 'WallJump'})}}, 'master-lure': {'RightForlorn': {frozenset({'Bash'})}}, 'master-abilities': {'RightForlorn': {frozenset({('AC', 12), 'DoubleJump'})}}}, 'ForlornTeleporter': {'casual-core': {'ForlornOrbPossession': {frozenset({'ForlornKey', 'Open'})}, 'ForlornMapArea': {frozenset({'Grenade', 'Bash'}), frozenset({'Glide'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}}}, 'GinsoEscape': {'casual-core': {'GinsoEscapeComplete': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'})}}, 'standard-core': {'GinsoEscapeComplete': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}, 'expert-core': {'GinsoEscapeComplete': {frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}}, 'expert-dboost': {'GinsoEscapeComplete': {frozenset({'Climb', 'ChargeJump', ('HC', 0)}), frozenset({('AC', 6), ('HC', 0), 'Dash', 'ChargeJump', 'DoubleJump'}), frozenset({'ChargeJump', ('HC', 6), 'WallJump'})}}, 'dbash': {'GinsoEscapeComplete': {frozenset({'Bash'})}}, 'master-dboost': {'GinsoEscapeComplete': {frozenset({('HC', 3), ('AC', 12), 'DoubleJump', 'WallJump'}), frozenset({'Climb', ('AC', 12), 'DoubleJump', ('HC', 7)}), frozenset({('HC', 4), 'ChargeJump', 'DoubleJump'})}}, 'insane': {'GinsoEscapeComplete': {frozenset({('HC', 9), ('AC', 12), 'DoubleJump'})}}}, 'GinsoInnerDoor': {'casual-core': {'LowerGinsoTree': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}}, 'master-core': {'LowerGinsoTree': {frozenset({'DoubleJump'})}}, 'master-abilities': {'LowerGinsoTree': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)})}}}, 'GinsoMiniBossDoor': {'casual-core': {'BashTreeDoorClosed': {frozenset({'Free'})}}}, 'GinsoTeleporter': {'casual-core': {'TopGinsoTree': {frozenset({'Bash', 'GinsoKey', 'DoubleJump', 'WallJump'}), frozenset({'GinsoKey', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'GinsoKey', 'DoubleJump'}), frozenset({'Climb', 'GinsoKey', 'ChargeJump'})}, 'UpperGinsoDoorClosed': {frozenset({'Open'})}}, 'standard-core': {'TopGinsoTree': {frozenset({'Grenade', 'GinsoKey', 'DoubleJump', 'WallJump'}), frozenset({'ChargeFlame', 'GinsoKey', 'DoubleJump', 'WallJump'})}}, 'expert-core': {'TopGinsoTree': {frozenset({'Stomp', 'GinsoKey', 'DoubleJump', 'WallJump'}), frozenset({'GinsoKey', 'ChargeJump'})}}, 'master-abilities': {'TopGinsoTree': {frozenset({'ChargeFlame', ('AC', 12), 'GinsoKey', 'DoubleJump'}), frozenset({'Grenade', ('AC', 12), 'GinsoKey', 'DoubleJump'}), frozenset({'Stomp', 'GinsoKey', 'DoubleJump', ('AC', 12)})}}}, 'GladesLaserArea': {'casual-core': {'MidSpiritCaverns': {frozenset({('EC', 4), 'DoubleJump'}), frozenset({('EC', 4), 'WallJump'}), frozenset({'Grenade', 'Bash', ('EC', 4)}), frozenset({'Climb', ('EC', 4)}), frozenset({'ChargeJump', ('EC', 4)})}}, 'expert-core': {'MidSpiritCaverns': {frozenset({'Dash', ('EC', 4)})}}, 'dbash': {'MidSpiritCaverns': {frozenset({'Bash', ('EC', 4)})}}, 'timed-level': {'MidSpiritCaverns': {frozenset({'Climb', ('EC', 2)}), frozenset({('EC', 2), 'WallJump'}), frozenset({('EC', 2), 'DoubleJump'}), frozenset({('EC', 2), 'Dash'}), frozenset({('EC', 2), 'ChargeJump'}), frozenset({('EC', 2), 'Bash'})}}}, 'GladesMain': {'casual-core': {'GladesMainAttic': {frozenset({'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'GladesLaserArea': {frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Glide', 'Bash', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}, 'LowerChargeFlameArea': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}}, 'standard-core': {'GladesMainAttic': {frozenset({'DoubleJump', 'WallJump'})}}, 'expert-core': {'GladesMainAttic': {frozenset({'Climb', 'DoubleJump'}), frozenset({'Bash'})}, 'GladesLaserArea': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}, 'expert-abilities': {'GladesMainAttic': {frozenset({'Dash', ('AC', 6)})}, 'GladesLaserArea': {frozenset({'Dash', ('AC', 6)})}, 'LowerChargeFlameArea': {frozenset({'Dash', ('AC', 6)})}}, 'dbash': {'GladesMainAttic': {frozenset({'Bash'})}, 'GladesLaserArea': {frozenset({'Bash'})}}, 'master-core': {'GladesMainAttic': {frozenset({'DoubleJump'})}}}, 'GladesMainAttic': {'glitched': {'LowerChargeFlameArea': {frozenset({'Dash'})}}}, 'GrenadeAreaAccess': {'casual-core': {'GrenadeArea': {frozenset({'Dash'})}, 'LowerBlackroot': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'})}}, 'expert-core': {'GrenadeArea': {frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'})}}, 'gjump': {'GrenadeArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'glitched': {'GrenadeArea': {frozenset({'Free'})}}, 'insane': {'GrenadeArea': {frozenset({'Free'})}}, 'casual-dboost': {'LowerBlackroot': {frozenset({'Free'})}}, 'standard-core': {'LowerBlackroot': {frozenset({'Grenade', 'Bash'})}}, 'expert-abilities': {'LowerBlackroot': {frozenset({'Dash', ('AC', 3)})}}, 'dbash': {'LowerBlackroot': {frozenset({'Bash'})}}}, 'GumoHideout': {'casual-core': {'DoubleJumpKeyDoor': {frozenset({('KS', 2)})}, 'LeftGumoHideout': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'ChargeJump'})}, 'SideFallCell': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'Grenade'}), frozenset({'ChargeJump', 'WallJump'})}}, 'expert-core': {'LeftGumoHideout': {frozenset({'ChargeJump'})}}, 'master-core': {'LeftGumoHideout': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}, 'LowerLeftGumoHideout': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'}), frozenset({'DoubleJump'})}}, 'master-abilities': {'LeftGumoHideout': {frozenset({('AC', 12), 'DoubleJump'})}}, 'dbash': {'SideFallCell': {frozenset({'Bash'})}}}, 'GumoHideoutRedirectArea': {'casual-core': {'GumoHideoutRedirectEnergyVault': {frozenset({('EC', 4)})}}, 'glitched': {'GumoHideoutRedirectEnergyVault': {frozenset({'Free'})}}}, 'HollowGrove': {'casual-core': {'SpiderWaterArea': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Water'}), frozenset({'DoubleJump'})}, 'SwampTeleporter': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'})}, 'OuterSwampUpperArea': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'})}, 'HoruFields': {frozenset({'Bash'})}, 'Iceless': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}}, 'standard-core': {'SpiderWaterArea': {frozenset({'Bash'})}, 'HoruFields': {frozenset({'Climb', 'Stomp', 'DoubleJump'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}}, 'master-core': {'SpiderWaterArea': {frozenset({'Free'})}, 'SwampTeleporter': {frozenset({'DoubleJump'})}, 'OuterSwampUpperArea': {frozenset({'DoubleJump'})}, 'HoruFields': {frozenset({'DoubleJump'})}, 'Iceless': {frozenset({'DoubleJump'}), frozenset({'WallJump'})}}, 'standard-abilities': {'HoruFields': {frozenset({'Climb', 'Stomp', 'Dash', ('AC', 3)})}}, 'expert-core': {'HoruFields': {frozenset({'ChargeJump'}), frozenset({'WallJump'})}}, 'expert-abilities': {'HoruFields': {frozenset({'Climb', 'Dash', ('AC', 3)})}, 'Iceless': {frozenset({'Dash', ('AC', 6)})}}, 'standard-lure': {'Iceless': {frozenset({'Bash'})}}, 'master-lure': {'MoonGrottoStompPlantAccess': {frozenset({'Dash', ('AC', 6)}), frozenset({'WallJump', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)}), frozenset({'DoubleJump'}), frozenset({'Glide', 'WallJump'})}}}, 'HoruBasement': {'casual-core': {'HoruEscapeOuterDoor': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Dash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}}}, 'HoruFields': {'casual-core': {'HoruFieldsPushBlock': {frozenset({'Glide', 'Bash'}), frozenset({'Bash', 'DoubleJump'})}, 'HoruOuterDoor': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb'})}}, 'standard-core': {'HoruFieldsPushBlock': {frozenset({'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Glide', 'ChargeJump', 'DoubleJump'})}, 'HoruOuterDoor': {frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'ChargeJump'})}}, 'standard-abilities': {'HoruFieldsPushBlock': {frozenset({'Climb', 'Dash', 'Glide', 'ChargeJump', ('AC', 3)}), frozenset({'WallJump', 'Dash', 'Glide', 'ChargeJump', ('AC', 3)})}}, 'expert-core': {'HoruFieldsPushBlock': {frozenset({'Glide', 'ChargeJump', 'DoubleJump'})}}, 'expert-abilities': {'HoruFieldsPushBlock': {frozenset({('AC', 6), 'Dash', 'ChargeJump', ('EC', 4)}), frozenset({('AC', 6), 'Dash', ('EC', 3), 'Glide', 'ChargeJump'})}}, 'dbash': {'HoruFieldsPushBlock': {frozenset({'Bash'})}}, 'master-abilities': {'HoruFieldsPushBlock': {frozenset({('EC', 4), ('AC', 12), 'Climb', 'Dash', 'DoubleJump'}), frozenset({('AC', 12), 'Dash', ('EC', 5), 'DoubleJump', 'WallJump'})}, 'HoruOuterDoor': {frozenset({('AC', 12), 'Dash', ('EC', 3), 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}}, 'gjump': {'HoruFieldsPushBlock': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}, 'HoruOuterDoor': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-core': {'HoruOuterDoor': {frozenset({'Bash'})}}}, 'HoruFieldsPushBlock': {'master-lure': {'HollowGrove': {frozenset({'Bash'})}}}, 'HoruInnerDoor': {'casual-core': {'HoruMapLedge': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb', 'ChargeJump'})}, 'L1OuterDoor': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb', 'ChargeJump'})}, 'L2OuterDoor': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Climb', 'Glide', 'ChargeJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open', 'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Open', 'Glide', 'ChargeJump', 'WallJump', 'Bash'})}, 'L3OuterDoor': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Climb', 'Glide', 'ChargeJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open', 'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Open', 'Glide', 'ChargeJump', 'WallJump', 'Bash'})}, 'L4OuterDoor': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Open', 'ChargeJump'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open', 'Bash'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'})}, 'R1OuterDoor': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb', 'ChargeJump'})}, 'R2OuterDoor': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Open', 'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Open', 'Climb', 'Glide', 'ChargeJump', 'Bash'}), frozenset({'Glide', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Open', 'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Open', 'Glide', 'ChargeJump', 'WallJump', 'Bash'}), frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb', 'ChargeJump'})}, 'R3OuterDoor': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Bash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Climb', 'Glide', 'ChargeJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open', 'Climb', 'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Open', 'Glide', 'ChargeJump', 'WallJump', 'Bash'})}, 'R4OuterDoor': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'Open', 'ChargeJump', 'DoubleJump'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Open', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Climb', 'Open', 'ChargeJump'})}, 'HoruBasement': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'})}, 'HoruTeleporter': {frozenset({'ChargeJump', 'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Stomp', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'}), frozenset({'Open'}), frozenset({'ChargeJump', 'Glide', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Glide', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'DoubleJump', 'Bash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump', 'Bash'})}}, 'expert-core': {'HoruMapLedge': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Bash', 'WallJump'})}, 'L1OuterDoor': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Bash', 'WallJump'})}, 'L2OuterDoor': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}, 'L3OuterDoor': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}, 'L4OuterDoor': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}, 'R1OuterDoor': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Bash', 'WallJump'})}, 'R2OuterDoor': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Bash', 'WallJump'})}, 'R3OuterDoor': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}, 'R4OuterDoor': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}, 'HoruBasement': {frozenset({'Free'})}, 'HoruTeleporter': {frozenset({'Grenade', 'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Climb', 'Bash'})}}, 'dbash': {'HoruMapLedge': {frozenset({'Bash'})}, 'L1OuterDoor': {frozenset({'Bash'})}, 'L2OuterDoor': {frozenset({'Open', 'Bash'})}, 'L3OuterDoor': {frozenset({'Open', 'Bash'})}, 'R1OuterDoor': {frozenset({'Bash'})}, 'R2OuterDoor': {frozenset({'Open', 'Bash'})}, 'R3OuterDoor': {frozenset({'Open', 'Bash'})}, 'R4OuterDoor': {frozenset({'Open', 'Bash'})}}, 'master-dboost': {'HoruMapLedge': {frozenset({('AC', 12), ('HC', 1), 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'L1OuterDoor': {frozenset({('AC', 12), ('HC', 5), 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'L2OuterDoor': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'L3OuterDoor': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'L4OuterDoor': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'R1OuterDoor': {frozenset({('AC', 12), ('HC', 5), 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'R2OuterDoor': {frozenset({('AC', 12), ('HC', 5), 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'R3OuterDoor': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'R4OuterDoor': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'HoruBasement': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}, 'HoruTeleporter': {frozenset({'ChargeJump', ('AC', 12), ('HC', 5), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'})}}, 'standard-core': {'L2OuterDoor': {frozenset({'Glide', 'Open', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Open', 'ChargeJump', 'Bash'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'Open', 'ChargeJump', 'WallJump', 'Bash'}), frozenset({'Glide', 'Open', 'ChargeJump', 'WallJump'}), frozenset({'Open', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'L3OuterDoor': {frozenset({'Glide', 'Open', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Open', 'ChargeJump', 'Bash'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'Open', 'ChargeJump', 'WallJump', 'Bash'}), frozenset({'Glide', 'Open', 'ChargeJump', 'WallJump'}), frozenset({'Open', 'ChargeJump', 'DoubleJump', 'WallJump'})}, 'R2OuterDoor': {frozenset({'Glide', 'Open', 'DoubleJump', 'Bash'}), frozenset({'Open', 'Dash', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Open', 'ChargeJump', 'Bash'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'Open', 'Dash', 'Glide', 'ChargeJump', 'WallJump'}), frozenset({'Open', 'ChargeJump', 'WallJump', 'Bash'})}, 'R3OuterDoor': {frozenset({'Glide', 'Open', 'DoubleJump', 'Bash'}), frozenset({'Climb', 'Open', 'ChargeJump', 'Bash'}), frozenset({'Grenade', 'Open', 'Bash'}), frozenset({'Open', 'ChargeJump', 'WallJump', 'Bash'}), frozenset({'Glide', 'Open', 'ChargeJump', 'WallJump'}), frozenset({'Open', 'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'expert-dboost': {'L2OuterDoor': {frozenset({'ChargeJump', 'WallJump', ('HC', 2)})}, 'L3OuterDoor': {frozenset({'ChargeJump', 'WallJump', ('HC', 2)})}, 'R3OuterDoor': {frozenset({'ChargeJump', 'WallJump', ('HC', 2)})}}, 'expert-abilities': {'L2OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'Open', ('AC', 6), 'Dash'})}, 'L3OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'Open', ('AC', 6), 'Dash'})}, 'L4OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash'})}, 'R2OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'Open', ('AC', 6), 'Dash'})}, 'R3OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'Open', ('AC', 6), 'Dash'})}, 'R4OuterDoor': {frozenset({'Open', ('AC', 6), 'Dash'})}}, 'master-abilities': {'L2OuterDoor': {frozenset({'Open', 'ChargeJump', 'DoubleJump', ('AC', 12)})}, 'L3OuterDoor': {frozenset({'Open', 'ChargeJump', 'DoubleJump', ('AC', 12)})}, 'R2OuterDoor': {frozenset({'Open', 'ChargeJump', 'DoubleJump', ('AC', 12)})}, 'R3OuterDoor': {frozenset({'Open', 'ChargeJump', 'DoubleJump', ('AC', 12)})}}, 'gjump': {'L2OuterDoor': {frozenset({'Climb', 'Open', 'ChargeJump', 'Grenade'})}, 'L3OuterDoor': {frozenset({'Climb', 'Open', 'ChargeJump', 'Grenade'})}, 'R2OuterDoor': {frozenset({'Climb', 'Open', 'ChargeJump', 'Grenade'})}, 'R3OuterDoor': {frozenset({'Climb', 'Open', 'ChargeJump', 'Grenade'})}}}, 'HoruL4LavaChasePeg': {'casual-core': {'HoruL4CutscenePeg': {frozenset({'Bash', 'Stomp', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'Stomp'})}}, 'standard-core': {'HoruL4CutscenePeg': {frozenset({'Bash', 'Stomp', 'DoubleJump', 'WallJump'})}}, 'expert-core': {'HoruL4CutscenePeg': {frozenset({'Climb', 'Bash', 'Stomp', 'DoubleJump'})}}, 'expert-abilities': {'HoruL4CutscenePeg': {frozenset({('AC', 6), 'Dash', ('EC', 2), 'Bash', 'Stomp'})}}, 'master-core': {'HoruL4CutscenePeg': {frozenset({'Bash', 'Stomp', 'DoubleJump'})}}}, 'HoruOuterDoor': {'casual-core': {'HoruInnerDoor': {frozenset({'HoruKey'})}, 'HoruFieldsPushBlock': {frozenset({'Grenade', 'Bash'}), frozenset({'Glide', 'Bash'}), frozenset({'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'standard-core': {'HoruFieldsPushBlock': {frozenset({'Dash', 'DoubleJump', 'Bash'})}}, 'standard-abilities': {'HoruFieldsPushBlock': {frozenset({'Climb', 'Dash', 'Glide', 'ChargeJump', ('AC', 3)}), frozenset({'WallJump', 'Dash', 'Glide', 'ChargeJump', ('AC', 3)})}}, 'expert-core': {'HoruFieldsPushBlock': {frozenset({'Glide', 'ChargeJump', 'DoubleJump'})}}, 'expert-abilities': {'HoruFieldsPushBlock': {frozenset({('AC', 6), 'Dash', 'ChargeJump'})}}, 'master-core': {'HoruFieldsPushBlock': {frozenset({'ChargeJump', 'DoubleJump'})}}, 'master-abilities': {'HoruFieldsPushBlock': {frozenset({'Bash', ('AC', 12), 'DoubleJump'})}}, 'gjump': {'HoruFieldsPushBlock': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'HoruR1CutsceneTrigger': {'glitched': {'LowerGinsoTree': {frozenset({'Dash'})}}}, 'HoruR1MapstoneSecret': {'casual-core': {'HoruR1CutsceneTrigger': {frozenset({'Glide', 'Bash', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'DoubleJump'}), frozenset({'Bash', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Glide'})}}, 'expert-core': {'HoruR1CutsceneTrigger': {frozenset({'Glide', 'Bash', 'DoubleJump'})}}, 'expert-dboost': {'HoruR1CutsceneTrigger': {frozenset({'Glide', 'ChargeJump', 'DoubleJump', ('HC', 2)}), frozenset({('AC', 6), ('EC', 1), 'Dash', ('HC', 2), 'ChargeJump'})}}, 'dbash': {'HoruR1CutsceneTrigger': {frozenset({'Glide', 'Bash'}), frozenset({'Bash', 'Dash', ('AC', 3)}), frozenset({'Bash', 'DoubleJump'})}}, 'master-core': {'HoruR1CutsceneTrigger': {frozenset({'Bash', 'DoubleJump'})}}, 'master-dboost': {'HoruR1CutsceneTrigger': {frozenset({('HC', 4), ('EC', 4), ('AC', 12), 'Dash', 'DoubleJump'})}}, 'gjump': {'HoruR1CutsceneTrigger': {frozenset({('AC', 12), 'Climb', 'Grenade', 'Glide', 'ChargeJump', ('HC', 1)}), frozenset({'Climb', ('HC', 2), 'Grenade', 'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump', 'Grenade', ('HC', 6)}), frozenset({('AC', 12), 'Climb', 'Grenade', 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({'Climb', ('HC', 2), 'Grenade', 'Glide', 'ChargeJump'})}}}, 'HoruR3ElevatorLever': {'casual-core': {'HoruR3CutsceneTrigger': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Glide', 'WallJump'})}}, 'casual-dboost': {'HoruR3CutsceneTrigger': {frozenset({'Climb', ('HC', -1), 'ChargeJump'})}}, 'standard-core': {'HoruR3CutsceneTrigger': {frozenset({'WallJump'})}}, 'master-core': {'HoruR3CutsceneTrigger': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'})}}, 'master-abilities': {'HoruR3CutsceneTrigger': {frozenset({('AC', 12), 'DoubleJump'})}, 'HoruR3PlantCove': {frozenset({'Glide', ('AC', 6), 'Dash', ('EC', 1)}), frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'DoubleJump', ('EC', 1)}), frozenset({('AC', 6), 'Dash', 'ChargeJump', ('EC', 1)})}}}, 'HoruR4PuzzleEntrance': {'casual-core': {'HoruR4CutsceneTrigger': {frozenset({'Bash', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}}, 'expert-abilities': {'HoruR4CutsceneTrigger': {frozenset({('AC', 6), 'Dash', 'ChargeJump', ('EC', 2)})}}, 'gjump': {'HoruR4CutsceneTrigger': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'HoruR4StompHideout': {'casual-core': {'HoruR4PuzzleEntrance': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb'})}}, 'standard-abilities': {'HoruR4PuzzleEntrance': {frozenset({'Dash', 'ChargeJump', ('AC', 3)}), frozenset({'Bash', 'Dash', ('AC', 3)})}}, 'expert-dboost': {'HoruR4PuzzleEntrance': {frozenset({'ChargeJump', ('HC', 2)}), frozenset({'Bash', ('HC', 2)})}, 'HoruR4CutsceneTrigger': {frozenset({'ChargeJump', 'DoubleJump', ('HC', 2)})}}, 'dbash': {'HoruR4PuzzleEntrance': {frozenset({'Bash'})}, 'HoruR4CutsceneTrigger': {frozenset({'Bash'})}}, 'master-dboost': {'HoruR4PuzzleEntrance': {frozenset({('AC', 12), 'DoubleJump', ('HC', 1)})}}, 'gjump': {'HoruR4PuzzleEntrance': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'expert-core': {'HoruR4CutsceneTrigger': {frozenset({'Bash', 'ChargeJump'})}}}, 'HoruTeleporter': {'casual-core': {'HoruInnerDoor': {frozenset({'Climb', 'Open', 'ChargeJump'}), frozenset({'Open', 'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'Open', 'Bash'})}}, 'dbash': {'HoruInnerDoor': {frozenset({'Open', 'Bash'})}}, 'master-core': {'HoruInnerDoor': {frozenset({'Open', 'ChargeJump', 'DoubleJump'})}}, 'master-abilities': {'HoruInnerDoor': {frozenset({'Open', ('AC', 12), 'DoubleJump', 'WallJump'})}}}, 'Iceless': {'casual-core': {'UpperGrotto': {frozenset({'DoubleJump'}), frozenset({'Glide'})}}, 'standard-core': {'UpperGrotto': {frozenset({'Grenade', 'Bash'})}}, 'standard-dboost': {'UpperGrotto': {frozenset({('HC', 1)})}}, 'gjump': {'UpperGrotto': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'InnerSwampAboveDrainArea': {'casual-core': {'InnerSwampDrainBroken': {frozenset({'ChargeFlame', 'Water'}), frozenset({'Grenade'})}}, 'casual-dboost': {'InnerSwampDrainBroken': {frozenset({'ChargeFlame'})}}}, 'InnerSwampDrainBroken': {'casual-core': {'Swamp': {frozenset({'Climb', 'ChargeJump', 'Water'}), frozenset({'Climb', 'Bash', 'Grenade', 'Water'}), frozenset({'Glide', 'ChargeJump', 'WallJump'}), frozenset({'DoubleJump', 'WallJump', 'Water'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'Glide', 'ChargeJump'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'WallJump', 'Water'})}}, 'casual-dboost': {'Swamp': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'Water'}), frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'Swamp': {frozenset({'DoubleJump', 'Water'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'})}}, 'expert-dboost': {'Swamp': {frozenset({'ChargeJump'}), frozenset({'Climb', ('HC', 0), 'Water'})}}, 'master-core': {'Swamp': {frozenset({'Bash'})}}, 'standard-core': {'Swamp': {frozenset({'Climb', 'DoubleJump', 'Water'})}}, 'standard-abilities': {'Swamp': {frozenset({'Climb', 'Dash', ('AC', 3), 'Water'}), frozenset({'Dash', ('AC', 3), 'WallJump', 'Water'})}}, 'master-dboost': {'Swamp': {frozenset({('HC', 10), 'WallJump'}), frozenset({'Climb', ('HC', 4), ('AC', 12)}), frozenset({'Climb', ('HC', 10)}), frozenset({('HC', 10), 'DoubleJump'}), frozenset({('HC', 4), ('AC', 12), 'DoubleJump'}), frozenset({('HC', 4), ('AC', 12), 'WallJump'})}}}, 'L2OuterDoor': {'casual-core': {'HoruInnerDoor': {frozenset({'Stomp'})}}}, 'L3OuterDoor': {'casual-core': {'HoruInnerDoor': {frozenset({'Stomp'})}}}, 'L4': {'casual-core': {'HoruL4LavaChasePeg': {frozenset({'Bash'})}}, 'expert-core': {'HoruL4CutscenePeg': {frozenset({'Free'})}}}, 'LeftGlades': {'casual-core': {'UpperLeftGlades': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}}, 'standard-lure': {'UpperLeftGlades': {frozenset({'Bash'})}}, 'expert-core': {'UpperLeftGlades': {frozenset({'DoubleJump'})}}}, 'LeftGumoHideout': {'casual-core': {'WaterVeinArea': {frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'})}}, 'standard-core': {'WaterVeinArea': {frozenset({'Climb', 'DoubleJump'})}}, 'standard-abilities': {'WaterVeinArea': {frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}}, 'master-core': {'WaterVeinArea': {frozenset({'Dash', 'WallJump'}), frozenset({'DoubleJump'})}}}, 'LeftSorrow': {'casual-core': {'LeftSorrowKeystones': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Glide'})}}, 'expert-dboost': {'LeftSorrowKeystones': {frozenset({'ChargeJump', 'WallJump', ('HC', 2)})}}, 'master-dboost': {'LeftSorrowKeystones': {frozenset({('AC', 12), 'ChargeJump', 'WallJump', ('HC', 1)})}}, 'master-abilities': {'LeftSorrowKeystones': {frozenset({'Climb', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}}, 'master-core': {'LeftSorrowKeystones': {frozenset({'Bash'})}}}, 'LeftSorrowKeystones': {'casual-core': {'LeftSorrowMiddleDoor': {frozenset({('KS', 4)})}}, 'standard-core': {'MiddleSorrow': {frozenset({'Bash', 'Dash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'Dash', 'DoubleJump'})}}, 'expert-abilities': {'MiddleSorrow': {frozenset({'Bash', ('AC', 6), 'Dash', 'WallJump'}), frozenset({'Climb', 'Bash', ('AC', 6), 'Dash'})}}, 'dbash': {'MiddleSorrow': {frozenset({'Bash'})}}, 'master-abilities': {'MiddleSorrow': {frozenset({'ChargeJump', ('AC', 12), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Dash', 'Stomp', 'ChargeJump', ('AC', 3)}), frozenset({('AC', 12), 'Climb', 'Stomp', 'ChargeJump', 'DoubleJump'}), frozenset({('AC', 6), 'Dash', 'Stomp', 'ChargeJump', 'WallJump'})}}}, 'LeftSorrowLowerDoor': {'casual-core': {'LeftSorrow': {frozenset({'Glide', 'Stomp', 'Bash'})}}, 'standard-core': {'LeftSorrow': {frozenset({'Climb', 'Bash', 'ChargeJump', 'Stomp'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'ChargeJump', 'Stomp', 'WallJump'})}}, 'expert-dboost': {'LeftSorrow': {frozenset({'Climb', 'ChargeJump', ('HC', 2)})}}, 'dbash': {'LeftSorrow': {frozenset({'Bash', 'Stomp', ('HC', 2)}), frozenset({'Grenade', 'Bash', 'Stomp'}), frozenset({'Bash', 'Stomp', 'DoubleJump'})}}}, 'LeftSorrowMiddleDoor': {'casual-core': {'MiddleSorrow': {frozenset({'Bash', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'Stomp', 'Bash'}), frozenset({'Climb', 'Bash', 'Stomp', 'DoubleJump'}), frozenset({'Glide', 'Stomp', 'WallJump', 'Bash'})}}, 'standard-core': {'MiddleSorrow': {frozenset({'Climb', 'Bash', 'Stomp'}), frozenset({'Bash', 'Stomp', 'WallJump'}), frozenset({'Bash', 'Stomp', 'DoubleJump'})}}, 'expert-dboost': {'MiddleSorrow': {frozenset({'Climb', ('HC', 2), 'Bash', 'ChargeJump', 'DoubleJump'})}}, 'master-abilities': {'MiddleSorrow': {frozenset({('AC', 6), 'Climb', 'Dash', 'Bash', 'ChargeJump'}), frozenset({('AC', 6), 'Bash', 'Stomp', 'Dash'})}}, 'master-dboost': {'MiddleSorrow': {frozenset({('AC', 12), 'Climb', 'Bash', 'ChargeJump', 'DoubleJump', ('HC', 1)})}}, 'glitched': {'MiddleSorrow': {frozenset({'Dash'})}}}, 'LostGrove': {'casual-core': {'LostGroveExit': {frozenset({'Grenade', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'DoubleJump', 'WallJump'})}}, 'casual-dboost': {'LostGroveExit': {frozenset({'Grenade', 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump', 'DoubleJump'})}}, 'expert-core': {'LostGroveExit': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Glide', 'Climb', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'WallJump'})}}, 'expert-dboost': {'LostGroveExit': {frozenset({'Grenade', ('HC', 4), 'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'Dash', 'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'Climb', 'ChargeJump', ('HC', 4)}), frozenset({'Grenade', 'Glide', 'ChargeJump', 'WallJump'})}}, 'expert-abilities': {'LostGroveExit': {frozenset({'Climb', 'Dash', 'Grenade', 'ChargeJump', ('AC', 3)})}}, 'master-abilities': {'LostGroveExit': {frozenset({'Grenade', 'Climb', ('AC', 12), 'DoubleJump'}), frozenset({'Grenade', ('AC', 12), 'DoubleJump', 'WallJump'})}}, 'gjump': {'LostGroveExit': {frozenset({'Grenade', 'Climb', 'ChargeJump'})}}}, 'LowerBlackroot': {'casual-core': {'LostGrove': {frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Grenade'})}}, 'expert-core': {'LostGrove': {frozenset({'Grenade', 'DoubleJump'})}}}, 'LowerChargeFlameArea': {'casual-core': {'GladesMain': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'ChargeFlameAreaStump': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}}, 'standard-core': {'GladesMain': {frozenset({'Stomp'})}}, 'expert-abilities': {'GladesMain': {frozenset({'Dash', ('AC', 6)})}}, 'master-core': {'ChargeFlameAreaStump': {frozenset({'DoubleJump'})}}, 'master-lure': {'ChargeFlameAreaStump': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'Bash', ('AC', 6), 'Dash'}), frozenset({'Bash', 'Stomp'})}}}, 'LowerGinsoTree': {'casual-core': {'GinsoMiniBossDoor': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Climb', 'Glide'}), frozenset({'Grenade', 'Bash', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Glide'}), frozenset({'Glide', 'WallJump'})}}, 'standard-dboost': {'GinsoMiniBossDoor': {frozenset({'Climb', ('HC', 0)}), frozenset({('HC', 0), 'WallJump'}), frozenset({'ChargeJump', ('HC', 0)})}}, 'standard-abilities': {'GinsoMiniBossDoor': {frozenset({'Dash', 'ChargeJump', ('AC', 3)}), frozenset({'Dash', ('AC', 3), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 3)})}}, 'expert-core': {'GinsoMiniBossDoor': {frozenset({'WallJump'})}}, 'master-core': {'GinsoMiniBossDoor': {frozenset({'DoubleJump'}), frozenset({'Bash'})}}, 'glitched': {'R4InnerDoor': {frozenset({'Dash'})}}}, 'LowerLeftGumoHideout': {'glitched': {'LowerBlackroot': {frozenset({'Dash'})}}}, 'LowerSorrow': {'casual-core': {'WilhelmLedge': {frozenset({'Glide', 'DoubleJump'})}, 'SorrowMainShaftKeystoneArea': {frozenset({'Glide'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Bash', 'WallJump'})}, 'SorrowMapstoneArea': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'}), frozenset({'Climb', 'ChargeJump'})}, 'LeftSorrowLowerDoor': {frozenset({('KS', 4)})}, 'LeftSorrow': {frozenset({'Glide', 'Bash'}), frozenset({'Glide', 'ChargeJump'})}, 'MiddleSorrow': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'WilhelmLedge': {frozenset({'Glide', 'Dash'}), frozenset({'Dash', 'DoubleJump'})}, 'MiddleSorrow': {frozenset({'Glide', 'Bash'})}}, 'expert-dboost': {'WilhelmLedge': {frozenset({'Glide', ('HC', 2)}), frozenset({'DoubleJump', ('HC', 2)})}}, 'expert-abilities': {'WilhelmLedge': {frozenset({'Dash', ('AC', 6), 'Bash'}), frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'Stomp'})}, 'SorrowMainShaftKeystoneArea': {frozenset({'Dash', ('AC', 6)})}, 'LeftSorrow': {frozenset({'Dash', ('AC', 6), 'Bash'}), frozenset({('AC', 6), 'Dash', 'Stomp', 'ChargeJump'}), frozenset({('AC', 6), 'Dash', 'ChargeJump', 'DoubleJump'}), frozenset({('EC', 2), 'Dash', 'ChargeJump', ('AC', 6)})}, 'MiddleSorrow': {frozenset({'Dash', ('AC', 6)})}}, 'dbash': {'WilhelmLedge': {frozenset({'Bash'})}, 'SorrowMainShaftKeystoneArea': {frozenset({'Bash'})}, 'SorrowMapstoneArea': {frozenset({'Bash'})}, 'LeftSorrow': {frozenset({'Bash'})}, 'SunstoneArea': {frozenset({'Glide', 'Bash'})}}, 'master-dboost': {'WilhelmLedge': {frozenset({'Glide', ('AC', 12), ('HC', 1)})}, 'LeftSorrow': {frozenset({('AC', 12), 'ChargeJump', ('HC', 7)})}}, 'master-abilities': {'WilhelmLedge': {frozenset({('AC', 12), 'DoubleJump'})}, 'LeftSorrow': {frozenset({('AC', 12), 'ChargeJump', 'DoubleJump'})}}, 'standard-lure': {'SorrowMapstoneArea': {frozenset({'Climb', 'Glide'}), frozenset({'Glide', 'WallJump'})}}, 'gjump': {'LeftSorrow': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-core': {'MiddleSorrow': {frozenset({'Bash'})}}, 'glitched': {'MiddleSorrow': {frozenset({'Glide', 'ChargeJump'})}}}, 'LowerSpiritCaverns': {'casual-core': {'MidSpiritCaverns': {frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'})}, 'GladesLaserArea': {frozenset({'Bash', ('EC', 4)})}, 'SpiritCavernsDoor': {frozenset({'Open'})}}, 'expert-core': {'MidSpiritCaverns': {frozenset({'Bash', 'Dash'})}}, 'dbash': {'MidSpiritCaverns': {frozenset({'Bash'})}}, 'master-core': {'MidSpiritCaverns': {frozenset({'DoubleJump'})}}}, 'LowerValley': {'casual-core': {'LowerValleyPlantApproach': {frozenset({'Glide', 'Wind'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'Glide', 'ChargeJump'})}, 'ValleyThreeBirdLever': {frozenset({'Glide', 'Wind'}), frozenset({'Glide', 'DoubleJump'})}, 'MistyEntrance': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Glide', 'Wind'})}, 'ValleyTeleporter': {frozenset({'Glide', 'OpenWorld', 'Wind'}), frozenset({'Climb', 'Glide', 'ChargeJump', 'OpenWorld'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'OpenWorld'}), frozenset({'Climb', 'OpenWorld', 'ChargeJump', 'DoubleJump'})}}, 'standard-lure': {'LowerValleyPlantApproach': {frozenset({'Bash'})}, 'ValleyThreeBirdLever': {frozenset({'Glide', 'Bash'}), frozenset({'Bash', 'DoubleJump'})}}, 'standard-core': {'ValleyThreeBirdLever': {frozenset({'Glide', 'Dash'}), frozenset({'Dash', 'DoubleJump'})}, 'MistyEntrance': {frozenset({'Climb', 'Bash', 'Grenade'})}, 'ValleyTeleporter': {frozenset({'Climb', 'Bash', 'Grenade', 'OpenWorld'}), frozenset({'OpenWorld', 'Grenade', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'OpenWorld', 'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'standard-dboost': {'ValleyThreeBirdLever': {frozenset({('HC', 1)})}}, 'expert-dboost': {'ValleyThreeBirdLever': {frozenset({('HC', -1)})}}, 'dbash': {'ValleyThreeBirdLever': {frozenset({'Bash'})}, 'MistyEntrance': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}, 'expert-abilities': {'MistyEntrance': {frozenset({'Dash', ('AC', 6)})}, 'ValleyTeleporter': {frozenset({'Dash', ('AC', 6), 'OpenWorld'})}}, 'master-lure': {'MistyEntrance': {frozenset({'Bash'})}, 'ValleyTeleporter': {frozenset({'Bash', 'OpenWorld'})}}}, 'MidSpiritCaverns': {'casual-core': {'GladesLaserArea': {frozenset({('EC', 4)})}, 'UpperSpiritCaverns': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}}, 'glitched': {'GladesLaserArea': {frozenset({('EC', 3)})}}, 'casual-dboost': {'UpperSpiritCaverns': {frozenset({'DoubleJump'})}}, 'standard-core': {'UpperSpiritCaverns': {frozenset({'Bash'})}}}, 'MiddleSorrow': {'casual-core': {'UpperSorrow': {frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Glide'})}, 'SorrowMainShaftKeystoneArea': {frozenset({'Stomp'})}, 'LowerSorrow': {frozenset({'Stomp'})}}, 'gjump': {'UpperSorrow': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'expert-dboost': {'UpperSorrow': {frozenset({'ChargeJump', 'WallJump', ('HC', 2)}), frozenset({'Climb', 'ChargeJump', ('HC', 2)})}}, 'master-dboost': {'UpperSorrow': {frozenset({('AC', 12), 'ChargeJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', ('AC', 12), 'ChargeJump', ('HC', 1)})}}, 'expert-abilities': {'LeftSorrow': {frozenset({'Climb', 'Dash', 'Stomp', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'Stomp', 'WallJump'})}, 'LeftSorrowKeystones': {frozenset({'Climb', 'Dash', 'Stomp', ('AC', 6)}), frozenset({('AC', 6), 'Dash', 'Stomp', 'WallJump'})}, 'SorrowMainShaftKeystoneArea': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}, 'LowerSorrow': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'standard-core': {'SorrowMainShaftKeystoneArea': {frozenset({'Climb', 'ChargeJump'})}, 'LowerSorrow': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'SorrowMainShaftKeystoneArea': {frozenset({'Grenade', 'Bash', 'ChargeJump'})}, 'LowerSorrow': {frozenset({'Grenade', 'Bash', 'ChargeJump'})}, 'SunstoneArea': {frozenset({'Glide', 'Bash'})}}}, 'MistyAbove200xp': {'casual-core': {'MistyBeforeMiniBoss': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide'})}}, 'standard-core': {'MistyBeforeMiniBoss': {frozenset({'Grenade', 'Bash'}), frozenset({'Dash', 'DoubleJump'})}}, 'standard-abilities': {'MistyBeforeMiniBoss': {frozenset({('AC', 12), 'DoubleJump'}), frozenset({'Dash', ('AC', 6)})}}, 'master-core': {'MistyBeforeMiniBoss': {frozenset({'Bash'})}}}, 'MistyBeforeDocks': {'casual-core': {'MistyAbove200xp': {frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'Climb', 'DoubleJump'})}}, 'standard-core': {'MistyAbove200xp': {frozenset({'Glide', 'ChargeJump'})}}, 'standard-abilities': {'MistyAbove200xp': {frozenset({'Bash', ('AC', 6), 'Dash'}), frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'expert-abilities': {'MistyAbove200xp': {frozenset({'Dash', ('AC', 6)})}}, 'master-core': {'MistyAbove200xp': {frozenset({'Bash'})}}}, 'MistyBeforeMiniBoss': {'casual-core': {'MistyOrbRoom': {frozenset({('KS', 4)})}}}, 'MistyEntrance': {'casual-core': {'MistyPostFeatherTutorial': {frozenset({'Glide', 'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Glide', 'Bash', 'Climb'})}}, 'standard-core': {'MistyPostFeatherTutorial': {frozenset({'Glide', 'Bash'})}}, 'standard-abilities': {'MistyPostFeatherTutorial': {frozenset({'Climb', 'Dash', 'Glide', 'ChargeJump', 'DoubleJump', ('AC', 3)}), frozenset({'Dash', 'Glide', ('AC', 3), 'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'expert-core': {'MistyPostFeatherTutorial': {frozenset({'Climb', 'Glide', 'ChargeJump', 'DoubleJump'})}}, 'expert-dboost': {'MistyPostFeatherTutorial': {frozenset({('HC', 4), 'ChargeJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump', ('HC', 1)})}}, 'expert-abilities': {'MistyPostFeatherTutorial': {frozenset({'Dash', ('AC', 6), ('EC', 4)}), frozenset({'Dash', 'Glide', 'ChargeJump', 'DoubleJump', ('AC', 3)})}}, 'master-core': {'MistyPostFeatherTutorial': {frozenset({'Bash'})}}, 'gjump': {'MistyPostFeatherTutorial': {frozenset({'Climb', 'ChargeJump', 'Grenade', ('HC', 1)})}}}, 'MistyKeystone3Ledge': {'casual-core': {'MistyPreLasers': {frozenset({'Glide'})}}, 'standard-abilities': {'MistyPreLasers': {frozenset({('AC', 12), 'DoubleJump'}), frozenset({'Dash', ('AC', 6)})}}, 'expert-core': {'MistyPreLasers': {frozenset({'Grenade', 'Bash'}), frozenset({'Dash', 'DoubleJump'})}}, 'expert-dboost': {'MistyPreLasers': {frozenset({'ChargeJump', ('HC', 1)}), frozenset({'DoubleJump', ('HC', 1)})}}, 'master-dboost': {'MistyPreLasers': {frozenset({('HC', 4), 'WallJump'})}}, 'gjump': {'MistyPreLasers': {frozenset({'Grenade', 'Climb', 'ChargeJump'})}}}, 'MistyKeystone4Ledge': {'casual-core': {'MistyBeforeDocks': {frozenset({'Glide', 'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump', 'Glide'}), frozenset({'Climb', 'Bash', 'Glide', 'DoubleJump'})}}, 'standard-core': {'MistyBeforeDocks': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'})}}, 'master-abilities': {'MistyBeforeDocks': {frozenset({'Dash', ('AC', 6)})}}, 'master-dboost': {'MistyBeforeDocks': {frozenset({'ChargeJump', 'DoubleJump', ('HC', 7)})}}, 'master-lure': {'MistyBeforeDocks': {frozenset({'Bash'})}}}, 'MistyMortarSpikeCave': {'casual-core': {'MistyKeystone4Ledge': {frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Climb', 'Bash', 'Glide'})}}, 'standard-core': {'MistyKeystone4Ledge': {frozenset({'Glide', 'Bash', 'DoubleJump'})}}, 'expert-core': {'MistyKeystone4Ledge': {frozenset({'Glide', 'Bash'})}}, 'expert-abilities': {'MistyKeystone4Ledge': {frozenset({'Bash', ('AC', 6), 'Dash'})}}, 'master-core': {'MistyKeystone4Ledge': {frozenset({'Bash'})}}, 'master-abilities': {'MistyKeystone4Ledge': {frozenset({'Dash', ('AC', 6)}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump'})}}}, 'MistyOrbRoom': {'casual-core': {'MistyPreKeystone2': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}}, 'master-core': {'MistyPreKeystone2': {frozenset({'DoubleJump'})}}}, 'MistyPostClimb': {'casual-core': {'MistySpikeCave': {frozenset({'Climb', 'DoubleJump', 'WallJump'})}}, 'standard-core': {'MistySpikeCave': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'MistySpikeCave': {frozenset({'ChargeJump'})}}, 'expert-abilities': {'MistySpikeCave': {frozenset({'Bash', ('AC', 6), 'Dash'})}}, 'dbash': {'MistySpikeCave': {frozenset({'Bash'})}}, 'master-core': {'MistySpikeCave': {frozenset({'DoubleJump'})}}}, 'MistyPostFeatherTutorial': {'casual-core': {'MistyPostKeystone1': {frozenset({'Free'})}}}, 'MistyPostKeystone1': {'casual-core': {'MistyPreMortarCorridor': {frozenset({'Glide', 'Bash'})}}, 'expert-core': {'MistyPreMortarCorridor': {frozenset({'Glide'})}}, 'expert-dboost': {'MistyPreMortarCorridor': {frozenset({('HC', 6)}), frozenset({'Dash', ('AC', 3), ('HC', 1)}), frozenset({'DoubleJump', ('HC', 1)})}}, 'master-core': {'MistyPreMortarCorridor': {frozenset({'Bash'})}}, 'master-abilities': {'MistyPreMortarCorridor': {frozenset({'Dash', ('AC', 6), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump'})}}, 'master-dboost': {'MistyPreMortarCorridor': {frozenset({('HC', 3)}), frozenset({('AC', 12), ('HC', 1)})}}}, 'MistyPostLasers': {'casual-core': {'MistyMortarSpikeCave': {frozenset({'Glide', 'Bash', 'DoubleJump'})}}, 'standard-core': {'MistyMortarSpikeCave': {frozenset({'Glide', 'Bash'})}}, 'expert-core': {'MistyMortarSpikeCave': {frozenset({'Glide'})}}, 'master-core': {'MistyMortarSpikeCave': {frozenset({'Bash'})}}}, 'MistyPostMortarCorridor': {'casual-core': {'MistyPrePlantLedge': {frozenset({'Bash'})}}, 'standard-core': {'MistyPrePlantLedge': {frozenset({'ChargeJump', 'WallJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Climb', 'ChargeJump'})}}, 'master-core': {'MistyPrePlantLedge': {frozenset({'DoubleJump'})}}, 'master-abilities': {'MistyPrePlantLedge': {frozenset({'Dash', ('AC', 6)})}}}, 'MistyPreClimb': {'casual-core': {'MistyPostClimb': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Stomp', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Stomp'})}}, 'expert-core': {'MistyPostClimb': {frozenset({'Grenade', 'Bash', 'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'DoubleJump', 'WallJump'})}}, 'master-core': {'MistyPostClimb': {frozenset({'Stomp', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'DoubleJump'})}}, 'glitched': {'ForlornTeleporter': {frozenset({'Dash'})}, 'RightForlorn': {frozenset({'Dash'})}}}, 'MistyPreLasers': {'casual-core': {'MistyPostLasers': {frozenset({'Climb', 'Glide', 'WallJump'})}}, 'standard-core': {'MistyPostLasers': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump'})}}, 'expert-core': {'MistyPostLasers': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}}, 'master-core': {'MistyPostLasers': {frozenset({'DoubleJump'}), frozenset({'Bash'})}}}, 'MistyPreMortarCorridor': {'casual-core': {'MistyPostMortarCorridor': {frozenset({'Glide'})}}, 'expert-dboost': {'MistyPostMortarCorridor': {frozenset({'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({'Dash', 'DoubleJump', ('AC', 3), ('HC', 1)})}}, 'master-core': {'MistyPostMortarCorridor': {frozenset({'Grenade', 'Bash', 'DoubleJump'})}}, 'master-abilities': {'MistyPostMortarCorridor': {frozenset({'Dash', ('AC', 6)})}}, 'master-dboost': {'MistyPostMortarCorridor': {frozenset({('AC', 12), ('HC', 6)}), frozenset({('HC', 7)})}}, 'glitched': {'RightForlorn': {frozenset({'Free'})}}}, 'MistyPrePlantLedge': {'casual-core': {'MistyPreClimb': {frozenset({'ChargeJump'}), frozenset({'Glide', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'DoubleJump'})}}, 'standard-core': {'MistyPreClimb': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'})}}, 'expert-core': {'MistyPreClimb': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'WallJump'})}}, 'master-core': {'MistyPreClimb': {frozenset({'DoubleJump'}), frozenset({'Bash'})}}}, 'MistySpikeCave': {'casual-core': {'MistyKeystone3Ledge': {frozenset({'Climb', 'DoubleJump', 'WallJump'})}}, 'standard-core': {'MistyKeystone3Ledge': {frozenset({'Glide', 'Bash', 'DoubleJump'})}}, 'expert-core': {'MistyKeystone3Ledge': {frozenset({'DoubleJump'})}}, 'master-core': {'MistyKeystone3Ledge': {frozenset({'Bash'})}}, 'master-dboost': {'MistyKeystone3Ledge': {frozenset({'ChargeJump', ('HC', 1)})}}}, 'MoonGrotto': {'casual-core': {'MoonGrottoAboveTeleporter': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'DeathGauntlet': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'WaterVeinArea': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'MoonGrottoBelowTeleporter': {frozenset({'DoubleJump'}), frozenset({'Glide', 'ChargeJump'})}}, 'master-core': {'MoonGrottoAboveTeleporter': {frozenset({'DoubleJump'})}}, 'expert-abilities': {'MoonGrottoAboveTeleporter': {frozenset({'Dash', ('AC', 6), ('EC', 1)})}}, 'standard-core': {'WaterVeinArea': {frozenset({'Dash'})}}, 'expert-core': {'WaterVeinArea': {frozenset({'WallJump'})}}, 'master-lure': {'WaterVeinArea': {frozenset({'Bash'})}}, 'standard-dboost': {'MoonGrottoBelowTeleporter': {frozenset({'Glide', ('HC', 1)})}}, 'standard-abilities': {'MoonGrottoBelowTeleporter': {frozenset({'Dash', ('AC', 3)})}}}, 'MoonGrottoAboveTeleporter': {'casual-core': {'UpperGrotto': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'WallJump'})}, 'MoonGrottoSwampAccessArea': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash'})}}, 'standard-core': {'UpperGrotto': {frozenset({'Grenade', 'Bash'})}}, 'expert-core': {'UpperGrotto': {frozenset({'Climb', 'Glide'})}, 'MoonGrottoStompPlantAccess': {frozenset({'ChargeFlame'})}}, 'master-core': {'UpperGrotto': {frozenset({'DoubleJump'}), frozenset({'Bash', 'Dash', ('AC', 3)})}}, 'casual-dboost': {'MoonGrottoSwampAccessArea': {frozenset({'DoubleJump'})}}, 'standard-dboost': {'MoonGrottoSwampAccessArea': {frozenset({'ChargeJump', ('HC', 0)})}}, 'expert-dboost': {'MoonGrottoSwampAccessArea': {frozenset({'Dash', ('HC', 1)})}}, 'expert-abilities': {'MoonGrottoSwampAccessArea': {frozenset({'Dash', ('AC', 6)})}}, 'gjump': {'MoonGrottoSwampAccessArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-lure': {'DeathGauntletRoof': {frozenset({'Bash'})}, 'MoonGrottoBelowTeleporter': {frozenset({'Bash'})}}}, 'MoonGrottoSwampAccessArea': {'casual-core': {'InnerSwampAboveDrainArea': {frozenset({'ChargeJump'})}}, 'standard-lure': {'InnerSwampAboveDrainArea': {frozenset({'Bash'})}}, 'expert-lure': {'InnerSwampAboveDrainArea': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Stomp', 'DoubleJump'}), frozenset({'Climb', 'ChargeFlame'})}}, 'master-lure': {'InnerSwampAboveDrainArea': {frozenset({'Grenade', 'DoubleJump'})}}}, 'OuterSwampAbilityCellNook': {'glitched': {'InnerSwampSkyArea': {frozenset({'Dash'})}}}, 'OuterSwampLowerArea': {'casual-core': {'OuterSwampMortarAbilityCellLedge': {frozenset({'Bash'})}, 'OuterSwampUpperArea': {frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'ChargeJump'}), frozenset({'Climb', 'DoubleJump'})}, 'OuterSwampAbilityCellNook': {frozenset({'Glide', 'Wind'}), frozenset({'Grenade', 'Bash'})}, 'OuterSwampMortarPlantAccess': {frozenset({'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Bash'})}, 'SwampEntryArea': {frozenset({'Glide', 'Wind'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}, 'UpperGrotto': {frozenset({'Glide', 'Wind'}), frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'Bash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}}, 'expert-abilities': {'OuterSwampMortarAbilityCellLedge': {frozenset({'Dash', ('AC', 6)})}, 'OuterSwampUpperArea': {frozenset({'Dash', ('AC', 6)})}}, 'master-abilities': {'OuterSwampMortarAbilityCellLedge': {frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}}, 'expert-core': {'OuterSwampUpperArea': {frozenset({'Climb'}), frozenset({'WallJump'})}}, 'standard-core': {'OuterSwampAbilityCellNook': {frozenset({'Climb'}), frozenset({'Bash'}), frozenset({'WallJump'})}}}, 'OuterSwampMortarAbilityCellLedge': {'expert-core': {'OuterSwampMortarPlantAccess': {frozenset({'ChargeFlame'})}}}, 'OuterSwampUpperArea': {'casual-core': {'GinsoOuterDoor': {frozenset({'GinsoKey'})}, 'OuterSwampAbilityCellNook': {frozenset({'DoubleJump'}), frozenset({'Glide'})}}, 'standard-core': {'OuterSwampAbilityCellNook': {frozenset({'Free'})}}}, 'OutsideForlorn': {'casual-core': {'OutsideForlornCliff': {frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'}), frozenset({'Glide', 'Bash'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'})}, 'ForlornOuterDoor': {frozenset({'ForlornKey'})}}, 'expert-abilities': {'OutsideForlornCliff': {frozenset({'Dash', ('AC', 6)})}}, 'dbash': {'OutsideForlornCliff': {frozenset({'Bash'})}}, 'master-core': {'OutsideForlornCliff': {frozenset({'ChargeJump', 'DoubleJump'})}}, 'glitched': {'RightForlorn': {frozenset({'Free'})}}}, 'OutsideForlornCliff': {'casual-core': {'ValleyForlornApproach': {frozenset({'Stomp', 'ChargeJump', 'Bash'}), frozenset({'Climb', 'Stomp', 'DoubleJump', 'Bash'}), frozenset({'Stomp', 'WallJump', 'Bash'}), frozenset({'Grenade', 'Stomp', 'Bash'})}}, 'expert-core': {'ValleyForlornApproach': {frozenset({'ChargeFlame', 'Stomp', 'WallJump'}), frozenset({'ChargeFlame', 'Stomp', 'Climb', 'DoubleJump'}), frozenset({'ChargeFlame', 'Stomp', 'ChargeJump'})}}, 'master-core': {'ValleyForlornApproach': {frozenset({'Bash'})}}}, 'R1': {'casual-core': {'HoruR1MapstoneSecret': {frozenset({'DoubleJump'}), frozenset({'Glide'})}}, 'standard-core': {'HoruR1MapstoneSecret': {frozenset({'Grenade', 'Bash'})}}, 'standard-abilities': {'HoruR1MapstoneSecret': {frozenset({'Dash', ('AC', 3)})}}, 'expert-dboost': {'HoruR1MapstoneSecret': {frozenset({'Climb', 'ChargeJump', ('HC', 2)}), frozenset({'Bash', ('HC', 2)}), frozenset({'Dash', ('HC', 2)})}}, 'master-dboost': {'HoruR1MapstoneSecret': {frozenset({'Dash', ('AC', 12), ('HC', 1)}), frozenset({('HC', 6)}), frozenset({'Climb', ('AC', 12), 'ChargeJump', ('HC', 1)}), frozenset({'Bash', ('AC', 12), ('HC', 1)}), frozenset({('HC', 4), ('AC', 12)})}}, 'gjump': {'HoruR1MapstoneSecret': {frozenset({('AC', 12), 'Climb', 'Grenade', 'ChargeJump', ('HC', 1)}), frozenset({'Climb', 'ChargeJump', 'Grenade', ('HC', 2)}), frozenset({'Climb', 'Stomp', 'ChargeJump', 'Grenade'})}}}, 'R1OuterDoor': {'expert-core': {'L1OuterDoor': {frozenset({'Free'})}}}, 'R3': {'casual-core': {'HoruR3ElevatorLever': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Bash', 'Climb'})}}, 'expert-core': {'HoruR3ElevatorLever': {frozenset({'Grenade', 'Bash', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'WallJump'})}}, 'master-abilities': {'HoruR3ElevatorLever': {frozenset({'Climb', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'ChargeJump', 'DoubleJump'})}}}, 'R3OuterDoor': {'casual-core': {'HoruInnerDoor': {frozenset({'Stomp'})}}}, 'R4': {'casual-core': {'HoruR4StompHideout': {frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Grenade', 'Bash', 'WallJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'ChargeFlame', 'Bash', 'Grenade'}), frozenset({'Stomp', 'ChargeJump'})}}, 'standard-core': {'HoruR4StompHideout': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}}, 'expert-core': {'HoruR4StompHideout': {frozenset({'ChargeFlame', 'Bash'}), frozenset({'Bash', 'Stomp'})}}, 'expert-abilities': {'HoruR4StompHideout': {frozenset({'Bash', ('AC', 6), 'Dash'})}}, 'expert-dboost': {'HoruR4StompHideout': {frozenset({('HC', 3), 'Bash'})}}, 'dbash': {'HoruR4StompHideout': {frozenset({'Bash'})}}}, 'RazielNoArea': {'casual-core': {'BlackrootGrottoConnection': {frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'}), frozenset({'Climb', 'Dash', 'DoubleJump'})}}, 'standard-core': {'BlackrootGrottoConnection': {frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'WallJump'}), frozenset({'Grenade', 'Bash'})}}, 'expert-core': {'BlackrootGrottoConnection': {frozenset({'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'WallJump'})}}, 'expert-dboost': {'BlackrootGrottoConnection': {frozenset({'Climb', 'Dash', ('AC', 3)})}}, 'glitched': {'BlackrootGrottoConnection': {frozenset({'Climb'})}, 'GumoHideout': {frozenset({'Grenade', 'Dash', 'Bash'}), frozenset({'Dash', 'WallJump'}), frozenset({'Dash', 'ChargeJump'}), frozenset({'Climb', 'Dash', 'DoubleJump'})}}}, 'SorrowBashLedge': {'casual-core': {'LowerSorrow': {frozenset({'Glide', 'Wind'})}}, 'expert-lure': {'LowerSorrow': {frozenset({'Climb', 'Dash', 'Glide', 'DoubleJump', 'Bash'}), frozenset({'Dash', 'Glide', 'DoubleJump', 'WallJump', 'Bash'})}}, 'dbash': {'LowerSorrow': {frozenset({'Bash'})}}, 'expert-dboost': {'LowerSorrow': {frozenset({'Climb', 'ChargeJump', ('HC', 6)}), frozenset({'ChargeJump', ('HC', 6), 'WallJump'})}}, 'master-dboost': {'LowerSorrow': {frozenset({('AC', 12), ('HC', 4), 'ChargeJump', 'WallJump'}), frozenset({'Climb', ('HC', 4), 'ChargeJump', ('AC', 12)}), frozenset({('AC', 12), ('HC', 10), 'DoubleJump', 'WallJump'})}}}, 'SorrowMapstoneArea': {'glitched': {'HoruInnerDoor': {frozenset({'Dash'})}}}, 'SorrowTeleporter': {'casual-core': {'BelowSunstoneArea': {frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}, 'AboveChargeJumpArea': {frozenset({'Climb', 'Stomp', 'ChargeJump'})}}, 'standard-core': {'BelowSunstoneArea': {frozenset({'Climb', 'Glide', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'})}, 'AboveChargeJumpArea': {frozenset({'Climb', 'ChargeJump'})}}, 'gjump': {'BelowSunstoneArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'expert-dboost': {'BelowSunstoneArea': {frozenset({'Grenade', 'Stomp', ('HC', 2), 'Bash'}), frozenset({'Climb', 'ChargeJump', ('HC', 2)}), frozenset({'Glide', 'ChargeJump', 'WallJump', ('HC', 2)}), frozenset({'WallJump', 'Dash', ('HC', 2), 'ChargeJump', ('AC', 3)})}, 'AboveChargeJumpArea': {frozenset({('HC', 2), 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'master-core': {'BelowSunstoneArea': {frozenset({'Stomp', 'WallJump', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Climb', 'Stomp', 'Bash'})}, 'AboveChargeJumpArea': {frozenset({'Bash', 'ChargeJump'}), frozenset({'Stomp', 'Bash'})}}, 'master-dboost': {'BelowSunstoneArea': {frozenset({'Climb', ('AC', 12), 'ChargeJump', ('HC', 1)}), frozenset({('AC', 12), 'Dash', ('HC', 1), 'ChargeJump', 'WallJump'}), frozenset({('AC', 12), ('HC', 1), 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({('AC', 12), ('HC', 1), 'Glide', 'ChargeJump', 'WallJump'})}}, 'expert-core': {'AboveChargeJumpArea': {frozenset({'Glide', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Glide', 'ChargeJump', 'DoubleJump', 'WallJump', 'Bash'})}}, 'expert-abilities': {'AboveChargeJumpArea': {frozenset({'WallJump', 'Dash', 'ChargeJump', 'DoubleJump', ('AC', 3)})}}}, 'SpiderSacArea': {'casual-core': {'SpiderSacTetherArea': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'SpiderWaterArea': {frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'SpiderSacEnergyNook': {frozenset({'DoubleJump'}), frozenset({'Glide'})}, 'SpiritTreeRefined': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Grenade', 'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'ChargeFlame', 'Climb'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'Climb'})}}, 'master-core': {'SpiderSacTetherArea': {frozenset({'DoubleJump'})}, 'SpiritTreeRefined': {frozenset({'Stomp', 'DoubleJump'}), frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'Grenade', 'DoubleJump'})}}, 'expert-abilities': {'SpiderWaterArea': {frozenset({'Dash', ('AC', 3)})}, 'SpiderSacEnergyNook': {frozenset({'Dash', ('AC', 3)})}}, 'standard-core': {'SpiritTreeRefined': {frozenset({'Climb', 'Stomp'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}}}, 'SpiderSacEnergyNook': {'master-abilities': {'ChargeFlameAreaPlantAccess': {frozenset({'ChargeFlame', ('AC', 3)})}}}, 'SpiderSacTetherArea': {'casual-core': {'SpiderWaterArea': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'SpiderSacEnergyNook': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}}, 'expert-abilities': {'SpiderWaterArea': {frozenset({'Grenade', 'Dash', ('AC', 6), 'Bash'}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}, 'SpiderSacEnergyNook': {frozenset({'Grenade', 'Dash', ('AC', 6), 'Bash'}), frozenset({('AC', 6), 'Dash', 'ChargeJump'})}}}, 'SpiderWaterArea': {'casual-core': {'SpiderSacEnergyNook': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'SpiderSacArea': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Glide', 'Bash', 'WallJump'}), frozenset({'Climb', 'Bash', 'Glide'})}, 'HollowGrove': {frozenset({'Climb'}), frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Water'}), frozenset({'DoubleJump'})}, 'DeathGauntletRoof': {frozenset({'Stomp', 'WallJump', 'Water'}), frozenset({'Bash', 'Stomp', 'Water'}), frozenset({'Climb', 'Stomp', 'Water'})}}, 'standard-core': {'SpiderSacEnergyNook': {frozenset({'Dash', 'DoubleJump'}), frozenset({'Bash', 'DoubleJump'})}, 'SpiderSacArea': {frozenset({'Climb', 'Bash'}), frozenset({'Glide', 'Dash', 'WallJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Climb', 'Dash', 'Glide'})}, 'HollowGrove': {frozenset({'Bash'})}}, 'expert-core': {'SpiderSacEnergyNook': {frozenset({'DoubleJump'})}}, 'dbash': {'SpiderSacEnergyNook': {frozenset({'Bash'})}, 'SpiderSacArea': {frozenset({'Bash'})}}, 'expert-abilities': {'SpiderSacEnergyNook': {frozenset({'Dash', ('AC', 3)})}, 'SpiderSacArea': {frozenset({'Dash', ('AC', 6)})}}, 'gjump': {'SpiderSacEnergyNook': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-core': {'SpiderSacArea': {frozenset({'Climb', 'ChargeJump'})}}, 'master-abilities': {'HollowGrove': {frozenset({'Dash', ('AC', 6)})}}, 'expert-dboost': {'DeathGauntletRoof': {frozenset({'Climb', 'Stomp', ('HC', 2)}), frozenset({'Stomp', 'WallJump', ('HC', 2)}), frozenset({'Bash', 'Stomp', ('HC', 1)}), frozenset({'Stomp', 'DoubleJump', ('HC', 2)})}}, 'master-dboost': {'DeathGauntletRoof': {frozenset({'Climb', 'Stomp', ('AC', 12)}), frozenset({'Stomp', ('AC', 12), 'WallJump'}), frozenset({'Stomp', ('AC', 12), 'DoubleJump'})}}}, 'SpiritCavernsDoor': {'casual-core': {'SpiritCavernsDoorOpened': {frozenset({('KS', 2)})}}}, 'SpiritCavernsDoorOpened': {'casual-core': {'LowerSpiritCaverns': {frozenset({'ChargeJump'}), frozenset({'WallJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb'})}}, 'standard-lure': {'LowerSpiritCaverns': {frozenset({'Bash'})}}, 'expert-abilities': {'LowerSpiritCaverns': {frozenset({'Dash', ('AC', 6)})}}, 'master-core': {'LowerSpiritCaverns': {frozenset({'DoubleJump'})}}}, 'SpiritTreeDoor': {'casual-core': {'SpiritTreeDoorOpened': {frozenset({('KS', 4)})}}}, 'SpiritTreeDoorOpened': {'casual-core': {'SpiritTreeRefined': {frozenset({'Climb'}), frozenset({'Bash'}), frozenset({'WallJump'})}}, 'casual-dboost': {'SpiritTreeRefined': {frozenset({'ChargeJump'})}}, 'master-core': {'SpiritTreeRefined': {frozenset({'DoubleJump'})}}}, 'SpiritTreeRefined': {'casual-core': {'SpiritTreeDoor': {frozenset({'Open'})}, 'ValleyEntry': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}, 'SpiderSacArea': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'ChargeFlame', 'Climb', 'Glide'}), frozenset({'Grenade', 'WallJump'}), frozenset({'ChargeFlame', 'Climb', 'DoubleJump'}), frozenset({'ChargeFlame', 'Climb', 'Dash'}), frozenset({'Grenade', 'Climb', 'Glide'}), frozenset({'Grenade', 'Climb', 'DoubleJump'}), frozenset({'Grenade', 'ChargeJump'}), frozenset({'Grenade', 'Climb', 'Dash'}), frozenset({'Grenade', 'Bash'}), frozenset({'ChargeFlame', 'ChargeJump'})}}, 'standard-core': {'ValleyEntry': {frozenset({'Stomp', 'DoubleJump'}), frozenset({'Climb', 'Stomp'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}}, 'expert-abilities': {'ValleyEntry': {frozenset({'Dash', ('AC', 6)})}, 'SpiderSacArea': {frozenset({'Climb', 'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'WallJump'})}}, 'expert-core': {'SpiderSacArea': {frozenset({'ChargeFlame', 'Climb'}), frozenset({'Grenade', 'Climb'})}}, 'master-core': {'SpiderSacArea': {frozenset({'ChargeFlame', 'DoubleJump'}), frozenset({'Grenade', 'DoubleJump'})}}, 'master-abilities': {'SpiderSacArea': {frozenset({'Dash', ('AC', 6), 'DoubleJump'})}}}, 'SunkenGladesRunaway': {'casual-core': {'GladesMain': {frozenset({('KS', 2)}), frozenset({'OpenWorld'})}, 'BlackrootDarknessRoom': {frozenset({'ChargeJump'}), frozenset({'Climb'}), frozenset({'Grenade', 'Bash'}), frozenset({'WallJump'})}, 'DeathGauntletDoor': {frozenset({'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'SpiritTreeRefined': {frozenset({'TPGrove'})}, 'MoonGrotto': {frozenset({'TPGrotto'})}, 'SwampTeleporter': {frozenset({'TPSwamp'})}, 'ValleyTeleporter': {frozenset({'TPValley'})}, 'SorrowTeleporter': {frozenset({'TPSorrow'})}, 'GinsoTeleporter': {frozenset({'TPGinso'})}, 'ForlornTeleporter': {frozenset({'TPForlorn'})}, 'HoruTeleporter': {frozenset({'TPHoru', 'HoruKey'})}}, 'glitched': {'LowerChargeFlameArea': {frozenset({'Grenade'})}}, 'master-core': {'BlackrootDarknessRoom': {frozenset({'DoubleJump'})}, 'DeathGauntletDoor': {frozenset({'DoubleJump'})}}, 'casual-dboost': {'DeathGauntletDoor': {frozenset({'Climb'}), frozenset({'WallJump'})}}, 'standard-lure': {'DeathGauntletDoor': {frozenset({'Bash'})}}}, 'SunstoneArea': {'casual-core': {'UpperSorrow': {frozenset({'Stomp'})}, 'SorrowTeleporter': {frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}}, 'standard-core': {'UpperSorrow': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-dboost': {'SorrowTeleporter': {frozenset({'ChargeJump', 'DoubleJump', 'WallJump', ('HC', 2)})}}}, 'Swamp': {'casual-core': {'SwampDrainlessArea': {frozenset({'Stomp'})}, 'SwampKeyDoorPlatform': {frozenset({'Grenade', 'Bash'}), frozenset({'Glide'}), frozenset({'ChargeJump'}), frozenset({'Water'}), frozenset({'DoubleJump'})}, 'SwampWater': {frozenset({'Water'})}}, 'expert-core': {'SwampDrainlessArea': {frozenset({'Climb', 'ChargeJump'})}}, 'casual-dboost': {'SwampKeyDoorPlatform': {frozenset({'Free'})}}, 'standard-core': {'SwampKeyDoorPlatform': {frozenset({'Dash'})}}, 'master-dboost': {'SwampWater': {frozenset({('HC', 4), ('AC', 12)}), frozenset({('HC', 12)})}}}, 'SwampEntryArea': {'casual-core': {'SwampDrainlessArea': {frozenset({'Climb', 'Stomp'}), frozenset({'Grenade', 'Stomp', 'Bash'}), frozenset({'Stomp', 'WallJump'}), frozenset({'Stomp', 'ChargeJump'})}, 'Swamp': {frozenset({'Stomp', 'ChargeJump'})}}, 'standard-core': {'SwampDrainlessArea': {frozenset({'Climb', 'ChargeJump'})}, 'Swamp': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-lure': {'SwampDrainlessArea': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'Swamp': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Grenade', 'Bash'})}}}, 'SwampKeyDoorOpened': {'casual-core': {'RightSwamp': {frozenset({'Bash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'Grenade'})}}, 'standard-core': {'RightSwamp': {frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Glide', 'ChargeJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}}, 'standard-dboost': {'RightSwamp': {frozenset({'Climb', 'ChargeJump', ('HC', 0)}), frozenset({'ChargeJump', ('HC', 0), 'WallJump'}), frozenset({('HC', 0), 'Glide', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Glide', 'DoubleJump', ('HC', 0)})}}, 'expert-dboost': {'RightSwamp': {frozenset({'Climb', 'DoubleJump', ('HC', 2)}), frozenset({('HC', 0), 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', ('HC', 0), 'WallJump', 'Water'}), frozenset({'DoubleJump', 'WallJump', ('HC', 2)}), frozenset({'Climb', 'Dash', ('AC', 6), ('HC', 0)}), frozenset({('AC', 6), ('HC', 0), 'Dash', ('EC', 3), 'Bash'}), frozenset({'Dash', ('AC', 6), ('HC', 0), 'WallJump'})}}, 'expert-abilities': {'RightSwamp': {frozenset({('EC', 2), 'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6), ('EC', 2)})}}, 'dbash': {'RightSwamp': {frozenset({'Bash', 'Water'}), frozenset({'Bash', ('HC', 2)})}}, 'master-dboost': {'RightSwamp': {frozenset({('HC', 9), 'WallJump'}), frozenset({('AC', 12), 'DoubleJump', ('HC', 1)}), frozenset({('HC', 4), 'DoubleJump'}), frozenset({('AC', 12), 'WallJump', 'Water', ('HC', 2)}), frozenset({('HC', 4), ('AC', 12), 'WallJump'}), frozenset({('HC', 6), 'WallJump', 'Water'})}}, 'master-abilities': {'RightSwamp': {frozenset({('EC', 2), 'Dash', ('AC', 6), 'DoubleJump'})}}, 'gjump': {'RightSwamp': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'SwampKeyDoorPlatform': {'casual-core': {'SwampKeyDoorOpened': {frozenset({('KS', 2)})}, 'InnerSwampSkyArea': {frozenset({'Glide', 'Wind'})}}, 'standard-core': {'InnerSwampSkyArea': {frozenset({'Climb', 'Glide', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump', 'DoubleJump'})}}, 'dbash': {'InnerSwampSkyArea': {frozenset({'Bash'})}}, 'gjump': {'InnerSwampSkyArea': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'SwampTeleporter': {'glitched': {'OuterSwampMortarAbilityCellLedge': {frozenset({'Free'})}}}, 'TopGinsoTree': {'casual-core': {'GinsoEscape': {frozenset({'Bash', 'ChargeJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Bash', 'DoubleJump'})}}, 'standard-core': {'GinsoEscape': {frozenset({'Bash'}), frozenset({'Stomp', 'ChargeJump'})}}, 'standard-dboost': {'GinsoEscape': {frozenset({('HC', 0), 'Climb', 'Dash', 'Stomp', 'DoubleJump'}), frozenset({('HC', 0), 'Glide', 'Stomp', 'DoubleJump', 'WallJump'}), frozenset({('HC', 0), 'Climb', 'Glide', 'Stomp', 'DoubleJump'}), frozenset({('HC', 0), 'Dash', 'Stomp', 'DoubleJump', 'WallJump'})}}, 'expert-abilities': {'GinsoEscape': {frozenset({'Stomp', ('AC', 6), 'Dash'})}}, 'master-abilities': {'GinsoEscape': {frozenset({'Stomp', ('AC', 12), 'DoubleJump'})}}, 'master-dboost': {'GinsoEscape': {frozenset({('HC', 0), 'Stomp', 'DoubleJump', 'Dash'}), frozenset({'Glide', 'Stomp', 'DoubleJump', ('HC', 0)})}}}, 'UpperGinsoDoorClosed': {'casual-core': {'UpperGinsoDoorOpened': {frozenset({('KS', 4)})}}}, 'UpperGinsoDoorOpened': {'casual-core': {'GinsoTeleporter': {frozenset({'Glide', 'Bash'}), frozenset({'Bash', 'DoubleJump'})}, 'UpperGinsoTree': {frozenset({'Open', 'Bash'}), frozenset({'Open', 'DoubleJump'}), frozenset({'Glide', 'Open'})}}, 'standard-core': {'GinsoTeleporter': {frozenset({'Bash'})}}, 'expert-dboost': {'GinsoTeleporter': {frozenset({'ChargeJump', ('HC', 2)}), frozenset({('HC', 0), 'ChargeJump', 'DoubleJump'})}}, 'master-dboost': {'GinsoTeleporter': {frozenset({('AC', 12), 'DoubleJump', 'WallJump', ('HC', 2)})}}, 'casual-dboost': {'UpperGinsoTree': {frozenset({'Open', ('HC', 0)})}}, 'standard-abilities': {'UpperGinsoTree': {frozenset({'Open', 'Dash', ('AC', 3)})}}}, 'UpperGinsoRedirectArea': {'casual-core': {'UpperGinsoTree': {frozenset({'ChargeJump'}), frozenset({'Bash'})}, 'BashTree': {frozenset({'DoubleJump'}), frozenset({'Bash'})}}, 'master-abilities': {'UpperGinsoTree': {frozenset({'ChargeFlame', 'Climb', ('AC', 12), 'DoubleJump'}), frozenset({'Grenade', ('AC', 12), 'DoubleJump', 'WallJump'}), frozenset({'Grenade', 'Climb', ('AC', 12), 'DoubleJump'}), frozenset({'Stomp', ('AC', 12), 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Stomp', ('AC', 12), 'DoubleJump'}), frozenset({'ChargeFlame', ('AC', 12), 'DoubleJump', 'WallJump'})}}, 'standard-abilities': {'BashTree': {frozenset({'Dash', ('AC', 3)})}}, 'standard-dboost': {'BashTree': {frozenset({'Glide', ('HC', 1)}), frozenset({'Dash', ('HC', 1)}), frozenset({'WallJump', ('HC', 1)}), frozenset({'ChargeJump', ('HC', 1)}), frozenset({'Climb', ('HC', 1)})}}}, 'UpperGinsoTree': {'casual-core': {'UpperGinsoDoorClosed': {frozenset({'Free'})}, 'UpperGinsoRedirectArea': {frozenset({'Bash', 'ChargeJump'}), frozenset({'Stomp'})}}, 'standard-core': {'UpperGinsoRedirectArea': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-core': {'UpperGinsoRedirectArea': {frozenset({'ChargeFlame', 'ChargeJump'})}}, 'expert-abilities': {'UpperGinsoRedirectArea': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'master-core': {'UpperGinsoRedirectArea': {frozenset({'Bash'})}}}, 'UpperGrotto': {'casual-core': {'OuterSwampMortarAbilityCellLedge': {frozenset({'ChargeJump'})}, 'MoonGrottoStompPlantAccess': {frozenset({'Stomp'})}, 'OuterSwampLowerArea': {frozenset({'Grenade', 'Bash'}), frozenset({'Climb'}), frozenset({'WallJump'}), frozenset({'ChargeJump'})}, 'Iceless': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Glide', 'WallJump'})}, 'MoonGrottoAboveTeleporter': {frozenset({'Glide'}), frozenset({'Climb'}), frozenset({'Dash'}), frozenset({'WallJump'}), frozenset({'DoubleJump'})}}, 'standard-core': {'MoonGrottoStompPlantAccess': {frozenset({'Climb', 'ChargeJump'})}, 'Iceless': {frozenset({'Grenade', 'Bash'})}, 'MoonGrottoAboveTeleporter': {frozenset({'Grenade', 'Bash'})}}, 'master-core': {'MoonGrottoStompPlantAccess': {frozenset({'Bash'})}, 'Iceless': {frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash'})}}, 'expert-core': {'OuterSwampLowerArea': {frozenset({'DoubleJump'})}}, 'standard-dboost': {'Iceless': {frozenset({'ChargeJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'ChargeJump', ('HC', 1)})}}, 'standard-abilities': {'Iceless': {frozenset({'Climb', 'Dash', ('AC', 3)})}}, 'gjump': {'Iceless': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'glitched': {'MoonGrottoAboveTeleporter': {frozenset({'Free'})}}}, 'UpperSorrow': {'glitched': {'SunstoneArea': {frozenset({'Glide', 'ChargeJump'})}, 'SorrowTeleporter': {frozenset({'Climb', 'Glide', 'ChargeJump'})}}, 'casual-core': {'ChargeJumpDoor': {frozenset({'Free'})}}}, 'UpperSpiritCaverns': {'casual-core': {'SpiritTreeDoor': {frozenset({'Free'})}}}, 'ValleyEntry': {'casual-core': {'ValleyEntryTree': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Climb', 'Bash'}), frozenset({'WallJump'})}, 'ValleyEntryTreePlantAccess': {frozenset({'Grenade', 'ChargeJump'}), frozenset({'ChargeFlame', 'ChargeJump'}), frozenset({'Grenade', 'Bash'})}, 'ValleyPostStompDoor': {frozenset({'Stomp', 'ChargeJump', 'WallJump'}), frozenset({'OpenWorld', 'DoubleJump', 'WallJump'}), frozenset({'Stomp', 'WallJump', 'Bash'}), frozenset({'Climb', 'Stomp', 'ChargeJump'}), frozenset({'Stomp', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump', 'OpenWorld'}), frozenset({'Climb', 'Stomp', 'DoubleJump'}), frozenset({'ChargeJump', 'OpenWorld', 'WallJump'}), frozenset({'Climb', 'OpenWorld', 'DoubleJump'}), frozenset({'Bash', 'OpenWorld', 'WallJump'})}, 'ValleyThreeBirdLever': {frozenset({'Glide', 'OpenWorld', 'Wind'}), frozenset({'Bash', 'OpenWorld'}), frozenset({'Climb', 'Glide', 'ChargeJump', 'OpenWorld'}), frozenset({'Climb', 'OpenWorld', 'ChargeJump', 'DoubleJump'})}, 'ValleyStompFloor': {frozenset({'Glide', 'OpenWorld', 'Wind'}), frozenset({'OpenWorld', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'OpenWorld'}), frozenset({'Glide', 'ChargeJump', 'OpenWorld'}), frozenset({'Climb', 'ChargeJump', 'OpenWorld'}), frozenset({'Glide', 'DoubleJump', 'OpenWorld'})}, 'SpiritTreeRefined': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}}, 'standard-lure': {'ValleyEntryTree': {frozenset({'Bash'})}}, 'expert-dboost': {'ValleyEntryTree': {frozenset({'ChargeJump', ('HC', 1)})}, 'ValleyPostStompDoor': {frozenset({'Stomp', 'ChargeJump', ('HC', 1)}), frozenset({'ChargeJump', 'OpenWorld', ('HC', 1)}), frozenset({'Bash', 'ChargeJump', ('HC', 1)})}}, 'expert-abilities': {'ValleyEntryTree': {frozenset({'Dash', ('AC', 6)})}, 'ValleyEntryTreePlantAccess': {frozenset({('EC', 2), 'Dash', ('AC', 6)})}, 'ValleyThreeBirdLever': {frozenset({'Dash', ('AC', 6), 'OpenWorld'})}, 'ValleyStompFloor': {frozenset({'Dash', ('AC', 6), 'OpenWorld'})}, 'SpiritTreeRefined': {frozenset({'Dash', ('AC', 6)})}}, 'expert-core': {'ValleyEntryTreePlantAccess': {frozenset({'ChargeFlame', 'WallJump'}), frozenset({'Grenade'})}}, 'expert-lure': {'ValleyPostStompDoor': {frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Climb', 'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'})}}, 'standard-core': {'ValleyThreeBirdLever': {frozenset({'Dash', 'ChargeJump', 'DoubleJump', 'OpenWorld'})}, 'ValleyStompFloor': {frozenset({'Glide', 'Dash', 'OpenWorld'}), frozenset({'Dash', 'DoubleJump', 'OpenWorld'})}}, 'gjump': {'ValleyThreeBirdLever': {frozenset({'Climb', 'OpenWorld', 'ChargeJump', 'Grenade'})}}, 'standard-abilities': {'ValleyStompFloor': {frozenset({'Dash', 'ChargeJump', 'OpenWorld', ('AC', 3)})}}, 'standard-dboost': {'ValleyStompFloor': {frozenset({'OpenWorld', ('HC', 1)})}}}, 'ValleyEntryTree': {'casual-core': {'ValleyEntryTreePlantAccess': {frozenset({'Climb', 'ChargeJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Bash'}), frozenset({'Glide'})}, 'ValleyPostStompDoor': {frozenset({'OpenWorld'})}}, 'expert-core': {'ValleyEntryTreePlantAccess': {frozenset({'Grenade'})}}, 'expert-abilities': {'ValleyEntryTreePlantAccess': {frozenset({'Dash', ('AC', 6)})}}}, 'ValleyForlornApproach': {'casual-core': {'OutsideForlornCliff': {frozenset({'ChargeJump'}), frozenset({'Bash'})}, 'ValleyStompFloor': {frozenset({'ChargeJump'})}}, 'standard-core': {'OutsideForlornCliff': {frozenset({'Stomp'})}}, 'master-core': {'ValleyStompFloor': {frozenset({'Bash'})}}}, 'ValleyMain': {'casual-core': {'WilhelmLedge': {frozenset({'Glide', 'Wind'}), frozenset({'Bash'})}, 'MistyEntrance': {frozenset({'Glide'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Dash'}), frozenset({'Bash'}), frozenset({'DoubleJump'})}}, 'expert-abilities': {'WilhelmLedge': {frozenset({('EC', 2), 'Dash', ('AC', 6)})}}, 'gjump': {'WilhelmLedge': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}}, 'ValleyPostStompDoor': {'casual-core': {'ValleyRight': {frozenset({'Climb', 'Bash'}), frozenset({'Bash', 'ChargeJump'}), frozenset({'Bash', 'WallJump'}), frozenset({'Grenade', 'Bash'})}, 'ValleyEntry': {frozenset({'OpenWorld'})}, 'ValleyEntryTree': {frozenset({'Bash', 'OpenWorld'}), frozenset({'OpenWorld', 'WallJump'}), frozenset({'ChargeJump', 'OpenWorld'}), frozenset({'OpenWorld', 'DoubleJump'}), frozenset({'Climb', 'OpenWorld'})}}, 'expert-dboost': {'ValleyRight': {frozenset({('HC', 4), 'ChargeJump', 'DoubleJump', 'WallJump'})}}, 'dbash': {'ValleyRight': {frozenset({'Bash'})}}, 'master-dboost': {'ValleyRight': {frozenset({('HC', 0), ('AC', 12), 'Climb', 'ChargeJump', 'DoubleJump'}), frozenset({('HC', 0), ('AC', 12), 'ChargeJump', 'DoubleJump', 'WallJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump', ('HC', 8)})}}, 'gjump': {'ValleyRight': {frozenset({('AC', 12), 'Climb', 'Grenade', 'Stomp', 'ChargeJump', 'DoubleJump'}), frozenset({('AC', 12), 'Climb', ('HC', 2), 'Grenade', 'ChargeJump'}), frozenset({'Climb', 'Grenade', 'Stomp', 'ChargeJump', 'DoubleJump', ('HC', 1)}), frozenset({('AC', 6), 'Climb', 'Dash', 'Grenade', 'ChargeJump'}), frozenset({'Climb', ('HC', 4), 'ChargeJump', 'Grenade'})}}, 'standard-core': {'ValleyEntryTree': {frozenset({'Dash', 'OpenWorld'})}}}, 'ValleyRight': {'expert-dboost': {'ValleyPostStompDoor': {frozenset({'DoubleJump', ('HC', 1)})}}, 'master-dboost': {'ValleyPostStompDoor': {frozenset({('HC', 4)}), frozenset({('AC', 12), ('HC', 2)})}}, 'casual-core': {'ValleyStomplessApproach': {frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump', 'WallJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'Bash', 'DoubleJump'}), frozenset({'Grenade', 'Bash', 'Climb'}), frozenset({'Bash', 'WallJump'})}}, 'expert-abilities': {'ValleyStomplessApproach': {frozenset({'Dash', ('AC', 6), 'WallJump'})}}}, 'ValleyStompFloor': {'casual-core': {'ValleyForlornApproach': {frozenset({'Stomp'})}, 'ValleyThreeBirdLever': {frozenset({'Climb', 'ChargeJump'}), frozenset({'Bash'}), frozenset({'ChargeJump', 'DoubleJump', 'WallJump'})}, 'ValleyEntry': {frozenset({'OpenWorld', 'ChargeJump', 'DoubleJump'}), frozenset({'Bash', 'OpenWorld'}), frozenset({'Glide', 'ChargeJump', 'OpenWorld'})}}, 'standard-core': {'ValleyForlornApproach': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-lure': {'ValleyForlornApproach': {frozenset({'Bash'})}}, 'standard-dboost': {'ValleyEntry': {frozenset({'ChargeJump', 'OpenWorld', ('HC', 1)})}}, 'expert-dboost': {'ValleyEntry': {frozenset({('HC', 0), 'OpenWorld', 'DoubleJump'}), frozenset({'OpenWorld', 'ChargeJump', ('HC', 0)})}}, 'expert-abilities': {'ValleyEntry': {frozenset({'Dash', ('AC', 6), 'OpenWorld'})}}}, 'ValleyStompless': {'casual-core': {'WilhelmLedge': {frozenset({'Glide', 'Wind'}), frozenset({'Bash'})}, 'ValleyStomplessApproach': {frozenset({'Bash'}), frozenset({'Glide'})}, 'MistyEntrance': {frozenset({'Bash', 'OpenWorld'}), frozenset({'Climb', 'ChargeJump', 'OpenWorld'}), frozenset({'OpenWorld', 'DoubleJump'}), frozenset({'Dash', 'OpenWorld'}), frozenset({'Glide', 'OpenWorld'})}, 'LowerValley': {frozenset({'OpenWorld'})}, 'LowerValleyPlantApproach': {frozenset({'OpenWorld'})}}, 'expert-abilities': {'WilhelmLedge': {frozenset({('EC', 2), 'Dash', ('AC', 6)}), frozenset({'Dash', ('AC', 6), 'DoubleJump'})}, 'ValleyStomplessApproach': {frozenset({'Dash', ('AC', 6), ('EC', 3)})}}, 'expert-core': {'ValleyMain': {frozenset({'Bash'})}}, 'master-core': {'ValleyMain': {frozenset({'ChargeFlame'}), frozenset({'Grenade'})}}, 'expert-dboost': {'ValleyStomplessApproach': {frozenset({'Dash', ('AC', 3), ('HC', 1)}), frozenset({'DoubleJump', ('HC', 1)})}}, 'master-dboost': {'ValleyStomplessApproach': {frozenset({('HC', 7)}), frozenset({('HC', 4), 'ChargeJump'}), frozenset({('AC', 12), 'ChargeJump', ('HC', 2)}), frozenset({('HC', 4), ('AC', 12)})}}}, 'ValleyStomplessApproach': {'casual-core': {'ValleyStompless': {frozenset({'Bash'})}}, 'expert-dboost': {'ValleyStompless': {frozenset({'ChargeJump', 'DoubleJump', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'ChargeJump', 'DoubleJump', ('HC', 1)})}}, 'expert-abilities': {'ValleyStompless': {frozenset({('EC', 2), 'Dash', 'DoubleJump', 'WallJump'}), frozenset({'Climb', 'Dash', 'DoubleJump', ('EC', 2)})}}, 'master-dboost': {'ValleyStompless': {frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}}}, 'ValleyTeleporter': {'casual-core': {'ValleyPostStompDoor': {frozenset({'Bash'}), frozenset({'Glide'})}, 'ValleyRight': {frozenset({'Climb', 'Glide', 'ChargeJump'}), frozenset({'Climb', 'Glide', 'DoubleJump'}), frozenset({'Glide', 'DoubleJump', 'WallJump'}), frozenset({'Bash'})}, 'MistyEntrance': {frozenset({'Glide', 'OpenWorld'})}, 'LowerValley': {frozenset({'OpenWorld'})}, 'LowerValleyPlantApproach': {frozenset({'OpenWorld'})}, 'ValleyStompless': {frozenset({'Climb', 'ChargeJump', 'OpenWorld'}), frozenset({'Glide', 'OpenWorld', 'Wind'})}}, 'expert-abilities': {'ValleyPostStompDoor': {frozenset({'Dash', ('AC', 6), 'DoubleJump'}), frozenset({'Dash', ('AC', 6), ('EC', 3)})}, 'ValleyRight': {frozenset({'Dash', ('AC', 6)})}, 'MistyEntrance': {frozenset({'Dash', 'DoubleJump', ('AC', 3), 'OpenWorld'}), frozenset({'Dash', ('AC', 6), 'OpenWorld'})}, 'ValleyStompless': {frozenset({'Dash', ('AC', 6), 'OpenWorld'})}}, 'master-core': {'ValleyPostStompDoor': {frozenset({'DoubleJump'})}}, 'expert-dboost': {'ValleyRight': {frozenset({'DoubleJump', 'WallJump', ('HC', 1)}), frozenset({'Glide', 'WallJump', ('HC', 1)}), frozenset({'Climb', 'DoubleJump', ('HC', 1)}), frozenset({'Climb', 'Glide', ('HC', 1)})}}, 'gjump': {'ValleyRight': {frozenset({'Climb', 'ChargeJump', 'Grenade'})}}, 'master-abilities': {'ValleyRight': {frozenset({('AC', 12), 'DoubleJump'})}, 'ValleyStompless': {frozenset({('AC', 12), 'DoubleJump', 'WallJump', 'OpenWorld'})}}, 'standard-core': {'MistyEntrance': {frozenset({'Grenade', 'Bash', 'DoubleJump', 'OpenWorld'})}}, 'standard-abilities': {'MistyEntrance': {frozenset({'OpenWorld', 'Dash', 'ChargeJump', 'DoubleJump', ('AC', 3)})}}, 'expert-core': {'MistyEntrance': {frozenset({'Bash', 'ChargeJump', 'DoubleJump', 'OpenWorld'}), frozenset({'Dash', 'ChargeJump', 'DoubleJump', 'OpenWorld'}), frozenset({'Grenade', 'Bash', 'OpenWorld'})}, 'ValleyStompless': {frozenset({'Climb', 'Bash', 'Grenade', 'OpenWorld'}), frozenset({'Grenade', 'Bash', 'OpenWorld', 'WallJump'})}}, 'master-lure': {'ValleyStompless': {frozenset({'Bash', 'OpenWorld', 'WallJump'})}}}, 'ValleyThreeBirdLever': {'casual-core': {'ValleyEntry': {frozenset({'Climb', 'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Bash'}), frozenset({'Glide'})}, 'LowerValley': {frozenset({'Glide', 'Wind'}), frozenset({'Glide', 'DoubleJump'})}}, 'standard-abilities': {'ValleyEntry': {frozenset({'Dash', ('AC', 3)})}, 'LowerValley': {frozenset({'Dash', ('AC', 3)})}}, 'standard-dboost': {'ValleyEntry': {frozenset({('HC', 4)})}, 'LowerValley': {frozenset({('HC', 4)})}}, 'expert-dboost': {'ValleyEntry': {frozenset({'Climb', ('HC', -1)}), frozenset({('HC', -1), 'WallJump'}), frozenset({('HC', -1), 'ChargeJump'})}, 'LowerValley': {frozenset({('HC', 2)})}}, 'standard-core': {'LowerValley': {frozenset({'Glide', 'Dash'}), frozenset({'Dash', 'DoubleJump'})}}, 'dbash': {'LowerValley': {frozenset({'Bash'})}}}, 'WaterVeinArea': {'casual-core': {'LeftGumoHideout': {frozenset({'ChargeJump'}), frozenset({'Glide', 'Wind'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'})}, 'LowerLeftGumoHideout': {frozenset({'ChargeJump'}), frozenset({'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Glide'})}, 'MoonGrotto': {frozenset({'DoubleJump', 'WallJump'}), frozenset({'ChargeJump', 'DoubleJump'}), frozenset({'Grenade', 'Bash'}), frozenset({'Climb', 'Glide'}), frozenset({'Glide', 'ChargeJump'}), frozenset({'Climb', 'ChargeJump'}), frozenset({'Climb', 'DoubleJump'}), frozenset({'Glide', 'WallJump'})}}, 'standard-core': {'LeftGumoHideout': {frozenset({'Dash'})}, 'LowerLeftGumoHideout': {frozenset({'Dash'})}, 'MoonGrotto': {frozenset({'Climb', 'Dash'}), frozenset({'Dash', 'WallJump'})}}}, 'WilhelmLedge': {'casual-core': {'SorrowBashLedge': {frozenset({'Glide', 'Wind'}), frozenset({'Dash', 'DoubleJump', 'WallJump'}), frozenset({'Glide', 'ChargeJump', 'WallJump'}), frozenset({'Bash'}), frozenset({'Climb', 'Glide', 'ChargeJump'})}, 'ValleyStompless': {frozenset({'Bash'}), frozenset({'Glide'})}, 'ValleyMain': {frozenset({'Stomp'})}}, 'standard-core': {'SorrowBashLedge': {frozenset({'Glide', 'Dash', 'Climb', 'DoubleJump'})}, 'ValleyMain': {frozenset({'Climb', 'ChargeJump'})}}, 'expert-abilities': {'SorrowBashLedge': {frozenset({'Dash', ('AC', 6), 'WallJump'}), frozenset({'Climb', 'Dash', ('AC', 6)})}, 'ValleyStompless': {frozenset({'Dash', ('AC', 6)})}}, 'master-abilities': {'SorrowBashLedge': {frozenset({'Climb', ('AC', 12), 'DoubleJump'}), frozenset({('AC', 12), 'DoubleJump', 'WallJump'})}, 'ValleyStompless': {frozenset({('AC', 12), 'DoubleJump'})}, 'ValleyMain': {frozenset({'Dash', 'ChargeJump', ('AC', 3)})}}, 'standard-abilities': {'ValleyStompless': {frozenset({'Dash', 'DoubleJump', ('AC', 3)})}}, 'standard-lure': {'ValleyMain': {frozenset({'HoruKey'})}}, 'expert-core': {'ValleyMain': {frozenset({'Grenade', 'Bash', 'ChargeJump'})}}, 'master-core': {'ValleyMain': {frozenset({'Bash'})}}, 'glitched': {'ValleyMain': {frozenset({'ChargeJump'})}}}} diff --git a/worlds_disabled/oribf/Types.py b/worlds_disabled/oribf/Types.py deleted file mode 100644 index 1ed2423a48..0000000000 --- a/worlds_disabled/oribf/Types.py +++ /dev/null @@ -1,5 +0,0 @@ -from typing import NamedTuple - -class Location(NamedTuple): - code: int - vanilla_item: str \ No newline at end of file diff --git a/worlds_disabled/oribf/__init__.py b/worlds_disabled/oribf/__init__.py deleted file mode 100644 index 6400961a5a..0000000000 --- a/worlds_disabled/oribf/__init__.py +++ /dev/null @@ -1,71 +0,0 @@ -from typing import Set - -from worlds.AutoWorld import World -from .Items import item_table, default_pool -from .Locations import lookup_name_to_id -from .Rules import set_rules, location_rules -from .Regions import locations_by_region, connectors -from .Options import options -from BaseClasses import Region, Item, Location, Entrance, ItemClassification - - -class OriBlindForest(World): - game: str = "Ori and the Blind Forest" - - topology_present = True - data_version = 1 - - item_name_to_id = item_table - location_name_to_id = lookup_name_to_id - - option_definitions = options - - hidden = True - - def generate_early(self): - logic_sets = {"casual-core"} - for logic_set in location_rules: - if logic_set != "casual-core" and getattr(self.multiworld, logic_set.replace("-", "_")): - logic_sets.add(logic_set) - self.logic_sets = logic_sets - - set_rules = set_rules - - def create_region(self, name: str): - return Region(name, self.player, self.multiworld) - - def create_regions(self): - world = self.multiworld - menu = self.create_region("Menu") - world.regions.append(menu) - start = Entrance(self.player, "Start Game", menu) - menu.exits.append(start) - - # workaround for now, remove duplicate locations - already_placed_locations = set() - - for region_name, locations in locations_by_region.items(): - locations -= already_placed_locations - already_placed_locations |= locations - region = self.create_region(region_name) - if region_name == "SunkenGladesRunaway": # starting point - start.connect(region) - region.locations = {Location(self.player, location, lookup_name_to_id[location], region) - for location in locations} - world.regions.append(region) - - for region_name, exits in connectors.items(): - parent = world.get_region(region_name, self.player) - for exit in exits: - connection = Entrance(self.player, exit, parent) - connection.connect(world.get_region(exit, self.player)) - parent.exits.append(connection) - - def generate_basic(self): - for item_name, count in default_pool.items(): - self.multiworld.itempool.extend([self.create_item(item_name) for _ in range(count)]) - - def create_item(self, name: str) -> Item: - return Item(name, - ItemClassification.progression if not name.startswith("EX") else ItemClassification.filler, - item_table[name], self.player)